Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion core/cmd/shell.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,8 @@ func newBeholderClient(
LogMaxQueueSize: cfgTelemetry.LogMaxQueueSize(),
// Due to OpenTelemetry semantics, histogram bucket boundaries must be set
// when the Beholder client is constructed.
MetricViews: metricViews(),
MetricViews: metricViews(),
MetricCardinalityLimit: cfgTelemetry.MetricCardinalityLimit(),
}

if cfgTracing.Enabled() {
Expand Down
4 changes: 3 additions & 1 deletion core/config/docs/core.toml
Original file line number Diff line number Diff line change
Expand Up @@ -906,7 +906,9 @@ LogExportMaxBatchSize = 512 # Default
# LogExportInterval sets the maximum duration between batched exports
LogExportInterval = '1s' # Default
# LogMaxQueueSize sets the maximum queue size used by the batcher
LogMaxQueueSize = 2048 # Default
LogMaxQueueSize = 2048 # Default
# MetricCardinalityLimit sets the OTel SDK per-instrument attribute-set limit (0 disables).
MetricCardinalityLimit = 100000 # Default

# ResourceAttributes are global metadata to include with all telemetry.
[Telemetry.ResourceAttributes]
Expand Down
1 change: 1 addition & 0 deletions core/config/telemetry_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ type Telemetry interface {
LogExportMaxBatchSize() int
LogExportInterval() time.Duration
LogMaxQueueSize() int
MetricCardinalityLimit() int
PrometheusBridge() PrometheusBridge
}

Expand Down
5 changes: 5 additions & 0 deletions core/config/toml/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -2995,6 +2995,8 @@ type Telemetry struct {
LogExportInterval *commonconfig.Duration
LogMaxQueueSize *int

MetricCardinalityLimit *int

PrometheusBridge PrometheusBridge `toml:",omitempty"`
}

Expand Down Expand Up @@ -3062,6 +3064,9 @@ func (b *Telemetry) setFrom(f *Telemetry) {
if v := f.LogMaxQueueSize; v != nil {
b.LogMaxQueueSize = v
}
if v := f.MetricCardinalityLimit; v != nil {
b.MetricCardinalityLimit = v
}
b.PrometheusBridge.setFrom(&f.PrometheusBridge)
}

Expand Down
8 changes: 8 additions & 0 deletions core/services/chainlink/config_telemetry.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
var _ config.Telemetry = (*telemetryConfig)(nil)

const defaultHeartbeatInterval = 1 * time.Second
const defaultMetricCardinalityLimit = 100000

type telemetryConfig struct {
s toml.Telemetry
Expand Down Expand Up @@ -182,6 +183,13 @@ func (b *telemetryConfig) LogMaxQueueSize() int {
return *b.s.LogMaxQueueSize
}

func (b *telemetryConfig) MetricCardinalityLimit() int {
if b.s.MetricCardinalityLimit == nil {
return defaultMetricCardinalityLimit
}
return *b.s.MetricCardinalityLimit
}

func (b *telemetryConfig) PrometheusBridge() config.PrometheusBridge {
return &prometheusBridgeConfig{b.s.PrometheusBridge}
}
Expand Down
21 changes: 21 additions & 0 deletions core/services/chainlink/config_telemetry_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -397,3 +397,24 @@ func TestTelemetryConfig_LogMaxQueueSize(t *testing.T) {
})
}
}

func TestTelemetryConfig_MetricCardinalityLimit(t *testing.T) {
t.Parallel()
tests := []struct {
name string
telemetry toml.Telemetry
expected int
}{
{"MetricCardinalityLimitSet", toml.Telemetry{MetricCardinalityLimit: new(500)}, 500},
{"MetricCardinalityLimitNil", toml.Telemetry{MetricCardinalityLimit: nil}, defaultMetricCardinalityLimit},
{"MetricCardinalityLimitZero", toml.Telemetry{MetricCardinalityLimit: new(0)}, 0},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
tc := telemetryConfig{s: tt.telemetry}
assert.Equal(t, tt.expected, tc.MetricCardinalityLimit())
})
}
}
1 change: 1 addition & 0 deletions core/services/chainlink/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -572,6 +572,7 @@
LogExportMaxBatchSize: ptr[int](512),
LogExportInterval: ptrDuration(1 * time.Second),
LogMaxQueueSize: ptrInt(2048),
MetricCardinalityLimit: ptrInt(100000),

