microsoft/telemetry-foundations
Declarative OpenTelemetry-aligned telemetry vocabulary and instrumentation conventions for traces, metrics, logs, and PII handling
npx skills add https://github.com/microsoft/hve-core --skill telemetry-foundations
A shared vocabulary for observability across HVE Core agents. This skill describes *what* telemetry data exists and *how it is named*, not which SDK or vendor to use. Agents producing planning artifacts (ADRs, PRDs, security/RAI plans, code-review reports) and agents producing user-facing application code reference this skill so that downstream pipelines (traces, metrics, logs) speak a consistent OpenTelemetry-aligned language.
Apply this skill in the following situations:
The vocabulary in this skill follows five principles:
Spans describe a unit of work and its causal relationship to other work.
Span kinds:
server - inbound request handled by this service.client - outbound request issued by this service.producer - asynchronous message published to a queue or topic.consumer - asynchronous message received from a queue or topic.internal - in-process operation with no remote peer.Required resource-scoped attributes on every span:
service.nameservice.versiondeployment.environmentSpan naming pattern: <verb>.<resource> using lowercase dot-separated tokens. The verb describes the operation (get, create, publish, consume, query); the resource describes the target entity (order, customer, payment.intent). Examples: get.order, publish.order.created, query.customer.by_email.
For domains covered by OTel semantic conventions (HTTP, RPC, database, messaging, GenAI, FaaS), use the convention's span-naming guidance instead of the generic pattern above.
Metrics describe aggregate measurements over time.
Instrument types:
counter - monotonic, additive (request count, bytes sent).up-down-counter - non-monotonic, additive (queue depth, active connections).histogram - distribution of values (request duration, payload size).gauge - last-sampled value, non-additive (CPU temperature, memory in use).observable-counter, observable-up-down-counter, observable-gauge - async variants polled by the SDK.Unit conventions follow UCUM. Examples: s (seconds), ms (milliseconds), By (bytes), 1 (dimensionless count). Express durations as histograms in seconds (s) by default to align with OTel HTTP semantic conventions.
Metric naming pattern: <domain>.<entity>.<measure> using lowercase dot-separated tokens. Examples: http.server.request.duration, db.client.connections.usage, messaging.publish.duration.
Cardinality discipline: every attribute attached to a metric multiplies the time-series count. Bound high-cardinality dimensions (user ID, request ID, free-form strings) at the source or move them to exemplars and traces.
Structured logs carry discrete events with severity and context.
Severity levels (OTel log data model):
TRACE - fine-grained diagnostic detail, off by default.DEBUG - diagnostic detail useful during development.INFO - normal operational events.WARN - unexpected condition that does not block the operation.ERROR - operation failed; the caller likely saw a failure.FATAL - process is going to terminate.Recommended structured fields on every log record:
timestamp (ISO-8601, UTC).severity_text and severity_number.body (the human-readable message; structured data goes in attributes).attributes.* (typed key-value pairs scoped to this event).resource.* (inherited from the producing service).Trace correlation: when a log record is emitted within an active span, inject trace_id and span_id so traces and logs join cleanly downstream. Logging libraries that integrate with the OTel context propagator do this automatically.
Personally Identifiable Information is handled by denylist. The authoritative list lives in references/pii-denylist.md. Treat any field on that list as default-deny: do not emit it as a span attribute, metric dimension, or log field without an explicit redaction strategy.
Redaction patterns:
Identifier convention: where a stable user reference is needed in telemetry, use user.id populated with an opaque hash of the canonical user identifier, never the raw email, phone, or external account ID.
When introducing a new attribute that could contain PII, add it to the denylist first and choose a redaction strategy before emitting it.
Sampling controls the volume of telemetry shipped to downstream collectors.
Sampling strategies:
Defaults:
Metric and log sampling: metrics are pre-aggregated and rarely sampled; logs are typically rate-limited per severity rather than sampled.
Resource attributes describe the entity producing the telemetry and are attached to every span, metric, and log record automatically by the SDK.
Required:
service.nameservice.versiondeployment.environmenttelemetry.sdk.nametelemetry.sdk.languagetelemetry.sdk.versionRecommended when applicable:
cloud.* (cloud provider, region, account ID).k8s.* (cluster name, namespace, pod name).host.* (hostname, architecture, OS type).Follow the OTel Resource Semantic Conventions for canonical attribute names.
Use this quick-select when choosing whether and how to instrument:
server, client, producer, or consumer kind and propagate context.Authoritative external sources:
Portions adapted from OpenTelemetry Semantic Conventions, (C) OpenTelemetry Authors, licensed under CC BY 4.0.
Internal:
Take microsoft/telemetry-foundations from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.