diff --git a/internal/otlpjson/marshaler.go b/internal/otlpjson/marshaler.go new file mode 100644 index 000000000000..c79a1bdfffa4 --- /dev/null +++ b/internal/otlpjson/marshaler.go @@ -0,0 +1,82 @@ +// Copyright The OpenTelemetry 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. + +package otlpjson + +import ( + "bytes" + + "github.com/gogo/protobuf/jsonpb" + + otlpcollectorlogs "go.opentelemetry.io/collector/internal/data/protogen/collector/logs/v1" + otlpcollectormetrics "go.opentelemetry.io/collector/internal/data/protogen/collector/metrics/v1" + otlpcollectortrace "go.opentelemetry.io/collector/internal/data/protogen/collector/trace/v1" + "go.opentelemetry.io/collector/internal/model/serializer" + "go.opentelemetry.io/collector/internal/model/translator" +) + +type marshaler struct { + delegate jsonpb.Marshaler +} + +// NewTracesMarshaler returns a serializer.TracesUnmarshaler to marshal to OTLP json bytes. +func NewTracesMarshaler() serializer.TracesMarshaler { + return &marshaler{delegate: jsonpb.Marshaler{}} +} + +// NewMetricsMarshaler returns a serializer.MetricsMarshaler to marshal to OTLP json bytes. +func NewMetricsMarshaler() serializer.MetricsMarshaler { + return &marshaler{delegate: jsonpb.Marshaler{}} +} + +// NewLogsMarshaler returns a serializer.LogsMarshaler to marshal to OTLP json bytes. +func NewLogsMarshaler() serializer.LogsMarshaler { + return &marshaler{delegate: jsonpb.Marshaler{}} +} + +func (en *marshaler) MarshalLogs(model interface{}) ([]byte, error) { + ld, ok := model.(*otlpcollectorlogs.ExportLogsServiceRequest) + if !ok { + return nil, translator.NewErrIncompatibleType(&otlpcollectorlogs.ExportLogsServiceRequest{}, model) + } + buf := bytes.Buffer{} + if err := en.delegate.Marshal(&buf, ld); err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +func (en *marshaler) MarshalMetrics(model interface{}) ([]byte, error) { + md, ok := model.(*otlpcollectormetrics.ExportMetricsServiceRequest) + if !ok { + return nil, translator.NewErrIncompatibleType(&otlpcollectormetrics.ExportMetricsServiceRequest{}, model) + } + buf := bytes.Buffer{} + if err := en.delegate.Marshal(&buf, md); err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +func (en *marshaler) MarshalTraces(model interface{}) ([]byte, error) { + td, ok := model.(*otlpcollectortrace.ExportTraceServiceRequest) + if !ok { + return nil, translator.NewErrIncompatibleType(&otlpcollectortrace.ExportTraceServiceRequest{}, model) + } + buf := bytes.Buffer{} + if err := en.delegate.Marshal(&buf, td); err != nil { + return nil, err + } + return buf.Bytes(), nil +} diff --git a/internal/otlpjson/unmarshaler.go b/internal/otlpjson/unmarshaler.go new file mode 100644 index 000000000000..46b30aab94e9 --- /dev/null +++ b/internal/otlpjson/unmarshaler.go @@ -0,0 +1,69 @@ +// Copyright The OpenTelemetry 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. + +package otlpjson + +import ( + "bytes" + + "github.com/gogo/protobuf/jsonpb" + + otlpcollectorlogs "go.opentelemetry.io/collector/internal/data/protogen/collector/logs/v1" + otlpcollectormetrics "go.opentelemetry.io/collector/internal/data/protogen/collector/metrics/v1" + otlpcollectortrace "go.opentelemetry.io/collector/internal/data/protogen/collector/trace/v1" + "go.opentelemetry.io/collector/internal/model/serializer" +) + +type unmarshaler struct { + delegate jsonpb.Unmarshaler +} + +// NewTracesUnmarshaler returns a serializer.TracesUnmarshaler to unmarshal from OTLP json bytes. +func NewTracesUnmarshaler() serializer.TracesUnmarshaler { + return &unmarshaler{delegate: jsonpb.Unmarshaler{}} +} + +// NewMetricsUnmarshaler returns a serializer.MetricsUnmarshaler to unmarshal from OTLP json bytes. +func NewMetricsUnmarshaler() serializer.MetricsUnmarshaler { + return &unmarshaler{delegate: jsonpb.Unmarshaler{}} +} + +// NewLogsUnmarshaler returns a serializer.LogsUnmarshaler to unmarshal from OTLP json bytes. +func NewLogsUnmarshaler() serializer.LogsUnmarshaler { + return &unmarshaler{delegate: jsonpb.Unmarshaler{}} +} + +func (d *unmarshaler) UnmarshalLogs(buf []byte) (interface{}, error) { + ld := &otlpcollectorlogs.ExportLogsServiceRequest{} + if err := d.delegate.Unmarshal(bytes.NewReader(buf), ld); err != nil { + return nil, err + } + return ld, nil +} + +func (d *unmarshaler) UnmarshalMetrics(buf []byte) (interface{}, error) { + md := &otlpcollectormetrics.ExportMetricsServiceRequest{} + if err := d.delegate.Unmarshal(bytes.NewReader(buf), md); err != nil { + return nil, err + } + return md, nil +} + +func (d *unmarshaler) UnmarshalTraces(buf []byte) (interface{}, error) { + td := &otlpcollectortrace.ExportTraceServiceRequest{} + if err := d.delegate.Unmarshal(bytes.NewReader(buf), td); err != nil { + return nil, err + } + return td, nil +}