Check warning on line 575 in core/services/chainlink/config_test.go

View check run for this annotation

CL-sonarqube-production / SonarQube Code Analysis

newexpr: call of ptrInt(x) can be simplified to new(x)

[modernize.bug.major] null See more on https://sonarqube.main.prod.cldev.sh/project/issues?id=smartcontractkit_chainlink&pullRequest=23084&issues=f208a53f-f154-48e6-9a68-80285c97d92a&open=f208a53f-f154-48e6-9a68-80285c97d92a

PrometheusBridge: toml.PrometheusBridge{
Enabled: ptr(true),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,7 @@ LogExportTimeout = '1s'
LogExportMaxBatchSize = 512
LogExportInterval = '1s'
LogMaxQueueSize = 2048
MetricCardinalityLimit = 100000

[Telemetry.PrometheusBridge]
Enabled = false
Expand Down
1 change: 1 addition & 0 deletions core/services/chainlink/testdata/config-full.toml
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,7 @@ LogExportTimeout = '1s'
LogExportMaxBatchSize = 512
LogExportInterval = '1s'
LogMaxQueueSize = 2048
MetricCardinalityLimit = 100000

[Telemetry.ResourceAttributes]
Baz = 'test'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,7 @@ LogExportTimeout = '1s'
LogExportMaxBatchSize = 512
LogExportInterval = '1s'
LogMaxQueueSize = 2048
MetricCardinalityLimit = 100000

[Telemetry.PrometheusBridge]
Enabled = false
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ require (
github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260415165642-49f23e4d76cc
github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260415165642-49f23e4d76cc
github.com/smartcontractkit/chainlink-ccv v0.0.2-0.20260706093831-dad26b360094
github.com/smartcontractkit/chainlink-common v0.11.2-0.20260710200719-3bdfe6bc75e4
github.com/smartcontractkit/chainlink-common v0.11.2-0.20260710231428-a7dbabb63d6e
github.com/smartcontractkit/chainlink-common/keystore v1.2.0
github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260626151909-052e55e62e62
github.com/smartcontractkit/chainlink-data-streams v0.1.15-0.20260522094612-5f9f748bd87a
Expand Down
4 changes: 2 additions & 2 deletions go.sum

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions plugins/loop_registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,8 @@ func (m *LoopRegistry) Register(id string) (*RegisteredLoop, error) {
envCfg.TelemetryLogExportMaxBatchSize = m.cfgTelemetry.LogExportMaxBatchSize()
envCfg.TelemetryLogExportInterval = m.cfgTelemetry.LogExportInterval()
envCfg.TelemetryLogMaxQueueSize = m.cfgTelemetry.LogMaxQueueSize()
limit := m.cfgTelemetry.MetricCardinalityLimit()
envCfg.TelemetryMetricCardinalityLimit = &limit
envCfg.TelemetryPrometheusBridgeEnabled = m.cfgTelemetry.PrometheusBridge().Enabled()
envCfg.TelemetryPrometheusBridgePrefixes = m.cfgTelemetry.PrometheusBridge().Prefixes()
}
Expand Down
4 changes: 4 additions & 0 deletions plugins/loop_registry_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ func (m mockCfgTelemetry) LogExportMaxBatchSize() int { return 512 }
func (m mockCfgTelemetry) LogExportInterval() time.Duration { return 5 * time.Second }
func (m mockCfgTelemetry) LogMaxQueueSize() int { return 2048 }

func (m mockCfgTelemetry) MetricCardinalityLimit() int { return 100000 }

func (m mockCfgTelemetry) PrometheusBridge() config.PrometheusBridge {
return mockPrometheusBridge{}
}
Expand Down Expand Up @@ -250,6 +252,8 @@ func TestLoopRegistry_Register(t *testing.T) {
require.Equal(t, 512, envCfg.TelemetryLogExportMaxBatchSize)
require.Equal(t, 5*time.Second, envCfg.TelemetryLogExportInterval)
require.Equal(t, 2048, envCfg.TelemetryLogMaxQueueSize)
require.NotNil(t, envCfg.TelemetryMetricCardinalityLimit)
require.Equal(t, 100000, *envCfg.TelemetryMetricCardinalityLimit)

require.Equal(t, "example.com/chip-ingress", envCfg.ChipIngressEndpoint)
require.False(t, envCfg.ChipIngressBatchEmitterEnabled)
Expand Down
Loading