Skip to content

feat(server): add telemetry spans and metrics to groups/get - #3613

Merged
twishabansal merged 31 commits into
feat/groupsfrom
feat/groups-pr4-telemetry
Jul 21, 2026
Merged

feat(server): add telemetry spans and metrics to groups/get#3613
twishabansal merged 31 commits into
feat/groupsfrom
feat/groups-pr4-telemetry

Conversation

@twishabansal

@twishabansal twishabansal commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Description

Follow-up to #3583, adding the telemetry that was deferred out of the introspection PR to keep it focused.

This mirrors the existing prompts/get instrumentation for groups/get across all five MCP version packages (v20241105, v20250326, v20250618, v20251125, vdraft)

twishabansal and others added 29 commits June 22, 2026 15:47
Introduce internal/group as the source of truth for a named collection of
tools and prompts. Group.Initialize reuses the toolset/promptset Initialize
logic; ToToolset/ToPromptset project the legacy views keyed by the group name.
No existing behavior changes yet.
Embed the initialized Toolset and Promptset in Group instead of
flattening their fields, so ToToolset/ToPromptset return the views
with their lookup sets intact rather than rebuilding them per call.
Replace the toolset/promptset maps with an authoritative groups map and
derive the toolset/promptset views from it via ToToolset/ToPromptset.
Legacy kind: toolsets configs convert to tools-only groups at init, and
the default nameless group holds all tools and prompts. No YAML surface
change; kind: groups parsing is deferred to a follow-up.
Add parsing for `kind: group` documents (flat and nested `groups:`
blocks) in UnmarshalResourceConfig, returning parsed GroupConfigs.
Validate duplicate default/named groups and reject a default group
that declares tools or prompts. Wire GroupConfigs through config
merge, reload, and initializeGroups so kind: group definitions
override same-named toolsets.
The MCP route is /{toolsetName}, so promptsetName was always empty and
GetPromptset("") returned all prompts regardless of the connected group.
Resolve the group by its URL name and use its derived toolset/promptset
views so prompts/list scopes per group.
Expose group introspection across all five protocol versions. groups/list
returns named groups with descriptions, omitting the default nameless group.
groups/get returns a named group's tools and prompts.
The vdraft protocol requires every MCP method to validate request headers
and metadata. Wire GROUPS_LIST/GROUPS_GET handlers to accept the header,
call validateHeader/validateMetadata, and carry RequestParams on their
request types.
Move groups/list and groups/get result shaping into GenerateListGroupsResult
and GenerateGetGroupResult in manifests.go so the handlers stay thin, matching
the tools/prompts pattern. Embed PaginatedRequest in ListGroupsRequest for
request-type parity across all five protocol versions.
Decouple Group from the legacy tools.Toolset/prompts.Promptset types per
review feedback. Group now keeps its own O(1) tool/prompt membership sets and
exposes ContainsTool/ContainsPrompt directly, instead of deriving and storing
full toolset/promptset views. Per-tool and per-prompt manifests are generated
on demand by callers from the resolved tools/prompts maps, so the group no
longer needs serverVersion at Initialize.
Pass the resolved group.Group through ProcessMethod and the version
handlers instead of materialized toolset/promptset views. List handlers
now read ToolNames/PromptNames directly from the group, which scopes
prompts to a single group and fixes the always-empty promptset lookup.
…trospection

# Conflicts:
#	internal/server/mcp/v20241105/method.go
#	internal/server/mcp/v20250326/method.go
#	internal/server/mcp/v20250618/method.go
#	internal/server/mcp/v20251125/method.go
#	internal/server/mcp/vdraft/method.go
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
Rename GroupDescription to Group across all five MCP version packages
(v20241105, v20250326, v20250618, v20251125, vdraft) to match MCP type
conventions, and add prompts-style debug logging to groupsListHandler and
groupsGetHandler. Update group handler tests to inject a logger into context.
Mirror the prompts/get instrumentation for groups/get across all five MCP
version packages: set the span name to "groups/get <name>", record a
gen_ai.group.name span attribute, and populate the operation-duration metric
with gen_ai.operation.name=get_group and gen_ai.group.name. Adds a GroupName
field to util.GenAIMetricAttrs and wires it into the mcp duration metric.
@twishabansal
twishabansal requested a review from a team as a code owner July 13, 2026 17:13

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request adds telemetry instrumentation for MCP 'get group' operations by updating span names, setting span attributes, and tracking group names in metrics across multiple API versions. The reviewer recommends populating the genAIAttrs attributes before the GetGroup check in all versioned handlers to ensure that failed requests are also correctly classified in telemetry.

