diff --git a/.codecov.yml b/.codecov.yml index ab3a1abc396cf..6c47ef31e92f2 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -436,6 +436,10 @@ component_management: name: extension_sumologic paths: - extension/sumologicextension/** + - component_id: extension_tailsampling_examplesampler + name: extension_tailsampling_examplesampler + paths: + - extension/tailsampling/examplesampler/** - component_id: processor_attributes name: processor_attributes paths: diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index b6d82aa93bb91..4a201211d12c5 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -135,6 +135,7 @@ extension/storage/dbstorage/ @open-telemetry extension/storage/filestorage/ @open-telemetry/collector-contrib-approvers @swiatekm @VihasMakwana extension/storage/redisstorageextension/ @open-telemetry/collector-contrib-approvers @atoulme extension/sumologicextension/ @open-telemetry/collector-contrib-approvers @rnishtala-sumo @chan-tim-sumo @echlebek @amdprophet +extension/tailsampling/examplesampler/ @open-telemetry/collector-contrib-approvers @portertech @Logiraptor internal/aws/ @open-telemetry/collector-contrib-approvers @Aneurysm9 @mxiamxia internal/collectd/ @open-telemetry/collector-contrib-approvers @atoulme internal/common/ @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers diff --git a/.github/ISSUE_TEMPLATE/beta_stability.yaml b/.github/ISSUE_TEMPLATE/beta_stability.yaml index 4b6f04f2fa69f..14915327bdc23 100644 --- a/.github/ISSUE_TEMPLATE/beta_stability.yaml +++ b/.github/ISSUE_TEMPLATE/beta_stability.yaml @@ -134,6 +134,7 @@ body: - extension/storage/filestorage - extension/storage/redisstorage - extension/sumologic + - extension/tailsampling/examplesampler - internal/aws - internal/collectd - internal/common diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 45ce655d03fa5..9dfa221eb6bc5 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -137,6 +137,7 @@ body: - extension/storage/filestorage - extension/storage/redisstorage - extension/sumologic + - extension/tailsampling/examplesampler - internal/aws - internal/collectd - internal/common diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index 6f71dc5567065..e4b7b1573904e 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -131,6 +131,7 @@ body: - extension/storage/filestorage - extension/storage/redisstorage - extension/sumologic + - extension/tailsampling/examplesampler - internal/aws - internal/collectd - internal/common diff --git a/.github/ISSUE_TEMPLATE/other.yaml b/.github/ISSUE_TEMPLATE/other.yaml index 9f7b09fa80feb..26ed51b28ef2e 100644 --- a/.github/ISSUE_TEMPLATE/other.yaml +++ b/.github/ISSUE_TEMPLATE/other.yaml @@ -131,6 +131,7 @@ body: - extension/storage/filestorage - extension/storage/redisstorage - extension/sumologic + - extension/tailsampling/examplesampler - internal/aws - internal/collectd - internal/common diff --git a/.github/ISSUE_TEMPLATE/unmaintained.yaml b/.github/ISSUE_TEMPLATE/unmaintained.yaml index ff32ae3b9b0eb..1df5e14eddcf4 100644 --- a/.github/ISSUE_TEMPLATE/unmaintained.yaml +++ b/.github/ISSUE_TEMPLATE/unmaintained.yaml @@ -136,6 +136,7 @@ body: - extension/storage/filestorage - extension/storage/redisstorage - extension/sumologic + - extension/tailsampling/examplesampler - internal/aws - internal/collectd - internal/common diff --git a/.github/component_labels.txt b/.github/component_labels.txt index 284d16247198f..5500480cbf8d3 100644 --- a/.github/component_labels.txt +++ b/.github/component_labels.txt @@ -116,6 +116,7 @@ extension/storage/dbstorage extension/storage/dbstorage extension/storage/filestorage extension/storage/filestorage extension/storage/redisstorageextension extension/storage/redisstorage extension/sumologicextension extension/sumologic +extension/tailsampling/examplesampler extension/tailsampling/examplesampler internal/aws internal/aws internal/collectd internal/collectd internal/common internal/common diff --git a/extension/tailsampling/README.md b/extension/tailsampling/README.md new file mode 100644 index 0000000000000..bc1c12f32ec41 --- /dev/null +++ b/extension/tailsampling/README.md @@ -0,0 +1,13 @@ +# Tail Sampling Extensions + +Tail sampling extensions are a collection of custom sampling policy types that +can be enabled for use. They intent is to include more specific samplers that +may not make sense in all environments, or more experimental samplers that do +not make sense to include in the core component yet. + +## Adding new extensions + +Follow the instructions to create a new component from +[CONTRIBUTING.md](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#adding-new-components). +You can use `examplesampler` as a reference for `factory.go` and the general +pattern of creating a sampler extension. diff --git a/extension/tailsampling/examplesampler/Makefile b/extension/tailsampling/examplesampler/Makefile new file mode 100644 index 0000000000000..bdd863a203be8 --- /dev/null +++ b/extension/tailsampling/examplesampler/Makefile @@ -0,0 +1 @@ +include ../../../Makefile.Common diff --git a/extension/tailsampling/examplesampler/README.md b/extension/tailsampling/examplesampler/README.md new file mode 100644 index 0000000000000..18b7fbaf820f1 --- /dev/null +++ b/extension/tailsampling/examplesampler/README.md @@ -0,0 +1,15 @@ +# Example Sampler + +| Status | | +| ------------- |-----------| +| Stability | [development] | +| Distributions | [] | +| Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Aextension%2Fexamplesampler%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Aextension%2Fexamplesampler) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Aextension%2Fexamplesampler%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Aextension%2Fexamplesampler) | +| Code coverage | [![codecov](https://codecov.io/github/open-telemetry/opentelemetry-collector-contrib/graph/main/badge.svg?component=extension_examplesampler)](https://app.codecov.io/gh/open-telemetry/opentelemetry-collector-contrib/tree/main/?components%5B0%5D=extension_examplesampler&displayType=list) | +| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@portertech](https://www.github.com/portertech), [@Logiraptor](https://www.github.com/Logiraptor) | + +[development]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#development + + +This sampler is for reference when creating new samplers. By itself it just +returns NotSampled for all traces. diff --git a/extension/tailsampling/examplesampler/config.go b/extension/tailsampling/examplesampler/config.go new file mode 100644 index 0000000000000..b40c171787536 --- /dev/null +++ b/extension/tailsampling/examplesampler/config.go @@ -0,0 +1,7 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 +package examplesampler // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/tailsampling/examplesampler" + +// Config configures the example. It is a placeholder/useful as boilerplate for +// other samplers. +type Config struct{} diff --git a/extension/tailsampling/examplesampler/documentation.md b/extension/tailsampling/examplesampler/documentation.md new file mode 100644 index 0000000000000..ab862b0eb6757 --- /dev/null +++ b/extension/tailsampling/examplesampler/documentation.md @@ -0,0 +1,21 @@ +[comment]: <> (Code generated by mdatagen. DO NOT EDIT.) + +# examplesampler + +## Internal Telemetry + +The following telemetry is emitted by this component. + +### otelcol_extension_tail_sampling_evaluations_count + +How many traces have been evaluated [Development] + +| Unit | Metric Type | Value Type | Monotonic | Stability | +| ---- | ----------- | ---------- | --------- | --------- | +| {traces} | Sum | Int | true | Development | + +#### Attributes + +| Name | Description | Values | +| ---- | ----------- | ------ | +| policy | Name of the policy | Any Str | diff --git a/extension/tailsampling/examplesampler/extension.go b/extension/tailsampling/examplesampler/extension.go new file mode 100644 index 0000000000000..b21280f1d65da --- /dev/null +++ b/extension/tailsampling/examplesampler/extension.go @@ -0,0 +1,75 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 +package examplesampler // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/tailsampling/examplesampler" + +import ( + "context" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/extension" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" + "go.uber.org/zap" + + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/tailsampling/examplesampler/internal/metadata" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor/pkg/samplingpolicy" +) + +type exampleExtension struct { + component.Component + + telemetry *metadata.TelemetryBuilder + logger *zap.Logger +} + +var ( + _ extension.Extension = (*exampleExtension)(nil) + _ samplingpolicy.Extension = (*exampleExtension)(nil) +) + +func NewExtension(settings extension.Settings, _ *Config) (extension.Extension, error) { + telemetry, err := metadata.NewTelemetryBuilder(settings.TelemetrySettings) + if err != nil { + return nil, err + } + + return &exampleExtension{ + telemetry: telemetry, + logger: settings.Logger, + }, nil +} + +func (e *exampleExtension) Start(_ context.Context, _ component.Host) error { + e.logger.Debug("Starting examplesampler extension") + return nil +} + +func (e *exampleExtension) Shutdown(_ context.Context) error { + e.logger.Debug("Shutting down examplesampler extension") + e.telemetry.Shutdown() + return nil +} + +// NewEvaluator implements samplingpolicy.Extension. +func (e *exampleExtension) NewEvaluator(policyName string, cfg map[string]any) (samplingpolicy.Evaluator, error) { + e.logger.Debug("Creating new evaluator", zap.String("policy_name", policyName), zap.Any("cfg", cfg)) + + return &evaluator{ + policy: policyName, + telemetry: e.telemetry, + }, nil +} + +type evaluator struct { + policy string + telemetry *metadata.TelemetryBuilder +} + +// Evaluate implements samplingpolicy.Evaluator. +func (e *evaluator) Evaluate(ctx context.Context, _ pcommon.TraceID, _ *samplingpolicy.TraceData) (samplingpolicy.Decision, error) { + e.telemetry.ExtensionTailSamplingEvaluationsCount.Add(ctx, 1, + metric.WithAttributes(attribute.String("policy", e.policy)), + ) + return samplingpolicy.NotSampled, nil +} diff --git a/extension/tailsampling/examplesampler/extension_test.go b/extension/tailsampling/examplesampler/extension_test.go new file mode 100644 index 0000000000000..55d8d2c0b7f41 --- /dev/null +++ b/extension/tailsampling/examplesampler/extension_test.go @@ -0,0 +1,38 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package examplesampler + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/extension/extensiontest" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/ptrace" + + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/tailsampling/examplesampler/internal/metadata" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor/pkg/samplingpolicy" +) + +func TestExtension(t *testing.T) { + extension, err := NewExtension(extensiontest.NewNopSettings(metadata.Type), &Config{}) + require.NoError(t, err) + + defer func() { + assert.NoError(t, extension.Shutdown(t.Context())) + }() + + evaluator, err := extension.(*exampleExtension).NewEvaluator("example", nil) + require.NoError(t, err) + + traceID := pcommon.NewTraceIDEmpty() + traces := ptrace.NewTraces() + td := &samplingpolicy.TraceData{ + ReceivedBatches: traces, + } + decision, err := evaluator.Evaluate(t.Context(), traceID, td) + require.NoError(t, err) + assert.Equal(t, samplingpolicy.NotSampled, decision) +} diff --git a/extension/tailsampling/examplesampler/factory.go b/extension/tailsampling/examplesampler/factory.go new file mode 100644 index 0000000000000..88ec986753629 --- /dev/null +++ b/extension/tailsampling/examplesampler/factory.go @@ -0,0 +1,33 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:generate mdatagen metadata.yaml + +package examplesampler // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/tailsampling/examplesampler" + +import ( + "context" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/extension" + + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/tailsampling/examplesampler/internal/metadata" +) + +func NewFactory() extension.Factory { + return extension.NewFactory( + metadata.Type, + createDefaultConfig, + createExtension, + metadata.ExtensionStability, + ) +} + +func createDefaultConfig() component.Config { + return &Config{} +} + +func createExtension(_ context.Context, settings extension.Settings, cfg component.Config) (extension.Extension, error) { + eCfg := cfg.(*Config) + return NewExtension(settings, eCfg) +} diff --git a/extension/tailsampling/examplesampler/generated_component_test.go b/extension/tailsampling/examplesampler/generated_component_test.go new file mode 100644 index 0000000000000..1ec7704655f68 --- /dev/null +++ b/extension/tailsampling/examplesampler/generated_component_test.go @@ -0,0 +1,68 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package examplesampler + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/confmap/confmaptest" + "go.opentelemetry.io/collector/extension/extensiontest" +) + +var typ = component.MustNewType("examplesampler") + +func TestComponentFactoryType(t *testing.T) { + require.Equal(t, typ, NewFactory().Type()) +} + +func TestComponentConfigStruct(t *testing.T) { + require.NoError(t, componenttest.CheckConfigStruct(NewFactory().CreateDefaultConfig())) +} + +func TestComponentLifecycle(t *testing.T) { + factory := NewFactory() + + cm, err := confmaptest.LoadConf("metadata.yaml") + require.NoError(t, err) + cfg := factory.CreateDefaultConfig() + sub, err := cm.Sub("tests::config") + require.NoError(t, err) + require.NoError(t, sub.Unmarshal(&cfg)) + t.Run("shutdown", func(t *testing.T) { + e, err := factory.Create(context.Background(), extensiontest.NewNopSettings(typ), cfg) + require.NoError(t, err) + err = e.Shutdown(context.Background()) + require.NoError(t, err) + }) + t.Run("lifecycle", func(t *testing.T) { + firstExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(typ), cfg) + require.NoError(t, err) + require.NoError(t, firstExt.Start(context.Background(), newMdatagenNopHost())) + require.NoError(t, firstExt.Shutdown(context.Background())) + + secondExt, err := factory.Create(context.Background(), extensiontest.NewNopSettings(typ), cfg) + require.NoError(t, err) + require.NoError(t, secondExt.Start(context.Background(), newMdatagenNopHost())) + require.NoError(t, secondExt.Shutdown(context.Background())) + }) +} + +var _ component.Host = (*mdatagenNopHost)(nil) + +type mdatagenNopHost struct{} + +func newMdatagenNopHost() component.Host { + return &mdatagenNopHost{} +} + +func (mnh *mdatagenNopHost) GetExtensions() map[component.ID]component.Component { + return nil +} + +func (mnh *mdatagenNopHost) GetFactory(_ component.Kind, _ component.Type) component.Factory { + return nil +} diff --git a/extension/tailsampling/examplesampler/generated_package_test.go b/extension/tailsampling/examplesampler/generated_package_test.go new file mode 100644 index 0000000000000..8f9f886073c75 --- /dev/null +++ b/extension/tailsampling/examplesampler/generated_package_test.go @@ -0,0 +1,13 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package examplesampler + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/extension/tailsampling/examplesampler/go.mod b/extension/tailsampling/examplesampler/go.mod new file mode 100644 index 0000000000000..e5c985b53d18e --- /dev/null +++ b/extension/tailsampling/examplesampler/go.mod @@ -0,0 +1,60 @@ +module github.com/open-telemetry/opentelemetry-collector-contrib/extension/tailsampling/examplesampler + +go 1.24.0 + +require ( + github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.138.0 + github.com/stretchr/testify v1.11.1 + go.opentelemetry.io/collector/component v1.44.1-0.20251030084003-6f29b34c24f6 + go.opentelemetry.io/collector/component/componenttest v0.138.1-0.20251030084003-6f29b34c24f6 + go.opentelemetry.io/collector/confmap v1.44.1-0.20251030084003-6f29b34c24f6 + go.opentelemetry.io/collector/extension v1.44.1-0.20251030084003-6f29b34c24f6 + go.opentelemetry.io/collector/extension/extensiontest v0.138.1-0.20251030084003-6f29b34c24f6 + go.opentelemetry.io/collector/pdata v1.44.1-0.20251030084003-6f29b34c24f6 + go.opentelemetry.io/otel v1.38.0 + go.opentelemetry.io/otel/metric v1.38.0 + go.opentelemetry.io/otel/sdk/metric v1.38.0 + go.opentelemetry.io/otel/trace v1.38.0 + go.uber.org/goleak v1.3.0 + go.uber.org/zap v1.27.0 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gobwas/glob v0.2.3 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/knadh/koanf/maps v0.1.2 // indirect + github.com/knadh/koanf/providers/confmap v1.0.0 // indirect + github.com/knadh/koanf/v2 v2.3.0 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/featuregate v1.44.1-0.20251030084003-6f29b34c24f6 // indirect + go.opentelemetry.io/otel/sdk v1.38.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/sys v0.36.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor => ../../../processor/tailsamplingprocessor + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl => ../../../pkg/ottl + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../../pkg/pdatautil + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../../pkg/pdatatest + +replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../../pkg/golden + +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter => ../../../internal/filter + +replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => ../../../internal/coreinternal diff --git a/extension/tailsampling/examplesampler/go.sum b/extension/tailsampling/examplesampler/go.sum new file mode 100644 index 0000000000000..83049790d5688 --- /dev/null +++ b/extension/tailsampling/examplesampler/go.sum @@ -0,0 +1,98 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/knadh/koanf/maps v0.1.2 h1:RBfmAW5CnZT+PJ1CVc1QSJKf4Xu9kxfQgYVQSu8hpbo= +github.com/knadh/koanf/maps v0.1.2/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v1.0.0 h1:mHKLJTE7iXEys6deO5p6olAiZdG5zwp8Aebir+/EaRE= +github.com/knadh/koanf/providers/confmap v1.0.0/go.mod h1:txHYHiI2hAtF0/0sCmcuol4IDcuQbKTybiB1nOcUo1A= +github.com/knadh/koanf/v2 v2.3.0 h1:Qg076dDRFHvqnKG97ZEsi9TAg2/nFTa9hCdcSa1lvlM= +github.com/knadh/koanf/v2 v2.3.0/go.mod h1:gRb40VRAbd4iJMYYD5IxZ6hfuopFcXBpc9bbQpZwo28= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.44.1-0.20251030084003-6f29b34c24f6 h1:shhswtFQA3+H8oX+h//a6qVmnsOM/KbTFs7yQHh99t8= +go.opentelemetry.io/collector/component v1.44.1-0.20251030084003-6f29b34c24f6/go.mod h1:d1QiCqALvrBpt8ujJmSQiwiLFmo1UPTJXPXpVOSXmYY= +go.opentelemetry.io/collector/component/componenttest v0.138.1-0.20251030084003-6f29b34c24f6 h1:I16ajgLDgRJlqME2JN30gJ1Am6XnMbb9xl6eNP023Kw= +go.opentelemetry.io/collector/component/componenttest v0.138.1-0.20251030084003-6f29b34c24f6/go.mod h1:eSlTDfT9WUAdbjnXORjLCxtKgZl+Mm+dkJkez8PnoM0= +go.opentelemetry.io/collector/confmap v1.44.1-0.20251030084003-6f29b34c24f6 h1:wMI0jWqRRaPjAcdGDoL/vj+3pDrtQD/lQQbzlTqx0SA= +go.opentelemetry.io/collector/confmap v1.44.1-0.20251030084003-6f29b34c24f6/go.mod h1:w37Xiu/PK3nTdqKb7YEvQECHYkuW7QnmdS7b9iRjOGo= +go.opentelemetry.io/collector/extension v1.44.1-0.20251030084003-6f29b34c24f6 h1:ZMo+xU1K3IVqFhWYOwBmZaUXjnPn1Q8l3ns1OHZUU1Y= +go.opentelemetry.io/collector/extension v1.44.1-0.20251030084003-6f29b34c24f6/go.mod h1:yTvVuyoV7yn2zPmX3Hu4sRGyE79JctLq6hQKpvUfZqQ= +go.opentelemetry.io/collector/extension/extensiontest v0.138.1-0.20251030084003-6f29b34c24f6 h1:ZpVoAZ5rxYx8LdY6Uu39gqumkdFNWSweekRnwgw07Mw= +go.opentelemetry.io/collector/extension/extensiontest v0.138.1-0.20251030084003-6f29b34c24f6/go.mod h1:zzGCEaLIx9bM5SwnJECiJNSj8aKiOpjB0c/uGx1ujdk= +go.opentelemetry.io/collector/featuregate v1.44.1-0.20251030084003-6f29b34c24f6 h1:PquY2VVw+nESa+kzRusQw8on6rmW8d58jkvok/iZM7Y= +go.opentelemetry.io/collector/featuregate v1.44.1-0.20251030084003-6f29b34c24f6/go.mod h1:d0tiRzVYrytB6LkcYgz2ESFTv7OktRPQe0QEQcPt1L4= +go.opentelemetry.io/collector/pdata v1.44.1-0.20251030084003-6f29b34c24f6 h1:CkmiHo2TwahfzfeHDuGKpgeEl8T3bVdyAL/SbDbSWtI= +go.opentelemetry.io/collector/pdata v1.44.1-0.20251030084003-6f29b34c24f6/go.mod h1:G5sVVayntQUG21WgC4mBj1bizHzYPaa7ZQG6bEYScmg= +go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= +go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= +go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= +go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= +go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= +go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= +go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= +go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= +go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= +go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= +go.opentelemetry.io/proto/slim/otlp v1.8.0 h1:afcLwp2XOeCbGrjufT1qWyruFt+6C9g5SOuymrSPUXQ= +go.opentelemetry.io/proto/slim/otlp v1.8.0/go.mod h1:Yaa5fjYm1SMCq0hG0x/87wV1MP9H5xDuG/1+AhvBcsI= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.1.0 h1:Uc+elixz922LHx5colXGi1ORbsW8DTIGM+gg+D9V7HE= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.1.0/go.mod h1:VyU6dTWBWv6h9w/+DYgSZAPMabWbPTFTuxp25sM8+s0= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.1.0 h1:i8YpvWGm/Uq1koL//bnbJ/26eV3OrKWm09+rDYo7keU= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.1.0/go.mod h1:pQ70xHY/ZVxNUBPn+qUWPl8nwai87eWdqL3M37lNi9A= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= +golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/extension/tailsampling/examplesampler/internal/metadata/generated_status.go b/extension/tailsampling/examplesampler/internal/metadata/generated_status.go new file mode 100644 index 0000000000000..9c83d07006dcf --- /dev/null +++ b/extension/tailsampling/examplesampler/internal/metadata/generated_status.go @@ -0,0 +1,16 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "go.opentelemetry.io/collector/component" +) + +var ( + Type = component.MustNewType("examplesampler") + ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/extension/tailsampling/examplesampler" +) + +const ( + ExtensionStability = component.StabilityLevelDevelopment +) diff --git a/extension/tailsampling/examplesampler/internal/metadata/generated_telemetry.go b/extension/tailsampling/examplesampler/internal/metadata/generated_telemetry.go new file mode 100644 index 0000000000000..f489e0795abe2 --- /dev/null +++ b/extension/tailsampling/examplesampler/internal/metadata/generated_telemetry.go @@ -0,0 +1,68 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "errors" + "sync" + + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/trace" + + "go.opentelemetry.io/collector/component" +) + +func Meter(settings component.TelemetrySettings) metric.Meter { + return settings.MeterProvider.Meter("github.com/open-telemetry/opentelemetry-collector-contrib/extension/tailsampling/examplesampler") +} + +func Tracer(settings component.TelemetrySettings) trace.Tracer { + return settings.TracerProvider.Tracer("github.com/open-telemetry/opentelemetry-collector-contrib/extension/tailsampling/examplesampler") +} + +// TelemetryBuilder provides an interface for components to report telemetry +// as defined in metadata and user config. +type TelemetryBuilder struct { + meter metric.Meter + mu sync.Mutex + registrations []metric.Registration + ExtensionTailSamplingEvaluationsCount metric.Int64Counter +} + +// TelemetryBuilderOption applies changes to default builder. +type TelemetryBuilderOption interface { + apply(*TelemetryBuilder) +} + +type telemetryBuilderOptionFunc func(mb *TelemetryBuilder) + +func (tbof telemetryBuilderOptionFunc) apply(mb *TelemetryBuilder) { + tbof(mb) +} + +// Shutdown unregister all registered callbacks for async instruments. +func (builder *TelemetryBuilder) Shutdown() { + builder.mu.Lock() + defer builder.mu.Unlock() + for _, reg := range builder.registrations { + reg.Unregister() + } +} + +// NewTelemetryBuilder provides a struct with methods to update all internal telemetry +// for a component +func NewTelemetryBuilder(settings component.TelemetrySettings, options ...TelemetryBuilderOption) (*TelemetryBuilder, error) { + builder := TelemetryBuilder{} + for _, op := range options { + op.apply(&builder) + } + builder.meter = Meter(settings) + var err, errs error + builder.ExtensionTailSamplingEvaluationsCount, err = builder.meter.Int64Counter( + "otelcol_extension_tail_sampling_evaluations_count", + metric.WithDescription("How many traces have been evaluated [Development]"), + metric.WithUnit("{traces}"), + ) + errs = errors.Join(errs, err) + return &builder, errs +} diff --git a/extension/tailsampling/examplesampler/internal/metadata/generated_telemetry_test.go b/extension/tailsampling/examplesampler/internal/metadata/generated_telemetry_test.go new file mode 100644 index 0000000000000..a68f05495d2ae --- /dev/null +++ b/extension/tailsampling/examplesampler/internal/metadata/generated_telemetry_test.go @@ -0,0 +1,74 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel/metric" + embeddedmetric "go.opentelemetry.io/otel/metric/embedded" + noopmetric "go.opentelemetry.io/otel/metric/noop" + "go.opentelemetry.io/otel/trace" + embeddedtrace "go.opentelemetry.io/otel/trace/embedded" + nooptrace "go.opentelemetry.io/otel/trace/noop" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" +) + +type mockMeter struct { + noopmetric.Meter + name string +} +type mockMeterProvider struct { + embeddedmetric.MeterProvider +} + +func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { + return mockMeter{name: name} +} + +type mockTracer struct { + nooptrace.Tracer + name string +} + +type mockTracerProvider struct { + embeddedtrace.TracerProvider +} + +func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { + return mockTracer{name: name} +} + +func TestProviders(t *testing.T) { + set := component.TelemetrySettings{ + MeterProvider: mockMeterProvider{}, + TracerProvider: mockTracerProvider{}, + } + + meter := Meter(set) + if m, ok := meter.(mockMeter); ok { + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/extension/tailsampling/examplesampler", m.name) + } else { + require.Fail(t, "returned Meter not mockMeter") + } + + tracer := Tracer(set) + if m, ok := tracer.(mockTracer); ok { + require.Equal(t, "github.com/open-telemetry/opentelemetry-collector-contrib/extension/tailsampling/examplesampler", m.name) + } else { + require.Fail(t, "returned Meter not mockTracer") + } +} + +func TestNewTelemetryBuilder(t *testing.T) { + set := componenttest.NewNopTelemetrySettings() + applied := false + _, err := NewTelemetryBuilder(set, telemetryBuilderOptionFunc(func(b *TelemetryBuilder) { + applied = true + })) + require.NoError(t, err) + require.True(t, applied) +} diff --git a/extension/tailsampling/examplesampler/internal/metadatatest/generated_telemetrytest.go b/extension/tailsampling/examplesampler/internal/metadatatest/generated_telemetrytest.go new file mode 100644 index 0000000000000..5b1db531cc204 --- /dev/null +++ b/extension/tailsampling/examplesampler/internal/metadatatest/generated_telemetrytest.go @@ -0,0 +1,38 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadatatest + +import ( + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/extension" + "go.opentelemetry.io/collector/extension/extensiontest" + "go.opentelemetry.io/otel/sdk/metric/metricdata" + "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest" +) + +func NewSettings(tt *componenttest.Telemetry) extension.Settings { + set := extensiontest.NewNopSettings(extensiontest.NopType) + set.ID = component.NewID(component.MustNewType("examplesampler")) + set.TelemetrySettings = tt.NewTelemetrySettings() + return set +} + +func AssertEqualExtensionTailSamplingEvaluationsCount(t *testing.T, tt *componenttest.Telemetry, dps []metricdata.DataPoint[int64], opts ...metricdatatest.Option) { + want := metricdata.Metrics{ + Name: "otelcol_extension_tail_sampling_evaluations_count", + Description: "How many traces have been evaluated [Development]", + Unit: "{traces}", + Data: metricdata.Sum[int64]{ + Temporality: metricdata.CumulativeTemporality, + IsMonotonic: true, + DataPoints: dps, + }, + } + got, err := tt.GetMetric("otelcol_extension_tail_sampling_evaluations_count") + require.NoError(t, err) + metricdatatest.AssertEqual(t, want, got, opts...) +} diff --git a/extension/tailsampling/examplesampler/internal/metadatatest/generated_telemetrytest_test.go b/extension/tailsampling/examplesampler/internal/metadatatest/generated_telemetrytest_test.go new file mode 100644 index 0000000000000..fd4bf8058032c --- /dev/null +++ b/extension/tailsampling/examplesampler/internal/metadatatest/generated_telemetrytest_test.go @@ -0,0 +1,29 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadatatest + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel/sdk/metric/metricdata" + "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest" + + "go.opentelemetry.io/collector/component/componenttest" + + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/tailsampling/examplesampler/internal/metadata" +) + +func TestSetupTelemetry(t *testing.T) { + testTel := componenttest.NewTelemetry() + tb, err := metadata.NewTelemetryBuilder(testTel.NewTelemetrySettings()) + require.NoError(t, err) + defer tb.Shutdown() + tb.ExtensionTailSamplingEvaluationsCount.Add(context.Background(), 1) + AssertEqualExtensionTailSamplingEvaluationsCount(t, testTel, + []metricdata.DataPoint[int64]{{Value: 1}}, + metricdatatest.IgnoreTimestamp()) + + require.NoError(t, testTel.Shutdown(context.Background())) +} diff --git a/extension/tailsampling/examplesampler/metadata.yaml b/extension/tailsampling/examplesampler/metadata.yaml new file mode 100644 index 0000000000000..452636586a124 --- /dev/null +++ b/extension/tailsampling/examplesampler/metadata.yaml @@ -0,0 +1,27 @@ +type: examplesampler + +status: + class: extension + stability: + development: [extension] + distributions: [] + codeowners: + active: [portertech, Logiraptor] + +attributes: + policy: + description: Name of the policy + type: string + +telemetry: + metrics: + extension_tail_sampling_evaluations_count: + description: How many traces have been evaluated + unit: "{traces}" + enabled: true + sum: + value_type: int + monotonic: true + attributes: [policy] + stability: + level: development diff --git a/internal/tidylist/tidylist.txt b/internal/tidylist/tidylist.txt index 9faf916c6e426..59e8ed9cc6056 100644 --- a/internal/tidylist/tidylist.txt +++ b/internal/tidylist/tidylist.txt @@ -184,6 +184,7 @@ extension/sigv4authextension extension/solarwindsapmsettingsextension extension/storage/dbstorage extension/storage/redisstorageextension +extension/tailsampling/examplesampler . internal/aws/containerinsight internal/aws/k8s diff --git a/versions.yaml b/versions.yaml index e0a32bb67f4ea..08197fbb334e0 100644 --- a/versions.yaml +++ b/versions.yaml @@ -124,6 +124,7 @@ module-sets: - github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage - github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/redisstorageextension - github.com/open-telemetry/opentelemetry-collector-contrib/extension/sumologicextension + - github.com/open-telemetry/opentelemetry-collector-contrib/extension/tailsampling/examplesampler - github.com/open-telemetry/opentelemetry-collector-contrib/extension/k8sleaderelector - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/containerinsight