Path: blob/main/component/otelcol/receiver/prometheus/internal/prom_to_otlp_test.go
5460 views
// Copyright The OpenTelemetry Authors1//2// Licensed under the Apache License, Version 2.0 (the "License");3// you may not use this file except in compliance with the License.4// You may obtain a copy of the License at5//6// http://www.apache.org/licenses/LICENSE-2.07//8// Unless required by applicable law or agreed to in writing, software9// distributed under the License is distributed on an "AS IS" BASIS,10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.11// See the License for the specific language governing permissions and12// limitations under the License.1314package internal1516import (17"testing"1819"github.com/prometheus/prometheus/model/labels"20"github.com/stretchr/testify/require"21"go.opentelemetry.io/collector/pdata/pcommon"22conventions "go.opentelemetry.io/collector/semconv/v1.6.1"23)2425type jobInstanceDefinition struct {26job, instance, host, scheme, port string27}2829type k8sResourceDefinition struct {30podName, podUID, container, node, rs, ds, ss, job, cronjob, ns string31}3233func makeK8sResource(jobInstance *jobInstanceDefinition, def *k8sResourceDefinition) pcommon.Resource {34resource := makeResourceWithJobInstanceScheme(jobInstance, true)35attrs := resource.Attributes()36if def.podName != "" {37attrs.PutStr(conventions.AttributeK8SPodName, def.podName)38}39if def.podUID != "" {40attrs.PutStr(conventions.AttributeK8SPodUID, def.podUID)41}42if def.container != "" {43attrs.PutStr(conventions.AttributeK8SContainerName, def.container)44}45if def.node != "" {46attrs.PutStr(conventions.AttributeK8SNodeName, def.node)47}48if def.rs != "" {49attrs.PutStr(conventions.AttributeK8SReplicaSetName, def.rs)50}51if def.ds != "" {52attrs.PutStr(conventions.AttributeK8SDaemonSetName, def.ds)53}54if def.ss != "" {55attrs.PutStr(conventions.AttributeK8SStatefulSetName, def.ss)56}57if def.job != "" {58attrs.PutStr(conventions.AttributeK8SJobName, def.job)59}60if def.cronjob != "" {61attrs.PutStr(conventions.AttributeK8SCronJobName, def.cronjob)62}63if def.ns != "" {64attrs.PutStr(conventions.AttributeK8SNamespaceName, def.ns)65}66return resource67}6869func makeResourceWithJobInstanceScheme(def *jobInstanceDefinition, hasHost bool) pcommon.Resource {70resource := pcommon.NewResource()71attrs := resource.Attributes()72// Using hardcoded values to assert on outward expectations so that73// when variables change, these tests will fail and we'll have reports.74attrs.PutStr("service.name", def.job)75if hasHost {76attrs.PutStr("net.host.name", def.host)77}78attrs.PutStr("service.instance.id", def.instance)79attrs.PutStr("net.host.port", def.port)80attrs.PutStr("http.scheme", def.scheme)81return resource82}8384func TestCreateNodeAndResourcePromToOTLP(t *testing.T) {85tests := []struct {86name, job string87instance string88sdLabels labels.Labels89want pcommon.Resource90}{91{92name: "all attributes proper",93job: "job", instance: "hostname:8888", sdLabels: labels.New(labels.Label{Name: "__scheme__", Value: "http"}),94want: makeResourceWithJobInstanceScheme(&jobInstanceDefinition{95"job", "hostname:8888", "hostname", "http", "8888",96}, true),97},98{99name: "missing port",100job: "job", instance: "myinstance", sdLabels: labels.New(labels.Label{Name: "__scheme__", Value: "https"}),101want: makeResourceWithJobInstanceScheme(&jobInstanceDefinition{102"job", "myinstance", "myinstance", "https", "",103}, true),104},105{106name: "blank scheme",107job: "job", instance: "myinstance:443", sdLabels: labels.New(labels.Label{Name: "__scheme__", Value: ""}),108want: makeResourceWithJobInstanceScheme(&jobInstanceDefinition{109"job", "myinstance:443", "myinstance", "", "443",110}, true),111},112{113name: "blank instance, blank scheme",114job: "job", instance: "", sdLabels: labels.New(labels.Label{Name: "__scheme__", Value: ""}),115want: makeResourceWithJobInstanceScheme(&jobInstanceDefinition{116"job", "", "", "", "",117}, true),118},119{120name: "blank instance, non-blank scheme",121job: "job", instance: "", sdLabels: labels.New(labels.Label{Name: "__scheme__", Value: "http"}),122want: makeResourceWithJobInstanceScheme(&jobInstanceDefinition{123"job", "", "", "http", "",124}, true),125},126{127name: "0.0.0.0 address",128job: "job", instance: "0.0.0.0:8888", sdLabels: labels.New(labels.Label{Name: "__scheme__", Value: "http"}),129want: makeResourceWithJobInstanceScheme(&jobInstanceDefinition{130"job", "0.0.0.0:8888", "", "http", "8888",131}, false),132},133{134name: "localhost",135job: "job", instance: "localhost:8888", sdLabels: labels.New(labels.Label{Name: "__scheme__", Value: "http"}),136want: makeResourceWithJobInstanceScheme(&jobInstanceDefinition{137"job", "localhost:8888", "", "http", "8888",138}, false),139},140{141name: "kubernetes daemonset pod",142job: "job", instance: "hostname:8888", sdLabels: labels.New(143labels.Label{Name: "__scheme__", Value: "http"},144labels.Label{Name: "__meta_kubernetes_pod_name", Value: "my-pod-23491"},145labels.Label{Name: "__meta_kubernetes_pod_uid", Value: "84279wretgu89dg489q2"},146labels.Label{Name: "__meta_kubernetes_pod_container_name", Value: "my-container"},147labels.Label{Name: "__meta_kubernetes_pod_node_name", Value: "k8s-node-123"},148labels.Label{Name: "__meta_kubernetes_pod_controller_name", Value: "my-pod"},149labels.Label{Name: "__meta_kubernetes_pod_controller_kind", Value: "DaemonSet"},150labels.Label{Name: "__meta_kubernetes_namespace", Value: "kube-system"},151),152want: makeK8sResource(&jobInstanceDefinition{153"job", "hostname:8888", "hostname", "http", "8888",154}, &k8sResourceDefinition{155podName: "my-pod-23491",156podUID: "84279wretgu89dg489q2",157container: "my-container",158node: "k8s-node-123",159ds: "my-pod",160ns: "kube-system",161}),162},163{164name: "kubernetes replicaset pod",165job: "job", instance: "hostname:8888", sdLabels: labels.New(166labels.Label{Name: "__scheme__", Value: "http"},167labels.Label{Name: "__meta_kubernetes_pod_name", Value: "my-pod-23491"},168labels.Label{Name: "__meta_kubernetes_pod_uid", Value: "84279wretgu89dg489q2"},169labels.Label{Name: "__meta_kubernetes_pod_container_name", Value: "my-container"},170labels.Label{Name: "__meta_kubernetes_pod_node_name", Value: "k8s-node-123"},171labels.Label{Name: "__meta_kubernetes_pod_controller_name", Value: "my-pod"},172labels.Label{Name: "__meta_kubernetes_pod_controller_kind", Value: "ReplicaSet"},173labels.Label{Name: "__meta_kubernetes_namespace", Value: "kube-system"},174),175want: makeK8sResource(&jobInstanceDefinition{176"job", "hostname:8888", "hostname", "http", "8888",177}, &k8sResourceDefinition{178podName: "my-pod-23491",179podUID: "84279wretgu89dg489q2",180container: "my-container",181node: "k8s-node-123",182rs: "my-pod",183ns: "kube-system",184}),185},186{187name: "kubernetes statefulset pod",188job: "job", instance: "hostname:8888", sdLabels: labels.New(189labels.Label{Name: "__scheme__", Value: "http"},190labels.Label{Name: "__meta_kubernetes_pod_name", Value: "my-pod-23491"},191labels.Label{Name: "__meta_kubernetes_pod_uid", Value: "84279wretgu89dg489q2"},192labels.Label{Name: "__meta_kubernetes_pod_container_name", Value: "my-container"},193labels.Label{Name: "__meta_kubernetes_pod_node_name", Value: "k8s-node-123"},194labels.Label{Name: "__meta_kubernetes_pod_controller_name", Value: "my-pod"},195labels.Label{Name: "__meta_kubernetes_pod_controller_kind", Value: "StatefulSet"},196labels.Label{Name: "__meta_kubernetes_namespace", Value: "kube-system"},197),198want: makeK8sResource(&jobInstanceDefinition{199"job", "hostname:8888", "hostname", "http", "8888",200}, &k8sResourceDefinition{201podName: "my-pod-23491",202podUID: "84279wretgu89dg489q2",203container: "my-container",204node: "k8s-node-123",205ss: "my-pod",206ns: "kube-system",207}),208},209{210name: "kubernetes job pod",211job: "job", instance: "hostname:8888", sdLabels: labels.New(212labels.Label{Name: "__scheme__", Value: "http"},213labels.Label{Name: "__meta_kubernetes_pod_name", Value: "my-pod-23491"},214labels.Label{Name: "__meta_kubernetes_pod_uid", Value: "84279wretgu89dg489q2"},215labels.Label{Name: "__meta_kubernetes_pod_container_name", Value: "my-container"},216labels.Label{Name: "__meta_kubernetes_pod_node_name", Value: "k8s-node-123"},217labels.Label{Name: "__meta_kubernetes_pod_controller_name", Value: "my-pod"},218labels.Label{Name: "__meta_kubernetes_pod_controller_kind", Value: "Job"},219labels.Label{Name: "__meta_kubernetes_namespace", Value: "kube-system"},220),221want: makeK8sResource(&jobInstanceDefinition{222"job", "hostname:8888", "hostname", "http", "8888",223}, &k8sResourceDefinition{224podName: "my-pod-23491",225podUID: "84279wretgu89dg489q2",226container: "my-container",227node: "k8s-node-123",228job: "my-pod",229ns: "kube-system",230}),231},232{233name: "kubernetes cronjob pod",234job: "job", instance: "hostname:8888", sdLabels: labels.New(235labels.Label{Name: "__scheme__", Value: "http"},236labels.Label{Name: "__meta_kubernetes_pod_name", Value: "my-pod-23491"},237labels.Label{Name: "__meta_kubernetes_pod_uid", Value: "84279wretgu89dg489q2"},238labels.Label{Name: "__meta_kubernetes_pod_container_name", Value: "my-container"},239labels.Label{Name: "__meta_kubernetes_pod_node_name", Value: "k8s-node-123"},240labels.Label{Name: "__meta_kubernetes_pod_controller_name", Value: "my-pod"},241labels.Label{Name: "__meta_kubernetes_pod_controller_kind", Value: "CronJob"},242labels.Label{Name: "__meta_kubernetes_namespace", Value: "kube-system"},243),244want: makeK8sResource(&jobInstanceDefinition{245"job", "hostname:8888", "hostname", "http", "8888",246}, &k8sResourceDefinition{247podName: "my-pod-23491",248podUID: "84279wretgu89dg489q2",249container: "my-container",250node: "k8s-node-123",251cronjob: "my-pod",252ns: "kube-system",253}),254},255{256name: "kubernetes node (e.g. kubelet)",257job: "job", instance: "hostname:8888", sdLabels: labels.New(258labels.Label{Name: "__scheme__", Value: "http"},259labels.Label{Name: "__meta_kubernetes_node_name", Value: "k8s-node-123"},260),261want: makeK8sResource(&jobInstanceDefinition{262"job", "hostname:8888", "hostname", "http", "8888",263}, &k8sResourceDefinition{264node: "k8s-node-123",265}),266},267{268name: "kubernetes service endpoint",269job: "job", instance: "hostname:8888", sdLabels: labels.New(270labels.Label{Name: "__scheme__", Value: "http"},271labels.Label{Name: "__meta_kubernetes_endpoint_node_name", Value: "k8s-node-123"},272),273want: makeK8sResource(&jobInstanceDefinition{274"job", "hostname:8888", "hostname", "http", "8888",275}, &k8sResourceDefinition{276node: "k8s-node-123",277}),278},279}280281for _, tt := range tests {282tt := tt283t.Run(tt.name, func(t *testing.T) {284got := CreateResource(tt.job, tt.instance, tt.sdLabels)285got.Attributes().Sort()286tt.want.Attributes().Sort()287require.Equal(t, tt.want, got)288})289}290}291292293