diff --git a/bun.lock b/bun.lock index 70f181451..466e5b6d0 100644 --- a/bun.lock +++ b/bun.lock @@ -517,6 +517,14 @@ "vitest": "catalog:", }, }, + "lib/semconv": { + "name": "@maple/semconv", + "devDependencies": { + "@types/node": "catalog:tooling", + "typescript": "catalog:tooling", + "vitest": "catalog:", + }, + }, "lib/unitflow": { "name": "@maple/unitflow", "dependencies": { @@ -1643,6 +1651,8 @@ "@maple/sdk-core": ["@maple/sdk-core@workspace:packages/sdk-core"], + "@maple/semconv": ["@maple/semconv@workspace:lib/semconv"], + "@maple/ui": ["@maple/ui@workspace:packages/ui"], "@maple/unitflow": ["@maple/unitflow@workspace:lib/unitflow"], diff --git a/knip.json b/knip.json index 7a70bb13d..68ac2dc18 100644 --- a/knip.json +++ b/knip.json @@ -92,6 +92,9 @@ "lib/ai-model-catalog": { "entry": ["scripts/**/*.ts"] }, + "lib/semconv": { + "entry": ["scripts/**/*.ts"] + }, "lib/alchemy-portless": { // The dev-sidecar entry alchemy loads by URL, not by import. "entry": ["src/Local.ts"] diff --git a/lib/semconv/package.json b/lib/semconv/package.json new file mode 100644 index 000000000..2a37d3e5f --- /dev/null +++ b/lib/semconv/package.json @@ -0,0 +1,18 @@ +{ + "name": "@maple/semconv", + "private": true, + "type": "module", + "exports": { + ".": "./src/index.ts" + }, + "scripts": { + "registry:sync": "bun scripts/sync-registry.ts", + "test": "vitest run", + "typecheck": "tsc --noEmit" + }, + "devDependencies": { + "@types/node": "catalog:tooling", + "typescript": "catalog:tooling", + "vitest": "catalog:" + } +} diff --git a/lib/semconv/scripts/sync-registry.ts b/lib/semconv/scripts/sync-registry.ts new file mode 100644 index 000000000..292a39c6e --- /dev/null +++ b/lib/semconv/scripts/sync-registry.ts @@ -0,0 +1,119 @@ +// Regenerates `src/generated/registry.ts` from semconv.com, which serves the +// OpenTelemetry semantic-conventions registry and the separate GenAI registry. +// Run with `bun run --cwd lib/semconv registry:sync` after a semconv release. +// +// The snapshot is checked in so builds and CI never touch the network. Keys the +// previous snapshot had and this one lacks are kept as removed: the registry +// drops some keys without a deprecation stub, and a consumer still has to know +// they existed. + +import { readFileSync, writeFileSync } from "node:fs" +import { fileURLToPath } from "node:url" +import { format } from "oxfmt" +import * as previous from "../src/generated/registry.ts" + +const SOURCE = "https://semconv.com/api/attributes.json" +const outputPath = fileURLToPath(new URL("../src/generated/registry.ts", import.meta.url)) + +interface SourceAttribute { + readonly id: string + readonly registry: "semconv" | "genai" + readonly type: string + readonly stability: string + readonly deprecated: { + readonly reason: "renamed" | "obsoleted" | "uncategorized" + readonly renamedTo?: string + readonly note?: string + } | null +} + +interface SourcePayload { + readonly registries?: Record<"semconv" | "genai", { readonly version: string }> + readonly attributes?: ReadonlyArray +} + +// `--from ` reads a saved copy of the same JSON instead of fetching it. +const fromIndex = process.argv.indexOf("--from") +const fromFile = fromIndex === -1 ? undefined : process.argv[fromIndex + 1] +const loadText = async (): Promise => { + if (fromFile) return readFileSync(fromFile, "utf8") + const response = await fetch(SOURCE) + if (!response.ok) throw new Error(`${SOURCE} answered ${response.status}`) + return response.text() +} +// SAFETY: every field of SourcePayload is optional, and the ones read are checked right below. +const payload = JSON.parse(await loadText()) as SourcePayload +const attributes = payload.attributes +const versions = payload.registries +if (!Array.isArray(attributes) || attributes.length === 0 || !versions?.semconv || !versions.genai) { + throw new Error(`${SOURCE} answered without attributes or registry versions`) +} + +/** + * Successors named in a deprecation note. `uncategorized` deprecations often + * carry the replacement only in prose ("Replaced by `gen_ai.provider.name`, + * which has moved ..."), so every backticked registry key in the note counts. + */ +const knownIds = new Set(attributes.map((a) => a.id)) +const successorsOf = (attribute: SourceAttribute): ReadonlyArray => { + const deprecated = attribute.deprecated + if (!deprecated) return [] + if (deprecated.renamedTo) return [deprecated.renamedTo] + const named = [...(deprecated.note ?? "").matchAll(/`([a-z0-9_.]+)`/g)].map((m) => m[1]!) + return [...new Set(named.filter((id) => id !== attribute.id && knownIds.has(id)))] +} + +const rows = [...attributes] + .sort((a, b) => a.id.localeCompare(b.id) || a.registry.localeCompare(b.registry)) + .map((a) => { + const deprecation = a.deprecated ? ([a.deprecated.reason, successorsOf(a)] as const) : null + return [a.id, a.registry, a.stability, a.type, deprecation] as const + }) + +const seen = new Set(rows.map(([id, registry]) => `${registry}:${id}`)) +const removed = new Map() +for (const entry of previous.REMOVED_ATTRIBUTES) { + if (!seen.has(`${entry[1]}:${entry[0]}`)) removed.set(`${entry[1]}:${entry[0]}`, entry) +} +for (const [id, registry] of previous.ATTRIBUTES) { + const key = `${registry}:${id}` + if (!seen.has(key) && !removed.has(key)) { + removed.set(key, [id, registry, previous.REGISTRY_VERSIONS[registry]]) + } +} + +const quote = (value: unknown) => JSON.stringify(value) + +const lines = [ + "// GENERATED by scripts/sync-registry.ts, do not edit.", + `// Source: ${SOURCE}`, + "", + 'import type { GeneratedAttribute, GeneratedRemovedAttribute } from "../types.ts"', + "", + "/** Registry versions this snapshot was taken at. GenAI has no releases, so it is dated. */", + `export const REGISTRY_VERSIONS = ${quote({ semconv: versions.semconv.version, genai: versions.genai.version })} as const`, + "", + "/** `[id, registry, stability, type, deprecation]`, sorted by id then registry. */", + "export const ATTRIBUTES: ReadonlyArray = [", + ...rows.map((row) => `\t${quote(row)},`), + "]", + "", + "/** Keys an earlier snapshot had and the registry since dropped: `[id, registry, lastSeenVersion]`. */", + "export const REMOVED_ATTRIBUTES: ReadonlyArray = [", + ...[...removed.values()].sort((a, b) => a[0].localeCompare(b[0])).map((row) => `\t${quote(row)},`), + "]", + "", +] + +// The repo's `.oxfmtrc.jsonc` settings; `format()` does not read the file. +const formatted = await format(outputPath, lines.join("\n"), { + printWidth: 110, + semi: false, + tabWidth: 4, + useTabs: true, +}) +if (formatted.errors.length > 0) throw new Error(`Failed to format registry: ${formatted.errors[0]?.message}`) +writeFileSync(outputPath, formatted.code) +console.log( + `Wrote ${rows.length} attributes (semconv ${versions.semconv.version}, genai ${versions.genai.version}), ${removed.size} removed, to ${outputPath}`, +) diff --git a/lib/semconv/src/generated/registry.ts b/lib/semconv/src/generated/registry.ts new file mode 100644 index 000000000..a1c8157e9 --- /dev/null +++ b/lib/semconv/src/generated/registry.ts @@ -0,0 +1,1366 @@ +// GENERATED by scripts/sync-registry.ts, do not edit. +// Source: https://semconv.com/api/attributes.json + +import type { GeneratedAttribute, GeneratedRemovedAttribute } from "../types.ts" + +/** Registry versions this snapshot was taken at. GenAI has no releases, so it is dated. */ +export const REGISTRY_VERSIONS = { semconv: "1.44.0", genai: "2026-09-29" } as const + +/** `[id, registry, stability, type, deprecation]`, sorted by id then registry. */ +export const ATTRIBUTES: ReadonlyArray = [ + ["android.app.state", "semconv", "development", "enum", null], + ["android.os.api_level", "semconv", "development", "string", null], + ["android.state", "semconv", "development", "enum", ["renamed", ["android.app.state"]]], + ["app.build_id", "semconv", "development", "string", null], + ["app.crash.id", "semconv", "development", "string", null], + ["app.installation.id", "semconv", "development", "string", null], + ["app.jank.frame_count", "semconv", "development", "int", null], + ["app.jank.period", "semconv", "development", "double", null], + ["app.jank.threshold", "semconv", "development", "double", null], + ["app.screen.coordinate.x", "semconv", "development", "int", null], + ["app.screen.coordinate.y", "semconv", "development", "int", null], + ["app.screen.id", "semconv", "development", "string", null], + ["app.screen.name", "semconv", "development", "string", null], + ["app.widget.id", "semconv", "development", "string", null], + ["app.widget.name", "semconv", "development", "string", null], + ["artifact.attestation.filename", "semconv", "development", "string", null], + ["artifact.attestation.hash", "semconv", "development", "string", null], + ["artifact.attestation.id", "semconv", "development", "string", null], + ["artifact.filename", "semconv", "development", "string", null], + ["artifact.hash", "semconv", "development", "string", null], + ["artifact.purl", "semconv", "development", "string", null], + ["artifact.version", "semconv", "development", "string", null], + ["aspnetcore.authentication.result", "semconv", "development", "enum", null], + ["aspnetcore.authentication.scheme", "semconv", "development", "string", null], + ["aspnetcore.authorization.policy", "semconv", "development", "string", null], + ["aspnetcore.authorization.result", "semconv", "development", "enum", null], + ["aspnetcore.diagnostics.exception.result", "semconv", "stable", "enum", null], + ["aspnetcore.diagnostics.handler.type", "semconv", "stable", "string", null], + ["aspnetcore.identity.error_code", "semconv", "development", "string", null], + ["aspnetcore.identity.password_check_result", "semconv", "development", "enum", null], + ["aspnetcore.identity.result", "semconv", "development", "enum", null], + ["aspnetcore.identity.sign_in.result", "semconv", "development", "enum", null], + ["aspnetcore.identity.sign_in.type", "semconv", "development", "enum", null], + ["aspnetcore.identity.token_purpose", "semconv", "development", "enum", null], + ["aspnetcore.identity.token_verified", "semconv", "development", "enum", null], + ["aspnetcore.identity.user_type", "semconv", "development", "string", null], + ["aspnetcore.identity.user.update_type", "semconv", "development", "enum", null], + ["aspnetcore.memory_pool.owner", "semconv", "development", "string", null], + ["aspnetcore.rate_limiting.policy", "semconv", "stable", "string", null], + ["aspnetcore.rate_limiting.result", "semconv", "stable", "enum", null], + ["aspnetcore.request.is_unhandled", "semconv", "stable", "boolean", null], + ["aspnetcore.routing.is_fallback", "semconv", "stable", "boolean", null], + ["aspnetcore.routing.match_status", "semconv", "stable", "enum", null], + ["aspnetcore.sign_in.is_persistent", "semconv", "development", "boolean", null], + ["aspnetcore.user.is_authenticated", "semconv", "stable", "boolean", null], + ["aws.bedrock.guardrail.id", "genai", "development", "string", null], + ["aws.bedrock.guardrail.id", "semconv", "development", "string", null], + ["aws.bedrock.knowledge_base.id", "genai", "development", "string", null], + ["aws.bedrock.knowledge_base.id", "semconv", "development", "string", null], + ["aws.dynamodb.attribute_definitions", "semconv", "development", "string[]", null], + ["aws.dynamodb.attributes_to_get", "semconv", "development", "string[]", null], + ["aws.dynamodb.consistent_read", "semconv", "development", "boolean", null], + ["aws.dynamodb.consumed_capacity", "semconv", "development", "string[]", null], + ["aws.dynamodb.count", "semconv", "development", "int", null], + ["aws.dynamodb.exclusive_start_table", "semconv", "development", "string", null], + ["aws.dynamodb.global_secondary_index_updates", "semconv", "development", "string[]", null], + ["aws.dynamodb.global_secondary_indexes", "semconv", "development", "string[]", null], + ["aws.dynamodb.index_name", "semconv", "development", "string", null], + ["aws.dynamodb.item_collection_metrics", "semconv", "development", "string", null], + ["aws.dynamodb.limit", "semconv", "development", "int", null], + ["aws.dynamodb.local_secondary_indexes", "semconv", "development", "string[]", null], + ["aws.dynamodb.projection", "semconv", "development", "string", null], + ["aws.dynamodb.provisioned_read_capacity", "semconv", "development", "double", null], + ["aws.dynamodb.provisioned_write_capacity", "semconv", "development", "double", null], + ["aws.dynamodb.scan_forward", "semconv", "development", "boolean", null], + ["aws.dynamodb.scanned_count", "semconv", "development", "int", null], + ["aws.dynamodb.segment", "semconv", "development", "int", null], + ["aws.dynamodb.select", "semconv", "development", "string", null], + ["aws.dynamodb.table_count", "semconv", "development", "int", null], + ["aws.dynamodb.table_names", "semconv", "development", "string[]", null], + ["aws.dynamodb.total_segments", "semconv", "development", "int", null], + ["aws.ecs.cluster.arn", "semconv", "development", "string", null], + ["aws.ecs.container.arn", "semconv", "development", "string", null], + ["aws.ecs.launchtype", "semconv", "development", "enum", null], + ["aws.ecs.task.arn", "semconv", "development", "string", null], + ["aws.ecs.task.family", "semconv", "development", "string", null], + ["aws.ecs.task.id", "semconv", "development", "string", null], + ["aws.ecs.task.revision", "semconv", "development", "string", null], + ["aws.eks.cluster.arn", "semconv", "development", "string", null], + ["aws.extended_request_id", "semconv", "development", "string", null], + ["aws.kinesis.stream_name", "semconv", "development", "string", null], + ["aws.lambda.invoked_arn", "semconv", "development", "string", null], + ["aws.lambda.resource_mapping.id", "semconv", "development", "string", null], + ["aws.log.group.arns", "semconv", "development", "string[]", null], + ["aws.log.group.names", "semconv", "development", "string[]", null], + ["aws.log.stream.arns", "semconv", "development", "string[]", null], + ["aws.log.stream.names", "semconv", "development", "string[]", null], + ["aws.request_id", "semconv", "development", "string", null], + ["aws.s3.bucket", "semconv", "development", "string", null], + ["aws.s3.copy_source", "semconv", "development", "string", null], + ["aws.s3.delete", "semconv", "development", "string", null], + ["aws.s3.key", "semconv", "development", "string", null], + ["aws.s3.part_number", "semconv", "development", "int", null], + ["aws.s3.upload_id", "semconv", "development", "string", null], + ["aws.secretsmanager.secret.arn", "semconv", "development", "string", null], + ["aws.sns.topic.arn", "semconv", "development", "string", null], + ["aws.sqs.queue.url", "semconv", "development", "string", null], + ["aws.step_functions.activity.arn", "semconv", "development", "string", null], + ["aws.step_functions.state_machine.arn", "semconv", "development", "string", null], + ["az.namespace", "semconv", "development", "string", ["renamed", ["azure.resource_provider.namespace"]]], + ["az.service_request_id", "semconv", "development", "string", ["renamed", ["azure.service.request.id"]]], + ["azure.client.id", "semconv", "development", "string", null], + ["azure.cosmosdb.connection.mode", "semconv", "development", "enum", null], + ["azure.cosmosdb.consistency.level", "semconv", "development", "enum", null], + ["azure.cosmosdb.operation.contacted_regions", "semconv", "development", "string[]", null], + ["azure.cosmosdb.operation.request_charge", "semconv", "development", "double", null], + ["azure.cosmosdb.request.body.size", "semconv", "development", "int", null], + ["azure.cosmosdb.response.sub_status_code", "semconv", "development", "int", null], + ["azure.resource_group.name", "semconv", "development", "string", null], + ["azure.resource_provider.namespace", "semconv", "development", "string", null], + ["azure.service.request.id", "semconv", "development", "string", null], + ["browser.brands", "semconv", "development", "string[]", null], + ["browser.document.url.full", "semconv", "development", "string", null], + ["browser.language", "semconv", "development", "string", null], + ["browser.mobile", "semconv", "development", "boolean", null], + ["browser.platform", "semconv", "development", "string", null], + ["browser.web_vital.delta", "semconv", "development", "double", null], + ["browser.web_vital.id", "semconv", "development", "string", null], + ["browser.web_vital.name", "semconv", "development", "enum", null], + ["browser.web_vital.navigation_type", "semconv", "development", "enum", null], + ["browser.web_vital.rating", "semconv", "development", "enum", null], + ["browser.web_vital.value", "semconv", "development", "double", null], + ["cassandra.consistency.level", "semconv", "development", "enum", null], + ["cassandra.coordinator.dc", "semconv", "development", "string", null], + ["cassandra.coordinator.id", "semconv", "development", "string", null], + ["cassandra.page.size", "semconv", "development", "int", null], + ["cassandra.query.idempotent", "semconv", "development", "boolean", null], + ["cassandra.speculative_execution.count", "semconv", "development", "int", null], + ["cicd.pipeline.action.name", "semconv", "release_candidate", "enum", null], + ["cicd.pipeline.name", "semconv", "release_candidate", "string", null], + ["cicd.pipeline.result", "semconv", "release_candidate", "enum", null], + ["cicd.pipeline.run.id", "semconv", "release_candidate", "string", null], + ["cicd.pipeline.run.state", "semconv", "release_candidate", "enum", null], + ["cicd.pipeline.run.url.full", "semconv", "release_candidate", "string", null], + ["cicd.pipeline.task.name", "semconv", "release_candidate", "string", null], + ["cicd.pipeline.task.run.id", "semconv", "release_candidate", "string", null], + ["cicd.pipeline.task.run.result", "semconv", "release_candidate", "enum", null], + ["cicd.pipeline.task.run.url.full", "semconv", "release_candidate", "string", null], + ["cicd.pipeline.task.type", "semconv", "release_candidate", "enum", null], + ["cicd.system.component", "semconv", "release_candidate", "string", null], + ["cicd.worker.id", "semconv", "release_candidate", "string", null], + ["cicd.worker.name", "semconv", "release_candidate", "string", null], + ["cicd.worker.state", "semconv", "release_candidate", "enum", null], + ["cicd.worker.url.full", "semconv", "release_candidate", "string", null], + ["client.address", "semconv", "stable", "string", null], + ["client.port", "semconv", "stable", "int", null], + ["cloud.account.id", "semconv", "development", "string", null], + ["cloud.availability_zone", "semconv", "development", "string", null], + ["cloud.platform", "semconv", "development", "enum", null], + ["cloud.provider", "semconv", "development", "enum", null], + ["cloud.region", "semconv", "development", "string", null], + ["cloud.resource_id", "semconv", "development", "string", null], + ["cloudevents.event_id", "semconv", "development", "string", null], + ["cloudevents.event_source", "semconv", "development", "string", null], + ["cloudevents.event_spec_version", "semconv", "development", "string", null], + ["cloudevents.event_subject", "semconv", "development", "string", null], + ["cloudevents.event_type", "semconv", "development", "string", null], + ["cloudfoundry.app.id", "semconv", "development", "string", null], + ["cloudfoundry.app.instance.id", "semconv", "development", "string", null], + ["cloudfoundry.app.name", "semconv", "development", "string", null], + ["cloudfoundry.org.id", "semconv", "development", "string", null], + ["cloudfoundry.org.name", "semconv", "development", "string", null], + ["cloudfoundry.process.id", "semconv", "development", "string", null], + ["cloudfoundry.process.type", "semconv", "development", "string", null], + ["cloudfoundry.space.id", "semconv", "development", "string", null], + ["cloudfoundry.space.name", "semconv", "development", "string", null], + ["cloudfoundry.system.id", "semconv", "development", "string", null], + ["cloudfoundry.system.instance.id", "semconv", "development", "string", null], + ["code.column", "semconv", "development", "int", ["renamed", ["code.column.number"]]], + ["code.column.number", "semconv", "stable", "int", null], + ["code.file.path", "semconv", "stable", "string", null], + ["code.filepath", "semconv", "development", "string", ["renamed", ["code.file.path"]]], + ["code.function", "semconv", "development", "string", ["uncategorized", ["code.function.name"]]], + ["code.function.name", "semconv", "stable", "string", null], + ["code.line.number", "semconv", "stable", "int", null], + ["code.lineno", "semconv", "development", "int", ["renamed", ["code.line.number"]]], + ["code.namespace", "semconv", "development", "string", ["uncategorized", ["code.function.name"]]], + ["code.stacktrace", "semconv", "stable", "string", null], + ["container.command", "semconv", "development", "string", null], + ["container.command_args", "semconv", "development", "string[]", null], + ["container.command_line", "semconv", "development", "string", null], + ["container.cpu.state", "semconv", "development", "enum", ["renamed", ["cpu.mode"]]], + ["container.csi.plugin.name", "semconv", "development", "string", null], + ["container.csi.volume.id", "semconv", "development", "string", null], + ["container.id", "semconv", "stable", "string", null], + ["container.image.id", "semconv", "development", "string", null], + ["container.image.name", "semconv", "stable", "string", null], + ["container.image.repo_digests", "semconv", "stable", "string[]", null], + ["container.image.tags", "semconv", "stable", "string[]", null], + ["container.label", "semconv", "development", "template[string]", null], + ["container.labels", "semconv", "development", "template[string]", ["renamed", ["container.label"]]], + ["container.name", "semconv", "development", "string", null], + ["container.runtime", "semconv", "development", "string", ["renamed", ["container.runtime.name"]]], + ["container.runtime.description", "semconv", "development", "string", null], + ["container.runtime.name", "semconv", "development", "string", null], + ["container.runtime.version", "semconv", "development", "string", null], + ["cpu.logical_number", "semconv", "development", "int", null], + ["cpu.mode", "semconv", "release_candidate", "enum", null], + ["cpython.gc.generation", "semconv", "development", "enum", null], + [ + "db.cassandra.consistency_level", + "semconv", + "development", + "enum", + ["renamed", ["cassandra.consistency.level"]], + ], + [ + "db.cassandra.coordinator.dc", + "semconv", + "development", + "string", + ["renamed", ["cassandra.coordinator.dc"]], + ], + [ + "db.cassandra.coordinator.id", + "semconv", + "development", + "string", + ["renamed", ["cassandra.coordinator.id"]], + ], + [ + "db.cassandra.idempotence", + "semconv", + "development", + "boolean", + ["renamed", ["cassandra.query.idempotent"]], + ], + ["db.cassandra.page_size", "semconv", "development", "int", ["renamed", ["cassandra.page.size"]]], + [ + "db.cassandra.speculative_execution_count", + "semconv", + "development", + "int", + ["renamed", ["cassandra.speculative_execution.count"]], + ], + ["db.cassandra.table", "semconv", "development", "string", ["renamed", ["db.collection.name"]]], + ["db.client.connection.pool.name", "semconv", "development", "string", null], + ["db.client.connection.state", "semconv", "development", "enum", null], + [ + "db.client.connections.pool.name", + "semconv", + "development", + "string", + ["renamed", ["db.client.connection.pool.name"]], + ], + [ + "db.client.connections.state", + "semconv", + "development", + "enum", + ["renamed", ["db.client.connection.state"]], + ], + ["db.collection.name", "semconv", "stable", "string", null], + [ + "db.connection_string", + "semconv", + "development", + "string", + ["uncategorized", ["server.address", "server.port"]], + ], + ["db.cosmosdb.client_id", "semconv", "development", "string", ["renamed", ["azure.client.id"]]], + [ + "db.cosmosdb.connection_mode", + "semconv", + "development", + "enum", + ["renamed", ["azure.cosmosdb.connection.mode"]], + ], + [ + "db.cosmosdb.consistency_level", + "semconv", + "development", + "enum", + ["renamed", ["azure.cosmosdb.consistency.level"]], + ], + ["db.cosmosdb.container", "semconv", "development", "string", ["renamed", ["db.collection.name"]]], + ["db.cosmosdb.operation_type", "semconv", "development", "enum", ["obsoleted", []]], + [ + "db.cosmosdb.regions_contacted", + "semconv", + "development", + "string[]", + ["renamed", ["azure.cosmosdb.operation.contacted_regions"]], + ], + [ + "db.cosmosdb.request_charge", + "semconv", + "development", + "double", + ["renamed", ["azure.cosmosdb.operation.request_charge"]], + ], + [ + "db.cosmosdb.request_content_length", + "semconv", + "development", + "int", + ["renamed", ["azure.cosmosdb.request.body.size"]], + ], + [ + "db.cosmosdb.status_code", + "semconv", + "development", + "int", + ["uncategorized", ["db.response.status_code"]], + ], + [ + "db.cosmosdb.sub_status_code", + "semconv", + "development", + "int", + ["renamed", ["azure.cosmosdb.response.sub_status_code"]], + ], + ["db.elasticsearch.cluster.name", "semconv", "development", "string", ["renamed", ["db.namespace"]]], + [ + "db.elasticsearch.node.name", + "semconv", + "development", + "string", + ["renamed", ["elasticsearch.node.name"]], + ], + [ + "db.elasticsearch.path_parts", + "semconv", + "development", + "template[string]", + ["renamed", ["db.operation.parameter"]], + ], + ["db.instance.id", "semconv", "development", "string", ["obsoleted", ["db.elasticsearch.node.name"]]], + ["db.jdbc.driver_classname", "semconv", "development", "string", ["obsoleted", []]], + ["db.mongodb.collection", "semconv", "development", "string", ["renamed", ["db.collection.name"]]], + ["db.mssql.instance_name", "semconv", "development", "string", ["obsoleted", []]], + ["db.name", "semconv", "development", "string", ["renamed", ["db.namespace"]]], + ["db.namespace", "semconv", "stable", "string", null], + ["db.operation", "semconv", "development", "string", ["renamed", ["db.operation.name"]]], + ["db.operation.batch.size", "semconv", "stable", "int", null], + ["db.operation.name", "semconv", "stable", "string", null], + ["db.operation.parameter", "semconv", "development", "template[string]", null], + ["db.query.parameter", "semconv", "development", "template[string]", null], + ["db.query.summary", "semconv", "stable", "string", null], + ["db.query.text", "semconv", "stable", "string", null], + ["db.redis.database_index", "semconv", "development", "int", ["uncategorized", ["db.namespace"]]], + ["db.response.returned_rows", "semconv", "development", "int", null], + ["db.response.status_code", "semconv", "stable", "string", null], + [ + "db.sql.table", + "semconv", + "development", + "string", + ["uncategorized", ["db.collection.name", "db.query.text"]], + ], + ["db.statement", "semconv", "development", "string", ["renamed", ["db.query.text"]]], + ["db.stored_procedure.name", "semconv", "stable", "string", null], + ["db.system", "semconv", "development", "enum", ["renamed", ["db.system.name"]]], + ["db.system.name", "semconv", "stable", "enum", null], + ["db.user", "semconv", "development", "string", ["obsoleted", []]], + [ + "deployment.environment", + "semconv", + "development", + "string", + ["renamed", ["deployment.environment.name"]], + ], + ["deployment.environment.name", "semconv", "stable", "enum", null], + ["deployment.id", "semconv", "development", "string", null], + ["deployment.name", "semconv", "development", "string", null], + ["deployment.status", "semconv", "development", "enum", null], + ["destination.address", "semconv", "development", "string", null], + ["destination.port", "semconv", "development", "int", null], + ["device.id", "semconv", "development", "string", null], + ["device.manufacturer", "semconv", "development", "string", null], + ["device.model.identifier", "semconv", "development", "string", null], + ["device.model.name", "semconv", "development", "string", null], + ["disk.io.direction", "semconv", "release_candidate", "enum", null], + ["dns.answers", "semconv", "development", "string[]", null], + ["dns.question.name", "semconv", "development", "string", null], + ["dotnet.gc.heap.generation", "semconv", "stable", "enum", null], + ["elasticsearch.node.name", "semconv", "development", "string", null], + ["enduser.id", "semconv", "development", "string", null], + ["enduser.pseudo.id", "semconv", "development", "string", null], + ["enduser.role", "semconv", "development", "string", ["uncategorized", ["user.roles"]]], + ["enduser.scope", "semconv", "development", "string", ["obsoleted", []]], + ["error.message", "semconv", "development", "string", ["obsoleted", ["feature_flag.error.message"]]], + ["error.type", "semconv", "stable", "enum", null], + ["event.name", "semconv", "development", "string", ["uncategorized", []]], + ["exception.escaped", "semconv", "stable", "boolean", ["obsoleted", []]], + ["exception.message", "semconv", "stable", "string", null], + ["exception.stacktrace", "semconv", "stable", "string", null], + ["exception.type", "semconv", "stable", "string", null], + ["faas.coldstart", "semconv", "development", "boolean", null], + ["faas.cron", "semconv", "development", "string", null], + ["faas.document.collection", "semconv", "development", "string", null], + ["faas.document.name", "semconv", "development", "string", null], + ["faas.document.operation", "semconv", "development", "enum", null], + ["faas.document.time", "semconv", "development", "string", null], + ["faas.instance", "semconv", "development", "string", null], + ["faas.invocation_id", "semconv", "development", "string", null], + ["faas.invoked_name", "semconv", "development", "string", null], + ["faas.invoked_provider", "semconv", "development", "enum", null], + ["faas.invoked_region", "semconv", "development", "string", null], + ["faas.max_memory", "semconv", "development", "int", null], + ["faas.name", "semconv", "development", "string", null], + ["faas.time", "semconv", "development", "string", null], + ["faas.trigger", "semconv", "development", "enum", null], + ["faas.version", "semconv", "development", "string", null], + ["feature_flag.context.id", "semconv", "release_candidate", "string", null], + ["feature_flag.error.message", "semconv", "release_candidate", "string", null], + [ + "feature_flag.evaluation.error.message", + "semconv", + "development", + "string", + ["renamed", ["feature_flag.error.message"]], + ], + [ + "feature_flag.evaluation.reason", + "semconv", + "development", + "enum", + ["renamed", ["feature_flag.result.reason"]], + ], + ["feature_flag.key", "semconv", "release_candidate", "string", null], + [ + "feature_flag.provider_name", + "semconv", + "development", + "string", + ["renamed", ["feature_flag.provider.name"]], + ], + ["feature_flag.provider.name", "semconv", "release_candidate", "string", null], + ["feature_flag.result.reason", "semconv", "release_candidate", "enum", null], + ["feature_flag.result.value", "semconv", "release_candidate", "any", null], + ["feature_flag.result.variant", "semconv", "release_candidate", "string", null], + ["feature_flag.set.id", "semconv", "release_candidate", "string", null], + [ + "feature_flag.variant", + "semconv", + "development", + "string", + ["renamed", ["feature_flag.result.variant"]], + ], + ["feature_flag.version", "semconv", "release_candidate", "string", null], + ["file.accessed", "semconv", "development", "string", null], + ["file.attributes", "semconv", "development", "string[]", null], + ["file.changed", "semconv", "development", "string", null], + ["file.created", "semconv", "development", "string", null], + ["file.directory", "semconv", "development", "string", null], + ["file.extension", "semconv", "development", "string", null], + ["file.fork_name", "semconv", "development", "string", null], + ["file.group.id", "semconv", "development", "string", null], + ["file.group.name", "semconv", "development", "string", null], + ["file.inode", "semconv", "development", "string", null], + ["file.lock.mechanism", "semconv", "development", "string", null], + ["file.lock.mode", "semconv", "development", "string", null], + ["file.lock.type", "semconv", "development", "enum", null], + ["file.mode", "semconv", "development", "string", null], + ["file.modified", "semconv", "development", "string", null], + ["file.name", "semconv", "development", "string", null], + ["file.owner.id", "semconv", "development", "string", null], + ["file.owner.name", "semconv", "development", "string", null], + ["file.path", "semconv", "development", "string", null], + ["file.size", "semconv", "development", "int", null], + ["file.symbolic_link.target_path", "semconv", "development", "string", null], + ["gcp.apphub_destination.application.container", "semconv", "development", "string", null], + ["gcp.apphub_destination.application.id", "semconv", "development", "string", null], + ["gcp.apphub_destination.application.location", "semconv", "development", "string", null], + ["gcp.apphub_destination.service.criticality_type", "semconv", "development", "enum", null], + ["gcp.apphub_destination.service.environment_type", "semconv", "development", "enum", null], + ["gcp.apphub_destination.service.id", "semconv", "development", "string", null], + ["gcp.apphub_destination.workload.criticality_type", "semconv", "development", "enum", null], + ["gcp.apphub_destination.workload.environment_type", "semconv", "development", "enum", null], + ["gcp.apphub_destination.workload.id", "semconv", "development", "string", null], + ["gcp.apphub.application.container", "semconv", "development", "string", null], + ["gcp.apphub.application.id", "semconv", "development", "string", null], + ["gcp.apphub.application.location", "semconv", "development", "string", null], + ["gcp.apphub.service.criticality_type", "semconv", "development", "enum", null], + ["gcp.apphub.service.environment_type", "semconv", "development", "enum", null], + ["gcp.apphub.service.id", "semconv", "development", "string", null], + ["gcp.apphub.workload.criticality_type", "semconv", "development", "enum", null], + ["gcp.apphub.workload.environment_type", "semconv", "development", "enum", null], + ["gcp.apphub.workload.id", "semconv", "development", "string", null], + ["gcp.client.service", "semconv", "development", "string", null], + ["gcp.cloud_run.job.execution", "semconv", "development", "string", null], + ["gcp.cloud_run.job.task_index", "semconv", "development", "int", null], + ["gcp.gce.instance_group_manager.name", "semconv", "development", "string", null], + ["gcp.gce.instance_group_manager.region", "semconv", "development", "string", null], + ["gcp.gce.instance_group_manager.zone", "semconv", "development", "string", null], + ["gcp.gce.instance.hostname", "semconv", "development", "string", null], + ["gcp.gce.instance.labels", "semconv", "development", "template[string]", null], + ["gcp.gce.instance.name", "semconv", "development", "string", null], + ["gen_ai.agent.description", "genai", "development", "string", null], + ["gen_ai.agent.description", "semconv", "development", "string", ["uncategorized", []]], + ["gen_ai.agent.id", "genai", "development", "string", null], + ["gen_ai.agent.id", "semconv", "development", "string", ["uncategorized", []]], + ["gen_ai.agent.name", "genai", "development", "string", null], + ["gen_ai.agent.name", "semconv", "development", "string", ["uncategorized", []]], + ["gen_ai.agent.version", "genai", "development", "string", null], + ["gen_ai.agent.version", "semconv", "development", "string", ["uncategorized", []]], + ["gen_ai.completion", "semconv", "development", "string", ["obsoleted", []]], + ["gen_ai.conversation.compacted", "genai", "development", "boolean", null], + ["gen_ai.conversation.id", "genai", "development", "string", null], + ["gen_ai.conversation.id", "semconv", "development", "string", ["uncategorized", []]], + ["gen_ai.data_source.id", "genai", "development", "string", null], + ["gen_ai.data_source.id", "semconv", "development", "string", ["uncategorized", []]], + ["gen_ai.embeddings.dimension.count", "genai", "development", "int", null], + ["gen_ai.embeddings.dimension.count", "semconv", "development", "int", ["uncategorized", []]], + ["gen_ai.evaluation.explanation", "genai", "development", "string", null], + ["gen_ai.evaluation.explanation", "semconv", "development", "string", ["uncategorized", []]], + ["gen_ai.evaluation.name", "genai", "development", "string", null], + ["gen_ai.evaluation.name", "semconv", "development", "string", ["uncategorized", []]], + ["gen_ai.evaluation.score.label", "genai", "development", "string", null], + ["gen_ai.evaluation.score.label", "semconv", "development", "string", ["uncategorized", []]], + ["gen_ai.evaluation.score.value", "genai", "development", "double", null], + ["gen_ai.evaluation.score.value", "semconv", "development", "double", ["uncategorized", []]], + ["gen_ai.input.messages", "genai", "development", "any", null], + ["gen_ai.input.messages", "semconv", "development", "any", ["uncategorized", []]], + ["gen_ai.memory.query.text", "genai", "development", "string", null], + ["gen_ai.memory.record.count", "genai", "development", "int", null], + ["gen_ai.memory.record.id", "genai", "development", "string", null], + ["gen_ai.memory.records", "genai", "development", "any", null], + ["gen_ai.memory.store.id", "genai", "development", "string", null], + [ + "gen_ai.openai.request.response_format", + "semconv", + "development", + "enum", + ["uncategorized", ["gen_ai.output.type"]], + ], + [ + "gen_ai.openai.request.seed", + "semconv", + "development", + "int", + ["uncategorized", ["gen_ai.request.seed"]], + ], + [ + "gen_ai.openai.request.service_tier", + "semconv", + "development", + "enum", + ["uncategorized", ["openai.request.service_tier"]], + ], + [ + "gen_ai.openai.response.service_tier", + "semconv", + "development", + "string", + ["uncategorized", ["openai.response.service_tier"]], + ], + [ + "gen_ai.openai.response.system_fingerprint", + "semconv", + "development", + "string", + ["uncategorized", ["openai.response.system_fingerprint"]], + ], + ["gen_ai.operation.name", "genai", "development", "enum", null], + ["gen_ai.operation.name", "semconv", "development", "enum", ["uncategorized", []]], + ["gen_ai.output.messages", "genai", "development", "any", null], + ["gen_ai.output.messages", "semconv", "development", "any", ["uncategorized", []]], + ["gen_ai.output.type", "genai", "development", "enum", null], + ["gen_ai.output.type", "semconv", "development", "enum", ["uncategorized", []]], + ["gen_ai.prompt", "semconv", "development", "string", ["obsoleted", []]], + ["gen_ai.prompt.name", "genai", "development", "string", null], + ["gen_ai.prompt.name", "semconv", "development", "string", ["uncategorized", []]], + ["gen_ai.prompt.variable", "genai", "development", "template[string]", null], + ["gen_ai.prompt.version", "genai", "development", "string", null], + ["gen_ai.provider.name", "genai", "development", "enum", null], + ["gen_ai.provider.name", "semconv", "development", "enum", ["uncategorized", []]], + ["gen_ai.request.choice.count", "genai", "development", "int", null], + ["gen_ai.request.choice.count", "semconv", "development", "int", ["uncategorized", []]], + ["gen_ai.request.encoding_formats", "genai", "development", "string[]", null], + ["gen_ai.request.encoding_formats", "semconv", "development", "string[]", ["uncategorized", []]], + ["gen_ai.request.frequency_penalty", "genai", "development", "double", null], + ["gen_ai.request.frequency_penalty", "semconv", "development", "double", ["uncategorized", []]], + ["gen_ai.request.max_tokens", "genai", "development", "int", null], + ["gen_ai.request.max_tokens", "semconv", "development", "int", ["uncategorized", []]], + ["gen_ai.request.model", "genai", "development", "string", null], + ["gen_ai.request.model", "semconv", "development", "string", ["uncategorized", []]], + ["gen_ai.request.presence_penalty", "genai", "development", "double", null], + ["gen_ai.request.presence_penalty", "semconv", "development", "double", ["uncategorized", []]], + ["gen_ai.request.previous_response.id", "genai", "development", "string", null], + ["gen_ai.request.reasoning.level", "genai", "development", "string", null], + ["gen_ai.request.seed", "genai", "development", "int", null], + ["gen_ai.request.seed", "semconv", "development", "int", ["uncategorized", []]], + ["gen_ai.request.stop_sequences", "genai", "development", "string[]", null], + ["gen_ai.request.stop_sequences", "semconv", "development", "string[]", ["uncategorized", []]], + ["gen_ai.request.stream", "genai", "development", "boolean", null], + ["gen_ai.request.stream", "semconv", "development", "boolean", ["uncategorized", []]], + ["gen_ai.request.stream_cursor", "genai", "development", "string", null], + ["gen_ai.request.temperature", "genai", "development", "double", null], + ["gen_ai.request.temperature", "semconv", "development", "double", ["uncategorized", []]], + ["gen_ai.request.top_k", "genai", "development", "int", null], + ["gen_ai.request.top_k", "semconv", "development", "double", ["uncategorized", []]], + ["gen_ai.request.top_p", "genai", "development", "double", null], + ["gen_ai.request.top_p", "semconv", "development", "double", ["uncategorized", []]], + ["gen_ai.response.finish_reasons", "genai", "development", "string[]", null], + ["gen_ai.response.finish_reasons", "semconv", "development", "string[]", ["uncategorized", []]], + ["gen_ai.response.id", "genai", "development", "string", null], + ["gen_ai.response.id", "semconv", "development", "string", ["uncategorized", []]], + ["gen_ai.response.model", "genai", "development", "string", null], + ["gen_ai.response.model", "semconv", "development", "string", ["uncategorized", []]], + ["gen_ai.response.status", "genai", "development", "enum", null], + ["gen_ai.response.time_to_first_chunk", "genai", "development", "double", null], + ["gen_ai.response.time_to_first_chunk", "semconv", "development", "double", ["uncategorized", []]], + ["gen_ai.retrieval.documents", "genai", "development", "any", null], + ["gen_ai.retrieval.documents", "semconv", "development", "any", ["uncategorized", []]], + ["gen_ai.retrieval.query.text", "genai", "development", "string", null], + ["gen_ai.retrieval.query.text", "semconv", "development", "string", ["uncategorized", []]], + ["gen_ai.retrieval.top_k", "genai", "development", "int", null], + ["gen_ai.skill.description", "genai", "development", "string", null], + ["gen_ai.skill.name", "genai", "development", "string", null], + ["gen_ai.skill.resource.name", "genai", "development", "string", null], + ["gen_ai.skill.source.uri", "genai", "development", "string", null], + ["gen_ai.system", "semconv", "development", "enum", ["uncategorized", ["gen_ai.provider.name"]]], + ["gen_ai.system_instructions", "genai", "development", "any", null], + ["gen_ai.system_instructions", "semconv", "development", "any", ["uncategorized", []]], + ["gen_ai.token.modality", "genai", "development", "enum", null], + ["gen_ai.token.type", "semconv", "development", "enum", ["uncategorized", []]], + ["gen_ai.tool.call.arguments", "genai", "development", "any", null], + ["gen_ai.tool.call.arguments", "semconv", "development", "any", ["uncategorized", []]], + ["gen_ai.tool.call.id", "genai", "development", "string", null], + ["gen_ai.tool.call.id", "semconv", "development", "string", ["uncategorized", []]], + ["gen_ai.tool.call.result", "genai", "development", "any", null], + ["gen_ai.tool.call.result", "semconv", "development", "any", ["uncategorized", []]], + ["gen_ai.tool.definitions", "genai", "development", "any", null], + ["gen_ai.tool.definitions", "semconv", "development", "any", ["uncategorized", []]], + ["gen_ai.tool.description", "genai", "development", "string", null], + ["gen_ai.tool.description", "semconv", "development", "string", ["uncategorized", []]], + ["gen_ai.tool.name", "genai", "development", "string", null], + ["gen_ai.tool.name", "semconv", "development", "string", ["uncategorized", []]], + ["gen_ai.tool.type", "genai", "development", "string", null], + ["gen_ai.tool.type", "semconv", "development", "string", ["uncategorized", []]], + ["gen_ai.usage.audio.cache_read.input_tokens", "genai", "development", "int", null], + ["gen_ai.usage.audio.input_tokens", "genai", "development", "int", null], + ["gen_ai.usage.audio.output_tokens", "genai", "development", "int", null], + ["gen_ai.usage.cache_creation.input_tokens", "semconv", "development", "int", ["uncategorized", []]], + ["gen_ai.usage.cache_read.input_tokens", "genai", "development", "int", null], + ["gen_ai.usage.cache_read.input_tokens", "semconv", "development", "int", ["uncategorized", []]], + ["gen_ai.usage.cache_write.input_tokens", "genai", "development", "int", null], + [ + "gen_ai.usage.completion_tokens", + "semconv", + "development", + "int", + ["uncategorized", ["gen_ai.usage.output_tokens"]], + ], + ["gen_ai.usage.image.cache_read.input_tokens", "genai", "development", "int", null], + ["gen_ai.usage.image.input_tokens", "genai", "development", "int", null], + ["gen_ai.usage.image.output_tokens", "genai", "development", "int", null], + ["gen_ai.usage.input_tokens", "genai", "development", "int", null], + ["gen_ai.usage.input_tokens", "semconv", "development", "int", ["uncategorized", []]], + ["gen_ai.usage.output_tokens", "genai", "development", "int", null], + ["gen_ai.usage.output_tokens", "semconv", "development", "int", ["uncategorized", []]], + [ + "gen_ai.usage.prompt_tokens", + "semconv", + "development", + "int", + ["uncategorized", ["gen_ai.usage.input_tokens"]], + ], + ["gen_ai.usage.reasoning.output_tokens", "genai", "development", "int", null], + ["gen_ai.usage.reasoning.output_tokens", "semconv", "development", "int", ["uncategorized", []]], + ["gen_ai.usage.text.cache_read.input_tokens", "genai", "development", "int", null], + ["gen_ai.usage.text.input_tokens", "genai", "development", "int", null], + ["gen_ai.usage.text.output_tokens", "genai", "development", "int", null], + ["gen_ai.workflow.name", "genai", "development", "string", null], + ["gen_ai.workflow.name", "semconv", "development", "string", ["uncategorized", []]], + ["geo.continent.code", "semconv", "development", "enum", null], + ["geo.country.iso_code", "semconv", "development", "string", null], + ["geo.locality.name", "semconv", "development", "string", null], + ["geo.location.lat", "semconv", "development", "double", null], + ["geo.location.lon", "semconv", "development", "double", null], + ["geo.postal_code", "semconv", "development", "string", null], + ["geo.region.iso_code", "semconv", "development", "string", null], + ["go.cpu.detailed_state", "semconv", "development", "string", null], + ["go.cpu.state", "semconv", "development", "enum", null], + ["go.memory.detailed_type", "semconv", "development", "string", null], + ["go.memory.type", "semconv", "development", "enum", null], + ["graphql.document", "semconv", "development", "string", null], + ["graphql.operation.name", "semconv", "development", "string", null], + ["graphql.operation.type", "semconv", "development", "enum", null], + ["heroku.app.id", "semconv", "development", "string", null], + ["heroku.release.commit", "semconv", "development", "string", null], + ["heroku.release.creation_timestamp", "semconv", "development", "string", null], + ["host.arch", "semconv", "development", "enum", null], + ["host.cpu.cache.l2.size", "semconv", "development", "int", null], + ["host.cpu.family", "semconv", "development", "string", null], + ["host.cpu.model.id", "semconv", "development", "string", null], + ["host.cpu.model.name", "semconv", "development", "string", null], + ["host.cpu.stepping", "semconv", "development", "string", null], + ["host.cpu.vendor.id", "semconv", "development", "string", null], + ["host.id", "semconv", "development", "string", null], + ["host.image.id", "semconv", "development", "string", null], + ["host.image.name", "semconv", "development", "string", null], + ["host.image.version", "semconv", "development", "string", null], + ["host.ip", "semconv", "development", "string[]", null], + ["host.mac", "semconv", "development", "string[]", null], + ["host.name", "semconv", "development", "string", null], + ["host.type", "semconv", "development", "string", null], + ["http.client_ip", "semconv", "development", "string", ["renamed", ["client.address"]]], + ["http.connection.state", "semconv", "development", "enum", null], + [ + "http.flavor", + "semconv", + "development", + "enum", + ["uncategorized", ["network.protocol.name", "network.protocol.version"]], + ], + [ + "http.host", + "semconv", + "development", + "string", + ["uncategorized", ["server.address", "client.address"]], + ], + ["http.method", "semconv", "development", "string", ["renamed", ["http.request.method"]]], + ["http.request_content_length", "semconv", "development", "int", ["uncategorized", []]], + [ + "http.request_content_length_uncompressed", + "semconv", + "development", + "int", + ["renamed", ["http.request.body.size"]], + ], + ["http.request.body.size", "semconv", "development", "int", null], + ["http.request.header", "semconv", "stable", "template[string[]]", null], + ["http.request.method", "semconv", "stable", "enum", null], + ["http.request.method_original", "semconv", "stable", "string", null], + ["http.request.resend_count", "semconv", "stable", "int", null], + ["http.request.size", "semconv", "development", "int", null], + ["http.response_content_length", "semconv", "development", "int", ["uncategorized", []]], + [ + "http.response_content_length_uncompressed", + "semconv", + "development", + "int", + ["renamed", ["http.response.body.size"]], + ], + ["http.response.body.size", "semconv", "development", "int", null], + ["http.response.header", "semconv", "stable", "template[string[]]", null], + ["http.response.size", "semconv", "development", "int", null], + ["http.response.status_code", "semconv", "stable", "int", null], + ["http.route", "semconv", "stable", "string", null], + ["http.scheme", "semconv", "development", "string", ["renamed", ["url.scheme"]]], + ["http.server_name", "semconv", "development", "string", ["renamed", ["server.address"]]], + ["http.status_code", "semconv", "development", "int", ["renamed", ["http.response.status_code"]]], + ["http.target", "semconv", "development", "string", ["obsoleted", ["url.path", "url.query"]]], + ["http.url", "semconv", "development", "string", ["renamed", ["url.full"]]], + ["http.user_agent", "semconv", "development", "string", ["renamed", ["user_agent.original"]]], + ["hw.battery.capacity", "semconv", "development", "string", null], + ["hw.battery.chemistry", "semconv", "development", "string", null], + ["hw.battery.state", "semconv", "development", "enum", null], + ["hw.bios_version", "semconv", "development", "string", null], + ["hw.driver_version", "semconv", "development", "string", null], + ["hw.enclosure.type", "semconv", "development", "string", null], + ["hw.firmware_version", "semconv", "development", "string", null], + ["hw.gpu.task", "semconv", "development", "enum", null], + ["hw.id", "semconv", "development", "string", null], + ["hw.limit_type", "semconv", "development", "enum", null], + ["hw.logical_disk.raid_level", "semconv", "development", "string", null], + ["hw.logical_disk.state", "semconv", "development", "enum", null], + ["hw.memory.type", "semconv", "development", "string", null], + ["hw.model", "semconv", "development", "string", null], + ["hw.name", "semconv", "development", "string", null], + ["hw.network.logical_addresses", "semconv", "development", "string[]", null], + ["hw.network.physical_address", "semconv", "development", "string", null], + ["hw.parent", "semconv", "development", "string", null], + ["hw.physical_disk.smart_attribute", "semconv", "development", "string", null], + ["hw.physical_disk.state", "semconv", "development", "enum", null], + ["hw.physical_disk.type", "semconv", "development", "string", null], + ["hw.sensor_location", "semconv", "development", "string", null], + ["hw.serial_number", "semconv", "development", "string", null], + ["hw.state", "semconv", "development", "enum", null], + ["hw.tape_drive.operation_type", "semconv", "development", "enum", null], + ["hw.type", "semconv", "development", "enum", null], + ["hw.vendor", "semconv", "development", "string", null], + ["ios.app.state", "semconv", "development", "enum", null], + ["ios.state", "semconv", "development", "enum", ["renamed", ["ios.app.state"]]], + ["jsonrpc.protocol.version", "semconv", "development", "string", null], + ["jsonrpc.request.id", "semconv", "development", "string", null], + ["jvm.buffer.pool.name", "semconv", "development", "string", null], + ["jvm.gc.action", "semconv", "stable", "string", null], + ["jvm.gc.cause", "semconv", "development", "string", null], + ["jvm.gc.name", "semconv", "stable", "string", null], + ["jvm.memory.pool.name", "semconv", "stable", "string", null], + ["jvm.memory.type", "semconv", "stable", "enum", null], + ["jvm.thread.daemon", "semconv", "stable", "boolean", null], + ["jvm.thread.state", "semconv", "stable", "enum", null], + ["k8s.cluster.name", "semconv", "stable", "string", null], + ["k8s.cluster.uid", "semconv", "stable", "string", null], + ["k8s.container.ephemeral_storage.fs_type", "semconv", "development", "enum", null], + ["k8s.container.name", "semconv", "stable", "string", null], + ["k8s.container.restart_count", "semconv", "stable", "int", null], + ["k8s.container.status.last_terminated_reason", "semconv", "development", "string", null], + ["k8s.container.status.reason", "semconv", "experimental", "enum", null], + ["k8s.container.status.state", "semconv", "experimental", "enum", null], + ["k8s.cronjob.annotation", "semconv", "stable", "template[string]", null], + ["k8s.cronjob.label", "semconv", "stable", "template[string]", null], + ["k8s.cronjob.name", "semconv", "stable", "string", null], + ["k8s.cronjob.uid", "semconv", "stable", "string", null], + ["k8s.daemonset.annotation", "semconv", "stable", "template[string]", null], + ["k8s.daemonset.label", "semconv", "stable", "template[string]", null], + ["k8s.daemonset.name", "semconv", "stable", "string", null], + ["k8s.daemonset.uid", "semconv", "stable", "string", null], + ["k8s.deployment.annotation", "semconv", "stable", "template[string]", null], + ["k8s.deployment.label", "semconv", "stable", "template[string]", null], + ["k8s.deployment.name", "semconv", "stable", "string", null], + ["k8s.deployment.uid", "semconv", "stable", "string", null], + ["k8s.hpa.metric.type", "semconv", "development", "string", null], + ["k8s.hpa.name", "semconv", "development", "string", null], + ["k8s.hpa.scaletargetref.api_version", "semconv", "development", "string", null], + ["k8s.hpa.scaletargetref.kind", "semconv", "development", "string", null], + ["k8s.hpa.scaletargetref.name", "semconv", "development", "string", null], + ["k8s.hpa.uid", "semconv", "development", "string", null], + ["k8s.hugepage.size", "semconv", "development", "string", null], + ["k8s.job.annotation", "semconv", "stable", "template[string]", null], + ["k8s.job.label", "semconv", "stable", "template[string]", null], + ["k8s.job.name", "semconv", "stable", "string", null], + ["k8s.job.uid", "semconv", "stable", "string", null], + ["k8s.namespace.annotation", "semconv", "stable", "template[string]", null], + ["k8s.namespace.label", "semconv", "stable", "template[string]", null], + ["k8s.namespace.name", "semconv", "stable", "string", null], + ["k8s.namespace.phase", "semconv", "development", "enum", null], + ["k8s.node.annotation", "semconv", "stable", "template[string]", null], + ["k8s.node.condition.status", "semconv", "development", "enum", null], + ["k8s.node.condition.type", "semconv", "development", "enum", null], + ["k8s.node.label", "semconv", "stable", "template[string]", null], + ["k8s.node.name", "semconv", "stable", "string", null], + ["k8s.node.system_container.name", "semconv", "development", "string", null], + ["k8s.node.uid", "semconv", "stable", "string", null], + ["k8s.persistentvolume.annotation", "semconv", "development", "template[string]", null], + ["k8s.persistentvolume.label", "semconv", "development", "template[string]", null], + ["k8s.persistentvolume.name", "semconv", "development", "string", null], + ["k8s.persistentvolume.reclaim_policy", "semconv", "development", "enum", null], + ["k8s.persistentvolume.status.phase", "semconv", "development", "enum", null], + ["k8s.persistentvolume.uid", "semconv", "development", "string", null], + ["k8s.persistentvolumeclaim.annotation", "semconv", "development", "template[string]", null], + ["k8s.persistentvolumeclaim.label", "semconv", "development", "template[string]", null], + ["k8s.persistentvolumeclaim.name", "semconv", "development", "string", null], + ["k8s.persistentvolumeclaim.status.phase", "semconv", "development", "enum", null], + ["k8s.persistentvolumeclaim.uid", "semconv", "development", "string", null], + ["k8s.pod.annotation", "semconv", "stable", "template[string]", null], + ["k8s.pod.hostname", "semconv", "stable", "string", null], + ["k8s.pod.ip", "semconv", "stable", "string", null], + ["k8s.pod.label", "semconv", "stable", "template[string]", null], + ["k8s.pod.labels", "semconv", "development", "template[string]", ["renamed", ["k8s.pod.label"]]], + ["k8s.pod.name", "semconv", "stable", "string", null], + ["k8s.pod.start_time", "semconv", "stable", "string", null], + ["k8s.pod.status.phase", "semconv", "development", "enum", null], + ["k8s.pod.status.reason", "semconv", "development", "enum", null], + ["k8s.pod.uid", "semconv", "stable", "string", null], + ["k8s.replicaset.annotation", "semconv", "stable", "template[string]", null], + ["k8s.replicaset.label", "semconv", "stable", "template[string]", null], + ["k8s.replicaset.name", "semconv", "stable", "string", null], + ["k8s.replicaset.uid", "semconv", "stable", "string", null], + ["k8s.replicationcontroller.name", "semconv", "development", "string", null], + ["k8s.replicationcontroller.uid", "semconv", "development", "string", null], + ["k8s.resourcequota.name", "semconv", "development", "string", null], + ["k8s.resourcequota.resource_name", "semconv", "development", "string", null], + ["k8s.resourcequota.uid", "semconv", "development", "string", null], + ["k8s.service.annotation", "semconv", "development", "template[string]", null], + ["k8s.service.endpoint.address_type", "semconv", "development", "enum", null], + ["k8s.service.endpoint.condition", "semconv", "development", "enum", null], + ["k8s.service.endpoint.zone", "semconv", "development", "string", null], + ["k8s.service.label", "semconv", "development", "template[string]", null], + ["k8s.service.name", "semconv", "development", "string", null], + ["k8s.service.publish_not_ready_addresses", "semconv", "development", "boolean", null], + ["k8s.service.selector", "semconv", "development", "template[string]", null], + ["k8s.service.traffic_distribution", "semconv", "development", "string", null], + ["k8s.service.type", "semconv", "development", "enum", null], + ["k8s.service.uid", "semconv", "development", "string", null], + ["k8s.statefulset.annotation", "semconv", "stable", "template[string]", null], + ["k8s.statefulset.label", "semconv", "stable", "template[string]", null], + ["k8s.statefulset.name", "semconv", "stable", "string", null], + ["k8s.statefulset.uid", "semconv", "stable", "string", null], + ["k8s.storageclass.name", "semconv", "development", "string", null], + ["k8s.volume.name", "semconv", "development", "string", null], + ["k8s.volume.type", "semconv", "development", "enum", null], + [ + "linux.memory.slab.state", + "semconv", + "development", + "enum", + ["renamed", ["system.memory.linux.slab.state"]], + ], + ["log.file.name", "semconv", "development", "string", null], + ["log.file.name_resolved", "semconv", "development", "string", null], + ["log.file.path", "semconv", "development", "string", null], + ["log.file.path_resolved", "semconv", "development", "string", null], + ["log.iostream", "semconv", "development", "enum", null], + ["log.record.original", "semconv", "development", "string", null], + ["log.record.uid", "semconv", "development", "string", null], + ["mainframe.lpar.name", "semconv", "development", "string", null], + ["mcp.method.name", "genai", "development", "enum", null], + ["mcp.method.name", "semconv", "development", "enum", ["uncategorized", []]], + ["mcp.protocol.version", "genai", "development", "string", null], + ["mcp.protocol.version", "semconv", "development", "string", ["uncategorized", []]], + ["mcp.resource.uri", "genai", "development", "string", null], + ["mcp.resource.uri", "semconv", "development", "string", ["uncategorized", []]], + ["mcp.session.id", "genai", "development", "string", null], + ["mcp.session.id", "semconv", "development", "string", ["uncategorized", []]], + ["message.compressed_size", "semconv", "development", "int", ["obsoleted", []]], + ["message.id", "semconv", "development", "int", ["obsoleted", []]], + ["message.type", "semconv", "development", "enum", ["obsoleted", []]], + ["message.uncompressed_size", "semconv", "development", "int", ["obsoleted", []]], + ["messaging.batch.message_count", "semconv", "development", "int", null], + ["messaging.client_id", "semconv", "development", "string", ["renamed", ["messaging.client.id"]]], + ["messaging.client.id", "semconv", "development", "string", null], + ["messaging.consumer.group.name", "semconv", "development", "string", null], + ["messaging.destination_publish.anonymous", "semconv", "development", "boolean", ["obsoleted", []]], + ["messaging.destination_publish.name", "semconv", "development", "string", ["obsoleted", []]], + ["messaging.destination.anonymous", "semconv", "development", "boolean", null], + ["messaging.destination.name", "semconv", "development", "string", null], + ["messaging.destination.partition.id", "semconv", "development", "string", null], + ["messaging.destination.subscription.name", "semconv", "development", "string", null], + ["messaging.destination.template", "semconv", "development", "string", null], + ["messaging.destination.temporary", "semconv", "development", "boolean", null], + [ + "messaging.eventhubs.consumer.group", + "semconv", + "development", + "string", + ["renamed", ["messaging.consumer.group.name"]], + ], + ["messaging.eventhubs.message.enqueued_time", "semconv", "development", "int", null], + ["messaging.gcp_pubsub.message.ack_deadline", "semconv", "development", "int", null], + ["messaging.gcp_pubsub.message.ack_id", "semconv", "development", "string", null], + ["messaging.gcp_pubsub.message.delivery_attempt", "semconv", "development", "int", null], + ["messaging.gcp_pubsub.message.ordering_key", "semconv", "development", "string", null], + ["messaging.kafka.cluster.id", "semconv", "development", "string", null], + [ + "messaging.kafka.consumer.group", + "semconv", + "development", + "string", + ["renamed", ["messaging.consumer.group.name"]], + ], + [ + "messaging.kafka.destination.partition", + "semconv", + "development", + "int", + ["uncategorized", ["messaging.destination.partition.id"]], + ], + ["messaging.kafka.message.key", "semconv", "development", "string", null], + [ + "messaging.kafka.message.offset", + "semconv", + "development", + "int", + ["renamed", ["messaging.kafka.offset"]], + ], + ["messaging.kafka.message.tombstone", "semconv", "development", "boolean", null], + ["messaging.kafka.offset", "semconv", "development", "int", null], + ["messaging.message.body.size", "semconv", "development", "int", null], + ["messaging.message.conversation_id", "semconv", "development", "string", null], + ["messaging.message.envelope.size", "semconv", "development", "int", null], + ["messaging.message.id", "semconv", "development", "string", null], + ["messaging.operation", "semconv", "development", "string", ["renamed", ["messaging.operation.type"]]], + ["messaging.operation.name", "semconv", "development", "string", null], + ["messaging.operation.type", "semconv", "development", "enum", null], + ["messaging.rabbitmq.destination.routing_key", "semconv", "development", "string", null], + ["messaging.rabbitmq.message.delivery_tag", "semconv", "development", "int", null], + [ + "messaging.rocketmq.client_group", + "semconv", + "development", + "string", + ["uncategorized", ["messaging.consumer.group.name"]], + ], + ["messaging.rocketmq.consumption_model", "semconv", "development", "enum", null], + ["messaging.rocketmq.message.delay_time_level", "semconv", "development", "int", null], + ["messaging.rocketmq.message.delivery_timestamp", "semconv", "development", "int", null], + ["messaging.rocketmq.message.group", "semconv", "development", "string", null], + ["messaging.rocketmq.message.keys", "semconv", "development", "string[]", null], + ["messaging.rocketmq.message.tag", "semconv", "development", "string", null], + ["messaging.rocketmq.message.type", "semconv", "development", "enum", null], + ["messaging.rocketmq.namespace", "semconv", "development", "string", null], + [ + "messaging.servicebus.destination.subscription_name", + "semconv", + "development", + "string", + ["renamed", ["messaging.destination.subscription.name"]], + ], + ["messaging.servicebus.disposition_status", "semconv", "development", "enum", null], + ["messaging.servicebus.message.delivery_count", "semconv", "development", "int", null], + ["messaging.servicebus.message.enqueued_time", "semconv", "development", "int", null], + ["messaging.system", "semconv", "development", "enum", null], + ["net.host.ip", "semconv", "development", "string", ["renamed", ["network.local.address"]]], + ["net.host.name", "semconv", "development", "string", ["renamed", ["server.address"]]], + ["net.host.port", "semconv", "development", "int", ["renamed", ["server.port"]]], + ["net.peer.ip", "semconv", "development", "string", ["renamed", ["network.peer.address"]]], + [ + "net.peer.name", + "semconv", + "development", + "string", + ["uncategorized", ["server.address", "client.address"]], + ], + ["net.peer.port", "semconv", "development", "int", ["uncategorized", ["server.port", "client.port"]]], + ["net.protocol.name", "semconv", "development", "string", ["renamed", ["network.protocol.name"]]], + ["net.protocol.version", "semconv", "development", "string", ["renamed", ["network.protocol.version"]]], + [ + "net.sock.family", + "semconv", + "development", + "enum", + ["uncategorized", ["network.transport", "network.type"]], + ], + ["net.sock.host.addr", "semconv", "development", "string", ["renamed", ["network.local.address"]]], + ["net.sock.host.port", "semconv", "development", "int", ["renamed", ["network.local.port"]]], + ["net.sock.peer.addr", "semconv", "development", "string", ["renamed", ["network.peer.address"]]], + ["net.sock.peer.name", "semconv", "development", "string", ["obsoleted", []]], + ["net.sock.peer.port", "semconv", "development", "int", ["renamed", ["network.peer.port"]]], + ["net.transport", "semconv", "development", "enum", ["renamed", ["network.transport"]]], + ["network.carrier.icc", "semconv", "development", "string", null], + ["network.carrier.mcc", "semconv", "development", "string", null], + ["network.carrier.mnc", "semconv", "development", "string", null], + ["network.carrier.name", "semconv", "development", "string", null], + ["network.connection.state", "semconv", "development", "enum", null], + ["network.connection.subtype", "semconv", "development", "enum", null], + ["network.connection.type", "semconv", "development", "enum", null], + ["network.interface.name", "semconv", "release_candidate", "string", null], + ["network.io.direction", "semconv", "release_candidate", "enum", null], + ["network.local.address", "semconv", "stable", "string", null], + ["network.local.port", "semconv", "stable", "int", null], + ["network.peer.address", "semconv", "stable", "string", null], + ["network.peer.port", "semconv", "stable", "int", null], + ["network.protocol.name", "semconv", "stable", "string", null], + ["network.protocol.version", "semconv", "stable", "string", null], + ["network.transport", "semconv", "stable", "enum", null], + ["network.type", "semconv", "stable", "enum", null], + ["nfs.operation.name", "semconv", "development", "string", null], + ["nfs.server.repcache.status", "semconv", "development", "string", null], + ["nodejs.eventloop.state", "semconv", "development", "enum", null], + ["oci.manifest.digest", "semconv", "development", "string", null], + ["onc_rpc.procedure.name", "semconv", "development", "string", null], + ["onc_rpc.procedure.number", "semconv", "development", "int", null], + ["onc_rpc.program.name", "semconv", "development", "string", null], + ["onc_rpc.version", "semconv", "development", "int", null], + ["openai.api.type", "genai", "development", "enum", null], + ["openai.api.type", "semconv", "development", "enum", ["uncategorized", []]], + ["openai.request.service_tier", "genai", "development", "enum", null], + ["openai.request.service_tier", "semconv", "development", "enum", ["uncategorized", []]], + ["openai.response.service_tier", "genai", "development", "string", null], + ["openai.response.service_tier", "semconv", "development", "string", ["uncategorized", []]], + ["openai.response.system_fingerprint", "genai", "development", "string", null], + ["openai.response.system_fingerprint", "semconv", "development", "string", ["uncategorized", []]], + ["openshift.clusterquota.name", "semconv", "development", "string", null], + ["openshift.clusterquota.uid", "semconv", "development", "string", null], + ["opentracing.ref_type", "semconv", "development", "enum", null], + ["oracle_cloud.realm", "semconv", "development", "string", null], + ["oracle.db.domain", "semconv", "release_candidate", "string", null], + ["oracle.db.instance.name", "semconv", "release_candidate", "string", null], + ["oracle.db.name", "semconv", "release_candidate", "string", null], + ["oracle.db.pdb", "semconv", "release_candidate", "string", null], + ["oracle.db.service", "semconv", "release_candidate", "string", null], + ["os.build_id", "semconv", "development", "string", null], + ["os.description", "semconv", "development", "string", null], + ["os.name", "semconv", "development", "string", null], + ["os.type", "semconv", "development", "enum", null], + ["os.version", "semconv", "development", "string", null], + ["otel.component.name", "semconv", "development", "string", null], + ["otel.component.type", "semconv", "development", "enum", null], + ["otel.event.name", "semconv", "stable", "string", null], + ["otel.library.name", "semconv", "development", "string", ["renamed", ["otel.scope.name"]]], + ["otel.library.version", "semconv", "development", "string", ["renamed", ["otel.scope.version"]]], + ["otel.scope.name", "semconv", "stable", "string", null], + ["otel.scope.schema_url", "semconv", "development", "string", null], + ["otel.scope.version", "semconv", "stable", "string", null], + ["otel.span.parent.origin", "semconv", "development", "enum", null], + ["otel.span.sampling_result", "semconv", "development", "enum", null], + ["otel.status_code", "semconv", "stable", "enum", null], + ["otel.status_description", "semconv", "stable", "string", null], + ["peer.service", "semconv", "development", "string", ["renamed", ["service.peer.name"]]], + ["pool.name", "semconv", "development", "string", ["renamed", ["db.client.connection.pool.name"]]], + ["pprof.location.is_folded", "semconv", "development", "boolean", null], + ["pprof.mapping.has_filenames", "semconv", "development", "boolean", null], + ["pprof.mapping.has_functions", "semconv", "development", "boolean", null], + ["pprof.mapping.has_inline_frames", "semconv", "development", "boolean", null], + ["pprof.mapping.has_line_numbers", "semconv", "development", "boolean", null], + ["pprof.profile.comment", "semconv", "development", "string[]", null], + ["pprof.profile.doc_url", "semconv", "development", "string", null], + ["pprof.profile.drop_frames", "semconv", "development", "string", null], + ["pprof.profile.keep_frames", "semconv", "development", "string", null], + ["pprof.scope.default_sample_type", "semconv", "development", "string", null], + ["pprof.scope.sample_type_order", "semconv", "development", "int[]", null], + ["process.args_count", "semconv", "release_candidate", "int", null], + ["process.command", "semconv", "release_candidate", "string", null], + ["process.command_args", "semconv", "release_candidate", "string[]", null], + ["process.command_line", "semconv", "release_candidate", "string", null], + [ + "process.context_switch_type", + "semconv", + "development", + "enum", + ["renamed", ["process.context_switch.type"]], + ], + ["process.context_switch.type", "semconv", "release_candidate", "enum", null], + ["process.cpu.state", "semconv", "development", "enum", ["renamed", ["cpu.mode"]]], + ["process.creation.time", "semconv", "release_candidate", "string", null], + ["process.environment_variable", "semconv", "release_candidate", "template[string]", null], + ["process.executable.build_id.gnu", "semconv", "release_candidate", "string", null], + ["process.executable.build_id.go", "semconv", "release_candidate", "string", null], + ["process.executable.build_id.htlhash", "semconv", "release_candidate", "string", null], + [ + "process.executable.build_id.profiling", + "semconv", + "development", + "string", + ["renamed", ["process.executable.build_id.htlhash"]], + ], + ["process.executable.name", "semconv", "release_candidate", "string", null], + ["process.executable.path", "semconv", "release_candidate", "string", null], + ["process.exit.code", "semconv", "release_candidate", "int", null], + ["process.exit.time", "semconv", "release_candidate", "string", null], + ["process.group_leader.pid", "semconv", "release_candidate", "int", null], + ["process.interactive", "semconv", "release_candidate", "boolean", null], + ["process.linux.cgroup", "semconv", "release_candidate", "string", null], + ["process.owner", "semconv", "release_candidate", "string", null], + [ + "process.paging.fault_type", + "semconv", + "development", + "enum", + ["renamed", ["system.paging.fault.type"]], + ], + ["process.parent_pid", "semconv", "release_candidate", "int", null], + ["process.pid", "semconv", "release_candidate", "int", null], + ["process.real_user.id", "semconv", "release_candidate", "int", null], + ["process.real_user.name", "semconv", "release_candidate", "string", null], + ["process.runtime.description", "semconv", "release_candidate", "string", null], + ["process.runtime.name", "semconv", "release_candidate", "string", null], + ["process.runtime.version", "semconv", "release_candidate", "string", null], + ["process.saved_user.id", "semconv", "release_candidate", "int", null], + ["process.saved_user.name", "semconv", "release_candidate", "string", null], + ["process.session_leader.pid", "semconv", "release_candidate", "int", null], + ["process.state", "semconv", "release_candidate", "enum", null], + ["process.title", "semconv", "release_candidate", "string", null], + ["process.user.id", "semconv", "release_candidate", "int", null], + ["process.user.name", "semconv", "release_candidate", "string", null], + ["process.vpid", "semconv", "release_candidate", "int", null], + ["process.working_directory", "semconv", "release_candidate", "string", null], + ["profile.frame.type", "semconv", "development", "enum", null], + [ + "rpc.connect_rpc.error_code", + "semconv", + "development", + "enum", + ["renamed", ["rpc.response.status_code"]], + ], + [ + "rpc.connect_rpc.request.metadata", + "semconv", + "development", + "template[string[]]", + ["renamed", ["rpc.request.metadata"]], + ], + [ + "rpc.connect_rpc.response.metadata", + "semconv", + "development", + "template[string[]]", + ["renamed", ["rpc.response.metadata"]], + ], + [ + "rpc.grpc.request.metadata", + "semconv", + "development", + "template[string[]]", + ["renamed", ["rpc.request.metadata"]], + ], + [ + "rpc.grpc.response.metadata", + "semconv", + "development", + "template[string[]]", + ["renamed", ["rpc.response.metadata"]], + ], + [ + "rpc.grpc.status_code", + "semconv", + "development", + "enum", + ["uncategorized", ["rpc.response.status_code"]], + ], + [ + "rpc.jsonrpc.error_code", + "semconv", + "development", + "int", + ["uncategorized", ["rpc.response.status_code"]], + ], + ["rpc.jsonrpc.error_message", "semconv", "development", "string", ["uncategorized", []]], + ["rpc.jsonrpc.request_id", "semconv", "development", "string", ["renamed", ["jsonrpc.request.id"]]], + ["rpc.jsonrpc.version", "semconv", "development", "string", ["renamed", ["jsonrpc.protocol.version"]]], + ["rpc.message.compressed_size", "semconv", "development", "int", ["obsoleted", []]], + ["rpc.message.id", "semconv", "development", "int", ["obsoleted", []]], + ["rpc.message.type", "semconv", "development", "enum", ["obsoleted", []]], + ["rpc.message.uncompressed_size", "semconv", "development", "int", ["obsoleted", []]], + ["rpc.method", "semconv", "release_candidate", "string", null], + ["rpc.method_original", "semconv", "release_candidate", "string", null], + ["rpc.request.metadata", "semconv", "development", "template[string[]]", null], + ["rpc.response.metadata", "semconv", "development", "template[string[]]", null], + ["rpc.response.status_code", "semconv", "release_candidate", "string", null], + ["rpc.service", "semconv", "development", "string", ["uncategorized", ["rpc.method"]]], + ["rpc.system", "semconv", "development", "enum", ["renamed", ["rpc.system.name"]]], + ["rpc.system.name", "semconv", "release_candidate", "enum", null], + ["security_rule.category", "semconv", "development", "string", null], + ["security_rule.description", "semconv", "development", "string", null], + ["security_rule.license", "semconv", "development", "string", null], + ["security_rule.name", "semconv", "development", "string", null], + ["security_rule.reference", "semconv", "development", "string", null], + ["security_rule.ruleset.name", "semconv", "development", "string", null], + ["security_rule.uuid", "semconv", "development", "string", null], + ["security_rule.version", "semconv", "development", "string", null], + ["server.address", "semconv", "stable", "string", null], + ["server.port", "semconv", "stable", "int", null], + ["service.criticality", "semconv", "alpha", "enum", null], + ["service.instance.id", "semconv", "stable", "string", null], + ["service.name", "semconv", "stable", "string", null], + ["service.namespace", "semconv", "stable", "string", null], + ["service.peer.name", "semconv", "development", "string", null], + ["service.peer.namespace", "semconv", "development", "string", null], + ["service.version", "semconv", "stable", "string", null], + ["session.id", "semconv", "development", "string", null], + ["session.previous_id", "semconv", "development", "string", null], + ["signalr.connection.status", "semconv", "stable", "enum", null], + ["signalr.transport", "semconv", "stable", "enum", null], + ["source.address", "semconv", "development", "string", null], + ["source.port", "semconv", "development", "int", null], + ["state", "semconv", "development", "enum", ["renamed", ["db.client.connection.state"]]], + ["system.cpu.logical_number", "semconv", "development", "int", ["renamed", ["cpu.logical_number"]]], + ["system.cpu.state", "semconv", "development", "enum", ["renamed", ["cpu.mode"]]], + ["system.device", "semconv", "development", "string", null], + ["system.filesystem.mode", "semconv", "development", "string", null], + ["system.filesystem.mountpoint", "semconv", "development", "string", null], + ["system.filesystem.state", "semconv", "development", "enum", null], + ["system.filesystem.type", "semconv", "development", "enum", null], + ["system.memory.linux.hugepages.state", "semconv", "development", "enum", null], + ["system.memory.linux.slab.state", "semconv", "development", "enum", null], + ["system.memory.state", "semconv", "development", "enum", null], + ["system.network.state", "semconv", "development", "enum", ["renamed", ["network.connection.state"]]], + ["system.paging.direction", "semconv", "development", "enum", null], + ["system.paging.fault.type", "semconv", "release_candidate", "enum", null], + ["system.paging.state", "semconv", "development", "enum", null], + ["system.paging.type", "semconv", "development", "enum", ["renamed", ["system.paging.fault.type"]]], + ["system.process.status", "semconv", "development", "enum", ["renamed", ["process.state"]]], + ["system.processes.status", "semconv", "development", "enum", ["renamed", ["process.state"]]], + ["telemetry.distro.name", "semconv", "stable", "string", null], + ["telemetry.distro.version", "semconv", "stable", "string", null], + ["telemetry.sdk.language", "semconv", "stable", "enum", null], + ["telemetry.sdk.name", "semconv", "stable", "string", null], + ["telemetry.sdk.version", "semconv", "stable", "string", null], + ["test.case.name", "semconv", "development", "string", null], + ["test.case.result.status", "semconv", "development", "enum", null], + ["test.suite.name", "semconv", "development", "string", null], + ["test.suite.run.status", "semconv", "development", "enum", null], + ["thread.id", "semconv", "development", "int", null], + ["thread.name", "semconv", "development", "string", null], + ["tls.cipher", "semconv", "development", "string", null], + ["tls.client.certificate", "semconv", "development", "string", null], + ["tls.client.certificate_chain", "semconv", "development", "string[]", null], + ["tls.client.hash.md5", "semconv", "development", "string", null], + ["tls.client.hash.sha1", "semconv", "development", "string", null], + ["tls.client.hash.sha256", "semconv", "development", "string", null], + ["tls.client.issuer", "semconv", "development", "string", null], + ["tls.client.ja3", "semconv", "development", "string", null], + ["tls.client.not_after", "semconv", "development", "string", null], + ["tls.client.not_before", "semconv", "development", "string", null], + ["tls.client.server_name", "semconv", "development", "string", ["renamed", ["server.address"]]], + ["tls.client.subject", "semconv", "development", "string", null], + ["tls.client.supported_ciphers", "semconv", "development", "string[]", null], + ["tls.curve", "semconv", "development", "string", null], + ["tls.established", "semconv", "development", "boolean", null], + ["tls.next_protocol", "semconv", "development", "string", null], + ["tls.protocol.name", "semconv", "development", "enum", null], + ["tls.protocol.version", "semconv", "development", "string", null], + ["tls.resumed", "semconv", "development", "boolean", null], + ["tls.server.certificate", "semconv", "development", "string", null], + ["tls.server.certificate_chain", "semconv", "development", "string[]", null], + ["tls.server.hash.md5", "semconv", "development", "string", null], + ["tls.server.hash.sha1", "semconv", "development", "string", null], + ["tls.server.hash.sha256", "semconv", "development", "string", null], + ["tls.server.issuer", "semconv", "development", "string", null], + ["tls.server.ja3s", "semconv", "development", "string", null], + ["tls.server.not_after", "semconv", "development", "string", null], + ["tls.server.not_before", "semconv", "development", "string", null], + ["tls.server.subject", "semconv", "development", "string", null], + ["url.domain", "semconv", "development", "string", null], + ["url.extension", "semconv", "development", "string", null], + ["url.fragment", "semconv", "stable", "string", null], + ["url.full", "semconv", "stable", "string", null], + ["url.original", "semconv", "development", "string", null], + ["url.path", "semconv", "stable", "string", null], + ["url.port", "semconv", "development", "int", null], + ["url.query", "semconv", "stable", "string", null], + ["url.registered_domain", "semconv", "development", "string", null], + ["url.scheme", "semconv", "stable", "string", null], + ["url.subdomain", "semconv", "development", "string", null], + ["url.template", "semconv", "development", "string", null], + ["url.top_level_domain", "semconv", "development", "string", null], + ["user_agent.name", "semconv", "development", "string", null], + ["user_agent.original", "semconv", "stable", "string", null], + ["user_agent.os.name", "semconv", "development", "string", null], + ["user_agent.os.version", "semconv", "development", "string", null], + ["user_agent.synthetic.type", "semconv", "development", "enum", null], + ["user_agent.version", "semconv", "development", "string", null], + ["user.email", "semconv", "development", "string", null], + ["user.full_name", "semconv", "development", "string", null], + ["user.hash", "semconv", "development", "string", null], + ["user.id", "semconv", "development", "string", null], + ["user.name", "semconv", "development", "string", null], + ["user.roles", "semconv", "development", "string[]", null], + ["v8js.gc.type", "semconv", "development", "enum", null], + ["v8js.heap.space.name", "semconv", "development", "enum", null], + ["v8js.resource.type", "semconv", "development", "enum", null], + ["vcs.change.id", "semconv", "release_candidate", "string", null], + ["vcs.change.state", "semconv", "release_candidate", "enum", null], + ["vcs.change.title", "semconv", "release_candidate", "string", null], + ["vcs.line_change.type", "semconv", "release_candidate", "enum", null], + ["vcs.owner.name", "semconv", "release_candidate", "string", null], + ["vcs.provider.name", "semconv", "release_candidate", "enum", null], + ["vcs.ref.base.name", "semconv", "release_candidate", "string", null], + ["vcs.ref.base.revision", "semconv", "release_candidate", "string", null], + ["vcs.ref.base.type", "semconv", "release_candidate", "enum", null], + ["vcs.ref.head.name", "semconv", "release_candidate", "string", null], + ["vcs.ref.head.revision", "semconv", "release_candidate", "string", null], + ["vcs.ref.head.type", "semconv", "release_candidate", "enum", null], + ["vcs.ref.type", "semconv", "release_candidate", "enum", null], + ["vcs.repository.change.id", "semconv", "development", "string", ["renamed", ["vcs.change.id"]]], + ["vcs.repository.change.title", "semconv", "development", "string", ["renamed", ["vcs.change.title"]]], + ["vcs.repository.name", "semconv", "release_candidate", "string", null], + ["vcs.repository.ref.name", "semconv", "development", "string", ["renamed", ["vcs.ref.head.name"]]], + [ + "vcs.repository.ref.revision", + "semconv", + "development", + "string", + ["renamed", ["vcs.ref.head.revision"]], + ], + ["vcs.repository.ref.type", "semconv", "development", "enum", ["renamed", ["vcs.ref.head.type"]]], + ["vcs.repository.url.full", "semconv", "release_candidate", "string", null], + ["vcs.revision_delta.direction", "semconv", "release_candidate", "enum", null], + ["webengine.description", "semconv", "development", "string", null], + ["webengine.name", "semconv", "development", "string", null], + ["webengine.version", "semconv", "development", "string", null], + ["zos.smf.id", "semconv", "development", "string", null], + ["zos.sysplex.name", "semconv", "development", "string", null], +] + +/** Keys an earlier snapshot had and the registry since dropped: `[id, registry, lastSeenVersion]`. */ +export const REMOVED_ATTRIBUTES: ReadonlyArray = [ + ["gen_ai.token.type", "genai", "2026-09-01"], +] diff --git a/lib/semconv/src/index.ts b/lib/semconv/src/index.ts new file mode 100644 index 000000000..beff83049 --- /dev/null +++ b/lib/semconv/src/index.ts @@ -0,0 +1,15 @@ +// OpenTelemetry semantic-conventions registry lookups: which attribute keys are +// current, which are deprecated and what replaced them, across the main +// registry and the separate GenAI registry. Data only, no runtime dependencies. + +export { + REGISTRY_VERSIONS, + attributeStatus, + canonicalKey, + definitions, + isRegistryKey, + legacyKeys, + type AttributeDefinition, + type AttributeStatus, +} from "./registry.ts" +export type { DeprecationReason, RegistryName } from "./types.ts" diff --git a/lib/semconv/src/registry.test.ts b/lib/semconv/src/registry.test.ts new file mode 100644 index 000000000..daf3c0afe --- /dev/null +++ b/lib/semconv/src/registry.test.ts @@ -0,0 +1,97 @@ +import { describe, expect, it } from "vitest" +import { attributeStatus, canonicalKey, isRegistryKey, legacyKeys, REGISTRY_VERSIONS } from "./index.ts" + +describe("attributeStatus", () => { + it("reports a live key as current", () => { + expect(attributeStatus("http.request.method")).toMatchObject({ + kind: "current", + definition: { registry: "semconv", stability: "stable" }, + }) + }) + + it("reports a renamed key with its successor", () => { + expect(attributeStatus("http.method")).toMatchObject({ + kind: "deprecated", + successors: ["http.request.method"], + definition: { deprecation: { reason: "renamed" } }, + }) + }) + + // The replacement is only named in the note's prose for these. + it("reads a successor out of an uncategorized deprecation note", () => { + expect(attributeStatus("gen_ai.system")).toMatchObject({ + kind: "deprecated", + successors: ["gen_ai.provider.name"], + }) + expect(attributeStatus("rpc.grpc.status_code")).toMatchObject({ + kind: "deprecated", + successors: ["rpc.response.status_code"], + }) + }) + + // semconv v1.44.0 moved gen_ai.* to its own registry and left deprecated stubs. + it("treats a key that moved to the GenAI registry as current", () => { + expect(attributeStatus("gen_ai.request.model")).toMatchObject({ + kind: "moved", + definition: { registry: "genai" }, + }) + }) + + it("reports an obsoleted key with no successor", () => { + expect(attributeStatus("http.flavor")).toMatchObject({ kind: "deprecated" }) + }) + + it("resolves keys under a template attribute", () => { + expect(attributeStatus("http.request.header.x-request-id")).toMatchObject({ + kind: "current", + definition: { id: "http.request.header" }, + }) + }) + + it("remembers keys the registry dropped without a deprecation", () => { + expect(attributeStatus("gen_ai.token.type")).toEqual({ + kind: "removed", + registry: "genai", + lastSeenVersion: "2026-09-01", + }) + }) + + it("reports vendor and application keys as unknown", () => { + expect(attributeStatus("maple.org_id")).toEqual({ kind: "unknown" }) + expect(isRegistryKey("maple.org_id")).toBe(false) + expect(isRegistryKey("http.method")).toBe(true) + }) +}) + +describe("canonicalKey", () => { + it("follows renames to the live key", () => { + expect(canonicalKey("db.system")).toBe("db.system.name") + expect(canonicalKey("deployment.environment")).toBe("deployment.environment.name") + expect(canonicalKey("peer.service")).toBe("service.peer.name") + }) + + it("leaves current, unknown and successor-less keys alone", () => { + expect(canonicalKey("db.system.name")).toBe("db.system.name") + expect(canonicalKey("maple.org_id")).toBe("maple.org_id") + expect(canonicalKey("http.flavor")).toBe("http.flavor") + }) +}) + +describe("legacyKeys", () => { + it("lists every deprecated spelling that resolves to a key", () => { + expect(legacyKeys("http.request.method")).toContain("http.method") + expect(legacyKeys("db.system.name")).toContain("db.system") + expect(legacyKeys("maple.org_id")).toEqual([]) + }) + + it("never lists a key as its own legacy spelling", () => { + expect(legacyKeys("db.system.name")).not.toContain("db.system.name") + }) +}) + +describe("snapshot", () => { + it("records the registry versions it was taken at", () => { + expect(REGISTRY_VERSIONS.semconv).toMatch(/^\d+\.\d+\.\d+$/) + expect(REGISTRY_VERSIONS.genai).toMatch(/^\d{4}-\d{2}-\d{2}$/) + }) +}) diff --git a/lib/semconv/src/registry.ts b/lib/semconv/src/registry.ts new file mode 100644 index 000000000..4acae41ba --- /dev/null +++ b/lib/semconv/src/registry.ts @@ -0,0 +1,138 @@ +import { ATTRIBUTES, REGISTRY_VERSIONS, REMOVED_ATTRIBUTES } from "./generated/registry.ts" +import type { DeprecationReason, RegistryName } from "./types.ts" + +export { REGISTRY_VERSIONS } + +export interface AttributeDefinition { + readonly id: string + readonly registry: RegistryName + readonly stability: string + readonly type: string + /** Set when the definition is deprecated; `successors` may be empty (obsoleted) or plural (split). */ + readonly deprecation?: { + readonly reason: DeprecationReason + readonly successors: ReadonlyArray + } +} + +/** + * What the registries say about one attribute key. + * + * - `current`: a live definition, directly or through a template such as + * `http.request.header.`. + * - `moved`: the semantic conventions deprecated it as "moved" while the GenAI + * registry defines it live under the same id. Current; nothing to change. + * - `deprecated`: no live definition anywhere. `successors` names the + * replacement(s); empty means the key was obsoleted with none. + * - `removed`: an earlier snapshot had it and the registry dropped it silently. + * - `unknown`: in neither registry, e.g. a vendor or application key. + */ +export type AttributeStatus = + | { readonly kind: "current"; readonly definition: AttributeDefinition } + | { readonly kind: "moved"; readonly definition: AttributeDefinition } + | { + readonly kind: "deprecated" + readonly definition: AttributeDefinition + readonly successors: ReadonlyArray + } + | { readonly kind: "removed"; readonly registry: RegistryName; readonly lastSeenVersion: string } + | { readonly kind: "unknown" } + +const definitionsById = new Map() +const templates: AttributeDefinition[] = [] +for (const [id, registry, stability, type, deprecation] of ATTRIBUTES) { + const definition: AttributeDefinition = { + id, + registry, + stability, + type, + ...(deprecation + ? { deprecation: { reason: deprecation[0], successors: deprecation[1] } } + : undefined), + } + const existing = definitionsById.get(id) + if (existing) existing.push(definition) + else definitionsById.set(id, [definition]) + if (type.startsWith("template[") && !deprecation) templates.push(definition) +} +// Longest prefix first, so `a.b.` wins over `a.`. +templates.sort((a, b) => b.id.length - a.id.length) + +const removedById = new Map( + REMOVED_ATTRIBUTES.map(([id, registry, lastSeenVersion]) => [id, { registry, lastSeenVersion }]), +) + +/** Every definition of `key` across both registries, live ones first. */ +export function definitions(key: string): ReadonlyArray { + const found = definitionsById.get(key) ?? [] + return [...found].sort( + (a, b) => Number(a.deprecation !== undefined) - Number(b.deprecation !== undefined), + ) +} + +export function attributeStatus(key: string): AttributeStatus { + const found = definitions(key) + const live = found.find((d) => d.deprecation === undefined) + if (live) { + const movedStub = found.some((d) => d.deprecation !== undefined && d.registry !== live.registry) + return { kind: movedStub ? "moved" : "current", definition: live } + } + // Checked before the deprecation: a "moved to GenAI" stub whose GenAI + // definition was later dropped is gone, not merely deprecated. + const removed = removedById.get(key) + if (removed) return { kind: "removed", ...removed } + const deprecated = found[0] + if (deprecated?.deprecation) { + return { kind: "deprecated", definition: deprecated, successors: deprecated.deprecation.successors } + } + const template = templates.find((t) => key.startsWith(`${t.id}.`)) + if (template) return { kind: "current", definition: template } + return { kind: "unknown" } +} + +/** True when either registry defines `key`, live or deprecated, directly or by template. */ +export function isRegistryKey(key: string): boolean { + const status = attributeStatus(key) + return status.kind !== "unknown" && status.kind !== "removed" +} + +/** + * The live key `key` should be written as today. Follows single-successor + * deprecations to the end of the chain; a key that is current, unknown, + * obsoleted or split between several successors is returned unchanged. + */ +export function canonicalKey(key: string): string { + let current = key + const visited = new Set() + while (!visited.has(current)) { + visited.add(current) + const status = attributeStatus(current) + if (status.kind !== "deprecated" || status.successors.length !== 1) return current + const [next] = status.successors + if (next === undefined) return current + current = next + } + return current +} + +let legacyIndex: Map | undefined + +/** + * Every deprecated key whose {@link canonicalKey} is `key`, sorted. These are + * the spellings a reader has to accept next to `key` for data from older + * instrumentation. + */ +export function legacyKeys(key: string): ReadonlyArray { + if (!legacyIndex) { + legacyIndex = new Map() + for (const id of definitionsById.keys()) { + const canonical = canonicalKey(id) + if (canonical === id) continue + const list = legacyIndex.get(canonical) + if (list) list.push(id) + else legacyIndex.set(canonical, [id]) + } + for (const list of legacyIndex.values()) list.sort() + } + return legacyIndex.get(key) ?? [] +} diff --git a/lib/semconv/src/types.ts b/lib/semconv/src/types.ts new file mode 100644 index 000000000..f49fc4e40 --- /dev/null +++ b/lib/semconv/src/types.ts @@ -0,0 +1,15 @@ +export type RegistryName = "semconv" | "genai" + +export type DeprecationReason = "renamed" | "obsoleted" | "uncategorized" + +/** `[id, registry, stability, type, deprecation]`; `deprecation` is `[reason, successors]`. */ +export type GeneratedAttribute = readonly [ + id: string, + registry: RegistryName, + stability: string, + type: string, + deprecation: readonly [reason: DeprecationReason, successors: ReadonlyArray] | null, +] + +/** `[id, registry, lastSeenVersion]` for a key the registry dropped. */ +export type GeneratedRemovedAttribute = readonly [id: string, registry: RegistryName, lastSeenVersion: string] diff --git a/lib/semconv/tsconfig.json b/lib/semconv/tsconfig.json new file mode 100644 index 000000000..e2408d93c --- /dev/null +++ b/lib/semconv/tsconfig.json @@ -0,0 +1,17 @@ +{ + "include": ["**/*.ts", "**/*.tsx"], + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "types": ["node"], + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + "skipLibCheck": true, + "strict": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + } +}