The PowerShell activation scripts POST small JSON diagnostics to /diag so script execution errors are captured. The collector (python:3.12-alpine, ConfigMap-mounted) prints each event to stdout as a KMSDIAG line; the cluster's Loki scrapes pod stdout, making events searchable in Grafana (Loki only — no Slack, no Prometheus). Like /scripts, /diag needs a second ingress_factory carve-out with full_host="kms.viktorbarzin.me" so it bypasses the Anubis PoW challenge that PowerShell/curl can't solve. Without full_host the factory would derive kms-diag.viktorbarzin.me and the carve-out would never match. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
33 lines
1.3 KiB
Python
33 lines
1.3 KiB
Python
import json
|
|
from http.server import BaseHTTPRequestHandler, HTTPServer
|
|
|
|
MAX = 16384
|
|
|
|
class Handler(BaseHTTPRequestHandler):
|
|
def _respond(self, code):
|
|
self.send_response(code)
|
|
self.send_header('Content-Length', '0')
|
|
self.end_headers()
|
|
def do_POST(self):
|
|
if self.path.rstrip('/') != '/diag':
|
|
self._respond(404); return
|
|
try:
|
|
n = int(self.headers.get('Content-Length', 0) or 0)
|
|
n = min(n, MAX) if n > 0 else 0
|
|
raw = self.rfile.read(n).decode('utf-8', 'replace') if n else ''
|
|
obj = json.loads(raw) if raw.strip() else {}
|
|
if not isinstance(obj, dict):
|
|
obj = {'_raw': str(obj)[:1000]}
|
|
ip = self.headers.get('X-Forwarded-For', self.client_address[0]).split(',')[0].strip()
|
|
obj['_ip'] = ip
|
|
print('KMSDIAG ' + json.dumps(obj, separators=(',', ':'))[:MAX], flush=True)
|
|
except Exception as e:
|
|
print('KMSDIAG_ERR ' + repr(e)[:500], flush=True)
|
|
self._respond(204)
|
|
def do_GET(self):
|
|
self._respond(200 if self.path.rstrip('/') in ('/healthz', '/diag') else 404)
|
|
def log_message(self, *a):
|
|
pass
|
|
|
|
if __name__ == '__main__':
|
|
HTTPServer(('0.0.0.0', 9102), Handler).serve_forever()
|