From 8e0e223dcc6117bbc6cc967bc5da3b6b23eda8b9 Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Fri, 11 Jul 2025 11:44:12 +0200 Subject: [PATCH 01/22] Add cardinality limit option to MeterProvider configuration(Default 2000) --- sdk/metric/config.go | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/sdk/metric/config.go b/sdk/metric/config.go index 203cd9d6508..14dc1aa0177 100644 --- a/sdk/metric/config.go +++ b/sdk/metric/config.go @@ -17,10 +17,11 @@ import ( // config contains configuration options for a MeterProvider. type config struct { - res *resource.Resource - readers []Reader - views []View - exemplarFilter exemplar.Filter + res *resource.Resource + readers []Reader + views []View + exemplarFilter exemplar.Filter + cardinalityLimit int } // readerSignals returns a force-flush and shutdown function for a @@ -69,8 +70,9 @@ func unifyShutdown(funcs []func(context.Context) error) func(context.Context) er // newConfig returns a config configured with options. func newConfig(options []Option) config { conf := config{ - res: resource.Default(), - exemplarFilter: exemplar.TraceBasedFilter, + res: resource.Default(), + exemplarFilter: exemplar.TraceBasedFilter, + cardinalityLimit: 2000, // Default cardinality limit. } for _, o := range meterProviderOptionsFromEnv() { conf = o.apply(conf) @@ -155,6 +157,20 @@ func WithExemplarFilter(filter exemplar.Filter) Option { }) } +// WithCardinalityLimit sets the cardinality limit for the MeterProvider. +// +// The cardinality limit is the maximum number of unique label sets that can be +// recorded for a given instrument. If the limit is exceeded, the SDK will +// drop the data point. +// +// By default, the cardinality limit is set to 2000. +func WithCardinalityLimit(limit int) Option { + return optionFunc(func(cfg config) config { + cfg.cardinalityLimit = limit + return cfg + }) +} + func meterProviderOptionsFromEnv() []Option { var opts []Option // https://github.com/open-telemetry/opentelemetry-specification/blob/d4b241f451674e8f611bb589477680341006ad2b/specification/configuration/sdk-environment-variables.md#exemplar From c5c4e84c7d99d25e7cc8d30c10614890ff4defbb Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Fri, 11 Jul 2025 11:44:52 +0200 Subject: [PATCH 02/22] unit tests for `Cardinality Limit` --- sdk/metric/config_test.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/sdk/metric/config_test.go b/sdk/metric/config_test.go index 307c3e598e0..f87dbac970a 100644 --- a/sdk/metric/config_test.go +++ b/sdk/metric/config_test.go @@ -306,6 +306,16 @@ func TestWithExemplarFilterOff(t *testing.T) { } } +func TestWithCardinalityLimit(t *testing.T) { + c := newConfig([]Option{WithCardinalityLimit(1000)}) + assert.Equal(t, 1000, c.cardinalityLimit) +} + +func TestWithDefaultCardinalityLimit(t *testing.T) { + c := newConfig([]Option{}) + assert.Equal(t, 2000, c.cardinalityLimit) +} + func sample(parent context.Context) context.Context { sc := trace.NewSpanContext(trace.SpanContextConfig{ TraceID: trace.TraceID{0x01}, From f666cfcffdbca502e57798b07a036581abf9f78b Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Fri, 11 Jul 2025 11:46:53 +0200 Subject: [PATCH 03/22] refactor test --- sdk/metric/config_test.go | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/sdk/metric/config_test.go b/sdk/metric/config_test.go index f87dbac970a..ba05a7a043b 100644 --- a/sdk/metric/config_test.go +++ b/sdk/metric/config_test.go @@ -307,13 +307,29 @@ func TestWithExemplarFilterOff(t *testing.T) { } func TestWithCardinalityLimit(t *testing.T) { - c := newConfig([]Option{WithCardinalityLimit(1000)}) - assert.Equal(t, 1000, c.cardinalityLimit) -} + cases := []struct { + name string + options []Option + expectedLimit int + }{ + { + name: "explicit cardinality limit", + options: []Option{WithCardinalityLimit(1000)}, + expectedLimit: 1000, + }, + { + name: "default cardinality limit", + options: []Option{}, + expectedLimit: 2000, + }, + } -func TestWithDefaultCardinalityLimit(t *testing.T) { - c := newConfig([]Option{}) - assert.Equal(t, 2000, c.cardinalityLimit) + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + c := newConfig(tc.options) + assert.Equal(t, tc.expectedLimit, c.cardinalityLimit) + }) + } } func sample(parent context.Context) context.Context { From c9edcf995b0458fd79c69982ed96ff513c347172 Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Fri, 11 Jul 2025 11:52:22 +0200 Subject: [PATCH 04/22] fix format --- sdk/metric/config_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/metric/config_test.go b/sdk/metric/config_test.go index ba05a7a043b..1235cbcb603 100644 --- a/sdk/metric/config_test.go +++ b/sdk/metric/config_test.go @@ -308,9 +308,9 @@ func TestWithExemplarFilterOff(t *testing.T) { func TestWithCardinalityLimit(t *testing.T) { cases := []struct { - name string - options []Option - expectedLimit int + name string + options []Option + expectedLimit int }{ { name: "explicit cardinality limit", From e76e74f05d80ac7f5e1a72388e227636c454a9e1 Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Fri, 11 Jul 2025 11:55:59 +0200 Subject: [PATCH 05/22] fix format --- sdk/metric/config_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/metric/config_test.go b/sdk/metric/config_test.go index 1235cbcb603..6337093778c 100644 --- a/sdk/metric/config_test.go +++ b/sdk/metric/config_test.go @@ -308,8 +308,8 @@ func TestWithExemplarFilterOff(t *testing.T) { func TestWithCardinalityLimit(t *testing.T) { cases := []struct { - name string - options []Option + name string + options []Option expectedLimit int }{ { From c555a1f6d230a25d95523dd6700d8c6d3ef07e33 Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Fri, 11 Jul 2025 12:04:35 +0200 Subject: [PATCH 06/22] Changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a1e084d5b9..cc6f3e4ee43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,8 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - `RPCGRPCResponseMetadata` - Add `ErrorType` attribute helper function to the `go.opentelmetry.io/otel/semconv/v1.34.0` package. (#6962) +- Add `cardinalityLimit` Configuration Option. (#6976) + ### Changed - Change `AssertEqual` in `go.opentelemetry.io/otel/log/logtest` to accept `TestingT` in order to support benchmarks and fuzz tests. (#6908) From 790095849895cb49cfb6c184142a6e6c112f1b45 Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Fri, 11 Jul 2025 12:05:17 +0200 Subject: [PATCH 07/22] fix Pr number --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc6f3e4ee43..3b94a898a2d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,7 +41,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - `RPCGRPCResponseMetadata` - Add `ErrorType` attribute helper function to the `go.opentelmetry.io/otel/semconv/v1.34.0` package. (#6962) -- Add `cardinalityLimit` Configuration Option. (#6976) +- Add `cardinalityLimit` Configuration Option. (#6996) ### Changed From ad08fcdd47a53a4fa99df5253687a05923ebf2b5 Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Fri, 11 Jul 2025 12:27:09 +0200 Subject: [PATCH 08/22] extract default CardinalityLimit to const --- sdk/metric/config.go | 5 ++++- sdk/metric/config_test.go | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/sdk/metric/config.go b/sdk/metric/config.go index 14dc1aa0177..862ad1922f5 100644 --- a/sdk/metric/config.go +++ b/sdk/metric/config.go @@ -24,6 +24,9 @@ type config struct { cardinalityLimit int } +// default cardinality limit. +const defaultCardinalityLimit = 2000 + // readerSignals returns a force-flush and shutdown function for a // MeterProvider to call in their respective options. All Readers c contains // will have their force-flush and shutdown methods unified into returned @@ -72,7 +75,7 @@ func newConfig(options []Option) config { conf := config{ res: resource.Default(), exemplarFilter: exemplar.TraceBasedFilter, - cardinalityLimit: 2000, // Default cardinality limit. + cardinalityLimit: defaultCardinalityLimit, } for _, o := range meterProviderOptionsFromEnv() { conf = o.apply(conf) diff --git a/sdk/metric/config_test.go b/sdk/metric/config_test.go index 6337093778c..a297e2e9721 100644 --- a/sdk/metric/config_test.go +++ b/sdk/metric/config_test.go @@ -320,7 +320,7 @@ func TestWithCardinalityLimit(t *testing.T) { { name: "default cardinality limit", options: []Option{}, - expectedLimit: 2000, + expectedLimit: defaultCardinalityLimit, }, } From 5c9c26f4564f0e633ff521cf4de6106b74de3a7c Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Fri, 11 Jul 2025 12:30:01 +0200 Subject: [PATCH 09/22] update description --- sdk/metric/config.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/metric/config.go b/sdk/metric/config.go index 862ad1922f5..727729d5a02 100644 --- a/sdk/metric/config.go +++ b/sdk/metric/config.go @@ -162,11 +162,11 @@ func WithExemplarFilter(filter exemplar.Filter) Option { // WithCardinalityLimit sets the cardinality limit for the MeterProvider. // -// The cardinality limit is the maximum number of unique label sets that can be -// recorded for a given instrument. If the limit is exceeded, the SDK will -// drop the data point. +// The cardinality limit is the hard limit on the number of metric streams +// that can be collected for a single instrument. // // By default, the cardinality limit is set to 2000. +// To disable the limit, set the value to 0 or a negative number. func WithCardinalityLimit(limit int) Option { return optionFunc(func(cfg config) config { cfg.cardinalityLimit = limit From ff93247914960b68577b38357de326e3a2ccdb61 Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Fri, 11 Jul 2025 12:33:54 +0200 Subject: [PATCH 10/22] fix changelog --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b94a898a2d..aad55bb2b8b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,8 +40,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - `RPCGRPCRequestMetadata` - `RPCGRPCResponseMetadata` - Add `ErrorType` attribute helper function to the `go.opentelmetry.io/otel/semconv/v1.34.0` package. (#6962) - -- Add `cardinalityLimit` Configuration Option. (#6996) +- Add `WithCardinalityLimit` option to configure the `cardinalityLimit` used by `go.opentelemetry.io/otel/sdk/metric`. (#6996) ### Changed From 0132081955cee7b7ae666f45fb8675ad1afdeb29 Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Fri, 11 Jul 2025 12:54:41 +0200 Subject: [PATCH 11/22] support the `OTEL_GO_X_CARDINALITY_LIMIT` env var --- sdk/metric/config.go | 16 +++++++++++++++- sdk/metric/config_test.go | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/sdk/metric/config.go b/sdk/metric/config.go index 727729d5a02..a9b275e0c95 100644 --- a/sdk/metric/config.go +++ b/sdk/metric/config.go @@ -7,6 +7,7 @@ import ( "context" "errors" "os" + "strconv" "strings" "sync" @@ -75,7 +76,7 @@ func newConfig(options []Option) config { conf := config{ res: resource.Default(), exemplarFilter: exemplar.TraceBasedFilter, - cardinalityLimit: defaultCardinalityLimit, + cardinalityLimit: cardinalityLimitFromEnv(), } for _, o := range meterProviderOptionsFromEnv() { conf = o.apply(conf) @@ -189,3 +190,16 @@ func meterProviderOptionsFromEnv() []Option { } return opts } + +func cardinalityLimitFromEnv() int { + const cardinalityLimitKey = "OTEL_GO_X_CARDINALITY_LIMIT" + v := strings.TrimSpace(os.Getenv(cardinalityLimitKey)) + if v == "" { + return defaultCardinalityLimit + } + n, err := strconv.Atoi(v) + if err != nil { + return defaultCardinalityLimit + } + return n +} diff --git a/sdk/metric/config_test.go b/sdk/metric/config_test.go index a297e2e9721..ed6a1d32e9a 100644 --- a/sdk/metric/config_test.go +++ b/sdk/metric/config_test.go @@ -6,6 +6,7 @@ package metric import ( "context" "errors" + "os" "testing" "github.com/google/go-cmp/cmp" @@ -307,18 +308,44 @@ func TestWithExemplarFilterOff(t *testing.T) { } func TestWithCardinalityLimit(t *testing.T) { + const envVar = "OTEL_GO_X_CARDINALITY_LIMIT" + + originalEnv := os.Getenv(envVar) + defer t.Setenv(envVar, originalEnv) + cases := []struct { name string + envValue string options []Option expectedLimit int }{ { - name: "explicit cardinality limit", + name: "only cardinality limit from option", + envValue: "", options: []Option{WithCardinalityLimit(1000)}, expectedLimit: 1000, }, { - name: "default cardinality limit", + name: "cardinality limit from option overrides env", + envValue: "500", + options: []Option{WithCardinalityLimit(1000)}, + expectedLimit: 1000, + }, + { + name: "cardinality limit from env", + envValue: "1234", + options: []Option{}, + expectedLimit: 1234, + }, + { + name: "invalid env value uses default", + envValue: "not-a-number", + options: []Option{}, + expectedLimit: defaultCardinalityLimit, + }, + { + name: "empty env and no option uses default", + envValue: "", options: []Option{}, expectedLimit: defaultCardinalityLimit, }, @@ -326,6 +353,7 @@ func TestWithCardinalityLimit(t *testing.T) { for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { + os.Setenv(envVar, tc.envValue) c := newConfig(tc.options) assert.Equal(t, tc.expectedLimit, c.cardinalityLimit) }) From a583ea94324b44a18432ff15a470b7b97482652f Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Fri, 11 Jul 2025 12:56:41 +0200 Subject: [PATCH 12/22] fix test --- sdk/metric/config_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/metric/config_test.go b/sdk/metric/config_test.go index ed6a1d32e9a..900b1bbd127 100644 --- a/sdk/metric/config_test.go +++ b/sdk/metric/config_test.go @@ -353,7 +353,7 @@ func TestWithCardinalityLimit(t *testing.T) { for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { - os.Setenv(envVar, tc.envValue) + t.Setenv(envVar, tc.envValue) c := newConfig(tc.options) assert.Equal(t, tc.expectedLimit, c.cardinalityLimit) }) From 0ae2f4e75dafb35b685f13c0e4b771918faa4ed6 Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Fri, 11 Jul 2025 12:56:55 +0200 Subject: [PATCH 13/22] fix test --- sdk/metric/config_test.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/sdk/metric/config_test.go b/sdk/metric/config_test.go index 900b1bbd127..b13d17a6972 100644 --- a/sdk/metric/config_test.go +++ b/sdk/metric/config_test.go @@ -6,7 +6,6 @@ package metric import ( "context" "errors" - "os" "testing" "github.com/google/go-cmp/cmp" @@ -310,9 +309,6 @@ func TestWithExemplarFilterOff(t *testing.T) { func TestWithCardinalityLimit(t *testing.T) { const envVar = "OTEL_GO_X_CARDINALITY_LIMIT" - originalEnv := os.Getenv(envVar) - defer t.Setenv(envVar, originalEnv) - cases := []struct { name string envValue string From c3ac6c41641aa777e2724d0bb5ab34a6f994509f Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Fri, 11 Jul 2025 13:13:14 +0200 Subject: [PATCH 14/22] Update CHANGELOG.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Robert Pająk --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 680bb2b9c3a..d94b1fa67ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,7 +41,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - `RPCGRPCResponseMetadata` - Add `ErrorType` attribute helper function to the `go.opentelmetry.io/otel/semconv/v1.34.0` package. (#6962) - Add `WithAllowKeyDuplication` in `go.opentelemetry.io/otel/sdk/log` which can be used to disable deduplication for log records. (#6968) -- Add `WithCardinalityLimit` option to configure the `cardinalityLimit` used by `go.opentelemetry.io/otel/sdk/metric`. (#6996) +- Add `WithCardinalityLimit` option to configure the cardinality limit in `go.opentelemetry.io/otel/sdk/metric`. (#6996) ### Changed From 0650c7044fdb15bb090cd4ae844c5bb34f15443e Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Fri, 11 Jul 2025 13:15:33 +0200 Subject: [PATCH 15/22] remove comment --- sdk/metric/config.go | 1 - 1 file changed, 1 deletion(-) diff --git a/sdk/metric/config.go b/sdk/metric/config.go index a9b275e0c95..d3ee01cc8fa 100644 --- a/sdk/metric/config.go +++ b/sdk/metric/config.go @@ -25,7 +25,6 @@ type config struct { cardinalityLimit int } -// default cardinality limit. const defaultCardinalityLimit = 2000 // readerSignals returns a force-flush and shutdown function for a From 3f33729637c440c3e6ca0570103d4da2e915fd06 Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Fri, 11 Jul 2025 13:16:35 +0200 Subject: [PATCH 16/22] inline envvar in test --- sdk/metric/config_test.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sdk/metric/config_test.go b/sdk/metric/config_test.go index b13d17a6972..b3d728d29fc 100644 --- a/sdk/metric/config_test.go +++ b/sdk/metric/config_test.go @@ -307,8 +307,6 @@ func TestWithExemplarFilterOff(t *testing.T) { } func TestWithCardinalityLimit(t *testing.T) { - const envVar = "OTEL_GO_X_CARDINALITY_LIMIT" - cases := []struct { name string envValue string @@ -349,7 +347,7 @@ func TestWithCardinalityLimit(t *testing.T) { for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { - t.Setenv(envVar, tc.envValue) + t.Setenv("OTEL_GO_X_CARDINALITY_LIMIT", tc.envValue) c := newConfig(tc.options) assert.Equal(t, tc.expectedLimit, c.cardinalityLimit) }) From eaa667c860e9f2fbc34db2b6dd617d5dddc80547 Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Fri, 11 Jul 2025 13:25:26 +0200 Subject: [PATCH 17/22] update docs --- sdk/metric/config.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sdk/metric/config.go b/sdk/metric/config.go index d3ee01cc8fa..44932ad8ab4 100644 --- a/sdk/metric/config.go +++ b/sdk/metric/config.go @@ -166,7 +166,8 @@ func WithExemplarFilter(filter exemplar.Filter) Option { // that can be collected for a single instrument. // // By default, the cardinality limit is set to 2000. -// To disable the limit, set the value to 0 or a negative number. +// +// Setting this to a zero or negative value means no limit is applied. func WithCardinalityLimit(limit int) Option { return optionFunc(func(cfg config) config { cfg.cardinalityLimit = limit From 6d2678685f6e02e262819e09c338add49e9f1332 Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Fri, 11 Jul 2025 14:53:39 +0200 Subject: [PATCH 18/22] Handle error --- sdk/metric/config.go | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/metric/config.go b/sdk/metric/config.go index 44932ad8ab4..23f6eb838f1 100644 --- a/sdk/metric/config.go +++ b/sdk/metric/config.go @@ -199,6 +199,7 @@ func cardinalityLimitFromEnv() int { } n, err := strconv.Atoi(v) if err != nil { + otel.Handle(err) return defaultCardinalityLimit } return n From 338964e36d3af4193f6aea6bbdc6706e45bf56ca Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Mon, 14 Jul 2025 09:34:10 +0200 Subject: [PATCH 19/22] update WithCardinalityLimit docs --- sdk/metric/config.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sdk/metric/config.go b/sdk/metric/config.go index 23f6eb838f1..8702e0c3add 100644 --- a/sdk/metric/config.go +++ b/sdk/metric/config.go @@ -163,11 +163,14 @@ func WithExemplarFilter(filter exemplar.Filter) Option { // WithCardinalityLimit sets the cardinality limit for the MeterProvider. // // The cardinality limit is the hard limit on the number of metric streams -// that can be collected for a single instrument. +// that can be collected for a single instrument in a single collect cycle. // // By default, the cardinality limit is set to 2000. // // Setting this to a zero or negative value means no limit is applied. +// +// For backward compatibility, the environment variable `OTEL_GO_X_CARDINALITY_LIMIT` +// can also be used to set this value. func WithCardinalityLimit(limit int) Option { return optionFunc(func(cfg config) config { cfg.cardinalityLimit = limit From 37ce2a9c738978e33145fb38530ff3a6ad22a914 Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Wed, 16 Jul 2025 09:14:01 +0200 Subject: [PATCH 20/22] change default to no limit --- CHANGELOG.md | 3 +-- sdk/metric/config.go | 9 ++++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eea098a1209..04282bcefbf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,8 +41,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - `RPCGRPCResponseMetadata` - Add `ErrorType` attribute helper function to the `go.opentelmetry.io/otel/semconv/v1.34.0` package. (#6962) - Add `WithAllowKeyDuplication` in `go.opentelemetry.io/otel/sdk/log` which can be used to disable deduplication for log records. (#6968) -- Add `WithCardinalityLimit` option to configure the cardinality limit in `go.opentelemetry.io/otel/sdk/metric`. - Now applies a default cardinality limit of 2000, which didn’t exist before. This is a breaking change. (#6996) +- Add `WithCardinalityLimit` option to configure the cardinality limit in `go.opentelemetry.io/otel/sdk/metric`. (#6996) - Add `Clone` method to `Record` in `go.opentelemetry.io/otel/log` that returns a copy of the record with no shared state. (#7001) ### Changed diff --git a/sdk/metric/config.go b/sdk/metric/config.go index 8702e0c3add..cb817459bfc 100644 --- a/sdk/metric/config.go +++ b/sdk/metric/config.go @@ -25,7 +25,7 @@ type config struct { cardinalityLimit int } -const defaultCardinalityLimit = 2000 +const defaultCardinalityLimit = 0 // readerSignals returns a force-flush and shutdown function for a // MeterProvider to call in their respective options. All Readers c contains @@ -165,13 +165,12 @@ func WithExemplarFilter(filter exemplar.Filter) Option { // The cardinality limit is the hard limit on the number of metric streams // that can be collected for a single instrument in a single collect cycle. // -// By default, the cardinality limit is set to 2000. +// By default, the cardinality limit is set to 0. // // Setting this to a zero or negative value means no limit is applied. -// -// For backward compatibility, the environment variable `OTEL_GO_X_CARDINALITY_LIMIT` -// can also be used to set this value. func WithCardinalityLimit(limit int) Option { + // For backward compatibility, the environment variable `OTEL_GO_X_CARDINALITY_LIMIT` + // can also be used to set this value. return optionFunc(func(cfg config) config { cfg.cardinalityLimit = limit return cfg From 9e210431f30c1e822c525e3dc02d6eacbcce03df Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Wed, 16 Jul 2025 09:38:45 +0200 Subject: [PATCH 21/22] Update sdk/metric/config.go Co-authored-by: Damien Mathieu <42@dmathieu.com> --- sdk/metric/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/metric/config.go b/sdk/metric/config.go index cb817459bfc..6da93a3f917 100644 --- a/sdk/metric/config.go +++ b/sdk/metric/config.go @@ -165,7 +165,7 @@ func WithExemplarFilter(filter exemplar.Filter) Option { // The cardinality limit is the hard limit on the number of metric streams // that can be collected for a single instrument in a single collect cycle. // -// By default, the cardinality limit is set to 0. +// By default, there is no limit applied. // // Setting this to a zero or negative value means no limit is applied. func WithCardinalityLimit(limit int) Option { From 304b6d4f41d1c8eccec4c80b5df2bea079d6fe67 Mon Sep 17 00:00:00 2001 From: Yevhenii Solomchenko Date: Thu, 17 Jul 2025 09:53:07 +0200 Subject: [PATCH 22/22] Update sdk/metric/config.go Co-authored-by: Cijo Thomas --- sdk/metric/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/metric/config.go b/sdk/metric/config.go index 6da93a3f917..7580c074019 100644 --- a/sdk/metric/config.go +++ b/sdk/metric/config.go @@ -162,7 +162,7 @@ func WithExemplarFilter(filter exemplar.Filter) Option { // WithCardinalityLimit sets the cardinality limit for the MeterProvider. // -// The cardinality limit is the hard limit on the number of metric streams +// The cardinality limit is the hard limit on the number of metric datapoints // that can be collected for a single instrument in a single collect cycle. // // By default, there is no limit applied.