diff --git a/config/configelasticsearch/config_test.go b/config/configelasticsearch/config_test.go new file mode 100644 index 0000000..511165e --- /dev/null +++ b/config/configelasticsearch/config_test.go @@ -0,0 +1,211 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package configelasticsearch + +import ( + "context" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configcompression" + "go.opentelemetry.io/collector/confmap/confmaptest" +) + +func TestConfig(t *testing.T) { + t.Parallel() + + tests := []struct { + configFile string + id string + expected component.Config + }{ + { + id: "multiple_endpoints", + configFile: "config.yaml", + expected: withDefaultConfig(func(cfg *ClientConfig) { + cfg.Endpoints = []string{ + "http://localhost:9200", + "http://localhost:8080", + } + }), + }, + { + id: "with_cloudid", + configFile: "config.yaml", + expected: withDefaultConfig(func(cfg *ClientConfig) { + cfg.CloudID = "foo:YmFyLmNsb3VkLmVzLmlvJGFiYzEyMyRkZWY0NTY=" + }), + }, + { + id: "confighttp_endpoint", + configFile: "config.yaml", + expected: withDefaultConfig(func(cfg *ClientConfig) { + cfg.Endpoint = "https://elastic.example.com:9200" + }), + }, + { + id: "compression_none", + configFile: "config.yaml", + expected: withDefaultConfig(func(cfg *ClientConfig) { + cfg.Endpoint = "https://elastic.example.com:9200" + + cfg.Compression = "none" + }), + }, + { + id: "compression_gzip", + configFile: "config.yaml", + expected: withDefaultConfig(func(cfg *ClientConfig) { + cfg.Endpoint = "https://elastic.example.com:9200" + + cfg.Compression = "gzip" + }), + }, + } + + for _, tt := range tests { + t.Run(tt.id, func(t *testing.T) { + cfg := NewDefaultClientConfig() + + cm, err := confmaptest.LoadConf(filepath.Join("testdata", tt.configFile)) + require.NoError(t, err) + + sub, err := cm.Sub(tt.id) + require.NoError(t, err) + require.NoError(t, sub.Unmarshal(&cfg)) + + assert.NoError(t, component.ValidateConfig(cfg)) + assert.Equal(t, tt.expected, &cfg) + + _, err = cfg.ToClient(context.Background(), componenttest.NewNopHost(), componenttest.NewNopTelemetrySettings()) + require.NoError(t, err) + }) + } +} + +// TestConfig_Validate tests the error cases of Config.Validate. +// +// Successful validation should be covered by TestConfig above. +func TestConfig_Validate(t *testing.T) { + tests := map[string]struct { + config *ClientConfig + err string + }{ + "no endpoints": { + config: withDefaultConfig(), + err: "exactly one of [endpoint, endpoints, cloudid] must be specified", + }, + "empty endpoint": { + config: withDefaultConfig(func(cfg *ClientConfig) { + cfg.Endpoints = []string{""} + }), + err: `invalid endpoint "": endpoint must not be empty`, + }, + "invalid endpoint": { + config: withDefaultConfig(func(cfg *ClientConfig) { + cfg.Endpoints = []string{"*:!"} + }), + err: `invalid endpoint "*:!": parse "*:!": first path segment in URL cannot contain colon`, + }, + "invalid cloudid": { + config: withDefaultConfig(func(cfg *ClientConfig) { + cfg.CloudID = "invalid" + }), + err: `invalid CloudID "invalid"`, + }, + "invalid base64 cloudid": { + config: withDefaultConfig(func(cfg *ClientConfig) { + cfg.CloudID = "foo:_invalid_base64_characters" + }), + err: `illegal base64 data at input byte 0`, + }, + "invalid decoded cloudid": { + config: withDefaultConfig(func(cfg *ClientConfig) { + cfg.CloudID = "foo:YWJj" + }), + err: `invalid decoded CloudID "abc"`, + }, + "endpoints and cloudid both set": { + config: withDefaultConfig(func(cfg *ClientConfig) { + cfg.Endpoints = []string{"http://test:9200"} + cfg.CloudID = "foo:YmFyLmNsb3VkLmVzLmlvJGFiYzEyMyRkZWY0NTY=" + }), + err: "exactly one of [endpoint, endpoints, cloudid] must be specified", + }, + "endpoint and endpoints both set": { + config: withDefaultConfig(func(cfg *ClientConfig) { + cfg.Endpoint = "http://test:9200" + cfg.Endpoints = []string{"http://test:9200"} + }), + err: "exactly one of [endpoint, endpoints, cloudid] must be specified", + }, + "invalid scheme": { + config: withDefaultConfig(func(cfg *ClientConfig) { + cfg.Endpoints = []string{"without_scheme"} + }), + err: `invalid endpoint "without_scheme": invalid scheme "", expected "http" or "https"`, + }, + "compression unsupported": { + config: withDefaultConfig(func(cfg *ClientConfig) { + cfg.Endpoints = []string{"http://test:9200"} + cfg.Compression = configcompression.TypeSnappy + }), + err: `compression must be one of [none, gzip]`, + }, + "invalid max_requests specified": { + config: withDefaultConfig(func(cfg *ClientConfig) { + cfg.Endpoints = []string{"http://test:9200"} + cfg.Retry.MaxRetries = -1 + }), + err: `retry::max_requests should be non-negative`, + }, + } + + for name, tt := range tests { + t.Run(name, func(t *testing.T) { + assert.EqualError(t, component.ValidateConfig(tt.config), tt.err) + }) + } +} + +func TestConfig_Validate_Environment(t *testing.T) { + t.Run("valid", func(t *testing.T) { + t.Setenv("ELASTICSEARCH_URL", "http://test:9200") + config := withDefaultConfig() + err := component.ValidateConfig(config) + require.NoError(t, err) + }) + t.Run("invalid", func(t *testing.T) { + t.Setenv("ELASTICSEARCH_URL", "http://valid:9200, *:!") + config := withDefaultConfig() + err := component.ValidateConfig(config) + assert.EqualError(t, err, `invalid endpoint "*:!": parse "*:!": first path segment in URL cannot contain colon`) + }) +} + +func withDefaultConfig(fns ...func(*ClientConfig)) *ClientConfig { + cfg := NewDefaultClientConfig() + for _, fn := range fns { + fn(&cfg) + } + return &cfg +} diff --git a/config/configelasticsearch/configclient.go b/config/configelasticsearch/configclient.go new file mode 100644 index 0000000..1ce0369 --- /dev/null +++ b/config/configelasticsearch/configclient.go @@ -0,0 +1,221 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package configelasticsearch + +import ( + "encoding/base64" + "errors" + "fmt" + "net/http" + "net/url" + "os" + "strings" + "time" + + "go.opentelemetry.io/collector/config/configcompression" + "go.opentelemetry.io/collector/config/confighttp" +) + +const defaultElasticsearchEnvName = "ELASTICSEARCH_URL" + +var ( + errConfigEndpointRequired = errors.New("exactly one of [endpoint, endpoints, cloudid] must be specified") + errConfigEmptyEndpoint = errors.New("endpoint must not be empty") +) + +// NewDefaultClientConfig returns ClientConfig type object with +// the default values of 'MaxIdleConns' and 'IdleConnTimeout', as well as [http.DefaultTransport] values. +// Other config options are not added as they are initialized with 'zero value' by GoLang as default. +// We encourage to use this function to create an object of ClientConfig. +func NewDefaultClientConfig() ClientConfig { + // The default values are taken from the values of 'DefaultTransport' of 'http' package. + defaultHTTPClientConfig := confighttp.NewDefaultClientConfig() + defaultHTTPClientConfig.Timeout = 90 * time.Second + defaultHTTPClientConfig.Compression = configcompression.TypeGzip + + return ClientConfig{ + ClientConfig: defaultHTTPClientConfig, + TelemetrySettings: TelemetrySettings{ + LogRequestBody: false, + LogResponseBody: false, + }, + Retry: RetrySettings{ + Enabled: true, + MaxRetries: 0, // default is set in exporter code + InitialInterval: 100 * time.Millisecond, + MaxInterval: 1 * time.Minute, + RetryOnStatus: []int{ + http.StatusTooManyRequests, + }, + }, + } +} + +type ClientConfig struct { + confighttp.ClientConfig `mapstructure:",squash"` + + // CloudID holds the cloud ID to identify the Elastic Cloud cluster to send events to. + // https://www.elastic.co/guide/en/cloud/current/ec-cloud-id.html + // + // This setting is required if no URL is configured. + CloudID string `mapstructure:"cloudid"` + // ELASTICSEARCH_URL environment variable is not set. + Endpoints []string `mapstructure:"endpoints"` + + Retry RetrySettings `mapstructure:"retry"` + + Discovery DiscoverySettings `mapstructure:"discover"` + + // TelemetrySettings contains settings useful for testing/debugging purposes + // This is experimental and may change at any time. + TelemetrySettings `mapstructure:"telemetry"` +} + +type TelemetrySettings struct { + LogRequestBody bool `mapstructure:"log_request_body"` + LogResponseBody bool `mapstructure:"log_response_body"` +} + +// RetrySettings defines settings for the HTTP request retries in the Elasticsearch exporter. +// Failed sends are retried with exponential backoff. +type RetrySettings struct { + // RetryOnStatus configures the status codes that trigger request or document level retries. + RetryOnStatus []int `mapstructure:"retry_on_status"` + // MaxRetries configures how many times an HTTP request is retried. + MaxRetries int `mapstructure:"max_retries"` + // InitialInterval configures the initial waiting time if a request failed. + InitialInterval time.Duration `mapstructure:"initial_interval"` + // MaxInterval configures the max waiting time if consecutive requests failed. + MaxInterval time.Duration `mapstructure:"max_interval"` + // Enabled allows users to disable retry without having to comment out all settings. + Enabled bool `mapstructure:"enabled"` +} + +// DiscoverySettings defines Elasticsearch node discovery related settings. +// The exporter will check Elasticsearch regularly for available nodes +// and updates the list of hosts if discovery is enabled. Newly discovered +// nodes will automatically be used for load balancing. +// +// DiscoverySettings should not be enabled when operating Elasticsearch behind a proxy +// or load balancer. +// +// https://www.elastic.co/blog/elasticsearch-sniffing-best-practices-what-when-why-how +type DiscoverySettings struct { + // OnStart, if set, instructs the exporter to look for available Elasticsearch + // nodes the first time the exporter connects to the cluster. + OnStart bool `mapstructure:"on_start"` + + // Interval instructs the exporter to renew the list of Elasticsearch URLs + // with the given interval. URLs will not be updated if Interval is <=0. + Interval time.Duration `mapstructure:"interval"` +} + +// Validate checks the receiver configuration is valid. +func (cfg *ClientConfig) Validate() error { + endpoints, err := cfg.endpoints() + if err != nil { + return err + } + for _, endpoint := range endpoints { + if err := validateEndpoint(endpoint); err != nil { + return fmt.Errorf("invalid endpoint %q: %w", endpoint, err) + } + } + + if cfg.Compression != "none" && cfg.Compression != configcompression.TypeGzip { + return errors.New("compression must be one of [none, gzip]") + } + + if cfg.Retry.MaxRetries < 0 { + return errors.New("retry::max_requests should be non-negative") + } + return cfg.ClientConfig.Validate() +} + +func validateEndpoint(endpoint string) error { + if endpoint == "" { + return errConfigEmptyEndpoint + } + + u, err := url.Parse(endpoint) + if err != nil { + return err + } + switch u.Scheme { + case "http", "https": + default: + return fmt.Errorf(`invalid scheme %q, expected "http" or "https"`, u.Scheme) + } + return nil +} + +func (cfg *ClientConfig) endpoints() ([]string, error) { + // Exactly one of endpoint, endpoints, or cloudid must be configured. + // If none are set, then $ELASTICSEARCH_URL may be specified instead. + var endpoints []string + var numEndpointConfigs int + + if cfg.Endpoint != "" { + numEndpointConfigs++ + endpoints = []string{cfg.Endpoint} + } + if len(cfg.Endpoints) > 0 { + numEndpointConfigs++ + endpoints = cfg.Endpoints + } + if cfg.CloudID != "" { + numEndpointConfigs++ + u, err := parseCloudID(cfg.CloudID) + if err != nil { + return nil, err + } + endpoints = []string{u.String()} + } + if numEndpointConfigs == 0 { + if v := os.Getenv(defaultElasticsearchEnvName); v != "" { + numEndpointConfigs++ + endpoints = strings.Split(v, ",") + for i, endpoint := range endpoints { + endpoints[i] = strings.TrimSpace(endpoint) + } + } + } + if numEndpointConfigs != 1 { + return nil, errConfigEndpointRequired + } + return endpoints, nil +} + +// Based on "addrFromCloudID" in go-elasticsearch. +func parseCloudID(input string) (*url.URL, error) { + _, after, ok := strings.Cut(input, ":") + if !ok { + return nil, fmt.Errorf("invalid CloudID %q", input) + } + + decoded, err := base64.StdEncoding.DecodeString(after) + if err != nil { + return nil, err + } + + before, after, ok := strings.Cut(string(decoded), "$") + if !ok { + return nil, fmt.Errorf("invalid decoded CloudID %q", string(decoded)) + } + return url.Parse(fmt.Sprintf("https://%s.%s", after, before)) +} diff --git a/config/configelasticsearch/esclient.go b/config/configelasticsearch/esclient.go new file mode 100644 index 0000000..8b63198 --- /dev/null +++ b/config/configelasticsearch/esclient.go @@ -0,0 +1,188 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package configelasticsearch + +import ( + "compress/gzip" + "context" + "io" + "net/http" + "time" + + "github.com/cenkalti/backoff/v4" + "github.com/elastic/elastic-transport-go/v8/elastictransport" + "github.com/elastic/go-elasticsearch/v8" + "go.opentelemetry.io/collector/component" + + traceSdk "go.opentelemetry.io/otel/sdk/trace" + "go.uber.org/zap" +) + +const defaultMaxRetries = 2 + +// clientLogger implements the estransport.Logger interface +// that is required by the Elasticsearch client for logging. +type clientLogger struct { + *zap.Logger + logRequestBody bool + logResponseBody bool +} + +// LogRoundTrip should not modify the request or response, except for consuming and closing the body. +// Implementations have to check for nil values in request and response. +func (cl *clientLogger) LogRoundTrip(requ *http.Request, resp *http.Response, clientErr error, _ time.Time, dur time.Duration) error { + zl := cl.Logger + + var fields []zap.Field + if cl.logRequestBody && requ != nil && requ.Body != nil { + body := requ.Body + if requ.Header.Get("Content-Encoding") == "gzip" { + if r, err := gzip.NewReader(body); err == nil { + defer r.Close() + body = r + } + } + if b, err := io.ReadAll(body); err == nil { + fields = append(fields, zap.ByteString("request_body", b)) + } + } + if cl.logResponseBody && resp != nil && resp.Body != nil { + if b, err := io.ReadAll(resp.Body); err == nil { + fields = append(fields, zap.ByteString("response_body", b)) + } + } + + switch { + case clientErr == nil && resp != nil: + fields = append( + fields, + zap.String("path", requ.URL.Path), + zap.String("method", requ.Method), + zap.Duration("duration", dur), + zap.String("status", resp.Status), + ) + zl.Debug("Request roundtrip completed.", fields...) + + case clientErr != nil: + fields = append( + fields, + zap.NamedError("reason", clientErr), + ) + zl.Debug("Request failed.", fields...) + } + + return nil +} + +// RequestBodyEnabled makes the client pass a copy of request body to the logger. +func (cl *clientLogger) RequestBodyEnabled() bool { + return cl.logRequestBody +} + +// ResponseBodyEnabled makes the client pass a copy of response body to the logger. +func (cl *clientLogger) ResponseBodyEnabled() bool { + return cl.logResponseBody +} + +// user_agent should be added with the confighttp client +func (cfg *ClientConfig) ToClient( + ctx context.Context, + host component.Host, + telemetry component.TelemetrySettings, +) (*elasticsearch.Client, error) { + httpClient, err := cfg.ClientConfig.ToClient(ctx, host, telemetry) + if err != nil { + return nil, err + } + + // endpoints converts Config.Endpoints, Config.CloudID, + // and Config.ClientConfig.Endpoint to a list of addresses. + endpoints, err := cfg.endpoints() + if err != nil { + return nil, err + } + + esLogger := clientLogger{ + Logger: telemetry.Logger, + logRequestBody: cfg.TelemetrySettings.LogRequestBody, + logResponseBody: cfg.TelemetrySettings.LogResponseBody, + } + + maxRetries := defaultMaxRetries + if cfg.Retry.MaxRetries != 0 { + maxRetries = cfg.Retry.MaxRetries + } + + return elasticsearch.NewClient(elasticsearch.Config{ + Transport: httpClient.Transport, + + // configure connection setup + Addresses: endpoints, + + // configure retry behavior + RetryOnStatus: cfg.Retry.RetryOnStatus, + DisableRetry: !cfg.Retry.Enabled, + // RetryOnError: retryOnError, // should be used from esclient version 8 onwards + MaxRetries: maxRetries, + RetryBackoff: createElasticsearchBackoffFunc(&cfg.Retry), + + // configure sniffing + DiscoverNodesOnStart: cfg.Discovery.OnStart, + DiscoverNodesInterval: cfg.Discovery.Interval, + + // configure internal metrics reporting and logging + EnableMetrics: false, // TODO + EnableDebugLogger: false, // TODO + Logger: &esLogger, + + Instrumentation: func() elastictransport.Instrumentation { + // only set tracing if enabled and not the noop tracer + // The actual implementation of the no-op tracer (tracer.noopNoContextTracer) + // is not exported by the OpenTelemetry collector, so we cannot directly check for it. + // Instead, we assert if the default Go SDK Tracer provider is used: https://github.com/open-telemetry/opentelemetry-collector/blob/v0.118.0/service/telemetry/tracer.go#L66 + // TODO: use tracer.Enabled() once available in the Go SDK:https: //github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#enabled + if _, ok := telemetry.TracerProvider.(*traceSdk.TracerProvider); ok { + return elasticsearch.NewOpenTelemetryInstrumentation(telemetry.TracerProvider, false) + } + return nil + }(), + }) +} + +func createElasticsearchBackoffFunc(config *RetrySettings) func(int) time.Duration { + if !config.Enabled { + return nil + } + + expBackoff := backoff.NewExponentialBackOff() + if config.InitialInterval > 0 { + expBackoff.InitialInterval = config.InitialInterval + } + if config.MaxInterval > 0 { + expBackoff.MaxInterval = config.MaxInterval + } + expBackoff.Reset() + + return func(attempts int) time.Duration { + if attempts == 1 { + expBackoff.Reset() + } + + return expBackoff.NextBackOff() + } +} diff --git a/config/configelasticsearch/testdata/config.yaml b/config/configelasticsearch/testdata/config.yaml new file mode 100644 index 0000000..f5b8cb4 --- /dev/null +++ b/config/configelasticsearch/testdata/config.yaml @@ -0,0 +1,14 @@ +multiple_endpoints: + endpoints: + - http://localhost:9200 + - http://localhost:8080 +with_cloudid: + cloudid: foo:YmFyLmNsb3VkLmVzLmlvJGFiYzEyMyRkZWY0NTY= +confighttp_endpoint: + endpoint: https://elastic.example.com:9200 +compression_none: + endpoint: https://elastic.example.com:9200 + compression: none +compression_gzip: + endpoint: https://elastic.example.com:9200 + compression: gzip diff --git a/go.mod b/go.mod index cd7e117..34dd56e 100644 --- a/go.mod +++ b/go.mod @@ -3,13 +3,21 @@ module github.com/elastic/opentelemetry-lib go 1.22.7 require ( + github.com/cenkalti/backoff/v4 v4.3.0 + github.com/elastic/elastic-transport-go/v8 v8.6.0 github.com/elastic/go-elasticsearch/v8 v8.17.0 github.com/google/go-cmp v0.6.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.117.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.117.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.118.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.118.0 github.com/stretchr/testify v1.10.0 - go.opentelemetry.io/collector/pdata v1.23.0 - go.opentelemetry.io/collector/semconv v0.117.0 + go.opentelemetry.io/collector/component v0.118.0 + go.opentelemetry.io/collector/component/componenttest v0.118.0 + go.opentelemetry.io/collector/config/configcompression v1.24.0 + go.opentelemetry.io/collector/config/confighttp v0.118.0 + go.opentelemetry.io/collector/confmap v1.24.0 + go.opentelemetry.io/collector/pdata v1.24.0 + go.opentelemetry.io/collector/semconv v0.118.0 + go.opentelemetry.io/otel/sdk v1.32.0 go.opentelemetry.io/proto/otlp v1.5.0 go.uber.org/zap v1.27.0 google.golang.org/grpc v1.69.4 @@ -18,23 +26,44 @@ require ( require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/elastic/elastic-transport-go/v8 v8.6.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/knadh/koanf/maps v0.1.1 // indirect + github.com/knadh/koanf/providers/confmap v0.1.0 // indirect + github.com/knadh/koanf/v2 v2.1.2 // 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.2 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.117.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.118.0 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - go.opentelemetry.io/otel v1.31.0 // indirect - go.opentelemetry.io/otel/metric v1.31.0 // indirect - go.opentelemetry.io/otel/trace v1.31.0 // indirect + github.com/rs/cors v1.11.1 // indirect + go.opentelemetry.io/collector/client v1.24.0 // indirect + go.opentelemetry.io/collector/config/configauth v0.118.0 // indirect + go.opentelemetry.io/collector/config/configopaque v1.24.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.118.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.24.0 // indirect + go.opentelemetry.io/collector/extension v0.118.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.118.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.33.0 // indirect + golang.org/x/net v0.34.0 // indirect golang.org/x/sys v0.29.0 // indirect golang.org/x/text v0.21.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d // indirect - google.golang.org/protobuf v1.36.2 // indirect + google.golang.org/protobuf v1.36.3 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 42281c5..ddda273 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -7,15 +9,23 @@ github.com/elastic/elastic-transport-go/v8 v8.6.0 h1:Y2S/FBjx1LlCv5m6pWAF2kDJAHo github.com/elastic/elastic-transport-go/v8 v8.6.0/go.mod h1:YLHer5cj0csTzNFXoNQ8qhtGY1GTvSqPnKWKaqQE3Hk= github.com/elastic/go-elasticsearch/v8 v8.17.0 h1:e9cWksE/Fr7urDRmGPGp47Nsp4/mvNOrU8As1l2HQQ0= github.com/elastic/go-elasticsearch/v8 v8.17.0/go.mod h1:lGMlgKIbYoRvay3xWBeKahAiJOgmFDsjZC39nmO3H64= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/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.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -25,45 +35,91 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= 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 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.117.0 h1:tOJFUIZaAU4zm5CilqZN1/AuKQa7diTrcEhgQIYly6k= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.117.0/go.mod h1:PJ2FGCS+Hw+tlHUNNWVHNo3IXtEsb9RKgl/ssSi3Z98= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.117.0 h1:/wMNk8w1UEHKpKoNk1jA2aifHgfGZE+WelGNrCf0CJ0= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.117.0/go.mod h1:ESyMNHmgZYh8Ouhr2veecTMK6sB8gQ8u2s3dsy9Og6k= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.117.0 h1:GqlhXd6J8zgxCYenbI3ew03SJnGec1vEEGzGHw9X/Y0= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.117.0/go.mod h1:OGylX+Bp+urSNNGoI1XG7U6vaRDZk1wN/w6fHP1F7IY= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.118.0 h1:Pho1MwH+cvosN6pOinGhunBwAJyyAwFnbIW5x7N/37A= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.118.0/go.mod h1:IMy3f4XjwIu+PZF9Qq5T6WZ/+mOL9l+SFjPYEQuWZh8= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.118.0 h1:DSoYrOjLv23HXpx72hl61br4ZZTj6dqtwZSGoypKWIA= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.118.0/go.mod h1:nR+r7aAbsktscJk4fGmzljblbZBMaiZcIWeKbXV+HmY= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.118.0 h1:aUTSkzJExtrlHN32g8hX/cRNEo2ZmucPg+vwPqOYvhg= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.118.0/go.mod h1:a3sewj4nEozMwcNwZTHPzddS+1BnA6BaAkO/CRIGHVU= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= 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.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= 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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/collector/pdata v1.23.0 h1:tEk0dkfB8RdSukoOMfEa8duB938gfZowdfRkrJxGDrw= -go.opentelemetry.io/collector/pdata v1.23.0/go.mod h1:I2jggpBMiO8A+7TXhzNpcJZkJtvi1cU0iVNIi+6bc+o= -go.opentelemetry.io/collector/semconv v0.117.0 h1:SavOvSbHPVD/QdAnXlI/cMca+yxCNyXStY1mQzerHs4= -go.opentelemetry.io/collector/semconv v0.117.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= -go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= -go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= -go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= -go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= -go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= -go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= -go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= -go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= -go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= -go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= +go.opentelemetry.io/collector/client v1.24.0 h1:eH7ctqDnRWNH5QVVbAvdYYdkvr8QWLkEm8FUPaaYbWE= +go.opentelemetry.io/collector/client v1.24.0/go.mod h1:C/38SYPa0tTL6ikPz/glYz6f3GVzEuT4nlEml6IBDMw= +go.opentelemetry.io/collector/component v0.118.0 h1:sSO/ObxJ+yH77Z4DmT1mlSuxhbgUmY1ztt7xCA1F/8w= +go.opentelemetry.io/collector/component v0.118.0/go.mod h1:LUJ3AL2b+tmFr3hZol3hzKzCMvNdqNq0M5CF3SWdv4M= +go.opentelemetry.io/collector/component/componenttest v0.118.0 h1:knEHckoiL2fEWSIc0iehg39zP4IXzi9sHa45O+oxKo8= +go.opentelemetry.io/collector/component/componenttest v0.118.0/go.mod h1:aHc7t7zVwCpbhrWIWY+GMuaMxMCUP8C8P7pJOt8r/vU= +go.opentelemetry.io/collector/config/configauth v0.118.0 h1:uBH/s9kRw/m7VWuibrkCzbXSCVLf9ElKq9NuKb0wAwk= +go.opentelemetry.io/collector/config/configauth v0.118.0/go.mod h1:uAmSGkihIENoIah6mEQ8S/HX4oiFOHZu3EoZLZwi9OI= +go.opentelemetry.io/collector/config/configcompression v1.24.0 h1:jyM6BX7wYcrh+eVSC0FMbWgy/zb9iP58SerOrvisccE= +go.opentelemetry.io/collector/config/configcompression v1.24.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/confighttp v0.118.0 h1:ey50dfySOCPgUPJ1x8Kq6CmNcv/TpZHt6cYmPhZItj0= +go.opentelemetry.io/collector/config/confighttp v0.118.0/go.mod h1:4frheVFiIfKUHuD/KAPn+u+d+EUx5GlQTNmoI1ftReA= +go.opentelemetry.io/collector/config/configopaque v1.24.0 h1:EPOprMDreZPKyIgT0/eVBvEGQVvq7ncvBCBVnWerj54= +go.opentelemetry.io/collector/config/configopaque v1.24.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configtelemetry v0.118.0 h1:UlN46EViG2X42odWtXgWaqY7Y01ZKpsnswSwXTWx5mM= +go.opentelemetry.io/collector/config/configtelemetry v0.118.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.24.0 h1:rOhl8qjIlUVVRHnwQj6/vZe6cuCYImyx7aVDBR35bqI= +go.opentelemetry.io/collector/config/configtls v1.24.0/go.mod h1:d0OdfkbuYEMYDBJLSbpH0wPI29lmSiFT3geqh/ygF2k= +go.opentelemetry.io/collector/confmap v1.24.0 h1:UUHVhkDCsVw14jPOarug9PDQE2vaB2ELPWMr7ARFBCA= +go.opentelemetry.io/collector/confmap v1.24.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.24.0 h1:7DeyBm9qdr1EPuCfPjWyChPK16DbVc0wZeSa9LZprFU= +go.opentelemetry.io/collector/consumer v1.24.0/go.mod h1:0G6jvZprIp4dpKMD1ZxCjriiP9GdFvFMObsQEtTk71s= +go.opentelemetry.io/collector/extension v0.118.0 h1:9o5jLCTRvs0+rtFDx04zTBuB4WFrE0RvtVCPovYV0sA= +go.opentelemetry.io/collector/extension v0.118.0/go.mod h1:BFwB0WOlse6JnrStO44+k9kwUVjjtseFEHhJLHD7lBg= +go.opentelemetry.io/collector/extension/auth v0.118.0 h1:+eMNUBUK1JK9A3mr95BasbWE90Lxu+WlR9sqS36sJms= +go.opentelemetry.io/collector/extension/auth v0.118.0/go.mod h1:MJpYcRGSERkgOhczqTKoAhkHmcugr+YTlRhc/SpYYYI= +go.opentelemetry.io/collector/extension/auth/authtest v0.118.0 h1:KIORXNc71vfpQrrZOntiZesRCZtQ8alrASWVT/zZkyo= +go.opentelemetry.io/collector/extension/auth/authtest v0.118.0/go.mod h1:0ZlSP9NPAfTRQd6Tx4mOH0IWrp6ufHaVN//L9Mb87gM= +go.opentelemetry.io/collector/pdata v1.24.0 h1:D6j92eAzmAbQgivNBUnt8r9juOl8ugb+ihYynoFZIEg= +go.opentelemetry.io/collector/pdata v1.24.0/go.mod h1:cf3/W9E/uIvPS4MR26SnMFJhraUCattzzM6qusuONuc= +go.opentelemetry.io/collector/semconv v0.118.0 h1:V4vlMIK7TIaemrrn2VawvQPwruIKpj7Xgw9P5+BL56w= +go.opentelemetry.io/collector/semconv v0.118.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -81,8 +137,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= -golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -107,8 +163,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d h1: google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d/go.mod h1:3ENsm/5D1mzDyhpzeRi1NR784I0BcofWBoSc5QqqMK4= google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A= google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= -google.golang.org/protobuf v1.36.2 h1:R8FeyR1/eLmkutZOM5CWghmo5itiG9z0ktFlTVLuTmU= -google.golang.org/protobuf v1.36.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU= +google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 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=