Comment thread internal/server/mcp/v20241105/method.go
Comment thread internal/server/mcp/v20250326/method.go
Comment thread internal/server/mcp/v20250618/method.go
Comment thread internal/server/mcp/v20251125/method.go
Comment thread internal/server/mcp/vdraft/method.go
@twishabansal twishabansal added the do not merge Indicates a pull request not ready for merge, due to either quality or timing. label Jul 13, 2026
Base automatically changed from feat/groups-pr3-introspection to feat/groups July 14, 2026 07:39
@twishabansal
twishabansal requested review from a team as code owners July 14, 2026 07:39
…4-telemetry

# Conflicts:
#	cmd/internal/config.go
#	cmd/internal/config_test.go
#	cmd/internal/invoke/command.go
#	cmd/internal/skills/command.go
#	cmd/root.go
#	cmd/root_test.go
#	internal/embeddingmodels/gemini/gemini_test.go
#	internal/group/group.go
#	internal/group/group_test.go
#	internal/server/common_test.go
#	internal/server/config.go
#	internal/server/mcp.go
#	internal/server/mcp/mcp.go
#	internal/server/mcp/v20241105/method.go
#	internal/server/mcp/v20241105/method_test.go
#	internal/server/mcp/v20250326/method.go
#	internal/server/mcp/v20250326/method_test.go
#	internal/server/mcp/v20250618/method.go
#	internal/server/mcp/v20250618/method_test.go
#	internal/server/mcp/v20251125/method.go
#	internal/server/mcp/v20251125/method_test.go
#	internal/server/mcp/vdraft/method.go
#	internal/server/mcp/vdraft/method_test.go
#	internal/server/mcp_test.go
#	internal/server/primitives/primitives_test.go
#	internal/server/resources/resources.go
#	internal/server/server.go
#	internal/server/server_test.go
#	internal/sources/alloydbadmin/alloydbadmin_test.go
#	internal/sources/alloydbpg/alloydb_pg_test.go
#	internal/sources/bigquery/bigquery_test.go
#	internal/sources/bigtable/bigtable_test.go
#	internal/sources/cassandra/cassandra_test.go
#	internal/sources/clickhouse/clickhouse_test.go
#	internal/sources/cloudgda/cloud_gda_test.go
#	internal/sources/cloudhealthcare/cloud_healthcare_test.go
#	internal/sources/cloudloggingadmin/cloud_logging_admin_test.go
#	internal/sources/cloudmonitoring/cloud_monitoring_test.go
#	internal/sources/cloudsqladmin/cloud_sql_admin_test.go
#	internal/sources/cloudsqlmssql/cloud_sql_mssql_test.go
#	internal/sources/cloudsqlmysql/cloud_sql_mysql_test.go
#	internal/sources/cloudsqlpg/cloud_sql_pg_test.go
#	internal/sources/cloudstorage/cloudstorage_test.go
#	internal/sources/couchbase/couchbase_test.go
#	internal/sources/datalineage/datalineage_test.go
#	internal/sources/dataplex/dataplex_test.go
#	internal/sources/dataproc/dataproc_test.go
#	internal/sources/dgraph/dgraph_test.go
#	internal/sources/elasticsearch/elasticsearch_test.go
#	internal/sources/firebird/firebird_test.go
#	internal/sources/firestore/firestore_test.go
#	internal/sources/http/http_test.go
#	internal/sources/looker/looker_test.go
#	internal/sources/mindsdb/mindsdb_test.go
#	internal/sources/mongodb/mongodb_test.go
#	internal/sources/mssql/mssql_test.go
#	internal/sources/mysql/mysql_test.go
#	internal/sources/neo4j/neo4j_test.go
#	internal/sources/oceanbase/oceanbase_test.go
#	internal/sources/oracle/oracle_test.go
#	internal/sources/postgres/postgres_test.go
#	internal/sources/redis/redis_test.go
#	internal/sources/scylladb/scylladb_test.go
#	internal/sources/serverlessspark/serverlessspark_test.go
#	internal/sources/singlestore/singlestore_test.go
#	internal/sources/snowflake/snowflake_test.go
#	internal/sources/spanner/spanner_test.go
#	internal/sources/sqlite/sqlite_test.go
#	internal/sources/tidb/tidb_test.go
#	internal/sources/trino/trino_test.go
#	internal/sources/valkey/valkey_test.go
#	internal/sources/yugabytedb/yugabytedb_test.go
#	internal/testutils/testutils.go
#	internal/tools/alloydb/alloydbcreatecluster/alloydbcreatecluster_test.go
#	internal/tools/alloydb/alloydbcreateinstance/alloydbcreateinstance_test.go
#	internal/tools/alloydb/alloydbcreateuser/alloydbcreateuser_test.go
#	internal/tools/alloydb/alloydbgetcluster/alloydbgetcluster_test.go
#	internal/tools/alloydb/alloydbgetinstance/alloydbgetinstance_test.go
#	internal/tools/alloydb/alloydbgetuser/alloydbgetuser_test.go
#	internal/tools/alloydb/alloydblistclusters/alloydblistclusters_test.go
#	internal/tools/alloydb/alloydblistinstances/alloydblistinstances_test.go
#	internal/tools/alloydb/alloydblistusers/alloydblistusers_test.go
#	internal/tools/alloydb/alloydbwaitforoperation/alloydbwaitforoperation_test.go
#	internal/tools/alloydbainl/alloydbainl_test.go
#	internal/tools/bigquery/bigqueryanalyzecontribution/bigqueryanalyzecontribution_test.go
#	internal/tools/bigquery/bigqueryconversationalanalytics/bigqueryconversationalanalytics_test.go
#	internal/tools/bigquery/bigqueryexecutesql/bigqueryexecutesql_test.go
#	internal/tools/bigquery/bigqueryforecast/bigqueryforecast_test.go
#	internal/tools/bigquery/bigquerygetdatasetinfo/bigquerygetdatasetinfo_test.go
#	internal/tools/bigquery/bigquerygettableinfo/bigquerygettableinfo_test.go
#	internal/tools/bigquery/bigquerylistdatasetids/bigquerylistdatasetids_test.go
#	internal/tools/bigquery/bigquerylisttableids/bigquerylisttableids_test.go
#	internal/tools/bigquery/bigquerysearchcatalog/bigquerysearchcatalog_test.go
#	internal/tools/bigquery/bigquerysql/bigquerysql_test.go
#	internal/tools/bigtable/bigtable_test.go
#	internal/tools/cassandra/cassandracql/cassandracql_test.go
#	internal/tools/clickhouse/clickhouseexecutesql/clickhouseexecutesql_test.go
#	internal/tools/clickhouse/clickhouselistdatabases/clickhouselistdatabases_test.go
#	internal/tools/clickhouse/clickhouselisttables/clickhouselisttables_test.go
#	internal/tools/clickhouse/clickhousesql/clickhousesql_test.go
#	internal/tools/cloudgda/cloudgda_test.go
#	internal/tools/cloudhealthcare/cloudhealthcarefhirfetchpage/cloudhealthcarefhirfetchpage_test.go
#	internal/tools/cloudhealthcare/cloudhealthcarefhirpatienteverything/cloudhealthcarefhirpatienteverything_test.go
#	internal/tools/cloudhealthcare/cloudhealthcarefhirpatientsearch/cloudhealthcarefhirpatientsearch_test.go
#	internal/tools/cloudhealthcare/cloudhealthcaregetdataset/cloudhealthcaregetdataset_test.go
#	internal/tools/cloudhealthcare/cloudhealthcaregetdicomstore/cloudhealthcaregetdicomstore_test.go
#	internal/tools/cloudhealthcare/cloudhealthcaregetdicomstoremetrics/cloudhealthcaregetdicomstoremetrics_test.go
#	internal/tools/cloudhealthcare/cloudhealthcaregetfhirresource/cloudhealthcaregetfhirresource_test.go
#	internal/tools/cloudhealthcare/cloudhealthcaregetfhirstore/cloudhealthcaregetfhirstore_test.go
#	internal/tools/cloudhealthcare/cloudhealthcaregetfhirstoremetrics/cloudhealthcaregetfhirstoremetrics_test.go
#	internal/tools/cloudhealthcare/cloudhealthcarelistdicomstores/cloudhealthcarelistdicomstores_test.go
#	internal/tools/cloudhealthcare/cloudhealthcarelistfhirstores/cloudhealthcarelistfhirstores_test.go
#	internal/tools/cloudhealthcare/cloudhealthcareretrieverendereddicominstance/cloudhealthcareretrieverendereddicominstance_test.go
#	internal/tools/cloudhealthcare/cloudhealthcaresearchdicominstances/cloudhealthcaresearchdicominstances_test.go
#	internal/tools/cloudhealthcare/cloudhealthcaresearchdicomseries/cloudhealthcaresearchdicomseries_test.go
#	internal/tools/cloudhealthcare/cloudhealthcaresearchdicomstudies/cloudhealthcaresearchdicomstudies_test.go
#	internal/tools/cloudloggingadmin/cloudloggingadminlistlognames/cloudloggingadminlistlognames_test.go
#	internal/tools/cloudloggingadmin/cloudloggingadminlistresourcetypes/cloudloggingadminlistresourcetypes_test.go
#	internal/tools/cloudloggingadmin/cloudloggingadminquerylogs/cloudloggingadminquerylogs_test.go
#	internal/tools/cloudmonitoring/cloudmonitoring_test.go
#	internal/tools/cloudsql/cloudsqlcloneinstance/cloudsqlcloneinstance_test.go
#	internal/tools/cloudsql/cloudsqlcreatebackup/cloudsqlcreatebackup_test.go
#	internal/tools/cloudsql/cloudsqlcreatedatabase/cloudsqlcreatedatabase_test.go
#	internal/tools/cloudsql/cloudsqlcreateusers/cloudsqlcreateusers_test.go
#	internal/tools/cloudsql/cloudsqlgetinstances/cloudsqlgetinstances_test.go
#	internal/tools/cloudsql/cloudsqllistdatabases/cloudsqllistdatabases_test.go
#	internal/tools/cloudsql/cloudsqllistinstances/cloudsqllistinstances_test.go
#	internal/tools/cloudsql/cloudsqlrestorebackup/cloudsqlrestorebackup_test.go
#	internal/tools/cloudsql/cloudsqlwaitforoperation/cloudsqlwaitforoperation_test.go
#	internal/tools/cloudsqladmin/cloudsqladminexecutemany/cloudsqladminexecutemany_test.go
#	internal/tools/cloudsqladmin/cloudsqladminsqlmany/cloudsqladminsqlmany_test.go
#	internal/tools/cloudsqlmssql/cloudsqlmssqlcreateinstance/cloudsqlmssqlcreateinstance_test.go
#	internal/tools/cloudsqlmysql/cloudsqlmysqlcreateinstance/cloudsqlmysqlcreateinstance_test.go
#	internal/tools/cloudsqlpg/cloudsqlpgcreateinstances/cloudsqlpgcreateinstances_test.go
#	internal/tools/cloudsqlpg/cloudsqlpgupgradeprecheck/cloudsqlpgupgradeprecheck_test.go
#	internal/tools/cloudsqlpg/vectorassistapplyspec/vectorassistapplyspec_test.go
#	internal/tools/cloudsqlpg/vectorassistdefinespec/vectorassistdefinespec_test.go
#	internal/tools/cloudsqlpg/vectorassistdeletespec/vectorassistdeletespec_test.go
#	internal/tools/cloudsqlpg/vectorassistgeneratequery/vectorassistgeneratequery_test.go
#	internal/tools/cloudsqlpg/vectorassistgetspec/vectorassistgetspec_test.go
#	internal/tools/cloudsqlpg/vectorassistimprovequeryrecall/vectorassistimprovequeryrecall_test.go
#	internal/tools/cloudsqlpg/vectorassistlistspecs/vectorassistlistspecs_test.go
#	internal/tools/cloudsqlpg/vectorassistmodifyspec/vectorassistmodifyspec_test.go
#	internal/tools/cloudstorage/cloudstoragecopyobject/cloudstoragecopyobject_test.go
#	internal/tools/cloudstorage/cloudstoragecreatebucket/cloudstoragecreatebucket_test.go
#	internal/tools/cloudstorage/cloudstoragedeletebucket/cloudstoragedeletebucket_test.go
#	internal/tools/cloudstorage/cloudstoragedeleteobject/cloudstoragedeleteobject_test.go
#	internal/tools/cloudstorage/cloudstoragedownloadobject/cloudstoragedownloadobject_test.go
#	internal/tools/cloudstorage/cloudstoragegetbucketiampolicy/cloudstoragegetbucketiampolicy_test.go
#	internal/tools/cloudstorage/cloudstoragegetbucketmetadata/cloudstoragegetbucketmetadata_test.go
#	internal/tools/cloudstorage/cloudstoragegetobjectmetadata/cloudstoragegetobjectmetadata_test.go
#	internal/tools/cloudstorage/cloudstoragelistbuckets/cloudstoragelistbuckets_test.go
#	internal/tools/cloudstorage/cloudstoragelistobjects/cloudstoragelistobjects_test.go
#	internal/tools/cloudstorage/cloudstoragemoveobject/cloudstoragemoveobject_test.go
#	internal/tools/cloudstorage/cloudstoragereadobject/cloudstoragereadobject_test.go
#	internal/tools/cloudstorage/cloudstorageuploadobject/cloudstorageuploadobject_test.go
#	internal/tools/cloudstorage/cloudstoragewriteobject/cloudstoragewriteobject_test.go
#	internal/tools/cockroachdb/cockroachdbexecutesql/cockroachdbexecutesql_test.go
#	internal/tools/cockroachdb/cockroachdblistschemas/cockroachdblistschemas_test.go
#	internal/tools/cockroachdb/cockroachdblisttables/cockroachdblisttables_test.go
#	internal/tools/cockroachdb/cockroachdbsql/cockroachdbsql_test.go
#	internal/tools/conversationalanalytics/conversationalanalyticsaskdataagent/conversationalanalyticsaskdataagent_test.go
#	internal/tools/conversationalanalytics/conversationalanalyticsgetdataagentinfo/conversationalanalyticsgetdataagentinfo_test.go
#	internal/tools/conversationalanalytics/conversationalanalyticslistaccessibledataagents/conversationalanalyticslistaccessibledataagents_test.go
#	internal/tools/couchbase/couchbase_test.go
#	internal/tools/dataform/dataformcompilelocal/dataformcompilelocal_test.go
#	internal/tools/datalineage/datalineagesearchlineage/datalineagesearchlineage_test.go
#	internal/tools/dataplex/dataplexcheckdataquality/dataplexcheckdataquality_test.go
#	internal/tools/dataplex/dataplexcreatedataproduct/dataplexcreatedataproduct_test.go
#	internal/tools/dataplex/dataplexgeneratedatainsights/dataplexgeneratedatainsights_test.go
#	internal/tools/dataplex/dataplexgeneratedataprofile/dataplexgeneratedataprofile_test.go
#	internal/tools/dataplex/dataplexgetdataasset/dataplexgetdataasset_test.go
#	internal/tools/dataplex/dataplexgetdatainsights/dataplexgetdatainsights_test.go
#	internal/tools/dataplex/dataplexgetdataproduct/dataplexgetdataproduct_test.go
#	internal/tools/dataplex/dataplexgetdataprofile/dataplexgetdataprofile_test.go
#	internal/tools/dataplex/dataplexgetdataqualityresults/dataplexgetdataqualityresults_test.go
#	internal/tools/dataplex/dataplexgetdiscoveryresults/dataplexgetdiscoveryresults_test.go
#	internal/tools/dataplex/dataplexgetoperation/dataplexgetoperation_test.go
#	internal/tools/dataplex/dataplexgetrunstatus/dataplexgetrunstatus_test.go
#	internal/tools/dataplex/dataplexlistdataassets/dataplexlistdataassets_test.go
#	internal/tools/dataplex/dataplexlistdataproducts/dataplexlistdataproducts_test.go
#	internal/tools/dataplex/dataplexlookupcontext/dataplexlookupcontext_test.go
#	internal/tools/dataplex/dataplexlookupentry/dataplexlookupentry_test.go
#	internal/tools/dataplex/dataplexsearchaspecttypes/dataplexsearchaspecttypes_test.go
#	internal/tools/dataplex/dataplexsearchdqscans/dataplexsearchdqscans_test.go
#	internal/tools/dataplex/dataplexsearchentries/dataplexsearchentries_test.go
#	internal/tools/dataproc/dataprocgetcluster/dataprocgetcluster_test.go
#	internal/tools/dataproc/dataprocgetjob/dataprocgetjob_test.go
#	internal/tools/dataproc/dataproclistclusters/dataproclistclusters_test.go
#	internal/tools/dataproc/dataproclistjobs/dataproclistjobs_test.go
#	internal/tools/dgraph/dgraph_test.go
#	internal/tools/elasticsearch/elasticsearchesql/elasticsearchesql_test.go
#	internal/tools/elasticsearch/elasticsearchexecuteesql/elasticsearchexecuteesql_test.go
#	internal/tools/firebird/firebirdexecutesql/firebirdexecutesql_test.go
#	internal/tools/firebird/firebirdsql/firebirdsql_test.go
#	internal/tools/firestore/firestoreadddocuments/firestoreadddocuments_test.go
#	internal/tools/firestore/firestoredeletedocuments/firestoredeletedocuments_test.go
#	internal/tools/firestore/firestoregetdocuments/firestoregetdocuments_test.go
#	internal/tools/firestore/firestoregetrules/firestoregetrules_test.go
#	internal/tools/firestore/firestorelistcollections/firestorelistcollections_test.go
#	internal/tools/firestore/firestorequery/firestorequery_test.go
#	internal/tools/firestore/firestorequerycollection/firestorequerycollection_test.go
#	internal/tools/firestore/firestoreupdatedocument/firestoreupdatedocument_test.go
#	internal/tools/firestore/firestorevalidaterules/firestorevalidaterules_test.go
#	internal/tools/http/http_test.go
#	internal/tools/looker/lookeradddashboardelement/lookeradddashboardelement_test.go
#	internal/tools/looker/lookeradddashboardfilter/lookeradddashboardfilter_test.go
#	internal/tools/looker/lookerconversationalanalytics/lookerconversationalanalytics_test.go
#	internal/tools/looker/lookercreateagent/lookercreateagent_test.go
#	internal/tools/looker/lookercreategitbranch/lookercreategitbranch_test.go
#	internal/tools/looker/lookercreateprojectdirectory/lookercreateprojectdirectory_test.go
#	internal/tools/looker/lookercreateprojectfile/lookercreateprojectfile_test.go
#	internal/tools/looker/lookercreateviewfromtable/lookercreateviewfromtable_test.go
#	internal/tools/looker/lookerdeleteagent/lookerdeleteagent_test.go
#	internal/tools/looker/lookerdeletegitbranch/lookerdeletegitbranch_test.go
#	internal/tools/looker/lookerdeleteprojectdirectory/lookerdeleteprojectdirectory_test.go
#	internal/tools/looker/lookerdeleteprojectfile/lookerdeleteprojectfile_test.go
#	internal/tools/looker/lookerdevmode/lookerdevmode_test.go
#	internal/tools/looker/lookergenerateembedurl/lookergenerateembedurl_test.go
#	internal/tools/looker/lookergetagent/lookergetagent_test.go
#	internal/tools/looker/lookergetconnectiondatabases/lookergetconnectiondatabases_test.go
#	internal/tools/looker/lookergetconnections/lookergetconnections_test.go
#	internal/tools/looker/lookergetconnectionschemas/lookergetconnectionschemas_test.go
#	internal/tools/looker/lookergetconnectiontablecolumns/lookergetconnectiontablecolumns_test.go
#	internal/tools/looker/lookergetconnectiontables/lookergetconnectiontables_test.go
#	internal/tools/looker/lookergetdashboards/lookergetdashboards_test.go
#	internal/tools/looker/lookergetdimensions/lookergetdimensions_test.go
#	internal/tools/looker/lookergetexplores/lookergetexplores_test.go
#	internal/tools/looker/lookergetfilters/lookergetfilters_test.go
#	internal/tools/looker/lookergetgitbranch/lookergetgitbranch_test.go
#	internal/tools/looker/lookergetlookmltests/lookergetlookmltests_test.go
#	internal/tools/looker/lookergetlooks/lookergetlooks_test.go
#	internal/tools/looker/lookergetmeasures/lookergetmeasures_test.go
#	internal/tools/looker/lookergetmodels/lookergetmodels_test.go
#	internal/tools/looker/lookergetparameters/lookergetparameters_test.go
#	internal/tools/looker/lookergetprojectdirectories/lookergetprojectdirectories_test.go
#	internal/tools/looker/lookergetprojectfile/lookergetprojectfile_test.go
#	internal/tools/looker/lookergetprojectfiles/lookergetprojectfiles_test.go
#	internal/tools/looker/lookergetprojects/lookergetprojects_test.go
#	internal/tools/looker/lookerhealthanalyze/lookerhealthanalyze_test.go
#	internal/tools/looker/lookerhealthpulse/lookerhealthpulse_test.go
#	internal/tools/looker/lookerhealthvacuum/lookerhealthvacuum_test.go
#	internal/tools/looker/lookerlistagents/lookerlistagents_test.go
#	internal/tools/looker/lookerlistgitbranches/lookerlistgitbranches_test.go
#	internal/tools/looker/lookermakedashboard/lookermakedashboard_test.go
#	internal/tools/looker/lookermakelook/lookermakelook_test.go
#	internal/tools/looker/lookerquery/lookerquery_test.go
#	internal/tools/looker/lookerquerysql/lookerquerysql_test.go
#	internal/tools/looker/lookerqueryurl/lookerqueryurl_test.go
#	internal/tools/looker/lookerrundashboard/lookerrundashboard_test.go
#	internal/tools/looker/lookerrunlook/lookerrunlook_test.go
#	internal/tools/looker/lookerrunlookmltests/lookerrunlookmltests_test.go
#	internal/tools/looker/lookerswitchgitbranch/lookerswitchgitbranch_test.go
#	internal/tools/looker/lookerupdateagent/lookerupdateagent_test.go
#	internal/tools/looker/lookerupdateprojectfile/lookerupdateprojectfile_test.go
#	internal/tools/looker/lookervalidateproject/lookervalidateproject_test.go
#	internal/tools/mindsdb/mindsdbexecutesql/mindsdbexecutesql_test.go
#	internal/tools/mindsdb/mindsdbsql/mindsdbsql_test.go
#	internal/tools/mongodb/mongodbaggregate/mongodbaggregate_test.go
#	internal/tools/mongodb/mongodbdeletemany/mongodbdeletemany_test.go
#	internal/tools/mongodb/mongodbdeleteone/mongodbdeleteone_test.go
#	internal/tools/mongodb/mongodbfind/mongodbfind_test.go
#	internal/tools/mongodb/mongodbfindone/mongodbfindone_test.go
#	internal/tools/mongodb/mongodbinsertmany/mongodbinsertmany_test.go
#	internal/tools/mongodb/mongodbinsertone/mongodbinsertone_test.go
#	internal/tools/mongodb/mongodbupdatemany/mongodbupdatemany_test.go
#	internal/tools/mongodb/mongodbupdateone/mongodbupdateone_test.go
#	internal/tools/mssql/mssqlexecutesql/mssqlexecutesql_test.go
#	internal/tools/mssql/mssqllisttables/mssqllisttables_test.go
#	internal/tools/mssql/mssqlsql/mssqlsql_test.go
#	internal/tools/mysql/mysqlexecutesql/mysqlexecutesql_test.go
#	internal/tools/mysql/mysqlgetqueryplan/mysqlgetqueryplan_test.go
#	internal/tools/mysql/mysqllistactivequeries/mysqllistactivequeries_test.go
#	internal/tools/mysql/mysqllistalllocks/mysqllistalllocks_test.go
#	internal/tools/mysql/mysqllisttablefragmentation/mysqllisttablefragmentation_test.go
#	internal/tools/mysql/mysqllisttables/mysqllisttables_test.go
#	internal/tools/mysql/mysqllisttablesmissinguniqueindexes/mysqllisttablesmissinguniqueindexes_test.go
#	internal/tools/mysql/mysqllisttablestats/mysqllisttablestats_test.go
#	internal/tools/mysql/mysqlshowquerystats/mysqlshowquerystats_test.go
#	internal/tools/mysql/mysqlsql/mysqlsql_test.go
#	internal/tools/neo4j/neo4jcypher/neo4jcypher_test.go
#	internal/tools/neo4j/neo4jexecutecypher/neo4jexecutecypher_test.go
#	internal/tools/neo4j/neo4jschema/neo4jschema_test.go
#	internal/tools/oceanbase/oceanbaseexecutesql/oceanbaseexecutesql_test.go
#	internal/tools/oceanbase/oceanbasesql/oceanbasesql_test.go
#	internal/tools/oracle/oracleexecutesql/oracleexecutesql_test.go
#	internal/tools/oracle/oraclesql/oraclesql_test.go
#	internal/tools/postgres/postgresdatabaseoverview/postgresdatabaseoverview_test.go
#	internal/tools/postgres/postgresexecutesql/postgresexecutesql_test.go
#	internal/tools/postgres/postgresgetcolumncardinality/postgresgetcolumncardinality_test.go
#	internal/tools/postgres/postgreslistactivequeries/postgreslistactivequeries_test.go
#	internal/tools/postgres/postgreslistavailableextensions/postgreslistavailableextensions_test.go
#	internal/tools/postgres/postgreslistdatabasestats/postgreslistdatabasestats_test.go
#	internal/tools/postgres/postgreslistindexes/postgreslistindexes_test.go
#	internal/tools/postgres/postgreslistinstalledextensions/postgreslistinstalledextensions_test.go
#	internal/tools/postgres/postgreslistlocks/postgreslistlocks_test.go
#	internal/tools/postgres/postgreslistpgsettings/postgreslistpgsettings_test.go
#	internal/tools/postgres/postgreslistpublicationtables/postgreslistpublicationtables_test.go
#	internal/tools/postgres/postgreslistquerystats/postgreslistquerystats_test.go
#	internal/tools/postgres/postgreslistroles/postgreslistroles_test.go
#	internal/tools/postgres/postgreslistschemas/postgreslistschemas_test.go
#	internal/tools/postgres/postgreslistsequences/postgreslistsequences_test.go
#	internal/tools/postgres/postgresliststoredprocedure/postgresliststoredprocedure_test.go
#	internal/tools/postgres/postgreslisttables/postgreslisttables_test.go
#	internal/tools/postgres/postgreslisttablespaces/postgreslisttablespaces_test.go
#	internal/tools/postgres/postgreslisttablestats/postgreslisttablestats_test.go
#	internal/tools/postgres/postgreslisttriggers/postgreslisttriggers_test.go
#	internal/tools/postgres/postgreslistviews/postgreslistviews_test.go
#	internal/tools/postgres/postgreslongrunningtransactions/postgreslongrunningtransactions_test.go
#	internal/tools/postgres/postgresreplicationstats/postgresreplicationstats_test.go
#	internal/tools/postgres/postgressql/postgressql_test.go
#	internal/tools/redis/redis_test.go
#	internal/tools/scylladb/scyllacql/scyllacql_test.go
#	internal/tools/serverlessspark/serverlesssparkcancelbatch/serverlesssparkcancelbatch_test.go
#	internal/tools/serverlessspark/serverlesssparkgetbatch/serverlesssparkgetbatch_test.go
#	internal/tools/serverlessspark/serverlesssparkgetsession/serverlesssparkgetsession_test.go
#	internal/tools/serverlessspark/serverlesssparkgetsessiontemplate/serverlesssparkgetsessiontemplate_test.go
#	internal/tools/serverlessspark/serverlesssparklistbatches/serverlesssparklistbatches_test.go
#	internal/tools/serverlessspark/serverlesssparklistsessions/serverlesssparklistsessions_test.go
#	internal/tools/serverlessspark/testutils/testutils.go
#	internal/tools/singlestore/singlestoreexecutesql/singlestoreexecutesql_test.go
#	internal/tools/singlestore/singlestoresql/singlestoresql_test.go
#	internal/tools/snowflake/snowflakeexecutesql/snowflakeexecutesql_test.go
#	internal/tools/snowflake/snowflakesql/snowflakesql_test.go
#	internal/tools/spanner/spannerexecutesql/spannerexecutesql_test.go
#	internal/tools/spanner/spannerlistgraphs/spannerlistgraphs_test.go
#	internal/tools/spanner/spannerlisttables/spannerlisttables_test.go
#	internal/tools/spanner/spannersearchcatalog/spannersearchcatalog_test.go
#	internal/tools/spanner/spannersql/spanner_test.go
#	internal/tools/sqlite/sqliteexecutesql/sqliteexecutesql_test.go
#	internal/tools/sqlite/sqlitesql/sqlitesql_test.go
#	internal/tools/tidb/tidbexecutesql/tidbexecutesql_test.go
#	internal/tools/tidb/tidbsql/tidbsql_test.go
#	internal/tools/trino/trinoexecutesql/trinoexecutesql_test.go
#	internal/tools/trino/trinosql/trinosql_test.go
#	internal/tools/utility/wait/wait_test.go
#	internal/tools/valkey/valkey_test.go
#	internal/tools/yugabytedbsql/yugabytedbsql_test.go
#	tests/common.go
Move the operation-duration metric population above the existence check in
groups/get and prompts/get so failed lookups are still classified with
gen_ai.operation.name and gen_ai.{group,prompt}.name.
@twishabansal
twishabansal merged commit 01cc72c into feat/groups Jul 21, 2026
14 of 16 checks passed
@twishabansal
twishabansal deleted the feat/groups-pr4-telemetry branch July 21, 2026 06:25
@github-actions

Copy link
Copy Markdown
Contributor

🧨 Preview deployments removed.

Cloudflare Pages environments for pr-3613 have been deleted.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

do not merge Indicates a pull request not ready for merge, due to either quality or timing.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants