What Is Governance via Schema URLs and Convention Versioning in OpenTelemetry?
A plain-language guide to how OpenTelemetry keeps the names inside your telemetry consistent, how it labels which version of those names is in use, and how teams change them without breaking dashboards and alerts.
Imagine fifty teams in one company, all measuring the same thing: how long a web request takes. One team names the measurement http.server.duration. Another calls it request_latency_ms. A third records it in seconds instead of milliseconds. Every team is doing a good job, yet nobody can build one dashboard that works for all of them. Alerts written for one team stay silent for another, and a simple question such as “which service is slowest?” needs a week of translating.
OpenTelemetry attacks this problem with two ideas. The first is a shared dictionary of names, called semantic conventions, so that everyone says http.request.method when they mean the HTTP method. The second is a label, called a schema URL, that travels with the data and says exactly which edition of the dictionary was used. Together with careful versioning rules, these ideas let a large organization change names over time without losing track of what anything means.
This guide explains both ideas from scratch, shows how the labels and versions work inside SDKs and Collectors, and then turns to the human side: how teams govern naming through reviews, automated checks, migration plans and rollout tracking. No prior knowledge of OpenTelemetry is needed. Each new term is explained when it first appears.
AThe Problem: Everyone Names Things Differently
Telemetry is only useful when different people can read it the same way. Names are the first thing that drifts.
What Telemetry Looks Like Up Close
Telemetry is the stream of data a running system produces about itself. It comes in three kinds, called signals: traces, which follow one request through many services; metrics, which are numbers measured over time; and logs, which are timestamped text records. Each piece of telemetry carries attributes, which are named labels such as the name of the service, the HTTP method used, or the region where the code ran.
Every attribute has a key (its name) and a value. Dashboards, alerts and queries are written against keys. A query like “show me the slowest requests where the method is POST” only works if every system uses the same key for the method, and spells the value the same way.
How Drift Happens
Nobody plans for naming to go wrong. It happens one reasonable decision at a time. A developer copies an example from a blog post. A library author chooses the name that felt natural in their language. A vendor agent uses its own names. A team inherits a service from an acquisition. After a few years, the same fact is stored under five different keys.
Think of a hospital where every department writes patient records in its own format. One uses “DOB”, another “birth date”, a third “born”. Each department’s records are fine on their own. The moment someone needs to find all patients born in 1980 across the whole hospital, the system collapses into manual translation. A shared form fixes this, and so does a note on every record saying which version of the form was used.
The Hidden Cost
Inconsistent naming does not break systems loudly. It quietly raises the cost of everything built on top of telemetry.
- Dashboards multiply. Each team builds its own because the shared one does not fit their names.
- Alerts go silent. A rule written for one key never fires for services that use another.
- Cost reports lie. Spend is grouped by an attribute that only half the services set.
- Security rules leak. A redaction rule that hides one key misses its twin spelled differently.
- Migrations stall. No one knows which services use which names, so nobody dares rename anything.
The cure has three parts: a shared dictionary of names, a label saying which edition of the dictionary the data follows, and human processes that decide when and how the dictionary changes. The first two are built into OpenTelemetry. The third is governance, and it is up to you.
BSemantic Conventions: The Shared Dictionary
Before a label can say which edition of the dictionary you used, you need to know what the dictionary contains.
What They Are
Semantic conventions, often shortened to semconv, are the agreed names, types, units and meanings for common pieces of telemetry. They answer questions such as: what is the exact key for the HTTP method, what type of value does it hold, which values are allowed, and is it required or optional? They also define names for metrics, such as the standard name for the duration of a server request, together with the unit it must use.
Conventions cover many areas: HTTP and RPC calls, databases, messaging systems, cloud providers, containers and Kubernetes, operating system processes, and more. They are grouped into families by a dotted prefix, for example everything about the user’s browser starts with browser. and everything about the destination server starts with server..
Semantic conventions work like the standard shipping label every courier accepts. The label has fixed boxes for name, street, city and postal code. Any parcel with a correct label can be sorted by any machine in any country. Telemetry with conventional names can be understood by any tool in any company.
The Pieces of One Convention
The key
A lowercase dotted name such as http.request.method, grouped under a family prefix.
The kind of value
String, number, true or false, or a list. The type is part of the contract.
The description
A written definition and examples so that two engineers read the key the same way.
How mandatory it is
Levels such as required, recommended or opt-in, so tools know what they can rely on and what is sensitive.
For metrics
Seconds, bytes or a plain count. A metric with the wrong unit is silently wrong.
How settled it is
Whether it may still change, is safe to depend on, or is being retired.
Where They Live and How They Were Born
Semantic conventions are maintained in an open repository, with a published registry of every attribute and a human-readable website. Earlier they lived inside the main specification. They were split out so they could evolve on their own schedule, with their own releases.
Their roots run deep. Before OpenTelemetry, the OpenTracing project suggested standard tag names, while OpenCensus had its own habits. When the two projects merged in 2019, aligning names became a priority. In 2023 Elastic contributed its Elastic Common Schema, a mature naming scheme used by many log and security tools, and the two efforts were merged under OpenTelemetry. That history explains why the conventions are broad: they are an attempt to settle naming across tracing, metrics, logs and security data in one vocabulary.
Stability Levels
Not every convention is equally settled, and the project is honest about it. Each attribute and group is marked with a stability level. Roughly speaking, development means the name may still change, stable means it is safe to build on and will not be broken without a long, managed process, and deprecated means it is being phased out in favor of a replacement. A release candidate level sometimes sits between development and stable for bigger families. Knowing the level is the first governance tool: you may decide your organization uses only stable conventions in alerts, while allowing development ones in experiments.
Teams often discover a convenient attribute in a development-level family and build alerts on it. When the attribute is renamed in a later release, the alert silently stops matching. Check the stability level before depending on any name in production alerting.
CMeet the Schema URL: A Label for the Edition
A dictionary changes between editions. The schema URL is the edition number printed on the cover of your data.
What a Schema URL Is
A schema URL is a web address that identifies a specific version of a set of naming rules. For OpenTelemetry’s own conventions, such an address looks like the standard site followed by a path ending in a version number, for example the address of release 1.21.0 of the conventions. It travels along with the telemetry, so anyone who receives the data can see which edition its names come from.
The address has a simple shape. Everything before the final slash is the schema family, which names the whole line of schemas. The last piece is the version, written in the familiar three-number style: major, minor and patch. Two addresses in the same family differ only in that last piece. This is what allows tools to compare them and decide which is newer.
A textbook has a title and an edition number. Two students may both say “I studied from the Physics book”, but the third edition and the ninth edition can disagree about chapter numbers. Printing the edition on the cover removes the argument. The family is the title; the version is the edition number.
Where the Label Is Attached
Telemetry in OTLP, the OpenTelemetry Protocol that moves data between components, is organized in layers. At the top is a resource: a description of the thing that produced the data, such as a service, container or host. Below that sits a scope: the instrumentation library, a piece of code that created the spans, metrics or log records. Inside the scope are the data points themselves.
A schema URL can be attached at two of these layers. The one on the resource says which edition governs the resource’s attributes, such as service.name. The one on the scope says which edition governs the attribute names used by that library’s data. Because they are separate, a single payload can honestly say: “my resource follows edition 1.26.0, but this older library follows 1.21.0.”
flowchart TD R["Resource
who produced the data
carries a schema URL for resource attributes"] --> S["Scope
which library produced it
carries its own schema URL"] S --> D["Spans, metric points or log records
attribute names follow the scope's edition"]
An Identifier, Not a Download
The address is meant to be dereferenceable, which means you can open it and get a file describing the edition. But in normal operation SDKs and Collectors do not fetch it while handling each piece of data. Most treat it as an identifier, the way a library treats a version string. Only tools that actually translate data between editions, covered later, need to read the file behind the address.
Another important property is immutability. Once an edition is published at an address, its contents must never change. If the file behind version 1.21.0 could be edited, the label would stop meaning anything. A fix always becomes a new version, never an edit of an old one.
Your organization can use schema URLs for its own naming rules too. The address does not have to belong to OpenTelemetry. It only has to be stable, unique, versioned and never edited after publication.
DInside a Schema File: Recording the Renames
The address points to a file. That file is a short history of what changed between editions, written so that a program can apply it.
What the File Contains
A schema file is a small structured document. It declares the version of the file format itself, repeats its own address, and then lists editions, usually newest first. For each edition it records the changes made in that release, grouped by what they affect: resource attributes, spans, span events, metrics, logs, or everything at once.
The most common kind of change is a rename: “the attribute called A is now called B”. Other recorded changes include renaming a metric or renaming an event. The point is not to describe the whole dictionary. The point is to describe only the movements between editions, so that a program can walk from one edition to another.
Walking Forward and Backward
Because the file records each edition’s renames, a tool can convert data in either direction. To move data forward from edition 1.20.0 to 1.22.0, it applies the renames of each edition in between, in order. To move backward, it applies the same renames in reverse, swapping the old and new names. This is why renames are the ideal kind of change for a schema file: they can be undone exactly.
flowchart LR A["Data labelled
edition 1.21.0"] --> B["Schema processor"] F["Schema file
renames per edition"] --> B B --> C["Data rewritten with
edition 1.26.0 names"] C --> D["Backend and dashboards
one consistent naming"]
Think of a street renaming list kept by a city. “Mill Road became Station Road in 2019. Station Road became Central Avenue in 2023.” With the list, anyone holding an old map can still find a place, and anyone holding a new map can understand old letters. The list does not describe the whole city, only the renamings.
What a Schema File Cannot Do
This is a critical limit. A schema file records renames. It does not convert values. It cannot turn milliseconds into seconds, change a number into a string, merge two attributes into one with new logic, or fix a change in meaning. When a metric moved from reporting milliseconds to seconds, the new metric got a new name as well as a new unit. A tool can rename between them, but it cannot divide the values by one thousand on its own.
That is why the conventions project treats breaking changes with great care. Any change that goes beyond a rename needs a separate plan: extra emitted data, documented opt-in switches, or consumer-side adjustments.
Examples of Real Renames
| Older name | Newer name | Can a schema file express it? |
|---|---|---|
http.method | http.request.method | Yes, a pure rename |
http.status_code | http.response.status_code | Yes, a pure rename |
net.peer.name | server.address | Yes, a rename, though meanings were tightened |
deployment.environment | deployment.environment.name | Yes, a pure rename |
http.server.duration in milliseconds | http.server.request.duration in seconds | Only the name; the unit change needs separate handling |
Assuming “the schema handles it” is the most expensive misunderstanding in this area. Schemas handle renames. Unit changes, type changes and meaning changes still require people to plan a migration.
EReading a Payload: Where Every Label Sits
Concepts become real when you can look at a batch of telemetry and say what each part tells you. Here is a guided tour in words.
A Batch Seen From the Outside
Picture a batch of traces sent by one checkout service. At the very top is a single resource entry. It lists the service name, the version of the release, the environment, the cloud region and the pod. Directly beside those attributes sits the resource’s schema URL, naming the edition of the conventions those attributes follow.
Beneath the resource are several scope entries, one for each instrumentation library that produced spans in this batch. One scope belongs to the web framework library. Another belongs to the database driver library. A third belongs to the team’s own hand-written instrumentation. Each scope has a name and a version of that library, and each may carry its own schema URL. Inside each scope sit the spans, and each span carries attributes.
| Layer | What it identifies | What its schema URL means |
|---|---|---|
| Resource | The checkout service, its release and its location | The edition governing resource attribute names such as the service name and environment |
| Scope: web framework library | The library that created request spans | The edition its span attribute names follow, for example for HTTP |
| Scope: database driver library | The library that created database spans | A possibly older edition, labelled honestly |
| Scope: team’s own code | Hand-written spans for business steps | Often your organization’s own address, or none at all |
Three Questions to Ask of Any Payload
Is every layer labelled?
An unlabelled scope is a question mark. Tools cannot know which renames apply, so you must investigate by reading the library’s documentation.
Do the names match the labels?
Pick a few attributes and compare them with the edition claimed. A label claiming a new edition while old names appear is a sign of a mistake somewhere in the chain.
Are the editions within policy?
Compare each label with the editions your organization supports. Anything older than the window needs an upgrade plan or a recorded exception.
Think of a shipping container holding boxes from several suppliers. The container has one manifest for the whole shipment, and each box has its own packing slip. If a slip is missing, the receiver must open the box to find out what is inside. Resource labels are the manifest, and scope labels are the packing slips.
What You Can Do With This View
Once you can read a payload this way, several governance jobs become easy. You can count the scopes by edition across the whole fleet and see which libraries lag behind. You can find which team’s code produces unlabelled scopes. You can check that a pipeline step did not drop the labels, and you can identify exactly which library introduced a surprising name after an upgrade, because every scope carries its own name and version next to its own edition.
This is the practical payoff of putting labels at two layers. A single label for the whole payload would be forced to either hide the mix or lie about it. Two layers tell the truth, and the truth is what makes cleanup possible.
Keep a sample payload from each major service in your documentation, annotated by hand. New engineers learn the whole labelling model in ten minutes from one real example, which no amount of abstract description can match.
FConvention Versioning: How the Dictionary Changes Over Time
The dictionary of names is never finished. Versioning is the set of rules that lets it grow without surprising the people who depend on it.
Releases and Version Numbers
The semantic conventions are published as numbered releases in the familiar three-part style, such as 1.21.0 or 1.26.0. New releases appear frequently, often every month or two. Each release comes with a change log listing added, renamed and deprecated entries, and each corresponds to a schema URL and a schema file that records the renames. The release number is therefore the same thing as the edition number in the schema URL.
Four Different Version Numbers
A frequent source of confusion is that several unrelated version numbers exist in any telemetry setup. They move independently, and mixing them up leads to wrong conclusions.
| Version | What it describes | Example question it answers |
|---|---|---|
| Specification and API version | The rules for how SDKs and APIs behave | Does this SDK support a given feature? |
| SDK version | The release of the OpenTelemetry library in your language | Which bug fixes do I have? |
| Instrumentation library version | The release of the code that instruments one framework | Does it support the newest web framework? |
| Semantic conventions version | The edition of attribute and metric names | What is the key for the HTTP method? |
Only the last one is what a schema URL records. Upgrading an SDK from one release to the next does not by itself say anything about which naming edition it now uses. That has to be read from the package notes or from the schema URL on the data itself.
A car has a model year, an engine version, a software version and a manual edition. A new engine does not mean a new manual. Likewise, upgrading the library that sends your telemetry does not always change the naming edition, and sometimes it does without warning. Always check the label.
What Counts as a Breaking Change
For governance, the key question is what a consumer of telemetry would notice. A change is breaking if a dashboard, alert, query or rule written against the old edition would give a different or empty answer after the change. That includes more than renames.
- Renaming an attribute or metric, because old queries no longer find it.
- Removing an attribute that was previously present.
- Changing a unit, such as milliseconds to seconds, because values shift by a factor.
- Changing a type, such as a number to a string, because comparisons stop working.
- Changing meaning, such as which address the attribute describes, because values look the same but mean something else.
- Changing how values are grouped, such as splitting one attribute into two, which changes cardinality and the shape of every chart.
The Life of One Convention
Proposal
Someone describes a need, studies existing practice in popular libraries, and drafts names and meanings for review.
Development
The convention is published with a development level. It may change, and early adopters accept that risk.
Stable
After implementations in several languages and real-world use, it is declared stable. From here on, breaking it requires a managed process.
Deprecated
When a better design replaces it, the old name is marked deprecated with a pointer to its replacement. It stays visible in the registry.
Treat deprecated as a countdown, not a warning label. Teams that ignore deprecations accumulate old names until a forced migration arrives at the worst moment. Scheduling deprecation clean-up each quarter keeps changes small.
GHow SDKs and Instrumentation Libraries Use Schema URLs
Labels only help if the code that produces telemetry sets them honestly. Here is where that happens.
Setting the Label in the SDK
The SDK is the library inside your application that collects and prepares telemetry. It builds a resource describing the application and obtains tracers, meters and loggers, the handles through which instrumentation creates spans, metrics and logs. When code asks for a tracer, it supplies a name, optionally a version, and optionally a schema URL. That schema URL becomes the label on the scope in the exported data.
The resource can carry its own schema URL as well. Resource attributes such as the service name and the deployment environment are governed by the edition the SDK or resource detector was written against, so SDKs that attach a schema URL to the resource are saying which edition those names come from.
When Two Labels Meet
Resources can be merged, for example when a base resource from the SDK is combined with extra details from environment variables or detectors. If both sides carry different schema URLs, the merge has a conflict, because the result cannot honestly claim a single edition. The specification treats this as an error case, and implementations decide how to react. Many simply keep the label of one side or drop it, which is a reminder that labels are only as good as the care taken when they are set.
Versioned Convention Packages
Each language ships a package of constants for convention names, so that developers do not type strings by hand. These packages are versioned by convention edition, and the ecosystem has settled into a few helpful patterns.
- Go publishes a separate package path for each edition, so choosing an import path is choosing an edition. Upgrading is a visible, deliberate edit.
- JavaScript offers a main entry point containing stable names and a separate “incubating” entry point for development-level ones.
- Java splits stable and incubating names into separate artifacts for the same reason.
The split between stable and incubating matters for governance. A policy such as “production code may import only the stable package” is easy to enforce in a code review or a build check, and it prevents accidental dependence on names that may still move.
A pharmacy keeps approved medicines on the main shelf and experimental ones in a locked cabinet. Anyone can pick from the main shelf; reaching for the cabinet requires a deliberate step. Separate stable and incubating packages put a deliberate step between a developer and an unsettled name.
Instrumentation Libraries Pick Their Own Edition
Instrumentation libraries wrap popular frameworks and clients, such as web servers and database drivers, and create telemetry automatically. Each library is written against some edition of the conventions and should label its scope accordingly. Because they are released and upgraded at different times, a single application often mixes editions. The web framework library may follow a recent edition while an older queue library follows one from a year before. Scope-level schema URLs make this honest: each part of the payload names its own edition.
Auto-Instrumentation Agents Change Names Silently
Many teams attach an agent to their application that instruments dozens of libraries without code changes. Upgrading that agent upgrades every library inside it at once, and the naming edition can jump with it. No application code changed and no engineer touched a dashboard, yet attributes may have been renamed overnight.
Treat any upgrade of an SDK or agent as a possible naming change. Read the release notes for semantic convention changes, roll the upgrade to a small canary group first, and compare the attributes it emits before and after.
HHow Collectors and Backends Use the Label
Once data leaves the application, the Collector and the backend decide whether the label is respected, translated or ignored.
The Collector in the Middle
The OpenTelemetry Collector is a separate program that receives telemetry, processes it and forwards it. It is built from receivers that accept data, processors that change or filter it, and exporters that send it onward. It carries schema URLs through unchanged by default, so labels set by the SDK arrive at the backend intact.
Because it sits between all applications and the backend, the Collector is the natural place for governance that applies to everybody. Among its optional components is an experimental schema processor that reads the schema URL on incoming data, finds the schema file, and rewrites names to a target edition you choose. It is the practical expression of the idea in Figure 2. Its maturity has been limited, so check its current status and test it with your own traffic before relying on it.
Labels Must Tell the Truth
If you change names inside the Collector using general-purpose processors, such as one that renames or copies attributes, remember that the label still says the old edition. A payload whose label says edition 1.21.0 but whose content mixes new names is lying. Later tools may apply renames that have already been applied, or skip renames that are still needed. Whenever a pipeline rewrites names, it should also update the schema URL to the edition the data now matches, or remove the label entirely, rather than leave a false one.
What Backends Do
Backends vary. Some store the schema URL as a plain field and let you filter by it, which is very useful for tracking adoption. Some ignore it. Some perform their own normalization when data arrives, using rules that are proprietary and may not follow the schema files. As far as is publicly known, fully automatic cross-edition translation inside backends is uncommon, so most organizations still decide for themselves where normalization will happen.
Three Places to Normalize
| Where | How it works | Strengths | Weaknesses |
|---|---|---|---|
| At the source | Services are upgraded to emit the target edition | Cleanest data, no translation cost | Slow; depends on every team |
| In the Collector | A central step rewrites names to a target edition | One place to manage, quick to roll out | Handles renames only; adds processing cost |
| At query time | Dashboards and alerts accept several names | No data change at all | Queries get complicated and fragile |
Most mature organizations combine them: Collector-level normalization as a safety net, source-level upgrades as the long-term fix, and query-level tolerance only for short transition windows.
International conferences solve the language problem in three ways: ask everyone to speak the same language, hire interpreters at the door, or give each listener a translation headset. Asking everyone to upgrade is the cleanest but slowest. Interpreters at the door are the Collector. Headsets are query-time tolerance.
IA Real Migration Walkthrough: The HTTP Rename
The biggest example of convention versioning so far is the HTTP family. Studying it shows what a managed breaking change looks like in practice.
Why the Change Happened
The first HTTP conventions grew organically and carried inconsistencies. Some names mixed client and server perspectives, some attributes bundled several facts into one, and some metrics used milliseconds while the wider ecosystem favored seconds. During the stabilization work that finished with release 1.23.0, the project redesigned the family so that it could be declared stable and then left alone. That meant many names changed once, in a planned way.
Some of the Changes
| Older name | Newer name | Kind of change |
|---|---|---|
http.method | http.request.method | Rename |
http.status_code | http.response.status_code | Rename |
http.url | url.full | Rename into a shared URL family |
http.target | url.path and url.query | Split into two attributes |
http.user_agent | user_agent.original | Rename into a shared family |
http.server.duration | http.server.request.duration | Rename and unit change from milliseconds to seconds |
The mappings above are simplified. The release notes contain the precise rules, including edge cases. What matters here is the variety: some changes are pure renames, some are splits, and one changes the unit. Only the first group can be handled by a schema file alone.
The Opt-In Switch and Dual Emission
The project did not expect millions of dashboards to change on one day. Instrumentation libraries that existed before the redesign were asked to keep emitting the old names unless told otherwise, and to offer an environment variable that controls the transition. Its name is OTEL_SEMCONV_STABILITY_OPT_IN. With no value, the library keeps its older behaviour. With the value http, it emits only the new names. With the value http/dup, it emits both old and new names together. Other families that stabilize later use similar values.
When a company changes its phone number, it keeps the old line forwarding to the new one for a year. Customers who have the old number still reach the company, and everyone gets time to update their address books. Emitting both names is call forwarding for telemetry.
The Four Phases
flowchart LR P1["Phase 1
Old names only"] --> P2["Phase 2
Emit old and new together"] P2 --> P3["Phase 3
Move dashboards and alerts"] P3 --> P4["Phase 4
New names only"]
In phase two, producers upgrade and send both sets of names. Nothing breaks because the old names are still there. In phase three, owners of dashboards, alerts and queries move them to the new names and verify the results. Only when every consumer has moved does phase four turn off the old names.
The Price of Overlap
Dual emission is not free. Every span carries extra attributes, and every metric exists twice under two names. A service that produced 2,000 HTTP metric series before may produce about 4,000 during the overlap, which affects network traffic, backend storage and cost. This is a strong reason to keep the overlap window short and planned, and to measure how many consumers are still using old names so that you can end the overlap on time.
An overlap with no end date becomes permanent. If nobody owns the job of switching off the old names, the cost doubles forever and new engineers cannot tell which names are current. Put the end date and an owner in writing before phase two starts.
JResource Attributes: The Identity Layer of Governance
Before any span or metric is useful, someone must know which service produced it. Resource attributes carry that identity, and everything else depends on them.
What the Resource Says
A resource describes the entity that produces telemetry: a service, a container, a host, a function. Its attributes are attached once and apply to everything that entity emits, so they are the cheapest and most powerful place to enforce consistency. Typical resource attributes name the service, its namespace and version, the deployment environment, the cloud provider and region, and, in Kubernetes, the namespace and pod.
A resource is the return address on an envelope. Letters inside may be about anything, but the return address tells the receiver who sent them. Mail without a return address can still be read, yet it cannot be answered, sorted by sender, or traced when something goes wrong.
The One Attribute That Must Always Be Set
The service name is the anchor for nearly every dashboard and alert. When an SDK is not given one, it falls back to a placeholder that starts with the words “unknown service” followed by the name of the running program. A fleet full of such placeholders produces telemetry that cannot be attributed to an owner. Many governance programs begin with one simple rule: no service goes to production without a real service name, enforced by a check in the deployment pipeline and a Collector rule that flags the placeholder.
A Baseline for Every Service
| Attribute family | Why it matters | Typical source |
|---|---|---|
| Service name and namespace | Identify the service and group related ones | Set by the team through the shared library |
| Service version | Tie behaviour to a release, which makes regressions obvious | Set by the build pipeline |
| Deployment environment | Separate production from testing in every chart | Set by the platform at deploy time |
| Cloud and region | Locate problems and attribute costs | Detected automatically |
| Kubernetes details | Connect telemetry to the workload that produced it | Detected or added by the Collector |
| Owner or team | Route alerts and cost to a human | Organization-specific extension |
Detectors and Their Editions
Many resource attributes are not typed by developers but discovered by resource detectors, small pieces of code that inspect the environment and report what they find. Detectors are libraries with their own versions, and each follows some edition of the conventions. Two detectors in the same process may disagree about names. A governance program should list the detectors it allows, know the edition each one follows, and test the combined resource in a live check.
Why the Resource Label Matters Most
The schema URL on the resource tells every downstream tool which edition governs these identity attributes. When a rename such as the environment attribute moves to a new key, the resource label is what lets a Collector decide whether the incoming data still needs translating. Because resources are shared by every item a service emits, a mistake here spreads everywhere. Treat the resource layer as the most carefully governed part of the pipeline.
KNaming Beyond Attributes: Spans, Logs and Errors
Conventions cover more than attribute keys. The names of spans, the shape of error information and the structure of log records are governed too.
Span Names Should Stay Few
A span name is the short title of one step in a trace. Backends group spans by name to draw summaries, so names must come from a small, bounded set. The conventions recommend names built from the method and the route template, in the style “GET /users/{id}”, not from the actual path with a real identifier in it. If every user identifier produced its own span name, the backend would face millions of unique names, and summary views would become useless and expensive.
A library files books under categories such as “History” or “Cooking”, not under each reader’s name. A bounded set of categories makes the shelves usable. Span names work the same way: a bounded set of templates keeps trace summaries useful.
Error Information Has a Shape
When something fails, tools need to find the cause quickly. The conventions provide a standard attribute for the type of error and a standard shape for exceptions, with fields for the exception type, message and stack trace. If every team invents its own error attribute, a cross-service error dashboard needs one query per team. With the standard shape, one query covers the fleet, and tools can offer built-in views for errors without custom setup.
Stack traces and messages may contain sensitive data, such as values from user input. Governance should decide whether these fields are kept, truncated or removed in each environment, and apply that decision consistently through redaction rules that use the standard names.
Logs and Events
A log record has a timestamp, a severity, a body and attributes. Conventions describe how logs correlate with traces through identifiers for the trace and span, so that a log line can be shown inside the trace that produced it. They also describe events, which are log records that represent something meaningful that happened, such as a user signing in. Recent versions treat the event name as a first-class part of the record, so that dashboards can count events by name without parsing text.
- Prefer attributes to text. A fact in an attribute can be filtered and counted; the same fact inside a sentence cannot.
- Keep the body readable. Humans still read logs, so the body should say what happened in a clear sentence.
- Always carry trace identifiers. Without them, logs cannot join traces.
- Standardize severity. Agree how your teams use levels like warning and error so alerts mean the same thing everywhere.
Span Kinds and Why They Matter
Each span has a kind that says whether it represents a server handling a request, a client making one, a producer sending a message, a consumer receiving it, or internal work. Many conventions apply differently depending on kind. A server span and a client span for the same HTTP call describe opposite ends of the conversation and use different attributes for addresses. Teams that set kinds correctly make service maps and dependency graphs work automatically; teams that leave them as the default produce maps with missing connections.
Include span names, error shapes and log fields in your live checks, not only attribute keys. Drift in these areas is quiet and causes some of the most confusing dashboards.
LCase Study: One Rename From Start to Finish
Abstract rules become clear when you follow a single change through every stage. This walk-through uses the environment attribute, which upstream renamed in a 2024 release of the conventions.
The Situation
Your company has 300 services. Each reports its environment, such as production or staging, under an attribute whose older name was deployment.environment. Upstream conventions moved this to deployment.environment.name, and your organization decides to follow. Dozens of dashboards filter by environment, several alerts apply only to production, and a cost report groups spend by environment.
Week by Week
Decide and record
A decision record states the goal, the owner, the overlap window of eight weeks and the end date. The registry is updated, and your next edition is prepared with a schema entry that records the rename.
Normalize in the Collector
A Collector step copies the old value to the new key for any data that has only the old one. Now every service, upgraded or not, provides the new name downstream. Old names remain.
Update the shared library
The platform’s library is changed to set the new key at the source and to send the new schema label. Services receive it through their next regular dependency update.
Move consumers
Dashboard and alert owners switch their filters to the new key. Synthetic test data confirms that production-only alerts still fire and staging ones stay quiet.
Check query logs
Search the backend’s query history for any remaining use of the old key. Contact owners of anything found.
Retire in stages
Turn off emission of the old key for a pilot group of services, then watch alerts and reports for a week.
Finish
Remove the Collector copy step, mark the old key deprecated in your registry, and publish the new edition with its schema file. Close the decision record with lessons learned.
What Went Right
Several things made this change calm. A single Collector step gave every consumer the new name before any service had upgraded, so consumers could move early. The overlap had an owner and a date. Alerts were tested with synthetic data, not assumed. Old names were switched off in a pilot first. And the registry and schema file recorded the change, so that future tools and engineers can see exactly what happened and when.
The copy step in the Collector produces data that has both names, so the label on that data should reflect the edition it now matches, or be removed. A label claiming the old edition while carrying the new name would confuse later translation steps.
MWhy Governance Matters at Scale
The conventions and labels are tools. Governance is the habit of using them on purpose, together, over years.
What Governance Means Here
Governance is the set of agreements about who decides what, how decisions are recorded, how they are checked, and what happens when someone disagrees. For telemetry naming, it answers practical questions. Who may add a new attribute? What happens when two teams want different names for the same idea? How long must an old name stay available after a rename? Who tells the people who built dashboards?
A city has building codes. Nobody enjoys them while drawing plans, yet they let thousands of buildings share the same electricity, water and fire safety rules. A city without codes is not free, only expensive: every repair needs a custom solution. Naming governance is the building code for telemetry.
Who Depends on Your Names
Many groups read telemetry, and each has its own way to fail when names drift.
| Consumer | What they rely on | What breaks when names drift |
|---|---|---|
| On-call engineers | Alerts and dashboards by service | Alerts go silent; incidents are noticed late |
| Reliability teams | Service level objectives built from metrics | Objectives count only a subset of services |
| Finance and platform teams | Cost and usage grouped by team or environment | Spend appears under “unknown” |
| Security and compliance | Rules that redact or block sensitive attributes | A renamed sensitive field slips past the rule |
| Product and data teams | Analysis built on trace and log attributes | Reports quietly change after an upgrade |
| Tool vendors and automation | Standard names to light up built-in views | Out-of-the-box features show empty screens |
The Scale Effect
With five services, a naming change means a short chat. With 400 services owned by 12 teams, it means a project. The number of possible mismatches grows with the number of producers times the number of consumers, and each mismatch is invisible until someone looks at the right chart on the wrong day. The older the system, the more people depend on accidents of naming that nobody remembers choosing.
Illustration: a merger of two engineering organizations
Two companies merge, each with its own telemetry names. One calls the environment env, the other deployment.environment. Leadership wants one executive dashboard of error rates by environment. Without governance, the dashboard needs two queries per chart and a translation table that someone must maintain forever. With a shared convention layer, a schema file recording the rename, and a Collector step that applies it, the dashboard stays simple and the translation lives in one reviewed place.
NBuilding Your Organization’s Convention Layer
OpenTelemetry’s conventions cover common technology. Your business has its own concepts, and they need names too.
Three Layers of Names
Upstream conventions
Use OpenTelemetry’s names as they are wherever they exist. Do not invent a second way to say “HTTP method”.
Organization-wide extensions
Names for ideas that every team in your company shares, such as owning team, cost center or business unit.
Team or product names
Domain-specific attributes such as an order stage or a tenant tier, owned by the team that understands them.
Use Your Own Namespace
Attributes you invent should begin with a prefix that belongs to you, such as your company or product name. This avoids collisions. If you invent payment.method today and OpenTelemetry later defines an attribute with the same name but a different meaning, your data and the standard data would become impossible to tell apart. A distinctive prefix makes such collisions practically impossible, and also lets anyone see at a glance which names are yours.
Write Naming Rules Once
A short rule sheet prevents most arguments. Good rule sheets usually cover the following points.
- Format. Lowercase words separated by underscores inside a segment and by dots between segments.
- Singular and plural. Pick one convention, and say when a list-valued attribute is allowed.
- Units. State units in the documentation and keep one unit per metric, preferably the standard base unit such as seconds or bytes.
- Cardinality. Forbid unbounded values, such as user identifiers or full URLs, as metric attributes, because each new value creates a new time series.
- Sensitivity. Mark attributes that may hold personal data and describe how they must be treated.
- Required attributes. List the few that every service must set, such as service name, environment and owner.
Keep a Registry
A registry is a structured list, kept in a code repository, of every attribute and metric your organization defines. Each entry records name, type, meaning, unit, stability, requirement level and owner. Because it lives in version control, every change has an author, a review and a history, which is exactly what governance needs. The OpenTelemetry project uses this approach for its own conventions, and its tooling, notably a project called Weaver, can work with registries that build on top of the upstream one. Check Weaver’s current documentation for exact commands and features, since the tool is young and growing.
A registry is like the master index of a library. Every book has one entry with a title, a shelf mark and a history of editions. Without an index, finding a book means walking the shelves, and adding a duplicate becomes easy because nobody knows the book is already there.
Give Your Registry Its Own Schema URL
When your registry releases a new edition, publish it at an address that follows the same pattern as OpenTelemetry’s: a stable family path ending in a version number. Alongside it, publish a schema file recording the renames since the previous edition. Services can then label their data with your address, and Collectors can translate between your editions. Hosting can be as simple as a static website, provided that each published edition is never changed and that the address is reachable by every tool that needs to read it.
When one of your extensions turns out to be generally useful, propose it upstream. A name accepted into the shared conventions saves you from maintaining it, and moves you closer to what vendors already understand.
OA Governance Workflow: From Proposal to Production
A good workflow is boring on purpose. Every change follows the same path, so surprises are rare.
flowchart TD A["Proposal
describe the need and the new name"] --> B["Review by naming owners"] B --> C["Registry updated in version control"] C --> D["Automated checks
validate and compare with last edition"] D -->|"Breaking change found"| E["Write a migration plan"] D -->|"Safe change"| F["Release a new edition
publish schema file"] E --> F F --> G["Roll out to services
track adoption by schema URL"]
The Steps in Plain Words
Propose
The requester states the need, shows how existing names fall short, and checks whether an upstream convention already covers it.
Review
A small group of owners checks names against the rule sheet, looks for duplicates and considers who consumes the data.
Record
The change is written into the registry and, if it is significant, into a short decision record explaining why.
Check
Automation validates the registry and compares it with the previous edition to list what changed and what is breaking.
Plan
If anything is breaking, a migration plan names the overlap period, the owners and the end date before release is allowed.
Release
A new edition is published with its schema file, and its address becomes a valid label for telemetry.
Roll out
Services upgrade in waves. Adoption is tracked, laggards are helped, and the old names are retired on schedule.
Roles
| Role | Responsibility |
|---|---|
| Naming owners | Review proposals, keep the rule sheet and registry healthy, publish editions |
| Service teams | Apply the conventions, propose changes, upgrade within agreed windows |
| Platform team | Provide shared libraries, agents and Collector pipelines that make the right thing easy |
| Consumers | Move dashboards and alerts during overlap periods and confirm results |
A Sample Decision Record
Context
Three teams record the owning team under three different keys. Cost reports show about a third of spend under “unknown”.
Decision
Adopt one organization-wide attribute for the owning team, required on every service. Keep the old keys for 90 days while a Collector step copies values to the new key.
Consequences
Cost reports become complete once services upgrade. Overlap temporarily increases attribute volume. The platform team owns removal of the old keys after the window closes.
PAutomated Checks and Tooling
Rules that depend on people remembering them are wishes. Rules that run in a pipeline are governance.
Checks on the Registry Itself
The first group of checks looks only at the registry in version control. Validation confirms that every entry is well formed, has a type, a description and an owner, and that names follow the rule sheet. Duplicate detection catches two entries that mean the same thing. Comparison with the previous edition produces a list of added, changed and removed entries and flags the ones that are breaking. Tools in the OpenTelemetry ecosystem, including Weaver, offer commands for checking and comparing registries, and they can run custom rules written in a policy language. Confirm the current command names in the tool’s documentation.
Spell-check and track-changes in a word processor do not write the document for you, but they stop silly mistakes and show exactly what changed between drafts. Registry checks do the same job for names.
Checks on Code
The second group looks at the programs that produce telemetry. A lint rule can flag attribute names typed by hand instead of taken from the generated constants package. A dependency rule can block imports of incubating packages in production code. Code generation from the registry gives developers ready-made constants, so correct names appear in editors through auto-complete and typos become compile errors.
Checks on Real Telemetry
Registries describe what should be emitted. The third group of checks looks at what is emitted. A live check runs an application in a test environment, captures the telemetry it produces, and compares each attribute and metric with the registry. It reports unknown names, deprecated names, wrong types and missing required attributes. This catches the cases where library upgrades silently changed names, and where developers added attributes without telling anyone.
Enforcement in the Collector
The Collector can enforce rules for the whole fleet. It can count how many items carry each schema URL, which gives you an adoption chart. It can remove attributes that are not on an approved list, redact sensitive ones, or add a missing required attribute with a default value. It can also tag data that violates a rule so that dashboards can show a compliance rate per team.
| Check | Runs when | Catches |
|---|---|---|
| Registry validation | Every proposed change | Malformed entries, rule violations, duplicates |
| Edition comparison | Before release | Breaking changes needing a migration plan |
| Code lint and dependency rules | Every code change | Hand-typed names, unstable imports |
| Live check in test | Before deployment | Drift caused by library or agent upgrades |
| Collector counts and filters | Continuously in production | Real-world drift, missing labels, sensitive values |
Start Gently, Then Tighten
Switching on blocking checks everywhere on day one invites rebellion. A smoother path has three stages. First observe: measure violations and publish a scoreboard without blocking anything. Then warn: show messages in code review and dashboards. Finally block: stop releases that break the most important rules, starting with required attributes and sensitive data. Each stage should last long enough for teams to fix what the previous one showed them.
Publish compliance per team and celebrate improvements. People respond better to a visible scoreboard that shows progress than to a rulebook that only shows violations.
QRolling Out Versions Across Hundreds of Services
A new edition does not arrive everywhere at once. For months, your fleet runs several editions side by side.
Version Skew Is Normal
Version skew means different parts of a system running different versions at the same time. In a company with hundreds of services upgraded by different teams on different schedules, skew is the permanent state. Governance does not try to eliminate it. It tries to make skew visible, bounded and harmless.
flowchart LR S1["Service group A
edition 1.21.0"] --> C["Collector
normalize to target edition"] S2["Service group B
edition 1.24.0"] --> C S3["Service group C
no schema URL"] --> C C --> B["Backend
one naming for dashboards"]
Define a Supported Window
Declare which editions are supported at any moment, for example “the current edition and the two before it”. Anything older is out of policy and receives reminders, then escalations. A window gives teams a predictable clock and gives the platform team a bounded set of renames to translate in the Collector.
Make the Right Thing the Default
The fastest rollout comes from changing defaults, not from asking hundreds of teams to act. A shared internal library that wraps the SDK and sets resource attributes and schema URLs correctly means each team upgrades by bumping one dependency. A standard container base image that includes a pinned instrumentation agent moves a whole fleet when the image is rebuilt. Dependency update bots can open pull requests for every repository with the new version, leaving only a review and merge for the team.
Changing the voltage of a country’s electricity is possible only because most people never touch the wiring. Appliances are updated at the factory and plugs are standardized. Platform defaults are the factory: when telemetry names change at the platform layer, individual teams barely notice.
Measure Adoption
You cannot manage what you cannot see. The most valuable chart in a rollout shows, over time, the share of telemetry items carrying each schema URL, broken down by team. If your backend lets you filter by the label, build the chart there. Otherwise a counting step in the Collector can produce a metric with the schema URL as an attribute. Add a second chart of services that carry no label at all, since they are the hardest to reason about.
Handle Exceptions Openly
Some services cannot upgrade: a vendor product, a frozen legacy system, a service about to be retired. Record each as an exception with an owner and an expiry date. Exceptions without expiry dates become permanent special cases that distort every future migration.
Illustration: waves for a fleet upgrade
A platform team upgrades its shared library in four waves: its own test services, then ten volunteer services, then all services in one business unit, then everyone else. After each wave it compares attributes in a live check, watches alert firing rates for unexpected changes, and waits a week before continuing. When something goes wrong in wave two, only ten services are affected, and the fix is in place before wave three.
RHandling Breaking Changes Safely
Not every change can be a clean rename. Each kind of breaking change has its own safe route.
The Golden Rule: Never Reuse a Name
If the meaning, unit or type of a value changes, give it a new name. Reusing an old name for a new meaning is the most dangerous move in naming, because nothing looks broken: queries still run and charts still draw, but they now describe something different. A new name forces consumers to decide consciously, and leaves the old one available until they have moved.
Matching the Change to the Method
| Kind of change | Safe approach | Needs people work? |
|---|---|---|
| Pure rename | Record in the schema file; translate in the Collector, or emit both names during overlap | Little |
| Unit change | Create a new metric name, emit both for a while, convert values in consumer queries | Yes |
| Type change | Introduce a new attribute with the new type; deprecate the old | Yes |
| Meaning change | New name, new description, explicit announcement | Yes |
| Split or merge of attributes | Emit the new attributes alongside the old; migrate queries; retire the old | Yes |
| Removal | Deprecate first, wait one window, then stop emitting | Some |
| Cardinality change | Test capacity impact before release; consider limiting the new attribute | Yes, for capacity |
If a bakery changes its “large loaf” from 800 grams to 600 grams but keeps the label “large”, regular customers will be confused and angry. If it adds a new “medium loaf” and keeps “large” as before, nobody is surprised. New names for changed meanings protect trust.
Prepare the Consumers
Breaking changes are rarely about producers. They are about the dashboards, alerts and reports built on top. Before a change begins, list every consumer you know of, search saved queries for the old names, and notify owners with a clear deadline and a description of the new names. After the change, verify that alerts still fire by sending synthetic test data through the pipeline. An alert that nobody has tested after a rename is an alert that may be silent.
Have a Way Back
Plan for rollback before you start. During overlap, rollback is easy: producers keep emitting both names, so consumers can move back. After the old names are switched off, rollback means re-enabling emission everywhere, which is slow and uncertain. Reduce risk by retiring old names in stages, first for a small group of services and then for the rest, and by keeping the switch that controls emission easy to reach.
Retiring old names on the same day as the last consumer migrates leaves no room for mistakes. Leave a few weeks between “everyone says they have moved” and “we stop emitting”, and use that time to check query logs for any remaining use of the old names.
SDashboards, Alerts and Queries Under Versioning
Producers change names once. Consumers feel it everywhere. Good governance protects the readers of telemetry as much as its writers.
Why Consumers Are the Hard Part
A producer change is one code edit. A consumer change is a hunt across every dashboard, alert rule, saved search, scheduled report and spreadsheet that mentions the old name. Many of these were created by people who have since changed teams, and some live in personal folders nobody can see. The more places a name appears, the more expensive a rename is, so the first governance task is making consumers findable.
Make Queries Resilient
Several techniques reduce how much each rename hurts.
| Technique | How it works | Trade-off |
|---|---|---|
| Stable internal alias | A precomputed query or view gives an internal, unchanging name to the current convention name | One more layer to maintain, but renames are handled in one place |
| Templated dashboards | The attribute or metric name is a variable set once per dashboard | Slightly harder to read; easy to switch |
| Dual-name queries | A query matches both old and new names during overlap | Fine briefly; fragile if left for long |
| Dashboards as code | Definitions live in version control and can be searched and changed in bulk | Requires discipline to avoid manual edits |
A company switchboard gives each department a fixed extension, even when people move desks. Callers dial the extension; the switchboard knows the current desk. A stable alias is the extension, and the real convention name is the desk.
Test Alerts Like Software
An alert is a program that runs on data. Programs should have tests. Keep a small set of synthetic test signals that deliberately trigger each important alert, and run them after every naming change, SDK upgrade or Collector change. Many teams discover during an incident that a rename silenced an alert months earlier. A regular alert drill finds these problems in daylight rather than at three in the morning.
Keep an Inventory
Maintain a list of the most important consumers and which names each depends on. It does not need to cover everything, only the dashboards, alerts and reports whose failure would hurt: customer-facing alerts, service level objectives, cost reports and compliance reports. When a rename is proposed, the inventory tells you instantly whom to contact. Teams that keep this list find that migrations become routine rather than heroic.
When a proposal changes a name, require the author to list known consumers in the proposal. Authors who must name the people they will disrupt tend to design gentler changes.
TMetrics Bring Their Own Versioning Challenges
Metrics are numbers over time, so changes in naming interact with units, buckets and the way backends store them.
The Name You Define Is Not Always the Name You See
When metrics travel to some popular backends, their names are translated into the backend’s own style. Dots in names may be replaced by underscores, a unit suffix may be added, and counters may gain a suffix marking them as running totals. A metric whose official name has dots and is measured in seconds might appear with underscores and a “seconds” ending. The exact behaviour depends on the backend and its settings, and newer versions are loosening these rules.
For governance, this means that documentation must say clearly which name is the OpenTelemetry name and how it appears in each backend you use. Alerts are written against the backend name, but changes are proposed against the convention name. Without a documented mapping, nobody can tell whether a renamed convention has affected a given alert.
Units Are Part of the Contract
A metric measured in seconds and a metric measured in milliseconds are different metrics, even if the words in their names look alike. A chart that mixes them is wrong by a factor of one thousand, and nothing in the data warns you. For that reason, unit changes should always come with a new metric name, a documented conversion, and an overlap period in which both exist. A schema file can record the rename, but the conversion must be handled by people and queries.
Imagine a recipe that changes from cups to millilitres without changing the ingredient names. Anyone who follows the old numbers with the new units ruins the dish. A unit is part of the meaning of every number, and changing it is as serious as changing the ingredient.
Histogram Buckets and Quantiles
Many duration metrics are histograms, which count how many measurements fell into each range, called a bucket. The boundaries of the buckets determine how precisely percentiles such as the 99th can be estimated. If an edition changes the suggested boundaries, data produced before and after the change cannot be combined without blurring the result, and percentile charts may show a sudden step even though nothing in the real system changed. When comparing across a migration, mark the change on charts and avoid mixing old and new histograms in one calculation.
New Attributes Create New Series
Each distinct combination of attribute values on a metric is a separate time series, which the backend must store and charge for. When a new edition adds an attribute to a widely used metric, the number of series can multiply. If the new attribute has many possible values, the effect on cost can be dramatic. Before adopting a new edition, count the series in a test environment, and use the Collector to remove or reduce attributes that you do not need.
A renamed metric starts a fresh history under its new name. Charts spanning the cut-over show a cliff: the old line stops and a new line starts. Plan how reports will stitch the two together, and tell readers where the join is.
UThe Security and Privacy Angle
Consistent names are not only a convenience. They are what lets privacy and security rules work at all.
Rules Are Written Against Names
Almost every control over telemetry is expressed in terms of names: “remove the attribute that holds the email address”, “never store the full URL with its query string”, “mask the database statement”. If the same fact appears under two names, a rule covering one leaves the other open. A rename can also silently bypass a rule written for the old name, so that data previously hidden starts to flow.
A security guard has a list of names that may not enter the building. If a person starts using a different name, the list no longer stops them. A rename in telemetry is the same: the content is unchanged, but the guard no longer recognizes it.
Opt-In Levels as Warnings
The conventions rate each attribute with a requirement level. Some are marked opt-in precisely because they may carry personal or confidential data, for example full query strings in URLs or database statements containing literal values. Governance can build on that: your registry can add a sensitivity label for each attribute, and your pipeline can use it to decide what to drop, hash or mask before data leaves a trusted network.
Review Every New Edition for Sensitivity
When a new edition of the conventions is published, its change list shows every new attribute. Add a step to your upgrade process in which someone classifies each new attribute: harmless, sensitive or forbidden. Without this step, an upgrade can introduce a field holding sensitive information, and the first sign is a privacy complaint. With it, redaction rules are updated before the new edition reaches production.
Labels as an Audit Trail
The schema URL on data tells auditors which edition of the rules applied when it was produced, and version history in the registry shows who changed what and why. During an incident review or compliance audit, you can answer questions such as “what did this attribute mean in March?” and “who approved collecting it?” from records rather than memory.
Add redaction tests to the same suite that tests alerts. Send a sample payload containing fake sensitive values under every known spelling, and confirm that none of them reaches the backend.
VFailure Modes and Troubleshooting
When something looks wrong after an upgrade or a rename, a short list of usual suspects explains most cases.
The Usual Symptoms
| Symptom | Likely cause | What to do |
|---|---|---|
| Dashboard went empty after an SDK or agent upgrade | The new version emits renamed attributes or metrics | Compare old and new payloads; enable dual emission or update queries |
| Totals suddenly doubled | Old and new metric names are both present and a query sums them | Make each query use exactly one name |
| Alerts fire twice | Rules exist for both names during overlap | Disable the rule for the retiring name once verified |
| Collector translation did nothing | Data has no schema URL, or the file for that edition cannot be read | Check the label on raw data; make schema files reachable or mirrored |
| Label says a new edition but names are old | A pipeline step rewrote names without updating the label, or the library mislabels its scope | Update the label to match content, or remove it |
| Resource merge error or missing label | Two sources of resource data use different editions | Align detectors and SDK versions on one edition |
| Cost jumped after an upgrade | Dual emission or new attributes created more series | Count series; trim attributes in the Collector; shorten the overlap |
| Some services have no label | Old SDKs or custom exporters never set one | Upgrade, or add the label in a Collector step you can trust |
A Debugging Routine
Look at raw data
Capture a real payload from the affected service, before any Collector rewriting, and read the labels and attribute names directly.
Read the label
Note which edition the resource and each scope claim. Do the names in the payload match that edition?
Check what changed
List recent upgrades of the SDK, agent, libraries and Collector, and read their notes for naming changes.
Compare with the registry
Run a live check against the registry to list unknown, deprecated or missing names.
Fix at the right layer
Decide whether the repair belongs at the source, in the Collector or in the consumer, using the comparison from earlier in this guide.
Do Not Depend on Fetching at Runtime
Because the schema URL is a web address, it is tempting to design pipelines that download the schema file whenever new data arrives. In networks with restricted access, or when the hosting site is slow, this turns a naming feature into an availability risk. Tools that read schema files should cache them, and organizations should mirror the files they need on infrastructure they control. Applications should treat the address as an identifier and never wait on it.
WBest Practices and Anti-Patterns
Teams that manage naming well share a few habits. Teams that struggle tend to share a few mistakes.
Habits That Work
Prefer upstream names
Use OpenTelemetry conventions wherever they exist and invent only what is truly specific to your business.
Always set schema URLs
Make shared libraries set the label for resources and scopes so that every payload states its edition.
Keep labels honest
Update or remove a label whenever a pipeline step changes names, so labels never claim more than they know.
Depend on stable names
Use only stable conventions in alerts and objectives. Keep development-level names to experiments.
Migrate with overlap
Emit old and new together for a defined window with an owner and end date, then retire the old.
Check in pipelines
Validate registries, compare editions, lint code and live-check telemetry before deployment.
Measure adoption
Chart the share of data per edition and per team so lagging groups are visible early.
Write decisions down
Short decision records explain why a name exists, which saves future arguments.
Mistakes That Teach
What people do
They keep an attribute name but change its meaning or unit, because it seems simpler than adding a new one.
Why it hurts
Nothing visibly breaks. Queries still run, but numbers describe something different. Wrong decisions can continue for months before anyone notices.
Do this instead
Give every change in meaning, unit or type a new name, and let the old one retire through the normal deprecation process.
What people do
They fix a mistake by editing a schema file or registry edition that has already been published.
Why it hurts
Data labelled with that address now has a different meaning from what was true when it was produced. Cached copies disagree with the live file, and audits cannot be trusted.
Do this instead
Treat published editions as immutable. Publish a corrected edition under a new version and mark the faulty one as superseded.
What people do
They rename widely used attributes in one release with no overlap, announcing the change in a message to a chat channel.
Why it hurts
Every consumer breaks at once, and rollback means undoing a fleet-wide change. Trust in the naming process drops, and teams stop upgrading.
Do this instead
Use the four-phase overlap, a written plan, an inventory of consumers and a published end date.
XReal-World Patterns
The right level of governance depends on who you are. These illustrative scenarios show how it scales.
A large enterprise with a central platform team
The platform team owns the registry, the shared SDK wrapper and the Collector pipelines. Service teams rarely touch conventions directly; they get correct names by upgrading the wrapper. The platform team publishes adoption charts monthly, runs live checks in the deployment pipeline, and keeps a supported window of three editions. Its main investments are tooling and communication, not policing.
An open-source library author
A maintainer who adds OpenTelemetry instrumentation to a library chooses one edition, labels the scope with it, and documents it. For changes in names between versions of the library, the maintainer offers an opt-in setting so that users can try the new names before they become the default, copying the approach the project itself used for HTTP. Release notes list every naming change in one place.
A regulated financial company
Here the main driver is audit. Every attribute in the registry carries an owner and a sensitivity level, only stable conventions are allowed in production, and every new upstream edition goes through a privacy review before adoption. Schema URLs on data and version history in the registry give auditors a clear answer about what each field meant at any date.
A small startup
A team of ten does not need a registry or a review board. It needs to use the upstream names, pin the versions of its libraries, read release notes before upgrading, and write a one-page rule sheet for its own attributes. When the company grows to the point where two teams disagree on a name, it can start a registry then, because it began with clean names.
A company with several backends
Some data goes to a tracing tool, some to a metrics store and some to a security platform, and each prefers slightly different names. A Collector tier normalizes everything to the organization’s target edition first, then applies small backend-specific adjustments at the last step. Applications stay unaware of the differences, and a single place records which adjustments exist and why.
YStaying Current With the Upstream Community
Conventions keep evolving. A steady, light habit of following them is much cheaper than occasional large catch-up projects.
Follow the Releases
Each release of the conventions comes with a change log that lists additions, renames and deprecations. Assign someone, often the naming owner, to read each release and write a short summary for your organization: what is new, what is breaking, what you will adopt and when. Even a five-line note prevents the surprise of discovering a rename only when a dashboard breaks.
Choose an Upgrade Cadence
You do not need to adopt every release. Many organizations choose a regular rhythm, such as reviewing releases each quarter and moving their target edition forward once or twice a year, unless a release contains something urgent. A predictable cadence lets teams plan upgrades, lets the platform team batch translation rules, and keeps the gap between your target and upstream small enough that changes stay modest.
Servicing a car every six months costs a little each time and prevents breakdowns. Ignoring it for five years produces a single enormous bill and a stranded vehicle. Frequent small updates to naming editions work the same way.
Take Part
The conventions are developed in the open by working groups, often called special interest groups, that welcome comments from users. If a convention does not fit your real systems, or an attribute you rely on is missing, raise it in the project’s issue tracker with evidence from your use. Early feedback during the development stage is far more powerful than complaints after stabilization, when changes are costly.
- Report mismatches. Describe the system, show the name you needed and explain why existing names fell short.
- Test early. Try development-level conventions in a safe environment and share what you learn.
- Contribute extensions. If your custom attribute is general, offer it upstream so the whole ecosystem can benefit.
- Share migration lessons. Write about what worked, so others avoid your mistakes.
Keep Vendor Neutrality in Mind
One of the biggest benefits of standard names is the freedom to change tools. Dashboards, alerts and pipelines built on standard names move between vendors with far less rework than those built on proprietary attribute names. When a vendor offers an attractive custom attribute, compare it with the standard one and prefer the standard unless the difference truly matters. Every proprietary name you adopt is a small cost of leaving later.
ZWhat Governance Costs, and What It Saves
Every control has a price. Knowing it helps you decide how much governance to buy.
The Direct Costs
The labels themselves are almost free. A schema URL is a short piece of text attached once per resource and once per scope, not once per span, so it adds a tiny fraction to each payload and is shrunk further by compression. The costs lie elsewhere.
| Cost | Where it appears | How to keep it small |
|---|---|---|
| Dual emission | More attributes and more metric series during migration | Short overlap windows; trim unneeded attributes in the Collector |
| Collector processing | CPU for translation and enforcement steps | Apply rules only where needed; measure before and after |
| Tooling and registry upkeep | Engineer time for reviews and pipelines | Automate checks; keep the registry small and focused |
| Team coordination | Meetings, announcements, support during waves | Platform defaults and clear plans reduce per-team effort |
| Slower adoption of new names | Review time before new attributes appear | Fast lanes for low-risk additions |
The Savings
The benefits are harder to see because they appear as problems that never happen. Engineers do not rebuild dashboards for each team. Alerts do not silently stop after an upgrade. Cost reports are complete. Security rules cover all spellings. Onboarding a new service takes an afternoon instead of a week of negotiation. Vendors’ built-in views work without custom configuration. For a company with hundreds of services, these savings usually exceed the costs within the first year, and they grow with every service added.
Right-Sizing the Effort
A reasonable rule of thumb is to match governance effort to how much damage a naming mistake could do. Identity attributes, required attributes and anything touching sensitive data deserve strict control. Rarely used team-specific attributes deserve light control: a naming prefix and an owner. Spending the same effort on everything wastes time, and spending none on anything invites the chaos that governance exists to prevent.
Strict control fits
- Service identity and ownership
- Attributes used in alerts and objectives
- Anything that may hold personal data
- Metrics that drive cost reports
Light control is enough
- Short-lived experiments
- Team-private debugging attributes
- Low-volume internal tools
- Prototype services
AAA Maturity Ladder for Naming Governance
Nobody starts with a perfect system. Knowing which rung you are on tells you what to do next.
| Level | What it looks like | Next move |
|---|---|---|
| 1. Ad hoc | Every team picks its own names; no labels; renames are surprises | Adopt upstream conventions and write a one-page rule sheet |
| 2. Shared names | Most services use upstream names; a few shared attributes are agreed; editions are not tracked | Set schema URLs through shared libraries and start counting editions |
| 3. Managed | A registry exists; changes are reviewed; migrations use overlap windows; adoption is charted | Automate checks in pipelines and add Collector normalization |
| 4. Automated | Registry checks, live checks and Collector rules run continuously; compliance is visible per team | Refine, shorten windows, contribute improvements upstream |
Learning to cook goes from following random recipes, to using a few trusted ones, to keeping a recipe book, to running a kitchen with checklists and timers. Each stage is useful, and skipping stages usually fails. Naming governance grows the same way.
Do Not Climb Faster Than Your Needs
Higher is not always better. A small company at level two may be perfectly served, and building level-four automation for ten services is wasted effort. Choose the level that matches the number of teams, the cost of mistakes and the regulations you face. Move up when pain appears, not before, and let each rung teach you what the next one needs.
ABA Step-by-Step Playbook
When you are ready to put these ideas to work, follow this order. Each step prepares the next.
Take an inventory
List the attributes and metrics your services emit today and find the ones with duplicates, inconsistent spellings or unclear units. Note which dashboards and alerts use them.
Pick a target edition
Choose the upstream edition your fleet will aim for, and read the change lists between your current editions and the target.
Write the rule sheet
Cover format, units, cardinality, sensitivity and required attributes. Keep it short enough that people read it.
Create the registry
Record your own attributes in version control with owners and stability levels. Build on the upstream registry rather than copying it.
Set the labels
Update shared libraries and base images so that resources and scopes carry honest schema URLs, and count them in the Collector.
Add checks
Start in observe mode with registry validation and live checks, then move through warn to block as teams adapt.
Migrate in waves
Use dual emission and a written overlap window with an owner and end date. Verify dashboards and alerts with test data at each wave.
Retire and review
Switch off old names on schedule, record lessons in decision records and review the process after each major upgrade.
Change one thing at a time, tell consumers before you do it, and verify after. Most naming incidents come from changes that were invisible to the people who relied on them.
ACA Plain-Language Glossary
A quick reference for the terms used in this guide.
| Term | Plain meaning |
|---|---|
| Telemetry | Data a system produces about itself: traces, metrics and logs. |
| Attribute | A named label attached to telemetry, made of a key and a value. |
| Semantic conventions | The agreed names, types, units and meanings for common attributes and metrics. |
| Schema URL | A versioned web address labelling which edition of the naming rules some data follows. |
| Schema family | The part of a schema URL before the version; it names the whole line of editions. |
| Schema file | The file behind a schema URL, listing the renames made in each edition. |
| Resource | A description of what produced the data, such as a service or host. |
| Scope | The instrumentation library that created a set of telemetry items. |
| OTLP | The OpenTelemetry Protocol, the standard way telemetry moves between components. |
| Collector | A program that receives, processes and forwards telemetry. |
| Stability level | A mark showing whether a convention is in development, stable or deprecated. |
| Deprecated | Marked as being phased out, with a replacement named. |
| Breaking change | A change that makes existing queries, alerts or dashboards give different or empty answers. |
| Dual emission | Sending both the old and new names together during a migration. |
| Opt-in switch | A setting that lets users choose when to adopt new behaviour. |
| Registry | A version-controlled list of every attribute and metric an organization defines. |
| Live check | A test that compares real emitted telemetry against the registry. |
| Version skew | Different parts of a system running different versions at once. |
| Immutability | The rule that a published edition must never be changed. |
| Cardinality | The number of unique value combinations, which drives how many series a backend stores. |
ADFrequently Asked Questions
Short answers to the questions that come up most often.
AESummary and Key Takeaways
Governance via schema URLs and convention versioning is how a large organization keeps one vocabulary while that vocabulary keeps changing.
You started with a simple problem: many teams naming the same thing differently. You met the shared dictionary of semantic conventions, the schema URL that labels which edition of that dictionary data follows, and the schema file that records renames between editions. You then saw how SDKs, Collectors and backends use the label, how to migrate safely using overlap, and how registries, workflows and automated checks turn all of this into everyday practice.
Key Takeaways
- Semantic conventions are the shared dictionary. They define names, types, units and meanings so that tools and teams read telemetry the same way.
- A schema URL is the edition label. It travels with the data at the resource and scope layers and says which version of the names applies, and published editions must never change.
- Schema files record renames only. They allow translation between editions, but unit, type and meaning changes need new names and human-led migrations.
- Several version numbers exist. Specification, SDK, instrumentation library and convention versions move independently, and upgrades can change names without warning.
- Migrate with overlap. Emit old and new together for a short, owned window; move consumers; then retire the old names on schedule.
- Governance is process plus automation. A registry, reviewed changes, pipeline checks, live checks and Collector enforcement keep naming healthy at scale.
- Make labels honest and visible. Never leave a label that claims more than the data contains, and chart adoption by schema URL so version skew is bounded rather than hidden.