From ac01565566d8fddae4cb0ba4fde1366a691ecdd3 Mon Sep 17 00:00:00 2001 From: jonny rhea Date: Wed, 4 Feb 2026 15:33:21 -0600 Subject: [PATCH] all: add ability to set arbitrary tags on resource struct --- cmd/geth/main.go | 1 + cmd/utils/flags.go | 12 ++++++++++-- internal/telemetry/tracesetup/setup.go | 13 ++++++++++++- node/config.go | 1 + 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index e59f5aebfc..2291e0aafa 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -201,6 +201,7 @@ var ( utils.RPCTelemetryUserFlag, utils.RPCTelemetryPasswordFlag, utils.RPCTelemetryInstanceIDFlag, + utils.RPCTelemetryTagsFlag, utils.RPCTelemetrySampleRatioFlag, } diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index acf56e919e..4fd58c0518 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -1074,6 +1074,12 @@ Please note that --` + MetricsHTTPFlag.Name + ` must be set to start the server. Category: flags.APICategory, } + RPCTelemetryTagsFlag = &cli.StringFlag{ + Name: "rpc.telemetry.tags", + Usage: "Comma-separated tags (key/values) added as attributes to the OpenTelemetry resource struct", + Category: flags.APICategory, + } + RPCTelemetrySampleRatioFlag = &cli.Float64Flag{ Name: "rpc.telemetry.sample-ratio", Usage: "Defines the sampling ratio for RPC telemetry (0.0 to 1.0)", @@ -1543,7 +1549,6 @@ func setOpenTelemetry(ctx *cli.Context, cfg *node.Config) { if ctx.IsSet(RPCTelemetryFlag.Name) { tcfg.Enabled = ctx.Bool(RPCTelemetryFlag.Name) } - if ctx.IsSet(RPCTelemetryEndpointFlag.Name) { tcfg.Endpoint = ctx.String(RPCTelemetryEndpointFlag.Name) } @@ -1553,10 +1558,13 @@ func setOpenTelemetry(ctx *cli.Context, cfg *node.Config) { if ctx.IsSet(RPCTelemetryPasswordFlag.Name) { tcfg.AuthPassword = ctx.String(RPCTelemetryPasswordFlag.Name) } - tcfg.SampleRatio = ctx.Float64(RPCTelemetrySampleRatioFlag.Name) if ctx.IsSet(RPCTelemetryInstanceIDFlag.Name) { tcfg.InstanceID = ctx.String(RPCTelemetryInstanceIDFlag.Name) } + if ctx.IsSet(RPCTelemetryTagsFlag.Name) { + tcfg.Tags = ctx.String(RPCTelemetryTagsFlag.Name) + } + tcfg.SampleRatio = ctx.Float64(RPCTelemetrySampleRatioFlag.Name) if tcfg.Endpoint != "" && !tcfg.Enabled { log.Warn(fmt.Sprintf("OpenTelemetry endpoint configured but telemetry is not enabled, use --%s to enable.", RPCTelemetryFlag.Name)) diff --git a/internal/telemetry/tracesetup/setup.go b/internal/telemetry/tracesetup/setup.go index c1a4f9dd0e..9637ca1a9b 100644 --- a/internal/telemetry/tracesetup/setup.go +++ b/internal/telemetry/tracesetup/setup.go @@ -21,6 +21,7 @@ import ( "encoding/base64" "fmt" "net/url" + "strings" "time" "github.com/ethereum/go-ethereum/internal/version" @@ -121,14 +122,24 @@ func SetupTelemetry(cfg node.OpenTelemetryConfig, stack *node.Node) error { sdktrace.WithBatchTimeout(time.Duration(sdktrace.DefaultScheduleDelay) * time.Millisecond), } - // Define resource with service and client information + // Define resource attributes var attr = []attribute.KeyValue{ semconv.ServiceName("geth"), attribute.String("client.name", version.ClientName("geth")), } + // Add instance ID if provided if cfg.InstanceID != "" { attr = append(attr, semconv.ServiceInstanceID(cfg.InstanceID)) } + // Add custom tags if provided + if cfg.Tags != "" { + for tag := range strings.SplitSeq(cfg.Tags, ",") { + key, value, ok := strings.Cut(tag, "=") + if ok { + attr = append(attr, attribute.String(key, value)) + } + } + } res := resource.NewWithAttributes(semconv.SchemaURL, attr...) // Configure TracerProvider and set it as the global tracer provider diff --git a/node/config.go b/node/config.go index 5e0ec63ee5..255b0f0aa9 100644 --- a/node/config.go +++ b/node/config.go @@ -221,6 +221,7 @@ type Config struct { type OpenTelemetryConfig struct { Enabled bool `toml:",omitempty"` + Tags string `toml:",omitempty"` InstanceID string `toml:",omitempty"` // Exporter endpoint.