Skip to content
Last9
Book demo

Metrics

Everything you need to know to start exploring metrics with Last9.

Sending Metrics to Last9

You can send a variety of metrics to Last9 from different sources:

You can also view the list of integrations in the Last9 app under the Metrics category on the Integrations screen.

Exploring Metrics

There are 3 primary ways of exploring metrics depending on your use case.

  • Metrics Explorer: Use Last9’s native UI for metrics with a guided Builder mode for filters, range, and aggregation, or a PromQL-compatible Code mode for advanced queries. Promote any query to a dashboard panel or turn it into an alert without rewriting it. Learn more.
  • Dashboards: Build PromQL-powered panels and group them into reusable dashboards with variables and time controls. Learn more.
  • Grafana: For teams that prefer Grafana, use Last9’s embedded Grafana instance against the same metrics backend.

Alerting on Metrics

To create alerts on metrics, use Alert Studio. You can also turn any Metrics Explorer query into an alert directly from the results panel — see Creating Alerts from Queries.


Troubleshooting

  • Metric appears in Last9 but some labels are missing

    If a metric is visible in Last9 but one or more labels are absent from the series, the most likely cause is that the label value was an empty string when the metric was recorded.

    Last9 follows the Prometheus data model: a label with an empty value is treated as if that label does not exist. The metric value is stored and queryable, but the label dimension is simply absent — no error is returned.

    This affects any instrumentation sending metrics via OTLP or Prometheus remote write, regardless of language.

    How to confirm: query the metric without any label filters and inspect the returned series. If a label you expect (e.g. product_type) is missing from some series but present on others, those series had an empty value for that label at record time.

    Fix: ensure the attribute value is non-empty before recording. Use a sentinel value like "unknown" if the value may not always be set:

    // Go example — same principle applies to any language
    if productType == "" {
    productType = "unknown"
    }
    counter.Add(ctx, 1, otelmetric.WithAttributes(
    attribute.String("product_type", productType),
    ))
    # Python example
    product_type = product_type or "unknown"
    counter.add(1, {"product_type": product_type})
    // Java example
    String productType = rawProductType != null && !rawProductType.isEmpty()
    ? rawProductType : "unknown";
    counter.add(1, Attributes.of(AttributeKey.stringKey("product_type"), productType));

    For more detail on sending custom metrics via OpenTelemetry, see the Go custom metrics guide.

Please get in touch with us on Discord or Email if you have any questions.