// Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 package otlpreceiver // import "go.opentelemetry.io/collector/receiver/otlpreceiver" import ( "bytes" "github.com/gogo/protobuf/jsonpb" "github.com/gogo/protobuf/proto" spb "google.golang.org/genproto/googleapis/rpc/status" "go.opentelemetry.io/collector/pdata/plog/plogotlp" "go.opentelemetry.io/collector/pdata/pmetric/pmetricotlp" "go.opentelemetry.io/collector/pdata/ptrace/ptraceotlp" ) const ( pbContentType = "application/x-protobuf" jsonContentType = "application/json" ) var ( pbEncoder = &protoEncoder{} jsEncoder = &jsonEncoder{} jsonMarshaler = &jsonpb.Marshaler{} ) type encoder interface { unmarshalTracesRequest(buf []byte) (ptraceotlp.ExportRequest, error) unmarshalMetricsRequest(buf []byte) (pmetricotlp.ExportRequest, error) unmarshalLogsRequest(buf []byte) (plogotlp.ExportRequest, error) marshalTracesResponse(ptraceotlp.ExportResponse) ([]byte, error) marshalMetricsResponse(pmetricotlp.ExportResponse) ([]byte, error) marshalLogsResponse(plogotlp.ExportResponse) ([]byte, error) marshalStatus(rsp *spb.Status) ([]byte, error) contentType() string } type protoEncoder struct{} func (protoEncoder) unmarshalTracesRequest(buf []byte) (ptraceotlp.ExportRequest, error) { req := ptraceotlp.NewExportRequest() err := req.UnmarshalProto(buf) return req, err } func (protoEncoder) unmarshalMetricsRequest(buf []byte) (pmetricotlp.ExportRequest, error) { req := pmetricotlp.NewExportRequest() err := req.UnmarshalProto(buf) return req, err } func (protoEncoder) unmarshalLogsRequest(buf []byte) (plogotlp.ExportRequest, error) { req := plogotlp.NewExportRequest() err := req.UnmarshalProto(buf) return req, err } func (protoEncoder) marshalTracesResponse(resp ptraceotlp.ExportResponse) ([]byte, error) { return resp.MarshalProto() } func (protoEncoder) marshalMetricsResponse(resp pmetricotlp.ExportResponse) ([]byte, error) { return resp.MarshalProto() } func (protoEncoder) marshalLogsResponse(resp plogotlp.ExportResponse) ([]byte, error) { return resp.MarshalProto() } func (protoEncoder) marshalStatus(resp *spb.Status) ([]byte, error) { return proto.Marshal(resp) } func (protoEncoder) contentType() string { return pbContentType } type jsonEncoder struct{} func (jsonEncoder) unmarshalTracesRequest(buf []byte) (ptraceotlp.ExportRequest, error) { req := ptraceotlp.NewExportRequest() err := req.UnmarshalJSON(buf) return req, err } func (jsonEncoder) unmarshalMetricsRequest(buf []byte) (pmetricotlp.ExportRequest, error) { req := pmetricotlp.NewExportRequest() err := req.UnmarshalJSON(buf) return req, err } func (jsonEncoder) unmarshalLogsRequest(buf []byte) (plogotlp.ExportRequest, error) { req := plogotlp.NewExportRequest() err := req.UnmarshalJSON(buf) return req, err } func (jsonEncoder) marshalTracesResponse(resp ptraceotlp.ExportResponse) ([]byte, error) { return resp.MarshalJSON() } func (jsonEncoder) marshalMetricsResponse(resp pmetricotlp.ExportResponse) ([]byte, error) { return resp.MarshalJSON() } func (jsonEncoder) marshalLogsResponse(resp plogotlp.ExportResponse) ([]byte, error) { return resp.MarshalJSON() } func (jsonEncoder) marshalStatus(resp *spb.Status) ([]byte, error) { buf := new(bytes.Buffer) err := jsonMarshaler.Marshal(buf, resp) return buf.Bytes(), err } func (jsonEncoder) contentType() string { return jsonContentType }