@@ -17,12 +17,14 @@ import (
1717 "reflect"
1818 "testing"
1919
20+ "github.com/google/go-cmp/cmp"
2021 "github.com/prometheus/prometheus/pkg/labels"
2122)
2223
2324func TestTranslate (t * testing.T ) {
2425 r := ResourceMap {
25- Type : "my_type" ,
26+ Type : "my_type" ,
27+ MatchLabel : "__match_type" ,
2628 LabelMap : map [string ]labelTranslation {
2729 "__target1" : constValue ("sdt1" ),
2830 "__target2" : constValue ("sdt2" ),
@@ -33,29 +35,40 @@ func TestTranslate(t *testing.T) {
3335 noMatchTarget := labels.Labels {
3436 {"ignored" , "x" },
3537 {"__target2" , "y" },
38+ {"__match_type" , "true" },
3639 }
37- if labels := r .Translate (noMatchTarget , nil ); labels != nil {
40+ if labels , _ := r .Translate (noMatchTarget , nil ); labels != nil {
3841 t .Errorf ("Expected no match, matched %v" , labels )
3942 }
4043 matchTargetDiscovered := labels.Labels {
4144 {"ignored" , "x" },
4245 {"__target2" , "y" },
4346 {"__target1" , "z" },
47+ {"__match_type" , "true" },
4448 }
4549 matchTargetFinal := labels.Labels {
4650 {"__target1" , "z2" },
4751 {"__target3" , "v" },
52+ {"__match_type" , "true" },
4853 }
4954 expectedLabels := map [string ]string {
5055 "sdt1" : "z2" ,
5156 "sdt2" : "y" ,
5257 "sdt3" : "v" ,
5358 }
54- if labels := r .Translate (matchTargetDiscovered , matchTargetFinal ); labels == nil {
59+ if labels , _ := r .Translate (matchTargetDiscovered , matchTargetFinal ); labels == nil {
5560 t .Errorf ("Expected %v, actual nil" , expectedLabels )
5661 } else if ! reflect .DeepEqual (labels , expectedLabels ) {
5762 t .Errorf ("Expected %v, actual %v" , expectedLabels , labels )
5863 }
64+ missingType := labels.Labels {
65+ {"__target1" , "x" },
66+ {"__target2" , "y" },
67+ {"__target3" , "z" },
68+ }
69+ if labels , _ := r .Translate (missingType , nil ); labels != nil {
70+ t .Errorf ("Expected no match, matched %v" , labels )
71+ }
5972}
6073
6174func TestTranslateEc2Instance (t * testing.T ) {
@@ -71,7 +84,7 @@ func TestTranslateEc2Instance(t *testing.T) {
7184 "region" : "aws:us-east-1b" ,
7285 "aws_account" : "12345678" ,
7386 }
74- if labels := EC2ResourceMap .Translate (target , nil ); labels == nil {
87+ if labels , _ := EC2ResourceMap .Translate (target , nil ); labels == nil {
7588 t .Errorf ("Expected %v, actual nil" , expectedLabels )
7689 } else if ! reflect .DeepEqual (labels , expectedLabels ) {
7790 t .Errorf ("Expected %v, actual %v" , expectedLabels , labels )
@@ -89,7 +102,7 @@ func TestTranslateGceInstance(t *testing.T) {
89102 "zone" : "us-central1-a" ,
90103 "instance_id" : "1234110975759588" ,
91104 }
92- if labels := GCEResourceMap .Translate (target , nil ); labels == nil {
105+ if labels , _ := GCEResourceMap .Translate (target , nil ); labels == nil {
93106 t .Errorf ("Expected %v, actual nil" , expectedLabels )
94107 } else if ! reflect .DeepEqual (labels , expectedLabels ) {
95108 t .Errorf ("Expected %v, actual %v" , expectedLabels , labels )
@@ -111,13 +124,152 @@ func TestBestEffortTranslate(t *testing.T) {
111124 "pod_id" : "" ,
112125 "container_name" : "" ,
113126 }
114- if labels := GKEResourceMap .BestEffortTranslate (target , nil ); labels == nil {
127+ if labels , _ := GKEResourceMap .BestEffortTranslate (target , nil ); labels == nil {
115128 t .Errorf ("Expected %v, actual nil" , expectedLabels )
116129 } else if ! reflect .DeepEqual (labels , expectedLabels ) {
117130 t .Errorf ("Expected %v, actual %v" , expectedLabels , labels )
118131 }
119132}
120133
134+ func TestTranslateDevapp (t * testing.T ) {
135+ discoveredLabels := labels.Labels {
136+ {"__meta_kubernetes_pod_label_type_devapp" , "true" },
137+ {ProjectIDLabel , "my-project" },
138+ {KubernetesLocationLabel , "us-central1-a" },
139+ {"__meta_kubernetes_pod_label_org" , "my-org" },
140+ {"__meta_kubernetes_pod_label_env" , "my-env" },
141+ }
142+ metricLabels := labels.Labels {
143+ {"api_product_name" , "my-name" },
144+ {"extra_label" , "my-label" },
145+ }
146+ expectedLabels := map [string ]string {
147+ "resource_container" : "my-project" ,
148+ "location" : "us-central1-a" ,
149+ "org" : "my-org" ,
150+ "env" : "my-env" ,
151+ "api_product_name" : "my-name" ,
152+ }
153+ expectedFinalLabels := labels.Labels {
154+ {"extra_label" , "my-label" },
155+ }
156+ if labels , finalLabels := DevappResourceMap .Translate (discoveredLabels , metricLabels ); labels == nil {
157+ t .Errorf ("Expected %v, actual nil" , expectedLabels )
158+ } else {
159+ if diff := cmp .Diff (expectedLabels , labels ); len (diff ) > 0 {
160+ t .Error (diff )
161+ }
162+ if diff := cmp .Diff (expectedFinalLabels , finalLabels ); len (diff ) > 0 {
163+ t .Error (diff )
164+ }
165+ }
166+ }
167+
168+ func TestTranslateProxy (t * testing.T ) {
169+ discoveredLabels := labels.Labels {
170+ {"__meta_kubernetes_pod_label_type_proxy" , "true" },
171+ {ProjectIDLabel , "my-project" },
172+ {KubernetesLocationLabel , "us-central1-a" },
173+ {"__meta_kubernetes_pod_label_org" , "my-org" },
174+ {"__meta_kubernetes_pod_label_env" , "my-env" },
175+ }
176+ metricLabels := labels.Labels {
177+ {"proxy_name" , "my-name" },
178+ {"revision" , "my-revision" },
179+ {"extra_label" , "my-label" },
180+ }
181+ expectedLabels := map [string ]string {
182+ "resource_container" : "my-project" ,
183+ "location" : "us-central1-a" ,
184+ "org" : "my-org" ,
185+ "env" : "my-env" ,
186+ "proxy_name" : "my-name" ,
187+ "revision" : "my-revision" ,
188+ }
189+ expectedFinalLabels := labels.Labels {
190+ {"extra_label" , "my-label" },
191+ }
192+ if labels , finalLabels := ProxyResourceMap .Translate (discoveredLabels , metricLabels ); labels == nil {
193+ t .Errorf ("Expected %v, actual nil" , expectedLabels )
194+ } else {
195+ if diff := cmp .Diff (expectedLabels , labels ); len (diff ) > 0 {
196+ t .Error (diff )
197+ }
198+ if diff := cmp .Diff (expectedFinalLabels , finalLabels ); len (diff ) > 0 {
199+ t .Error (diff )
200+ }
201+ }
202+ }
203+
204+ func (m * ResourceMapList ) getByType (t string ) (* ResourceMap , bool ) {
205+ for _ , m := range * m {
206+ if m .Type == t {
207+ return & m , true
208+ }
209+ }
210+ return nil , false
211+ }
212+
213+ func (m * ResourceMapList ) matchType (matchLabels labels.Labels ) string {
214+ for _ , m := range * m {
215+ if lset , _ := m .Translate (matchLabels , nil ); lset != nil {
216+ return m .Type
217+ }
218+ }
219+ return ""
220+ }
221+
222+ func TestResourceMappingsOrder (t * testing.T ) {
223+ // For each pair of resource types on the input, ensure that the first
224+ // one is picked if there are labels that match both. This guarantees
225+ // that more specific resource types are picked, e.g. k8s_container before
226+ // k8s_pod, and k8s_node before gce_instance.
227+ cases := []struct {
228+ first string // Higher priority.
229+ second string // Lower priority.
230+ }{
231+ {"k8s_container" , "k8s_pod" },
232+ {"k8s_pod" , "k8s_node" },
233+ {"k8s_node" , "gce_instance" },
234+ {"k8s_node" , "aws_ec2_instance" },
235+ {"proxy" , "k8s_container" },
236+ {"devapp" , "k8s_container" },
237+ }
238+ for _ , c := range cases {
239+ var (
240+ first , second * ResourceMap
241+ ok bool
242+ )
243+ if first , ok = ResourceMappings .getByType (c .first ); ! ok {
244+ t .Fatalf ("invalid test case, missing %v" , c .first )
245+ }
246+ if second , ok = ResourceMappings .getByType (c .second ); ! ok {
247+ t .Fatalf ("invalid test case, missing %v" , c .second )
248+ }
249+ // The values are uninteresting for this test.
250+ combinedKeys := make (map [string ]string )
251+ for k , _ := range first .LabelMap {
252+ combinedKeys [k ] = ""
253+ }
254+ if len (first .MatchLabel ) > 0 {
255+ combinedKeys [first .MatchLabel ] = ""
256+ }
257+ for k , _ := range second .LabelMap {
258+ combinedKeys [k ] = ""
259+ }
260+ if len (second .MatchLabel ) > 0 {
261+ combinedKeys [second .MatchLabel ] = ""
262+ }
263+ combinedLabels := labels .FromMap (combinedKeys )
264+ if match := ResourceMappings .matchType (combinedLabels ); match != c .first {
265+ t .Errorf ("expected to match %v, got %v" , c .first , match )
266+ }
267+ if match := ResourceMappings .matchType (combinedLabels ); match == c .second {
268+ t .Errorf ("unexpected match %v" , match )
269+ }
270+ }
271+ }
272+
121273func BenchmarkTranslate (b * testing.B ) {
122274 r := ResourceMap {
123275 Type : "gke_container" ,
@@ -149,7 +301,7 @@ func BenchmarkTranslate(b *testing.B) {
149301 b .ReportAllocs ()
150302
151303 for i := 0 ; i < b .N ; i ++ {
152- if labels := r .Translate (discoveredLabels , finalLabels ); labels == nil {
304+ if labels , _ := r .Translate (discoveredLabels , finalLabels ); labels == nil {
153305 b .Fail ()
154306 }
155307 }
0 commit comments