diff --git a/.gitlab/functional_test/regression_detector.yml b/.gitlab/functional_test/regression_detector.yml index fb4e05400fb748..8a22231531ccfa 100644 --- a/.gitlab/functional_test/regression_detector.yml +++ b/.gitlab/functional_test/regression_detector.yml @@ -174,6 +174,7 @@ single_machine_performance-regression_detector-merge_base_check: --comparison-sha ${CI_COMMIT_SHA} \ --target-config-dir test/regression/ \ --submission-metadata submission_metadata \ + --replicas 20 \ --tags ${SMP_TAGS} || { exit_code=$? echo "smp job submit command failed with code $exit_code" diff --git a/comp/core/autodiscovery/common/utils/prometheus_apiserver.go b/comp/core/autodiscovery/common/utils/prometheus_apiserver.go index bd9a8824471e3a..5d07b6414b7bc7 100644 --- a/comp/core/autodiscovery/common/utils/prometheus_apiserver.go +++ b/comp/core/autodiscovery/common/utils/prometheus_apiserver.go @@ -8,6 +8,8 @@ package utils import ( + "fmt" + "github.com/DataDog/datadog-agent/comp/core/autodiscovery/common/types" "github.com/DataDog/datadog-agent/comp/core/autodiscovery/integration" "github.com/DataDog/datadog-agent/comp/core/autodiscovery/providers/names" @@ -26,7 +28,7 @@ const ( // ConfigsForService returns the openmetrics configurations for a given service if it matches the AD configuration func ConfigsForService(pc *types.PrometheusCheck, svc *v1.Service) []integration.Config { var configs []integration.Config - namespacedName := svc.GetNamespace() + "/" + svc.GetName() + namespacedName := fmt.Sprintf("%s/%s", svc.GetNamespace(), svc.GetName()) // Ignore headless services because we can't resolve the IP. // Ref: https://kubernetes.io/docs/concepts/services-networking/service/#headless-services @@ -56,7 +58,7 @@ func ConfigsForService(pc *types.PrometheusCheck, svc *v1.Service) []integration // configuration for related service func ConfigsForServiceEndpoints(pc *types.PrometheusCheck, svc *v1.Service, ep *v1.Endpoints) []integration.Config { var configs []integration.Config - namespacedName := svc.GetNamespace() + "/" + svc.GetName() + namespacedName := fmt.Sprintf("%s/%s", svc.GetNamespace(), svc.GetName()) instances, found := buildInstances(pc, svc.GetAnnotations(), namespacedName) if found { for _, subset := range ep.Subsets { diff --git a/comp/core/autodiscovery/common/utils/prometheus_pods.go b/comp/core/autodiscovery/common/utils/prometheus_pods.go index 63a3e960b7b10a..cd0326fa41b545 100644 --- a/comp/core/autodiscovery/common/utils/prometheus_pods.go +++ b/comp/core/autodiscovery/common/utils/prometheus_pods.go @@ -22,7 +22,7 @@ import ( // ConfigsForPod returns the openmetrics configurations for a given pod if it matches the AD configuration func ConfigsForPod(pc *types.PrometheusCheck, pod *workloadmeta.KubernetesPod, wmeta workloadmeta.Component) ([]integration.Config, error) { var configs []integration.Config - namespacedName := pod.Namespace + "/" + pod.Name + namespacedName := fmt.Sprintf("%s/%s", pod.Namespace, pod.Name) if pc.IsExcluded(pod.Annotations, namespacedName) { return nil, nil } diff --git a/comp/core/autodiscovery/listeners/common.go b/comp/core/autodiscovery/listeners/common.go index 40ace0217f2f39..fe5eadf9618800 100644 --- a/comp/core/autodiscovery/listeners/common.go +++ b/comp/core/autodiscovery/listeners/common.go @@ -8,6 +8,7 @@ package listeners import ( + "fmt" "hash/fnv" "maps" "strconv" @@ -30,18 +31,18 @@ const ( // getStandardTags extract standard tags from labels of kubernetes services func getStandardTags(labels map[string]string) []string { + tags := []string{} if labels == nil { - return []string{} + return tags } labelToTagKeys := map[string]string{ kubernetes.EnvTagLabelKey: tagKeyEnv, kubernetes.VersionTagLabelKey: tagKeyVersion, kubernetes.ServiceTagLabelKey: tagKeyService, } - tags := make([]string, 0, len(labelToTagKeys)) for labelKey, tagKey := range labelToTagKeys { if tagValue, found := labels[labelKey]; found { - tags = append(tags, tagKey+":"+tagValue) + tags = append(tags, fmt.Sprintf("%s:%s", tagKey, tagValue)) } } return tags diff --git a/comp/core/tagger/collectors/workloadmeta_extract.go b/comp/core/tagger/collectors/workloadmeta_extract.go index ddf8fd25bcb9d4..94c323713d9a68 100644 --- a/comp/core/tagger/collectors/workloadmeta_extract.go +++ b/comp/core/tagger/collectors/workloadmeta_extract.go @@ -220,7 +220,7 @@ func (c *WorkloadMetaCollector) handleContainer(ev workloadmeta.Event) []*types. if container.Runtime == workloadmeta.ContainerRuntimeDocker { if image.Tag != "" { - tagList.AddLow(tags.DockerImage, image.Name+":"+image.Tag) + tagList.AddLow(tags.DockerImage, fmt.Sprintf("%s:%s", image.Name, image.Tag)) } else { tagList.AddLow(tags.DockerImage, image.Name) } @@ -840,9 +840,9 @@ func (c *WorkloadMetaCollector) extractTagsFromPodContainer(pod *workloadmeta.Ku tagList.AddHigh(tags.ContainerID, container.ID) if container.Name != "" && pod.Name != "" { - tagList.AddHigh(tags.DisplayContainerName, container.Name+"_"+pod.Name) + tagList.AddHigh(tags.DisplayContainerName, fmt.Sprintf("%s_%s", container.Name, pod.Name)) } else if podContainer.Name != "" && pod.Name != "" { - tagList.AddHigh(tags.DisplayContainerName, podContainer.Name+"_"+pod.Name) + tagList.AddHigh(tags.DisplayContainerName, fmt.Sprintf("%s_%s", podContainer.Name, pod.Name)) } image := podContainer.Image @@ -977,7 +977,7 @@ func (c *WorkloadMetaCollector) addOpenTelemetryStandardTags(container *workload } func buildTaggerSource(entityID workloadmeta.EntityID) string { - return workloadmetaCollectorName + "-" + string(entityID.Kind) + return fmt.Sprintf("%s-%s", workloadmetaCollectorName, string(entityID.Kind)) } func parseJSONValue(value string, tags *taglist.TagList) error { diff --git a/comp/core/tagger/taglist/taglist.go b/comp/core/tagger/taglist/taglist.go index 01d05b2bb9ca65..8ffbc2bd7985bf 100644 --- a/comp/core/tagger/taglist/taglist.go +++ b/comp/core/tagger/taglist/taglist.go @@ -7,6 +7,7 @@ package taglist import ( + "fmt" "maps" "strings" "unique" @@ -45,13 +46,13 @@ func addTags(target map[string]bool, name string, value string, splits map[strin // common for tags like "kube_namespace", "pod_phase", "env", // "kube_qos", etc. Using the unique package helps optimize memory usage // in such cases. - key := unique.Make(name + ":" + value) + key := unique.Make(fmt.Sprintf("%s:%s", name, value)) target[key.Value()] = true return } for _, elt := range strings.Split(value, sep) { - key := unique.Make(name + ":" + elt) + key := unique.Make(fmt.Sprintf("%s:%s", name, elt)) target[key.Value()] = true } } diff --git a/pkg/clusteragent/admission/common/lib_config.go b/pkg/clusteragent/admission/common/lib_config.go index c9bf685c7d3988..255d5802c48493 100644 --- a/pkg/clusteragent/admission/common/lib_config.go +++ b/pkg/clusteragent/admission/common/lib_config.go @@ -113,9 +113,9 @@ func (lc LibConfig) ToEnvs() []corev1.EnvVar { }) } if lc.TracingServiceMapping != nil { - pairs := make([]string, len(lc.TracingServiceMapping)) - for i, m := range lc.TracingServiceMapping { - pairs[i] = m.FromKey + ":" + m.ToName + pairs := make([]string, 0, len(lc.TracingServiceMapping)) + for _, m := range lc.TracingServiceMapping { + pairs = append(pairs, fmt.Sprintf("%s:%s", m.FromKey, m.ToName)) } envs = append(envs, corev1.EnvVar{ Name: "DD_TRACE_SERVICE_MAPPING", @@ -129,9 +129,9 @@ func (lc LibConfig) ToEnvs() []corev1.EnvVar { }) } if lc.TracingHeaderTags != nil { - pairs := make([]string, len(lc.TracingHeaderTags)) - for i, m := range lc.TracingHeaderTags { - pairs[i] = m.Header + ":" + m.TagName + pairs := make([]string, 0, len(lc.TracingHeaderTags)) + for _, m := range lc.TracingHeaderTags { + pairs = append(pairs, fmt.Sprintf("%s:%s", m.Header, m.TagName)) } envs = append(envs, corev1.EnvVar{ Name: "DD_TRACE_HEADER_TAGS", diff --git a/pkg/clusteragent/admission/controllers/secret/controller.go b/pkg/clusteragent/admission/controllers/secret/controller.go index a628ba36f4c717..38e80e0851d124 100644 --- a/pkg/clusteragent/admission/controllers/secret/controller.go +++ b/pkg/clusteragent/admission/controllers/secret/controller.go @@ -114,7 +114,7 @@ func (c *Controller) enqueueOnLeaderNotif(stop <-chan struct{}) { // triggerReconciliation forces a reconciliation loop by enqueuing the secret object namespaced name. func (c *Controller) triggerReconciliation() { - c.queue.Add(c.config.GetNs() + "/" + c.config.GetName()) + c.queue.Add(fmt.Sprintf("%s/%s", c.config.GetNs(), c.config.GetName())) } // handleObject enqueues the targeted Secret object when an event occurs. diff --git a/pkg/clusteragent/admission/controllers/webhook/config.go b/pkg/clusteragent/admission/controllers/webhook/config.go index 7614c5960e66fe..4f5e5494345573 100644 --- a/pkg/clusteragent/admission/controllers/webhook/config.go +++ b/pkg/clusteragent/admission/controllers/webhook/config.go @@ -10,6 +10,7 @@ package webhook import ( + "fmt" "strings" "github.com/DataDog/datadog-agent/comp/core/config" @@ -68,7 +69,7 @@ func (w *Config) getTimeout() int32 { return w.timeout } func (w *Config) getFailurePolicy() string { return w.failurePolicy } func (w *Config) getReinvocationPolicy() string { return w.reinvocationPolicy } func (w *Config) configName(suffix string) string { - name := strings.ReplaceAll(w.webhookName+"."+suffix, "-", ".") + name := strings.ReplaceAll(fmt.Sprintf("%s.%s", w.webhookName, suffix), "-", ".") name = strings.ReplaceAll(name, "_", ".") return name } diff --git a/pkg/clusteragent/admission/mutate/common/common.go b/pkg/clusteragent/admission/mutate/common/common.go index 5225dfdb20b383..7b1da9f1a46d5c 100644 --- a/pkg/clusteragent/admission/mutate/common/common.go +++ b/pkg/clusteragent/admission/mutate/common/common.go @@ -178,7 +178,7 @@ func PodString(pod *corev1.Pod) string { if pod.GetNamespace() == "" || pod.GetName() == "" { return "with generate name " + pod.GetGenerateName() } - return pod.GetNamespace() + "/" + pod.GetName() + return fmt.Sprintf("%s/%s", pod.GetNamespace(), pod.GetName()) } // containsVolumeMount returns whether a list of volume mounts contains diff --git a/pkg/clusteragent/admission/status.go b/pkg/clusteragent/admission/status.go index 599ec3a6a4e9b2..9c517dd3bc7847 100644 --- a/pkg/clusteragent/admission/status.go +++ b/pkg/clusteragent/admission/status.go @@ -39,7 +39,7 @@ func GetStatus(apiCl kubernetes.Interface) map[string]interface{} { webhookName := pkgconfigsetup.Datadog().GetString("admission_controller.webhook_name") secretName := pkgconfigsetup.Datadog().GetString("admission_controller.certificate.secret_name") status["WebhookName"] = webhookName - status["SecretName"] = ns + "/" + secretName + status["SecretName"] = fmt.Sprintf("%s/%s", ns, secretName) validatingWebhookStatus, err := getValidatingWebhookStatus(webhookName, apiCl) if err != nil { diff --git a/pkg/clusteragent/admission/validate/kubernetesadmissionevents/kubernetesadmissionevents.go b/pkg/clusteragent/admission/validate/kubernetesadmissionevents/kubernetesadmissionevents.go index 85e3a0b4462096..fbd052c46d2f3b 100644 --- a/pkg/clusteragent/admission/validate/kubernetesadmissionevents/kubernetesadmissionevents.go +++ b/pkg/clusteragent/admission/validate/kubernetesadmissionevents/kubernetesadmissionevents.go @@ -194,10 +194,10 @@ func generateDatadogEvent(request *admission.Request, webhookName string) (event // Add labels to the tags. for key, value := range newResource.GetLabels() { - tags = append(tags, key+":"+value) + tags = append(tags, fmt.Sprintf("%s:%s", key, value)) } for key, value := range oldResource.GetLabels() { - tags = append(tags, key+":"+value) + tags = append(tags, fmt.Sprintf("%s:%s", key, value)) } return event.Event{ diff --git a/pkg/clusteragent/appsec/envoygateway/envoy.go b/pkg/clusteragent/appsec/envoygateway/envoy.go index 8eaf239b844585..a77a5c326541bb 100644 --- a/pkg/clusteragent/appsec/envoygateway/envoy.go +++ b/pkg/clusteragent/appsec/envoygateway/envoy.go @@ -52,7 +52,7 @@ type envoyGatewayInjectionPattern struct { func (e *envoyGatewayInjectionPattern) IsInjectionPossible(ctx context.Context) error { gvrToName := func(gvr schema.GroupVersionResource) string { - return gvr.Resource + "." + gvr.Group + return fmt.Sprintf("%s.%s", gvr.Resource, gvr.Group) } // Check if the EnvoyExtensionPolicy CRD is present diff --git a/pkg/clusteragent/appsec/istio/istio.go b/pkg/clusteragent/appsec/istio/istio.go index 536584a1fec1e2..ee71d739bf5841 100644 --- a/pkg/clusteragent/appsec/istio/istio.go +++ b/pkg/clusteragent/appsec/istio/istio.go @@ -51,7 +51,7 @@ type istioInjectionPattern struct { func (i *istioInjectionPattern) IsInjectionPossible(ctx context.Context) error { gvrToName := func(gvr schema.GroupVersionResource) string { - return gvr.Resource + "." + gvr.Group + return fmt.Sprintf("%s.%s", gvr.Resource, gvr.Group) } // Check if the EnvoyFilter CRD is present @@ -191,7 +191,7 @@ func (i *istioInjectionPattern) createEnvoyFilter(ctx context.Context, namespace func (i *istioInjectionPattern) newFilter(namespace string) istiov1alpha3.EnvoyFilter { const clusterName = "datadog_appsec_ext_proc_cluster" - processorAddress := i.config.Processor.ServiceName + "." + i.config.Processor.Namespace + ".svc" + processorAddress := fmt.Sprintf("%s.%s.svc", i.config.Processor.ServiceName, i.config.Processor.Namespace) httpFilterPatch, err := i.buildHTTPFilterPatch(clusterName) if err != nil { diff --git a/pkg/clusteragent/autoscaling/externalmetrics/utils.go b/pkg/clusteragent/autoscaling/externalmetrics/utils.go index f3c3319660f4bf..6a3f4fc270fa25 100644 --- a/pkg/clusteragent/autoscaling/externalmetrics/utils.go +++ b/pkg/clusteragent/autoscaling/externalmetrics/utils.go @@ -80,13 +80,13 @@ func buildDatadogQueryForExternalMetric(metricName string, labels map[string]str if len(labels) == 0 { result = metricName + "{*}" } else { - datadogTags := make([]string, 0, len(labels)) + datadogTags := []string{} for key, val := range labels { - datadogTags = append(datadogTags, key+":"+val) + datadogTags = append(datadogTags, fmt.Sprintf("%s:%s", key, val)) } sort.Strings(datadogTags) tags := strings.Join(datadogTags, ",") - result = metricName + "{" + tags + "}" + result = fmt.Sprintf("%s{%s}", metricName, tags) } return fmt.Sprintf("%s:%s.rollup(%d)", queryConfigAggregator, result, queryConfigRollup) diff --git a/pkg/clusteragent/clusterchecks/dispatcher_main.go b/pkg/clusteragent/clusterchecks/dispatcher_main.go index 048c3956e8013d..bdbfbd0b8b396d 100644 --- a/pkg/clusteragent/clusterchecks/dispatcher_main.go +++ b/pkg/clusteragent/clusterchecks/dispatcher_main.go @@ -9,6 +9,7 @@ package clusterchecks import ( "context" + "fmt" "sync" "sync/atomic" "time" @@ -72,7 +73,7 @@ func newDispatcher(tagger tagger.Component) *dispatcher { clusterTagName := pkgconfigsetup.Datadog().GetString("cluster_checks.cluster_tag_name") if clusterTagValue != "" { if clusterTagName != "" && !pkgconfigsetup.Datadog().GetBool("disable_cluster_name_tag_key") { - d.extraTags = append(d.extraTags, clusterTagName+":"+clusterTagValue) + d.extraTags = append(d.extraTags, fmt.Sprintf("%s:%s", clusterTagName, clusterTagValue)) log.Info("Adding both tags cluster_name and kube_cluster_name. You can use 'disable_cluster_name_tag_key' in the Agent config to keep the kube_cluster_name tag only") } d.extraTags = append(d.extraTags, tags.KubeClusterName+":"+clusterTagValue) diff --git a/pkg/clusteragent/languagedetection/patcher.go b/pkg/clusteragent/languagedetection/patcher.go index 84c37c8cf31b44..fa412cb4f80ea1 100644 --- a/pkg/clusteragent/languagedetection/patcher.go +++ b/pkg/clusteragent/languagedetection/patcher.go @@ -265,7 +265,7 @@ func (lp *languagePatcher) processOwner(ctx context.Context, owner langUtil.Name } func (lp *languagePatcher) handleDeployment(ctx context.Context, owner langUtil.NamespacedOwnerReference) error { - deploymentID := owner.Namespace + "/" + owner.Name + deploymentID := fmt.Sprintf("%s/%s", owner.Namespace, owner.Name) // get the complete entity deployment, err := lp.store.GetKubernetesDeployment(deploymentID) diff --git a/pkg/collector/corechecks/cluster/helm/helm.go b/pkg/collector/corechecks/cluster/helm/helm.go index 846127286abb1e..000995adb70197 100644 --- a/pkg/collector/corechecks/cluster/helm/helm.go +++ b/pkg/collector/corechecks/cluster/helm/helm.go @@ -254,7 +254,7 @@ func (hc *HelmCheck) tagsForMetricsAndEvents(release *release, includeRevision b log.Tracef("Value for %s specified in helm_values_as_tags not found", helmValue) continue } - tags = append(tags, tagName+":"+value) + tags = append(tags, fmt.Sprintf("%s:%s", tagName, value)) } return tags @@ -266,7 +266,7 @@ func (hc *HelmCheck) tagsForMetricsAndEvents(release *release, includeRevision b func commonTags(release *release, storageDriver helmStorage) []string { tags := []string{ "helm_release:" + release.Name, - "helm_storage:" + string(storageDriver), + fmt.Sprintf("helm_storage:%s", storageDriver), "kube_namespace:" + release.Namespace, // "helm_namespace" is just an alias for "kube_namespace". diff --git a/pkg/collector/corechecks/cluster/helm/release.go b/pkg/collector/corechecks/cluster/helm/release.go index da450cfcd8b236..0131491ac2a152 100644 --- a/pkg/collector/corechecks/cluster/helm/release.go +++ b/pkg/collector/corechecks/cluster/helm/release.go @@ -42,7 +42,7 @@ type namespacedName string type revision int func (rel *release) namespacedName() namespacedName { - return namespacedName(rel.Namespace + "/" + rel.Name) + return namespacedName(fmt.Sprintf("%s/%s", rel.Namespace, rel.Name)) } func (rel *release) revision() revision { diff --git a/pkg/collector/corechecks/cluster/kubernetesapiserver/events_common.go b/pkg/collector/corechecks/cluster/kubernetesapiserver/events_common.go index 0d60c391516c1e..2f210b5f5edbf6 100644 --- a/pkg/collector/corechecks/cluster/kubernetesapiserver/events_common.go +++ b/pkg/collector/corechecks/cluster/kubernetesapiserver/events_common.go @@ -274,7 +274,7 @@ func getInvolvedObjectTags(involvedObject v1.ObjectReference, taggerInstance tag case podKind: entityID = types.NewEntityID(types.KubernetesPodUID, string(involvedObject.UID)) case deploymentKind: - entityID = types.NewEntityID(types.KubernetesDeployment, involvedObject.Namespace+"/"+involvedObject.Name) + entityID = types.NewEntityID(types.KubernetesDeployment, fmt.Sprintf("%s/%s", involvedObject.Namespace, involvedObject.Name)) default: apiGroup := apiserver.GetAPIGroup(involvedObject.APIVersion) resourceType, err := apiserver.GetResourceType(involvedObject.Kind, apiGroup) @@ -395,7 +395,7 @@ func getKindTag(kind, name string) string { return "" } - return tagName + ":" + name + return fmt.Sprintf("%s:%s", tagName, name) } func buildReadableKey(obj v1.ObjectReference) string { diff --git a/pkg/collector/corechecks/cluster/kubernetesapiserver/kubernetes_eventbundle_test.go b/pkg/collector/corechecks/cluster/kubernetesapiserver/kubernetes_eventbundle_test.go index ad1c7eab5cd80b..bca4524f6a5dd5 100644 --- a/pkg/collector/corechecks/cluster/kubernetesapiserver/kubernetes_eventbundle_test.go +++ b/pkg/collector/corechecks/cluster/kubernetesapiserver/kubernetes_eventbundle_test.go @@ -146,7 +146,7 @@ func TestFormatEvent(t *testing.T) { SourceTypeName: "kubernetes", EventType: CheckName, Ts: timestamp, - Host: nodeName + "-" + clusterName, + Host: fmt.Sprintf("%s-%s", nodeName, clusterName), Tags: []string{ "kube_namespace:default", "kube_kind:Pod", diff --git a/pkg/collector/corechecks/cluster/kubernetesapiserver/unbundled_events.go b/pkg/collector/corechecks/cluster/kubernetesapiserver/unbundled_events.go index 1d52ccab8972ae..fbb5d76222b91a 100644 --- a/pkg/collector/corechecks/cluster/kubernetesapiserver/unbundled_events.go +++ b/pkg/collector/corechecks/cluster/kubernetesapiserver/unbundled_events.go @@ -76,7 +76,7 @@ func (c *unbundledTransformer) Transform(events []*v1.Event) ([]event.Event, []e collectedByDefault := false if c.filteringEnabled { if !shouldCollectByDefault(ev) { - source = source + "_" + customEventSourceSuffix + source = fmt.Sprintf("%s_%s", source, customEventSourceSuffix) } else { collectedByDefault = true } diff --git a/pkg/collector/corechecks/containers/containerd/events.go b/pkg/collector/corechecks/containers/containerd/events.go index aed0c32e95f403..30e4aa528f9ce0 100644 --- a/pkg/collector/corechecks/containers/containerd/events.go +++ b/pkg/collector/corechecks/containers/containerd/events.go @@ -44,9 +44,11 @@ func (c *ContainerdCheck) computeEvents(events []containerdEvent, sender sender. continue } - tags := make([]string, 0, len(e.Extra)) - for k, v := range e.Extra { - tags = append(tags, k+":"+v) + var tags []string + if len(e.Extra) > 0 { + for k, v := range e.Extra { + tags = append(tags, fmt.Sprintf("%s:%s", k, v)) + } } alertType := event.AlertTypeInfo diff --git a/pkg/collector/corechecks/containers/kubelet/common/pod.go b/pkg/collector/corechecks/containers/kubelet/common/pod.go index 484b7bf1dc314b..da295465a436f3 100644 --- a/pkg/collector/corechecks/containers/kubelet/common/pod.go +++ b/pkg/collector/corechecks/containers/kubelet/common/pod.go @@ -94,7 +94,7 @@ func (p *PodUtils) computePodTagsByPVC(pod *workloadmeta.KubernetesPod) { return } - filteredTags := make([]string, 0, len(tags)) + var filteredTags []string for t := range tags { omitTag := false for i := range volumeTagKeysToExclude { @@ -112,7 +112,7 @@ func (p *PodUtils) computePodTagsByPVC(pod *workloadmeta.KubernetesPod) { if v.PersistentVolumeClaim != nil { pvcName := v.PersistentVolumeClaim.ClaimName if pvcName != "" { - p.podTagsByPVC[pod.Namespace+"/"+pvcName] = filteredTags + p.podTagsByPVC[fmt.Sprintf("%s/%s", pod.Namespace, pvcName)] = filteredTags } } @@ -130,7 +130,7 @@ func (p *PodUtils) computePodTagsByPVC(pod *workloadmeta.KubernetesPod) { // GetPodTagsByPVC returns the computed pod tags for a PVC with a given name in a given namespace. func (p *PodUtils) GetPodTagsByPVC(namespace, pvcName string) []string { - return p.podTagsByPVC[namespace+"/"+pvcName] + return p.podTagsByPVC[fmt.Sprintf("%s/%s", namespace, pvcName)] } // IsStaticPendingPod returns whether the pod with the given UID is a static pending pod or not, or returns false diff --git a/pkg/collector/corechecks/containers/kubelet/provider/cadvisor/provider.go b/pkg/collector/corechecks/containers/kubelet/provider/cadvisor/provider.go index ef9b84b035b9dc..5a7fb51032d2c0 100644 --- a/pkg/collector/corechecks/containers/kubelet/provider/cadvisor/provider.go +++ b/pkg/collector/corechecks/containers/kubelet/provider/cadvisor/provider.go @@ -11,6 +11,7 @@ Package cadvisor exposes a metric provider to handle metrics exposed by the /met package cadvisor import ( + "fmt" "math" "strings" @@ -183,7 +184,7 @@ func (p *Provider) processContainerMetric(metricType, metricName string, metricF for _, label := range labels { if value, ok := sample.Metric[model.LabelName(label)]; ok { - tags = append(tags, label+":"+string(value)) + tags = append(tags, fmt.Sprintf("%s:%s", label, value)) } } @@ -226,7 +227,7 @@ func (p *Provider) processPodRate(metricName string, metricFam *prom.MetricFamil for _, label := range labels { if value, ok := sample.Metric[model.LabelName(label)]; ok { - tags = append(tags, label+":"+string(value)) + tags = append(tags, fmt.Sprintf("%s:%s", label, value)) } } @@ -273,7 +274,7 @@ func (p *Provider) processUsageMetric(metricName string, metricFam *prom.MetricF for _, label := range labels { if value, ok := sample.Metric[model.LabelName(label)]; ok { - tags = append(tags, label+":"+string(value)) + tags = append(tags, fmt.Sprintf("%s:%s", label, value)) } } diff --git a/pkg/collector/corechecks/containers/kubelet/provider/prometheus/provider.go b/pkg/collector/corechecks/containers/kubelet/provider/prometheus/provider.go index de27e01817b452..9850f37cac28e9 100644 --- a/pkg/collector/corechecks/containers/kubelet/provider/prometheus/provider.go +++ b/pkg/collector/corechecks/containers/kubelet/provider/prometheus/provider.go @@ -388,7 +388,7 @@ func (p *Provider) ignoreMetricByLabel(metric *model.Sample, metricName string) func (p *Provider) metricNameWithNamespace(metricName string) string { nameWithNamespace := metricName if p.Config.Namespace != "" { - nameWithNamespace = strings.TrimSuffix(p.Config.Namespace, ".") + "." + metricName + nameWithNamespace = fmt.Sprintf("%s.%s", strings.TrimSuffix(p.Config.Namespace, "."), metricName) } return nameWithNamespace } diff --git a/pkg/util/containers/metrics/system/collector_disk_linux.go b/pkg/util/containers/metrics/system/collector_disk_linux.go index 72b9470bacf286..71878b315de7cb 100644 --- a/pkg/util/containers/metrics/system/collector_disk_linux.go +++ b/pkg/util/containers/metrics/system/collector_disk_linux.go @@ -9,6 +9,7 @@ package system import ( "bufio" + "fmt" "os" "path/filepath" "strings" @@ -99,7 +100,7 @@ func GetDiskDeviceMapping(procPath string) (map[string]string, error) { log.Debugf("Malformed line in %s, fields: %v", statfile, fields) continue } - mapping[fields[0]+":"+fields[1]] = fields[2] + mapping[fmt.Sprintf("%s:%s", fields[0], fields[1])] = fields[2] } if err := scanner.Err(); err != nil { log.Debugf("Error while reading %s, disk metrics may be missing, err: %v", statfile, err) diff --git a/pkg/util/kubernetes/apiserver/apiserver.go b/pkg/util/kubernetes/apiserver/apiserver.go index 4ea7f3aa2fe60f..e82be37c7740c2 100644 --- a/pkg/util/kubernetes/apiserver/apiserver.go +++ b/pkg/util/kubernetes/apiserver/apiserver.go @@ -469,7 +469,7 @@ func (c *APIClient) GetTokenFromConfigmap(token string) (string, time.Time, erro // we do not process event if we can't interact with the CM. return "", time.Now(), err } - eventTokenKey := token + "." + tokenKey + eventTokenKey := fmt.Sprintf("%s.%s", token, tokenKey) if cmEvent.Data == nil { cmEvent.Data = make(map[string]string) } @@ -482,7 +482,7 @@ func (c *APIClient) GetTokenFromConfigmap(token string) (string, time.Time, erro } log.Tracef("%s is %q", token, tokenValue) - eventTokenTS := token + "." + tokenTime + eventTokenTS := fmt.Sprintf("%s.%s", token, tokenTime) tokenTimeStr, set := cmEvent.Data[eventTokenTS] if !set { log.Debugf("Could not find timestamp associated with %s in the ConfigMap %s. Refreshing.", eventTokenTS, configMapDCAToken) @@ -507,13 +507,13 @@ func (c *APIClient) UpdateTokenInConfigmap(token, tokenValue string, timestamp t if err != nil { return err } - eventTokenKey := token + "." + tokenKey + eventTokenKey := fmt.Sprintf("%s.%s", token, tokenKey) if tokenConfigMap.Data == nil { tokenConfigMap.Data = make(map[string]string) } tokenConfigMap.Data[eventTokenKey] = tokenValue - eventTokenTS := token + "." + tokenTime + eventTokenTS := fmt.Sprintf("%s.%s", token, tokenTime) tokenConfigMap.Data[eventTokenTS] = timestamp.Format(time.RFC3339) // Timestamps in the ConfigMap should all use the type int. _, err = c.Cl.CoreV1().ConfigMaps(namespace).Update(context.TODO(), tokenConfigMap, metav1.UpdateOptions{}) @@ -604,9 +604,9 @@ func GetPodMetadataNames(nodeName, ns, podName string) ([]string, error) { return nil, nil } log.Tracef("found %d services for the pod %s on the node %s", len(serviceList), podName, nodeName) - metaList := make([]string, len(serviceList)) - for i, s := range serviceList { - metaList[i] = "kube_service:" + s + var metaList []string + for _, s := range serviceList { + metaList = append(metaList, "kube_service:"+s) } return metaList, nil } diff --git a/pkg/util/kubernetes/apiserver/controllers/hpa_controller_test.go b/pkg/util/kubernetes/apiserver/controllers/hpa_controller_test.go index 3959a127ad31a5..0c2f711d984d78 100644 --- a/pkg/util/kubernetes/apiserver/controllers/hpa_controller_test.go +++ b/pkg/util/kubernetes/apiserver/controllers/hpa_controller_test.go @@ -45,7 +45,7 @@ func newClient() kubernetes.Interface { client := fake.NewSimpleClientset() client.Resources = []*metav1.APIResourceList{ { - GroupVersion: autoscalingGroup + "/v2beta1", + GroupVersion: fmt.Sprintf("%s/%s", autoscalingGroup, "v2beta1"), APIResources: []metav1.APIResource{ { Name: hpaResource, diff --git a/pkg/util/kubernetes/apiserver/resourcetypes.go b/pkg/util/kubernetes/apiserver/resourcetypes.go index aa796d8491972e..76e31dd8205b68 100644 --- a/pkg/util/kubernetes/apiserver/resourcetypes.go +++ b/pkg/util/kubernetes/apiserver/resourcetypes.go @@ -314,5 +314,5 @@ func getCacheKey(resource, group string) string { if group == "" { return resource } - return resource + "/" + group + return fmt.Sprintf("%s/%s", resource, group) }