From ac0052c72afa00cd40989d70be55ddd3adf365f4 Mon Sep 17 00:00:00 2001 From: Kristina Pathak Date: Tue, 21 Jul 2026 13:34:08 -0700 Subject: [PATCH 1/8] feat(nvca): wire BYOO SRE metrics config Add NVCA agent config for BYOO SRE metrics collector settings and pass the resulting environment variables through the existing BYOO OTel collector-only injection path. This lets Helm users configure the SRE metrics pipeline through agentConfig.mergeConfig without adding dedicated chart values. Document the mergeConfig shape and extend focused tests for config decoding, env rendering, operator config merging, and collector-only pod mutation. Closes #325 Signed-off-by: Kristina Pathak --- .../nvca-operator/nvca-operator/values.yaml | 14 ++++++ .../cluster-management/configuration.md | 17 +++++++ docs/user/cluster-management/configuration.md | 17 +++++++ .../nvca/internal/miniservice/reconcile.go | 2 +- .../internal/miniservice/reconcile_test.go | 9 ++++ .../util/k8sutil/byoo_log_chunking.go | 9 +++- .../util/k8sutil/byoo_log_chunking_test.go | 6 ++- .../nvca/pkg/nvca/k8scomputebackend.go | 4 +- .../nvca/k8scomputebackend_task_container.go | 4 +- .../reconcile/nvcaagent_reconcile_test.go | 8 +++ .../webhook/miniservice_mutating_webhook.go | 2 +- .../miniservice_mutating_webhook_test.go | 6 ++- .../go/lib/pkg/types/nvca/config/types.go | 50 +++++++++++++++++++ .../nvca/config/zz_generated.deepcopy.go | 22 ++++++++ .../lib/pkg/types/nvca/config/config_test.go | 20 ++++++++ .../pkg/types/nvca/config/deepcopy_test.go | 16 ++++++ .../go/lib/pkg/types/nvca/config/types.go | 50 +++++++++++++++++++ .../lib/pkg/types/nvca/config/types_test.go | 38 ++++++++++++++ .../nvca/config/zz_generated.deepcopy.go | 22 ++++++++ 19 files changed, 305 insertions(+), 11 deletions(-) diff --git a/deploy/helm/nvca-operator/nvca-operator/values.yaml b/deploy/helm/nvca-operator/nvca-operator/values.yaml index 6ffe6c9d3..f52b86406 100644 --- a/deploy/helm/nvca-operator/nvca-operator/values.yaml +++ b/deploy/helm/nvca-operator/nvca-operator/values.yaml @@ -100,6 +100,20 @@ agentConfig: # mergeConfig: | # agent: # logLevel: debug + # + # BYOO SRE metrics example: + # + # mergeConfig: | + # agent: + # byooSREMetrics: + # enabled: true + # filterConfig: | + # error_mode: ignore + # metric_conditions: + # - 'metric.name == "BpsInstrument"' + # customerMetricsDropLabels: + # - sre_metrics_enabled + # - custom_label ## @section resources Resource requests and limits for the nvca-operator container ## @param resources.limits.cpu CPU limit for the nvca-operator container ## @param resources.limits.memory Memory limit for the nvca-operator container diff --git a/docs/ngc-managed/cluster-management/configuration.md b/docs/ngc-managed/cluster-management/configuration.md index 01bbcfc10..baa74bf02 100644 --- a/docs/ngc-managed/cluster-management/configuration.md +++ b/docs/ngc-managed/cluster-management/configuration.md @@ -733,6 +733,23 @@ pod and merged with the generated config at runtime. logLevel: debug ``` +**BYOO SRE metrics example:** + +```yaml + agentConfig: + mergeConfig: | + agent: + byooSREMetrics: + enabled: true + filterConfig: | + error_mode: ignore + metric_conditions: + - 'metric.name == "BpsInstrument"' + customerMetricsDropLabels: + - sre_metrics_enabled + - custom_label +``` + **Apply via Helm:** ```bash diff --git a/docs/user/cluster-management/configuration.md b/docs/user/cluster-management/configuration.md index 4e89780c0..73ea6febe 100644 --- a/docs/user/cluster-management/configuration.md +++ b/docs/user/cluster-management/configuration.md @@ -854,6 +854,23 @@ isolated test clusters that run the LLM request router tunnel without TLS. For the full LLM addon setup, see [LLM Function Enablement](../llm-function-enablement.md). +BYOO SRE metrics example: + +```yaml +agentConfig: + mergeConfig: | + agent: + byooSREMetrics: + enabled: true + filterConfig: | + error_mode: ignore + metric_conditions: + - 'metric.name == "BpsInstrument"' + customerMetricsDropLabels: + - sre_metrics_enabled + - custom_label +``` + Apply via Helm: ```bash diff --git a/src/compute-plane-services/nvca/internal/miniservice/reconcile.go b/src/compute-plane-services/nvca/internal/miniservice/reconcile.go index 81494ced3..283fa5da1 100644 --- a/src/compute-plane-services/nvca/internal/miniservice/reconcile.go +++ b/src/compute-plane-services/nvca/internal/miniservice/reconcile.go @@ -739,7 +739,7 @@ func (r *Reconciler) doInstall(ctx context.Context, } // Apply BYOO telemetry annotations to workload objects for Helm-rendered pods metaInput.EnvVars = append(metaInput.EnvVars, byooEnvs...) - metaInput.OTelCollectorEnvVars = append(metaInput.OTelCollectorEnvVars, r.cfg.Agent.BYOOLogChunking.EnvVars()...) + metaInput.OTelCollectorEnvVars = append(metaInput.OTelCollectorEnvVars, r.cfg.Agent.BYOOOTelCollectorEnvVars()...) } // Task-specific mutators. diff --git a/src/compute-plane-services/nvca/internal/miniservice/reconcile_test.go b/src/compute-plane-services/nvca/internal/miniservice/reconcile_test.go index 7919f39b3..d6141159c 100644 --- a/src/compute-plane-services/nvca/internal/miniservice/reconcile_test.go +++ b/src/compute-plane-services/nvca/internal/miniservice/reconcile_test.go @@ -260,6 +260,11 @@ func TestReconcile_Function(t *testing.T) { DryRun: true, ExporterBatchMaxSizeBytes: &exporterBatchMaxSizeBytes, } + r.cfg.Agent.BYOOSREMetrics = nvcaconfig.BYOOSREMetricsConfig{ + Enabled: true, + FilterConfig: "error_mode: ignore\nmetric_conditions:\n - 'metric.name == \"drop\"'\n", + CustomerMetricsDropLabels: []string{"sre_metrics_enabled", "custom_label"}, + } err := k8sutil.SetConfigDefaultResources(&r.cfg) require.NoError(t, err) r.cfg.Workload.Tolerations = []corev1.Toleration{configuredToleration} @@ -806,6 +811,7 @@ rules: metaEnv[env.Name] = env.Value } assert.NotContains(t, metaEnv, nvcaconfig.BYOOLogChunkMaxBodyBytesEnv) + assert.NotContains(t, metaEnv, nvcaconfig.BYOOSREMetricsEnabledEnv) otelCollectorEnv := map[string]string{} for _, env := range msMeta.OTelCollectorEnvVars { otelCollectorEnv[env.Name] = env.Value @@ -813,6 +819,9 @@ rules: assert.Equal(t, "983040", otelCollectorEnv[nvcaconfig.BYOOLogChunkMaxBodyBytesEnv]) assert.Equal(t, "true", otelCollectorEnv[nvcaconfig.BYOOLogChunkDryRunEnv]) assert.Equal(t, "1000000", otelCollectorEnv[nvcaconfig.BYOOLogExporterBatchMaxSizeBytesEnv]) + assert.Equal(t, "true", otelCollectorEnv[nvcaconfig.BYOOSREMetricsEnabledEnv]) + assert.Contains(t, otelCollectorEnv[nvcaconfig.BYOOSREMetricsFilterConfigEnv], "metric.name") + assert.Equal(t, "sre_metrics_enabled,custom_label", otelCollectorEnv[nvcaconfig.BYOOCustomerMetricsDropLabelsEnv]) assert.Equal(t, nodefeatures.UniformInstanceTypeLabelKey, msMeta.NodeAffinityKey) assert.Equal(t, []corev1.Toleration{configuredToleration}, msMeta.Tolerations) diff --git a/src/compute-plane-services/nvca/internal/util/k8sutil/byoo_log_chunking.go b/src/compute-plane-services/nvca/internal/util/k8sutil/byoo_log_chunking.go index f4cb347ce..429c62924 100644 --- a/src/compute-plane-services/nvca/internal/util/k8sutil/byoo_log_chunking.go +++ b/src/compute-plane-services/nvca/internal/util/k8sutil/byoo_log_chunking.go @@ -22,8 +22,8 @@ import ( corev1 "k8s.io/api/core/v1" ) -// AddBYOOLogChunkingEnvVarsToPodSpec injects env vars into only the BYOO OTel collector container. -func AddBYOOLogChunkingEnvVarsToPodSpec(podSpec *corev1.PodSpec, envs []corev1.EnvVar) { +// AddBYOOOTelCollectorEnvVarsToPodSpec injects env vars into only the BYOO OTel collector container. +func AddBYOOOTelCollectorEnvVarsToPodSpec(podSpec *corev1.PodSpec, envs []corev1.EnvVar) { if len(envs) == 0 { return } @@ -34,3 +34,8 @@ func AddBYOOLogChunkingEnvVarsToPodSpec(podSpec *corev1.PodSpec, envs []corev1.E AddEnvsToContainer(&podSpec.Containers[i], envs...) } } + +// AddBYOOLogChunkingEnvVarsToPodSpec injects env vars into only the BYOO OTel collector container. +func AddBYOOLogChunkingEnvVarsToPodSpec(podSpec *corev1.PodSpec, envs []corev1.EnvVar) { + AddBYOOOTelCollectorEnvVarsToPodSpec(podSpec, envs) +} diff --git a/src/compute-plane-services/nvca/internal/util/k8sutil/byoo_log_chunking_test.go b/src/compute-plane-services/nvca/internal/util/k8sutil/byoo_log_chunking_test.go index ea11ad8ee..d02cbf9c1 100644 --- a/src/compute-plane-services/nvca/internal/util/k8sutil/byoo_log_chunking_test.go +++ b/src/compute-plane-services/nvca/internal/util/k8sutil/byoo_log_chunking_test.go @@ -26,14 +26,16 @@ import ( corev1 "k8s.io/api/core/v1" ) -func TestAddBYOOLogChunkingEnvVarsToPodSpecMutatesOnlyBYOOCollectorContainer(t *testing.T) { +func TestAddBYOOOTelCollectorEnvVarsToPodSpecMutatesOnlyBYOOCollectorContainer(t *testing.T) { envs := []corev1.EnvVar{ {Name: nvcaconfig.BYOOLogChunkMaxBodyBytesEnv, Value: "983040"}, {Name: nvcaconfig.BYOOLogExporterBatchMaxSizeBytesEnv, Value: "1000000"}, + {Name: nvcaconfig.BYOOSREMetricsEnabledEnv, Value: "true"}, } expectedEnv := []corev1.EnvVar{ {Name: nvcaconfig.BYOOLogChunkMaxBodyBytesEnv, Value: "983040"}, {Name: nvcaconfig.BYOOLogExporterBatchMaxSizeBytesEnv, Value: "1000000"}, + {Name: nvcaconfig.BYOOSREMetricsEnabledEnv, Value: "true"}, } pod := &corev1.Pod{ Spec: corev1.PodSpec{ @@ -49,7 +51,7 @@ func TestAddBYOOLogChunkingEnvVarsToPodSpecMutatesOnlyBYOOCollectorContainer(t * }, } - AddBYOOLogChunkingEnvVarsToPodSpec(&pod.Spec, envs) + AddBYOOOTelCollectorEnvVarsToPodSpec(&pod.Spec, envs) assert.Equal(t, expectedEnv, pod.Spec.Containers[0].Env) assert.Empty(t, pod.Spec.Containers[1].Env) diff --git a/src/compute-plane-services/nvca/pkg/nvca/k8scomputebackend.go b/src/compute-plane-services/nvca/pkg/nvca/k8scomputebackend.go index 3988e2296..10eb40fb4 100644 --- a/src/compute-plane-services/nvca/pkg/nvca/k8scomputebackend.go +++ b/src/compute-plane-services/nvca/pkg/nvca/k8scomputebackend.go @@ -317,13 +317,13 @@ func (c K8sComputeBackend) translateFunctionLaunchSpecification( return nil, nvcaerrors.TerminalError(err) } if reqType == ftContainer { - envs := c.bk8s.cfg.Agent.BYOOLogChunking.EnvVars() + envs := c.bk8s.cfg.Agent.BYOOOTelCollectorEnvVars() for _, obj := range objs { pod, ok := obj.(*corev1.Pod) if !ok { continue } - k8sutil.AddBYOOLogChunkingEnvVarsToPodSpec(&pod.Spec, envs) + k8sutil.AddBYOOOTelCollectorEnvVarsToPodSpec(&pod.Spec, envs) } } diff --git a/src/compute-plane-services/nvca/pkg/nvca/k8scomputebackend_task_container.go b/src/compute-plane-services/nvca/pkg/nvca/k8scomputebackend_task_container.go index 4c58b3214..2b12f09ee 100644 --- a/src/compute-plane-services/nvca/pkg/nvca/k8scomputebackend_task_container.go +++ b/src/compute-plane-services/nvca/pkg/nvca/k8scomputebackend_task_container.go @@ -131,13 +131,13 @@ func (c K8sComputeBackend) applyContainerTaskCreationMessage(ctx context.Context metrics.EventErrorTotal.WithLabelValues(metricLabels...).Inc() return err } - envs := c.bk8s.cfg.Agent.BYOOLogChunking.EnvVars() + envs := c.bk8s.cfg.Agent.BYOOOTelCollectorEnvVars() for _, obj := range objs { pod, ok := obj.(*corev1.Pod) if !ok { continue } - k8sutil.AddBYOOLogChunkingEnvVarsToPodSpec(&pod.Spec, envs) + k8sutil.AddBYOOOTelCollectorEnvVarsToPodSpec(&pod.Spec, envs) } ownerRefsForReq := getOwnerRefForRequest(req) diff --git a/src/compute-plane-services/nvca/pkg/operator/reconcile/nvcaagent_reconcile_test.go b/src/compute-plane-services/nvca/pkg/operator/reconcile/nvcaagent_reconcile_test.go index 4e598bb71..95377fcd7 100644 --- a/src/compute-plane-services/nvca/pkg/operator/reconcile/nvcaagent_reconcile_test.go +++ b/src/compute-plane-services/nvca/pkg/operator/reconcile/nvcaagent_reconcile_test.go @@ -2841,6 +2841,11 @@ func TestEncodeAgentConfig_MergesBYOOConfig(t *testing.T) { DryRun: true, ExporterBatchMaxSizeBytes: ptr.To[int64](1000000), }, + BYOOSREMetrics: nvcaconfig.BYOOSREMetricsConfig{ + Enabled: true, + FilterConfig: "error_mode: ignore\nmetric_conditions:\n - 'metric.name == \"drop\"'\n", + CustomerMetricsDropLabels: []string{"sre_metrics_enabled", "custom_label"}, + }, }, } @@ -2857,6 +2862,9 @@ func TestEncodeAgentConfig_MergesBYOOConfig(t *testing.T) { assert.True(t, got.Agent.BYOOLogChunking.DryRun) require.NotNil(t, got.Agent.BYOOLogChunking.ExporterBatchMaxSizeBytes) assert.Equal(t, int64(1000000), *got.Agent.BYOOLogChunking.ExporterBatchMaxSizeBytes) + assert.True(t, got.Agent.BYOOSREMetrics.Enabled) + assert.Contains(t, got.Agent.BYOOSREMetrics.FilterConfig, "metric.name") + assert.Equal(t, []string{"sre_metrics_enabled", "custom_label"}, got.Agent.BYOOSREMetrics.CustomerMetricsDropLabels) } func TestAgentHostOverrideConfig_ClearsReValHostForSelfHostedColocatedService(t *testing.T) { diff --git a/src/compute-plane-services/nvca/pkg/webhook/miniservice_mutating_webhook.go b/src/compute-plane-services/nvca/pkg/webhook/miniservice_mutating_webhook.go index 6ad27753b..9554c74f3 100644 --- a/src/compute-plane-services/nvca/pkg/webhook/miniservice_mutating_webhook.go +++ b/src/compute-plane-services/nvca/pkg/webhook/miniservice_mutating_webhook.go @@ -366,7 +366,7 @@ func (w *miniserviceMutatingWebhook) mutatePodSpec(ps *corev1.PodSpec, meta nvca } _ = translatecommon.AddMixedEnvsToContainers(overrideableEnvVars, ps.InitContainers, meta.EnvVars...) _ = translatecommon.AddMixedEnvsToContainers(overrideableEnvVars, ps.Containers, meta.EnvVars...) - k8sutil.AddBYOOLogChunkingEnvVarsToPodSpec(ps, meta.OTelCollectorEnvVars) + k8sutil.AddBYOOOTelCollectorEnvVarsToPodSpec(ps, meta.OTelCollectorEnvVars) // If the pod is allowed k8s api access (ex. when an operator created it), and it has set a non-default service account, // use it instead of the service account override. diff --git a/src/compute-plane-services/nvca/pkg/webhook/miniservice_mutating_webhook_test.go b/src/compute-plane-services/nvca/pkg/webhook/miniservice_mutating_webhook_test.go index 53725eb58..e3de06cb1 100644 --- a/src/compute-plane-services/nvca/pkg/webhook/miniservice_mutating_webhook_test.go +++ b/src/compute-plane-services/nvca/pkg/webhook/miniservice_mutating_webhook_test.go @@ -1186,7 +1186,7 @@ func TestMiniserviceMutatePodSpec_BYOObservability(t *testing.T) { } } -func TestMiniserviceMutatePodSpec_BYOOLogChunkingEnvVarsOnlyCollector(t *testing.T) { +func TestMiniserviceMutatePodSpec_BYOOOTelCollectorEnvVarsOnlyCollector(t *testing.T) { meta := nvcatypes.MiniserviceMetadata{ EnvVars: []corev1.EnvVar{ {Name: "SHARED_ENV", Value: "shared"}, @@ -1194,6 +1194,7 @@ func TestMiniserviceMutatePodSpec_BYOOLogChunkingEnvVarsOnlyCollector(t *testing OTelCollectorEnvVars: []corev1.EnvVar{ {Name: nvcaconfig.BYOOLogChunkMaxBodyBytesEnv, Value: "983040"}, {Name: nvcaconfig.BYOOLogExporterBatchMaxSizeBytesEnv, Value: "1000000"}, + {Name: nvcaconfig.BYOOSREMetricsEnabledEnv, Value: "true"}, }, } ps := corev1.PodSpec{ @@ -1220,8 +1221,11 @@ func TestMiniserviceMutatePodSpec_BYOOLogChunkingEnvVarsOnlyCollector(t *testing assert.Equal(t, "shared", collectorByName["SHARED_ENV"]) assert.NotContains(t, initByName, nvcaconfig.BYOOLogChunkMaxBodyBytesEnv) assert.NotContains(t, appByName, nvcaconfig.BYOOLogChunkMaxBodyBytesEnv) + assert.NotContains(t, initByName, nvcaconfig.BYOOSREMetricsEnabledEnv) + assert.NotContains(t, appByName, nvcaconfig.BYOOSREMetricsEnabledEnv) assert.Equal(t, "983040", collectorByName[nvcaconfig.BYOOLogChunkMaxBodyBytesEnv]) assert.Equal(t, "1000000", collectorByName[nvcaconfig.BYOOLogExporterBatchMaxSizeBytesEnv]) + assert.Equal(t, "true", collectorByName[nvcaconfig.BYOOSREMetricsEnabledEnv]) } func envNames(envs []corev1.EnvVar) []string { diff --git a/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/types.go b/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/types.go index 2be981d23..458bc82d2 100644 --- a/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/types.go +++ b/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/types.go @@ -19,6 +19,7 @@ import ( "fmt" "reflect" "strconv" + "strings" "time" "github.com/go-viper/mapstructure/v2" @@ -58,6 +59,12 @@ const ( BYOOLogChunkDryRunEnv = "BYOO_LOG_CHUNK_DRY_RUN" // BYOOLogExporterBatchMaxSizeBytesEnv is the BYOO collector env var for exporterhelper byte batch splitting. BYOOLogExporterBatchMaxSizeBytesEnv = "BYOO_LOG_EXPORTER_BATCH_MAX_SIZE_BYTES" + // BYOOSREMetricsEnabledEnv is the BYOO collector env var that enables the SRE metrics pipeline. + BYOOSREMetricsEnabledEnv = "BYOO_SRE_METRICS_ENABLED" + // BYOOSREMetricsFilterConfigEnv is the BYOO collector env var for SRE metrics filter config YAML. + BYOOSREMetricsFilterConfigEnv = "BYOO_SRE_METRICS_FILTER_CONFIG" + // BYOOCustomerMetricsDropLabelsEnv is the BYOO collector env var for customer metrics resource labels to drop. + BYOOCustomerMetricsDropLabelsEnv = "BYOO_CUSTOMER_METRICS_DROP_LABELS" // DefaultBYOOLogExporterBatchMaxSizeBytes keeps serialized exporter batches near the backend limit. DefaultBYOOLogExporterBatchMaxSizeBytes int64 = 1000000 @@ -110,6 +117,40 @@ func BYOOLogChunkingEnvVars(config BYOOLogChunkingConfig) []corev1.EnvVar { return config.EnvVars() } +type BYOOSREMetricsConfig struct { + Enabled bool `yaml:"enabled,omitempty"` + FilterConfig string `yaml:"filterConfig,omitempty"` + CustomerMetricsDropLabels []string `yaml:"customerMetricsDropLabels,omitempty"` +} + +func (c BYOOSREMetricsConfig) IsZero() bool { + return !c.Enabled && c.FilterConfig == "" && len(c.CustomerMetricsDropLabels) == 0 +} + +// EnvVars returns BYOO collector env vars for the supplied SRE metrics config. +func (c BYOOSREMetricsConfig) EnvVars() []corev1.EnvVar { + envs := []corev1.EnvVar{} + if c.Enabled { + envs = append(envs, corev1.EnvVar{ + Name: BYOOSREMetricsEnabledEnv, + Value: strconv.FormatBool(c.Enabled), + }) + } + if c.FilterConfig != "" { + envs = append(envs, corev1.EnvVar{ + Name: BYOOSREMetricsFilterConfigEnv, + Value: c.FilterConfig, + }) + } + if len(c.CustomerMetricsDropLabels) > 0 { + envs = append(envs, corev1.EnvVar{ + Name: BYOOCustomerMetricsDropLabelsEnv, + Value: strings.Join(c.CustomerMetricsDropLabels, ","), + }) + } + return envs +} + func (r *ResourceRequirements) ToK8sResourceRequirements() corev1.ResourceRequirements { return corev1.ResourceRequirements{ Limits: corev1.ResourceList(r.Limits), @@ -340,6 +381,9 @@ type AgentConfig struct { // BYOOLogChunking contains BYOO OTel collector log chunking and exporter batch settings. BYOOLogChunking BYOOLogChunkingConfig `yaml:",omitempty"` + + // BYOOSREMetrics contains BYOO OTel collector SRE metrics pipeline settings. + BYOOSREMetrics BYOOSREMetricsConfig `yaml:"byooSREMetrics,omitempty"` } func (t AgentConfig) Complete(env Environment) AgentConfig { @@ -352,6 +396,12 @@ func (t AgentConfig) Complete(env Environment) AgentConfig { return t } +// BYOOOTelCollectorEnvVars returns env vars that must be set only on the BYOO OTel collector container. +func (t AgentConfig) BYOOOTelCollectorEnvVars() []corev1.EnvVar { + envs := t.BYOOLogChunking.EnvVars() + return append(envs, t.BYOOSREMetrics.EnvVars()...) +} + const ( defaultCredRenewInterval = 45 * time.Minute defaultHeartbeatInterval = 5 * time.Minute diff --git a/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go b/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go index 5e7b6d3d9..fea418205 100644 --- a/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go +++ b/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go @@ -71,6 +71,7 @@ func (in *AgentConfig) DeepCopyInto(out *AgentConfig) { in.BYOOResources.DeepCopyInto(&out.BYOOResources) in.BYOOFluentBitResources.DeepCopyInto(&out.BYOOFluentBitResources) in.BYOOLogChunking.DeepCopyInto(&out.BYOOLogChunking) + in.BYOOSREMetrics.DeepCopyInto(&out.BYOOSREMetrics) return } @@ -153,6 +154,27 @@ func (in *BYOOLogChunkingConfig) DeepCopy() *BYOOLogChunkingConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BYOOSREMetricsConfig) DeepCopyInto(out *BYOOSREMetricsConfig) { + *out = *in + if in.CustomerMetricsDropLabels != nil { + in, out := &in.CustomerMetricsDropLabels, &out.CustomerMetricsDropLabels + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BYOOSREMetricsConfig. +func (in *BYOOSREMetricsConfig) DeepCopy() *BYOOSREMetricsConfig { + if in == nil { + return nil + } + out := new(BYOOSREMetricsConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Config) DeepCopyInto(out *Config) { *out = *in diff --git a/src/libraries/go/lib/pkg/types/nvca/config/config_test.go b/src/libraries/go/lib/pkg/types/nvca/config/config_test.go index 716d45935..1f4a895e6 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/config_test.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/config_test.go @@ -397,6 +397,26 @@ agent: assert.Equal(t, ":8080", cfg.Agent.SvcAddress) }) + t.Run("byoo_sre_metrics", func(t *testing.T) { + data := []byte(` +agent: + byooSREMetrics: + enabled: true + filterConfig: | + error_mode: ignore + metric_conditions: + - 'metric.name == "drop"' + customerMetricsDropLabels: + - sre_metrics_enabled + - custom_label +`) + cfg, err := DecodeConfig(data) + require.NoError(t, err) + assert.True(t, cfg.Agent.BYOOSREMetrics.Enabled) + assert.Contains(t, cfg.Agent.BYOOSREMetrics.FilterConfig, "metric.name") + assert.Equal(t, []string{"sre_metrics_enabled", "custom_label"}, cfg.Agent.BYOOSREMetrics.CustomerMetricsDropLabels) + }) + t.Run("duration_parsing", func(t *testing.T) { data := []byte(` agent: diff --git a/src/libraries/go/lib/pkg/types/nvca/config/deepcopy_test.go b/src/libraries/go/lib/pkg/types/nvca/config/deepcopy_test.go index f6d26ade3..2c126b47f 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/deepcopy_test.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/deepcopy_test.go @@ -69,6 +69,22 @@ func TestDeepCopy_AgentConfig_Nil(t *testing.T) { assert.Nil(t, out) } +func TestDeepCopy_BYOOSREMetricsConfig(t *testing.T) { + orig := &BYOOSREMetricsConfig{ + Enabled: true, + FilterConfig: "error_mode: ignore", + CustomerMetricsDropLabels: []string{"sre_metrics_enabled", "custom_label"}, + } + out := orig.DeepCopy() + require.NotNil(t, out) + assert.Equal(t, orig.Enabled, out.Enabled) + assert.Equal(t, orig.FilterConfig, out.FilterConfig) + assert.Equal(t, orig.CustomerMetricsDropLabels, out.CustomerMetricsDropLabels) + + orig.CustomerMetricsDropLabels[0] = "changed" + assert.Equal(t, "sre_metrics_enabled", out.CustomerMetricsDropLabels[0]) +} + func TestDeepCopy_AllowedExtraKubernetesTypeConfig(t *testing.T) { orig := &AllowedExtraKubernetesTypeConfig{Group: "apps", Version: "v1", Kind: "Deployment", Resource: "deployments"} out := orig.DeepCopy() diff --git a/src/libraries/go/lib/pkg/types/nvca/config/types.go b/src/libraries/go/lib/pkg/types/nvca/config/types.go index b9c30627c..10435a034 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/types.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/types.go @@ -19,6 +19,7 @@ import ( "fmt" "reflect" "strconv" + "strings" "time" "github.com/go-viper/mapstructure/v2" @@ -58,6 +59,12 @@ const ( BYOOLogChunkDryRunEnv = "BYOO_LOG_CHUNK_DRY_RUN" // BYOOLogExporterBatchMaxSizeBytesEnv is the BYOO collector env var for exporterhelper byte batch splitting. BYOOLogExporterBatchMaxSizeBytesEnv = "BYOO_LOG_EXPORTER_BATCH_MAX_SIZE_BYTES" + // BYOOSREMetricsEnabledEnv is the BYOO collector env var that enables the SRE metrics pipeline. + BYOOSREMetricsEnabledEnv = "BYOO_SRE_METRICS_ENABLED" + // BYOOSREMetricsFilterConfigEnv is the BYOO collector env var for SRE metrics filter config YAML. + BYOOSREMetricsFilterConfigEnv = "BYOO_SRE_METRICS_FILTER_CONFIG" + // BYOOCustomerMetricsDropLabelsEnv is the BYOO collector env var for customer metrics resource labels to drop. + BYOOCustomerMetricsDropLabelsEnv = "BYOO_CUSTOMER_METRICS_DROP_LABELS" // DefaultBYOOLogExporterBatchMaxSizeBytes keeps serialized exporter batches near the backend limit. DefaultBYOOLogExporterBatchMaxSizeBytes int64 = 1000000 @@ -110,6 +117,40 @@ func BYOOLogChunkingEnvVars(config BYOOLogChunkingConfig) []corev1.EnvVar { return config.EnvVars() } +type BYOOSREMetricsConfig struct { + Enabled bool `yaml:"enabled,omitempty"` + FilterConfig string `yaml:"filterConfig,omitempty"` + CustomerMetricsDropLabels []string `yaml:"customerMetricsDropLabels,omitempty"` +} + +func (c BYOOSREMetricsConfig) IsZero() bool { + return !c.Enabled && c.FilterConfig == "" && len(c.CustomerMetricsDropLabels) == 0 +} + +// EnvVars returns BYOO collector env vars for the supplied SRE metrics config. +func (c BYOOSREMetricsConfig) EnvVars() []corev1.EnvVar { + envs := []corev1.EnvVar{} + if c.Enabled { + envs = append(envs, corev1.EnvVar{ + Name: BYOOSREMetricsEnabledEnv, + Value: strconv.FormatBool(c.Enabled), + }) + } + if c.FilterConfig != "" { + envs = append(envs, corev1.EnvVar{ + Name: BYOOSREMetricsFilterConfigEnv, + Value: c.FilterConfig, + }) + } + if len(c.CustomerMetricsDropLabels) > 0 { + envs = append(envs, corev1.EnvVar{ + Name: BYOOCustomerMetricsDropLabelsEnv, + Value: strings.Join(c.CustomerMetricsDropLabels, ","), + }) + } + return envs +} + func (r *ResourceRequirements) ToK8sResourceRequirements() corev1.ResourceRequirements { return corev1.ResourceRequirements{ Limits: corev1.ResourceList(r.Limits), @@ -340,6 +381,9 @@ type AgentConfig struct { // BYOOLogChunking contains BYOO OTel collector log chunking and exporter batch settings. BYOOLogChunking BYOOLogChunkingConfig `yaml:",omitempty"` + + // BYOOSREMetrics contains BYOO OTel collector SRE metrics pipeline settings. + BYOOSREMetrics BYOOSREMetricsConfig `yaml:"byooSREMetrics,omitempty"` } func (t AgentConfig) Complete(env Environment) AgentConfig { @@ -352,6 +396,12 @@ func (t AgentConfig) Complete(env Environment) AgentConfig { return t } +// BYOOOTelCollectorEnvVars returns env vars that must be set only on the BYOO OTel collector container. +func (t AgentConfig) BYOOOTelCollectorEnvVars() []corev1.EnvVar { + envs := t.BYOOLogChunking.EnvVars() + return append(envs, t.BYOOSREMetrics.EnvVars()...) +} + const ( defaultCredRenewInterval = 45 * time.Minute defaultHeartbeatInterval = 5 * time.Minute diff --git a/src/libraries/go/lib/pkg/types/nvca/config/types_test.go b/src/libraries/go/lib/pkg/types/nvca/config/types_test.go index 2f4b87740..0c7bc48c7 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/types_test.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/types_test.go @@ -86,6 +86,44 @@ func TestAgentConfig_Complete(t *testing.T) { }) } +func TestBYOOSREMetricsConfig_EnvVars(t *testing.T) { + cfg := BYOOSREMetricsConfig{ + Enabled: true, + FilterConfig: "error_mode: ignore\nmetric_conditions:\n - 'metric.name == \"drop\"'\n", + CustomerMetricsDropLabels: []string{ + "sre_metrics_enabled", + "custom_label", + }, + } + + assert.Equal(t, []corev1.EnvVar{ + {Name: BYOOSREMetricsEnabledEnv, Value: "true"}, + {Name: BYOOSREMetricsFilterConfigEnv, Value: "error_mode: ignore\nmetric_conditions:\n - 'metric.name == \"drop\"'\n"}, + {Name: BYOOCustomerMetricsDropLabelsEnv, Value: "sre_metrics_enabled,custom_label"}, + }, cfg.EnvVars()) +} + +func TestAgentConfig_BYOOOTelCollectorEnvVars(t *testing.T) { + exporterBatchMaxSizeBytes := int64(1000000) + cfg := AgentConfig{ + BYOOLogChunking: BYOOLogChunkingConfig{ + MaxBodyBytes: 983040, + ExporterBatchMaxSizeBytes: &exporterBatchMaxSizeBytes, + }, + BYOOSREMetrics: BYOOSREMetricsConfig{ + Enabled: true, + CustomerMetricsDropLabels: []string{"sre_metrics_enabled"}, + }, + } + + assert.Equal(t, []corev1.EnvVar{ + {Name: BYOOLogChunkMaxBodyBytesEnv, Value: "983040"}, + {Name: BYOOLogExporterBatchMaxSizeBytesEnv, Value: "1000000"}, + {Name: BYOOSREMetricsEnabledEnv, Value: "true"}, + {Name: BYOOCustomerMetricsDropLabelsEnv, Value: "sre_metrics_enabled"}, + }, cfg.BYOOOTelCollectorEnvVars()) +} + func TestAgentTimeConfig_Complete(t *testing.T) { t.Run("sets_all_defaults", func(t *testing.T) { cfg := AgentTimeConfig{} diff --git a/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go b/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go index 5e7b6d3d9..fea418205 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go @@ -71,6 +71,7 @@ func (in *AgentConfig) DeepCopyInto(out *AgentConfig) { in.BYOOResources.DeepCopyInto(&out.BYOOResources) in.BYOOFluentBitResources.DeepCopyInto(&out.BYOOFluentBitResources) in.BYOOLogChunking.DeepCopyInto(&out.BYOOLogChunking) + in.BYOOSREMetrics.DeepCopyInto(&out.BYOOSREMetrics) return } @@ -153,6 +154,27 @@ func (in *BYOOLogChunkingConfig) DeepCopy() *BYOOLogChunkingConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BYOOSREMetricsConfig) DeepCopyInto(out *BYOOSREMetricsConfig) { + *out = *in + if in.CustomerMetricsDropLabels != nil { + in, out := &in.CustomerMetricsDropLabels, &out.CustomerMetricsDropLabels + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BYOOSREMetricsConfig. +func (in *BYOOSREMetricsConfig) DeepCopy() *BYOOSREMetricsConfig { + if in == nil { + return nil + } + out := new(BYOOSREMetricsConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Config) DeepCopyInto(out *Config) { *out = *in From 73c370e0549f549054d348e5c3ba0b04edd514b5 Mon Sep 17 00:00:00 2001 From: Kristina Pathak Date: Tue, 21 Jul 2026 13:55:18 -0700 Subject: [PATCH 2/8] docs(nvca): use plain BYOO SRE metrics heading Signed-off-by: Kristina Pathak --- docs/ngc-managed/cluster-management/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ngc-managed/cluster-management/configuration.md b/docs/ngc-managed/cluster-management/configuration.md index baa74bf02..01c6650cf 100644 --- a/docs/ngc-managed/cluster-management/configuration.md +++ b/docs/ngc-managed/cluster-management/configuration.md @@ -733,7 +733,7 @@ pod and merged with the generated config at runtime. logLevel: debug ``` -**BYOO SRE metrics example:** +BYOO SRE metrics example: ```yaml agentConfig: From 2d935f858df77c8a9b175adf9d94407611ea7350 Mon Sep 17 00:00:00 2001 From: Kristina Pathak Date: Tue, 21 Jul 2026 13:57:07 -0700 Subject: [PATCH 3/8] refactor(nvca): generalize BYOO env var pod helper Signed-off-by: Kristina Pathak --- .../nvca/internal/util/k8sutil/BUILD.bazel | 4 ++-- .../k8sutil/{byoo_log_chunking.go => byoo_env_vars.go} | 9 ++------- .../{byoo_log_chunking_test.go => byoo_env_vars_test.go} | 4 ++-- .../nvca/pkg/nvca/k8scomputebackend.go | 2 +- .../nvca/pkg/nvca/k8scomputebackend_task_container.go | 2 +- .../nvca/pkg/webhook/miniservice_mutating_webhook.go | 2 +- 6 files changed, 9 insertions(+), 14 deletions(-) rename src/compute-plane-services/nvca/internal/util/k8sutil/{byoo_log_chunking.go => byoo_env_vars.go} (70%) rename src/compute-plane-services/nvca/internal/util/k8sutil/{byoo_log_chunking_test.go => byoo_env_vars_test.go} (92%) diff --git a/src/compute-plane-services/nvca/internal/util/k8sutil/BUILD.bazel b/src/compute-plane-services/nvca/internal/util/k8sutil/BUILD.bazel index 70dcc365a..b1906412c 100644 --- a/src/compute-plane-services/nvca/internal/util/k8sutil/BUILD.bazel +++ b/src/compute-plane-services/nvca/internal/util/k8sutil/BUILD.bazel @@ -8,7 +8,7 @@ go_library( srcs = [ "affinity.go", "annotations.go", - "byoo_log_chunking.go", + "byoo_env_vars.go", "clientshim.go", "customization.go", "encoding.go", @@ -61,7 +61,7 @@ go_test( name = "k8sutil_test", srcs = [ "annotations_test.go", - "byoo_log_chunking_test.go", + "byoo_env_vars_test.go", "clientshim_test.go", "encoding_test.go", "errors_test.go", diff --git a/src/compute-plane-services/nvca/internal/util/k8sutil/byoo_log_chunking.go b/src/compute-plane-services/nvca/internal/util/k8sutil/byoo_env_vars.go similarity index 70% rename from src/compute-plane-services/nvca/internal/util/k8sutil/byoo_log_chunking.go rename to src/compute-plane-services/nvca/internal/util/k8sutil/byoo_env_vars.go index 429c62924..4b671a18a 100644 --- a/src/compute-plane-services/nvca/internal/util/k8sutil/byoo_log_chunking.go +++ b/src/compute-plane-services/nvca/internal/util/k8sutil/byoo_env_vars.go @@ -22,8 +22,8 @@ import ( corev1 "k8s.io/api/core/v1" ) -// AddBYOOOTelCollectorEnvVarsToPodSpec injects env vars into only the BYOO OTel collector container. -func AddBYOOOTelCollectorEnvVarsToPodSpec(podSpec *corev1.PodSpec, envs []corev1.EnvVar) { +// AddBYOOEnvVarsToPodSpec injects env vars into only the BYOO OTel collector container. +func AddBYOOEnvVarsToPodSpec(podSpec *corev1.PodSpec, envs []corev1.EnvVar) { if len(envs) == 0 { return } @@ -34,8 +34,3 @@ func AddBYOOOTelCollectorEnvVarsToPodSpec(podSpec *corev1.PodSpec, envs []corev1 AddEnvsToContainer(&podSpec.Containers[i], envs...) } } - -// AddBYOOLogChunkingEnvVarsToPodSpec injects env vars into only the BYOO OTel collector container. -func AddBYOOLogChunkingEnvVarsToPodSpec(podSpec *corev1.PodSpec, envs []corev1.EnvVar) { - AddBYOOOTelCollectorEnvVarsToPodSpec(podSpec, envs) -} diff --git a/src/compute-plane-services/nvca/internal/util/k8sutil/byoo_log_chunking_test.go b/src/compute-plane-services/nvca/internal/util/k8sutil/byoo_env_vars_test.go similarity index 92% rename from src/compute-plane-services/nvca/internal/util/k8sutil/byoo_log_chunking_test.go rename to src/compute-plane-services/nvca/internal/util/k8sutil/byoo_env_vars_test.go index d02cbf9c1..dbd8e3e41 100644 --- a/src/compute-plane-services/nvca/internal/util/k8sutil/byoo_log_chunking_test.go +++ b/src/compute-plane-services/nvca/internal/util/k8sutil/byoo_env_vars_test.go @@ -26,7 +26,7 @@ import ( corev1 "k8s.io/api/core/v1" ) -func TestAddBYOOOTelCollectorEnvVarsToPodSpecMutatesOnlyBYOOCollectorContainer(t *testing.T) { +func TestAddBYOOEnvVarsToPodSpecMutatesOnlyBYOOCollectorContainer(t *testing.T) { envs := []corev1.EnvVar{ {Name: nvcaconfig.BYOOLogChunkMaxBodyBytesEnv, Value: "983040"}, {Name: nvcaconfig.BYOOLogExporterBatchMaxSizeBytesEnv, Value: "1000000"}, @@ -51,7 +51,7 @@ func TestAddBYOOOTelCollectorEnvVarsToPodSpecMutatesOnlyBYOOCollectorContainer(t }, } - AddBYOOOTelCollectorEnvVarsToPodSpec(&pod.Spec, envs) + AddBYOOEnvVarsToPodSpec(&pod.Spec, envs) assert.Equal(t, expectedEnv, pod.Spec.Containers[0].Env) assert.Empty(t, pod.Spec.Containers[1].Env) diff --git a/src/compute-plane-services/nvca/pkg/nvca/k8scomputebackend.go b/src/compute-plane-services/nvca/pkg/nvca/k8scomputebackend.go index 10eb40fb4..b07d2e24f 100644 --- a/src/compute-plane-services/nvca/pkg/nvca/k8scomputebackend.go +++ b/src/compute-plane-services/nvca/pkg/nvca/k8scomputebackend.go @@ -323,7 +323,7 @@ func (c K8sComputeBackend) translateFunctionLaunchSpecification( if !ok { continue } - k8sutil.AddBYOOOTelCollectorEnvVarsToPodSpec(&pod.Spec, envs) + k8sutil.AddBYOOEnvVarsToPodSpec(&pod.Spec, envs) } } diff --git a/src/compute-plane-services/nvca/pkg/nvca/k8scomputebackend_task_container.go b/src/compute-plane-services/nvca/pkg/nvca/k8scomputebackend_task_container.go index 2b12f09ee..a8049d322 100644 --- a/src/compute-plane-services/nvca/pkg/nvca/k8scomputebackend_task_container.go +++ b/src/compute-plane-services/nvca/pkg/nvca/k8scomputebackend_task_container.go @@ -137,7 +137,7 @@ func (c K8sComputeBackend) applyContainerTaskCreationMessage(ctx context.Context if !ok { continue } - k8sutil.AddBYOOOTelCollectorEnvVarsToPodSpec(&pod.Spec, envs) + k8sutil.AddBYOOEnvVarsToPodSpec(&pod.Spec, envs) } ownerRefsForReq := getOwnerRefForRequest(req) diff --git a/src/compute-plane-services/nvca/pkg/webhook/miniservice_mutating_webhook.go b/src/compute-plane-services/nvca/pkg/webhook/miniservice_mutating_webhook.go index 9554c74f3..35795b793 100644 --- a/src/compute-plane-services/nvca/pkg/webhook/miniservice_mutating_webhook.go +++ b/src/compute-plane-services/nvca/pkg/webhook/miniservice_mutating_webhook.go @@ -366,7 +366,7 @@ func (w *miniserviceMutatingWebhook) mutatePodSpec(ps *corev1.PodSpec, meta nvca } _ = translatecommon.AddMixedEnvsToContainers(overrideableEnvVars, ps.InitContainers, meta.EnvVars...) _ = translatecommon.AddMixedEnvsToContainers(overrideableEnvVars, ps.Containers, meta.EnvVars...) - k8sutil.AddBYOOOTelCollectorEnvVarsToPodSpec(ps, meta.OTelCollectorEnvVars) + k8sutil.AddBYOOEnvVarsToPodSpec(ps, meta.OTelCollectorEnvVars) // If the pod is allowed k8s api access (ex. when an operator created it), and it has set a non-default service account, // use it instead of the service account override. From 5c52db37fcba02f0183000b33fa091b14478ce77 Mon Sep 17 00:00:00 2001 From: Kristina Pathak Date: Tue, 21 Jul 2026 15:25:11 -0700 Subject: [PATCH 4/8] refactor(byoo): rename SRE metrics to metric subset Signed-off-by: Kristina Pathak --- .../nvca-operator/nvca-operator/values.yaml | 6 +- .../cluster-management/configuration.md | 6 +- docs/user/cluster-management/configuration.md | 6 +- .../byoo-otel-collector/README.md | 8 +- ...fig_function_container_metric_subset.yaml} | 26 +++---- .../internal/otelconfig/embed_config.go | 4 +- .../internal/otelconfig/otelconfig.go | 14 ++-- .../internal/otelconfig/otelconfig_test.go | 34 ++++----- .../internal/otelconfig/render.go | 75 +++++++++--------- .../internal/otelconfig/render_test.go | 76 +++++++++---------- .../internal/miniservice/reconcile_test.go | 12 +-- .../util/k8sutil/byoo_env_vars_test.go | 4 +- .../reconcile/nvcaagent_reconcile_test.go | 10 +-- .../miniservice_mutating_webhook_test.go | 8 +- .../go/lib/pkg/types/nvca/config/types.go | 26 +++---- .../nvca/config/zz_generated.deepcopy.go | 10 +-- .../lib/pkg/types/nvca/config/config_test.go | 12 +-- .../pkg/types/nvca/config/deepcopy_test.go | 8 +- .../go/lib/pkg/types/nvca/config/types.go | 26 +++---- .../lib/pkg/types/nvca/config/types_test.go | 20 ++--- .../nvca/config/zz_generated.deepcopy.go | 10 +-- 21 files changed, 197 insertions(+), 204 deletions(-) rename src/compute-plane-services/byoo-otel-collector/examples/otelconfigs/k8s/{config_function_container_sre_metrics.yaml => config_function_container_metric_subset.yaml} (96%) diff --git a/deploy/helm/nvca-operator/nvca-operator/values.yaml b/deploy/helm/nvca-operator/nvca-operator/values.yaml index f52b86406..e2356c12f 100644 --- a/deploy/helm/nvca-operator/nvca-operator/values.yaml +++ b/deploy/helm/nvca-operator/nvca-operator/values.yaml @@ -101,18 +101,18 @@ agentConfig: # agent: # logLevel: debug # - # BYOO SRE metrics example: + # BYOO metric subset example: # # mergeConfig: | # agent: - # byooSREMetrics: + # byooMetricSubset: # enabled: true # filterConfig: | # error_mode: ignore # metric_conditions: # - 'metric.name == "BpsInstrument"' # customerMetricsDropLabels: - # - sre_metrics_enabled + # - metric_subset_enabled # - custom_label ## @section resources Resource requests and limits for the nvca-operator container ## @param resources.limits.cpu CPU limit for the nvca-operator container diff --git a/docs/ngc-managed/cluster-management/configuration.md b/docs/ngc-managed/cluster-management/configuration.md index 01c6650cf..73fe31042 100644 --- a/docs/ngc-managed/cluster-management/configuration.md +++ b/docs/ngc-managed/cluster-management/configuration.md @@ -733,20 +733,20 @@ pod and merged with the generated config at runtime. logLevel: debug ``` -BYOO SRE metrics example: +BYOO metric subset example: ```yaml agentConfig: mergeConfig: | agent: - byooSREMetrics: + byooMetricSubset: enabled: true filterConfig: | error_mode: ignore metric_conditions: - 'metric.name == "BpsInstrument"' customerMetricsDropLabels: - - sre_metrics_enabled + - metric_subset_enabled - custom_label ``` diff --git a/docs/user/cluster-management/configuration.md b/docs/user/cluster-management/configuration.md index 73ea6febe..cd19e947b 100644 --- a/docs/user/cluster-management/configuration.md +++ b/docs/user/cluster-management/configuration.md @@ -854,20 +854,20 @@ isolated test clusters that run the LLM request router tunnel without TLS. For the full LLM addon setup, see [LLM Function Enablement](../llm-function-enablement.md). -BYOO SRE metrics example: +BYOO metric subset example: ```yaml agentConfig: mergeConfig: | agent: - byooSREMetrics: + byooMetricSubset: enabled: true filterConfig: | error_mode: ignore metric_conditions: - 'metric.name == "BpsInstrument"' customerMetricsDropLabels: - - sre_metrics_enabled + - metric_subset_enabled - custom_label ``` diff --git a/src/compute-plane-services/byoo-otel-collector/README.md b/src/compute-plane-services/byoo-otel-collector/README.md index bc76ee65d..7afae97e9 100644 --- a/src/compute-plane-services/byoo-otel-collector/README.md +++ b/src/compute-plane-services/byoo-otel-collector/README.md @@ -104,7 +104,7 @@ Exposed Ports: - 14358: OTLP HTTP receiver - 13133: `/health?verbose` endpoint to get detailed health status of collector (healthcheck v2 extension) - 19090: `/metrics` endpoint for the byoo-otel-collector metrics -- 19091: `/metrics` endpoint for optional SRE user metrics +- 19091: `/metrics` endpoint for optional metric subset user metrics ### nvcf-otel-collector Image @@ -129,9 +129,9 @@ Chunking is disabled by default. Configure it with: - `BYOO_LOG_CHUNK_MAX_BODY_BYTES`: maximum log body size in bytes before chunking. `0` disables the processor. Enabled values must be at least `4` bytes so chunks can preserve UTF-8 rune boundaries. Use `983040` bytes for normal BYOO deployments to leave room for log attributes and exporter envelope overhead under a `1000000` byte backend entry limit. - `BYOO_LOG_CHUNK_DRY_RUN`: records oversized-log metrics and warnings without mutating log payloads. Dry-run metric datapoints use `mode=dry_run`. - `BYOO_LOG_EXPORTER_BATCH_MAX_SIZE_BYTES`: serialized log export request batch size used for exporterhelper byte splitting. `0` or unset uses the default `1000000` bytes. -- `BYOO_SRE_METRICS_ENABLED`: enables an additional OTLP-only metrics pipeline that exposes filtered user metrics through a Prometheus exporter on port `19091`. Disabled by default. -- `BYOO_SRE_METRICS_FILTER_CONFIG`: optional YAML filter processor config for the SRE metrics pipeline. If unset, the default drops every metric except `BpsInstrument`, `FpsInstrument`, `RtdInstrument`, and `StageOpenDuration`, and drops datapoints/resources explicitly labeled `sre_metrics_enabled=false` or `sre_enabled_metrics=false`. -- `BYOO_CUSTOMER_METRICS_DROP_LABELS`: comma-separated resource attribute names removed from the customer metrics pipeline when SRE metrics are enabled. If unset, defaults to `sre_metrics_enabled,sre_enabled_metrics`. +- `BYOO_METRIC_SUBSET_ENABLED`: enables an additional OTLP-only metrics pipeline that exposes filtered user metrics through a Prometheus exporter on port `19091`. Disabled by default. +- `BYOO_METRIC_SUBSET_FILTER_CONFIG`: optional YAML filter processor config for the metric subset pipeline. If unset, the default drops every metric except `BpsInstrument`, `FpsInstrument`, `RtdInstrument`, and `StageOpenDuration`, and drops datapoints/resources explicitly labeled `metric_subset_enabled=false`. +- `BYOO_CUSTOMER_METRICS_DROP_LABELS`: comma-separated resource attribute names removed from the customer metrics pipeline when metric subset is enabled. If unset, defaults to `metric_subset_enabled`. When chunking is enabled, each emitted chunk preserves the original log metadata and adds these attributes so chunks can be grouped in the backend: diff --git a/src/compute-plane-services/byoo-otel-collector/examples/otelconfigs/k8s/config_function_container_sre_metrics.yaml b/src/compute-plane-services/byoo-otel-collector/examples/otelconfigs/k8s/config_function_container_metric_subset.yaml similarity index 96% rename from src/compute-plane-services/byoo-otel-collector/examples/otelconfigs/k8s/config_function_container_sre_metrics.yaml rename to src/compute-plane-services/byoo-otel-collector/examples/otelconfigs/k8s/config_function_container_metric_subset.yaml index ea45e2dca..e89ec5c8a 100644 --- a/src/compute-plane-services/byoo-otel-collector/examples/otelconfigs/k8s/config_function_container_sre_metrics.yaml +++ b/src/compute-plane-services/byoo-otel-collector/examples/otelconfigs/k8s/config_function_container_metric_subset.yaml @@ -149,10 +149,16 @@ processors: send_batch_max_size: 8192 send_batch_size: 4096 timeout: 400ms - batch/sre_metrics: + batch/metric_subset: send_batch_max_size: 8192 send_batch_size: 4096 timeout: 400ms + filter/metric_subset: + error_mode: ignore + metric_conditions: + - metric.name != "BpsInstrument" and metric.name != "FpsInstrument" and metric.name != "RtdInstrument" and metric.name != "StageOpenDuration" + - resource.attributes["metric_subset_enabled"] == "false" + - datapoint.attributes["metric_subset_enabled"] == "false" filter/metrics: metrics: exclude: @@ -162,14 +168,6 @@ processors: - scrape_samples_post_metric_relabeling - scrape_samples_scraped - scrape_series_added - filter/sre_metrics: - error_mode: ignore - metric_conditions: - - metric.name != "BpsInstrument" and metric.name != "FpsInstrument" and metric.name != "RtdInstrument" and metric.name != "StageOpenDuration" - - resource.attributes["sre_metrics_enabled"] == "false" - - resource.attributes["sre_enabled_metrics"] == "false" - - datapoint.attributes["sre_metrics_enabled"] == "false" - - datapoint.attributes["sre_enabled_metrics"] == "false" memory_limiter: check_interval: 1s limit_percentage: 80 @@ -211,9 +209,7 @@ processors: resource/customer_metrics: attributes: - action: delete - key: sre_metrics_enabled - - action: delete - key: sre_enabled_metrics + key: metric_subset_enabled extensions: cgroup_runtime: gomaxprocs: @@ -282,17 +278,17 @@ service: - resource/customer_metrics - metrics_transform - batch - metrics/sre: + metrics/metric_subset: receivers: - otlp exporters: - prometheus/user-metrics processors: - memory_limiter - - filter/sre_metrics + - filter/metric_subset - resource - metrics_transform - - batch/sre_metrics + - batch/metric_subset extensions: - healthcheckv2 - cgroup_runtime diff --git a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/embed_config.go b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/embed_config.go index 1d8e3567c..f2be67e7b 100644 --- a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/embed_config.go +++ b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/embed_config.go @@ -47,7 +47,7 @@ type TemplateConfig struct { InstanceID string ZoneName string LogChunking LogChunkingConfig - SREMetrics SREMetricsConfig + MetricSubset MetricSubsetConfig // LogExporterBatchMaxSizeBytes configures exporterhelper byte batching for logs. // Zero uses the default selected for BYOO. LogExporterBatchMaxSizeBytes int @@ -58,7 +58,7 @@ type LogChunkingConfig struct { DryRun bool } -type SREMetricsConfig struct { +type MetricSubsetConfig struct { Enabled bool FilterConfig map[string]interface{} CustomerMetricsDropLabels []string diff --git a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig.go b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig.go index 1f4ff457a..78ce6b50a 100644 --- a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig.go +++ b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig.go @@ -42,8 +42,8 @@ type envConfig struct { ByooLogChunkMaxBodyBytes int `split_words:"true"` ByooLogChunkDryRun bool `split_words:"true"` ByooLogExporterBatchMaxSizeBytes int `split_words:"true"` - ByooSreMetricsEnabled bool `split_words:"true"` - ByooSreMetricsFilterConfig string `split_words:"true"` + ByooMetricSubsetEnabled bool `split_words:"true"` + ByooMetricSubsetFilterConfig string `split_words:"true"` ByooCustomerMetricsDropLabels string `split_words:"true"` } @@ -79,13 +79,13 @@ func getTemplateConfig() (TemplateConfig, error) { return TemplateConfig{}, fmt.Errorf("BYOO_LOG_EXPORTER_BATCH_MAX_SIZE_BYTES: %w", err) } tcgf.LogExporterBatchMaxSizeBytes = logExporterBatchMaxSizeBytes - sreMetricsFilterConfig, err := resolvedSREMetricsFilterConfig(env.ByooSreMetricsFilterConfig) + metricSubsetFilterConfig, err := resolvedMetricSubsetFilterConfig(env.ByooMetricSubsetFilterConfig) if err != nil { - return TemplateConfig{}, fmt.Errorf("BYOO_SRE_METRICS_FILTER_CONFIG: %w", err) + return TemplateConfig{}, fmt.Errorf("BYOO_METRIC_SUBSET_FILTER_CONFIG: %w", err) } - tcgf.SREMetrics = SREMetricsConfig{ - Enabled: env.ByooSreMetricsEnabled, - FilterConfig: sreMetricsFilterConfig, + tcgf.MetricSubset = MetricSubsetConfig{ + Enabled: env.ByooMetricSubsetEnabled, + FilterConfig: metricSubsetFilterConfig, CustomerMetricsDropLabels: resolvedCustomerMetricsDropLabels(env.ByooCustomerMetricsDropLabels), } diff --git a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig_test.go b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig_test.go index 4977328df..eb84713b9 100644 --- a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig_test.go +++ b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig_test.go @@ -117,7 +117,7 @@ func TestGetTemplateConfig(t *testing.T) { }, }, { - name: "custom SRE metrics config", + name: "custom metric subset config", env: map[string]string{ "NVCF_BACKEND_TYPE": "gfn", "NVCF_INSTANCE_ID": "test-instance", @@ -125,32 +125,32 @@ func TestGetTemplateConfig(t *testing.T) { "NVCF_WORKLOAD_TYPE": "function", "NVCT_TASK_ID": "task-123", "NVCF_ZONE_NAME": "zone-1", - "BYOO_SRE_METRICS_ENABLED": "true", - "BYOO_SRE_METRICS_FILTER_CONFIG": "error_mode: ignore\nmetric_conditions:\n - 'metric.name == \"drop\"'\n", - "BYOO_CUSTOMER_METRICS_DROP_LABELS": "sre_metrics_enabled, custom_label, sre_metrics_enabled", + "BYOO_METRIC_SUBSET_ENABLED": "true", + "BYOO_METRIC_SUBSET_FILTER_CONFIG": "error_mode: ignore\nmetric_conditions:\n - 'metric.name == \"drop\"'\n", + "BYOO_CUSTOMER_METRICS_DROP_LABELS": "metric_subset_enabled, custom_label, metric_subset_enabled", }, expectErr: false, expect: func(t *testing.T, cfg TemplateConfig) { - assert.True(t, cfg.SREMetrics.Enabled) + assert.True(t, cfg.MetricSubset.Enabled) assert.Equal(t, map[string]interface{}{ "error_mode": "ignore", "metric_conditions": []interface{}{ `metric.name == "drop"`, }, - }, cfg.SREMetrics.FilterConfig) - assert.Equal(t, []string{"sre_metrics_enabled", "custom_label"}, cfg.SREMetrics.CustomerMetricsDropLabels) + }, cfg.MetricSubset.FilterConfig) + assert.Equal(t, []string{"metric_subset_enabled", "custom_label"}, cfg.MetricSubset.CustomerMetricsDropLabels) }, }, { - name: "invalid SRE metrics filter config", + name: "invalid metric subset filter config", env: map[string]string{ - "NVCF_BACKEND_TYPE": "gfn", - "NVCF_INSTANCE_ID": "test-instance", - "NVCF_NAMESPACE": "test-ns", - "NVCF_WORKLOAD_TYPE": "function", - "NVCT_TASK_ID": "task-123", - "NVCF_ZONE_NAME": "zone-1", - "BYOO_SRE_METRICS_FILTER_CONFIG": "processors: []", + "NVCF_BACKEND_TYPE": "gfn", + "NVCF_INSTANCE_ID": "test-instance", + "NVCF_NAMESPACE": "test-ns", + "NVCF_WORKLOAD_TYPE": "function", + "NVCT_TASK_ID": "task-123", + "NVCF_ZONE_NAME": "zone-1", + "BYOO_METRIC_SUBSET_FILTER_CONFIG": "processors: []", }, expectErr: true, }, @@ -240,8 +240,8 @@ func TestGetTemplateConfig(t *testing.T) { "BYOO_LOG_CHUNK_MAX_BODY_BYTES", "BYOO_LOG_CHUNK_DRY_RUN", "BYOO_LOG_EXPORTER_BATCH_MAX_SIZE_BYTES", - "BYOO_SRE_METRICS_ENABLED", - "BYOO_SRE_METRICS_FILTER_CONFIG", + "BYOO_METRIC_SUBSET_ENABLED", + "BYOO_METRIC_SUBSET_FILTER_CONFIG", "BYOO_CUSTOMER_METRICS_DROP_LABELS", } backup := map[string]*string{} diff --git a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render.go b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render.go index 5f9dde95d..a0d223a0a 100644 --- a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render.go +++ b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render.go @@ -67,16 +67,15 @@ type OpenTelemetryConfig struct { const defaultLogExporterBatchMaxSizeBytes = 1000000 const ( - sreMetricsExporterID = "prometheus/user-metrics" - sreMetricsFilterProcessorID = "filter/sre_metrics" - sreMetricsBatchProcessorID = "batch/sre_metrics" + metricSubsetExporterID = "prometheus/user-metrics" + metricSubsetFilterProcessorID = "filter/metric_subset" + metricSubsetBatchProcessorID = "batch/metric_subset" customerMetricsDropLabelsProcessorID = "resource/customer_metrics" - defaultSREMetricsPort = 19091 + defaultMetricSubsetPort = 19091 ) var defaultCustomerMetricsDropLabels = []string{ - "sre_metrics_enabled", - "sre_enabled_metrics", + "metric_subset_enabled", } // Initialize the maps if they are nil @@ -161,22 +160,20 @@ func resolvedLogExporterBatchMaxSizeBytes(configured int) (int, error) { return configured, nil } -func defaultSREMetricsFilterConfig() map[string]interface{} { +func defaultMetricSubsetFilterConfig() map[string]interface{} { return map[string]interface{}{ "error_mode": "ignore", "metric_conditions": []string{ `metric.name != "BpsInstrument" and metric.name != "FpsInstrument" and metric.name != "RtdInstrument" and metric.name != "StageOpenDuration"`, - `resource.attributes["sre_metrics_enabled"] == "false"`, - `resource.attributes["sre_enabled_metrics"] == "false"`, - `datapoint.attributes["sre_metrics_enabled"] == "false"`, - `datapoint.attributes["sre_enabled_metrics"] == "false"`, + `resource.attributes["metric_subset_enabled"] == "false"`, + `datapoint.attributes["metric_subset_enabled"] == "false"`, }, } } -func resolvedSREMetricsFilterConfig(configured string) (map[string]interface{}, error) { +func resolvedMetricSubsetFilterConfig(configured string) (map[string]interface{}, error) { if strings.TrimSpace(configured) == "" { - return defaultSREMetricsFilterConfig(), nil + return defaultMetricSubsetFilterConfig(), nil } filterConfig := map[string]interface{}{} @@ -187,24 +184,24 @@ func resolvedSREMetricsFilterConfig(configured string) (map[string]interface{}, return nil, fmt.Errorf("filter config must not be empty") } - return unwrapSREMetricsFilterConfig(filterConfig) + return unwrapMetricSubsetFilterConfig(filterConfig) } -func unwrapSREMetricsFilterConfig(filterConfig map[string]interface{}) (map[string]interface{}, error) { +func unwrapMetricSubsetFilterConfig(filterConfig map[string]interface{}) (map[string]interface{}, error) { if rawProcessors, ok := filterConfig["processors"]; ok { processors, err := mapFromConfigValue(rawProcessors, "processors") if err != nil { return nil, err } - rawFilter, ok := processors[sreMetricsFilterProcessorID] + rawFilter, ok := processors[metricSubsetFilterProcessorID] if !ok { - return nil, fmt.Errorf("processors must include %q", sreMetricsFilterProcessorID) + return nil, fmt.Errorf("processors must include %q", metricSubsetFilterProcessorID) } - return mapFromConfigValue(rawFilter, sreMetricsFilterProcessorID) + return mapFromConfigValue(rawFilter, metricSubsetFilterProcessorID) } - if rawFilter, ok := filterConfig[sreMetricsFilterProcessorID]; ok { - return mapFromConfigValue(rawFilter, sreMetricsFilterProcessorID) + if rawFilter, ok := filterConfig[metricSubsetFilterProcessorID]; ok { + return mapFromConfigValue(rawFilter, metricSubsetFilterProcessorID) } if rawFilter, ok := filterConfig["filter"]; ok && len(filterConfig) == 1 { @@ -518,9 +515,9 @@ func addCustomerMetricsDropLabelsProcessor(otelConfig *OpenTelemetryConfig, labe return customerMetricsDropLabelsProcessorID } -func addSREMetricsExporter(otelConfig *OpenTelemetryConfig) { - otelConfig.Exporters[sreMetricsExporterID] = map[string]interface{}{ - "endpoint": fmt.Sprintf("${env:OTEL_POD_IP:-0.0.0.0}:%d", defaultSREMetricsPort), +func addMetricSubsetExporter(otelConfig *OpenTelemetryConfig) { + otelConfig.Exporters[metricSubsetExporterID] = map[string]interface{}{ + "endpoint": fmt.Sprintf("${env:OTEL_POD_IP:-0.0.0.0}:%d", defaultMetricSubsetPort), "resource_to_telemetry_conversion": map[string]interface{}{ "enabled": true, }, @@ -559,14 +556,14 @@ func cloneConfigValue(value interface{}) interface{} { } } -func addSREMetricsPipeline(otelConfig *OpenTelemetryConfig, config SREMetricsConfig) { - addSREMetricsExporter(otelConfig) +func addMetricSubsetPipeline(otelConfig *OpenTelemetryConfig, config MetricSubsetConfig) { + addMetricSubsetExporter(otelConfig) filterConfig := config.FilterConfig if len(filterConfig) == 0 { - filterConfig = defaultSREMetricsFilterConfig() + filterConfig = defaultMetricSubsetFilterConfig() } - otelConfig.Processors[sreMetricsFilterProcessorID] = cloneConfigMap(filterConfig) + otelConfig.Processors[metricSubsetFilterProcessorID] = cloneConfigMap(filterConfig) batchConfig := map[string]interface{}{ "send_batch_size": 4096, @@ -576,19 +573,19 @@ func addSREMetricsPipeline(otelConfig *OpenTelemetryConfig, config SREMetricsCon if existingBatchConfig, ok := otelConfig.Processors["batch"]; ok { batchConfig = cloneConfigMap(existingBatchConfig) } - otelConfig.Processors[sreMetricsBatchProcessorID] = batchConfig + otelConfig.Processors[metricSubsetBatchProcessorID] = batchConfig - sreMetricsPipeline := otelConfig.Service.Pipelines["metrics/sre"] - sreMetricsPipeline.Receivers = []string{"otlp"} - sreMetricsPipeline.Exporters = []string{sreMetricsExporterID} - sreMetricsPipeline.Processors = []string{ + metricSubsetPipeline := otelConfig.Service.Pipelines["metrics/metric_subset"] + metricSubsetPipeline.Receivers = []string{"otlp"} + metricSubsetPipeline.Exporters = []string{metricSubsetExporterID} + metricSubsetPipeline.Processors = []string{ "memory_limiter", - sreMetricsFilterProcessorID, + metricSubsetFilterProcessorID, "resource", "metrics_transform", - sreMetricsBatchProcessorID, + metricSubsetBatchProcessorID, } - otelConfig.Service.Pipelines["metrics/sre"] = sreMetricsPipeline + otelConfig.Service.Pipelines["metrics/metric_subset"] = metricSubsetPipeline } func exporterTraces(config TelemetryConfig, otelConfig *OpenTelemetryConfig) (exporterId string, err error) { @@ -815,16 +812,16 @@ func generateExportersAndService(config TelemetryConfig, otelConfig *OpenTelemet metricPipeline.Receivers = []string{"otlp", "prometheus"} metricPipeline.Exporters = []string{exporterId} metricPipeline.Processors = []string{"memory_limiter", "filter/metrics", "resource"} - if tmplConfig.SREMetrics.Enabled { - if processorID := addCustomerMetricsDropLabelsProcessor(otelConfig, tmplConfig.SREMetrics.CustomerMetricsDropLabels); processorID != "" { + if tmplConfig.MetricSubset.Enabled { + if processorID := addCustomerMetricsDropLabelsProcessor(otelConfig, tmplConfig.MetricSubset.CustomerMetricsDropLabels); processorID != "" { metricPipeline.Processors = append(metricPipeline.Processors, processorID) } } metricPipeline.Processors = append(metricPipeline.Processors, "metrics_transform", "batch") otelConfig.Service.Pipelines["metrics"] = metricPipeline - if tmplConfig.SREMetrics.Enabled { - addSREMetricsPipeline(otelConfig, tmplConfig.SREMetrics) + if tmplConfig.MetricSubset.Enabled { + addMetricSubsetPipeline(otelConfig, tmplConfig.MetricSubset) } } diff --git a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render_test.go b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render_test.go index aa8eab97f..e2e6a13db 100644 --- a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render_test.go +++ b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render_test.go @@ -97,7 +97,7 @@ func TestRenderOtelConfig(t *testing.T) { } } -func TestRenderOtelConfigWithSREMetricsPipeline(t *testing.T) { +func TestRenderOtelConfigWithMetricSubsetPipeline(t *testing.T) { gotCfg, err := RenderOtelConfigFromBytes( []byte(`{"telemetries": {"metricsTelemetry": {"protocol": "HTTP", "provider": "PROMETHEUS", "endpoint": "https://metrics.example.invalid/api/v1/write", "name": "example-metrics"}}}`), TemplateConfig{ @@ -108,9 +108,9 @@ func TestRenderOtelConfigWithSREMetricsPipeline(t *testing.T) { FunctionVersionID: "fake-function-version-id", InstanceID: "fake-instance-id", ZoneName: "fake-zone-name", - SREMetrics: SREMetricsConfig{ + MetricSubset: MetricSubsetConfig{ Enabled: true, - FilterConfig: defaultSREMetricsFilterConfig(), + FilterConfig: defaultMetricSubsetFilterConfig(), CustomerMetricsDropLabels: defaultCustomerMetricsDropLabels, }, }, @@ -121,21 +121,21 @@ func TestRenderOtelConfigWithSREMetricsPipeline(t *testing.T) { otelConfig := &OpenTelemetryConfig{} err = yaml.Unmarshal(gotCfg, otelConfig) assert.NoError(t, err) - assert.Contains(t, otelConfig.Exporters, sreMetricsExporterID) - assert.Contains(t, otelConfig.Processors, sreMetricsFilterProcessorID) - assert.Contains(t, otelConfig.Processors, sreMetricsBatchProcessorID) - assert.Equal(t, []string{"otlp"}, otelConfig.Service.Pipelines["metrics/sre"].Receivers) - assert.Equal(t, []string{sreMetricsExporterID}, otelConfig.Service.Pipelines["metrics/sre"].Exporters) + assert.Contains(t, otelConfig.Exporters, metricSubsetExporterID) + assert.Contains(t, otelConfig.Processors, metricSubsetFilterProcessorID) + assert.Contains(t, otelConfig.Processors, metricSubsetBatchProcessorID) + assert.Equal(t, []string{"otlp"}, otelConfig.Service.Pipelines["metrics/metric_subset"].Receivers) + assert.Equal(t, []string{metricSubsetExporterID}, otelConfig.Service.Pipelines["metrics/metric_subset"].Exporters) assert.Equal(t, []string{ "memory_limiter", - sreMetricsFilterProcessorID, + metricSubsetFilterProcessorID, "resource", "metrics_transform", - sreMetricsBatchProcessorID, - }, otelConfig.Service.Pipelines["metrics/sre"].Processors) + metricSubsetBatchProcessorID, + }, otelConfig.Service.Pipelines["metrics/metric_subset"].Processors) } -func TestRenderOtelConfigWithSREMetricsPipelineMatchesExample(t *testing.T) { +func TestRenderOtelConfigWithMetricSubsetPipelineMatchesExample(t *testing.T) { t.Setenv("ESS_SECRETS_PATH", "") gotCfg, err := RenderOtelConfigFromBytes( @@ -148,27 +148,27 @@ func TestRenderOtelConfigWithSREMetricsPipelineMatchesExample(t *testing.T) { FunctionVersionID: "fake-function-version-id", InstanceID: "fake-instance-id", ZoneName: "fake-zone-name", - SREMetrics: SREMetricsConfig{ + MetricSubset: MetricSubsetConfig{ Enabled: true, - FilterConfig: defaultSREMetricsFilterConfig(), + FilterConfig: defaultMetricSubsetFilterConfig(), CustomerMetricsDropLabels: defaultCustomerMetricsDropLabels, }, }, ) if err != nil { - t.Fatalf("failed to render SRE metrics config: %v", err) + t.Fatalf("failed to render metric subset config: %v", err) } - const examplePath = "../../examples/otelconfigs/k8s/config_function_container_sre_metrics.yaml" - if os.Getenv("UPDATE_SRE_METRICS_EXAMPLE") == "true" { + const examplePath = "../../examples/otelconfigs/k8s/config_function_container_metric_subset.yaml" + if os.Getenv("UPDATE_METRIC_SUBSET_EXAMPLE") == "true" { if err := os.WriteFile(examplePath, gotCfg, 0o644); err != nil { - t.Fatalf("failed to update SRE metrics example config: %v", err) + t.Fatalf("failed to update metric subset example config: %v", err) } } expectedCfg, err := os.ReadFile(examplePath) if err != nil { - t.Fatalf("failed to read SRE metrics example config: %v", err) + t.Fatalf("failed to read metric subset example config: %v", err) } assertYAMLConfigEqual(t, expectedCfg, gotCfg) @@ -487,7 +487,7 @@ func TestGenerateExportersAndServiceUsesCustomLogExporterBatchMaxSize(t *testing }, exporter["sending_queue"]) } -func TestGenerateExportersAndServiceAddsSREMetricsPipeline(t *testing.T) { +func TestGenerateExportersAndServiceAddsMetricSubsetPipeline(t *testing.T) { cfg := TelemetryConfig{ Telemetries: Telemetries{ Metrics: &Telemetry{ @@ -514,10 +514,10 @@ func TestGenerateExportersAndServiceAddsSREMetricsPipeline(t *testing.T) { err := generateExportersAndService(cfg, otelConfig, TemplateConfig{ Namespace: "test-namespace", - SREMetrics: SREMetricsConfig{ + MetricSubset: MetricSubsetConfig{ Enabled: true, FilterConfig: filterConfig, - CustomerMetricsDropLabels: []string{"sre_metrics_enabled"}, + CustomerMetricsDropLabels: []string{"metric_subset_enabled"}, }, }) @@ -530,9 +530,9 @@ func TestGenerateExportersAndServiceAddsSREMetricsPipeline(t *testing.T) { "send_timestamps": true, "metric_expiration": "5m", "enable_open_metrics": true, - }, otelConfig.Exporters[sreMetricsExporterID]) - assert.Equal(t, filterConfig, otelConfig.Processors[sreMetricsFilterProcessorID]) - assert.Equal(t, otelConfig.Processors["batch"], otelConfig.Processors[sreMetricsBatchProcessorID]) + }, otelConfig.Exporters[metricSubsetExporterID]) + assert.Equal(t, filterConfig, otelConfig.Processors[metricSubsetFilterProcessorID]) + assert.Equal(t, otelConfig.Processors["batch"], otelConfig.Processors[metricSubsetBatchProcessorID]) customerMetricsPipeline := otelConfig.Service.Pipelines["metrics"] assert.Equal(t, []string{"otlp", "prometheus"}, customerMetricsPipeline.Receivers) @@ -545,29 +545,29 @@ func TestGenerateExportersAndServiceAddsSREMetricsPipeline(t *testing.T) { "metrics_transform", "batch", }, customerMetricsPipeline.Processors) - assert.NotContains(t, customerMetricsPipeline.Processors, sreMetricsFilterProcessorID) + assert.NotContains(t, customerMetricsPipeline.Processors, metricSubsetFilterProcessorID) assert.Equal(t, map[string]interface{}{ "attributes": []map[string]interface{}{ { - "key": "sre_metrics_enabled", + "key": "metric_subset_enabled", "action": "delete", }, }, }, otelConfig.Processors[customerMetricsDropLabelsProcessorID]) - sreMetricsPipeline := otelConfig.Service.Pipelines["metrics/sre"] - assert.Equal(t, []string{"otlp"}, sreMetricsPipeline.Receivers) - assert.Equal(t, []string{sreMetricsExporterID}, sreMetricsPipeline.Exporters) + metricSubsetPipeline := otelConfig.Service.Pipelines["metrics/metric_subset"] + assert.Equal(t, []string{"otlp"}, metricSubsetPipeline.Receivers) + assert.Equal(t, []string{metricSubsetExporterID}, metricSubsetPipeline.Exporters) assert.Equal(t, []string{ "memory_limiter", - sreMetricsFilterProcessorID, + metricSubsetFilterProcessorID, "resource", "metrics_transform", - sreMetricsBatchProcessorID, - }, sreMetricsPipeline.Processors) + metricSubsetBatchProcessorID, + }, metricSubsetPipeline.Processors) } -func TestGenerateExportersAndServiceDoesNotAddSREMetricsPipelineWithoutCustomerMetrics(t *testing.T) { +func TestGenerateExportersAndServiceDoesNotAddMetricSubsetPipelineWithoutCustomerMetrics(t *testing.T) { cfg := TelemetryConfig{ Telemetries: Telemetries{ Logs: &Telemetry{ @@ -583,15 +583,15 @@ func TestGenerateExportersAndServiceDoesNotAddSREMetricsPipelineWithoutCustomerM err := generateExportersAndService(cfg, otelConfig, TemplateConfig{ Namespace: "test-namespace", - SREMetrics: SREMetricsConfig{ + MetricSubset: MetricSubsetConfig{ Enabled: true, }, }) assert.NoError(t, err) - assert.NotContains(t, otelConfig.Exporters, sreMetricsExporterID) - assert.NotContains(t, otelConfig.Processors, sreMetricsFilterProcessorID) - assert.NotContains(t, otelConfig.Service.Pipelines, "metrics/sre") + assert.NotContains(t, otelConfig.Exporters, metricSubsetExporterID) + assert.NotContains(t, otelConfig.Processors, metricSubsetFilterProcessorID) + assert.NotContains(t, otelConfig.Service.Pipelines, "metrics/metric_subset") } // Test_exporterMetrics_Datadog_KeepsFirstCumulativeSample is a regression test diff --git a/src/compute-plane-services/nvca/internal/miniservice/reconcile_test.go b/src/compute-plane-services/nvca/internal/miniservice/reconcile_test.go index d6141159c..fca64638b 100644 --- a/src/compute-plane-services/nvca/internal/miniservice/reconcile_test.go +++ b/src/compute-plane-services/nvca/internal/miniservice/reconcile_test.go @@ -260,10 +260,10 @@ func TestReconcile_Function(t *testing.T) { DryRun: true, ExporterBatchMaxSizeBytes: &exporterBatchMaxSizeBytes, } - r.cfg.Agent.BYOOSREMetrics = nvcaconfig.BYOOSREMetricsConfig{ + r.cfg.Agent.BYOOMetricSubset = nvcaconfig.BYOOMetricSubsetConfig{ Enabled: true, FilterConfig: "error_mode: ignore\nmetric_conditions:\n - 'metric.name == \"drop\"'\n", - CustomerMetricsDropLabels: []string{"sre_metrics_enabled", "custom_label"}, + CustomerMetricsDropLabels: []string{"metric_subset_enabled", "custom_label"}, } err := k8sutil.SetConfigDefaultResources(&r.cfg) require.NoError(t, err) @@ -811,7 +811,7 @@ rules: metaEnv[env.Name] = env.Value } assert.NotContains(t, metaEnv, nvcaconfig.BYOOLogChunkMaxBodyBytesEnv) - assert.NotContains(t, metaEnv, nvcaconfig.BYOOSREMetricsEnabledEnv) + assert.NotContains(t, metaEnv, nvcaconfig.BYOOMetricSubsetEnabledEnv) otelCollectorEnv := map[string]string{} for _, env := range msMeta.OTelCollectorEnvVars { otelCollectorEnv[env.Name] = env.Value @@ -819,9 +819,9 @@ rules: assert.Equal(t, "983040", otelCollectorEnv[nvcaconfig.BYOOLogChunkMaxBodyBytesEnv]) assert.Equal(t, "true", otelCollectorEnv[nvcaconfig.BYOOLogChunkDryRunEnv]) assert.Equal(t, "1000000", otelCollectorEnv[nvcaconfig.BYOOLogExporterBatchMaxSizeBytesEnv]) - assert.Equal(t, "true", otelCollectorEnv[nvcaconfig.BYOOSREMetricsEnabledEnv]) - assert.Contains(t, otelCollectorEnv[nvcaconfig.BYOOSREMetricsFilterConfigEnv], "metric.name") - assert.Equal(t, "sre_metrics_enabled,custom_label", otelCollectorEnv[nvcaconfig.BYOOCustomerMetricsDropLabelsEnv]) + assert.Equal(t, "true", otelCollectorEnv[nvcaconfig.BYOOMetricSubsetEnabledEnv]) + assert.Contains(t, otelCollectorEnv[nvcaconfig.BYOOMetricSubsetFilterConfigEnv], "metric.name") + assert.Equal(t, "metric_subset_enabled,custom_label", otelCollectorEnv[nvcaconfig.BYOOCustomerMetricsDropLabelsEnv]) assert.Equal(t, nodefeatures.UniformInstanceTypeLabelKey, msMeta.NodeAffinityKey) assert.Equal(t, []corev1.Toleration{configuredToleration}, msMeta.Tolerations) diff --git a/src/compute-plane-services/nvca/internal/util/k8sutil/byoo_env_vars_test.go b/src/compute-plane-services/nvca/internal/util/k8sutil/byoo_env_vars_test.go index dbd8e3e41..b229c1c89 100644 --- a/src/compute-plane-services/nvca/internal/util/k8sutil/byoo_env_vars_test.go +++ b/src/compute-plane-services/nvca/internal/util/k8sutil/byoo_env_vars_test.go @@ -30,12 +30,12 @@ func TestAddBYOOEnvVarsToPodSpecMutatesOnlyBYOOCollectorContainer(t *testing.T) envs := []corev1.EnvVar{ {Name: nvcaconfig.BYOOLogChunkMaxBodyBytesEnv, Value: "983040"}, {Name: nvcaconfig.BYOOLogExporterBatchMaxSizeBytesEnv, Value: "1000000"}, - {Name: nvcaconfig.BYOOSREMetricsEnabledEnv, Value: "true"}, + {Name: nvcaconfig.BYOOMetricSubsetEnabledEnv, Value: "true"}, } expectedEnv := []corev1.EnvVar{ {Name: nvcaconfig.BYOOLogChunkMaxBodyBytesEnv, Value: "983040"}, {Name: nvcaconfig.BYOOLogExporterBatchMaxSizeBytesEnv, Value: "1000000"}, - {Name: nvcaconfig.BYOOSREMetricsEnabledEnv, Value: "true"}, + {Name: nvcaconfig.BYOOMetricSubsetEnabledEnv, Value: "true"}, } pod := &corev1.Pod{ Spec: corev1.PodSpec{ diff --git a/src/compute-plane-services/nvca/pkg/operator/reconcile/nvcaagent_reconcile_test.go b/src/compute-plane-services/nvca/pkg/operator/reconcile/nvcaagent_reconcile_test.go index 95377fcd7..23d06a93c 100644 --- a/src/compute-plane-services/nvca/pkg/operator/reconcile/nvcaagent_reconcile_test.go +++ b/src/compute-plane-services/nvca/pkg/operator/reconcile/nvcaagent_reconcile_test.go @@ -2841,10 +2841,10 @@ func TestEncodeAgentConfig_MergesBYOOConfig(t *testing.T) { DryRun: true, ExporterBatchMaxSizeBytes: ptr.To[int64](1000000), }, - BYOOSREMetrics: nvcaconfig.BYOOSREMetricsConfig{ + BYOOMetricSubset: nvcaconfig.BYOOMetricSubsetConfig{ Enabled: true, FilterConfig: "error_mode: ignore\nmetric_conditions:\n - 'metric.name == \"drop\"'\n", - CustomerMetricsDropLabels: []string{"sre_metrics_enabled", "custom_label"}, + CustomerMetricsDropLabels: []string{"metric_subset_enabled", "custom_label"}, }, }, } @@ -2862,9 +2862,9 @@ func TestEncodeAgentConfig_MergesBYOOConfig(t *testing.T) { assert.True(t, got.Agent.BYOOLogChunking.DryRun) require.NotNil(t, got.Agent.BYOOLogChunking.ExporterBatchMaxSizeBytes) assert.Equal(t, int64(1000000), *got.Agent.BYOOLogChunking.ExporterBatchMaxSizeBytes) - assert.True(t, got.Agent.BYOOSREMetrics.Enabled) - assert.Contains(t, got.Agent.BYOOSREMetrics.FilterConfig, "metric.name") - assert.Equal(t, []string{"sre_metrics_enabled", "custom_label"}, got.Agent.BYOOSREMetrics.CustomerMetricsDropLabels) + assert.True(t, got.Agent.BYOOMetricSubset.Enabled) + assert.Contains(t, got.Agent.BYOOMetricSubset.FilterConfig, "metric.name") + assert.Equal(t, []string{"metric_subset_enabled", "custom_label"}, got.Agent.BYOOMetricSubset.CustomerMetricsDropLabels) } func TestAgentHostOverrideConfig_ClearsReValHostForSelfHostedColocatedService(t *testing.T) { diff --git a/src/compute-plane-services/nvca/pkg/webhook/miniservice_mutating_webhook_test.go b/src/compute-plane-services/nvca/pkg/webhook/miniservice_mutating_webhook_test.go index e3de06cb1..5c4ff38dd 100644 --- a/src/compute-plane-services/nvca/pkg/webhook/miniservice_mutating_webhook_test.go +++ b/src/compute-plane-services/nvca/pkg/webhook/miniservice_mutating_webhook_test.go @@ -1194,7 +1194,7 @@ func TestMiniserviceMutatePodSpec_BYOOOTelCollectorEnvVarsOnlyCollector(t *testi OTelCollectorEnvVars: []corev1.EnvVar{ {Name: nvcaconfig.BYOOLogChunkMaxBodyBytesEnv, Value: "983040"}, {Name: nvcaconfig.BYOOLogExporterBatchMaxSizeBytesEnv, Value: "1000000"}, - {Name: nvcaconfig.BYOOSREMetricsEnabledEnv, Value: "true"}, + {Name: nvcaconfig.BYOOMetricSubsetEnabledEnv, Value: "true"}, }, } ps := corev1.PodSpec{ @@ -1221,11 +1221,11 @@ func TestMiniserviceMutatePodSpec_BYOOOTelCollectorEnvVarsOnlyCollector(t *testi assert.Equal(t, "shared", collectorByName["SHARED_ENV"]) assert.NotContains(t, initByName, nvcaconfig.BYOOLogChunkMaxBodyBytesEnv) assert.NotContains(t, appByName, nvcaconfig.BYOOLogChunkMaxBodyBytesEnv) - assert.NotContains(t, initByName, nvcaconfig.BYOOSREMetricsEnabledEnv) - assert.NotContains(t, appByName, nvcaconfig.BYOOSREMetricsEnabledEnv) + assert.NotContains(t, initByName, nvcaconfig.BYOOMetricSubsetEnabledEnv) + assert.NotContains(t, appByName, nvcaconfig.BYOOMetricSubsetEnabledEnv) assert.Equal(t, "983040", collectorByName[nvcaconfig.BYOOLogChunkMaxBodyBytesEnv]) assert.Equal(t, "1000000", collectorByName[nvcaconfig.BYOOLogExporterBatchMaxSizeBytesEnv]) - assert.Equal(t, "true", collectorByName[nvcaconfig.BYOOSREMetricsEnabledEnv]) + assert.Equal(t, "true", collectorByName[nvcaconfig.BYOOMetricSubsetEnabledEnv]) } func envNames(envs []corev1.EnvVar) []string { diff --git a/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/types.go b/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/types.go index 458bc82d2..d5a4c8e95 100644 --- a/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/types.go +++ b/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/types.go @@ -59,10 +59,10 @@ const ( BYOOLogChunkDryRunEnv = "BYOO_LOG_CHUNK_DRY_RUN" // BYOOLogExporterBatchMaxSizeBytesEnv is the BYOO collector env var for exporterhelper byte batch splitting. BYOOLogExporterBatchMaxSizeBytesEnv = "BYOO_LOG_EXPORTER_BATCH_MAX_SIZE_BYTES" - // BYOOSREMetricsEnabledEnv is the BYOO collector env var that enables the SRE metrics pipeline. - BYOOSREMetricsEnabledEnv = "BYOO_SRE_METRICS_ENABLED" - // BYOOSREMetricsFilterConfigEnv is the BYOO collector env var for SRE metrics filter config YAML. - BYOOSREMetricsFilterConfigEnv = "BYOO_SRE_METRICS_FILTER_CONFIG" + // BYOOMetricSubsetEnabledEnv is the BYOO collector env var that enables the metric subset pipeline. + BYOOMetricSubsetEnabledEnv = "BYOO_METRIC_SUBSET_ENABLED" + // BYOOMetricSubsetFilterConfigEnv is the BYOO collector env var for metric subset filter config YAML. + BYOOMetricSubsetFilterConfigEnv = "BYOO_METRIC_SUBSET_FILTER_CONFIG" // BYOOCustomerMetricsDropLabelsEnv is the BYOO collector env var for customer metrics resource labels to drop. BYOOCustomerMetricsDropLabelsEnv = "BYOO_CUSTOMER_METRICS_DROP_LABELS" @@ -117,28 +117,28 @@ func BYOOLogChunkingEnvVars(config BYOOLogChunkingConfig) []corev1.EnvVar { return config.EnvVars() } -type BYOOSREMetricsConfig struct { +type BYOOMetricSubsetConfig struct { Enabled bool `yaml:"enabled,omitempty"` FilterConfig string `yaml:"filterConfig,omitempty"` CustomerMetricsDropLabels []string `yaml:"customerMetricsDropLabels,omitempty"` } -func (c BYOOSREMetricsConfig) IsZero() bool { +func (c BYOOMetricSubsetConfig) IsZero() bool { return !c.Enabled && c.FilterConfig == "" && len(c.CustomerMetricsDropLabels) == 0 } -// EnvVars returns BYOO collector env vars for the supplied SRE metrics config. -func (c BYOOSREMetricsConfig) EnvVars() []corev1.EnvVar { +// EnvVars returns BYOO collector env vars for the supplied metric subset config. +func (c BYOOMetricSubsetConfig) EnvVars() []corev1.EnvVar { envs := []corev1.EnvVar{} if c.Enabled { envs = append(envs, corev1.EnvVar{ - Name: BYOOSREMetricsEnabledEnv, + Name: BYOOMetricSubsetEnabledEnv, Value: strconv.FormatBool(c.Enabled), }) } if c.FilterConfig != "" { envs = append(envs, corev1.EnvVar{ - Name: BYOOSREMetricsFilterConfigEnv, + Name: BYOOMetricSubsetFilterConfigEnv, Value: c.FilterConfig, }) } @@ -382,8 +382,8 @@ type AgentConfig struct { // BYOOLogChunking contains BYOO OTel collector log chunking and exporter batch settings. BYOOLogChunking BYOOLogChunkingConfig `yaml:",omitempty"` - // BYOOSREMetrics contains BYOO OTel collector SRE metrics pipeline settings. - BYOOSREMetrics BYOOSREMetricsConfig `yaml:"byooSREMetrics,omitempty"` + // BYOOMetricSubset contains BYOO OTel collector metric subset pipeline settings. + BYOOMetricSubset BYOOMetricSubsetConfig `yaml:"byooMetricSubset,omitempty"` } func (t AgentConfig) Complete(env Environment) AgentConfig { @@ -399,7 +399,7 @@ func (t AgentConfig) Complete(env Environment) AgentConfig { // BYOOOTelCollectorEnvVars returns env vars that must be set only on the BYOO OTel collector container. func (t AgentConfig) BYOOOTelCollectorEnvVars() []corev1.EnvVar { envs := t.BYOOLogChunking.EnvVars() - return append(envs, t.BYOOSREMetrics.EnvVars()...) + return append(envs, t.BYOOMetricSubset.EnvVars()...) } const ( diff --git a/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go b/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go index fea418205..753867b0e 100644 --- a/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go +++ b/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go @@ -71,7 +71,7 @@ func (in *AgentConfig) DeepCopyInto(out *AgentConfig) { in.BYOOResources.DeepCopyInto(&out.BYOOResources) in.BYOOFluentBitResources.DeepCopyInto(&out.BYOOFluentBitResources) in.BYOOLogChunking.DeepCopyInto(&out.BYOOLogChunking) - in.BYOOSREMetrics.DeepCopyInto(&out.BYOOSREMetrics) + in.BYOOMetricSubset.DeepCopyInto(&out.BYOOMetricSubset) return } @@ -155,7 +155,7 @@ func (in *BYOOLogChunkingConfig) DeepCopy() *BYOOLogChunkingConfig { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *BYOOSREMetricsConfig) DeepCopyInto(out *BYOOSREMetricsConfig) { +func (in *BYOOMetricSubsetConfig) DeepCopyInto(out *BYOOMetricSubsetConfig) { *out = *in if in.CustomerMetricsDropLabels != nil { in, out := &in.CustomerMetricsDropLabels, &out.CustomerMetricsDropLabels @@ -165,12 +165,12 @@ func (in *BYOOSREMetricsConfig) DeepCopyInto(out *BYOOSREMetricsConfig) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BYOOSREMetricsConfig. -func (in *BYOOSREMetricsConfig) DeepCopy() *BYOOSREMetricsConfig { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BYOOMetricSubsetConfig. +func (in *BYOOMetricSubsetConfig) DeepCopy() *BYOOMetricSubsetConfig { if in == nil { return nil } - out := new(BYOOSREMetricsConfig) + out := new(BYOOMetricSubsetConfig) in.DeepCopyInto(out) return out } diff --git a/src/libraries/go/lib/pkg/types/nvca/config/config_test.go b/src/libraries/go/lib/pkg/types/nvca/config/config_test.go index 1f4a895e6..c87ad7482 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/config_test.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/config_test.go @@ -397,24 +397,24 @@ agent: assert.Equal(t, ":8080", cfg.Agent.SvcAddress) }) - t.Run("byoo_sre_metrics", func(t *testing.T) { + t.Run("byoo_metric_subset", func(t *testing.T) { data := []byte(` agent: - byooSREMetrics: + byooMetricSubset: enabled: true filterConfig: | error_mode: ignore metric_conditions: - 'metric.name == "drop"' customerMetricsDropLabels: - - sre_metrics_enabled + - metric_subset_enabled - custom_label `) cfg, err := DecodeConfig(data) require.NoError(t, err) - assert.True(t, cfg.Agent.BYOOSREMetrics.Enabled) - assert.Contains(t, cfg.Agent.BYOOSREMetrics.FilterConfig, "metric.name") - assert.Equal(t, []string{"sre_metrics_enabled", "custom_label"}, cfg.Agent.BYOOSREMetrics.CustomerMetricsDropLabels) + assert.True(t, cfg.Agent.BYOOMetricSubset.Enabled) + assert.Contains(t, cfg.Agent.BYOOMetricSubset.FilterConfig, "metric.name") + assert.Equal(t, []string{"metric_subset_enabled", "custom_label"}, cfg.Agent.BYOOMetricSubset.CustomerMetricsDropLabels) }) t.Run("duration_parsing", func(t *testing.T) { diff --git a/src/libraries/go/lib/pkg/types/nvca/config/deepcopy_test.go b/src/libraries/go/lib/pkg/types/nvca/config/deepcopy_test.go index 2c126b47f..aee90111c 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/deepcopy_test.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/deepcopy_test.go @@ -69,11 +69,11 @@ func TestDeepCopy_AgentConfig_Nil(t *testing.T) { assert.Nil(t, out) } -func TestDeepCopy_BYOOSREMetricsConfig(t *testing.T) { - orig := &BYOOSREMetricsConfig{ +func TestDeepCopy_BYOOMetricSubsetConfig(t *testing.T) { + orig := &BYOOMetricSubsetConfig{ Enabled: true, FilterConfig: "error_mode: ignore", - CustomerMetricsDropLabels: []string{"sre_metrics_enabled", "custom_label"}, + CustomerMetricsDropLabels: []string{"metric_subset_enabled", "custom_label"}, } out := orig.DeepCopy() require.NotNil(t, out) @@ -82,7 +82,7 @@ func TestDeepCopy_BYOOSREMetricsConfig(t *testing.T) { assert.Equal(t, orig.CustomerMetricsDropLabels, out.CustomerMetricsDropLabels) orig.CustomerMetricsDropLabels[0] = "changed" - assert.Equal(t, "sre_metrics_enabled", out.CustomerMetricsDropLabels[0]) + assert.Equal(t, "metric_subset_enabled", out.CustomerMetricsDropLabels[0]) } func TestDeepCopy_AllowedExtraKubernetesTypeConfig(t *testing.T) { diff --git a/src/libraries/go/lib/pkg/types/nvca/config/types.go b/src/libraries/go/lib/pkg/types/nvca/config/types.go index 10435a034..205cd939e 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/types.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/types.go @@ -59,10 +59,10 @@ const ( BYOOLogChunkDryRunEnv = "BYOO_LOG_CHUNK_DRY_RUN" // BYOOLogExporterBatchMaxSizeBytesEnv is the BYOO collector env var for exporterhelper byte batch splitting. BYOOLogExporterBatchMaxSizeBytesEnv = "BYOO_LOG_EXPORTER_BATCH_MAX_SIZE_BYTES" - // BYOOSREMetricsEnabledEnv is the BYOO collector env var that enables the SRE metrics pipeline. - BYOOSREMetricsEnabledEnv = "BYOO_SRE_METRICS_ENABLED" - // BYOOSREMetricsFilterConfigEnv is the BYOO collector env var for SRE metrics filter config YAML. - BYOOSREMetricsFilterConfigEnv = "BYOO_SRE_METRICS_FILTER_CONFIG" + // BYOOMetricSubsetEnabledEnv is the BYOO collector env var that enables the metric subset pipeline. + BYOOMetricSubsetEnabledEnv = "BYOO_METRIC_SUBSET_ENABLED" + // BYOOMetricSubsetFilterConfigEnv is the BYOO collector env var for metric subset filter config YAML. + BYOOMetricSubsetFilterConfigEnv = "BYOO_METRIC_SUBSET_FILTER_CONFIG" // BYOOCustomerMetricsDropLabelsEnv is the BYOO collector env var for customer metrics resource labels to drop. BYOOCustomerMetricsDropLabelsEnv = "BYOO_CUSTOMER_METRICS_DROP_LABELS" @@ -117,28 +117,28 @@ func BYOOLogChunkingEnvVars(config BYOOLogChunkingConfig) []corev1.EnvVar { return config.EnvVars() } -type BYOOSREMetricsConfig struct { +type BYOOMetricSubsetConfig struct { Enabled bool `yaml:"enabled,omitempty"` FilterConfig string `yaml:"filterConfig,omitempty"` CustomerMetricsDropLabels []string `yaml:"customerMetricsDropLabels,omitempty"` } -func (c BYOOSREMetricsConfig) IsZero() bool { +func (c BYOOMetricSubsetConfig) IsZero() bool { return !c.Enabled && c.FilterConfig == "" && len(c.CustomerMetricsDropLabels) == 0 } -// EnvVars returns BYOO collector env vars for the supplied SRE metrics config. -func (c BYOOSREMetricsConfig) EnvVars() []corev1.EnvVar { +// EnvVars returns BYOO collector env vars for the supplied metric subset config. +func (c BYOOMetricSubsetConfig) EnvVars() []corev1.EnvVar { envs := []corev1.EnvVar{} if c.Enabled { envs = append(envs, corev1.EnvVar{ - Name: BYOOSREMetricsEnabledEnv, + Name: BYOOMetricSubsetEnabledEnv, Value: strconv.FormatBool(c.Enabled), }) } if c.FilterConfig != "" { envs = append(envs, corev1.EnvVar{ - Name: BYOOSREMetricsFilterConfigEnv, + Name: BYOOMetricSubsetFilterConfigEnv, Value: c.FilterConfig, }) } @@ -382,8 +382,8 @@ type AgentConfig struct { // BYOOLogChunking contains BYOO OTel collector log chunking and exporter batch settings. BYOOLogChunking BYOOLogChunkingConfig `yaml:",omitempty"` - // BYOOSREMetrics contains BYOO OTel collector SRE metrics pipeline settings. - BYOOSREMetrics BYOOSREMetricsConfig `yaml:"byooSREMetrics,omitempty"` + // BYOOMetricSubset contains BYOO OTel collector metric subset pipeline settings. + BYOOMetricSubset BYOOMetricSubsetConfig `yaml:"byooMetricSubset,omitempty"` } func (t AgentConfig) Complete(env Environment) AgentConfig { @@ -399,7 +399,7 @@ func (t AgentConfig) Complete(env Environment) AgentConfig { // BYOOOTelCollectorEnvVars returns env vars that must be set only on the BYOO OTel collector container. func (t AgentConfig) BYOOOTelCollectorEnvVars() []corev1.EnvVar { envs := t.BYOOLogChunking.EnvVars() - return append(envs, t.BYOOSREMetrics.EnvVars()...) + return append(envs, t.BYOOMetricSubset.EnvVars()...) } const ( diff --git a/src/libraries/go/lib/pkg/types/nvca/config/types_test.go b/src/libraries/go/lib/pkg/types/nvca/config/types_test.go index 0c7bc48c7..91459a450 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/types_test.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/types_test.go @@ -86,20 +86,20 @@ func TestAgentConfig_Complete(t *testing.T) { }) } -func TestBYOOSREMetricsConfig_EnvVars(t *testing.T) { - cfg := BYOOSREMetricsConfig{ +func TestBYOOMetricSubsetConfig_EnvVars(t *testing.T) { + cfg := BYOOMetricSubsetConfig{ Enabled: true, FilterConfig: "error_mode: ignore\nmetric_conditions:\n - 'metric.name == \"drop\"'\n", CustomerMetricsDropLabels: []string{ - "sre_metrics_enabled", + "metric_subset_enabled", "custom_label", }, } assert.Equal(t, []corev1.EnvVar{ - {Name: BYOOSREMetricsEnabledEnv, Value: "true"}, - {Name: BYOOSREMetricsFilterConfigEnv, Value: "error_mode: ignore\nmetric_conditions:\n - 'metric.name == \"drop\"'\n"}, - {Name: BYOOCustomerMetricsDropLabelsEnv, Value: "sre_metrics_enabled,custom_label"}, + {Name: BYOOMetricSubsetEnabledEnv, Value: "true"}, + {Name: BYOOMetricSubsetFilterConfigEnv, Value: "error_mode: ignore\nmetric_conditions:\n - 'metric.name == \"drop\"'\n"}, + {Name: BYOOCustomerMetricsDropLabelsEnv, Value: "metric_subset_enabled,custom_label"}, }, cfg.EnvVars()) } @@ -110,17 +110,17 @@ func TestAgentConfig_BYOOOTelCollectorEnvVars(t *testing.T) { MaxBodyBytes: 983040, ExporterBatchMaxSizeBytes: &exporterBatchMaxSizeBytes, }, - BYOOSREMetrics: BYOOSREMetricsConfig{ + BYOOMetricSubset: BYOOMetricSubsetConfig{ Enabled: true, - CustomerMetricsDropLabels: []string{"sre_metrics_enabled"}, + CustomerMetricsDropLabels: []string{"metric_subset_enabled"}, }, } assert.Equal(t, []corev1.EnvVar{ {Name: BYOOLogChunkMaxBodyBytesEnv, Value: "983040"}, {Name: BYOOLogExporterBatchMaxSizeBytesEnv, Value: "1000000"}, - {Name: BYOOSREMetricsEnabledEnv, Value: "true"}, - {Name: BYOOCustomerMetricsDropLabelsEnv, Value: "sre_metrics_enabled"}, + {Name: BYOOMetricSubsetEnabledEnv, Value: "true"}, + {Name: BYOOCustomerMetricsDropLabelsEnv, Value: "metric_subset_enabled"}, }, cfg.BYOOOTelCollectorEnvVars()) } diff --git a/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go b/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go index fea418205..753867b0e 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go @@ -71,7 +71,7 @@ func (in *AgentConfig) DeepCopyInto(out *AgentConfig) { in.BYOOResources.DeepCopyInto(&out.BYOOResources) in.BYOOFluentBitResources.DeepCopyInto(&out.BYOOFluentBitResources) in.BYOOLogChunking.DeepCopyInto(&out.BYOOLogChunking) - in.BYOOSREMetrics.DeepCopyInto(&out.BYOOSREMetrics) + in.BYOOMetricSubset.DeepCopyInto(&out.BYOOMetricSubset) return } @@ -155,7 +155,7 @@ func (in *BYOOLogChunkingConfig) DeepCopy() *BYOOLogChunkingConfig { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *BYOOSREMetricsConfig) DeepCopyInto(out *BYOOSREMetricsConfig) { +func (in *BYOOMetricSubsetConfig) DeepCopyInto(out *BYOOMetricSubsetConfig) { *out = *in if in.CustomerMetricsDropLabels != nil { in, out := &in.CustomerMetricsDropLabels, &out.CustomerMetricsDropLabels @@ -165,12 +165,12 @@ func (in *BYOOSREMetricsConfig) DeepCopyInto(out *BYOOSREMetricsConfig) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BYOOSREMetricsConfig. -func (in *BYOOSREMetricsConfig) DeepCopy() *BYOOSREMetricsConfig { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BYOOMetricSubsetConfig. +func (in *BYOOMetricSubsetConfig) DeepCopy() *BYOOMetricSubsetConfig { if in == nil { return nil } - out := new(BYOOSREMetricsConfig) + out := new(BYOOMetricSubsetConfig) in.DeepCopyInto(out) return out } From aa9261ed9d8f686167a11ddb90bc1a0b9ebfa58e Mon Sep 17 00:00:00 2001 From: Kristina Pathak Date: Tue, 21 Jul 2026 15:40:02 -0700 Subject: [PATCH 5/8] refactor(byoo): move workload metrics drop labels out of subset config Signed-off-by: Kristina Pathak --- .../nvca-operator/nvca-operator/values.yaml | 6 +- .../cluster-management/configuration.md | 6 +- docs/user/cluster-management/configuration.md | 6 +- .../byoo-otel-collector/README.md | 2 +- ...nfig_function_container_metric_subset.yaml | 14 ++-- .../internal/otelconfig/embed_config.go | 26 +++---- .../internal/otelconfig/otelconfig.go | 8 +-- .../internal/otelconfig/otelconfig_test.go | 6 +- .../internal/otelconfig/render.go | 23 ++++--- .../internal/otelconfig/render_test.go | 69 ++++++++++++++----- .../internal/miniservice/reconcile_test.go | 8 +-- .../reconcile/nvcaagent_reconcile_test.go | 8 +-- .../go/lib/pkg/types/nvca/config/types.go | 33 +++++---- .../nvca/config/zz_generated.deepcopy.go | 10 +-- .../lib/pkg/types/nvca/config/config_test.go | 8 +-- .../pkg/types/nvca/config/deepcopy_test.go | 19 +++-- .../go/lib/pkg/types/nvca/config/types.go | 33 +++++---- .../lib/pkg/types/nvca/config/types_test.go | 19 ++--- .../nvca/config/zz_generated.deepcopy.go | 10 +-- 19 files changed, 186 insertions(+), 128 deletions(-) diff --git a/deploy/helm/nvca-operator/nvca-operator/values.yaml b/deploy/helm/nvca-operator/nvca-operator/values.yaml index e2356c12f..ed2de69c3 100644 --- a/deploy/helm/nvca-operator/nvca-operator/values.yaml +++ b/deploy/helm/nvca-operator/nvca-operator/values.yaml @@ -111,9 +111,9 @@ agentConfig: # error_mode: ignore # metric_conditions: # - 'metric.name == "BpsInstrument"' - # customerMetricsDropLabels: - # - metric_subset_enabled - # - custom_label + # byooWorkloadMetricsDropLabels: + # - metric_subset_enabled + # - custom_label ## @section resources Resource requests and limits for the nvca-operator container ## @param resources.limits.cpu CPU limit for the nvca-operator container ## @param resources.limits.memory Memory limit for the nvca-operator container diff --git a/docs/ngc-managed/cluster-management/configuration.md b/docs/ngc-managed/cluster-management/configuration.md index 73fe31042..140e50e54 100644 --- a/docs/ngc-managed/cluster-management/configuration.md +++ b/docs/ngc-managed/cluster-management/configuration.md @@ -745,9 +745,9 @@ BYOO metric subset example: error_mode: ignore metric_conditions: - 'metric.name == "BpsInstrument"' - customerMetricsDropLabels: - - metric_subset_enabled - - custom_label + byooWorkloadMetricsDropLabels: + - metric_subset_enabled + - custom_label ``` **Apply via Helm:** diff --git a/docs/user/cluster-management/configuration.md b/docs/user/cluster-management/configuration.md index cd19e947b..2880ef06e 100644 --- a/docs/user/cluster-management/configuration.md +++ b/docs/user/cluster-management/configuration.md @@ -866,9 +866,9 @@ agentConfig: error_mode: ignore metric_conditions: - 'metric.name == "BpsInstrument"' - customerMetricsDropLabels: - - metric_subset_enabled - - custom_label + byooWorkloadMetricsDropLabels: + - metric_subset_enabled + - custom_label ``` Apply via Helm: diff --git a/src/compute-plane-services/byoo-otel-collector/README.md b/src/compute-plane-services/byoo-otel-collector/README.md index 7afae97e9..aaa0760df 100644 --- a/src/compute-plane-services/byoo-otel-collector/README.md +++ b/src/compute-plane-services/byoo-otel-collector/README.md @@ -131,7 +131,7 @@ Chunking is disabled by default. Configure it with: - `BYOO_LOG_EXPORTER_BATCH_MAX_SIZE_BYTES`: serialized log export request batch size used for exporterhelper byte splitting. `0` or unset uses the default `1000000` bytes. - `BYOO_METRIC_SUBSET_ENABLED`: enables an additional OTLP-only metrics pipeline that exposes filtered user metrics through a Prometheus exporter on port `19091`. Disabled by default. - `BYOO_METRIC_SUBSET_FILTER_CONFIG`: optional YAML filter processor config for the metric subset pipeline. If unset, the default drops every metric except `BpsInstrument`, `FpsInstrument`, `RtdInstrument`, and `StageOpenDuration`, and drops datapoints/resources explicitly labeled `metric_subset_enabled=false`. -- `BYOO_CUSTOMER_METRICS_DROP_LABELS`: comma-separated resource attribute names removed from the customer metrics pipeline when metric subset is enabled. If unset, defaults to `metric_subset_enabled`. +- `BYOO_WORKLOAD_METRICS_DROP_LABELS`: comma-separated resource attribute names removed from the generated workload `metrics` pipeline. If unset, defaults to `metric_subset_enabled` only when the metric subset pipeline is enabled. When chunking is enabled, each emitted chunk preserves the original log metadata and adds these attributes so chunks can be grouped in the backend: diff --git a/src/compute-plane-services/byoo-otel-collector/examples/otelconfigs/k8s/config_function_container_metric_subset.yaml b/src/compute-plane-services/byoo-otel-collector/examples/otelconfigs/k8s/config_function_container_metric_subset.yaml index e89ec5c8a..42e9c7b90 100644 --- a/src/compute-plane-services/byoo-otel-collector/examples/otelconfigs/k8s/config_function_container_metric_subset.yaml +++ b/src/compute-plane-services/byoo-otel-collector/examples/otelconfigs/k8s/config_function_container_metric_subset.yaml @@ -113,11 +113,11 @@ exporters: resource_to_telemetry_conversion: enabled: true send_timestamps: true - prometheusremotewrite/PROMETHEUS-customer-metrics-metrics: - endpoint: https://customer-metrics.example.invalid/api/v1/write + prometheusremotewrite/PROMETHEUS-workload-metrics-metrics: + endpoint: https://workload-metrics.example.invalid/api/v1/write tls: - cert_file: /etc/byoo-otel-collector/secrets/customer-metrics-clientCert - key_file: /etc/byoo-otel-collector/secrets/customer-metrics-clientKey + cert_file: /etc/byoo-otel-collector/secrets/workload-metrics-clientCert + key_file: /etc/byoo-otel-collector/secrets/workload-metrics-clientKey processors: attributes/add-metadata: actions: @@ -206,7 +206,7 @@ processors: attributes: - action: delete key: service.instance.id - resource/customer_metrics: + resource/workload_metrics_drop_labels: attributes: - action: delete key: metric_subset_enabled @@ -270,12 +270,12 @@ service: - otlp - prometheus exporters: - - prometheusremotewrite/PROMETHEUS-customer-metrics-metrics + - prometheusremotewrite/PROMETHEUS-workload-metrics-metrics processors: - memory_limiter - filter/metrics - resource - - resource/customer_metrics + - resource/workload_metrics_drop_labels - metrics_transform - batch metrics/metric_subset: diff --git a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/embed_config.go b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/embed_config.go index f2be67e7b..00148d540 100644 --- a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/embed_config.go +++ b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/embed_config.go @@ -38,16 +38,17 @@ func init() { } type TemplateConfig struct { - BackendType BackendType - WorkloadType WorkloadType - Namespace string - FunctionID string - FunctionVersionID string - TaskID string - InstanceID string - ZoneName string - LogChunking LogChunkingConfig - MetricSubset MetricSubsetConfig + BackendType BackendType + WorkloadType WorkloadType + Namespace string + FunctionID string + FunctionVersionID string + TaskID string + InstanceID string + ZoneName string + LogChunking LogChunkingConfig + MetricSubset MetricSubsetConfig + WorkloadMetricsDropLabels []string // LogExporterBatchMaxSizeBytes configures exporterhelper byte batching for logs. // Zero uses the default selected for BYOO. LogExporterBatchMaxSizeBytes int @@ -59,9 +60,8 @@ type LogChunkingConfig struct { } type MetricSubsetConfig struct { - Enabled bool - FilterConfig map[string]interface{} - CustomerMetricsDropLabels []string + Enabled bool + FilterConfig map[string]interface{} } func ExecuteTemplate(w io.Writer, tcfg TemplateConfig) error { diff --git a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig.go b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig.go index 78ce6b50a..75a0b7033 100644 --- a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig.go +++ b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig.go @@ -44,7 +44,7 @@ type envConfig struct { ByooLogExporterBatchMaxSizeBytes int `split_words:"true"` ByooMetricSubsetEnabled bool `split_words:"true"` ByooMetricSubsetFilterConfig string `split_words:"true"` - ByooCustomerMetricsDropLabels string `split_words:"true"` + ByooWorkloadMetricsDropLabels string `split_words:"true"` } func processEnvConfig(env *envConfig) error { @@ -84,10 +84,10 @@ func getTemplateConfig() (TemplateConfig, error) { return TemplateConfig{}, fmt.Errorf("BYOO_METRIC_SUBSET_FILTER_CONFIG: %w", err) } tcgf.MetricSubset = MetricSubsetConfig{ - Enabled: env.ByooMetricSubsetEnabled, - FilterConfig: metricSubsetFilterConfig, - CustomerMetricsDropLabels: resolvedCustomerMetricsDropLabels(env.ByooCustomerMetricsDropLabels), + Enabled: env.ByooMetricSubsetEnabled, + FilterConfig: metricSubsetFilterConfig, } + tcgf.WorkloadMetricsDropLabels = resolvedWorkloadMetricsDropLabels(env.ByooWorkloadMetricsDropLabels, env.ByooMetricSubsetEnabled) functionID := env.NvcfFunctionID functionVersionID := env.NvcfFunctionVersionID diff --git a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig_test.go b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig_test.go index eb84713b9..c743b01c3 100644 --- a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig_test.go +++ b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig_test.go @@ -127,7 +127,7 @@ func TestGetTemplateConfig(t *testing.T) { "NVCF_ZONE_NAME": "zone-1", "BYOO_METRIC_SUBSET_ENABLED": "true", "BYOO_METRIC_SUBSET_FILTER_CONFIG": "error_mode: ignore\nmetric_conditions:\n - 'metric.name == \"drop\"'\n", - "BYOO_CUSTOMER_METRICS_DROP_LABELS": "metric_subset_enabled, custom_label, metric_subset_enabled", + "BYOO_WORKLOAD_METRICS_DROP_LABELS": "metric_subset_enabled, custom_label, metric_subset_enabled", }, expectErr: false, expect: func(t *testing.T, cfg TemplateConfig) { @@ -138,7 +138,7 @@ func TestGetTemplateConfig(t *testing.T) { `metric.name == "drop"`, }, }, cfg.MetricSubset.FilterConfig) - assert.Equal(t, []string{"metric_subset_enabled", "custom_label"}, cfg.MetricSubset.CustomerMetricsDropLabels) + assert.Equal(t, []string{"metric_subset_enabled", "custom_label"}, cfg.WorkloadMetricsDropLabels) }, }, { @@ -242,7 +242,7 @@ func TestGetTemplateConfig(t *testing.T) { "BYOO_LOG_EXPORTER_BATCH_MAX_SIZE_BYTES", "BYOO_METRIC_SUBSET_ENABLED", "BYOO_METRIC_SUBSET_FILTER_CONFIG", - "BYOO_CUSTOMER_METRICS_DROP_LABELS", + "BYOO_WORKLOAD_METRICS_DROP_LABELS", } backup := map[string]*string{} for _, k := range envKeys { diff --git a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render.go b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render.go index a0d223a0a..40c1ee166 100644 --- a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render.go +++ b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render.go @@ -70,11 +70,11 @@ const ( metricSubsetExporterID = "prometheus/user-metrics" metricSubsetFilterProcessorID = "filter/metric_subset" metricSubsetBatchProcessorID = "batch/metric_subset" - customerMetricsDropLabelsProcessorID = "resource/customer_metrics" + workloadMetricsDropLabelsProcessorID = "resource/workload_metrics_drop_labels" defaultMetricSubsetPort = 19091 ) -var defaultCustomerMetricsDropLabels = []string{ +var defaultWorkloadMetricsDropLabels = []string{ "metric_subset_enabled", } @@ -222,9 +222,12 @@ func mapFromConfigValue(value interface{}, field string) (map[string]interface{} return configMap, nil } -func resolvedCustomerMetricsDropLabels(configured string) []string { +func resolvedWorkloadMetricsDropLabels(configured string, metricSubsetEnabled bool) []string { if strings.TrimSpace(configured) == "" { - return append([]string(nil), defaultCustomerMetricsDropLabels...) + if !metricSubsetEnabled { + return nil + } + return append([]string(nil), defaultWorkloadMetricsDropLabels...) } seen := map[string]struct{}{} @@ -497,7 +500,7 @@ func exporterMetrics(config TelemetryConfig, otelConfig *OpenTelemetryConfig) (e return exporterId, nil } -func addCustomerMetricsDropLabelsProcessor(otelConfig *OpenTelemetryConfig, labels []string) string { +func addWorkloadMetricsDropLabelsProcessor(otelConfig *OpenTelemetryConfig, labels []string) string { if len(labels) == 0 { return "" } @@ -509,10 +512,10 @@ func addCustomerMetricsDropLabelsProcessor(otelConfig *OpenTelemetryConfig, labe "action": "delete", }) } - otelConfig.Processors[customerMetricsDropLabelsProcessorID] = map[string]interface{}{ + otelConfig.Processors[workloadMetricsDropLabelsProcessorID] = map[string]interface{}{ "attributes": actions, } - return customerMetricsDropLabelsProcessorID + return workloadMetricsDropLabelsProcessorID } func addMetricSubsetExporter(otelConfig *OpenTelemetryConfig) { @@ -812,10 +815,8 @@ func generateExportersAndService(config TelemetryConfig, otelConfig *OpenTelemet metricPipeline.Receivers = []string{"otlp", "prometheus"} metricPipeline.Exporters = []string{exporterId} metricPipeline.Processors = []string{"memory_limiter", "filter/metrics", "resource"} - if tmplConfig.MetricSubset.Enabled { - if processorID := addCustomerMetricsDropLabelsProcessor(otelConfig, tmplConfig.MetricSubset.CustomerMetricsDropLabels); processorID != "" { - metricPipeline.Processors = append(metricPipeline.Processors, processorID) - } + if processorID := addWorkloadMetricsDropLabelsProcessor(otelConfig, tmplConfig.WorkloadMetricsDropLabels); processorID != "" { + metricPipeline.Processors = append(metricPipeline.Processors, processorID) } metricPipeline.Processors = append(metricPipeline.Processors, "metrics_transform", "batch") otelConfig.Service.Pipelines["metrics"] = metricPipeline diff --git a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render_test.go b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render_test.go index e2e6a13db..d0c36126b 100644 --- a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render_test.go +++ b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render_test.go @@ -109,10 +109,10 @@ func TestRenderOtelConfigWithMetricSubsetPipeline(t *testing.T) { InstanceID: "fake-instance-id", ZoneName: "fake-zone-name", MetricSubset: MetricSubsetConfig{ - Enabled: true, - FilterConfig: defaultMetricSubsetFilterConfig(), - CustomerMetricsDropLabels: defaultCustomerMetricsDropLabels, + Enabled: true, + FilterConfig: defaultMetricSubsetFilterConfig(), }, + WorkloadMetricsDropLabels: defaultWorkloadMetricsDropLabels, }, ) @@ -139,7 +139,7 @@ func TestRenderOtelConfigWithMetricSubsetPipelineMatchesExample(t *testing.T) { t.Setenv("ESS_SECRETS_PATH", "") gotCfg, err := RenderOtelConfigFromBytes( - []byte(`{"telemetries": {"metricsTelemetry": {"protocol": "HTTP", "provider": "PROMETHEUS", "endpoint": "https://customer-metrics.example.invalid/api/v1/write", "name": "customer-metrics"}}}`), + []byte(`{"telemetries": {"metricsTelemetry": {"protocol": "HTTP", "provider": "PROMETHEUS", "endpoint": "https://workload-metrics.example.invalid/api/v1/write", "name": "workload-metrics"}}}`), TemplateConfig{ BackendType: K8s, WorkloadType: Container, @@ -149,10 +149,10 @@ func TestRenderOtelConfigWithMetricSubsetPipelineMatchesExample(t *testing.T) { InstanceID: "fake-instance-id", ZoneName: "fake-zone-name", MetricSubset: MetricSubsetConfig{ - Enabled: true, - FilterConfig: defaultMetricSubsetFilterConfig(), - CustomerMetricsDropLabels: defaultCustomerMetricsDropLabels, + Enabled: true, + FilterConfig: defaultMetricSubsetFilterConfig(), }, + WorkloadMetricsDropLabels: defaultWorkloadMetricsDropLabels, }, ) if err != nil { @@ -515,10 +515,10 @@ func TestGenerateExportersAndServiceAddsMetricSubsetPipeline(t *testing.T) { err := generateExportersAndService(cfg, otelConfig, TemplateConfig{ Namespace: "test-namespace", MetricSubset: MetricSubsetConfig{ - Enabled: true, - FilterConfig: filterConfig, - CustomerMetricsDropLabels: []string{"metric_subset_enabled"}, + Enabled: true, + FilterConfig: filterConfig, }, + WorkloadMetricsDropLabels: []string{"metric_subset_enabled"}, }) assert.NoError(t, err) @@ -534,18 +534,18 @@ func TestGenerateExportersAndServiceAddsMetricSubsetPipeline(t *testing.T) { assert.Equal(t, filterConfig, otelConfig.Processors[metricSubsetFilterProcessorID]) assert.Equal(t, otelConfig.Processors["batch"], otelConfig.Processors[metricSubsetBatchProcessorID]) - customerMetricsPipeline := otelConfig.Service.Pipelines["metrics"] - assert.Equal(t, []string{"otlp", "prometheus"}, customerMetricsPipeline.Receivers) - assert.Equal(t, []string{"prometheusremotewrite/PROMETHEUS-example-metrics-metrics"}, customerMetricsPipeline.Exporters) + workloadMetricsPipeline := otelConfig.Service.Pipelines["metrics"] + assert.Equal(t, []string{"otlp", "prometheus"}, workloadMetricsPipeline.Receivers) + assert.Equal(t, []string{"prometheusremotewrite/PROMETHEUS-example-metrics-metrics"}, workloadMetricsPipeline.Exporters) assert.Equal(t, []string{ "memory_limiter", "filter/metrics", "resource", - customerMetricsDropLabelsProcessorID, + workloadMetricsDropLabelsProcessorID, "metrics_transform", "batch", - }, customerMetricsPipeline.Processors) - assert.NotContains(t, customerMetricsPipeline.Processors, metricSubsetFilterProcessorID) + }, workloadMetricsPipeline.Processors) + assert.NotContains(t, workloadMetricsPipeline.Processors, metricSubsetFilterProcessorID) assert.Equal(t, map[string]interface{}{ "attributes": []map[string]interface{}{ { @@ -553,7 +553,7 @@ func TestGenerateExportersAndServiceAddsMetricSubsetPipeline(t *testing.T) { "action": "delete", }, }, - }, otelConfig.Processors[customerMetricsDropLabelsProcessorID]) + }, otelConfig.Processors[workloadMetricsDropLabelsProcessorID]) metricSubsetPipeline := otelConfig.Service.Pipelines["metrics/metric_subset"] assert.Equal(t, []string{"otlp"}, metricSubsetPipeline.Receivers) @@ -567,7 +567,40 @@ func TestGenerateExportersAndServiceAddsMetricSubsetPipeline(t *testing.T) { }, metricSubsetPipeline.Processors) } -func TestGenerateExportersAndServiceDoesNotAddMetricSubsetPipelineWithoutCustomerMetrics(t *testing.T) { +func TestGenerateExportersAndServiceAddsWorkloadMetricsDropLabelsWithoutMetricSubset(t *testing.T) { + cfg := TelemetryConfig{ + Telemetries: Telemetries{ + Metrics: &Telemetry{ + Name: "example-metrics", + Protocol: ProtocolHTTP, + Provider: ProviderPrometheus, + Endpoint: "https://metrics.example.invalid/api/v1/write", + }, + }, + } + otelConfig := &OpenTelemetryConfig{} + initializeConfigMaps(otelConfig) + + err := generateExportersAndService(cfg, otelConfig, TemplateConfig{ + Namespace: "test-namespace", + WorkloadMetricsDropLabels: []string{"workload_label"}, + }) + + assert.NoError(t, err) + assert.NotContains(t, otelConfig.Exporters, metricSubsetExporterID) + assert.NotContains(t, otelConfig.Service.Pipelines, "metrics/metric_subset") + assert.Equal(t, map[string]interface{}{ + "attributes": []map[string]interface{}{ + { + "key": "workload_label", + "action": "delete", + }, + }, + }, otelConfig.Processors[workloadMetricsDropLabelsProcessorID]) + assert.Contains(t, otelConfig.Service.Pipelines["metrics"].Processors, workloadMetricsDropLabelsProcessorID) +} + +func TestGenerateExportersAndServiceDoesNotAddMetricSubsetPipelineWithoutMetricsTelemetry(t *testing.T) { cfg := TelemetryConfig{ Telemetries: Telemetries{ Logs: &Telemetry{ diff --git a/src/compute-plane-services/nvca/internal/miniservice/reconcile_test.go b/src/compute-plane-services/nvca/internal/miniservice/reconcile_test.go index fca64638b..e0751ee05 100644 --- a/src/compute-plane-services/nvca/internal/miniservice/reconcile_test.go +++ b/src/compute-plane-services/nvca/internal/miniservice/reconcile_test.go @@ -261,10 +261,10 @@ func TestReconcile_Function(t *testing.T) { ExporterBatchMaxSizeBytes: &exporterBatchMaxSizeBytes, } r.cfg.Agent.BYOOMetricSubset = nvcaconfig.BYOOMetricSubsetConfig{ - Enabled: true, - FilterConfig: "error_mode: ignore\nmetric_conditions:\n - 'metric.name == \"drop\"'\n", - CustomerMetricsDropLabels: []string{"metric_subset_enabled", "custom_label"}, + Enabled: true, + FilterConfig: "error_mode: ignore\nmetric_conditions:\n - 'metric.name == \"drop\"'\n", } + r.cfg.Agent.BYOOWorkloadMetricsDropLabels = []string{"metric_subset_enabled", "custom_label"} err := k8sutil.SetConfigDefaultResources(&r.cfg) require.NoError(t, err) r.cfg.Workload.Tolerations = []corev1.Toleration{configuredToleration} @@ -821,7 +821,7 @@ rules: assert.Equal(t, "1000000", otelCollectorEnv[nvcaconfig.BYOOLogExporterBatchMaxSizeBytesEnv]) assert.Equal(t, "true", otelCollectorEnv[nvcaconfig.BYOOMetricSubsetEnabledEnv]) assert.Contains(t, otelCollectorEnv[nvcaconfig.BYOOMetricSubsetFilterConfigEnv], "metric.name") - assert.Equal(t, "metric_subset_enabled,custom_label", otelCollectorEnv[nvcaconfig.BYOOCustomerMetricsDropLabelsEnv]) + assert.Equal(t, "metric_subset_enabled,custom_label", otelCollectorEnv[nvcaconfig.BYOOWorkloadMetricsDropLabelsEnv]) assert.Equal(t, nodefeatures.UniformInstanceTypeLabelKey, msMeta.NodeAffinityKey) assert.Equal(t, []corev1.Toleration{configuredToleration}, msMeta.Tolerations) diff --git a/src/compute-plane-services/nvca/pkg/operator/reconcile/nvcaagent_reconcile_test.go b/src/compute-plane-services/nvca/pkg/operator/reconcile/nvcaagent_reconcile_test.go index 23d06a93c..be6619206 100644 --- a/src/compute-plane-services/nvca/pkg/operator/reconcile/nvcaagent_reconcile_test.go +++ b/src/compute-plane-services/nvca/pkg/operator/reconcile/nvcaagent_reconcile_test.go @@ -2842,10 +2842,10 @@ func TestEncodeAgentConfig_MergesBYOOConfig(t *testing.T) { ExporterBatchMaxSizeBytes: ptr.To[int64](1000000), }, BYOOMetricSubset: nvcaconfig.BYOOMetricSubsetConfig{ - Enabled: true, - FilterConfig: "error_mode: ignore\nmetric_conditions:\n - 'metric.name == \"drop\"'\n", - CustomerMetricsDropLabels: []string{"metric_subset_enabled", "custom_label"}, + Enabled: true, + FilterConfig: "error_mode: ignore\nmetric_conditions:\n - 'metric.name == \"drop\"'\n", }, + BYOOWorkloadMetricsDropLabels: []string{"metric_subset_enabled", "custom_label"}, }, } @@ -2864,7 +2864,7 @@ func TestEncodeAgentConfig_MergesBYOOConfig(t *testing.T) { assert.Equal(t, int64(1000000), *got.Agent.BYOOLogChunking.ExporterBatchMaxSizeBytes) assert.True(t, got.Agent.BYOOMetricSubset.Enabled) assert.Contains(t, got.Agent.BYOOMetricSubset.FilterConfig, "metric.name") - assert.Equal(t, []string{"metric_subset_enabled", "custom_label"}, got.Agent.BYOOMetricSubset.CustomerMetricsDropLabels) + assert.Equal(t, []string{"metric_subset_enabled", "custom_label"}, got.Agent.BYOOWorkloadMetricsDropLabels) } func TestAgentHostOverrideConfig_ClearsReValHostForSelfHostedColocatedService(t *testing.T) { diff --git a/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/types.go b/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/types.go index d5a4c8e95..c61e63893 100644 --- a/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/types.go +++ b/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/types.go @@ -63,8 +63,8 @@ const ( BYOOMetricSubsetEnabledEnv = "BYOO_METRIC_SUBSET_ENABLED" // BYOOMetricSubsetFilterConfigEnv is the BYOO collector env var for metric subset filter config YAML. BYOOMetricSubsetFilterConfigEnv = "BYOO_METRIC_SUBSET_FILTER_CONFIG" - // BYOOCustomerMetricsDropLabelsEnv is the BYOO collector env var for customer metrics resource labels to drop. - BYOOCustomerMetricsDropLabelsEnv = "BYOO_CUSTOMER_METRICS_DROP_LABELS" + // BYOOWorkloadMetricsDropLabelsEnv is the BYOO collector env var for workload metrics resource labels to drop. + BYOOWorkloadMetricsDropLabelsEnv = "BYOO_WORKLOAD_METRICS_DROP_LABELS" // DefaultBYOOLogExporterBatchMaxSizeBytes keeps serialized exporter batches near the backend limit. DefaultBYOOLogExporterBatchMaxSizeBytes int64 = 1000000 @@ -118,13 +118,12 @@ func BYOOLogChunkingEnvVars(config BYOOLogChunkingConfig) []corev1.EnvVar { } type BYOOMetricSubsetConfig struct { - Enabled bool `yaml:"enabled,omitempty"` - FilterConfig string `yaml:"filterConfig,omitempty"` - CustomerMetricsDropLabels []string `yaml:"customerMetricsDropLabels,omitempty"` + Enabled bool `yaml:"enabled,omitempty"` + FilterConfig string `yaml:"filterConfig,omitempty"` } func (c BYOOMetricSubsetConfig) IsZero() bool { - return !c.Enabled && c.FilterConfig == "" && len(c.CustomerMetricsDropLabels) == 0 + return !c.Enabled && c.FilterConfig == "" } // EnvVars returns BYOO collector env vars for the supplied metric subset config. @@ -142,15 +141,19 @@ func (c BYOOMetricSubsetConfig) EnvVars() []corev1.EnvVar { Value: c.FilterConfig, }) } - if len(c.CustomerMetricsDropLabels) > 0 { - envs = append(envs, corev1.EnvVar{ - Name: BYOOCustomerMetricsDropLabelsEnv, - Value: strings.Join(c.CustomerMetricsDropLabels, ","), - }) - } return envs } +func BYOOWorkloadMetricsDropLabelsEnvVars(labels []string) []corev1.EnvVar { + if len(labels) == 0 { + return nil + } + return []corev1.EnvVar{{ + Name: BYOOWorkloadMetricsDropLabelsEnv, + Value: strings.Join(labels, ","), + }} +} + func (r *ResourceRequirements) ToK8sResourceRequirements() corev1.ResourceRequirements { return corev1.ResourceRequirements{ Limits: corev1.ResourceList(r.Limits), @@ -384,6 +387,9 @@ type AgentConfig struct { // BYOOMetricSubset contains BYOO OTel collector metric subset pipeline settings. BYOOMetricSubset BYOOMetricSubsetConfig `yaml:"byooMetricSubset,omitempty"` + + // BYOOWorkloadMetricsDropLabels contains workload metrics resource labels to drop from the generated metrics pipeline. + BYOOWorkloadMetricsDropLabels []string `yaml:"byooWorkloadMetricsDropLabels,omitempty"` } func (t AgentConfig) Complete(env Environment) AgentConfig { @@ -399,7 +405,8 @@ func (t AgentConfig) Complete(env Environment) AgentConfig { // BYOOOTelCollectorEnvVars returns env vars that must be set only on the BYOO OTel collector container. func (t AgentConfig) BYOOOTelCollectorEnvVars() []corev1.EnvVar { envs := t.BYOOLogChunking.EnvVars() - return append(envs, t.BYOOMetricSubset.EnvVars()...) + envs = append(envs, t.BYOOMetricSubset.EnvVars()...) + return append(envs, BYOOWorkloadMetricsDropLabelsEnvVars(t.BYOOWorkloadMetricsDropLabels)...) } const ( diff --git a/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go b/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go index 753867b0e..042ddc2c5 100644 --- a/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go +++ b/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go @@ -72,6 +72,11 @@ func (in *AgentConfig) DeepCopyInto(out *AgentConfig) { in.BYOOFluentBitResources.DeepCopyInto(&out.BYOOFluentBitResources) in.BYOOLogChunking.DeepCopyInto(&out.BYOOLogChunking) in.BYOOMetricSubset.DeepCopyInto(&out.BYOOMetricSubset) + if in.BYOOWorkloadMetricsDropLabels != nil { + in, out := &in.BYOOWorkloadMetricsDropLabels, &out.BYOOWorkloadMetricsDropLabels + *out = make([]string, len(*in)) + copy(*out, *in) + } return } @@ -157,11 +162,6 @@ func (in *BYOOLogChunkingConfig) DeepCopy() *BYOOLogChunkingConfig { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *BYOOMetricSubsetConfig) DeepCopyInto(out *BYOOMetricSubsetConfig) { *out = *in - if in.CustomerMetricsDropLabels != nil { - in, out := &in.CustomerMetricsDropLabels, &out.CustomerMetricsDropLabels - *out = make([]string, len(*in)) - copy(*out, *in) - } return } diff --git a/src/libraries/go/lib/pkg/types/nvca/config/config_test.go b/src/libraries/go/lib/pkg/types/nvca/config/config_test.go index c87ad7482..b42eaaf51 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/config_test.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/config_test.go @@ -406,15 +406,15 @@ agent: error_mode: ignore metric_conditions: - 'metric.name == "drop"' - customerMetricsDropLabels: - - metric_subset_enabled - - custom_label + byooWorkloadMetricsDropLabels: + - metric_subset_enabled + - custom_label `) cfg, err := DecodeConfig(data) require.NoError(t, err) assert.True(t, cfg.Agent.BYOOMetricSubset.Enabled) assert.Contains(t, cfg.Agent.BYOOMetricSubset.FilterConfig, "metric.name") - assert.Equal(t, []string{"metric_subset_enabled", "custom_label"}, cfg.Agent.BYOOMetricSubset.CustomerMetricsDropLabels) + assert.Equal(t, []string{"metric_subset_enabled", "custom_label"}, cfg.Agent.BYOOWorkloadMetricsDropLabels) }) t.Run("duration_parsing", func(t *testing.T) { diff --git a/src/libraries/go/lib/pkg/types/nvca/config/deepcopy_test.go b/src/libraries/go/lib/pkg/types/nvca/config/deepcopy_test.go index aee90111c..de8104601 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/deepcopy_test.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/deepcopy_test.go @@ -71,18 +71,25 @@ func TestDeepCopy_AgentConfig_Nil(t *testing.T) { func TestDeepCopy_BYOOMetricSubsetConfig(t *testing.T) { orig := &BYOOMetricSubsetConfig{ - Enabled: true, - FilterConfig: "error_mode: ignore", - CustomerMetricsDropLabels: []string{"metric_subset_enabled", "custom_label"}, + Enabled: true, + FilterConfig: "error_mode: ignore", } out := orig.DeepCopy() require.NotNil(t, out) assert.Equal(t, orig.Enabled, out.Enabled) assert.Equal(t, orig.FilterConfig, out.FilterConfig) - assert.Equal(t, orig.CustomerMetricsDropLabels, out.CustomerMetricsDropLabels) +} + +func TestDeepCopy_AgentConfig_BYOOWorkloadMetricsDropLabels(t *testing.T) { + orig := &AgentConfig{ + BYOOWorkloadMetricsDropLabels: []string{"metric_subset_enabled", "custom_label"}, + } + out := orig.DeepCopy() + require.NotNil(t, out) + assert.Equal(t, orig.BYOOWorkloadMetricsDropLabels, out.BYOOWorkloadMetricsDropLabels) - orig.CustomerMetricsDropLabels[0] = "changed" - assert.Equal(t, "metric_subset_enabled", out.CustomerMetricsDropLabels[0]) + orig.BYOOWorkloadMetricsDropLabels[0] = "changed" + assert.Equal(t, "metric_subset_enabled", out.BYOOWorkloadMetricsDropLabels[0]) } func TestDeepCopy_AllowedExtraKubernetesTypeConfig(t *testing.T) { diff --git a/src/libraries/go/lib/pkg/types/nvca/config/types.go b/src/libraries/go/lib/pkg/types/nvca/config/types.go index 205cd939e..f62ad1441 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/types.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/types.go @@ -63,8 +63,8 @@ const ( BYOOMetricSubsetEnabledEnv = "BYOO_METRIC_SUBSET_ENABLED" // BYOOMetricSubsetFilterConfigEnv is the BYOO collector env var for metric subset filter config YAML. BYOOMetricSubsetFilterConfigEnv = "BYOO_METRIC_SUBSET_FILTER_CONFIG" - // BYOOCustomerMetricsDropLabelsEnv is the BYOO collector env var for customer metrics resource labels to drop. - BYOOCustomerMetricsDropLabelsEnv = "BYOO_CUSTOMER_METRICS_DROP_LABELS" + // BYOOWorkloadMetricsDropLabelsEnv is the BYOO collector env var for workload metrics resource labels to drop. + BYOOWorkloadMetricsDropLabelsEnv = "BYOO_WORKLOAD_METRICS_DROP_LABELS" // DefaultBYOOLogExporterBatchMaxSizeBytes keeps serialized exporter batches near the backend limit. DefaultBYOOLogExporterBatchMaxSizeBytes int64 = 1000000 @@ -118,13 +118,12 @@ func BYOOLogChunkingEnvVars(config BYOOLogChunkingConfig) []corev1.EnvVar { } type BYOOMetricSubsetConfig struct { - Enabled bool `yaml:"enabled,omitempty"` - FilterConfig string `yaml:"filterConfig,omitempty"` - CustomerMetricsDropLabels []string `yaml:"customerMetricsDropLabels,omitempty"` + Enabled bool `yaml:"enabled,omitempty"` + FilterConfig string `yaml:"filterConfig,omitempty"` } func (c BYOOMetricSubsetConfig) IsZero() bool { - return !c.Enabled && c.FilterConfig == "" && len(c.CustomerMetricsDropLabels) == 0 + return !c.Enabled && c.FilterConfig == "" } // EnvVars returns BYOO collector env vars for the supplied metric subset config. @@ -142,15 +141,19 @@ func (c BYOOMetricSubsetConfig) EnvVars() []corev1.EnvVar { Value: c.FilterConfig, }) } - if len(c.CustomerMetricsDropLabels) > 0 { - envs = append(envs, corev1.EnvVar{ - Name: BYOOCustomerMetricsDropLabelsEnv, - Value: strings.Join(c.CustomerMetricsDropLabels, ","), - }) - } return envs } +func BYOOWorkloadMetricsDropLabelsEnvVars(labels []string) []corev1.EnvVar { + if len(labels) == 0 { + return nil + } + return []corev1.EnvVar{{ + Name: BYOOWorkloadMetricsDropLabelsEnv, + Value: strings.Join(labels, ","), + }} +} + func (r *ResourceRequirements) ToK8sResourceRequirements() corev1.ResourceRequirements { return corev1.ResourceRequirements{ Limits: corev1.ResourceList(r.Limits), @@ -384,6 +387,9 @@ type AgentConfig struct { // BYOOMetricSubset contains BYOO OTel collector metric subset pipeline settings. BYOOMetricSubset BYOOMetricSubsetConfig `yaml:"byooMetricSubset,omitempty"` + + // BYOOWorkloadMetricsDropLabels contains workload metrics resource labels to drop from the generated metrics pipeline. + BYOOWorkloadMetricsDropLabels []string `yaml:"byooWorkloadMetricsDropLabels,omitempty"` } func (t AgentConfig) Complete(env Environment) AgentConfig { @@ -399,7 +405,8 @@ func (t AgentConfig) Complete(env Environment) AgentConfig { // BYOOOTelCollectorEnvVars returns env vars that must be set only on the BYOO OTel collector container. func (t AgentConfig) BYOOOTelCollectorEnvVars() []corev1.EnvVar { envs := t.BYOOLogChunking.EnvVars() - return append(envs, t.BYOOMetricSubset.EnvVars()...) + envs = append(envs, t.BYOOMetricSubset.EnvVars()...) + return append(envs, BYOOWorkloadMetricsDropLabelsEnvVars(t.BYOOWorkloadMetricsDropLabels)...) } const ( diff --git a/src/libraries/go/lib/pkg/types/nvca/config/types_test.go b/src/libraries/go/lib/pkg/types/nvca/config/types_test.go index 91459a450..0e15e7c86 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/types_test.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/types_test.go @@ -90,19 +90,22 @@ func TestBYOOMetricSubsetConfig_EnvVars(t *testing.T) { cfg := BYOOMetricSubsetConfig{ Enabled: true, FilterConfig: "error_mode: ignore\nmetric_conditions:\n - 'metric.name == \"drop\"'\n", - CustomerMetricsDropLabels: []string{ - "metric_subset_enabled", - "custom_label", - }, } assert.Equal(t, []corev1.EnvVar{ {Name: BYOOMetricSubsetEnabledEnv, Value: "true"}, {Name: BYOOMetricSubsetFilterConfigEnv, Value: "error_mode: ignore\nmetric_conditions:\n - 'metric.name == \"drop\"'\n"}, - {Name: BYOOCustomerMetricsDropLabelsEnv, Value: "metric_subset_enabled,custom_label"}, }, cfg.EnvVars()) } +func TestBYOOWorkloadMetricsDropLabelsEnvVars(t *testing.T) { + assert.Equal(t, []corev1.EnvVar{{ + Name: BYOOWorkloadMetricsDropLabelsEnv, + Value: "metric_subset_enabled,custom_label", + }}, BYOOWorkloadMetricsDropLabelsEnvVars([]string{"metric_subset_enabled", "custom_label"})) + assert.Nil(t, BYOOWorkloadMetricsDropLabelsEnvVars(nil)) +} + func TestAgentConfig_BYOOOTelCollectorEnvVars(t *testing.T) { exporterBatchMaxSizeBytes := int64(1000000) cfg := AgentConfig{ @@ -111,16 +114,16 @@ func TestAgentConfig_BYOOOTelCollectorEnvVars(t *testing.T) { ExporterBatchMaxSizeBytes: &exporterBatchMaxSizeBytes, }, BYOOMetricSubset: BYOOMetricSubsetConfig{ - Enabled: true, - CustomerMetricsDropLabels: []string{"metric_subset_enabled"}, + Enabled: true, }, + BYOOWorkloadMetricsDropLabels: []string{"metric_subset_enabled"}, } assert.Equal(t, []corev1.EnvVar{ {Name: BYOOLogChunkMaxBodyBytesEnv, Value: "983040"}, {Name: BYOOLogExporterBatchMaxSizeBytesEnv, Value: "1000000"}, {Name: BYOOMetricSubsetEnabledEnv, Value: "true"}, - {Name: BYOOCustomerMetricsDropLabelsEnv, Value: "metric_subset_enabled"}, + {Name: BYOOWorkloadMetricsDropLabelsEnv, Value: "metric_subset_enabled"}, }, cfg.BYOOOTelCollectorEnvVars()) } diff --git a/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go b/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go index 753867b0e..042ddc2c5 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go @@ -72,6 +72,11 @@ func (in *AgentConfig) DeepCopyInto(out *AgentConfig) { in.BYOOFluentBitResources.DeepCopyInto(&out.BYOOFluentBitResources) in.BYOOLogChunking.DeepCopyInto(&out.BYOOLogChunking) in.BYOOMetricSubset.DeepCopyInto(&out.BYOOMetricSubset) + if in.BYOOWorkloadMetricsDropLabels != nil { + in, out := &in.BYOOWorkloadMetricsDropLabels, &out.BYOOWorkloadMetricsDropLabels + *out = make([]string, len(*in)) + copy(*out, *in) + } return } @@ -157,11 +162,6 @@ func (in *BYOOLogChunkingConfig) DeepCopy() *BYOOLogChunkingConfig { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *BYOOMetricSubsetConfig) DeepCopyInto(out *BYOOMetricSubsetConfig) { *out = *in - if in.CustomerMetricsDropLabels != nil { - in, out := &in.CustomerMetricsDropLabels, &out.CustomerMetricsDropLabels - *out = make([]string, len(*in)) - copy(*out, *in) - } return } From 7d2afadae2dd3c22b7e5eaedd66ba916bdbd397c Mon Sep 17 00:00:00 2001 From: Kristina Pathak Date: Tue, 21 Jul 2026 15:42:40 -0700 Subject: [PATCH 6/8] chore(nvca): update metric subset deepcopy output Signed-off-by: Kristina Pathak --- .../go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go | 2 +- .../go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go b/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go index 042ddc2c5..49e050f62 100644 --- a/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go +++ b/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go @@ -71,7 +71,7 @@ func (in *AgentConfig) DeepCopyInto(out *AgentConfig) { in.BYOOResources.DeepCopyInto(&out.BYOOResources) in.BYOOFluentBitResources.DeepCopyInto(&out.BYOOFluentBitResources) in.BYOOLogChunking.DeepCopyInto(&out.BYOOLogChunking) - in.BYOOMetricSubset.DeepCopyInto(&out.BYOOMetricSubset) + out.BYOOMetricSubset = in.BYOOMetricSubset if in.BYOOWorkloadMetricsDropLabels != nil { in, out := &in.BYOOWorkloadMetricsDropLabels, &out.BYOOWorkloadMetricsDropLabels *out = make([]string, len(*in)) diff --git a/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go b/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go index 042ddc2c5..49e050f62 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go @@ -71,7 +71,7 @@ func (in *AgentConfig) DeepCopyInto(out *AgentConfig) { in.BYOOResources.DeepCopyInto(&out.BYOOResources) in.BYOOFluentBitResources.DeepCopyInto(&out.BYOOFluentBitResources) in.BYOOLogChunking.DeepCopyInto(&out.BYOOLogChunking) - in.BYOOMetricSubset.DeepCopyInto(&out.BYOOMetricSubset) + out.BYOOMetricSubset = in.BYOOMetricSubset if in.BYOOWorkloadMetricsDropLabels != nil { in, out := &in.BYOOWorkloadMetricsDropLabels, &out.BYOOWorkloadMetricsDropLabels *out = make([]string, len(*in)) From e1acd92b1098e6a136c14177d6a6efdb81757c34 Mon Sep 17 00:00:00 2001 From: Kristina Pathak Date: Tue, 21 Jul 2026 15:47:17 -0700 Subject: [PATCH 7/8] refactor(nvca): group workload metrics drop labels Signed-off-by: Kristina Pathak --- .../nvca-operator/nvca-operator/values.yaml | 7 ++--- .../cluster-management/configuration.md | 7 ++--- docs/user/cluster-management/configuration.md | 7 ++--- .../internal/otelconfig/embed_config.go | 26 ++++++++++-------- .../internal/otelconfig/otelconfig.go | 2 +- .../internal/otelconfig/otelconfig_test.go | 2 +- .../internal/otelconfig/render.go | 2 +- .../internal/otelconfig/render_test.go | 18 +++++++++---- .../internal/miniservice/reconcile_test.go | 4 ++- .../reconcile/nvcaagent_reconcile_test.go | 6 +++-- .../go/lib/pkg/types/nvca/config/types.go | 20 +++++++++----- .../nvca/config/zz_generated.deepcopy.go | 27 +++++++++++++++---- .../lib/pkg/types/nvca/config/config_test.go | 9 ++++--- .../pkg/types/nvca/config/deepcopy_test.go | 12 ++++----- .../go/lib/pkg/types/nvca/config/types.go | 20 +++++++++----- .../lib/pkg/types/nvca/config/types_test.go | 13 ++++++--- .../nvca/config/zz_generated.deepcopy.go | 27 +++++++++++++++---- 17 files changed, 142 insertions(+), 67 deletions(-) diff --git a/deploy/helm/nvca-operator/nvca-operator/values.yaml b/deploy/helm/nvca-operator/nvca-operator/values.yaml index ed2de69c3..a073c360b 100644 --- a/deploy/helm/nvca-operator/nvca-operator/values.yaml +++ b/deploy/helm/nvca-operator/nvca-operator/values.yaml @@ -111,9 +111,10 @@ agentConfig: # error_mode: ignore # metric_conditions: # - 'metric.name == "BpsInstrument"' - # byooWorkloadMetricsDropLabels: - # - metric_subset_enabled - # - custom_label + # byooWorkloadMetrics: + # dropLabels: + # - metric_subset_enabled + # - custom_label ## @section resources Resource requests and limits for the nvca-operator container ## @param resources.limits.cpu CPU limit for the nvca-operator container ## @param resources.limits.memory Memory limit for the nvca-operator container diff --git a/docs/ngc-managed/cluster-management/configuration.md b/docs/ngc-managed/cluster-management/configuration.md index 140e50e54..1231a8979 100644 --- a/docs/ngc-managed/cluster-management/configuration.md +++ b/docs/ngc-managed/cluster-management/configuration.md @@ -745,9 +745,10 @@ BYOO metric subset example: error_mode: ignore metric_conditions: - 'metric.name == "BpsInstrument"' - byooWorkloadMetricsDropLabels: - - metric_subset_enabled - - custom_label + byooWorkloadMetrics: + dropLabels: + - metric_subset_enabled + - custom_label ``` **Apply via Helm:** diff --git a/docs/user/cluster-management/configuration.md b/docs/user/cluster-management/configuration.md index 2880ef06e..a5c08c5a0 100644 --- a/docs/user/cluster-management/configuration.md +++ b/docs/user/cluster-management/configuration.md @@ -866,9 +866,10 @@ agentConfig: error_mode: ignore metric_conditions: - 'metric.name == "BpsInstrument"' - byooWorkloadMetricsDropLabels: - - metric_subset_enabled - - custom_label + byooWorkloadMetrics: + dropLabels: + - metric_subset_enabled + - custom_label ``` Apply via Helm: diff --git a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/embed_config.go b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/embed_config.go index 00148d540..90eb415b2 100644 --- a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/embed_config.go +++ b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/embed_config.go @@ -38,17 +38,17 @@ func init() { } type TemplateConfig struct { - BackendType BackendType - WorkloadType WorkloadType - Namespace string - FunctionID string - FunctionVersionID string - TaskID string - InstanceID string - ZoneName string - LogChunking LogChunkingConfig - MetricSubset MetricSubsetConfig - WorkloadMetricsDropLabels []string + BackendType BackendType + WorkloadType WorkloadType + Namespace string + FunctionID string + FunctionVersionID string + TaskID string + InstanceID string + ZoneName string + LogChunking LogChunkingConfig + MetricSubset MetricSubsetConfig + WorkloadMetrics WorkloadMetricsConfig // LogExporterBatchMaxSizeBytes configures exporterhelper byte batching for logs. // Zero uses the default selected for BYOO. LogExporterBatchMaxSizeBytes int @@ -59,6 +59,10 @@ type LogChunkingConfig struct { DryRun bool } +type WorkloadMetricsConfig struct { + DropLabels []string +} + type MetricSubsetConfig struct { Enabled bool FilterConfig map[string]interface{} diff --git a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig.go b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig.go index 75a0b7033..f89fffb48 100644 --- a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig.go +++ b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig.go @@ -87,7 +87,7 @@ func getTemplateConfig() (TemplateConfig, error) { Enabled: env.ByooMetricSubsetEnabled, FilterConfig: metricSubsetFilterConfig, } - tcgf.WorkloadMetricsDropLabels = resolvedWorkloadMetricsDropLabels(env.ByooWorkloadMetricsDropLabels, env.ByooMetricSubsetEnabled) + tcgf.WorkloadMetrics.DropLabels = resolvedWorkloadMetricsDropLabels(env.ByooWorkloadMetricsDropLabels, env.ByooMetricSubsetEnabled) functionID := env.NvcfFunctionID functionVersionID := env.NvcfFunctionVersionID diff --git a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig_test.go b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig_test.go index c743b01c3..847a04764 100644 --- a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig_test.go +++ b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/otelconfig_test.go @@ -138,7 +138,7 @@ func TestGetTemplateConfig(t *testing.T) { `metric.name == "drop"`, }, }, cfg.MetricSubset.FilterConfig) - assert.Equal(t, []string{"metric_subset_enabled", "custom_label"}, cfg.WorkloadMetricsDropLabels) + assert.Equal(t, []string{"metric_subset_enabled", "custom_label"}, cfg.WorkloadMetrics.DropLabels) }, }, { diff --git a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render.go b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render.go index 40c1ee166..de563ed38 100644 --- a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render.go +++ b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render.go @@ -815,7 +815,7 @@ func generateExportersAndService(config TelemetryConfig, otelConfig *OpenTelemet metricPipeline.Receivers = []string{"otlp", "prometheus"} metricPipeline.Exporters = []string{exporterId} metricPipeline.Processors = []string{"memory_limiter", "filter/metrics", "resource"} - if processorID := addWorkloadMetricsDropLabelsProcessor(otelConfig, tmplConfig.WorkloadMetricsDropLabels); processorID != "" { + if processorID := addWorkloadMetricsDropLabelsProcessor(otelConfig, tmplConfig.WorkloadMetrics.DropLabels); processorID != "" { metricPipeline.Processors = append(metricPipeline.Processors, processorID) } metricPipeline.Processors = append(metricPipeline.Processors, "metrics_transform", "batch") diff --git a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render_test.go b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render_test.go index d0c36126b..67864c31e 100644 --- a/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render_test.go +++ b/src/compute-plane-services/byoo-otel-collector/internal/otelconfig/render_test.go @@ -112,7 +112,9 @@ func TestRenderOtelConfigWithMetricSubsetPipeline(t *testing.T) { Enabled: true, FilterConfig: defaultMetricSubsetFilterConfig(), }, - WorkloadMetricsDropLabels: defaultWorkloadMetricsDropLabels, + WorkloadMetrics: WorkloadMetricsConfig{ + DropLabels: defaultWorkloadMetricsDropLabels, + }, }, ) @@ -152,7 +154,9 @@ func TestRenderOtelConfigWithMetricSubsetPipelineMatchesExample(t *testing.T) { Enabled: true, FilterConfig: defaultMetricSubsetFilterConfig(), }, - WorkloadMetricsDropLabels: defaultWorkloadMetricsDropLabels, + WorkloadMetrics: WorkloadMetricsConfig{ + DropLabels: defaultWorkloadMetricsDropLabels, + }, }, ) if err != nil { @@ -518,7 +522,9 @@ func TestGenerateExportersAndServiceAddsMetricSubsetPipeline(t *testing.T) { Enabled: true, FilterConfig: filterConfig, }, - WorkloadMetricsDropLabels: []string{"metric_subset_enabled"}, + WorkloadMetrics: WorkloadMetricsConfig{ + DropLabels: []string{"metric_subset_enabled"}, + }, }) assert.NoError(t, err) @@ -582,8 +588,10 @@ func TestGenerateExportersAndServiceAddsWorkloadMetricsDropLabelsWithoutMetricSu initializeConfigMaps(otelConfig) err := generateExportersAndService(cfg, otelConfig, TemplateConfig{ - Namespace: "test-namespace", - WorkloadMetricsDropLabels: []string{"workload_label"}, + Namespace: "test-namespace", + WorkloadMetrics: WorkloadMetricsConfig{ + DropLabels: []string{"workload_label"}, + }, }) assert.NoError(t, err) diff --git a/src/compute-plane-services/nvca/internal/miniservice/reconcile_test.go b/src/compute-plane-services/nvca/internal/miniservice/reconcile_test.go index e0751ee05..c33a4e230 100644 --- a/src/compute-plane-services/nvca/internal/miniservice/reconcile_test.go +++ b/src/compute-plane-services/nvca/internal/miniservice/reconcile_test.go @@ -264,7 +264,9 @@ func TestReconcile_Function(t *testing.T) { Enabled: true, FilterConfig: "error_mode: ignore\nmetric_conditions:\n - 'metric.name == \"drop\"'\n", } - r.cfg.Agent.BYOOWorkloadMetricsDropLabels = []string{"metric_subset_enabled", "custom_label"} + r.cfg.Agent.BYOOWorkloadMetrics = nvcaconfig.BYOOWorkloadMetricsConfig{ + DropLabels: []string{"metric_subset_enabled", "custom_label"}, + } err := k8sutil.SetConfigDefaultResources(&r.cfg) require.NoError(t, err) r.cfg.Workload.Tolerations = []corev1.Toleration{configuredToleration} diff --git a/src/compute-plane-services/nvca/pkg/operator/reconcile/nvcaagent_reconcile_test.go b/src/compute-plane-services/nvca/pkg/operator/reconcile/nvcaagent_reconcile_test.go index be6619206..751c6b2bb 100644 --- a/src/compute-plane-services/nvca/pkg/operator/reconcile/nvcaagent_reconcile_test.go +++ b/src/compute-plane-services/nvca/pkg/operator/reconcile/nvcaagent_reconcile_test.go @@ -2845,7 +2845,9 @@ func TestEncodeAgentConfig_MergesBYOOConfig(t *testing.T) { Enabled: true, FilterConfig: "error_mode: ignore\nmetric_conditions:\n - 'metric.name == \"drop\"'\n", }, - BYOOWorkloadMetricsDropLabels: []string{"metric_subset_enabled", "custom_label"}, + BYOOWorkloadMetrics: nvcaconfig.BYOOWorkloadMetricsConfig{ + DropLabels: []string{"metric_subset_enabled", "custom_label"}, + }, }, } @@ -2864,7 +2866,7 @@ func TestEncodeAgentConfig_MergesBYOOConfig(t *testing.T) { assert.Equal(t, int64(1000000), *got.Agent.BYOOLogChunking.ExporterBatchMaxSizeBytes) assert.True(t, got.Agent.BYOOMetricSubset.Enabled) assert.Contains(t, got.Agent.BYOOMetricSubset.FilterConfig, "metric.name") - assert.Equal(t, []string{"metric_subset_enabled", "custom_label"}, got.Agent.BYOOWorkloadMetricsDropLabels) + assert.Equal(t, []string{"metric_subset_enabled", "custom_label"}, got.Agent.BYOOWorkloadMetrics.DropLabels) } func TestAgentHostOverrideConfig_ClearsReValHostForSelfHostedColocatedService(t *testing.T) { diff --git a/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/types.go b/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/types.go index c61e63893..0c50950a1 100644 --- a/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/types.go +++ b/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/types.go @@ -144,13 +144,21 @@ func (c BYOOMetricSubsetConfig) EnvVars() []corev1.EnvVar { return envs } -func BYOOWorkloadMetricsDropLabelsEnvVars(labels []string) []corev1.EnvVar { - if len(labels) == 0 { +type BYOOWorkloadMetricsConfig struct { + DropLabels []string `yaml:"dropLabels,omitempty"` +} + +func (c BYOOWorkloadMetricsConfig) IsZero() bool { + return len(c.DropLabels) == 0 +} + +func (c BYOOWorkloadMetricsConfig) EnvVars() []corev1.EnvVar { + if len(c.DropLabels) == 0 { return nil } return []corev1.EnvVar{{ Name: BYOOWorkloadMetricsDropLabelsEnv, - Value: strings.Join(labels, ","), + Value: strings.Join(c.DropLabels, ","), }} } @@ -388,8 +396,8 @@ type AgentConfig struct { // BYOOMetricSubset contains BYOO OTel collector metric subset pipeline settings. BYOOMetricSubset BYOOMetricSubsetConfig `yaml:"byooMetricSubset,omitempty"` - // BYOOWorkloadMetricsDropLabels contains workload metrics resource labels to drop from the generated metrics pipeline. - BYOOWorkloadMetricsDropLabels []string `yaml:"byooWorkloadMetricsDropLabels,omitempty"` + // BYOOWorkloadMetrics contains settings for the generated workload metrics pipeline. + BYOOWorkloadMetrics BYOOWorkloadMetricsConfig `yaml:"byooWorkloadMetrics,omitempty"` } func (t AgentConfig) Complete(env Environment) AgentConfig { @@ -406,7 +414,7 @@ func (t AgentConfig) Complete(env Environment) AgentConfig { func (t AgentConfig) BYOOOTelCollectorEnvVars() []corev1.EnvVar { envs := t.BYOOLogChunking.EnvVars() envs = append(envs, t.BYOOMetricSubset.EnvVars()...) - return append(envs, BYOOWorkloadMetricsDropLabelsEnvVars(t.BYOOWorkloadMetricsDropLabels)...) + return append(envs, t.BYOOWorkloadMetrics.EnvVars()...) } const ( diff --git a/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go b/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go index 49e050f62..f13411198 100644 --- a/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go +++ b/src/compute-plane-services/nvca/vendor/github.com/NVIDIA/nvcf/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go @@ -72,11 +72,7 @@ func (in *AgentConfig) DeepCopyInto(out *AgentConfig) { in.BYOOFluentBitResources.DeepCopyInto(&out.BYOOFluentBitResources) in.BYOOLogChunking.DeepCopyInto(&out.BYOOLogChunking) out.BYOOMetricSubset = in.BYOOMetricSubset - if in.BYOOWorkloadMetricsDropLabels != nil { - in, out := &in.BYOOWorkloadMetricsDropLabels, &out.BYOOWorkloadMetricsDropLabels - *out = make([]string, len(*in)) - copy(*out, *in) - } + in.BYOOWorkloadMetrics.DeepCopyInto(&out.BYOOWorkloadMetrics) return } @@ -175,6 +171,27 @@ func (in *BYOOMetricSubsetConfig) DeepCopy() *BYOOMetricSubsetConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BYOOWorkloadMetricsConfig) DeepCopyInto(out *BYOOWorkloadMetricsConfig) { + *out = *in + if in.DropLabels != nil { + in, out := &in.DropLabels, &out.DropLabels + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BYOOWorkloadMetricsConfig. +func (in *BYOOWorkloadMetricsConfig) DeepCopy() *BYOOWorkloadMetricsConfig { + if in == nil { + return nil + } + out := new(BYOOWorkloadMetricsConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Config) DeepCopyInto(out *Config) { *out = *in diff --git a/src/libraries/go/lib/pkg/types/nvca/config/config_test.go b/src/libraries/go/lib/pkg/types/nvca/config/config_test.go index b42eaaf51..fcb1751bb 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/config_test.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/config_test.go @@ -406,15 +406,16 @@ agent: error_mode: ignore metric_conditions: - 'metric.name == "drop"' - byooWorkloadMetricsDropLabels: - - metric_subset_enabled - - custom_label + byooWorkloadMetrics: + dropLabels: + - metric_subset_enabled + - custom_label `) cfg, err := DecodeConfig(data) require.NoError(t, err) assert.True(t, cfg.Agent.BYOOMetricSubset.Enabled) assert.Contains(t, cfg.Agent.BYOOMetricSubset.FilterConfig, "metric.name") - assert.Equal(t, []string{"metric_subset_enabled", "custom_label"}, cfg.Agent.BYOOWorkloadMetricsDropLabels) + assert.Equal(t, []string{"metric_subset_enabled", "custom_label"}, cfg.Agent.BYOOWorkloadMetrics.DropLabels) }) t.Run("duration_parsing", func(t *testing.T) { diff --git a/src/libraries/go/lib/pkg/types/nvca/config/deepcopy_test.go b/src/libraries/go/lib/pkg/types/nvca/config/deepcopy_test.go index de8104601..c40591d26 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/deepcopy_test.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/deepcopy_test.go @@ -80,16 +80,16 @@ func TestDeepCopy_BYOOMetricSubsetConfig(t *testing.T) { assert.Equal(t, orig.FilterConfig, out.FilterConfig) } -func TestDeepCopy_AgentConfig_BYOOWorkloadMetricsDropLabels(t *testing.T) { - orig := &AgentConfig{ - BYOOWorkloadMetricsDropLabels: []string{"metric_subset_enabled", "custom_label"}, +func TestDeepCopy_BYOOWorkloadMetricsConfig(t *testing.T) { + orig := &BYOOWorkloadMetricsConfig{ + DropLabels: []string{"metric_subset_enabled", "custom_label"}, } out := orig.DeepCopy() require.NotNil(t, out) - assert.Equal(t, orig.BYOOWorkloadMetricsDropLabels, out.BYOOWorkloadMetricsDropLabels) + assert.Equal(t, orig.DropLabels, out.DropLabels) - orig.BYOOWorkloadMetricsDropLabels[0] = "changed" - assert.Equal(t, "metric_subset_enabled", out.BYOOWorkloadMetricsDropLabels[0]) + orig.DropLabels[0] = "changed" + assert.Equal(t, "metric_subset_enabled", out.DropLabels[0]) } func TestDeepCopy_AllowedExtraKubernetesTypeConfig(t *testing.T) { diff --git a/src/libraries/go/lib/pkg/types/nvca/config/types.go b/src/libraries/go/lib/pkg/types/nvca/config/types.go index f62ad1441..19a148224 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/types.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/types.go @@ -144,13 +144,21 @@ func (c BYOOMetricSubsetConfig) EnvVars() []corev1.EnvVar { return envs } -func BYOOWorkloadMetricsDropLabelsEnvVars(labels []string) []corev1.EnvVar { - if len(labels) == 0 { +type BYOOWorkloadMetricsConfig struct { + DropLabels []string `yaml:"dropLabels,omitempty"` +} + +func (c BYOOWorkloadMetricsConfig) IsZero() bool { + return len(c.DropLabels) == 0 +} + +func (c BYOOWorkloadMetricsConfig) EnvVars() []corev1.EnvVar { + if len(c.DropLabels) == 0 { return nil } return []corev1.EnvVar{{ Name: BYOOWorkloadMetricsDropLabelsEnv, - Value: strings.Join(labels, ","), + Value: strings.Join(c.DropLabels, ","), }} } @@ -388,8 +396,8 @@ type AgentConfig struct { // BYOOMetricSubset contains BYOO OTel collector metric subset pipeline settings. BYOOMetricSubset BYOOMetricSubsetConfig `yaml:"byooMetricSubset,omitempty"` - // BYOOWorkloadMetricsDropLabels contains workload metrics resource labels to drop from the generated metrics pipeline. - BYOOWorkloadMetricsDropLabels []string `yaml:"byooWorkloadMetricsDropLabels,omitempty"` + // BYOOWorkloadMetrics contains settings for the generated workload metrics pipeline. + BYOOWorkloadMetrics BYOOWorkloadMetricsConfig `yaml:"byooWorkloadMetrics,omitempty"` } func (t AgentConfig) Complete(env Environment) AgentConfig { @@ -406,7 +414,7 @@ func (t AgentConfig) Complete(env Environment) AgentConfig { func (t AgentConfig) BYOOOTelCollectorEnvVars() []corev1.EnvVar { envs := t.BYOOLogChunking.EnvVars() envs = append(envs, t.BYOOMetricSubset.EnvVars()...) - return append(envs, BYOOWorkloadMetricsDropLabelsEnvVars(t.BYOOWorkloadMetricsDropLabels)...) + return append(envs, t.BYOOWorkloadMetrics.EnvVars()...) } const ( diff --git a/src/libraries/go/lib/pkg/types/nvca/config/types_test.go b/src/libraries/go/lib/pkg/types/nvca/config/types_test.go index 0e15e7c86..b06c1bc77 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/types_test.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/types_test.go @@ -98,12 +98,15 @@ func TestBYOOMetricSubsetConfig_EnvVars(t *testing.T) { }, cfg.EnvVars()) } -func TestBYOOWorkloadMetricsDropLabelsEnvVars(t *testing.T) { +func TestBYOOWorkloadMetricsConfig_EnvVars(t *testing.T) { + cfg := BYOOWorkloadMetricsConfig{ + DropLabels: []string{"metric_subset_enabled", "custom_label"}, + } assert.Equal(t, []corev1.EnvVar{{ Name: BYOOWorkloadMetricsDropLabelsEnv, Value: "metric_subset_enabled,custom_label", - }}, BYOOWorkloadMetricsDropLabelsEnvVars([]string{"metric_subset_enabled", "custom_label"})) - assert.Nil(t, BYOOWorkloadMetricsDropLabelsEnvVars(nil)) + }}, cfg.EnvVars()) + assert.Nil(t, BYOOWorkloadMetricsConfig{}.EnvVars()) } func TestAgentConfig_BYOOOTelCollectorEnvVars(t *testing.T) { @@ -116,7 +119,9 @@ func TestAgentConfig_BYOOOTelCollectorEnvVars(t *testing.T) { BYOOMetricSubset: BYOOMetricSubsetConfig{ Enabled: true, }, - BYOOWorkloadMetricsDropLabels: []string{"metric_subset_enabled"}, + BYOOWorkloadMetrics: BYOOWorkloadMetricsConfig{ + DropLabels: []string{"metric_subset_enabled"}, + }, } assert.Equal(t, []corev1.EnvVar{ diff --git a/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go b/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go index 49e050f62..f13411198 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/zz_generated.deepcopy.go @@ -72,11 +72,7 @@ func (in *AgentConfig) DeepCopyInto(out *AgentConfig) { in.BYOOFluentBitResources.DeepCopyInto(&out.BYOOFluentBitResources) in.BYOOLogChunking.DeepCopyInto(&out.BYOOLogChunking) out.BYOOMetricSubset = in.BYOOMetricSubset - if in.BYOOWorkloadMetricsDropLabels != nil { - in, out := &in.BYOOWorkloadMetricsDropLabels, &out.BYOOWorkloadMetricsDropLabels - *out = make([]string, len(*in)) - copy(*out, *in) - } + in.BYOOWorkloadMetrics.DeepCopyInto(&out.BYOOWorkloadMetrics) return } @@ -175,6 +171,27 @@ func (in *BYOOMetricSubsetConfig) DeepCopy() *BYOOMetricSubsetConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BYOOWorkloadMetricsConfig) DeepCopyInto(out *BYOOWorkloadMetricsConfig) { + *out = *in + if in.DropLabels != nil { + in, out := &in.DropLabels, &out.DropLabels + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BYOOWorkloadMetricsConfig. +func (in *BYOOWorkloadMetricsConfig) DeepCopy() *BYOOWorkloadMetricsConfig { + if in == nil { + return nil + } + out := new(BYOOWorkloadMetricsConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Config) DeepCopyInto(out *Config) { *out = *in From 160af678b291e28c64b7ec87c7a4af48a886d31d Mon Sep 17 00:00:00 2001 From: Kristina Pathak Date: Tue, 21 Jul 2026 16:00:30 -0700 Subject: [PATCH 8/8] docs(nvca): fix metric subset filter examples Signed-off-by: Kristina Pathak --- deploy/helm/nvca-operator/nvca-operator/values.yaml | 2 +- docs/ngc-managed/cluster-management/configuration.md | 2 +- docs/user/cluster-management/configuration.md | 2 +- src/libraries/go/lib/pkg/types/nvca/config/deepcopy_test.go | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/deploy/helm/nvca-operator/nvca-operator/values.yaml b/deploy/helm/nvca-operator/nvca-operator/values.yaml index a073c360b..01ac2c49f 100644 --- a/deploy/helm/nvca-operator/nvca-operator/values.yaml +++ b/deploy/helm/nvca-operator/nvca-operator/values.yaml @@ -110,7 +110,7 @@ agentConfig: # filterConfig: | # error_mode: ignore # metric_conditions: - # - 'metric.name == "BpsInstrument"' + # - 'metric.name != "BpsInstrument"' # byooWorkloadMetrics: # dropLabels: # - metric_subset_enabled diff --git a/docs/ngc-managed/cluster-management/configuration.md b/docs/ngc-managed/cluster-management/configuration.md index 1231a8979..8726b4ed5 100644 --- a/docs/ngc-managed/cluster-management/configuration.md +++ b/docs/ngc-managed/cluster-management/configuration.md @@ -744,7 +744,7 @@ BYOO metric subset example: filterConfig: | error_mode: ignore metric_conditions: - - 'metric.name == "BpsInstrument"' + - 'metric.name != "BpsInstrument"' byooWorkloadMetrics: dropLabels: - metric_subset_enabled diff --git a/docs/user/cluster-management/configuration.md b/docs/user/cluster-management/configuration.md index a5c08c5a0..84e439a79 100644 --- a/docs/user/cluster-management/configuration.md +++ b/docs/user/cluster-management/configuration.md @@ -865,7 +865,7 @@ agentConfig: filterConfig: | error_mode: ignore metric_conditions: - - 'metric.name == "BpsInstrument"' + - 'metric.name != "BpsInstrument"' byooWorkloadMetrics: dropLabels: - metric_subset_enabled diff --git a/src/libraries/go/lib/pkg/types/nvca/config/deepcopy_test.go b/src/libraries/go/lib/pkg/types/nvca/config/deepcopy_test.go index c40591d26..221266f13 100644 --- a/src/libraries/go/lib/pkg/types/nvca/config/deepcopy_test.go +++ b/src/libraries/go/lib/pkg/types/nvca/config/deepcopy_test.go @@ -76,6 +76,7 @@ func TestDeepCopy_BYOOMetricSubsetConfig(t *testing.T) { } out := orig.DeepCopy() require.NotNil(t, out) + assert.NotSame(t, orig, out) assert.Equal(t, orig.Enabled, out.Enabled) assert.Equal(t, orig.FilterConfig, out.FilterConfig) }