Skip to content

Fields & discovery ​

Because HeliosLogs is schema-on-read, there's no field list to declare or maintain — fields are discovered from your data at query time. This page covers how to find what's there and filter by it.

The field panel ​

The left panel on the search page lists the fields present in your current results. For each field it shows:

  • Value breakdown — the top values with counts and a relative bar. Click a value to filter by it (and click again to remove the filter).
  • Coverage — the fraction of matching events that contain the field.
  • Value kind — string, number, boolean, timestamp, or mixed.
  • Cardinality — roughly how many distinct values the field has.

Pin the fields you reference often so they stay at the top, and filter the list by name to find a field quickly. Panels load their value breakdowns on demand and refresh in place when you change the query or time range.

What "groupable" and "interesting" mean ​

HeliosLogs flags fields to guide analysis:

  • Groupable — dense enough to be a useful by dimension in | stats … by field (reasonable coverage and at least a couple of distinct values).
  • Interesting — glanceable facets with high coverage and low cardinality (the shape of severity, status, method); these auto-expand so you see them first.

Field discovery API ​

The field panel and the AI/MCP tools are backed by GET /api/discover_fields, which samples events for a query and ranks the JSON keys present. Useful parameters:

ParameterNotes
qA query to scope discovery (same syntax as search).
env, indexScope by environment / index.
start, endTime bounds.
sampleMax docs sampled (up to 10,000).
topMax fields returned (default 30, up to 100).

Each returned field includes its coverage, distinct-value count (capped at 1000, with a flag when capped), value kind, a few sample values, and the groupable / interesting flags.

Dynamic path semantics ​

Worth remembering when querying fields:

  • Dotted paths address nested data: error.type, http.status_code. See nested objects.
  • Multi-valued fields come from arrays: items.qty:1 matches if any element qualifies. See arrays.
  • Mixed-type fields (a number in one event, a string in another) are preserved — both are queryable.

The universal-core fields (timestamp, message, raw, source, plus the index) are handled structurally and don't appear in discovery — query them directly.