Metrics Semantic Conventions

Status: Mixed

The following semantic conventions surrounding metrics are defined:

Apart from semantic conventions for metrics, traces, logs, and events, OpenTelemetry also defines the concept of overarching Resources with their own Resource Semantic Conventions.

General Guidelines

Status: Experimental

When defining new metric names and attributes, consider the prior art of existing standard metrics and metrics from frameworks/libraries.

Associated metrics SHOULD be nested together in a hierarchy based on their usage. Define a top-level hierarchy for common metric categories: for OS metrics, like CPU and network; for app runtimes, like GC internals. Libraries and frameworks should nest their metrics into a hierarchy as well. This aids in discovery and adhoc comparison. This allows a user to find similar metrics given a certain metric.

The hierarchical structure of metrics defines the namespacing. Supporting OpenTelemetry artifacts define the metric structures and hierarchies for some categories of metrics, and these can assist decisions when creating future metrics.

Common attributes SHOULD be consistently named. This aids in discoverability and disambiguates similar attributes to metric names.

“As a rule of thumb, aggregations over all the attributes of a given metric SHOULD be meaningful,” as Prometheus recommends.

Semantic ambiguity SHOULD be avoided. Use prefixed metric names in cases where similar metrics have significantly different implementations across the breadth of all existing metrics. For example, every garbage collected runtime has slightly different strategies and measures. Using a single set of metric names for GC, not divided by the runtime, could create dissimilar comparisons and confusion for end users. (For example, prefer jvm.gc* over gc.*.) Measures of many operating system metrics are similarly ambiguous.

Metric names and attributes SHOULD follow the general naming guidelines.

Units

Conventional metrics or metrics that have their units included in OpenTelemetry metadata (e.g. metric.WithUnit in Go) SHOULD NOT include the units in the metric name. Units may be included when it provides additional meaning to the metric name. Metrics MUST, above all, be understandable and usable.

When building components that interoperate between OpenTelemetry and a system using the OpenMetrics exposition format, use the OpenMetrics Guidelines.

Instrument Units

Status: Stable

Units should follow the Unified Code for Units of Measure.

  • Instruments for utilization metrics (that measure the fraction out of a total) are dimensionless and SHOULD use the default unit 1 (the unity).
  • All non-units that use curly braces to annotate a quantity need to match the grammatical number of the quantity it represent. For example if measuring the number of individual requests to a process the unit would be {request}, not {requests}.
  • Instruments that measure an integer count of something SHOULD only use annotations with curly braces to give additional meaning without the leading default unit (1). For example, use {packet}, {error}, {fault}, etc.
  • Instrument units other than 1 and those that use annotations SHOULD be specified using the UCUM case sensitive (“c/s”) variant. For example, “Cel” for the unit with full name “degree Celsius”.
  • Instruments SHOULD use non-prefixed units (i.e. By instead of MiBy) unless there is good technical reason to not do so.
  • When instruments are measuring durations, seconds (i.e. s) SHOULD be used.

Instrument Types

Status: Stable

The semantic metric conventions specification is written to use the names of the synchronous instrument types, like Counter or UpDownCounter. However, compliant implementations MAY use the asynchronous equivalent instead, like Asynchronous Counter or Asynchronous UpDownCounter. Whether implementations choose the synchronous type or the asynchronous equivalent is considered to be an implementation detail. Both choices are compliant with this specification.

Consistent UpDownCounter timeseries

Status: Experimental

When recording UpDownCounter metrics, the same attribute values used to record an increment SHOULD be used to record any associated decrement, otherwise those increments and decrements will end up as different timeseries.

For example, if you are tracking active_requests with an UpDownCounter, and you are incrementing it each time a request starts and decrementing it each time a request ends, then any attributes which are not yet available when incrementing the counter at request start should not be used when decrementing the counter at request end.