prometheusremotewrite: Add PrometheusConverter.FromMetrics benchmark
Signed-off-by: Arve Knudsen <arve.knudsen@gmail.com>
This commit is contained in:
parent
99f3051f45
commit
9189507569
|
@ -0,0 +1,134 @@
|
|||
// Copyright 2024 The Prometheus Authors
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
// Provenance-includes-location: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/95e8f8fdc2a9dc87230406c9a3cf02be4fd68bea/pkg/translator/prometheusremotewrite/metrics_to_prw_test.go
|
||||
// Provenance-includes-license: Apache-2.0
|
||||
// Provenance-includes-copyright: Copyright The OpenTelemetry Authors.
|
||||
|
||||
package prometheusremotewrite
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
"go.opentelemetry.io/collector/pdata/pcommon"
|
||||
"go.opentelemetry.io/collector/pdata/pmetric"
|
||||
"go.opentelemetry.io/collector/pdata/pmetric/pmetricotlp"
|
||||
)
|
||||
|
||||
func BenchmarkPrometheusConverter_FromMetrics(b *testing.B) {
|
||||
for _, resourceAttributeCount := range []int{0, 5, 50} {
|
||||
b.Run(fmt.Sprintf("resource attribute count: %v", resourceAttributeCount), func(b *testing.B) {
|
||||
for _, histogramCount := range []int{0, 1000} {
|
||||
b.Run(fmt.Sprintf("histogram count: %v", histogramCount), func(b *testing.B) {
|
||||
nonHistogramCounts := []int{0, 1000}
|
||||
|
||||
if resourceAttributeCount == 0 && histogramCount == 0 {
|
||||
// Don't bother running a scenario where we'll generate no series.
|
||||
nonHistogramCounts = []int{1000}
|
||||
}
|
||||
|
||||
for _, nonHistogramCount := range nonHistogramCounts {
|
||||
b.Run(fmt.Sprintf("non-histogram count: %v", nonHistogramCount), func(b *testing.B) {
|
||||
for _, labelsPerMetric := range []int{2, 20} {
|
||||
b.Run(fmt.Sprintf("labels per metric: %v", labelsPerMetric), func(b *testing.B) {
|
||||
for _, exemplarsPerSeries := range []int{0, 5, 10} {
|
||||
b.Run(fmt.Sprintf("exemplars per series: %v", exemplarsPerSeries), func(b *testing.B) {
|
||||
payload := createExportRequest(resourceAttributeCount, histogramCount, nonHistogramCount, labelsPerMetric, exemplarsPerSeries)
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
converter := NewPrometheusConverter()
|
||||
require.NoError(b, converter.FromMetrics(payload.Metrics(), Settings{}))
|
||||
require.NotNil(b, converter.TimeSeries())
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func createExportRequest(resourceAttributeCount int, histogramCount int, nonHistogramCount int, labelsPerMetric int, exemplarsPerSeries int) pmetricotlp.ExportRequest {
|
||||
request := pmetricotlp.NewExportRequest()
|
||||
|
||||
rm := request.Metrics().ResourceMetrics().AppendEmpty()
|
||||
generateAttributes(rm.Resource().Attributes(), "resource", resourceAttributeCount)
|
||||
|
||||
metrics := rm.ScopeMetrics().AppendEmpty().Metrics()
|
||||
ts := pcommon.NewTimestampFromTime(time.Now())
|
||||
|
||||
for i := 1; i <= histogramCount; i++ {
|
||||
m := metrics.AppendEmpty()
|
||||
m.SetEmptyHistogram()
|
||||
m.SetName(fmt.Sprintf("histogram-%v", i))
|
||||
m.Histogram().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative)
|
||||
h := m.Histogram().DataPoints().AppendEmpty()
|
||||
h.SetTimestamp(ts)
|
||||
|
||||
// Set 50 samples, 10 each with values 0.5, 1, 2, 4, and 8
|
||||
h.SetCount(50)
|
||||
h.SetSum(155)
|
||||
h.BucketCounts().FromRaw([]uint64{10, 10, 10, 10, 10, 0})
|
||||
h.ExplicitBounds().FromRaw([]float64{.5, 1, 2, 4, 8, 16}) // Bucket boundaries include the upper limit (ie. each sample is on the upper limit of its bucket)
|
||||
|
||||
generateAttributes(h.Attributes(), "series", labelsPerMetric)
|
||||
generateExemplars(h.Exemplars(), exemplarsPerSeries, ts)
|
||||
}
|
||||
|
||||
for i := 1; i <= nonHistogramCount; i++ {
|
||||
m := metrics.AppendEmpty()
|
||||
m.SetEmptySum()
|
||||
m.SetName(fmt.Sprintf("sum-%v", i))
|
||||
m.Sum().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative)
|
||||
point := m.Sum().DataPoints().AppendEmpty()
|
||||
point.SetTimestamp(ts)
|
||||
point.SetDoubleValue(1.23)
|
||||
generateAttributes(point.Attributes(), "series", labelsPerMetric)
|
||||
generateExemplars(point.Exemplars(), exemplarsPerSeries, ts)
|
||||
}
|
||||
|
||||
for i := 1; i <= nonHistogramCount; i++ {
|
||||
m := metrics.AppendEmpty()
|
||||
m.SetEmptyGauge()
|
||||
m.SetName(fmt.Sprintf("gauge-%v", i))
|
||||
point := m.Gauge().DataPoints().AppendEmpty()
|
||||
point.SetTimestamp(ts)
|
||||
point.SetDoubleValue(1.23)
|
||||
generateAttributes(point.Attributes(), "series", labelsPerMetric)
|
||||
generateExemplars(point.Exemplars(), exemplarsPerSeries, ts)
|
||||
}
|
||||
|
||||
return request
|
||||
}
|
||||
|
||||
func generateAttributes(m pcommon.Map, prefix string, count int) {
|
||||
for i := 1; i <= count; i++ {
|
||||
m.PutStr(fmt.Sprintf("%v-name-%v", prefix, i), fmt.Sprintf("value-%v", i))
|
||||
}
|
||||
}
|
||||
|
||||
func generateExemplars(exemplars pmetric.ExemplarSlice, count int, ts pcommon.Timestamp) {
|
||||
for i := 1; i <= count; i++ {
|
||||
e := exemplars.AppendEmpty()
|
||||
e.SetTimestamp(ts)
|
||||
e.SetDoubleValue(2.22)
|
||||
e.SetSpanID(pcommon.SpanID{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08})
|
||||
e.SetTraceID(pcommon.TraceID{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f})
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue