Monitoring GraphQL APIs
1. Implementing Query Logging
Example: Envelop logger plugin
plugins: [{
onExecute({ args }) {
const start = performance.now();
return {
onExecuteDone({ result }) {
logger.info({
op: args.operationName,
variables: args.variableValues,
ms: performance.now() - start,
errors: result.errors?.length ?? 0
});
}
};
}
}]
2. Tracking Query Performance
| Metric | Detail |
|---|---|
| p50/p95/p99 latency | Per operationName |
| Resolver duration | Per field timing |
| Throughput | QPS, mutations/s |
| DataLoader batches | Average batch size |
3. Implementing Tracing
| Spec | Detail |
|---|---|
| Apollo Tracing | Per-resolver tree of durations |
| FTV1 | Federated trace v1 |
| OpenTelemetry | Vendor-neutral standard |
4. Using OpenTelemetry
Example: OTel instrumentation
import { useOpenTelemetry } from "@envelop/opentelemetry";
import { trace } from "@opentelemetry/api";
plugins: [useOpenTelemetry({
resolvers: true, variables: false, result: false
}, trace.getTracerProvider())]
5. Tracking Error Rates
| Dimension | Detail |
|---|---|
| By error code | VALIDATION, FORBIDDEN, INTERNAL |
| By operation | Find regressions per query |
| By client | apollographql-client-name header |
| SLO budget | Burn-rate alerts |
6. Implementing Health Checks
Example: Liveness + readiness
app.get("/healthz", (_, res) => res.send("ok"));
app.get("/readyz", async (_, res) => {
try {
await Promise.all([db.$queryRaw`SELECT 1`, redis.ping()]);
res.send("ready");
} catch { res.status(503).send("not ready"); }
});
7. Creating Performance Dashboards
| Tool | Detail |
|---|---|
| Apollo Studio | Operation insights, traces |
| Grafana + Prometheus | Custom dashboards from metrics |
| Datadog APM | Resolver flame graphs |
| Honeycomb | High-cardinality tracing |
8. Alerting on Errors
| Alert | Trigger |
|---|---|
| Error rate | > 1% INTERNAL errors over 5m |
| Latency | p95 > 1s for 10m |
| Subgraph down | Health check failures |
| Schema drift | Breaking change detected |
9. Tracking Schema Usage
| Use | Detail |
|---|---|
| Field popularity | Identify removable deprecated fields |
| Per-client usage | Coordinate breaking changes |
| Apollo operation registry | Captures via usage reporting |