Skip to content
Merged
35 changes: 35 additions & 0 deletions protocols/encodings/decoder.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// 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 encodings

import "go.opentelemetry.io/collector/consumer/pdata"

// MetricsDecoder converts another protocol to pdata.
type MetricsDecoder interface {
// UnmarshalMetrics converts data in another protocol to pdata.
UnmarshalMetrics(bytes []byte) (pdata.Metrics, error)
}

// TracesDecoder converts another type of data to pdata.
type TracesDecoder interface {
// UnmarshalTraces converts data in another protocol to pdata.
UnmarshalTraces(bytes []byte) (pdata.Traces, error)
}

// LogsDecoder converts another type of data to pdata.
type LogsDecoder interface {
// UnmarshalLogs converts a data model of another protocol into pdata.
UnmarshalLogs(bytes []byte) (pdata.Logs, error)
}
32 changes: 32 additions & 0 deletions protocols/encodings/encoder.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// 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 encodings

import "go.opentelemetry.io/collector/consumer/pdata"

// MetricsEncoder converts pdata to another type.
type MetricsEncoder interface {
MarshalMetrics(md pdata.Metrics) ([]byte, error)
}

// TracesEncoder converts pdata to another type.
type TracesEncoder interface {
MarshalTraces(md pdata.Traces) ([]byte, error)
}

// LogsEncoder converts pdata to another type.
type LogsEncoder interface {
MarshalLogs(md pdata.Logs) ([]byte, error)
}
38 changes: 38 additions & 0 deletions protocols/encodings/encodings.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// 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 encodings

import "fmt"

// Encoding is the format that a protocol is serialized to.
type Encoding string

const (
Protobuf Encoding = "protobuf"
JSON Encoding = "json"
Thrift Encoding = "thrift"
)

func (e Encoding) String() string {
return string(e)
}

type ErrInvalidEncoding struct {
Encoding Encoding
}

func (e *ErrInvalidEncoding) Error() string {
return fmt.Sprintf("unsupported encoding %q", e.Encoding)
}
51 changes: 51 additions & 0 deletions protocols/models/models.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// 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 models

import (
"fmt"
"go.opentelemetry.io/collector/consumer/pdata"
)

type MetricsModelTranslator interface {
// MetricsFromModel converts a data model of another protocol into pdata.
MetricsFromModel(src interface{}) (pdata.Metrics, error)
// MetricsToModel converts pdata to data model.
MetricsToModel(md pdata.Metrics, out interface{}) error
}

type TracesModelTranslator interface {
// TracesFromModel converts a data model of another protocol into pdata.
TracesFromModel(src interface{}) (pdata.Traces, error)
// TracesToModel converts pdata to data model.
TracesToModel(md pdata.Traces, out interface{}) error
}

type LogsModelTranslator interface {
// LogsFromModel converts a data model of another protocol into pdata.
LogsFromModel(src interface{}) (pdata.Logs, error)
// LogsToModel converts pdata to data model.
LogsToModel(md pdata.Logs, out interface{}) error
}

// ErrIncompatibleType details a type conversion error during translation.
type ErrIncompatibleType struct {
Model interface{}
// TODO: maybe do expected vs. actual?
}

func (i *ErrIncompatibleType) Error() string {
return fmt.Sprintf("model type %T is incompatible", i.Model)
}
71 changes: 71 additions & 0 deletions protocols/zipkinv2/encodings.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
// 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 zipkinv2

import (
"encoding/json"

zipkinmodel "github.com/openzipkin/zipkin-go/model"
"github.com/openzipkin/zipkin-go/proto/zipkin_proto3"

"go.opentelemetry.io/collector/consumer/pdata"
"go.opentelemetry.io/collector/protocols/encodings"
"go.opentelemetry.io/collector/protocols/models"
)

var (
_ encodings.TracesEncoder = (*Encoder)(nil)
_ encodings.TracesDecoder = (*Encoder)(nil)
)

type Encoder struct {
models.TracesModelTranslator
// Encoding is the format Zipkin is serialized to.
Encoding encodings.Encoding
}

func (z *Encoder) UnmarshalTraces(bytes []byte) (pdata.Traces, error) {
switch z.Encoding {
case encodings.Protobuf:
spans, err := zipkin_proto3.ParseSpans(bytes, false)
if err != nil {
return pdata.NewTraces(), err
}
return z.TracesFromModel(spans)
case encodings.JSON:
var spans []*zipkinmodel.SpanModel
if err := json.Unmarshal(bytes, &spans); err != nil {
return pdata.NewTraces(), err
}
return z.TracesFromModel(spans)
default:
return pdata.NewTraces(), &encodings.ErrInvalidEncoding{Encoding: z.Encoding}
}
}

func (z *Encoder) MarshalTraces(td pdata.Traces) ([]byte, error) {
switch z.Encoding {
// TODO
// case protocols.Protobuf:
case encodings.JSON:
var spans []*zipkinmodel.SpanModel
if err := z.TracesToModel(td, &spans); err != nil {
return nil, err
}
return json.Marshal(spans)
default:
return nil, &encodings.ErrInvalidEncoding{Encoding: z.Encoding}
}
}
50 changes: 50 additions & 0 deletions protocols/zipkinv2/models.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// 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 zipkinv2

import (
zipkinmodel "github.com/openzipkin/zipkin-go/model"

"go.opentelemetry.io/collector/consumer/pdata"
"go.opentelemetry.io/collector/protocols/models"
"go.opentelemetry.io/collector/translator/trace/zipkin"
)

var (
_ models.TracesModelTranslator = (*Model)(nil)
)

type Model struct {
// ParseStringTags is true if string tags should be automatically converted to numbers.
ParseStringTags bool
}

func (z *Model) TracesFromModel(src interface{}) (pdata.Traces, error) {
if model, ok := src.([]*zipkinmodel.SpanModel); ok {
return zipkin.V2SpansToInternalTraces(model, z.ParseStringTags)
}
return pdata.NewTraces(), &models.ErrIncompatibleType{Model: src}
}

func (z *Model) TracesToModel(td pdata.Traces, out interface{}) error {
if model, ok := out.(*[]*zipkinmodel.SpanModel); ok {
sm, err := zipkin.InternalTracesToZipkinSpans(td)
if err != nil {
return err
}
*model = sm
}
return &models.ErrIncompatibleType{Model: out}
}