Events
Events
The unit of data: one JSON object with a timestamp. Logs, metrics and spans are all events here.
An event is one JSON object. Logstreem does not distinguish logs from metrics from spans at the storage layer — they differ only in which fields they carry. That is why one query language reaches all of them.
A typical inbound event
{
"_time": "2026-09-06T09:41:02.114Z",
"level": "error",
"service": "checkout",
"status": 503,
"latency": 3814,
"method": "POST",
"route": "/v1/checkout",
"region": "us-east-1",
"message": "pool exhausted: 40/40 connections",
"trace": {
"id": "7b2d93c3ab4c2f10",
"span_id": "a41c9e02"
}
}The _time field
Every event has a _time. Send one and it is used; omit it and ingest stamps arrival time. It accepts RFC 3339, unix seconds, unix milliseconds or unix nanoseconds — the format is detected by magnitude.
Late events are accepted, not reordered
An event with a
_time from an hour ago lands in the right time bucket for queries. But a monitor that already evaluated that window will not re-fire. Backfills are for querying, not for alerting.Nested objects
Nested JSON is stored as-is and flattened for query with dot paths. trace.id above is addressed as ['trace.id'] in LSQL. Arrays are stored whole; index into them with array[0].
Reaching a nested field
read top to bottom
1['api-gateway-prod']2| where ['trace.id'] == "7b2d93c3ab4c2f10"3| project _time, service, route, latency4| order by _time ascReserved fields
| Field | Meaning |
|---|---|
_time | Event timestamp. Always present |
_sysTime | When ingest received it. Set by us, not overridable |
_dataset | Dataset name, injected at query time for cross-dataset results |