feat(server): add telemetry spans and metrics to groups/get - #3613
Merged
Conversation
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.
…ring # Conflicts: # internal/group/group.go
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.
Contributor
There was a problem hiding this comment.
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.
…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.
Yuan325
approved these changes
Jul 21, 2026
Contributor
|
🧨 Preview deployments removed. Cloudflare Pages environments for |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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/getinstrumentation forgroups/getacross all five MCP version packages (v20241105,v20250326,v20250618,v20251125,vdraft)