02

Telemetry Signals as Complementary Evidence

Source: “Building an Observability Platform: From Prometheus to Mimir, Loki, Tempo, and Grafana” — Chapter 2, “The First Expansion: Telemetry Signals”

The enterprise problem and today’s slice

Enterprise problem: Operators cannot answer detection, event, causality, and code-cost questions from one data model, so forcing every investigation through a single signal creates blind spots or uncontrolled cost.

Whole-course context: The control-loop map from Day 01 is the incoming artifact; today expands its telemetry-system box into distinct but correlatable evidence types.

Today’s slice: Define metrics, logs, traces, and profiles, assign each an initial operational question, and establish shared resource and request identity.

End-of-day evidence: A signal-selection matrix and a correlated incident packet that moves from an elevated metric to a log event, trace span, and profile observation.

Still unsolved: Instrumentation pipelines, collector placement, storage backends, retention economics, sampling policy, and alert delivery remain deferred.

Customer use cases

When a team chooses a signal by habit, it either loses the needed detail or pays to preserve detail that no decision consumes. These use cases require intentional signal choice and cross-signal correlation.

Use case IDActorCustomer jobSuccess outcomeDenial or recovery evidence
D02-UC-01On-call engineerMove from a checkout symptom to the request and dependency that caused itA metric exemplar or shared attributes lead to a trace and structured log for the same failureA correlation gap is recorded with the missing identity field and owning team
D02-UC-02Performance engineerAttribute sustained CPU growth to code paths without adding request IDs to metricsA profile identifies the costly functions for the affected service and releaseA control profile or unchanged workload disproves the suspected code path

Actor-centred user stories

Signal names alone do not establish usefulness, so each story describes the investigation transition that must be observable.

Story IDUse case IDsUser storyObservable acceptance conditions
D02-US-01D02-UC-01As an on-call engineer, I want aggregated symptoms linked to request-level evidence, so that I can locate a failing dependency without putting unique IDs in metric labelsThe incident packet contains metric window, trace ID, slow span, log event, service, environment, and release
D02-US-02D02-UC-02As a performance engineer, I want profiles correlated by service and release, so that I can distinguish expensive code from traffic growthBefore-and-after profiles use comparable load and show the function-level resource change

End-to-end product flows

Cross-signal investigation fails when every handoff requires a new unbounded search. These flows preserve bounded aggregate dimensions while carrying request and code identity in the signals designed for them.

Flow IDUse case IDsPathTriggerNumbered stepsTerminal evidence
D02-FLOW-01D02-UC-01HappyOperator opens a checkout p99 latency alert1. Inspect the metric by service, region, and release.<br>2. Follow an exemplar or time-window correlation to a trace.<br>3. Find the dominant span.<br>4. Open logs using trace identity.<br>5. Record the failing dependency.Correlated packet with alert, query, trace ID, span ID, log event, actor, environment, timestamp, and immutable incident ID
D02-FLOW-02D02-UC-02RecoveryCPU remains elevated after a release rollback1. Compare metric traffic and CPU windows.<br>2. Capture profiles under matched load.<br>3. Attribute samples to functions.<br>4. Compare against a control release.<br>5. Reject or retain the code-regression hypothesis.Profile artifact IDs, matched-load assumptions, observed function shares, and explicit falsification result

System design derived from the flows

If correlation is implemented as a global full-text search, investigations become slow and access controls become ambiguous. The design uses shared resource attributes and explicit request context while each backend retains authority over its own signal.

Use case IDEntry pointResponsible servicesAuthoritative storeFailure evidence
D02-UC-01Alert detail and explore linksMetrics query service, trace query service, log query service, correlation resolverSignal indexes in their owning backends plus evidence packet storeMissing exemplar, trace context, resource identity, or permission-safe link
D02-UC-02Performance comparison workspaceMetrics query service, profiling backend, release catalogueProfile store owned by performance platformIncomparable load windows, absent release identity, or no control profile

Data model and ownership

Correlation becomes unsafe when a convenience index copies sensitive payloads across stores. This model persists references and shared identifiers while leaving raw signal data with its signal backend.

Generated-application database: Not created in this slice — observability control records and opaque signal references are sufficient; application domain data remains in its source system.

Record or entityStore and ownerPrimary keyForeign key or opaque referenceTenant keyMaterial constraintLifecycle and deletionUse case IDs
SignalPolicyTelemetry policy store, observability platformsignal_policy_idOpaque service catalogue referenceorganization_idOne active policy revision per service and environmentVersioned; old revisions retained for audit; deleted with service retirement policyD02-UC-01, D02-UC-02
CorrelationPacketEvidence packet store, incident managementpacket_idOpaque metric, trace, log, profile, and incident referencesorganization_idReferences must share authorized tenant and time scopeCreated during investigation; retained with incident; expires by incident policyD02-UC-01
ProfileComparisonPerformance evidence store, performance platformcomparison_idOpaque release, profile, and metric-window referencesorganization_idBaseline and candidate must record comparable workload assumptionsRetained through performance review; source profiles expire independentlyD02-UC-02

