Skip to content

Commit

Permalink
feat(apm): implement external data resolution (#32295)
Browse files Browse the repository at this point in the history
Signed-off-by: Wassim DHIF <[email protected]>
  • Loading branch information
wdhif authored Dec 18, 2024
1 parent 83c3dbd commit c29edf5
Show file tree
Hide file tree
Showing 24 changed files with 100 additions and 23 deletions.
2 changes: 1 addition & 1 deletion cmd/trace-agent/config/remote/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ func putBuffer(buffer *bytes.Buffer) {

// ConfigHandler is the HTTP handler for configs
func ConfigHandler(r *api.HTTPReceiver, cf rcclient.ConfigFetcher, cfg *config.AgentConfig, statsd statsd.ClientInterface, timing timing.Reporter) http.Handler {
cidProvider := api.NewIDProvider(cfg.ContainerProcRoot)
cidProvider := api.NewIDProvider(cfg.ContainerProcRoot, cfg.ContainerIDFromOriginInfo)
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
defer timing.Since("datadog.trace_agent.receiver.config_process_ms", time.Now())
tags := r.TagStats(api.V07, req.Header, "").AsTags()
Expand Down
2 changes: 2 additions & 0 deletions comp/otelcol/ddflareextension/impl/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ replace (
github.com/DataDog/datadog-agent/comp/core/log/mock => ../../../core/log/mock
github.com/DataDog/datadog-agent/comp/core/secrets => ../../../core/secrets
github.com/DataDog/datadog-agent/comp/core/status => ../../../core/status
github.com/DataDog/datadog-agent/comp/core/tagger/origindetection => ../../../core/tagger/origindetection
github.com/DataDog/datadog-agent/comp/core/tagger/tags => ../../../core/tagger/tags
github.com/DataDog/datadog-agent/comp/core/tagger/types => ../../../core/tagger/types
github.com/DataDog/datadog-agent/comp/core/tagger/utils => ../../../core/tagger/utils
Expand Down Expand Up @@ -151,6 +152,7 @@ require (
require go.opentelemetry.io/collector/extension/extensiontest v0.115.0 // indirect

require (
github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.0.0-20241217122454-175edb6c74f2 // indirect
github.com/knadh/koanf/maps v0.1.1 // indirect
github.com/knadh/koanf/providers/confmap v0.1.0 // indirect
github.com/moby/sys/userns v0.1.0 // indirect
Expand Down
2 changes: 2 additions & 0 deletions comp/otelcol/otlp/components/exporter/datadogexporter/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ replace (
github.com/DataDog/datadog-agent/comp/core/log/mock => ../../../../../core/log/mock
github.com/DataDog/datadog-agent/comp/core/secrets => ../../../../../core/secrets
github.com/DataDog/datadog-agent/comp/core/status => ../../../../../core/status
github.com/DataDog/datadog-agent/comp/core/tagger/origindetection => ../../../../../core/tagger/origindetection
github.com/DataDog/datadog-agent/comp/core/telemetry => ../../../../../core/telemetry
github.com/DataDog/datadog-agent/comp/def => ../../../../../def
github.com/DataDog/datadog-agent/comp/forwarder/defaultforwarder => ../../../../../forwarder/defaultforwarder
Expand Down Expand Up @@ -138,6 +139,7 @@ require (
github.com/DataDog/datadog-agent/comp/core/log/def v0.0.0-00010101000000-000000000000 // indirect
github.com/DataDog/datadog-agent/comp/core/secrets v0.59.0 // indirect
github.com/DataDog/datadog-agent/comp/core/status v0.56.0-rc.3 // indirect
github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.0.0-20241217122454-175edb6c74f2 // indirect
github.com/DataDog/datadog-agent/comp/core/telemetry v0.57.1 // indirect
github.com/DataDog/datadog-agent/comp/def v0.59.0 // indirect
github.com/DataDog/datadog-agent/comp/forwarder/defaultforwarder v0.56.0-rc.3 // indirect
Expand Down
2 changes: 2 additions & 0 deletions comp/otelcol/otlp/components/statsprocessor/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ module github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsproces
go 1.22.0

replace (
github.com/DataDog/datadog-agent/comp/core/tagger/origindetection => ../../../../core/tagger/origindetection
github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient => ../metricsclient
github.com/DataDog/datadog-agent/comp/trace/compression/def => ../../../../../comp/trace/compression/def
github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip => ../../../../../comp/trace/compression/impl-gzip
Expand Down Expand Up @@ -33,6 +34,7 @@ require (
require go.opentelemetry.io/collector/component v0.115.0 // indirect

require (
github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.0.0-20241217122454-175edb6c74f2 // indirect
github.com/DataDog/datadog-agent/comp/trace/compression/def v0.56.0-rc.3 // indirect
github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0-rc.3 // indirect
github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.56.0-rc.3 // indirect
Expand Down
6 changes: 5 additions & 1 deletion comp/trace/config/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,14 @@ import (

"go.opentelemetry.io/collector/component/componenttest"

apiutil "github.com/DataDog/datadog-agent/pkg/api/util"
"github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes"

corecompcfg "github.com/DataDog/datadog-agent/comp/core/config"
tagger "github.com/DataDog/datadog-agent/comp/core/tagger/def"
"github.com/DataDog/datadog-agent/comp/core/tagger/origindetection"
"github.com/DataDog/datadog-agent/comp/core/tagger/types"
"github.com/DataDog/datadog-agent/comp/otelcol/otlp/configcheck"
apiutil "github.com/DataDog/datadog-agent/pkg/api/util"
"github.com/DataDog/datadog-agent/pkg/config/env"
"github.com/DataDog/datadog-agent/pkg/config/model"
pkgconfigsetup "github.com/DataDog/datadog-agent/pkg/config/setup"
Expand Down Expand Up @@ -121,6 +122,9 @@ func prepareConfig(c corecompcfg.Component, tagger tagger.Component) (*config.Ag
cfg.ContainerTags = func(cid string) ([]string, error) {
return tagger.Tag(types.NewEntityID(types.ContainerID, cid), types.HighCardinality)
}
cfg.ContainerIDFromOriginInfo = func(originInfo origindetection.OriginInfo) (string, error) {
return tagger.GenerateContainerIDFromOriginInfo(originInfo)
}
cfg.ContainerProcRoot = coreConfigObject.GetString("container_proc_root")
cfg.GetAgentAuthToken = apiutil.GetAuthToken
return cfg, nil
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -654,7 +654,7 @@ require (
github.com/DataDog/datadog-agent/comp/core/secrets v0.59.0
github.com/DataDog/datadog-agent/comp/core/status v0.59.0-rc.6
github.com/DataDog/datadog-agent/comp/core/status/statusimpl v0.56.0-rc.3
github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.0.0-00010101000000-000000000000
github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.0.0-20241217122454-175edb6c74f2
github.com/DataDog/datadog-agent/comp/core/tagger/tags v0.0.0-00010101000000-000000000000
github.com/DataDog/datadog-agent/comp/core/tagger/types v0.59.0
github.com/DataDog/datadog-agent/comp/core/telemetry v0.59.0
Expand Down
3 changes: 2 additions & 1 deletion modules.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ modules:
comp/core/status:
used_by_otel: true
comp/core/status/statusimpl: default
comp/core/tagger/origindetection: default
comp/core/tagger/origindetection:
used_by_otel: true
comp/core/tagger/tags:
used_by_otel: true
comp/core/tagger/types:
Expand Down
4 changes: 2 additions & 2 deletions pkg/proto/pbgo/core/model.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion pkg/trace/api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ func NewHTTPReceiver(
}
}
log.Infof("Receiver configured with %d decoders and a timeout of %dms", semcount, conf.DecoderTimeout)
containerIDProvider := NewIDProvider(conf.ContainerProcRoot)
containerIDProvider := NewIDProvider(conf.ContainerProcRoot, conf.ContainerIDFromOriginInfo)
telemetryForwarder := NewTelemetryForwarder(conf, containerIDProvider, statsd)
return &HTTPReceiver{
Stats: info.NewReceiverStats(),
Expand Down
5 changes: 4 additions & 1 deletion pkg/trace/api/api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"testing"
"time"

"github.com/DataDog/datadog-agent/comp/core/tagger/origindetection"
pb "github.com/DataDog/datadog-agent/pkg/proto/pbgo/trace"
"github.com/DataDog/datadog-agent/pkg/trace/api/internal/header"
"github.com/DataDog/datadog-agent/pkg/trace/config"
Expand Down Expand Up @@ -576,7 +577,9 @@ func TestDecodeV05(t *testing.T) {
req, err := http.NewRequest("POST", "/v0.5/traces", bytes.NewReader(b))
assert.NoError(err)
req.Header.Set(header.ContainerID, "abcdef123789456")
tp, err := decodeTracerPayload(v05, req, NewIDProvider(""), "python", "3.8.1", "1.2.3")
tp, err := decodeTracerPayload(v05, req, NewIDProvider("", func(_ origindetection.OriginInfo) (string, error) {
return "abcdef123789456", nil
}), "python", "3.8.1", "1.2.3")
assert.NoError(err)
assert.EqualValues(tp, &pb.TracerPayload{
ContainerID: "abcdef123789456",
Expand Down
3 changes: 2 additions & 1 deletion pkg/trace/api/container.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"net"
"net/http"

"github.com/DataDog/datadog-agent/comp/core/tagger/origindetection"
"github.com/DataDog/datadog-agent/pkg/trace/api/internal/header"
)

Expand All @@ -28,7 +29,7 @@ type IDProvider interface {
type idProvider struct{}

// NewIDProvider initializes an IDProvider instance, in non-linux environments the procRoot arg is unused.
func NewIDProvider(_ string) IDProvider {
func NewIDProvider(_ string, _ func(originInfo origindetection.OriginInfo) (string, error)) IDProvider {
return &idProvider{}
}

Expand Down
43 changes: 36 additions & 7 deletions pkg/trace/api/container_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"syscall"
"time"

"github.com/DataDog/datadog-agent/comp/core/tagger/origindetection"
"github.com/DataDog/datadog-agent/pkg/trace/api/internal/header"
"github.com/DataDog/datadog-agent/pkg/util/cgroups"
"github.com/DataDog/datadog-agent/pkg/util/log"
Expand Down Expand Up @@ -96,7 +97,7 @@ func (i *noCgroupsProvider) GetContainerID(_ context.Context, h http.Header) str
}

// NewIDProvider initializes an IDProvider instance using the provided procRoot to perform cgroups lookups in linux environments.
func NewIDProvider(procRoot string) IDProvider {
func NewIDProvider(procRoot string, containerIDFromOriginInfo func(originInfo origindetection.OriginInfo) (string, error)) IDProvider {
// taken from pkg/util/containers/metrics/system.collector_linux.go
var hostPrefix string
if strings.HasPrefix(procRoot, "/host") {
Expand All @@ -120,19 +121,21 @@ func NewIDProvider(procRoot string) IDProvider {
}
c := NewCache(1 * time.Minute)
return &cgroupIDProvider{
procRoot: procRoot,
controller: cgroupController,
cache: c,
reader: reader,
procRoot: procRoot,
controller: cgroupController,
cache: c,
reader: reader,
containerIDFromOriginInfo: containerIDFromOriginInfo,
}
}

type cgroupIDProvider struct {
procRoot string
controller string
// reader is used to retrieve the container ID from its cgroup v2 inode.
reader *cgroups.Reader
cache *Cache
reader *cgroups.Reader
cache *Cache
containerIDFromOriginInfo func(originInfo origindetection.OriginInfo) (string, error)
}

// GetContainerID returns the container ID.
Expand All @@ -157,6 +160,11 @@ func (c *cgroupIDProvider) GetContainerID(ctx context.Context, h http.Header) st
return containerID
}

// Retrieve container ID from External Data header
if externalData := h.Get(header.ExternalData); externalData != "" {
return c.resolveContainerIDFromExternalData(externalData)
}

return ""
}

Expand Down Expand Up @@ -296,6 +304,27 @@ func (c *cgroupIDProvider) getCachedContainerID(key string, retrievalFunc func()
return val, nil
}

// resolveContainerIDFromExternalData returns the container ID for the given External Data.
func (c *cgroupIDProvider) resolveContainerIDFromExternalData(rawExternalData string) string {
var generatedContainerID string

externalData, err := origindetection.ParseExternalData(rawExternalData)
if err != nil {
log.Errorf("Could not parse external data (%s): %v", rawExternalData, err)
return ""
}
generatedContainerID, err = c.containerIDFromOriginInfo(origindetection.OriginInfo{
ExternalData: externalData,
ProductOrigin: origindetection.ProductOriginAPM,
})
if err != nil {
log.Errorf("Could not generate container ID from external data (%s): %v", rawExternalData, err)
return ""
}

return generatedContainerID
}

// The below cache is copied from /pkg/util/containers/v2/metrics/provider/cache.go. It is not
// imported to avoid making the datadog-agent module a dependency of the pkg/trace module. The
// datadog-agent module contains replace directives which are not inherited by packages that
Expand Down
2 changes: 1 addition & 1 deletion pkg/trace/api/debugger.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ func debuggerErrorHandler(err error) http.Handler {

// newDebuggerProxy returns a new httputil.ReverseProxy proxying and augmenting requests with headers containing the tags.
func newDebuggerProxy(conf *config.AgentConfig, transport http.RoundTripper, hostTags string) *httputil.ReverseProxy {
cidProvider := NewIDProvider(conf.ContainerProcRoot)
cidProvider := NewIDProvider(conf.ContainerProcRoot, conf.ContainerIDFromOriginInfo)
logger := log.NewThrottled(5, 10*time.Second) // limit to 5 messages every 10 seconds
return &httputil.ReverseProxy{
Director: getDirector(hostTags, cidProvider, conf.ContainerTags),
Expand Down
2 changes: 1 addition & 1 deletion pkg/trace/api/evp_proxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ func evpProxyForwarder(conf *config.AgentConfig, statsd statsd.ClientInterface)
req.Header["X-Forwarded-For"] = nil
},
ErrorLog: logger,
Transport: &evpProxyTransport{conf.NewHTTPTransport(), endpoints, conf, NewIDProvider(conf.ContainerProcRoot), statsd},
Transport: &evpProxyTransport{conf.NewHTTPTransport(), endpoints, conf, NewIDProvider(conf.ContainerProcRoot, conf.ContainerIDFromOriginInfo), statsd},
}
}

Expand Down
10 changes: 10 additions & 0 deletions pkg/trace/api/internal/header/headers.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,16 @@ const (
// * "ci-<container-id>,in-<cgroupv2-inode>"
LocalData = "Datadog-Entity-ID"

// ExternalData is a list that contain prefixed-items, split by a ','. Current items are:
// * "it-<init>" if the container is an init container.
// * "cn-<container-name>" for the container name.
// * "pu-<pod-uid>" for the pod UID.
// Order does not matter.
// Possible values:
// * "it-false,cn-nginx,pu-3413883c-ac60-44ab-96e0-9e52e4e173e2"
// * "cn-init,pu-cb4aba1d-0129-44f1-9f1b-b4dc5d29a3b3,it-true"
ExternalData = "Datadog-External-Env"

// Lang specifies the name of the header which contains the language from
// which the traces originate.
Lang = "Datadog-Meta-Lang"
Expand Down
4 changes: 2 additions & 2 deletions pkg/trace/api/otlp.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (
"context"
"encoding/hex"
"fmt"
"github.com/DataDog/datadog-agent/pkg/trace/transform"
"math"
"net"
"net/http"
Expand All @@ -26,6 +25,7 @@ import (
"github.com/DataDog/datadog-agent/pkg/trace/sampler"
"github.com/DataDog/datadog-agent/pkg/trace/timing"
"github.com/DataDog/datadog-agent/pkg/trace/traceutil"
"github.com/DataDog/datadog-agent/pkg/trace/transform"
"github.com/DataDog/datadog-go/v5/statsd"

"github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes"
Expand Down Expand Up @@ -102,7 +102,7 @@ func NewOTLPReceiver(out chan<- *Payload, cfg *config.AgentConfig, statsd statsd
enableReceiveResourceSpansV2Val = 1.0
}
_ = statsd.Gauge("datadog.trace_agent.otlp.enable_receive_resource_spans_v2", enableReceiveResourceSpansV2Val, nil, 1)
return &OTLPReceiver{out: out, conf: cfg, cidProvider: NewIDProvider(cfg.ContainerProcRoot), statsd: statsd, timing: timing, ignoreResNames: ignoreResNames}
return &OTLPReceiver{out: out, conf: cfg, cidProvider: NewIDProvider(cfg.ContainerProcRoot, cfg.ContainerIDFromOriginInfo), statsd: statsd, timing: timing, ignoreResNames: ignoreResNames}
}

// Start starts the OTLPReceiver, if any of the servers were configured as active.
Expand Down
2 changes: 1 addition & 1 deletion pkg/trace/api/pipeline_stats.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ func pipelineStatsErrorHandler(err error) http.Handler {
// The tags will be added as a header to all proxied requests.
func newPipelineStatsProxy(conf *config.AgentConfig, urls []*url.URL, apiKeys []string, tags string, statsd statsd.ClientInterface) *httputil.ReverseProxy {
log.Debug("[pipeline_stats] Creating reverse proxy")
cidProvider := NewIDProvider(conf.ContainerProcRoot)
cidProvider := NewIDProvider(conf.ContainerProcRoot, conf.ContainerIDFromOriginInfo)
director := func(req *http.Request) {
req.Header.Set("Via", fmt.Sprintf("trace-agent %s", conf.AgentVersion))
if _, ok := req.Header["User-Agent"]; !ok {
Expand Down
2 changes: 1 addition & 1 deletion pkg/trace/api/profiles.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ func errorHandler(err error) http.Handler {
// The tags will be added as a header to all proxied requests.
// For more details please see multiTransport.
func newProfileProxy(conf *config.AgentConfig, targets []*url.URL, keys []string, tags string, statsd statsd.ClientInterface) *httputil.ReverseProxy {
cidProvider := NewIDProvider(conf.ContainerProcRoot)
cidProvider := NewIDProvider(conf.ContainerProcRoot, conf.ContainerIDFromOriginInfo)
director := func(req *http.Request) {
req.Header.Set("Via", fmt.Sprintf("trace-agent %s", conf.AgentVersion))
if _, ok := req.Header["User-Agent"]; !ok {
Expand Down
2 changes: 1 addition & 1 deletion pkg/trace/api/symdb.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ func symDBErrorHandler(err error) http.Handler {

// newSymDBProxy returns a new httputil.ReverseProxy proxying and augmenting requests with headers containing the tags.
func newSymDBProxy(conf *config.AgentConfig, transport http.RoundTripper, hostTags string) *httputil.ReverseProxy {
cidProvider := NewIDProvider(conf.ContainerProcRoot)
cidProvider := NewIDProvider(conf.ContainerProcRoot, conf.ContainerIDFromOriginInfo)
logger := log.NewThrottled(5, 10*time.Second) // limit to 5 messages every 10 seconds
return &httputil.ReverseProxy{
Director: getSymDBDirector(hostTags, cidProvider, conf.ContainerTags),
Expand Down
4 changes: 4 additions & 0 deletions pkg/trace/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (

"github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes"

"github.com/DataDog/datadog-agent/comp/core/tagger/origindetection"
"github.com/DataDog/datadog-agent/pkg/obfuscate"
"github.com/DataDog/datadog-agent/pkg/remoteconfig/state"
"github.com/DataDog/datadog-agent/pkg/trace/log"
Expand Down Expand Up @@ -445,6 +446,9 @@ type AgentConfig struct {
// ContainerTags ...
ContainerTags func(cid string) ([]string, error) `json:"-"`

// ContainerIDFromOriginInfo ...
ContainerIDFromOriginInfo func(originInfo origindetection.OriginInfo) (string, error) `json:"-"`

// ContainerProcRoot is the root dir for `proc` info
ContainerProcRoot string

Expand Down
2 changes: 2 additions & 0 deletions pkg/trace/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ require (
)

require (
github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.0.0-20241217122454-175edb6c74f2
github.com/shirou/gopsutil/v4 v4.24.11
go.opentelemetry.io/collector/component/componenttest v0.115.0
)
Expand Down Expand Up @@ -115,6 +116,7 @@ require (

replace (
github.com/DataDog/datadog-agent => ../../
github.com/DataDog/datadog-agent/comp/core/tagger/origindetection => ../../comp/core/tagger/origindetection
github.com/DataDog/datadog-agent/comp/trace/compression/def => ../../comp/trace/compression/def
github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip => ../../comp/trace/compression/impl-gzip
github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd => ../../comp/trace/compression/impl-zstd
Expand Down
2 changes: 2 additions & 0 deletions pkg/trace/stats/oteltest/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ require (
require go.opentelemetry.io/collector/component v0.115.0 // indirect

require (
github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.0.0-20241217122454-175edb6c74f2 // indirect
github.com/DataDog/datadog-agent/comp/trace/compression/def v0.56.0-rc.3 // indirect
github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.56.0-rc.3 // indirect
github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0-rc.3 // indirect
Expand Down Expand Up @@ -87,6 +88,7 @@ require (
)

replace (
github.com/DataDog/datadog-agent/comp/core/tagger/origindetection => ../../../../comp/core/tagger/origindetection
github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/metricsclient => ../../../../comp/otelcol/otlp/components/metricsclient
github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/statsprocessor => ../../../../comp/otelcol/otlp/components/statsprocessor
github.com/DataDog/datadog-agent/comp/trace/compression/def => ../../../../comp/trace/compression/def
Expand Down
13 changes: 13 additions & 0 deletions releasenotes/notes/external_data_apm-6538531e3f34f305.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Each section from every release note are combined when the
# CHANGELOG.rst is rendered. So the text needs to be worded so that
# it does not depend on any information only available in another
# section. This may mean repeating some details, but each section
# must be readable independently of the other.
#
# Each section note must be formatted as reStructuredText.
---
features:
- |
Implement External Data resolution for APM. This is needed to support the
latest Origin Detection spec and resolution with nested virtualization.
Loading

0 comments on commit c29edf5

Please sign in to comment.