Skip to content
This repository was archived by the owner on Oct 3, 2023. It is now read-only.

Commit 69e294b

Browse files
authored
Fix resource mapping. (#155)
* Fix resource mapping. * add "aws:" prefix to region value. - also updated version for oc lib and resource package.
1 parent 3a2251b commit 69e294b

4 files changed

Lines changed: 146 additions & 79 deletions

File tree

go.mod

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ module contrib.go.opencensus.io/exporter/stackdriver
22

33
require (
44
cloud.google.com/go v0.38.0
5-
contrib.go.opencensus.io/resource v0.0.0-20190131005048-21591786a5e0
5+
contrib.go.opencensus.io/resource v0.1.0
66
github.com/aws/aws-sdk-go v1.19.18
77
github.com/census-instrumentation/opencensus-proto v0.2.0
88
github.com/golang/protobuf v1.3.1
9-
github.com/google/go-cmp v0.2.0
9+
github.com/google/go-cmp v0.3.0
1010
github.com/stretchr/testify v1.3.0 // indirect
11-
go.opencensus.io v0.21.0
12-
golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6
11+
go.opencensus.io v0.22.0
12+
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09
1313
golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a
1414
google.golang.org/api v0.5.0
1515
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb

go.sum

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg=
33
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
44
cloud.google.com/go v0.38.0 h1:ROfEUZz+Gh5pa62DJWXSaonyu3StP6EA6lPEXPI6mCo=
55
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
6-
contrib.go.opencensus.io/resource v0.0.0-20190131005048-21591786a5e0 h1:ICrSnXeuT4427bpR8X9I7GxiyT4X5qgLtFT7m1IjK2c=
7-
contrib.go.opencensus.io/resource v0.0.0-20190131005048-21591786a5e0/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA=
6+
contrib.go.opencensus.io/resource v0.1.0/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA=
87
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
98
github.com/aws/aws-sdk-go v1.19.18 h1:Hb3+b9HCqrOrbAtFstUWg7H5TQ+/EcklJtE8VShVs8o=
109
github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
@@ -24,12 +23,16 @@ github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
2423
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
2524
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
2625
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
26+
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
27+
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
2728
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
2829
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
2930
github.com/googleapis/gax-go/v2 v2.0.4 h1:hU4mGcQI4DaAYW+IbTun+2qEZVFxK0ySjQLTbS0VQKc=
3031
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
3132
github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo=
3233
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
34+
github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
35+
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
3336
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM=
3437
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
3538
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
@@ -38,8 +41,9 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
3841
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
3942
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
4043
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
41-
go.opencensus.io v0.21.0 h1:mU6zScU4U1YAFPHEHYk+3JC4SY7JxgkqS10ZOSyksNg=
4244
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
45+
go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4=
46+
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
4347
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
4448
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
4549
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -54,6 +58,8 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJV
5458
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
5559
golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6 h1:FP8hkuE6yUEaJnK7O2eTuejKWwW+Rhfj80dQ2JcKxCU=
5660
golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
61+
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09 h1:KaQtG+aDELoNmXYas3TVkGNYRuq8JQ1aa7LJt8EXVyo=
62+
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
5763
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
5864
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI=
5965
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -69,11 +75,15 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ
6975
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
7076
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
7177
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
78+
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
7279
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
7380
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
7481
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 h1:z99zHgr7hKfrUcX/KsoJk5FJfjTceCKIp96+biqP4To=
7582
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
83+
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
84+
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
7685
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
86+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
7787
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
7888
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
7989
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=

resource.go

Lines changed: 62 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515
package stackdriver // import "contrib.go.opencensus.io/exporter/stackdriver"
1616

1717
import (
18-
"contrib.go.opencensus.io/resource/resourcekeys"
18+
"fmt"
19+
1920
"go.opencensus.io/resource"
21+
"go.opencensus.io/resource/resourcekeys"
2022
monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres"
2123
)
2224

@@ -39,71 +41,69 @@ const (
3941
)
4042

4143
// Mappings for the well-known OpenCensus resources to applicable Stackdriver resources.
42-
var resourceMappings = []resourceMap{
43-
{
44-
srcType: resourcekeys.K8STypeContainer,
45-
dstType: "k8s_container",
46-
labels: map[string]string{
47-
"project_id": stackdriverProjectID,
48-
"location": stackdriverLocation,
49-
"cluster_name": resourcekeys.K8SKeyClusterName,
50-
"namespace_name": resourcekeys.K8SKeyNamespaceName,
51-
"pod_name": resourcekeys.K8SKeyPodName,
52-
"container_name": resourcekeys.K8SKeyContainerName,
53-
},
54-
},
55-
{
56-
srcType: resourcekeys.GCPTypeGCEInstance,
57-
dstType: "gce_instance",
58-
labels: map[string]string{
59-
"project_id": resourcekeys.GCPKeyGCEProjectID,
60-
"instance_id": resourcekeys.GCPKeyGCEInstanceID,
61-
"zone": resourcekeys.GCPKeyGCEZone,
62-
},
63-
},
64-
{
65-
srcType: resourcekeys.AWSTypeEC2Instance,
66-
dstType: "aws_ec2_instance",
67-
labels: map[string]string{
68-
"project_id": stackdriverProjectID,
69-
"instance_id": resourcekeys.AWSKeyEC2InstanceID,
70-
"region": resourcekeys.AWSKeyEC2Region,
71-
"aws_account": resourcekeys.AWSKeyEC2AccountID,
72-
},
73-
},
74-
// Fallback to generic task resource.
75-
{
76-
srcType: "",
77-
dstType: "generic_task",
78-
labels: map[string]string{
79-
"project_id": stackdriverProjectID,
80-
"location": stackdriverLocation,
81-
"namespace": stackdriverGenericTaskNamespace,
82-
"job": stackdriverGenericTaskJob,
83-
"task_id": stackdriverGenericTaskID,
84-
},
85-
},
44+
var k8sResourceMap = map[string]string{
45+
"project_id": stackdriverProjectID,
46+
"location": resourcekeys.CloudKeyZone,
47+
"cluster_name": resourcekeys.K8SKeyClusterName,
48+
"namespace_name": resourcekeys.K8SKeyNamespaceName,
49+
"pod_name": resourcekeys.K8SKeyPodName,
50+
"container_name": resourcekeys.ContainerKeyName,
8651
}
8752

88-
func defaultMapResource(res *resource.Resource) *monitoredrespb.MonitoredResource {
89-
Outer:
90-
for _, rm := range resourceMappings {
91-
if res.Type != rm.srcType {
92-
continue
53+
var gcpResourceMap = map[string]string{
54+
"project_id": stackdriverProjectID,
55+
"instance_id": resourcekeys.HostKeyID,
56+
"zone": resourcekeys.CloudKeyZone,
57+
}
58+
59+
var awsResourceMap = map[string]string{
60+
"project_id": stackdriverProjectID,
61+
"instance_id": resourcekeys.HostKeyID,
62+
"region": resourcekeys.CloudKeyRegion,
63+
"aws_account": resourcekeys.CloudKeyAccountID,
64+
}
65+
66+
// Generic task resource.
67+
var genericResourceMap = map[string]string{
68+
"project_id": stackdriverProjectID,
69+
"location": stackdriverLocation,
70+
"namespace": stackdriverGenericTaskNamespace,
71+
"job": stackdriverGenericTaskJob,
72+
"task_id": stackdriverGenericTaskID,
73+
}
74+
75+
func transformResource(match, input map[string]string) (map[string]string, bool) {
76+
output := make(map[string]string, len(input))
77+
for dst, src := range match {
78+
if v, ok := input[src]; ok {
79+
output[dst] = v
9380
}
94-
result := &monitoredrespb.MonitoredResource{
95-
Type: rm.dstType,
96-
Labels: make(map[string]string, len(rm.labels)),
81+
}
82+
return output, true
83+
}
84+
85+
func defaultMapResource(res *resource.Resource) *monitoredrespb.MonitoredResource {
86+
match := genericResourceMap
87+
result := &monitoredrespb.MonitoredResource{
88+
Type: "generic_task",
89+
}
90+
if res.Type == resourcekeys.K8SType {
91+
result.Type = "k8s_container"
92+
match = k8sResourceMap
93+
} else if v, ok := res.Labels[resourcekeys.CloudKeyProvider]; ok {
94+
if v == resourcekeys.CloudProviderGCP {
95+
result.Type = "gce_instance"
96+
match = gcpResourceMap
97+
} else if v == resourcekeys.CloudProviderAWS {
98+
result.Type = "aws_ec2_instance"
99+
match = awsResourceMap
97100
}
98-
for dst, src := range rm.labels {
99-
if v, ok := res.Labels[src]; ok {
100-
result.Labels[dst] = v
101-
} else {
102-
// A required label wasn't filled at all. Try subsequent mappings.
103-
continue Outer
104-
}
101+
}
102+
result.Labels, _ = transformResource(match, res.Labels)
103+
if result.Type == "aws_ec2_instance" {
104+
if v, ok := result.Labels["region"]; ok {
105+
result.Labels["region"] = fmt.Sprintf("aws:%s", v)
105106
}
106-
return result
107107
}
108-
return nil
108+
return result
109109
}

resource_test.go

Lines changed: 67 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ import (
1818
"fmt"
1919
"testing"
2020

21-
"contrib.go.opencensus.io/resource/resourcekeys"
2221
"github.com/google/go-cmp/cmp"
2322
"go.opencensus.io/resource"
23+
"go.opencensus.io/resource/resourcekeys"
2424
monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres"
2525
)
2626

@@ -33,14 +33,42 @@ func TestDefaultMapResource(t *testing.T) {
3333
// first mapping that doesn't apply.
3434
{
3535
input: &resource.Resource{
36-
Type: resourcekeys.GCPTypeGCEInstance,
36+
Type: resourcekeys.K8SType,
3737
Labels: map[string]string{
38-
resourcekeys.GCPKeyGCEProjectID: "proj1",
39-
resourcekeys.GCPKeyGCEInstanceID: "inst1",
40-
resourcekeys.GCPKeyGCEZone: "zone1",
38+
stackdriverProjectID: "proj1",
39+
resourcekeys.K8SKeyClusterName: "cluster1",
40+
resourcekeys.K8SKeyPodName: "pod1",
41+
resourcekeys.K8SKeyNamespaceName: "namespace1",
42+
resourcekeys.ContainerKeyName: "container-name1",
43+
resourcekeys.CloudKeyAccountID: "proj1",
44+
resourcekeys.CloudKeyZone: "zone1",
45+
resourcekeys.CloudKeyRegion: "",
4146
"extra_key": "must be ignored",
4247
},
4348
},
49+
want: &monitoredrespb.MonitoredResource{
50+
Type: "k8s_container",
51+
Labels: map[string]string{
52+
"project_id": "proj1",
53+
"location": "zone1",
54+
"cluster_name": "cluster1",
55+
"namespace_name": "namespace1",
56+
"pod_name": "pod1",
57+
"container_name": "container-name1",
58+
},
59+
},
60+
},
61+
{
62+
input: &resource.Resource{
63+
Type: resourcekeys.CloudType,
64+
Labels: map[string]string{
65+
stackdriverProjectID: "proj1",
66+
resourcekeys.CloudKeyProvider: resourcekeys.CloudProviderGCP,
67+
resourcekeys.HostKeyID: "inst1",
68+
resourcekeys.CloudKeyZone: "zone1",
69+
"extra_key": "must be ignored",
70+
},
71+
},
4472
want: &monitoredrespb.MonitoredResource{
4573
Type: "gce_instance",
4674
Labels: map[string]string{
@@ -50,16 +78,45 @@ func TestDefaultMapResource(t *testing.T) {
5078
},
5179
},
5280
},
53-
// No match due to missing key.
5481
{
5582
input: &resource.Resource{
56-
Type: resourcekeys.GCPTypeGCEInstance,
83+
Type: resourcekeys.CloudType,
5784
Labels: map[string]string{
58-
resourcekeys.GCPKeyGCEProjectID: "proj1",
59-
resourcekeys.GCPKeyGCEInstanceID: "inst1",
85+
stackdriverProjectID: "proj1",
86+
resourcekeys.CloudKeyProvider: resourcekeys.CloudProviderAWS,
87+
resourcekeys.HostKeyID: "inst1",
88+
resourcekeys.CloudKeyRegion: "region1",
89+
resourcekeys.CloudKeyAccountID: "account1",
90+
"extra_key": "must be ignored",
91+
},
92+
},
93+
want: &monitoredrespb.MonitoredResource{
94+
Type: "aws_ec2_instance",
95+
Labels: map[string]string{
96+
"project_id": "proj1",
97+
"instance_id": "inst1",
98+
"region": "aws:region1",
99+
"aws_account": "account1",
100+
},
101+
},
102+
},
103+
// Partial Match
104+
{
105+
input: &resource.Resource{
106+
Type: resourcekeys.CloudType,
107+
Labels: map[string]string{
108+
stackdriverProjectID: "proj1",
109+
resourcekeys.CloudKeyProvider: resourcekeys.CloudProviderGCP,
110+
resourcekeys.HostKeyID: "inst1",
111+
},
112+
},
113+
want: &monitoredrespb.MonitoredResource{
114+
Type: "gce_instance",
115+
Labels: map[string]string{
116+
"project_id": "proj1",
117+
"instance_id": "inst1",
60118
},
61119
},
62-
want: nil,
63120
},
64121
}
65122
for i, c := range cases {

0 commit comments

Comments
 (0)