← What's New

Building a Culture of Observability

Turning logs, metrics, and traces into business intelligence, not just firefighting tools.

Turning logs, metrics, and traces into business intelligence, not just firefighting tools.

Most teams meet observability during an outage. The great ones meet it every day: in design reviews, product decisions, and quarterly planning. A culture of observability treats telemetry as a product with users (engineers, product, finance) and outcomes (reliability, speed, unit economics)—not as a last-minute graph when things burn.

What observability really means

  • MELT, not just logs: Metrics, Events, Logs, Traces working together, with shared IDs and semantics.
  • From signals to sense-making: dashboards and queries answer business questions, not just system health.
  • Telecomms, not CCTV: instrumentation is two-way: it informs design choices and releases, not only incidents.

Principles for an observable org

  • Productize telemetry: owners, roadmaps, SLAs for data quality and latency.
  • Design with SLOs: define service-level objectives before writing code; use error budgets to pace change.
  • Consistent dimensions: standard tags (service, version, region, tenant, feature_flag) across all signals.
  • High-signal alerts: page on user impact (SLO burn), not on CPU wiggles.
  • Privacy by design: structured logs sans PII; redaction at source; data retention tiers.

Architecture: a thin, opinionated pipeline

  • Instrumentation: OpenTelemetry auto + manual spans; semantic conventions for HTTP, DB, messaging.
  • Collection: sidecar/daemonset collectors with tail-sampling for traces; log dynamic sampling.
  • Routing: hot (real-time ops), warm (24–72h analysis), cold (BI/finance) storage with lifecycle policies.
  • Contracts: versioned event schemas (Avro/JSON Schema); breaking changes go through design review.

Use cases that pay rent

  • Reliability: SLO dashboards, error budget policies, release freeze when burn exceeds threshold.
  • Product: correlate feature flags to conversion, latency to churn; ship data-informed rollouts.
  • Finance: unit economics ($/request, $/tenant), capacity planning, chargeback/showback.
  • Security: anomaly detection on auth flows; audit trails tied to trace IDs.

Instrumentation checklist (copy-ready)

  • Adopt service.name, service.version, deployment.environment, tenant.id, feature.flag as standard attributes.
  • Emit business events (signup, checkout, publish) as first-class signals with IDs joining to traces.
  • Make retries visible: include attempt count and idempotency keys.
  • Sample with intent: head-based for dev, tail-based (error/latency weighted) in prod.
  • Structure logs (JSON), no stack traces in single lines without context keys.

Example: OpenTelemetry (pseudo)

// Trace a checkout with business attributes
const span = tracer.startSpan("checkout");
span.setAttributes({
"service.name": "web-api",
"service.version": "1.12.3",
"tenant.id": tenantId,
"feature.flag": "new-pricing",
"cart.value": cartTotal,
"customer.segment": segment
});
// ... call payment, inventory ...
span.end();

Structured log example

{
"ts": "2025-08-15T10:42:31Z",
"level": "ERROR",
"service": "payment-svc",
"op": "charge",
"request_id": "req_92f...",
"trace_id": "4f8c...",
"tenant_id": "acme",
"amount": 1299,
"currency": "INR",
"error": "card_declined",
"attempt": 2
}

Queries that change conversations

-- SLO burn (last 60m) for checkout p95>600ms
SELECT sum(burn_minutes) FROM slo_burn WHERE service='checkout' AND window='60m';
-- Release impact: error rate by version
SELECT service.version, rate(errors[5m])
FROM traces WHERE service.name='web-api' GROUP BY service.version;
-- Unit cost: $/request by tenant
SELECT tenant_id, sum(cost_cpu+cost_storage+egress)/count(request_id)
FROM usage_cost WHERE service='reporting' GROUP BY tenant_id;

Dashboards before code (what good looks like)

  • Reliability: SLO burn, golden signals (latency p95/p99, errors, traffic, saturation), dependency health.
  • Product: feature flag adoption, conversion vs latency, release cohort comparisons.
  • Cost: $/request, cache hit rate, expensive query leaderboard.

Operating model & roles

  • Telemetry guild: patterns, templates, semantic conventions.
  • Service owners: publish SLOs, runbooks, and dashboards; fix broken windows.
  • BI/Data: joins telemetry to revenue and engagement; defines unit metrics.
  • Security: policy for PII, retention, and audit.

Alerting: page less, act faster

  • Page on user pain (SLO burn), ticket on system pain (CPU, queue depth).
  • Use multi-window, multi-burn-rate alerts (fast + slow) to catch both spikes and leaks.
  • Attach runbooks and saved queries to every alert.

30 / 60 / 90 rollout

  1. 30 days: choose two critical journeys; define SLOs; instrument standard attributes; stand up one reliability and one product dashboard.
  2. 60 days: tail-sampling in prod; adopt structured logs; enable burn-rate alerts; link feature flags to traces.
  3. 90 days: publish unit economics ($/req) for one service; review error-budget policy in change management; add telemetry checks to CI.

Definition of Done (for an observable service)

  • SLOs and error budgets published; burn-rate alerts wired with runbooks.
  • Traces, metrics, and logs share IDs and semantic attributes.
  • Dashboards cover reliability, product impact, and cost.
  • Event schemas versioned; breaking changes reviewed.
  • Privacy guardrails and retention policies enforced.

Anti-patterns to avoid

  • Graph gardens: pretty charts without decisions attached.
  • PII-in-logs: privacy and cost time bombs—redact at source.
  • Alert floods: paging on infra noise; tune for user impact.
  • One-off instrumentation: no shared IDs, no joins, no truth.

Observability becomes culture when telemetry changes decisions, not just dashboards. Make signals coherent, make impact visible, and make reliability and unit economics part of every launch review. The payoff isn’t fewer incidents—it’s better products, shipped faster, with eyes wide open.