From 5aef3cc7b6a7a9e4a5530cd6317612771f9456bf Mon Sep 17 00:00:00 2001 From: Linjie Ding Date: Tue, 18 Nov 2025 20:16:52 -0500 Subject: [PATCH] feat: add agent metadata to OTEL trace attributes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add agent registration tags as OTEL trace attributes with the prefix `buildkite.agent.metadata.*`. The tags are read from existing BUILDKITE_AGENT_META_DATA_* environment variables that come from the API's Job.Env response. Example: BUILDKITE_AGENT_META_DATA_QUEUE=default becomes buildkite.agent.metadata.queue=default 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- internal/job/tracing.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/internal/job/tracing.go b/internal/job/tracing.go index 1576bb3507..3d8e593684 100644 --- a/internal/job/tracing.go +++ b/internal/job/tracing.go @@ -7,6 +7,7 @@ import ( "os" "slices" "strconv" + "strings" "github.com/buildkite/agent/v3/env" "github.com/buildkite/agent/v3/tracetools" @@ -259,7 +260,7 @@ func GenericTracingExtras(e *Executor, env *env.Environment) map[string]any { jobKey = "n/a" } - return map[string]any{ + result := map[string]any{ "buildkite.agent": e.AgentName, "buildkite.version": version.Version(), "buildkite.queue": e.Queue, @@ -279,6 +280,19 @@ func GenericTracingExtras(e *Executor, env *env.Environment) map[string]any { "buildkite.rebuilt_from_id": rebuiltFromID, "buildkite.triggered_from_id": triggeredFromID, } + + // Add agent metadata from BUILDKITE_AGENT_META_DATA_* env vars + // These come from the agent's registration tags + const metaDataPrefix = "BUILDKITE_AGENT_META_DATA_" + for key, value := range env.Dump() { + if after, found := strings.CutPrefix(key, metaDataPrefix); found { + // Convert key to lowercase for attribute naming + attrKey := "buildkite.agent.metadata." + strings.ToLower(after) + result[attrKey] = value + } + } + + return result } func DDTracingExtras() map[string]any {