Router Metrics
Export Apollo Router metrics
The Apollo Router supports collection of metrics with OpenTelemetry, with exporters for:
In router.yaml, you configure router metrics with the following settings:
telemetry.exporters.metrics.common. Configure values for the router which are common across metrics exporters.telemetry.exporters.metrics.prometheus. Configure the Prometheus exporter.telemetry.exporters.metrics.otlp. Configure the OpenTelemetry exporter. Supports sending traces to Datadog.
Metrics common configuration
Common metrics configuration contains global settings for all exporters:
- Service name
- Resource attributes
- Custom default histogram buckets
apollo_router_http_requestsattributes- OpenTelemetry views
service_name
Set a service name for your router metrics so you can easily locate them in external metrics dashboards.
The service name can be set by an environment variable or in router.yaml, with the following order of precedence (first to last):
OTEL_SERVICE_NAMEenvironment variableOTEL_RESOURCE_ATTRIBUTESenvironment variabletelemetry.exporters.metrics.common.service_nameinrouter.yaml
telemetry.exporters.metrics.common.resourceinrouter.yaml
If the service name isn't explicitly set, it defaults to unknown_service:router or unknown_service if the executable name cannot be determined.
resource
A resource attribute is a set of key-value pairs that provide additional information to an exporter. Application performance monitors (APM) may interpret and display resource information.
In router.yaml, resource attributes are set in telemetry.metrics.common.resource. For example:
telemetry:exporters:metrics:common:resource:"environment.name": "production""environment.namespace": "{env.MY_K8_NAMESPACE_ENV_VARIABLE}"
For OpenTelemetry conventions for resources, see Resource Semantic Conventions.
buckets
You can customize bucket boundaries for all generated histograms by setting telemetry.exporters.metrics.common.buckets in router.yaml. For example:
telemetry:exporters:metrics:common:buckets:- 0.05- 0.10- 0.25- 0.50- 1.00- 2.50- 5.00- 10.00- 20.00
attributes
You can add custom attributes (OpenTelemetry) and labels (Prometheus) to the apollo_router_http_requests metric. Attributes can be:
- static values (preferably using a resource)
- headers from the request or response
- a value from a context
- a value from the request or response body (JSON path)
An example of configuring these attributes is shown below:
telemetry:exporters:metrics:common:attributes:supergraph: # Attribute configuration for requests to/responses from the routerstatic:- name: "version"value: "v1.0.0"request:header:- named: "content-type"rename: "payload_type"default: "application/json"- named: "x-custom-header-to-add"response:body:# Apply the value of the provided path of the router's response body as an attribute- path: .errors[0].extensions.http.statusname: error_from_body# Use the unique extension code to identify the kind of error- path: .errors[0].extensions.codename: error_codecontext:# Apply the indicated element from the plugin chain's context as an attribute- named: my_keysubgraph: # Attribute configuration for requests to/responses from subgraphsall:static:# Always apply this attribute to all metrics for all subgraphs- name: kindvalue: subgraph_requesterrors: # Only work if it's a valid GraphQL error (for example if the subgraph returns an http error or if the router can't reach the subgraph)include_messages: true # Will include the error message in a message attributeextensions: # Include extensions data- name: subgraph_error_extended_type # Name of the attributepath: .type # JSON query path to fetch data from extensions- name: messagepath: .reason# Will create this kind of metric for example apollo_router_http_requests_error_total{message="cannot contact the subgraph",subgraph="my_subgraph_name",subgraph_error_extended_type="SubrequestHttpError"}subgraphs:my_subgraph_name: # Apply these rules only for the subgraph named `my_subgraph_name`request:header:- named: "x-custom-header"body:# Apply the value of the provided path of the router's request body as an attribute (here it's the query)- path: .queryname: querydefault: UNKNOWN
ⓘ NOTE
OpenTelemetry includes many standard attributes that you can use via custom instruments.
views
You can override default attributes and default buckets for specific metrics thanks to this configuration.
telemetry:exporters:metrics:common:service_name: apollo-routerviews:- name: apollo_router_http_request_duration_seconds # Instrument name you want to edit. You can use wildcard in names. If you want to target all instruments just use '*'unit: "ms" # (Optional) override the unitdescription: "my new description of this metric" # (Optional) override the descriptionaggregation: # (Optional)histogram:buckets: # Override default buckets configured for this histogram- 1- 2- 3- 4- 5allowed_attribute_keys: # (Optional) Keep only listed attributes on the metric- status
Metrics common reference
| Attribute | Default | Description |
|---|---|---|
service_name | unknown_service:router | The OpenTelemetry service name. |
service_namespace | The OpenTelemetry namespace. | |
resource | The OpenTelemetry resource to attach to metrics. | |
attributes | Customization for the apollo_router_http_requests instrument. |