Logs you can afford to keep in full.

Logs arrive from the OpenTelemetry Collector, Grafana Alloy or an SDK, and read back over a LogQL-compatible API. They sit in the same tenant as the trace that produced them, so a failing span and its output are one query apart.

Included on the free tier: 20,000 active series, 50 GB of logs and 50 GB of traces a month. No card.

Demonstration data
insight / log managementLIVE
Explore · last 15 min
{service_name="payments-api"} |= "timeout"
ERRORupstream timeout after 3000ms trace_id=4f2c9a1b14:22:07.412
WARNretry 2/3 for charge_id=ch_881214:22:07.418
ERRORcircuit opened for psp.authorize14:22:07.902
INFOfallback queued, 41 pending14:22:08.110

Ships from

  • OpenTelemetry Collector
  • Grafana Alloy
  • OpenTelemetry SDKs
  • Fluent Bit
Trademarks

What you get

Included on every plan, including the free tier.

explore / labels
Label values · last 1h
LabelValuesStreams
service_name14212
level4212
k8s_namespace_name6198
k8s_pod_name88188
deployment_environment3212

How it gets there

Three steps, then it is reporting.

Logs travel the same path as every other signal: into the agent, out with the tenant header.

  1. Send logs to the agent over OTLP, or scrape files with Alloy.

  2. The agent forwards them with the tenant header.

  3. Query them by label in Insights, or from Grafana.

Demonstration data
config.alloy
// 01 · tail files and hand them to the OTLP pipeline
loki.source.file "app" {
  targets    = [{__path__ = "/var/log/app/*.log"}]
  forward_to = [otelcol.receiver.loki.default.receiver]
}
// 02 · the agent forwards with the tenant header
agent → xScaler · 1,284 lines/s
# 03 · queryable by labelreporting
service_name "payments-api"
level "error"
trace_id "4f2c9a1b…"
lines / 5m 4,120

What you can ask

What that looks like as a query.

Paste any of these into Insights, or use them as an alert rule.

01 · LOGQL
{service_name="payments-api"} |= "timeout"

One service, one word, no index to plan.

A label selector and a line filter. Nothing to declare up front.

02 · LOGQL
{service_name=~".+"} | json | status >= 500

Structured fields filtered after parsing.

Parse the JSON body, then filter on a field inside it.

03 · LOGQL
sum by (level) (
  count_over_time({service_name="checkout"}[5m]))

Error rate straight out of the log stream.

A metric query over logs, usable as a panel or an alert rule.

Questions

What teams ask about the log pipeline.

Something not here? Talk to an engineer who works on the platform.

Book thirty minutes

The query API is Loki-compatible, so your dashboards, alert rules and logcli habits carry over. What changes is that you are not running the storage behind it.

Start on the free tier.

20,000 active series, 50 GB of logs and 50 GB of traces a month, 90-day retention, and the whole of Insights.