mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-12-18 22:52:11 +01:00
711f2cc4f2
Commit adds the following changes: * Adds support of OpenTelemetry logs for Victoria Logs with protobuf encoded messages * json encoding is not supported for the following reasons: - It brings a lot of fragile code, which works inefficiently. - json encoding is impossible to use with language SDK. * splits metrics and logs structures at lib/protoparser/opentelemetry/pb package. * adds docs with examples for opentelemetry logs. --- Related issue: https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4839 Co-authored-by: AndrewChubatiuk <andrew.chubatiuk@gmail.com> Co-authored-by: f41gh7 <nik@victoriametrics.com>
80 lines
1.9 KiB
Go
80 lines
1.9 KiB
Go
package opentelemetry
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/app/vlinsert/insertutils"
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/protoparser/opentelemetry/pb"
|
|
)
|
|
|
|
func BenchmarkParseProtobufRequest(b *testing.B) {
|
|
for _, scopes := range []int{1, 2} {
|
|
for _, rows := range []int{100, 1000} {
|
|
for _, attributes := range []int{5, 10} {
|
|
b.Run(fmt.Sprintf("scopes_%d/rows_%d/attributes_%d", scopes, rows, attributes), func(b *testing.B) {
|
|
benchmarkParseProtobufRequest(b, scopes, rows, attributes)
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func benchmarkParseProtobufRequest(b *testing.B, streams, rows, labels int) {
|
|
blp := &insertutils.BenchmarkLogMessageProcessor{}
|
|
b.ReportAllocs()
|
|
b.SetBytes(int64(streams * rows))
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
body := getProtobufBody(streams, rows, labels)
|
|
for pb.Next() {
|
|
_, err := pushProtobufRequest(body, blp)
|
|
if err != nil {
|
|
panic(fmt.Errorf("unexpected error: %w", err))
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
func getProtobufBody(scopesCount, rowsCount, attributesCount int) []byte {
|
|
msg := "12345678910"
|
|
|
|
attrValues := []*pb.AnyValue{
|
|
{StringValue: ptrTo("string-attribute")},
|
|
{IntValue: ptrTo[int64](12345)},
|
|
{DoubleValue: ptrTo(3.14)},
|
|
}
|
|
attrs := make([]*pb.KeyValue, attributesCount)
|
|
for j := 0; j < attributesCount; j++ {
|
|
attrs[j] = &pb.KeyValue{
|
|
Key: fmt.Sprintf("key-%d", j),
|
|
Value: attrValues[j%3],
|
|
}
|
|
}
|
|
entries := make([]pb.LogRecord, rowsCount)
|
|
for j := 0; j < rowsCount; j++ {
|
|
entries[j] = pb.LogRecord{
|
|
TimeUnixNano: 12345678910, ObservedTimeUnixNano: 12345678910, Body: pb.AnyValue{StringValue: &msg},
|
|
}
|
|
}
|
|
scopes := make([]pb.ScopeLogs, scopesCount)
|
|
|
|
for j := 0; j < scopesCount; j++ {
|
|
scopes[j] = pb.ScopeLogs{
|
|
LogRecords: entries,
|
|
}
|
|
}
|
|
|
|
pr := pb.ExportLogsServiceRequest{
|
|
ResourceLogs: []pb.ResourceLogs{
|
|
{
|
|
Resource: pb.Resource{
|
|
Attributes: attrs,
|
|
},
|
|
ScopeLogs: scopes,
|
|
},
|
|
},
|
|
}
|
|
|
|
return pr.MarshalProtobuf(nil)
|
|
}
|