Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions .chloggen/use-new-protos.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Use this changelog template to create an entry for release notes.

# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: enhancement

# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
component: pdata

# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Use the newly added proto marshaler/unmarshaler for the official proto Marshaler/Unmarshaler

# One or more tracking issues or pull requests related to the change
issues: [13637]

# (Optional) One or more lines of additional information to render under the primary note.
# These lines will be padded with 2 spaces and then inserted directly into the document.
# Use pipe (|) for multiline entries.
subtext:

# Optional: The change log or logs in which this entry should be included.
# e.g. '[user]' or '[user, api]'
# Include 'user' if the change is relevant to end users.
# Include 'api' if there is a change to a library API.
# Default: '[user]'
change_logs: [user]
5 changes: 3 additions & 2 deletions internal/e2e/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ module go.opentelemetry.io/collector/internal/e2e
go 1.24

require (
github.com/google/go-cmp v0.7.0
github.com/prometheus/common v0.65.0
github.com/stretchr/testify v1.10.0
go.opentelemetry.io/collector v0.132.0
Expand Down Expand Up @@ -43,9 +44,11 @@ require (
go.opentelemetry.io/collector/receiver/otlpreceiver v0.132.0
go.opentelemetry.io/collector/receiver/receivertest v0.132.0
go.opentelemetry.io/collector/service v0.132.0
go.opentelemetry.io/proto/otlp v1.7.0
go.uber.org/goleak v1.3.0
go.uber.org/zap v1.27.0
google.golang.org/grpc v1.74.2
google.golang.org/protobuf v1.36.7
)

require (
Expand Down Expand Up @@ -144,7 +147,6 @@ require (
go.opentelemetry.io/otel/sdk/log v0.13.0 // indirect
go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect
go.opentelemetry.io/otel/trace v1.37.0 // indirect
go.opentelemetry.io/proto/otlp v1.7.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/crypto v0.41.0 // indirect
Expand All @@ -155,7 +157,6 @@ require (
gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
google.golang.org/protobuf v1.36.7 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
sigs.k8s.io/yaml v1.5.0 // indirect
)
Expand Down
87 changes: 78 additions & 9 deletions internal/e2e/otlphttp_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
"bytes"
"compress/gzip"
"context"
"encoding/base64"
"encoding/hex"
"errors"
"fmt"
Expand All @@ -17,8 +16,15 @@ import (
"testing"
"time"

"github.com/google/go-cmp/cmp"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
gootlpcollectortrace "go.opentelemetry.io/proto/otlp/collector/trace/v1"
gootlpcommon "go.opentelemetry.io/proto/otlp/common/v1"
gootlpresource "go.opentelemetry.io/proto/otlp/resource/v1"
gootlptrace "go.opentelemetry.io/proto/otlp/trace/v1"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/testing/protocmp"

"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/component/componenttest"
Expand Down Expand Up @@ -229,6 +235,11 @@ func TestLogsRoundTrip(t *testing.T) {
}

func TestIssue_4221(t *testing.T) {
traceIDBytesSlice, err := hex.DecodeString("4303853f086f4f8c86cf198b6551df84")
require.NoError(t, err)
spanIDBytesSlice, err := hex.DecodeString("e5513c32795c41b9")
require.NoError(t, err)

svr := httptest.NewServer(http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) {
defer func() { assert.NoError(t, r.Body.Close()) }()
compressedData, err := io.ReadAll(r.Body)
Expand All @@ -237,13 +248,75 @@ func TestIssue_4221(t *testing.T) {
assert.NoError(t, err)
data, err := io.ReadAll(gzipReader)
assert.NoError(t, err)
base64Data := base64.StdEncoding.EncodeToString(data)
// Verify same base64 encoded string is received.
assert.Equal(t, "CscBCkkKIAoMc2VydmljZS5uYW1lEhAKDnVvcC5zdGFnZS1ldS0xCiUKGW91dHN5c3RlbXMubW9kdWxlLnZlcnNpb24SCAoGOTAzMzg2EnoKEQoMdW9wX2NhbmFyaWVzEgExEmUKEEMDhT8Ib0+Mhs8Zi2VR34QSCOVRPDJ5XEG5IgA5QE41aASRrxZBQE41aASRrxZKEAoKc3Bhbl9pbmRleBICGANKHwoNY29kZS5mdW5jdGlvbhIOCgxteUZ1bmN0aW9uMzZ6AA==", base64Data)
unbase64Data, err := base64.StdEncoding.DecodeString(base64Data)
req := &gootlpcollectortrace.ExportTraceServiceRequest{}
assert.NoError(t, proto.Unmarshal(data, req))

assert.Empty(t, cmp.Diff(&gootlpcollectortrace.ExportTraceServiceRequest{
ResourceSpans: []*gootlptrace.ResourceSpans{
{
Resource: &gootlpresource.Resource{
Attributes: []*gootlpcommon.KeyValue{
{
Key: "service.name",
Value: &gootlpcommon.AnyValue{
Value: &gootlpcommon.AnyValue_StringValue{
StringValue: "uop.stage-eu-1",
},
},
},
{
Key: "outsystems.module.version",
Value: &gootlpcommon.AnyValue{
Value: &gootlpcommon.AnyValue_StringValue{
StringValue: "903386",
},
},
},
},
},
ScopeSpans: []*gootlptrace.ScopeSpans{
{
Scope: &gootlpcommon.InstrumentationScope{
Name: "uop_canaries",
Version: "1",
},
Spans: []*gootlptrace.Span{
{
TraceId: traceIDBytesSlice,
SpanId: spanIDBytesSlice,
StartTimeUnixNano: 1634684637873000000,
EndTimeUnixNano: 1634684637873000000,
Attributes: []*gootlpcommon.KeyValue{
{
Key: "span_index",
Value: &gootlpcommon.AnyValue{
Value: &gootlpcommon.AnyValue_IntValue{
IntValue: 3,
},
},
},
{
Key: "code.function",
Value: &gootlpcommon.AnyValue{
Value: &gootlpcommon.AnyValue_StringValue{
StringValue: "myFunction36",
},
},
},
},
Status: &gootlptrace.Status{},
},
},
},
},
},
},
}, req, protocmp.Transform()))

assert.NoError(t, err)
tr := ptraceotlp.NewExportRequest()
assert.NoError(t, tr.UnmarshalProto(unbase64Data))
assert.NoError(t, tr.UnmarshalProto(data))
span := tr.Traces().ResourceSpans().At(0).ScopeSpans().At(0).Spans().At(0)
traceID := span.TraceID()
assert.Equal(t, "4303853f086f4f8c86cf198b6551df84", hex.EncodeToString(traceID[:]))
Expand All @@ -264,16 +337,12 @@ func TestIssue_4221(t *testing.T) {
span := ils.Spans().AppendEmpty()

var traceIDBytes [16]byte
traceIDBytesSlice, err := hex.DecodeString("4303853f086f4f8c86cf198b6551df84")
require.NoError(t, err)
copy(traceIDBytes[:], traceIDBytesSlice)
span.SetTraceID(traceIDBytes)
traceID := span.TraceID()
assert.Equal(t, "4303853f086f4f8c86cf198b6551df84", hex.EncodeToString(traceID[:]))

var spanIDBytes [8]byte
spanIDBytesSlice, err := hex.DecodeString("e5513c32795c41b9")
require.NoError(t, err)
copy(spanIDBytes[:], spanIDBytesSlice)
span.SetSpanID(spanIDBytes)
spanID := span.SpanID()
Expand Down
25 changes: 14 additions & 11 deletions pdata/plog/pb.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,41 +5,44 @@ package plog // import "go.opentelemetry.io/collector/pdata/plog"

import (
"go.opentelemetry.io/collector/pdata/internal"
otlplogs "go.opentelemetry.io/collector/pdata/internal/data/protogen/logs/v1"
)

var _ MarshalSizer = (*ProtoMarshaler)(nil)

type ProtoMarshaler struct{}

func (e *ProtoMarshaler) MarshalLogs(ld Logs) ([]byte, error) {
pb := internal.LogsToProto(internal.Logs(ld))
return pb.Marshal()
size := internal.SizeProtoOrigExportLogsServiceRequest(ld.getOrig())
buf := make([]byte, size)
_ = internal.MarshalProtoOrigExportLogsServiceRequest(ld.getOrig(), buf)
return buf, nil
}

func (e *ProtoMarshaler) LogsSize(ld Logs) int {
pb := internal.LogsToProto(internal.Logs(ld))
return pb.Size()
return internal.SizeProtoOrigExportLogsServiceRequest(ld.getOrig())
}

func (e *ProtoMarshaler) ResourceLogsSize(rl ResourceLogs) int {
return rl.orig.Size()
return internal.SizeProtoOrigResourceLogs(rl.orig)
}

func (e *ProtoMarshaler) ScopeLogsSize(sl ScopeLogs) int {
return sl.orig.Size()
return internal.SizeProtoOrigScopeLogs(sl.orig)
}

func (e *ProtoMarshaler) LogRecordSize(lr LogRecord) int {
return lr.orig.Size()
return internal.SizeProtoOrigLogRecord(lr.orig)
}

var _ Unmarshaler = (*ProtoUnmarshaler)(nil)

type ProtoUnmarshaler struct{}

func (d *ProtoUnmarshaler) UnmarshalLogs(buf []byte) (Logs, error) {
pb := otlplogs.LogsData{}
err := pb.Unmarshal(buf)
return Logs(internal.LogsFromProto(pb)), err
ld := NewLogs()
err := internal.UnmarshalProtoOrigExportLogsServiceRequest(ld.getOrig(), buf)
if err != nil {
return Logs{}, err
}
return ld, nil
}
8 changes: 6 additions & 2 deletions pdata/plog/plogotlp/request.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,16 @@ func NewExportRequestFromLogs(ld plog.Logs) ExportRequest {

// MarshalProto marshals ExportRequest into proto bytes.
func (ms ExportRequest) MarshalProto() ([]byte, error) {
return ms.orig.Marshal()
size := internal.SizeProtoOrigExportLogsServiceRequest(ms.orig)
buf := make([]byte, size)
_ = internal.MarshalProtoOrigExportLogsServiceRequest(ms.orig, buf)
return buf, nil
}

// UnmarshalProto unmarshalls ExportRequest from proto bytes.
func (ms ExportRequest) UnmarshalProto(data []byte) error {
if err := ms.orig.Unmarshal(data); err != nil {
err := internal.UnmarshalProtoOrigExportLogsServiceRequest(ms.orig, data)
if err != nil {
return err
}
otlp.MigrateLogs(ms.orig.ResourceLogs)
Expand Down
7 changes: 5 additions & 2 deletions pdata/plog/plogotlp/response.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,15 @@ import (

// MarshalProto marshals ExportResponse into proto bytes.
func (ms ExportResponse) MarshalProto() ([]byte, error) {
return ms.orig.Marshal()
size := internal.SizeProtoOrigExportLogsServiceResponse(ms.orig)
buf := make([]byte, size)
_ = internal.MarshalProtoOrigExportLogsServiceResponse(ms.orig, buf)
return buf, nil
}

// UnmarshalProto unmarshalls ExportResponse from proto bytes.
func (ms ExportResponse) UnmarshalProto(data []byte) error {
return ms.orig.Unmarshal(data)
return internal.UnmarshalProtoOrigExportLogsServiceResponse(ms.orig, data)
}

// MarshalJSON marshals ExportResponse into JSON bytes.
Expand Down
33 changes: 18 additions & 15 deletions pdata/pmetric/pb.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,55 +5,58 @@ package pmetric // import "go.opentelemetry.io/collector/pdata/pmetric"

import (
"go.opentelemetry.io/collector/pdata/internal"
otlpmetrics "go.opentelemetry.io/collector/pdata/internal/data/protogen/metrics/v1"
)

var _ MarshalSizer = (*ProtoMarshaler)(nil)

type ProtoMarshaler struct{}

func (e *ProtoMarshaler) MarshalMetrics(md Metrics) ([]byte, error) {
pb := internal.MetricsToProto(internal.Metrics(md))
return pb.Marshal()
size := internal.SizeProtoOrigExportMetricsServiceRequest(md.getOrig())
buf := make([]byte, size)
_ = internal.MarshalProtoOrigExportMetricsServiceRequest(md.getOrig(), buf)
return buf, nil
}

func (e *ProtoMarshaler) MetricsSize(md Metrics) int {
pb := internal.MetricsToProto(internal.Metrics(md))
return pb.Size()
return internal.SizeProtoOrigExportMetricsServiceRequest(md.getOrig())
}

func (e *ProtoMarshaler) ResourceMetricsSize(rm ResourceMetrics) int {
return rm.orig.Size()
return internal.SizeProtoOrigResourceMetrics(rm.orig)
}

func (e *ProtoMarshaler) ScopeMetricsSize(sm ScopeMetrics) int {
return sm.orig.Size()
return internal.SizeProtoOrigScopeMetrics(sm.orig)
}

func (e *ProtoMarshaler) MetricSize(m Metric) int {
return m.orig.Size()
return internal.SizeProtoOrigMetric(m.orig)
}

func (e *ProtoMarshaler) NumberDataPointSize(ndp NumberDataPoint) int {
return ndp.orig.Size()
return internal.SizeProtoOrigNumberDataPoint(ndp.orig)
}

func (e *ProtoMarshaler) SummaryDataPointSize(sdps SummaryDataPoint) int {
return sdps.orig.Size()
return internal.SizeProtoOrigSummaryDataPoint(sdps.orig)
}

func (e *ProtoMarshaler) HistogramDataPointSize(hdp HistogramDataPoint) int {
return hdp.orig.Size()
return internal.SizeProtoOrigHistogramDataPoint(hdp.orig)
}

func (e *ProtoMarshaler) ExponentialHistogramDataPointSize(ehdp ExponentialHistogramDataPoint) int {
return ehdp.orig.Size()
return internal.SizeProtoOrigExponentialHistogramDataPoint(ehdp.orig)
}

type ProtoUnmarshaler struct{}

func (d *ProtoUnmarshaler) UnmarshalMetrics(buf []byte) (Metrics, error) {
pb := otlpmetrics.MetricsData{}
err := pb.Unmarshal(buf)
return Metrics(internal.MetricsFromProto(pb)), err
md := NewMetrics()
err := internal.UnmarshalProtoOrigExportMetricsServiceRequest(md.getOrig(), buf)
if err != nil {
return Metrics{}, err
}
return md, nil
}
13 changes: 11 additions & 2 deletions pdata/pmetric/pmetricotlp/request.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package pmetricotlp // import "go.opentelemetry.io/collector/pdata/pmetric/pmetr
import (
"go.opentelemetry.io/collector/pdata/internal"
otlpcollectormetrics "go.opentelemetry.io/collector/pdata/internal/data/protogen/collector/metrics/v1"
"go.opentelemetry.io/collector/pdata/internal/otlp"
"go.opentelemetry.io/collector/pdata/pmetric"
)

Expand Down Expand Up @@ -41,12 +42,20 @@ func NewExportRequestFromMetrics(md pmetric.Metrics) ExportRequest {

// MarshalProto marshals ExportRequest into proto bytes.
func (ms ExportRequest) MarshalProto() ([]byte, error) {
return ms.orig.Marshal()
size := internal.SizeProtoOrigExportMetricsServiceRequest(ms.orig)
buf := make([]byte, size)
_ = internal.MarshalProtoOrigExportMetricsServiceRequest(ms.orig, buf)
return buf, nil
}

// UnmarshalProto unmarshalls ExportRequest from proto bytes.
func (ms ExportRequest) UnmarshalProto(data []byte) error {
return ms.orig.Unmarshal(data)
err := internal.UnmarshalProtoOrigExportMetricsServiceRequest(ms.orig, data)
if err != nil {
return err
}
otlp.MigrateMetrics(ms.orig.ResourceMetrics)
return nil
}

// MarshalJSON marshals ExportRequest into JSON bytes.
Expand Down
Loading
Loading