Endpoints

Telemetry query

GET/api/v1/organizations/{org_id}/telemetry/traces

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

org_id*Org Id
Formatuuid

Query Parameters

start?|null
end?|null
relative?string|null
service_name?array<string>|

Repeatable — values OR together (e.g. two occurrences match either service). A single occurrence is unchanged from before this field was repeatable (issue #331).

service_name_exclude?array<string>|

Same shape as 'service_name', negated: excludes rows matching any of these values. If a value appears in both 'service_name' and this field, it is excluded — exclude always wins on conflict.

status_code?array<string>|

Repeatable (issue #331) — same semantics as 'service_name'.

status_code_exclude?array<string>|

Same shape as 'status_code', negated — same semantics as 'service_name_exclude'.

span_name?string|null
q?string|null
q_lang?Q Lang

Language q is written in (#177). lucene is the default and what every request omitting this field gets. sql reads q as a bare ClickHouse predicate, AND-joined under the tenant clamp so it can only narrow — see docs/v2/architecture/TELEMETRY_INGESTION_ARCHITECTURE.md §9.3.1.

Default"lucene"

Value in

  • "lucene"
  • "sql"
attribute_key?array<string>|

Repeatable, index-aligned with 'attribute_value' (issue #331): the i-th key pairs with the i-th value. Values sharing a key OR together; distinct keys AND together. A single (key, value) pair is unchanged from before this field was repeatable.

attribute_value?array<string>|

Paired with 'attribute_key' — see its description.

attribute_key_exclude?array<string>|

Same shape as 'attribute_key', negated — pairs with 'attribute_value_exclude'. A key excluded here is excluded even if the same key/value also appears in 'attribute_key'/'attribute_value'.

attribute_value_exclude?array<string>|

Paired with 'attribute_key_exclude' — see its description.

pattern_hash?|

Narrow to one Event Patterns cluster (#179). Pass a pattern_hash from the patterns endpoint back verbatim — it is a UInt64 carried as a string because the larger values exceed JavaScript's Number.MAX_SAFE_INTEGER. The hash is derived from the message, not stored, so a value produced before a change to the mask list will match nothing; see §9.11.

limit?Limit
Range1 <= value <= 1000
Default100
offset?Offset
Range0 <= value
Default0
cursor_time?|null
cursor_id?string|null
select?|

Comma-separated column projection (§9.9, issue #356), e.g. 'service_name,span_name'. 'row_id' is always included. Absent returns the full row, unchanged from before this parameter existed.

order_by?|

' asc|desc' (§9.9, issue #356). Only 'start_time' is sortable — the keyset cursor is typed against it. Absent means 'start_time desc', unchanged from before this parameter existed.

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/telemetry/traces"
[  {    "trace_id": "string",    "span_id": "string",    "service_name": "string",    "span_name": "string",    "duration_ns": 0,    "status_code": "string",    "start_time": "2019-08-24T14:15:22Z",    "row_id": "string"  }]
GET/api/v1/organizations/{org_id}/telemetry/traces/tail

Live-tail follow read: rows strictly newer than cursor_time/ cursor_id, ascending, plus the cursor for the next poll. Registered ahead of GET /traces/{trace_id} — Starlette matches routes in registration order, and "tail" would otherwise be consumed as a trace_id path param.

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

org_id*Org Id
Formatuuid

Query Parameters

start?|null
end?|null
relative?string|null
service_name?array<string>|

Repeatable — values OR together (e.g. two occurrences match either service). A single occurrence is unchanged from before this field was repeatable (issue #331).

service_name_exclude?array<string>|

Same shape as 'service_name', negated: excludes rows matching any of these values. If a value appears in both 'service_name' and this field, it is excluded — exclude always wins on conflict.

status_code?array<string>|

Repeatable (issue #331) — same semantics as 'service_name'.

status_code_exclude?array<string>|

Same shape as 'status_code', negated — same semantics as 'service_name_exclude'.

span_name?string|null
q?string|null
q_lang?Q Lang

Language q is written in (#177). lucene is the default and what every request omitting this field gets. sql reads q as a bare ClickHouse predicate, AND-joined under the tenant clamp so it can only narrow — see docs/v2/architecture/TELEMETRY_INGESTION_ARCHITECTURE.md §9.3.1.

Default"lucene"

Value in

  • "lucene"
  • "sql"
attribute_key?array<string>|

Repeatable, index-aligned with 'attribute_value' (issue #331): the i-th key pairs with the i-th value. Values sharing a key OR together; distinct keys AND together. A single (key, value) pair is unchanged from before this field was repeatable.

attribute_value?array<string>|

Paired with 'attribute_key' — see its description.

attribute_key_exclude?array<string>|

Same shape as 'attribute_key', negated — pairs with 'attribute_value_exclude'. A key excluded here is excluded even if the same key/value also appears in 'attribute_key'/'attribute_value'.

attribute_value_exclude?array<string>|

Paired with 'attribute_key_exclude' — see its description.

pattern_hash?|

Narrow to one Event Patterns cluster (#179). Pass a pattern_hash from the patterns endpoint back verbatim — it is a UInt64 carried as a string because the larger values exceed JavaScript's Number.MAX_SAFE_INTEGER. The hash is derived from the message, not stored, so a value produced before a change to the mask list will match nothing; see §9.11.

limit?Limit
Range1 <= value <= 1000
Default100
cursor_time?|null
cursor_id?string|null

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/telemetry/traces/tail"
{  "records": [    {      "trace_id": "string",      "span_id": "string",      "service_name": "string",      "span_name": "string",      "duration_ns": 0,      "status_code": "string",      "start_time": "2019-08-24T14:15:22Z",      "row_id": "string"    }  ],  "next_cursor": {    "cursor_time": "2019-08-24T14:15:22Z",    "cursor_id": "string"  },  "gap": false}
GET/api/v1/organizations/{org_id}/telemetry/traces/histogram

Record counts per time bucket for the volume-over-time chart above the trace list (§9.6). Registered ahead of GET /traces/{trace_id} — same reason as /traces/tail: Starlette matches routes in registration order, and "histogram" would otherwise be consumed as a trace_id path param.

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

org_id*Org Id
Formatuuid

Query Parameters

start?|null
end?|null
relative?string|null
service_name?array<string>|

Repeatable — values OR together (e.g. two occurrences match either service). A single occurrence is unchanged from before this field was repeatable (issue #331).

service_name_exclude?array<string>|

Same shape as 'service_name', negated: excludes rows matching any of these values. If a value appears in both 'service_name' and this field, it is excluded — exclude always wins on conflict.

status_code?array<string>|

Repeatable (issue #331) — same semantics as 'service_name'.

status_code_exclude?array<string>|

Same shape as 'status_code', negated — same semantics as 'service_name_exclude'.

span_name?string|null
q?string|null
q_lang?Q Lang

Language q is written in (#177). lucene is the default and what every request omitting this field gets. sql reads q as a bare ClickHouse predicate, AND-joined under the tenant clamp so it can only narrow — see docs/v2/architecture/TELEMETRY_INGESTION_ARCHITECTURE.md §9.3.1.

Default"lucene"

Value in

  • "lucene"
  • "sql"
attribute_key?array<string>|

Repeatable, index-aligned with 'attribute_value' (issue #331): the i-th key pairs with the i-th value. Values sharing a key OR together; distinct keys AND together. A single (key, value) pair is unchanged from before this field was repeatable.

attribute_value?array<string>|

Paired with 'attribute_key' — see its description.

attribute_key_exclude?array<string>|

Same shape as 'attribute_key', negated — pairs with 'attribute_value_exclude'. A key excluded here is excluded even if the same key/value also appears in 'attribute_key'/'attribute_value'.

attribute_value_exclude?array<string>|

Paired with 'attribute_key_exclude' — see its description.

pattern_hash?|

Narrow to one Event Patterns cluster (#179). Pass a pattern_hash from the patterns endpoint back verbatim — it is a UInt64 carried as a string because the larger values exceed JavaScript's Number.MAX_SAFE_INTEGER. The hash is derived from the message, not stored, so a value produced before a change to the mask list will match nothing; see §9.11.

group_by?Group By

Group per-bucket counts by status_code

Defaultfalse

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/telemetry/traces/histogram"
{  "buckets": [    {      "bucket_start": "2019-08-24T14:15:22Z",      "bucket_end": "2019-08-24T14:15:22Z",      "count": 0,      "groups": {        "property1": 0,        "property2": 0      }    }  ],  "bucket_width_seconds": 0,  "scanned_rows": 0,  "elapsed_seconds": 0}
GET/api/v1/organizations/{org_id}/telemetry/traces/facets

Facet counts for the Explorer's left filter panel (§9.7, issue #147): distinct service_name/status_code values with counts, plus top attribute values per key across both Map columns, all computed under the SAME active filters GET /traces applies (minus each facet's own field, so narrowing a selection within one facet still shows its sibling values). Registered ahead of GET /traces/{trace_id} — same reason as /traces/tail and /traces/histogram: Starlette matches routes in registration order, and "facets" would otherwise be consumed as a trace_id path segment.

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

org_id*Org Id
Formatuuid

Query Parameters

start?|null
end?|null
relative?string|null
service_name?array<string>|

Repeatable — values OR together (e.g. two occurrences match either service). A single occurrence is unchanged from before this field was repeatable (issue #331).

service_name_exclude?array<string>|

Same shape as 'service_name', negated: excludes rows matching any of these values. If a value appears in both 'service_name' and this field, it is excluded — exclude always wins on conflict.

status_code?array<string>|

Repeatable (issue #331) — same semantics as 'service_name'.

status_code_exclude?array<string>|

Same shape as 'status_code', negated — same semantics as 'service_name_exclude'.

span_name?string|null
q?string|null
q_lang?Q Lang

Language q is written in (#177). lucene is the default and what every request omitting this field gets. sql reads q as a bare ClickHouse predicate, AND-joined under the tenant clamp so it can only narrow — see docs/v2/architecture/TELEMETRY_INGESTION_ARCHITECTURE.md §9.3.1.

Default"lucene"

Value in

  • "lucene"
  • "sql"
attribute_key?array<string>|

Repeatable, index-aligned with 'attribute_value' (issue #331): the i-th key pairs with the i-th value. Values sharing a key OR together; distinct keys AND together. A single (key, value) pair is unchanged from before this field was repeatable.

attribute_value?array<string>|

Paired with 'attribute_key' — see its description.

attribute_key_exclude?array<string>|

Same shape as 'attribute_key', negated — pairs with 'attribute_value_exclude'. A key excluded here is excluded even if the same key/value also appears in 'attribute_key'/'attribute_value'.

attribute_value_exclude?array<string>|

Paired with 'attribute_key_exclude' — see its description.

pattern_hash?|

Narrow to one Event Patterns cluster (#179). Pass a pattern_hash from the patterns endpoint back verbatim — it is a UInt64 carried as a string because the larger values exceed JavaScript's Number.MAX_SAFE_INTEGER. The hash is derived from the message, not stored, so a value produced before a change to the mask list will match nothing; see §9.11.

top_n?Top N

Max attribute values returned per attribute key

Range1 <= value <= 50
Default10

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/telemetry/traces/facets"
{  "service_name": {    "values": [      {        "value": "string",        "count": 0      }    ],    "truncated": false  },  "status_code": {    "values": [      {        "value": "string",        "count": 0      }    ],    "truncated": false  },  "attributes": [    {      "key": "string",      "values": [        {          "value": "string",          "count": 0        }      ],      "total_distinct": 0    }  ],  "resource_attributes": [    {      "key": "string",      "values": [        {          "value": "string",          "count": 0        }      ],      "total_distinct": 0    }  ]}
GET/api/v1/organizations/{org_id}/telemetry/traces/patterns

Event Patterns over traces (§9.11) — span names clustered by shape, each with an exact count.

No pattern_hash parameter, unlike its list/tail/histogram/facets siblings: this endpoint produces the hashes rather than filtering by one, and accepting it here would mean asking which patterns exist inside a single pattern.

Registered above /traces/{trace_id} for the same reason /traces/tail and /traces/histogram are — a path parameter declared first would swallow the literal segment and route patterns in as a trace id.

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

org_id*Org Id
Formatuuid

Query Parameters

start?|null
end?|null
relative?string|null
service_name?array<string>|

Repeatable — values OR together (e.g. two occurrences match either service). A single occurrence is unchanged from before this field was repeatable (issue #331).

service_name_exclude?array<string>|

Same shape as 'service_name', negated: excludes rows matching any of these values. If a value appears in both 'service_name' and this field, it is excluded — exclude always wins on conflict.

status_code?array<string>|

Repeatable (issue #331) — same semantics as 'service_name'.

status_code_exclude?array<string>|

Same shape as 'status_code', negated — same semantics as 'service_name_exclude'.

span_name?string|null
q?string|null
q_lang?Q Lang

Language q is written in (#177). lucene is the default and what every request omitting this field gets. sql reads q as a bare ClickHouse predicate, AND-joined under the tenant clamp so it can only narrow — see docs/v2/architecture/TELEMETRY_INGESTION_ARCHITECTURE.md §9.3.1.

Default"lucene"

Value in

  • "lucene"
  • "sql"
attribute_key?array<string>|

Repeatable, index-aligned with 'attribute_value' (issue #331): the i-th key pairs with the i-th value. Values sharing a key OR together; distinct keys AND together. A single (key, value) pair is unchanged from before this field was repeatable.

attribute_value?array<string>|

Paired with 'attribute_key' — see its description.

attribute_key_exclude?array<string>|

Same shape as 'attribute_key', negated — pairs with 'attribute_value_exclude'. A key excluded here is excluded even if the same key/value also appears in 'attribute_key'/'attribute_value'.

attribute_value_exclude?array<string>|

Paired with 'attribute_key_exclude' — see its description.

top_n?Top N

Max patterns returned, most frequent first.

Range1 <= value <= 200
Default50

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/telemetry/traces/patterns"
{  "patterns": [    {      "pattern_hash": "string",      "pattern": "string",      "count": 0,      "sample": "string",      "first_seen": "2019-08-24T14:15:22Z",      "last_seen": "2019-08-24T14:15:22Z"    }  ],  "truncated": true}
GET/api/v1/organizations/{org_id}/telemetry/traces/span-peers

Where one span's duration falls among spans sharing its name and service (#441).

Registered ahead of GET .../traces/{trace_id} for the same reason /tail, /histogram and /facets are: otherwise span-peers is consumed as a trace_id path segment.

The window is server-chosen (PEER_WINDOW), not a caller parameter. It is a baseline, and letting the caller widen it turns a fixed comparison into another unbounded scan knob of exactly the kind §9.1 bounds elsewhere.

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

org_id*Org Id
Formatuuid

Query Parameters

span_name*Span Name

The span's name, matched exactly.

service_name*Service Name

The span's service, matched exactly.

subject_ns*Subject Ns

The subject span's own duration, ranked against its peers.

Range0 <= value

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/telemetry/traces/span-peers?span_name=string&service_name=string&subject_ns=0"
{  "span_name": "string",  "service_name": "string",  "count": 0,  "window_seconds": 0,  "p50_ns": 0,  "p95_ns": 0,  "p99_ns": 0,  "subject_ns": 0,  "percentile": 0}
GET/api/v1/organizations/{org_id}/telemetry/traces/{trace_id}

Span tree for one trace_id (#148): spans assembled into a parent/child forest by parent_span_id, root spans (no parent, including orphans) at the top level, siblings ordered by start_time. Replaces the flat span-list shape this endpoint returned before.

With include_events=true each span also carries its events, which is what the Explorer's Span Events panel (#159) and the waterfall's span- events toggle (#176) render. Served here rather than from a per-span endpoint because the waterfall interleaves events across every span in the trace — one query, not one per span (§9.8).

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

org_id*Org Id
Formatuuid
trace_id*Trace Id

Query Parameters

include_events?Include Events

Include each span's events (#304). Off by default because the Events.* arrays are the one unbounded thing on a span row — the surfaces that do not render events should not pay for them. Capped per span (MAX_SPAN_EVENTS_PER_SPAN) and per trace (MAX_TRACE_EVENTS); either cap firing sets events_truncated.

Defaultfalse

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/telemetry/traces/string"
{  "trace_id": "string",  "roots": [    {      "trace_id": "string",      "span_id": "string",      "service_name": "string",      "span_name": "string",      "duration_ns": 0,      "status_code": "string",      "start_time": "2019-08-24T14:15:22Z",      "row_id": "string",      "parent_span_id": "string",      "span_kind": "string",      "attributes": {        "property1": "string",        "property2": "string"      },      "resource_attributes": {        "property1": "string",        "property2": "string"      },      "scope_name": "",      "events": [        {          "timestamp": "2019-08-24T14:15:22Z",          "name": "string",          "attributes": {            "property1": "string",            "property2": "string"          }        }      ],      "events_truncated": false,      "children": [        {}      ]    }  ],  "depth_flattened": false,  "span_count": 0,  "error_count": 0,  "truncated": false,  "events_truncated": false}
GET/api/v1/organizations/{org_id}/telemetry/logs

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

org_id*Org Id
Formatuuid

Query Parameters

start?|null
end?|null
relative?string|null
service_name?array<string>|

Repeatable — values OR together (e.g. two occurrences match either service). A single occurrence is unchanged from before this field was repeatable (issue #331).

service_name_exclude?array<string>|

Same shape as 'service_name', negated: excludes rows matching any of these values. If a value appears in both 'service_name' and this field, it is excluded — exclude always wins on conflict.

severity_text?array<string>|

Repeatable (issue #331) — same semantics as 'service_name'. Case-insensitive, matches the canonical severity (§9.1).

severity_text_exclude?array<string>|

Same shape as 'severity_text', negated — same semantics as 'service_name_exclude'.

q?string|null
q_lang?Q Lang

Language q is written in (#177). lucene is the default and what every request omitting this field gets. sql reads q as a bare ClickHouse predicate, AND-joined under the tenant clamp so it can only narrow — see docs/v2/architecture/TELEMETRY_INGESTION_ARCHITECTURE.md §9.3.1.

Default"lucene"

Value in

  • "lucene"
  • "sql"
attribute_key?array<string>|

Repeatable, index-aligned with 'attribute_value' (issue #331): the i-th key pairs with the i-th value. Values sharing a key OR together; distinct keys AND together. A single (key, value) pair is unchanged from before this field was repeatable.

attribute_value?array<string>|

Paired with 'attribute_key' — see its description.

attribute_key_exclude?array<string>|

Same shape as 'attribute_key', negated — pairs with 'attribute_value_exclude'. A key excluded here is excluded even if the same key/value also appears in 'attribute_key'/'attribute_value'.

attribute_value_exclude?array<string>|

Paired with 'attribute_key_exclude' — see its description.

pattern_hash?|

Narrow to one Event Patterns cluster (#179). Pass a pattern_hash from the patterns endpoint back verbatim — it is a UInt64 carried as a string because the larger values exceed JavaScript's Number.MAX_SAFE_INTEGER. The hash is derived from the message, not stored, so a value produced before a change to the mask list will match nothing; see §9.11.

limit?Limit
Range1 <= value <= 1000
Default100
offset?Offset
Range0 <= value
Default0
cursor_time?|null
cursor_id?string|null
select?|

Comma-separated column projection (§9.9, issue #356), e.g. 'service_name,body'. 'row_id' is always included. Absent returns the full row, unchanged from before this parameter existed.

order_by?|

' asc|desc' (§9.9, issue #356). Only 'timestamp' is sortable — the keyset cursor is typed against it. Absent means 'timestamp desc', unchanged from before this parameter existed.

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/telemetry/logs"
[  {    "timestamp": "2019-08-24T14:15:22Z",    "trace_id": "string",    "span_id": "string",    "service_name": "string",    "severity_text": "string",    "severity_number": 0,    "body": "string",    "row_id": "string"  }]
GET/api/v1/organizations/{org_id}/telemetry/logs/tail

Live-tail follow read for logs — see tail_traces for the direction rationale.

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

org_id*Org Id
Formatuuid

Query Parameters

start?|null
end?|null
relative?string|null
service_name?array<string>|

Repeatable — values OR together (e.g. two occurrences match either service). A single occurrence is unchanged from before this field was repeatable (issue #331).

service_name_exclude?array<string>|

Same shape as 'service_name', negated: excludes rows matching any of these values. If a value appears in both 'service_name' and this field, it is excluded — exclude always wins on conflict.

severity_text?array<string>|

Repeatable (issue #331) — same semantics as 'service_name'. Case-insensitive, matches the canonical severity (§9.1).

severity_text_exclude?array<string>|

Same shape as 'severity_text', negated — same semantics as 'service_name_exclude'.

q?string|null
q_lang?Q Lang

Language q is written in (#177). lucene is the default and what every request omitting this field gets. sql reads q as a bare ClickHouse predicate, AND-joined under the tenant clamp so it can only narrow — see docs/v2/architecture/TELEMETRY_INGESTION_ARCHITECTURE.md §9.3.1.

Default"lucene"

Value in

  • "lucene"
  • "sql"
attribute_key?array<string>|

Repeatable, index-aligned with 'attribute_value' (issue #331): the i-th key pairs with the i-th value. Values sharing a key OR together; distinct keys AND together. A single (key, value) pair is unchanged from before this field was repeatable.

attribute_value?array<string>|

Paired with 'attribute_key' — see its description.

attribute_key_exclude?array<string>|

Same shape as 'attribute_key', negated — pairs with 'attribute_value_exclude'. A key excluded here is excluded even if the same key/value also appears in 'attribute_key'/'attribute_value'.

attribute_value_exclude?array<string>|

Paired with 'attribute_key_exclude' — see its description.

pattern_hash?|

Narrow to one Event Patterns cluster (#179). Pass a pattern_hash from the patterns endpoint back verbatim — it is a UInt64 carried as a string because the larger values exceed JavaScript's Number.MAX_SAFE_INTEGER. The hash is derived from the message, not stored, so a value produced before a change to the mask list will match nothing; see §9.11.

limit?Limit
Range1 <= value <= 1000
Default100
cursor_time?|null
cursor_id?string|null

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/telemetry/logs/tail"
{  "records": [    {      "timestamp": "2019-08-24T14:15:22Z",      "trace_id": "string",      "span_id": "string",      "service_name": "string",      "severity_text": "string",      "severity_number": 0,      "body": "string",      "row_id": "string"    }  ],  "next_cursor": {    "cursor_time": "2019-08-24T14:15:22Z",    "cursor_id": "string"  },  "gap": false}
GET/api/v1/organizations/{org_id}/telemetry/logs/histogram

Record counts per time bucket for the volume-over-time chart above the log list (§9.6) — logs' counterpart to histogram_traces.

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

org_id*Org Id
Formatuuid

Query Parameters

start?|null
end?|null
relative?string|null
service_name?array<string>|

Repeatable — values OR together (e.g. two occurrences match either service). A single occurrence is unchanged from before this field was repeatable (issue #331).

service_name_exclude?array<string>|

Same shape as 'service_name', negated: excludes rows matching any of these values. If a value appears in both 'service_name' and this field, it is excluded — exclude always wins on conflict.

severity_text?array<string>|

Repeatable (issue #331) — same semantics as 'service_name'. Case-insensitive, matches the canonical severity (§9.1).

severity_text_exclude?array<string>|

Same shape as 'severity_text', negated — same semantics as 'service_name_exclude'.

q?string|null
q_lang?Q Lang

Language q is written in (#177). lucene is the default and what every request omitting this field gets. sql reads q as a bare ClickHouse predicate, AND-joined under the tenant clamp so it can only narrow — see docs/v2/architecture/TELEMETRY_INGESTION_ARCHITECTURE.md §9.3.1.

Default"lucene"

Value in

  • "lucene"
  • "sql"
attribute_key?array<string>|

Repeatable, index-aligned with 'attribute_value' (issue #331): the i-th key pairs with the i-th value. Values sharing a key OR together; distinct keys AND together. A single (key, value) pair is unchanged from before this field was repeatable.

attribute_value?array<string>|

Paired with 'attribute_key' — see its description.

attribute_key_exclude?array<string>|

Same shape as 'attribute_key', negated — pairs with 'attribute_value_exclude'. A key excluded here is excluded even if the same key/value also appears in 'attribute_key'/'attribute_value'.

attribute_value_exclude?array<string>|

Paired with 'attribute_key_exclude' — see its description.

pattern_hash?|

Narrow to one Event Patterns cluster (#179). Pass a pattern_hash from the patterns endpoint back verbatim — it is a UInt64 carried as a string because the larger values exceed JavaScript's Number.MAX_SAFE_INTEGER. The hash is derived from the message, not stored, so a value produced before a change to the mask list will match nothing; see §9.11.

group_by?Group By

Group per-bucket counts by severity_text

Defaultfalse

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/telemetry/logs/histogram"
{  "buckets": [    {      "bucket_start": "2019-08-24T14:15:22Z",      "bucket_end": "2019-08-24T14:15:22Z",      "count": 0,      "groups": {        "property1": 0,        "property2": 0      }    }  ],  "bucket_width_seconds": 0,  "scanned_rows": 0,  "elapsed_seconds": 0}
GET/api/v1/organizations/{org_id}/telemetry/logs/facets

Facet counts for the Explorer's left filter panel over logs (§9.7) — logs' counterpart to facets_traces (severity_text in place of status_code). No {log_id} path segment exists on this router, so there is no registration-order hazard the way traces/tail and traces/histogram have, but the route is placed alongside its trace counterpart for readability.

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

org_id*Org Id
Formatuuid

Query Parameters

start?|null
end?|null
relative?string|null
service_name?array<string>|

Repeatable — values OR together (e.g. two occurrences match either service). A single occurrence is unchanged from before this field was repeatable (issue #331).

service_name_exclude?array<string>|

Same shape as 'service_name', negated: excludes rows matching any of these values. If a value appears in both 'service_name' and this field, it is excluded — exclude always wins on conflict.

severity_text?array<string>|

Repeatable (issue #331) — same semantics as 'service_name'. Case-insensitive, matches the canonical severity (§9.1).

severity_text_exclude?array<string>|

Same shape as 'severity_text', negated — same semantics as 'service_name_exclude'.

q?string|null
q_lang?Q Lang

Language q is written in (#177). lucene is the default and what every request omitting this field gets. sql reads q as a bare ClickHouse predicate, AND-joined under the tenant clamp so it can only narrow — see docs/v2/architecture/TELEMETRY_INGESTION_ARCHITECTURE.md §9.3.1.

Default"lucene"

Value in

  • "lucene"
  • "sql"
attribute_key?array<string>|

Repeatable, index-aligned with 'attribute_value' (issue #331): the i-th key pairs with the i-th value. Values sharing a key OR together; distinct keys AND together. A single (key, value) pair is unchanged from before this field was repeatable.

attribute_value?array<string>|

Paired with 'attribute_key' — see its description.

attribute_key_exclude?array<string>|

Same shape as 'attribute_key', negated — pairs with 'attribute_value_exclude'. A key excluded here is excluded even if the same key/value also appears in 'attribute_key'/'attribute_value'.

attribute_value_exclude?array<string>|

Paired with 'attribute_key_exclude' — see its description.

pattern_hash?|

Narrow to one Event Patterns cluster (#179). Pass a pattern_hash from the patterns endpoint back verbatim — it is a UInt64 carried as a string because the larger values exceed JavaScript's Number.MAX_SAFE_INTEGER. The hash is derived from the message, not stored, so a value produced before a change to the mask list will match nothing; see §9.11.

top_n?Top N

Max attribute values returned per attribute key

Range1 <= value <= 50
Default10

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/telemetry/logs/facets"
{  "service_name": {    "values": [      {        "value": "string",        "count": 0      }    ],    "truncated": false  },  "severity_text": {    "values": [      {        "value": "string",        "count": 0      }    ],    "truncated": false  },  "attributes": [    {      "key": "string",      "values": [        {          "value": "string",          "count": 0        }      ],      "total_distinct": 0    }  ],  "resource_attributes": [    {      "key": "string",      "values": [        {          "value": "string",          "count": 0        }      ],      "total_distinct": 0    }  ]}
GET/api/v1/organizations/{org_id}/telemetry/logs/patterns

Event Patterns over logs (§9.11) — bodies clustered by shape, each with an exact count. Logs' counterpart to patterns_traces; see that handler on why no pattern_hash parameter is accepted.

Placed above /logs/{log_id} so the literal segment is matched before the path parameter.

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

org_id*Org Id
Formatuuid

Query Parameters

start?|null
end?|null
relative?string|null
service_name?array<string>|

Repeatable — values OR together (e.g. two occurrences match either service). A single occurrence is unchanged from before this field was repeatable (issue #331).

service_name_exclude?array<string>|

Same shape as 'service_name', negated: excludes rows matching any of these values. If a value appears in both 'service_name' and this field, it is excluded — exclude always wins on conflict.

severity_text?array<string>|

Repeatable (issue #331) — same semantics as 'service_name'. Case-insensitive, matches the canonical severity (§9.1).

severity_text_exclude?array<string>|

Same shape as 'severity_text', negated — same semantics as 'service_name_exclude'.

q?string|null
q_lang?Q Lang

Language q is written in (#177). lucene is the default and what every request omitting this field gets. sql reads q as a bare ClickHouse predicate, AND-joined under the tenant clamp so it can only narrow — see docs/v2/architecture/TELEMETRY_INGESTION_ARCHITECTURE.md §9.3.1.

Default"lucene"

Value in

  • "lucene"
  • "sql"
attribute_key?array<string>|

Repeatable, index-aligned with 'attribute_value' (issue #331): the i-th key pairs with the i-th value. Values sharing a key OR together; distinct keys AND together. A single (key, value) pair is unchanged from before this field was repeatable.

attribute_value?array<string>|

Paired with 'attribute_key' — see its description.

attribute_key_exclude?array<string>|

Same shape as 'attribute_key', negated — pairs with 'attribute_value_exclude'. A key excluded here is excluded even if the same key/value also appears in 'attribute_key'/'attribute_value'.

attribute_value_exclude?array<string>|

Paired with 'attribute_key_exclude' — see its description.

top_n?Top N

Max patterns returned, most frequent first.

Range1 <= value <= 200
Default50

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/telemetry/logs/patterns"
{  "patterns": [    {      "pattern_hash": "string",      "pattern": "string",      "count": 0,      "sample": "string",      "first_seen": "2019-08-24T14:15:22Z",      "last_seen": "2019-08-24T14:15:22Z"    }  ],  "truncated": true}
GET/api/v1/organizations/{org_id}/telemetry/logs/{log_id}

Single full log record by (timestamp, log_id) (#148) — every otel_logs column, including both Map columns and scope_name. No {log_id}-shaped literal segment exists ahead of this on the /logs router (unlike /traces, where /traces/tail, /traces/histogram, and /traces/facets all must precede /traces/{trace_id}), so there is no Starlette registration-order hazard here.

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

org_id*Org Id
Formatuuid
log_id*Log Id

Query Parameters

timestamp*Timestamp

The same log record's list-view timestamp — required for partition pruning (otel_logs is PARTITION BY toDate, §8.2); row_id alone is not indexed.

Formatdate-time

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/telemetry/logs/string?timestamp=2019-08-24T14%3A15%3A22Z"
{  "timestamp": "2019-08-24T14:15:22Z",  "trace_id": "string",  "span_id": "string",  "service_name": "string",  "severity_text": "string",  "severity_number": 0,  "body": "string",  "row_id": "string",  "attributes": {    "property1": "string",    "property2": "string"  },  "resource_attributes": {    "property1": "string",    "property2": "string"  },  "scope_name": "string"}
GET/api/v1/organizations/{org_id}/telemetry/metrics

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

org_id*Org Id
Formatuuid

Query Parameters

start?|null
end?|null
relative?string|null
metric_name?string|null
metric_type?string|null
limit?Limit
Range1 <= value <= 1000
Default100

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/telemetry/metrics"
[  {    "metric_name": "string",    "timestamp": "2019-08-24T14:15:22Z",    "value": 0,    "metric_type": "string",    "count": 0,    "sum": 0  }]
GET/api/v1/organizations/{org_id}/telemetry/metrics/range

Bucketed, aggregated series for one metric over the resolved range (#473) — the query the console's chart panel (and #474/#475/#531) run, replacing the row dump GET .../metrics as the range-query surface. GET .../metrics itself is unchanged and kept for raw point listing — see TelemetryQueryService.metrics_range's docstring for why both stay.

Empty buckets are always present. Their value is 0.0 for 'sum'/'count' and None for every other aggregation — see MetricRangePoint's docstring. Counters are reported as their raw cumulative value, not rate-corrected — see MetricRangeResponse's docstring.

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

org_id*Org Id
Formatuuid

Query Parameters

metric_name?|

Exact metric_name — required, one metric per request.

start?|null
end?|null
relative?string|null
aggregation?Aggregation

Fixed enum: sum, avg, min, max, count, quantile — never caller-supplied SQL (ADR-0016). 'quantile' additionally requires 'quantile'.

Default"avg"
quantile?|

Required iff aggregation='quantile' — a fraction in [0, 1] (e.g. 0.95), matching the console query language's 'quantile(metric, threshold)' format (#482).

group_by?array<string>|

One or more otel_metrics.labels keys (repeatable) — one series per distinct combination of values actually present in the range. Absent returns one ungrouped series with empty labels.

label?array<string>|

Repeatable label filter (issue #1329's console enabler) — each entry is 'key=value' (equality) or 'key!=value' (inequality) over the same otel_metrics.labels key space 'group_by' accepts. Multiple entries AND together. Split at the FIRST '=' in the entry: if the character immediately before it is '!', the operator is '!=' and the key ends there; otherwise the operator is '=' and the key ends at the '='. Everything after that first '=' is the value, so a value may itself contain '=' and '!=' and still round-trip exactly — 'region!=eu=west' means key 'region', operator '!=', value 'eu=west'; 'region=a!=b' means key 'region', operator '=', value 'a!=b'. A key may not itself contain '=' or '!' immediately before an '='. An empty value ('region=') is a valid empty-string filter; an entry with no '=' at all, or an empty key, is a validation failure. Applied before aggregation and grouping, so a filtered 'group_by' returns only the surviving series.

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/telemetry/metrics/range"
{  "metric_name": "string",  "aggregation": "sum",  "quantile": 0,  "metric_type": "string",  "bucket_width_seconds": 0,  "series": [    {      "labels": {        "property1": "string",        "property2": "string"      },      "points": [        {          "bucket_start": "2019-08-24T14:15:22Z",          "bucket_end": "2019-08-24T14:15:22Z",          "value": 0        }      ]    }  ],  "truncated": false,  "scanned_rows": 0,  "elapsed_seconds": 0}
GET/api/v1/organizations/{org_id}/telemetry/metrics/catalog

Every metric this org has emitted in the resolved range (#474): the read behind a source list/autocomplete — there was previously no way to ask "what metrics does this org have" at all. Distinct (metric_name, metric_type) pairs across all four metric tables (otel_metrics plus the three canonical encodings #471 added), each with a series count. See TelemetryQueryService.metrics_catalog's docstring for the UNION shape and cost bounds.

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

org_id*Org Id
Formatuuid

Query Parameters

start?|null
end?|null
relative?string|null

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/telemetry/metrics/catalog"
{  "metrics": [    {      "metric_name": "string",      "metric_type": "string",      "series_count": 0    }  ],  "truncated": false}
GET/api/v1/organizations/{org_id}/telemetry/metrics/label-keys

Label keys present on one metric in the resolved range (#474). Response is ValueFacet — the exact shape .../traces/facets and .../logs/facets already return for a plain-column facet — reused verbatim rather than a near-miss, so the console facet panel needs no fork to render it: value holds the key name, count the number of data points carrying it.

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

org_id*Org Id
Formatuuid

Query Parameters

metric_name?|

Exact metric_name — required, one metric per request.

start?|null
end?|null
relative?string|null

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/telemetry/metrics/label-keys"
{  "values": [    {      "value": "string",      "count": 0    }  ],  "truncated": false}
GET/api/v1/organizations/{org_id}/telemetry/metrics/label-values

Values (with counts) one label key takes on one metric in the resolved range (#474). Response is AttributeFacet — the exact shape one entry of .../traces/facets' or .../logs/facets' attributes list already carries — reused verbatim: key echoes the request, values is the top-top_n page by count, total_distinct is the exact (uncapped) distinct-value count. See TelemetryQueryService.metric_label_values's docstring for why total_distinct needs its own round trip rather than being derived from the capped values list (#490).

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

org_id*Org Id
Formatuuid

Query Parameters

metric_name?|

Exact metric_name — required, one metric per request.

key?|

Label key to enumerate values for — required. Use .../metrics/label-keys to discover it.

start?|null
end?|null
relative?string|null
top_n?Top N

Max values returned, by count.

Range1 <= value <= 50
Default10

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/telemetry/metrics/label-values"
{  "key": "string",  "values": [    {      "value": "string",      "count": 0    }  ],  "total_distinct": 0}