Skip to content

Commit da405ec

Browse files
authored
Set cloudwatch logs metadata in attributes. (#188)
1 parent 52eeafe commit da405ec

File tree

3 files changed

+139
-2
lines changed

3 files changed

+139
-2
lines changed

receiver/awsxrayreceiver/internal/translator/addtoattrs.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,15 @@ func addInt64(val *int64, attrKey string, attrs pcommon.Map) {
2222
attrs.PutInt(attrKey, *val)
2323
}
2424
}
25+
26+
func addStringSlice(val *string, attrKey string, attrs pcommon.Map) {
27+
if val != nil {
28+
var slice pcommon.Slice
29+
if attrVal, ok := attrs.Get(attrKey); ok && attrVal.Type() == pcommon.ValueTypeSlice {
30+
slice = attrVal.Slice()
31+
} else {
32+
slice = attrs.PutEmptySlice(attrKey)
33+
}
34+
slice.AppendEmpty().SetStr(*val)
35+
}
36+
}

receiver/awsxrayreceiver/internal/translator/aws.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,14 @@ func addAWSToResource(aws *awsxray.AWSData, attrs pcommon.Map) {
2525
addString(aws.AccountID, conventions.AttributeCloudAccountID, attrs)
2626

2727
// based on https://docs.aws.amazon.com/xray/latest/devguide/xray-api-segmentdocuments.html#api-segmentdocuments-aws
28-
// it's possible to have all ec2, ecs and beanstalk fields at the same time.
28+
// it's possible to have all cloudwatch_logs, ec2, ecs and beanstalk fields at the same time.
29+
if cwl := aws.CWLogs; cwl != nil {
30+
for _, logGroupMetaData := range cwl {
31+
addStringSlice(logGroupMetaData.Arn, conventions.AttributeAWSLogGroupARNs, attrs)
32+
addStringSlice(logGroupMetaData.LogGroup, conventions.AttributeAWSLogGroupNames, attrs)
33+
}
34+
}
35+
2936
if ec2 := aws.EC2; ec2 != nil {
3037
addString(ec2.AvailabilityZone, conventions.AttributeCloudAvailabilityZone, attrs)
3138
addString(ec2.InstanceID, conventions.AttributeHostID, attrs)
@@ -51,7 +58,6 @@ func addAWSToResource(aws *awsxray.AWSData, attrs pcommon.Map) {
5158
addString(eks.ContainerID, conventions.AttributeContainerID, attrs)
5259
addString(eks.ClusterName, conventions.AttributeK8SClusterName, attrs)
5360
addString(eks.Pod, conventions.AttributeK8SPodName, attrs)
54-
5561
}
5662
}
5763

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package translator
5+
6+
import (
7+
"testing"
8+
9+
"github.com/aws/aws-sdk-go/aws"
10+
"github.com/stretchr/testify/assert"
11+
"go.opentelemetry.io/collector/pdata/pcommon"
12+
conventions "go.opentelemetry.io/collector/semconv/v1.6.1"
13+
14+
awsxray "github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray"
15+
)
16+
17+
func TestAddAWSToResource(t *testing.T) {
18+
testCases := map[string]struct {
19+
input *awsxray.AWSData
20+
want map[string]any
21+
}{
22+
"WithNil": {
23+
want: map[string]any{
24+
conventions.AttributeCloudProvider: "unknown",
25+
},
26+
},
27+
"WithCloudWatchLogs": {
28+
input: &awsxray.AWSData{
29+
CWLogs: []awsxray.LogGroupMetadata{
30+
{
31+
LogGroup: aws.String("<log-group-1>"),
32+
Arn: aws.String("arn:aws:logs:<region>:<account>:log-group:<log-group-1>:*"),
33+
},
34+
{
35+
LogGroup: aws.String("<log-group-2>"),
36+
Arn: aws.String("arn:aws:logs:<region>:<account>:log-group:<log-group-2>:*"),
37+
},
38+
},
39+
},
40+
want: map[string]any{
41+
conventions.AttributeCloudProvider: conventions.AttributeCloudProviderAWS,
42+
conventions.AttributeAWSLogGroupARNs: []any{
43+
"arn:aws:logs:<region>:<account>:log-group:<log-group-1>:*",
44+
"arn:aws:logs:<region>:<account>:log-group:<log-group-2>:*",
45+
},
46+
conventions.AttributeAWSLogGroupNames: []any{"<log-group-1>", "<log-group-2>"},
47+
},
48+
},
49+
"WithEC2": {
50+
input: &awsxray.AWSData{
51+
EC2: &awsxray.EC2Metadata{
52+
InstanceID: aws.String("<instance-id>"),
53+
AvailabilityZone: aws.String("<ec2-az>"),
54+
InstanceSize: aws.String("<instance-size>"),
55+
AmiID: aws.String("<ami>"),
56+
},
57+
},
58+
want: map[string]any{
59+
conventions.AttributeCloudProvider: conventions.AttributeCloudProviderAWS,
60+
conventions.AttributeCloudAvailabilityZone: "<ec2-az>",
61+
conventions.AttributeHostID: "<instance-id>",
62+
conventions.AttributeHostType: "<instance-size>",
63+
conventions.AttributeHostImageID: "<ami>",
64+
},
65+
},
66+
"WithECS": {
67+
input: &awsxray.AWSData{
68+
ECS: &awsxray.ECSMetadata{
69+
ContainerName: aws.String("<container-name>"),
70+
ContainerID: aws.String("<ecs-container-id>"),
71+
AvailabilityZone: aws.String("<ecs-az>"),
72+
},
73+
},
74+
want: map[string]any{
75+
conventions.AttributeCloudProvider: conventions.AttributeCloudProviderAWS,
76+
conventions.AttributeCloudAvailabilityZone: "<ecs-az>",
77+
conventions.AttributeContainerName: "<container-name>",
78+
conventions.AttributeContainerID: "<ecs-container-id>",
79+
},
80+
},
81+
"WithEKS": {
82+
input: &awsxray.AWSData{
83+
EKS: &awsxray.EKSMetadata{
84+
ClusterName: aws.String("<cluster-name>"),
85+
Pod: aws.String("<pod>"),
86+
ContainerID: aws.String("<eks-container-id>"),
87+
},
88+
},
89+
want: map[string]any{
90+
conventions.AttributeCloudProvider: conventions.AttributeCloudProviderAWS,
91+
conventions.AttributeK8SPodName: "<pod>",
92+
conventions.AttributeK8SClusterName: "<cluster-name>",
93+
conventions.AttributeContainerID: "<eks-container-id>",
94+
},
95+
},
96+
"WithBeanstalk": {
97+
input: &awsxray.AWSData{
98+
Beanstalk: &awsxray.BeanstalkMetadata{
99+
Environment: aws.String("<environment>"),
100+
VersionLabel: aws.String("<version-label>"),
101+
DeploymentID: aws.Int64(1),
102+
},
103+
},
104+
want: map[string]any{
105+
conventions.AttributeCloudProvider: conventions.AttributeCloudProviderAWS,
106+
conventions.AttributeServiceNamespace: "<environment>",
107+
conventions.AttributeServiceInstanceID: "1",
108+
conventions.AttributeServiceVersion: "<version-label>",
109+
},
110+
},
111+
}
112+
for name, testCase := range testCases {
113+
t.Run(name, func(t *testing.T) {
114+
attrs := pcommon.NewMap()
115+
addAWSToResource(testCase.input, attrs)
116+
assert.Equal(t, testCase.want, attrs.AsRaw())
117+
})
118+
}
119+
}

0 commit comments

Comments
 (0)