Loki: Add backend functionality to parse structured metadata from Loki (#77361)

* prepare backend for structured metadata

* add `lokiStructuredMetadata` feature toggle

* use `lokiStructuredMetadata` feature flag

* add field type check to `labelTypesField`

* remove fixme

* fix feature toggle

* add field in dataplane mode

* use `data.Labels` where possible

* adjust framing tests

* improve verbiage

* improve naming

* update tests to "attributes"
This commit is contained in:
Sven Grossmann
2023-11-16 17:06:14 +01:00
committed by GitHub
parent d849e0d752
commit a01f8c5b42
24 changed files with 2212 additions and 40 deletions
+13 -8
View File
@@ -26,10 +26,11 @@ import (
)
type LokiAPI struct {
client *http.Client
url string
log log.Logger
tracer tracing.Tracer
client *http.Client
url string
log log.Logger
tracer tracing.Tracer
requestStructuredMetadata bool
}
type RawLokiResponse struct {
@@ -38,11 +39,11 @@ type RawLokiResponse struct {
Encoding string
}
func newLokiAPI(client *http.Client, url string, log log.Logger, tracer tracing.Tracer) *LokiAPI {
return &LokiAPI{client: client, url: url, log: log, tracer: tracer}
func newLokiAPI(client *http.Client, url string, log log.Logger, tracer tracing.Tracer, requestStructuredMetadata bool) *LokiAPI {
return &LokiAPI{client: client, url: url, log: log, tracer: tracer, requestStructuredMetadata: requestStructuredMetadata}
}
func makeDataRequest(ctx context.Context, lokiDsUrl string, query lokiQuery) (*http.Request, error) {
func makeDataRequest(ctx context.Context, lokiDsUrl string, query lokiQuery, categorizeLabels bool) (*http.Request, error) {
qs := url.Values{}
qs.Set("query", query.Expr)
@@ -102,6 +103,10 @@ func makeDataRequest(ctx context.Context, lokiDsUrl string, query lokiQuery) (*h
}
}
if categorizeLabels {
req.Header.Set("X-Loki-Response-Encoding-Flags", "categorize-labels")
}
return req, nil
}
@@ -156,7 +161,7 @@ func readLokiError(body io.ReadCloser) error {
}
func (api *LokiAPI) DataQuery(ctx context.Context, query lokiQuery, responseOpts ResponseOpts) (data.Frames, error) {
req, err := makeDataRequest(ctx, api.url, query)
req, err := makeDataRequest(ctx, api.url, query, api.requestStructuredMetadata)
if err != nil {
return nil, err
}
+5 -5
View File
@@ -56,16 +56,16 @@ func (mockedRT *mockedCompressedRoundTripper) RoundTrip(req *http.Request) (*htt
}, nil
}
func makeMockedAPI(statusCode int, contentType string, responseBytes []byte, requestCallback mockRequestCallback) *LokiAPI {
return makeMockedAPIWithUrl("http://localhost:9999", statusCode, contentType, responseBytes, requestCallback)
func makeMockedAPI(statusCode int, contentType string, responseBytes []byte, requestCallback mockRequestCallback, structuredMetadata bool) *LokiAPI {
return makeMockedAPIWithUrl("http://localhost:9999", statusCode, contentType, responseBytes, requestCallback, structuredMetadata)
}
func makeMockedAPIWithUrl(url string, statusCode int, contentType string, responseBytes []byte, requestCallback mockRequestCallback) *LokiAPI {
func makeMockedAPIWithUrl(url string, statusCode int, contentType string, responseBytes []byte, requestCallback mockRequestCallback, structuredMetadata bool) *LokiAPI {
client := http.Client{
Transport: &mockedRoundTripper{statusCode: statusCode, contentType: contentType, responseBytes: responseBytes, requestCallback: requestCallback},
}
return newLokiAPI(&client, url, log.New("test"), tracing.InitializeTracerForTest())
return newLokiAPI(&client, url, log.New("test"), tracing.InitializeTracerForTest(), structuredMetadata)
}
func makeCompressedMockedAPIWithUrl(url string, statusCode int, contentType string, responseBytes []byte, requestCallback mockRequestCallback) *LokiAPI {
@@ -73,5 +73,5 @@ func makeCompressedMockedAPIWithUrl(url string, statusCode int, contentType stri
Transport: &mockedCompressedRoundTripper{statusCode: statusCode, contentType: contentType, responseBytes: responseBytes, requestCallback: requestCallback},
}
return newLokiAPI(&client, url, log.New("test"), tracing.InitializeTracerForTest())
return newLokiAPI(&client, url, log.New("test"), tracing.InitializeTracerForTest(), false)
}
+19 -7
View File
@@ -26,7 +26,7 @@ func TestApiLogVolume(t *testing.T) {
api := makeMockedAPI(200, "application/json", response, func(req *http.Request) {
called = true
require.Equal(t, "Source=logvolhist", req.Header.Get("X-Query-Tags"))
})
}, false)
_, err := api.DataQuery(context.Background(), lokiQuery{Expr: "", SupportingQueryType: SupportingQueryLogsVolume, QueryType: QueryTypeRange}, ResponseOpts{})
require.NoError(t, err)
@@ -38,7 +38,7 @@ func TestApiLogVolume(t *testing.T) {
api := makeMockedAPI(200, "application/json", response, func(req *http.Request) {
called = true
require.Equal(t, "Source=logsample", req.Header.Get("X-Query-Tags"))
})
}, false)
_, err := api.DataQuery(context.Background(), lokiQuery{Expr: "", SupportingQueryType: SupportingQueryLogsSample, QueryType: QueryTypeRange}, ResponseOpts{})
require.NoError(t, err)
@@ -50,7 +50,7 @@ func TestApiLogVolume(t *testing.T) {
api := makeMockedAPI(200, "application/json", response, func(req *http.Request) {
called = true
require.Equal(t, "Source=datasample", req.Header.Get("X-Query-Tags"))
})
}, false)
_, err := api.DataQuery(context.Background(), lokiQuery{Expr: "", SupportingQueryType: SupportingQueryDataSample, QueryType: QueryTypeRange}, ResponseOpts{})
require.NoError(t, err)
@@ -62,12 +62,24 @@ func TestApiLogVolume(t *testing.T) {
api := makeMockedAPI(200, "application/json", response, func(req *http.Request) {
called = true
require.Equal(t, "", req.Header.Get("X-Query-Tags"))
})
}, false)
_, err := api.DataQuery(context.Background(), lokiQuery{Expr: "", SupportingQueryType: SupportingQueryNone, QueryType: QueryTypeRange}, ResponseOpts{})
require.NoError(t, err)
require.True(t, called)
})
t.Run("with `structuredMetadata` should set correct http header", func(t *testing.T) {
called := false
api := makeMockedAPI(200, "application/json", response, func(req *http.Request) {
called = true
require.Equal(t, "categorize-labels", req.Header.Get("X-Loki-Response-Encoding-Flags"))
}, true)
_, err := api.DataQuery(context.Background(), lokiQuery{Expr: "", SupportingQueryType: SupportingQueryLogsVolume, QueryType: QueryTypeRange}, ResponseOpts{})
require.NoError(t, err)
require.True(t, called)
})
}
func TestApiUrlHandling(t *testing.T) {
@@ -127,7 +139,7 @@ func TestApiUrlHandling(t *testing.T) {
wantedPrefix := test.rangeQueryPrefix
failMessage := fmt.Sprintf(`wanted prefix: [%s], got string [%s]`, wantedPrefix, urlString)
require.True(t, strings.HasPrefix(urlString, wantedPrefix), failMessage)
})
}, false)
query := lokiQuery{
QueryType: QueryTypeRange,
@@ -148,7 +160,7 @@ func TestApiUrlHandling(t *testing.T) {
wantedPrefix := test.instantQueryPrefix
failMessage := fmt.Sprintf(`wanted prefix: [%s], got string [%s]`, wantedPrefix, urlString)
require.True(t, strings.HasPrefix(urlString, wantedPrefix), failMessage)
})
}, false)
query := lokiQuery{
QueryType: QueryTypeInstant,
@@ -166,7 +178,7 @@ func TestApiUrlHandling(t *testing.T) {
api := makeMockedAPIWithUrl(test.dsUrl, 200, "application/json", response, func(req *http.Request) {
called = true
require.Equal(t, test.metaUrl, req.URL.String())
})
}, false)
_, err := api.RawQuery(context.Background(), "/loki/api/v1/labels?start=1&end=2")
require.NoError(t, err)
+35 -5
View File
@@ -93,14 +93,26 @@ func adjustLogsFrame(frame *data.Frame, query *lokiQuery, dataplane bool) error
func adjustLegacyLogsFrame(frame *data.Frame, query *lokiQuery) error {
// we check if the fields are of correct type and length
fields := frame.Fields
if len(fields) != 4 {
return fmt.Errorf("invalid field length in logs frame. expected 4, got %d", len(fields))
if len(fields) != 4 && len(fields) != 5 {
return fmt.Errorf("invalid field length in logs frame. expected 4 or 5, got %d", len(fields))
}
labelsField := fields[0]
timeField := fields[1]
lineField := fields[2]
stringTimeField := fields[3]
if len(fields) == 5 {
labelTypesField := fields[4]
if labelTypesField.Type() != data.FieldTypeJSON {
return fmt.Errorf("invalid field types in logs frame. expected json, got %s", labelTypesField.Type())
}
labelTypesField.Name = "labelTypes"
labelTypesField.Config = &data.FieldConfig{
Custom: map[string]interface{}{
"hidden": true,
},
}
}
if (timeField.Type() != data.FieldTypeTime) || (lineField.Type() != data.FieldTypeString) || (labelsField.Type() != data.FieldTypeJSON) || (stringTimeField.Type() != data.FieldTypeString) {
return fmt.Errorf("invalid field types in logs frame. expected time, string, json and string, got %s, %s, %s and %s", timeField.Type(), lineField.Type(), labelsField.Type(), stringTimeField.Type())
@@ -149,14 +161,27 @@ func adjustLegacyLogsFrame(frame *data.Frame, query *lokiQuery) error {
func adjustDataplaneLogsFrame(frame *data.Frame, query *lokiQuery) error {
// we check if the fields are of correct type and length
fields := frame.Fields
if len(fields) != 4 {
return fmt.Errorf("invalid field length in logs frame. expected 4, got %d", len(fields))
if len(fields) != 4 && len(fields) != 5 {
return fmt.Errorf("invalid field length in logs frame. expected 4 or 5, got %d", len(fields))
}
labelsField := fields[0]
timeField := fields[1]
lineField := fields[2]
stringTimeField := fields[3]
var labelTypesField *data.Field
if len(fields) == 5 {
labelTypesField = fields[4]
if labelTypesField.Type() != data.FieldTypeJSON {
return fmt.Errorf("invalid field types in logs frame. expected json, got %s", labelTypesField.Type())
}
labelTypesField.Name = "labelTypes"
labelTypesField.Config = &data.FieldConfig{
Custom: map[string]interface{}{
"hidden": true,
},
}
}
if (timeField.Type() != data.FieldTypeTime) || (lineField.Type() != data.FieldTypeString) || (labelsField.Type() != data.FieldTypeJSON) || (stringTimeField.Type() != data.FieldTypeString) {
return fmt.Errorf("invalid field types in logs frame. expected time, string, json and string, got %s, %s, %s and %s", timeField.Type(), lineField.Type(), labelsField.Type(), stringTimeField.Type())
@@ -190,7 +215,12 @@ func adjustDataplaneLogsFrame(frame *data.Frame, query *lokiQuery) error {
if err != nil {
return err
}
frame.Fields = data.Fields{labelsField, timeField, lineField, idField}
if labelTypesField != nil {
frame.Fields = data.Fields{labelsField, timeField, lineField, idField, labelTypesField}
} else {
frame.Fields = data.Fields{labelsField, timeField, lineField, idField}
}
return nil
}
+5 -3
View File
@@ -51,6 +51,8 @@ func TestSuccessResponse(t *testing.T) {
{name: "parse a streams response with parse errors", filepath: "streams_parse_errors", query: streamsQuery},
{name: "parse an empty response", filepath: "empty", query: matrixQuery},
{name: "parse structured metadata", filepath: "streams_structured_metadata", query: streamsQuery},
}
runTest := func(folder string, path string, query lokiQuery, responseOpts ResponseOpts) {
@@ -61,14 +63,14 @@ func TestSuccessResponse(t *testing.T) {
bytes, err := os.ReadFile(responseFileName)
require.NoError(t, err)
frames, err := runQuery(context.Background(), makeMockedAPI(http.StatusOK, "application/json", bytes, nil), &query, responseOpts, log.New("test"))
frames, err := runQuery(context.Background(), makeMockedAPI(http.StatusOK, "application/json", bytes, nil, false), &query, responseOpts, log.New("test"))
require.NoError(t, err)
dr := &backend.DataResponse{
Frames: frames,
Error: err,
}
experimental.CheckGoldenJSONResponse(t, folder, goldenFileName, dr, true)
experimental.CheckGoldenJSONResponse(t, folder, goldenFileName, dr, false)
}
for _, test := range tt {
@@ -126,7 +128,7 @@ func TestErrorResponse(t *testing.T) {
for _, test := range tt {
t.Run(test.name, func(t *testing.T) {
frames, err := runQuery(context.Background(), makeMockedAPI(400, test.contentType, test.body, nil), &lokiQuery{QueryType: QueryTypeRange, Direction: DirectionBackward}, ResponseOpts{}, log.New("test"))
frames, err := runQuery(context.Background(), makeMockedAPI(400, test.contentType, test.body, nil, false), &lokiQuery{QueryType: QueryTypeRange, Direction: DirectionBackward}, ResponseOpts{}, log.New("test"))
require.Len(t, frames, 0)
require.Error(t, err)
+4 -4
View File
@@ -140,7 +140,7 @@ func callResource(ctx context.Context, req *backend.CallResourceRequest, sender
))
defer span.End()
api := newLokiAPI(dsInfo.HTTPClient, dsInfo.URL, plog, tracer)
api := newLokiAPI(dsInfo.HTTPClient, dsInfo.URL, plog, tracer, false)
rawLokiResponse, err := api.RawQuery(ctx, lokiURL)
if err != nil {
@@ -177,13 +177,13 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
logsDataplane: s.features.IsEnabled(ctx, featuremgmt.FlagLokiLogsDataplane),
}
return queryData(ctx, req, dsInfo, responseOpts, s.tracer, logger, s.features.IsEnabled(ctx, featuremgmt.FlagLokiRunQueriesInParallel))
return queryData(ctx, req, dsInfo, responseOpts, s.tracer, logger, s.features.IsEnabled(ctx, featuremgmt.FlagLokiRunQueriesInParallel), s.features.IsEnabled(ctx, featuremgmt.FlagLokiStructuredMetadata))
}
func queryData(ctx context.Context, req *backend.QueryDataRequest, dsInfo *datasourceInfo, responseOpts ResponseOpts, tracer tracing.Tracer, plog log.Logger, runInParallel bool) (*backend.QueryDataResponse, error) {
func queryData(ctx context.Context, req *backend.QueryDataRequest, dsInfo *datasourceInfo, responseOpts ResponseOpts, tracer tracing.Tracer, plog log.Logger, runInParallel bool, requestStructuredMetadata bool) (*backend.QueryDataResponse, error) {
result := backend.NewQueryDataResponse()
api := newLokiAPI(dsInfo.HTTPClient, dsInfo.URL, plog, tracer)
api := newLokiAPI(dsInfo.HTTPClient, dsInfo.URL, plog, tracer, requestStructuredMetadata)
start := time.Now()
queries, err := parseQuery(req)
+1 -1
View File
@@ -19,7 +19,7 @@ func BenchmarkMatrixJson(b *testing.B) {
b.ResetTimer()
for n := 0; n < b.N; n++ {
_, _ = runQuery(context.Background(), makeMockedAPI(http.StatusOK, "application/json", bytes, nil), &lokiQuery{}, ResponseOpts{}, log.New("test"))
_, _ = runQuery(context.Background(), makeMockedAPI(http.StatusOK, "application/json", bytes, nil, false), &lokiQuery{}, ResponseOpts{}, log.New("test"))
}
}
@@ -0,0 +1,380 @@
// 🌟 This was machine generated. Do not edit. 🌟
//
// Frame[0] {
// "typeVersion": [
// 0,
// 0
// ],
// "custom": {
// "frameType": "LabeledTimeValues"
// },
// "stats": [
// {
// "displayName": "Summary: bytes processed per second",
// "unit": "Bps",
// "value": 3507022
// },
// {
// "displayName": "Summary: lines processed per second",
// "value": 24818
// },
// {
// "displayName": "Summary: total bytes processed",
// "unit": "decbytes",
// "value": 7772
// },
// {
// "displayName": "Summary: total lines processed",
// "value": 55
// },
// {
// "displayName": "Summary: exec time",
// "unit": "s",
// "value": 0.002216125
// },
// {
// "displayName": "Store: total chunks ref",
// "value": 2
// },
// {
// "displayName": "Store: total chunks downloaded",
// "value": 3
// },
// {
// "displayName": "Store: chunks download time",
// "unit": "s",
// "value": 0.000390958
// },
// {
// "displayName": "Store: head chunk bytes",
// "unit": "decbytes",
// "value": 4
// },
// {
// "displayName": "Store: head chunk lines",
// "value": 5
// },
// {
// "displayName": "Store: decompressed bytes",
// "unit": "decbytes",
// "value": 7772
// },
// {
// "displayName": "Store: decompressed lines",
// "value": 55
// },
// {
// "displayName": "Store: compressed bytes",
// "unit": "decbytes",
// "value": 31432
// },
// {
// "displayName": "Store: total duplicates",
// "value": 6
// },
// {
// "displayName": "Ingester: total reached",
// "value": 7
// },
// {
// "displayName": "Ingester: total chunks matched",
// "value": 8
// },
// {
// "displayName": "Ingester: total batches",
// "value": 9
// },
// {
// "displayName": "Ingester: total lines sent",
// "value": 10
// },
// {
// "displayName": "Ingester: head chunk bytes",
// "unit": "decbytes",
// "value": 11
// },
// {
// "displayName": "Ingester: head chunk lines",
// "value": 12
// },
// {
// "displayName": "Ingester: decompressed bytes",
// "unit": "decbytes",
// "value": 13
// },
// {
// "displayName": "Ingester: decompressed lines",
// "value": 14
// },
// {
// "displayName": "Ingester: compressed bytes",
// "unit": "decbytes",
// "value": 15
// },
// {
// "displayName": "Ingester: total duplicates",
// "value": 16
// }
// ],
// "executedQueryString": "Expr: query1"
// }
// Name:
// Dimensions: 6 Fields by 6 Rows
// +-------------------------+-----------------------------------------+------------------+---------------------+-------------------------+--------------------------------+
// | Name: labels | Name: Time | Name: Line | Name: tsNs | Name: labelTypes | Name: id |
// | Labels: | Labels: | Labels: | Labels: | Labels: | Labels: |
// | Type: []json.RawMessage | Type: []time.Time | Type: []string | Type: []string | Type: []json.RawMessage | Type: []string |
// +-------------------------+-----------------------------------------+------------------+---------------------+-------------------------+--------------------------------+
// | {} | 2022-02-16 16:50:44.81075712 +0000 UTC | log line error 1 | 1645030244810757120 | {} | 1645030244810757120_7bc6af55 |
// | {} | 2022-02-16 16:50:47.02773504 +0000 UTC | log line info 1 | 1645030247027735040 | {} | 1645030247027735040_2c9e69b9 |
// | {} | 2022-02-16 16:50:46.277587968 +0000 UTC | log line info 2 | 1645030246277587968 | {} | 1645030246277587968_b7784d5c |
// | {} | 2022-02-16 16:50:46.277587968 +0000 UTC | log line info 2 | 1645030246277587968 | {} | 1645030246277587968_b7784d5c_1 |
// | {} | 2022-02-16 16:50:45.539423744 +0000 UTC | log line info 3 | 1645030245539423744 | {} | 1645030245539423744_4aee7aab |
// | {} | 2022-02-16 16:50:44.091700992 +0000 UTC | log line info 4 | 1645030244091700992 | {} | 1645030244091700992_df059f36 |
// +-------------------------+-----------------------------------------+------------------+---------------------+-------------------------+--------------------------------+
//
//
// 🌟 This was machine generated. Do not edit. 🌟
{
"status": 200,
"frames": [
{
"schema": {
"meta": {
"typeVersion": [
0,
0
],
"custom": {
"frameType": "LabeledTimeValues"
},
"stats": [
{
"displayName": "Summary: bytes processed per second",
"unit": "Bps",
"value": 3507022
},
{
"displayName": "Summary: lines processed per second",
"value": 24818
},
{
"displayName": "Summary: total bytes processed",
"unit": "decbytes",
"value": 7772
},
{
"displayName": "Summary: total lines processed",
"value": 55
},
{
"displayName": "Summary: exec time",
"unit": "s",
"value": 0.002216125
},
{
"displayName": "Store: total chunks ref",
"value": 2
},
{
"displayName": "Store: total chunks downloaded",
"value": 3
},
{
"displayName": "Store: chunks download time",
"unit": "s",
"value": 0.000390958
},
{
"displayName": "Store: head chunk bytes",
"unit": "decbytes",
"value": 4
},
{
"displayName": "Store: head chunk lines",
"value": 5
},
{
"displayName": "Store: decompressed bytes",
"unit": "decbytes",
"value": 7772
},
{
"displayName": "Store: decompressed lines",
"value": 55
},
{
"displayName": "Store: compressed bytes",
"unit": "decbytes",
"value": 31432
},
{
"displayName": "Store: total duplicates",
"value": 6
},
{
"displayName": "Ingester: total reached",
"value": 7
},
{
"displayName": "Ingester: total chunks matched",
"value": 8
},
{
"displayName": "Ingester: total batches",
"value": 9
},
{
"displayName": "Ingester: total lines sent",
"value": 10
},
{
"displayName": "Ingester: head chunk bytes",
"unit": "decbytes",
"value": 11
},
{
"displayName": "Ingester: head chunk lines",
"value": 12
},
{
"displayName": "Ingester: decompressed bytes",
"unit": "decbytes",
"value": 13
},
{
"displayName": "Ingester: decompressed lines",
"value": 14
},
{
"displayName": "Ingester: compressed bytes",
"unit": "decbytes",
"value": 15
},
{
"displayName": "Ingester: total duplicates",
"value": 16
}
],
"executedQueryString": "Expr: query1"
},
"fields": [
{
"name": "labels",
"type": "other",
"typeInfo": {
"frame": "json.RawMessage"
}
},
{
"name": "Time",
"type": "time",
"typeInfo": {
"frame": "time.Time"
}
},
{
"name": "Line",
"type": "string",
"typeInfo": {
"frame": "string"
}
},
{
"name": "tsNs",
"type": "string",
"typeInfo": {
"frame": "string"
}
},
{
"name": "labelTypes",
"type": "other",
"typeInfo": {
"frame": "json.RawMessage"
},
"config": {
"custom": {
"hidden": true
}
}
},
{
"name": "id",
"type": "string",
"typeInfo": {
"frame": "string"
}
}
]
},
"data": {
"values": [
[
{},
{},
{},
{},
{},
{}
],
[
1645030244810,
1645030247027,
1645030246277,
1645030246277,
1645030245539,
1645030244091
],
[
"log line error 1",
"log line info 1",
"log line info 2",
"log line info 2",
"log line info 3",
"log line info 4"
],
[
"1645030244810757120",
"1645030247027735040",
"1645030246277587968",
"1645030246277587968",
"1645030245539423744",
"1645030244091700992"
],
[
{},
{},
{},
{},
{},
{}
],
[
"1645030244810757120_7bc6af55",
"1645030247027735040_2c9e69b9",
"1645030246277587968_b7784d5c",
"1645030246277587968_b7784d5c_1",
"1645030245539423744_4aee7aab",
"1645030244091700992_df059f36"
]
],
"nanos": [
null,
[
757120,
735040,
587968,
587968,
423744,
700992
],
null,
null,
null,
null
]
}
}
]
}
+89
View File
@@ -0,0 +1,89 @@
{
"status": "success",
"data": {
"encodingFlags": [
"categorize-labels"
],
"resultType": "streams",
"result": [
{
"stream": {
"code": "one\",",
"location": "moon🌙"
},
"values": [
[
"1645030244810757120",
"log line error 1",
{}
]
]
},
{
"stream": {
"code": "\",two",
"location": "moon🌙"
},
"values": [
[
"1645030247027735040",
"log line info 1",
{}
],
[
"1645030246277587968",
"log line info 2",
{}
],
[
"1645030246277587968",
"log line info 2",
{}
],
[
"1645030245539423744",
"log line info 3",
{}
],
[
"1645030244091700992",
"log line info 4",
{}
]
]
}
],
"stats": {
"summary": {
"bytesProcessedPerSecond": 3507022,
"linesProcessedPerSecond": 24818,
"totalBytesProcessed": 7772,
"totalLinesProcessed": 55,
"execTime": 0.002216125
},
"store": {
"totalChunksRef": 2,
"totalChunksDownloaded": 3,
"chunksDownloadTime": 0.000390958,
"headChunkBytes": 4,
"headChunkLines": 5,
"decompressedBytes": 7772,
"decompressedLines": 55,
"compressedBytes": 31432,
"totalDuplicates": 6
},
"ingester": {
"totalReached": 7,
"totalChunksMatched": 8,
"totalBatches": 9,
"totalLinesSent": 10,
"headChunkBytes": 11,
"headChunkLines": 12,
"decompressedBytes": 13,
"decompressedLines": 14,
"compressedBytes": 15,
"totalDuplicates": 16
}
}
}
}
@@ -0,0 +1,360 @@
// 🌟 This was machine generated. Do not edit. 🌟
//
// Frame[0] {
// "type": "log-lines",
// "typeVersion": [
// 0,
// 0
// ],
// "stats": [
// {
// "displayName": "Summary: bytes processed per second",
// "unit": "Bps",
// "value": 3507022
// },
// {
// "displayName": "Summary: lines processed per second",
// "value": 24818
// },
// {
// "displayName": "Summary: total bytes processed",
// "unit": "decbytes",
// "value": 7772
// },
// {
// "displayName": "Summary: total lines processed",
// "value": 55
// },
// {
// "displayName": "Summary: exec time",
// "unit": "s",
// "value": 0.002216125
// },
// {
// "displayName": "Store: total chunks ref",
// "value": 2
// },
// {
// "displayName": "Store: total chunks downloaded",
// "value": 3
// },
// {
// "displayName": "Store: chunks download time",
// "unit": "s",
// "value": 0.000390958
// },
// {
// "displayName": "Store: head chunk bytes",
// "unit": "decbytes",
// "value": 4
// },
// {
// "displayName": "Store: head chunk lines",
// "value": 5
// },
// {
// "displayName": "Store: decompressed bytes",
// "unit": "decbytes",
// "value": 7772
// },
// {
// "displayName": "Store: decompressed lines",
// "value": 55
// },
// {
// "displayName": "Store: compressed bytes",
// "unit": "decbytes",
// "value": 31432
// },
// {
// "displayName": "Store: total duplicates",
// "value": 6
// },
// {
// "displayName": "Ingester: total reached",
// "value": 7
// },
// {
// "displayName": "Ingester: total chunks matched",
// "value": 8
// },
// {
// "displayName": "Ingester: total batches",
// "value": 9
// },
// {
// "displayName": "Ingester: total lines sent",
// "value": 10
// },
// {
// "displayName": "Ingester: head chunk bytes",
// "unit": "decbytes",
// "value": 11
// },
// {
// "displayName": "Ingester: head chunk lines",
// "value": 12
// },
// {
// "displayName": "Ingester: decompressed bytes",
// "unit": "decbytes",
// "value": 13
// },
// {
// "displayName": "Ingester: decompressed lines",
// "value": 14
// },
// {
// "displayName": "Ingester: compressed bytes",
// "unit": "decbytes",
// "value": 15
// },
// {
// "displayName": "Ingester: total duplicates",
// "value": 16
// }
// ],
// "executedQueryString": "Expr: query1"
// }
// Name:
// Dimensions: 5 Fields by 6 Rows
// +-------------------------+-----------------------------------------+------------------+--------------------------------+-------------------------+
// | Name: labels | Name: timestamp | Name: body | Name: id | Name: labelTypes |
// | Labels: | Labels: | Labels: | Labels: | Labels: |
// | Type: []json.RawMessage | Type: []time.Time | Type: []string | Type: []string | Type: []json.RawMessage |
// +-------------------------+-----------------------------------------+------------------+--------------------------------+-------------------------+
// | {} | 2022-02-16 16:50:44.81075712 +0000 UTC | log line error 1 | 1645030244810757120_7bc6af55 | {} |
// | {} | 2022-02-16 16:50:47.02773504 +0000 UTC | log line info 1 | 1645030247027735040_2c9e69b9 | {} |
// | {} | 2022-02-16 16:50:46.277587968 +0000 UTC | log line info 2 | 1645030246277587968_b7784d5c | {} |
// | {} | 2022-02-16 16:50:46.277587968 +0000 UTC | log line info 2 | 1645030246277587968_b7784d5c_1 | {} |
// | {} | 2022-02-16 16:50:45.539423744 +0000 UTC | log line info 3 | 1645030245539423744_4aee7aab | {} |
// | {} | 2022-02-16 16:50:44.091700992 +0000 UTC | log line info 4 | 1645030244091700992_df059f36 | {} |
// +-------------------------+-----------------------------------------+------------------+--------------------------------+-------------------------+
//
//
// 🌟 This was machine generated. Do not edit. 🌟
{
"status": 200,
"frames": [
{
"schema": {
"meta": {
"type": "log-lines",
"typeVersion": [
0,
0
],
"stats": [
{
"displayName": "Summary: bytes processed per second",
"unit": "Bps",
"value": 3507022
},
{
"displayName": "Summary: lines processed per second",
"value": 24818
},
{
"displayName": "Summary: total bytes processed",
"unit": "decbytes",
"value": 7772
},
{
"displayName": "Summary: total lines processed",
"value": 55
},
{
"displayName": "Summary: exec time",
"unit": "s",
"value": 0.002216125
},
{
"displayName": "Store: total chunks ref",
"value": 2
},
{
"displayName": "Store: total chunks downloaded",
"value": 3
},
{
"displayName": "Store: chunks download time",
"unit": "s",
"value": 0.000390958
},
{
"displayName": "Store: head chunk bytes",
"unit": "decbytes",
"value": 4
},
{
"displayName": "Store: head chunk lines",
"value": 5
},
{
"displayName": "Store: decompressed bytes",
"unit": "decbytes",
"value": 7772
},
{
"displayName": "Store: decompressed lines",
"value": 55
},
{
"displayName": "Store: compressed bytes",
"unit": "decbytes",
"value": 31432
},
{
"displayName": "Store: total duplicates",
"value": 6
},
{
"displayName": "Ingester: total reached",
"value": 7
},
{
"displayName": "Ingester: total chunks matched",
"value": 8
},
{
"displayName": "Ingester: total batches",
"value": 9
},
{
"displayName": "Ingester: total lines sent",
"value": 10
},
{
"displayName": "Ingester: head chunk bytes",
"unit": "decbytes",
"value": 11
},
{
"displayName": "Ingester: head chunk lines",
"value": 12
},
{
"displayName": "Ingester: decompressed bytes",
"unit": "decbytes",
"value": 13
},
{
"displayName": "Ingester: decompressed lines",
"value": 14
},
{
"displayName": "Ingester: compressed bytes",
"unit": "decbytes",
"value": 15
},
{
"displayName": "Ingester: total duplicates",
"value": 16
}
],
"executedQueryString": "Expr: query1"
},
"fields": [
{
"name": "labels",
"type": "other",
"typeInfo": {
"frame": "json.RawMessage"
}
},
{
"name": "timestamp",
"type": "time",
"typeInfo": {
"frame": "time.Time"
}
},
{
"name": "body",
"type": "string",
"typeInfo": {
"frame": "string"
}
},
{
"name": "id",
"type": "string",
"typeInfo": {
"frame": "string"
}
},
{
"name": "labelTypes",
"type": "other",
"typeInfo": {
"frame": "json.RawMessage"
},
"config": {
"custom": {
"hidden": true
}
}
}
]
},
"data": {
"values": [
[
{},
{},
{},
{},
{},
{}
],
[
1645030244810,
1645030247027,
1645030246277,
1645030246277,
1645030245539,
1645030244091
],
[
"log line error 1",
"log line info 1",
"log line info 2",
"log line info 2",
"log line info 3",
"log line info 4"
],
[
"1645030244810757120_7bc6af55",
"1645030247027735040_2c9e69b9",
"1645030246277587968_b7784d5c",
"1645030246277587968_b7784d5c_1",
"1645030245539423744_4aee7aab",
"1645030244091700992_df059f36"
],
[
{},
{},
{},
{},
{},
{}
]
],
"nanos": [
null,
[
757120,
735040,
587968,
587968,
423744,
700992
],
null,
null,
null
]
}
}
]
}
@@ -0,0 +1,89 @@
{
"status": "success",
"data": {
"encodingFlags": [
"categorize-labels"
],
"resultType": "streams",
"result": [
{
"stream": {
"code": "one\",",
"location": "moon🌙"
},
"values": [
[
"1645030244810757120",
"log line error 1",
{}
]
]
},
{
"stream": {
"code": "\",two",
"location": "moon🌙"
},
"values": [
[
"1645030247027735040",
"log line info 1",
{}
],
[
"1645030246277587968",
"log line info 2",
{}
],
[
"1645030246277587968",
"log line info 2",
{}
],
[
"1645030245539423744",
"log line info 3",
{}
],
[
"1645030244091700992",
"log line info 4",
{}
]
]
}
],
"stats": {
"summary": {
"bytesProcessedPerSecond": 3507022,
"linesProcessedPerSecond": 24818,
"totalBytesProcessed": 7772,
"totalLinesProcessed": 55,
"execTime": 0.002216125
},
"store": {
"totalChunksRef": 2,
"totalChunksDownloaded": 3,
"chunksDownloadTime": 0.000390958,
"headChunkBytes": 4,
"headChunkLines": 5,
"decompressedBytes": 7772,
"decompressedLines": 55,
"compressedBytes": 31432,
"totalDuplicates": 6
},
"ingester": {
"totalReached": 7,
"totalChunksMatched": 8,
"totalBatches": 9,
"totalLinesSent": 10,
"headChunkBytes": 11,
"headChunkLines": 12,
"decompressedBytes": 13,
"decompressedLines": 14,
"compressedBytes": 15,
"totalDuplicates": 16
}
}
}
}
@@ -0,0 +1,360 @@
// 🌟 This was machine generated. Do not edit. 🌟
//
// Frame[0] {
// "type": "log-lines",
// "typeVersion": [
// 0,
// 0
// ],
// "stats": [
// {
// "displayName": "Summary: bytes processed per second",
// "unit": "Bps",
// "value": 3507022
// },
// {
// "displayName": "Summary: lines processed per second",
// "value": 24818
// },
// {
// "displayName": "Summary: total bytes processed",
// "unit": "decbytes",
// "value": 7772
// },
// {
// "displayName": "Summary: total lines processed",
// "value": 55
// },
// {
// "displayName": "Summary: exec time",
// "unit": "s",
// "value": 0.002216125
// },
// {
// "displayName": "Store: total chunks ref",
// "value": 2
// },
// {
// "displayName": "Store: total chunks downloaded",
// "value": 3
// },
// {
// "displayName": "Store: chunks download time",
// "unit": "s",
// "value": 0.000390958
// },
// {
// "displayName": "Store: head chunk bytes",
// "unit": "decbytes",
// "value": 4
// },
// {
// "displayName": "Store: head chunk lines",
// "value": 5
// },
// {
// "displayName": "Store: decompressed bytes",
// "unit": "decbytes",
// "value": 7772
// },
// {
// "displayName": "Store: decompressed lines",
// "value": 55
// },
// {
// "displayName": "Store: compressed bytes",
// "unit": "decbytes",
// "value": 31432
// },
// {
// "displayName": "Store: total duplicates",
// "value": 6
// },
// {
// "displayName": "Ingester: total reached",
// "value": 7
// },
// {
// "displayName": "Ingester: total chunks matched",
// "value": 8
// },
// {
// "displayName": "Ingester: total batches",
// "value": 9
// },
// {
// "displayName": "Ingester: total lines sent",
// "value": 10
// },
// {
// "displayName": "Ingester: head chunk bytes",
// "unit": "decbytes",
// "value": 11
// },
// {
// "displayName": "Ingester: head chunk lines",
// "value": 12
// },
// {
// "displayName": "Ingester: decompressed bytes",
// "unit": "decbytes",
// "value": 13
// },
// {
// "displayName": "Ingester: decompressed lines",
// "value": 14
// },
// {
// "displayName": "Ingester: compressed bytes",
// "unit": "decbytes",
// "value": 15
// },
// {
// "displayName": "Ingester: total duplicates",
// "value": 16
// }
// ],
// "executedQueryString": "Expr: query1"
// }
// Name:
// Dimensions: 5 Fields by 6 Rows
// +-------------------------+-----------------------------------------+------------------+--------------------------------+-------------------------+
// | Name: labels | Name: timestamp | Name: body | Name: id | Name: labelTypes |
// | Labels: | Labels: | Labels: | Labels: | Labels: |
// | Type: []json.RawMessage | Type: []time.Time | Type: []string | Type: []string | Type: []json.RawMessage |
// +-------------------------+-----------------------------------------+------------------+--------------------------------+-------------------------+
// | {} | 2022-02-16 16:50:44.81075712 +0000 UTC | log line error 1 | 1645030244810757120_7bc6af55 | {} |
// | {} | 2022-02-16 16:50:47.02773504 +0000 UTC | log line info 1 | 1645030247027735040_2c9e69b9 | {} |
// | {} | 2022-02-16 16:50:46.277587968 +0000 UTC | log line info 2 | 1645030246277587968_b7784d5c | {} |
// | {} | 2022-02-16 16:50:46.277587968 +0000 UTC | log line info 2 | 1645030246277587968_b7784d5c_1 | {} |
// | {} | 2022-02-16 16:50:45.539423744 +0000 UTC | log line info 3 | 1645030245539423744_4aee7aab | {} |
// | {} | 2022-02-16 16:50:44.091700992 +0000 UTC | log line info 4 | 1645030244091700992_df059f36 | {} |
// +-------------------------+-----------------------------------------+------------------+--------------------------------+-------------------------+
//
//
// 🌟 This was machine generated. Do not edit. 🌟
{
"status": 200,
"frames": [
{
"schema": {
"meta": {
"type": "log-lines",
"typeVersion": [
0,
0
],
"stats": [
{
"displayName": "Summary: bytes processed per second",
"unit": "Bps",
"value": 3507022
},
{
"displayName": "Summary: lines processed per second",
"value": 24818
},
{
"displayName": "Summary: total bytes processed",
"unit": "decbytes",
"value": 7772
},
{
"displayName": "Summary: total lines processed",
"value": 55
},
{
"displayName": "Summary: exec time",
"unit": "s",
"value": 0.002216125
},
{
"displayName": "Store: total chunks ref",
"value": 2
},
{
"displayName": "Store: total chunks downloaded",
"value": 3
},
{
"displayName": "Store: chunks download time",
"unit": "s",
"value": 0.000390958
},
{
"displayName": "Store: head chunk bytes",
"unit": "decbytes",
"value": 4
},
{
"displayName": "Store: head chunk lines",
"value": 5
},
{
"displayName": "Store: decompressed bytes",
"unit": "decbytes",
"value": 7772
},
{
"displayName": "Store: decompressed lines",
"value": 55
},
{
"displayName": "Store: compressed bytes",
"unit": "decbytes",
"value": 31432
},
{
"displayName": "Store: total duplicates",
"value": 6
},
{
"displayName": "Ingester: total reached",
"value": 7
},
{
"displayName": "Ingester: total chunks matched",
"value": 8
},
{
"displayName": "Ingester: total batches",
"value": 9
},
{
"displayName": "Ingester: total lines sent",
"value": 10
},
{
"displayName": "Ingester: head chunk bytes",
"unit": "decbytes",
"value": 11
},
{
"displayName": "Ingester: head chunk lines",
"value": 12
},
{
"displayName": "Ingester: decompressed bytes",
"unit": "decbytes",
"value": 13
},
{
"displayName": "Ingester: decompressed lines",
"value": 14
},
{
"displayName": "Ingester: compressed bytes",
"unit": "decbytes",
"value": 15
},
{
"displayName": "Ingester: total duplicates",
"value": 16
}
],
"executedQueryString": "Expr: query1"
},
"fields": [
{
"name": "labels",
"type": "other",
"typeInfo": {
"frame": "json.RawMessage"
}
},
{
"name": "timestamp",
"type": "time",
"typeInfo": {
"frame": "time.Time"
}
},
{
"name": "body",
"type": "string",
"typeInfo": {
"frame": "string"
}
},
{
"name": "id",
"type": "string",
"typeInfo": {
"frame": "string"
}
},
{
"name": "labelTypes",
"type": "other",
"typeInfo": {
"frame": "json.RawMessage"
},
"config": {
"custom": {
"hidden": true
}
}
}
]
},
"data": {
"values": [
[
{},
{},
{},
{},
{},
{}
],
[
1645030244810,
1645030247027,
1645030246277,
1645030246277,
1645030245539,
1645030244091
],
[
"log line error 1",
"log line info 1",
"log line info 2",
"log line info 2",
"log line info 3",
"log line info 4"
],
[
"1645030244810757120_7bc6af55",
"1645030247027735040_2c9e69b9",
"1645030246277587968_b7784d5c",
"1645030246277587968_b7784d5c_1",
"1645030245539423744_4aee7aab",
"1645030244091700992_df059f36"
],
[
{},
{},
{},
{},
{},
{}
]
],
"nanos": [
null,
[
757120,
735040,
587968,
587968,
423744,
700992
],
null,
null,
null
]
}
}
]
}
@@ -0,0 +1,89 @@
{
"status": "success",
"data": {
"encodingFlags": [
"categorize-labels"
],
"resultType": "streams",
"result": [
{
"stream": {
"code": "one\",",
"location": "moon🌙"
},
"values": [
[
"1645030244810757120",
"log line error 1",
{}
]
]
},
{
"stream": {
"code": "\",two",
"location": "moon🌙"
},
"values": [
[
"1645030247027735040",
"log line info 1",
{}
],
[
"1645030246277587968",
"log line info 2",
{}
],
[
"1645030246277587968",
"log line info 2",
{}
],
[
"1645030245539423744",
"log line info 3",
{}
],
[
"1645030244091700992",
"log line info 4",
{}
]
]
}
],
"stats": {
"summary": {
"bytesProcessedPerSecond": 3507022,
"linesProcessedPerSecond": 24818,
"totalBytesProcessed": 7772,
"totalLinesProcessed": 55,
"execTime": 0.002216125
},
"store": {
"totalChunksRef": 2,
"totalChunksDownloaded": 3,
"chunksDownloadTime": 0.000390958,
"headChunkBytes": 4,
"headChunkLines": 5,
"decompressedBytes": 7772,
"decompressedLines": 55,
"compressedBytes": 31432,
"totalDuplicates": 6
},
"ingester": {
"totalReached": 7,
"totalChunksMatched": 8,
"totalBatches": 9,
"totalLinesSent": 10,
"headChunkBytes": 11,
"headChunkLines": 12,
"decompressedBytes": 13,
"decompressedLines": 14,
"compressedBytes": 15,
"totalDuplicates": 16
}
}
}
}
@@ -0,0 +1,348 @@
// 🌟 This was machine generated. Do not edit. 🌟
//
// Frame[0] {
// "typeVersion": [
// 0,
// 0
// ],
// "custom": {
// "frameType": "LabeledTimeValues"
// },
// "stats": [
// {
// "displayName": "Summary: bytes processed per second",
// "unit": "Bps",
// "value": 3507022
// },
// {
// "displayName": "Summary: lines processed per second",
// "value": 24818
// },
// {
// "displayName": "Summary: total bytes processed",
// "unit": "decbytes",
// "value": 7772
// },
// {
// "displayName": "Summary: total lines processed",
// "value": 55
// },
// {
// "displayName": "Summary: exec time",
// "unit": "s",
// "value": 0.002216125
// },
// {
// "displayName": "Store: total chunks ref",
// "value": 2
// },
// {
// "displayName": "Store: total chunks downloaded",
// "value": 3
// },
// {
// "displayName": "Store: chunks download time",
// "unit": "s",
// "value": 0.000390958
// },
// {
// "displayName": "Store: head chunk bytes",
// "unit": "decbytes",
// "value": 4
// },
// {
// "displayName": "Store: head chunk lines",
// "value": 5
// },
// {
// "displayName": "Store: decompressed bytes",
// "unit": "decbytes",
// "value": 7772
// },
// {
// "displayName": "Store: decompressed lines",
// "value": 55
// },
// {
// "displayName": "Store: compressed bytes",
// "unit": "decbytes",
// "value": 31432
// },
// {
// "displayName": "Store: total duplicates",
// "value": 6
// },
// {
// "displayName": "Ingester: total reached",
// "value": 7
// },
// {
// "displayName": "Ingester: total chunks matched",
// "value": 8
// },
// {
// "displayName": "Ingester: total batches",
// "value": 9
// },
// {
// "displayName": "Ingester: total lines sent",
// "value": 10
// },
// {
// "displayName": "Ingester: head chunk bytes",
// "unit": "decbytes",
// "value": 11
// },
// {
// "displayName": "Ingester: head chunk lines",
// "value": 12
// },
// {
// "displayName": "Ingester: decompressed bytes",
// "unit": "decbytes",
// "value": 13
// },
// {
// "displayName": "Ingester: decompressed lines",
// "value": 14
// },
// {
// "displayName": "Ingester: compressed bytes",
// "unit": "decbytes",
// "value": 15
// },
// {
// "displayName": "Ingester: total duplicates",
// "value": 16
// }
// ],
// "executedQueryString": "Expr: query1"
// }
// Name:
// Dimensions: 6 Fields by 2 Rows
// +-------------------------+----------------------------------------+------------------+---------------------+-------------------------+------------------------------+
// | Name: labels | Name: Time | Name: Line | Name: tsNs | Name: labelTypes | Name: id |
// | Labels: | Labels: | Labels: | Labels: | Labels: | Labels: |
// | Type: []json.RawMessage | Type: []time.Time | Type: []string | Type: []string | Type: []json.RawMessage | Type: []string |
// +-------------------------+----------------------------------------+------------------+---------------------+-------------------------+------------------------------+
// | {} | 2022-02-16 16:50:44.81075712 +0000 UTC | log line error 1 | 1645030244810757120 | {} | 1645030244810757120_7bc6af55 |
// | {} | 2022-02-16 16:50:47.02773504 +0000 UTC | log line info 1 | 1645030247027735040 | {} | 1645030247027735040_2c9e69b9 |
// +-------------------------+----------------------------------------+------------------+---------------------+-------------------------+------------------------------+
//
//
// 🌟 This was machine generated. Do not edit. 🌟
{
"status": 200,
"frames": [
{
"schema": {
"meta": {
"typeVersion": [
0,
0
],
"custom": {
"frameType": "LabeledTimeValues"
},
"stats": [
{
"displayName": "Summary: bytes processed per second",
"unit": "Bps",
"value": 3507022
},
{
"displayName": "Summary: lines processed per second",
"value": 24818
},
{
"displayName": "Summary: total bytes processed",
"unit": "decbytes",
"value": 7772
},
{
"displayName": "Summary: total lines processed",
"value": 55
},
{
"displayName": "Summary: exec time",
"unit": "s",
"value": 0.002216125
},
{
"displayName": "Store: total chunks ref",
"value": 2
},
{
"displayName": "Store: total chunks downloaded",
"value": 3
},
{
"displayName": "Store: chunks download time",
"unit": "s",
"value": 0.000390958
},
{
"displayName": "Store: head chunk bytes",
"unit": "decbytes",
"value": 4
},
{
"displayName": "Store: head chunk lines",
"value": 5
},
{
"displayName": "Store: decompressed bytes",
"unit": "decbytes",
"value": 7772
},
{
"displayName": "Store: decompressed lines",
"value": 55
},
{
"displayName": "Store: compressed bytes",
"unit": "decbytes",
"value": 31432
},
{
"displayName": "Store: total duplicates",
"value": 6
},
{
"displayName": "Ingester: total reached",
"value": 7
},
{
"displayName": "Ingester: total chunks matched",
"value": 8
},
{
"displayName": "Ingester: total batches",
"value": 9
},
{
"displayName": "Ingester: total lines sent",
"value": 10
},
{
"displayName": "Ingester: head chunk bytes",
"unit": "decbytes",
"value": 11
},
{
"displayName": "Ingester: head chunk lines",
"value": 12
},
{
"displayName": "Ingester: decompressed bytes",
"unit": "decbytes",
"value": 13
},
{
"displayName": "Ingester: decompressed lines",
"value": 14
},
{
"displayName": "Ingester: compressed bytes",
"unit": "decbytes",
"value": 15
},
{
"displayName": "Ingester: total duplicates",
"value": 16
}
],
"executedQueryString": "Expr: query1"
},
"fields": [
{
"name": "labels",
"type": "other",
"typeInfo": {
"frame": "json.RawMessage"
}
},
{
"name": "Time",
"type": "time",
"typeInfo": {
"frame": "time.Time"
}
},
{
"name": "Line",
"type": "string",
"typeInfo": {
"frame": "string"
}
},
{
"name": "tsNs",
"type": "string",
"typeInfo": {
"frame": "string"
}
},
{
"name": "labelTypes",
"type": "other",
"typeInfo": {
"frame": "json.RawMessage"
},
"config": {
"custom": {
"hidden": true
}
}
},
{
"name": "id",
"type": "string",
"typeInfo": {
"frame": "string"
}
}
]
},
"data": {
"values": [
[
{},
{}
],
[
1645030244810,
1645030247027
],
[
"log line error 1",
"log line info 1"
],
[
"1645030244810757120",
"1645030247027735040"
],
[
{},
{}
],
[
"1645030244810757120_7bc6af55",
"1645030247027735040_2c9e69b9"
]
],
"nanos": [
null,
[
757120,
735040
],
null,
null,
null,
null
]
}
}
]
}
@@ -0,0 +1,69 @@
{
"status": "success",
"data": {
"encodingFlags": [
"categorize-labels"
],
"resultType": "streams",
"result": [
{
"stream": {
"code": "one\",",
"location": "moon🌙"
},
"values": [
[
"1645030244810757120",
"log line error 1",
{}
]
]
},
{
"stream": {
"code": "\",two",
"location": "moon🌙"
},
"values": [
[
"1645030247027735040",
"log line info 1",
{}
]
]
}
],
"stats": {
"summary": {
"bytesProcessedPerSecond": 3507022,
"linesProcessedPerSecond": 24818,
"totalBytesProcessed": 7772,
"totalLinesProcessed": 55,
"execTime": 0.002216125
},
"store": {
"totalChunksRef": 2,
"totalChunksDownloaded": 3,
"chunksDownloadTime": 0.000390958,
"headChunkBytes": 4,
"headChunkLines": 5,
"decompressedBytes": 7772,
"decompressedLines": 55,
"compressedBytes": 31432,
"totalDuplicates": 6
},
"ingester": {
"totalReached": 7,
"totalChunksMatched": 8,
"totalBatches": 9,
"totalLinesSent": 10,
"headChunkBytes": 11,
"headChunkLines": 12,
"decompressedBytes": 13,
"decompressedLines": 14,
"compressedBytes": 15,
"totalDuplicates": 16
}
}
}
}