An HTTP request logger with built-in protobuf decoding and a real-time web UI. Accepts any HTTP method on any endpoint and logs the full request details — headers, body, query parameters, and more — to both the console and a file.
Built for inspecting Apollo Router usage reporting payloads (/reporting-ingress) and GraphOS trace export payloads (/otlp-reporting-ingress), but works as a general-purpose request logger for any API.
Request list — all captured requests with color-coded method badges and timestamps
Request detail — full headers, body, and metadata for a POST request
Query parameters — parsed query params and authorization headers on a GET request
URL filtering — filter the request list by endpoint path
- Catch-all logging — every HTTP method, every path, fully logged
- Protobuf decoding — schema-based decoding for Apollo
Reportand OpenTelemetryExportTraceServiceRequestmessages, with schema-less fallback for unknown types - Gzip/deflate support — automatically decompresses request bodies
- Web UI — real-time dashboard at
/uiwith URL filtering, color-coded method badges, and a detail panel showing headers, query params, and decoded bodies - Dual body view — protobuf requests show both a decoded JSON view and the raw hex
- File logging — all requests appended to
requests.log
npm install
npm startThe server starts on http://localhost:3000 (override with PORT env var).
Open http://localhost:3000/ui to view the dashboard.
Send any request to any path:
curl http://localhost:3000/any/path?foo=bar
curl -X POST http://localhost:3000/api/test -H "Content-Type: application/json" -d '{"hello":"world"}'Every request is logged with timestamp, method, URL, headers, and body.
Add the following to your router.yaml to send both usage reporting and OTLP trace payloads to the logger:
# router.yaml
telemetry:
apollo:
# Apollo usage-reporting payloads (Report protobuf)
endpoint: http://localhost:3000/reporting-ingress
# Apollo OTLP traces/metrics
experimental_otlp_endpoint: http://localhost:3000/otlp-reporting-ingress
experimental_otlp_tracing_protocol: http
otlp_tracing_sampler: always_on
# These are enabled for verification purposes
send_headers: all
send_variable_values: all| Setting | Purpose |
|---|---|
endpoint |
Redirects Apollo usage reporting (Report protobuf) to the logger |
experimental_otlp_endpoint |
Redirects OTLP trace export (ExportTraceServiceRequest) to the logger |
experimental_otlp_tracing_protocol: http |
Required — tells the router to use HTTP instead of gRPC for OTLP export |
otlp_tracing_sampler: always_on |
Sends all traces (not just sampled ones) for full visibility |
send_headers: all |
Includes request/response headers in the trace payload (docs) |
send_variable_values: all |
Includes GraphQL variable values in the trace payload (docs) |
The logger decodes both payload types with full field names:
/reporting-ingress—Reportmessages (header,traces_per_query,operation_count, etc.)/otlp-reporting-ingress—ExportTraceServiceRequestmessages (resourceSpans,scopeSpans,spans,attributes, etc.)
| Endpoint | Description |
|---|---|
GET /ui |
Web dashboard |
GET /__api/requests?url=<filter> |
JSON array of logged requests, with optional URL substring filter |
* (everything else) |
Caught and logged, returns 200 with { status: "logged" } |
The proto/ directory contains the protobuf definitions used for decoding:
report.proto— Apollo Router usage reporting (Report,ReportHeader,Trace,TracesAndStats, etc.)opentelemetry/proto/collector/trace/v1/trace_service.proto— OTLP trace export (ExportTraceServiceRequest)opentelemetry/proto/trace/v1/trace.proto— OTLP span definitions (Span,SpanEvent,SpanLink,SpanStatus)opentelemetry/proto/common/v1/common.proto— OTLP common types (KeyValue,AnyValue,InstrumentationScope)opentelemetry/proto/resource/v1/resource.proto— OTLP resource definition
Requests to endpoints not mapped to a schema fall back to schema-less decoding (field numbers instead of names).
| Env var | Default | Description |
|---|---|---|
PORT |
3000 |
Server port |
Logs are written to requests.log in the project root.



