Skip to content

Commit dc620e7

Browse files
committed
feat: collect and serve pre-agg bytes and count
* pre-aggregate bytes and count per stream in the pattern ingester * serve bytes_over_time and count_over_time queries from the patterns endpoint
1 parent 97212ea commit dc620e7

32 files changed

+2921
-308
lines changed

cmd/loki/loki-local-config.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ schema_config:
3333
prefix: index_
3434
period: 24h
3535

36+
pattern_ingester:
37+
enabled: true
38+
3639
ruler:
3740
alertmanager_url: http://localhost:9093
3841

pkg/logproto/extensions.go

+16-2
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,8 @@ func (r *QueryPatternsResponse) UnmarshalJSON(data []byte) error {
161161
var v struct {
162162
Status string `json:"status"`
163163
Data []struct {
164-
Pattern string `json:"pattern"`
164+
Pattern string `json:"pattern,omitempty"`
165+
Labels string `json:"labels,omitempty"`
165166
Samples [][]int64 `json:"samples"`
166167
} `json:"data"`
167168
}
@@ -174,7 +175,12 @@ func (r *QueryPatternsResponse) UnmarshalJSON(data []byte) error {
174175
for _, s := range d.Samples {
175176
samples = append(samples, &PatternSample{Timestamp: model.TimeFromUnix(s[0]), Value: s[1]})
176177
}
177-
r.Series = append(r.Series, &PatternSeries{Pattern: d.Pattern, Samples: samples})
178+
179+
if pattern := d.Pattern; pattern != "" {
180+
r.Series = append(r.Series, NewPatternSeriesWithPattern(pattern, samples))
181+
} else if labels := d.Labels; labels != "" {
182+
r.Series = append(r.Series, NewPatternSeriesWithLabels(labels, samples))
183+
}
178184
}
179185
return nil
180186
}
@@ -188,3 +194,11 @@ func (m *ShardsResponse) Merge(other *ShardsResponse) {
188194
m.ChunkGroups = append(m.ChunkGroups, other.ChunkGroups...)
189195
m.Statistics.Merge(other.Statistics)
190196
}
197+
198+
func NewPatternSeriesWithPattern(pattern string, samples []*PatternSample) *PatternSeries {
199+
return &PatternSeries{Identifier: &PatternSeries_Pattern{pattern}, Samples: samples}
200+
}
201+
202+
func NewPatternSeriesWithLabels(labels string, samples []*PatternSample) *PatternSeries {
203+
return &PatternSeries{Identifier: &PatternSeries_Labels{labels}, Samples: samples}
204+
}

pkg/logproto/extensions_test.go

+69
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package logproto
33
import (
44
"testing"
55

6+
"github.com/prometheus/common/model"
67
"github.com/stretchr/testify/require"
78
)
89

@@ -40,3 +41,71 @@ func TestShard_SpaceFor(t *testing.T) {
4041
})
4142
}
4243
}
44+
45+
func TestQueryPatternsResponse_UnmarshalJSON(t *testing.T) {
46+
t.Run("unmarshals patterns", func(t *testing.T) {
47+
mockData := []byte(`{
48+
"status": "success",
49+
"data": [
50+
{
51+
"pattern": "foo <*> bar",
52+
"samples": [[1609459200, 10], [1609545600, 15]]
53+
},
54+
{
55+
"pattern": "foo <*> buzz",
56+
"samples": [[1609459200, 20], [1609545600, 25]]
57+
}
58+
]
59+
}`)
60+
61+
expectedSeries := []*PatternSeries{
62+
NewPatternSeriesWithPattern("foo <*> bar", []*PatternSample{
63+
{Timestamp: model.TimeFromUnix(1609459200), Value: 10},
64+
{Timestamp: model.TimeFromUnix(1609545600), Value: 15},
65+
}),
66+
NewPatternSeriesWithPattern("foo <*> buzz", []*PatternSample{
67+
{Timestamp: model.TimeFromUnix(1609459200), Value: 20},
68+
{Timestamp: model.TimeFromUnix(1609545600), Value: 25},
69+
}),
70+
}
71+
72+
r := &QueryPatternsResponse{}
73+
err := r.UnmarshalJSON(mockData)
74+
75+
require.Nil(t, err)
76+
require.Equal(t, expectedSeries, r.Series)
77+
})
78+
79+
t.Run("unmarshals labels", func(t *testing.T) {
80+
mockData := []byte(`{
81+
"status": "success",
82+
"data": [
83+
{
84+
"labels": "{foo=\"bar\"}",
85+
"samples": [[1609459200, 10], [1609545600, 15]]
86+
},
87+
{
88+
"labels": "{foo=\"buzz\"}",
89+
"samples": [[1609459200, 20], [1609545600, 25]]
90+
}
91+
]
92+
}`)
93+
94+
expectedSeries := []*PatternSeries{
95+
NewPatternSeriesWithLabels(`{foo="bar"}`, []*PatternSample{
96+
{Timestamp: model.TimeFromUnix(1609459200), Value: 10},
97+
{Timestamp: model.TimeFromUnix(1609545600), Value: 15},
98+
}),
99+
NewPatternSeriesWithLabels(`{foo="buzz"}`, []*PatternSample{
100+
{Timestamp: model.TimeFromUnix(1609459200), Value: 20},
101+
{Timestamp: model.TimeFromUnix(1609545600), Value: 25},
102+
}),
103+
}
104+
105+
r := &QueryPatternsResponse{}
106+
err := r.UnmarshalJSON(mockData)
107+
108+
require.Nil(t, err)
109+
require.Equal(t, expectedSeries, r.Series)
110+
})
111+
}

0 commit comments

Comments
 (0)