diff --git a/Taskfile.yml b/Taskfile.yml index 659ea03..1470ee1 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -291,12 +291,10 @@ tasks: exit $RC fi PORTFILE=$(mktemp) - python3 ci/otelrecv.py --port-file="$PORTFILE" & + python3 ci/otel-receiver.py --port-file="$PORTFILE" & RECV_PID=$! cleanup() { - kill "$RECV_PID" 2>/dev/null - wait "$RECV_PID" 2>/dev/null || true - pkill -9 -f "otelrecv.py" 2>/dev/null || true + kill -9 "$RECV_PID" 2>/dev/null || true rm -f "$PORTFILE" "$DAGGER_OUT" "$RC_FILE" } trap cleanup EXIT @@ -307,6 +305,8 @@ tasks: OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf" \ dagger call --progress=plain -q -m ci --source=. check RC=$? + curl -sf "http://127.0.0.1:$PORT/shutdown" >/dev/null 2>&1 || true + wait "$RECV_PID" 2>/dev/null || true exit $RC integration-android: diff --git a/ci/otelrecv.py b/ci/otel-receiver.py similarity index 93% rename from ci/otelrecv.py rename to ci/otel-receiver.py index 5226931..04251a9 100644 --- a/ci/otelrecv.py +++ b/ci/otel-receiver.py @@ -3,7 +3,7 @@ Minimal OTLP HTTP/protobuf trace receiver for Dagger CI timing. Usage: - python3 ci/otelrecv.py --port-file=/tmp/otel.port + python3 ci/otel-receiver.py --port-file=/tmp/otel.port Caller sets: OTEL_EXPORTER_OTLP_ENDPOINT=http://127.0.0.1: @@ -127,6 +127,12 @@ class _Handler(BaseHTTPRequestHandler): if body: self.wfile.write(body) + def do_GET(self): + if self.path != "/shutdown": + self._respond(404); return + self._respond(200, b"shutting down") + threading.Thread(target=self.server.shutdown, daemon=True).start() + def do_POST(self): if self.path != "/v1/traces": self._respond(404); return @@ -135,7 +141,7 @@ class _Handler(BaseHTTPRequestHandler): try: decoded = _decode(body) except Exception as exc: - print(f"[otelrecv] decode error: {exc}", file=sys.stderr, flush=True) + print(f"[otel-receiver] decode error: {exc}", file=sys.stderr, flush=True) self._respond(400, str(exc).encode()); return with _lock: _spans.extend(decoded) @@ -150,7 +156,7 @@ class _Handler(BaseHTTPRequestHandler): def _report(): with _lock: if not _spans: - print("otelrecv: no spans received", file=sys.stderr) + print("otel-receiver: no spans received", file=sys.stderr) return rows = sorted(_spans, key=lambda r: r["dur"], reverse=True) NAME_W = 38 @@ -181,9 +187,7 @@ def main(): signal.signal(signal.SIGTERM, _shutdown) signal.signal(signal.SIGINT, _shutdown) - print(f"[otelrecv] listening on port {server.server_address[1]}", file=sys.stderr, flush=True) server.serve_forever() - print("[otelrecv] server stopped, printing report", file=sys.stderr, flush=True) _report()