Chore: Remove opentracing and use opentelemetry instead (#67200)
* remove opentracing and use otel instead * add various samplers for jaeger * remove useless test that is covered in otel now * we do not need a struct there * remove old tests * restore tests that parse various configurations * check errors in tests * Update pkg/infra/tracing/tracing_test.go fix typo Co-authored-by: Sofia Papagiannaki <1632407+papagian@users.noreply.github.com> * add test for both legacy and new config formats * use named constants --------- Co-authored-by: Sofia Papagiannaki <1632407+papagian@users.noreply.github.com>
This commit is contained in:
co-authored by
Sofia Papagiannaki
parent
69f1116f59
commit
6d8f9c5bf4
+137
-111
@@ -5,137 +5,163 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/grafana/grafana/pkg/setting"
|
||||
)
|
||||
|
||||
func TestGroupSplit(t *testing.T) {
|
||||
// TODO(zserge) Add proper tests for opentelemetry
|
||||
|
||||
func TestSplitCustomAttribs(t *testing.T) {
|
||||
tests := []struct {
|
||||
input string
|
||||
expected map[string]string
|
||||
expected []attribute.KeyValue
|
||||
}{
|
||||
{
|
||||
input: "tag1:value1,tag2:value2",
|
||||
expected: map[string]string{
|
||||
"tag1": "value1",
|
||||
"tag2": "value2",
|
||||
input: "key1:value:1",
|
||||
expected: []attribute.KeyValue{attribute.String("key1", "value:1")},
|
||||
},
|
||||
{
|
||||
input: "key1:value1,key2:value2",
|
||||
expected: []attribute.KeyValue{
|
||||
attribute.String("key1", "value1"),
|
||||
attribute.String("key2", "value2"),
|
||||
},
|
||||
},
|
||||
{
|
||||
input: "",
|
||||
expected: map[string]string{},
|
||||
},
|
||||
{
|
||||
input: "tag1",
|
||||
expected: map[string]string{},
|
||||
expected: []attribute.KeyValue{},
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
tags := splitTagSettings(test.input)
|
||||
for k, v := range test.expected {
|
||||
value, exists := tags[k]
|
||||
assert.Truef(t, exists, "Tag %q not found for input %q", k, test.input)
|
||||
assert.Equalf(t, v, value, "Tag %q has wrong value for input %q", k, test.input)
|
||||
}
|
||||
attribs, err := splitCustomAttribs(test.input)
|
||||
assert.NoError(t, err)
|
||||
assert.EqualValues(t, test.expected, attribs)
|
||||
}
|
||||
}
|
||||
|
||||
func TestInitJaegerCfg_Default(t *testing.T) {
|
||||
ts := &Opentracing{}
|
||||
cfg, err := ts.initJaegerCfg()
|
||||
require.NoError(t, err)
|
||||
func TestSplitCustomAttribs_Malformed(t *testing.T) {
|
||||
tests := []struct {
|
||||
input string
|
||||
}{
|
||||
{input: "key1=value1"},
|
||||
{input: "key1"},
|
||||
}
|
||||
|
||||
assert.True(t, cfg.Disabled)
|
||||
for _, test := range tests {
|
||||
_, err := splitCustomAttribs(test.input)
|
||||
assert.Error(t, err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestInitJaegerCfg_Enabled(t *testing.T) {
|
||||
ts := &Opentracing{enabled: true}
|
||||
cfg, err := ts.initJaegerCfg()
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.False(t, cfg.Disabled)
|
||||
assert.Equal(t, "localhost:6831", cfg.Reporter.LocalAgentHostPort)
|
||||
}
|
||||
|
||||
func TestInitJaegerCfg_DisabledViaEnv(t *testing.T) {
|
||||
err := os.Setenv("JAEGER_DISABLED", "true")
|
||||
require.NoError(t, err)
|
||||
defer func() {
|
||||
err := os.Unsetenv("JAEGER_DISABLED")
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
|
||||
ts := &Opentracing{enabled: true}
|
||||
cfg, err := ts.initJaegerCfg()
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.True(t, cfg.Disabled)
|
||||
}
|
||||
|
||||
func TestInitJaegerCfg_EnabledViaEnv(t *testing.T) {
|
||||
err := os.Setenv("JAEGER_DISABLED", "false")
|
||||
require.NoError(t, err)
|
||||
defer func() {
|
||||
err := os.Unsetenv("JAEGER_DISABLED")
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
|
||||
ts := &Opentracing{enabled: false}
|
||||
cfg, err := ts.initJaegerCfg()
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.False(t, cfg.Disabled)
|
||||
}
|
||||
|
||||
func TestInitJaegerCfg_InvalidEnvVar(t *testing.T) {
|
||||
err := os.Setenv("JAEGER_DISABLED", "totallybogus")
|
||||
require.NoError(t, err)
|
||||
defer func() {
|
||||
err := os.Unsetenv("JAEGER_DISABLED")
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
|
||||
ts := &Opentracing{}
|
||||
_, err = ts.initJaegerCfg()
|
||||
require.EqualError(t, err, "cannot parse env var JAEGER_DISABLED=totallybogus: strconv.ParseBool: parsing \"totallybogus\": invalid syntax")
|
||||
}
|
||||
|
||||
func TestInitJaegerCfg_EnabledViaHost(t *testing.T) {
|
||||
require.NoError(t, os.Setenv("JAEGER_AGENT_HOST", "example.com"))
|
||||
defer func() {
|
||||
require.NoError(t, os.Unsetenv("JAEGER_AGENT_HOST"))
|
||||
}()
|
||||
|
||||
cfg := setting.NewCfg()
|
||||
ts := &Opentracing{Cfg: cfg}
|
||||
_, err := ts.Cfg.Raw.NewSection("tracing.jaeger")
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, ts.parseSettings())
|
||||
jaegerCfg, err := ts.initJaegerCfg()
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.False(t, jaegerCfg.Disabled)
|
||||
assert.Equal(t, "example.com:6831", jaegerCfg.Reporter.LocalAgentHostPort)
|
||||
}
|
||||
|
||||
func TestInitJaegerCfg_EnabledViaHostPort(t *testing.T) {
|
||||
require.NoError(t, os.Setenv("JAEGER_AGENT_HOST", "example.com"))
|
||||
require.NoError(t, os.Setenv("JAEGER_AGENT_PORT", "12345"))
|
||||
defer func() {
|
||||
require.NoError(t, os.Unsetenv("JAEGER_AGENT_HOST"))
|
||||
require.NoError(t, os.Unsetenv("JAEGER_AGENT_PORT"))
|
||||
}()
|
||||
|
||||
cfg := setting.NewCfg()
|
||||
ts := &Opentracing{Cfg: cfg}
|
||||
_, err := ts.Cfg.Raw.NewSection("tracing.jaeger")
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, ts.parseSettings())
|
||||
jaegerCfg, err := ts.initJaegerCfg()
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.False(t, jaegerCfg.Disabled)
|
||||
assert.Equal(t, "example.com:12345", jaegerCfg.Reporter.LocalAgentHostPort)
|
||||
func TestTracingConfig(t *testing.T) {
|
||||
for _, test := range []struct {
|
||||
Name string
|
||||
Cfg string
|
||||
Env map[string]string
|
||||
ExpectedExporter string
|
||||
ExpectedAddress string
|
||||
ExpectedPropagator string
|
||||
ExpectedAttrs []attribute.KeyValue
|
||||
}{
|
||||
{
|
||||
Name: "default config uses noop exporter",
|
||||
Cfg: "",
|
||||
ExpectedExporter: noopExporter,
|
||||
ExpectedAttrs: []attribute.KeyValue{},
|
||||
},
|
||||
{
|
||||
Name: "custom attributes are parsed",
|
||||
Cfg: `
|
||||
[tracing.opentelemetry]
|
||||
custom_attributes = key1:value1,key2:value2
|
||||
`,
|
||||
ExpectedExporter: noopExporter,
|
||||
ExpectedAttrs: []attribute.KeyValue{attribute.String("key1", "value1"), attribute.String("key2", "value2")},
|
||||
},
|
||||
{
|
||||
Name: "jaeger address is parsed",
|
||||
Cfg: `
|
||||
[tracing.opentelemetry.jaeger]
|
||||
address = jaeger.example.com:6831
|
||||
`,
|
||||
ExpectedExporter: jaegerExporter,
|
||||
ExpectedAddress: "jaeger.example.com:6831",
|
||||
ExpectedAttrs: []attribute.KeyValue{},
|
||||
},
|
||||
{
|
||||
Name: "OTLP address is parsed",
|
||||
Cfg: `
|
||||
[tracing.opentelemetry.otlp]
|
||||
address = otlp.example.com:4317
|
||||
`,
|
||||
ExpectedExporter: otlpExporter,
|
||||
ExpectedAddress: "otlp.example.com:4317",
|
||||
ExpectedAttrs: []attribute.KeyValue{},
|
||||
},
|
||||
{
|
||||
Name: "legacy config format is supported",
|
||||
Cfg: `
|
||||
[tracing.jaeger]
|
||||
address = jaeger.example.com:6831
|
||||
`,
|
||||
ExpectedExporter: jaegerExporter,
|
||||
ExpectedAddress: "jaeger.example.com:6831",
|
||||
ExpectedAttrs: []attribute.KeyValue{},
|
||||
},
|
||||
{
|
||||
Name: "legacy env variables are supproted",
|
||||
Cfg: `[tracing.jaeger]`,
|
||||
Env: map[string]string{
|
||||
"JAEGER_AGENT_HOST": "example.com",
|
||||
"JAEGER_AGENT_PORT": "12345",
|
||||
},
|
||||
ExpectedExporter: jaegerExporter,
|
||||
ExpectedAddress: "example.com:12345",
|
||||
ExpectedAttrs: []attribute.KeyValue{},
|
||||
},
|
||||
{
|
||||
Name: "opentelemetry config format is prioritised over legacy jaeger",
|
||||
Cfg: `
|
||||
[tracing.jaeger]
|
||||
address = foo.com:6831
|
||||
custom_tags = a:b
|
||||
[tracing.opentelemetry]
|
||||
custom_attributes = c:d
|
||||
[tracing.opentelemetry.jaeger]
|
||||
address = bar.com:6831
|
||||
`,
|
||||
ExpectedExporter: jaegerExporter,
|
||||
ExpectedAddress: "bar.com:6831",
|
||||
ExpectedAttrs: []attribute.KeyValue{attribute.String("c", "d")},
|
||||
},
|
||||
} {
|
||||
t.Run(test.Name, func(t *testing.T) {
|
||||
// export envioronment variables
|
||||
if test.Env != nil {
|
||||
for k, v := range test.Env {
|
||||
assert.NoError(t, os.Setenv(k, v))
|
||||
}
|
||||
defer func() {
|
||||
for k := range test.Env {
|
||||
assert.NoError(t, os.Unsetenv(k))
|
||||
}
|
||||
}()
|
||||
}
|
||||
// parse config sections
|
||||
cfg := setting.NewCfg()
|
||||
err := cfg.Raw.Append([]byte(test.Cfg))
|
||||
assert.NoError(t, err)
|
||||
// create tracer
|
||||
tracer, err := ProvideService(cfg)
|
||||
assert.NoError(t, err)
|
||||
// make sure tracker is properly configured
|
||||
otel := tracer.(*Opentelemetry)
|
||||
assert.Equal(t, test.ExpectedExporter, otel.enabled)
|
||||
assert.Equal(t, test.ExpectedAddress, otel.Address)
|
||||
assert.Equal(t, test.ExpectedPropagator, otel.Propagation)
|
||||
assert.Equal(t, test.ExpectedAttrs, otel.customAttribs)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user