From 6ad9b7108eedbaba0267e2dcacfaf0a787f1f599 Mon Sep 17 00:00:00 2001 From: Pratik Mankawde <3397372+pratikmankawde@users.noreply.github.com> Date: Tue, 14 Jul 2026 18:28:50 +0100 Subject: [PATCH] fix(telemetry): guard cloud legend-group build against empty-string attributes Mirror the local-config guard hardening on the Grafana Cloud collector config: add != "" to the transform/legendgroups presence guards so an empty-string perf-iac attribute (work_item | default('') on a no-work-item run) does not produce iac_group="--". Empty-string sources now leave the group unset. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../otel-collector-config.grafanacloud.yaml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docker/telemetry/otel-collector-config.grafanacloud.yaml b/docker/telemetry/otel-collector-config.grafanacloud.yaml index 3d73577d10..3f269dc9ee 100644 --- a/docker/telemetry/otel-collector-config.grafanacloud.yaml +++ b/docker/telemetry/otel-collector-config.grafanacloud.yaml @@ -138,15 +138,17 @@ processors: # none), so one guard covers them. Unset outside perf runs -> the legend # shows nothing for it. # - resource_group: node id, optionally suffixed with network type. - # Concat is guarded on presence because OTTL Concat renders "" for an - # absent attribute (it does not skip it). + # Concat is guarded on presence (!= nil and != "") because OTTL Concat renders + # "" for an absent attribute and a stray separator for an empty one. The + # perf-iac collector stamps these with an empty-string default when a run has + # no work item, so the empty-string check matters, not just the nil check. transform/legendgroups: metric_statements: - context: resource statements: - - set(attributes["iac_group"], Concat([attributes["xrpl.branch"], attributes["xrpl.node.role"], attributes["xrpl.work.item"]], "-")) where attributes["xrpl.branch"] != nil and attributes["xrpl.node.role"] != nil and attributes["xrpl.work.item"] != nil - - set(attributes["resource_group"], attributes["service.instance.id"]) where attributes["service.instance.id"] != nil - - set(attributes["resource_group"], Concat([attributes["resource_group"], attributes["xrpl.network.type"]], "-")) where attributes["resource_group"] != nil and attributes["xrpl.network.type"] != nil + - set(attributes["iac_group"], Concat([attributes["xrpl.branch"], attributes["xrpl.node.role"], attributes["xrpl.work.item"]], "-")) where attributes["xrpl.branch"] != nil and attributes["xrpl.branch"] != "" and attributes["xrpl.node.role"] != nil and attributes["xrpl.node.role"] != "" and attributes["xrpl.work.item"] != nil and attributes["xrpl.work.item"] != "" + - set(attributes["resource_group"], attributes["service.instance.id"]) where attributes["service.instance.id"] != nil and attributes["service.instance.id"] != "" + - set(attributes["resource_group"], Concat([attributes["resource_group"], attributes["xrpl.network.type"]], "-")) where attributes["resource_group"] != nil and attributes["xrpl.network.type"] != nil and attributes["xrpl.network.type"] != "" connectors: spanmetrics: