Skip to content

Commit a32a94d

Browse files
committed
switch old telemetry client API to the new one
Signed-off-by: Eliott Bouhana <[email protected]>
1 parent 0348b21 commit a32a94d

16 files changed

+223
-173
lines changed

contrib/internal/httptrace/httptrace.go

+5-6
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@ package httptrace
1010
import (
1111
"context"
1212
"fmt"
13-
"gopkg.in/DataDog/dd-trace-go.v1/internal/log"
14-
"gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry"
1513
"net/http"
1614
"strconv"
1715
"strings"
1816
"sync"
1917

18+
"gopkg.in/DataDog/dd-trace-go.v1/internal/log"
19+
"gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry"
20+
2021
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace"
2122
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext"
2223
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
@@ -44,10 +45,8 @@ func StartRequestSpan(r *http.Request, opts ...ddtrace.StartSpanOption) (tracer.
4445
// we cannot track the configuration in newConfig because it's called during init() and the the telemetry client
4546
// is not initialized yet
4647
reportTelemetryConfigOnce.Do(func() {
47-
telemetry.GlobalClient.ConfigChange([]telemetry.Configuration{
48-
{Name: "inferred_proxy_services_enabled", Value: cfg.inferredProxyServicesEnabled},
49-
})
50-
log.Debug("internal/httptrace: telemetry.ConfigChange called with cfg: %v:", cfg)
48+
telemetry.RegisterAppConfig("inferred_proxy_services_enabled", cfg.inferredProxyServicesEnabled, telemetry.OriginEnvVar)
49+
log.Debug("internal/httptrace: telemetry.RegisterAppConfig called with cfg: %v", cfg)
5150
})
5251

5352
var ipTags map[string]string

ddtrace/tracer/dynamic_config.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,12 @@ func (dc *dynamicConfig[T]) handleRC(val *T) bool {
7979
func (dc *dynamicConfig[T]) toTelemetry() telemetry.Configuration {
8080
dc.RLock()
8181
defer dc.RUnlock()
82-
return telemetry.Sanitize(telemetry.Configuration{
82+
value := telemetry.SanitizeConfigValue(dc.current)
83+
return telemetry.Configuration{
8384
Name: dc.cfgName,
84-
Value: dc.current,
85+
Value: value,
8586
Origin: dc.cfgOrigin,
86-
})
87+
}
8788
}
8889

8990
func equal[T comparable](x, y T) bool {

ddtrace/tracer/otel_dd_mappings.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,13 @@ func getDDorOtelConfig(configName string) string {
9494
if val != "" {
9595
log.Warn("Both %v and %v are set, using %v=%v", config.ot, config.dd, config.dd, val)
9696
telemetryTags := []string{ddPrefix + strings.ToLower(config.dd), otelPrefix + strings.ToLower(config.ot)}
97-
telemetry.GlobalClient.Count(telemetry.NamespaceTracers, "otel.env.hiding", 1.0, telemetryTags, true)
97+
telemetry.Count(telemetry.NamespaceTracers, "otel.env.hiding", telemetryTags).Submit(1)
9898
} else {
9999
v, err := config.remapper(otVal)
100100
if err != nil {
101101
log.Warn("%v", err)
102102
telemetryTags := []string{ddPrefix + strings.ToLower(config.dd), otelPrefix + strings.ToLower(config.ot)}
103-
telemetry.GlobalClient.Count(telemetry.NamespaceTracers, "otel.env.invalid", 1.0, telemetryTags, true)
103+
telemetry.Count(telemetry.NamespaceTracers, "otel.env.invalid", telemetryTags).Submit(1)
104104
}
105105
val = v
106106
}

ddtrace/tracer/remote_config.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ func (t *tracer) onRemoteConfigUpdate(u remoteconfig.ProductUpdate) map[string]s
186186
}
187187
if len(telemConfigs) > 0 {
188188
log.Debug("Reporting %d configuration changes to telemetry", len(telemConfigs))
189-
telemetry.GlobalClient.ConfigChange(telemConfigs)
189+
telemetry.RegisterAppConfigs(telemConfigs...)
190190
}
191191
return statuses
192192
}
@@ -244,7 +244,7 @@ func (t *tracer) onRemoteConfigUpdate(u remoteconfig.ProductUpdate) map[string]s
244244
}
245245
if len(telemConfigs) > 0 {
246246
log.Debug("Reporting %d configuration changes to telemetry", len(telemConfigs))
247-
telemetry.GlobalClient.ConfigChange(telemConfigs)
247+
telemetry.RegisterAppConfigs(telemConfigs...)
248248
}
249249
return statuses
250250
}

ddtrace/tracer/spancontext.go

+3-4
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,7 @@ func (t *trace) finishedOne(s *span) {
497497
return // The trace hasn't completed and partial flushing will not occur
498498
}
499499
log.Debug("Partial flush triggered with %d finished spans", t.finished)
500-
telemetry.GlobalClient.Count(telemetry.NamespaceTracers, "trace_partial_flush.count", 1, []string{"reason:large_trace"}, true)
500+
telemetry.Count(telemetry.NamespaceTracers, "trace_partial_flush.count", []string{"reason:large_trace"}).Submit(1)
501501
finishedSpans := make([]*span, 0, t.finished)
502502
leftoverSpans := make([]*span, 0, len(t.spans)-t.finished)
503503
for _, s2 := range t.spans {
@@ -507,9 +507,8 @@ func (t *trace) finishedOne(s *span) {
507507
leftoverSpans = append(leftoverSpans, s2)
508508
}
509509
}
510-
// TODO: (Support MetricKindDist) Re-enable these when we actually support `MetricKindDist`
511-
//telemetry.GlobalClient.Record(telemetry.NamespaceTracers, telemetry.MetricKindDist, "trace_partial_flush.spans_closed", float64(len(finishedSpans)), nil, true)
512-
//telemetry.GlobalClient.Record(telemetry.NamespaceTracers, telemetry.MetricKindDist, "trace_partial_flush.spans_remaining", float64(len(leftoverSpans)), nil, true)
510+
telemetry.Distribution(telemetry.NamespaceTracers, "trace_partial_flush.spans_closed", nil).Submit(float64(len(finishedSpans)))
511+
telemetry.Distribution(telemetry.NamespaceTracers, "trace_partial_flush.spans_remaining", nil).Submit(float64(len(leftoverSpans)))
513512
finishedSpans[0].setMetric(keySamplingPriority, *t.priority)
514513
if s != t.spans[0] {
515514
// Make sure the first span in the chunk has the trace-level tags

ddtrace/tracer/telemetry.go

+21-11
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ package tracer
77

88
import (
99
"fmt"
10+
"os"
1011
"strings"
1112

13+
"gopkg.in/DataDog/dd-trace-go.v1/internal/log"
1214
"gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry"
1315
)
1416

@@ -31,15 +33,23 @@ func startTelemetry(c *config) {
3133
// Do not do extra work populating config data if instrumentation telemetry is disabled.
3234
return
3335
}
34-
telemetry.GlobalClient.ApplyOps(
35-
telemetry.WithService(c.serviceName),
36-
telemetry.WithEnv(c.env),
37-
telemetry.WithHTTPClient(c.httpClient),
38-
// c.logToStdout is true if serverless is turned on
39-
// c.ciVisibilityAgentless is true if ci visibility mode is turned on and agentless writer is configured
40-
telemetry.WithURL(c.logToStdout || c.ciVisibilityAgentless, c.agentURL.String()),
41-
telemetry.WithVersion(c.version),
42-
)
36+
37+
if telemetry.GlobalClient() == nil {
38+
cfg := telemetry.ClientConfig{
39+
HTTPClient: c.httpClient,
40+
AgentURL: c.agentURL.String(),
41+
}
42+
if c.logToStdout || c.ciVisibilityAgentless {
43+
cfg.APIKey = os.Getenv("DD_API_KEY")
44+
}
45+
client, err := telemetry.NewClient(c.serviceName, c.env, c.version, cfg)
46+
if err != nil {
47+
log.Debug("profiler: failed to create telemetry client: %v", err)
48+
return
49+
}
50+
telemetry.StartApp(client)
51+
}
52+
telemetry.ProductStarted(telemetry.NamespaceTracers)
4353
telemetryConfigs := []telemetry.Configuration{
4454
{Name: "trace_debug_enabled", Value: c.debug},
4555
{Name: "agent_feature_drop_p0s", Value: c.agent.DropP0s},
@@ -70,7 +80,7 @@ func startTelemetry(c *config) {
7080
c.headerAsTags.toTelemetry(),
7181
c.globalTags.toTelemetry(),
7282
c.traceSampleRules.toTelemetry(),
73-
telemetry.Sanitize(telemetry.Configuration{Name: "span_sample_rules", Value: c.spanRules}),
83+
{Name: "span_sample_rules", Value: c.spanRules},
7484
}
7585
var peerServiceMapping []string
7686
for key, value := range c.peerServiceMappings {
@@ -114,5 +124,5 @@ func startTelemetry(c *config) {
114124
}
115125
}
116126
telemetryConfigs = append(telemetryConfigs, additionalConfigs...)
117-
telemetry.GlobalClient.ProductChange(telemetry.NamespaceTracers, true, telemetryConfigs)
127+
telemetry.RegisterAppConfigs(telemetryConfigs...)
118128
}

ddtrace/tracer/telemetry_test.go

+52-39
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package tracer
77

88
import (
99
"fmt"
10+
"reflect"
1011
"testing"
1112

1213
"gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig"
@@ -17,10 +18,28 @@ import (
1718
"github.com/stretchr/testify/assert"
1819
)
1920

21+
func mockGlobalClient(client telemetry.Client) func() {
22+
orig := telemetry.GlobalClient()
23+
telemetry.SwapClient(client)
24+
return func() {
25+
telemetry.SwapClient(orig)
26+
}
27+
}
28+
29+
func checkConfig(t *testing.T, cfgs []telemetry.Configuration, key string, value any) {
30+
for _, c := range cfgs {
31+
if c.Name == key && reflect.DeepEqual(c.Value, value) {
32+
return
33+
}
34+
}
35+
36+
t.Fatalf("could not find configuration key %s with value %v", key, value)
37+
}
38+
2039
func TestTelemetryEnabled(t *testing.T) {
2140
t.Run("tracer start", func(t *testing.T) {
2241
telemetryClient := new(telemetrytest.MockClient)
23-
defer telemetry.MockGlobalClient(telemetryClient)()
42+
defer mockGlobalClient(telemetryClient)()
2443

2544
Start(
2645
WithDebugMode(true),
@@ -43,30 +62,23 @@ func TestTelemetryEnabled(t *testing.T) {
4362

4463
assert.True(t, telemetryClient.Started)
4564
telemetryClient.AssertNumberOfCalls(t, "ApplyOps", 1)
46-
telemetry.Check(t, telemetryClient.Configuration, "trace_debug_enabled", true)
47-
telemetry.Check(t, telemetryClient.Configuration, "service", "test-serv")
48-
telemetry.Check(t, telemetryClient.Configuration, "env", "test-env")
49-
telemetry.Check(t, telemetryClient.Configuration, "runtime_metrics_enabled", true)
50-
telemetry.Check(t, telemetryClient.Configuration, "stats_computation_enabled", false)
51-
telemetry.Check(t, telemetryClient.Configuration, "trace_enabled", true)
52-
telemetry.Check(t, telemetryClient.Configuration, "trace_span_attribute_schema", 0)
53-
telemetry.Check(t, telemetryClient.Configuration, "trace_peer_service_defaults_enabled", true)
54-
telemetry.Check(t, telemetryClient.Configuration, "trace_peer_service_mapping", "key:val")
55-
telemetry.Check(t, telemetryClient.Configuration, "debug_stack_enabled", false)
56-
telemetry.Check(t, telemetryClient.Configuration, "orchestrion_enabled", false)
57-
telemetry.Check(t, telemetryClient.Configuration, "trace_sample_rate", nil) // default value is NaN which is sanitized to nil
58-
telemetry.Check(t, telemetryClient.Configuration, "trace_header_tags", "key:val,key2:val2")
59-
telemetry.Check(t, telemetryClient.Configuration, "trace_sample_rules",
65+
checkConfig(t, telemetryClient.Configuration, "trace_debug_enabled", true)
66+
checkConfig(t, telemetryClient.Configuration, "service", "test-serv")
67+
checkConfig(t, telemetryClient.Configuration, "env", "test-env")
68+
checkConfig(t, telemetryClient.Configuration, "runtime_metrics_enabled", true)
69+
checkConfig(t, telemetryClient.Configuration, "stats_computation_enabled", false)
70+
checkConfig(t, telemetryClient.Configuration, "trace_enabled", true)
71+
checkConfig(t, telemetryClient.Configuration, "trace_span_attribute_schema", 0)
72+
checkConfig(t, telemetryClient.Configuration, "trace_peer_service_defaults_enabled", true)
73+
checkConfig(t, telemetryClient.Configuration, "trace_peer_service_mapping", "key:val")
74+
checkConfig(t, telemetryClient.Configuration, "debug_stack_enabled", false)
75+
checkConfig(t, telemetryClient.Configuration, "orchestrion_enabled", false)
76+
checkConfig(t, telemetryClient.Configuration, "trace_sample_rate", nil) // default value is NaN which is sanitized to nil
77+
checkConfig(t, telemetryClient.Configuration, "trace_header_tags", "key:val,key2:val2")
78+
checkConfig(t, telemetryClient.Configuration, "trace_sample_rules",
6079
`[{"service":"test-serv","name":"op-name","resource":"resource-*","sample_rate":0.1,"tags":{"tag-a":"tv-a??"}}]`)
61-
telemetry.Check(t, telemetryClient.Configuration, "span_sample_rules", "[]")
62-
if metrics, ok := telemetryClient.Metrics[telemetry.NamespaceGeneral]; ok {
63-
if initTime, ok := metrics["init_time"]; ok {
64-
assert.True(t, initTime > 0)
65-
return
66-
}
67-
t.Fatalf("could not find general init time in telemetry client metrics")
68-
}
69-
t.Fatalf("could not find tracer namespace in telemetry client metrics")
80+
checkConfig(t, telemetryClient.Configuration, "span_sample_rules", "[]")
81+
assert.NotZero(t, telemetryClient.Distribution(telemetry.NamespaceTracers, "init_time", nil).Get())
7082
})
7183

7284
t.Run("telemetry customer or dynamic rules", func(t *testing.T) {
@@ -79,15 +91,15 @@ func TestTelemetryEnabled(t *testing.T) {
7991
rule.Provenance = prov
8092

8193
telemetryClient := new(telemetrytest.MockClient)
82-
defer telemetry.MockGlobalClient(telemetryClient)()
94+
defer mockGlobalClient(telemetryClient)()
8395
Start(WithService("test-serv"),
8496
WithSamplingRules([]SamplingRule{rule}),
8597
)
8698
defer globalconfig.SetServiceName("")
8799
defer Stop()
88100

89101
assert.True(t, telemetryClient.Started)
90-
telemetry.Check(t, telemetryClient.Configuration, "trace_sample_rules",
102+
checkConfig(t, telemetryClient.Configuration, "trace_sample_rules",
91103
fmt.Sprintf(`[{"service":"test-serv","name":"op-name","resource":"resource-*","sample_rate":0.1,"tags":{"tag-a":"tv-a??"},"provenance":"%s"}]`, prov.String()))
92104
}
93105
})
@@ -104,23 +116,23 @@ func TestTelemetryEnabled(t *testing.T) {
104116
}
105117

106118
telemetryClient := new(telemetrytest.MockClient)
107-
defer telemetry.MockGlobalClient(telemetryClient)()
119+
defer mockGlobalClient(telemetryClient)()
108120
Start(WithService("test-serv"),
109121
WithSamplingRules(rules),
110122
)
111123
defer globalconfig.SetServiceName("")
112124
defer Stop()
113125

114126
assert.True(t, telemetryClient.Started)
115-
telemetry.Check(t, telemetryClient.Configuration, "trace_sample_rules",
127+
checkConfig(t, telemetryClient.Configuration, "trace_sample_rules",
116128
`[{"service":"test-serv","name":"op-name","resource":"resource-*","sample_rate":0.1,"tags":{"tag-a":"tv-a??"}}]`)
117-
telemetry.Check(t, telemetryClient.Configuration, "span_sample_rules",
129+
checkConfig(t, telemetryClient.Configuration, "span_sample_rules",
118130
`[{"service":"test-serv","name":"op-name","sample_rate":0.1}]`)
119131
})
120132

121133
t.Run("tracer start with empty rules", func(t *testing.T) {
122134
telemetryClient := new(telemetrytest.MockClient)
123-
defer telemetry.MockGlobalClient(telemetryClient)()
135+
defer mockGlobalClient(telemetryClient)()
124136

125137
t.Setenv("DD_TRACE_SAMPLING_RULES", "")
126138
t.Setenv("DD_SPAN_SAMPLING_RULES", "")
@@ -131,34 +143,35 @@ func TestTelemetryEnabled(t *testing.T) {
131143
assert.True(t, telemetryClient.Started)
132144
var cfgs []telemetry.Configuration
133145
for _, c := range telemetryClient.Configuration {
134-
cfgs = append(cfgs, telemetry.Sanitize(c))
146+
c.Value = telemetry.SanitizeConfigValue(c.Value)
147+
cfgs = append(cfgs)
135148
}
136-
telemetry.Check(t, cfgs, "trace_sample_rules", "[]")
137-
telemetry.Check(t, cfgs, "span_sample_rules", "[]")
149+
checkConfig(t, cfgs, "trace_sample_rules", "[]")
150+
checkConfig(t, cfgs, "span_sample_rules", "[]")
138151
})
139152

140153
t.Run("profiler start, tracer start", func(t *testing.T) {
141154
telemetryClient := new(telemetrytest.MockClient)
142-
defer telemetry.MockGlobalClient(telemetryClient)()
155+
defer mockGlobalClient(telemetryClient)()
143156
profiler.Start()
144157
defer profiler.Stop()
145158
Start(
146159
WithService("test-serv"),
147160
)
148161
defer globalconfig.SetServiceName("")
149162
defer Stop()
150-
telemetry.Check(t, telemetryClient.Configuration, "service", "test-serv")
163+
checkConfig(t, telemetryClient.Configuration, "service", "test-serv")
151164
telemetryClient.AssertNumberOfCalls(t, "ApplyOps", 2)
152165
})
153166
t.Run("orchestrion telemetry", func(t *testing.T) {
154167
telemetryClient := new(telemetrytest.MockClient)
155-
defer telemetry.MockGlobalClient(telemetryClient)()
168+
defer mockGlobalClient(telemetryClient)()
156169

157170
Start(WithOrchestrion(map[string]string{"k1": "v1", "k2": "v2"}))
158171
defer Stop()
159172

160-
telemetry.Check(t, telemetryClient.Configuration, "orchestrion_enabled", true)
161-
telemetry.Check(t, telemetryClient.Configuration, "orchestrion_k1", "v1")
162-
telemetry.Check(t, telemetryClient.Configuration, "orchestrion_k2", "v2")
173+
checkConfig(t, telemetryClient.Configuration, "orchestrion_enabled", true)
174+
checkConfig(t, telemetryClient.Configuration, "orchestrion_k1", "v1")
175+
checkConfig(t, telemetryClient.Configuration, "orchestrion_k2", "v2")
163176
})
164177
}

ddtrace/tracer/tracer.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,9 @@ func Start(opts ...StartOption) {
149149
if internal.Testing {
150150
return // mock tracer active
151151
}
152-
defer telemetry.Time(telemetry.NamespaceGeneral, "init_time", nil, true)()
152+
defer func(now time.Time) {
153+
telemetry.Distribution(telemetry.NamespaceGeneral, "init_time", nil).Submit(float64(time.Since(now).Milliseconds()))
154+
}(time.Now())
153155
t := newTracer(opts...)
154156
if !t.config.enabled.current {
155157
// TODO: instrumentation telemetry client won't get started

internal/appsec/config/config.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func init() {
2424

2525
// Register the global app telemetry configuration.
2626
func registerAppConfigTelemetry() {
27-
registerSCAAppConfigTelemetry(telemetry.GlobalClient)
27+
registerSCAAppConfigTelemetry(telemetry.GlobalClient())
2828
}
2929

3030
// Register the global app telemetry configuration related to the Software Composition Analysis (SCA) product.

internal/appsec/telemetry.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -87,5 +87,11 @@ func (a *appsecTelemetry) emit() {
8787
return
8888
}
8989

90-
telemetry.GlobalClient.ProductChange(telemetry.NamespaceAppSec, a.enabled, a.configs)
90+
if a.enabled {
91+
telemetry.ProductStarted(telemetry.NamespaceAppSec)
92+
} else {
93+
telemetry.ProductStopped(telemetry.NamespaceAppSec)
94+
}
95+
96+
telemetry.RegisterAppConfigs(a.configs...)
9197
}

internal/civisibility/integrations/civisibility.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ func ExitCiVisibility() {
131131
log.Debug("civisibility: flushing and stopping tracer")
132132
tracer.Flush()
133133
tracer.Stop()
134-
telemetry.GlobalClient.Stop()
134+
telemetry.StopApp()
135135
log.Debug("civisibility: done.")
136136
}()
137137
for _, v := range closeActions {

0 commit comments

Comments
 (0)