-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
span_modifier.go
60 lines (51 loc) · 1.81 KB
/
span_modifier.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// Unless explicitly stated otherwise all files in this repository are licensed
// under the Apache License Version 2.0.
// This product includes software developed at Datadog (https://www.datadoghq.com/).
// Copyright 2016-present Datadog, Inc.
package trace
import (
pb "github.com/DataDog/datadog-agent/pkg/proto/pbgo/trace"
"github.com/DataDog/datadog-agent/pkg/serverless/trace/inferredspan"
"github.com/DataDog/datadog-agent/pkg/trace/traceutil"
"github.com/DataDog/datadog-agent/pkg/util/log"
)
const (
functionNameEnvVar = "AWS_LAMBDA_FUNCTION_NAME"
ddOriginTagName = "_dd.origin"
ddOriginTagValue = "lambda"
)
type spanModifier struct {
tags map[string]string
lambdaSpanChan chan<- *pb.Span
//nolint:revive // TODO(SERV) Fix revive linter
coldStartSpanId uint64
ddOrigin string
}
// ModifySpan applies extra logic to the given span
func (s *spanModifier) ModifySpan(_ *pb.TraceChunk, span *pb.Span) {
if span.Service == "aws.lambda" {
// service name could be incorrectly set to 'aws.lambda' in datadog lambda libraries
if s.tags["service"] != "" {
span.Service = s.tags["service"]
}
if s.lambdaSpanChan != nil && span.Name == "aws.lambda" {
s.lambdaSpanChan <- span
}
}
// ensure all spans have tag _dd.origin in addition to span.Origin
if origin := span.Meta[ddOriginTagName]; origin == "" {
traceutil.SetMeta(span, ddOriginTagName, s.ddOrigin)
}
if span.Name == "aws.lambda.load" {
span.ParentID = s.coldStartSpanId
}
if inferredspan.CheckIsInferredSpan(span) {
log.Debug("Detected a managed service span, filtering out function tags")
// filter out existing function tags inside span metadata
spanMetadataTags := span.Meta
if spanMetadataTags != nil {
spanMetadataTags = inferredspan.FilterFunctionTags(spanMetadataTags)
span.Meta = spanMetadataTags
}
}
}