Logs
Status: EARLY Draft/Proposal
LogLines
Version: 0.0
Properties and field requirements
- Time field - required
- The first time field with the name 
timestampis the time field. - it must be non nullable
 
 - The first time field with the name 
 - Body field - required
- The first string field with the name 
bodyis the body field. - it must be non nullable
 
 - The first string field with the name 
 - Severity field - optional
- The first string field with the name 
severityis the severity field. - Represents the severity/level of the log line
 - If no severity field is found, consumers/client will decide the log level. Example: logs panel will try to parse the message field and determine the log level
 - Log level can be one of the values specified in the docs here
 
 - The first string field with the name 
 - ID field - optional
- The first string field with the name 
idis the id field. - Unique identifier of the log line
 
 - The first string field with the name 
 - Labels field - optional
- The first field with the name 
labelsis the labels field. - This field represents additional information about the log line.
 - Field type must be json raw message type. Example value: 
{},{"hello":"world", "foo": 123.45, "bar" :["yellow","red"], "baz" : { "name": "alice" }}- Value should be represented with 
Record<string,any>type in javascript. 
 - Value should be represented with 
 
 - The first field with the name 
 
Any other field is ignored by logs visualisation.
Example
Following is an example of a logs frame in go
data.NewFrame(
    "logs",
    data.NewField("timestamp", nil, []time.Time{time.UnixMilli(1645030244810), time.UnixMilli(1645030247027), time.UnixMilli(1645030247027)}),
    data.NewField("body", nil, []string{"message one", "message two", "message three"}),
    data.NewField("severity", nil, []string{"critical", "error", "warning"}),
    data.NewField("id", nil, []string{"xxx-001", "xyz-002", "111-003"}),
    data.NewField("labels", nil, []json.RawMessage{[]byte(`{}`), []byte(`{"hello":"world"}`), []byte(`{"hello":"world", "foo": 123.45, "bar" :["yellow","red"], "baz" : { "name": "alice" }}`)}),
)
the same can be represented as
| Name: timestamp  Type: []time.Time  | Name: body  Type: []string  | Name: severity  Type: []*string  | Name: id  Type: []*string  | Name: labels  Type: []json.RawMessage  | 
|---|---|---|---|---|
| 2022-02-16 16:50:44.810 +0000 GMT | message one | critical | xxx-001 | {} | 
| 2022-02-16 16:50:47.027 +0000 GMT | message two | error | xyz-002 | {"hello":"world"} | 
| 2022-02-16 16:50:47.027 +0000 GMT | message three | warning | 111-003 | {"hello":"world", "foo": 123.45, "bar" :["yellow","red"], "baz" : { "name": "alice" }} | 
Meta data requirements
- Frame type must be set to 
FrameTypeLogLines/log-lines - Frame meta can optionally specify 
preferredVisualisationType:logsas meta data. Without this property, explore page will be rendering the logs data as table instead in logs view 
Invalid cases
- Frame without time field
 - Frame without string field
 - Frame with field name "tsNs" where the type of the "tsNs" field is not number.