Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate Jaeger internal packages to OTEL contrib and update import paths #37999

Draft
wants to merge 11 commits into
base: main
Choose a base branch
from
Draft
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
//
// Copyright (c) 2019 The Jaeger Authors.
// Copyright (c) 2017 Uber Technologies, Inc.
//
Expand Down
20 changes: 19 additions & 1 deletion receiver/jaegerreceiver/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,16 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaeger
go 1.23.0

require (
github.com/HdrHistogram/hdrhistogram-go v1.1.2
github.com/apache/thrift v0.21.0
github.com/gorilla/mux v1.8.1
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.2.0
github.com/jaegertracing/jaeger v1.66.0
github.com/jaegertracing/jaeger-idl v0.5.0
github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.120.0
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.120.0
github.com/spf13/cobra v1.8.1
github.com/spf13/viper v1.19.0
github.com/stretchr/testify v1.10.0
go.opentelemetry.io/collector/component v0.120.1-0.20250218214003-dae5d199ffc6
go.opentelemetry.io/collector/component/componentstatus v0.120.1-0.20250218214003-dae5d199ffc6
Expand All @@ -31,6 +35,7 @@ require (
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
google.golang.org/grpc v1.70.0
gopkg.in/yaml.v3 v3.0.1
)

require (
Expand All @@ -45,21 +50,33 @@ require (
github.com/golang/snappy v0.0.4 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/hashicorp/go-version v1.7.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/compress v1.17.11 // indirect
github.com/knadh/koanf/maps v0.1.1 // indirect
github.com/knadh/koanf/providers/confmap v0.1.0 // indirect
github.com/knadh/koanf/v2 v2.1.2 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mostynb/go-grpc-compression v1.2.3 // indirect
github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.120.0 // indirect
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/core/xidutils v0.120.0 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/pierrec/lz4/v4 v4.1.22 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/rs/cors v1.11.1 // indirect
github.com/sagikazarmark/locafero v0.4.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect
github.com/spf13/afero v1.11.0 // indirect
github.com/spf13/cast v1.6.0 // indirect
github.com/spf13/pflag v1.0.6 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/collector/client v1.26.1-0.20250218214003-dae5d199ffc6 // indirect
go.opentelemetry.io/collector/config/configauth v0.120.1-0.20250218214003-dae5d199ffc6 // indirect
Expand All @@ -78,12 +95,13 @@ require (
go.opentelemetry.io/otel/sdk v1.34.0 // indirect
go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect
go.opentelemetry.io/otel/trace v1.34.0 // indirect
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect
golang.org/x/net v0.35.0 // indirect
golang.org/x/sys v0.30.0 // indirect
golang.org/x/text v0.22.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect
google.golang.org/protobuf v1.36.5 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
)

replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/common => ../../internal/common
Expand Down
65 changes: 49 additions & 16 deletions receiver/jaegerreceiver/go.sum

Large diffs are not rendered by default.

20 changes: 20 additions & 0 deletions receiver/jaegerreceiver/internal/cmd/configmanager/manager.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Copyright The OpenTelemetry Authors
// Copyright (c) 2019 The Jaeger Authors.
// Copyright (c) 2017 Uber Technologies, Inc.
// SPDX-License-Identifier: Apache-2.0

package configmanager

import (
"context"

"github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
)

// TODO this interface could be moved to pkg/clientcfg, along with grpc proxy,
// but not the metrics wrapper (because its metric names are specific to agent).

// ClientConfigManager decides which sampling strategy a given service should be using.
type ClientConfigManager interface {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We said this isn't needed in jaeger receiver

GetSamplingStrategy(ctx context.Context, serviceName string) (*api_v2.SamplingStrategyResponse, error)
}
45 changes: 45 additions & 0 deletions receiver/jaegerreceiver/internal/cmd/configmanager/metrics.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// Copyright The OpenTelemetry Authors
// Copyright (c) 2018 The Jaeger Authors.
// SPDX-License-Identifier: Apache-2.0

package configmanager

import (
"context"

"github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver/internal/pkg/metrics"
)

// configManagerMetrics holds metrics related to ClientConfigManager
type configManagerMetrics struct {
// Number of successful sampling rate responses from collector
SamplingSuccess metrics.Counter `metric:"collector-proxy" tags:"result=ok,endpoint=sampling"`

// Number of failed sampling rate responses from collector
SamplingFailures metrics.Counter `metric:"collector-proxy" tags:"result=err,endpoint=sampling"`
}

// ManagerWithMetrics is manager with metrics integration.
type ManagerWithMetrics struct {
wrapped ClientConfigManager
metrics configManagerMetrics
}

// WrapWithMetrics wraps ClientConfigManager and creates metrics for its invocations.
func WrapWithMetrics(manager ClientConfigManager, mFactory metrics.Factory) *ManagerWithMetrics {
m := configManagerMetrics{}
metrics.Init(&m, mFactory, nil)
return &ManagerWithMetrics{wrapped: manager, metrics: m}
}

// GetSamplingStrategy returns sampling strategy from server.
func (m *ManagerWithMetrics) GetSamplingStrategy(ctx context.Context, serviceName string) (*api_v2.SamplingStrategyResponse, error) {
r, err := m.wrapped.GetSamplingStrategy(ctx, serviceName)
if err != nil {
m.metrics.SamplingFailures.Inc(1)
} else {
m.metrics.SamplingSuccess.Inc(1)
}
return r, err
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
// Copyright The OpenTelemetry Authors
// Copyright (c) 2018 The Jaeger Authors.
// SPDX-License-Identifier: Apache-2.0

package configmanager

import (
"context"
"errors"
"testing"
"time"

"github.com/stretchr/testify/require"

"github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
"github.com/jaegertracing/jaeger/pkg/testutils"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver/internal/internal/metricstest"
)

type noopManager struct{}

func (noopManager) GetSamplingStrategy(_ context.Context, s string) (*api_v2.SamplingStrategyResponse, error) {
if s == "failed" {
return nil, errors.New("failed")
}
return &api_v2.SamplingStrategyResponse{StrategyType: api_v2.SamplingStrategyType_PROBABILISTIC}, nil
}

func TestMetrics(t *testing.T) {
tests := []struct {
expected []metricstest.ExpectedMetric
err error
}{
{expected: []metricstest.ExpectedMetric{
{Name: "collector-proxy", Tags: map[string]string{"result": "ok", "endpoint": "sampling"}, Value: 1},
{Name: "collector-proxy", Tags: map[string]string{"result": "err", "endpoint": "sampling"}, Value: 0},
}},
{expected: []metricstest.ExpectedMetric{
{Name: "collector-proxy", Tags: map[string]string{"result": "ok", "endpoint": "sampling"}, Value: 0},
{Name: "collector-proxy", Tags: map[string]string{"result": "err", "endpoint": "sampling"}, Value: 1},
}, err: errors.New("failed")},
}

for _, test := range tests {
t.Run("", func(t *testing.T) {
metricsFactory := metricstest.NewFactory(time.Microsecond)
defer metricsFactory.Stop()
mgr := WrapWithMetrics(&noopManager{}, metricsFactory)

if test.err != nil {
s, err := mgr.GetSamplingStrategy(context.Background(), test.err.Error())
require.Nil(t, s)
require.EqualError(t, err, test.err.Error())
} else {
s, err := mgr.GetSamplingStrategy(context.Background(), "")
require.NoError(t, err)
require.NotNil(t, s)
}
metricsFactory.AssertCounterMetrics(t, test.expected...)
})
}
}

func TestMain(m *testing.M) {
testutils.VerifyGoLeaks(m)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
// Copyright The OpenTelemetry Authors
// Copyright (c) 2019 The Jaeger Authors.
// Copyright (c) 2017 Uber Technologies, Inc.
// SPDX-License-Identifier: Apache-2.0

package customtransport

import (
"bytes"
"context"

"github.com/apache/thrift/lib/go/thrift"
)

// TBufferedReadTransport is a thrift.TTransport that reads from a buffer
type TBufferedReadTransport struct {
readBuf *bytes.Buffer
}

var _ thrift.TTransport = (*TBufferedReadTransport)(nil)

// NewTBufferedReadTransport creates a buffer backed TTransport
func NewTBufferedReadTransport(readBuf *bytes.Buffer) (*TBufferedReadTransport, error) {
return &TBufferedReadTransport{readBuf: readBuf}, nil
}

// IsOpen does nothing as transport is not maintaining the connection
// Required to maintain thrift.TTransport interface
func (*TBufferedReadTransport) IsOpen() bool {
return true
}

// Open does nothing as transport is not maintaining the connection
// Required to maintain thrift.TTransport interface
func (*TBufferedReadTransport) Open() error {
return nil
}

// Close does nothing as transport is not maintaining the connection
// Required to maintain thrift.TTransport interface
func (*TBufferedReadTransport) Close() error {
return nil
}

// Read reads bytes from the local buffer and puts them in the specified buf
func (p *TBufferedReadTransport) Read(buf []byte) (int, error) {
in, err := p.readBuf.Read(buf)
return in, thrift.NewTTransportExceptionFromError(err)
}

// RemainingBytes returns the number of bytes left to be read from the readBuf
func (p *TBufferedReadTransport) RemainingBytes() uint64 {
//nolint: gosec // G115
return uint64(p.readBuf.Len())
}

// Write writes bytes into the read buffer
// Required to maintain thrift.TTransport interface
func (p *TBufferedReadTransport) Write(buf []byte) (int, error) {
p.readBuf = bytes.NewBuffer(buf)
return len(buf), nil
}

// Flush does nothing as udp server does not write responses back
// Required to maintain thrift.TTransport interface
func (*TBufferedReadTransport) Flush(_ context.Context) error {
return nil
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
// Copyright The OpenTelemetry Authors
// Copyright (c) 2019 The Jaeger Authors.
// Copyright (c) 2017 Uber Technologies, Inc.
// SPDX-License-Identifier: Apache-2.0

package customtransport

import (
"bytes"
"context"
"testing"

"github.com/stretchr/testify/require"

"github.com/jaegertracing/jaeger/pkg/testutils"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't bring more dependencies from jaeger

)

// TestTBufferedReadTransport tests the TBufferedReadTransport
func TestTBufferedReadTransport(t *testing.T) {
buffer := bytes.NewBuffer([]byte("testString"))
trans, err := NewTBufferedReadTransport(buffer)
require.NotNil(t, trans)
require.NoError(t, err)
require.Equal(t, uint64(10), trans.RemainingBytes())

firstRead := make([]byte, 4)
n, err := trans.Read(firstRead)
require.NoError(t, err)
require.Equal(t, 4, n)
require.Equal(t, []byte("test"), firstRead)
require.Equal(t, uint64(6), trans.RemainingBytes())

secondRead := make([]byte, 7)
n, err = trans.Read(secondRead)
require.NoError(t, err)
require.Equal(t, 6, n)
require.Equal(t, []byte("String"), secondRead[0:6])
require.Equal(t, uint64(0), trans.RemainingBytes())
}

// TestTBufferedReadTransportEmptyFunctions tests the empty functions in TBufferedReadTransport
func TestTBufferedReadTransportEmptyFunctions(t *testing.T) {
byteArr := make([]byte, 1)
trans, err := NewTBufferedReadTransport(bytes.NewBuffer(byteArr))
require.NotNil(t, trans)
require.NoError(t, err)

err = trans.Open()
require.NoError(t, err)

err = trans.Close()
require.NoError(t, err)

err = trans.Flush(context.Background())
require.NoError(t, err)

n, err := trans.Write(byteArr)
require.Equal(t, 1, n)
require.NoError(t, err)

isOpen := trans.IsOpen()
require.True(t, isOpen)
}

func TestMain(m *testing.M) {
testutils.VerifyGoLeaks(m)
}
15 changes: 15 additions & 0 deletions receiver/jaegerreceiver/internal/cmd/processors/package_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// Copyright The OpenTelemetry Authors
// Copyright (c) 2024 The Jaeger Authors.
// SPDX-License-Identifier: Apache-2.0

package processors

import (
"testing"

"github.com/jaegertracing/jaeger/pkg/testutils"
)

func TestMain(m *testing.M) {
testutils.VerifyGoLeaks(m)
}
12 changes: 12 additions & 0 deletions receiver/jaegerreceiver/internal/cmd/processors/processor.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Copyright The OpenTelemetry Authors
// Copyright (c) 2019 The Jaeger Authors.
// Copyright (c) 2017 Uber Technologies, Inc.
// SPDX-License-Identifier: Apache-2.0

package processors

// Processor processes metrics in multiple formats
type Processor interface {
Serve()
Stop()
}
Loading
Loading