Stop
Drowning in
Metrics

Custom metrics are expensive, time-consuming, and easy to get wrong. Discover how teams are drastically improving their observability while reducing complexity and cost.

Reduce costs substantially

Stop paying for metrics cardinality.

Store traces once, derive only the metrics you need.

Write less code

Replace bespoke metric definitions with structured trace spans. Let tracing libraries handle the heavily lifting.

Resolve incidents faster

Jump from alert to root cause in seconds by linking metrics to the exact traces that generated them.

No Custom Metrics

Traditional metrics-based observability is fundamentally flawed

Instrumentation Burden

Engineers must manually add counters, gauges, and histograms throughout the codebase while predicting the failure modes each metric will help detect.

Runaway Costs

Metrics often represent the largest share of observability spend. As systems scale, storing and retaining metrics can cost more than the underlying infrastructure itself.

Cardinality Traps

Every new label creates additional time series. Teams are forced to choose between limiting context and losing answers or preserving context and driving up costs.

Lost Context

Metrics obscure the story of individual requests. When latency spikes, teams are unable to drill down to see which requests were slow or understand why.

NoMetrics Solution

Generate core application metrics from traces. Query the rest on demand.

// From a single OpenTelemetry trace span...

{
  "trace.id": "5ba4ac9fce980850b8d904bea08f4a18",
  "span.id": "0e806986ef7586cb",
  "service.name": "checkout",
  "service.version": "2.1.3",
  "span.name": "oteldemo.CheckoutService/PlaceOrder",
  "span.kind": "server",
  "span.status": "ok",
  "rpc.server": "oteldemo.CheckoutService",
  "rpc.method": "PlaceOrder",
  "rpc.grpc.status_code": 0,
  "app.user.currency": "GBP",
  "app.order.amount": 1389,
  "app.order.items.count": 3,
  "aws.region": "us-west-2",
  "k8s.cluster": "p-aws-01",
  "k8s.namespace.name": "store",
  "k8s.deployment.name": "checkout",
  "k8s.pod.name": "checkout-6c58657647-nzb9c"
}

// Derive the metrics you need:

→ calls_total{service_name="checkout", rpc_method="PlaceOrder"}

→ duration_seconds_bucket{rpc_grpc_status_code="0"}

→ calls_total{service_version="2.1.3", status_code="STATUS_CODE_ERROR"}

Derive, Don't Duplicate

Every trace span already contains the dimensions needed to understand application behavior. Derive metrics from essential dimensions now and query any others as needed on the fly.

  • Accuracy: Metrics are computed from the full trace stream before sampling, ensuring accurate system-wide visibility.
  • Full context: Move from high-level metrics to the exact slow or failing request in a single step.
  • No cardinality constraints: Add additional dimensions without fearing the impact on storage or costs.
  • Retroactive analysis: Ask new questions on historical traffic without re-instrumenting or replaying data.

Unified Instrumentation

Standardize on OpenTelemetry semantic conventions and use consistent span attributes, so that every team emits the same shape of telemetry.

  • Single source of truth: Traces are the system of record from which metrics are derived automatically.
  • Avoid confusion: No need to memorize metric names and labels or look up decisions embedded across codebases.
  • Faster rollout: Consistent instrumentation across services, languages, and frameworks leads to rapid adoption.
  • Measure Anything: Custom spans automatically reveal the rate and duration of any activity.
func (s *Server) PlaceOrder(
   ctx context.Context,
   req *PlaceOrderRequest,
) (*PlaceOrderResponse, error) {

    span := trace.SpanFromContext(ctx)

    // business logic ...

    span.SetAttributes(
      attribute.String("app.order.id", orderID.String()),
      attribute.String("app.user.id", req.UserId),
      attribute.String("app.user.currency", req.UserCurrency),
      attribute.Float64("app.order.amount", 1389),
      attribute.Int("app.order.items.count", 3),
    )

    resp := &pb.PlaceOrderResponse{Order: orderResult}

    return resp, nil
}
0ms100ms200ms300ms400mscartcheckoutpaymentsadsproduct-catalogP99 Latency by Service

Unified Visibility

Since metrics are derived from a shared tracing data model, get immediate insights into request rates, errors, and durations across the entire system, with the ability to drill down directly into traces when something appears wrong.

  • Consistency: Every service exposes the same core telemetry automatically, reducing dashboard sprawl and operational overhead.
  • Shared Understanding: Teams reason about system behavior consistently across services.
  • Simplified Debugging: Investigations are accelerated because teams can drill down into the traces of each affected service to find answers.
TracesDerived Metricscalls_total{service_name="product-catalog"}duration_seconds_bucket{service_name="cart"}SLOsAlertingAutoscalingCanary Analysis

Unified Operations

Use metrics derived from traces to power everything from alerts and SLOs to autoscaling and canary deployments.

  • Alerting: Uniform alerting across all teams and services.
  • Autoscaling: Consistent autoscaling configuration driven by trace metrics.
  • Canary Analysis: Detect regressions during canary deployments using RED metrics derived from traces.
servicestimeseriescustom metricstrace metrics

Controlled Cardinality

Select which span attributes become metric labels while preserving full context in traces for on-demand analysis.

  • Deterministic cost: Limit metric dimensions to keep storage and query performance predictable, preventing unexpected spikes in cost.
  • No blindspots: Retain high-cardinality attributes in traces to facilitate investigations.

Our Approach

4-step proven path to unlocking observability excellence

Discovery

Our team analyzes your current observability setup to identify gaps in capabilities and opportunities to optimize costs.

Design

We design a unified tracing-first approach that creates a consistent telemetry model every team can standardize on.

Implementation

We guide your team in instrumenting services with OpenTelemetry and configuring pipelines that automatically derive metrics from traces.

Enablement

We help your team unlock all of the benefits and advanced capabilities of the NoMetrics approach.

Ready to Embrace NoMetrics?

Schedule a free strategy session to learn how we can help.