master
go 77 lines 1.65 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package chartengine
4
5 import (
6 "strconv"
7 "testing"
8
9 "github.com/netdata/netdata/go/plugins/pkg/metrix"
10 )
11
12 const benchTemplateYAML = `
13 version: v1
14 groups:
15 - family: "Bench"
16 metrics: ["bench_metric"]
17 charts:
18 - title: "Bench metric"
19 context: "bench.metric"
20 units: "units"
21 dimensions:
22 - selector: bench_metric
23 name_from_label: id
24 `
25
26 func BenchmarkBuildPlanBySeriesCardinality(b *testing.B) {
27 tests := map[string]int{
28 "series_100": 100,
29 "series_1000": 1000,
30 "series_10000": 10000,
31 }
32
33 for name, seriesCount := range tests {
34 b.Run(name, func(b *testing.B) {
35 reader := benchmarkCollectorReader(b, seriesCount)
36
37 engine, err := New()
38 if err != nil {
39 b.Fatalf("new engine: %v", err)
40 }
41 if err := engine.LoadYAML([]byte(benchTemplateYAML), 1); err != nil {
42 b.Fatalf("load template: %v", err)
43 }
44
45 b.ReportAllocs()
46 b.ResetTimer()
47 for i := 0; i < b.N; i++ {
48 if _, err := buildPlan(engine, reader); err != nil {
49 b.Fatalf("build plan: %v", err)
50 }
51 }
52 })
53 }
54 }
55
56 func benchmarkCollectorReader(b *testing.B, seriesCount int) metrix.Reader {
57 b.Helper()
58
59 store := metrix.NewCollectorStore()
60 managed, ok := metrix.AsCycleManagedStore(store)
61 if !ok {
62 b.Fatalf("collector store is not cycle-managed")
63 }
64 cc := managed.CycleController()
65
66 meter := store.Write().SnapshotMeter("")
67 g := meter.Gauge("bench_metric")
68
69 cc.BeginCycle()
70 for i := range seriesCount {
71 g.Observe(metrix.SampleValue(i), meter.LabelSet(
72 metrix.Label{Key: "id", Value: strconv.Itoa(i)},
73 ))
74 }
75 cc.CommitCycleSuccess()
76 return store.Read(metrix.ReadRaw())
77 }