Four projections of one system

Choosing the wrong signal either discards essential detail or creates explosive storage and query cost. Treat each signal as a projection optimized for a different first question.

SignalRepresentationBest initial questionDetail deliberately traded
MetricsAggregated numerical measurements over timeIs something wrong?Individual event history
LogsIndividual structured eventsWhat happened?Complete distributed causality
TracesA request path composed of spansWhere did it happen?Unsampled aggregate population shape
ProfilesResource samples attributed to codeWhich code consumed resources?Full request and business-event detail

A metric can show checkout p99 latency at 2.4 seconds and errors at 4.8 percent. A log can preserve the order identifier, provider response, and timeout reason. A trace can show that 2.01 seconds of a 2.41-second request occurred in the payment provider. A profile can show that retry policy and regular-expression validation dominate CPU. None invalidates the others.

Metrics compress behaviour

Individual events are too numerous for every overview, so metrics aggregate observations into bounded time series. Counters, gauges, and distributions make rates, saturation, error ratios, and latency trends cheap to scan across a fleet.

Keep dimensions bounded: service, environment, region, operation, and status class are often useful. Unique customer, request, order, session, or trace identifiers do not belong in metric labels because every distinct label set becomes a new series. Preserve those identities in logs or traces instead.

Logs preserve events

Aggregates cannot explain a particular state transition, so structured logs preserve event detail with explicit fields. A useful event has timestamp, severity, service, environment, release, stable event name, and correlation context; free text remains a human explanation rather than the only schema.

{
  "timestamp": "2026-07-30T10:42:18.131Z",
  "severity": "ERROR",
  "service.name": "checkout",
  "deployment.environment.name": "production",
  "service.version": "2026.07.30.3",
  "trace_id": "5df6c1e47a724f62",
  "event.name": "payment.authorization.failed",
  "provider": "payment-gateway",
  "reason": "upstream_timeout"
}

Avoid secrets and unnecessary personal data. Redaction should happen before export where possible, and access to business identifiers must follow the application’s tenant boundary.

Traces preserve causality

A slow request crossing several services cannot be reconstructed from timestamps alone, so traces represent the operation as spans connected by parent-child context. W3C Trace Context commonly carries trace and parent identifiers across process boundaries; losing propagation creates a new trace and breaks the causal tree.

Sampling changes what can be concluded. A sampled trace can explain one captured operation; it does not by itself prove fleet-wide frequency. Pair it with metrics for population-level impact.

Profiles preserve code-level cost

CPU and memory metrics identify pressure but not the responsible functions, so profiles sample stacks and attribute resource consumption to code. Continuous profiling makes regressions visible across releases, while trace or resource correlation narrows the profile to the affected service and window.

Comparisons require controlled assumptions: similar request mix, traffic, duration, instance shape, and release identity. Without those controls, a larger function share may reflect a different workload rather than worse code.

Practical correlation check

Cross-signal links often look complete until one service loses context, so run a known request through at least two services and inspect each backend independently.

  1. Confirm the metric changes using only bounded labels.
  2. Locate a captured trace and verify one trace ID spans both services.
  3. Query logs by that trace ID and verify service and release attributes agree.
  4. Open a profile for the same service, release, and time window.
  5. Repeat with an unauthorized tenant and confirm no cross-tenant signal is returned.

Record absence as evidence. “No matching log” should distinguish no event, ingestion delay, retention expiry, access denial, and missing correlation fields.

Key takeaways

Signal quality comes from using each representation for the question it can answer and preserving safe links between them.

  • Metrics detect fleet-level change efficiently.
  • Logs preserve detailed events and state transitions.
  • Traces reconstruct causality across component boundaries.
  • Profiles attribute resource consumption to code.
  • Shared resource identity enables correlation; unique IDs stay out of metric labels.
  • A captured example explains an instance, while aggregates establish prevalence.

Checklist

Use this checklist before calling a service multi-signal observable.

  • [ ] Assigned an initial operational question to each collected signal.
  • [ ] Standardized service, environment, and release resource attributes.
  • [ ] Verified trace context crosses every synchronous and asynchronous boundary.
  • [ ] Kept unique request and customer identifiers out of metric labels.
  • [ ] Tested positive correlation and cross-tenant denial.
  • [ ] Documented sampling, retention, and profile-comparison assumptions.

Sources

These primary references describe current OpenTelemetry signal scope and correlation semantics.