diff --git a/.changesets/fix_bnjjj_fix_supergraph_query_selector.md b/.changesets/fix_bnjjj_fix_supergraph_query_selector.md new file mode 100644 index 0000000000..0914846045 --- /dev/null +++ b/.changesets/fix_bnjjj_fix_supergraph_query_selector.md @@ -0,0 +1,20 @@ +### Execute supergraph query selector also on events ([PR #5764](https://github.com/apollographql/router/pull/5764)) + +The `query: root_fields` selector works on `response` stage for events right now but it should also work on `event_response`. This configuration is now working: + +```yaml +telemetry: + instrumentation: + events: + supergraph: + OPERATION_LIMIT_INFO: + message: operation limit info + on: event_response + level: info + attributes: + graphql.operation.name: true + query.root_fields: + query: root_fields +``` + +By [@bnjjj](https://github.com/bnjjj) in https://github.com/apollographql/router/pull/5764 \ No newline at end of file diff --git a/apollo-router/src/plugins/telemetry/config_new/selectors.rs b/apollo-router/src/plugins/telemetry/config_new/selectors.rs index 1216afe0f5..875f88efb7 100644 --- a/apollo-router/src/plugins/telemetry/config_new/selectors.rs +++ b/apollo-router/src/plugins/telemetry/config_new/selectors.rs @@ -833,7 +833,11 @@ impl Selector for SupergraphSelector { .flatten() .map(opentelemetry::Value::from), - SupergraphSelector::Query { default, .. } => request + SupergraphSelector::Query { + default, + query: Query::String, + .. + } => request .supergraph_request .body() .query @@ -990,6 +994,25 @@ impl Selector for SupergraphSelector { ctx: &Context, ) -> Option { match self { + SupergraphSelector::Query { query, .. } => { + let limits_opt = ctx + .extensions() + .with_lock(|lock| lock.get::>().cloned()); + match query { + Query::Aliases => { + limits_opt.map(|limits| opentelemetry::Value::I64(limits.aliases as i64)) + } + Query::Depth => { + limits_opt.map(|limits| opentelemetry::Value::I64(limits.depth as i64)) + } + Query::Height => { + limits_opt.map(|limits| opentelemetry::Value::I64(limits.height as i64)) + } + Query::RootFields => limits_opt + .map(|limits| opentelemetry::Value::I64(limits.root_fields as i64)), + Query::String => None, + } + } SupergraphSelector::ResponseData { response_data, default, @@ -3010,13 +3033,19 @@ mod test { selector .on_response( &crate::services::SupergraphResponse::fake_builder() - .context(context) + .context(context.clone()) .build() .unwrap() ) .unwrap(), 4.into() ); + assert_eq!( + selector + .on_response_event(&crate::graphql::Response::builder().build(), &context) + .unwrap(), + 4.into() + ); } #[test]