diff --git a/apollo-router/src/apollo_studio_interop/mod.rs b/apollo-router/src/apollo_studio_interop/mod.rs index e1571fa672..16b1a2f9ee 100644 --- a/apollo-router/src/apollo_studio_interop/mod.rs +++ b/apollo-router/src/apollo_studio_interop/mod.rs @@ -285,18 +285,17 @@ pub(crate) fn extract_enums_from_response( operation_name: Option<&str>, schema: &Valid, response_body: &Object, -) -> ReferencedEnums { - let mut result = ReferencedEnums::new(); + existing_refs: &mut ReferencedEnums, +) { if let Some(operation) = query.operation(operation_name) { extract_enums_from_selection_set( &operation.selection_set, &query.fragments, schema, response_body, - &mut result, + existing_refs, ); } - result } fn add_enum_value_to_map( diff --git a/apollo-router/src/apollo_studio_interop/tests.rs b/apollo-router/src/apollo_studio_interop/tests.rs index b6c1e03d22..34f457a196 100644 --- a/apollo-router/src/apollo_studio_interop/tests.rs +++ b/apollo-router/src/apollo_studio_interop/tests.rs @@ -130,12 +130,15 @@ fn enums_from_response( let query = Query::parse(query_str, operation_name, &schema, &config).unwrap(); let response_body: Object = serde_json::from_str(response_body_str).unwrap(); + let mut result = ReferencedEnums::new(); extract_enums_from_response( Arc::new(query), operation_name, schema.supergraph_schema(), &response_body, - ) + &mut result, + ); + result } #[test(tokio::test)] diff --git a/apollo-router/src/plugins/telemetry/mod.rs b/apollo-router/src/plugins/telemetry/mod.rs index 42b34cbfae..f348e2969c 100644 --- a/apollo-router/src/plugins/telemetry/mod.rs +++ b/apollo-router/src/plugins/telemetry/mod.rs @@ -1528,9 +1528,11 @@ impl Telemetry { .extensions() .with_lock(|lock| lock.get::().cloned()) .unwrap_or_default(); + // Clear the enum values from responses when we send them in a report so that we properly report enum response + // values for deferred responses and subscriptions. let enum_response_references = context .extensions() - .with_lock(|lock| lock.get::().cloned()) + .with_lock(|mut lock| lock.remove::()) .unwrap_or_default(); SingleStatsReport { diff --git a/apollo-router/src/services/execution/service.rs b/apollo-router/src/services/execution/service.rs index 1902fe80c6..9486e50ec1 100644 --- a/apollo-router/src/services/execution/service.rs +++ b/apollo-router/src/services/execution/service.rs @@ -353,16 +353,20 @@ impl ExecutionService { nullified_paths.extend(paths); - let referenced_enums = if let (ApolloMetricsReferenceMode::Extended, Some(Value::Object(response_body))) = (metrics_ref_mode, &response.data) { + let mut referenced_enums = context + .extensions() + .with_lock(|lock| lock.get::().cloned()) + .unwrap_or_default(); + if let (ApolloMetricsReferenceMode::Extended, Some(Value::Object(response_body))) = (metrics_ref_mode, &response.data) { extract_enums_from_response( query.clone(), operation_name, schema.api_schema(), response_body, + &mut referenced_enums, ) - } else { - ReferencedEnums::new() }; + context .extensions() .with_lock(|mut lock| lock.insert::(referenced_enums));