| S |
High |
FaaS |
http.request (Firebase Functions) |
function.gcp |
http.request missing |
The wrapper instruments all Firebase function trigger types, not only HTTP. A fixed http.request op is semantically wrong. |
faas.trigger already exists; keep faas.provider=firebase |
packages/node/src/integrations/tracing/firebase/otel/patches/functions.ts |
| S |
High |
HTTP |
http.client.${serviceIdentifier} |
http.client |
Dynamic suffix missing |
Service identity belongs in attributes; endpoint-derived suffixes fragment grouping and can be high-cardinality. |
rpc.service or server.address / cloud.service.name |
packages/google-cloud-serverless/src/integrations/google-cloud-http.ts |
| S |
High |
HTTP |
http.client.prefetch / http.server.prefetch |
http.client / http.server |
Missing; base ops exist |
OTel inference fabricates unregistered suffixes. Preserve direction and move prefetch to data. |
sentry.http.prefetch=true |
packages/opentelemetry/src/utils/parseSpanDescription.ts |
| S |
High |
Messaging |
faas.queue plus sentry.op=queue.process on one span |
queue.process only |
queue.process exact; faas.queue missing |
Cloudflare passes conflicting values. The sentry.op attribute wins, so faas.queue is effectively dead and should be removed. |
— |
packages/cloudflare/src/instrumentations/worker/instrumentQueue.ts |
| S |
High |
RPC |
grpc.${serviceIdentifier} |
grpc |
Dynamic suffix missing |
Service identity can be high-cardinality and already has standard RPC attributes. |
rpc.service; rpc.method |
packages/google-cloud-serverless/src/integrations/google-cloud-grpc.ts |
| S |
High |
UI |
ui.angular.init / ui.angular.${methodKey} |
ui.mount for init; function for TraceMethod |
Parent ui.angular exists |
The method-key suffix is user-controlled and unbounded. Component initialization is a mount; arbitrary decorated methods are functions. |
ui.framework=angular; code.function.name |
packages/angular/src/tracing.ts |
| S |
High |
UI |
ui.ember.route.before_model|model|after_model|setup_controller |
function |
Missing |
These are route-hook functions. The hook name is already available and should not be encoded in sentry.op. |
code.function.name; ember.route.hook |
packages/ember/addon/index.ts |
| S |
High |
UI |
ui.ember.runloop.${queue} |
ui.task |
Missing; ui.task exists |
Queue values are phase details and Ember can be configured with custom queues. |
ui.framework=ember; ember.runloop.queue |
packages/ember/addon/utils/instrumentEmberGlobals.ts |
| S |
Medium |
Browser |
paint |
browser.paint |
browser.paint exists |
Rename the raw paint operation to the registered browser-specific operation. |
Keep the PerformanceEntry name in the span name |
packages/browser-utils/src/metrics/browserMetrics.ts |
| S |
Medium |
FaaS |
function.aws.lambda |
function.aws |
function.aws exists |
Lambda is already implied by provider/runtime attributes; use the registered provider-level operation. |
faas.name; cloud.provider=aws; cloud.platform=aws_lambda |
packages/aws-serverless/src/requestSpanOptions.ts |
| S |
Medium |
HTTP |
http.client.stream |
http.client |
Missing; parent exists |
Streaming changes response behavior but not the HTTP operation category. |
http.response.body.streaming=true |
packages/browser/src/integrations/fetchStreamPerformance.ts |
| S |
Medium |
UI |
ui.ember.component.render / component.definition / init |
ui.render / function / ui.mount |
Only parent ui.ember exists |
Map render and initialization to cross-framework lifecycle ops. Component definition lookup is generic function work. |
ui.framework=ember; ui.component_name; code.function.name |
packages/ember/addon/utils/instrumentEmberGlobals.ts |
| M |
High |
Cache |
cache.has_item|get_item|get_item_raw|get_items|get_keys|set_item|set_item_raw|set_items|remove_item|clear |
cache.get / cache.put / cache.remove |
Only target ops exist |
This is the exact over-granularity the cache conventions avoid. Map has/get/list to get; set variants to put; remove/clear to remove. |
db.operation.name already preserves the unstorage method |
packages/nuxt/src/runtime/utils/instrumentStorage.ts
packages/nitro/src/runtime/hooks/captureStorageEvents.ts |
| M |
High |
Database |
db.redis / db.redis.connect |
db.query for commands; db for connect |
Missing; db and db.query exist |
The datastore belongs in db.system.name. Library/system-specific op leaves are redundant. |
db.system.name=redis; db.operation.name |
packages/server-utils/src/redis/redis-dc-subscriber.ts
packages/server-utils/src/integrations/tracing-channel/redis.ts |
| M |
High |
FaaS |
faas.cron / faas.email / function.step.do |
function |
Missing |
Cloudflare trigger/workflow phase belongs in attributes. Do not add a new op per trigger. |
faas.trigger=timer|email; code.function.name; workflow.step.name |
packages/cloudflare/src/instrumentations/worker/instrumentScheduled.ts
packages/cloudflare/src/instrumentations/worker/instrumentEmail.ts
packages/cloudflare/src/workflows.ts |
| M |
High |
FaaS |
faas.trigger.toString() inferred as op |
Infer function.<provider>, http.server, or queue.process from semantic evidence |
Arbitrary values |
OTel inference currently promotes an attribute value directly into sentry.op. Custom trigger strings can create unbounded ops. |
Retain faas.trigger as data; never use it verbatim as op |
packages/opentelemetry/src/utils/parseSpanDescription.ts |
| M |
High |
Gen AI |
rpc on AWS Bedrock inference spans |
chat or generate_content |
rpc exists but is semantically wrong here |
Bedrock adds GenAI attributes but inherits the generic AWS SDK rpc op. Select the GenAI operation from the Bedrock request type. |
— |
packages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts
packages/server-utils/src/integrations/tracing-channel/aws-sdk/services/bedrock-runtime.ts |
| M |
High |
Middleware |
app_creation.nestjs / request_context.nestjs / event.nestjs / plugin.hapi |
function |
Missing |
These represent executable functions or setup work. Keep lifecycle/event/plugin identity in attributes. |
code.function.name; nestjs.type; hapi.type; event.name |
packages/nestjs/src/integrations/wrap-route.ts
packages/nestjs/src/integrations/helpers.ts
packages/node/src/integrations/tracing/hapi/vendored/instrumentation.ts
packages/server-utils/src/integrations/tracing-channel/hapi-utils.ts |
| M |
High |
RPC |
rpc.server / mcp.server / mcp.notification.client_to_server|server_to_client |
rpc |
Only rpc exists |
MCP is JSON-RPC and tRPC is RPC. Direction, method, notification kind, and protocol belong in attributes rather than op suffixes. |
rpc.system=mcp|trpc; rpc.method; jsonrpc.*; messaging direction |
packages/core/src/trpc.ts
packages/core/src/integrations/mcp-server/spans.ts
packages/core/src/integrations/mcp-server/attributes.ts |
| M |
Medium |
FaaS |
function.gcp.http / event / cloud_event |
function.gcp |
function.gcp exists |
Trigger type belongs in faas.trigger. The existing suffixes split one provider category. |
faas.trigger |
packages/google-cloud-serverless/src/gcpfunction/http.ts
packages/google-cloud-serverless/src/gcpfunction/events.ts
packages/google-cloud-serverless/src/gcpfunction/cloud_events.ts |
| M |
Medium |
Gaps |
No op on Cloudflare rate-limit and Durable Object WebSocket handler spans |
rpc for rate-limit binding calls; websocket for WebSocket handlers |
Both target categories exist |
These wrappers create spans but only set sentry.origin. Rate-limit binding calls are RPC-like; Durable Object message/close/error callbacks are explicitly WebSocket work. |
rpc.service=cloudflare.rate_limit; websocket event type |
packages/cloudflare/src/instrumentations/worker/instrumentRateLimit.ts
packages/cloudflare/src/durableobject.ts |
| M |
Medium |
Gaps |
No op on DataLoader prime / clear / clearAll |
cache.put for prime; cache.remove for clear and clearAll |
Target cache ops exist |
These spans are created, but getSpanOp deliberately returns undefined. Classifying the write/removal paths completes the same cache taxonomy already used for DataLoader reads. |
cache.key where available; db.operation.name |
packages/node/src/integrations/tracing/dataloader/vendored/instrumentation.ts
packages/server-utils/src/integrations/tracing-channel/dataloader.ts |
| M |
Medium |
Gaps |
No op on some GraphQL, generic-pool, and Effect spans |
graphql where applicable; function or no op only by deliberate policy |
Instrumentation gap |
Vendored GraphQL parse/validate/execute/resolver spans can remain undefined because OTel inference has no matching attributes. Generic pool and Effect similarly set origin without a category. This is separate from cleanup but creates inconsistent grouping. |
— |
packages/node/src/integrations/tracing/graphql/vendored/instrumentation.ts
packages/node/src/integrations/tracing/graphql/vendored/utils.ts
packages/node/src/integrations/tracing/genericPool/vendored/instrumentation.ts
packages/effect/src/tracer.ts |
| L |
High |
Gen AI |
gen_ai.create_agent / gen_ai.models / gen_ai.unknown / ai.run |
function for create/models/unknown fallback; map ai.run to a known AI op when evidence exists |
Missing |
Agent compilation and model metadata calls are not inference operations. Unknown strings should not become conventions. Vercel AI's fallback should use an explicit mapping or a generic function op. |
gen_ai.operation.name; code.function.name; retain provider SDK method |
packages/core/src/tracing/langgraph/index.ts
packages/core/src/tracing/anthropic-ai/index.ts
packages/core/src/tracing/openai/index.ts
packages/core/src/tracing/vercel-ai/index.ts |
| L |
High |
Messaging |
message / message.produce / message.consume |
queue.publish / queue.receive / queue.process |
message* missing; queue.* exists |
Kafka, AMQP, and Deno use a parallel non-convention taxonomy. Use messaging.operation.type to distinguish publish, receive, and process. Deno must not infer all ops from SpanKind alone. |
messaging.system; messaging.operation.type |
packages/server-utils/src/integrations/tracing-channel/kafkajs/spans.ts
packages/server-utils/src/integrations/tracing-channel/amqplib.ts
packages/opentelemetry/src/utils/parseSpanDescription.ts
packages/deno/src/opentelemetry/tracer.ts |
| L |
High |
Middleware |
request_handler.<library> / handler.nestjs / hono.request |
function; use http.server only for a true inbound/internal HTTP boundary |
Missing |
Terminal framework handlers are functions, not new op categories. Hono app.request() is an in-process HTTP dispatch and should use http.server with HTTP attributes. |
code.function.name; framework handler type; HTTP attributes for Hono dispatch |
packages/core/src/integrations/express/patch-layer.ts
packages/server-utils/src/integrations/tracing-channel/express/instrumentation.ts
packages/node/src/integrations/tracing/connect/vendored/instrumentation.ts
packages/node/src/integrations/tracing/hono/index.ts
packages/node/src/integrations/tracing/fastify/v3/instrumentation.ts
packages/server-utils/src/integrations/tracing-channel/fastify/instrumentation.ts
packages/elysia/src/withElysia.ts
packages/nestjs/src/integrations/wrap-route.ts
packages/hono/src/shared/patchAppRequest.ts |
| L |
High |
Middleware |
router.express / router.koa / router.hapi |
router (conventions addition tracked in the first table) |
router is currently missing |
Backend router layers should share one framework-neutral operation. They are semantically distinct from generic middleware. |
code.namespace or framework; router.name; route attributes |
packages/core/src/integrations/express/patch-layer.ts
packages/server-utils/src/integrations/tracing-channel/express/instrumentation.ts
packages/node/src/integrations/tracing/koa/vendored/instrumentation.ts
packages/server-utils/src/integrations/tracing-channel/koa.ts
packages/node/src/integrations/tracing/hapi/vendored/instrumentation.ts
packages/server-utils/src/integrations/tracing-channel/hapi-utils.ts |
| L |
Medium |
UI |
ui.angular.routing / ui.sveltekit.routing / ui.ember.transition |
router (conventions addition tracked in the first table) |
router must be added to conventions |
All three measure router execution. Collapse framework identity while keeping router work distinct from the broader navigation root. |
ui.framework; navigation.phase |
packages/angular/src/tracing.ts
packages/sveltekit/src/client/svelte4BrowserTracing.ts
packages/sveltekit/src/client/svelte5BrowserTracing.ts
packages/ember/addon/utils/instrumentEmberAppInstanceForPerformance.ts |
| L |
Medium |
UI |
ui.react.* / ui.vue.* / ui.svelte.* lifecycle ops |
ui.mount / ui.render / ui.update / ui.unmount (missing generic leaves tracked in the first table) |
React leaves exist; generic leaves are incomplete |
Preferred cleanup: normalize equivalent lifecycle work across frameworks. Current values include React mount/render/update; Vue render/activate/create/unmount/destroy/mount/update; Svelte init/update. Keeping React-specific leaves while collapsing other frameworks would preserve an arbitrary asymmetry. |
ui.framework; ui.component_name; ui.lifecycle_phase |
packages/react/src/profiler.tsx
packages/vue/src/tracing.ts
packages/svelte/src/performance.ts |
| XL |
High |
Framework functions |
function.<framework>(.<phase>) and loader.remix / action.remix |
function |
function exists; function.nextjs/remix are legacy leaves |
Collapse all framework and phase suffixes. This also resolves Remix's three competing loader/action taxonomies. Includes Next.js, Remix, React Router client/server, SvelteKit client/server, SolidStart, TanStack Start, and Cloudflare workflow steps. |
code.function.name; code.namespace; framework-specific phase/type attributes |
packages/nextjs/src/common/utils/tracingUtils.ts
packages/nextjs/src/common/withServerActionInstrumentation.ts
packages/remix/src/server/instrumentServer.ts
packages/remix/src/server/integrations/tracing-channel.ts
packages/remix/src/server/integrations/opentelemetry.ts
packages/react-router/src/server/createServerInstrumentation.ts
packages/react-router/src/server/wrapServerLoader.ts
packages/react-router/src/server/wrapServerAction.ts
packages/react-router/src/server/instrumentation/reactRouter.ts
packages/react-router/src/server/instrumentation/util.ts
packages/react-router/src/client/createClientInstrumentation.ts
packages/react-router/src/client/hydratedRouter.ts
packages/sveltekit/src/client/load.ts
packages/sveltekit/src/server-common/load.ts
packages/sveltekit/src/server-common/serverRoute.ts
packages/sveltekit/src/server-common/integrations/svelteKitSpans.ts
packages/solidstart/src/server/withServerActionInstrumentation.ts
packages/tanstackstart-react/src/server/wrapFetchWithSentry.ts
packages/cloudflare/src/workflows.ts |
| XL |
High |
Gen AI |
gen_ai.chat / gen_ai.execute_tool / gen_ai.invoke_agent |
chat / execute_tool / invoke_agent |
Registry values are unprefixed |
The SDK and source-of-truth registry disagree. Migrate to the exact convention values, or explicitly change the registry—but do not leave both. Before migration, replace SDK internals which identify AI spans via op.startsWith('gen_ai.') with gen_ai.operation.type/name. |
gen_ai.operation.name and gen_ai.operation.type |
packages/core/src/tracing/langchain/index.ts
packages/core/src/tracing/langgraph/index.ts
packages/core/src/tracing/langgraph/utils.ts
packages/core/src/tracing/openai/index.ts
packages/core/src/tracing/anthropic-ai/index.ts
packages/core/src/tracing/google-genai/index.ts
packages/core/src/tracing/workers-ai/index.ts
packages/core/src/tracing/vercel-ai/index.ts
packages/server-utils/src/integrations/tracing-channel/openai.ts
packages/server-utils/src/integrations/tracing-channel/anthropic.ts
packages/server-utils/src/integrations/tracing-channel/google-genai.ts
packages/server-utils/src/vercel-ai/vercel-ai-dc-subscriber.ts |
| XL |
High |
Middleware |
middleware.<library> / hook.fastify / http.server.middleware |
middleware |
middleware exists |
Collapse framework identity for middleware and request-pipeline hooks. Router layers are handled separately as router. |
code.namespace or framework; middleware.type; middleware.name |
packages/core/src/integrations/express/patch-layer.ts
packages/server-utils/src/integrations/tracing-channel/express/instrumentation.ts
packages/node/src/integrations/tracing/connect/vendored/instrumentation.ts
packages/node/src/integrations/tracing/koa/vendored/instrumentation.ts
packages/server-utils/src/integrations/tracing-channel/koa.ts
packages/node/src/integrations/tracing/hapi/vendored/instrumentation.ts
packages/server-utils/src/integrations/tracing-channel/hapi-utils.ts
packages/node/src/integrations/tracing/fastify/v3/instrumentation.ts
packages/server-utils/src/integrations/tracing-channel/fastify/instrumentation.ts
packages/node/src/integrations/tracing/hono/index.ts
packages/hono/src/shared/wrapMiddlewareSpan.ts
packages/elysia/src/withElysia.ts
packages/nestjs/src/integrations/helpers.ts
packages/nuxt/src/runtime/hooks/wrapMiddlewareHandler.ts
packages/nitro/src/runtime/hooks/captureTracingEvents.ts
packages/tanstackstart-react/src/server/utils.ts
packages/nextjs/src/common/wrapMiddlewareWithSentry.ts
packages/nextjs/src/common/enhanceMiddlewareRootSpan.ts
packages/nextjs/src/server/enhanceHandleRequestRootSpan.ts
packages/nextjs/src/edge/index.ts |
Description
Currently, many of our instrumentations send span ops that are not defined in conventions. This has two reasons:
middleware.expressorfunction.sveltekit). Ops should be a bit more general than that.I (okay, mostly my clanker, followed by a manual review) audited our instrumentations and these are the places we should make changes to:
Add to conventions
routerrouterto conventionsui.framework;navigation.phase;code.namespaceor framework;router.name; route attributespackages/angular/src/tracing.tspackages/sveltekit/src/client/svelte4BrowserTracing.tspackages/sveltekit/src/client/svelte5BrowserTracing.tspackages/ember/addon/utils/instrumentEmberAppInstanceForPerformance.tspackages/core/src/integrations/express/patch-layer.tspackages/server-utils/src/integrations/tracing-channel/express/instrumentation.tspackages/node/src/integrations/tracing/koa/vendored/instrumentation.tspackages/server-utils/src/integrations/tracing-channel/koa.tspackages/node/src/integrations/tracing/hapi/vendored/instrumentation.tspackages/server-utils/src/integrations/tracing-channel/hapi-utils.tsui.interaction.click|hover|drag|pressui.interaction.*and add all four leaves to conventionsui.actionroots. Register click, hover, drag, and press as the finite interaction taxonomy.packages/browser-utils/src/metrics/browserMetrics.tspackages/browser-utils/src/metrics/inp.tspackages/browser-utils/src/metrics/webVitalSpans.tspackages/browser/src/tracing/browserTracingIntegration.tsui.long-task / ui.long-animation-frameui.taskis not equivalentui.taskoperation is not a semantic replacement.browser.performance.entry_type=long-task|long-animation-framepackages/browser-utils/src/metrics/browserMetrics.tsbrowser.${timingPhase}browseris currently registeredbrowser.unloadEvent,redirect,domContentLoadedEvent,loadEvent,connect,TLS/SSL,cache,DNS,request, andresponse. These phases remain useful as distinct operations.browser.performance.phaseas complementary detailpackages/browser-utils/src/metrics/browserMetrics.tsmeasuremeasureand add it to conventionsPerformanceMeasureis a distinct, fixed, useful category.PerformanceEntryname in the span namepackages/browser-utils/src/metrics/browserMetrics.tsresource.${initiatorType}resource.otheras fallbackworker,icon,frame,object,ping, ortrack. Values outside the recognized browser set must still map toresource.other.resource.initiator_typepackages/browser-utils/src/metrics/browserMetrics.tsnavigation.redirectnavigation.redirectand add it to conventionsnavigation.type=redirectpackages/browser/src/tracing/browserTracingIntegration.tsobject.get|head|put|delete|list|upload_part|multipart_upload.abort|create|completeobject.*and add an object-storage category to conventionsobject.read/write/deletebefore registration.packages/cloudflare/src/instrumentations/worker/instrumentR2.tsui.mount / ui.update / ui.unmountui.mount,ui.update, andui.unmountto conventions;ui.renderalready existsui.framework;ui.component_name;ui.lifecycle_phasepackages/react/src/profiler.tsxpackages/vue/src/tracing.tspackages/svelte/src/performance.tsui.webvital.lcp / ui.webvital.clsweb_vital.nameand measurement value remain authoritativepackages/browser-utils/src/metrics/lcp.tspackages/browser-utils/src/metrics/cls.tspackages/browser-utils/src/metrics/webVitalSpans.tsgen_ai.embeddings / gen_ai.generate_content / gen_ai.rerankembeddings / generate_content / rerankgen_ai.operation.nameandgen_ai.operation.typepackages/core/src/tracing/langchain/embeddings.tspackages/core/src/tracing/openai/index.tspackages/core/src/tracing/google-genai/index.tspackages/core/src/tracing/workers-ai/index.tspackages/core/src/tracing/vercel-ai/index.tspackages/server-utils/src/integrations/tracing-channel/openai.tspackages/server-utils/src/integrations/tracing-channel/google-genai.tspackages/server-utils/src/vercel-ai/vercel-ai-dc-subscriber.tsReplace with another op
http.request (Firebase Functions)function.gcphttp.requestmissinghttp.requestop is semantically wrong.faas.triggeralready exists; keepfaas.provider=firebasepackages/node/src/integrations/tracing/firebase/otel/patches/functions.tshttp.client.${serviceIdentifier}http.clientrpc.serviceorserver.address / cloud.service.namepackages/google-cloud-serverless/src/integrations/google-cloud-http.tshttp.client.prefetch / http.server.prefetchhttp.client / http.serversentry.http.prefetch=truepackages/opentelemetry/src/utils/parseSpanDescription.tsfaas.queueplussentry.op=queue.processon one spanqueue.processonlyqueue.processexact;faas.queuemissingsentry.opattribute wins, sofaas.queueis effectively dead and should be removed.packages/cloudflare/src/instrumentations/worker/instrumentQueue.tsgrpc.${serviceIdentifier}grpcrpc.service;rpc.methodpackages/google-cloud-serverless/src/integrations/google-cloud-grpc.tsui.angular.init / ui.angular.${methodKey}ui.mountfor init;functionforTraceMethodui.angularexistsui.framework=angular;code.function.namepackages/angular/src/tracing.tsui.ember.route.before_model|model|after_model|setup_controllerfunctionsentry.op.code.function.name;ember.route.hookpackages/ember/addon/index.tsui.ember.runloop.${queue}ui.taskui.taskexistsui.framework=ember;ember.runloop.queuepackages/ember/addon/utils/instrumentEmberGlobals.tspaintbrowser.paintbrowser.paintexistspaintoperation to the registered browser-specific operation.PerformanceEntryname in the span namepackages/browser-utils/src/metrics/browserMetrics.tsfunction.aws.lambdafunction.awsfunction.awsexistsfaas.name;cloud.provider=aws;cloud.platform=aws_lambdapackages/aws-serverless/src/requestSpanOptions.tshttp.client.streamhttp.clienthttp.response.body.streaming=truepackages/browser/src/integrations/fetchStreamPerformance.tsui.ember.component.render / component.definition / initui.render / function / ui.mountui.emberexistsui.framework=ember;ui.component_name;code.function.namepackages/ember/addon/utils/instrumentEmberGlobals.tscache.has_item|get_item|get_item_raw|get_items|get_keys|set_item|set_item_raw|set_items|remove_item|clearcache.get / cache.put / cache.removedb.operation.namealready preserves the unstorage methodpackages/nuxt/src/runtime/utils/instrumentStorage.tspackages/nitro/src/runtime/hooks/captureStorageEvents.tsdb.redis / db.redis.connectdb.queryfor commands;dbfor connectdbanddb.queryexistdb.system.name. Library/system-specific op leaves are redundant.db.system.name=redis;db.operation.namepackages/server-utils/src/redis/redis-dc-subscriber.tspackages/server-utils/src/integrations/tracing-channel/redis.tsfaas.cron / faas.email / function.step.dofunctionfaas.trigger=timer|email;code.function.name;workflow.step.namepackages/cloudflare/src/instrumentations/worker/instrumentScheduled.tspackages/cloudflare/src/instrumentations/worker/instrumentEmail.tspackages/cloudflare/src/workflows.tsfaas.trigger.toString() inferred as opfunction.<provider>,http.server, orqueue.processfrom semantic evidencesentry.op. Custom trigger strings can create unbounded ops.faas.triggeras data; never use it verbatim as oppackages/opentelemetry/src/utils/parseSpanDescription.tsrpc on AWS Bedrock inference spanschatorgenerate_contentrpcexists but is semantically wrong hererpcop. Select the GenAI operation from the Bedrock request type.packages/server-utils/src/integrations/tracing-channel/aws-sdk/index.tspackages/server-utils/src/integrations/tracing-channel/aws-sdk/services/bedrock-runtime.tsapp_creation.nestjs / request_context.nestjs / event.nestjs / plugin.hapifunctioncode.function.name;nestjs.type;hapi.type;event.namepackages/nestjs/src/integrations/wrap-route.tspackages/nestjs/src/integrations/helpers.tspackages/node/src/integrations/tracing/hapi/vendored/instrumentation.tspackages/server-utils/src/integrations/tracing-channel/hapi-utils.tsrpc.server / mcp.server / mcp.notification.client_to_server|server_to_clientrpcrpcexistsrpc.system=mcp|trpc;rpc.method;jsonrpc.*; messaging directionpackages/core/src/trpc.tspackages/core/src/integrations/mcp-server/spans.tspackages/core/src/integrations/mcp-server/attributes.tsfunction.gcp.http / event / cloud_eventfunction.gcpfunction.gcpexistsfaas.trigger. The existing suffixes split one provider category.faas.triggerpackages/google-cloud-serverless/src/gcpfunction/http.tspackages/google-cloud-serverless/src/gcpfunction/events.tspackages/google-cloud-serverless/src/gcpfunction/cloud_events.tsNo op on Cloudflare rate-limit and Durable Object WebSocket handler spansrpcfor rate-limit binding calls;websocketfor WebSocket handlerssentry.origin. Rate-limit binding calls are RPC-like; Durable Object message/close/error callbacks are explicitly WebSocket work.rpc.service=cloudflare.rate_limit; websocket event typepackages/cloudflare/src/instrumentations/worker/instrumentRateLimit.tspackages/cloudflare/src/durableobject.tsNo op on DataLoader prime / clear / clearAllcache.putfor prime;cache.removefor clear and clearAllgetSpanOpdeliberately returns undefined. Classifying the write/removal paths completes the same cache taxonomy already used for DataLoader reads.cache.keywhere available;db.operation.namepackages/node/src/integrations/tracing/dataloader/vendored/instrumentation.tspackages/server-utils/src/integrations/tracing-channel/dataloader.tsNo op on some GraphQL, generic-pool, and Effect spansgraphqlwhere applicable;functionor no op only by deliberate policypackages/node/src/integrations/tracing/graphql/vendored/instrumentation.tspackages/node/src/integrations/tracing/graphql/vendored/utils.tspackages/node/src/integrations/tracing/genericPool/vendored/instrumentation.tspackages/effect/src/tracer.tsgen_ai.create_agent / gen_ai.models / gen_ai.unknown / ai.runfunctionfor create/models/unknown fallback; mapai.runto a known AI op when evidence existsfunctionop.gen_ai.operation.name;code.function.name; retain provider SDK methodpackages/core/src/tracing/langgraph/index.tspackages/core/src/tracing/anthropic-ai/index.tspackages/core/src/tracing/openai/index.tspackages/core/src/tracing/vercel-ai/index.tsmessage / message.produce / message.consumequeue.publish / queue.receive / queue.processmessage*missing;queue.*existsmessaging.operation.typeto distinguish publish, receive, and process. Deno must not infer all ops fromSpanKindalone.messaging.system;messaging.operation.typepackages/server-utils/src/integrations/tracing-channel/kafkajs/spans.tspackages/server-utils/src/integrations/tracing-channel/amqplib.tspackages/opentelemetry/src/utils/parseSpanDescription.tspackages/deno/src/opentelemetry/tracer.tsrequest_handler.<library> / handler.nestjs / hono.requestfunction; usehttp.serveronly for a true inbound/internal HTTP boundaryapp.request()is an in-process HTTP dispatch and should usehttp.serverwith HTTP attributes.code.function.name; framework handler type; HTTP attributes for Hono dispatchpackages/core/src/integrations/express/patch-layer.tspackages/server-utils/src/integrations/tracing-channel/express/instrumentation.tspackages/node/src/integrations/tracing/connect/vendored/instrumentation.tspackages/node/src/integrations/tracing/hono/index.tspackages/node/src/integrations/tracing/fastify/v3/instrumentation.tspackages/server-utils/src/integrations/tracing-channel/fastify/instrumentation.tspackages/elysia/src/withElysia.tspackages/nestjs/src/integrations/wrap-route.tspackages/hono/src/shared/patchAppRequest.tsrouter.express / router.koa / router.hapirouter(conventions addition tracked in the first table)routeris currently missingcode.namespaceor framework;router.name; route attributespackages/core/src/integrations/express/patch-layer.tspackages/server-utils/src/integrations/tracing-channel/express/instrumentation.tspackages/node/src/integrations/tracing/koa/vendored/instrumentation.tspackages/server-utils/src/integrations/tracing-channel/koa.tspackages/node/src/integrations/tracing/hapi/vendored/instrumentation.tspackages/server-utils/src/integrations/tracing-channel/hapi-utils.tsui.angular.routing / ui.sveltekit.routing / ui.ember.transitionrouter(conventions addition tracked in the first table)routermust be added to conventionsnavigationroot.ui.framework;navigation.phasepackages/angular/src/tracing.tspackages/sveltekit/src/client/svelte4BrowserTracing.tspackages/sveltekit/src/client/svelte5BrowserTracing.tspackages/ember/addon/utils/instrumentEmberAppInstanceForPerformance.tsui.react.* / ui.vue.* / ui.svelte.* lifecycle opsui.mount / ui.render / ui.update / ui.unmount(missing generic leaves tracked in the first table)ui.framework;ui.component_name;ui.lifecycle_phasepackages/react/src/profiler.tsxpackages/vue/src/tracing.tspackages/svelte/src/performance.tsfunction.<framework>(.<phase>) and loader.remix / action.remixfunctionfunctionexists;function.nextjs/remixare legacy leavescode.function.name;code.namespace; framework-specific phase/type attributespackages/nextjs/src/common/utils/tracingUtils.tspackages/nextjs/src/common/withServerActionInstrumentation.tspackages/remix/src/server/instrumentServer.tspackages/remix/src/server/integrations/tracing-channel.tspackages/remix/src/server/integrations/opentelemetry.tspackages/react-router/src/server/createServerInstrumentation.tspackages/react-router/src/server/wrapServerLoader.tspackages/react-router/src/server/wrapServerAction.tspackages/react-router/src/server/instrumentation/reactRouter.tspackages/react-router/src/server/instrumentation/util.tspackages/react-router/src/client/createClientInstrumentation.tspackages/react-router/src/client/hydratedRouter.tspackages/sveltekit/src/client/load.tspackages/sveltekit/src/server-common/load.tspackages/sveltekit/src/server-common/serverRoute.tspackages/sveltekit/src/server-common/integrations/svelteKitSpans.tspackages/solidstart/src/server/withServerActionInstrumentation.tspackages/tanstackstart-react/src/server/wrapFetchWithSentry.tspackages/cloudflare/src/workflows.tsgen_ai.chat / gen_ai.execute_tool / gen_ai.invoke_agentchat / execute_tool / invoke_agentop.startsWith('gen_ai.')withgen_ai.operation.type/name.gen_ai.operation.nameandgen_ai.operation.typepackages/core/src/tracing/langchain/index.tspackages/core/src/tracing/langgraph/index.tspackages/core/src/tracing/langgraph/utils.tspackages/core/src/tracing/openai/index.tspackages/core/src/tracing/anthropic-ai/index.tspackages/core/src/tracing/google-genai/index.tspackages/core/src/tracing/workers-ai/index.tspackages/core/src/tracing/vercel-ai/index.tspackages/server-utils/src/integrations/tracing-channel/openai.tspackages/server-utils/src/integrations/tracing-channel/anthropic.tspackages/server-utils/src/integrations/tracing-channel/google-genai.tspackages/server-utils/src/vercel-ai/vercel-ai-dc-subscriber.tsmiddleware.<library> / hook.fastify / http.server.middlewaremiddlewaremiddlewareexistsrouter.code.namespaceor framework;middleware.type;middleware.namepackages/core/src/integrations/express/patch-layer.tspackages/server-utils/src/integrations/tracing-channel/express/instrumentation.tspackages/node/src/integrations/tracing/connect/vendored/instrumentation.tspackages/node/src/integrations/tracing/koa/vendored/instrumentation.tspackages/server-utils/src/integrations/tracing-channel/koa.tspackages/node/src/integrations/tracing/hapi/vendored/instrumentation.tspackages/server-utils/src/integrations/tracing-channel/hapi-utils.tspackages/node/src/integrations/tracing/fastify/v3/instrumentation.tspackages/server-utils/src/integrations/tracing-channel/fastify/instrumentation.tspackages/node/src/integrations/tracing/hono/index.tspackages/hono/src/shared/wrapMiddlewareSpan.tspackages/elysia/src/withElysia.tspackages/nestjs/src/integrations/helpers.tspackages/nuxt/src/runtime/hooks/wrapMiddlewareHandler.tspackages/nitro/src/runtime/hooks/captureTracingEvents.tspackages/tanstackstart-react/src/server/utils.tspackages/nextjs/src/common/wrapMiddlewareWithSentry.tspackages/nextjs/src/common/enhanceMiddlewareRootSpan.tspackages/nextjs/src/server/enhanceHandleRequestRootSpan.tspackages/nextjs/src/edge/index.ts