Observability is the ability to ask useful questions about a running system without predicting every question in advance. OpenTelemetry supplies common APIs, SDKs, semantic conventions, and a collector pipeline for traces, metrics, and logs. It is not a monitoring strategy and it does not make noisy telemetry useful. Start with questions: Which customer journeys are slow? Where did a request spend time? Are errors concentrated by dependency or release? Is saturation approaching before users notice?
A trace represents one operation across boundaries; spans record timed units such as an HTTP handler, database call, or queue consumer. Metrics aggregate behavior economically and support alerting over rates and distributions. Logs preserve discrete events and diagnostic context. Correlation matters: a trace ID in a structured log lets an investigator move from a latency chart to representative traces and then to exact error events.
Use automatic instrumentation to gain broad HTTP, database, and runtime coverage, then add manual spans around business operations such as price calculation or inventory reservation. Apply OpenTelemetry semantic conventions so service, HTTP, database, and messaging attributes remain portable. Do not attach email addresses, full URLs with tokens, SQL values, or unrestricted customer IDs.
processors:
batch: {}
memory_limiter:
check_interval: 1s
limit_mib: 512
tail_sampling:
policies:
- name: errors
type: status_code
status_code: {status_codes: [ERROR]}
exporters:
otlp:
endpoint: observability.example:4317Place collectors as agents when local buffering and metadata are important, and use a gateway tier for centralized sampling or export. The collector is part of the data path: configure queues, memory limits, retry bounds, health checks, and multiple replicas. Vendor neutrality lowers instrumentation switching cost, but storage, queries, dashboards, and operational knowledge remain investments.
Signal flow
application -> OpenTelemetry SDK -> collector -> metrics, traces, logs -> investigationThe collector is a controlled telemetry junction, not a guarantee that exported data is complete.
Instrumentation and acceptance review
Name resources consistently
Set stable service name, environment, version, and deployment identifiers so telemetry can be grouped without parsing hostnames or pod names. For Name resources consistently, establish events per request and bytes per event as the primary evidence and publish its expected range before rollout. During a controlled exercise, make the logging destination unavailable; compare the resulting customer-visible behavior with the written promise. Review ingestion, indexing, archive, and egress during capacity and budgeting work, because a technically successful control can still be economically wrong. The acceptance record should name an owner, preserve the observation, and state when the decision must be revisited.
- Preserve context across queues: Inject and extract W3C trace context in message metadata, then model producer and consumer timing without pretending queue wait is one synchronous call. Preserve context across queues should be reviewed through redaction matches and schema-validation failures, not through a screenshot of one successful run. Rehearse the boundary by choosing a safe environment and then submit a request containing a seeded secret value. Document containment and recovery in the same language operators see during an alert. Include security review and deletion obligations in the trade-off, and retain enough evidence to show whether the observed result came from the design or an unrelated dependency.
- Bound metric cardinality: Use route templates and controlled dimensions rather than user IDs, raw paths, message IDs, or exception text that create unbounded series. Turn Bound metric cardinality into a falsifiable operating claim. Instrument logger queue depth and dropped records, define failure before running the test, and emit the same exception through several layers. A reviewer should be able to connect the signal to one business consequence and one recovery action without private team knowledge. Account for engineer time searching noisy records; otherwise the architecture may shift expense into support, response labor, or another service while appearing inexpensive on its own dashboard.
- Record meaningful span errors: Mark failures and add sanitized exception events while avoiding the common mistake of treating expected business rejection as infrastructure failure. The verification plan for Record meaningful span errors begins with query latency, indexed volume, and retention growth measured across ordinary and peak traffic. Next, increase one success event to production request volume and inspect both the immediate symptom and the state left after recovery. Keep the runbook specific about authority, evidence, and rollback. Re-estimate application impact from synchronous logging when volume, regions, or ownership change, because limits selected for the first deployment rarely remain neutral as the system grows.
- Select histogram boundaries: Choose latency buckets or exponential histograms that preserve resolution around the service objective instead of relying blindly on defaults. Treat events per request and bytes per event as the release gate for Select histogram boundaries, with thresholds derived from the user journey rather than a vendor default. Prove degraded behavior when you make the logging destination unavailable, including what an operator can see before customers report it. The design review must compare ingestion, indexing, archive, and egress with the consequence of a missed or delayed operation. Record exceptions explicitly so emergency action does not silently become permanent configuration.
- Adopt sampling consciously: Use head sampling for predictable volume or tail sampling for interesting outcomes, recognizing that tail decisions require buffering and collector capacity. A production acceptance test for Adopt sampling consciously should capture redaction matches and schema-validation failures before, during, and after recovery. In the fault phase, submit a request containing a seeded secret value; in the review phase, reconcile durable state rather than stopping when the process turns green. Model security review and deletion obligations at current load and forecast peak. This makes the decision reversible: later teams can see why the limit existed and what evidence would support changing it.
- Monitor the collector: Alert on refused, dropped, queued, and failed exports plus memory and CPU because a silent telemetry outage can hide the application incident. Use Monitor the collector to connect implementation detail with operations. Dashboard logger queue depth and dropped records, but keep the underlying event or state available for investigation. Then emit the same exception through several layers in a bounded drill and have someone outside the implementing team follow the runbook. Compare the resulting risk reduction with engineer time searching noisy records. Passing means the system behaves predictably and the responder can explain why, not simply that an automated check returned success.
- Redact before export: Apply allowlists and transformations close to collection, then test representative payloads for secrets and regulated personal information. Before approving Redact before export, ask which assumption is most likely to expire. Baseline query latency, indexed volume, and retention growth, then increase one success event to production request volume without changing several variables at once. Capture timelines and identifiers needed to reconstruct the event. Budget explicitly for application impact from synchronous logging, including human ownership that provider calculators omit. Schedule review after material traffic, dependency, or policy changes so the control remains aligned with its original business purpose.
- Connect signals in dashboards: Link metric exemplars to traces and include trace identifiers in logs so investigation follows evidence instead of switching among isolated search systems. Operational evidence for Connect signals in dashboards comes from events per request and bytes per event correlated with a representative transaction or workflow. Validate it when you make the logging destination unavailable, checking partial success and delayed recovery rather than only total outage. Discuss ingestion, indexing, archive, and egress with product and finance owners where the consequence is material. The final runbook should state the safe manual action and the conditions under which automation must stop and request judgment.
- Test instrumentation overhead: Load test with telemetry enabled, a slow exporter, and collector interruption to prove application latency and memory remain bounded. For Test instrumentation overhead, separate prevention from detection. Use redaction matches and schema-validation failures to discover drift from the intended behavior, and submit a request containing a seeded secret value to prove containment. Recovery should preserve auditability and avoid converting one failure into duplicates, data loss, or uncontrolled load. Compare that protection against security review and deletion obligations. A concise decision record should link configuration, test evidence, dashboard, and accountable owner so the control survives staff rotation.
- Control retention cost: Estimate bytes and series per request, sample low-value success traces, and assign different retention to diagnostic and compliance data. Control retention cost is ready only when logger queue depth and dropped records can be interpreted by the on-call engineer without reverse-engineering implementation internals. Run a game day in which you emit the same exception through several layers, and require an explanation of impact, state, and next action. Track engineer time searching noisy records separately from normal application spend so reliability overhead remains visible. If the drill needs privileged improvisation, improve the interface or runbook before increasing automation.
- Verify with a known journey: Run one synthetic transaction through every service and confirm parentage, timestamps, attributes, metrics, logs, and failure status are coherent. Close the Verify with a known journey review with a recovery proof. Observe query latency, indexed volume, and retention growth, increase one success event to production request volume, and verify the final business records against their authority. Report application impact from synchronous logging beside latency and correctness rather than after the architecture is committed. Keep an explicit exit condition: if evidence, platform capability, or economics change, the team should be able to simplify or replace this mechanism without losing the contract it protects.
Logging data-model and security references
The OpenTelemetry documentation defines the platform or specification behavior used in this design. The OpenTelemetry semantic conventions provides a second primary reference for implementation limits and operating guidance. These sources support the guarantees described here; product policy and risk decisions remain specific to the organization.
A compact operating model
business decision -> structured event -> redaction -> bounded transport -> searchable storeEvery transition has a purpose: the application records a decision, redaction limits exposure, bounded transport protects serving, and the store supports controlled investigation.



