Переглянути джерело

Update arg to allow no value

Signed-off-by: Sean Holcomb <seanholcomb@gmail.com>
Sean Holcomb 2 тижнів тому
батько
коміт
3353d5ff5f

+ 4 - 4
core/pkg/util/args.go

@@ -7,17 +7,17 @@ import (
 )
 
 // ParseContainerArgs extracts "--key=value" style arguments from the given containers into a
-// flat map. Args without a "=" (bare flags) are skipped. Args are merged across all containers;
-// on key collision, the last container/arg seen wins.
+// flat map. Bare flags without a "=" (e.g. "--verbose") are recorded with an empty value. Args
+// are merged across all containers; on key collision, the last container/arg seen wins.
 func ParseContainerArgs(containers []v1.Container) map[string]string {
 	args := make(map[string]string)
 	for _, container := range containers {
 		for _, arg := range container.Args {
 			trimmed := strings.TrimLeft(arg, "-")
-			key, value, ok := strings.Cut(trimmed, "=")
-			if !ok || key == "" {
+			if trimmed == "" {
 				continue
 			}
+			key, value, _ := strings.Cut(trimmed, "=")
 			args[key] = value
 		}
 	}

+ 5 - 1
modules/collector-source/pkg/scrape/clustercache.go

@@ -912,7 +912,11 @@ func (ccs *ClusterCacheScraper) scrapeDaemonSets(daemonSets []*clustercache.Daem
 		})
 
 		// daemonSet arguments
-		for arg, value := range coreutil.ParseContainerArgs(daemonSet.SpecContainers) {
+		daemonSetArguments := coreutil.ParseContainerArgs(daemonSet.SpecContainers)
+		argKeys := maps.Keys(daemonSetArguments)
+		slices.Sort(argKeys)
+		for _, arg := range argKeys {
+			value := daemonSetArguments[arg]
 			argLabels := map[string]string{
 				source.UIDLabel:          string(daemonSet.UID),
 				source.NamespaceUIDLabel: string(nsUID),

+ 18 - 0
modules/collector-source/pkg/scrape/clustercache_test.go

@@ -2445,6 +2445,24 @@ func Test_kubernetesScraper_scrapeDaemonSets(t *testing.T) {
 					Value:          0,
 					AdditionalInfo: map[string]string{},
 				},
+				{
+					Name: metric.DaemonSetArguments,
+					Labels: map[string]string{
+						source.UIDLabel:          "uuid1",
+						source.NamespaceUIDLabel: "",
+						source.DaemonSetLabel:    "daemonSet1",
+						source.ArgLabel:          "bare-flag",
+						source.ValueLabel:        "",
+					},
+					Value: 0,
+					AdditionalInfo: map[string]string{
+						source.UIDLabel:          "uuid1",
+						source.NamespaceUIDLabel: "",
+						source.DaemonSetLabel:    "daemonSet1",
+						source.ArgLabel:          "bare-flag",
+						source.ValueLabel:        "",
+					},
+				},
 				{
 					Name: metric.DaemonSetArguments,
 					Labels: map[string]string{

+ 5 - 2
pkg/metrics/kubemodel.go

@@ -2,6 +2,8 @@ package metrics
 
 import (
 	"fmt"
+	"maps"
+	"slices"
 
 	"github.com/opencost/opencost/core/pkg/clustercache"
 	"github.com/opencost/opencost/core/pkg/clusters"
@@ -381,13 +383,14 @@ func (c KubeModelCollector) scrapeDaemonSets(
 			out = append(out, kubeAnnotationsMetric("daemonset_annotations", string(ds.UID), ds.Annotations))
 		}
 		if emitArgs {
-			for arg, value := range coreutil.ParseContainerArgs(ds.SpecContainers) {
+			daemonSetArguments := coreutil.ParseContainerArgs(ds.SpecContainers)
+			for _, arg := range slices.Sorted(maps.Keys(daemonSetArguments)) {
 				out = append(out, newInfoMetric("daemonset_arguments", map[string]string{
 					"uid":           string(ds.UID),
 					"namespace_uid": string(nsUID),
 					"daemonset":     ds.Name,
 					"arg":           arg,
-					"value":         value,
+					"value":         daemonSetArguments[arg],
 				}))
 			}
 		}