diff --git a/.chloggen/1112.yaml b/.chloggen/1112.yaml
new file mode 100644
index 0000000000..454aa19d76
--- /dev/null
+++ b/.chloggen/1112.yaml
@@ -0,0 +1,4 @@
+change_type: enhancement
+component: messaging
+note: Define span kind for unspecified cases of messaging `publish` and `process` spans.
+issues: [1112]
diff --git a/.chloggen/1302.yaml b/.chloggen/1302.yaml
new file mode 100644
index 0000000000..4f2cc12296
--- /dev/null
+++ b/.chloggen/1302.yaml
@@ -0,0 +1,4 @@
+change_type: enhancement
+component: docs
+note: Add note on tooling limitations for attribute names and enforce name format.
+issues: [1124]
diff --git a/.chloggen/1330.yaml b/.chloggen/1330.yaml
new file mode 100644
index 0000000000..ec0d7fb8ee
--- /dev/null
+++ b/.chloggen/1330.yaml
@@ -0,0 +1,4 @@
+change_type: enhancement
+component: az, db
+note: Define `db.operation.name` values for Cosmos DB, declare `az.namespace` attribute and add proper reference to it.
+issues: [1330]
diff --git a/.chloggen/2921.yaml b/.chloggen/2921.yaml
new file mode 100644
index 0000000000..e26eb173a4
--- /dev/null
+++ b/.chloggen/2921.yaml
@@ -0,0 +1,30 @@
+# Use this changelog template to create an entry for release notes.
+#
+# If your change doesn't affect end users you should instead start
+# your pull request title with [chore] or use the "Skip Changelog" label.
+
+# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
+change_type: enhancement
+
+# The name of the area of concern in the attributes-registry, (e.g. http, cloud, db)
+component: other
+
+# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
+note: Update resource to include stability in the YAML file
+
+# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists.
+# The values here must be integers.
+issues: [1399]
+
+# (Optional) One or more lines of additional information to render under the primary note.
+# These lines will be padded with 2 spaces and then inserted directly into the document.
+# Use pipe (|) for multiline entries.
+subtext: |
+ Makes the following changes:
+
+ - Require `name` on resource groups.
+ - Enforce backwards compatibility stability requirements on resource groups.
+ - Rename `telemetry` to `telemetry.sdk`, attributes are unchanged.
+ - Mark `telemetry.sdk` and `resource` as stable in YAML model.
+ - Markdown templates for resource groups NOW includes header describing
+ the reosurce `type`, `stability` and `description`.
diff --git a/.chloggen/add_container_csi_attributes.yaml b/.chloggen/add_container_csi_attributes.yaml
new file mode 100644
index 0000000000..8bcfe8a961
--- /dev/null
+++ b/.chloggen/add_container_csi_attributes.yaml
@@ -0,0 +1,7 @@
+change_type: enhancement
+component: container
+note: >-
+ Add CSI (Container Storage Interface) attributes:
+ `container.csi.plugin.name` and `container.csi.volume.id`.
+issues: [1119]
+subtext:
diff --git a/.chloggen/add_filesystem_limit.yaml b/.chloggen/add_filesystem_limit.yaml
new file mode 100755
index 0000000000..36228d7da0
--- /dev/null
+++ b/.chloggen/add_filesystem_limit.yaml
@@ -0,0 +1,22 @@
+# Use this changelog template to create an entry for release notes.
+#
+# If your change doesn't affect end users you should instead start
+# your pull request title with [chore] or use the "Skip Changelog" label.
+
+# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
+change_type: 'enhancement'
+
+# The name of the area of concern in the attributes-registry, (e.g. http, cloud, db)
+component: system
+
+# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
+note: Add the `system.filesystem.limit` metric
+
+# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists.
+# The values here must be integers.
+issues: [127]
+
+# (Optional) One or more lines of additional information to render under the primary note.
+# These lines will be padded with 2 spaces and then inserted directly into the document.
+# Use pipe (|) for multiline entries.
+subtext:
diff --git a/.chloggen/add_k8s_memory_usage.yaml b/.chloggen/add_k8s_memory_usage.yaml
new file mode 100755
index 0000000000..a57b9d7f42
--- /dev/null
+++ b/.chloggen/add_k8s_memory_usage.yaml
@@ -0,0 +1,22 @@
+# Use this changelog template to create an entry for release notes.
+#
+# If your change doesn't affect end users you should instead start
+# your pull request title with [chore] or use the "Skip Changelog" label.
+
+# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
+change_type: enhancement
+
+# The name of the area of concern in the attributes-registry, (e.g. http, cloud, db)
+component: k8s
+
+# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
+note: Add k8s.pod.memory usage and k8s.node.memory.usage metrics
+
+# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists.
+# The values here must be integers.
+issues: [1406]
+
+# (Optional) One or more lines of additional information to render under the primary note.
+# These lines will be padded with 2 spaces and then inserted directly into the document.
+# Use pipe (|) for multiline entries.
+subtext:
diff --git a/.chloggen/add_lookup_for_os.yaml b/.chloggen/add_lookup_for_os.yaml
new file mode 100644
index 0000000000..8c709d0de0
--- /dev/null
+++ b/.chloggen/add_lookup_for_os.yaml
@@ -0,0 +1,22 @@
+# Use this changelog template to create an entry for release notes.
+#
+# If your change doesn't affect end users you should instead start
+# your pull request title with [chore] or use the "Skip Changelog" label.
+
+# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
+change_type: enhancement
+
+# The name of the area of concern in the attributes-registry, (e.g. http, cloud, db)
+component: os
+
+# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
+note: add lookup for os.build_id
+
+# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists.
+# The values here must be integers.
+issues: [1318]
+
+# (Optional) One or more lines of additional information to render under the primary note.
+# These lines will be padded with 2 spaces and then inserted directly into the document.
+# Use pipe (|) for multiline entries.
+subtext:
diff --git a/.chloggen/add_system_disk_limit.yaml b/.chloggen/add_system_disk_limit.yaml
new file mode 100755
index 0000000000..51d8b29b17
--- /dev/null
+++ b/.chloggen/add_system_disk_limit.yaml
@@ -0,0 +1,22 @@
+# Use this changelog template to create an entry for release notes.
+#
+# If your change doesn't affect end users you should instead start
+# your pull request title with [chore] or use the "Skip Changelog" label.
+
+# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
+change_type: 'enhancement'
+
+# The name of the area of concern in the attributes-registry, (e.g. http, cloud, db)
+component: system
+
+# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
+note: Add the `system.disk.limit` metric
+
+# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists.
+# The values here must be integers.
+issues: [127]
+
+# (Optional) One or more lines of additional information to render under the primary note.
+# These lines will be padded with 2 spaces and then inserted directly into the document.
+# Use pipe (|) for multiline entries.
+subtext:
diff --git a/.chloggen/clr-runtime.yaml b/.chloggen/clr-runtime.yaml
new file mode 100644
index 0000000000..ecad868a1c
--- /dev/null
+++ b/.chloggen/clr-runtime.yaml
@@ -0,0 +1,22 @@
+# Use this changelog template to create an entry for release notes.
+#
+# If your change doesn't affect end users you should instead start
+# your pull request title with [chore] or use the "Skip Changelog" label.
+
+# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
+change_type: new_component
+
+# The name of the area of concern in the attributes-registry, (e.g. http, cloud, db)
+component: dotnet
+
+# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
+note: Adds experimental metrics for the .NET Common Language Runtime (CLR)."
+
+# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists.
+# The values here must be integers.
+issues: [956]
+
+# (Optional) One or more lines of additional information to render under the primary note.
+# These lines will be padded with 2 spaces and then inserted directly into the document.
+# Use pipe (|) for multiline entries.
+subtext:
diff --git a/.chloggen/file_leftovers.yaml b/.chloggen/file_leftovers.yaml
new file mode 100755
index 0000000000..099d6d9e3c
--- /dev/null
+++ b/.chloggen/file_leftovers.yaml
@@ -0,0 +1,22 @@
+# Use this changelog template to create an entry for release notes.
+#
+# If your change doesn't affect end users you should instead start
+# your pull request title with [chore] or use the "Skip Changelog" label.
+
+# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
+change_type: enhancement
+
+# The name of the area of concern in the attributes-registry, (e.g. http, cloud, db)
+component: file
+
+# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
+note: Add additional attributes from ECS to the `file` namespace.
+
+# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists.
+# The values here must be integers.
+issues: [914]
+
+# (Optional) One or more lines of additional information to render under the primary note.
+# These lines will be padded with 2 spaces and then inserted directly into the document.
+# Use pipe (|) for multiline entries.
+subtext:
diff --git a/.chloggen/fix-deprecated-messaging-servicebus.yaml b/.chloggen/fix-deprecated-messaging-servicebus.yaml
new file mode 100755
index 0000000000..996b4a4deb
--- /dev/null
+++ b/.chloggen/fix-deprecated-messaging-servicebus.yaml
@@ -0,0 +1,4 @@
+change_type: 'bug_fix'
+component: messaging
+note: Fix deprecated note for service bus attributes
+issues: [1418]
diff --git a/.chloggen/messaging-parent-child-trace.yaml b/.chloggen/messaging-parent-child-trace.yaml
new file mode 100755
index 0000000000..6cf1fd1c10
--- /dev/null
+++ b/.chloggen/messaging-parent-child-trace.yaml
@@ -0,0 +1,4 @@
+change_type: enhancement
+component: messaging
+note: Clarify the possibility to have a parent-child trace structure in messaging conventions
+issues: [1282]
diff --git a/.chloggen/process-build_id.yaml b/.chloggen/process-build_id.yaml
new file mode 100755
index 0000000000..c59e5fc7bb
--- /dev/null
+++ b/.chloggen/process-build_id.yaml
@@ -0,0 +1,22 @@
+# Use this changelog template to create an entry for release notes.
+#
+# If your change doesn't affect end users you should instead start
+# your pull request title with [chore] or use the "Skip Changelog" label.
+
+# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
+change_type: enhancement
+
+# The name of the area of concern in the attributes-registry, (e.g. http, cloud, db)
+component: process
+
+# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
+note: Extend process.executable with build_id attributes.
+
+# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists.
+# The values here must be integers.
+issues: [1329]
+
+# (Optional) One or more lines of additional information to render under the primary note.
+# These lines will be padded with 2 spaces and then inserted directly into the document.
+# Use pipe (|) for multiline entries.
+subtext: For correct symbolization it is important to uniquely identify executables.
diff --git a/.chloggen/profiles-convention.yaml b/.chloggen/profiles-convention.yaml
new file mode 100755
index 0000000000..d778733484
--- /dev/null
+++ b/.chloggen/profiles-convention.yaml
@@ -0,0 +1,22 @@
+# Use this changelog template to create an entry for release notes.
+#
+# If your change doesn't affect end users you should instead start
+# your pull request title with [chore] or use the "Skip Changelog" label.
+
+# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
+change_type: new_component
+
+# The name of the area of concern in the attributes-registry, (e.g. http, cloud, db)
+component: profile
+
+# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
+note: Introduce semantic convention for OTel Profiles.
+
+# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists.
+# The values here must be integers.
+issues: [1188]
+
+# (Optional) One or more lines of additional information to render under the primary note.
+# These lines will be padded with 2 spaces and then inserted directly into the document.
+# Use pipe (|) for multiline entries.
+subtext:
diff --git a/.chloggen/updete_host.id_lookup.yaml b/.chloggen/updete_host.id_lookup.yaml
new file mode 100644
index 0000000000..133269633e
--- /dev/null
+++ b/.chloggen/updete_host.id_lookup.yaml
@@ -0,0 +1,22 @@
+# Use this changelog template to create an entry for release notes.
+#
+# If your change doesn't affect end users you should instead start
+# your pull request title with [chore] or use the "Skip Changelog" label.
+
+# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
+change_type: enhancement
+
+# The name of the area of concern in the attributes-registry, (e.g. http, cloud, db)
+component: host
+
+# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
+note: update lookup for os.build_id
+
+# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists.
+# The values here must be integers.
+issues: [1396]
+
+# (Optional) One or more lines of additional information to render under the primary note.
+# These lines will be padded with 2 spaces and then inserted directly into the document.
+# Use pipe (|) for multiline entries.
+subtext:
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 7e4202ff76..140af28811 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -16,82 +16,74 @@
* @open-telemetry/specs-semconv-maintainers @open-telemetry/specs-semconv-approvers
# Schemas and schema file tooling
-/schemas/ @open-telemetry/specs-semconv-approvers @tigrannajaryan
-/internal/tools/schema_check.sh @open-telemetry/specs-semconv-approvers @tigrannajaryan
+/schemas/ @open-telemetry/specs-semconv-approvers @tigrannajaryan
+/internal/tools/schema_check.sh @open-telemetry/specs-semconv-approvers @tigrannajaryan
-# Logs semantic conventions
-/model/logs/ @open-telemetry/specs-semconv-approvers @tigrannajaryan
+# Logs and events semantic conventions
/docs/exceptions/exceptions-logs.md @open-telemetry/specs-semconv-approvers @tigrannajaryan
/docs/feature-flags/feature-flags-logs.md @open-telemetry/specs-semconv-approvers @tigrannajaryan
/docs/general/events-general.md @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-event-approvers @tigrannajaryan
/docs/general/logs-general.md @open-telemetry/specs-semconv-approvers @tigrannajaryan
/docs/logs/ @open-telemetry/specs-semconv-approvers @tigrannajaryan
+/model/log/ @open-telemetry/specs-semconv-approvers @tigrannajaryan
+/model/event/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-event-approvers
-# JVM semantic conventions approvers
-/model/metrics/jvm-* @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-jvm-approvers
-/docs/jvm/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-jvm-approvers
+# JVM semantic conventions
+/docs/jvm/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-jvm-approvers
+/model/jvm/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-jvm-approvers
-# HTTP semantic conventions approvers
-/model/metrics/http.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-http-approvers
-/model/trace/http.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-http-approvers
-/model/registry/http.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-http-approvers
-/model/registry/server.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-http-approvers
-/model/registry/client.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-http-approvers
-/model/registry/network.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-http-approvers @open-telemetry/semconv-security-approvers
-/model/registry/error.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-http-approvers
-/model/registry/url.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-http-approvers
-/model/registry/user-agent.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-http-approvers
-/docs/http/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-http-approvers
+# HTTP semantic conventions
+/docs/http/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-http-approvers
+/model/http/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-http-approvers
+/model/error/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-http-approvers
+/model/client/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-http-approvers
+/model/network/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-http-approvers @open-telemetry/semconv-security-approvers
+/model/server/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-http-approvers
+/model/url/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-http-approvers
+/model/user-agent/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-http-approvers
-# System semantic conventions approvers
-/docs/system/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-system-approvers
-/model/metrics/system-* @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-system-approvers
-/docs/resource/host.md @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-system-approvers
-/model/resource/host.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-system-approvers
+# System semantic conventions
+/docs/system/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-system-approvers
+/docs/resource/host.md @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-system-approvers
+/model/host/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-system-approvers
+/model/system/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-system-approvers
-# Mobile semantic conventions approvers
-/docs/mobile/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-mobile-approvers
-/model/logs/mobile* @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-mobile-approvers
+# Mobile semantic conventions
+/docs/mobile/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-mobile-approvers
+/model/device/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-mobile-approvers
-# K8s semantic conventions approvers
-/docs/resource/k8s.md @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-k8s-approvers
-/model/resource/k8s.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-k8s-approvers
-/model/registry/k8s.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-k8s-approvers
+# K8s semantic conventions
+/docs/resource/k8s.md @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-k8s-approvers
+/model/k8s/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-k8s-approvers
-# Container semantic conventions approvers
-/docs/resource/container.md @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-container-approvers
-/model/resource/container.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-container-approvers
-/model/registry/container.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-container-approvers
-/model/registry/oci.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-container-approvers
+# Container semantic conventions
+/docs/resource/container.md @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-container-approvers
+/model/container/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-container-approvers
+/model/oci/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-container-approvers
-# .NET semantic conventions approvers
-/model/metrics/dotnet/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-dotnet-approver @open-telemetry/semconv-http-approvers
-/model/registry/aspnetcore.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-dotnet-approver @open-telemetry/semconv-http-approvers
-/model/registry/signalr.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-dotnet-approver @open-telemetry/semconv-http-approvers
-/docs/dotnet/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-dotnet-approver @open-telemetry/semconv-http-approvers
+# .NET semantic conventions
+/docs/dotnet/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-dotnet-approver @open-telemetry/semconv-http-approvers
+/docs/runtime/dotnet-metrics.md @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-dotnet-approver
+/model/aspnetcore/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-dotnet-approver @open-telemetry/semconv-http-approvers
+/model/dotnet/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-dotnet-approver @open-telemetry/semconv-http-approvers
+/model/signalr/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-dotnet-approver @open-telemetry/semconv-http-approvers
-# Gen-AI semantic conventions approvers
-/model/registry/gen-ai.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-llm-approvers
-/model/metrics/gen-ai.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-llm-approvers
-/model/trace/gen-ai.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-llm-approvers
-/docs/gen-ai/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-llm-approvers
+# Gen-AI semantic conventions
+/docs/gen-ai/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-llm-approvers
+/model/gen-ai/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-llm-approvers
-# Security semantic conventions approvers
-/model/registry/file.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-security-approvers
-/model/registry/dns.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-security-approvers
-/model/registry/process.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-security-approvers
-/model/registry/tls.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-security-approvers
-/model/registry/user.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-security-approvers
+# Security semantic conventions
+/model/dns/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-security-approvers
+/model/file/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-security-approvers
+# /model/network/ is defined in HTTP section
+/model/process/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-security-approvers
+/model/tls/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-security-approvers
+/model/user/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-security-approvers
-/model/metrics/dns.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-security-approvers
-/model/metrics/process-metrics.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-security-approvers
-/model/resource/process.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-security-approvers
-/model/network.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-security-approvers
-
-# CICD semantic conventions approvers
-/model/registry/artifact.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-cicd-approvers
-/model/registry/cicd.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-cicd-approvers
-/model/registry/code.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-cicd-approvers
-/model/registry/deployment.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-cicd-approvers
-/model/registry/test.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-cicd-approvers
-/model/registry/vcs.yaml @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-cicd-approvers
+# CICD semantic conventions
+/model/artifact/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-cicd-approvers
+/model/cicd/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-cicd-approvers
+/model/code/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-cicd-approvers
+/model/deployment/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-cicd-approvers
+/model/test/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-cicd-approvers
+/model/vcs/ @open-telemetry/specs-semconv-approvers @open-telemetry/semconv-cicd-approvers
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml
index ef601a5b8e..d0efd84320 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yaml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yaml
@@ -39,6 +39,7 @@ body:
- area:device
- area:disk
- area:dns
+ - area:dotnet
- area:error
- area:event
- area:exception
@@ -66,6 +67,7 @@ body:
- area:otel
- area:peer
- area:process
+ - area:profile
- area:rpc
- area:server
- area:service
@@ -78,8 +80,8 @@ body:
- area:thread
- area:tls
- area:url
- - area:user-agent
- area:user
+ - area:user-agent
- area:v8js
- area:vcs
- area:webengine
diff --git a/.github/ISSUE_TEMPLATE/change_proposal.yaml b/.github/ISSUE_TEMPLATE/change_proposal.yaml
index d2a5bca98c..206cc1c715 100644
--- a/.github/ISSUE_TEMPLATE/change_proposal.yaml
+++ b/.github/ISSUE_TEMPLATE/change_proposal.yaml
@@ -31,6 +31,7 @@ body:
- area:device
- area:disk
- area:dns
+ - area:dotnet
- area:error
- area:event
- area:exception
@@ -58,6 +59,7 @@ body:
- area:otel
- area:peer
- area:process
+ - area:profile
- area:rpc
- area:server
- area:service
@@ -70,8 +72,8 @@ body:
- area:thread
- area:tls
- area:url
- - area:user-agent
- area:user
+ - area:user-agent
- area:v8js
- area:vcs
- area:webengine
diff --git a/.github/ISSUE_TEMPLATE/new-conventions.yaml b/.github/ISSUE_TEMPLATE/new-conventions.yaml
index 610edd03cb..1c9cfe8ef9 100644
--- a/.github/ISSUE_TEMPLATE/new-conventions.yaml
+++ b/.github/ISSUE_TEMPLATE/new-conventions.yaml
@@ -40,6 +40,7 @@ body:
- area:device
- area:disk
- area:dns
+ - area:dotnet
- area:error
- area:event
- area:exception
@@ -67,6 +68,7 @@ body:
- area:otel
- area:peer
- area:process
+ - area:profile
- area:rpc
- area:server
- area:service
@@ -79,8 +81,8 @@ body:
- area:thread
- area:tls
- area:url
- - area:user-agent
- area:user
+ - area:user-agent
- area:v8js
- area:vcs
- area:webengine
diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml
index ceaf8ef7f6..024f8309b2 100644
--- a/.github/workflows/checks.yml
+++ b/.github/workflows/checks.yml
@@ -86,13 +86,6 @@ jobs:
make attribute-registry-generation
git diff --exit-code './docs/attributes-registry/*.md' || (echo 'Attribute registry markdown is out of date, please run "make attribute-registry-generation" and commit the changes in this PR.' && exit 1)
- semantic-conventions-compatibility:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v1
- - name: verify semantic convention compatibility with latest released version
- run: make compatibility-check
-
schemas-check:
runs-on: ubuntu-latest
steps:
@@ -115,3 +108,18 @@ jobs:
- uses: actions/checkout@v1
- name: verify semantic conventions yaml definitions
run: make check-policies
+
+ polices-test:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v1
+ - name: verify semantic conventions yaml definitions
+ run: make test-policies
+
+ # TODO: Remove this once policies-check is the only enforcement on github.
+ semantic-conventions-compatibility:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v1
+ - name: verify semantic convention compatibility with latest released version
+ run: make compatibility-check
diff --git a/.github/workflows/generate-registry-area-labels.yml b/.github/workflows/generate-registry-area-labels.yml
index 58f3b62b3a..1b8ea3a59d 100644
--- a/.github/workflows/generate-registry-area-labels.yml
+++ b/.github/workflows/generate-registry-area-labels.yml
@@ -3,9 +3,10 @@ on:
push:
branches: [main]
paths:
- - model/registry/**
+ - model/**
- ./.github/workflows/generate-registry-area-labels.yml
- ./.github/workflows/scripts/generate-registry-area-labels.sh
+
workflow_dispatch:
jobs:
@@ -14,6 +15,9 @@ jobs:
if: ${{ github.repository_owner == 'open-telemetry' }}
steps:
- uses: actions/checkout@v4
+ - name: Generate registry area labels
+ run: |
+ make generate-gh-issue-templates
- name: Run update permissions
run: chmod +x ./.github/workflows/scripts/generate-registry-area-labels.sh
diff --git a/.github/workflows/scripts/generate-registry-area-labels.sh b/.github/workflows/scripts/generate-registry-area-labels.sh
old mode 100755
new mode 100644
index 3a2af777e6..63621a04dd
--- a/.github/workflows/scripts/generate-registry-area-labels.sh
+++ b/.github/workflows/scripts/generate-registry-area-labels.sh
@@ -12,21 +12,19 @@
set -euo pipefail
CUR_DIRECTORY=$(dirname "$0")
-AREAS=$(sh "${CUR_DIRECTORY}/get-registry-areas.sh")
+AREAS=$1
echo -e "\nStarting to create area labels"
echo -e "--------------------------------\n"
-for AREA in ${AREAS}; do
- LABEL_NAME=$(basename "${AREA}" .yaml)
-
- if (( "${#LABEL_NAME}" > 50 )); then
- echo "'${LABEL_NAME}' exceeds GitHubs 50-character limit on labels, skipping"
+while IFS= read -r label; do
+ if (( "${#label}" > 50 )); then
+ echo -e "Label $label exceeds GitHubs 50-character limit on labels, skipping"
continue
fi
- echo "area:${LABEL_NAME}"
- gh label create "area:${LABEL_NAME}" -c "#425cc7" --force
-done
+ echo "$label"
+ gh label create "$label" -c "#425cc7" --force
+done < ${AREAS}
echo -e "\nLabels created successfully"
echo -e "--------------------------------\n"
diff --git a/.github/workflows/scripts/get-registry-areas.sh b/.github/workflows/scripts/get-registry-areas.sh
deleted file mode 100755
index b4fd8b6e18..0000000000
--- a/.github/workflows/scripts/get-registry-areas.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/env bash
-#
-# Copyright The OpenTelemetry Authors
-# SPDX-License-Identifier: Apache-2.0
-#
-# Get a list of the semantic conventions areas from the registry.
-
-CUR_DIRECTORY=$(dirname "$0")
-REPO_DIR="$( cd "$CUR_DIRECTORY/../../../" && pwd )"
-REGISTRY_DIR="$( cd "$REPO_DIR/model/registry" && pwd )"
-
-
-for entry in $(ls $REGISTRY_DIR | egrep '\.yaml$' | sort)
-do
- echo "$entry"
-done
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 7741a3e1f5..1a42dbf20a 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -10,7 +10,7 @@
"MD040": false,
},
"yaml.schemas": {
- "https://raw.githubusercontent.com/open-telemetry/build-tools/v0.24.0/semantic-conventions/semconv.schema.json": [
+ "https://raw.githubusercontent.com/open-telemetry/weaver/v0.9.2/schemas/semconv.schema.json": [
"model/**/*.yaml"
]
},
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 7a3637ee9a..27a66ed954 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -15,6 +15,7 @@ requirements and recommendations.
- [How to Contribute](#how-to-contribute)
- [Prerequisites](#prerequisites)
- [1. Modify the YAML model](#1-modify-the-yaml-model)
+ - [Code structure](#code-structure)
- [Schema files](#schema-files)
- [2. Update the markdown files](#2-update-the-markdown-files)
- [Hugo frontmatter](#hugo-frontmatter)
@@ -90,9 +91,41 @@ environment configured:
### 1. Modify the YAML model
Refer to the
-[Semantic Convention YAML Language](https://github.com/open-telemetry/build-tools/blob/v0.25.0/semantic-conventions/syntax.md)
+[Semantic Convention YAML Language](https://github.com/open-telemetry/weaver/blob/main/schemas/semconv-syntax.md)
to learn how to make changes to the YAML files.
+#### Code structure
+
+The YAML (model definition) and Markdown (documentation) files are organized in the following way:
+
+```
+├── docs
+│ ├── attribute_registry
+│ ├── {root-namespace}
+│ │ ├── README.md
+│ │ ├── ....md
+├── model
+│ ├── {root-namespace}
+│ │ ├── events.yaml
+│ │ ├── metrics.yaml
+│ │ ├── registry.yaml
+│ │ ├── resources.yaml
+│ │ ├── spans.yaml
+```
+
+All attributes must be defined in the folder matching their root namespace under
+`/{root-namespace}/*registry.yaml` file.
+
+Corresponding markdown files are auto-generated (see [Update the markdown files](#2-update-the-markdown-files))
+in `/docs/attribute_registry` folder.
+
+All semantic conventions definitions for telemetry signals should be placed under
+`/model/{root-namespace}` and should follow `*{signal}.yaml` pattern. For example,
+HTTP spans are defined in `model/http/spans.yaml`.
+
+YAML definitions could be broken down into multiple files. For example, AWS spans
+are defined in `/model/aws/lambda-spans.yaml` and `/model/aws/sdk-spans.yaml` files.
+
#### Schema files
When making changes to existing semantic conventions (attributes, metrics, etc)
@@ -188,8 +221,8 @@ During the release process, all `./.chloggen/*.yaml` files are transcribed into
1. Create an entry file using `make chlog-new`. The command generates a new file,
with its name based on the current branch (e.g. `./.chloggen/my-feature-xyz.yaml`)
2. Fill in all the fields in the generated file
-3. The value for the `component` field MUST match a filename (without type) in the
- [registry](https://github.com/open-telemetry/semantic-conventions/tree/main/model/registry)
+3. The value for the `component` field MUST match a folder name in the
+ [model](https://github.com/open-telemetry/semantic-conventions/tree/main/model) directory
(e.g. `browser`, `http`)
4. Run `make chlog-validate` to ensure the new file is valid
5. Commit and push the file
@@ -310,14 +343,14 @@ make markdown-link-check
### Version compatibility check
-Semantic conventions are validated for backward compatibility with last released versions. Here's [the full list of compatibility checks](https://github.com/open-telemetry/build-tools/blob/main/semantic-conventions/README.md#version-compatibility-check).
+Semantic conventions are validated for backward compatibility with last released versions. Here's [the full list of compatibility checks](./policies/compatibility.rego).
Removing attributes, metrics, or enum members is not allowed, they should be deprecated instead.
It applies to stable and experimental conventions and prevents semantic conventions auto-generated libraries from introducing breaking changes.
-You can run backward compatibility check in all yaml files with the following command:
+You can run backward compatibility check (along with other policies) in all yaml files with the following command:
```bash
-make compatibility-check
+make check-policies
```
## Updating the referenced specification version
diff --git a/Makefile b/Makefile
index 9976671c68..3f9eba31c4 100644
--- a/Makefile
+++ b/Makefile
@@ -19,11 +19,6 @@ CHLOGGEN_BINARY=bin/chloggen
CHLOGGEN = $(TOOLS_DIR)/$(CHLOGGEN_BINARY)
CHLOGGEN_CONFIG := .chloggen/config.yaml
-# see https://github.com/open-telemetry/build-tools/releases for semconvgen updates
-# Keep links in model/README.md and .vscode/settings.json in sync!
-SEMCONVGEN_VERSION=0.25.0
-WEAVER_VERSION=0.7.0
-
# From where to resolve the containers (e.g. "otel/weaver").
CONTAINER_REPOSITORY=docker.io
@@ -32,8 +27,14 @@ WEAVER_CONTAINER_REPOSITORY=$(CONTAINER_REPOSITORY)
SEMCONVGEN_CONTAINER_REPOSITORY=$(CONTAINER_REPOSITORY)
# Fully qualified references to containers used in this Makefile.
-WEAVER_CONTAINER=$(WEAVER_CONTAINER_REPOSITORY)/otel/weaver:$(WEAVER_VERSION)
-SEMCONVGEN_CONTAINER=$(SEMCONVGEN_CONTAINER_REPOSITORY)/otel/semconvgen:$(SEMCONVGEN_VERSION)
+# These are parsed from dependencies.Dockerfile so dependabot will autoupdate
+# the versions of docker files we use.
+WEAVER_CONTAINER=$(shell cat dependencies.Dockerfile | awk '$$4=="weaver" {print $$2}')
+SEMCONVGEN_CONTAINER=$(shell cat dependencies.Dockerfile | awk '$$4=="semconvgen" {print $$2}')
+OPA_CONTAINER=$(shell cat dependencies.Dockerfile | awk '$$4=="opa" {print $$2}')
+
+DOCKER_USER=$(shell id -u):$(shell id -g)
+
# TODO: add `yamllint` step to `all` after making sure it works on Mac.
.PHONY: all
@@ -111,74 +112,51 @@ install-yamllint:
yamllint:
yamllint .
-# Check semantic convention policies on YAML files
-.PHONY: check-policies
-check-policies:
- docker run --rm -v $(PWD)/model:/source -v $(PWD)/policies:/policies -v $(PWD)/templates:/templates \
- otel/weaver:${WEAVER_VERSION} registry check \
- --registry=/source \
- --diagnostic-format=ansi \
- --policy=/policies/registry.rego
-
-# Test rego policies
-.PHONY: test-policies
-test-policies:
- docker run --rm -v $(PWD)/policies:/policies openpolicyagent/opa:0.67.1 test --explain fails /policies
-
# Generate markdown tables from YAML definitions
.PHONY: table-generation
table-generation:
- docker run --rm -v $(PWD)/model:/source -v $(PWD)/docs:/spec -v $(PWD)/templates:/weaver/templates \
+ docker run --rm \
+ -u $(DOCKER_USER) \
+ --mount 'type=bind,source=$(PWD)/templates,target=/home/weaver/templates,readonly' \
+ --mount 'type=bind,source=$(PWD)/model,target=/home/weaver/source,readonly' \
+ --mount 'type=bind,source=$(PWD)/docs,target=/home/weaver/target' \
$(WEAVER_CONTAINER) registry update-markdown \
- --registry=/source \
+ --registry=/home/weaver/source \
--attribute-registry-base-url=/docs/attributes-registry \
- --templates=/weaver/templates \
+ --templates=/home/weaver/templates \
--target=markdown \
- /spec
+ /home/weaver/target
# Generate attribute registry markdown.
.PHONY: attribute-registry-generation
attribute-registry-generation:
- docker run --rm -v $(PWD)/model:/source -v $(PWD)/docs:/spec -v $(PWD)/templates:/weaver/templates \
+ docker run --rm \
+ -u $(DOCKER_USER) \
+ --mount 'type=bind,source=$(PWD)/templates,target=/home/weaver/templates,readonly' \
+ --mount 'type=bind,source=$(PWD)/model,target=/home/weaver/source,readonly' \
+ --mount 'type=bind,source=$(PWD)/docs,target=/home/weaver/target' \
$(WEAVER_CONTAINER) registry generate \
- --registry=/source \
- --templates=/weaver/templates \
+ --registry=/home/weaver/source \
+ --templates=/home/weaver/templates \
markdown \
- /spec/attributes-registry/
+ /home/weaver/target/attributes-registry/
npm run fix:format
# Check if current markdown tables differ from the ones that would be generated from YAML definitions (weaver).
.PHONY: table-check
table-check:
- docker run --rm -v $(PWD)/model:/source -v $(PWD)/docs:/spec -v $(PWD)/templates:/weaver/templates \
+ docker run --rm \
+ --mount 'type=bind,source=$(PWD)/templates,target=/home/weaver/templates,readonly' \
+ --mount 'type=bind,source=$(PWD)/model,target=/home/weaver/source,readonly' \
+ --mount 'type=bind,source=$(PWD)/docs,target=/home/weaver/target,readonly' \
$(WEAVER_CONTAINER) registry update-markdown \
- --registry=/source \
+ --registry=/home/weaver/target \
--attribute-registry-base-url=/docs/attributes-registry \
- --templates=/weaver/templates \
+ --templates=/home/weaver/templates \
--target=markdown \
--dry-run \
/spec
-
-# A previous iteration of calculating "LATEST_RELEASED_SEMCONV_VERSION"
-# relied on "git describe". However, that approach does not work with
-# light-weight developer forks/branches that haven't synced tags. Hence the
-# more complex implementation of this using "git ls-remote".
-#
-# The output of "git ls-remote" looks something like this:
-#
-# e531541025992b68177a68b87628c5dc75c4f7d9 refs/tags/v1.21.0
-# cadfe53949266d33476b15ca52c92f682600a29c refs/tags/v1.22.0
-# ...
-#
-# .. which is why some additional processing is required to extract the
-# latest version number and strip off the "v" prefix.
-LATEST_RELEASED_SEMCONV_VERSION := $(shell git ls-remote --tags https://github.com/open-telemetry/semantic-conventions.git | cut -f 2 | sort --reverse | head -n 1 | tr '/' ' ' | cut -d ' ' -f 3 | $(SED) 's/v//g')
-.PHONY: compatibility-check
-compatibility-check:
- docker run --rm -v $(PWD)/model:/source -v $(PWD)/docs:/spec --pull=always \
- $(SEMCONVGEN_CONTAINER) -f /source compatibility --previous-version $(LATEST_RELEASED_SEMCONV_VERSION)
-
.PHONY: schema-check
schema-check:
$(TOOLS_DIR)/schema_check.sh
@@ -232,13 +210,57 @@ chlog-update: $(CHLOGGEN)
# files that have the "area" dropdown field
.PHONY: generate-gh-issue-templates
generate-gh-issue-templates:
- $(TOOLS_DIR)/scripts/update-issue-template-areas.sh
+ mkdir -p $(TOOLS_DIR)/bin
+ docker run --rm \
+ -u $(id -u ${USER}):$(id -g ${USER}) \
+ --mount 'type=bind,source=$(PWD)/internal/tools/scripts,target=/home/weaver/templates,readonly' \
+ --mount 'type=bind,source=$(PWD)/model,target=/home/weaver/source,readonly' \
+ --mount 'type=bind,source=$(TOOLS_DIR)/bin,target=/home/weaver/target' \
+ $(WEAVER_CONTAINER) registry generate \
+ --registry=/home/weaver/source \
+ --templates=/home/weaver/templates \
+ --config=/home/weaver/templates/registry/areas-weaver.yaml \
+ . \
+ /home/weaver/target
+ $(TOOLS_DIR)/scripts/update-issue-template-areas.sh $(PWD)/internal/tools/bin/areas.txt
+# A previous iteration of calculating "LATEST_RELEASED_SEMCONV_VERSION"
+# relied on "git describe". However, that approach does not work with
+# light-weight developer forks/branches that haven't synced tags. Hence the
+# more complex implementation of this using "git ls-remote".
+#
+# The output of "git ls-remote" looks something like this:
+#
+# e531541025992b68177a68b87628c5dc75c4f7d9 refs/tags/v1.21.0
+# cadfe53949266d33476b15ca52c92f682600a29c refs/tags/v1.22.0
+# ...
+#
+# .. which is why some additional processing is required to extract the
+# latest version number and strip off the "v" prefix.
+LATEST_RELEASED_SEMCONV_VERSION := $(shell git ls-remote --tags https://github.com/open-telemetry/semantic-conventions.git | cut -f 2 | sort --reverse | head -n 1 | tr '/' ' ' | cut -d ' ' -f 3 | $(SED) 's/v//g')
.PHONY: check-policies
check-policies:
- docker run --rm -v $(PWD)/model:/source -v $(PWD)/docs:/spec -v $(PWD)/policies:/policies \
- otel/weaver:${WEAVER_VERSION} registry check \
- --registry=/source \
- --policy=/policies/registry.rego \
- --policy=/policies/attribute_name_collisions.rego \
- --policy=/policies/yaml_schema.rego
+ docker run --rm \
+ --mount 'type=bind,source=$(PWD)/policies,target=/home/weaver/policies,readonly' \
+ --mount 'type=bind,source=$(PWD)/model,target=/home/weaver/source,readonly' \
+ ${WEAVER_CONTAINER} registry check \
+ --registry=/home/weaver/source \
+ --baseline-registry=https://github.com/open-telemetry/semantic-conventions/archive/refs/tags/v$(LATEST_RELEASED_SEMCONV_VERSION).zip[model] \
+ --policy=/home/weaver/policies
+
+# Test rego policies
+.PHONY: test-policies
+test-policies:
+ docker run --rm -v $(PWD)/policies:/policies -v $(PWD)/policies_test:/policies_test \
+ ${OPA_CONTAINER} test \
+ --var-values \
+ --explain fails \
+ /policies \
+ /policies_test
+
+# TODO: This is now duplicative with weaver policy checks. We can remove
+# once github action requirements are updated.
+.PHONY: compatibility-check
+compatibility-check:
+ docker run --rm -v $(PWD)/model:/source -v $(PWD)/docs:/spec --pull=always \
+ $(SEMCONVGEN_CONTAINER) --continue-on-validation-errors -f /source compatibility --previous-version $(LATEST_RELEASED_SEMCONV_VERSION)
diff --git a/dependencies.Dockerfile b/dependencies.Dockerfile
new file mode 100644
index 0000000000..9423ce0749
--- /dev/null
+++ b/dependencies.Dockerfile
@@ -0,0 +1,13 @@
+# DO NOT BUILD
+# This file is just for tracking dependencies of the semantic convention build.
+# Dependabot can keep this file up to date with latest containers.
+
+# Weaver is used to generate markdown docs, and enforce policies on the model.
+FROM otel/weaver:v0.10.0 AS weaver
+
+# OPA is used to test policies enforced by weaver.
+FROM openpolicyagent/opa:0.68.0 AS opa
+
+# Semconv gen is used for backwards compatibility checks.
+# TODO(jsuereth): Remove this when no longer used.
+FROM otel/semconvgen:0.25.0 AS semconvgen
diff --git a/docs/attributes-registry/README.md b/docs/attributes-registry/README.md
index 119a6c1437..b5688cac23 100644
--- a/docs/attributes-registry/README.md
+++ b/docs/attributes-registry/README.md
@@ -50,6 +50,7 @@ Currently, the following namespaces exist:
- [Device](device.md)
- [Disk](disk.md)
- [Dns](dns.md)
+- [Dotnet](dotnet.md)
- [Enduser](enduser.md)
- [Error](error.md)
- [Event](event.md)
@@ -79,6 +80,7 @@ Currently, the following namespaces exist:
- [OTel](otel.md)
- [Peer](peer.md)
- [Process](process.md)
+- [Profile](profile.md)
- [RPC](rpc.md)
- [Server](server.md)
- [Service](service.md)
diff --git a/docs/attributes-registry/android.md b/docs/attributes-registry/android.md
index a8c442da77..f9d57b0c34 100644
--- a/docs/attributes-registry/android.md
+++ b/docs/attributes-registry/android.md
@@ -21,9 +21,9 @@ The Android platform on which the Android application is running.
This document defines attributes that represents an occurrence of a lifecycle transition on the Android platform.
-| Attribute | Type | Description | Examples | Stability |
-| --------------- | ------ | -------------------------------------------------------------------------------------------------------------------- | ------------------------------------- | ---------------------------------------------------------------- |
-| `android.state` | string | Deprecated use the `device.app.lifecycle` event definition including `android.state` as a payload field instead. [1] | `created`; `background`; `foreground` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| Attribute | Type | Description | Examples | Stability |
+| --------------- | ------ | -------------------------------------------------------------------------------------------------------------------- | ------------------------------------- | -------------------------------------------------------------------------------------------------- |
+| `android.state` | string | Deprecated use the `device.app.lifecycle` event definition including `android.state` as a payload field instead. [1] | `created`; `background`; `foreground` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `device.app.lifecycle`. |
**[1]:** The Android lifecycle states are defined in [Activity lifecycle callbacks](https://developer.android.com/guide/components/activities/activity-lifecycle#lc), and from which the `OS identifiers` are derived.
diff --git a/docs/attributes-registry/azure.md b/docs/attributes-registry/azure.md
index 95dbf95a15..4f4a1f385e 100644
--- a/docs/attributes-registry/azure.md
+++ b/docs/attributes-registry/azure.md
@@ -10,6 +10,7 @@
This document defines generic attributes for Azure SDK.
-| Attribute | Type | Description | Examples | Stability |
-| ----------------------- | ------ | ----------------------------------------------------------------------------------------------------------------- | -------------------------------------- | ---------------------------------------------------------------- |
-| `az.service_request_id` | string | The unique identifier of the service request. It's generated by the Azure service and returned with the response. | `00000000-0000-0000-0000-000000000000` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| Attribute | Type | Description | Examples | Stability |
+| ----------------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | ---------------------------------------------------------------- |
+| `az.namespace` | string | [Azure Resource Provider Namespace](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-services-resource-providers) as recognized by the client. | `Microsoft.Storage`; `Microsoft.KeyVault`; `Microsoft.ServiceBus` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `az.service_request_id` | string | The unique identifier of the service request. It's generated by the Azure service and returned with the response. | `00000000-0000-0000-0000-000000000000` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
diff --git a/docs/attributes-registry/cloud.md b/docs/attributes-registry/cloud.md
index b9d7936a43..1a9cb6625e 100644
--- a/docs/attributes-registry/cloud.md
+++ b/docs/attributes-registry/cloud.md
@@ -10,14 +10,14 @@
A cloud environment (e.g. GCP, Azure, AWS).
-| Attribute | Type | Description | Examples | Stability |
-| ------------------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- |
-| `cloud.account.id` | string | The cloud account ID the resource is assigned to. | `111111111111`; `opentelemetry` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `cloud.availability_zone` | string | Cloud regions often have multiple, isolated locations known as zones to increase availability. Availability zone represents the zone where the resource is running. [1] | `us-east-1c` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `cloud.platform` | string | The cloud platform in use. [2] | `alibaba_cloud_ecs`; `alibaba_cloud_fc`; `alibaba_cloud_openshift` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `cloud.provider` | string | Name of the cloud provider. | `alibaba_cloud`; `aws`; `azure` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `cloud.region` | string | The geographical region the resource is running. [3] | `us-central1`; `us-east-1` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `cloud.resource_id` | string | Cloud provider-specific native identifier of the monitored cloud resource (e.g. an [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) on AWS, a [fully qualified resource ID](https://learn.microsoft.com/rest/api/resources/resources/get-by-id) on Azure, a [full resource name](https://cloud.google.com/apis/design/resource_names#full_resource_name) on GCP) [4] | `arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function`; `//run.googleapis.com/projects/PROJECT_ID/locations/LOCATION_ID/services/SERVICE_ID`; `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| Attribute | Type | Description | Examples | Stability |
+| ------------------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- |
+| `cloud.account.id` | string | The cloud account ID the resource is assigned to. | `111111111111`; `opentelemetry` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `cloud.availability_zone` | string | Cloud regions often have multiple, isolated locations known as zones to increase availability. Availability zone represents the zone where the resource is running. [1] | `us-east-1c` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `cloud.platform` | string | The cloud platform in use. [2] | `alibaba_cloud_ecs`; `alibaba_cloud_fc`; `alibaba_cloud_openshift` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `cloud.provider` | string | Name of the cloud provider. | `alibaba_cloud`; `aws`; `azure` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `cloud.region` | string | The geographical region the resource is running. [3] | `us-central1`; `us-east-1` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `cloud.resource_id` | string | Cloud provider-specific native identifier of the monitored cloud resource (e.g. an [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) on AWS, a [fully qualified resource ID](https://learn.microsoft.com/rest/api/resources/resources/get-by-id) on Azure, a [full resource name](https://cloud.google.com/apis/design/resource_names#full_resource_name) on GCP) [4] | `arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function`; `//run.googleapis.com/projects/PROJECT_ID/locations/LOCATION_ID/services/SERVICE_ID`; `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
**[1]:** Availability zones are called "zones" on Alibaba Cloud and Google Cloud.
@@ -39,7 +39,7 @@ The following well-known definitions MUST be used if you set this attribute and
- **GCP:** The [URI of the resource](https://cloud.google.com/iam/docs/full-resource-names)
- **Azure:** The [Fully Qualified Resource ID](https://docs.microsoft.com/rest/api/resources/resources/get-by-id) of the invoked function,
_not_ the function app, having the form
- `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/`.
+ `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/`.
This means that a span attribute MUST be used, as an Azure function app can host multiple functions that would usually share
a TracerProvider.
diff --git a/docs/attributes-registry/container.md b/docs/attributes-registry/container.md
index 187f973818..f1606c3160 100644
--- a/docs/attributes-registry/container.md
+++ b/docs/attributes-registry/container.md
@@ -16,12 +16,14 @@ A container instance.
| Attribute | Type | Description | Examples | Stability |
| ------------------------------ | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- |
| `container.command` | string | The command used to run the container (i.e. the command name). [1] | `otelcontribcol` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `container.command_args` | string[] | All the command arguments (including the command/executable itself) run by the container. [2] | `["otelcontribcol", "--config", "config.yaml"]` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `container.command_line` | string | The full command run by the container as a single string representing the full command. [2] | `otelcontribcol --config config.yaml` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `container.command_args` | string[] | All the command arguments (including the command/executable itself) run by the container. | `["otelcontribcol", "--config", "config.yaml"]` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `container.command_line` | string | The full command run by the container as a single string representing the full command. | `otelcontribcol --config config.yaml` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `container.csi.plugin.name` | string | The name of the CSI ([Container Storage Interface](https://github.com/container-storage-interface/spec)) plugin used by the volume. [2] | `pd.csi.storage.gke.io` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `container.csi.volume.id` | string | The unique volume ID returned by the CSI ([Container Storage Interface](https://github.com/container-storage-interface/spec)) plugin. [3] | `projects/my-gcp-project/zones/my-gcp-zone/disks/my-gcp-disk` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| `container.id` | string | Container ID. Usually a UUID, as for example used to [identify Docker containers](https://docs.docker.com/engine/containers/run/#container-identification). The UUID might be abbreviated. | `a3bf90e006b2` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `container.image.id` | string | Runtime specific image identifier. Usually a hash algorithm followed by a UUID. [2] | `sha256:19c92d0a00d1b66d897bceaa7319bee0dd38a10a851c60bcec9474aa3f01e50f` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `container.image.id` | string | Runtime specific image identifier. Usually a hash algorithm followed by a UUID. [4] | `sha256:19c92d0a00d1b66d897bceaa7319bee0dd38a10a851c60bcec9474aa3f01e50f` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| `container.image.name` | string | Name of the image the container was built on. | `gcr.io/opentelemetry/operator` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `container.image.repo_digests` | string[] | Repo digests of the container image as provided by the container runtime. [3] | `["example@sha256:afcc7f1ac1b49db317a7196c902e61c6c3c4607d63599ee1a82d702d249a0ccb", "internal.registry.example.com:5000/example@sha256:b69959407d21e8a062e0416bf13405bb2b71ed7a84dde4158ebafacfa06f5578"]` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `container.image.repo_digests` | string[] | Repo digests of the container image as provided by the container runtime. [5] | `["example@sha256:afcc7f1ac1b49db317a7196c902e61c6c3c4607d63599ee1a82d702d249a0ccb", "internal.registry.example.com:5000/example@sha256:b69959407d21e8a062e0416bf13405bb2b71ed7a84dde4158ebafacfa06f5578"]` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| `container.image.tags` | string[] | Container image tags. An example can be found in [Docker Image Inspect](https://docs.docker.com/engine/api/v1.43/#tag/Image/operation/ImageInspect). Should be only the `` section of the full name for example from `registry.example.com/my-org/my-image:`. | `["v1.27.1", "3.5.7-0"]` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| `container.label.` | string | Container labels, `` being the label name, the value being the label value. | `container.label.app=nginx` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| `container.name` | string | Container name used by container runtime. | `opentelemetry-autoconf` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -29,11 +31,15 @@ A container instance.
**[1]:** If using embedded credentials or sensitive data, it is recommended to remove them to prevent potential leakage.
-**[2]:** Docker defines a sha256 of the image id; `container.image.id` corresponds to the `Image` field from the Docker container inspect [API](https://docs.docker.com/engine/api/v1.43/#tag/Container/operation/ContainerInspect) endpoint.
+**[2]:** This can sometimes be referred to as a "driver" in CSI implementations. This should represent the `name` field of the GetPluginInfo RPC.
+
+**[3]:** This can sometimes be referred to as a "volume handle" in CSI implementations. This should represent the `Volume.volume_id` field in CSI spec.
+
+**[4]:** Docker defines a sha256 of the image id; `container.image.id` corresponds to the `Image` field from the Docker container inspect [API](https://docs.docker.com/engine/api/v1.43/#tag/Container/operation/ContainerInspect) endpoint.
K8s defines a link to the container registry repository with digest `"imageID": "registry.azurecr.io /namespace/service/dockerfile@sha256:bdeabd40c3a8a492eaf9e8e44d0ebbb84bac7ee25ac0cf8a7159d25f62555625"`.
The ID is assigned by the container runtime and can vary in different environments. Consider using `oci.manifest.digest` if it is important to identify the same image in different environments/runtimes.
-**[3]:** [Docker](https://docs.docker.com/engine/api/v1.43/#tag/Image/operation/ImageInspect) and [CRI](https://github.com/kubernetes/cri-api/blob/c75ef5b473bbe2d0a4fc92f82235efd665ea8e9f/pkg/apis/runtime/v1/api.proto#L1237-L1238) report those under the `RepoDigests` field.
+**[5]:** [Docker](https://docs.docker.com/engine/api/v1.43/#tag/Image/operation/ImageInspect) and [CRI](https://github.com/kubernetes/cri-api/blob/c75ef5b473bbe2d0a4fc92f82235efd665ea8e9f/pkg/apis/runtime/v1/api.proto#L1237-L1238) report those under the `RepoDigests` field.
## Deprecated Container Attributes
diff --git a/docs/attributes-registry/db.md b/docs/attributes-registry/db.md
index dcd113369c..a64d075bac 100644
--- a/docs/attributes-registry/db.md
+++ b/docs/attributes-registry/db.md
@@ -160,7 +160,7 @@ This group defines attributes for Azure Cosmos DB.
| ------------------------------------ | ------ | --------------------------------- | -------------------------------------- | ---------------------------------------------------------------- |
| `db.cosmosdb.client_id` | string | Unique Cosmos client instance id. | `3ba4827d-4422-483f-b59f-85b74211c11d` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| `db.cosmosdb.connection_mode` | string | Cosmos client connection mode. | `gateway`; `direct` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `db.cosmosdb.operation_type` | string | CosmosDB Operation Type. | `Invalid`; `Create`; `Patch` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `db.cosmosdb.operation_type` | string | Cosmos DB Operation Type. | `batch`; `create`; `delete` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| `db.cosmosdb.request_charge` | double | RU consumed for that operation | `46.18`; `1.0` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| `db.cosmosdb.request_content_length` | int | Request payload size in bytes | | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| `db.cosmosdb.status_code` | int | Cosmos DB status code. | `200`; `201` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -175,23 +175,23 @@ This group defines attributes for Azure Cosmos DB.
`db.cosmosdb.operation_type` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used.
-| Value | Description | Stability |
-| ------------------- | ------------------ | ---------------------------------------------------------------- |
-| `Batch` | batch | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `Create` | create | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `Delete` | delete | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `Execute` | execute | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `ExecuteJavaScript` | execute_javascript | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `Head` | head | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `HeadFeed` | head_feed | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `Invalid` | invalid | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `Patch` | patch | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `Query` | query | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `QueryPlan` | query_plan | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `Read` | read | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `ReadFeed` | read_feed | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `Replace` | replace | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `Upsert` | upsert | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| Value | Description | Stability |
+| -------------------- | ------------------ | ---------------------------------------------------------------- |
+| `batch` | batch | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `create` | create | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `delete` | delete | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `execute` | execute | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `execute_javascript` | execute_javascript | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `head` | head | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `head_feed` | head_feed | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `invalid` | invalid | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `patch` | patch | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `query` | query | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `query_plan` | query_plan | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `read` | read | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `read_feed` | read_feed | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `replace` | replace | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `upsert` | upsert | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
## Elasticsearch Attributes
@@ -232,7 +232,7 @@ This group defines attributes for vector databases.
| Attribute | Type | Description | Examples | Stability |
| ------------------------------- | ------ | ------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `db.cassandra.table` | string | Deprecated, use `db.collection.name` instead. | `mytable` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `db.collection.name`. |
-| `db.connection_string` | string | Deprecated, use `server.address`, `server.port` attributes instead. | `Server=(localdb)\v11.0;Integrated Security=true;` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
"Replaced by `server.address` and `server.port`." |
+| `db.connection_string` | string | Deprecated, use `server.address`, `server.port` attributes instead. | `Server=(localdb)\v11.0;Integrated Security=true;` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `server.address` and `server.port`. |
| `db.cosmosdb.container` | string | Deprecated, use `db.collection.name` instead. | `mytable` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `db.collection.name`. |
| `db.elasticsearch.cluster.name` | string | Deprecated, use `db.namespace` instead. | `e9106fc68e3044f0b1475b04bf4ffd5f` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `db.namespace`. |
| `db.instance.id` | string | Deprecated, no general replacement at this time. For Elasticsearch, use `db.elasticsearch.node.name` instead. | `mysql-e26b99z.example.com` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Deprecated, no general replacement at this time. For Elasticsearch, use `db.elasticsearch.node.name` instead. |
diff --git a/docs/attributes-registry/dotnet.md b/docs/attributes-registry/dotnet.md
new file mode 100644
index 0000000000..28acf6e429
--- /dev/null
+++ b/docs/attributes-registry/dotnet.md
@@ -0,0 +1,25 @@
+
+
+
+
+
+# Dotnet
+
+## .NET Attributes
+
+This document defines .NET related attributes.
+
+| Attribute | Type | Description | Examples | Stability |
+| --------------------------- | ------ | ------------------------------------------------------ | ---------------------- | ---------------------------------------------------------------- |
+| `dotnet.gc.heap.generation` | string | Name of the garbage collector managed heap generation. | `gen0`; `gen1`; `gen2` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+`dotnet.gc.heap.generation` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used.
+
+| Value | Description | Stability |
+| ------ | ------------------ | ---------------------------------------------------------------- |
+| `gen0` | Generation 0 | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `gen1` | Generation 1 | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `gen2` | Generation 2 | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `loh` | Large Object Heap | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `poh` | Pinned Object Heap | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
diff --git a/docs/attributes-registry/file.md b/docs/attributes-registry/file.md
index eb9a4140dc..b8cfc67b22 100644
--- a/docs/attributes-registry/file.md
+++ b/docs/attributes-registry/file.md
@@ -10,12 +10,38 @@
Describes file attributes.
-| Attribute | Type | Description | Examples | Stability |
-| ---------------- | ------ | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | ---------------------------------------------------------------- |
-| `file.directory` | string | Directory where the file is located. It should include the drive letter, when appropriate. | `/home/user`; `C:\Program Files\MyApp` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `file.extension` | string | File extension, excluding the leading dot. [1] | `png`; `gz` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `file.name` | string | Name of the file including the extension, without the directory. | `example.png` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `file.path` | string | Full path to the file, including the file name. It should include the drive letter, when appropriate. | `/home/alice/example.png`; `C:\Program Files\MyApp\myapp.exe` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `file.size` | int | File size in bytes. | | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-**[1]:** When the file name has multiple extensions (example.tar.gz), only the last one should be captured ("gz", not "tar.gz").
+| Attribute | Type | Description | Examples | Stability |
+| -------------------------------- | -------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | ---------------------------------------------------------------- |
+| `file.accessed` | string | Time when the file was last accessed, in ISO 8601 format. [1] | `2021-01-01T12:00:00Z` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `file.attributes` | string[] | Array of file attributes. [2] | `["readonly", "hidden"]` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `file.changed` | string | Time when the file attributes or metadata was last changed, in ISO 8601 format. [3] | `2021-01-01T12:00:00Z` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `file.created` | string | Time when the file was created, in ISO 8601 format. [4] | `2021-01-01T12:00:00Z` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `file.directory` | string | Directory where the file is located. It should include the drive letter, when appropriate. | `/home/user`; `C:\Program Files\MyApp` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `file.extension` | string | File extension, excluding the leading dot. [5] | `png`; `gz` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `file.fork_name` | string | Name of the fork. A fork is additional data associated with a filesystem object. [6] | `Zone.Identifer` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `file.group.id` | string | Primary Group ID (GID) of the file. | `1000` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `file.group.name` | string | Primary group name of the file. | `users` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `file.inode` | string | Inode representing the file in the filesystem. | `256383` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `file.mode` | string | Mode of the file in octal representation. | `0640` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `file.modified` | string | Time when the file content was last modified, in ISO 8601 format. | `2021-01-01T12:00:00Z` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `file.name` | string | Name of the file including the extension, without the directory. | `example.png` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `file.owner.id` | string | The user ID (UID) or security identifier (SID) of the file owner. | `1000` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `file.owner.name` | string | Username of the file owner. | `root` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `file.path` | string | Full path to the file, including the file name. It should include the drive letter, when appropriate. | `/home/alice/example.png`; `C:\Program Files\MyApp\myapp.exe` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `file.size` | int | File size in bytes. | | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `file.symbolic_link.target_path` | string | Path to the target of a symbolic link. [7] | `/usr/bin/python3` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+**[1]:** This attribute might not be supported by some file systems — NFS, FAT32, in embedded OS, etc.
+
+**[2]:** Attributes names depend on the OS or file system. Here’s a non-exhaustive list of values expected for this attribute: `archive`, `compressed`, `directory`, `encrypted`, `execute`, `hidden`, `immutable`, `journaled`, `read`, `readonly`, `symbolic link`, `system`, `temporary`, `write`.
+
+**[3]:** `file.changed` captures the time when any of the file's properties or attributes (including the content) are changed, while `file.modified` captures the timestamp when the file content is modified.
+
+**[4]:** This attribute might not be supported by some file systems — NFS, FAT32, in embedded OS, etc.
+
+**[5]:** When the file name has multiple extensions (example.tar.gz), only the last one should be captured ("gz", not "tar.gz").
+
+**[6]:** On Linux, a resource fork is used to store additional data with a filesystem object. A file always has at least one fork for the data portion, and additional forks may exist.
+On NTFS, this is analogous to an Alternate Data Stream (ADS), and the default data stream for a file is just called $DATA. Zone.Identifier is commonly used by Windows to track contents downloaded from the Internet. An ADS is typically of the form: C:\path\to\filename.extension:some_fork_name, and some_fork_name is the value that should populate `fork_name`. `filename.extension` should populate `file.name`, and `extension` should populate `file.extension`. The full path, `file.path`, will include the fork name.
+
+**[7]:** This attribute is only applicable to symbolic links.
diff --git a/docs/attributes-registry/log.md b/docs/attributes-registry/log.md
index c24c22b1ac..262c82c2ee 100644
--- a/docs/attributes-registry/log.md
+++ b/docs/attributes-registry/log.md
@@ -42,7 +42,7 @@ This document defines the generic attributes that may be used in any Log Record.
| Attribute | Type | Description | Examples | Stability |
| --------------------- | ------ | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- |
-| `log.record.original` | string | The complete orignal Log Record. [1] | `77 <86>1 2015-08-06T21:58:59.694Z 192.168.2.133 inactive - - - Something happened`; `[INFO] 8/3/24 12:34:56 Something happened` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `log.record.original` | string | The complete original Log Record. [1] | `77 <86>1 2015-08-06T21:58:59.694Z 192.168.2.133 inactive - - - Something happened`; `[INFO] 8/3/24 12:34:56 Something happened` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| `log.record.uid` | string | A unique identifier for the Log Record. [2] | `01ARZ3NDEKTSV4RRFFQ69G5FAV` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
**[1]:** This value MAY be added when processing a Log Record which was originally transmitted as a string or equivalent data type AND the Body field of the Log Record does not contain the same value. (e.g. a syslog or a log record read from a file.)
diff --git a/docs/attributes-registry/messaging.md b/docs/attributes-registry/messaging.md
index 47fff29b16..396c632efc 100644
--- a/docs/attributes-registry/messaging.md
+++ b/docs/attributes-registry/messaging.md
@@ -180,15 +180,15 @@ This group describes attributes specific to Azure Service Bus.
Describes deprecated messaging attributes.
-| Attribute | Type | Description | Examples | Stability |
-| ---------------------------------------------------- | ------- | ----------------------------------------------------------------------------- | --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `messaging.client_id` | string | Deprecated, use `messaging.client.id` instead. | `client-5`; `myhost@8742@s8083jm` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `messaging.client.id`. |
-| `messaging.destination_publish.anonymous` | boolean | Deprecated, no replacement at this time. | | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
No replacement at this time. |
-| `messaging.destination_publish.name` | string | Deprecated, no replacement at this time. | `MyQueue`; `MyTopic` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
No replacement at this time. |
-| `messaging.eventhubs.consumer.group` | string | Deprecated, use `messaging.consumer.group.name` instead. | `$Default` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `messaging.consumer.group.name`. |
-| `messaging.kafka.consumer.group` | string | Deprecated, use `messaging.consumer.group.name` instead. | `my-group` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `messaging.consumer.group.name`. |
-| `messaging.kafka.destination.partition` | int | Deprecated, use `messaging.destination.partition.id` instead. | `2` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `messaging.destination.partition.id`. |
-| `messaging.kafka.message.offset` | int | Deprecated, use `messaging.kafka.offset` instead. | `42` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `messaging.kafka.offset`. |
-| `messaging.operation` | string | Deprecated, use `messaging.operation.type` instead. | `publish`; `create`; `process` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `messaging.operation.type`. |
-| `messaging.rocketmq.client_group` | string | Deprecated, use `messaging.consumer.group.name` instead. | `myConsumerGroup` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `messaging.consumer.group.name` on the consumer spans. No replacement for producer spans. |
-| `messaging.servicebus.destination.subscription_name` | string | Deprecated, use `messaging.servicebus.destination.subscription_name` instead. | `subscription-a` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `messaging.servicebus.destination.subscription_name`. |
+| Attribute | Type | Description | Examples | Stability |
+| ---------------------------------------------------- | ------- | ------------------------------------------------------------------ | --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `messaging.client_id` | string | Deprecated, use `messaging.client.id` instead. | `client-5`; `myhost@8742@s8083jm` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `messaging.client.id`. |
+| `messaging.destination_publish.anonymous` | boolean | Deprecated, no replacement at this time. | | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
No replacement at this time. |
+| `messaging.destination_publish.name` | string | Deprecated, no replacement at this time. | `MyQueue`; `MyTopic` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
No replacement at this time. |
+| `messaging.eventhubs.consumer.group` | string | Deprecated, use `messaging.consumer.group.name` instead. | `$Default` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `messaging.consumer.group.name`. |
+| `messaging.kafka.consumer.group` | string | Deprecated, use `messaging.consumer.group.name` instead. | `my-group` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `messaging.consumer.group.name`. |
+| `messaging.kafka.destination.partition` | int | Deprecated, use `messaging.destination.partition.id` instead. | `2` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `messaging.destination.partition.id`. |
+| `messaging.kafka.message.offset` | int | Deprecated, use `messaging.kafka.offset` instead. | `42` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `messaging.kafka.offset`. |
+| `messaging.operation` | string | Deprecated, use `messaging.operation.type` instead. | `publish`; `create`; `process` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `messaging.operation.type`. |
+| `messaging.rocketmq.client_group` | string | Deprecated, use `messaging.consumer.group.name` instead. | `myConsumerGroup` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `messaging.consumer.group.name` on the consumer spans. No replacement for producer spans. |
+| `messaging.servicebus.destination.subscription_name` | string | Deprecated, use `messaging.destination.subscription.name` instead. | `subscription-a` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `messaging.destination.subscription.name`. |
diff --git a/docs/attributes-registry/otel.md b/docs/attributes-registry/otel.md
index 07ed204dc1..1a41a578a4 100644
--- a/docs/attributes-registry/otel.md
+++ b/docs/attributes-registry/otel.md
@@ -39,7 +39,7 @@ Attributes used by non-OTLP exporters to represent OpenTelemetry Scope's concept
Describes deprecated otel.library attributes.
-| Attribute | Type | Description | Examples | Stability |
-| ---------------------- | ------ | ----------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------ |
-| `otel.library.name` | string | | `io.opentelemetry.contrib.mongodb` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
use the `otel.scope.name` attribute. |
-| `otel.library.version` | string | | `1.0.0` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
use the `otel.scope.version` attribute. |
+| Attribute | Type | Description | Examples | Stability |
+| ---------------------- | ------ | --------------------------------------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------ |
+| `otel.library.name` | string | Deprecated. Use the `otel.scope.name` attribute | `io.opentelemetry.contrib.mongodb` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Use the `otel.scope.name` attribute. |
+| `otel.library.version` | string | Deprecated. Use the `otel.scope.version` attribute. | `1.0.0` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Use the `otel.scope.version` attribute. |
diff --git a/docs/attributes-registry/process.md b/docs/attributes-registry/process.md
index 9c55c2a4b3..17db6ccaef 100644
--- a/docs/attributes-registry/process.md
+++ b/docs/attributes-registry/process.md
@@ -13,43 +13,46 @@
An operating system process.
-| Attribute | Type | Description | Examples | Stability |
-| ----------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | ---------------------------------------------------------------- |
-| `process.args_count` | int | Length of the process.command_args array [1] | `4` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.command` | string | The command used to launch the process (i.e. the command name). On Linux based systems, can be set to the zeroth string in `proc/[pid]/cmdline`. On Windows, can be set to the first parameter extracted from `GetCommandLineW`. | `cmd/otelcol` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.command_args` | string[] | All the command arguments (including the command/executable itself) as received by the process. On Linux-based systems (and some other Unixoid systems supporting procfs), can be set according to the list of null-delimited strings extracted from `proc/[pid]/cmdline`. For libc-based executables, this would be the full argv vector passed to `main`. | `["cmd/otecol", "--config=config.yaml"]` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.command_line` | string | The full command used to launch the process as a single string representing the full command. On Windows, can be set to the result of `GetCommandLineW`. Do not set this if you have to assemble it just for monitoring; use `process.command_args` instead. | `C:\cmd\otecol --config="my directory\config.yaml"` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.context_switch_type` | string | Specifies whether the context switches for this data point were voluntary or involuntary. | `voluntary`; `involuntary` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.creation.time` | string | The date and time the process was created, in ISO 8601 format. | `2023-11-21T09:25:34.853Z` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.executable.name` | string | The name of the process executable. On Linux based systems, can be set to the `Name` in `proc/[pid]/status`. On Windows, can be set to the base name of `GetProcessImageFileNameW`. | `otelcol` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.executable.path` | string | The full path to the process executable. On Linux based systems, can be set to the target of `proc/[pid]/exe`. On Windows, can be set to the result of `GetProcessImageFileNameW`. | `/usr/bin/cmd/otelcol` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.exit.code` | int | The exit code of the process. | `127` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.exit.time` | string | The date and time the process exited, in ISO 8601 format. | `2023-11-21T09:26:12.315Z` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.group_leader.pid` | int | The PID of the process's group leader. This is also the process group ID (PGID) of the process. | `23` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.interactive` | boolean | Whether the process is connected to an interactive shell. | | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.owner` | string | The username of the user that owns the process. | `root` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.paging.fault_type` | string | The type of page fault for this data point. Type `major` is for major/hard page faults, and `minor` is for minor/soft page faults. | `major`; `minor` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.parent_pid` | int | Parent Process identifier (PPID). | `111` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.pid` | int | Process identifier (PID). | `1234` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.real_user.id` | int | The real user ID (RUID) of the process. | `1000` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.real_user.name` | string | The username of the real user of the process. | `operator` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.runtime.description` | string | An additional description about the runtime of the process, for example a specific vendor customization of the runtime environment. | `Eclipse OpenJ9 Eclipse OpenJ9 VM openj9-0.21.0` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.runtime.name` | string | The name of the runtime of this process. | `OpenJDK Runtime Environment` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.runtime.version` | string | The version of the runtime of this process, as returned by the runtime without modification. | `14.0.2` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.saved_user.id` | int | The saved user ID (SUID) of the process. | `1002` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.saved_user.name` | string | The username of the saved user. | `operator` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.session_leader.pid` | int | The PID of the process's session leader. This is also the session ID (SID) of the process. | `14` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.user.id` | int | The effective user ID (EUID) of the process. | `1001` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.user.name` | string | The username of the effective user of the process. | `root` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `process.vpid` | int | Virtual process identifier. [2] | `12` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `title` | string | Process title (proctitle) [3] | `cat /etc/hostname`; `xfce4-session`; `bash` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `working_directory` | string | The working directory of the process. | `/root` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| Attribute | Type | Description | Examples | Stability |
+| --------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ---------------------------------------------------------------- |
+| `process.args_count` | int | Length of the process.command_args array [1] | `4` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.command` | string | The command used to launch the process (i.e. the command name). On Linux based systems, can be set to the zeroth string in `proc/[pid]/cmdline`. On Windows, can be set to the first parameter extracted from `GetCommandLineW`. | `cmd/otelcol` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.command_args` | string[] | All the command arguments (including the command/executable itself) as received by the process. On Linux-based systems (and some other Unixoid systems supporting procfs), can be set according to the list of null-delimited strings extracted from `proc/[pid]/cmdline`. For libc-based executables, this would be the full argv vector passed to `main`. | `["cmd/otecol", "--config=config.yaml"]` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.command_line` | string | The full command used to launch the process as a single string representing the full command. On Windows, can be set to the result of `GetCommandLineW`. Do not set this if you have to assemble it just for monitoring; use `process.command_args` instead. | `C:\cmd\otecol --config="my directory\config.yaml"` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.context_switch_type` | string | Specifies whether the context switches for this data point were voluntary or involuntary. | `voluntary`; `involuntary` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.creation.time` | string | The date and time the process was created, in ISO 8601 format. | `2023-11-21T09:25:34.853Z` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.executable.build_id.gnu` | string | The GNU build ID as found in the `.note.gnu.build-id` ELF section (hex string). | `c89b11207f6479603b0d49bf291c092c2b719293` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.executable.build_id.go` | string | The Go build ID as retrieved by `go tool buildid `. | `foh3mEXu7BLZjsN9pOwG/kATcXlYVCDEFouRMQed_/WwRFB1hPo9LBkekthSPG/x8hMC8emW2cCjXD0_1aY` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.executable.build_id.profiling` | string | Profiling specific build ID for executables. See the OTel specification for Profiles for more information. | `600DCAFE4A110000F2BF38C493F5FB92` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.executable.name` | string | The name of the process executable. On Linux based systems, can be set to the `Name` in `proc/[pid]/status`. On Windows, can be set to the base name of `GetProcessImageFileNameW`. | `otelcol` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.executable.path` | string | The full path to the process executable. On Linux based systems, can be set to the target of `proc/[pid]/exe`. On Windows, can be set to the result of `GetProcessImageFileNameW`. | `/usr/bin/cmd/otelcol` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.exit.code` | int | The exit code of the process. | `127` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.exit.time` | string | The date and time the process exited, in ISO 8601 format. | `2023-11-21T09:26:12.315Z` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.group_leader.pid` | int | The PID of the process's group leader. This is also the process group ID (PGID) of the process. | `23` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.interactive` | boolean | Whether the process is connected to an interactive shell. | | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.owner` | string | The username of the user that owns the process. | `root` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.paging.fault_type` | string | The type of page fault for this data point. Type `major` is for major/hard page faults, and `minor` is for minor/soft page faults. | `major`; `minor` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.parent_pid` | int | Parent Process identifier (PPID). | `111` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.pid` | int | Process identifier (PID). | `1234` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.real_user.id` | int | The real user ID (RUID) of the process. | `1000` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.real_user.name` | string | The username of the real user of the process. | `operator` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.runtime.description` | string | An additional description about the runtime of the process, for example a specific vendor customization of the runtime environment. | `Eclipse OpenJ9 Eclipse OpenJ9 VM openj9-0.21.0` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.runtime.name` | string | The name of the runtime of this process. | `OpenJDK Runtime Environment` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.runtime.version` | string | The version of the runtime of this process, as returned by the runtime without modification. | `14.0.2` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.saved_user.id` | int | The saved user ID (SUID) of the process. | `1002` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.saved_user.name` | string | The username of the saved user. | `operator` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.session_leader.pid` | int | The PID of the process's session leader. This is also the session ID (SID) of the process. | `14` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.title` | string | Process title (proctitle) [2] | `cat /etc/hostname`; `xfce4-session`; `bash` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.user.id` | int | The effective user ID (EUID) of the process. | `1001` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.user.name` | string | The username of the effective user of the process. | `root` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.vpid` | int | Virtual process identifier. [3] | `12` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `process.working_directory` | string | The working directory of the process. | `/root` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
**[1]:** This field can be useful for querying or performing bucket analysis on how many arguments were provided to start a process. More arguments may be an indication of suspicious activity.
-**[2]:** The process ID within a PID namespace. This is not necessarily unique across all processes on the host but it is unique within the process namespace that the process exists within.
+**[2]:** In many Unix-like systems, process title (proctitle), is the string that represents the name or command line of a running process, displayed by system monitoring tools like ps, top, and htop.
-**[3]:** In many Unix-like systems, process title (proctitle), is the string that represents the name or command line of a running process, displayed by system monitoring tools like ps, top, and htop.
+**[3]:** The process ID within a PID namespace. This is not necessarily unique across all processes on the host but it is unique within the process namespace that the process exists within.
`process.context_switch_type` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used.
diff --git a/docs/attributes-registry/profile.md b/docs/attributes-registry/profile.md
new file mode 100644
index 0000000000..2f0ee59906
--- /dev/null
+++ b/docs/attributes-registry/profile.md
@@ -0,0 +1,29 @@
+
+
+
+
+
+# Profile
+
+## Profile Frame Attributes
+
+Describes the origin of a single frame in a Profile.
+
+| Attribute | Type | Description | Examples | Stability |
+| -------------------- | ------ | -------------------------------------------------------- | --------- | ---------------------------------------------------------------- |
+| `profile.frame.type` | string | Describes the interpreter or compiler of a single frame. | `cpython` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+`profile.frame.type` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used.
+
+| Value | Description | Stability |
+| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- |
+| `cpython` | [Python]() | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `dotnet` | [.NET](https://wikipedia.org/wiki/.NET) | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `jvm` | [JVM](https://wikipedia.org/wiki/Java_virtual_machine) | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `kernel` | [Kernel]() | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `native` | [C](), [C++](https://wikipedia.org/wiki/C%2B%2B), [Go](), [Rust]() | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `perl` | [Perl](https://wikipedia.org/wiki/Perl) | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `php` | [PHP](https://wikipedia.org/wiki/PHP) | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `ruby` | [Ruby]() | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `v8js` | [V8JS]() | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
diff --git a/docs/attributes-registry/tls.md b/docs/attributes-registry/tls.md
index 8bce2ea0c5..47a043ad93 100644
--- a/docs/attributes-registry/tls.md
+++ b/docs/attributes-registry/tls.md
@@ -57,6 +57,6 @@ This document defines semantic convention attributes in the TLS namespace.
Describes deprecated `tls` attributes.
-| Attribute | Type | Description | Examples | Stability |
-| ------------------------ | ------ | ----------------------------------------- | ------------------ | ------------------------------------------------------------------------------------------- |
-| `tls.client.server_name` | string | Deprecated, use `server.address` instead. | `opentelemetry.io` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `server.address. |
+| Attribute | Type | Description | Examples | Stability |
+| ------------------------ | ------ | ----------------------------------------- | ------------------ | -------------------------------------------------------------------------------------------- |
+| `tls.client.server_name` | string | Deprecated, use `server.address` instead. | `opentelemetry.io` | ![Deprecated](https://img.shields.io/badge/-deprecated-red)
Replaced by `server.address`. |
diff --git a/docs/azure/events.md b/docs/azure/events.md
index 495a596a67..b832dc4371 100644
--- a/docs/azure/events.md
+++ b/docs/azure/events.md
@@ -21,7 +21,7 @@ The event name MUST be `az.resource.log`.
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`az.service_request_id`](/docs/attributes-registry/azure.md) | string | The unique identifier of the service request. It's generated by the Azure service and returned with the response. | `00000000-0000-0000-0000-000000000000` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| [`cloud.resource_id`](/docs/attributes-registry/cloud.md) | string | The [Fully Qualified Azure Resource ID](https://docs.microsoft.com/rest/api/resources/resources/get-by-id) the log is emitted for. | `arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function`; `//run.googleapis.com/projects/PROJECT_ID/locations/LOCATION_ID/services/SERVICE_ID`; `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| [`cloud.resource_id`](/docs/attributes-registry/cloud.md) | string | The [Fully Qualified Azure Resource ID](https://docs.microsoft.com/rest/api/resources/resources/get-by-id) the log is emitted for. | `arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function`; `//run.googleapis.com/projects/PROJECT_ID/locations/LOCATION_ID/services/SERVICE_ID`; `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`event.name`](/docs/attributes-registry/event.md) | string | Identifies the class / type of event. [1] | `browser.mouse.click`; `device.app.lifecycle` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
**[1]:** Event names are subject to the same rules as [attribute names](/docs/general/attribute-naming.md). Notably, event names are namespaced to avoid collisions and provide a clean separation of semantics for events in separate domains like browser, mobile, and kubernetes.
@@ -52,6 +52,6 @@ The event name MUST be `az.resource.log`.
| `tenant.id` | string | The tenant ID of the Active Directory tenant that this event is tied to. | `607964b6-41a5-4e24-a5db-db7aab3b9b34` | `Conditionally Required`: if the event is tied to an Active Directory tenant. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-See [Azure Resource Log definition](/model/logs/azure.yaml) for the details.
+See [Azure Resource Log definition](/model/azure/logs.yaml) for the details.
[DocumentStatus]: https://opentelemetry.io/docs/specs/otel/document-status
diff --git a/docs/database/cosmosdb.md b/docs/database/cosmosdb.md
index 5b597c30ef..1200fc7ee8 100644
--- a/docs/database/cosmosdb.md
+++ b/docs/database/cosmosdb.md
@@ -25,51 +25,172 @@ Cosmos DB instrumentation includes call-level (public API) surface spans and net
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`db.collection.name`](/docs/attributes-registry/db.md) | string | Cosmos DB container name. [1] | `public.users`; `customers` | `Conditionally Required` if available | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| [`db.cosmosdb.connection_mode`](/docs/attributes-registry/db.md) | string | Cosmos client connection mode. | `gateway`; `direct` | `Conditionally Required` if not `direct` (or pick gw as default) | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| [`db.cosmosdb.operation_type`](/docs/attributes-registry/db.md) | string | CosmosDB Operation Type. | `Invalid`; `Create`; `Patch` | `Conditionally Required` when performing one of the operations in this list | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| [`db.cosmosdb.connection_mode`](/docs/attributes-registry/db.md) | string | Cosmos client connection mode. | `gateway`; `direct` | `Conditionally Required` [2] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| [`db.cosmosdb.operation_type`](/docs/attributes-registry/db.md) | string | Cosmos DB Operation Type. | `batch`; `create`; `delete` | `Conditionally Required` when performing one of the operations in this list | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`db.cosmosdb.request_charge`](/docs/attributes-registry/db.md) | double | RU consumed for that operation | `46.18`; `1.0` | `Conditionally Required` when available | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`db.cosmosdb.status_code`](/docs/attributes-registry/db.md) | int | Cosmos DB status code. | `200`; `201` | `Conditionally Required` if response was received | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`db.cosmosdb.sub_status_code`](/docs/attributes-registry/db.md) | int | Cosmos DB sub status code. | `1000`; `1002` | `Conditionally Required` when response was received and contained sub-code. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`db.namespace`](/docs/attributes-registry/db.md) | string | The name of the database, fully qualified within the server address and port. | `customers`; `test.users` | `Conditionally Required` If available. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| [`db.operation.name`](/docs/attributes-registry/db.md) | string | The name of the operation or command being executed. [2] | `findAndModify`; `HMSET`; `SELECT` | `Conditionally Required` [3] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| [`error.type`](/docs/attributes-registry/error.md) | string | Describes a class of error the operation ended with. [4] | `timeout`; `java.net.UnknownHostException`; `server_certificate_invalid`; `500` | `Conditionally Required` If and only if the operation failed. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
-| [`server.port`](/docs/attributes-registry/server.md) | int | Server port number. [5] | `80`; `8080`; `443` | `Conditionally Required` [6] | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
+| [`db.operation.name`](/docs/attributes-registry/db.md) | string | The name of the operation or command being executed. [3] | `create_item`; `query_items`; `read_item` | `Conditionally Required` [4] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| [`error.type`](/docs/attributes-registry/error.md) | string | Describes a class of error the operation ended with. [5] | `timeout`; `java.net.UnknownHostException`; `server_certificate_invalid`; `500` | `Conditionally Required` If and only if the operation failed. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
+| [`server.port`](/docs/attributes-registry/server.md) | int | Server port number. [6] | `80`; `8080`; `443` | `Conditionally Required` If not default (443). | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
+| [`az.namespace`](/docs/attributes-registry/azure.md) | string | [Azure Resource Provider Namespace](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-services-resource-providers) as recognized by the client. [7] | `Microsoft.DocumentDB` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`db.cosmosdb.client_id`](/docs/attributes-registry/db.md) | string | Unique Cosmos client instance id. | `3ba4827d-4422-483f-b59f-85b74211c11d` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`db.cosmosdb.request_content_length`](/docs/attributes-registry/db.md) | int | Request payload size in bytes | | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| [`db.query.text`](/docs/attributes-registry/db.md) | string | The database query being executed. [7] | `SELECT * FROM wuser_table where username = ?`; `SET mykey "WuValue"` | `Recommended` [8] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| [`server.address`](/docs/attributes-registry/server.md) | string | Name of the database host. [9] | `example.com`; `10.1.2.80`; `/tmp/my.sock` | `Recommended` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
-| [`user_agent.original`](/docs/attributes-registry/user-agent.md) | string | Full user-agent string is generated by Cosmos DB SDK [10] | `cosmos-netstandard-sdk/3.23.0\|3.23.1\|1\|X64\|Linux 5.4.0-1098-azure 104 18\|.NET Core 3.1.32\|S\|` | `Recommended` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
-| [`db.query.parameter.`](/docs/attributes-registry/db.md) | string | A query parameter used in `db.query.text`, with `` being the parameter name, and the attribute value being a string representation of the parameter value. [11] | `someval`; `55` | `Opt-In` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| [`db.query.text`](/docs/attributes-registry/db.md) | string | The database query being executed. [8] | `SELECT * FROM wuser_table where username = ?`; `SET mykey "WuValue"` | `Recommended` [9] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| [`server.address`](/docs/attributes-registry/server.md) | string | Name of the database host. [10] | `example.com`; `10.1.2.80`; `/tmp/my.sock` | `Recommended` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
+| [`user_agent.original`](/docs/attributes-registry/user-agent.md) | string | Full user-agent string is generated by Cosmos DB SDK [11] | `cosmos-netstandard-sdk/3.23.0\|3.23.1\|1\|X64\|Linux 5.4.0-1098-azure 104 18\|.NET Core 3.1.32\|S\|` | `Recommended` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
+| [`db.query.parameter.`](/docs/attributes-registry/db.md) | string | A query parameter used in `db.query.text`, with `` being the parameter name, and the attribute value being a string representation of the parameter value. [12] | `someval`; `55` | `Opt-In` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
**[1]:** It is RECOMMENDED to capture the value as provided by the application without attempting to do any case normalization.
-If the collection name is parsed from the query text, it SHOULD be the first collection name found in the query and it SHOULD match the value provided in the query text including any schema and database name prefix.
-For batch operations, if the individual operations are known to have the same collection name then that collection name SHOULD be used, otherwise `db.collection.name` SHOULD NOT be captured.
-**[2]:** It is RECOMMENDED to capture the value as provided by the application without attempting to do any case normalization.
-If the operation name is parsed from the query text, it SHOULD be the first operation name found in the query.
-For batch operations, if the individual operations are known to have the same operation name then that operation name SHOULD be used prepended by `BATCH `, otherwise `db.operation.name` SHOULD be `BATCH` or some other database system specific term if more applicable.
+**[2]:** if not `gateway` (the default value is assumed to be `gateway`).
+
+**[3]:** The `db.operation.name` has the following list of well-known values.
+If one of them applies, then the respective value MUST be used.
+
+Batch operations:
+
+- `execute_batch`
+
+Bulk operations:
+
+- `execute_bulk` SHOULD be used on spans reported for methods like
+ [`executeBulkOperations`](https://javadoc.io/doc/com.azure/azure-cosmos/latest/com/azure/cosmos/CosmosAsyncContainer.html#executeBulkOperations)).
+ which represents a bulk execution of multiple operations.
+- `bulk_{operation name}` (`bulk_create_item`, `bulk_upsert_item`, etc) SHOULD be used on spans describing individual operations (when they are reported)
+ within the bulk. This pattern SHOULD be used when instrumentation creates span per each operation, but operations are buffered and then performed in bulk.
+ For example, this applies when [`AllowBulkExecution`](https://learn.microsoft.com/dotnet/api/microsoft.azure.cosmos.cosmosclientoptions.allowbulkexecution)
+ property is configured on the `Microsoft.Azure.Cosmos` client.
+
+Change feed operations:
+
+- `query_change_feed`
+
+Conflicts operations:
+
+- `delete_conflict`
+- `query_conflicts`
+- `read_all_conflicts`
+- `read_conflict`
-**[3]:** If readily available. The operation name MAY be parsed from the query text, in which case it SHOULD be the first operation name found in the query.
+Container operations:
-**[4]:** The `error.type` SHOULD match the error code returned by the database or the client library, the canonical name of exception that occurred, or another low-cardinality error identifier. Instrumentations SHOULD document the list of errors they report.
+- `create_container`
+- `create_container_if_not_exists`
+- `delete_container`
+- `query_containers`
+- `read_all_containers`
+- `read_container`
+- `read_container_throughput`
+- `replace_container`
+- `replace_container_throughput`
-**[5]:** When observed from the client side, and when communicating through an intermediary, `server.port` SHOULD represent the server port behind any intermediaries, for example proxies, if it's available.
+Database operations:
-**[6]:** If using a port other than the default port for this DBMS and if `server.address` is set.
+- `create_database`
+- `create_database_if_not_exists`
+- `delete_database`
+- `query_databases`
+- `read_all_databases`
+- `read_database`
+- `read_database_throughput`
+- `replace_database_throughput`
-**[7]:** For sanitization see [Sanitization of `db.query.text`](../../docs/database/database-spans.md#sanitization-of-dbquerytext).
+Encryption key operations:
+
+- `create_client_encryption_key`
+- `query_client_encryption_keys`
+- `read_all_client_encryption_keys`
+- `read_client_encryption_key`
+- `replace_client_encryption_key`
+
+Item operations:
+
+- `create_item`
+- `delete_all_items_by_partition_key`
+- `delete_item`
+- `patch_item`
+- `query_items`
+- `read_all_items`
+- `read_all_items_of_logical_partition`
+- `read_many_items`
+- `read_item`
+- `replace_item`
+- `upsert_item`
+
+Permission operations:
+
+- `create_permission`
+- `delete_permission`
+- `query_permissions`
+- `read_all_permissions`
+- `read_permission`
+- `replace_permission`
+- `upsert_permission`
+
+Stored procedure operations:
+
+- `create_stored_procedure`
+- `delete_stored_procedure`
+- `execute_stored_procedure`
+- `query_stored_procedures`
+- `read_all_stored_procedures`
+- `read_stored_procedure`
+- `replace_stored_procedure`
+
+Trigger operations:
+
+- `create_trigger`
+- `delete_trigger`
+- `query_triggers`
+- `read_all_triggers`
+- `read_trigger`
+- `replace_trigger`
+
+User operations:
+
+- `create_user`
+- `delete_user`
+- `query_users`
+- `read_all_users`
+- `read_user`
+- `replace_user`
+- `upsert_user`
+
+User-defined function operations:
+
+- `create_user_defined_function`
+- `delete_user_defined_function`
+- `query_user_defined_functions`
+- `read_all_user_defined_functions`
+- `read_user_defined_function`
+
+If none of them applies, it's RECOMMENDED to use language-agnostic representation of
+client method name in snake_case. Instrumentations SHOULD document
+additional values when introducing new operations.
+
+**[4]:** If readily available. The operation name MAY be parsed from the query text, in which case it SHOULD be the first operation name found in the query.
+
+**[5]:** The `error.type` SHOULD match the error code returned by the database or the client library, the canonical name of exception that occurred, or another low-cardinality error identifier. Instrumentations SHOULD document the list of errors they report.
+
+**[6]:** When observed from the client side, and when communicating through an intermediary, `server.port` SHOULD represent the server port behind any intermediaries, for example proxies, if it's available.
+
+**[7]:** When `az.namespace` attribute is populated, it MUST be set to `Microsoft.DocumentDB` for all operations performed by Cosmos DB client.
+
+**[8]:** For sanitization see [Sanitization of `db.query.text`](../../docs/database/database-spans.md#sanitization-of-dbquerytext).
For batch operations, if the individual operations are known to have the same query text then that query text SHOULD be used, otherwise all of the individual query texts SHOULD be concatenated with separator `; ` or some other database system specific separator if more applicable.
Even though parameterized query text can potentially have sensitive data, by using a parameterized query the user is giving a strong signal that any sensitive data will be passed as parameter values, and the benefit to observability of capturing the static part of the query text by default outweighs the risk.
-**[8]:** SHOULD be collected by default only if there is sanitization that excludes sensitive information. See [Sanitization of `db.query.text`](../../docs/database/database-spans.md#sanitization-of-dbquerytext).
+**[9]:** SHOULD be collected by default only if there is sanitization that excludes sensitive information. See [Sanitization of `db.query.text`](../../docs/database/database-spans.md#sanitization-of-dbquerytext).
-**[9]:** When observed from the client side, and when communicating through an intermediary, `server.address` SHOULD represent the server address behind any intermediaries, for example proxies, if it's available.
+**[10]:** When observed from the client side, and when communicating through an intermediary, `server.address` SHOULD represent the server address behind any intermediaries, for example proxies, if it's available.
-**[10]:** The user-agent value is generated by SDK which is a combination of
`sdk_version` : Current version of SDK. e.g. 'cosmos-netstandard-sdk/3.23.0'
`direct_pkg_version` : Direct package version used by Cosmos DB SDK. e.g. '3.23.1'
`number_of_client_instances` : Number of cosmos client instances created by the application. e.g. '1'
`type_of_machine_architecture` : Machine architecture. e.g. 'X64'
`operating_system` : Operating System. e.g. 'Linux 5.4.0-1098-azure 104 18'
`runtime_framework` : Runtime Framework. e.g. '.NET Core 3.1.32'
`failover_information` : Generated key to determine if region failover enabled.
+**[11]:** The user-agent value is generated by SDK which is a combination of
`sdk_version` : Current version of SDK. e.g. 'cosmos-netstandard-sdk/3.23.0'
`direct_pkg_version` : Direct package version used by Cosmos DB SDK. e.g. '3.23.1'
`number_of_client_instances` : Number of cosmos client instances created by the application. e.g. '1'
`type_of_machine_architecture` : Machine architecture. e.g. 'X64'
`operating_system` : Operating System. e.g. 'Linux 5.4.0-1098-azure 104 18'
`runtime_framework` : Runtime Framework. e.g. '.NET Core 3.1.32'
`failover_information` : Generated key to determine if region failover enabled.
Format Reg-{D (Disabled discovery)}-S(application region)|L(List of preferred regions)|N(None, user did not configure it).
Default value is "NS".
-**[11]:** Query parameters should only be captured when `db.query.text` is parameterized with placeholders.
+**[12]:** Query parameters should only be captured when `db.query.text` is parameterized with placeholders.
If a parameter has no name and instead is referenced only by index, then `` SHOULD be the 0-based index.
@@ -96,21 +217,21 @@ and SHOULD be provided **at span creation time** (if provided at all):
| Value | Description | Stability |
|---|---|---|
-| `Batch` | batch | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `Create` | create | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `Delete` | delete | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `Execute` | execute | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `ExecuteJavaScript` | execute_javascript | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `Head` | head | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `HeadFeed` | head_feed | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `Invalid` | invalid | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `Patch` | patch | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `Query` | query | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `QueryPlan` | query_plan | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `Read` | read | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `ReadFeed` | read_feed | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `Replace` | replace | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| `Upsert` | upsert | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `batch` | batch | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `create` | create | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `delete` | delete | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `execute` | execute | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `execute_javascript` | execute_javascript | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `head` | head | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `head_feed` | head_feed | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `invalid` | invalid | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `patch` | patch | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `query` | query | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `query_plan` | query_plan | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `read` | read | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `read_feed` | read_feed | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `replace` | replace | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `upsert` | upsert | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
`error.type` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used.
@@ -126,25 +247,20 @@ and SHOULD be provided **at span creation time** (if provided at all):
-In addition to Cosmos DB attributes, all spans include
-`az.namespace` attribute representing Azure Resource Provider namespace that MUST be equal to `Microsoft.DocumentDB`.
-
## Example
| Key | Value |
|:-------------------------------------| :------------------- |
-| Span name | `"ReadItemsAsync orders"` |
-| `kind` | `"internal"` |
+| Span name | `"read_item orders"` |
| `az.namespace` | `"Microsoft.DocumentDB"` |
| `db.system` | `"cosmosdb"` |
| `db.collection.name` | `"orders"` |
| `db.namespace` | `"ShopDb"` |
-| `db.operation.name` | `"ReadItemsAsync"` |
+| `db.operation.name` | `"read_item"` |
| `server.address` | `"account.documents.azure.com"` |
-| `db.cosmosdb.client_id` | `3ba4827d-4422-483f-b59f-85b74211c11d` |
-| `db.cosmosdb.operation_type` | `Read` |
-| `user_agent.original` | `cosmos-netstandard-sdk/3.23.0\|3.23.1\|1\|X64\|Linux 5.4.0-1098-azure 104 18\|.NET Core 3.1.32\|S\|` |
-| `db.cosmosdb.connection_mode` | `"Direct"` |
+| `db.cosmosdb.client_id` | `"3ba4827d-4422-483f-b59f-85b74211c11d"` |
+| `db.cosmosdb.operation_type` | `"read"` |
+| `user_agent.original` | `"cosmos-netstandard-sdk/3.23.0\|3.23.1\|1\|X64\|Linux 5.4.0-1098-azure 104 18\|.NET Core 3.1.32\|S\|"` |
| `db.cosmosdb.request_content_length` | `20` |
| `db.cosmosdb.status_code` | `201` |
| `db.cosmosdb.sub_status_code` | `0` |
diff --git a/docs/database/database-metrics.md b/docs/database/database-metrics.md
index 89b9510cb6..9178b35f77 100644
--- a/docs/database/database-metrics.md
+++ b/docs/database/database-metrics.md
@@ -70,7 +70,7 @@ This metric SHOULD be specified with
[`ExplicitBucketBoundaries`](https://github.com/open-telemetry/opentelemetry-specification/tree/v1.35.0/specification/metrics/api.md#instrument-advisory-parameters)
of `[ 0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1, 5, 10 ]`.
-
+
@@ -85,19 +85,6 @@ of `[ 0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1, 5, 10 ]`.
**[1]:** Batch operations SHOULD be recorded as a single operation.
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`db.system`](/docs/attributes-registry/db.md) | string | The database management system (DBMS) product as identified by the client instrumentation. [1] | `other_sql`; `adabas`; `cache` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -217,7 +204,7 @@ The following metric instruments describe database client connection pool operat
This metric is [required][MetricRequired].
-
+
@@ -228,19 +215,6 @@ This metric is [required][MetricRequired].
| -------- | --------------- | ----------- | -------------- | --------- |
| `db.client.connection.count` | UpDownCounter | `{connection}` | The number of connections that are currently in state described by the `state` attribute | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`db.client.connection.pool.name`](/docs/attributes-registry/db.md) | string | The name of the connection pool; unique within the instrumented application. In case the connection pool implementation doesn't provide a name, instrumentation SHOULD use a combination of parameters that would make the name unique, for example, combining attributes `server.address`, `server.port`, and `db.namespace`, formatted as `server.address:server.port/db.namespace`. Instrumentations that generate connection pool name following different patterns SHOULD document it. | `myDataSource` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -263,7 +237,7 @@ This metric is [required][MetricRequired].
This metric is [recommended][MetricRecommended].
-
+
@@ -274,19 +248,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `db.client.connection.idle.max` | UpDownCounter | `{connection}` | The maximum number of idle open connections allowed | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`db.client.connection.pool.name`](/docs/attributes-registry/db.md) | string | The name of the connection pool; unique within the instrumented application. In case the connection pool implementation doesn't provide a name, instrumentation SHOULD use a combination of parameters that would make the name unique, for example, combining attributes `server.address`, `server.port`, and `db.namespace`, formatted as `server.address:server.port/db.namespace`. Instrumentations that generate connection pool name following different patterns SHOULD document it. | `myDataSource` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -301,7 +262,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -312,19 +273,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `db.client.connection.idle.min` | UpDownCounter | `{connection}` | The minimum number of idle open connections allowed | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`db.client.connection.pool.name`](/docs/attributes-registry/db.md) | string | The name of the connection pool; unique within the instrumented application. In case the connection pool implementation doesn't provide a name, instrumentation SHOULD use a combination of parameters that would make the name unique, for example, combining attributes `server.address`, `server.port`, and `db.namespace`, formatted as `server.address:server.port/db.namespace`. Instrumentations that generate connection pool name following different patterns SHOULD document it. | `myDataSource` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -339,7 +287,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -350,19 +298,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `db.client.connection.max` | UpDownCounter | `{connection}` | The maximum number of open connections allowed | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`db.client.connection.pool.name`](/docs/attributes-registry/db.md) | string | The name of the connection pool; unique within the instrumented application. In case the connection pool implementation doesn't provide a name, instrumentation SHOULD use a combination of parameters that would make the name unique, for example, combining attributes `server.address`, `server.port`, and `db.namespace`, formatted as `server.address:server.port/db.namespace`. Instrumentations that generate connection pool name following different patterns SHOULD document it. | `myDataSource` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -377,7 +312,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -388,19 +323,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `db.client.connection.pending_requests` | UpDownCounter | `{request}` | The number of current pending requests for an open connection | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`db.client.connection.pool.name`](/docs/attributes-registry/db.md) | string | The name of the connection pool; unique within the instrumented application. In case the connection pool implementation doesn't provide a name, instrumentation SHOULD use a combination of parameters that would make the name unique, for example, combining attributes `server.address`, `server.port`, and `db.namespace`, formatted as `server.address:server.port/db.namespace`. Instrumentations that generate connection pool name following different patterns SHOULD document it. | `myDataSource` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -415,7 +337,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -426,19 +348,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `db.client.connection.timeouts` | Counter | `{timeout}` | The number of connection timeouts that have occurred trying to obtain a connection from the pool | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`db.client.connection.pool.name`](/docs/attributes-registry/db.md) | string | The name of the connection pool; unique within the instrumented application. In case the connection pool implementation doesn't provide a name, instrumentation SHOULD use a combination of parameters that would make the name unique, for example, combining attributes `server.address`, `server.port`, and `db.namespace`, formatted as `server.address:server.port/db.namespace`. Instrumentations that generate connection pool name following different patterns SHOULD document it. | `myDataSource` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -453,7 +362,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -464,19 +373,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `db.client.connection.create_time` | Histogram | `s` | The time it took to create a new connection | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`db.client.connection.pool.name`](/docs/attributes-registry/db.md) | string | The name of the connection pool; unique within the instrumented application. In case the connection pool implementation doesn't provide a name, instrumentation SHOULD use a combination of parameters that would make the name unique, for example, combining attributes `server.address`, `server.port`, and `db.namespace`, formatted as `server.address:server.port/db.namespace`. Instrumentations that generate connection pool name following different patterns SHOULD document it. | `myDataSource` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -491,7 +387,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -502,19 +398,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `db.client.connection.wait_time` | Histogram | `s` | The time it took to obtain an open connection from the pool | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`db.client.connection.pool.name`](/docs/attributes-registry/db.md) | string | The name of the connection pool; unique within the instrumented application. In case the connection pool implementation doesn't provide a name, instrumentation SHOULD use a combination of parameters that would make the name unique, for example, combining attributes `server.address`, `server.port`, and `db.namespace`, formatted as `server.address:server.port/db.namespace`. Instrumentations that generate connection pool name following different patterns SHOULD document it. | `myDataSource` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -529,7 +412,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -540,19 +423,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `db.client.connection.use_time` | Histogram | `s` | The time between borrowing a connection and returning it to the pool | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`db.client.connection.pool.name`](/docs/attributes-registry/db.md) | string | The name of the connection pool; unique within the instrumented application. In case the connection pool implementation doesn't provide a name, instrumentation SHOULD use a combination of parameters that would make the name unique, for example, combining attributes `server.address`, `server.port`, and `db.namespace`, formatted as `server.address:server.port/db.namespace`. Instrumentations that generate connection pool name following different patterns SHOULD document it. | `myDataSource` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
diff --git a/docs/database/database-spans.md b/docs/database/database-spans.md
index 66e1b3c297..ab5a1b334b 100644
--- a/docs/database/database-spans.md
+++ b/docs/database/database-spans.md
@@ -70,7 +70,7 @@ Semantic conventions for individual database systems MAY specify different span
The `{target}` SHOULD describe the entity that the operation is performed against
and SHOULD adhere to one of the following values, provided they are accessible:
-- `db.collection.name` SHOULD be used for data manipulation operations or operations on database collections.
+- `db.collection.name` SHOULD be used for data manipulation operations or operations on a database collection.
- `db.namespace` SHOULD be used for operations on a specific database namespace.
- `server.address:server.port` SHOULD be used for other operations not targeting any specific database(s) or collection(s)
diff --git a/docs/dns/dns-metrics.md b/docs/dns/dns-metrics.md
index 8674fe5127..8de3632705 100644
--- a/docs/dns/dns-metrics.md
+++ b/docs/dns/dns-metrics.md
@@ -27,7 +27,7 @@ This metric SHOULD be specified with
[`ExplicitBucketBoundaries`](https://github.com/open-telemetry/opentelemetry-specification/tree/v1.35.0/specification/metrics/api.md#instrument-advisory-parameters)
of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10 ]`.
-
+
@@ -38,19 +38,6 @@ of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10
| -------- | --------------- | ----------- | -------------- | --------- |
| `dns.lookup.duration` | Histogram | `s` | Measures the time taken to perform a DNS lookup. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`dns.question.name`](/docs/attributes-registry/dns.md) | string | The name being queried. [1] | `www.example.com`; `dot.net` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
diff --git a/docs/dotnet/dotnet-aspnetcore-metrics.md b/docs/dotnet/dotnet-aspnetcore-metrics.md
index 31ddd6d35e..3b9829258a 100644
--- a/docs/dotnet/dotnet-aspnetcore-metrics.md
+++ b/docs/dotnet/dotnet-aspnetcore-metrics.md
@@ -32,7 +32,7 @@ All routing metrics are reported by the `Microsoft.AspNetCore.Routing` meter.
### Metric: `aspnetcore.routing.match_attempts`
-
+
@@ -47,19 +47,6 @@ All routing metrics are reported by the `Microsoft.AspNetCore.Routing` meter.
**[1]:** Meter name: `Microsoft.AspNetCore.Routing`; Added in: ASP.NET Core 8.0
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`aspnetcore.routing.match_status`](/docs/attributes-registry/aspnetcore.md) | string | Match result - success or failure | `success`; `failure` | `Required` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -91,7 +78,7 @@ Exceptions Metric is reported by the `Microsoft.AspNetCore.Diagnostics` meter.
### Metric: `aspnetcore.diagnostics.exceptions`
-
+
@@ -106,19 +93,6 @@ Exceptions Metric is reported by the `Microsoft.AspNetCore.Diagnostics` meter.
**[1]:** Meter name: `Microsoft.AspNetCore.Diagnostics`; Added in: ASP.NET Core 8.0
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`aspnetcore.diagnostics.exception.result`](/docs/attributes-registry/aspnetcore.md) | string | ASP.NET Core exception middleware handling result | `handled`; `unhandled` | `Required` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -178,7 +152,7 @@ All rate-limiting metrics are reported by the `Microsoft.AspNetCore.RateLimiting
### Metric: `aspnetcore.rate_limiting.active_request_leases`
-
+
@@ -193,19 +167,6 @@ All rate-limiting metrics are reported by the `Microsoft.AspNetCore.RateLimiting
**[1]:** Meter name: `Microsoft.AspNetCore.RateLimiting`; Added in: ASP.NET Core 8.0
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`aspnetcore.rate_limiting.policy`](/docs/attributes-registry/aspnetcore.md) | string | Rate limiting policy name. | `fixed`; `sliding`; `token` | `Conditionally Required` [1] | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -226,7 +187,7 @@ this metric SHOULD be specified with
[`ExplicitBucketBoundaries`](https://github.com/open-telemetry/opentelemetry-specification/tree/v1.35.0/specification/metrics/api.md#instrument-advisory-parameters)
of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10 ]`.
-
+
@@ -241,19 +202,6 @@ of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10
**[1]:** Meter name: `Microsoft.AspNetCore.RateLimiting`; Added in: ASP.NET Core 8.0
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`aspnetcore.rate_limiting.policy`](/docs/attributes-registry/aspnetcore.md) | string | Rate limiting policy name. | `fixed`; `sliding`; `token` | `Conditionally Required` [1] | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -270,7 +218,7 @@ of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10
### Metric: `aspnetcore.rate_limiting.queued_requests`
-
+
@@ -285,19 +233,6 @@ of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10
**[1]:** Meter name: `Microsoft.AspNetCore.RateLimiting`; Added in: ASP.NET Core 8.0
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`aspnetcore.rate_limiting.policy`](/docs/attributes-registry/aspnetcore.md) | string | Rate limiting policy name. | `fixed`; `sliding`; `token` | `Conditionally Required` [1] | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -318,7 +253,7 @@ this metric SHOULD be specified with
[`ExplicitBucketBoundaries`](https://github.com/open-telemetry/opentelemetry-specification/tree/v1.35.0/specification/metrics/api.md#instrument-advisory-parameters)
of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10 ]`.
-
+
@@ -333,19 +268,6 @@ of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10
**[1]:** Meter name: `Microsoft.AspNetCore.RateLimiting`; Added in: ASP.NET Core 8.0
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`aspnetcore.rate_limiting.result`](/docs/attributes-registry/aspnetcore.md) | string | Rate-limiting result, shows whether the lease was acquired or contains a rejection reason | `acquired`; `request_canceled` | `Required` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -373,7 +295,7 @@ of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10
### Metric: `aspnetcore.rate_limiting.requests`
-
+
@@ -393,19 +315,6 @@ of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10
Meter name: `Microsoft.AspNetCore.RateLimiting`; Added in: ASP.NET Core 8.0
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`aspnetcore.rate_limiting.result`](/docs/attributes-registry/aspnetcore.md) | string | Rate-limiting result, shows whether the lease was acquired or contains a rejection reason | `acquired`; `request_canceled` | `Required` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
diff --git a/docs/dotnet/dotnet-kestrel-metrics.md b/docs/dotnet/dotnet-kestrel-metrics.md
index d1503e3ccb..5400e57d38 100644
--- a/docs/dotnet/dotnet-kestrel-metrics.md
+++ b/docs/dotnet/dotnet-kestrel-metrics.md
@@ -32,7 +32,7 @@ In case instrumentation does not recognize `EndPoint` implementation, it sets th
## Metric: `kestrel.active_connections`
-
+
@@ -47,19 +47,6 @@ In case instrumentation does not recognize `EndPoint` implementation, it sets th
**[1]:** Meter name: `Microsoft.AspNetCore.Server.Kestrel`; Added in: ASP.NET Core 8.0
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`network.transport`](/docs/attributes-registry/network.md) | string | [OSI transport layer](https://osi-model.com/transport-layer/) or [inter-process communication method](https://wikipedia.org/wiki/Inter-process_communication). [1] | `tcp`; `unix` | `Recommended` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -112,7 +99,7 @@ this metric SHOULD be specified with
[`ExplicitBucketBoundaries`](https://github.com/open-telemetry/opentelemetry-specification/tree/v1.35.0/specification/metrics/api.md#instrument-advisory-parameters)
of `[ 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 30, 60, 120, 300 ]`.
-
+
@@ -127,19 +114,6 @@ of `[ 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 30, 60, 120, 300 ]`.
**[1]:** Meter name: `Microsoft.AspNetCore.Server.Kestrel`; Added in: ASP.NET Core 8.0
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`error.type`](/docs/attributes-registry/error.md) | string | The full name of exception type. [1] | `System.OperationCanceledException`; `Contoso.MyException` | `Conditionally Required` if and only if an error has occurred. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -205,7 +179,7 @@ different processes could be listening on TCP port 12345 and UDP port 12345.
## Metric: `kestrel.rejected_connections`
-
+
@@ -221,19 +195,6 @@ different processes could be listening on TCP port 12345 and UDP port 12345.
Meter name: `Microsoft.AspNetCore.Server.Kestrel`; Added in: ASP.NET Core 8.0
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`network.transport`](/docs/attributes-registry/network.md) | string | [OSI transport layer](https://osi-model.com/transport-layer/) or [inter-process communication method](https://wikipedia.org/wiki/Inter-process_communication). [1] | `tcp`; `unix` | `Recommended` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -282,7 +243,7 @@ different processes could be listening on TCP port 12345 and UDP port 12345.
## Metric: `kestrel.queued_connections`
-
+
@@ -297,19 +258,6 @@ different processes could be listening on TCP port 12345 and UDP port 12345.
**[1]:** Meter name: `Microsoft.AspNetCore.Server.Kestrel`; Added in: ASP.NET Core 8.0
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`network.transport`](/docs/attributes-registry/network.md) | string | [OSI transport layer](https://osi-model.com/transport-layer/) or [inter-process communication method](https://wikipedia.org/wiki/Inter-process_communication). [1] | `tcp`; `unix` | `Recommended` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -358,7 +306,7 @@ different processes could be listening on TCP port 12345 and UDP port 12345.
## Metric: `kestrel.queued_requests`
-
+
@@ -373,19 +321,6 @@ different processes could be listening on TCP port 12345 and UDP port 12345.
**[1]:** Meter name: `Microsoft.AspNetCore.Server.Kestrel`; Added in: ASP.NET Core 8.0
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`network.protocol.name`](/docs/attributes-registry/network.md) | string | [OSI application layer](https://osi-model.com/application-layer/) or non-OSI equivalent. [1] | `http`; `web_sockets` | `Recommended` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -440,7 +375,7 @@ different processes could be listening on TCP port 12345 and UDP port 12345.
## Metric: `kestrel.upgraded_connections`
-
+
@@ -457,19 +392,6 @@ different processes could be listening on TCP port 12345 and UDP port 12345.
Meter name: `Microsoft.AspNetCore.Server.Kestrel`; Added in: ASP.NET Core 8.0
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`network.transport`](/docs/attributes-registry/network.md) | string | [OSI transport layer](https://osi-model.com/transport-layer/) or [inter-process communication method](https://wikipedia.org/wiki/Inter-process_communication). [1] | `tcp`; `unix` | `Recommended` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -522,7 +444,7 @@ this metric SHOULD be specified with
[`ExplicitBucketBoundaries`](https://github.com/open-telemetry/opentelemetry-specification/tree/v1.35.0/specification/metrics/api.md#instrument-advisory-parameters)
of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10 ]`.
-
+
@@ -537,19 +459,6 @@ of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10
**[1]:** Meter name: `Microsoft.AspNetCore.Server.Kestrel`; Added in: ASP.NET Core 8.0
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`error.type`](/docs/attributes-registry/error.md) | string | The full name of exception type. [1] | `System.OperationCanceledException`; `Contoso.MyException` | `Conditionally Required` if and only if an error has occurred. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -609,7 +518,7 @@ different processes could be listening on TCP port 12345 and UDP port 12345.
## Metric: `kestrel.active_tls_handshakes`
-
+
@@ -624,19 +533,6 @@ different processes could be listening on TCP port 12345 and UDP port 12345.
**[1]:** Meter name: `Microsoft.AspNetCore.Server.Kestrel`; Added in: ASP.NET Core 8.0
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`network.transport`](/docs/attributes-registry/network.md) | string | [OSI transport layer](https://osi-model.com/transport-layer/) or [inter-process communication method](https://wikipedia.org/wiki/Inter-process_communication). [1] | `tcp`; `unix` | `Recommended` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
diff --git a/docs/dotnet/dotnet-signalr-metrics.md b/docs/dotnet/dotnet-signalr-metrics.md
index 65b1177694..60de202d91 100644
--- a/docs/dotnet/dotnet-signalr-metrics.md
+++ b/docs/dotnet/dotnet-signalr-metrics.md
@@ -21,7 +21,7 @@ this metric SHOULD be specified with
[`ExplicitBucketBoundaries`](https://github.com/open-telemetry/opentelemetry-specification/tree/v1.35.0/specification/metrics/api.md#instrument-advisory-parameters)
of `[ 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 30, 60, 120, 300 ]`.
-
+
@@ -36,19 +36,6 @@ of `[ 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 30, 60, 120, 300 ]`.
**[1]:** Meter name: `Microsoft.AspNetCore.Http.Connections`; Added in: ASP.NET Core 8.0
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`signalr.connection.status`](/docs/attributes-registry/signalr.md) | string | SignalR HTTP connection closure status. | `app_shutdown`; `timeout` | `Recommended` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -80,7 +67,7 @@ of `[ 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 30, 60, 120, 300 ]`.
## Metric: `signalr.server.active_connections`
-
+
@@ -95,19 +82,6 @@ of `[ 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 30, 60, 120, 300 ]`.
**[1]:** Meter name: `Microsoft.AspNetCore.Http.Connections`; Added in: ASP.NET Core 8.0
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`signalr.connection.status`](/docs/attributes-registry/signalr.md) | string | SignalR HTTP connection closure status. | `app_shutdown`; `timeout` | `Recommended` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
diff --git a/docs/faas/faas-metrics.md b/docs/faas/faas-metrics.md
index ca12e9f410..d436d7e078 100644
--- a/docs/faas/faas-metrics.md
+++ b/docs/faas/faas-metrics.md
@@ -49,7 +49,7 @@ This metric SHOULD be specified with
[`ExplicitBucketBoundaries`](https://github.com/open-telemetry/opentelemetry-specification/tree/v1.35.0/specification/metrics/api.md#instrument-advisory-parameters)
of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10 ]`.
-
+
@@ -60,19 +60,6 @@ of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10
| -------- | --------------- | ----------- | -------------- | --------- |
| `faas.invoke_duration` | Histogram | `s` | Measures the duration of the function's logic execution | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`faas.trigger`](/docs/attributes-registry/faas.md) | string | Type of the trigger which caused this function invocation. | `datasource`; `http`; `pubsub` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -102,7 +89,7 @@ This metric SHOULD be specified with
[`ExplicitBucketBoundaries`](https://github.com/open-telemetry/opentelemetry-specification/tree/v1.35.0/specification/metrics/api.md#instrument-advisory-parameters)
of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10 ]`.
-
+
@@ -113,19 +100,6 @@ of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10
| -------- | --------------- | ----------- | -------------- | --------- |
| `faas.init_duration` | Histogram | `s` | Measures the duration of the function's initialization, such as a cold start | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`faas.trigger`](/docs/attributes-registry/faas.md) | string | Type of the trigger which caused this function invocation. | `datasource`; `http`; `pubsub` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -151,7 +125,7 @@ of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10
This metric is [recommended][MetricRecommended].
-
+
@@ -162,19 +136,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `faas.coldstarts` | Counter | `{coldstart}` | Number of invocation cold starts | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`faas.trigger`](/docs/attributes-registry/faas.md) | string | Type of the trigger which caused this function invocation. | `datasource`; `http`; `pubsub` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -200,7 +161,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -211,19 +172,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `faas.errors` | Counter | `{error}` | Number of invocation errors | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`faas.trigger`](/docs/attributes-registry/faas.md) | string | Type of the trigger which caused this function invocation. | `datasource`; `http`; `pubsub` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -249,7 +197,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -260,19 +208,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `faas.invocations` | Counter | `{invocation}` | Number of successful invocations | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`faas.trigger`](/docs/attributes-registry/faas.md) | string | Type of the trigger which caused this function invocation. | `datasource`; `http`; `pubsub` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -298,7 +233,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -309,19 +244,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `faas.timeouts` | Counter | `{timeout}` | Number of invocation timeouts | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`faas.trigger`](/docs/attributes-registry/faas.md) | string | Type of the trigger which caused this function invocation. | `datasource`; `http`; `pubsub` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -347,7 +269,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -358,19 +280,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `faas.mem_usage` | Histogram | `By` | Distribution of max memory usage per invocation | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`faas.trigger`](/docs/attributes-registry/faas.md) | string | Type of the trigger which caused this function invocation. | `datasource`; `http`; `pubsub` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -400,7 +309,7 @@ This metric SHOULD be specified with
[`ExplicitBucketBoundaries`](https://github.com/open-telemetry/opentelemetry-specification/tree/v1.35.0/specification/metrics/api.md#instrument-advisory-parameters)
of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10 ]`.
-
+
@@ -411,19 +320,6 @@ of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10
| -------- | --------------- | ----------- | -------------- | --------- |
| `faas.cpu_usage` | Histogram | `s` | Distribution of CPU usage per invocation | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`faas.trigger`](/docs/attributes-registry/faas.md) | string | Type of the trigger which caused this function invocation. | `datasource`; `http`; `pubsub` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -449,7 +345,7 @@ of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10
This metric is [recommended][MetricRecommended].
-
+
@@ -460,19 +356,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `faas.net_io` | Histogram | `By` | Distribution of net I/O usage per invocation | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`faas.trigger`](/docs/attributes-registry/faas.md) | string | Type of the trigger which caused this function invocation. | `datasource`; `http`; `pubsub` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
diff --git a/docs/faas/faas-spans.md b/docs/faas/faas-spans.md
index 0feaa47af0..c249fcd786 100644
--- a/docs/faas/faas-spans.md
+++ b/docs/faas/faas-spans.md
@@ -47,7 +47,7 @@ If Spans following this convention are produced, a Resource of type `faas` MUST
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
-| [`cloud.resource_id`](/docs/attributes-registry/cloud.md) | string | Cloud provider-specific native identifier of the monitored cloud resource (e.g. an [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) on AWS, a [fully qualified resource ID](https://learn.microsoft.com/rest/api/resources/resources/get-by-id) on Azure, a [full resource name](https://cloud.google.com/apis/design/resource_names#full_resource_name) on GCP) [1] | `arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function`; `//run.googleapis.com/projects/PROJECT_ID/locations/LOCATION_ID/services/SERVICE_ID`; `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| [`cloud.resource_id`](/docs/attributes-registry/cloud.md) | string | Cloud provider-specific native identifier of the monitored cloud resource (e.g. an [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) on AWS, a [fully qualified resource ID](https://learn.microsoft.com/rest/api/resources/resources/get-by-id) on Azure, a [full resource name](https://cloud.google.com/apis/design/resource_names#full_resource_name) on GCP) [1] | `arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function`; `//run.googleapis.com/projects/PROJECT_ID/locations/LOCATION_ID/services/SERVICE_ID`; `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`faas.invocation_id`](/docs/attributes-registry/faas.md) | string | The invocation ID of the current function invocation. | `af9d5aa4-a685-4c5f-a22b-444f80b3cc28` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`faas.trigger`](/docs/attributes-registry/faas.md) | string | Type of the trigger which caused this function invocation. [2] | `datasource`; `http`; `pubsub` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -65,7 +65,7 @@ The following well-known definitions MUST be used if you set this attribute and
* **GCP:** The [URI of the resource](https://cloud.google.com/iam/docs/full-resource-names)
* **Azure:** The [Fully Qualified Resource ID](https://docs.microsoft.com/rest/api/resources/resources/get-by-id) of the invoked function,
*not* the function app, having the form
- `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/`.
+ `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/`.
This means that a span attribute MUST be used, as an Azure function app can host multiple functions that would usually share
a TracerProvider.
diff --git a/docs/gen-ai/gen-ai-metrics.md b/docs/gen-ai/gen-ai-metrics.md
index ca2de8ba31..ed54390b46 100644
--- a/docs/gen-ai/gen-ai-metrics.md
+++ b/docs/gen-ai/gen-ai-metrics.md
@@ -45,7 +45,7 @@ When systems report both used tokens and billable tokens, instrumentation MUST r
This metric SHOULD be specified with [ExplicitBucketBoundaries] of [1, 4, 16, 64, 256, 1024, 4096, 16384, 65536, 262144, 1048576, 4194304, 16777216, 67108864].
-
+
@@ -56,19 +56,6 @@ This metric SHOULD be specified with [ExplicitBucketBoundaries] of [1, 4, 16, 64
| -------- | --------------- | ----------- | -------------- | --------- |
| `gen_ai.client.token.usage` | Histogram | `{token}` | Measures number of input and output tokens used | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`gen_ai.operation.name`](/docs/attributes-registry/gen-ai.md) | string | The name of the operation being performed. [1] | `chat`; `text_completion` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -133,9 +120,9 @@ If none of these options apply, the `gen_ai.system` SHOULD be set to `_OTHER`.
This metric is [required][MetricRequired].
-This metric SHOULD be specified with [ExplicitBucketBoundaries] of [ 0.01, 0.02, 0.04, 0.08, 0.16, 0.32, 0.64, 1.28, 2.56, 5.12,10.24, 20.48, 40.96, 81.92].
+This metric SHOULD be specified with [ExplicitBucketBoundaries] of [0.01, 0.02, 0.04, 0.08, 0.16, 0.32, 0.64, 1.28, 2.56, 5.12, 10.24, 20.48, 40.96, 81.92].
-
+
@@ -146,19 +133,6 @@ This metric SHOULD be specified with [ExplicitBucketBoundaries] of [ 0.01, 0.02,
| -------- | --------------- | ----------- | -------------- | --------- |
| `gen_ai.client.operation.duration` | Histogram | `s` | GenAI operation duration | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`gen_ai.operation.name`](/docs/attributes-registry/gen-ai.md) | string | The name of the operation being performed. [1] | `chat`; `text_completion` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -233,9 +207,9 @@ This metric is [recommended][MetricRecommended] to report the model server
latency in terms of time spent per request.
This metric SHOULD be specified with [ExplicitBucketBoundaries] of
-[0.01, 0.02, 0.04, 0.08, 0.16, 0.32, 0.64, 1.28, 2.56, 5.12,10.24, 20.48, 40.96, 81.92].
+[0.01, 0.02, 0.04, 0.08, 0.16, 0.32, 0.64, 1.28, 2.56, 5.12, 10.24, 20.48, 40.96, 81.92].
-
+
@@ -246,19 +220,6 @@ This metric SHOULD be specified with [ExplicitBucketBoundaries] of
| -------- | --------------- | ----------- | -------------- | --------- |
| `gen_ai.server.request.duration` | Histogram | `s` | Generative AI server request duration such as time-to-last byte or last output token | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`gen_ai.operation.name`](/docs/attributes-registry/gen-ai.md) | string | The name of the operation being performed. [1] | `chat`; `text_completion` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -335,7 +296,7 @@ inference.
This metric SHOULD be specified with [ExplicitBucketBoundaries] of
[0.01, 0.025, 0.05, 0.075, 0.1, 0.15, 0.2, 0.3, 0.4, 0.5, 0.75, 1.0, 2.5].
-
+
@@ -346,19 +307,6 @@ This metric SHOULD be specified with [ExplicitBucketBoundaries] of
| -------- | --------------- | ----------- | -------------- | --------- |
| `gen_ai.server.time_per_output_token` | Histogram | `s` | Time per output token generated after the first token for successful responses | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`gen_ai.operation.name`](/docs/attributes-registry/gen-ai.md) | string | The name of the operation being performed. [1] | `chat`; `text_completion` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -422,7 +370,7 @@ using the buckets mentioned below.
This metric SHOULD be specified with [ExplicitBucketBoundaries] of
[0.001, 0.005, 0.01, 0.02, 0.04, 0.06, 0.08, 0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0].
-
+
@@ -433,19 +381,6 @@ This metric SHOULD be specified with [ExplicitBucketBoundaries] of
| -------- | --------------- | ----------- | -------------- | --------- |
| `gen_ai.server.time_to_first_token` | Histogram | `s` | Time to generate first token for successful responses | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`gen_ai.operation.name`](/docs/attributes-registry/gen-ai.md) | string | The name of the operation being performed. [1] | `chat`; `text_completion` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
diff --git a/docs/general/attribute-naming.md b/docs/general/attribute-naming.md
index 3b3445cb46..cded4a49ca 100644
--- a/docs/general/attribute-naming.md
+++ b/docs/general/attribute-naming.md
@@ -116,6 +116,12 @@ denote old attribute names in rename operations).
the following Unicode code points: Latin alphabet, Numeric, Underscore, Dot
(as namespace delimiter).
+> Note:
+> Semantic Conventions tooling limits names to lowercase
+> Latin alphabet, Numeric, Underscore, Dot (as namespace delimiter).
+> Names must start with a letter, end with an alphanumeric character, and must not
+> contain two or more consecutive delimiters (Underscore or Dot).
+
## Recommendations for Application Developers
As an application developer when you need to record an attribute first consult
diff --git a/docs/general/attributes.md b/docs/general/attributes.md
index 62f572e00e..e59e4e5688 100644
--- a/docs/general/attributes.md
+++ b/docs/general/attributes.md
@@ -480,7 +480,7 @@ Examples of where `thread.id` and `thread.name` can be extracted from:
| Language or platform | `thread.id` | `thread.name` |
|-----------------------|----------------------------------------|------------------------------------------------|
-| JVM | `Thread.currentThread().getId()` | `Thread.currentThread().getName()` |
+| JVM | `Thread.currentThread().threadId()` | `Thread.currentThread().getName()` |
| .NET | `Thread.CurrentThread.ManagedThreadId` | `Thread.CurrentThread.Name` |
| Python | `threading.current_thread().ident` | `threading.current_thread().name` |
| Ruby | `Thread.current.object_id` | `Thread.current.name` |
diff --git a/docs/general/logs.md b/docs/general/logs.md
index b43357fdaf..6d27241933 100644
--- a/docs/general/logs.md
+++ b/docs/general/logs.md
@@ -44,7 +44,7 @@ These attributes may be used for identifying a Log Record.
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
-| [`log.record.original`](/docs/attributes-registry/log.md) | string | The complete orignal Log Record. [1] | `77 <86>1 2015-08-06T21:58:59.694Z 192.168.2.133 inactive - - - Something happened`; `[INFO] 8/3/24 12:34:56 Something happened` | `Opt-In` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| [`log.record.original`](/docs/attributes-registry/log.md) | string | The complete original Log Record. [1] | `77 <86>1 2015-08-06T21:58:59.694Z 192.168.2.133 inactive - - - Something happened`; `[INFO] 8/3/24 12:34:56 Something happened` | `Opt-In` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`log.record.uid`](/docs/attributes-registry/log.md) | string | A unique identifier for the Log Record. [2] | `01ARZ3NDEKTSV4RRFFQ69G5FAV` | `Opt-In` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
**[1]:** This value MAY be added when processing a Log Record which was originally transmitted as a string or equivalent data type AND the Body field of the Log Record does not contain the same value. (e.g. a syslog or a log record read from a file.)
diff --git a/docs/general/profiles.md b/docs/general/profiles.md
new file mode 100644
index 0000000000..93efd6a67c
--- /dev/null
+++ b/docs/general/profiles.md
@@ -0,0 +1,55 @@
+
+
+# General Profiles Attributes
+
+**Status**: [Experimental][DocumentStatus]
+
+
+
+- [Frame types](#frame-types)
+
+
+
+The attributes described in this section are rather generic.
+They may be used in any Profiles record they apply to.
+
+## Frame types
+
+**Description:** Describes the origin of a single frame in a Profile.
+
+
+
+
+
+
+
+
+| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
+|---|---|---|---|---|---|
+| [`profile.frame.type`](/docs/attributes-registry/profile.md) | string | Describes the interpreter or compiler of a single frame. | `cpython` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+`profile.frame.type` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used.
+
+| Value | Description | Stability |
+|---|---|---|
+| `cpython` | [Python](https://wikipedia.org/wiki/Python_(programming_language)) | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `dotnet` | [.NET](https://wikipedia.org/wiki/.NET) | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `jvm` | [JVM](https://wikipedia.org/wiki/Java_virtual_machine) | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `kernel` | [Kernel](https://wikipedia.org/wiki/Kernel_(operating_system)) | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `native` | [C](https://wikipedia.org/wiki/C_(programming_language)), [C++](https://wikipedia.org/wiki/C%2B%2B), [Go](https://wikipedia.org/wiki/Go_(programming_language)), [Rust](https://wikipedia.org/wiki/Rust_(programming_language)) | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `perl` | [Perl](https://wikipedia.org/wiki/Perl) | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `php` | [PHP](https://wikipedia.org/wiki/PHP) | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `ruby` | [Ruby](https://wikipedia.org/wiki/Ruby_(programming_language)) | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `v8js` | [V8JS](https://wikipedia.org/wiki/V8_(JavaScript_engine)) | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+
+
+
+
+
+
+[DocumentStatus]: https://opentelemetry.io/docs/specs/otel/document-status
diff --git a/docs/hardware/common.md b/docs/hardware/common.md
index 050f91086d..b2af5fad63 100644
--- a/docs/hardware/common.md
+++ b/docs/hardware/common.md
@@ -74,7 +74,7 @@ monitored component:
This metric is [recommended][MetricRecommended].
-
+
@@ -85,19 +85,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `hw.energy` | Counter | `J` | Energy consumed by the component | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`hw.id`](/docs/attributes-registry/hardware.md) | string | An identifier for the hardware component, unique within the monitored host | `win32battery_battery_testsysa33_1` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -139,7 +126,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -150,19 +137,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `hw.errors` | Counter | `{error}` | Number of errors encountered by the component | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`hw.id`](/docs/attributes-registry/hardware.md) | string | An identifier for the hardware component, unique within the monitored host | `win32battery_battery_testsysa33_1` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -214,7 +188,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -229,19 +203,6 @@ This metric is [recommended][MetricRecommended].
**[1]:** It is recommended to report `hw.energy` instead of `hw.power` when possible.
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`hw.id`](/docs/attributes-registry/hardware.md) | string | An identifier for the hardware component, unique within the monitored host | `win32battery_battery_testsysa33_1` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -283,7 +244,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -298,19 +259,6 @@ This metric is [recommended][MetricRecommended].
**[1]:** `hw.status` is currently specified as an *UpDownCounter* but would ideally be represented using a [*StateSet* as defined in OpenMetrics](https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md#stateset). This semantic convention will be updated once *StateSet* is specified in OpenTelemetry. This planned change is not expected to have any consequence on the way users query their timeseries backend to retrieve the values of `hw.status` over time.
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`hw.id`](/docs/attributes-registry/hardware.md) | string | An identifier for the hardware component, unique within the monitored host | `win32battery_battery_testsysa33_1` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
diff --git a/docs/http/http-metrics.md b/docs/http/http-metrics.md
index 1a00e406cf..434f060c95 100644
--- a/docs/http/http-metrics.md
+++ b/docs/http/http-metrics.md
@@ -68,7 +68,7 @@ This metric SHOULD be specified with
[`ExplicitBucketBoundaries`](https://github.com/open-telemetry/opentelemetry-specification/tree/v1.35.0/specification/metrics/api.md#instrument-advisory-parameters)
of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10 ]`.
-
+
@@ -79,19 +79,6 @@ of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10
| -------- | --------------- | ----------- | -------------- | --------- |
| `http.server.request.duration` | Histogram | `s` | Duration of HTTP server requests. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`http.request.method`](/docs/attributes-registry/http.md) | string | HTTP request method. [1] | `GET`; `POST`; `HEAD` | `Required` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -192,7 +179,7 @@ SHOULD include the [application root](/docs/http/http-spans.md#http-server-defin
This metric is optional.
-
+
@@ -203,19 +190,6 @@ This metric is optional.
| -------- | --------------- | ----------- | -------------- | --------- |
| `http.server.active_requests` | UpDownCounter | `{request}` | Number of active HTTP server requests. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`http.request.method`](/docs/attributes-registry/http.md) | string | HTTP request method. [1] | `GET`; `POST`; `HEAD` | `Required` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -276,7 +250,7 @@ Tracing instrumentations that do so, MUST also set `http.request.method_original
This metric is optional.
-
+
@@ -291,19 +265,6 @@ This metric is optional.
**[1]:** The size of the request payload body in bytes. This is the number of bytes transferred excluding headers and is often, but not always, present as the [Content-Length](https://www.rfc-editor.org/rfc/rfc9110.html#field.content-length) header. For requests using transport encoding, this should be the compressed size.
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`http.request.method`](/docs/attributes-registry/http.md) | string | HTTP request method. [1] | `GET`; `POST`; `HEAD` | `Required` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -404,7 +365,7 @@ SHOULD include the [application root](/docs/http/http-spans.md#http-server-defin
This metric is optional.
-
+
@@ -419,19 +380,6 @@ This metric is optional.
**[1]:** The size of the response payload body in bytes. This is the number of bytes transferred excluding headers and is often, but not always, present as the [Content-Length](https://www.rfc-editor.org/rfc/rfc9110.html#field.content-length) header. For requests using transport encoding, this should be the compressed size.
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`http.request.method`](/docs/attributes-registry/http.md) | string | HTTP request method. [1] | `GET`; `POST`; `HEAD` | `Required` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -540,7 +488,7 @@ This metric SHOULD be specified with
[`ExplicitBucketBoundaries`](https://github.com/open-telemetry/opentelemetry-specification/tree/v1.35.0/specification/metrics/api.md#instrument-advisory-parameters)
of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10 ]`.
-
+
@@ -551,19 +499,6 @@ of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10
| -------- | --------------- | ----------- | -------------- | --------- |
| `http.client.request.duration` | Histogram | `s` | Duration of HTTP client requests. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`http.request.method`](/docs/attributes-registry/http.md) | string | HTTP request method. [1] | `GET`; `POST`; `HEAD` | `Required` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -679,7 +614,7 @@ Instrumentations MAY allow users to enable additional experimental attributes.
This metric is optional.
-
+
@@ -694,19 +629,6 @@ This metric is optional.
**[1]:** The size of the request payload body in bytes. This is the number of bytes transferred excluding headers and is often, but not always, present as the [Content-Length](https://www.rfc-editor.org/rfc/rfc9110.html#field.content-length) header. For requests using transport encoding, this should be the compressed size.
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`http.request.method`](/docs/attributes-registry/http.md) | string | HTTP request method. [1] | `GET`; `POST`; `HEAD` | `Required` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -798,7 +720,7 @@ If the request has completed successfully, instrumentations SHOULD NOT set `erro
This metric is optional.
-
+
@@ -813,19 +735,6 @@ This metric is optional.
**[1]:** The size of the response payload body in bytes. This is the number of bytes transferred excluding headers and is often, but not always, present as the [Content-Length](https://www.rfc-editor.org/rfc/rfc9110.html#field.content-length) header. For requests using transport encoding, this should be the compressed size.
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`http.request.method`](/docs/attributes-registry/http.md) | string | HTTP request method. [1] | `GET`; `POST`; `HEAD` | `Required` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -917,7 +826,7 @@ If the request has completed successfully, instrumentations SHOULD NOT set `erro
This metric is optional.
-
+
@@ -928,19 +837,6 @@ This metric is optional.
| -------- | --------------- | ----------- | -------------- | --------- |
| `http.client.open_connections` | UpDownCounter | `{connection}` | Number of outbound HTTP connections that are currently active or idle on the client. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`http.connection.state`](/docs/attributes-registry/http.md) | string | State of the HTTP connection in the HTTP connection pool. | `active`; `idle` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -980,7 +876,7 @@ of `[ 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 30, 60, 120, 300 ]`.
This metric is optional.
-
+
@@ -991,19 +887,6 @@ This metric is optional.
| -------- | --------------- | ----------- | -------------- | --------- |
| `http.client.connection.duration` | Histogram | `s` | The duration of the successfully established outbound HTTP connections. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`server.address`](/docs/attributes-registry/server.md) | string | Server domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name. [1] | `example.com`; `10.1.2.80`; `/tmp/my.sock` | `Required` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -1032,7 +915,7 @@ This metric is optional.
This metric is optional.
-
+
@@ -1043,19 +926,6 @@ This metric is optional.
| -------- | --------------- | ----------- | -------------- | --------- |
| `http.client.active_requests` | UpDownCounter | `{request}` | Number of active HTTP requests. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`server.address`](/docs/attributes-registry/server.md) | string | Server domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name. [1] | `example.com`; `10.1.2.80`; `/tmp/my.sock` | `Required` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
diff --git a/docs/messaging/messaging-metrics.md b/docs/messaging/messaging-metrics.md
index 25c6a275ef..afd8bff072 100644
--- a/docs/messaging/messaging-metrics.md
+++ b/docs/messaging/messaging-metrics.md
@@ -35,7 +35,7 @@ This metric SHOULD be specified with
[`ExplicitBucketBoundaries`](https://github.com/open-telemetry/opentelemetry-specification/tree/v1.35.0/specification/metrics/api.md#instrument-advisory-parameters)
of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10 ]`.
-
+
@@ -50,19 +50,6 @@ of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10
**[1]:** This metric SHOULD NOT be used to report processing duration - processing duration is reported in `messaging.process.duration` metric.
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`messaging.operation.name`](/docs/attributes-registry/messaging.md) | string | The system-specific name of the messaging operation. | `send`; `receive`; `ack` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -165,7 +152,7 @@ the broker doesn't have such notion, the destination name SHOULD uniquely identi
This metric is [required][MetricRequired].
-
+
@@ -180,19 +167,6 @@ This metric is [required][MetricRequired].
**[1]:** This metric MUST NOT count messages that were created haven't yet been attempted to be published.
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`messaging.operation.name`](/docs/attributes-registry/messaging.md) | string | The system-specific name of the messaging operation. | `send`; `schedule`; `enqueue` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -275,7 +249,7 @@ the broker doesn't have such notion, the destination name SHOULD uniquely identi
This metric is [required][MetricRequired].
-
+
@@ -291,19 +265,6 @@ This metric is [required][MetricRequired].
The metric SHOULD be reported once per message delivery. For example, if receiving and processing operations are both instrumented for a single message delivery, this counter is incremented when the message is received and not reported when it is processed.
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`messaging.operation.name`](/docs/attributes-registry/messaging.md) | string | The system-specific name of the messaging operation. | `receive`; `peek`; `poll`; `consume` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -396,7 +357,7 @@ This metric SHOULD be specified with
[`ExplicitBucketBoundaries`](https://github.com/open-telemetry/opentelemetry-specification/tree/v1.35.0/specification/metrics/api.md#instrument-advisory-parameters)
of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10 ]`.
-
+
@@ -411,19 +372,6 @@ of `[ 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10
**[1]:** This metric MUST be reported for operations with `messaging.operation.type` that matches `process`.
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`messaging.operation.name`](/docs/attributes-registry/messaging.md) | string | The system-specific name of the messaging operation. | `process`; `consume`; `handle` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
diff --git a/docs/messaging/messaging-spans.md b/docs/messaging/messaging-spans.md
index 7f5b431983..5ffc36c97d 100644
--- a/docs/messaging/messaging-spans.md
+++ b/docs/messaging/messaging-spans.md
@@ -25,6 +25,7 @@
- [Trace structure](#trace-structure)
- [Producer spans](#producer-spans)
- [Consumer spans](#consumer-spans)
+ - [Message creation context as parent of "Process" span](#message-creation-context-as-parent-of-process-span)
- [Messaging attributes](#messaging-attributes)
- [Recording per-message attributes on batch operations](#recording-per-message-attributes-on-batch-operations)
- [Examples](#examples)
@@ -208,21 +209,13 @@ Span kind SHOULD be set according to the following table, based on the operation
| Operation type | Span kind|
|----------------|-------------|
-| `create` | `PRODUCER` |
-| `publish` | `PRODUCER` if the context of the "Publish" span is used as creation context. |
-| `receive` | `CONSUMER` |
-| `process` | `CONSUMER` for push-based scenarios where no "Receive" span exists. |
-
-For cases not covered by the table above, the span kind should be set according
-to the [generic specification about span kinds](https://github.com/open-telemetry/opentelemetry-specification/tree/v1.35.0/specification/trace/api.md#spankind),
-e. g. it should be set to CLIENT for the "Publish" span if its context is not
-used as creation context and if the "Publish" span models a synchronous call to
-the intermediary.
-
-Setting span kinds according to this table ensures that span links between
-consumers and producers always exist between a PRODUCER span on the producer
-side and a CONSUMER span on the consumer side. This allows analysis tools to
-interpret linked traces without the need for additional semantic hints.
+| `create` | `PRODUCER` |
+| `publish` | `PRODUCER` if the context of the "Publish" span is used as creation context, otherwise `CLIENT`. |
+| `receive` | `CLIENT` |
+| `process` | `CONSUMER` |
+
+Setting span kinds according to this table allows analysis tools to interpret spans
+and relationships between them without the need for additional semantic hints.
### Trace structure
@@ -269,12 +262,56 @@ batch of messages, or for no message at all (if it is signalled that no
messages were received). For each message it accounts for, the "Process" or
"Receive" span SHOULD link to the message's creation context.
+> [!IMPORTANT]
+> These conventions use spans links as the default mechanism to correlate
+> producers and consumer(s) because:
+>
+> - It is the only consistent trace structure that can be guaranteed,
+> given the many different messaging systems models available.
+>
+> - It is the only option to correlate producer and consumer(s) in batch scenarios
+> as a span can only have a single parent.
+>
+> - It is the only option to correlate produce and consumer(s) when message
+> consumption can happen in the scope of another ambient context such as a
+> HTTP server span.
+
"Settle" spans SHOULD be created for every manually or automatically triggered
settlement operation. A single "Settle" span can account for a single message
or for multiple messages (in case messages are passed for settling as batches).
For each message it accounts for, the "Settle" span MAY link to the creation
context of the message.
+##### Message creation context as parent of "Process" span
+
+Exclusively for single messages scenarios, the "Process" span MAY
+use the message's creation context as its parent, thus achieving a direct
+parent-child relationship between producer and consumer(s).
+Instrumentations SHOULD document whether they use the message creation context
+as a parent for "Process" spans and MAY provide configuration options
+allowing users to control this behavior.
+
+It is NOT RECOMMENDED to use the message creation context as the parent of "Process"
+spans (by default) if processing happens in the scope of another span.
+
+If instrumentation use the message creation context as the parent for "Process"
+spans in the scope of another valid ambient context, they SHOULD add the
+ambient context as a link on the "Process" span to preserve the correlation
+between message processing and that context.
+
+For example, a messaging broker pushes messages over HTTP to a consumer
+application which has HTTP server and messaging instrumentations enabled.
+
+The messaging instrumentation would create the "Process" span following
+one of these possible approaches:
+
+- "Process" span is a child of the HTTP server span context and has a link
+ to the message creation context. This is the default behavior.
+
+- "Process" span is a child of the message creation context and has two links:
+ one to the message creation context and another one to HTTP server span context.
+ This is an opt-in behavior.
+
## Messaging attributes
Messaging attributes are organized into the following namespaces:
@@ -475,17 +512,19 @@ flowchart LR;
R2[Span Process A 2]
end
P-. link .-R1;
+ P-- parent -->R1;
P-. link .-R2;
+ P-- parent -->R2;
classDef normal fill:green
class P,R1,R2 normal
- linkStyle 0,1 color:green,stroke:green
+ linkStyle 0,1,2,3 color:green,stroke:green
```
| Field or Attribute | Span Publish A | Span Process A 1| Span Process A 2 |
|-|-|-|-|
| Span name | `publish T` | `consume T` | `consume T` |
-| Parent | | | |
+| Parent (optional) | | `publish T` | `publish T` |
| Links | | `publish T` | `publish T` |
| SpanKind | `PRODUCER` | `CONSUMER` | `CONSUMER` |
| `server.address` | `"ms"` | `"ms"` | `"ms"` |
diff --git a/docs/non-normative/code-generation.md b/docs/non-normative/code-generation.md
index e8e22d8848..fddb18601e 100644
--- a/docs/non-normative/code-generation.md
+++ b/docs/non-normative/code-generation.md
@@ -86,9 +86,10 @@ This section contains suggestions on how to structure semantic convention artifa
This section describes how to do code-generation with weaver.
> [!IMPORTANT]
-> We're transitioning from [build-tools](https://github.com/open-telemetry/build-tools/blob/main/semantic-conventions/README.md#code-generator)
+> We're transitioning away from [build-tools](https://github.com/open-telemetry/build-tools/blob/main/semantic-conventions/README.md#code-generator)
> to [opentelemetry-weaver](https://github.com/open-telemetry/weaver/blob/main/crates/weaver_forge/README.md) to generate code for semantic conventions.
> All new code-generation should be done using weaver, build-tools may become incompatible with future version of semantic conventions.
+> Weaver supports Semantic Conventions version starting from [1.26.0](https://github.com/open-telemetry/semantic-conventions/tree/v1.26.0).
Code-generation is based on YAML definitions in the specific version of semantic conventions.
Usually, it involves several steps where some can be semi-automated:
@@ -182,12 +183,11 @@ Notable changes on helper methods:
- `attr.fqn | to_const_name` -> `attr.name | screaming_snake_case`
- `attr.fqn | to_camelcase(True)` -> `attr.name | pascal_case`
-- `attr.brief | to_doc_brief | indent` -> `attr.brief | comment_with_prefix(" ")` (prefix is used to indent)
+- `attr.brief | to_doc_brief | indent` -> `attr.brief | comment(indent=4)`, check out extensive [comment formatting configuration](https://github.com/open-telemetry/weaver/blob/main/crates/weaver_forge/README.md#comment-filter)
- stability/deprecation checks:
- `attribute is stable` if checking one attribute, `attributes | select("stable")` to filter stable attributes
- `attribute is experimental` if checking one attribute, `attributes | select("experimental")` to filter experimental attributes
- `attribute is deprecated` if checking one attribute, `attributes | select("deprecated")` to filter deprecated attributes
- check if attribute is a template: `attribute.type is template_type`
-- `print_member_value` - no replacement at this time, use something like `{%- if type == "string" -%}"{{value}}"{%-else-%}{{value}}{%-endif-%}`
- new way to simplify switch-like logic: `key | map_text("map_name")`. Maps can be defined in the weaver config.
It can be very useful to convert semantic convention attribute types to language-specific types.
diff --git a/docs/resource/README.md b/docs/resource/README.md
index 78770202e6..ca2387cb52 100644
--- a/docs/resource/README.md
+++ b/docs/resource/README.md
@@ -73,12 +73,6 @@ as specified in the [Resource SDK specification](https://github.com/open-telemet
## Service
-**Status**: [Stable][DocumentStatus]
-
-**type:** `service`
-
-**Description:** A service instance.
-
@@ -86,6 +80,13 @@ as specified in the [Resource SDK specification](https://github.com/open-telemet
+
+**Status:** ![Stable](https://img.shields.io/badge/-stable-lightgreen)
+
+**type:** `service`
+
+**Description:** A service instance.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`service.name`](/docs/attributes-registry/service.md) | string | Logical name of the service. [1] | `shoppingcart` | `Required` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -103,12 +104,6 @@ as specified in the [Resource SDK specification](https://github.com/open-telemet
## Service (Experimental)
-**Status**: [Experimental][DocumentStatus]
-
-**type:** `service`
-
-**Description:** Additions to service instance.
-
@@ -116,6 +111,13 @@ as specified in the [Resource SDK specification](https://github.com/open-telemet
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `service`
+
+**Description:** A service instance.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`service.instance.id`](/docs/attributes-registry/service.md) | string | The string ID of the service instance. [1] | `627cc493-f310-47de-96bd-71410b7dec09` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -174,19 +176,20 @@ service.name = Shop.shoppingcart
## Telemetry SDK
-**Status**: [Stable][DocumentStatus]
-
-**type:** `telemetry.sdk`
-
-**Description:** The telemetry SDK used to capture data recorded by the instrumentation libraries.
-
-
+
+
+**Status:** ![Stable](https://img.shields.io/badge/-stable-lightgreen)
+
+**type:** `telemetry.sdk`
+
+**Description:** The telemetry SDK used to capture data recorded by the instrumentation libraries.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`telemetry.sdk.language`](/docs/attributes-registry/telemetry.md) | string | The language of the telemetry SDK. | `cpp`; `dotnet`; `erlang` | `Required` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -228,19 +231,20 @@ All custom identifiers SHOULD be stable across different versions of an implemen
## Telemetry Distribution (Experimental)
-**Status**: [Experimental][DocumentStatus]
-
-**type:** `telemetry.distro`
-
-**Description:** The telemetry distribution (distro) used to capture data recorded by the instrumentation libraries.
-
-
+
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `telemetry.sdk`
+
+**Description:** The telemetry SDK used to capture data recorded by the instrumentation libraries.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`telemetry.distro.name`](/docs/attributes-registry/telemetry.md) | string | The name of the auto instrumentation agent or distribution, if used. [1] | `parts-unlimited-java` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
diff --git a/docs/resource/android.md b/docs/resource/android.md
index 0f19b35bbd..674aea1b89 100644
--- a/docs/resource/android.md
+++ b/docs/resource/android.md
@@ -1,11 +1,5 @@
# Android
-**Status**: [Experimental][DocumentStatus]
-
-**type:** `android`
-
-**Description**: The Android platform on which the Android application is running.
-
@@ -13,6 +7,13 @@
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `android`
+
+**Description:** The Android platform on which the Android application is running.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`android.os.api_level`](/docs/attributes-registry/android.md) | string | Uniquely identifies the framework API revision offered by a version (`os.version`) of the android operating system. More information can be found [here](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels). | `33`; `32` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -22,5 +23,3 @@
-
-[DocumentStatus]: https://opentelemetry.io/docs/specs/otel/document-status
diff --git a/docs/resource/browser.md b/docs/resource/browser.md
index 65c19f76b2..333583a3d1 100644
--- a/docs/resource/browser.md
+++ b/docs/resource/browser.md
@@ -1,13 +1,5 @@
# Browser
-**Status**: [Experimental][DocumentStatus]
-
-**type:** `browser`
-
-**Description**: The web browser in which the application represented by the resource is running. The `browser.*` attributes MUST be used only for resources that represent applications running in a web browser (regardless of whether running on a mobile or desktop device).
-
-All of these attributes can be provided by the user agent itself in the form of an HTTP header (e.g. Sec-CH-UA, Sec-CH-Platform, User-Agent). However, the headers could be removed by proxy servers, and are tied to calls from individual clients. In order to support batching through services like the Collector and to prevent loss of data (e.g. due to proxy servers removing headers), these attributes should be used when possible.
-
@@ -15,6 +7,13 @@ All of these attributes can be provided by the user agent itself in the form of
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `browser`
+
+**Description:** The web browser in which the application represented by the resource is running. The `browser.*` attributes MUST be used only for resources that represent applications running in a web browser (regardless of whether running on a mobile or desktop device).
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`browser.brands`](/docs/attributes-registry/browser.md) | string[] | Array of brand name and version separated by a space [1] | `[" Not A;Brand 99", "Chromium 99", "Chrome 99"]` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -42,4 +41,4 @@ The list of possible values is defined in the [W3C User-Agent Client Hints speci
-[DocumentStatus]: https://opentelemetry.io/docs/specs/otel/document-status
+All of these attributes can be provided by the user agent itself in the form of an HTTP header (e.g. Sec-CH-UA, Sec-CH-Platform, User-Agent). However, the headers could be removed by proxy servers, and are tied to calls from individual clients. In order to support batching through services like the Collector and to prevent loss of data (e.g. due to proxy servers removing headers), these attributes should be used when possible.
diff --git a/docs/resource/cloud-provider/aws/ecs.md b/docs/resource/cloud-provider/aws/ecs.md
index df00ed8fad..596d44ad5a 100644
--- a/docs/resource/cloud-provider/aws/ecs.md
+++ b/docs/resource/cloud-provider/aws/ecs.md
@@ -1,11 +1,5 @@
# AWS ECS
-**Status**: [Experimental][DocumentStatus]
-
-**type:** `aws.ecs`
-
-**Description:** Resources used by AWS Elastic Container Service (ECS).
-
@@ -13,6 +7,13 @@
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `aws.ecs`
+
+**Description:** Resources used by AWS Elastic Container Service (ECS).
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`aws.ecs.task.id`](/docs/attributes-registry/aws.md) | string | The ID of a running ECS task. The ID MUST be extracted from `task.arn`. | `10838bed-421f-43ef-870a-f43feacbbb5b`; `23ebb8ac-c18f-46c6-8bbe-d55d0e37cfbd` | `Conditionally Required` If and only if `task.arn` is populated. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -36,5 +37,3 @@
-
-[DocumentStatus]: https://opentelemetry.io/docs/specs/otel/document-status
diff --git a/docs/resource/cloud-provider/aws/eks.md b/docs/resource/cloud-provider/aws/eks.md
index 5a06d5dc79..e0dae028ba 100644
--- a/docs/resource/cloud-provider/aws/eks.md
+++ b/docs/resource/cloud-provider/aws/eks.md
@@ -1,11 +1,5 @@
# AWS EKS
-**Status**: [Experimental][DocumentStatus]
-
-**type:** `aws.eks`
-
-**Description:** Resources used by AWS Elastic Kubernetes Service (EKS).
-
@@ -13,6 +7,13 @@
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `aws.eks`
+
+**Description:** Resources used by AWS Elastic Kubernetes Service (EKS).
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`aws.eks.cluster.arn`](/docs/attributes-registry/aws.md) | string | The ARN of an EKS cluster. | `arn:aws:ecs:us-west-2:123456789123:cluster/my-cluster` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -22,5 +23,3 @@
-
-[DocumentStatus]: https://opentelemetry.io/docs/specs/otel/document-status
diff --git a/docs/resource/cloud-provider/aws/logs.md b/docs/resource/cloud-provider/aws/logs.md
index fe8544eb18..e0713e55d1 100644
--- a/docs/resource/cloud-provider/aws/logs.md
+++ b/docs/resource/cloud-provider/aws/logs.md
@@ -1,11 +1,5 @@
# AWS Logs
-**Status**: [Experimental][DocumentStatus]
-
-**Type:** `aws.log`
-
-**Description:** Log attributes for Amazon Web Services.
-
@@ -13,6 +7,13 @@
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `aws.log`
+
+**Description:** Resources specific to Amazon Web Services.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`aws.log.group.arns`](/docs/attributes-registry/aws.md) | string[] | The Amazon Resource Name(s) (ARN) of the AWS log group(s). [1] | `["arn:aws:logs:us-west-1:123456789012:log-group:/aws/my/group:*"]` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -33,5 +34,3 @@
-
-[DocumentStatus]: https://opentelemetry.io/docs/specs/otel/document-status
diff --git a/docs/resource/cloud-provider/gcp/cloud-run.md b/docs/resource/cloud-provider/gcp/cloud-run.md
index b841feef20..01a29f3573 100644
--- a/docs/resource/cloud-provider/gcp/cloud-run.md
+++ b/docs/resource/cloud-provider/gcp/cloud-run.md
@@ -4,10 +4,6 @@
These conventions are recommended for resources running on Cloud Run.
-**Type:** `gcp.cloud_run`
-
-**Description:** Resource attributes for Cloud Run.
-
@@ -15,6 +11,13 @@ These conventions are recommended for resources running on Cloud Run.
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `gcp.cloud_run`
+
+**Description:** Resource used by Google Cloud Run.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`gcp.cloud_run.job.execution`](/docs/attributes-registry/gcp.md) | string | The name of the Cloud Run [execution](https://cloud.google.com/run/docs/managing/job-executions) being run for the Job, as set by the [`CLOUD_RUN_EXECUTION`](https://cloud.google.com/run/docs/container-contract#jobs-env-vars) environment variable. | `job-name-xxxx`; `sample-job-mdw84` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
diff --git a/docs/resource/cloud-provider/gcp/gce.md b/docs/resource/cloud-provider/gcp/gce.md
index d68a024ee2..ccebba761d 100644
--- a/docs/resource/cloud-provider/gcp/gce.md
+++ b/docs/resource/cloud-provider/gcp/gce.md
@@ -1,9 +1,5 @@
# Google Compute Engine
-**Type:** `gcp.gce`
-
-**Description:** Resource attributes for GCE instances.
-
@@ -11,6 +7,13 @@
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `gcp.gce`
+
+**Description:** Resources used by Google Compute Engine (GCE).
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`gcp.gce.instance.hostname`](/docs/attributes-registry/gcp.md) | string | The hostname of a GCE instance. This is the full value of the default or [custom hostname](https://cloud.google.com/compute/docs/instances/custom-hostname-vm). | `my-host1234.example.com`; `sample-vm.us-west1-b.c.my-project.internal` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
diff --git a/docs/resource/cloud-provider/heroku.md b/docs/resource/cloud-provider/heroku.md
index 4905dc06fb..55a7923051 100644
--- a/docs/resource/cloud-provider/heroku.md
+++ b/docs/resource/cloud-provider/heroku.md
@@ -13,6 +13,13 @@
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `heroku`
+
+**Description:** Heroku dyno metadata
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`heroku.app.id`](/docs/attributes-registry/heroku.md) | string | Unique identifier for the application | `2daa2797-e42b-4624-9322-ec3f968df4da` | `Opt-In` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
diff --git a/docs/resource/cloud.md b/docs/resource/cloud.md
index 4af0bb8176..8664fe52f5 100644
--- a/docs/resource/cloud.md
+++ b/docs/resource/cloud.md
@@ -1,11 +1,5 @@
# Cloud
-**Status**: [Experimental][DocumentStatus]
-
-**type:** `cloud`
-
-**Description:** A cloud infrastructure (e.g. GCP, Azure, AWS).
-
@@ -13,6 +7,13 @@
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `cloud`
+
+**Description:** A cloud environment (e.g. GCP, Azure, AWS)
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`cloud.account.id`](/docs/attributes-registry/cloud.md) | string | The cloud account ID the resource is assigned to. | `111111111111`; `opentelemetry` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -20,7 +21,7 @@
| [`cloud.platform`](/docs/attributes-registry/cloud.md) | string | The cloud platform in use. [2] | `alibaba_cloud_ecs`; `alibaba_cloud_fc`; `alibaba_cloud_openshift` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`cloud.provider`](/docs/attributes-registry/cloud.md) | string | Name of the cloud provider. | `alibaba_cloud`; `aws`; `azure` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`cloud.region`](/docs/attributes-registry/cloud.md) | string | The geographical region the resource is running. [3] | `us-central1`; `us-east-1` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| [`cloud.resource_id`](/docs/attributes-registry/cloud.md) | string | Cloud provider-specific native identifier of the monitored cloud resource (e.g. an [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) on AWS, a [fully qualified resource ID](https://learn.microsoft.com/rest/api/resources/resources/get-by-id) on Azure, a [full resource name](https://cloud.google.com/apis/design/resource_names#full_resource_name) on GCP) [4] | `arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function`; `//run.googleapis.com/projects/PROJECT_ID/locations/LOCATION_ID/services/SERVICE_ID`; `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| [`cloud.resource_id`](/docs/attributes-registry/cloud.md) | string | Cloud provider-specific native identifier of the monitored cloud resource (e.g. an [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) on AWS, a [fully qualified resource ID](https://learn.microsoft.com/rest/api/resources/resources/get-by-id) on Azure, a [full resource name](https://cloud.google.com/apis/design/resource_names#full_resource_name) on GCP) [4] | `arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function`; `//run.googleapis.com/projects/PROJECT_ID/locations/LOCATION_ID/services/SERVICE_ID`; `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
**[1]:** Availability zones are called "zones" on Alibaba Cloud and Google Cloud.
@@ -42,7 +43,7 @@ The following well-known definitions MUST be used if you set this attribute and
* **GCP:** The [URI of the resource](https://cloud.google.com/iam/docs/full-resource-names)
* **Azure:** The [Fully Qualified Resource ID](https://docs.microsoft.com/rest/api/resources/resources/get-by-id) of the invoked function,
*not* the function app, having the form
- `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/`.
+ `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/`.
This means that a span attribute MUST be used, as an Azure function app can host multiple functions that would usually share
a TracerProvider.
@@ -100,5 +101,3 @@ The following well-known definitions MUST be used if you set this attribute and
-
-[DocumentStatus]: https://opentelemetry.io/docs/specs/otel/document-status
diff --git a/docs/resource/container.md b/docs/resource/container.md
index 84be2ca779..b57f2b0f36 100644
--- a/docs/resource/container.md
+++ b/docs/resource/container.md
@@ -1,11 +1,5 @@
# Container
-**Status**: [Experimental][DocumentStatus]
-
-**type:** `container`
-
-**Description:** A container instance.
-
@@ -13,6 +7,13 @@
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `container`
+
+**Description:** A container instance.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`container.id`](/docs/attributes-registry/container.md) | string | Container ID. Usually a UUID, as for example used to [identify Docker containers](https://docs.docker.com/engine/containers/run/#container-identification). The UUID might be abbreviated. | `a3bf90e006b2` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -25,8 +26,8 @@
| [`container.runtime`](/docs/attributes-registry/container.md) | string | The container runtime managing this container. | `docker`; `containerd`; `rkt` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`oci.manifest.digest`](/docs/attributes-registry/oci.md) | string | The digest of the OCI image manifest. For container images specifically is the digest by which the container image is known. [3] | `sha256:e4ca62c0d62f3e886e684806dfe9d4e0cda60d54986898173c1083856cfda0f4` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`container.command`](/docs/attributes-registry/container.md) | string | The command used to run the container (i.e. the command name). [4] | `otelcontribcol` | `Opt-In` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| [`container.command_args`](/docs/attributes-registry/container.md) | string[] | All the command arguments (including the command/executable itself) run by the container. [2] | `["otelcontribcol", "--config", "config.yaml"]` | `Opt-In` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| [`container.command_line`](/docs/attributes-registry/container.md) | string | The full command run by the container as a single string representing the full command. [2] | `otelcontribcol --config config.yaml` | `Opt-In` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| [`container.command_args`](/docs/attributes-registry/container.md) | string[] | All the command arguments (including the command/executable itself) run by the container. | `["otelcontribcol", "--config", "config.yaml"]` | `Opt-In` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| [`container.command_line`](/docs/attributes-registry/container.md) | string | The full command run by the container as a single string representing the full command. | `otelcontribcol --config config.yaml` | `Opt-In` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
**[1]:** Docker defines a sha256 of the image id; `container.image.id` corresponds to the `Image` field from the Docker container inspect [API](https://docs.docker.com/engine/api/v1.43/#tag/Container/operation/ContainerInspect) endpoint.
K8s defines a link to the container registry repository with digest `"imageID": "registry.azurecr.io /namespace/service/dockerfile@sha256:bdeabd40c3a8a492eaf9e8e44d0ebbb84bac7ee25ac0cf8a7159d25f62555625"`.
@@ -46,5 +47,3 @@ An example can be found in [Example Image Manifest](https://docs.docker.com/regi
-
-[DocumentStatus]: https://opentelemetry.io/docs/specs/otel/document-status
diff --git a/docs/resource/deployment-environment.md b/docs/resource/deployment-environment.md
index 72cb250024..44ef6af793 100644
--- a/docs/resource/deployment-environment.md
+++ b/docs/resource/deployment-environment.md
@@ -1,11 +1,5 @@
# Deployment
-**Status**: [Experimental][DocumentStatus]
-
-**type:** `deployment`
-
-**Description:** The software deployment.
-
@@ -13,6 +7,13 @@
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `deployment`
+
+**Description:** The software deployment.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`deployment.environment.name`](/docs/attributes-registry/deployment.md) | string | Name of the [deployment environment](https://wikipedia.org/wiki/Deployment_environment) (aka deployment tier). [1] | `staging`; `production` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -32,5 +33,3 @@ considered to be identifying the same service:
-
-[DocumentStatus]: https://opentelemetry.io/docs/specs/otel/document-status
diff --git a/docs/resource/device.md b/docs/resource/device.md
index d77e1f3d76..d4d1dfca69 100644
--- a/docs/resource/device.md
+++ b/docs/resource/device.md
@@ -1,11 +1,5 @@
# Device
-**Status**: [Experimental][DocumentStatus]
-
-**type:** `device`
-
-**Description**: The device on which the process represented by this resource is running.
-
@@ -13,6 +7,13 @@
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `device`
+
+**Description:** The device on which the process represented by this resource is running.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`device.id`](/docs/attributes-registry/device.md) | string | A unique identifier representing the device [1] | `2ab2916d-a51f-4ac8-80ee-45ac31a28092` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -35,5 +36,3 @@
-
-[DocumentStatus]: https://opentelemetry.io/docs/specs/otel/document-status
diff --git a/docs/resource/faas.md b/docs/resource/faas.md
index e8fb00714d..2593d9a19f 100644
--- a/docs/resource/faas.md
+++ b/docs/resource/faas.md
@@ -1,11 +1,5 @@
# Function as a Service
-**Status**: [Experimental][DocumentStatus]
-
-**type:** `faas`
-
-**Description:** A "function as a service" aka "serverless function" instance.
-
See also:
- The [Trace semantic conventions for FaaS](/docs/faas/faas-spans.md)
@@ -20,10 +14,17 @@ See also:
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `faas`
+
+**Description:** A serverless instance.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`faas.name`](/docs/attributes-registry/faas.md) | string | The name of the single function that this runtime instance executes. [1] | `my-function`; `myazurefunctionapp/some-function-name` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| [`cloud.resource_id`](/docs/attributes-registry/cloud.md) | string | Cloud provider-specific native identifier of the monitored cloud resource (e.g. an [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) on AWS, a [fully qualified resource ID](https://learn.microsoft.com/rest/api/resources/resources/get-by-id) on Azure, a [full resource name](https://cloud.google.com/apis/design/resource_names#full_resource_name) on GCP) [2] | `arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function`; `//run.googleapis.com/projects/PROJECT_ID/locations/LOCATION_ID/services/SERVICE_ID`; `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| [`cloud.resource_id`](/docs/attributes-registry/cloud.md) | string | Cloud provider-specific native identifier of the monitored cloud resource (e.g. an [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) on AWS, a [fully qualified resource ID](https://learn.microsoft.com/rest/api/resources/resources/get-by-id) on Azure, a [full resource name](https://cloud.google.com/apis/design/resource_names#full_resource_name) on GCP) [2] | `arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function`; `//run.googleapis.com/projects/PROJECT_ID/locations/LOCATION_ID/services/SERVICE_ID`; `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`faas.instance`](/docs/attributes-registry/faas.md) | string | The execution environment ID as a string, that will be potentially reused for other invocations to the same function/function version. [3] | `2021/06/28/[$LATEST]2f399eb14537447da05ab2a2e39309de` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`faas.max_memory`](/docs/attributes-registry/faas.md) | int | The amount of memory available to the serverless function converted to Bytes. [4] | `134217728` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`faas.version`](/docs/attributes-registry/faas.md) | string | The immutable version of the function being executed. [5] | `26`; `pinkfroid-00002` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -59,7 +60,7 @@ The following well-known definitions MUST be used if you set this attribute and
* **GCP:** The [URI of the resource](https://cloud.google.com/iam/docs/full-resource-names)
* **Azure:** The [Fully Qualified Resource ID](https://docs.microsoft.com/rest/api/resources/resources/get-by-id) of the invoked function,
*not* the function app, having the form
- `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/`.
+ `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/`.
This means that a span attribute MUST be used, as an Azure function app can host multiple functions that would usually share
a TracerProvider.
@@ -92,5 +93,3 @@ Note: The resource attribute `faas.instance` differs from the span attribute `fa
There are cases where a FaaS resource attribute is better applied as a span
attribute instead.
See the [FaaS trace conventions](/docs/faas/faas-spans.md) for more.
-
-[DocumentStatus]: https://opentelemetry.io/docs/specs/otel/document-status
diff --git a/docs/resource/host.md b/docs/resource/host.md
index 77689d5ca1..6a9d0004e4 100644
--- a/docs/resource/host.md
+++ b/docs/resource/host.md
@@ -1,11 +1,5 @@
# Host
-**Status**: [Experimental][DocumentStatus]
-
-**type:** `host`
-
-**Description:** A host is defined as a computing instance. For example, physical servers, virtual machines, switches or disk array.
-
The `host.*` namespace SHOULD be exclusively used to capture resource attributes.
To report host metrics, the `system.*` namespace SHOULD be used.
@@ -16,21 +10,54 @@ To report host metrics, the `system.*` namespace SHOULD be used.
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `host`
+
+**Description:** A host is defined as a computing instance. For example, physical servers, virtual machines, switches or disk array.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`host.arch`](/docs/attributes-registry/host.md) | string | The CPU architecture the host system is running on. | `amd64`; `arm32`; `arm64` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| [`host.id`](/docs/attributes-registry/host.md) | string | Unique host ID. For Cloud, this must be the instance_id assigned by the cloud provider. For non-containerized systems, this should be the `machine-id`. See the table below for the sources to use to determine the `machine-id` based on operating system. | `fdbf79e8af94cb7f9e8df36789187052` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| [`host.id`](/docs/attributes-registry/host.md) | string | Unique host ID. For Cloud, this must be the instance_id assigned by the cloud provider. For non-containerized systems, this should be the `machine-id`. See the table below for the sources to use to determine the `machine-id` based on operating system. [1] | `fdbf79e8af94cb7f9e8df36789187052` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`host.image.id`](/docs/attributes-registry/host.md) | string | VM image ID or host OS image ID. For Cloud, this value is from the provider. | `ami-07b06b442921831e5` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`host.image.name`](/docs/attributes-registry/host.md) | string | Name of the VM image or OS install the host was instantiated from. | `infra-ami-eks-worker-node-7d4ec78312`; `CentOS-8-x86_64-1905` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`host.image.version`](/docs/attributes-registry/host.md) | string | The version string of the VM image or host OS as defined in [Version Attributes](/docs/resource/README.md#version-attributes). | `0.1` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`host.name`](/docs/attributes-registry/host.md) | string | Name of the host. On Unix systems, it may contain what the hostname command returns, or the fully qualified hostname, or another name specified by the user. | `opentelemetry-test` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`host.type`](/docs/attributes-registry/host.md) | string | Type of host. For Cloud, this must be the machine type. | `n1-standard-1` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| [`host.ip`](/docs/attributes-registry/host.md) | string[] | Available IP addresses of the host, excluding loopback interfaces. [1] | `["192.168.1.140", "fe80::abc2:4a28:737a:609e"]` | `Opt-In` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| [`host.mac`](/docs/attributes-registry/host.md) | string[] | Available MAC addresses of the host, excluding loopback interfaces. [2] | `["AC-DE-48-23-45-67", "AC-DE-48-23-45-67-01-9F"]` | `Opt-In` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| [`host.ip`](/docs/attributes-registry/host.md) | string[] | Available IP addresses of the host, excluding loopback interfaces. [2] | `["192.168.1.140", "fe80::abc2:4a28:737a:609e"]` | `Opt-In` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| [`host.mac`](/docs/attributes-registry/host.md) | string[] | Available MAC addresses of the host, excluding loopback interfaces. [3] | `["AC-DE-48-23-45-67", "AC-DE-48-23-45-67-01-9F"]` | `Opt-In` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+**[1]:** Collecting `host.id` from non-containerized systems
+
+**Non-privileged Machine ID Lookup**
-**[1]:** IPv4 Addresses MUST be specified in dotted-quad notation. IPv6 addresses MUST be specified in the [RFC 5952](https://www.rfc-editor.org/rfc/rfc5952.html) format.
+When collecting `host.id` for non-containerized systems non-privileged lookups
+of the machine id are preferred. SDK detector implementations MUST use the
+sources listed below to obtain the machine id.
+
+| OS | Primary | Fallback |
+|---------|---------|---------|
+| Linux | contents of `/etc/machine-id` | contents of `/var/lib/dbus/machine-id` |
+| BSD | contents of `/etc/hostid` | output of `kenv -q smbios.system.uuid` |
+| MacOS | `IOPlatformUUID` line from the output of `ioreg -rd1 -c "IOPlatformExpertDevice"` | - |
+| Windows | `MachineGuid` from registry `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography` | - |
-**[2]:** MAC Addresses MUST be represented in [IEEE RA hexadecimal form](https://standards.ieee.org/wp-content/uploads/import/documents/tutorials/eui.pdf): as hyphen-separated octets in uppercase hexadecimal form from most to least significant.
+**Privileged Machine ID Lookup**
+
+The `host.id` can be looked up using privileged sources. For example, Linux
+systems can use the output of `dmidecode -t system`, `dmidecode -t baseboard`,
+`dmidecode -t chassis`, or read the corresponding data from the filesystem
+(e.g. `cat /sys/devices/virtual/dmi/id/product_id`,
+`cat /sys/devices/virtual/dmi/id/product_uuid`, etc), however, SDK resource
+detector implementations MUST not collect `host.id` from privileged sources. If
+privileged lookup of `host.id` is required, the value should be injected via the
+`OTEL_RESOURCE_ATTRIBUTES` environment variable.
+
+**[2]:** IPv4 Addresses MUST be specified in dotted-quad notation. IPv6 addresses MUST be specified in the [RFC 5952](https://www.rfc-editor.org/rfc/rfc5952.html) format.
+
+**[3]:** MAC Addresses MUST be represented in [IEEE RA hexadecimal form](https://standards.ieee.org/wp-content/uploads/import/documents/tutorials/eui.pdf): as hyphen-separated octets in uppercase hexadecimal form from most to least significant.
@@ -63,6 +90,13 @@ To report host metrics, the `system.*` namespace SHOULD be used.
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `host.cpu`
+
+**Description:** A host's CPU information
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`host.cpu.cache.l2.size`](/docs/attributes-registry/host.md) | int | The amount of level 2 memory cache available to the processor (in Bytes). | `12288000` | `Opt-In` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -81,31 +115,3 @@ To report host metrics, the `system.*` namespace SHOULD be used.
-
-## Collecting host.id from non-containerized systems
-
-### Non-privileged Machine ID Lookup
-
-When collecting `host.id` for non-containerized systems non-privileged lookups
-of the machine id are preferred. SDK detector implementations MUST use the
-sources listed below to obtain the machine id.
-
-| OS | Primary | Fallback |
-|---------|-----------------------------------------------------------------------------------|----------------------------------------|
-| Linux | contents of `/etc/machine-id` | contents of `/var/lib/dbus/machine-id` |
-| BSD | contents of `/etc/hostid` | output of `kenv -q smbios.system.uuid` |
-| MacOS | `IOPlatformUUID` line from the output of `ioreg -rd1 -c "IOPlatformExpertDevice"` | - |
-| Windows | `MachineGuid` from registry `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography` | - |
-
-### Privileged Machine ID Lookup
-
-The `host.id` can be looked up using privileged sources. For example, Linux
-systems can use the output of `dmidecode -t system`, `dmidecode -t baseboard`,
-`dmidecode -t chassis`, or read the corresponding data from the filesystem
-(e.g. `cat /sys/devices/virtual/dmi/id/product_id`,
-`cat /sys/devices/virtual/dmi/id/product_uuid`, etc), however, SDK resource
-detector implementations MUST not collect `host.id` from privileged sources. If
-privileged lookup of `host.id` is required, the value should be injected via the
-`OTEL_RESOURCE_ATTRIBUTES` environment variable.
-
-[DocumentStatus]: https://opentelemetry.io/docs/specs/otel/document-status
diff --git a/docs/resource/k8s.md b/docs/resource/k8s.md
index dbff0c9cbf..39ab4709a3 100644
--- a/docs/resource/k8s.md
+++ b/docs/resource/k8s.md
@@ -17,10 +17,6 @@ Kubernetes object, but "name" is usually more user friendly so can be also set.
## Cluster
-**type:** `k8s.cluster`
-
-**Description:** A Kubernetes Cluster.
-
@@ -28,6 +24,13 @@ Kubernetes object, but "name" is usually more user friendly so can be also set.
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `k8s.cluster`
+
+**Description:** A Kubernetes Cluster.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`k8s.cluster.name`](/docs/attributes-registry/k8s.md) | string | The name of the cluster. | `opentelemetry-cluster` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -66,10 +69,6 @@ conflict.
## Node
-**type:** `k8s.node`
-
-**Description:** A Kubernetes Node.
-
@@ -77,6 +76,13 @@ conflict.
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `k8s.node`
+
+**Description:** A Kubernetes Node object.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`k8s.node.name`](/docs/attributes-registry/k8s.md) | string | The name of the Node. | `node-1` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -93,10 +99,6 @@ conflict.
Namespaces provide a scope for names. Names of objects need to be unique within
a namespace, but not across namespaces.
-**type:** `k8s.namespace`
-
-**Description:** A Kubernetes Namespace.
-
@@ -104,6 +106,13 @@ a namespace, but not across namespaces.
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `k8s.namespace`
+
+**Description:** A Kubernetes Namespace.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`k8s.namespace.name`](/docs/attributes-registry/k8s.md) | string | The name of the namespace that the pod is running in. | `default` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -119,10 +128,6 @@ a namespace, but not across namespaces.
The smallest and simplest Kubernetes object. A Pod represents a set of running
containers on your cluster.
-**type:** `k8s.pod`
-
-**Description:** A Kubernetes Pod object.
-
@@ -130,6 +135,13 @@ containers on your cluster.
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `k8s.pod`
+
+**Description:** A Kubernetes Pod object.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`k8s.pod.label.`](/docs/attributes-registry/k8s.md) | string | The label key-value pairs placed on the Pod, the `` being the label name, the value being the label value. | `k8s.pod.label.app=my-app`; `k8s.pod.label.mycompany.io/arch=x64`; `k8s.pod.label.data=` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -152,10 +164,6 @@ from the name of the running container.
Note: This type is different from [container](./container.md), which corresponds
to a running container.
-**type:** `k8s.container`
-
-**Description:** A container in a [PodTemplate](https://kubernetes.io/docs/concepts/workloads/pods/#pod-templates).
-
@@ -163,6 +171,13 @@ to a running container.
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `k8s.container`
+
+**Description:** A container in a [PodTemplate](https://kubernetes.io/docs/concepts/workloads/pods/#pod-templates).
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`k8s.container.name`](/docs/attributes-registry/k8s.md) | string | The name of the Container from Pod specification, must be unique within a Pod. Container runtime usually uses different globally unique name (`container.name`). | `redis` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -177,13 +192,6 @@ to a running container.
## ReplicaSet
-A ReplicaSet’s purpose is to maintain a stable set of replica Pods running at
-any given time.
-
-**type:** `k8s.replicaset`
-
-**Description:** A Kubernetes ReplicaSet object.
-
@@ -191,6 +199,13 @@ any given time.
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `k8s.replicaset`
+
+**Description:** A Kubernetes ReplicaSet object.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`k8s.replicaset.name`](/docs/attributes-registry/k8s.md) | string | The name of the ReplicaSet. | `opentelemetry` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -208,10 +223,6 @@ An API object that manages a replicated application, typically by running Pods
with no local state. Each replica is represented by a Pod, and the Pods are
distributed among the nodes of a cluster.
-**type:** `k8s.deployment`
-
-**Description:** A Kubernetes Deployment object.
-
@@ -219,6 +230,13 @@ distributed among the nodes of a cluster.
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `k8s.deployment`
+
+**Description:** A Kubernetes Deployment object.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`k8s.deployment.name`](/docs/attributes-registry/k8s.md) | string | The name of the Deployment. | `opentelemetry` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -235,10 +253,6 @@ distributed among the nodes of a cluster.
Manages the deployment and scaling of a set of Pods, and provides guarantees
about the ordering and uniqueness of these Pods.
-**type:** `k8s.statefulset`
-
-**Description:** A Kubernetes StatefulSet object.
-
@@ -246,6 +260,13 @@ about the ordering and uniqueness of these Pods.
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `k8s.statefulset`
+
+**Description:** A Kubernetes StatefulSet object.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`k8s.statefulset.name`](/docs/attributes-registry/k8s.md) | string | The name of the StatefulSet. | `opentelemetry` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -261,10 +282,6 @@ about the ordering and uniqueness of these Pods.
A DaemonSet ensures that all (or some) Nodes run a copy of a Pod.
-**type:** `k8s.daemonset`
-
-**Description:** A Kubernetes DaemonSet object.
-
@@ -272,6 +289,13 @@ A DaemonSet ensures that all (or some) Nodes run a copy of a Pod.
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `k8s.daemonset`
+
+**Description:** A Kubernetes DaemonSet object.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`k8s.daemonset.name`](/docs/attributes-registry/k8s.md) | string | The name of the DaemonSet. | `opentelemetry` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -288,10 +312,6 @@ A DaemonSet ensures that all (or some) Nodes run a copy of a Pod.
A Job creates one or more Pods and ensures that a specified number of them
successfully terminate.
-**type:** `k8s.job`
-
-**Description:** A Kubernetes Job object.
-
@@ -299,6 +319,13 @@ successfully terminate.
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `k8s.job`
+
+**Description:** A Kubernetes Job object.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`k8s.job.name`](/docs/attributes-registry/k8s.md) | string | The name of the Job. | `opentelemetry` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -314,10 +341,6 @@ successfully terminate.
A CronJob creates Jobs on a repeating schedule.
-**type:** `k8s.cronjob`
-
-**Description:** A Kubernetes CronJob object.
-
@@ -325,6 +348,13 @@ A CronJob creates Jobs on a repeating schedule.
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `k8s.cronjob`
+
+**Description:** A Kubernetes CronJob object.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`k8s.cronjob.name`](/docs/attributes-registry/k8s.md) | string | The name of the CronJob. | `opentelemetry` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
diff --git a/docs/resource/os.md b/docs/resource/os.md
index ec10c53b5e..fb83034abf 100644
--- a/docs/resource/os.md
+++ b/docs/resource/os.md
@@ -1,11 +1,5 @@
# Operating System
-**Status**: [Experimental][DocumentStatus]
-
-**type:** `os`
-
-**Description**: The operating system (OS) on which the process represented by this resource is running.
-
In case of virtualized environments, this is the operating system as it is observed by the process, i.e., the virtualized guest rather than the underlying host.
@@ -15,14 +9,31 @@ In case of virtualized environments, this is the operating system as it is obser
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `os`
+
+**Description:** The operating system (OS) on which the process represented by this resource is running.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`os.type`](/docs/attributes-registry/os.md) | string | The operating system type. | `windows`; `linux`; `darwin` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-| [`os.build_id`](/docs/attributes-registry/os.md) | string | Unique identifier for a particular build or compilation of the operating system. | `TQ3C.230805.001.B2`; `20E247`; `22621` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| [`os.build_id`](/docs/attributes-registry/os.md) | string | Unique identifier for a particular build or compilation of the operating system. [1] | `TQ3C.230805.001.B2`; `20E247`; `22621` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`os.description`](/docs/attributes-registry/os.md) | string | Human readable (not intended to be parsed) OS version information, like e.g. reported by `ver` or `lsb_release -a` commands. | `Microsoft Windows [Version 10.0.18363.778]`; `Ubuntu 18.04.1 LTS` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`os.name`](/docs/attributes-registry/os.md) | string | Human readable operating system name. | `iOS`; `Android`; `Ubuntu` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`os.version`](/docs/attributes-registry/os.md) | string | The version string of the operating system as defined in [Version Attributes](/docs/resource/README.md#version-attributes). | `14.2.1`; `18.04.1` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+**[1]:** `build_id` values SHOULD be obtained from the following sources:
+
+| OS | Primary | Fallback |
+| ------- | ------- | ------- |
+| Windows | `CurrentBuildNumber` from registry `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion` | - |
+| MacOS | `ProductBuildVersion` from `/System/Library/CoreServices/SystemVersion.plist` | `ProductBuildVersion` from `/System/Library/CoreServices/ServerVersion.plist` |
+| Linux | `BUILD_ID` from `/etc/os-release` | `BUILD_ID` from `/usr/lib/os-release`;
contents of `/proc/sys/kernel/osrelease`|
+
+
+
`os.type` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used.
| Value | Description | Stability |
@@ -45,5 +56,3 @@ In case of virtualized environments, this is the operating system as it is obser
-
-[DocumentStatus]: https://opentelemetry.io/docs/specs/otel/document-status
diff --git a/docs/resource/process.md b/docs/resource/process.md
index ff17dfcfbf..8345d957b7 100644
--- a/docs/resource/process.md
+++ b/docs/resource/process.md
@@ -21,10 +21,6 @@
## Process
-**type:** `process`
-
-**Description:** An operating system process.
-
@@ -32,6 +28,13 @@
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `process`
+
+**Description:** An operating system process.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`process.command`](/docs/attributes-registry/process.md) | string | The command used to launch the process (i.e. the command name). On Linux based systems, can be set to the zeroth string in `proc/[pid]/cmdline`. On Windows, can be set to the first parameter extracted from `GetCommandLineW`. | `cmd/otelcol` | `Conditionally Required` [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -77,10 +80,6 @@ On Windows and other systems where the native format of process commands is a si
## Process runtimes
-**type:** `process.runtime`
-
-**Description:** The single (language) runtime instance which is monitored.
-
@@ -88,6 +87,13 @@ On Windows and other systems where the native format of process commands is a si
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `process.runtime`
+
+**Description:** The single (language) runtime instance which is monitored.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`process.runtime.description`](/docs/attributes-registry/process.md) | string | An additional description about the runtime of the process, for example a specific vendor customization of the runtime environment. | `Eclipse OpenJ9 Eclipse OpenJ9 VM openj9-0.21.0` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
diff --git a/docs/resource/webengine.md b/docs/resource/webengine.md
index e7585ad802..4a4dbdfcae 100644
--- a/docs/resource/webengine.md
+++ b/docs/resource/webengine.md
@@ -1,11 +1,5 @@
# Webengine
-**Status**: [Experimental][DocumentStatus]
-
-**type:** `webengine`
-
-**Description:** Resource describing the packaged software running the application code. Web engines are typically executed using process.runtime.
-
@@ -13,6 +7,13 @@
+
+**Status:** ![Experimental](https://img.shields.io/badge/-experimental-blue)
+
+**type:** `webengine`
+
+**Description:** Resource describing the packaged software running the application code. Web engines are typically executed using process.runtime.
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`webengine.name`](/docs/attributes-registry/webengine.md) | string | The name of the web engine. | `WildFly` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -33,5 +34,3 @@ The situations where there are multiple candidates, it is up to instrumentation
* Either Apache HTTP Server or `mod_wsgi` MAY be chosen as `webengine`, depending on the decision made by the instrumentation authors.
* Django SHOULD NOT be set as an `webengine` as the required information is already available in instrumentation library and setting this into `webengine` would duplicate the information.
-
-[DocumentStatus]: https://opentelemetry.io/docs/specs/otel/document-status
diff --git a/docs/rpc/rpc-metrics.md b/docs/rpc/rpc-metrics.md
index 054ac58e9a..e38f6e8e11 100644
--- a/docs/rpc/rpc-metrics.md
+++ b/docs/rpc/rpc-metrics.md
@@ -76,7 +76,7 @@ Below is a list of RPC server metric instruments.
This metric is [recommended][MetricRecommended].
-
+
@@ -104,7 +104,7 @@ to end-of-batch, it's hard to interpret in practice.
This metric is [recommended][MetricRecommended].
-
+
@@ -129,7 +129,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -154,7 +154,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -181,7 +181,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -213,7 +213,7 @@ These apply to traditional RPC usage, not streaming RPCs.
This metric is [recommended][MetricRecommended].
-
+
@@ -241,7 +241,7 @@ to end-of-batch, it's hard to interpret in practice.
This metric is [recommended][MetricRecommended].
-
+
@@ -266,7 +266,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -291,7 +291,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -318,7 +318,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
diff --git a/docs/runtime/README.md b/docs/runtime/README.md
index 7f17940f36..f04801dd0d 100644
--- a/docs/runtime/README.md
+++ b/docs/runtime/README.md
@@ -51,6 +51,7 @@ semantic conventions when instrumenting runtime environments.
- [JVM](jvm-metrics.md)
- [Node.js](nodejs-metrics.md)
- [V8 JS Engine](v8js-metrics.md)
+- [.NET](dotnet-metrics.md)
### Attributes
diff --git a/docs/runtime/dotnet-metrics.md b/docs/runtime/dotnet-metrics.md
new file mode 100644
index 0000000000..acc8cb9322
--- /dev/null
+++ b/docs/runtime/dotnet-metrics.md
@@ -0,0 +1,643 @@
+
+
+# Semantic Conventions for .NET Common Language Runtime (CLR) Metrics
+
+**Status**: [Experimental][DocumentStatus]
+
+This document describes semantic conventions for .NET CLR runtime metrics in OpenTelemetry.
+
+
+
+
+
+- [.NET CLR Process](#net-clr-process)
+ - [Metric: `dotnet.process.cpu.count`](#metric-dotnetprocesscpucount)
+ - [Metric: `dotnet.process.cpu.time`](#metric-dotnetprocesscputime)
+ - [Metric: `dotnet.process.memory.working_set`](#metric-dotnetprocessmemoryworking_set)
+- [.NET CLR Garbage Collection](#net-clr-garbage-collection)
+ - [Metric: `dotnet.gc.collections`](#metric-dotnetgccollections)
+ - [Metric: `dotnet.gc.heap.total_allocated`](#metric-dotnetgcheaptotal_allocated)
+ - [Metric: `dotnet.gc.last_collection.memory.committed_size`](#metric-dotnetgclast_collectionmemorycommitted_size)
+ - [Metric: `dotnet.gc.last_collection.heap.size`](#metric-dotnetgclast_collectionheapsize)
+ - [Metric: `dotnet.gc.last_collection.heap.fragmentation.size`](#metric-dotnetgclast_collectionheapfragmentationsize)
+ - [Metric: `dotnet.gc.pause.time`](#metric-dotnetgcpausetime)
+- [.NET CLR Just-In-Time (JIT) Compiler](#net-clr-just-in-time-jit-compiler)
+ - [Metric: `dotnet.jit.compiled_il.size`](#metric-dotnetjitcompiled_ilsize)
+ - [Metric: `dotnet.jit.compiled_methods`](#metric-dotnetjitcompiled_methods)
+ - [Metric: `dotnet.jit.compilation.time`](#metric-dotnetjitcompilationtime)
+- [.NET CLR Thread pool](#net-clr-thread-pool)
+ - [Metric: `dotnet.thread_pool.thread.count`](#metric-dotnetthread_poolthreadcount)
+ - [Metric: `dotnet.thread_pool.work_item.count`](#metric-dotnetthread_poolwork_itemcount)
+ - [Metric: `dotnet.thread_pool.queue.length`](#metric-dotnetthread_poolqueuelength)
+- [.NET CLR General](#net-clr-general)
+ - [Metric: `dotnet.monitor.lock_contentions`](#metric-dotnetmonitorlock_contentions)
+ - [Metric: `dotnet.timer.count`](#metric-dotnettimercount)
+ - [Metric: `dotnet.assembly.count`](#metric-dotnetassemblycount)
+ - [Metric: `dotnet.exceptions`](#metric-dotnetexceptions)
+
+
+
+## .NET CLR Process
+
+**Status**: [Experimental][DocumentStatus]
+
+**Description:** .NET Common Language Runtime (CLR) metrics relating to the process, captured under the namespace `dotnet.process.*`.
+
+_Note: These metrics represent measurements observed from the perspective of the .NET process and may differ from metrics measured from outside the process (e.g. `process.cpu.*` and `process.memory.usage`)._
+
+### Metric: `dotnet.process.cpu.count`
+
+This metric is [recommended][MetricRecommended].
+
+
+
+
+
+
+
+
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `dotnet.process.cpu.count` | UpDownCounter | `{cpu}` | The number of processors available to the process. [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Meter name: `System.Runtime`; Added in: .NET 9.0.
+This metric reports the same values as accessing [`Environment.ProcessorCount`](https://learn.microsoft.com/dotnet/api/system.environment.processorcount).
+
+
+
+
+
+
+
+
+### Metric: `dotnet.process.cpu.time`
+
+This metric is [recommended][MetricRecommended].
+
+
+
+
+
+
+
+
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `dotnet.process.cpu.time` | Counter | `s` | CPU time used by the process. [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Meter name: `System.Runtime`; Added in: .NET 9.0.
+This metric reports the same values as accessing the corresponding processor time properties on [`System.Diagnostics.Process`](https://learn.microsoft.com/dotnet/api/system.diagnostics.process).
+
+
+| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
+|---|---|---|---|---|---|
+| [`cpu.mode`](/docs/attributes-registry/cpu.md) | string | The mode of the CPU | `user`; `system` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+`cpu.mode` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used.
+
+| Value | Description | Stability |
+|---|---|---|
+| `idle` | idle | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `interrupt` | interrupt | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `iowait` | iowait | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `kernel` | kernel | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `nice` | nice | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `steal` | steal | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `system` | system | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `user` | user | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+
+
+
+
+
+
+### Metric: `dotnet.process.memory.working_set`
+
+This metric is [recommended][MetricRecommended].
+
+
+
+
+
+
+
+
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `dotnet.process.memory.working_set` | UpDownCounter | `By` | The number of bytes of physical memory mapped to the process context. [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Meter name: `System.Runtime`; Added in: .NET 9.0.
+This metric reports the same values as calling [`Environment.WorkingSet`](https://learn.microsoft.com/dotnet/api/system.environment.workingset).
+
+
+
+
+
+
+
+
+## .NET CLR Garbage Collection
+
+**Status**: [Experimental][DocumentStatus]
+
+**Description:** .NET Common Language Runtime (CLR) metrics relating to garbage collection, captured under the namespace `dotnet.gc.*`.
+
+### Metric: `dotnet.gc.collections`
+
+This metric is [recommended][MetricRecommended].
+
+
+
+
+
+
+
+
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `dotnet.gc.collections` | Counter | `{collection}` | The number of garbage collections that have occurred since the process has started. [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Meter name: `System.Runtime`; Added in: .NET 9.0.
+This metric uses the [`GC.CollectionCount(int generation)`](https://learn.microsoft.com/dotnet/api/system.gc.collectioncount) API to calculate exclusive collections per generation.
+
+
+| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
+|---|---|---|---|---|---|
+| [`dotnet.gc.heap.generation`](/docs/attributes-registry/dotnet.md) | string | Name of the garbage collector managed heap generation. | `gen0`; `gen1`; `gen2` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+`dotnet.gc.heap.generation` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used.
+
+| Value | Description | Stability |
+|---|---|---|
+| `gen0` | Generation 0 | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `gen1` | Generation 1 | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `gen2` | Generation 2 | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `loh` | Large Object Heap | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `poh` | Pinned Object Heap | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+
+
+
+
+
+
+### Metric: `dotnet.gc.heap.total_allocated`
+
+This metric is [recommended][MetricRecommended].
+
+
+
+
+
+
+
+
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `dotnet.gc.heap.total_allocated` | Counter | `By` | The *approximate* number of bytes allocated on the managed GC heap since the process has started. The returned value does not include any native allocations. [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Meter name: `System.Runtime`; Added in: .NET 9.0.
+This metric reports the same values as calling [`GC.GetTotalAllocatedBytes()`](https://learn.microsoft.com/dotnet/api/system.gc.gettotalallocatedbytes).
+
+
+
+
+
+
+
+
+### Metric: `dotnet.gc.last_collection.memory.committed_size`
+
+This metric is [recommended][MetricRecommended].
+
+
+
+
+
+
+
+
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `dotnet.gc.last_collection.memory.committed_size` | UpDownCounter | `By` | The amount of committed virtual memory in use by the .NET GC, as observed during the latest garbage collection. [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Meter name: `System.Runtime`; Added in: .NET 9.0.
+This metric reports the same values as calling [`GC.GetGCMemoryInfo().TotalCommittedBytes`](https://learn.microsoft.com/dotnet/api/system.gcmemoryinfo.totalcommittedbytes). Committed virtual memory may be larger than the heap size because it includes both memory for storing existing objects (the heap size) and some extra memory that is ready to handle newly allocated objects in the future.
+
+
+
+
+
+
+
+
+### Metric: `dotnet.gc.last_collection.heap.size`
+
+This metric is [recommended][MetricRecommended].
+
+
+
+
+
+
+
+
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `dotnet.gc.last_collection.heap.size` | UpDownCounter | `By` | The managed GC heap size (including fragmentation), as observed during the latest garbage collection. [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Meter name: `System.Runtime`; Added in: .NET 9.0.
+This metric reports the same values as calling [`GC.GetGCMemoryInfo().GenerationInfo.SizeAfterBytes`](https://learn.microsoft.com/dotnet/api/system.gcgenerationinfo.sizeafterbytes).
+
+
+| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
+|---|---|---|---|---|---|
+| [`dotnet.gc.heap.generation`](/docs/attributes-registry/dotnet.md) | string | Name of the garbage collector managed heap generation. | `gen0`; `gen1`; `gen2` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+`dotnet.gc.heap.generation` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used.
+
+| Value | Description | Stability |
+|---|---|---|
+| `gen0` | Generation 0 | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `gen1` | Generation 1 | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `gen2` | Generation 2 | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `loh` | Large Object Heap | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `poh` | Pinned Object Heap | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+
+
+
+
+
+
+### Metric: `dotnet.gc.last_collection.heap.fragmentation.size`
+
+This metric is [recommended][MetricRecommended].
+
+
+
+
+
+
+
+
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `dotnet.gc.last_collection.heap.fragmentation.size` | UpDownCounter | `By` | The heap fragmentation, as observed during the latest garbage collection. [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Meter name: `System.Runtime`; Added in: .NET 9.0.
+This metric reports the same values as calling [`GC.GetGCMemoryInfo().GenerationInfo.FragmentationAfterBytes`](https://learn.microsoft.com/dotnet/api/system.gcgenerationinfo.fragmentationafterbytes).
+
+
+| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
+|---|---|---|---|---|---|
+| [`dotnet.gc.heap.generation`](/docs/attributes-registry/dotnet.md) | string | Name of the garbage collector managed heap generation. | `gen0`; `gen1`; `gen2` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+`dotnet.gc.heap.generation` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used.
+
+| Value | Description | Stability |
+|---|---|---|
+| `gen0` | Generation 0 | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `gen1` | Generation 1 | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `gen2` | Generation 2 | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `loh` | Large Object Heap | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `poh` | Pinned Object Heap | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+
+
+
+
+
+
+### Metric: `dotnet.gc.pause.time`
+
+This metric is [recommended][MetricRecommended].
+
+
+
+
+
+
+
+
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `dotnet.gc.pause.time` | Counter | `s` | The total amount of time paused in GC since the process has started. [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Meter name: `System.Runtime`; Added in: .NET 9.0.
+This metric reports the same values as calling [`GC.GetTotalPauseDuration()`](https://learn.microsoft.com/dotnet/api/system.gc.gettotalpauseduration).
+
+
+
+
+
+
+
+
+## .NET CLR Just-In-Time (JIT) Compiler
+
+**Status**: [Experimental][DocumentStatus]
+
+**Description:** .NET Common Language Runtime (CLR) metrics relating to the Just-In-Time compiler, captured under the namespace `dotnet.jit.*`.
+
+### Metric: `dotnet.jit.compiled_il.size`
+
+This metric is [recommended][MetricRecommended].
+
+
+
+
+
+
+
+
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `dotnet.jit.compiled_il.size` | Counter | `By` | Count of bytes of intermediate language that have been compiled since the process has started. [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Meter name: `System.Runtime`; Added in: .NET 9.0.
+This metric reports the same values as calling [`JitInfo.GetCompiledILBytes()`](https://learn.microsoft.com/dotnet/api/system.runtime.jitinfo.getcompiledilbytes).
+
+
+
+
+
+
+
+
+### Metric: `dotnet.jit.compiled_methods`
+
+This metric is [recommended][MetricRecommended].
+
+
+
+
+
+
+
+
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `dotnet.jit.compiled_methods` | Counter | `{method}` | The number of times the JIT compiler (re)compiled methods since the process has started. [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Meter name: `System.Runtime`; Added in: .NET 9.0.
+This metric reports the same values as calling [`JitInfo.GetCompiledMethodCount()`](https://learn.microsoft.com/dotnet/api/system.runtime.jitinfo.getcompiledmethodcount).
+
+
+
+
+
+
+
+
+### Metric: `dotnet.jit.compilation.time`
+
+This metric is [recommended][MetricRecommended].
+
+
+
+
+
+
+
+
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `dotnet.jit.compilation.time` | Counter | `s` | The amount of time the JIT compiler has spent compiling methods since the process has started. [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Meter name: `System.Runtime`; Added in: .NET 9.0.
+This metric reports the same values as calling [`JitInfo.GetCompilationTime()`](https://learn.microsoft.com/dotnet/api/system.runtime.jitinfo.getcompilationtime).
+
+
+
+
+
+
+
+
+## .NET CLR Thread pool
+
+**Status**: [Experimental][DocumentStatus]
+
+**Description:** .NET Common Language Runtime (CLR) metrics relating to the thread pool, captured under the namespace `dotnet.thread_pool.*`.
+
+### Metric: `dotnet.thread_pool.thread.count`
+
+This metric is [recommended][MetricRecommended].
+
+
+
+
+
+
+
+
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `dotnet.thread_pool.thread.count` | UpDownCounter | `{thread}` | The number of thread pool threads that currently exist. [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Meter name: `System.Runtime`; Added in: .NET 9.0.
+This metric reports the same values as calling [`ThreadPool.ThreadCount`](https://learn.microsoft.com/dotnet/api/system.threading.threadpool.threadcount).
+
+
+
+
+
+
+
+
+### Metric: `dotnet.thread_pool.work_item.count`
+
+This metric is [recommended][MetricRecommended].
+
+
+
+
+
+
+
+
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `dotnet.thread_pool.work_item.count` | Counter | `{work_item}` | The number of work items that the thread pool has completed since the process has started. [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Meter name: `System.Runtime`; Added in: .NET 9.0.
+This metric reports the same values as calling [`ThreadPool.CompletedWorkItemCount`](https://learn.microsoft.com/dotnet/api/system.threading.threadpool.completedworkitemcount).
+
+
+
+
+
+
+
+
+### Metric: `dotnet.thread_pool.queue.length`
+
+This metric is [recommended][MetricRecommended].
+
+
+
+
+
+
+
+
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `dotnet.thread_pool.queue.length` | UpDownCounter | `{work_item}` | The number of work items that are currently queued to be processed by the thread pool. [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Meter name: `System.Runtime`; Added in: .NET 9.0.
+This metric reports the same values as calling [`ThreadPool.PendingWorkItemCount`](https://learn.microsoft.com/dotnet/api/system.threading.threadpool.pendingworkitemcount).
+
+
+
+
+
+
+
+
+## .NET CLR General
+
+**Status**: [Experimental][DocumentStatus]
+
+**Description:** Other useful .NET Common Language Runtime (CLR) metrics.
+
+### Metric: `dotnet.monitor.lock_contentions`
+
+This metric is [recommended][MetricRecommended].
+
+
+
+
+
+
+
+
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `dotnet.monitor.lock_contentions` | Counter | `{contention}` | The number of times there was contention when trying to acquire a monitor lock since the process has started. [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Meter name: `System.Runtime`; Added in: .NET 9.0.
+This metric reports the same values as calling [`Monitor.LockContentionCount`](https://learn.microsoft.com/dotnet/api/system.threading.monitor.lockcontentioncount).
+
+
+
+
+
+
+
+
+### Metric: `dotnet.timer.count`
+
+This metric is [recommended][MetricRecommended].
+
+
+
+
+
+
+
+
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `dotnet.timer.count` | UpDownCounter | `{timer}` | The number of timer instances that are currently active. [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Meter name: `System.Runtime`; Added in: .NET 9.0.
+This metric reports the same values as calling [`Timer.ActiveCount`](https://learn.microsoft.com/dotnet/api/system.threading.timer.activecount).
+
+
+
+
+
+
+
+
+### Metric: `dotnet.assembly.count`
+
+This metric is [recommended][MetricRecommended].
+
+
+
+
+
+
+
+
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `dotnet.assembly.count` | UpDownCounter | `{assembly}` | The number of .NET assemblies that are currently loaded. [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Meter name: `System.Runtime`; Added in: .NET 9.0.
+This metric reports the same values as calling [`AppDomain.CurrentDomain.GetAssemblies().Length`](https://learn.microsoft.com/dotnet/api/system.appdomain.getassemblies).
+
+
+
+
+
+
+
+
+### Metric: `dotnet.exceptions`
+
+This metric is [recommended][MetricRecommended].
+
+
+
+
+
+
+
+
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `dotnet.exceptions` | Counter | `{exception}` | The number of exceptions that have been thrown in managed code. [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Meter name: `System.Runtime`; Added in: .NET 9.0.
+This metric reports the same values as counting calls to [`AppDomain.CurrentDomain.FirstChanceException`](https://learn.microsoft.com/dotnet/api/system.appdomain.firstchanceexception).
+
+
+| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
+|---|---|---|---|---|---|
+| [`error.type`](/docs/attributes-registry/error.md) | string | Describes a class of error the operation ended with. | `System.OperationCanceledException`; `Contoso.MyException` | `Required` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
+
+`error.type` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used.
+
+| Value | Description | Stability |
+|---|---|---|
+| `_OTHER` | A fallback error value to be used when the instrumentation doesn't define a custom value. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
+
+
+
+
+
+
+
+
+[DocumentStatus]: https://opentelemetry.io/docs/specs/otel/document-status
+[MetricRecommended]: /docs/general/metric-requirement-level.md#recommended
diff --git a/docs/runtime/go-metrics.md b/docs/runtime/go-metrics.md
index a3c077dc6e..ac8e76b2f1 100644
--- a/docs/runtime/go-metrics.md
+++ b/docs/runtime/go-metrics.md
@@ -39,7 +39,7 @@ These metrics are obtained from Go's [`runtime/metrics`][RuntimeMetrics] package
This metric is [recommended][MetricRecommended].
-
+
@@ -54,19 +54,6 @@ This metric is [recommended][MetricRecommended].
**[1]:** Computed from `(/memory/classes/total:bytes - /memory/classes/heap/released:bytes)`.
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`go.memory.type`](/docs/attributes-registry/go.md) | string | The type of memory. | `other`; `stack` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -93,7 +80,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -109,19 +96,6 @@ This metric is [recommended][MetricRecommended].
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -131,7 +105,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -147,19 +121,6 @@ This metric is [recommended][MetricRecommended].
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -169,7 +130,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -185,19 +146,6 @@ This metric is [recommended][MetricRecommended].
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -211,7 +159,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -227,19 +175,6 @@ This metric is [recommended][MetricRecommended].
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -253,7 +188,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -269,19 +204,6 @@ This metric is [recommended][MetricRecommended].
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -295,7 +217,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -311,19 +233,6 @@ This metric is [recommended][MetricRecommended].
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -337,7 +246,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -353,19 +262,6 @@ This metric is [recommended][MetricRecommended].
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -379,7 +275,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -395,19 +291,6 @@ This metric is [recommended][MetricRecommended].
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/runtime/jvm-metrics.md b/docs/runtime/jvm-metrics.md
index 5355deee9e..0eec60a973 100644
--- a/docs/runtime/jvm-metrics.md
+++ b/docs/runtime/jvm-metrics.md
@@ -50,7 +50,7 @@ This document describes semantic conventions for JVM metrics in OpenTelemetry.
This metric is [recommended][MetricRecommended].
This metric is obtained from [`MemoryPoolMXBean#getUsage()`](https://docs.oracle.com/javase/8/docs/api/java/lang/management/MemoryPoolMXBean.html#getUsage--).
-
+
@@ -61,19 +61,6 @@ This metric is obtained from [`MemoryPoolMXBean#getUsage()`](https://docs.oracle
| -------- | --------------- | ----------- | -------------- | --------- |
| `jvm.memory.used` | UpDownCounter | `By` | Measure of memory used. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`jvm.memory.pool.name`](/docs/attributes-registry/jvm.md) | string | Name of the memory pool. [1] | `G1 Old Gen`; `G1 Eden space`; `G1 Survivor Space` | `Recommended` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -102,7 +89,7 @@ This metric is obtained from [`MemoryPoolMXBean#getUsage()`](https://docs.oracle
This metric is [recommended][MetricRecommended].
This metric is obtained from [`MemoryPoolMXBean#getUsage()`](https://docs.oracle.com/javase/8/docs/api/java/lang/management/MemoryPoolMXBean.html#getUsage--).
-
+
@@ -113,19 +100,6 @@ This metric is obtained from [`MemoryPoolMXBean#getUsage()`](https://docs.oracle
| -------- | --------------- | ----------- | -------------- | --------- |
| `jvm.memory.committed` | UpDownCounter | `By` | Measure of memory committed. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`jvm.memory.pool.name`](/docs/attributes-registry/jvm.md) | string | Name of the memory pool. [1] | `G1 Old Gen`; `G1 Eden space`; `G1 Survivor Space` | `Recommended` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -154,7 +128,7 @@ This metric is obtained from [`MemoryPoolMXBean#getUsage()`](https://docs.oracle
This metric is [recommended][MetricRecommended].
This metric is obtained from [`MemoryPoolMXBean#getUsage()`](https://docs.oracle.com/javase/8/docs/api/java/lang/management/MemoryPoolMXBean.html#getUsage--).
-
+
@@ -165,19 +139,6 @@ This metric is obtained from [`MemoryPoolMXBean#getUsage()`](https://docs.oracle
| -------- | --------------- | ----------- | -------------- | --------- |
| `jvm.memory.limit` | UpDownCounter | `By` | Measure of max obtainable memory. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`jvm.memory.pool.name`](/docs/attributes-registry/jvm.md) | string | Name of the memory pool. [1] | `G1 Old Gen`; `G1 Eden space`; `G1 Survivor Space` | `Recommended` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -206,7 +167,7 @@ This metric is obtained from [`MemoryPoolMXBean#getUsage()`](https://docs.oracle
This metric is [recommended][MetricRecommended].
This metric is obtained from [`MemoryPoolMXBean#getCollectionUsage()`](https://docs.oracle.com/javase/8/docs/api/java/lang/management/MemoryPoolMXBean.html#getCollectionUsage--).
-
+
@@ -217,19 +178,6 @@ This metric is obtained from [`MemoryPoolMXBean#getCollectionUsage()`](https://d
| -------- | --------------- | ----------- | -------------- | --------- |
| `jvm.memory.used_after_last_gc` | UpDownCounter | `By` | Measure of memory used, as measured after the most recent garbage collection event on this pool. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`jvm.memory.pool.name`](/docs/attributes-registry/jvm.md) | string | Name of the memory pool. [1] | `G1 Old Gen`; `G1 Eden space`; `G1 Survivor Space` | `Recommended` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -269,7 +217,7 @@ This metric SHOULD be specified with
[`ExplicitBucketBoundaries`](https://github.com/open-telemetry/opentelemetry-specification/tree/v1.35.0/specification/metrics/api.md#instrument-advisory-parameters)
of `[ 0.01, 0.1, 1, 10 ]`.
-
+
@@ -280,19 +228,6 @@ of `[ 0.01, 0.1, 1, 10 ]`.
| -------- | --------------- | ----------- | -------------- | --------- |
| `jvm.gc.duration` | Histogram | `s` | Duration of JVM garbage collection actions. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`jvm.gc.action`](/docs/attributes-registry/jvm.md) | string | Name of the garbage collector action. [1] | `end of minor GC`; `end of major GC` | `Recommended` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -328,7 +263,7 @@ This metric is obtained from a combination of
Note that this is the number of platform threads (as opposed to virtual threads).
-
+
@@ -339,19 +274,6 @@ Note that this is the number of platform threads (as opposed to virtual threads)
| -------- | --------------- | ----------- | -------------- | --------- |
| `jvm.thread.count` | UpDownCounter | `{thread}` | Number of executing platform threads. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`jvm.thread.daemon`](/docs/attributes-registry/jvm.md) | boolean | Whether the thread is daemon or not. | | `Recommended` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -386,7 +308,7 @@ Note that this is the number of platform threads (as opposed to virtual threads)
This metric is [recommended][MetricRecommended].
This metric is obtained from [`ClassLoadingMXBean#getTotalLoadedClassCount()`](https://docs.oracle.com/javase/8/docs/api/java/lang/management/ClassLoadingMXBean.html#getTotalLoadedClassCount--).
-
+
@@ -398,19 +320,6 @@ This metric is obtained from [`ClassLoadingMXBean#getTotalLoadedClassCount()`](h
| `jvm.class.loaded` | Counter | `{class}` | Number of classes loaded since JVM start. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -421,7 +330,7 @@ This metric is obtained from [`ClassLoadingMXBean#getTotalLoadedClassCount()`](h
This metric is [recommended][MetricRecommended].
This metric is obtained from [`ClassLoadingMXBean#getUnloadedClassCount()`](https://docs.oracle.com/javase/8/docs/api/java/lang/management/ClassLoadingMXBean.html#getUnloadedClassCount--).
-
+
@@ -433,19 +342,6 @@ This metric is obtained from [`ClassLoadingMXBean#getUnloadedClassCount()`](http
| `jvm.class.unloaded` | Counter | `{class}` | Number of classes unloaded since JVM start. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -456,7 +352,7 @@ This metric is obtained from [`ClassLoadingMXBean#getUnloadedClassCount()`](http
This metric is [recommended][MetricRecommended].
This metric is obtained from [`ClassLoadingMXBean#getLoadedClassCount()`](https://docs.oracle.com/javase/8/docs/api/java/lang/management/ClassLoadingMXBean.html#getLoadedClassCount--).
-
+
@@ -468,19 +364,6 @@ This metric is obtained from [`ClassLoadingMXBean#getLoadedClassCount()`](https:
| `jvm.class.count` | UpDownCounter | `{class}` | Number of classes currently loaded. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -499,7 +382,7 @@ This metric is [recommended][MetricRecommended].
This metric is obtained from [`com.sun.management.OperatingSystemMXBean#getProcessCpuTime()`](https://docs.oracle.com/en/java/javase/17/docs/api/jdk.management/com/sun/management/OperatingSystemMXBean.html#getProcessCpuTime()) on HotSpot
and [`com.ibm.lang.management.OperatingSystemMXBean#getProcessCpuTime()`](https://www.ibm.com/docs/api/v1/content/SSYKE2_8.0.0/openj9/api/jdk8/jre/management/extension/com/ibm/lang/management/OperatingSystemMXBean.html#getProcessCpuTime--) on OpenJ9.
-
+
@@ -511,19 +394,6 @@ and [`com.ibm.lang.management.OperatingSystemMXBean#getProcessCpuTime()`](https:
| `jvm.cpu.time` | Counter | `s` | CPU time used by the process as reported by the JVM. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -535,7 +405,7 @@ This metric is [recommended][MetricRecommended].
This metric is obtained from [`Runtime#availableProcessors()`](https://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#availableProcessors--).
Note that this is always an integer value (i.e. fractional or millicores are not represented).
-
+
@@ -547,19 +417,6 @@ Note that this is always an integer value (i.e. fractional or millicores are not
| `jvm.cpu.count` | UpDownCounter | `{cpu}` | Number of processors available to the Java virtual machine. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -572,7 +429,7 @@ This metric is obtained from [`com.sun.management.OperatingSystemMXBean#getProce
and [`com.ibm.lang.management.OperatingSystemMXBean#getProcessCpuLoad()`](https://www.ibm.com/docs/api/v1/content/SSYKE2_8.0.0/openj9/api/jdk8/jre/management/extension/com/ibm/lang/management/OperatingSystemMXBean.html#getProcessCpuLoad--) on OpenJ9.
Note that the JVM does not provide a definition of what "recent" means.
-
+
@@ -588,19 +445,6 @@ Note that the JVM does not provide a definition of what "recent" means.
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -617,7 +461,7 @@ Note that the JVM does not provide a definition of what "recent" means.
This metric is [recommended][MetricRecommended].
This metric is obtained from [`MemoryPoolMXBean#getUsage()`](https://docs.oracle.com/javase/8/docs/api/java/lang/management/MemoryPoolMXBean.html#getUsage--).
-
+
@@ -628,19 +472,6 @@ This metric is obtained from [`MemoryPoolMXBean#getUsage()`](https://docs.oracle
| -------- | --------------- | ----------- | -------------- | --------- |
| `jvm.memory.init` | UpDownCounter | `By` | Measure of initial memory requested. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`jvm.memory.pool.name`](/docs/attributes-registry/jvm.md) | string | Name of the memory pool. [1] | `G1 Old Gen`; `G1 Eden space`; `G1 Survivor Space` | `Recommended` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -670,7 +501,7 @@ This metric is [Opt-In][MetricOptIn].
This metric is obtained from [`com.sun.management.OperatingSystemMXBean#getSystemCpuLoad()`](https://docs.oracle.com/en/java/javase/17/docs/api/jdk.management/com/sun/management/OperatingSystemMXBean.html#getSystemCpuLoad()) on Java version 8..13, [`com.sun.management.OperatingSystemMXBean#getCpuLoad()`](https://docs.oracle.com/en/java/javase/17/docs/api/jdk.management/com/sun/management/OperatingSystemMXBean.html#getCpuLoad()) on Java version 14+,
and [`com.ibm.lang.management.OperatingSystemMXBean#getSystemCpuLoad()`](https://www.ibm.com/docs/api/v1/content/SSYKE2_8.0.0/openj9/api/jdk8/jre/management/extension/com/ibm/lang/management/OperatingSystemMXBean.html) on OpenJ9.
-
+
@@ -686,19 +517,6 @@ and [`com.ibm.lang.management.OperatingSystemMXBean#getSystemCpuLoad()`](https:/
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -709,7 +527,7 @@ and [`com.ibm.lang.management.OperatingSystemMXBean#getSystemCpuLoad()`](https:/
This metric is [Opt-In][MetricOptIn].
This metric is obtained from [`OperatingSystemMXBean#getSystemLoadAverage()`](https://docs.oracle.com/javase/8/docs/api/java/lang/management/OperatingSystemMXBean.html#getSystemLoadAverage--).
-
+
@@ -725,19 +543,6 @@ This metric is obtained from [`OperatingSystemMXBean#getSystemLoadAverage()`](ht
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -748,7 +553,7 @@ This metric is obtained from [`OperatingSystemMXBean#getSystemLoadAverage()`](ht
This metric is [recommended][MetricRecommended].
This metric is obtained from [`BufferPoolMXBean#getMemoryUsed()`](https://docs.oracle.com/javase/8/docs/api/java/lang/management/BufferPoolMXBean.html#getMemoryUsed--).
-
+
@@ -759,19 +564,6 @@ This metric is obtained from [`BufferPoolMXBean#getMemoryUsed()`](https://docs.o
| -------- | --------------- | ----------- | -------------- | --------- |
| `jvm.buffer.memory.used` | UpDownCounter | `By` | Measure of memory used by buffers. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`jvm.buffer.pool.name`](/docs/attributes-registry/jvm.md) | string | Name of the buffer pool. [1] | `mapped`; `direct` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -791,7 +583,7 @@ This metric is obtained from [`BufferPoolMXBean#getMemoryUsed()`](https://docs.o
This metric is [recommended][MetricRecommended].
This metric is obtained from [`BufferPoolMXBean#getTotalCapacity()`](https://docs.oracle.com/javase/8/docs/api/java/lang/management/BufferPoolMXBean.html#getTotalCapacity--).
-
+
@@ -802,19 +594,6 @@ This metric is obtained from [`BufferPoolMXBean#getTotalCapacity()`](https://doc
| -------- | --------------- | ----------- | -------------- | --------- |
| `jvm.buffer.memory.limit` | UpDownCounter | `By` | Measure of total memory capacity of buffers. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`jvm.buffer.pool.name`](/docs/attributes-registry/jvm.md) | string | Name of the buffer pool. [1] | `mapped`; `direct` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -834,7 +613,7 @@ This metric is obtained from [`BufferPoolMXBean#getTotalCapacity()`](https://doc
This metric is [recommended][MetricRecommended].
This metric is obtained from [`BufferPoolMXBean#getCount()`](https://docs.oracle.com/javase/8/docs/api/java/lang/management/BufferPoolMXBean.html#getCount--).
-
+
@@ -845,19 +624,6 @@ This metric is obtained from [`BufferPoolMXBean#getCount()`](https://docs.oracle
| -------- | --------------- | ----------- | -------------- | --------- |
| `jvm.buffer.count` | UpDownCounter | `{buffer}` | Number of buffers in the pool. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`jvm.buffer.pool.name`](/docs/attributes-registry/jvm.md) | string | Name of the buffer pool. [1] | `mapped`; `direct` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
diff --git a/docs/runtime/nodejs-metrics.md b/docs/runtime/nodejs-metrics.md
index 65f86743f1..baa1d3e85a 100644
--- a/docs/runtime/nodejs-metrics.md
+++ b/docs/runtime/nodejs-metrics.md
@@ -39,7 +39,7 @@ histogram, so it's not possible to convert it to an OpenTelemetry histogram.
This metric is [recommended][MetricRecommended].
-
+
@@ -55,19 +55,6 @@ This metric is [recommended][MetricRecommended].
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -77,7 +64,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -93,19 +80,6 @@ This metric is [recommended][MetricRecommended].
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -115,7 +89,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -131,19 +105,6 @@ This metric is [recommended][MetricRecommended].
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -153,7 +114,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -169,19 +130,6 @@ This metric is [recommended][MetricRecommended].
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -191,7 +139,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -207,19 +155,6 @@ This metric is [recommended][MetricRecommended].
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -229,7 +164,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -245,19 +180,6 @@ This metric is [recommended][MetricRecommended].
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -267,7 +189,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -283,19 +205,6 @@ This metric is [recommended][MetricRecommended].
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -305,7 +214,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -321,19 +230,6 @@ This metric is [recommended][MetricRecommended].
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -343,7 +239,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -358,19 +254,6 @@ This metric is [recommended][MetricRecommended].
**[1]:** Value can be retrieved from [`performance.eventLoopUtilization([utilization1[, utilization2]])`](https://nodejs.org/api/perf_hooks.html#performanceeventlooputilizationutilization1-utilization2)
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`nodejs.eventloop.state`](/docs/attributes-registry/nodejs.md) | string | The state of event loop time. | `active`; `idle` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
diff --git a/docs/runtime/v8js-metrics.md b/docs/runtime/v8js-metrics.md
index 6a3fdc6474..b3d0d0a6f2 100644
--- a/docs/runtime/v8js-metrics.md
+++ b/docs/runtime/v8js-metrics.md
@@ -35,7 +35,7 @@ This metric SHOULD be specified with
[`ExplicitBucketBoundaries`](https://github.com/open-telemetry/opentelemetry-specification/tree/v1.31.0/specification/metrics/api.md#instrument-advisory-parameters)
of `[ 0.01, 0.1, 1, 10 ]`.
-
+
@@ -50,19 +50,6 @@ of `[ 0.01, 0.1, 1, 10 ]`.
**[1]:** The values can be retrieve from [`perf_hooks.PerformanceObserver(...).observe({ entryTypes: ['gc'] })`](https://nodejs.org/api/perf_hooks.html#performanceobserverobserveoptions)
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`v8js.gc.type`](/docs/attributes-registry/v8js.md) | string | The type of garbage collection. | `major`; `minor`; `incremental` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -87,7 +74,7 @@ of `[ 0.01, 0.1, 1, 10 ]`.
This metric is [recommended][MetricRecommended].
-
+
@@ -102,19 +89,6 @@ This metric is [recommended][MetricRecommended].
**[1]:** The value can be retrieved from value `space_size` of [`v8.getHeapSpaceStatistics()`](https://nodejs.org/api/v8.html#v8getheapspacestatistics)
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`v8js.heap.space.name`](/docs/attributes-registry/v8js.md) | string | The name of the space type of heap memory. [1] | `new_space`; `old_space`; `code_space` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -144,7 +118,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -159,19 +133,6 @@ This metric is [recommended][MetricRecommended].
**[1]:** The value can be retrieved from value `space_used_size` of [`v8.getHeapSpaceStatistics()`](https://nodejs.org/api/v8.html#v8getheapspacestatistics)
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`v8js.heap.space.name`](/docs/attributes-registry/v8js.md) | string | The name of the space type of heap memory. [1] | `new_space`; `old_space`; `code_space` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -201,7 +162,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -216,19 +177,6 @@ This metric is [recommended][MetricRecommended].
**[1]:** Value can be retrieved from value `space_available_size` of [`v8.getHeapSpaceStatistics()`](https://nodejs.org/api/v8.html#v8getheapspacestatistics)
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`v8js.heap.space.name`](/docs/attributes-registry/v8js.md) | string | The name of the space type of heap memory. [1] | `new_space`; `old_space`; `code_space` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -258,7 +206,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -273,19 +221,6 @@ This metric is [recommended][MetricRecommended].
**[1]:** Value can be retrieved from value `physical_space_size` of [`v8.getHeapSpaceStatistics()`](https://nodejs.org/api/v8.html#v8getheapspacestatistics)
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`v8js.heap.space.name`](/docs/attributes-registry/v8js.md) | string | The name of the space type of heap memory. [1] | `new_space`; `old_space`; `code_space` | `Required` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
diff --git a/docs/system/container-metrics.md b/docs/system/container-metrics.md
index c9c6a4b2c7..87624eeb64 100644
--- a/docs/system/container-metrics.md
+++ b/docs/system/container-metrics.md
@@ -16,7 +16,7 @@ well-defined APIs (e.g. Kubelet's API or container runtimes).
This metric is [opt-in][MetricOptIn].
-
+
@@ -31,19 +31,6 @@ This metric is [opt-in][MetricOptIn].
**[1]:** Total CPU time consumed by the specific container on all available CPU cores
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`cpu.mode`](/docs/attributes-registry/cpu.md) | string | The CPU mode for this data point. A container's CPU metric SHOULD be characterized _either_ by data points with no `mode` labels, _or only_ data points with `mode` labels. [1] | `user`; `system` | `Conditionally Required` [2] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -78,7 +65,7 @@ This metric is [opt-in][MetricOptIn].
This metric is [opt-in][MetricOptIn].
-
+
@@ -93,19 +80,6 @@ This metric is [opt-in][MetricOptIn].
**[1]:** CPU usage of the specific container on all available CPU cores, averaged over the sample window
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`cpu.mode`](/docs/attributes-registry/cpu.md) | string | The CPU mode for this data point. A container's CPU metric SHOULD be characterized _either_ by data points with no `mode` labels, _or only_ data points with `mode` labels. [1] | `user`; `system` | `Conditionally Required` [2] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -140,7 +114,7 @@ This metric is [opt-in][MetricOptIn].
This metric is [opt-in][MetricOptIn].
-
+
@@ -156,19 +130,6 @@ This metric is [opt-in][MetricOptIn].
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -178,7 +139,7 @@ This metric is [opt-in][MetricOptIn].
This metric is [opt-in][MetricOptIn].
-
+
@@ -193,19 +154,6 @@ This metric is [opt-in][MetricOptIn].
**[1]:** The total number of bytes read/written successfully (aggregated from all disks).
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`disk.io.direction`](/docs/attributes-registry/disk.md) | string | The disk IO operation direction. | `read` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -229,7 +177,7 @@ This metric is [opt-in][MetricOptIn].
This metric is [opt-in][MetricOptIn].
-
+
@@ -244,19 +192,6 @@ This metric is [opt-in][MetricOptIn].
**[1]:** The number of bytes sent/received on all network interfaces by the container.
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`network.io.direction`](/docs/attributes-registry/network.md) | string | The network IO operation direction. | `transmit` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
diff --git a/docs/system/k8s-metrics.md b/docs/system/k8s-metrics.md
index 1f8e2bf8f9..42d152c65e 100644
--- a/docs/system/k8s-metrics.md
+++ b/docs/system/k8s-metrics.md
@@ -19,7 +19,7 @@ and therefore inherit its attributes, like `k8s.pod.name` and `k8s.pod.uid`.
This metric is [recommended][MetricRecommended].
-
+
@@ -35,19 +35,6 @@ This metric is [recommended][MetricRecommended].
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -57,7 +44,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -78,13 +65,25 @@ This metric is [recommended][MetricRecommended].
-
+### Metric: `k8s.pod.memory.usage`
+
+This metric is [recommended][MetricRecommended].
+
+
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `k8s.pod.memory.usage` | Gauge | `By` | Memory usage of the Pod [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Total memory usage of the Pod
+
+
@@ -95,7 +94,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -111,19 +110,6 @@ This metric is [recommended][MetricRecommended].
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -133,7 +119,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -154,13 +140,25 @@ This metric is [recommended][MetricRecommended].
-
+### Metric: `k8s.node.memory.usage`
+
+This metric is [recommended][MetricRecommended].
+
+
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `k8s.node.memory.usage` | Gauge | `By` | Memory usage of the Node [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Total memory usage of the Node
+
+
diff --git a/docs/system/process-metrics.md b/docs/system/process-metrics.md
index 4f9dfc41e9..7e7f7041c6 100644
--- a/docs/system/process-metrics.md
+++ b/docs/system/process-metrics.md
@@ -50,7 +50,7 @@ metrics](/docs/runtime/README.md#metrics).
This metric is [recommended][MetricRecommended].
-
+
@@ -61,19 +61,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `process.cpu.time` | Counter | `s` | Total CPU seconds broken down by different states. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`cpu.mode`](/docs/attributes-registry/cpu.md) | string | A process SHOULD be characterized _either_ by data points with no `mode` labels, _or only_ data points with `mode` labels. [1] | `user`; `system` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -106,7 +93,7 @@ This metric is [recommended][MetricRecommended].
This metric is [opt-in][MetricOptIn].
-
+
@@ -117,19 +104,6 @@ This metric is [opt-in][MetricOptIn].
| -------- | --------------- | ----------- | -------------- | --------- |
| `process.cpu.utilization` | Gauge | `1` | Difference in process.cpu.time since the last measurement, divided by the elapsed time and number of CPUs available to the process. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`cpu.mode`](/docs/attributes-registry/cpu.md) | string | A process SHOULD be characterized _either_ by data points with no `mode` labels, _or only_ data points with `mode` labels. [1] | `user`; `system` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -162,7 +136,7 @@ This metric is [opt-in][MetricOptIn].
This metric is [recommended][MetricRecommended].
-
+
@@ -174,19 +148,6 @@ This metric is [recommended][MetricRecommended].
| `process.memory.usage` | UpDownCounter | `By` | The amount of physical memory in use. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -196,7 +157,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -208,19 +169,6 @@ This metric is [recommended][MetricRecommended].
| `process.memory.virtual` | UpDownCounter | `By` | The amount of committed virtual memory. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -230,7 +178,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -241,19 +189,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `process.disk.io` | Counter | `By` | Disk bytes transferred. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`disk.io.direction`](/docs/attributes-registry/disk.md) | string | The disk IO operation direction. | `read` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -276,7 +211,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -287,19 +222,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `process.network.io` | Counter | `By` | Network bytes transferred. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`network.io.direction`](/docs/attributes-registry/network.md) | string | The network IO operation direction. | `transmit` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -322,7 +244,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -334,19 +256,6 @@ This metric is [recommended][MetricRecommended].
| `process.thread.count` | UpDownCounter | `{thread}` | Process threads count. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -356,7 +265,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -368,19 +277,6 @@ This metric is [recommended][MetricRecommended].
| `process.open_file_descriptor.count` | UpDownCounter | `{count}` | Number of file descriptors in use by the process. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -390,7 +286,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -401,19 +297,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `process.context_switches` | Counter | `{count}` | Number of times the process has been context switched. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`process.context_switch_type`](/docs/attributes-registry/process.md) | string | Specifies whether the context switches for this data point were voluntary or involuntary. | `voluntary`; `involuntary` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -436,7 +319,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -447,19 +330,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `process.paging.faults` | Counter | `{fault}` | Number of page faults the process has made. | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`process.paging.fault_type`](/docs/attributes-registry/process.md) | string | The type of page fault for this data point. Type `major` is for major/hard page faults, and `minor` is for minor/soft page faults. | `major`; `minor` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -482,7 +352,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -498,19 +368,6 @@ This metric is [recommended][MetricRecommended].
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/system/system-metrics.md b/docs/system/system-metrics.md
index a2c8633899..368b922d02 100644
--- a/docs/system/system-metrics.md
+++ b/docs/system/system-metrics.md
@@ -43,9 +43,11 @@ Resource attributes related to a host, SHOULD be reported under the `host.*` nam
- [Metric: `system.disk.io_time`](#metric-systemdiskio_time)
- [Metric: `system.disk.operation_time`](#metric-systemdiskoperation_time)
- [Metric: `system.disk.merged`](#metric-systemdiskmerged)
+ - [Metric: `system.disk.limit`](#metric-systemdisklimit)
- [Filesystem Metrics](#filesystem-metrics)
- [Metric: `system.filesystem.usage`](#metric-systemfilesystemusage)
- [Metric: `system.filesystem.utilization`](#metric-systemfilesystemutilization)
+ - [Metric: `system.filesystem.limit`](#metric-systemfilesystemlimit)
- [Network Metrics](#network-metrics)
- [Metric: `system.network.dropped`](#metric-systemnetworkdropped)
- [Metric: `system.network.packets`](#metric-systemnetworkpackets)
@@ -79,7 +81,7 @@ Resource attributes related to a host, SHOULD be reported under the `host.*` nam
This metric is [recommended][MetricRecommended].
-
+
@@ -90,19 +92,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `system.cpu.time` | Counter | `s` | Seconds each logical CPU spent on each mode | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`cpu.mode`](/docs/attributes-registry/cpu.md) | string | The CPU mode for this data point. A system's CPU SHOULD be characterized *either* by data points with no `mode` labels, *or only* data points with `mode` labels. [1] | `user`; `system` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -136,7 +125,7 @@ This metric is [recommended][MetricRecommended].
This metric is [opt-in][MetricOptIn].
-
+
@@ -147,19 +136,6 @@ This metric is [opt-in][MetricOptIn].
| -------- | --------------- | ----------- | -------------- | --------- |
| `system.cpu.utilization` | Gauge | `1` | Difference in system.cpu.time since the last measurement, divided by the elapsed time and number of logical CPUs | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`cpu.mode`](/docs/attributes-registry/cpu.md) | string | The CPU mode for this data point. A system's CPU SHOULD be characterized *either* by data points with no `mode` labels, *or only* data points with `mode` labels. [1] | `user`; `system` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -193,7 +169,7 @@ This metric is [opt-in][MetricOptIn].
This metric is [recommended][MetricRecommended].
-
+
@@ -205,19 +181,6 @@ This metric is [recommended][MetricRecommended].
| `system.cpu.physical.count` | UpDownCounter | `{cpu}` | Reports the number of actual physical processor cores on the hardware | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -227,7 +190,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -239,19 +202,6 @@ This metric is [recommended][MetricRecommended].
| `system.cpu.logical.count` | UpDownCounter | `{cpu}` | Reports the number of logical (virtual) processor cores created by the operating system to manage multitasking | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -261,7 +211,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -272,19 +222,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `system.cpu.frequency` | Gauge | `{Hz}` | Reports the current frequency of the CPU in Hz | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`system.cpu.logical_number`](/docs/attributes-registry/system.md) | int | The logical CPU number [0..n-1] | `1` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -304,7 +241,7 @@ This does not include [paging/swap memory](#pagingswap-metrics).
This metric is [recommended][MetricRecommended].
-
+
@@ -320,19 +257,6 @@ This metric is [recommended][MetricRecommended].
available on the system, that is `system.memory.limit`.
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`system.memory.state`](/docs/attributes-registry/system.md) | string | The memory state | `free`; `cached` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -357,7 +281,7 @@ available on the system, that is `system.memory.limit`.
This metric is [opt-in][MetricOptIn].
-
+
@@ -373,19 +297,6 @@ This metric is [opt-in][MetricOptIn].
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -395,7 +306,7 @@ This metric is [opt-in][MetricOptIn].
This metric is [opt-in][MetricOptIn].
-
+
@@ -412,19 +323,6 @@ This metric is [opt-in][MetricOptIn].
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -434,7 +332,7 @@ This metric is [opt-in][MetricOptIn].
This metric is [recommended][MetricRecommended].
-
+
@@ -445,19 +343,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `system.memory.utilization` | Gauge | `1` | | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`system.memory.state`](/docs/attributes-registry/system.md) | string | The memory state | `free`; `cached` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -486,7 +371,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -497,19 +382,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `system.paging.usage` | UpDownCounter | `By` | Unix swap or windows pagefile usage | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`system.paging.state`](/docs/attributes-registry/system.md) | string | The memory paging state | `free` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -532,7 +404,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -543,19 +415,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `system.paging.utilization` | Gauge | `1` | | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`system.paging.state`](/docs/attributes-registry/system.md) | string | The memory paging state | `free` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -578,7 +437,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -589,19 +448,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `system.paging.faults` | Counter | `{fault}` | | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`system.paging.type`](/docs/attributes-registry/system.md) | string | The memory paging type | `minor` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -624,7 +470,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -635,19 +481,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `system.paging.operations` | Counter | `{operation}` | | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`system.paging.direction`](/docs/attributes-registry/system.md) | string | The paging access direction | `in` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -683,7 +516,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -694,19 +527,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `system.disk.io` | Counter | `By` | | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`disk.io.direction`](/docs/attributes-registry/disk.md) | string | The disk IO operation direction. | `read` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -730,7 +550,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -741,19 +561,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `system.disk.operations` | Counter | `{operation}` | | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`disk.io.direction`](/docs/attributes-registry/disk.md) | string | The disk IO operation direction. | `read` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -777,7 +584,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -797,19 +604,6 @@ This metric is [recommended][MetricRecommended].
performance counter: `uptime * (100 - "Disk\% Idle Time") / 100`
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`system.device`](/docs/attributes-registry/system.md) | string | The device identifier | `(identifier)` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -824,7 +618,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -842,19 +636,6 @@ This metric is [recommended][MetricRecommended].
- Windows: "Avg. Disk sec/Read" perf counter multiplied by "Disk Reads/sec" perf counter (similar for Writes)
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`disk.io.direction`](/docs/attributes-registry/disk.md) | string | The disk IO operation direction. | `read` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -878,7 +659,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -889,19 +670,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `system.disk.merged` | Counter | `{operation}` | | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`disk.io.direction`](/docs/attributes-registry/disk.md) | string | The disk IO operation direction. | `read` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -921,15 +689,11 @@ This metric is [recommended][MetricRecommended].
-## Filesystem Metrics
-
-**Description:** System level filesystem metrics captured under the namespace `system.filesystem`.
-
-### Metric: `system.filesystem.usage`
+### Metric: `system.disk.limit`
-This metric is [recommended][MetricRecommended].
+This metric is [opt-in][MetricOptIn].
-
+
@@ -938,7 +702,11 @@ This metric is [recommended][MetricRecommended].
| Name | Instrument Type | Unit (UCUM) | Description | Stability |
| -------- | --------------- | ----------- | -------------- | --------- |
-| `system.filesystem.usage` | UpDownCounter | `By` | | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `system.disk.limit` | UpDownCounter | `By` | The total storage capacity of the disk | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
+|---|---|---|---|---|---|
+| [`system.device`](/docs/attributes-registry/system.md) | string | The device identifier | `(identifier)` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -946,6 +714,14 @@ This metric is [recommended][MetricRecommended].
+## Filesystem Metrics
+
+**Description:** System level filesystem metrics captured under the namespace `system.filesystem`.
+
+### Metric: `system.filesystem.usage`
+
+This metric is [recommended][MetricRecommended].
+
@@ -953,9 +729,18 @@ This metric is [recommended][MetricRecommended].
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `system.filesystem.usage` | UpDownCounter | `By` | Reports a filesystem's space usage across different states. [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** The sum of all `system.filesystem.usage` values over the different `system.filesystem.state` attributes
+SHOULD equal the total storage capacity of the filesystem, that is `system.filesystem.limit`.
+
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
-| [`system.device`](/docs/attributes-registry/system.md) | string | The device identifier | `(identifier)` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| [`system.device`](/docs/attributes-registry/system.md) | string | Identifier for the device where the filesystem resides. | `/dev/sda`; `\network-drive` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`system.filesystem.mode`](/docs/attributes-registry/system.md) | string | The filesystem mode | `rw, ro` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`system.filesystem.mountpoint`](/docs/attributes-registry/system.md) | string | The filesystem mount path | `/mnt/data` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`system.filesystem.state`](/docs/attributes-registry/system.md) | string | The filesystem state | `used` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -992,7 +777,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -1003,22 +788,9 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `system.filesystem.utilization` | Gauge | `1` | | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
-| [`system.device`](/docs/attributes-registry/system.md) | string | The device identifier | `(identifier)` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| [`system.device`](/docs/attributes-registry/system.md) | string | Identifier for the device where the filesystem resides. | `/dev/sda`; `\network-drive` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`system.filesystem.mode`](/docs/attributes-registry/system.md) | string | The filesystem mode | `rw, ro` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`system.filesystem.mountpoint`](/docs/attributes-registry/system.md) | string | The filesystem mount path | `/mnt/data` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
| [`system.filesystem.state`](/docs/attributes-registry/system.md) | string | The filesystem state | `used` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -1051,15 +823,11 @@ This metric is [recommended][MetricRecommended].
-## Network Metrics
+### Metric: `system.filesystem.limit`
-**Description:** System level network metrics captured under the namespace `system.network`.
-
-### Metric: `system.network.dropped`
-
-This metric is [recommended][MetricRecommended].
+This metric is [opt-in][MetricOptIn].
-
+
@@ -1068,14 +836,25 @@ This metric is [recommended][MetricRecommended].
| Name | Instrument Type | Unit (UCUM) | Description | Stability |
| -------- | --------------- | ----------- | -------------- | --------- |
-| `system.network.dropped` | Counter | `{packet}` | Count of packets that are dropped or discarded even though there was no error [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `system.filesystem.limit` | UpDownCounter | `By` | The total storage capacity of the filesystem | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
+|---|---|---|---|---|---|
+| [`system.device`](/docs/attributes-registry/system.md) | string | Identifier for the device where the filesystem resides. | `/dev/sda`; `\network-drive` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| [`system.filesystem.mode`](/docs/attributes-registry/system.md) | string | The filesystem mode | `rw, ro` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| [`system.filesystem.mountpoint`](/docs/attributes-registry/system.md) | string | The filesystem mount path | `/mnt/data` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| [`system.filesystem.type`](/docs/attributes-registry/system.md) | string | The filesystem type | `ext4` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-**[1]:** Measured as:
+`system.filesystem.type` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used.
-- Linux: the `drop` column in `/proc/dev/net` ([source](https://web.archive.org/web/20180321091318/http://www.onlamp.com/pub/a/linux/2000/11/16/LinuxAdmin.html))
-- Windows: [`InDiscards`/`OutDiscards`](https://docs.microsoft.com/windows/win32/api/netioapi/ns-netioapi-mib_if_row2)
- from [`GetIfEntry2`](https://docs.microsoft.com/windows/win32/api/netioapi/nf-netioapi-getifentry2)
+| Value | Description | Stability |
+|---|---|---|
+| `exfat` | exfat | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `ext4` | ext4 | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `fat32` | fat32 | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `hfsplus` | hfsplus | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `ntfs` | ntfs | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+| `refs` | refs | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -1084,6 +863,14 @@ This metric is [recommended][MetricRecommended].
+## Network Metrics
+
+**Description:** System level network metrics captured under the namespace `system.network`.
+
+### Metric: `system.network.dropped`
+
+This metric is [recommended][MetricRecommended].
+
@@ -1091,6 +878,18 @@ This metric is [recommended][MetricRecommended].
+| Name | Instrument Type | Unit (UCUM) | Description | Stability |
+| -------- | --------------- | ----------- | -------------- | --------- |
+| `system.network.dropped` | Counter | `{packet}` | Count of packets that are dropped or discarded even though there was no error [1] | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
+
+
+**[1]:** Measured as:
+
+- Linux: the `drop` column in `/proc/dev/net` ([source](https://web.archive.org/web/20180321091318/http://www.onlamp.com/pub/a/linux/2000/11/16/LinuxAdmin.html))
+- Windows: [`InDiscards`/`OutDiscards`](https://docs.microsoft.com/windows/win32/api/netioapi/ns-netioapi-mib_if_row2)
+ from [`GetIfEntry2`](https://docs.microsoft.com/windows/win32/api/netioapi/nf-netioapi-getifentry2)
+
+
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`network.io.direction`](/docs/attributes-registry/network.md) | string | The network IO operation direction. | `transmit` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -1114,7 +913,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -1125,19 +924,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `system.network.packets` | Counter | `{packet}` | | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`network.io.direction`](/docs/attributes-registry/network.md) | string | The network IO operation direction. | `transmit` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -1161,7 +947,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -1180,19 +966,6 @@ This metric is [recommended][MetricRecommended].
from [`GetIfEntry2`](https://docs.microsoft.com/windows/win32/api/netioapi/nf-netioapi-getifentry2).
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`network.io.direction`](/docs/attributes-registry/network.md) | string | The network IO operation direction. | `transmit` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -1216,7 +989,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -1227,19 +1000,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `system.network.io` | Counter | `By` | | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`network.io.direction`](/docs/attributes-registry/network.md) | string | The network IO operation direction. | `transmit` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -1263,7 +1023,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -1274,19 +1034,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `system.network.connections` | UpDownCounter | `{connection}` | | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`network.transport`](/docs/attributes-registry/network.md) | string | [OSI transport layer](https://osi-model.com/transport-layer/) or [inter-process communication method](https://wikipedia.org/wiki/Inter-process_communication). [1] | `tcp`; `udp` | `Recommended` | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
@@ -1344,7 +1091,7 @@ For metrics at the individual process level, see [process metrics](process-metri
This metric is [recommended][MetricRecommended].
-
+
@@ -1355,19 +1102,6 @@ This metric is [recommended][MetricRecommended].
| -------- | --------------- | ----------- | -------------- | --------- |
| `system.process.count` | UpDownCounter | `{process}` | Total number of processes in each state | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`system.process.status`](/docs/attributes-registry/system.md) | string | The process state, e.g., [Linux Process State Codes](https://man7.org/linux/man-pages/man1/ps.1.html#PROCESS_STATE_CODES) | `running` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
@@ -1392,7 +1126,7 @@ This metric is [recommended][MetricRecommended].
This metric is [recommended][MetricRecommended].
-
+
@@ -1404,19 +1138,6 @@ This metric is [recommended][MetricRecommended].
| `system.process.created` | Counter | `{process}` | Total number of processes created over uptime of the host | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1456,7 +1177,7 @@ an `{os}` prefix to split this metric across OSes.
### Metric: `system.linux.memory.available`
-
+
@@ -1485,7 +1206,7 @@ See also `MemAvailable` in [/proc/meminfo](https://man7.org/linux/man-pages/man5
This metric is [recommended][MetricRecommended].
-
+
@@ -1502,19 +1223,6 @@ Note that the total slab memory is not constant and may vary over time.
See also the [Slab allocator](https://blogs.oracle.com/linux/post/understanding-linux-kernel-memory-statistics) and `Slab` in [/proc/meminfo](https://man7.org/linux/man-pages/man5/proc.5.html).
-
-
-
-
-
-
-
-
-
-
-
-
-
| Attribute | Type | Description | Examples | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Stability |
|---|---|---|---|---|---|
| [`linux.memory.slab.state`](/docs/attributes-registry/linux.md) | string | The Linux Slab memory state | `reclaimable`; `unreclaimable` | `Recommended` | ![Experimental](https://img.shields.io/badge/-experimental-blue) |
diff --git a/internal/tools/scripts/registry/areas-weaver.yaml b/internal/tools/scripts/registry/areas-weaver.yaml
new file mode 100644
index 0000000000..074629a1cf
--- /dev/null
+++ b/internal/tools/scripts/registry/areas-weaver.yaml
@@ -0,0 +1,13 @@
+templates:
+ - pattern: areas.md.j2
+ filter: >
+ semconv_grouped_attributes({"exclude_deprecated": true}) | .[].root_namespace
+ application_mode: single
+whitespace_control:
+ trim_blocks: true
+ lstrip_blocks: true
+ keep_trailing_newline: true
+text_maps:
+ areas:
+ az: azure
+ hw: hardware
diff --git a/internal/tools/scripts/registry/areas.md.j2 b/internal/tools/scripts/registry/areas.md.j2
new file mode 100644
index 0000000000..f10bdea506
--- /dev/null
+++ b/internal/tools/scripts/registry/areas.md.j2
@@ -0,0 +1,5 @@
+{{- template.set_file_name("areas.txt") -}}
+
+{% for item in ctx | map('map_text', 'areas') | sort %}
+area:{{ item | kebab_case }}
+{% endfor %}
\ No newline at end of file
diff --git a/internal/tools/scripts/update-issue-template-areas.sh b/internal/tools/scripts/update-issue-template-areas.sh
index e905808a18..3b906dfc55 100755
--- a/internal/tools/scripts/update-issue-template-areas.sh
+++ b/internal/tools/scripts/update-issue-template-areas.sh
@@ -24,17 +24,16 @@ REPO_DIR="$( cd "$CUR_DIRECTORY/../../../" && pwd )"
GITHUB_DIR="$( cd "$REPO_DIR/.github/" && pwd )"
TEMPLATES_DIR="$( cd "$GITHUB_DIR/ISSUE_TEMPLATE" && pwd )"
-AREAS=$(sh "${GITHUB_DIR}/workflows/scripts/get-registry-areas.sh")
+AREAS=$1
START_AREA_LIST="# Start semconv area list"
END_AREA_LIST="# End semconv area list"
replacement=" ${START_AREA_LIST}"
-for AREA in ${AREAS}; do
- LABEL_NAME=$(basename "${AREA}" .yaml)
- replacement="${replacement}\n - area:${LABEL_NAME}"
-done
+while IFS= read -r line; do
+ replacement="${replacement}\n - $line"
+done < ${AREAS}
echo -e "\nStarting to replace areas in ISSUE_TEMPLATES:"
echo -e "---------------------------------------------\n"
diff --git a/model/README.md b/model/README.md
index ec76e3f883..ce6fb75e93 100644
--- a/model/README.md
+++ b/model/README.md
@@ -14,12 +14,12 @@ Semantic conventions for the spec MUST adhere to the
[attribute requirement level](../docs/general/attribute-requirement-level.md),
and [metric requirement level](../docs/general/metric-requirement-level.md) conventions.
-Refer to the [syntax](https://github.com/open-telemetry/build-tools/tree/v0.25.0/semantic-conventions/syntax.md)
+Refer to the [syntax](https://github.com/open-telemetry/weaver/blob/main/schemas/semconv-syntax.md)
for how to write the YAML files for semantic conventions and what the YAML properties mean.
A schema file for VS code is configured in the `/.vscode/settings.json` of this
repository, enabling auto-completion and additional checks. Refer to
-[the generator README](https://github.com/open-telemetry/build-tools/tree/v0.25.0/semantic-conventions/README.md) for what extension you need.
+[the generator README](https://github.com/open-telemetry/weaver/blob/main/schemas/semconv-syntax.md) for what extension you need.
## Generating markdown
@@ -32,12 +32,10 @@ make table-generation
For more information, see the [Weaver](https://github.com/open-telemetry/weaver)
as our code generations tool.
-Using Weaver, it is also possible to generate code for use in OpenTelemetry
-language projects, in addition to build-tools.
See also:
-* [Markdown Templates](https://github.com/open-telemetry/semantic-conventions/tree/main/templates/registry/markdown)
+* [Markdown Templates](../templates/registry/markdown)
* [Weaver Template Documentation](https://github.com/open-telemetry/weaver/blob/main/crates/weaver_forge/README.md)
* [Weaver Usage Documentation](https://github.com/open-telemetry/weaver/blob/main/docs/usage.md#registry-generate)
-* [Build Tools - Code Generator](https://github.com/open-telemetry/build-tools/tree/main/semantic-conventions#code-generator)
+* [Code Generator Documentation](../docs/non-normative/code-generation.md)
diff --git a/model/registry/deprecated/android.yaml b/model/android/deprecated/registry-deprecated.yaml
similarity index 96%
rename from model/registry/deprecated/android.yaml
rename to model/android/deprecated/registry-deprecated.yaml
index fdf2018447..3b0c9ce079 100644
--- a/model/registry/deprecated/android.yaml
+++ b/model/android/deprecated/registry-deprecated.yaml
@@ -7,6 +7,7 @@ groups:
attributes:
- id: android.state
stability: experimental
+ deprecated: "Replaced by `device.app.lifecycle`."
brief: >
Deprecated use the `device.app.lifecycle` event definition including
`android.state` as a payload field instead.
diff --git a/model/registry/android.yaml b/model/android/registry.yaml
similarity index 100%
rename from model/registry/android.yaml
rename to model/android/registry.yaml
diff --git a/model/resource/android.yaml b/model/android/resources.yaml
similarity index 90%
rename from model/resource/android.yaml
rename to model/android/resources.yaml
index d749201b30..7138bc2902 100644
--- a/model/resource/android.yaml
+++ b/model/android/resources.yaml
@@ -1,6 +1,7 @@
groups:
- id: android
type: resource
+ name: android
brief: >
The Android platform on which the Android application is running.
attributes:
diff --git a/model/registry/artifact.yaml b/model/artifact/registry.yaml
similarity index 100%
rename from model/registry/artifact.yaml
rename to model/artifact/registry.yaml
diff --git a/model/metrics/dotnet/dotnet-aspnetcore.yaml b/model/aspnetcore/metrics.yaml
similarity index 100%
rename from model/metrics/dotnet/dotnet-aspnetcore.yaml
rename to model/aspnetcore/metrics.yaml
diff --git a/model/registry/aspnetcore.yaml b/model/aspnetcore/registry.yaml
similarity index 100%
rename from model/registry/aspnetcore.yaml
rename to model/aspnetcore/registry.yaml
diff --git a/model/resource/cloud_provider/aws/ecs.yaml b/model/aws/ecs-resources.yaml
similarity index 97%
rename from model/resource/cloud_provider/aws/ecs.yaml
rename to model/aws/ecs-resources.yaml
index 53c998c575..7b14ff129c 100644
--- a/model/resource/cloud_provider/aws/ecs.yaml
+++ b/model/aws/ecs-resources.yaml
@@ -1,6 +1,7 @@
groups:
- id: aws.ecs
type: resource
+ name: aws.ecs
brief: >
Resources used by AWS Elastic Container Service (ECS).
attributes:
diff --git a/model/resource/cloud_provider/aws/eks.yaml b/model/aws/eks-resources.yaml
similarity index 91%
rename from model/resource/cloud_provider/aws/eks.yaml
rename to model/aws/eks-resources.yaml
index a25713cdfd..ea849dfed9 100644
--- a/model/resource/cloud_provider/aws/eks.yaml
+++ b/model/aws/eks-resources.yaml
@@ -1,6 +1,7 @@
groups:
- id: aws.eks
type: resource
+ name: aws.eks
brief: >
Resources used by AWS Elastic Kubernetes Service (EKS).
attributes:
diff --git a/model/trace/aws/lambda.yaml b/model/aws/lambda-spans.yaml
similarity index 100%
rename from model/trace/aws/lambda.yaml
rename to model/aws/lambda-spans.yaml
diff --git a/model/resource/cloud_provider/aws/logs.yaml b/model/aws/logs-resources.yaml
similarity index 95%
rename from model/resource/cloud_provider/aws/logs.yaml
rename to model/aws/logs-resources.yaml
index ffd5feb3d4..b5b379dfdf 100644
--- a/model/resource/cloud_provider/aws/logs.yaml
+++ b/model/aws/logs-resources.yaml
@@ -1,6 +1,7 @@
groups:
- id: aws.log
type: resource
+ name: aws.log
brief: >
Resources specific to Amazon Web Services.
attributes:
diff --git a/model/registry/aws.yaml b/model/aws/registry.yaml
similarity index 74%
rename from model/registry/aws.yaml
rename to model/aws/registry.yaml
index e96186a682..75ebeee669 100644
--- a/model/registry/aws.yaml
+++ b/model/aws/registry.yaml
@@ -260,13 +260,16 @@ groups:
stability: experimental
brief: >
The Amazon Resource Name (ARN) of an [ECS container instance](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_instances.html).
- examples: ['arn:aws:ecs:us-west-1:123456789123:container/32624152-9086-4f0e-acae-1a75b14fe4d9']
+ examples:
+ [
+ "arn:aws:ecs:us-west-1:123456789123:container/32624152-9086-4f0e-acae-1a75b14fe4d9",
+ ]
- id: aws.ecs.cluster.arn
type: string
stability: experimental
brief: >
The ARN of an [ECS cluster](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/clusters.html).
- examples: ['arn:aws:ecs:us-west-2:123456789123:cluster/my-cluster']
+ examples: ["arn:aws:ecs:us-west-2:123456789123:cluster/my-cluster"]
- id: aws.ecs.launchtype
type:
members:
@@ -284,16 +287,17 @@ groups:
stability: experimental
brief: >
The ARN of a running [ECS task](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-account-settings.html#ecs-resource-ids).
- examples: [
- 'arn:aws:ecs:us-west-1:123456789123:task/10838bed-421f-43ef-870a-f43feacbbb5b',
- 'arn:aws:ecs:us-west-1:123456789123:task/my-cluster/task-id/23ebb8ac-c18f-46c6-8bbe-d55d0e37cfbd'
- ]
+ examples:
+ [
+ "arn:aws:ecs:us-west-1:123456789123:task/10838bed-421f-43ef-870a-f43feacbbb5b",
+ "arn:aws:ecs:us-west-1:123456789123:task/my-cluster/task-id/23ebb8ac-c18f-46c6-8bbe-d55d0e37cfbd"
+ ]
- id: aws.ecs.task.family
type: string
stability: experimental
brief: >
The family name of the [ECS task definition](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html) used to create the ECS task.
- examples: ['opentelemetry-family']
+ examples: ["opentelemetry-family"]
- id: aws.ecs.task.id
type: string
stability: experimental
@@ -301,7 +305,11 @@ groups:
The ID of a running ECS task. The ID MUST be extracted from `task.arn`.
requirement_level:
conditionally_required: If and only if `task.arn` is populated.
- examples: [ '10838bed-421f-43ef-870a-f43feacbbb5b', '23ebb8ac-c18f-46c6-8bbe-d55d0e37cfbd' ]
+ examples:
+ [
+ "10838bed-421f-43ef-870a-f43feacbbb5b",
+ "23ebb8ac-c18f-46c6-8bbe-d55d0e37cfbd"
+ ]
- id: aws.ecs.task.revision
type: string
stability: experimental
@@ -319,7 +327,7 @@ groups:
stability: experimental
brief: >
The ARN of an EKS cluster.
- examples: ['arn:aws:ecs:us-west-2:123456789123:cluster/my-cluster']
+ examples: ["arn:aws:ecs:us-west-2:123456789123:cluster/my-cluster"]
- id: registry.aws.log
type: attribute_group
display_name: Amazon Logs Attributes
@@ -332,7 +340,7 @@ groups:
brief: >
The name(s) of the AWS log group(s) an application is writing to.
examples:
- - ['/aws/lambda/my-function', 'opentelemetry-service']
+ - ["/aws/lambda/my-function", "opentelemetry-service"]
note: >
Multiple log groups must be supported for cases like multi-container applications,
where a single application has sidecar containers, and each write to their own log
@@ -343,7 +351,7 @@ groups:
brief: >
The Amazon Resource Name(s) (ARN) of the AWS log group(s).
examples:
- - ['arn:aws:logs:us-west-1:123456789012:log-group:/aws/my/group:*']
+ - ["arn:aws:logs:us-west-1:123456789012:log-group:/aws/my/group:*"]
note: >
See the
[log group ARN format documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/iam-access-control-overview-cwl.html#CWL_ARN_Format).
@@ -353,14 +361,14 @@ groups:
brief: >
The name(s) of the AWS log stream(s) an application is writing to.
examples:
- - ['logs/main/10838bed-421f-43ef-870a-f43feacbbb5b']
+ - ["logs/main/10838bed-421f-43ef-870a-f43feacbbb5b"]
- id: aws.log.stream.arns
type: string[]
stability: experimental
brief: >
The ARN(s) of the AWS log stream(s).
examples:
- - ['arn:aws:logs:us-west-1:123456789012:log-group:/aws/my/group:log-stream:logs/main/10838bed-421f-43ef-870a-f43feacbbb5b']
+ - ["arn:aws:logs:us-west-1:123456789012:log-group:/aws/my/group:log-stream:logs/main/10838bed-421f-43ef-870a-f43feacbbb5b"]
note: >
See the
[log stream ARN format documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/iam-access-control-overview-cwl.html#CWL_ARN_Format).
@@ -380,7 +388,7 @@ groups:
The full invoked ARN as provided on the `Context` passed to the function
(`Lambda-Runtime-Invoked-Function-Arn` header on the `/runtime/invocation/next` applicable).
note: This may be different from `cloud.resource_id` if an alias is involved.
- examples: ['arn:aws:lambda:us-east-1:123456:function:myfunction:myalias']
+ examples: ["arn:aws:lambda:us-east-1:123456:function:myfunction:myalias"]
- id: registry.aws.s3
type: attribute_group
display_name: Amazon S3 Attributes
@@ -394,8 +402,8 @@ groups:
examples:
- some-bucket-name
note: |
- The `bucket` attribute is applicable to all S3 operations that reference a bucket, i.e. that require the bucket name as a mandatory parameter.
- This applies to almost all S3 operations except `list-buckets`.
+ The `bucket` attribute is applicable to all S3 operations that reference a bucket, i.e. that require the bucket name as a mandatory parameter.
+ This applies to almost all S3 operations except `list-buckets`.
- id: aws.s3.key
type: string
stability: experimental
@@ -403,22 +411,22 @@ groups:
examples:
- someFile.yml
note: |
- The `key` attribute is applicable to all object-related S3 operations, i.e. that require the object key as a mandatory parameter.
- This applies in particular to the following operations:
+ The `key` attribute is applicable to all object-related S3 operations, i.e. that require the object key as a mandatory parameter.
+ This applies in particular to the following operations:
- - [copy-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/copy-object.html)
- - [delete-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html)
- - [get-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/get-object.html)
- - [head-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/head-object.html)
- - [put-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/put-object.html)
- - [restore-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/restore-object.html)
- - [select-object-content](https://docs.aws.amazon.com/cli/latest/reference/s3api/select-object-content.html)
- - [abort-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/abort-multipart-upload.html)
- - [complete-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/complete-multipart-upload.html)
- - [create-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/create-multipart-upload.html)
- - [list-parts](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-parts.html)
- - [upload-part](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html)
- - [upload-part-copy](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html)
+ - [copy-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/copy-object.html)
+ - [delete-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html)
+ - [get-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/get-object.html)
+ - [head-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/head-object.html)
+ - [put-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/put-object.html)
+ - [restore-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/restore-object.html)
+ - [select-object-content](https://docs.aws.amazon.com/cli/latest/reference/s3api/select-object-content.html)
+ - [abort-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/abort-multipart-upload.html)
+ - [complete-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/complete-multipart-upload.html)
+ - [create-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/create-multipart-upload.html)
+ - [list-parts](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-parts.html)
+ - [upload-part](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html)
+ - [upload-part-copy](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html)
- id: aws.s3.copy_source
type: string
stability: experimental
@@ -426,38 +434,38 @@ groups:
examples:
- someFile.yml
note: |
- The `copy_source` attribute applies to S3 copy operations and corresponds to the `--copy-source` parameter
- of the [copy-object operation within the S3 API](https://docs.aws.amazon.com/cli/latest/reference/s3api/copy-object.html).
- This applies in particular to the following operations:
+ The `copy_source` attribute applies to S3 copy operations and corresponds to the `--copy-source` parameter
+ of the [copy-object operation within the S3 API](https://docs.aws.amazon.com/cli/latest/reference/s3api/copy-object.html).
+ This applies in particular to the following operations:
- - [copy-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/copy-object.html)
- - [upload-part-copy](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html)
+ - [copy-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/copy-object.html)
+ - [upload-part-copy](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html)
- id: aws.s3.upload_id
type: string
stability: experimental
brief: "Upload ID that identifies the multipart upload."
examples:
- - 'dfRtDYWFbkRONycy.Yxwh66Yjlx.cph0gtNBtJ'
+ - "dfRtDYWFbkRONycy.Yxwh66Yjlx.cph0gtNBtJ"
note: |
- The `upload_id` attribute applies to S3 multipart-upload operations and corresponds to the `--upload-id` parameter
- of the [S3 API](https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html) multipart operations.
- This applies in particular to the following operations:
+ The `upload_id` attribute applies to S3 multipart-upload operations and corresponds to the `--upload-id` parameter
+ of the [S3 API](https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html) multipart operations.
+ This applies in particular to the following operations:
- - [abort-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/abort-multipart-upload.html)
- - [complete-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/complete-multipart-upload.html)
- - [list-parts](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-parts.html)
- - [upload-part](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html)
- - [upload-part-copy](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html)
+ - [abort-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/abort-multipart-upload.html)
+ - [complete-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/complete-multipart-upload.html)
+ - [list-parts](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-parts.html)
+ - [upload-part](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html)
+ - [upload-part-copy](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html)
- id: aws.s3.delete
type: string
stability: experimental
brief: "The delete request container that specifies the objects to be deleted."
examples:
- - 'Objects=[{Key=string,VersionId=string},{Key=string,VersionId=string}],Quiet=boolean'
+ - "Objects=[{Key=string,VersionId=string},{Key=string,VersionId=string}],Quiet=boolean"
note: |
- The `delete` attribute is only applicable to the [delete-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html) operation.
- The `delete` attribute corresponds to the `--delete` parameter of the
- [delete-objects operation within the S3 API](https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-objects.html).
+ The `delete` attribute is only applicable to the [delete-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html) operation.
+ The `delete` attribute corresponds to the `--delete` parameter of the
+ [delete-objects operation within the S3 API](https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-objects.html).
- id: aws.s3.part_number
type: int
stability: experimental
@@ -465,7 +473,7 @@ groups:
examples:
- 3456
note: |
- The `part_number` attribute is only applicable to the [upload-part](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html)
- and [upload-part-copy](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html) operations.
- The `part_number` attribute corresponds to the `--part-number` parameter of the
- [upload-part operation within the S3 API](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html).
+ The `part_number` attribute is only applicable to the [upload-part](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html)
+ and [upload-part-copy](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html) operations.
+ The `part_number` attribute corresponds to the `--part-number` parameter of the
+ [upload-part operation within the S3 API](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html).
diff --git a/model/trace/instrumentation/aws-sdk.yml b/model/aws/sdk-spans.yml
similarity index 100%
rename from model/trace/instrumentation/aws-sdk.yml
rename to model/aws/sdk-spans.yml
diff --git a/model/logs/azure.yaml b/model/azure/logs.yaml
similarity index 100%
rename from model/logs/azure.yaml
rename to model/azure/logs.yaml
diff --git a/model/registry/azure.yaml b/model/azure/registry.yaml
similarity index 54%
rename from model/registry/azure.yaml
rename to model/azure/registry.yaml
index 3e7c603dda..2fdd5c9501 100644
--- a/model/registry/azure.yaml
+++ b/model/azure/registry.yaml
@@ -10,3 +10,10 @@ groups:
brief: "The unique identifier of the service request. It's generated by the Azure service and returned with the response."
examples:
- "00000000-0000-0000-0000-000000000000"
+ - id: az.namespace
+ type: string
+ stability: experimental
+ brief: >
+ [Azure Resource Provider Namespace](https://learn.microsoft.com/azure/azure-resource-manager/management/azure-services-resource-providers)
+ as recognized by the client.
+ examples: ["Microsoft.Storage", "Microsoft.KeyVault", "Microsoft.ServiceBus"]
diff --git a/model/registry/browser.yaml b/model/browser/registry.yaml
similarity index 100%
rename from model/registry/browser.yaml
rename to model/browser/registry.yaml
diff --git a/model/resource/browser.yaml b/model/browser/resources.yaml
similarity index 98%
rename from model/resource/browser.yaml
rename to model/browser/resources.yaml
index c732a2c9d4..df8492cd60 100644
--- a/model/resource/browser.yaml
+++ b/model/browser/resources.yaml
@@ -1,6 +1,7 @@
groups:
- id: browser
type: resource
+ name: browser
brief: >
The web browser in which the application represented by the resource is running.
The `browser.*` attributes MUST be used only for resources that represent applications
diff --git a/model/registry/cicd.yaml b/model/cicd/registry.yaml
similarity index 100%
rename from model/registry/cicd.yaml
rename to model/cicd/registry.yaml
diff --git a/model/client/common.yaml b/model/client/common.yaml
new file mode 100644
index 0000000000..02ef815ede
--- /dev/null
+++ b/model/client/common.yaml
@@ -0,0 +1,8 @@
+groups:
+ - id: client
+ type: attribute_group
+ brief: >
+ General client attributes.
+ attributes:
+ - ref: client.address
+ - ref: client.port
diff --git a/model/registry/client.yaml b/model/client/registry.yaml
similarity index 100%
rename from model/registry/client.yaml
rename to model/client/registry.yaml
diff --git a/model/registry/cloud.yaml b/model/cloud/registry.yaml
similarity index 97%
rename from model/registry/cloud.yaml
rename to model/cloud/registry.yaml
index 184ab0e96b..4390eebc4e 100644
--- a/model/registry/cloud.yaml
+++ b/model/cloud/registry.yaml
@@ -81,13 +81,13 @@ groups:
* **GCP:** The [URI of the resource](https://cloud.google.com/iam/docs/full-resource-names)
* **Azure:** The [Fully Qualified Resource ID](https://docs.microsoft.com/rest/api/resources/resources/get-by-id) of the invoked function,
*not* the function app, having the form
- `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/`.
+ `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/`.
This means that a span attribute MUST be used, as an Azure function app can host multiple functions that would usually share
a TracerProvider.
examples:
- 'arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function'
- '//run.googleapis.com/projects/PROJECT_ID/locations/LOCATION_ID/services/SERVICE_ID'
- - '/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/'
+ - '/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/'
- id: cloud.availability_zone
type: string
stability: experimental
diff --git a/model/resource/cloud.yaml b/model/cloud/resources.yaml
similarity index 94%
rename from model/resource/cloud.yaml
rename to model/cloud/resources.yaml
index c6de5db22e..954ff0ad1b 100644
--- a/model/resource/cloud.yaml
+++ b/model/cloud/resources.yaml
@@ -1,6 +1,7 @@
groups:
- id: cloud
type: resource
+ name: cloud
brief: >
A cloud environment (e.g. GCP, Azure, AWS)
attributes:
diff --git a/model/registry/cloudevents.yaml b/model/cloudevents/registry.yaml
similarity index 100%
rename from model/registry/cloudevents.yaml
rename to model/cloudevents/registry.yaml
diff --git a/model/trace/cloudevents.yaml b/model/cloudevents/spans.yaml
similarity index 100%
rename from model/trace/cloudevents.yaml
rename to model/cloudevents/spans.yaml
diff --git a/model/code/common.yaml b/model/code/common.yaml
new file mode 100644
index 0000000000..b90efeec96
--- /dev/null
+++ b/model/code/common.yaml
@@ -0,0 +1,13 @@
+groups:
+ - id: code
+ type: attribute_group
+ brief: >
+ These attributes allow to report this unit of code and therefore to provide more context about the span.
+ attributes:
+ - ref: code.function
+ - ref: code.namespace
+ - ref: code.filepath
+ - ref: code.lineno
+ - ref: code.column
+ - ref: code.stacktrace
+ requirement_level: opt_in
diff --git a/model/registry/code.yaml b/model/code/registry.yaml
similarity index 89%
rename from model/registry/code.yaml
rename to model/code/registry.yaml
index d67740f4ec..15621a94df 100644
--- a/model/registry/code.yaml
+++ b/model/code/registry.yaml
@@ -42,6 +42,7 @@ groups:
brief: >
A stacktrace as a string in the natural representation for the language runtime.
The representation is to be determined and documented by each language SIG.
- examples: 'at com.example.GenerateTrace.methodB(GenerateTrace.java:13)\n
- at com.example.GenerateTrace.methodA(GenerateTrace.java:9)\n
- at com.example.GenerateTrace.main(GenerateTrace.java:5)'
+ examples: >
+ at com.example.GenerateTrace.methodB(GenerateTrace.java:13)\n
+ at com.example.GenerateTrace.methodA(GenerateTrace.java:9)\n
+ at com.example.GenerateTrace.main(GenerateTrace.java:5)
diff --git a/model/registry/deprecated/container.yaml b/model/container/deprecated/registry-deprecated.yaml
similarity index 100%
rename from model/registry/deprecated/container.yaml
rename to model/container/deprecated/registry-deprecated.yaml
diff --git a/model/metrics/container.yaml b/model/container/metrics.yaml
similarity index 100%
rename from model/metrics/container.yaml
rename to model/container/metrics.yaml
diff --git a/model/registry/container.yaml b/model/container/registry.yaml
similarity index 80%
rename from model/registry/container.yaml
rename to model/container/registry.yaml
index 090c7bddff..e81b18187f 100644
--- a/model/registry/container.yaml
+++ b/model/container/registry.yaml
@@ -84,13 +84,13 @@ groups:
type: string
stability: experimental
brief: >
- The full command run by the container as a single string representing the full command. [2]
+ The full command run by the container as a single string representing the full command.
examples: [ 'otelcontribcol --config config.yaml' ]
- id: container.command_args
type: string[]
stability: experimental
brief: >
- All the command arguments (including the command/executable itself) run by the container. [2]
+ All the command arguments (including the command/executable itself) run by the container.
examples:
- [ 'otelcontribcol', '--config', 'config.yaml' ]
- id: container.label
@@ -99,3 +99,23 @@ groups:
brief: >
Container labels, `` being the label name, the value being the label value.
examples: [ 'container.label.app=nginx' ]
+ - id: container.csi.plugin.name
+ type: string
+ stability: experimental
+ brief: >
+ The name of the CSI ([Container Storage Interface](https://github.com/container-storage-interface/spec)) plugin used by the volume.
+ note: >
+ This can sometimes be referred to as a "driver" in CSI implementations.
+ This should represent the `name` field of the GetPluginInfo RPC.
+ examples:
+ - "pd.csi.storage.gke.io"
+ - id: container.csi.volume.id
+ type: string
+ stability: experimental
+ brief: >
+ The unique volume ID returned by the CSI ([Container Storage Interface](https://github.com/container-storage-interface/spec)) plugin.
+ note: >
+ This can sometimes be referred to as a "volume handle" in CSI implementations.
+ This should represent the `Volume.volume_id` field in CSI spec.
+ examples:
+ - "projects/my-gcp-project/zones/my-gcp-zone/disks/my-gcp-disk"
diff --git a/model/resource/container.yaml b/model/container/resources.yaml
similarity index 96%
rename from model/resource/container.yaml
rename to model/container/resources.yaml
index 41c178071f..039faa8616 100644
--- a/model/resource/container.yaml
+++ b/model/container/resources.yaml
@@ -1,6 +1,7 @@
groups:
- id: container
type: resource
+ name: container
brief: >
A container instance.
attributes:
diff --git a/model/registry/cpu.yaml b/model/cpu/registry.yaml
similarity index 100%
rename from model/registry/cpu.yaml
rename to model/cpu/registry.yaml
diff --git a/model/db-common.yaml b/model/database/common.yaml
similarity index 100%
rename from model/db-common.yaml
rename to model/database/common.yaml
diff --git a/model/metrics/deprecated/database.yaml b/model/database/deprecated/metrics-deprecated.yaml
similarity index 100%
rename from model/metrics/deprecated/database.yaml
rename to model/database/deprecated/metrics-deprecated.yaml
diff --git a/model/registry/deprecated/db.yaml b/model/database/deprecated/registry-deprecated.yaml
similarity index 98%
rename from model/registry/deprecated/db.yaml
rename to model/database/deprecated/registry-deprecated.yaml
index 9f8e56eb48..e8fdf5d667 100644
--- a/model/registry/deprecated/db.yaml
+++ b/model/database/deprecated/registry-deprecated.yaml
@@ -9,8 +9,7 @@ groups:
type: string
brief: 'Deprecated, use `server.address`, `server.port` attributes instead.'
stability: experimental
- deprecated: >
- "Replaced by `server.address` and `server.port`."
+ deprecated: "Replaced by `server.address` and `server.port`."
examples: Server=(localdb)\v11.0;Integrated Security=true;
- id: db.jdbc.driver_classname
type: string
diff --git a/model/metrics/database-metrics.yaml b/model/database/metrics.yaml
similarity index 100%
rename from model/metrics/database-metrics.yaml
rename to model/database/metrics.yaml
diff --git a/model/registry/db.yaml b/model/database/registry.yaml
similarity index 78%
rename from model/registry/db.yaml
rename to model/database/registry.yaml
index f848714dfa..9a283c2c3f 100644
--- a/model/registry/db.yaml
+++ b/model/database/registry.yaml
@@ -42,7 +42,7 @@ groups:
means in the context of that system.
It is RECOMMENDED to capture the value as provided by the application without attempting to do any case normalization.
- examples: [ 'customers', 'test.users' ]
+ examples: ["customers", "test.users"]
- id: db.operation.name
type: string
stability: experimental
@@ -56,7 +56,7 @@ groups:
For batch operations, if the individual operations are known to have the same operation name
then that operation name SHOULD be used prepended by `BATCH `,
otherwise `db.operation.name` SHOULD be `BATCH` or some other database system specific term if more applicable.
- examples: ['findAndModify', 'HMSET', 'SELECT']
+ examples: ["findAndModify", "HMSET", "SELECT"]
- id: db.query.text
type: string
stability: experimental
@@ -72,7 +72,11 @@ groups:
Even though parameterized query text can potentially have sensitive data, by using a parameterized query
the user is giving a strong signal that any sensitive data will be passed as parameter values, and the benefit
to observability of capturing the static part of the query text by default outweighs the risk.
- examples: ['SELECT * FROM wuser_table where username = ?', 'SET mykey "WuValue"']
+ examples:
+ [
+ "SELECT * FROM wuser_table where username = ?",
+ 'SET mykey "WuValue"',
+ ]
- id: db.query.parameter
type: template[string]
stability: experimental
@@ -84,7 +88,7 @@ groups:
If a parameter has no name and instead is referenced only by index,
then `` SHOULD be the 0-based index.
- examples: ['someval', '55']
+ examples: ["someval", "55"]
- id: db.operation.batch.size
type: int
stability: experimental
@@ -92,7 +96,7 @@ groups:
note: >
Operations are only considered batches when they contain two or more operations,
and so `db.operation.batch.size` SHOULD never be `1`.
- examples: [ 2, 3, 4 ]
+ examples: [2, 3, 4]
- id: db.system
brief: The database management system (DBMS) product as identified by the client instrumentation.
note: >
@@ -102,225 +106,225 @@ groups:
type:
members:
- id: other_sql
- value: 'other_sql'
- brief: 'Some other SQL database. Fallback only. See notes.'
+ value: "other_sql"
+ brief: "Some other SQL database. Fallback only. See notes."
stability: experimental
- id: adabas
- value: 'adabas'
- brief: 'Adabas (Adaptable Database System)'
+ value: "adabas"
+ brief: "Adabas (Adaptable Database System)"
stability: experimental
- id: cache
- value: 'cache'
+ value: "cache"
deprecated: "Replaced by `intersystems_cache`."
brief: "Deprecated, use `intersystems_cache` instead."
stability: experimental
- id: intersystems_cache
- value: 'intersystems_cache'
+ value: "intersystems_cache"
brief: "InterSystems Caché"
stability: experimental
- id: cassandra
- value: 'cassandra'
- brief: 'Apache Cassandra'
+ value: "cassandra"
+ brief: "Apache Cassandra"
stability: experimental
- id: clickhouse
- value: 'clickhouse'
- brief: 'ClickHouse'
+ value: "clickhouse"
+ brief: "ClickHouse"
stability: experimental
- id: cloudscape
- value: 'cloudscape'
+ value: "cloudscape"
deprecated: "Replaced by `other_sql`."
brief: "Deprecated, use `other_sql` instead."
stability: experimental
- id: cockroachdb
- value: 'cockroachdb'
- brief: 'CockroachDB'
+ value: "cockroachdb"
+ brief: "CockroachDB"
stability: experimental
- id: coldfusion
- value: 'coldfusion'
+ value: "coldfusion"
deprecated: "Removed."
brief: "Deprecated, no replacement at this time."
stability: experimental
- id: cosmosdb
- value: 'cosmosdb'
- brief: 'Microsoft Azure Cosmos DB'
+ value: "cosmosdb"
+ brief: "Microsoft Azure Cosmos DB"
stability: experimental
- id: couchbase
- value: 'couchbase'
- brief: 'Couchbase'
+ value: "couchbase"
+ brief: "Couchbase"
stability: experimental
- id: couchdb
- value: 'couchdb'
- brief: 'CouchDB'
+ value: "couchdb"
+ brief: "CouchDB"
stability: experimental
- id: db2
- value: 'db2'
- brief: 'IBM Db2'
+ value: "db2"
+ brief: "IBM Db2"
stability: experimental
- id: derby
- value: 'derby'
- brief: 'Apache Derby'
+ value: "derby"
+ brief: "Apache Derby"
stability: experimental
- id: dynamodb
- value: 'dynamodb'
- brief: 'Amazon DynamoDB'
+ value: "dynamodb"
+ brief: "Amazon DynamoDB"
stability: experimental
- id: edb
- value: 'edb'
- brief: 'EnterpriseDB'
+ value: "edb"
+ brief: "EnterpriseDB"
stability: experimental
- id: elasticsearch
- value: 'elasticsearch'
- brief: 'Elasticsearch'
+ value: "elasticsearch"
+ brief: "Elasticsearch"
stability: experimental
- id: filemaker
- value: 'filemaker'
- brief: 'FileMaker'
+ value: "filemaker"
+ brief: "FileMaker"
stability: experimental
- id: firebird
- value: 'firebird'
- brief: 'Firebird'
+ value: "firebird"
+ brief: "Firebird"
stability: experimental
- id: firstsql
- value: 'firstsql'
+ value: "firstsql"
deprecated: "Replaced by `other_sql`."
brief: "Deprecated, use `other_sql` instead."
stability: experimental
- id: geode
- value: 'geode'
- brief: 'Apache Geode'
+ value: "geode"
+ brief: "Apache Geode"
stability: experimental
- id: h2
- value: 'h2'
- brief: 'H2'
+ value: "h2"
+ brief: "H2"
stability: experimental
- id: hanadb
- value: 'hanadb'
- brief: 'SAP HANA'
+ value: "hanadb"
+ brief: "SAP HANA"
stability: experimental
- id: hbase
- value: 'hbase'
- brief: 'Apache HBase'
+ value: "hbase"
+ brief: "Apache HBase"
stability: experimental
- id: hive
- value: 'hive'
- brief: 'Apache Hive'
+ value: "hive"
+ brief: "Apache Hive"
stability: experimental
- id: hsqldb
- value: 'hsqldb'
- brief: 'HyperSQL DataBase'
+ value: "hsqldb"
+ brief: "HyperSQL DataBase"
stability: experimental
- id: influxdb
- value: 'influxdb'
- brief: 'InfluxDB'
+ value: "influxdb"
+ brief: "InfluxDB"
stability: experimental
- id: informix
- value: 'informix'
- brief: 'Informix'
+ value: "informix"
+ brief: "Informix"
stability: experimental
- id: ingres
- value: 'ingres'
- brief: 'Ingres'
+ value: "ingres"
+ brief: "Ingres"
stability: experimental
- id: instantdb
- value: 'instantdb'
- brief: 'InstantDB'
+ value: "instantdb"
+ brief: "InstantDB"
stability: experimental
- id: interbase
- value: 'interbase'
- brief: 'InterBase'
+ value: "interbase"
+ brief: "InterBase"
stability: experimental
- id: mariadb
- value: 'mariadb'
- brief: 'MariaDB'
+ value: "mariadb"
+ brief: "MariaDB"
stability: experimental
- id: maxdb
- value: 'maxdb'
- brief: 'SAP MaxDB'
+ value: "maxdb"
+ brief: "SAP MaxDB"
stability: experimental
- id: memcached
- value: 'memcached'
- brief: 'Memcached'
+ value: "memcached"
+ brief: "Memcached"
stability: experimental
- id: mongodb
- value: 'mongodb'
- brief: 'MongoDB'
+ value: "mongodb"
+ brief: "MongoDB"
stability: experimental
- id: mssql
- value: 'mssql'
- brief: 'Microsoft SQL Server'
+ value: "mssql"
+ brief: "Microsoft SQL Server"
stability: experimental
- id: mssqlcompact
- value: 'mssqlcompact'
+ value: "mssqlcompact"
deprecated: "Removed, use `other_sql` instead."
brief: "Deprecated, Microsoft SQL Server Compact is discontinued."
stability: experimental
- id: mysql
- value: 'mysql'
- brief: 'MySQL'
+ value: "mysql"
+ brief: "MySQL"
stability: experimental
- id: neo4j
- value: 'neo4j'
- brief: 'Neo4j'
+ value: "neo4j"
+ brief: "Neo4j"
stability: experimental
- id: netezza
- value: 'netezza'
- brief: 'Netezza'
+ value: "netezza"
+ brief: "Netezza"
stability: experimental
- id: opensearch
- value: 'opensearch'
- brief: 'OpenSearch'
+ value: "opensearch"
+ brief: "OpenSearch"
stability: experimental
- id: oracle
- value: 'oracle'
- brief: 'Oracle Database'
+ value: "oracle"
+ brief: "Oracle Database"
stability: experimental
- id: pervasive
- value: 'pervasive'
- brief: 'Pervasive PSQL'
+ value: "pervasive"
+ brief: "Pervasive PSQL"
stability: experimental
- id: pointbase
- value: 'pointbase'
- brief: 'PointBase'
+ value: "pointbase"
+ brief: "PointBase"
stability: experimental
- id: postgresql
- value: 'postgresql'
- brief: 'PostgreSQL'
+ value: "postgresql"
+ brief: "PostgreSQL"
stability: experimental
- id: progress
- value: 'progress'
- brief: 'Progress Database'
+ value: "progress"
+ brief: "Progress Database"
stability: experimental
- id: redis
- value: 'redis'
- brief: 'Redis'
+ value: "redis"
+ brief: "Redis"
stability: experimental
- id: redshift
- value: 'redshift'
- brief: 'Amazon Redshift'
+ value: "redshift"
+ brief: "Amazon Redshift"
stability: experimental
- id: spanner
- value: 'spanner'
- brief: 'Cloud Spanner'
+ value: "spanner"
+ brief: "Cloud Spanner"
stability: experimental
- id: sqlite
- value: 'sqlite'
- brief: 'SQLite'
+ value: "sqlite"
+ brief: "SQLite"
stability: experimental
- id: sybase
- value: 'sybase'
- brief: 'Sybase'
+ value: "sybase"
+ brief: "Sybase"
stability: experimental
- id: teradata
- value: 'teradata'
- brief: 'Teradata'
+ value: "teradata"
+ brief: "Teradata"
stability: experimental
- id: trino
- value: 'trino'
- brief: 'Trino'
+ value: "trino"
+ brief: "Trino"
stability: experimental
- id: vertica
- value: 'vertica'
- brief: 'Vertica'
+ value: "vertica"
+ brief: "Vertica"
stability: experimental
stability: experimental
- id: db.client.connection.state
@@ -328,10 +332,10 @@ groups:
type:
members:
- id: idle
- value: 'idle'
+ value: "idle"
stability: experimental
- id: used
- value: 'used'
+ value: "used"
stability: experimental
brief: "The state of a connection in the pool"
examples: ["idle"]
@@ -358,50 +362,50 @@ groups:
stability: experimental
brief: >
The data center of the coordinating node for a query.
- examples: 'us-west-2'
+ examples: "us-west-2"
- id: db.cassandra.coordinator.id
type: string
stability: experimental
brief: >
The ID of the coordinating node for a query.
- examples: 'be13faa2-8574-4d71-926d-27f16cf8a7af'
+ examples: "be13faa2-8574-4d71-926d-27f16cf8a7af"
- id: db.cassandra.consistency_level
brief: >
The consistency level of the query. Based on consistency values from [CQL](https://docs.datastax.com/en/cassandra-oss/3.0/cassandra/dml/dmlConfigConsistency.html).
type:
members:
- id: all
- value: 'all'
+ value: "all"
stability: experimental
- id: each_quorum
- value: 'each_quorum'
+ value: "each_quorum"
stability: experimental
- id: quorum
- value: 'quorum'
+ value: "quorum"
stability: experimental
- id: local_quorum
- value: 'local_quorum'
+ value: "local_quorum"
stability: experimental
- id: one
- value: 'one'
+ value: "one"
stability: experimental
- id: two
- value: 'two'
+ value: "two"
stability: experimental
- id: three
- value: 'three'
+ value: "three"
stability: experimental
- id: local_one
- value: 'local_one'
+ value: "local_one"
stability: experimental
- id: any
- value: 'any'
+ value: "any"
stability: experimental
- id: serial
- value: 'serial'
+ value: "serial"
stability: experimental
- id: local_serial
- value: 'local_serial'
+ value: "local_serial"
stability: experimental
stability: experimental
- id: db.cassandra.idempotence
@@ -431,16 +435,16 @@ groups:
type: string
stability: experimental
brief: Unique Cosmos client instance id.
- examples: '3ba4827d-4422-483f-b59f-85b74211c11d'
+ examples: "3ba4827d-4422-483f-b59f-85b74211c11d"
- id: db.cosmosdb.connection_mode
type:
members:
- id: gateway
- value: 'gateway'
+ value: "gateway"
brief: Gateway (HTTP) connections mode
stability: experimental
- id: direct
- value: 'direct'
+ value: "direct"
brief: Direct connection.
stability: experimental
stability: experimental
@@ -448,53 +452,53 @@ groups:
- id: db.cosmosdb.operation_type
type:
members:
- - id: invalid
- value: 'Invalid'
+ - id: batch
+ value: "batch"
stability: experimental
- id: create
- value: 'Create'
- stability: experimental
- - id: patch
- value: 'Patch'
- stability: experimental
- - id: read
- value: 'Read'
- stability: experimental
- - id: read_feed
- value: 'ReadFeed'
+ value: "create"
stability: experimental
- id: delete
- value: 'Delete'
- stability: experimental
- - id: replace
- value: 'Replace'
+ value: "delete"
stability: experimental
- id: execute
- value: 'Execute'
+ value: "execute"
stability: experimental
- - id: query
- value: 'Query'
+ - id: execute_javascript
+ value: "execute_javascript"
+ stability: experimental
+ - id: invalid
+ value: "invalid"
stability: experimental
- id: head
- value: 'Head'
+ value: "head"
stability: experimental
- id: head_feed
- value: 'HeadFeed'
+ value: "head_feed"
stability: experimental
- - id: upsert
- value: 'Upsert'
+ - id: patch
+ value: "patch"
stability: experimental
- - id: batch
- value: 'Batch'
+ - id: query
+ value: "query"
stability: experimental
- id: query_plan
- value: 'QueryPlan'
+ value: "query_plan"
stability: experimental
- - id: execute_javascript
- value: 'ExecuteJavaScript'
+ - id: read
+ value: "read"
+ stability: experimental
+ - id: read_feed
+ value: "read_feed"
+ stability: experimental
+ - id: replace
+ value: "replace"
+ stability: experimental
+ - id: upsert
+ value: "upsert"
stability: experimental
stability: experimental
- brief: CosmosDB Operation Type.
+ brief: Cosmos DB Operation Type.
- id: db.cosmosdb.request_charge
type: double
stability: experimental
@@ -593,4 +597,4 @@ groups:
stability: experimental
brief: >
The top-k most similar vectors returned by a query.
- examples: [5]
\ No newline at end of file
+ examples: [5]
diff --git a/model/trace/database.yaml b/model/database/spans.yaml
similarity index 78%
rename from model/trace/database.yaml
rename to model/database/spans.yaml
index 09eb678c03..6e507c7fb6 100644
--- a/model/trace/database.yaml
+++ b/model/database/spans.yaml
@@ -358,10 +358,12 @@ groups:
examples: ['cosmos-netstandard-sdk/3.23.0\|3.23.1\|1\|X64\|Linux 5.4.0-1098-azure 104 18\|.NET Core 3.1.32\|S\|']
- ref: db.cosmosdb.connection_mode
requirement_level:
- conditionally_required: if not `direct` (or pick gw as default)
+ conditionally_required: if not `gateway` (the default value is assumed to be `gateway`).
- ref: db.collection.name
brief: >
Cosmos DB container name.
+ note: >
+ It is RECOMMENDED to capture the value as provided by the application without attempting to do any case normalization.
requirement_level:
conditionally_required: if available
- ref: db.cosmosdb.request_content_length
@@ -379,3 +381,138 @@ groups:
requirement_level:
conditionally_required: If available.
note: "" # overriding the base note
+ - ref: az.namespace
+ note: >
+ When `az.namespace` attribute is populated, it MUST be set to `Microsoft.DocumentDB` for all
+ operations performed by Cosmos DB client.
+ examples: ["Microsoft.DocumentDB"]
+ - ref: db.operation.name
+ note: |
+ The `db.operation.name` has the following list of well-known values.
+ If one of them applies, then the respective value MUST be used.
+
+ Batch operations:
+
+ - `execute_batch`
+
+ Bulk operations:
+
+ - `execute_bulk` SHOULD be used on spans reported for methods like
+ [`executeBulkOperations`](https://javadoc.io/doc/com.azure/azure-cosmos/latest/com/azure/cosmos/CosmosAsyncContainer.html#executeBulkOperations)).
+ which represents a bulk execution of multiple operations.
+ - `bulk_{operation name}` (`bulk_create_item`, `bulk_upsert_item`, etc) SHOULD be used on spans describing individual operations (when they are reported)
+ within the bulk. This pattern SHOULD be used when instrumentation creates span per each operation, but operations are buffered and then performed in bulk.
+ For example, this applies when [`AllowBulkExecution`](https://learn.microsoft.com/dotnet/api/microsoft.azure.cosmos.cosmosclientoptions.allowbulkexecution)
+ property is configured on the `Microsoft.Azure.Cosmos` client.
+
+ Change feed operations:
+
+ - `query_change_feed`
+
+ Conflicts operations:
+
+ - `delete_conflict`
+ - `query_conflicts`
+ - `read_all_conflicts`
+ - `read_conflict`
+
+ Container operations:
+
+ - `create_container`
+ - `create_container_if_not_exists`
+ - `delete_container`
+ - `query_containers`
+ - `read_all_containers`
+ - `read_container`
+ - `read_container_throughput`
+ - `replace_container`
+ - `replace_container_throughput`
+
+ Database operations:
+
+ - `create_database`
+ - `create_database_if_not_exists`
+ - `delete_database`
+ - `query_databases`
+ - `read_all_databases`
+ - `read_database`
+ - `read_database_throughput`
+ - `replace_database_throughput`
+
+ Encryption key operations:
+
+ - `create_client_encryption_key`
+ - `query_client_encryption_keys`
+ - `read_all_client_encryption_keys`
+ - `read_client_encryption_key`
+ - `replace_client_encryption_key`
+
+ Item operations:
+
+ - `create_item`
+ - `delete_all_items_by_partition_key`
+ - `delete_item`
+ - `patch_item`
+ - `query_items`
+ - `read_all_items`
+ - `read_all_items_of_logical_partition`
+ - `read_many_items`
+ - `read_item`
+ - `replace_item`
+ - `upsert_item`
+
+ Permission operations:
+
+ - `create_permission`
+ - `delete_permission`
+ - `query_permissions`
+ - `read_all_permissions`
+ - `read_permission`
+ - `replace_permission`
+ - `upsert_permission`
+
+ Stored procedure operations:
+
+ - `create_stored_procedure`
+ - `delete_stored_procedure`
+ - `execute_stored_procedure`
+ - `query_stored_procedures`
+ - `read_all_stored_procedures`
+ - `read_stored_procedure`
+ - `replace_stored_procedure`
+
+ Trigger operations:
+
+ - `create_trigger`
+ - `delete_trigger`
+ - `query_triggers`
+ - `read_all_triggers`
+ - `read_trigger`
+ - `replace_trigger`
+
+ User operations:
+
+ - `create_user`
+ - `delete_user`
+ - `query_users`
+ - `read_all_users`
+ - `read_user`
+ - `replace_user`
+ - `upsert_user`
+
+ User-defined function operations:
+
+ - `create_user_defined_function`
+ - `delete_user_defined_function`
+ - `query_user_defined_functions`
+ - `read_all_user_defined_functions`
+ - `read_user_defined_function`
+
+ If none of them applies, it's RECOMMENDED to use language-agnostic representation of
+ client method name in snake_case. Instrumentations SHOULD document
+ additional values when introducing new operations.
+
+ examples: ['create_item', 'query_items', 'read_item']
+ - ref: server.port
+ requirement_level:
+ conditionally_required: If not default (443).
diff --git a/model/registry/deprecated/deployment.yaml b/model/deployment/deprecated/registry-deprecated.yaml
similarity index 100%
rename from model/registry/deprecated/deployment.yaml
rename to model/deployment/deprecated/registry-deprecated.yaml
diff --git a/model/registry/deployment.yaml b/model/deployment/registry.yaml
similarity index 89%
rename from model/registry/deployment.yaml
rename to model/deployment/registry.yaml
index a43a5d13a3..38d35300a4 100644
--- a/model/registry/deployment.yaml
+++ b/model/deployment/registry.yaml
@@ -3,20 +3,20 @@ groups:
type: attribute_group
display_name: Deployment Attributes
brief: >
- This document defines attributes for software deployments.
+ This document defines attributes for software deployments.
attributes:
- id: deployment.name
type: string
stability: experimental
brief: >
The name of the deployment.
- examples: ['deploy my app', 'deploy-frontend']
+ examples: ["deploy my app", "deploy-frontend"]
- id: deployment.id
type: string
stability: experimental
brief: >
The id of the deployment.
- examples: ['1208']
+ examples: ["1208"]
- id: deployment.status
type:
members:
@@ -45,4 +45,4 @@ groups:
* `service.name=frontend`, `deployment.environment.name=production`
* `service.name=frontend`, `deployment.environment.name=staging`.
- examples: ['staging', 'production']
+ examples: ["staging", "production"]
diff --git a/model/resource/deployment_environment.yaml b/model/deployment/resources.yaml
similarity index 89%
rename from model/resource/deployment_environment.yaml
rename to model/deployment/resources.yaml
index cd3f2ee518..5e40253d2d 100644
--- a/model/resource/deployment_environment.yaml
+++ b/model/deployment/resources.yaml
@@ -1,6 +1,7 @@
groups:
- id: deployment
type: resource
+ name: deployment
brief: >
The software deployment.
attributes:
diff --git a/model/destination/common.yaml b/model/destination/common.yaml
new file mode 100644
index 0000000000..e45dd4e365
--- /dev/null
+++ b/model/destination/common.yaml
@@ -0,0 +1,8 @@
+groups:
+ - id: destination
+ type: attribute_group
+ brief: >
+ General destination attributes.
+ attributes:
+ - ref: destination.address
+ - ref: destination.port
diff --git a/model/registry/destination.yaml b/model/destination/registry.yaml
similarity index 100%
rename from model/registry/destination.yaml
rename to model/destination/registry.yaml
diff --git a/model/logs/mobile-events.yaml b/model/device/events.yaml
similarity index 100%
rename from model/logs/mobile-events.yaml
rename to model/device/events.yaml
diff --git a/model/registry/device.yaml b/model/device/registry.yaml
similarity index 100%
rename from model/registry/device.yaml
rename to model/device/registry.yaml
diff --git a/model/resource/device.yaml b/model/device/resources.yaml
similarity index 94%
rename from model/resource/device.yaml
rename to model/device/resources.yaml
index 826402119d..45b1cd7a49 100644
--- a/model/resource/device.yaml
+++ b/model/device/resources.yaml
@@ -1,6 +1,7 @@
groups:
- id: device
type: resource
+ name: device
brief: >
The device on which the process represented by this resource is running.
attributes:
diff --git a/model/registry/disk.yaml b/model/disk/registry.yaml
similarity index 100%
rename from model/registry/disk.yaml
rename to model/disk/registry.yaml
diff --git a/model/metrics/dns.yaml b/model/dns/metrics.yaml
similarity index 100%
rename from model/metrics/dns.yaml
rename to model/dns/metrics.yaml
diff --git a/model/registry/dns.yaml b/model/dns/registry.yaml
similarity index 100%
rename from model/registry/dns.yaml
rename to model/dns/registry.yaml
diff --git a/model/dotnet/registry.yaml b/model/dotnet/registry.yaml
new file mode 100644
index 0000000000..2024718f4f
--- /dev/null
+++ b/model/dotnet/registry.yaml
@@ -0,0 +1,33 @@
+groups:
+ - id: registry.dotnet
+ type: attribute_group
+ display_name: .NET Attributes
+ brief: >
+ This document defines .NET related attributes.
+ attributes:
+ - id: dotnet.gc.heap.generation
+ stability: experimental
+ type:
+ members:
+ - id: gen0
+ value: 'gen0'
+ brief: "Generation 0"
+ stability: experimental
+ - id: gen1
+ value: 'gen1'
+ brief: "Generation 1"
+ stability: experimental
+ - id: gen2
+ value: 'gen2'
+ brief: "Generation 2"
+ stability: experimental
+ - id: loh
+ value: 'loh'
+ brief: "Large Object Heap"
+ stability: experimental
+ - id: poh
+ value: 'poh'
+ brief: "Pinned Object Heap"
+ stability: experimental
+ brief: Name of the garbage collector managed heap generation.
+ examples: ["gen0", "gen1", "gen2"]
diff --git a/model/dotnet/runtime-metrics.yaml b/model/dotnet/runtime-metrics.yaml
new file mode 100644
index 0000000000..313ee3b574
--- /dev/null
+++ b/model/dotnet/runtime-metrics.yaml
@@ -0,0 +1,279 @@
+groups:
+ - id: metric.dotnet.process.cpu.count
+ type: metric
+ metric_name: dotnet.process.cpu.count
+ brief: "The number of processors available to the process."
+ note: >
+ Meter name: `System.Runtime`; Added in: .NET 9.0.
+
+ This metric reports the same values as accessing [`Environment.ProcessorCount`](https://learn.microsoft.com/dotnet/api/system.environment.processorcount).
+ instrument: updowncounter
+ unit: "{cpu}"
+ stability: experimental
+
+ - id: metric.dotnet.process.cpu.time
+ type: metric
+ metric_name: dotnet.process.cpu.time
+ brief: "CPU time used by the process."
+ note: >
+ Meter name: `System.Runtime`; Added in: .NET 9.0.
+
+ This metric reports the same values as accessing the corresponding
+ processor time properties on [`System.Diagnostics.Process`](https://learn.microsoft.com/dotnet/api/system.diagnostics.process).
+ instrument: counter
+ unit: "s"
+ stability: experimental
+ attributes:
+ - ref: cpu.mode
+ requirement_level: required
+
+ - id: metric.dotnet.process.memory.working_set
+ type: metric
+ metric_name: dotnet.process.memory.working_set
+ brief: "The number of bytes of physical memory mapped to the process context."
+ note: >
+ Meter name: `System.Runtime`; Added in: .NET 9.0.
+
+ This metric reports the same values as calling [`Environment.WorkingSet`](https://learn.microsoft.com/dotnet/api/system.environment.workingset).
+ instrument: updowncounter
+ unit: "By"
+ stability: experimental
+
+ - id: metric.dotnet.gc.collections
+ type: metric
+ metric_name: dotnet.gc.collections
+ brief: "The number of garbage collections that have occurred since the process has started."
+ note: >
+ Meter name: `System.Runtime`; Added in: .NET 9.0.
+
+ This metric uses the [`GC.CollectionCount(int generation)`](https://learn.microsoft.com/dotnet/api/system.gc.collectioncount)
+ API to calculate exclusive collections per generation.
+ instrument: counter
+ unit: "{collection}"
+ stability: experimental
+ attributes:
+ - ref: dotnet.gc.heap.generation
+ requirement_level: required
+
+ - id: metric.dotnet.gc.heap.total_allocated
+ type: metric
+ metric_name: dotnet.gc.heap.total_allocated
+ brief: >
+ The *approximate* number of bytes allocated on the managed GC heap since the process has
+ started. The returned value does not include any native allocations.
+ note: >
+ Meter name: `System.Runtime`; Added in: .NET 9.0.
+
+ This metric reports the same values as calling [`GC.GetTotalAllocatedBytes()`](https://learn.microsoft.com/dotnet/api/system.gc.gettotalallocatedbytes).
+ instrument: counter
+ unit: "By"
+ stability: experimental
+
+ - id: metric.dotnet.gc.last_collection.memory.committed_size
+ type: metric
+ metric_name: dotnet.gc.last_collection.memory.committed_size
+ brief: >
+ The amount of committed virtual memory in use by the .NET GC, as
+ observed during the latest garbage collection.
+ note: >
+ Meter name: `System.Runtime`; Added in: .NET 9.0.
+
+ This metric reports the same values as calling
+ [`GC.GetGCMemoryInfo().TotalCommittedBytes`](https://learn.microsoft.com/dotnet/api/system.gcmemoryinfo.totalcommittedbytes).
+ Committed virtual memory may be larger than the heap size because it
+ includes both memory for storing existing objects (the heap size) and some
+ extra memory that is ready to handle newly allocated objects in the
+ future.
+ instrument: updowncounter
+ unit: "By"
+ stability: experimental
+
+ - id: metric.dotnet.gc.last_collection.heap.size
+ type: metric
+ metric_name: dotnet.gc.last_collection.heap.size
+ brief: >
+ The managed GC heap size (including fragmentation), as observed during the
+ latest garbage collection.
+ note: >
+ Meter name: `System.Runtime`; Added in: .NET 9.0.
+
+ This metric reports the same values as calling
+ [`GC.GetGCMemoryInfo().GenerationInfo.SizeAfterBytes`](https://learn.microsoft.com/dotnet/api/system.gcgenerationinfo.sizeafterbytes).
+ instrument: updowncounter
+ unit: "By"
+ stability: experimental
+ attributes:
+ - ref: dotnet.gc.heap.generation
+ requirement_level: required
+
+ - id: metric.dotnet.gc.last_collection.heap.fragmentation.size
+ type: metric
+ metric_name: dotnet.gc.last_collection.heap.fragmentation.size
+ brief: >
+ The heap fragmentation, as observed during the latest garbage collection.
+ note: >
+ Meter name: `System.Runtime`; Added in: .NET 9.0.
+
+ This metric reports the same values as calling
+ [`GC.GetGCMemoryInfo().GenerationInfo.FragmentationAfterBytes`](https://learn.microsoft.com/dotnet/api/system.gcgenerationinfo.fragmentationafterbytes).
+ instrument: updowncounter
+ unit: "By"
+ stability: experimental
+ attributes:
+ - ref: dotnet.gc.heap.generation
+ requirement_level: required
+
+ - id: metric.dotnet.gc.pause.time
+ type: metric
+ metric_name: dotnet.gc.pause.time
+ brief: "The total amount of time paused in GC since the process has started."
+ note: >
+ Meter name: `System.Runtime`; Added in: .NET 9.0.
+
+ This metric reports the same values as calling [`GC.GetTotalPauseDuration()`](https://learn.microsoft.com/dotnet/api/system.gc.gettotalpauseduration).
+ instrument: counter
+ unit: "s"
+ stability: experimental
+
+ - id: metric.dotnet.jit.compiled_il.size
+ type: metric
+ metric_name: dotnet.jit.compiled_il.size
+ brief: "Count of bytes of intermediate language that have been compiled since the process has started."
+ note: >
+ Meter name: `System.Runtime`; Added in: .NET 9.0.
+
+ This metric reports the same values as calling
+ [`JitInfo.GetCompiledILBytes()`](https://learn.microsoft.com/dotnet/api/system.runtime.jitinfo.getcompiledilbytes).
+ instrument: counter
+ unit: "By"
+ stability: experimental
+
+ - id: metric.dotnet.jit.compiled_methods
+ type: metric
+ metric_name: dotnet.jit.compiled_methods
+ brief: >
+ The number of times the JIT compiler (re)compiled methods since the
+ process has started.
+ note: >
+ Meter name: `System.Runtime`; Added in: .NET 9.0.
+
+ This metric reports the same values as calling
+ [`JitInfo.GetCompiledMethodCount()`](https://learn.microsoft.com/dotnet/api/system.runtime.jitinfo.getcompiledmethodcount).
+ instrument: counter
+ unit: "{method}"
+ stability: experimental
+
+ - id: metric.dotnet.jit.compilation.time
+ type: metric
+ metric_name: dotnet.jit.compilation.time
+ brief: >
+ The amount of time the JIT compiler has spent compiling methods since the
+ process has started.
+ note: >
+ Meter name: `System.Runtime`; Added in: .NET 9.0.
+
+ This metric reports the same values as calling
+ [`JitInfo.GetCompilationTime()`](https://learn.microsoft.com/dotnet/api/system.runtime.jitinfo.getcompilationtime).
+ instrument: counter
+ unit: "s"
+ stability: experimental
+
+ - id: metric.dotnet.monitor.lock_contentions
+ type: metric
+ metric_name: dotnet.monitor.lock_contentions
+ brief: >
+ The number of times there was contention when trying to acquire a monitor
+ lock since the process has started.
+ note: >
+ Meter name: `System.Runtime`; Added in: .NET 9.0.
+
+ This metric reports the same values as calling
+ [`Monitor.LockContentionCount`](https://learn.microsoft.com/dotnet/api/system.threading.monitor.lockcontentioncount).
+ instrument: counter
+ unit: "{contention}"
+ stability: experimental
+
+ - id: metric.dotnet.thread_pool.thread.count
+ type: metric
+ metric_name: dotnet.thread_pool.thread.count
+ brief: "The number of thread pool threads that currently exist."
+ note: >
+ Meter name: `System.Runtime`; Added in: .NET 9.0.
+
+ This metric reports the same values as calling [`ThreadPool.ThreadCount`](https://learn.microsoft.com/dotnet/api/system.threading.threadpool.threadcount).
+ instrument: updowncounter
+ unit: "{thread}"
+ stability: experimental
+
+ - id: metric.dotnet.thread_pool.work_item.count
+ type: metric
+ metric_name: dotnet.thread_pool.work_item.count
+ brief: >
+ The number of work items that the thread pool has completed since
+ the process has started.
+ note: >
+ Meter name: `System.Runtime`; Added in: .NET 9.0.
+
+ This metric reports the same values as calling
+ [`ThreadPool.CompletedWorkItemCount`](https://learn.microsoft.com/dotnet/api/system.threading.threadpool.completedworkitemcount).
+ instrument: counter
+ unit: "{work_item}"
+ stability: experimental
+
+ - id: metric.dotnet.thread_pool.queue.length
+ type: metric
+ metric_name: dotnet.thread_pool.queue.length
+ brief: >
+ The number of work items that are currently queued to be processed by the
+ thread pool.
+ note: >
+ Meter name: `System.Runtime`; Added in: .NET 9.0.
+
+ This metric reports the same values as calling
+ [`ThreadPool.PendingWorkItemCount`](https://learn.microsoft.com/dotnet/api/system.threading.threadpool.pendingworkitemcount).
+ instrument: updowncounter
+ unit: "{work_item}"
+ stability: experimental
+
+ - id: metric.dotnet.timer.count
+ type: metric
+ metric_name: dotnet.timer.count
+ brief: "The number of timer instances that are currently active."
+ note: >
+ Meter name: `System.Runtime`; Added in: .NET 9.0.
+
+ This metric reports the same values as calling [`Timer.ActiveCount`](https://learn.microsoft.com/dotnet/api/system.threading.timer.activecount).
+ instrument: updowncounter
+ unit: "{timer}"
+ stability: experimental
+
+ - id: metric.dotnet.assembly.count
+ type: metric
+ metric_name: dotnet.assembly.count
+ brief: "The number of .NET assemblies that are currently loaded."
+ note: >
+ Meter name: `System.Runtime`; Added in: .NET 9.0.
+
+ This metric reports the same values as calling
+ [`AppDomain.CurrentDomain.GetAssemblies().Length`](https://learn.microsoft.com/dotnet/api/system.appdomain.getassemblies).
+ instrument: updowncounter
+ unit: "{assembly}"
+ stability: experimental
+
+ - id: metric.dotnet.exceptions
+ type: metric
+ metric_name: dotnet.exceptions
+ brief: "The number of exceptions that have been thrown in managed code."
+ note: >
+ Meter name: `System.Runtime`; Added in: .NET 9.0.
+
+ This metric reports the same values as counting calls to
+ [`AppDomain.CurrentDomain.FirstChanceException`](https://learn.microsoft.com/dotnet/api/system.appdomain.firstchanceexception).
+ instrument: counter
+ unit: "{exception}"
+ stability: experimental
+ attributes:
+ - ref: error.type
+ note: ""
+ examples: ['System.OperationCanceledException', 'Contoso.MyException']
+ requirement_level: required
diff --git a/model/enduser/deprecated/common.yaml b/model/enduser/deprecated/common.yaml
new file mode 100644
index 0000000000..e17dde1bec
--- /dev/null
+++ b/model/enduser/deprecated/common.yaml
@@ -0,0 +1,12 @@
+groups:
+ - id: identity
+ type: attribute_group
+ brief: >
+ These attributes may be used for any operation with an authenticated and/or authorized enduser.
+ attributes:
+ - ref: enduser.id
+ requirement_level: recommended
+ - ref: enduser.role
+ requirement_level: recommended
+ - ref: enduser.scope
+ requirement_level: recommended
diff --git a/model/registry/deprecated/enduser.yaml b/model/enduser/deprecated/registry-deprecated.yaml
similarity index 100%
rename from model/registry/deprecated/enduser.yaml
rename to model/enduser/deprecated/registry-deprecated.yaml
diff --git a/model/registry/error.yaml b/model/error/registry.yaml
similarity index 100%
rename from model/registry/error.yaml
rename to model/error/registry.yaml
diff --git a/model/logs/events.yaml b/model/event/common.yaml
similarity index 100%
rename from model/logs/events.yaml
rename to model/event/common.yaml
diff --git a/model/registry/event.yaml b/model/event/registry.yaml
similarity index 90%
rename from model/registry/event.yaml
rename to model/event/registry.yaml
index 7fdfe7feea..c8c540e052 100644
--- a/model/registry/event.yaml
+++ b/model/event/registry.yaml
@@ -15,4 +15,4 @@ groups:
Notably, event names are namespaced to avoid collisions and provide a clean
separation of semantics for events in separate domains like browser, mobile, and
kubernetes.
- examples: ['browser.mouse.click', 'device.app.lifecycle']
+ examples: ["browser.mouse.click", "device.app.lifecycle"]
diff --git a/model/trace/trace-exception.yaml b/model/exceptions/events.yaml
similarity index 100%
rename from model/trace/trace-exception.yaml
rename to model/exceptions/events.yaml
diff --git a/model/logs/log-exception.yaml b/model/exceptions/logs.yaml
similarity index 100%
rename from model/logs/log-exception.yaml
rename to model/exceptions/logs.yaml
diff --git a/model/registry/exception.yaml b/model/exceptions/registry.yaml
similarity index 85%
rename from model/registry/exception.yaml
rename to model/exceptions/registry.yaml
index 63897ae5d2..1ebc90d854 100644
--- a/model/registry/exception.yaml
+++ b/model/exceptions/registry.yaml
@@ -18,17 +18,19 @@ groups:
type: string
stability: stable
brief: The exception message.
- examples: ["Division by zero", "Can't convert 'int' object to str implicitly"]
+ examples:
+ ["Division by zero", "Can't convert 'int' object to str implicitly"]
- id: exception.stacktrace
type: string
stability: stable
brief: >
A stacktrace as a string in the natural representation for the language runtime.
The representation is to be determined and documented by each language SIG.
- examples: 'Exception in thread "main" java.lang.RuntimeException: Test exception\n
- at com.example.GenerateTrace.methodB(GenerateTrace.java:13)\n
- at com.example.GenerateTrace.methodA(GenerateTrace.java:9)\n
- at com.example.GenerateTrace.main(GenerateTrace.java:5)'
+ examples: >
+ Exception in thread "main" java.lang.RuntimeException: Test exception\n
+ at com.example.GenerateTrace.methodB(GenerateTrace.java:13)\n
+ at com.example.GenerateTrace.methodA(GenerateTrace.java:9)\n
+ at com.example.GenerateTrace.main(GenerateTrace.java:5)
- id: exception.escaped
type: boolean
stability: stable
diff --git a/model/faas-common.yaml b/model/faas/common.yaml
similarity index 100%
rename from model/faas-common.yaml
rename to model/faas/common.yaml
diff --git a/model/metrics/faas-metrics.yaml b/model/faas/metrics.yaml
similarity index 100%
rename from model/metrics/faas-metrics.yaml
rename to model/faas/metrics.yaml
diff --git a/model/registry/faas.yaml b/model/faas/registry.yaml
similarity index 100%
rename from model/registry/faas.yaml
rename to model/faas/registry.yaml
diff --git a/model/resource/faas.yaml b/model/faas/resources.yaml
similarity index 94%
rename from model/resource/faas.yaml
rename to model/faas/resources.yaml
index c794866b6c..5f9325ebb1 100644
--- a/model/resource/faas.yaml
+++ b/model/faas/resources.yaml
@@ -1,6 +1,7 @@
groups:
- id: faas_resource
type: resource
+ name: faas
brief: >
A serverless instance.
attributes:
diff --git a/model/trace/faas.yaml b/model/faas/spans.yaml
similarity index 84%
rename from model/trace/faas.yaml
rename to model/faas/spans.yaml
index e2db4e14df..2531347bff 100644
--- a/model/trace/faas.yaml
+++ b/model/faas/spans.yaml
@@ -2,9 +2,9 @@ groups:
- id: faas_span
type: span
brief: >
- This semantic convention describes an instance of a function that
- runs without provisioning or managing of servers (also known as
- serverless functions or Function as a Service (FaaS)) with spans.
+ This semantic convention describes an instance of a function that
+ runs without provisioning or managing of servers (also known as
+ serverless functions or Function as a Service (FaaS)) with spans.
attributes:
- ref: faas.trigger
note: |
@@ -33,18 +33,6 @@ groups:
- ref: faas.document.time
- ref: faas.document.name
- - id: faas_span.http
- type: span
- brief: >
- Semantic Convention for FaaS triggered as a response to some data
- source operation such as a database or filesystem read/write.
-
- - id: faas_span.pubsub
- type: span
- brief: >
- Semantic Convention for FaaS set to be executed when messages are
- sent to a messaging system.
-
- id: faas_span.timer
type: span
brief: >
diff --git a/model/trace/feature-flag.yaml b/model/feature-flag/events.yaml
similarity index 100%
rename from model/trace/feature-flag.yaml
rename to model/feature-flag/events.yaml
diff --git a/model/logs/log-feature_flag.yaml b/model/feature-flag/logs.yaml
similarity index 100%
rename from model/logs/log-feature_flag.yaml
rename to model/feature-flag/logs.yaml
diff --git a/model/registry/feature-flag.yaml b/model/feature-flag/registry.yaml
similarity index 100%
rename from model/registry/feature-flag.yaml
rename to model/feature-flag/registry.yaml
diff --git a/model/file/registry.yaml b/model/file/registry.yaml
new file mode 100644
index 0000000000..49049cdd6c
--- /dev/null
+++ b/model/file/registry.yaml
@@ -0,0 +1,138 @@
+groups:
+ - id: registry.file
+ type: attribute_group
+ display_name: File Attributes
+ brief: "Describes file attributes."
+ attributes:
+ - id: file.accessed
+ type: string
+ brief: >
+ Time when the file was last accessed, in ISO 8601 format.
+ note: >
+ This attribute might not be supported by some file systems — NFS, FAT32, in embedded OS, etc.
+ stability: experimental
+ examples: ['2021-01-01T12:00:00Z']
+ - id: file.attributes
+ type: string[]
+ brief: >
+ Array of file attributes.
+ note: >
+ Attributes names depend on the OS or file system. Here’s a non-exhaustive list of values expected for this
+ attribute: `archive`, `compressed`, `directory`, `encrypted`, `execute`, `hidden`, `immutable`, `journaled`, `read`, `readonly`, `symbolic link`, `system`, `temporary`, `write`.
+ stability: experimental
+ examples: ['readonly', 'hidden']
+ - id: file.created
+ type: string
+ brief: >
+ Time when the file was created, in ISO 8601 format.
+ note: >
+ This attribute might not be supported by some file systems — NFS, FAT32, in embedded OS, etc.
+ stability: experimental
+ examples: ['2021-01-01T12:00:00Z']
+ - id: file.changed
+ type: string
+ brief: >
+ Time when the file attributes or metadata was last changed, in ISO 8601 format.
+ note: >
+ `file.changed` captures the time when any of the file's properties or attributes
+ (including the content) are changed, while `file.modified` captures the timestamp
+ when the file content is modified.
+ stability: experimental
+ examples: ['2021-01-01T12:00:00Z']
+ - id: file.directory
+ type: string
+ brief: >
+ Directory where the file is located. It should include the drive letter, when appropriate.
+ stability: experimental
+ examples: ['/home/user', 'C:\Program Files\MyApp']
+ - id: file.extension
+ type: string
+ brief: >
+ File extension, excluding the leading dot.
+ stability: experimental
+ examples: ['png', 'gz']
+ note: >
+ When the file name has multiple extensions (example.tar.gz), only the last one should
+ be captured ("gz", not "tar.gz").
+ - id: file.fork_name
+ type: string
+ brief: >
+ Name of the fork. A fork is additional data associated with a filesystem object.
+ note: >
+ On Linux, a resource fork is used to store additional data with a filesystem object. A file always has at
+ least one fork for the data portion, and additional forks may exist.
+
+ On NTFS, this is analogous to an Alternate Data Stream (ADS), and the default data stream for a file is
+ just called $DATA. Zone.Identifier is commonly used by Windows to track contents downloaded from the Internet.
+ An ADS is typically of the form: C:\path\to\filename.extension:some_fork_name, and some_fork_name is the
+ value that should populate `fork_name`. `filename.extension` should populate `file.name`, and `extension`
+ should populate `file.extension`. The full path, `file.path`, will include the fork name.
+ stability: experimental
+ examples: ['Zone.Identifer']
+ - id: file.group.id
+ type: string
+ brief: >
+ Primary Group ID (GID) of the file.
+ stability: experimental
+ examples: ["1000"]
+ - id: file.group.name
+ type: string
+ brief: >
+ Primary group name of the file.
+ stability: experimental
+ examples: ['users']
+ - id: file.inode
+ type: string
+ brief: >
+ Inode representing the file in the filesystem.
+ stability: experimental
+ examples: ['256383']
+ - id: file.mode
+ type: string
+ brief: >
+ Mode of the file in octal representation.
+ stability: experimental
+ examples: ['0640']
+ - id: file.modified
+ type: string
+ brief: >
+ Time when the file content was last modified, in ISO 8601 format.
+ stability: experimental
+ examples: ['2021-01-01T12:00:00Z']
+ - id: file.name
+ type: string
+ brief: >
+ Name of the file including the extension, without the directory.
+ stability: experimental
+ examples: ['example.png']
+ - id: file.owner.id
+ type: string
+ brief: >
+ The user ID (UID) or security identifier (SID) of the file owner.
+ stability: experimental
+ examples: ["1000"]
+ - id: file.owner.name
+ type: string
+ brief: >
+ Username of the file owner.
+ stability: experimental
+ examples: ['root']
+ - id: file.path
+ type: string
+ brief: >
+ Full path to the file, including the file name. It should include the drive letter, when appropriate.
+ stability: experimental
+ examples: ['/home/alice/example.png', 'C:\Program Files\MyApp\myapp.exe']
+ - id: file.size
+ type: int
+ brief: >
+ File size in bytes.
+ stability: experimental
+ - id: file.symbolic_link.target_path
+ type: string
+ brief: >
+ Path to the target of a symbolic link.
+ note: >
+ This attribute is only applicable to symbolic links.
+ stability: experimental
+ examples: ['/usr/bin/python3']
diff --git a/model/resource/cloud_provider/gcp/cloud_run.yaml b/model/gcp/cloud-run-resources.yaml
similarity index 92%
rename from model/resource/cloud_provider/gcp/cloud_run.yaml
rename to model/gcp/cloud-run-resources.yaml
index 3f05837747..0fe12bf28d 100644
--- a/model/resource/cloud_provider/gcp/cloud_run.yaml
+++ b/model/gcp/cloud-run-resources.yaml
@@ -1,6 +1,7 @@
groups:
- id: gcp.cloud_run
type: resource
+ name: gcp.cloud_run
brief: >
Resource used by Google Cloud Run.
attributes:
diff --git a/model/trace/instrumentation/gcp-client.yml b/model/gcp/common.yml
similarity index 100%
rename from model/trace/instrumentation/gcp-client.yml
rename to model/gcp/common.yml
diff --git a/model/resource/cloud_provider/gcp/gce.yaml b/model/gcp/gce-resources.yaml
similarity index 93%
rename from model/resource/cloud_provider/gcp/gce.yaml
rename to model/gcp/gce-resources.yaml
index d29684b2a3..05cb24e21c 100644
--- a/model/resource/cloud_provider/gcp/gce.yaml
+++ b/model/gcp/gce-resources.yaml
@@ -1,6 +1,7 @@
groups:
- id: gcp.gce
type: resource
+ name: gcp.gce
brief: >
Resources used by Google Compute Engine (GCE).
attributes:
diff --git a/model/registry/gcp.yaml b/model/gcp/registry.yaml
similarity index 100%
rename from model/registry/gcp.yaml
rename to model/gcp/registry.yaml
diff --git a/model/registry/deprecated/gen-ai.yaml b/model/gen-ai/deprecated/registry-deprecated.yaml
similarity index 100%
rename from model/registry/deprecated/gen-ai.yaml
rename to model/gen-ai/deprecated/registry-deprecated.yaml
diff --git a/model/metrics/gen-ai.yaml b/model/gen-ai/metrics.yaml
similarity index 100%
rename from model/metrics/gen-ai.yaml
rename to model/gen-ai/metrics.yaml
diff --git a/model/registry/gen-ai.yaml b/model/gen-ai/registry.yaml
similarity index 100%
rename from model/registry/gen-ai.yaml
rename to model/gen-ai/registry.yaml
diff --git a/model/trace/gen-ai.yaml b/model/gen-ai/spans.yaml
similarity index 100%
rename from model/trace/gen-ai.yaml
rename to model/gen-ai/spans.yaml
diff --git a/model/general.yaml b/model/general.yaml
deleted file mode 100644
index 85377316e1..0000000000
--- a/model/general.yaml
+++ /dev/null
@@ -1,65 +0,0 @@
-groups:
- - id: client
- type: attribute_group
- brief: >
- General client attributes.
- attributes:
- - ref: client.address
- - ref: client.port
- - id: server
- type: attribute_group
- brief: >
- General server attributes.
- attributes:
- - ref: server.address
- - ref: server.port
- - id: source
- type: attribute_group
- brief: >
- General source attributes.
- attributes:
- - ref: source.address
- - ref: source.port
- - id: destination
- type: attribute_group
- brief: >
- General destination attributes.
- attributes:
- - ref: destination.address
- - ref: destination.port
- - id: peer
- type: span
- brief: "Operations that access some remote service."
- attributes:
- - ref: peer.service
- requirement_level: recommended
- - id: identity
- type: span
- brief: >
- These attributes may be used for any operation with an authenticated and/or authorized enduser.
- attributes:
- - ref: enduser.id
- requirement_level: recommended
- - ref: enduser.role
- requirement_level: recommended
- - ref: enduser.scope
- requirement_level: recommended
- - id: thread
- type: span
- brief: >
- These attributes may be used for any operation to store information about a thread that started a span.
- attributes:
- - ref: thread.id
- - ref: thread.name
- - id: code
- type: span
- brief: >
- These attributes allow to report this unit of code and therefore to provide more context about the span.
- attributes:
- - ref: code.function
- - ref: code.namespace
- - ref: code.filepath
- - ref: code.lineno
- - ref: code.column
- - ref: code.stacktrace
- requirement_level: opt_in
diff --git a/model/metrics/go-metrics.yaml b/model/go/metrics.yaml
similarity index 100%
rename from model/metrics/go-metrics.yaml
rename to model/go/metrics.yaml
diff --git a/model/registry/go.yaml b/model/go/registry.yaml
similarity index 100%
rename from model/registry/go.yaml
rename to model/go/registry.yaml
diff --git a/model/registry/graphql.yaml b/model/graphql/registry.yaml
similarity index 100%
rename from model/registry/graphql.yaml
rename to model/graphql/registry.yaml
diff --git a/model/trace/instrumentation/graphql.yml b/model/graphql/spans.yml
similarity index 100%
rename from model/trace/instrumentation/graphql.yml
rename to model/graphql/spans.yml
diff --git a/model/metrics/hardware/common.yaml b/model/hardware/common-metrics.yaml
similarity index 100%
rename from model/metrics/hardware/common.yaml
rename to model/hardware/common-metrics.yaml
diff --git a/model/hardware-common.yaml b/model/hardware/common.yaml
similarity index 100%
rename from model/hardware-common.yaml
rename to model/hardware/common.yaml
diff --git a/model/registry/hardware.yaml b/model/hardware/registry.yaml
similarity index 100%
rename from model/registry/hardware.yaml
rename to model/hardware/registry.yaml
diff --git a/model/registry/heroku.yaml b/model/heroku/registry.yaml
similarity index 100%
rename from model/registry/heroku.yaml
rename to model/heroku/registry.yaml
diff --git a/model/resource/cloud_provider/heroku.yaml b/model/heroku/resources.yaml
similarity index 94%
rename from model/resource/cloud_provider/heroku.yaml
rename to model/heroku/resources.yaml
index f609f473e4..cf2e66c233 100644
--- a/model/resource/cloud_provider/heroku.yaml
+++ b/model/heroku/resources.yaml
@@ -1,6 +1,7 @@
groups:
- id: heroku
type: resource
+ name: heroku
brief: >
Heroku dyno metadata
attributes:
diff --git a/model/registry/host.yaml b/model/host/registry.yaml
similarity index 100%
rename from model/registry/host.yaml
rename to model/host/registry.yaml
diff --git a/model/host/resources.yaml b/model/host/resources.yaml
new file mode 100644
index 0000000000..2954172cd9
--- /dev/null
+++ b/model/host/resources.yaml
@@ -0,0 +1,63 @@
+groups:
+ - id: host
+ type: resource
+ name: host
+ brief: >
+ A host is defined as a computing instance. For example, physical servers, virtual machines, switches or disk array.
+ attributes:
+ - ref: host.id
+ note: |
+ Collecting `host.id` from non-containerized systems
+
+ **Non-privileged Machine ID Lookup**
+
+ When collecting `host.id` for non-containerized systems non-privileged lookups
+ of the machine id are preferred. SDK detector implementations MUST use the
+ sources listed below to obtain the machine id.
+
+ | OS | Primary | Fallback |
+ |---------|---------|---------|
+ | Linux | contents of `/etc/machine-id` | contents of `/var/lib/dbus/machine-id` |
+ | BSD | contents of `/etc/hostid` | output of `kenv -q smbios.system.uuid` |
+ | MacOS | `IOPlatformUUID` line from the output of `ioreg -rd1 -c "IOPlatformExpertDevice"` | - |
+ | Windows | `MachineGuid` from registry `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography` | - |
+
+ **Privileged Machine ID Lookup**
+
+ The `host.id` can be looked up using privileged sources. For example, Linux
+ systems can use the output of `dmidecode -t system`, `dmidecode -t baseboard`,
+ `dmidecode -t chassis`, or read the corresponding data from the filesystem
+ (e.g. `cat /sys/devices/virtual/dmi/id/product_id`,
+ `cat /sys/devices/virtual/dmi/id/product_uuid`, etc), however, SDK resource
+ detector implementations MUST not collect `host.id` from privileged sources. If
+ privileged lookup of `host.id` is required, the value should be injected via the
+ `OTEL_RESOURCE_ATTRIBUTES` environment variable.
+ - ref: host.name
+ - ref: host.type
+ - ref: host.arch
+ - ref: host.image.name
+ - ref: host.image.id
+ - ref: host.image.version
+ - ref: host.ip
+ requirement_level: opt_in
+ - ref: host.mac
+ requirement_level: opt_in
+
+ - id: host.cpu
+ type: resource
+ name: host.cpu
+ brief: >
+ A host's CPU information
+ attributes:
+ - ref: host.cpu.vendor.id
+ requirement_level: opt_in
+ - ref: host.cpu.family
+ requirement_level: opt_in
+ - ref: host.cpu.model.id
+ requirement_level: opt_in
+ - ref: host.cpu.model.name
+ requirement_level: opt_in
+ - ref: host.cpu.stepping
+ requirement_level: opt_in
+ - ref: host.cpu.cache.l2.size
+ requirement_level: opt_in
diff --git a/model/http-common.yaml b/model/http/common.yaml
similarity index 100%
rename from model/http-common.yaml
rename to model/http/common.yaml
diff --git a/model/registry/deprecated/http.yaml b/model/http/deprecated/registry-deprecated.yaml
similarity index 100%
rename from model/registry/deprecated/http.yaml
rename to model/http/deprecated/registry-deprecated.yaml
diff --git a/model/metrics/http.yaml b/model/http/metrics.yaml
similarity index 100%
rename from model/metrics/http.yaml
rename to model/http/metrics.yaml
diff --git a/model/registry/http.yaml b/model/http/registry.yaml
similarity index 100%
rename from model/registry/http.yaml
rename to model/http/registry.yaml
diff --git a/model/trace/http.yaml b/model/http/spans.yaml
similarity index 100%
rename from model/trace/http.yaml
rename to model/http/spans.yaml
diff --git a/model/registry/deprecated/ios.yaml b/model/ios/deprecated/registry-deprecated.yaml
similarity index 100%
rename from model/registry/deprecated/ios.yaml
rename to model/ios/deprecated/registry-deprecated.yaml
diff --git a/model/metrics/deprecated/jvm-metrics.yaml b/model/jvm/deprecated/metrics-deprecated.yaml
similarity index 100%
rename from model/metrics/deprecated/jvm-metrics.yaml
rename to model/jvm/deprecated/metrics-deprecated.yaml
diff --git a/model/metrics/jvm-metrics-experimental.yaml b/model/jvm/metrics-experimental.yaml
similarity index 100%
rename from model/metrics/jvm-metrics-experimental.yaml
rename to model/jvm/metrics-experimental.yaml
diff --git a/model/metrics/jvm-metrics.yaml b/model/jvm/metrics.yaml
similarity index 100%
rename from model/metrics/jvm-metrics.yaml
rename to model/jvm/metrics.yaml
diff --git a/model/registry/jvm.yaml b/model/jvm/registry.yaml
similarity index 100%
rename from model/registry/jvm.yaml
rename to model/jvm/registry.yaml
diff --git a/model/registry/deprecated/k8s.yaml b/model/k8s/deprecated/registry-deprecated.yaml
similarity index 100%
rename from model/registry/deprecated/k8s.yaml
rename to model/k8s/deprecated/registry-deprecated.yaml
diff --git a/model/metrics/k8s.yaml b/model/k8s/metrics.yaml
similarity index 70%
rename from model/metrics/k8s.yaml
rename to model/k8s/metrics.yaml
index b11a6f68d4..a09cfee780 100644
--- a/model/metrics/k8s.yaml
+++ b/model/k8s/metrics.yaml
@@ -19,6 +19,17 @@ groups:
instrument: gauge
unit: "{cpu}"
+ # k8s.pod.memory.* metrics
+ - id: metric.k8s.pod.memory.usage
+ type: metric
+ metric_name: k8s.pod.memory.usage
+ stability: experimental
+ brief: "Memory usage of the Pod"
+ note: >
+ Total memory usage of the Pod
+ instrument: gauge
+ unit: "By"
+
# k8s.node.cpu.* metrics
- id: metric.k8s.node.cpu.time
type: metric
@@ -38,3 +49,14 @@ groups:
CPU usage of the specific Node on all available CPU cores, averaged over the sample window
instrument: gauge
unit: "{cpu}"
+
+ # k8s.node.memory.* metrics
+ - id: metric.k8s.node.memory.usage
+ type: metric
+ metric_name: k8s.node.memory.usage
+ stability: experimental
+ brief: "Memory usage of the Node"
+ note: >
+ Total memory usage of the Node
+ instrument: gauge
+ unit: "By"
diff --git a/model/registry/k8s.yaml b/model/k8s/registry.yaml
similarity index 100%
rename from model/registry/k8s.yaml
rename to model/k8s/registry.yaml
diff --git a/model/resource/k8s.yaml b/model/k8s/resources.yaml
similarity index 89%
rename from model/resource/k8s.yaml
rename to model/k8s/resources.yaml
index 46522ca7d9..50d2e8c254 100644
--- a/model/resource/k8s.yaml
+++ b/model/k8s/resources.yaml
@@ -1,6 +1,7 @@
groups:
- id: k8s.cluster
type: resource
+ name: k8s.cluster
brief: >
A Kubernetes Cluster.
attributes:
@@ -9,6 +10,7 @@ groups:
- id: k8s.node
type: resource
+ name: k8s.node
brief: >
A Kubernetes Node object.
attributes:
@@ -17,6 +19,7 @@ groups:
- id: k8s.namespace
type: resource
+ name: k8s.namespace
brief: >
A Kubernetes Namespace.
attributes:
@@ -24,6 +27,7 @@ groups:
- id: k8s.pod
type: resource
+ name: k8s.pod
brief: >
A Kubernetes Pod object.
attributes:
@@ -35,6 +39,7 @@ groups:
- id: k8s.container
type: resource
+ name: k8s.container
brief: >
A container in a [PodTemplate](https://kubernetes.io/docs/concepts/workloads/pods/#pod-templates).
attributes:
@@ -44,6 +49,7 @@ groups:
- id: k8s.replicaset
type: resource
+ name: k8s.replicaset
brief: >
A Kubernetes ReplicaSet object.
attributes:
@@ -52,6 +58,7 @@ groups:
- id: k8s.deployment
type: resource
+ name: k8s.deployment
brief: >
A Kubernetes Deployment object.
attributes:
@@ -60,6 +67,7 @@ groups:
- id: k8s.statefulset
type: resource
+ name: k8s.statefulset
brief: >
A Kubernetes StatefulSet object.
attributes:
@@ -68,6 +76,7 @@ groups:
- id: k8s.daemonset
type: resource
+ name: k8s.daemonset
brief: >
A Kubernetes DaemonSet object.
attributes:
@@ -76,6 +85,7 @@ groups:
- id: k8s.job
type: resource
+ name: k8s.job
brief: >
A Kubernetes Job object.
attributes:
@@ -84,6 +94,7 @@ groups:
- id: k8s.cronjob
type: resource
+ name: k8s.cronjob
brief: >
A Kubernetes CronJob object.
attributes:
diff --git a/model/metrics/dotnet/dotnet-kestrel.yaml b/model/kestrel/metrics.yaml
similarity index 100%
rename from model/metrics/dotnet/dotnet-kestrel.yaml
rename to model/kestrel/metrics.yaml
diff --git a/model/registry/linux.yaml b/model/linux/registry.yaml
similarity index 100%
rename from model/registry/linux.yaml
rename to model/linux/registry.yaml
diff --git a/model/logs/media.yaml b/model/log/common.yaml
similarity index 63%
rename from model/logs/media.yaml
rename to model/log/common.yaml
index 34c7631d5c..47b7af71f5 100644
--- a/model/logs/media.yaml
+++ b/model/log/common.yaml
@@ -1,4 +1,14 @@
groups:
+ - id: log.record
+ type: attribute_group
+ brief: >
+ The attributes described in this section are rather generic. They may be used in any Log Record they apply to.
+ attributes:
+ - ref: log.record.uid
+ requirement_level: opt_in
+ - ref: log.record.original
+ requirement_level: opt_in
+
- id: attributes.log
type: attribute_group
brief: "Describes Log attributes"
diff --git a/model/registry/log.yaml b/model/log/registry.yaml
similarity index 98%
rename from model/registry/log.yaml
rename to model/log/registry.yaml
index 01d592329e..7775f2bc61 100644
--- a/model/registry/log.yaml
+++ b/model/log/registry.yaml
@@ -73,7 +73,7 @@ groups:
type: string
stability: experimental
brief: >
- The complete orignal Log Record.
+ The complete original Log Record.
note: >
This value MAY be added when processing a Log Record which was originally transmitted as a string or equivalent data type AND
the Body field of the Log Record does not contain the same value. (e.g. a syslog or a log record read from a file.)
diff --git a/model/logs/general.yaml b/model/logs/general.yaml
deleted file mode 100644
index d4835d6982..0000000000
--- a/model/logs/general.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-groups:
- - id: log.record
- type: attribute_group
- brief: >
- The attributes described in this section are rather generic. They may be used in any Log Record they apply to.
- attributes:
- - ref: log.record.uid
- requirement_level: opt_in
- - ref: log.record.original
- requirement_level: opt_in
diff --git a/model/messaging-common.yaml b/model/messaging/common.yaml
similarity index 87%
rename from model/messaging-common.yaml
rename to model/messaging/common.yaml
index e7ca9af636..8bca1a2d5a 100644
--- a/model/messaging-common.yaml
+++ b/model/messaging/common.yaml
@@ -2,10 +2,11 @@ groups:
- id: attributes.messaging.common.minimal
type: attribute_group
brief: "Common cross-signal messaging attributes."
+ stability: experimental
attributes:
# TODO: Not adding `messaging.system` to the minimal because of https://github.com/open-telemetry/build-tools/issues/192
- ref: error.type
- examples: ['amqp:decode-error', 'KAFKA_STORAGE_ERROR', 'channel-error']
+ examples: ["amqp:decode-error", "KAFKA_STORAGE_ERROR", "channel-error"]
requirement_level:
conditionally_required: If and only if the messaging operation has failed.
- ref: server.address
diff --git a/model/metrics/deprecated/messaging-metrics.yaml b/model/messaging/deprecated/metrics-deprecated.yaml
similarity index 100%
rename from model/metrics/deprecated/messaging-metrics.yaml
rename to model/messaging/deprecated/metrics-deprecated.yaml
diff --git a/model/registry/deprecated/messaging.yaml b/model/messaging/deprecated/registry-deprecated.yaml
similarity index 82%
rename from model/registry/deprecated/messaging.yaml
rename to model/messaging/deprecated/registry-deprecated.yaml
index 8054a9e1ae..d5d7305429 100644
--- a/model/registry/deprecated/messaging.yaml
+++ b/model/messaging/deprecated/registry-deprecated.yaml
@@ -29,8 +29,7 @@ groups:
type: string
brief: >
Deprecated, use `messaging.consumer.group.name` instead.
- deprecated: >
- Replaced by `messaging.consumer.group.name`.
+ deprecated: "Replaced by `messaging.consumer.group.name`."
stability: experimental
examples: 'my-group'
- id: messaging.rocketmq.client_group
@@ -39,32 +38,28 @@ groups:
Deprecated, use `messaging.consumer.group.name` instead.
stability: experimental
examples: 'myConsumerGroup'
- deprecated: >
- Replaced by `messaging.consumer.group.name` on the consumer spans. No replacement for producer spans.
+ deprecated: "Replaced by `messaging.consumer.group.name` on the consumer spans. No replacement for producer spans."
- id: messaging.eventhubs.consumer.group
type: string
brief: >
Deprecated, use `messaging.consumer.group.name` instead.
stability: experimental
examples: '$Default'
- deprecated: >
- Replaced by `messaging.consumer.group.name`.
+ deprecated: "Replaced by `messaging.consumer.group.name`."
- id: messaging.servicebus.destination.subscription_name
type: string
brief: >
- Deprecated, use `messaging.servicebus.destination.subscription_name` instead.
+ Deprecated, use `messaging.destination.subscription.name` instead.
stability: experimental
examples: 'subscription-a'
- deprecated: >
- Replaced by `messaging.servicebus.destination.subscription_name`.
+ deprecated: "Replaced by `messaging.destination.subscription.name`."
- id: messaging.kafka.message.offset
type: int
stability: experimental
brief: >
Deprecated, use `messaging.kafka.offset` instead.
examples: 42
- deprecated: >
- Replaced by `messaging.kafka.offset`.
+ deprecated: "Replaced by `messaging.kafka.offset`."
- id: messaging.destination_publish.anonymous
type: boolean
stability: experimental
diff --git a/model/metrics/messaging-metrics.yaml b/model/messaging/metrics.yaml
similarity index 100%
rename from model/metrics/messaging-metrics.yaml
rename to model/messaging/metrics.yaml
diff --git a/model/registry/messaging.yaml b/model/messaging/registry.yaml
similarity index 100%
rename from model/registry/messaging.yaml
rename to model/messaging/registry.yaml
diff --git a/model/trace/messaging.yaml b/model/messaging/spans.yaml
similarity index 100%
rename from model/trace/messaging.yaml
rename to model/messaging/spans.yaml
diff --git a/model/network.yaml b/model/network/common.yaml
similarity index 100%
rename from model/network.yaml
rename to model/network/common.yaml
diff --git a/model/registry/deprecated/network.yaml b/model/network/deprecated/registry-deprecated.yaml
similarity index 100%
rename from model/registry/deprecated/network.yaml
rename to model/network/deprecated/registry-deprecated.yaml
diff --git a/model/registry/network.yaml b/model/network/registry.yaml
similarity index 100%
rename from model/registry/network.yaml
rename to model/network/registry.yaml
diff --git a/model/metrics/nodejs-metrics.yaml b/model/nodejs/metrics.yaml
similarity index 100%
rename from model/metrics/nodejs-metrics.yaml
rename to model/nodejs/metrics.yaml
diff --git a/model/registry/nodejs.yaml b/model/nodejs/registry.yaml
similarity index 100%
rename from model/registry/nodejs.yaml
rename to model/nodejs/registry.yaml
diff --git a/model/registry/oci.yaml b/model/oci/registry.yaml
similarity index 100%
rename from model/registry/oci.yaml
rename to model/oci/registry.yaml
diff --git a/model/trace/compatibility.yaml b/model/opentracing/common.yaml
similarity index 91%
rename from model/trace/compatibility.yaml
rename to model/opentracing/common.yaml
index 3f906d18cf..001ba4042e 100644
--- a/model/trace/compatibility.yaml
+++ b/model/opentracing/common.yaml
@@ -1,6 +1,6 @@
groups:
- id: opentracing
- type: span
+ type: attribute_group
brief: 'This document defines semantic conventions for the OpenTracing Shim'
note: >
These conventions are used by the OpenTracing Shim layer.
diff --git a/model/registry/opentracing.yaml b/model/opentracing/registry.yaml
similarity index 100%
rename from model/registry/opentracing.yaml
rename to model/opentracing/registry.yaml
diff --git a/model/registry/os.yaml b/model/os/registry.yaml
similarity index 100%
rename from model/registry/os.yaml
rename to model/os/registry.yaml
diff --git a/model/os/resources.yaml b/model/os/resources.yaml
new file mode 100644
index 0000000000..da3d241046
--- /dev/null
+++ b/model/os/resources.yaml
@@ -0,0 +1,29 @@
+groups:
+ - id: os
+ type: resource
+ name: os
+ brief: >
+ The operating system (OS) on which the process represented by this resource is running.
+ note: >
+ In case of virtualized environments, this is the operating system as it is observed by
+ the process, i.e., the virtualized guest rather than the underlying host.
+ attributes:
+ - ref: os.type
+ requirement_level: required
+ - ref: os.description
+ - ref: os.name
+ - ref: os.version
+ - ref: os.build_id
+ note: >
+ `build_id` values SHOULD be obtained from the following sources:
+
+
+ | OS | Primary | Fallback |
+
+ | ------- | ------- | ------- |
+
+ | Windows | `CurrentBuildNumber` from registry `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion` | - |
+
+ | MacOS | `ProductBuildVersion` from `/System/Library/CoreServices/SystemVersion.plist` | `ProductBuildVersion` from `/System/Library/CoreServices/ServerVersion.plist` |
+
+ | Linux | `BUILD_ID` from `/etc/os-release` | `BUILD_ID` from `/usr/lib/os-release`;
contents of `/proc/sys/kernel/osrelease`|
diff --git a/model/trace/exporter/exporter.yaml b/model/otel/common.yaml
similarity index 91%
rename from model/trace/exporter/exporter.yaml
rename to model/otel/common.yaml
index 0c4e8c6a8f..ddb8dd1e22 100644
--- a/model/trace/exporter/exporter.yaml
+++ b/model/otel/common.yaml
@@ -1,6 +1,6 @@
groups:
- id: otel_span
- type: span
+ type: attribute_group
brief: Span attributes used by non-OTLP exporters to represent OpenTelemetry Span's concepts.
attributes:
- ref: otel.status_code
diff --git a/model/registry/deprecated/otel.yaml b/model/otel/deprecated/registry-deprecated.yaml
similarity index 64%
rename from model/registry/deprecated/otel.yaml
rename to model/otel/deprecated/registry-deprecated.yaml
index 634eb4ea1d..165fbe043e 100644
--- a/model/registry/deprecated/otel.yaml
+++ b/model/otel/deprecated/registry-deprecated.yaml
@@ -6,13 +6,13 @@ groups:
attributes:
- id: otel.library.name
type: string
- deprecated: use the `otel.scope.name` attribute.
+ deprecated: "Use the `otel.scope.name` attribute."
stability: experimental
- brief: ""
+ brief: "Deprecated. Use the `otel.scope.name` attribute"
examples: ['io.opentelemetry.contrib.mongodb']
- id: otel.library.version
type: string
- deprecated: use the `otel.scope.version` attribute.
+ deprecated: "Use the `otel.scope.version` attribute."
stability: experimental
- brief: ""
+ brief: "Deprecated. Use the `otel.scope.version` attribute."
examples: ['1.0.0']
diff --git a/model/registry/otel.yaml b/model/otel/registry.yaml
similarity index 100%
rename from model/registry/otel.yaml
rename to model/otel/registry.yaml
diff --git a/model/scope/exporter/exporter.yaml b/model/otel/resources.yaml
similarity index 78%
rename from model/scope/exporter/exporter.yaml
rename to model/otel/resources.yaml
index 52f47f0b0e..2accfa3faf 100644
--- a/model/scope/exporter/exporter.yaml
+++ b/model/otel/resources.yaml
@@ -1,6 +1,8 @@
groups:
- id: otel.scope
+ # This should not be a resource, but an attribute group.
type: resource
+ name: otel.scope
brief: Attributes used by non-OTLP exporters to represent OpenTelemetry Scope's concepts.
attributes:
- ref: otel.scope.name
diff --git a/model/peer/common.yaml b/model/peer/common.yaml
new file mode 100644
index 0000000000..53807af234
--- /dev/null
+++ b/model/peer/common.yaml
@@ -0,0 +1,7 @@
+groups:
+ - id: peer
+ type: attribute_group
+ brief: "Operations that access some remote service."
+ attributes:
+ - ref: peer.service
+ requirement_level: recommended
diff --git a/model/registry/peer.yaml b/model/peer/registry.yaml
similarity index 100%
rename from model/registry/peer.yaml
rename to model/peer/registry.yaml
diff --git a/model/registry/deprecated/process.yaml b/model/process/deprecated/registry-deprecated.yaml
similarity index 100%
rename from model/registry/deprecated/process.yaml
rename to model/process/deprecated/registry-deprecated.yaml
diff --git a/model/metrics/process-metrics.yaml b/model/process/metrics.yaml
similarity index 100%
rename from model/metrics/process-metrics.yaml
rename to model/process/metrics.yaml
diff --git a/model/registry/process.yaml b/model/process/registry.yaml
similarity index 89%
rename from model/registry/process.yaml
rename to model/process/registry.yaml
index e070dc431b..7b549d7bf7 100644
--- a/model/registry/process.yaml
+++ b/model/process/registry.yaml
@@ -41,6 +41,25 @@ groups:
The PID of the process's group leader. This is also the process group
ID (PGID) of the process.
examples: [23]
+ - id: process.executable.build_id.gnu
+ stability: experimental
+ type: string
+ brief: >
+ The GNU build ID as found in the `.note.gnu.build-id` ELF section (hex string).
+ examples: ['c89b11207f6479603b0d49bf291c092c2b719293']
+ - id: process.executable.build_id.go
+ stability: experimental
+ type: string
+ brief: >
+ The Go build ID as retrieved by `go tool buildid `.
+ examples: ['foh3mEXu7BLZjsN9pOwG/kATcXlYVCDEFouRMQed_/WwRFB1hPo9LBkekthSPG/x8hMC8emW2cCjXD0_1aY']
+ - id: process.executable.build_id.profiling
+ stability: experimental
+ type: string
+ brief: >
+ Profiling specific build ID for executables. See the OTel specification
+ for Profiles for more information.
+ examples: ['600DCAFE4A110000F2BF38C493F5FB92']
- id: process.executable.name
type: string
stability: experimental
@@ -159,7 +178,7 @@ groups:
An additional description about the runtime of the process, for example
a specific vendor customization of the runtime environment.
examples: 'Eclipse OpenJ9 Eclipse OpenJ9 VM openj9-0.21.0'
- - id: title
+ - id: process.title
type: string
stability: experimental
brief: >
@@ -192,7 +211,7 @@ groups:
stability: experimental
brief: >
Whether the process is connected to an interactive shell.
- - id: working_directory
+ - id: process.working_directory
type: string
stability: experimental
brief: >
diff --git a/model/resource/process.yaml b/model/process/resources.yaml
similarity index 96%
rename from model/resource/process.yaml
rename to model/process/resources.yaml
index 600559732c..f33965fb9b 100644
--- a/model/resource/process.yaml
+++ b/model/process/resources.yaml
@@ -1,6 +1,7 @@
groups:
- id: process
type: resource
+ name: process
brief: >
An operating system process.
attributes:
@@ -25,6 +26,7 @@ groups:
- id: process.runtime
type: resource
+ name: process.runtime
brief: >
The single (language) runtime instance which is monitored.
attributes:
diff --git a/model/profile/common.yaml b/model/profile/common.yaml
new file mode 100644
index 0000000000..2c7994adfc
--- /dev/null
+++ b/model/profile/common.yaml
@@ -0,0 +1,8 @@
+groups:
+ - id: profile.frame
+ type: attribute_group
+ brief: >
+ Describes the origin of a single frame in a Profile.
+ attributes:
+ - ref: profile.frame.type
+ requirement_level: recommended
diff --git a/model/profile/registry.yaml b/model/profile/registry.yaml
new file mode 100644
index 0000000000..8bbac2ef51
--- /dev/null
+++ b/model/profile/registry.yaml
@@ -0,0 +1,63 @@
+groups:
+
+ - id: registry.profile.frame
+ type: attribute_group
+ brief: >
+ Describes the origin of a single frame in a Profile.
+ attributes:
+ - id: profile.frame.type
+ stability: experimental
+ brief: >
+ Describes the interpreter or compiler of a single frame.
+ examples: ['cpython']
+ type:
+ allow_custom_values: true
+ members:
+ - id: dotnet
+ brief: >
+ [.NET](https://wikipedia.org/wiki/.NET)
+ value: "dotnet"
+ stability: experimental
+ - id: jvm
+ brief: >
+ [JVM](https://wikipedia.org/wiki/Java_virtual_machine)
+ value: "jvm"
+ stability: experimental
+ - id: kernel
+ brief: >
+ [Kernel](https://wikipedia.org/wiki/Kernel_(operating_system))
+ value: "kernel"
+ stability: experimental
+ - id: native
+ brief: >
+ [C](https://wikipedia.org/wiki/C_(programming_language)),
+ [C++](https://wikipedia.org/wiki/C%2B%2B),
+ [Go](https://wikipedia.org/wiki/Go_(programming_language)),
+ [Rust](https://wikipedia.org/wiki/Rust_(programming_language))
+ value: "native"
+ stability: experimental
+ - id: perl
+ brief: >
+ [Perl](https://wikipedia.org/wiki/Perl)
+ value: "perl"
+ stability: experimental
+ - id: php
+ brief: >
+ [PHP](https://wikipedia.org/wiki/PHP)
+ value: "php"
+ stability: experimental
+ - id: cpython
+ brief: >
+ [Python](https://wikipedia.org/wiki/Python_(programming_language))
+ value: "cpython"
+ stability: experimental
+ - id: ruby
+ brief: >
+ [Ruby](https://wikipedia.org/wiki/Ruby_(programming_language))
+ value: "ruby"
+ stability: experimental
+ - id: v8js
+ brief: >
+ [V8JS](https://wikipedia.org/wiki/V8_(JavaScript_engine))
+ value: "v8js"
+ stability: experimental
diff --git a/model/registry/file.yaml b/model/registry/file.yaml
deleted file mode 100644
index 742f95afee..0000000000
--- a/model/registry/file.yaml
+++ /dev/null
@@ -1,38 +0,0 @@
-groups:
- - id: registry.file
- type: attribute_group
- display_name: File Attributes
- brief: "Describes file attributes."
- attributes:
- - id: file.directory
- type: string
- brief: >
- Directory where the file is located. It should include the drive letter, when appropriate.
- stability: experimental
- examples: ['/home/user', 'C:\Program Files\MyApp']
- - id: file.extension
- type: string
- brief: >
- File extension, excluding the leading dot.
- stability: experimental
- examples: ['png', 'gz']
- note: >
- When the file name has multiple extensions (example.tar.gz), only the last one should
- be captured ("gz", not "tar.gz").
- - id: file.name
- type: string
- brief: >
- Name of the file including the extension, without the directory.
- stability: experimental
- examples: ['example.png']
- - id: file.path
- type: string
- brief: >
- Full path to the file, including the file name. It should include the drive letter, when appropriate.
- stability: experimental
- examples: ['/home/alice/example.png', 'C:\Program Files\MyApp\myapp.exe']
- - id: file.size
- type: int
- brief: >
- File size in bytes.
- stability: experimental
diff --git a/model/resource/host.yaml b/model/resource/host.yaml
deleted file mode 100644
index 7a6c95b2d6..0000000000
--- a/model/resource/host.yaml
+++ /dev/null
@@ -1,35 +0,0 @@
-groups:
- - id: host
- type: resource
- brief: >
- A host is defined as a computing instance. For example, physical servers, virtual machines, switches or disk array.
- attributes:
- - ref: host.id
- - ref: host.name
- - ref: host.type
- - ref: host.arch
- - ref: host.image.name
- - ref: host.image.id
- - ref: host.image.version
- - ref: host.ip
- requirement_level: opt_in
- - ref: host.mac
- requirement_level: opt_in
-
- - id: host.cpu
- type: resource
- brief: >
- A host's CPU information
- attributes:
- - ref: host.cpu.vendor.id
- requirement_level: opt_in
- - ref: host.cpu.family
- requirement_level: opt_in
- - ref: host.cpu.model.id
- requirement_level: opt_in
- - ref: host.cpu.model.name
- requirement_level: opt_in
- - ref: host.cpu.stepping
- requirement_level: opt_in
- - ref: host.cpu.cache.l2.size
- requirement_level: opt_in
diff --git a/model/resource/os.yaml b/model/resource/os.yaml
deleted file mode 100644
index 5c3a76b477..0000000000
--- a/model/resource/os.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
-groups:
- - id: os
- type: resource
- brief: >
- The operating system (OS) on which the process represented by this resource is running.
- note: >
- In case of virtualized environments, this is the operating system as it is observed by
- the process, i.e., the virtualized guest rather than the underlying host.
- attributes:
- - ref: os.type
- requirement_level: required
- - ref: os.description
- - ref: os.name
- - ref: os.version
- - ref: os.build_id
diff --git a/model/registry/deprecated/rpc.yaml b/model/rpc/deprecated/registry-deprecated.yaml
similarity index 100%
rename from model/registry/deprecated/rpc.yaml
rename to model/rpc/deprecated/registry-deprecated.yaml
diff --git a/model/metrics/rpc-metrics.yaml b/model/rpc/metrics.yaml
similarity index 100%
rename from model/metrics/rpc-metrics.yaml
rename to model/rpc/metrics.yaml
diff --git a/model/registry/rpc.yaml b/model/rpc/registry.yaml
similarity index 100%
rename from model/registry/rpc.yaml
rename to model/rpc/registry.yaml
diff --git a/model/trace/rpc.yaml b/model/rpc/spans.yaml
similarity index 100%
rename from model/trace/rpc.yaml
rename to model/rpc/spans.yaml
diff --git a/model/server/common.yaml b/model/server/common.yaml
new file mode 100644
index 0000000000..08806f02b3
--- /dev/null
+++ b/model/server/common.yaml
@@ -0,0 +1,8 @@
+groups:
+ - id: server
+ type: attribute_group
+ brief: >
+ General server attributes.
+ attributes:
+ - ref: server.address
+ - ref: server.port
diff --git a/model/registry/server.yaml b/model/server/registry.yaml
similarity index 100%
rename from model/registry/server.yaml
rename to model/server/registry.yaml
diff --git a/model/registry/service.yaml b/model/service/registry.yaml
similarity index 100%
rename from model/registry/service.yaml
rename to model/service/registry.yaml
diff --git a/model/resource/service_experimental.yaml b/model/service/resources-experimental.yaml
similarity index 89%
rename from model/resource/service_experimental.yaml
rename to model/service/resources-experimental.yaml
index 91f6e36c3e..861f26862e 100644
--- a/model/resource/service_experimental.yaml
+++ b/model/service/resources-experimental.yaml
@@ -1,6 +1,7 @@
groups:
- id: service_experimental
type: resource
+ name: 'service'
brief: >
A service instance.
attributes:
diff --git a/model/resource/service.yaml b/model/service/resources.yaml
similarity index 82%
rename from model/resource/service.yaml
rename to model/service/resources.yaml
index 141cd1382b..b5a3d27f0a 100644
--- a/model/resource/service.yaml
+++ b/model/service/resources.yaml
@@ -1,8 +1,10 @@
groups:
- id: service
type: resource
+ name: service
brief: >
A service instance.
+ stability: stable
attributes:
- ref: service.name
requirement_level: required
diff --git a/model/session.yaml b/model/session/common.yaml
similarity index 100%
rename from model/session.yaml
rename to model/session/common.yaml
diff --git a/model/registry/session.yaml b/model/session/registry.yaml
similarity index 100%
rename from model/registry/session.yaml
rename to model/session/registry.yaml
diff --git a/model/metrics/dotnet/dotnet-signalr.yaml b/model/signalr/metrics.yaml
similarity index 100%
rename from model/metrics/dotnet/dotnet-signalr.yaml
rename to model/signalr/metrics.yaml
diff --git a/model/registry/signalr.yaml b/model/signalr/registry.yaml
similarity index 100%
rename from model/registry/signalr.yaml
rename to model/signalr/registry.yaml
diff --git a/model/source/common.yaml b/model/source/common.yaml
new file mode 100644
index 0000000000..5644041e24
--- /dev/null
+++ b/model/source/common.yaml
@@ -0,0 +1,8 @@
+groups:
+ - id: source
+ type: attribute_group
+ brief: >
+ General source attributes.
+ attributes:
+ - ref: source.address
+ - ref: source.port
diff --git a/model/registry/source.yaml b/model/source/registry.yaml
similarity index 100%
rename from model/registry/source.yaml
rename to model/source/registry.yaml
diff --git a/model/registry/deprecated/system.yaml b/model/system/deprecated/registry-deprecated.yaml
similarity index 100%
rename from model/registry/deprecated/system.yaml
rename to model/system/deprecated/registry-deprecated.yaml
diff --git a/model/metrics/system-metrics.yaml b/model/system/metrics.yaml
similarity index 90%
rename from model/metrics/system-metrics.yaml
rename to model/system/metrics.yaml
index 9784deeece..583e421def 100644
--- a/model/metrics/system-metrics.yaml
+++ b/model/system/metrics.yaml
@@ -209,16 +209,31 @@ groups:
- ref: system.device
- ref: disk.io.direction
+ - id: metric.system.disk.limit
+ type: metric
+ metric_name: system.disk.limit
+ stability: experimental
+ brief: "The total storage capacity of the disk"
+ instrument: updowncounter
+ unit: "By"
+ attributes:
+ - ref: system.device
+
# system.filesystem.* metrics
- id: metric.system.filesystem.usage
type: metric
metric_name: system.filesystem.usage
stability: experimental
- brief: ""
+ brief: "Reports a filesystem's space usage across different states."
+ note: |
+ The sum of all `system.filesystem.usage` values over the different `system.filesystem.state` attributes
+ SHOULD equal the total storage capacity of the filesystem, that is `system.filesystem.limit`.
instrument: updowncounter
unit: "By"
attributes:
- ref: system.device
+ brief: Identifier for the device where the filesystem resides.
+ examples: ["/dev/sda", "\\network-drive"]
- ref: system.filesystem.state
- ref: system.filesystem.type
- ref: system.filesystem.mode
@@ -233,11 +248,28 @@ groups:
unit: "1"
attributes:
- ref: system.device
+ brief: Identifier for the device where the filesystem resides.
+ examples: ["/dev/sda", "\\network-drive"]
- ref: system.filesystem.state
- ref: system.filesystem.type
- ref: system.filesystem.mode
- ref: system.filesystem.mountpoint
+ - id: metric.system.filesystem.limit
+ type: metric
+ metric_name: system.filesystem.limit
+ stability: experimental
+ brief: "The total storage capacity of the filesystem"
+ instrument: updowncounter
+ unit: "By"
+ attributes:
+ - ref: system.device
+ brief: Identifier for the device where the filesystem resides.
+ examples: ["/dev/sda", "\\network-drive"]
+ - ref: system.filesystem.type
+ - ref: system.filesystem.mode
+ - ref: system.filesystem.mountpoint
+
# system.network.* metrics
- id: metric.system.network.dropped
type: metric
diff --git a/model/registry/system.yaml b/model/system/registry.yaml
similarity index 100%
rename from model/registry/system.yaml
rename to model/system/registry.yaml
diff --git a/model/registry/telemetry.yaml b/model/telemetry/registry.yaml
similarity index 100%
rename from model/registry/telemetry.yaml
rename to model/telemetry/registry.yaml
diff --git a/model/resource/telemetry_experimental.yaml b/model/telemetry/resources-experimental.yaml
similarity index 82%
rename from model/resource/telemetry_experimental.yaml
rename to model/telemetry/resources-experimental.yaml
index eb2c508b3a..6a660cc849 100644
--- a/model/resource/telemetry_experimental.yaml
+++ b/model/telemetry/resources-experimental.yaml
@@ -1,6 +1,7 @@
groups:
- - id: telemetry_experimental
+ - id: telemetry.sdk_experimental
type: resource
+ name: 'telemetry.sdk'
brief: >
The telemetry SDK used to capture data recorded by the instrumentation libraries.
attributes:
diff --git a/model/resource/telemetry.yaml b/model/telemetry/resources.yaml
similarity index 83%
rename from model/resource/telemetry.yaml
rename to model/telemetry/resources.yaml
index cbc82ce566..bdd4350b78 100644
--- a/model/resource/telemetry.yaml
+++ b/model/telemetry/resources.yaml
@@ -1,6 +1,8 @@
groups:
- - id: telemetry
+ - id: telemetry.sdk
+ name: 'telemetry.sdk'
type: resource
+ stability: stable
brief: >
The telemetry SDK used to capture data recorded by the instrumentation libraries.
attributes:
diff --git a/model/registry/test.yaml b/model/test/registry.yaml
similarity index 100%
rename from model/registry/test.yaml
rename to model/test/registry.yaml
diff --git a/model/thread/common.yaml b/model/thread/common.yaml
new file mode 100644
index 0000000000..572fb26996
--- /dev/null
+++ b/model/thread/common.yaml
@@ -0,0 +1,8 @@
+groups:
+ - id: thread
+ type: attribute_group
+ brief: >
+ These attributes may be used for any operation to store information about a thread that started a span.
+ attributes:
+ - ref: thread.id
+ - ref: thread.name
diff --git a/model/registry/thread.yaml b/model/thread/registry.yaml
similarity index 100%
rename from model/registry/thread.yaml
rename to model/thread/registry.yaml
diff --git a/model/registry/deprecated/tls.yaml b/model/tls/deprecated/registry-deprecated.yaml
similarity index 85%
rename from model/registry/deprecated/tls.yaml
rename to model/tls/deprecated/registry-deprecated.yaml
index ebde7b32d4..38bd62c7b3 100644
--- a/model/registry/deprecated/tls.yaml
+++ b/model/tls/deprecated/registry-deprecated.yaml
@@ -6,6 +6,6 @@ groups:
- id: tls.client.server_name
type: string
stability: experimental
- deprecated: "Replaced by `server.address."
+ deprecated: "Replaced by `server.address`."
brief: "Deprecated, use `server.address` instead."
examples: ["opentelemetry.io"]
diff --git a/model/registry/tls.yaml b/model/tls/registry.yaml
similarity index 100%
rename from model/registry/tls.yaml
rename to model/tls/registry.yaml
diff --git a/model/url.yaml b/model/url/common.yaml
similarity index 100%
rename from model/url.yaml
rename to model/url/common.yaml
diff --git a/model/registry/url.yaml b/model/url/registry.yaml
similarity index 87%
rename from model/registry/url.yaml
rename to model/url/registry.yaml
index cb12534d57..dc06b6b2fe 100644
--- a/model/registry/url.yaml
+++ b/model/url/registry.yaml
@@ -14,7 +14,13 @@ groups:
without a domain name. In this case, the IP address would go to the domain field.
If the URL contains a [literal IPv6 address](https://www.rfc-editor.org/rfc/rfc2732#section-2)
enclosed by `[` and `]`, the `[` and `]` characters should also be captured in the domain field.
- examples: ["www.foo.bar", "opentelemetry.io", "3.12.167.2", "[1080:0:0:0:8:800:200C:417A]"]
+ examples:
+ [
+ "www.foo.bar",
+ "opentelemetry.io",
+ "3.12.167.2",
+ "[1080:0:0:0:8:800:200C:417A]",
+ ]
- id: url.extension
type: string
stability: experimental
@@ -23,7 +29,7 @@ groups:
note: >
The file extension is only set if it exists, as not every url has a file extension.
When the file name has multiple extensions `example.tar.gz`, only the last one should be captured `gz`, not `tar.gz`.
- examples: [ "png", "gz" ]
+ examples: ["png", "gz"]
- id: url.fragment
stability: stable
type: string
@@ -43,7 +49,8 @@ groups:
`url.full` SHOULD capture the absolute URL when it is available (or can be reconstructed).
Sensitive content provided in `url.full` SHOULD be scrubbed when instrumentations can identify it.
- examples: ['https://www.foo.bar/search?q=OpenTelemetry#SemConv', '//localhost']
+ examples:
+ ["https://www.foo.bar/search?q=OpenTelemetry#SemConv", "//localhost"]
- id: url.original
type: string
stability: experimental
@@ -55,7 +62,11 @@ groups:
`url.original` might contain credentials passed via URL in form of `https://username:password@www.example.com/`.
In such case password and username SHOULD NOT be redacted and attribute's value SHOULD remain the same.
- examples: ["https://www.foo.bar/search?q=OpenTelemetry#SemConv", "search?q=OpenTelemetry"]
+ examples:
+ [
+ "https://www.foo.bar/search?q=OpenTelemetry#SemConv",
+ "search?q=OpenTelemetry",
+ ]
- id: url.path
stability: stable
type: string
@@ -103,8 +114,8 @@ groups:
full name cannot be determined, subdomain contains all of the names below the registered domain.
examples: ["east", "sub2.sub1"]
note: >
- The subdomain portion of `www.east.mydomain.co.uk` is `east`. If the domain has multiple levels of subdomain,
- such as `sub2.sub1.example.com`, the subdomain field should contain `sub2.sub1`, with no trailing period.
+ The subdomain portion of `www.east.mydomain.co.uk` is `east`. If the domain has multiple levels of subdomain,
+ such as `sub2.sub1.example.com`, the subdomain field should contain `sub2.sub1`, with no trailing period.
- id: url.template
type: string
stability: experimental
@@ -119,4 +130,4 @@ groups:
For example, the top level domain for example.com is `com`.
examples: ["com", "co.uk"]
note: >
- This value can be determined precisely with the [public suffix list](http://publicsuffix.org).
+ This value can be determined precisely with the [public suffix list](http://publicsuffix.org).
diff --git a/model/registry/user-agent.yaml b/model/user-agent/registry.yaml
similarity index 81%
rename from model/registry/user-agent.yaml
rename to model/user-agent/registry.yaml
index b54df13f98..2b856ecdf5 100644
--- a/model/registry/user-agent.yaml
+++ b/model/user-agent/registry.yaml
@@ -9,15 +9,16 @@ groups:
type: string
brief: >
Value of the [HTTP User-Agent](https://www.rfc-editor.org/rfc/rfc9110.html#field.user-agent) header sent by the client.
- examples: ['CERN-LineMode/2.15 libwww/2.17b3',
- 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Mobile/15E148 Safari/604.1',
- 'YourApp/1.0.0 grpc-java-okhttp/1.27.2']
+ examples:
+ - "CERN-LineMode/2.15 libwww/2.17b3"
+ - "Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Mobile/15E148 Safari/604.1"
+ - "YourApp/1.0.0 grpc-java-okhttp/1.27.2"
- id: user_agent.name
type: string
stability: experimental
brief: >
Name of the user-agent extracted from original. Usually refers to the browser's name.
- examples: ['Safari', 'YourApp']
+ examples: ["Safari", "YourApp"]
note: >
[Example](https://www.whatsmyua.info) of extracting browser's name from original string. In the case of using
a user-agent for non-browser products, such as microservices with multiple names/versions inside the
@@ -28,7 +29,7 @@ groups:
stability: experimental
brief: >
Version of the user-agent extracted from original. Usually refers to the browser's version
- examples: ['14.1.2', '1.0.0']
+ examples: ["14.1.2", "1.0.0"]
note: >
[Example](https://www.whatsmyua.info) of extracting browser's version from original string. In the case of
using a user-agent for non-browser products, such as microservices with multiple names/versions inside the
diff --git a/model/registry/user.yaml b/model/user/registry.yaml
similarity index 100%
rename from model/registry/user.yaml
rename to model/user/registry.yaml
diff --git a/model/metrics/v8js-metrics.yaml b/model/v8js/metrics.yaml
similarity index 100%
rename from model/metrics/v8js-metrics.yaml
rename to model/v8js/metrics.yaml
diff --git a/model/registry/v8js.yaml b/model/v8js/registry.yaml
similarity index 100%
rename from model/registry/v8js.yaml
rename to model/v8js/registry.yaml
diff --git a/model/registry/vcs.yaml b/model/vcs/registry.yaml
similarity index 100%
rename from model/registry/vcs.yaml
rename to model/vcs/registry.yaml
diff --git a/model/registry/webengine.yaml b/model/webengine/registry.yaml
similarity index 65%
rename from model/registry/webengine.yaml
rename to model/webengine/registry.yaml
index ee2c14efe4..726f630b8b 100644
--- a/model/registry/webengine.yaml
+++ b/model/webengine/registry.yaml
@@ -2,24 +2,28 @@ groups:
- id: registry.webengine
type: attribute_group
display_name: Web Engine Attributes
+ stability: experimental
brief: >
- This document defines the attributes used to describe the packaged software running the application code.
+ This document defines the attributes used to describe the packaged software running the application code.
attributes:
- id: webengine.name
type: string
stability: experimental
brief: >
The name of the web engine.
- examples: ['WildFly']
+ examples: ["WildFly"]
- id: webengine.version
type: string
stability: experimental
brief: >
The version of the web engine.
- examples: ['21.0.0']
+ examples: ["21.0.0"]
- id: webengine.description
type: string
stability: experimental
brief: >
Additional description of the web engine (e.g. detailed version and edition information).
- examples: ['WildFly Full 21.0.0.Final (WildFly Core 13.0.1.Final) - 2.2.2.Final']
+ examples:
+ [
+ "WildFly Full 21.0.0.Final (WildFly Core 13.0.1.Final) - 2.2.2.Final",
+ ]
diff --git a/model/resource/webengine.yaml b/model/webengine/resources.yaml
similarity index 95%
rename from model/resource/webengine.yaml
rename to model/webengine/resources.yaml
index 9e8a586b0f..d9026cf2cf 100644
--- a/model/resource/webengine.yaml
+++ b/model/webengine/resources.yaml
@@ -1,6 +1,7 @@
groups:
- id: webengine_resource
type: resource
+ name: webengine
brief: >
Resource describing the packaged software running the application code. Web engines are typically executed using process.runtime.
attributes:
diff --git a/package.json b/package.json
index ffcb435581..dc7296fb15 100644
--- a/package.json
+++ b/package.json
@@ -13,7 +13,7 @@
"js-yaml": "^4.1.0",
"markdown-link-check": "3.11.2",
"markdown-toc": "^1.2.0",
- "markdownlint": "0.34.0",
+ "markdownlint": "0.35.0",
"markdownlint-cli": "0.41.0",
"prettier": "^3.0.0",
"through2": "^4.0.2"
diff --git a/policies/attribute_name_collisions.rego b/policies/attribute_name_collisions.rego
index a1f99080ac..c52f0267fc 100644
--- a/policies/attribute_name_collisions.rego
+++ b/policies/attribute_name_collisions.rego
@@ -1,14 +1,16 @@
package after_resolution
+import rego.v1
+
# Data structures to make checking things faster.
-attribute_names := { data |
- group := input.groups[_]
- attr := group.attributes[_]
- data := { "name": attr.name, "const_name": to_const_name(attr.name), "namespace_prefix": to_namespace_prefix(attr.name) }
+attribute_names := { obj |
+ group := input.groups[_];
+ attr := group.attributes[_];
+ obj := { "name": attr.name, "const_name": to_const_name(attr.name), "namespace_prefix": to_namespace_prefix(attr.name) }
}
-
-deny[attr_registry_collision(description, name)] {
+# check that attribute constant names do not collide
+deny contains attr_registry_collision(description, name) if {
some i
name := attribute_names[i].name
const_name := attribute_names[i].const_name
@@ -24,7 +26,8 @@ deny[attr_registry_collision(description, name)] {
description := sprintf("Attribute '%s' has the same constant name '%s' as '%s'.", [name, const_name, collisions])
}
-deny[attr_registry_collision(description, name)] {
+# check that attribute names do not collide with namespaces
+deny contains attr_registry_collision(description, name) if {
some i
name := attribute_names[i].name
prefix := attribute_names[i].namespace_prefix
@@ -36,10 +39,22 @@ deny[attr_registry_collision(description, name)] {
]
count(collisions) > 0
# TODO (https://github.com/open-telemetry/weaver/issues/279): provide other violation properties once weaver supports it.
- description := sprintf("Attribute '%s' is used as a namespace in '%s'.", [name, collisions])
+ description := sprintf("Attribute '%s' name is used as a namespace in the following attributes '%s'.", [name, collisions])
+}
+
+# check that attribute is not defined or referenced more than once within the same group
+deny contains attr_registry_collision(description, name) if {
+ group := input.groups[_]
+ attr := group.attributes[_]
+ name := attr.name
+
+ collisions := [n | n := group.attributes[_].name; n == name ]
+ count(collisions) > 1
+
+ description := sprintf("Attribute '%s' is already defined in the group '%s'. Attributes must be unique.", [name, group.id])
}
-attr_registry_collision(description, attr_name) = violation {
+attr_registry_collision(description, attr_name) = violation if {
violation := {
"id": description,
"type": "semconv_attribute",
@@ -49,11 +64,11 @@ attr_registry_collision(description, attr_name) = violation {
}
}
-to_namespace_prefix(name) = namespace {
+to_namespace_prefix(name) = namespace if {
namespace := concat("", [name, "."])
}
-to_const_name(name) = const_name {
+to_const_name(name) = const_name if {
const_name := replace(name, ".", "_")
}
diff --git a/policies/attribute_name_collisions_test.rego b/policies/attribute_name_collisions_test.rego
new file mode 100644
index 0000000000..b86e79fece
--- /dev/null
+++ b/policies/attribute_name_collisions_test.rego
@@ -0,0 +1,19 @@
+package after_resolution
+import future.keywords
+
+test_fails_on_const_name_collision if {
+ collision := {"groups": [
+ {"id": "test1", "attributes": [{"name": "foo.bar.baz"}]},
+ {"id": "test2", "attributes": [{"name": "foo.bar_baz"}]}
+ ]}
+ # each attribute counts as a collision, so there are 2 collisions
+ count(deny) == 2 with input as collision
+}
+
+test_fails_on_namespace_collision if {
+ collision := {"groups": [
+ {"id": "test1", "attributes": [{"name": "foo.bar.baz"}]},
+ {"id": "test2", "attributes": [{"name": "foo.bar"}]}
+ ]}
+ count(deny) == 1 with input as collision
+}
diff --git a/policies/compatibility.rego b/policies/compatibility.rego
new file mode 100644
index 0000000000..1b376a169e
--- /dev/null
+++ b/policies/compatibility.rego
@@ -0,0 +1,426 @@
+package comparison_after_resolution
+
+import rego.v1
+
+# Semantic Convention Registry Compatibility Checker
+#
+# This file contains rules for checking backward compatibility
+# between different versions of semantic convention registries.
+# It builds upon the data structures and rules defined in the
+# semconv package.
+
+# Import the previous release (baseline) and current sets of attributes, metrics.
+baseline_attributes := [attr |
+ some g in data.semconv.registry_baseline_groups
+ some attr in g.attributes
+]
+registry_attributes := [attr |
+ some g in data.semconv.registry_groups
+ some attr in g.attributes
+]
+registry_attribute_names := {attr.name |
+ some g in data.semconv.registry_groups
+ some attr in g.attributes
+}
+baseline_metrics := [ g |
+ some g in data.semconv.baseline_groups
+ g.type == "metric"
+]
+registry_metrics := [ g |
+ some g in data.semconv.groups
+ g.type == "metric"
+]
+registry_metric_names := { g.metric_name | some g in registry_metrics }
+
+baseline_resources := [ g |
+ some g in data.semconv.baseline_groups
+ g.type == "resource"
+]
+registry_resources := [g |
+ some g in data.semconv.groups
+ g.type == "resource"
+]
+registry_resource_names := { g.name | some g in registry_resources }
+
+# Rules we enforce:
+# - Attributes
+# - [x] Attributes cannot be removed
+# - [x] Attributes cannot "degrade" stability (stable->experimental)
+# - [x] Stable attributes cannot change type
+# - Enum members
+# - [x] Stable members cannot change stability
+# - [x] Values cannot change
+# - [x] ids cannot be removed
+# - Metrics
+# - [x] metrics cannot be removed
+# - [x] Stable metrics cannot become unstable
+# - [x] Stable Metric units cannot change
+# - [x] Stable Metric instruments cannot change
+# - [x] Set of required/recommended attributes must remain the same
+
+
+# Rule: Detect Removed Attributes
+#
+# This rule checks for attributes that existed in the baseline registry
+# but are no longer present in the current registry. Removing attributes
+# is considered a backward compatibility violation.
+#
+# In other words, we do not allow the removal of an attribute once added
+# to the registry. It must exist SOMEWHERE in a group, but may be deprecated.
+deny contains back_comp_violation(description, group_id, attr.name) if {
+ # Check if an attribute from the baseline is missing in the current registry
+ some attr in baseline_attributes
+ not registry_attribute_names[attr.name]
+
+ # Generate human readable error.
+ group_id := data.semconv.baseline_group_ids_by_attribute[attr.name]
+ description := sprintf("Attribute '%s' no longer exists in the attribute registry", [attr.name])
+}
+
+
+
+# Rule: Detect Stable Attributes moving to unstable
+#
+# This rule checks for attributes that were stable in the baseline registry
+# but are no longer stable in the current registry. Once stable, attributes
+# remain forever but may be deprecated.
+deny contains back_comp_violation(description, group_id, attr.name) if {
+ # Find stable baseline attributes in latest registry.
+ some attr in baseline_attributes
+ attr.stability == "stable"
+ some nattr in registry_attributes
+ attr.name == nattr.name
+
+ # Enforce the policy
+ attr.stability != nattr.stability
+
+ # Generate human readable error.
+ group_id := data.semconv.baseline_group_ids_by_attribute[attr.name]
+ description := sprintf("Attribute '%s' was stable, but has new stability marker", [attr.name])
+}
+
+# Rule: Detect Stable Attributes changing type
+#
+# This rule checks for attributes that were stable in the baseline registry
+# but are no longer stable in the current registry. Once stable, attributes
+# remain forever but may be deprecated.
+deny contains back_comp_violation(description, group_id, attr.name) if {
+ # Find stable baseline attributes in latest registry.
+ some attr in baseline_attributes
+ attr.stability == "stable"
+ some nattr in registry_attributes
+ attr.name == nattr.name
+
+ # Enforce the policy
+ # TODO - deal with enum type changes, probably in enum sections
+ not is_enum(attr)
+ attr.type != nattr.type
+
+ # Generate human readable error.
+ group_id := data.semconv.baseline_group_ids_by_attribute[attr.name]
+ attr_type_string := type_string(attr)
+ nattr_type_string := type_string(nattr)
+ description := sprintf("Attribute '%s' was '%s', but has new type '%s'", [attr.name, attr_type_string, nattr_type_string])
+}
+
+# Rule: Detect Stable enum Attributes changing type
+#
+# This rule checks for attributes that were stable in the baseline registry
+# but are no longer stable in the current registry. Once stable, attributes
+# remain forever but may be deprecated.
+deny contains back_comp_violation(description, group_id, attr.name) if {
+ # Find stable baseline attributes in latest registry.
+ some attr in baseline_attributes
+ attr.stability == "stable"
+ some nattr in registry_attributes
+ attr.name == nattr.name
+ # Enforce the policy
+ attr.type != nattr.type
+ is_enum(attr)
+ not is_enum(nattr)
+
+ # Generate human readable error.
+ group_id := data.semconv.baseline_group_ids_by_attribute[attr.name]
+ nattr_type_string := type_string(nattr)
+ description := sprintf("Attribute '%s' was enum, but has new type '%s'", [attr.name, nattr_type_string])
+}
+
+# Rule: Detect Stable Enum members changing stability level
+#
+# This rule checks for enum values that were stable in the baseline registry
+# but are no longer stable in the current registry.
+deny contains back_comp_violation(description, group_id, attr.name) if {
+ # Find data we need to enforce: Enums in baseline/current.
+ some attr in baseline_attributes
+ attr.stability == "stable"
+ some nattr in registry_attributes
+ attr.name == nattr.name
+ is_enum(attr)
+ some member in attr.type.members
+ some nmember in nattr.type.members
+ member.id == nmember.id
+
+ # Enforce the policy
+ member.stability == "stable"
+ nmember.stability != "stable"
+
+ # Generate human readable error.
+ group_id := data.semconv.baseline_group_ids_by_attribute[attr.name]
+ description := sprintf("Enum '%s' had stable member '%s', but is no longer stable", [attr.name, member.id])
+}
+
+# Rule: Enum member values cannot change
+#
+# This rule checks for enum values that have the same id, but values
+# are different.
+deny contains back_comp_violation(description, group_id, attr.name) if {
+ # Find data we need to enforce: Enums in baseline/current.
+ some attr in baseline_attributes
+ attr.stability == "stable"
+ some nattr in registry_attributes
+ attr.name == nattr.name
+ is_enum(attr)
+ some member in attr.type.members
+ some nmember in nattr.type.members
+ member.id == nmember.id
+
+ # Enforce the policy
+ member.value != nmember.value
+
+ # Generate human readable error.
+ group_id := data.semconv.baseline_group_ids_by_attribute[attr.name]
+ description := sprintf("Enum '%s' had stable value '%s', but is now '%s'", [attr.name, member.value, nmember.value])
+}
+
+# Rule: Detect Stable Enum members missing
+#
+# This rule checks for enum values that were stable in the baseline registry
+# but are no longer have the same values in the current registry. Once stable,
+# enum values remain forever but may be deprecated.
+deny contains back_comp_violation(description, group_id, attr.name) if {
+ # Find data we need to enforce: Enums in baseline/current.
+ some attr in baseline_attributes
+ attr.stability == "stable"
+ some nattr in registry_attributes
+ attr.name == nattr.name
+ is_enum(attr)
+ current_member_ids := {member.id | some member in nattr.type.members}
+ # Enforce the policy
+ some member in attr.type.members
+ not current_member_ids[member.id]
+
+ # Generate human readable error.
+ group_id := data.semconv.baseline_group_ids_by_attribute[attr.name]
+ description := sprintf("Enum '%s' had member '%s', but is no longer defined", [attr.name, member.id])
+}
+
+# Rule: Detect Removed Metrics
+#
+# This rule checks for stable metrics that existed in the baseline registry
+# but are no longer present in the current registry. Removing attributes
+# is considered a backward compatibility violation.
+#
+# In other words, we do not allow the removal of an attribute once added
+# to the registry. It must exist SOMEWHERE in a group, but may be deprecated.
+deny contains back_comp_violation(description, group_id, "") if {
+ # Find data we need to enforce
+ some metric in baseline_metrics
+ metric.stability == "stable"
+ # Enforce the policy
+ not registry_metric_names[metric.metric_name]
+
+ # Generate human readable error.
+ group_id := metric.id
+ description := sprintf("Metric '%s' no longer exists in semantic conventions", [metric.metric_name])
+}
+
+# Rule: Stable metrics cannot become unstable
+#
+# This rule checks that stable metrics cannot have their stability level changed.
+deny contains back_comp_violation(description, group_id, "") if {
+ # Find data we need to enforce
+ some metric in baseline_metrics
+ metric.stability == "stable"
+ some nmetric in registry_metrics
+ metric.metric_name = nmetric.metric_name
+ # Enforce the policy
+ nmetric.stability != "stable"
+
+ # Generate human readable error.
+ group_id := metric.id
+ description := sprintf("Metric '%s' cannot change from stable", [metric.metric_name])
+}
+
+# Rule: Stable metrics units cannot change
+#
+# This rule checks that stable metrics cannot change the unit type.
+deny contains back_comp_violation(description, group_id, "") if {
+ # Find data we need to enforce
+ some metric in baseline_metrics
+ metric.stability == "stable"
+ some nmetric in registry_metrics
+ metric.metric_name = nmetric.metric_name
+ # Enforce the policy
+ nmetric.unit != metric.unit
+
+ # Generate human readable error.
+ group_id := metric.id
+ description := sprintf("Metric '%s' cannot change unit (was '%s', now: '%s')", [metric.metric_name, metric.unit, nmetric.unit])
+}
+
+# Rule: Stable Metric instruments cannot change
+#
+# This rule checks that stable metrics cannot change the instrument type.
+deny contains back_comp_violation(description, group_id, "") if {
+ # Find data we need to enforce
+ some metric in baseline_metrics
+ metric.stability == "stable"
+ some nmetric in registry_metrics
+ metric.metric_name = nmetric.metric_name
+ # Enforce the policy
+ nmetric.instrument != metric.instrument
+
+ # Generate human readable error.
+ group_id := metric.id
+ description := sprintf("Metric '%s' cannot change instrument (was '%s', now: '%s')", [metric.metric_name, metric.instrument, nmetric.instrument])
+}
+
+# Rule: Stable Metric required/recommended attributes cannot change - missing
+#
+# This rule checks that stable metrics have stable sets of attributes.
+deny contains back_comp_violation(description, group_id, "") if {
+ # Find data we need to enforce
+ some metric in baseline_metrics
+ metric.stability == "stable"
+ some nmetric in registry_metrics
+ metric.metric_name = nmetric.metric_name
+
+ baseline_attributes := { attr.name |
+ some attr in metric.attributes
+ not is_opt_in(attr)
+ }
+ new_attributes := { attr.name |
+ some attr in nmetric.attributes
+ not is_opt_in(attr)
+ }
+ missing_attributes := baseline_attributes - new_attributes
+ # Enforce the policy
+ count(missing_attributes) > 0
+
+ # Generate human readable error.
+ group_id := metric.id
+ description := sprintf("Metric '%s' cannot change required/recommended attributes (missing '%s')", [metric.metric_name, missing_attributes])
+}
+
+# Rule: Stable Metric required/recommended attributes cannot change - added
+#
+# This rule checks that stable metrics have stable sets of attributes.
+deny contains back_comp_violation(description, group_id, "") if {
+ # Find data we need to enforce
+ some metric in baseline_metrics
+ metric.stability == "stable"
+ some nmetric in registry_metrics
+ metric.metric_name = nmetric.metric_name
+
+ baseline_attributes := { attr.name |
+ some attr in metric.attributes
+ not is_opt_in(attr)
+ }
+ new_attributes := { attr.name |
+ some attr in nmetric.attributes
+ not is_opt_in(attr)
+ }
+ added_attributes := new_attributes - baseline_attributes
+ # Enforce the policy
+ count(added_attributes) > 0
+
+ # Generate human readable error.
+ group_id := metric.id
+ description := sprintf("Metric '%s' cannot change required/recommended attributes (added '%s')", [metric.metric_name, added_attributes])
+}
+
+
+# Rule: Detect Removed Resources
+#
+# This rule checks for stable resources that existed in the baseline registry
+# but are no longer present in the current registry. Removing resources
+# is considered a backward compatibility violation.
+#
+# In other words, we do not allow the removal of a resource once added
+# to the registry. It must exist SOMEWHERE, but may be deprecated.
+deny contains back_comp_violation(description, group_id, "") if {
+ # Find data we need to enforce
+ some resource in baseline_resources
+ resource.stability == "stable"
+ # Enforce the policy
+ not registry_resource_names[resource.name]
+
+ # Generate human readable error.
+ group_id := resource.id
+ description := sprintf("Resource '%s' no longer exists in semantic conventions", [resource.name])
+}
+
+# Rule: Stable resources cannot become unstable
+#
+# This rule checks that stable resources cannot have their stability level changed.
+deny contains back_comp_violation(description, group_id, "") if {
+ # Find data we need to enforce
+ some resource in baseline_resources
+ resource.stability == "stable"
+ some nresource in registry_resources
+ resource.name = nresource.name
+ # Enforce the policy
+ nresource.stability != "stable"
+
+ # Generate human readable error.
+ group_id := resource.id
+ description := sprintf("Resource '%s' cannot change from stable", [resource.name])
+}
+
+# Rule: Stable Resource required/recommended attributes cannot be dropped.
+#
+# This rule checks that stable resources have stable sets of attributes.
+deny contains back_comp_violation(description, group_id, "") if {
+ # Find data we need to enforce
+ some resource in baseline_resources
+ resource.stability == "stable"
+ some nresource in registry_resources
+ resource.name = nresource.name
+
+ baseline_attributes := { attr.name |
+ some attr in resource.attributes
+ not is_opt_in(attr)
+ }
+ new_attributes := { attr.name |
+ some attr in nresource.attributes
+ not is_opt_in(attr)
+ }
+ missing_attributes := baseline_attributes - new_attributes
+ # Enforce the policy
+ count(missing_attributes) > 0
+
+ # Generate human readable error.
+ group_id := resource.id
+ description := sprintf("Resource '%s' cannot remove required/recommended attributes (missing '%s')", [resource.name, missing_attributes])
+}
+
+
+# Helper Function: Create Backward Compatibility Violation Object
+#
+# This function generates a structured violation object for each
+# detected backward compatibility issue.
+back_comp_violation(description, group_id, attr_id) := violation if {
+ violation := {
+ "id": description,
+ "type": "semconv_attribute",
+ "category": "backward_compatibility",
+ "group": group_id,
+ "attr": attr_id,
+ }
+}
+
+# Helpers for enum values and type strings
+is_enum(attr) := true if count(attr.type.members) > 0
+type_string(attr) := attr.type if not is_enum(attr)
+type_string(attr) := "enum" if is_enum(attr)
+is_opt_in(attr) := true if attr.requirement_level == "opt_in"
diff --git a/policies/registry.rego b/policies/registry.rego
index a1925c0887..da1a5f4b0d 100644
--- a/policies/registry.rego
+++ b/policies/registry.rego
@@ -38,7 +38,7 @@ deny[attr_registry_violation(description, group.id, attr.id)] {
# TODO (https://github.com/open-telemetry/weaver/issues/279): provide other violation properties once weaver supports it.
# violation_id := "attributes_must_be_defined_in_attribute_registry"
- description := sprintf("Attribute '%s' is defined in the group '%s' which is not part of the attribute registy. Attributes can be defined in the registry group only.", [attr_name, group.id])
+ description := sprintf("Attribute '%s' is defined in the group '%s' which is not part of the attribute registry. Attributes can be defined in the registry group only.", [attr_name, group.id])
}
# A registry `attribute_group` containing at least one `ref` attribute is
@@ -52,7 +52,7 @@ deny[attr_registry_violation(description, group.id, attr.ref)] {
# TODO (https://github.com/open-telemetry/weaver/issues/279): provide other violation properties once weaver supports it.
# violation_id := "attributes_in_registry_cannot_reference_each_other"
- description := sprintf("Registy group '%s' references attribute '%s'. Registry groups can only define new attributes.", [group.id, attr.ref])
+ description := sprintf("Registry group '%s' references attribute '%s'. Registry groups can only define new attributes.", [group.id, attr.ref])
}
get_attribute_name(attr, group) = name {
diff --git a/policies/yaml_schema.rego b/policies/yaml_schema.rego
index 0d8cad7dd3..4d09e4d594 100644
--- a/policies/yaml_schema.rego
+++ b/policies/yaml_schema.rego
@@ -1,5 +1,96 @@
package before_resolution
+# checks attribute name format
+deny[yaml_schema_violation(description, group.id, name)] {
+ group := input.groups[_]
+ attr := group.attributes[_]
+ name := attr.id
+
+ not regex.match(name_regex, name)
+
+ description := sprintf("Attribute name '%s' is invalid. Attribute name %s", [name, invalid_name_helper])
+}
+
+# checks attribute name has a namespace
+deny[yaml_schema_violation(description, group.id, name)] {
+ group := input.groups[_]
+ attr := group.attributes[_]
+ name := attr.id
+
+ # some deprecated attributes have no namespace and need to be ignored
+ not attr.deprecated
+ not regex.match(has_namespace_regex, name)
+
+ description := sprintf("Attribute name '%s' should have a namespace. Attribute name %s", [name, invalid_name_helper])
+}
+
+
+# checks metric name format
+deny[yaml_schema_violation(description, group.id, name)] {
+ group := input.groups[_]
+ name := group.metric_name
+
+ name != null
+ not regex.match(name_regex, name)
+
+ description := sprintf("Metric name '%s' is invalid. Metric name %s'", [name, invalid_name_helper])
+}
+
+# checks event name format
+deny[yaml_schema_violation(description, group.id, name)] {
+ group := input.groups[_]
+ group.type == "event"
+ name := group.name
+
+ name != null
+ not regex.match(name_regex, name)
+
+ description := sprintf("Event name '%s' is invalid. Event name %s'", [name, invalid_name_helper])
+}
+
+# require resources have names
+deny[yaml_schema_violation(description, group.id, "")] {
+ group := input.groups[_]
+ group.type == "resource"
+ group.name == null
+ description := sprintf("Resource id '%s' is invalid. Resource must have name.", [group.id])
+}
+
+# checks resource name format
+deny[yaml_schema_violation(description, group.id, name)] {
+ group := input.groups[_]
+ group.type == "resource"
+ name := group.name
+
+ name != null
+ not regex.match(name_regex, name)
+
+ description := sprintf("Resource name '%s' is invalid. Resource name %s'", [name, invalid_name_helper])
+}
+
+# checks attribute member id format
+deny[yaml_schema_violation(description, group.id, attr_name)] {
+ group := input.groups[_]
+ attr := group.attributes[_]
+ attr_name := attr.id
+ name := attr.type.members[_].id
+
+ not regex.match(name_regex, name)
+
+ description := sprintf("Member id '%s' on attribute '%s' is invalid. Member id %s'", [name, attr_name, invalid_name_helper])
+}
+
+# check that attribute is fully qualified with their id, prefix is no longer supported
+deny[yaml_schema_violation(description, group.id, "")] {
+ group := input.groups[_]
+
+ group.prefix != null
+ group.prefix != ""
+
+ # TODO (https://github.com/open-telemetry/weaver/issues/279): provide other violation properties once weaver supports it.
+ description := sprintf("Group '%s' uses prefix '%s'. All attribute should be fully qualified with their id, prefix is no longer supported.", [group.id, group.prefix])
+}
+
yaml_schema_violation(description, group, attr) = violation {
violation := {
"id": description,
@@ -10,12 +101,10 @@ yaml_schema_violation(description, group, attr) = violation {
}
}
-deny[yaml_schema_violation(description, group.id, "")] {
- group := input.groups[_]
+# not valid: '1foo.bar', 'foo.bar.', 'foo.bar_', 'foo..bar', 'foo._bar' ...
+# valid: 'foo.bar', 'foo.1bar', 'foo.1_bar'
+name_regex := "^[a-z][a-z0-9]*([._][a-z0-9]+)*$"
- group.prefix != null
- group.prefix != ""
+has_namespace_regex := "^[a-z0-9_]+\\.([a-z0-9._]+)+$"
- # TODO (https://github.com/open-telemetry/weaver/issues/279): provide other violation properties once weaver supports it.
- description := sprintf("Group '%s' uses prefix '%s'. All attribute should be fully qualified with their id, prefix is no longer supported.", [group.id, group.prefix])
-}
+invalid_name_helper := "must consist of lowercase alphanumeric characters separated by '_' and '.'"
diff --git a/policies/yaml_schema_test.rego b/policies/yaml_schema_test.rego
new file mode 100644
index 0000000000..4a506835e7
--- /dev/null
+++ b/policies/yaml_schema_test.rego
@@ -0,0 +1,85 @@
+package before_resolution
+
+import future.keywords
+
+test_fails_on_invalid_attribute_name if {
+ every name in invalid_names {
+ count(deny) >= 1 with input as {"groups": create_attribute_group(name)}
+ }
+}
+
+test_fails_on_attribute_name_without_namespace if {
+ count(deny) >= 1 with input as {"groups": create_attribute_group("foo")}
+}
+
+test_fails_on_invalid_metric_name if {
+ every name in invalid_names {
+ count(deny) >= 1 with input as {"groups": create_metric(name)}
+ }
+}
+
+test_fails_on_invalid_event_name if {
+ every name in invalid_names {
+ count(deny) >= 1 with input as {"groups": create_event(name)}
+ }
+}
+
+test_fails_on_invalid_resource_name if {
+ every name in invalid_names {
+ count(deny) >= 1 with input as {"groups": create_resource(name)}
+ }
+}
+
+test_fails_on_missing_resource_name if {
+ count(deny) >= 1 with input as {"groups": [{"id": "yaml_schema.test", "type": "resource", "name": null}]}
+}
+
+test_passes_on_valid_names if {
+ every name in valid_names {
+ count(deny) == 0 with input as {"groups": create_attribute_group(name)}
+ count(deny) == 0 with input as {"groups": create_metric(name)}
+ count(deny) == 0 with input as {"groups": create_event(name)}
+ }
+}
+
+test_fails_if_prefix_is_present if {
+ count(deny) == 1 with input as {"groups": [{"id": "test", "prefix": "foo"}]}
+}
+
+create_attribute_group(attr) = json {
+ json := [{"id": "yaml_schema.test", "attributes": [{"id": attr}]}]
+}
+
+create_metric(name) = json {
+ json := [{"id": "yaml_schema.test", "type": "metric", "metric_name": name}]
+}
+
+create_event(name) = json {
+ json := [{"id": "yaml_schema.test", "type": "event", "name": name}]
+}
+
+create_resource(name) = json {
+ json := [{"id": "yaml_schema.test", "type": "resource", "name": name}]
+}
+
+invalid_names := [
+ "1foo.bar",
+ "_foo.bar",
+ ".foo.bar",
+ "foo.bar_",
+ "foo.bar.",
+ "foo..bar",
+ "foo._bar",
+ "foo.bar__baz",
+ "foo_.bar",
+ "foo.bar,baz",
+ "fü.bär",
+]
+
+valid_names := [
+ "foo.bar",
+ "foo.1bar",
+ "foo_1.bar",
+ "foo.bar.baz",
+ "foo.bar_baz",
+]
diff --git a/policies_test/compatibility_test.rego b/policies_test/compatibility_test.rego
new file mode 100644
index 0000000000..a2883ae234
--- /dev/null
+++ b/policies_test/compatibility_test.rego
@@ -0,0 +1,762 @@
+package comparison_after_resolution
+
+import future.keywords.if
+
+# Check that attributes cannot be removed.
+test_removed_attributes if {
+ count(deny) > 0 with data.semconv as {
+ "registry_baseline_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing"
+ }]
+ }],
+ "baseline_group_ids_by_attribute": {
+ "test.missing": "registry.test"
+ }
+ }
+ count(deny) == 0 with data.semconv as {
+ "registry_baseline_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing"
+ }]
+ }],
+ "registry_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing"
+ }]
+ }],
+ "baseline_group_ids_by_attribute": {
+ "test.missing": "registry.test"
+ }
+ }
+}
+
+# Check that attributes cannot change stability
+test_attribute_stability_change if {
+ count(deny) > 0 with data.semconv as {
+ "registry_baseline_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ }]
+ }],
+ "registry_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "experimental",
+ }]
+ }],
+ "baseline_group_ids_by_attribute": {
+ "test.missing": "registry.test"
+ }
+ }
+ count(deny) == 0 with data.semconv as {
+ "registry_baseline_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ }]
+ }],
+ "registry_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ }]
+ }],
+ "baseline_group_ids_by_attribute": {
+ "test.missing": "registry.test"
+ }
+ }
+}
+
+# Check stable attribute changing type
+test_attribute_type_change if {
+ count(deny) > 0 with data.semconv as {
+ "registry_baseline_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ "type": "int",
+ }]
+ }],
+ "registry_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ "type": "string",
+ }]
+ }],
+ "baseline_group_ids_by_attribute": {
+ "test.missing": "registry.test"
+ }
+ }
+ count(deny) == 0 with data.semconv as {
+ "registry_baseline_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ "type": "string",
+ }]
+ }],
+ "registry_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ "type": "string",
+ }]
+ }],
+ "baseline_group_ids_by_attribute": {
+ "test.missing": "registry.test"
+ }
+ }
+}
+# Check stable attribute enum type
+test_attribute_enum_type_change if {
+ count(deny) > 0 with data.semconv as {
+ "registry_baseline_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ "type": {
+ "members": [{
+ "id": "test",
+ "value": "test",
+ }]
+ },
+ }]
+ }],
+ "registry_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ "type": "string",
+ }]
+ }],
+ "baseline_group_ids_by_attribute": {
+ "test.missing": "registry.test"
+ }
+ }
+ count(deny) == 0 with data.semconv as {
+ "registry_baseline_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ "type": {
+ "members": [{
+ "id": "test",
+ "value": "test",
+ }]
+ },
+ }]
+ }],
+ "registry_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ "type": {
+ "members": [{
+ "id": "test",
+ "value": "test",
+ }]
+ },
+ }]
+ }],
+ "baseline_group_ids_by_attribute": {
+ "test.missing": "registry.test"
+ }
+ }
+}
+
+# Check stable attribute enum members changing to nonstable
+test_attribute_enum_member_stability_change if {
+ count(deny) > 0 with data.semconv as {
+ "registry_baseline_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ "type": {
+ "members": [{
+ "id": "test",
+ "value": "test",
+ "stability": "stable",
+ }]
+ },
+ }]
+ }],
+ "registry_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ "type": {
+ "members": [{
+ "id": "test",
+ "value": "test",
+ "stability": "experimental",
+ }]
+ },
+ }]
+ }],
+ "baseline_group_ids_by_attribute": {
+ "test.missing": "registry.test"
+ }
+ }
+ count(deny) == 0 with data.semconv as {
+ "registry_baseline_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ "type": {
+ "members": [{
+ "id": "test",
+ "value": "test",
+ "stability": "stable",
+ }]
+ },
+ }]
+ }],
+ "registry_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ "type": {
+ "members": [{
+ "id": "test",
+ "value": "test",
+ "stability": "stable",
+ }]
+ },
+ }]
+ }],
+ "baseline_group_ids_by_attribute": {
+ "test.missing": "registry.test"
+ }
+ }
+}
+
+# Check stable attribute enum member values changing
+test_attribute_enum_member_value_change if {
+ count(deny) > 0 with data.semconv as {
+ "registry_baseline_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ "type": {
+ "members": [{
+ "id": "test",
+ "value": "test",
+ "stability": "stable",
+ }]
+ },
+ }]
+ }],
+ "registry_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ "type": {
+ "members": [{
+ "id": "test",
+ "value": "changed",
+ "stability": "stable",
+ }]
+ },
+ }]
+ }],
+ "baseline_group_ids_by_attribute": {
+ "test.missing": "registry.test"
+ }
+ }
+ count(deny) == 0 with data.semconv as {
+ "registry_baseline_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ "type": {
+ "members": [{
+ "id": "test",
+ "value": "test",
+ "stability": "stable",
+ }]
+ },
+ }]
+ }],
+ "registry_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ "type": {
+ "members": [{
+ "id": "test",
+ "value": "test",
+ "stability": "stable",
+ }]
+ },
+ }]
+ }],
+ "baseline_group_ids_by_attribute": {
+ "test.missing": "registry.test"
+ }
+ }
+}
+
+# Check stable attribute enum member values changing
+test_attribute_enum_member_missing if {
+ count(deny) > 0 with data.semconv as {
+ "registry_baseline_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ "type": {
+ "members": [{
+ "id": "test",
+ "value": "test",
+ "stability": "stable",
+ }, {
+ "id": "missing",
+ "value": "missing",
+ "stability": "stable",
+ }]
+ },
+ }]
+ }],
+ "registry_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ "type": {
+ "members": [{
+ "id": "test",
+ "value": "changed",
+ "stability": "stable",
+ }]
+ },
+ }]
+ }],
+ "baseline_group_ids_by_attribute": {
+ "test.missing": "registry.test"
+ }
+ }
+ count(deny) == 0 with data.semconv as {
+ "registry_baseline_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ "type": {
+ "members": [{
+ "id": "test",
+ "value": "test",
+ "stability": "stable",
+ }, {
+ "id": "missing",
+ "value": "missing",
+ "stability": "stable",
+ }]
+ },
+ }]
+ }],
+ "registry_groups": [{
+ "id": "registry.test",
+ "type": "attribute_group",
+ "attributes": [{
+ "name": "test.missing",
+ "stability": "stable",
+ "type": {
+ "members": [{
+ "id": "test",
+ "value": "test",
+ "stability": "stable",
+ }, {
+ "id": "missing",
+ "value": "missing",
+ "stability": "stable",
+ }]
+ },
+ }]
+ }],
+ "baseline_group_ids_by_attribute": {
+ "test.missing": "registry.test"
+ }
+ }
+}
+
+# Check that metrics cannot be removed.
+test_removed_metrics if {
+ count(deny) > 0 with data.semconv as {
+ "baseline_groups": [{
+ "id": "metric.test",
+ "type": "metric",
+ "metric_name": "test.missing",
+ "stability": "stable",
+ }],
+ }
+ count(deny) == 0 with data.semconv as {
+ "baseline_groups": [{
+ "id": "metric.test",
+ "type": "metric",
+ "metric_name": "test.missing",
+ "stability": "stable",
+ }],
+ "groups": [{
+ "id": "metric.test",
+ "type": "metric",
+ "metric_name": "test.missing",
+ "stability": "stable",
+ }]
+ }
+}
+
+# Check that Stable metrics cannot become unstable
+test_metric_stability_change if {
+ count(deny) > 0 with data.semconv as {
+ "baseline_groups": [{
+ "id": "metric.test",
+ "type": "metric",
+ "metric_name": "test.missing",
+ "stability": "stable",
+ }],
+ "groups": [{
+ "id": "metric.test",
+ "type": "metric",
+ "metric_name": "test.missing",
+ "stability": "experimental",
+ }]
+ }
+ count(deny) == 0 with data.semconv as {
+ "baseline_groups": [{
+ "id": "metric.test",
+ "type": "metric",
+ "metric_name": "test.missing",
+ "stability": "stable",
+ }],
+ "groups": [{
+ "id": "metric.test",
+ "type": "metric",
+ "metric_name": "test.missing",
+ "stability": "stable",
+ }]
+ }
+}
+
+# Check that Stable metrics cannot change unit
+test_metric_unit_change if {
+ count(deny) > 0 with data.semconv as {
+ "baseline_groups": [{
+ "id": "metric.test",
+ "type": "metric",
+ "metric_name": "test.missing",
+ "stability": "stable",
+ "unit": "s",
+ }],
+ "groups": [{
+ "id": "metric.test",
+ "type": "metric",
+ "metric_name": "test.missing",
+ "stability": "stable",
+ "unit": "ms",
+ }]
+ }
+ count(deny) == 0 with data.semconv as {
+ "baseline_groups": [{
+ "id": "metric.test",
+ "type": "metric",
+ "metric_name": "test.missing",
+ "stability": "stable",
+ "unit": "s",
+ }],
+ "groups": [{
+ "id": "metric.test",
+ "type": "metric",
+ "metric_name": "test.missing",
+ "stability": "stable",
+ "unit": "s",
+ }]
+ }
+}
+
+# Check that Stable metrics cannot change unit
+test_metric_instrument_change if {
+ count(deny) > 0 with data.semconv as {
+ "baseline_groups": [{
+ "id": "metric.test",
+ "type": "metric",
+ "metric_name": "test.missing",
+ "stability": "stable",
+ "unit": "s",
+ "instrument": "histogram",
+ }],
+ "groups": [{
+ "id": "metric.test",
+ "type": "metric",
+ "metric_name": "test.missing",
+ "stability": "stable",
+ "unit": "s",
+ "instrument": "gauge",
+ }]
+ }
+ count(deny) == 0 with data.semconv as {
+ "baseline_groups": [{
+ "id": "metric.test",
+ "type": "metric",
+ "metric_name": "test.missing",
+ "stability": "stable",
+ "unit": "s",
+ "instrument": "histogram",
+ }],
+ "groups": [{
+ "id": "metric.test",
+ "type": "metric",
+ "metric_name": "test.missing",
+ "stability": "stable",
+ "unit": "s",
+ "instrument": "histogram",
+ }]
+ }
+}
+
+# Check that Stable metrics cannot change required/recommended attributes
+test_metric_attribute_missing if {
+ count(deny) > 0 with data.semconv as {
+ "baseline_groups": [{
+ "id": "metric.test",
+ "type": "metric",
+ "metric_name": "test.missing",
+ "stability": "stable",
+ "unit": "s",
+ "instrument": "histogram",
+ "attributes": [{
+ "name": "test.missing",
+ "requirement_level": "required"
+ }],
+ }],
+ "groups": [{
+ "id": "metric.test",
+ "type": "metric",
+ "metric_name": "test.missing",
+ "stability": "stable",
+ "unit": "s",
+ "instrument": "gauge",
+ }]
+ }
+ count(deny) == 0 with data.semconv as {
+ "baseline_groups": [{
+ "id": "metric.test",
+ "type": "metric",
+ "metric_name": "test.missing",
+ "stability": "stable",
+ "unit": "s",
+ "instrument": "histogram",
+ "attributes": [{
+ "name": "test.missing",
+ "requirement_level": "required"
+ },{
+ "name": "test.ignored",
+ "requirement_level": "opt_in"
+ }],
+ }],
+ "groups": [{
+ "id": "metric.test",
+ "type": "metric",
+ "metric_name": "test.missing",
+ "stability": "stable",
+ "unit": "s",
+ "instrument": "histogram",
+ "attributes": [{
+ "name": "test.missing",
+ "requirement_level": "required"
+ }],
+ }]
+ }
+}
+
+# Check that Stable metrics cannot change required/recommended attributes
+test_metric_attribute_added if {
+ count(deny) > 0 with data.semconv as {
+ "baseline_groups": [{
+ "id": "metric.test",
+ "type": "metric",
+ "metric_name": "test.missing",
+ "stability": "stable",
+ "unit": "s",
+ "instrument": "histogram",
+ "attributes": [{
+ "name": "test.missing",
+ "requirement_level": "required"
+ }],
+ }],
+ "groups": [{
+ "id": "metric.test",
+ "type": "metric",
+ "metric_name": "test.missing",
+ "stability": "stable",
+ "unit": "s",
+ "instrument": "gauge",
+ "attributes": [{
+ "name": "test.missing",
+ "requirement_level": "required"
+ }, {
+ "name": "test.added",
+ "requirement_level": "required"
+ }],
+ }]
+ }
+}
+
+# Check that resources cannot be removed.
+test_removed_resources if {
+ count(deny) > 0 with data.semconv as {
+ "baseline_groups": [{
+ "id": "resource.test",
+ "type": "resource",
+ "name": "test.missing",
+ "stability": "stable",
+ }],
+ }
+ count(deny) == 0 with data.semconv as {
+ "baseline_groups": [{
+ "id": "resource.test",
+ "type": "resource",
+ "name": "test.missing",
+ "stability": "stable",
+ }],
+ "groups": [{
+ "id": "resource.test",
+ "type": "resource",
+ "name": "test.missing",
+ "stability": "stable",
+ }]
+ }
+}
+
+# Check that Stable resources cannot become unstable
+test_resource_stability_change if {
+ count(deny) > 0 with data.semconv as {
+ "baseline_groups": [{
+ "id": "resource.test",
+ "type": "resource",
+ "name": "test.missing",
+ "stability": "stable",
+ }],
+ "groups": [{
+ "id": "resource.test",
+ "type": "resource",
+ "name": "test.missing",
+ "stability": "experimental",
+ }]
+ }
+ count(deny) == 0 with data.semconv as {
+ "baseline_groups": [{
+ "id": "resource.test",
+ "type": "resource",
+ "name": "test.missing",
+ "stability": "stable",
+ }],
+ "groups": [{
+ "id": "resource.test",
+ "type": "resource",
+ "name": "test.missing",
+ "stability": "stable",
+ }]
+ }
+}
+
+
+# Check that Stable resources cannot change required/recommended attributes
+test_resource_attribute_missing if {
+ count(deny) > 0 with data.semconv as {
+ "baseline_groups": [{
+ "id": "resource.test",
+ "type": "resource",
+ "name": "test.missing",
+ "stability": "stable",
+ "attributes": [{
+ "name": "test.missing",
+ "requirement_level": "required"
+ }],
+ }],
+ "groups": [{
+ "id": "resource.test",
+ "type": "resource",
+ "name": "test.missing",
+ "stability": "stable",
+ }]
+ }
+ count(deny) == 0 with data.semconv as {
+ "baseline_groups": [{
+ "id": "resource.test",
+ "type": "resource",
+ "name": "test.missing",
+ "stability": "stable",
+ "attributes": [{
+ "name": "test.missing",
+ "requirement_level": "required"
+ },{
+ "name": "test.ignored",
+ "requirement_level": "opt_in"
+ }],
+ }],
+ "groups": [{
+ "id": "resource.test",
+ "type": "resource",
+ "name": "test.missing",
+ "stability": "stable",
+ "unit": "s",
+ "instrument": "histogram",
+ "attributes": [{
+ "name": "test.missing",
+ "requirement_level": "required"
+ }],
+ }]
+ }
+}
diff --git a/policies/registry_test.rego b/policies_test/registry_test.rego
similarity index 91%
rename from policies/registry_test.rego
rename to policies_test/registry_test.rego
index 4880af7b0f..72d042e6e9 100644
--- a/policies/registry_test.rego
+++ b/policies_test/registry_test.rego
@@ -11,10 +11,10 @@ test_registry_attribute_groups if {
test_attribute_ids if {
# This requires a prefix for use with opa, but weaver will fill in.
- count(before_resolution.deny) > 0 with input as {"groups": [{"id": "not_registry", "prefix": "", "attributes": [{"id": "foo"}]}]}
+ count(before_resolution.deny) > 0 with input as {"groups": [{"id": "not_registry", "prefix": "", "attributes": [{"id": "foo.bar"}]}]}
count(before_resolution.deny) == 0 with input as {"groups": [
- {"id": "registry.test", "prefix": "", "attributes": [{"id": "foo"}]},
- {"id": "not_registry", "prefix": "", "attributes": [{"ref": "foo"}]},
+ {"id": "registry.test", "prefix": "", "attributes": [{"id": "foo.bar"}]},
+ {"id": "not_registry", "prefix": "", "attributes": [{"ref": "foo.bar"}]},
]}
}
diff --git a/templates/registry/markdown/resource_macros.j2 b/templates/registry/markdown/resource_macros.j2
new file mode 100644
index 0000000000..3daa7f1d4d
--- /dev/null
+++ b/templates/registry/markdown/resource_macros.j2
@@ -0,0 +1,9 @@
+{#- Macros for simplifying creating "Resource" documentation. -#}
+{% import 'stability.j2' as stability %}
+{% macro header(resource) %}
+**Status:** {{ stability.badge(resource.stability, resource.deprecated) }}
+
+**type:** `{{ resource.name }}`
+
+**Description:** {{ resource.brief }}
+{% endmacro %}
\ No newline at end of file
diff --git a/templates/registry/markdown/snippet.md.j2 b/templates/registry/markdown/snippet.md.j2
index cc9bf6d89c..3bf85fc194 100644
--- a/templates/registry/markdown/snippet.md.j2
+++ b/templates/registry/markdown/snippet.md.j2
@@ -3,8 +3,8 @@
-{% import 'attribute_table.j2' as at %}{% import 'metric_table.j2' as mt %}{% import 'event_macros.j2' as event %}
-{% if snippet_type == "metric_table" %}{{ mt.generate(group) }}{% else %}{% if group.type == "event" %}{{ event.header(group) }}{% endif %}{{ at.generate(group.attributes, tag_filter, attribute_registry_base_url, group.lineage.attributes) }}{% endif %}
+{% import 'attribute_table.j2' as at %}{% import 'metric_table.j2' as mt %}{% import 'event_macros.j2' as event %}{% import 'resource_macros.j2' as resource %}
+{% if group.type == "event" %}{{ event.header(group) }}{% elif group.type == "resource" %}{{ resource.header(group) }}{% elif group.type=="metric" %}{{ mt.generate(group) }}{% endif %}{{ at.generate(group.attributes, tag_filter, attribute_registry_base_url, group.lineage.attributes) }}
\ No newline at end of file
diff --git a/templates/registry/markdown/weaver.yaml b/templates/registry/markdown/weaver.yaml
index f0d8849c7f..ef9bc5c120 100644
--- a/templates/registry/markdown/weaver.yaml
+++ b/templates/registry/markdown/weaver.yaml
@@ -7,25 +7,26 @@ templates:
application_mode: each
acronyms:
- AI
- - iOS
- AWS
- CICD
- CloudEvents
+ - CLR
- CPU
- - CosmosDB
+ - CSI
- DynamoDB
- ECS
- EKS
- - GraphQL
- - GCP
- GCE
+ - GCP
+ - GraphQL
- HTTP
+ - iOS
- JVM
- NodeJS
- OCI
- - OTel
- OpenTracing
- OS
+ - OTel
- RabbitMQ
- RocketMQ
- RPC