diff --git a/.changesets/breaking_zach_router_1910_telemetry_defaults.md b/.changesets/breaking_zach_router_1910_telemetry_defaults.md new file mode 100644 index 0000000000..a967a2dcd8 --- /dev/null +++ b/.changesets/breaking_zach_router_1910_telemetry_defaults.md @@ -0,0 +1,24 @@ +### Enable subgraph metrics and extended error metrics by default + +Router 3.0 changes the defaults for two Apollo telemetry settings to match the preferred configuration for GraphOS Studio users, and promotes one of them out of preview. + +**`telemetry.apollo.subgraph_metrics` now defaults to `true`.** Subgraph metrics send additional per-subgraph operation metrics to GraphOS Studio via OTLP, powering subgraph insights. Previously this was opt-in. To restore the previous behavior, set: + +```yaml +telemetry: + apollo: + subgraph_metrics: false +``` + +**`telemetry.apollo.errors.preview_extended_error_metrics` has been renamed to `telemetry.apollo.errors.extended_error_metrics` and now defaults to `enabled`.** Extended error metrics send OTLP error metrics with additional dimensions (`extensions.service`, `extensions.code`), giving Studio richer error attribution out of the box. The `preview_` prefix has been dropped now that the feature is stable. + +Configurations using the old `preview_extended_error_metrics` field name are migrated automatically at startup (with a warning). To restore the previous behavior, set: + +```yaml +telemetry: + apollo: + errors: + extended_error_metrics: disabled +``` + +By [@BobaFetters](https://github.com/BobaFetters) in https://github.com/apollographql/router/pull/9879 diff --git a/apollo-router/src/configuration/metrics.rs b/apollo-router/src/configuration/metrics.rs index 0ceb2a5c30..3a998c081a 100644 --- a/apollo-router/src/configuration/metrics.rs +++ b/apollo-router/src/configuration/metrics.rs @@ -409,8 +409,8 @@ impl InstrumentData { "$.signature_normalization_algorithm", opt.metrics_reference_mode, "$.metrics_reference_mode", - opt.errors.preview_extended_error_metrics, - "$.errors.preview_extended_error_metrics", + opt.errors.extended_error_metrics, + "$.errors.extended_error_metrics", opt.field_level_instrumentation_sampler, "$.field_level_instrumentation_sampler", opt.tracing.batch_processor.scheduled_delay, diff --git a/apollo-router/src/configuration/migrations/3003-extended-error-metrics.yaml b/apollo-router/src/configuration/migrations/3003-extended-error-metrics.yaml new file mode 100644 index 0000000000..09d978b6d3 --- /dev/null +++ b/apollo-router/src/configuration/migrations/3003-extended-error-metrics.yaml @@ -0,0 +1,5 @@ +description: preview_extended_error_metrics is now extended_error_metrics +actions: + - type: move + from: telemetry.apollo.errors.preview_extended_error_metrics + to: telemetry.apollo.errors.extended_error_metrics diff --git a/apollo-router/src/configuration/snapshots/apollo_router__configuration__metrics__test__metrics@apollo_telemetry.router.yaml.snap b/apollo-router/src/configuration/snapshots/apollo_router__configuration__metrics__test__metrics@apollo_telemetry.router.yaml.snap index b1bbaa4b2a..950a65baf9 100644 --- a/apollo-router/src/configuration/snapshots/apollo_router__configuration__metrics__test__metrics@apollo_telemetry.router.yaml.snap +++ b/apollo-router/src/configuration/snapshots/apollo_router__configuration__metrics__test__metrics@apollo_telemetry.router.yaml.snap @@ -7,7 +7,7 @@ expression: "& metrics.non_zero()" datapoints: - value: 1 attributes: - opt.errors.preview_extended_error_metrics: enabled + opt.errors.extended_error_metrics: enabled opt.field_level_instrumentation_sampler: 1 opt.metrics.otlp.batch_processor.max_export_timeout: 103s opt.metrics.otlp.batch_processor.scheduled_delay: 5s diff --git a/apollo-router/src/configuration/snapshots/apollo_router__configuration__metrics__test__metrics@experimental_features.router.yaml.snap b/apollo-router/src/configuration/snapshots/apollo_router__configuration__metrics__test__metrics@experimental_features.router.yaml.snap index 472ffefe70..82d8592a56 100644 --- a/apollo-router/src/configuration/snapshots/apollo_router__configuration__metrics__test__metrics@experimental_features.router.yaml.snap +++ b/apollo-router/src/configuration/snapshots/apollo_router__configuration__metrics__test__metrics@experimental_features.router.yaml.snap @@ -7,7 +7,7 @@ expression: "& metrics.non_zero()" datapoints: - value: 1 attributes: - opt.errors.preview_extended_error_metrics: false + opt.errors.extended_error_metrics: false opt.field_level_instrumentation_sampler: false opt.metrics.otlp.batch_processor.max_export_timeout: false opt.metrics.otlp.batch_processor.scheduled_delay: false diff --git a/apollo-router/src/configuration/snapshots/apollo_router__configuration__tests__schema_generation.snap b/apollo-router/src/configuration/snapshots/apollo_router__configuration__tests__schema_generation.snap index b9e99c3903..02379f0153 100644 --- a/apollo-router/src/configuration/snapshots/apollo_router__configuration__tests__schema_generation.snap +++ b/apollo-router/src/configuration/snapshots/apollo_router__configuration__tests__schema_generation.snap @@ -305,7 +305,7 @@ expression: "&schema" "description": "Set the signature normalization algorithm to use when sending Apollo usage reports." }, "subgraph_metrics": { - "default": false, + "default": true, "description": "Enable sending additional subgraph metrics to Apollo Studio via OTLP", "type": "boolean" }, @@ -3652,7 +3652,7 @@ expression: "&schema" "ErrorsConfiguration": { "additionalProperties": false, "properties": { - "preview_extended_error_metrics": { + "extended_error_metrics": { "allOf": [ { "$ref": "#/definitions/ExtendedErrorMetricsMode" diff --git a/apollo-router/src/configuration/snapshots/apollo_router__configuration__tests__upgrade_old_configuration@apollo_extended_error_metrics.yaml.snap b/apollo-router/src/configuration/snapshots/apollo_router__configuration__tests__upgrade_old_configuration@apollo_extended_error_metrics.yaml.snap new file mode 100644 index 0000000000..dd68f0e39c --- /dev/null +++ b/apollo-router/src/configuration/snapshots/apollo_router__configuration__tests__upgrade_old_configuration@apollo_extended_error_metrics.yaml.snap @@ -0,0 +1,9 @@ +--- +source: apollo-router/src/configuration/tests.rs +expression: new_config +--- +--- +telemetry: + apollo: + errors: + extended_error_metrics: enabled diff --git a/apollo-router/src/configuration/snapshots/apollo_router__configuration__tests__upgrade_old_configuration@apollo_extended_errors.yaml.snap b/apollo-router/src/configuration/snapshots/apollo_router__configuration__tests__upgrade_old_configuration@apollo_extended_errors.yaml.snap index fce7119e0a..dd68f0e39c 100644 --- a/apollo-router/src/configuration/snapshots/apollo_router__configuration__tests__upgrade_old_configuration@apollo_extended_errors.yaml.snap +++ b/apollo-router/src/configuration/snapshots/apollo_router__configuration__tests__upgrade_old_configuration@apollo_extended_errors.yaml.snap @@ -6,4 +6,4 @@ expression: new_config telemetry: apollo: errors: - preview_extended_error_metrics: enabled + extended_error_metrics: enabled diff --git a/apollo-router/src/configuration/testdata/metrics/apollo_telemetry.router.yaml b/apollo-router/src/configuration/testdata/metrics/apollo_telemetry.router.yaml index 6338995701..a4942cd689 100644 --- a/apollo-router/src/configuration/testdata/metrics/apollo_telemetry.router.yaml +++ b/apollo-router/src/configuration/testdata/metrics/apollo_telemetry.router.yaml @@ -4,7 +4,7 @@ supergraph: telemetry: apollo: errors: - preview_extended_error_metrics: enabled + extended_error_metrics: enabled subgraph: all: send: true diff --git a/apollo-router/src/configuration/testdata/migrations/apollo_extended_error_metrics.yaml b/apollo-router/src/configuration/testdata/migrations/apollo_extended_error_metrics.yaml new file mode 100644 index 0000000000..5320c5126a --- /dev/null +++ b/apollo-router/src/configuration/testdata/migrations/apollo_extended_error_metrics.yaml @@ -0,0 +1,4 @@ +telemetry: + apollo: + errors: + preview_extended_error_metrics: enabled diff --git a/apollo-router/src/plugins/connectors/incompatible/telemetry.rs b/apollo-router/src/plugins/connectors/incompatible/telemetry.rs index 3d42ee4420..43fc6e8814 100644 --- a/apollo-router/src/plugins/connectors/incompatible/telemetry.rs +++ b/apollo-router/src/plugins/connectors/incompatible/telemetry.rs @@ -23,7 +23,7 @@ impl IncompatiblePlugin for TelemetryIncompatPlugin { self.config.subgraph.all.send // When ExtendedErrorMetricsMode is enabled, this plugin supports reporting connector errors && !matches!( - self.config.preview_extended_error_metrics, + self.config.extended_error_metrics, apollo::ExtendedErrorMetricsMode::Enabled ) } @@ -39,7 +39,7 @@ impl IncompatiblePlugin for TelemetryIncompatPlugin { .partition_map(|(name, sub)| { if sub.send && !matches!( - self.config.preview_extended_error_metrics, + self.config.extended_error_metrics, apollo::ExtendedErrorMetricsMode::Enabled ) { @@ -61,13 +61,13 @@ impl IncompatiblePlugin for TelemetryIncompatPlugin { if self.config.subgraph.subgraphs.contains_key(subgraph) { tracing::warn!( subgraph = subgraph, - message = "plugin `telemetry` is explicitly configured to send errors to Apollo studio for connector-enabled subgraph, which is only supported when `preview_extended_error_metrics` is enabled", + message = "plugin `telemetry` is explicitly configured to send errors to Apollo studio for connector-enabled subgraph, which is only supported when `extended_error_metrics` is enabled", see = "https://go.apollo.dev/connectors/incompat", ); } else { tracing::info!( subgraph = subgraph, - message = "plugin `telemetry` is indirectly configured to send errors to Apollo studio for a connector-enabled subgraph, which is only supported when `preview_extended_error_metrics` is enabled", + message = "plugin `telemetry` is indirectly configured to send errors to Apollo studio for a connector-enabled subgraph, which is only supported when `extended_error_metrics` is enabled", see = "https://go.apollo.dev/connectors/incompat", ); } diff --git a/apollo-router/src/plugins/telemetry/apollo.rs b/apollo-router/src/plugins/telemetry/apollo.rs index d772582183..d816ea42b4 100644 --- a/apollo-router/src/plugins/telemetry/apollo.rs +++ b/apollo-router/src/plugins/telemetry/apollo.rs @@ -277,7 +277,7 @@ pub(crate) struct ErrorsConfiguration { pub(crate) subgraph: SubgraphErrorConfig, /// Send error metrics via OTLP with additional dimensions [`extensions.service`, `extensions.code`] - pub(crate) preview_extended_error_metrics: ExtendedErrorMetricsMode, + pub(crate) extended_error_metrics: ExtendedErrorMetricsMode, } #[derive(Debug, Clone, Deserialize, JsonSchema, Default, PartialEq)] @@ -326,10 +326,10 @@ impl SubgraphErrorConfig { #[serde(deny_unknown_fields, rename_all = "lowercase")] pub(crate) enum ExtendedErrorMetricsMode { /// Do not send extended OTLP error metrics - #[default] Disabled, /// Send extended OTLP error metrics to Apollo Studio with additional dimensions [`extensions.service`, `extensions.code`]. /// If enabled, it's also recommended to enable `redaction_policy: extended` on subgraphs to send the `extensions.code` for subgraph errors. + #[default] Enabled, } @@ -416,7 +416,7 @@ impl Default for Config { signature_normalization_algorithm: ApolloSignatureNormalizationAlgorithm::default(), experimental_local_field_metrics: false, metrics_reference_mode: ApolloMetricsReferenceMode::default(), - subgraph_metrics: false, + subgraph_metrics: true, sampler: None, } } diff --git a/apollo-router/src/plugins/telemetry/config_new/fixtures/connector/custom_counter_with_conditions/metrics.snap b/apollo-router/src/plugins/telemetry/config_new/fixtures/connector/custom_counter_with_conditions/metrics.snap index df5e1cec39..ad1bfe9e55 100644 --- a/apollo-router/src/plugins/telemetry/config_new/fixtures/connector/custom_counter_with_conditions/metrics.snap +++ b/apollo-router/src/plugins/telemetry/config_new/fixtures/connector/custom_counter_with_conditions/metrics.snap @@ -25,6 +25,17 @@ info: - user_api - connector_source: name --- +- name: apollo.router.operations.fetch.duration + description: Duration of a subgraph fetch. + unit: s + data: + datapoints: + - sum: 0.1 + count: 2 + attributes: + connector.source: user_api + has_errors: false + subgraph.name: users - name: not.found.count description: Count of 404 responses from the user API unit: count diff --git a/apollo-router/src/plugins/telemetry/config_new/fixtures/connector/custom_histogram/metrics.snap b/apollo-router/src/plugins/telemetry/config_new/fixtures/connector/custom_histogram/metrics.snap index 625db3923b..d01b25371d 100644 --- a/apollo-router/src/plugins/telemetry/config_new/fixtures/connector/custom_histogram/metrics.snap +++ b/apollo-router/src/plugins/telemetry/config_new/fixtures/connector/custom_histogram/metrics.snap @@ -23,6 +23,17 @@ info: - user_api - connector_source: name --- +- name: apollo.router.operations.fetch.duration + description: Duration of a subgraph fetch. + unit: s + data: + datapoints: + - sum: 0.1 + count: 2 + attributes: + connector.source: user_api + has_errors: false + subgraph.name: users - name: rate.limit description: Rate limit remaining unit: count diff --git a/apollo-router/src/plugins/telemetry/config_new/fixtures/connector/http_client_request_duration/metrics.snap b/apollo-router/src/plugins/telemetry/config_new/fixtures/connector/http_client_request_duration/metrics.snap index 057e879a3f..21ac9b6ed0 100644 --- a/apollo-router/src/plugins/telemetry/config_new/fixtures/connector/http_client_request_duration/metrics.snap +++ b/apollo-router/src/plugins/telemetry/config_new/fixtures/connector/http_client_request_duration/metrics.snap @@ -30,9 +30,21 @@ info: custom.supergraph.operation.kind: supergraph_operation_kind: string custom.has_error: - error: boolean -snapshot_kind: text + connector_on_response_error: true --- +- name: apollo.router.operations.fetch.duration + description: Duration of a subgraph fetch. + unit: s + data: + datapoints: + - sum: 0.1 + count: 1 + attributes: + connector.source: posts_api + graphql.operation.name: Test + graphql.operation.type: query + has_errors: false + subgraph.name: posts - name: http.client.request.duration description: Duration of HTTP client requests. unit: s diff --git a/apollo-router/src/plugins/telemetry/config_new/fixtures/connector/mapping_problems/metrics.snap b/apollo-router/src/plugins/telemetry/config_new/fixtures/connector/mapping_problems/metrics.snap index 1efce9ccb4..dbbfd15a07 100644 --- a/apollo-router/src/plugins/telemetry/config_new/fixtures/connector/mapping_problems/metrics.snap +++ b/apollo-router/src/plugins/telemetry/config_new/fixtures/connector/mapping_problems/metrics.snap @@ -30,8 +30,18 @@ info: connector_response_mapping_problems: boolean unit: count type: counter -snapshot_kind: text --- +- name: apollo.router.operations.fetch.duration + description: Duration of a subgraph fetch. + unit: s + data: + datapoints: + - sum: 0.1 + count: 2 + attributes: + connector.source: user_api + has_errors: false + subgraph.name: users - name: request.mapping.problems description: Count of connectors request mapping problems unit: count diff --git a/apollo-router/src/plugins/telemetry/config_new/fixtures/connector/subgraph_and_connector/metrics.snap b/apollo-router/src/plugins/telemetry/config_new/fixtures/connector/subgraph_and_connector/metrics.snap index bbf1d2ad82..77b106b874 100644 --- a/apollo-router/src/plugins/telemetry/config_new/fixtures/connector/subgraph_and_connector/metrics.snap +++ b/apollo-router/src/plugins/telemetry/config_new/fixtures/connector/subgraph_and_connector/metrics.snap @@ -16,6 +16,22 @@ info: attributes: subgraph.name: true --- +- name: apollo.router.operations.fetch.duration + description: Duration of a subgraph fetch. + unit: s + data: + datapoints: + - sum: 0.1 + count: 1 + attributes: + connector.source: reviews_api + has_errors: false + subgraph.name: reviews + - sum: 0.1 + count: 1 + attributes: + has_errors: false + subgraph.name: products - name: http.client.request.duration description: Duration of HTTP client requests. unit: s diff --git a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/caching/metrics.snap b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/caching/metrics.snap index 4082d41e02..6fd3197b48 100644 --- a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/caching/metrics.snap +++ b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/caching/metrics.snap @@ -75,6 +75,17 @@ info: supergraph.operation.name: supergraph_operation_name: string --- +- name: apollo.router.operations.fetch.duration + description: Duration of a subgraph fetch. + unit: s + data: + datapoints: + - sum: 0.1 + count: 1 + attributes: + graphql.operation.name: Test + has_errors: false + subgraph.name: products - name: apollo.router.response.cache description: Response cache hit/miss operations at the subgraph level unit: ops diff --git a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_counter/metrics.snap b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_counter/metrics.snap index 919d30bb62..784d70fdee 100644 --- a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_counter/metrics.snap +++ b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_counter/metrics.snap @@ -1,20 +1,29 @@ --- source: apollo-router/src/plugins/telemetry/config_new/instruments.rs -description: Test server request body size metrics +description: Custom counter expression: "&metrics.all()" info: telemetry: instrumentation: instruments: - router: - http.server.active_requests: false - http.server.request.duration: false + default_requirement_level: none + subgraph: custom_counter: description: count of requests type: counter unit: unit value: unit --- +- name: apollo.router.operations.fetch.duration + description: Duration of a subgraph fetch. + unit: s + data: + datapoints: + - sum: 0.1 + count: 1 + attributes: + has_errors: false + subgraph.name: products - name: custom_counter description: count of requests unit: unit diff --git a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_counter_aborted_request/metrics.snap b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_counter_aborted_request/metrics.snap index 919d30bb62..92e640656e 100644 --- a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_counter_aborted_request/metrics.snap +++ b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_counter_aborted_request/metrics.snap @@ -1,20 +1,29 @@ --- source: apollo-router/src/plugins/telemetry/config_new/instruments.rs -description: Test server request body size metrics +description: "Custom counter aborted request, the supergraph response didn't happen, but request should increment the metric on Drop." expression: "&metrics.all()" info: telemetry: instrumentation: instruments: - router: - http.server.active_requests: false - http.server.request.duration: false + default_requirement_level: none + subgraph: custom_counter: description: count of requests type: counter unit: unit value: unit --- +- name: apollo.router.operations.fetch.duration + description: Duration of a subgraph fetch. + unit: s + data: + datapoints: + - sum: 0.1 + count: 1 + attributes: + has_errors: false + subgraph.name: products - name: custom_counter description: count of requests unit: unit diff --git a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_counter_custom_value/metrics.snap b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_counter_custom_value/metrics.snap index 42f4e68f83..9e66b6ef27 100644 --- a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_counter_custom_value/metrics.snap +++ b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_counter_custom_value/metrics.snap @@ -1,21 +1,30 @@ --- source: apollo-router/src/plugins/telemetry/config_new/instruments.rs -description: Test server request body size metrics +description: Custom counter that gets a value from a header expression: "&metrics.all()" info: telemetry: instrumentation: instruments: - router: - http.server.active_requests: false - http.server.request.duration: false + default_requirement_level: none + subgraph: custom_counter: description: count of requests type: counter unit: unit value: - request_header: count_header + subgraph_request_header: count_header --- +- name: apollo.router.operations.fetch.duration + description: Duration of a subgraph fetch. + unit: s + data: + datapoints: + - sum: 0.1 + count: 1 + attributes: + has_errors: false + subgraph.name: products - name: custom_counter description: count of requests unit: unit diff --git a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_counter_with_attributes/metrics.snap b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_counter_with_attributes/metrics.snap index ed04a2d04e..3bf7f69a9e 100644 --- a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_counter_with_attributes/metrics.snap +++ b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_counter_with_attributes/metrics.snap @@ -18,6 +18,16 @@ info: custom_attribute: subgraph_request_header: custom_header --- +- name: apollo.router.operations.fetch.duration + description: Duration of a subgraph fetch. + unit: s + data: + datapoints: + - sum: 0.1 + count: 1 + attributes: + has_errors: false + subgraph.name: products - name: custom_counter description: count of requests unit: unit diff --git a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_counter_with_conditions/metrics.snap b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_counter_with_conditions/metrics.snap index 7cc4a760ff..a9598d63a8 100644 --- a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_counter_with_conditions/metrics.snap +++ b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_counter_with_conditions/metrics.snap @@ -22,6 +22,16 @@ info: - subgraph_request_header: custom_header - allowed --- +- name: apollo.router.operations.fetch.duration + description: Duration of a subgraph fetch. + unit: s + data: + datapoints: + - sum: 0.1 + count: 2 + attributes: + has_errors: false + subgraph.name: products - name: custom_counter description: count of requests unit: unit diff --git a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_custom_value/metrics.snap b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_custom_value/metrics.snap index c6df2c801b..14af65e6ef 100644 --- a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_custom_value/metrics.snap +++ b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_custom_value/metrics.snap @@ -15,6 +15,16 @@ info: value: subgraph_request_header: count_header --- +- name: apollo.router.operations.fetch.duration + description: Duration of a subgraph fetch. + unit: s + data: + datapoints: + - sum: 0.1 + count: 1 + attributes: + has_errors: false + subgraph.name: products - name: custom.histogram description: histogram of requests unit: unit diff --git a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_duration copy/metrics.snap b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_duration copy/metrics.snap index f4ffc8c504..9453798701 100644 --- a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_duration copy/metrics.snap +++ b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_duration copy/metrics.snap @@ -13,6 +13,16 @@ info: subgraph.name: alias: apollo_subgraph_name --- +- name: apollo.router.operations.fetch.duration + description: Duration of a subgraph fetch. + unit: s + data: + datapoints: + - sum: 0.1 + count: 1 + attributes: + has_errors: false + subgraph.name: products - name: http.client.request.duration description: Duration of HTTP client requests. unit: s diff --git a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_duration/metrics.snap b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_duration/metrics.snap index 7eff2b686b..b1850d657a 100644 --- a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_duration/metrics.snap +++ b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_duration/metrics.snap @@ -14,6 +14,16 @@ info: unit: unit value: duration --- +- name: apollo.router.operations.fetch.duration + description: Duration of a subgraph fetch. + unit: s + data: + datapoints: + - sum: 0.1 + count: 1 + attributes: + has_errors: false + subgraph.name: products - name: custom.histogram.duration description: histogram of requests unit: unit diff --git a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_duration_aborted_request/metrics.snap b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_duration_aborted_request/metrics.snap index a76d8fa27b..481aa016af 100644 --- a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_duration_aborted_request/metrics.snap +++ b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_duration_aborted_request/metrics.snap @@ -14,6 +14,15 @@ info: unit: unit value: duration --- +- name: apollo.router.operations.fetch.duration + description: Duration of a subgraph fetch. + unit: s + data: + datapoints: + - sum: 0.1 + count: 1 + attributes: + subgraph.name: products - name: custom.histogram.duration description: histogram of requests unit: unit diff --git a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_unit/metrics.snap b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_unit/metrics.snap index 97055c3348..3918ff6a1e 100644 --- a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_unit/metrics.snap +++ b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_unit/metrics.snap @@ -14,6 +14,16 @@ info: unit: unit value: unit --- +- name: apollo.router.operations.fetch.duration + description: Duration of a subgraph fetch. + unit: s + data: + datapoints: + - sum: 0.1 + count: 1 + attributes: + has_errors: false + subgraph.name: products - name: custom.histogram description: histogram of requests unit: unit diff --git a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_unit_aborted_request/metrics.snap b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_unit_aborted_request/metrics.snap index 93633beaae..5f37495264 100644 --- a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_unit_aborted_request/metrics.snap +++ b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_unit_aborted_request/metrics.snap @@ -14,6 +14,15 @@ info: unit: unit value: unit --- +- name: apollo.router.operations.fetch.duration + description: Duration of a subgraph fetch. + unit: s + data: + datapoints: + - sum: 0.1 + count: 1 + attributes: + subgraph.name: products - name: custom.histogram description: histogram of requests unit: unit diff --git a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_with_attributes/metrics.snap b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_with_attributes/metrics.snap index 7d7df87966..447c40e703 100644 --- a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_with_attributes/metrics.snap +++ b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_with_attributes/metrics.snap @@ -18,6 +18,16 @@ info: custom_attribute: subgraph_request_header: custom_header --- +- name: apollo.router.operations.fetch.duration + description: Duration of a subgraph fetch. + unit: s + data: + datapoints: + - sum: 0.1 + count: 1 + attributes: + has_errors: false + subgraph.name: products - name: custom.histogram description: histogram of requests unit: unit diff --git a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_with_conditions/metrics.snap b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_with_conditions/metrics.snap index dd45cb8f47..64063b37be 100644 --- a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_with_conditions/metrics.snap +++ b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/custom_histogram_with_conditions/metrics.snap @@ -22,6 +22,16 @@ info: - subgraph_request_header: custom_header - allowed --- +- name: apollo.router.operations.fetch.duration + description: Duration of a subgraph fetch. + unit: s + data: + datapoints: + - sum: 0.1 + count: 2 + attributes: + has_errors: false + subgraph.name: products - name: custom.histogram description: histogram of requests unit: unit diff --git a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/http.client.request.body.size/metrics.snap b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/http.client.request.body.size/metrics.snap index 4e8f392708..953c7a5ad0 100644 --- a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/http.client.request.body.size/metrics.snap +++ b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/http.client.request.body.size/metrics.snap @@ -13,7 +13,18 @@ info: subgraph: http.client.request.duration: false http.client.request.body.size: true + http.client.response.body.size: false --- +- name: apollo.router.operations.fetch.duration + description: Duration of a subgraph fetch. + unit: s + data: + datapoints: + - sum: 0.1 + count: 1 + attributes: + has_errors: false + subgraph.name: products - name: http.client.request.body.size description: Size of HTTP client request bodies. unit: By diff --git a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/http.client.response.body.size/metrics.snap b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/http.client.response.body.size/metrics.snap index 18cd3f7f18..0051713a90 100644 --- a/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/http.client.response.body.size/metrics.snap +++ b/apollo-router/src/plugins/telemetry/config_new/fixtures/subgraph/http.client.response.body.size/metrics.snap @@ -15,6 +15,16 @@ info: http.client.request.body.size: false http.client.response.body.size: true --- +- name: apollo.router.operations.fetch.duration + description: Duration of a subgraph fetch. + unit: s + data: + datapoints: + - sum: 0.1 + count: 1 + attributes: + has_errors: false + subgraph.name: products - name: http.client.response.body.size description: Size of HTTP client response bodies. unit: By diff --git a/apollo-router/src/plugins/telemetry/error_counter/mod.rs b/apollo-router/src/plugins/telemetry/error_counter/mod.rs index 074295634f..8f9d1c746e 100644 --- a/apollo-router/src/plugins/telemetry/error_counter/mod.rs +++ b/apollo-router/src/plugins/telemetry/error_counter/mod.rs @@ -220,14 +220,14 @@ fn count_operation_errors<'a>( let send_otlp_errors = if service.is_empty() { matches!( - errors_config.preview_extended_error_metrics, + errors_config.extended_error_metrics, ExtendedErrorMetricsMode::Enabled ) } else { let subgraph_error_config = errors_config.subgraph.get_error_config(&service); subgraph_error_config.send && matches!( - errors_config.preview_extended_error_metrics, + errors_config.extended_error_metrics, ExtendedErrorMetricsMode::Enabled ) }; diff --git a/apollo-router/src/plugins/telemetry/error_counter/tests.rs b/apollo-router/src/plugins/telemetry/error_counter/tests.rs index 6767513fa3..d2ee6fc928 100644 --- a/apollo-router/src/plugins/telemetry/error_counter/tests.rs +++ b/apollo-router/src/plugins/telemetry/error_counter/tests.rs @@ -49,7 +49,7 @@ use crate::spec::query::EXTENSIONS_VALUE_COMPLETION_KEY; async fn test_count_supergraph_errors_with_no_previously_counted_errors() { async { let config = ErrorsConfiguration { - preview_extended_error_metrics: ExtendedErrorMetricsMode::Enabled, + extended_error_metrics: ExtendedErrorMetricsMode::Enabled, ..Default::default() }; @@ -112,7 +112,7 @@ async fn test_count_supergraph_errors_with_no_previously_counted_errors() { async fn test_count_supergraph_errors_with_previously_counted_errors() { async { let config = ErrorsConfiguration { - preview_extended_error_metrics: ExtendedErrorMetricsMode::Enabled, + extended_error_metrics: ExtendedErrorMetricsMode::Enabled, ..Default::default() }; @@ -202,7 +202,7 @@ async fn test_count_supergraph_errors_with_previously_counted_errors() { async fn test_count_subgraph_errors_with_include_subgraphs_enabled() { async { let config = ErrorsConfiguration { - preview_extended_error_metrics: ExtendedErrorMetricsMode::Enabled, + extended_error_metrics: ExtendedErrorMetricsMode::Enabled, subgraph: SubgraphErrorConfig { subgraphs: HashMap::from([( "some-subgraph".to_string(), @@ -276,7 +276,7 @@ async fn test_count_subgraph_errors_with_include_subgraphs_enabled() { async fn test_count_subgraph_errors_with_include_subgraphs_disabled() { async { let config = ErrorsConfiguration { - preview_extended_error_metrics: ExtendedErrorMetricsMode::Enabled, + extended_error_metrics: ExtendedErrorMetricsMode::Enabled, subgraph: SubgraphErrorConfig { subgraphs: HashMap::from([( "some-subgraph".to_string(), @@ -346,7 +346,7 @@ async fn test_count_subgraph_errors_emits_span_event_with_error_code() { let _guard = crate::test_harness::tracing_test::dispatcher_guard(); let config = ErrorsConfiguration { - preview_extended_error_metrics: ExtendedErrorMetricsMode::Enabled, + extended_error_metrics: ExtendedErrorMetricsMode::Enabled, ..Default::default() }; @@ -388,7 +388,7 @@ async fn test_count_subgraph_errors_emits_span_event_with_error_code() { async fn test_count_execution_errors() { async { let config = ErrorsConfiguration { - preview_extended_error_metrics: ExtendedErrorMetricsMode::Enabled, + extended_error_metrics: ExtendedErrorMetricsMode::Enabled, ..Default::default() }; @@ -454,7 +454,7 @@ async fn test_count_operation_errors_skips_span_event_when_marker_is_set() { let _guard = crate::test_harness::tracing_test::dispatcher_guard(); let config = ErrorsConfiguration { - preview_extended_error_metrics: ExtendedErrorMetricsMode::Enabled, + extended_error_metrics: ExtendedErrorMetricsMode::Enabled, ..Default::default() }; @@ -512,7 +512,7 @@ async fn test_count_execution_errors_emits_span_event_with_error_code() { let _guard = crate::test_harness::tracing_test::dispatcher_guard(); let config = ErrorsConfiguration { - preview_extended_error_metrics: ExtendedErrorMetricsMode::Enabled, + extended_error_metrics: ExtendedErrorMetricsMode::Enabled, ..Default::default() }; @@ -555,7 +555,7 @@ async fn test_count_execution_errors_emits_span_event_with_error_code() { async fn test_count_router_errors() { async { let config = ErrorsConfiguration { - preview_extended_error_metrics: ExtendedErrorMetricsMode::Enabled, + extended_error_metrics: ExtendedErrorMetricsMode::Enabled, ..Default::default() }; @@ -619,7 +619,7 @@ async fn test_count_router_errors() { async fn test_count_operation_errors_with_extended_config_enabled() { async { let config = ErrorsConfiguration { - preview_extended_error_metrics: ExtendedErrorMetricsMode::Enabled, + extended_error_metrics: ExtendedErrorMetricsMode::Enabled, ..Default::default() }; @@ -664,7 +664,7 @@ async fn test_count_operation_errors_with_extended_config_enabled() { async fn test_count_operation_errors_with_all_json_types_and_extended_config_enabled() { async { let config = ErrorsConfiguration { - preview_extended_error_metrics: ExtendedErrorMetricsMode::Enabled, + extended_error_metrics: ExtendedErrorMetricsMode::Enabled, ..Default::default() }; @@ -759,7 +759,7 @@ async fn test_count_operation_errors_with_all_json_types_and_extended_config_ena async fn test_count_operation_errors_with_duplicate_errors_and_extended_config_enabled() { async { let config = ErrorsConfiguration { - preview_extended_error_metrics: ExtendedErrorMetricsMode::Enabled, + extended_error_metrics: ExtendedErrorMetricsMode::Enabled, ..Default::default() }; @@ -862,7 +862,7 @@ async fn test_subgraph_error_counting() { "telemetry":{ "apollo": { "errors": { - "preview_extended_error_metrics": "enabled", + "extended_error_metrics": "enabled", "subgraph": { "subgraphs": { "myIgnoredSubgraph": { @@ -977,7 +977,7 @@ async fn test_execution_error_counting() { "telemetry":{ "apollo": { "errors": { - "preview_extended_error_metrics": "enabled", + "extended_error_metrics": "enabled", "subgraph": { "subgraphs": { "myIgnoredSubgraph": { @@ -1089,7 +1089,7 @@ async fn test_supergraph_error_counting() { "telemetry":{ "apollo": { "errors": { - "preview_extended_error_metrics": "enabled", + "extended_error_metrics": "enabled", "subgraph": { "subgraphs": { "myIgnoredSubgraph": { @@ -1193,7 +1193,7 @@ async fn test_router_error_counting() { "telemetry":{ "apollo": { "errors": { - "preview_extended_error_metrics": "enabled", + "extended_error_metrics": "enabled", "subgraph": { "subgraphs": { "myIgnoredSubgraph": { @@ -1302,7 +1302,7 @@ async fn test_operation_errors_emitted_when_config_is_enabled() { "telemetry":{ "apollo": { "errors": { - "preview_extended_error_metrics": "enabled", + "extended_error_metrics": "enabled", "subgraph": { "subgraphs": { "myIgnoredSubgraph": { diff --git a/apollo-router/tests/integration/connectors.rs b/apollo-router/tests/integration/connectors.rs index 8f9bb32881..92a2ccecf2 100644 --- a/apollo-router/tests/integration/connectors.rs +++ b/apollo-router/tests/integration/connectors.rs @@ -749,6 +749,7 @@ mod telemetry { telemetry: apollo: errors: + extended_error_metrics: disabled subgraph: all: send: true @@ -765,7 +766,7 @@ mod telemetry { router.start().await; router - .wait_for_log_message(r#""subgraph":"connectors","message":"plugin `telemetry` is indirectly configured to send errors to Apollo studio for a connector-enabled subgraph, which is only supported when `preview_extended_error_metrics` is enabled"#) + .wait_for_log_message(r#""subgraph":"connectors","message":"plugin `telemetry` is indirectly configured to send errors to Apollo studio for a connector-enabled subgraph, which is only supported when `extended_error_metrics` is enabled"#) .await; Ok(()) @@ -786,6 +787,7 @@ mod telemetry { telemetry: apollo: errors: + extended_error_metrics: disabled subgraph: all: send: false @@ -805,7 +807,7 @@ mod telemetry { router.start().await; router - .wait_for_log_message(r#""subgraph":"connectors","message":"plugin `telemetry` is explicitly configured to send errors to Apollo studio for connector-enabled subgraph, which is only supported when `preview_extended_error_metrics` is enabled"#) + .wait_for_log_message(r#""subgraph":"connectors","message":"plugin `telemetry` is explicitly configured to send errors to Apollo studio for connector-enabled subgraph, which is only supported when `extended_error_metrics` is enabled"#) .await; Ok(()) @@ -866,7 +868,7 @@ mod telemetry { telemetry: apollo: errors: - preview_extended_error_metrics: enabled + extended_error_metrics: enabled subgraph: all: send: true diff --git a/apollo-router/tests/integration/telemetry/apollo_otel_metrics.rs b/apollo-router/tests/integration/telemetry/apollo_otel_metrics.rs index 1b7f2dd6b8..34fce723ac 100644 --- a/apollo-router/tests/integration/telemetry/apollo_otel_metrics.rs +++ b/apollo-router/tests/integration/telemetry/apollo_otel_metrics.rs @@ -47,7 +47,7 @@ async fn test_validation_error_emits_metric() { batch_processor: scheduled_delay: 100ms errors: - preview_extended_error_metrics: enabled + extended_error_metrics: enabled "#, ) .responder(ResponseTemplate::new(500).append_header("Content-Type", "application/json")) @@ -103,7 +103,7 @@ async fn test_subgraph_http_error_emits_metric() { batch_processor: scheduled_delay: 100ms errors: - preview_extended_error_metrics: enabled + extended_error_metrics: enabled include_subgraph_errors: all: true "#, @@ -172,7 +172,7 @@ async fn test_subgraph_layer_error_emits_metric() { batch_processor: scheduled_delay: 100ms errors: - preview_extended_error_metrics: enabled + extended_error_metrics: enabled "#, ) .responder( @@ -251,7 +251,7 @@ async fn test_subgraph_layer_entities_error_emits_metric() { batch_processor: scheduled_delay: 100ms errors: - preview_extended_error_metrics: enabled + extended_error_metrics: enabled "#, ) .responder( @@ -331,7 +331,7 @@ async fn test_include_subgraph_error_disabled_does_not_redact_error_metrics() { batch_processor: scheduled_delay: 100ms errors: - preview_extended_error_metrics: enabled + extended_error_metrics: enabled include_subgraph_errors: all: false "#, @@ -413,7 +413,7 @@ async fn test_supergraph_layer_error_emits_metric() { batch_processor: scheduled_delay: 100ms errors: - preview_extended_error_metrics: enabled + extended_error_metrics: enabled supergraph: introspection: false "#, @@ -478,7 +478,7 @@ async fn test_execution_layer_error_emits_metric() { batch_processor: scheduled_delay: 100ms errors: - preview_extended_error_metrics: enabled + extended_error_metrics: enabled forbid_mutations: true "#, ) @@ -545,7 +545,7 @@ async fn test_router_layer_error_emits_metric() { batch_processor: scheduled_delay: 100ms errors: - preview_extended_error_metrics: enabled + extended_error_metrics: enabled csrf: required_headers: - x-not-matched-header @@ -618,7 +618,7 @@ async fn test_apollo_studio_metrics_not_affected_by_rename() { batch_processor: scheduled_delay: 100ms errors: - preview_extended_error_metrics: enabled + extended_error_metrics: enabled exporters: metrics: common: diff --git a/apollo-router/tests/snapshots/apollo_otel_traces__connector_error.snap b/apollo-router/tests/snapshots/apollo_otel_traces__connector_error.snap index f8c308dc22..bbcb868667 100644 --- a/apollo-router/tests/snapshots/apollo_otel_traces__connector_error.snap +++ b/apollo-router/tests/snapshots/apollo_otel_traces__connector_error.snap @@ -268,13 +268,39 @@ resourceSpans: value: stringValue: query droppedAttributesCount: 0 - events: [] + events: + - timeUnixNano: "[time]" + name: "" + attributes: + - key: exception.message + value: + stringValue: Request failed + - key: graphql.error.extensions.code + value: + stringValue: CONNECTOR_FETCH + - key: graphql.error.path + value: + stringValue: "[redacted]" + droppedAttributesCount: 0 + - timeUnixNano: "[time]" + name: "" + attributes: + - key: exception.message + value: + stringValue: Request failed + - key: graphql.error.extensions.code + value: + stringValue: CONNECTOR_FETCH + - key: graphql.error.path + value: + stringValue: "[redacted]" + droppedAttributesCount: 0 droppedEventsCount: 0 links: [] droppedLinksCount: 0 status: message: "" - code: 0 + code: 2 - traceId: "[trace_id]" spanId: "[span_id]" traceState: "" diff --git a/docs/shared/config/telemetry.mdx b/docs/shared/config/telemetry.mdx index 76087fe495..e3ae01ea82 100644 --- a/docs/shared/config/telemetry.mdx +++ b/docs/shared/config/telemetry.mdx @@ -27,7 +27,7 @@ telemetry: client_version_header: apollographql-client-version endpoint: https://usage-reporting.api.apollographql.com/api/ingress/traces errors: - preview_extended_error_metrics: disabled + extended_error_metrics: enabled subgraph: all: redact: true @@ -710,7 +710,7 @@ telemetry: client_version_header: apollographql-client-version endpoint: https://usage-reporting.api.apollographql.com/api/ingress/traces errors: - preview_extended_error_metrics: disabled + extended_error_metrics: enabled subgraph: all: redact: true diff --git a/docs/shared/router-config-properties-table.mdx b/docs/shared/router-config-properties-table.mdx index 28673cb614..450dec65f3 100644 --- a/docs/shared/router-config-properties-table.mdx +++ b/docs/shared/router-config-properties-table.mdx @@ -736,7 +736,7 @@ telemetry: client_version_header: apollographql-client-version endpoint: https://usage-reporting.api.apollographql.com/api/ingress/traces errors: - preview_extended_error_metrics: disabled + extended_error_metrics: enabled subgraph: all: redact: true diff --git a/docs/shared/router-yaml-complete.mdx b/docs/shared/router-yaml-complete.mdx index 7564bb8368..223543e8c4 100644 --- a/docs/shared/router-yaml-complete.mdx +++ b/docs/shared/router-yaml-complete.mdx @@ -347,7 +347,7 @@ telemetry: client_version_header: apollographql-client-version endpoint: https://usage-reporting.api.apollographql.com/api/ingress/traces errors: - preview_extended_error_metrics: disabled + extended_error_metrics: enabled subgraph: all: redact: true diff --git a/docs/source/routing/configuration/yaml.mdx b/docs/source/routing/configuration/yaml.mdx index aa5db18ab6..c03b2fb067 100644 --- a/docs/source/routing/configuration/yaml.mdx +++ b/docs/source/routing/configuration/yaml.mdx @@ -779,13 +779,13 @@ The router supports extended error reporting in the following versions: You can configure the router to report extended error information for improved diagnostics. Apollo's legacy error reporting doesn't include the service or error code, meaning you can't easily attribute errors to their root cause in GraphOS Studio. -Configure extended reference reporting in `router.yaml` with the `telemetry.apollo.errors.preview_extended_error_metrics` option: +Configure extended reference reporting in `router.yaml` with the `telemetry.apollo.errors.extended_error_metrics` option. It is enabled by default; to opt out, set it to `disabled`: ```yaml title="router.yaml" telemetry: apollo: errors: - preview_extended_error_metrics: enabled # Default is disabled + extended_error_metrics: enabled # Default is enabled ``` [Learn more about GraphOS extended error reporting](/graphos/routing/observability/graphos/graphos-reporting#enabling-extended-error-reporting). diff --git a/docs/source/routing/observability/graphos/graphos-reporting.mdx b/docs/source/routing/observability/graphos/graphos-reporting.mdx index d18253f3b9..02533df6f4 100644 --- a/docs/source/routing/observability/graphos/graphos-reporting.mdx +++ b/docs/source/routing/observability/graphos/graphos-reporting.mdx @@ -426,20 +426,19 @@ telemetry: send: false ``` -#### Enabling extended error reporting +#### Extended error reporting