summaryrefslogtreecommitdiff
path: root/vendor/go.opentelemetry.io/otel/sdk
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/go.opentelemetry.io/otel/sdk')
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/LICENSE201
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/README.md3
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/instrumentation/README.md3
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/instrumentation/doc.go13
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/instrumentation/library.go9
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/instrumentation/scope.go19
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/internal/env/env.go166
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/internal/x/README.md46
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/internal/x/x.go66
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/LICENSE201
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/README.md3
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/aggregation.go189
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/cache.go83
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/config.go172
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/doc.go47
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/env.go39
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/exemplar.go77
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/README.md3
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/doc.go6
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/exemplar.go29
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/filter.go34
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/fixed_size_reservoir.go217
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/histogram_reservoir.go70
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/reservoir.go40
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/storage.go95
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/value.go59
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/exporter.go77
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/instrument.go364
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/instrumentkind_string.go30
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/aggregate.go153
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/doc.go7
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/drop.go27
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/exemplar.go43
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/exponential_histogram.go443
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/filtered_reservoir.go50
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/histogram.go232
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/lastvalue.go161
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/limit.go42
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/sum.go237
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/internal/reuse_slice.go13
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/internal/x/README.md131
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/internal/x/x.go81
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/manual_reader.go202
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/meter.go736
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/README.md3
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/data.go296
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/temporality.go30
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/temporality_string.go25
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/periodic_reader.go369
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/pipeline.go659
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/provider.go145
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/reader.go189
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/version.go9
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/view.go118
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/README.md3
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/auto.go92
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/builtin.go116
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/config.go195
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/container.go89
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/doc.go20
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/env.go95
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/host_id.go109
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/host_id_bsd.go12
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/host_id_darwin.go8
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/host_id_exec.go18
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/host_id_linux.go11
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/host_id_readfile.go17
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/host_id_unsupported.go19
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/host_id_windows.go36
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/os.go89
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/os_release_darwin.go91
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/os_release_unix.go143
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/os_unix.go79
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/os_unsupported.go15
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/os_windows.go89
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/process.go173
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/resource/resource.go294
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/trace/README.md3
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/trace/batch_span_processor.go414
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/trace/doc.go10
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/trace/event.go26
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/trace/evictedqueue.go64
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/trace/id_generator.go81
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/trace/link.go23
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/trace/provider.go494
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/trace/sampler_env.go96
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/trace/sampling.go282
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/trace/simple_span_processor.go121
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/trace/snapshot.go133
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/trace/span.go937
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/trace/span_exporter.go36
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/trace/span_limits.go114
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/trace/span_processor.go61
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/trace/tracer.go153
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/trace/version.go9
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/version.go9
96 files changed, 0 insertions, 11641 deletions
diff --git a/vendor/go.opentelemetry.io/otel/sdk/LICENSE b/vendor/go.opentelemetry.io/otel/sdk/LICENSE
deleted file mode 100644
index 261eeb9e9..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed 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.
diff --git a/vendor/go.opentelemetry.io/otel/sdk/README.md b/vendor/go.opentelemetry.io/otel/sdk/README.md
deleted file mode 100644
index f81b1576a..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# SDK
-
-[![PkgGoDev](https://pkg.go.dev/badge/go.opentelemetry.io/otel/sdk)](https://pkg.go.dev/go.opentelemetry.io/otel/sdk)
diff --git a/vendor/go.opentelemetry.io/otel/sdk/instrumentation/README.md b/vendor/go.opentelemetry.io/otel/sdk/instrumentation/README.md
deleted file mode 100644
index 06e6d8685..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/instrumentation/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# SDK Instrumentation
-
-[![PkgGoDev](https://pkg.go.dev/badge/go.opentelemetry.io/otel/sdk/instrumentation)](https://pkg.go.dev/go.opentelemetry.io/otel/sdk/instrumentation)
diff --git a/vendor/go.opentelemetry.io/otel/sdk/instrumentation/doc.go b/vendor/go.opentelemetry.io/otel/sdk/instrumentation/doc.go
deleted file mode 100644
index a4faa6a03..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/instrumentation/doc.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-// Package instrumentation provides types to represent the code libraries that
-// provide OpenTelemetry instrumentation. These types are used in the
-// OpenTelemetry signal pipelines to identify the source of telemetry.
-//
-// See
-// https://github.com/open-telemetry/oteps/blob/d226b677d73a785523fe9b9701be13225ebc528d/text/0083-component.md
-// and
-// https://github.com/open-telemetry/oteps/blob/d226b677d73a785523fe9b9701be13225ebc528d/text/0201-scope-attributes.md
-// for more information.
-package instrumentation // import "go.opentelemetry.io/otel/sdk/instrumentation"
diff --git a/vendor/go.opentelemetry.io/otel/sdk/instrumentation/library.go b/vendor/go.opentelemetry.io/otel/sdk/instrumentation/library.go
deleted file mode 100644
index f2cdf3c65..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/instrumentation/library.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package instrumentation // import "go.opentelemetry.io/otel/sdk/instrumentation"
-
-// Library represents the instrumentation library.
-//
-// Deprecated: use [Scope] instead.
-type Library = Scope
diff --git a/vendor/go.opentelemetry.io/otel/sdk/instrumentation/scope.go b/vendor/go.opentelemetry.io/otel/sdk/instrumentation/scope.go
deleted file mode 100644
index 34852a47b..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/instrumentation/scope.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package instrumentation // import "go.opentelemetry.io/otel/sdk/instrumentation"
-
-import "go.opentelemetry.io/otel/attribute"
-
-// Scope represents the instrumentation scope.
-type Scope struct {
- // Name is the name of the instrumentation scope. This should be the
- // Go package name of that scope.
- Name string
- // Version is the version of the instrumentation scope.
- Version string
- // SchemaURL of the telemetry emitted by the scope.
- SchemaURL string
- // Attributes of the telemetry emitted by the scope.
- Attributes attribute.Set
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/internal/env/env.go b/vendor/go.opentelemetry.io/otel/sdk/internal/env/env.go
deleted file mode 100644
index 07923ed8d..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/internal/env/env.go
+++ /dev/null
@@ -1,166 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package env // import "go.opentelemetry.io/otel/sdk/internal/env"
-
-import (
- "os"
- "strconv"
-
- "go.opentelemetry.io/otel/internal/global"
-)
-
-// Environment variable names.
-const (
- // BatchSpanProcessorScheduleDelayKey is the delay interval between two
- // consecutive exports (i.e. 5000).
- BatchSpanProcessorScheduleDelayKey = "OTEL_BSP_SCHEDULE_DELAY"
- // BatchSpanProcessorExportTimeoutKey is the maximum allowed time to
- // export data (i.e. 3000).
- BatchSpanProcessorExportTimeoutKey = "OTEL_BSP_EXPORT_TIMEOUT"
- // BatchSpanProcessorMaxQueueSizeKey is the maximum queue size (i.e. 2048).
- BatchSpanProcessorMaxQueueSizeKey = "OTEL_BSP_MAX_QUEUE_SIZE"
- // BatchSpanProcessorMaxExportBatchSizeKey is the maximum batch size (i.e.
- // 512). Note: it must be less than or equal to
- // BatchSpanProcessorMaxQueueSize.
- BatchSpanProcessorMaxExportBatchSizeKey = "OTEL_BSP_MAX_EXPORT_BATCH_SIZE"
-
- // AttributeValueLengthKey is the maximum allowed attribute value size.
- AttributeValueLengthKey = "OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT"
-
- // AttributeCountKey is the maximum allowed span attribute count.
- AttributeCountKey = "OTEL_ATTRIBUTE_COUNT_LIMIT"
-
- // SpanAttributeValueLengthKey is the maximum allowed attribute value size
- // for a span.
- SpanAttributeValueLengthKey = "OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT"
-
- // SpanAttributeCountKey is the maximum allowed span attribute count for a
- // span.
- SpanAttributeCountKey = "OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT"
-
- // SpanEventCountKey is the maximum allowed span event count.
- SpanEventCountKey = "OTEL_SPAN_EVENT_COUNT_LIMIT"
-
- // SpanEventAttributeCountKey is the maximum allowed attribute per span
- // event count.
- SpanEventAttributeCountKey = "OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT"
-
- // SpanLinkCountKey is the maximum allowed span link count.
- SpanLinkCountKey = "OTEL_SPAN_LINK_COUNT_LIMIT"
-
- // SpanLinkAttributeCountKey is the maximum allowed attribute per span
- // link count.
- SpanLinkAttributeCountKey = "OTEL_LINK_ATTRIBUTE_COUNT_LIMIT"
-)
-
-// firstInt returns the value of the first matching environment variable from
-// keys. If the value is not an integer or no match is found, defaultValue is
-// returned.
-func firstInt(defaultValue int, keys ...string) int {
- for _, key := range keys {
- value := os.Getenv(key)
- if value == "" {
- continue
- }
-
- intValue, err := strconv.Atoi(value)
- if err != nil {
- global.Info("Got invalid value, number value expected.", key, value)
- return defaultValue
- }
-
- return intValue
- }
-
- return defaultValue
-}
-
-// IntEnvOr returns the int value of the environment variable with name key if
-// it exists, it is not empty, and the value is an int. Otherwise, defaultValue is returned.
-func IntEnvOr(key string, defaultValue int) int {
- value := os.Getenv(key)
- if value == "" {
- return defaultValue
- }
-
- intValue, err := strconv.Atoi(value)
- if err != nil {
- global.Info("Got invalid value, number value expected.", key, value)
- return defaultValue
- }
-
- return intValue
-}
-
-// BatchSpanProcessorScheduleDelay returns the environment variable value for
-// the OTEL_BSP_SCHEDULE_DELAY key if it exists, otherwise defaultValue is
-// returned.
-func BatchSpanProcessorScheduleDelay(defaultValue int) int {
- return IntEnvOr(BatchSpanProcessorScheduleDelayKey, defaultValue)
-}
-
-// BatchSpanProcessorExportTimeout returns the environment variable value for
-// the OTEL_BSP_EXPORT_TIMEOUT key if it exists, otherwise defaultValue is
-// returned.
-func BatchSpanProcessorExportTimeout(defaultValue int) int {
- return IntEnvOr(BatchSpanProcessorExportTimeoutKey, defaultValue)
-}
-
-// BatchSpanProcessorMaxQueueSize returns the environment variable value for
-// the OTEL_BSP_MAX_QUEUE_SIZE key if it exists, otherwise defaultValue is
-// returned.
-func BatchSpanProcessorMaxQueueSize(defaultValue int) int {
- return IntEnvOr(BatchSpanProcessorMaxQueueSizeKey, defaultValue)
-}
-
-// BatchSpanProcessorMaxExportBatchSize returns the environment variable value for
-// the OTEL_BSP_MAX_EXPORT_BATCH_SIZE key if it exists, otherwise defaultValue
-// is returned.
-func BatchSpanProcessorMaxExportBatchSize(defaultValue int) int {
- return IntEnvOr(BatchSpanProcessorMaxExportBatchSizeKey, defaultValue)
-}
-
-// SpanAttributeValueLength returns the environment variable value for the
-// OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT key if it exists. Otherwise, the
-// environment variable value for OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT is
-// returned or defaultValue if that is not set.
-func SpanAttributeValueLength(defaultValue int) int {
- return firstInt(defaultValue, SpanAttributeValueLengthKey, AttributeValueLengthKey)
-}
-
-// SpanAttributeCount returns the environment variable value for the
-// OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT key if it exists. Otherwise, the
-// environment variable value for OTEL_ATTRIBUTE_COUNT_LIMIT is returned or
-// defaultValue if that is not set.
-func SpanAttributeCount(defaultValue int) int {
- return firstInt(defaultValue, SpanAttributeCountKey, AttributeCountKey)
-}
-
-// SpanEventCount returns the environment variable value for the
-// OTEL_SPAN_EVENT_COUNT_LIMIT key if it exists, otherwise defaultValue is
-// returned.
-func SpanEventCount(defaultValue int) int {
- return IntEnvOr(SpanEventCountKey, defaultValue)
-}
-
-// SpanEventAttributeCount returns the environment variable value for the
-// OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT key if it exists, otherwise defaultValue
-// is returned.
-func SpanEventAttributeCount(defaultValue int) int {
- return IntEnvOr(SpanEventAttributeCountKey, defaultValue)
-}
-
-// SpanLinkCount returns the environment variable value for the
-// OTEL_SPAN_LINK_COUNT_LIMIT key if it exists, otherwise defaultValue is
-// returned.
-func SpanLinkCount(defaultValue int) int {
- return IntEnvOr(SpanLinkCountKey, defaultValue)
-}
-
-// SpanLinkAttributeCount returns the environment variable value for the
-// OTEL_LINK_ATTRIBUTE_COUNT_LIMIT key if it exists, otherwise defaultValue is
-// returned.
-func SpanLinkAttributeCount(defaultValue int) int {
- return IntEnvOr(SpanLinkAttributeCountKey, defaultValue)
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/internal/x/README.md b/vendor/go.opentelemetry.io/otel/sdk/internal/x/README.md
deleted file mode 100644
index fab61647c..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/internal/x/README.md
+++ /dev/null
@@ -1,46 +0,0 @@
-# Experimental Features
-
-The SDK contains features that have not yet stabilized in the OpenTelemetry specification.
-These features are added to the OpenTelemetry Go SDK prior to stabilization in the specification so that users can start experimenting with them and provide feedback.
-
-These feature may change in backwards incompatible ways as feedback is applied.
-See the [Compatibility and Stability](#compatibility-and-stability) section for more information.
-
-## Features
-
-- [Resource](#resource)
-
-### Resource
-
-[OpenTelemetry resource semantic conventions] include many attribute definitions that are defined as experimental.
-To have experimental semantic conventions be added by [resource detectors] set the `OTEL_GO_X_RESOURCE` environment variable.
-The value set must be the case-insensitive string of `"true"` to enable the feature.
-All other values are ignored.
-
-<!-- TODO: document what attributes are added by which detector -->
-
-[OpenTelemetry resource semantic conventions]: https://opentelemetry.io/docs/specs/semconv/resource/
-[resource detectors]: https://pkg.go.dev/go.opentelemetry.io/otel/sdk/resource#Detector
-
-#### Examples
-
-Enable experimental resource semantic conventions.
-
-```console
-export OTEL_GO_X_RESOURCE=true
-```
-
-Disable experimental resource semantic conventions.
-
-```console
-unset OTEL_GO_X_RESOURCE
-```
-
-## Compatibility and Stability
-
-Experimental features do not fall within the scope of the OpenTelemetry Go versioning and stability [policy](../../../VERSIONING.md).
-These features may be removed or modified in successive version releases, including patch versions.
-
-When an experimental feature is promoted to a stable feature, a migration path will be included in the changelog entry of the release.
-There is no guarantee that any environment variable feature flags that enabled the experimental feature will be supported by the stable version.
-If they are supported, they may be accompanied with a deprecation notice stating a timeline for the removal of that support.
diff --git a/vendor/go.opentelemetry.io/otel/sdk/internal/x/x.go b/vendor/go.opentelemetry.io/otel/sdk/internal/x/x.go
deleted file mode 100644
index 68d296cbe..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/internal/x/x.go
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-// Package x contains support for OTel SDK experimental features.
-//
-// This package should only be used for features defined in the specification.
-// It should not be used for experiments or new project ideas.
-package x // import "go.opentelemetry.io/otel/sdk/internal/x"
-
-import (
- "os"
- "strings"
-)
-
-// Resource is an experimental feature flag that defines if resource detectors
-// should be included experimental semantic conventions.
-//
-// To enable this feature set the OTEL_GO_X_RESOURCE environment variable
-// to the case-insensitive string value of "true" (i.e. "True" and "TRUE"
-// will also enable this).
-var Resource = newFeature("RESOURCE", func(v string) (string, bool) {
- if strings.ToLower(v) == "true" {
- return v, true
- }
- return "", false
-})
-
-// Feature is an experimental feature control flag. It provides a uniform way
-// to interact with these feature flags and parse their values.
-type Feature[T any] struct {
- key string
- parse func(v string) (T, bool)
-}
-
-func newFeature[T any](suffix string, parse func(string) (T, bool)) Feature[T] {
- const envKeyRoot = "OTEL_GO_X_"
- return Feature[T]{
- key: envKeyRoot + suffix,
- parse: parse,
- }
-}
-
-// Key returns the environment variable key that needs to be set to enable the
-// feature.
-func (f Feature[T]) Key() string { return f.key }
-
-// Lookup returns the user configured value for the feature and true if the
-// user has enabled the feature. Otherwise, if the feature is not enabled, a
-// zero-value and false are returned.
-func (f Feature[T]) Lookup() (v T, ok bool) {
- // https://github.com/open-telemetry/opentelemetry-specification/blob/62effed618589a0bec416a87e559c0a9d96289bb/specification/configuration/sdk-environment-variables.md#parsing-empty-value
- //
- // > The SDK MUST interpret an empty value of an environment variable the
- // > same way as when the variable is unset.
- vRaw := os.Getenv(f.key)
- if vRaw == "" {
- return v, ok
- }
- return f.parse(vRaw)
-}
-
-// Enabled returns if the feature is enabled.
-func (f Feature[T]) Enabled() bool {
- _, ok := f.Lookup()
- return ok
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/LICENSE b/vendor/go.opentelemetry.io/otel/sdk/metric/LICENSE
deleted file mode 100644
index 261eeb9e9..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed 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.
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/README.md b/vendor/go.opentelemetry.io/otel/sdk/metric/README.md
deleted file mode 100644
index 017f072a5..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Metric SDK
-
-[![PkgGoDev](https://pkg.go.dev/badge/go.opentelemetry.io/otel/sdk/metric)](https://pkg.go.dev/go.opentelemetry.io/otel/sdk/metric)
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/aggregation.go b/vendor/go.opentelemetry.io/otel/sdk/metric/aggregation.go
deleted file mode 100644
index e6f5cfb2a..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/aggregation.go
+++ /dev/null
@@ -1,189 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package metric // import "go.opentelemetry.io/otel/sdk/metric"
-
-import (
- "errors"
- "fmt"
- "slices"
-)
-
-// errAgg is wrapped by misconfigured aggregations.
-var errAgg = errors.New("aggregation")
-
-// Aggregation is the aggregation used to summarize recorded measurements.
-type Aggregation interface {
- // copy returns a deep copy of the Aggregation.
- copy() Aggregation
-
- // err returns an error for any misconfigured Aggregation.
- err() error
-}
-
-// AggregationDrop is an Aggregation that drops all recorded data.
-type AggregationDrop struct{} // AggregationDrop has no parameters.
-
-var _ Aggregation = AggregationDrop{}
-
-// copy returns a deep copy of d.
-func (d AggregationDrop) copy() Aggregation { return d }
-
-// err returns an error for any misconfiguration. A drop aggregation has no
-// parameters and cannot be misconfigured, therefore this always returns nil.
-func (AggregationDrop) err() error { return nil }
-
-// AggregationDefault is an Aggregation that uses the default instrument kind selection
-// mapping to select another Aggregation. A metric reader can be configured to
-// make an aggregation selection based on instrument kind that differs from
-// the default. This Aggregation ensures the default is used.
-//
-// See the [DefaultAggregationSelector] for information about the default
-// instrument kind selection mapping.
-type AggregationDefault struct{} // AggregationDefault has no parameters.
-
-var _ Aggregation = AggregationDefault{}
-
-// copy returns a deep copy of d.
-func (d AggregationDefault) copy() Aggregation { return d }
-
-// err returns an error for any misconfiguration. A default aggregation has no
-// parameters and cannot be misconfigured, therefore this always returns nil.
-func (AggregationDefault) err() error { return nil }
-
-// AggregationSum is an Aggregation that summarizes a set of measurements as their
-// arithmetic sum.
-type AggregationSum struct{} // AggregationSum has no parameters.
-
-var _ Aggregation = AggregationSum{}
-
-// copy returns a deep copy of s.
-func (s AggregationSum) copy() Aggregation { return s }
-
-// err returns an error for any misconfiguration. A sum aggregation has no
-// parameters and cannot be misconfigured, therefore this always returns nil.
-func (AggregationSum) err() error { return nil }
-
-// AggregationLastValue is an Aggregation that summarizes a set of measurements as the
-// last one made.
-type AggregationLastValue struct{} // AggregationLastValue has no parameters.
-
-var _ Aggregation = AggregationLastValue{}
-
-// copy returns a deep copy of l.
-func (l AggregationLastValue) copy() Aggregation { return l }
-
-// err returns an error for any misconfiguration. A last-value aggregation has
-// no parameters and cannot be misconfigured, therefore this always returns
-// nil.
-func (AggregationLastValue) err() error { return nil }
-
-// AggregationExplicitBucketHistogram is an Aggregation that summarizes a set of
-// measurements as an histogram with explicitly defined buckets.
-type AggregationExplicitBucketHistogram struct {
- // Boundaries are the increasing bucket boundary values. Boundary values
- // define bucket upper bounds. Buckets are exclusive of their lower
- // boundary and inclusive of their upper bound (except at positive
- // infinity). A measurement is defined to fall into the greatest-numbered
- // bucket with a boundary that is greater than or equal to the
- // measurement. As an example, boundaries defined as:
- //
- // []float64{0, 5, 10, 25, 50, 75, 100, 250, 500, 1000}
- //
- // Will define these buckets:
- //
- // (-∞, 0], (0, 5.0], (5.0, 10.0], (10.0, 25.0], (25.0, 50.0],
- // (50.0, 75.0], (75.0, 100.0], (100.0, 250.0], (250.0, 500.0],
- // (500.0, 1000.0], (1000.0, +∞)
- Boundaries []float64
- // NoMinMax indicates whether to not record the min and max of the
- // distribution. By default, these extrema are recorded.
- //
- // Recording these extrema for cumulative data is expected to have little
- // value, they will represent the entire life of the instrument instead of
- // just the current collection cycle. It is recommended to set this to true
- // for that type of data to avoid computing the low-value extrema.
- NoMinMax bool
-}
-
-var _ Aggregation = AggregationExplicitBucketHistogram{}
-
-// errHist is returned by misconfigured ExplicitBucketHistograms.
-var errHist = fmt.Errorf("%w: explicit bucket histogram", errAgg)
-
-// err returns an error for any misconfiguration.
-func (h AggregationExplicitBucketHistogram) err() error {
- if len(h.Boundaries) <= 1 {
- return nil
- }
-
- // Check boundaries are monotonic.
- i := h.Boundaries[0]
- for _, j := range h.Boundaries[1:] {
- if i >= j {
- return fmt.Errorf("%w: non-monotonic boundaries: %v", errHist, h.Boundaries)
- }
- i = j
- }
-
- return nil
-}
-
-// copy returns a deep copy of h.
-func (h AggregationExplicitBucketHistogram) copy() Aggregation {
- return AggregationExplicitBucketHistogram{
- Boundaries: slices.Clone(h.Boundaries),
- NoMinMax: h.NoMinMax,
- }
-}
-
-// AggregationBase2ExponentialHistogram is an Aggregation that summarizes a set of
-// measurements as an histogram with bucket widths that grow exponentially.
-type AggregationBase2ExponentialHistogram struct {
- // MaxSize is the maximum number of buckets to use for the histogram.
- MaxSize int32
- // MaxScale is the maximum resolution scale to use for the histogram.
- //
- // MaxScale has a maximum value of 20. Using a value of 20 means the
- // maximum number of buckets that can fit within the range of a
- // signed 32-bit integer index could be used.
- //
- // MaxScale has a minimum value of -10. Using a value of -10 means only
- // two buckets will be used.
- MaxScale int32
-
- // NoMinMax indicates whether to not record the min and max of the
- // distribution. By default, these extrema are recorded.
- //
- // Recording these extrema for cumulative data is expected to have little
- // value, they will represent the entire life of the instrument instead of
- // just the current collection cycle. It is recommended to set this to true
- // for that type of data to avoid computing the low-value extrema.
- NoMinMax bool
-}
-
-var _ Aggregation = AggregationBase2ExponentialHistogram{}
-
-// copy returns a deep copy of the Aggregation.
-func (e AggregationBase2ExponentialHistogram) copy() Aggregation {
- return e
-}
-
-const (
- expoMaxScale = 20
- expoMinScale = -10
-)
-
-// errExpoHist is returned by misconfigured Base2ExponentialBucketHistograms.
-var errExpoHist = fmt.Errorf("%w: exponential histogram", errAgg)
-
-// err returns an error for any misconfigured Aggregation.
-func (e AggregationBase2ExponentialHistogram) err() error {
- if e.MaxScale > expoMaxScale {
- return fmt.Errorf("%w: max size %d is greater than maximum scale %d", errExpoHist, e.MaxSize, expoMaxScale)
- }
- if e.MaxSize <= 0 {
- return fmt.Errorf("%w: max size %d is less than or equal to zero", errExpoHist, e.MaxSize)
- }
- return nil
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/cache.go b/vendor/go.opentelemetry.io/otel/sdk/metric/cache.go
deleted file mode 100644
index 63b88f086..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/cache.go
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package metric // import "go.opentelemetry.io/otel/sdk/metric"
-
-import (
- "sync"
-)
-
-// cache is a locking storage used to quickly return already computed values.
-//
-// The zero value of a cache is empty and ready to use.
-//
-// A cache must not be copied after first use.
-//
-// All methods of a cache are safe to call concurrently.
-type cache[K comparable, V any] struct {
- sync.Mutex
- data map[K]V
-}
-
-// Lookup returns the value stored in the cache with the associated key if it
-// exists. Otherwise, f is called and its returned value is set in the cache
-// for key and returned.
-//
-// Lookup is safe to call concurrently. It will hold the cache lock, so f
-// should not block excessively.
-func (c *cache[K, V]) Lookup(key K, f func() V) V {
- c.Lock()
- defer c.Unlock()
-
- if c.data == nil {
- val := f()
- c.data = map[K]V{key: val}
- return val
- }
- if v, ok := c.data[key]; ok {
- return v
- }
- val := f()
- c.data[key] = val
- return val
-}
-
-// HasKey returns true if Lookup has previously been called with that key
-//
-// HasKey is safe to call concurrently.
-func (c *cache[K, V]) HasKey(key K) bool {
- c.Lock()
- defer c.Unlock()
- _, ok := c.data[key]
- return ok
-}
-
-// cacheWithErr is a locking storage used to quickly return already computed values and an error.
-//
-// The zero value of a cacheWithErr is empty and ready to use.
-//
-// A cacheWithErr must not be copied after first use.
-//
-// All methods of a cacheWithErr are safe to call concurrently.
-type cacheWithErr[K comparable, V any] struct {
- cache[K, valAndErr[V]]
-}
-
-type valAndErr[V any] struct {
- val V
- err error
-}
-
-// Lookup returns the value stored in the cacheWithErr with the associated key
-// if it exists. Otherwise, f is called and its returned value is set in the
-// cacheWithErr for key and returned.
-//
-// Lookup is safe to call concurrently. It will hold the cacheWithErr lock, so f
-// should not block excessively.
-func (c *cacheWithErr[K, V]) Lookup(key K, f func() (V, error)) (V, error) {
- combined := c.cache.Lookup(key, func() valAndErr[V] {
- val, err := f()
- return valAndErr[V]{val: val, err: err}
- })
- return combined.val, combined.err
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/config.go b/vendor/go.opentelemetry.io/otel/sdk/metric/config.go
deleted file mode 100644
index 203cd9d65..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/config.go
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package metric // import "go.opentelemetry.io/otel/sdk/metric"
-
-import (
- "context"
- "errors"
- "os"
- "strings"
- "sync"
-
- "go.opentelemetry.io/otel"
- "go.opentelemetry.io/otel/sdk/metric/exemplar"
- "go.opentelemetry.io/otel/sdk/resource"
-)
-
-// config contains configuration options for a MeterProvider.
-type config struct {
- res *resource.Resource
- readers []Reader
- views []View
- exemplarFilter exemplar.Filter
-}
-
-// 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
-// single functions.
-func (c config) readerSignals() (forceFlush, shutdown func(context.Context) error) {
- var fFuncs, sFuncs []func(context.Context) error
- for _, r := range c.readers {
- sFuncs = append(sFuncs, r.Shutdown)
- if f, ok := r.(interface{ ForceFlush(context.Context) error }); ok {
- fFuncs = append(fFuncs, f.ForceFlush)
- }
- }
-
- return unify(fFuncs), unifyShutdown(sFuncs)
-}
-
-// unify unifies calling all of funcs into a single function call. All errors
-// returned from calls to funcs will be unify into a single error return
-// value.
-func unify(funcs []func(context.Context) error) func(context.Context) error {
- return func(ctx context.Context) error {
- var err error
- for _, f := range funcs {
- if e := f(ctx); e != nil {
- err = errors.Join(err, e)
- }
- }
- return err
- }
-}
-
-// unifyShutdown unifies calling all of funcs once for a shutdown. If called
-// more than once, an ErrReaderShutdown error is returned.
-func unifyShutdown(funcs []func(context.Context) error) func(context.Context) error {
- f := unify(funcs)
- var once sync.Once
- return func(ctx context.Context) error {
- err := ErrReaderShutdown
- once.Do(func() { err = f(ctx) })
- return err
- }
-}
-
-// newConfig returns a config configured with options.
-func newConfig(options []Option) config {
- conf := config{
- res: resource.Default(),
- exemplarFilter: exemplar.TraceBasedFilter,
- }
- for _, o := range meterProviderOptionsFromEnv() {
- conf = o.apply(conf)
- }
- for _, o := range options {
- conf = o.apply(conf)
- }
- return conf
-}
-
-// Option applies a configuration option value to a MeterProvider.
-type Option interface {
- apply(config) config
-}
-
-// optionFunc applies a set of options to a config.
-type optionFunc func(config) config
-
-// apply returns a config with option(s) applied.
-func (o optionFunc) apply(conf config) config {
- return o(conf)
-}
-
-// WithResource associates a Resource with a MeterProvider. This Resource
-// represents the entity producing telemetry and is associated with all Meters
-// the MeterProvider will create.
-//
-// By default, if this Option is not used, the default Resource from the
-// go.opentelemetry.io/otel/sdk/resource package will be used.
-func WithResource(res *resource.Resource) Option {
- return optionFunc(func(conf config) config {
- var err error
- conf.res, err = resource.Merge(resource.Environment(), res)
- if err != nil {
- otel.Handle(err)
- }
- return conf
- })
-}
-
-// WithReader associates Reader r with a MeterProvider.
-//
-// By default, if this option is not used, the MeterProvider will perform no
-// operations; no data will be exported without a Reader.
-func WithReader(r Reader) Option {
- return optionFunc(func(cfg config) config {
- if r == nil {
- return cfg
- }
- cfg.readers = append(cfg.readers, r)
- return cfg
- })
-}
-
-// WithView associates views with a MeterProvider.
-//
-// Views are appended to existing ones in a MeterProvider if this option is
-// used multiple times.
-//
-// By default, if this option is not used, the MeterProvider will use the
-// default view.
-func WithView(views ...View) Option {
- return optionFunc(func(cfg config) config {
- cfg.views = append(cfg.views, views...)
- return cfg
- })
-}
-
-// WithExemplarFilter configures the exemplar filter.
-//
-// The exemplar filter determines which measurements are offered to the
-// exemplar reservoir, but the exemplar reservoir makes the final decision of
-// whether to store an exemplar.
-//
-// By default, the [exemplar.SampledFilter]
-// is used. Exemplars can be entirely disabled by providing the
-// [exemplar.AlwaysOffFilter].
-func WithExemplarFilter(filter exemplar.Filter) Option {
- return optionFunc(func(cfg config) config {
- cfg.exemplarFilter = filter
- return cfg
- })
-}
-
-func meterProviderOptionsFromEnv() []Option {
- var opts []Option
- // https://github.com/open-telemetry/opentelemetry-specification/blob/d4b241f451674e8f611bb589477680341006ad2b/specification/configuration/sdk-environment-variables.md#exemplar
- const filterEnvKey = "OTEL_METRICS_EXEMPLAR_FILTER"
-
- switch strings.ToLower(strings.TrimSpace(os.Getenv(filterEnvKey))) {
- case "always_on":
- opts = append(opts, WithExemplarFilter(exemplar.AlwaysOnFilter))
- case "always_off":
- opts = append(opts, WithExemplarFilter(exemplar.AlwaysOffFilter))
- case "trace_based":
- opts = append(opts, WithExemplarFilter(exemplar.TraceBasedFilter))
- }
- return opts
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/doc.go b/vendor/go.opentelemetry.io/otel/sdk/metric/doc.go
deleted file mode 100644
index 90a4ae16c..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/doc.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-// Package metric provides an implementation of the OpenTelemetry metrics SDK.
-//
-// See https://opentelemetry.io/docs/concepts/signals/metrics/ for information
-// about the concept of OpenTelemetry metrics and
-// https://opentelemetry.io/docs/concepts/components/ for more information
-// about OpenTelemetry SDKs.
-//
-// The entry point for the metric package is the MeterProvider. It is the
-// object that all API calls use to create Meters, instruments, and ultimately
-// make metric measurements. Also, it is an object that should be used to
-// control the life-cycle (start, flush, and shutdown) of the SDK.
-//
-// A MeterProvider needs to be configured to export the measured data, this is
-// done by configuring it with a Reader implementation (using the WithReader
-// MeterProviderOption). Readers take two forms: ones that push to an endpoint
-// (NewPeriodicReader), and ones that an endpoint pulls from. See
-// [go.opentelemetry.io/otel/exporters] for exporters that can be used as
-// or with these Readers.
-//
-// Each Reader, when registered with the MeterProvider, can be augmented with a
-// View. Views allow users that run OpenTelemetry instrumented code to modify
-// the generated data of that instrumentation.
-//
-// The data generated by a MeterProvider needs to include information about its
-// origin. A MeterProvider needs to be configured with a Resource, using the
-// WithResource MeterProviderOption, to include this information. This Resource
-// should be used to describe the unique runtime environment instrumented code
-// is being run on. That way when multiple instances of the code are collected
-// at a single endpoint their origin is decipherable.
-//
-// To avoid leaking memory, the SDK returns the same instrument for calls to
-// create new instruments with the same Name, Unit, and Description.
-// Importantly, callbacks provided using metric.WithFloat64Callback or
-// metric.WithInt64Callback will only apply for the first instrument created
-// with a given Name, Unit, and Description. Instead, use
-// Meter.RegisterCallback and Registration.Unregister to add and remove
-// callbacks without leaking memory.
-//
-// See [go.opentelemetry.io/otel/metric] for more information about
-// the metric API.
-//
-// See [go.opentelemetry.io/otel/sdk/metric/internal/x] for information about
-// the experimental features.
-package metric // import "go.opentelemetry.io/otel/sdk/metric"
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/env.go b/vendor/go.opentelemetry.io/otel/sdk/metric/env.go
deleted file mode 100644
index a6c403797..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/env.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package metric // import "go.opentelemetry.io/otel/sdk/metric"
-
-import (
- "os"
- "strconv"
- "time"
-
- "go.opentelemetry.io/otel/internal/global"
-)
-
-// Environment variable names.
-const (
- // The time interval (in milliseconds) between the start of two export attempts.
- envInterval = "OTEL_METRIC_EXPORT_INTERVAL"
- // Maximum allowed time (in milliseconds) to export data.
- envTimeout = "OTEL_METRIC_EXPORT_TIMEOUT"
-)
-
-// envDuration returns an environment variable's value as duration in milliseconds if it is exists,
-// or the defaultValue if the environment variable is not defined or the value is not valid.
-func envDuration(key string, defaultValue time.Duration) time.Duration {
- v := os.Getenv(key)
- if v == "" {
- return defaultValue
- }
- d, err := strconv.Atoi(v)
- if err != nil {
- global.Error(err, "parse duration", "environment variable", key, "value", v)
- return defaultValue
- }
- if d <= 0 {
- global.Error(errNonPositiveDuration, "non-positive duration", "environment variable", key, "value", v)
- return defaultValue
- }
- return time.Duration(d) * time.Millisecond
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar.go b/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar.go
deleted file mode 100644
index 0335b8ae4..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package metric // import "go.opentelemetry.io/otel/sdk/metric"
-
-import (
- "runtime"
-
- "go.opentelemetry.io/otel/attribute"
- "go.opentelemetry.io/otel/sdk/metric/exemplar"
- "go.opentelemetry.io/otel/sdk/metric/internal/aggregate"
-)
-
-// ExemplarReservoirProviderSelector selects the
-// [exemplar.ReservoirProvider] to use
-// based on the [Aggregation] of the metric.
-type ExemplarReservoirProviderSelector func(Aggregation) exemplar.ReservoirProvider
-
-// reservoirFunc returns the appropriately configured exemplar reservoir
-// creation func based on the passed InstrumentKind and filter configuration.
-func reservoirFunc[N int64 | float64](provider exemplar.ReservoirProvider, filter exemplar.Filter) func(attribute.Set) aggregate.FilteredExemplarReservoir[N] {
- return func(attrs attribute.Set) aggregate.FilteredExemplarReservoir[N] {
- return aggregate.NewFilteredExemplarReservoir[N](filter, provider(attrs))
- }
-}
-
-// DefaultExemplarReservoirProviderSelector returns the default
-// [exemplar.ReservoirProvider] for the
-// provided [Aggregation].
-//
-// For explicit bucket histograms with more than 1 bucket, it uses the
-// [exemplar.HistogramReservoirProvider].
-// For exponential histograms, it uses the
-// [exemplar.FixedSizeReservoirProvider]
-// with a size of min(20, max_buckets).
-// For all other aggregations, it uses the
-// [exemplar.FixedSizeReservoirProvider]
-// with a size equal to the number of CPUs.
-//
-// Exemplar default reservoirs MAY change in a minor version bump. No
-// guarantees are made on the shape or statistical properties of returned
-// exemplars.
-func DefaultExemplarReservoirProviderSelector(agg Aggregation) exemplar.ReservoirProvider {
- // https://github.com/open-telemetry/opentelemetry-specification/blob/d4b241f451674e8f611bb589477680341006ad2b/specification/metrics/sdk.md#exemplar-defaults
- // Explicit bucket histogram aggregation with more than 1 bucket will
- // use AlignedHistogramBucketExemplarReservoir.
- a, ok := agg.(AggregationExplicitBucketHistogram)
- if ok && len(a.Boundaries) > 0 {
- return exemplar.HistogramReservoirProvider(a.Boundaries)
- }
-
- var n int
- if a, ok := agg.(AggregationBase2ExponentialHistogram); ok {
- // Base2 Exponential Histogram Aggregation SHOULD use a
- // SimpleFixedSizeExemplarReservoir with a reservoir equal to the
- // smaller of the maximum number of buckets configured on the
- // aggregation or twenty (e.g. min(20, max_buckets)).
- n = int(a.MaxSize)
- if n > 20 {
- n = 20
- }
- } else {
- // https://github.com/open-telemetry/opentelemetry-specification/blob/e94af89e3d0c01de30127a0f423e912f6cda7bed/specification/metrics/sdk.md#simplefixedsizeexemplarreservoir
- // This Exemplar reservoir MAY take a configuration parameter for
- // the size of the reservoir. If no size configuration is
- // provided, the default size MAY be the number of possible
- // concurrent threads (e.g. number of CPUs) to help reduce
- // contention. Otherwise, a default size of 1 SHOULD be used.
- n = runtime.NumCPU()
- if n < 1 {
- // Should never be the case, but be defensive.
- n = 1
- }
- }
-
- return exemplar.FixedSizeReservoirProvider(n)
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/README.md b/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/README.md
deleted file mode 100644
index d1025f5eb..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Metric SDK Exemplars
-
-[![PkgGoDev](https://pkg.go.dev/badge/go.opentelemetry.io/otel/sdk/metric/exemplar)](https://pkg.go.dev/go.opentelemetry.io/otel/sdk/metric/exemplar)
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/doc.go b/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/doc.go
deleted file mode 100644
index 9f2389376..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/doc.go
+++ /dev/null
@@ -1,6 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-// Package exemplar provides an implementation of the OpenTelemetry exemplar
-// reservoir to be used in metric collection pipelines.
-package exemplar // import "go.opentelemetry.io/otel/sdk/metric/exemplar"
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/exemplar.go b/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/exemplar.go
deleted file mode 100644
index 1ab694678..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/exemplar.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package exemplar // import "go.opentelemetry.io/otel/sdk/metric/exemplar"
-
-import (
- "time"
-
- "go.opentelemetry.io/otel/attribute"
-)
-
-// Exemplar is a measurement sampled from a timeseries providing a typical
-// example.
-type Exemplar struct {
- // FilteredAttributes are the attributes recorded with the measurement but
- // filtered out of the timeseries' aggregated data.
- FilteredAttributes []attribute.KeyValue
- // Time is the time when the measurement was recorded.
- Time time.Time
- // Value is the measured value.
- Value Value
- // SpanID is the ID of the span that was active during the measurement. If
- // no span was active or the span was not sampled this will be empty.
- SpanID []byte `json:",omitempty"`
- // TraceID is the ID of the trace the active span belonged to during the
- // measurement. If no span was active or the span was not sampled this will
- // be empty.
- TraceID []byte `json:",omitempty"`
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/filter.go b/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/filter.go
deleted file mode 100644
index b595e2ace..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/filter.go
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package exemplar // import "go.opentelemetry.io/otel/sdk/metric/exemplar"
-
-import (
- "context"
-
- "go.opentelemetry.io/otel/trace"
-)
-
-// Filter determines if a measurement should be offered.
-//
-// The passed ctx needs to contain any baggage or span that were active
-// when the measurement was made. This information may be used by the
-// Reservoir in making a sampling decision.
-type Filter func(context.Context) bool
-
-// TraceBasedFilter is a [Filter] that will only offer measurements
-// if the passed context associated with the measurement contains a sampled
-// [go.opentelemetry.io/otel/trace.SpanContext].
-func TraceBasedFilter(ctx context.Context) bool {
- return trace.SpanContextFromContext(ctx).IsSampled()
-}
-
-// AlwaysOnFilter is a [Filter] that always offers measurements.
-func AlwaysOnFilter(ctx context.Context) bool {
- return true
-}
-
-// AlwaysOffFilter is a [Filter] that never offers measurements.
-func AlwaysOffFilter(ctx context.Context) bool {
- return false
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/fixed_size_reservoir.go b/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/fixed_size_reservoir.go
deleted file mode 100644
index d4aab0aad..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/fixed_size_reservoir.go
+++ /dev/null
@@ -1,217 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package exemplar // import "go.opentelemetry.io/otel/sdk/metric/exemplar"
-
-import (
- "context"
- "math"
- "math/rand"
- "time"
-
- "go.opentelemetry.io/otel/attribute"
-)
-
-// FixedSizeReservoirProvider returns a provider of [FixedSizeReservoir].
-func FixedSizeReservoirProvider(k int) ReservoirProvider {
- return func(_ attribute.Set) Reservoir {
- return NewFixedSizeReservoir(k)
- }
-}
-
-// NewFixedSizeReservoir returns a [FixedSizeReservoir] that samples at most
-// k exemplars. If there are k or less measurements made, the Reservoir will
-// sample each one. If there are more than k, the Reservoir will then randomly
-// sample all additional measurement with a decreasing probability.
-func NewFixedSizeReservoir(k int) *FixedSizeReservoir {
- return newFixedSizeReservoir(newStorage(k))
-}
-
-var _ Reservoir = &FixedSizeReservoir{}
-
-// FixedSizeReservoir is a [Reservoir] that samples at most k exemplars. If
-// there are k or less measurements made, the Reservoir will sample each one.
-// If there are more than k, the Reservoir will then randomly sample all
-// additional measurement with a decreasing probability.
-type FixedSizeReservoir struct {
- *storage
-
- // count is the number of measurement seen.
- count int64
- // next is the next count that will store a measurement at a random index
- // once the reservoir has been filled.
- next int64
- // w is the largest random number in a distribution that is used to compute
- // the next next.
- w float64
-
- // rng is used to make sampling decisions.
- //
- // Do not use crypto/rand. There is no reason for the decrease in performance
- // given this is not a security sensitive decision.
- rng *rand.Rand
-}
-
-func newFixedSizeReservoir(s *storage) *FixedSizeReservoir {
- r := &FixedSizeReservoir{
- storage: s,
- rng: rand.New(rand.NewSource(time.Now().UnixNano())),
- }
- r.reset()
- return r
-}
-
-// randomFloat64 returns, as a float64, a uniform pseudo-random number in the
-// open interval (0.0,1.0).
-func (r *FixedSizeReservoir) randomFloat64() float64 {
- // TODO: This does not return a uniform number. rng.Float64 returns a
- // uniformly random int in [0,2^53) that is divided by 2^53. Meaning it
- // returns multiples of 2^-53, and not all floating point numbers between 0
- // and 1 (i.e. for values less than 2^-4 the 4 last bits of the significand
- // are always going to be 0).
- //
- // An alternative algorithm should be considered that will actually return
- // a uniform number in the interval (0,1). For example, since the default
- // rand source provides a uniform distribution for Int63, this can be
- // converted following the prototypical code of Mersenne Twister 64 (Takuji
- // Nishimura and Makoto Matsumoto:
- // http://www.math.sci.hiroshima-u.ac.jp/m-mat/MT/VERSIONS/C-LANG/mt19937-64.c)
- //
- // (float64(rng.Int63()>>11) + 0.5) * (1.0 / 4503599627370496.0)
- //
- // There are likely many other methods to explore here as well.
-
- f := r.rng.Float64()
- for f == 0 {
- f = r.rng.Float64()
- }
- return f
-}
-
-// Offer accepts the parameters associated with a measurement. The
-// parameters will be stored as an exemplar if the Reservoir decides to
-// sample the measurement.
-//
-// The passed ctx needs to contain any baggage or span that were active
-// when the measurement was made. This information may be used by the
-// Reservoir in making a sampling decision.
-//
-// The time t is the time when the measurement was made. The v and a
-// parameters are the value and dropped (filtered) attributes of the
-// measurement respectively.
-func (r *FixedSizeReservoir) Offer(ctx context.Context, t time.Time, n Value, a []attribute.KeyValue) {
- // The following algorithm is "Algorithm L" from Li, Kim-Hung (4 December
- // 1994). "Reservoir-Sampling Algorithms of Time Complexity
- // O(n(1+log(N/n)))". ACM Transactions on Mathematical Software. 20 (4):
- // 481–493 (https://dl.acm.org/doi/10.1145/198429.198435).
- //
- // A high-level overview of "Algorithm L":
- // 0) Pre-calculate the random count greater than the storage size when
- // an exemplar will be replaced.
- // 1) Accept all measurements offered until the configured storage size is
- // reached.
- // 2) Loop:
- // a) When the pre-calculate count is reached, replace a random
- // existing exemplar with the offered measurement.
- // b) Calculate the next random count greater than the existing one
- // which will replace another exemplars
- //
- // The way a "replacement" count is computed is by looking at `n` number of
- // independent random numbers each corresponding to an offered measurement.
- // Of these numbers the smallest `k` (the same size as the storage
- // capacity) of them are kept as a subset. The maximum value in this
- // subset, called `w` is used to weight another random number generation
- // for the next count that will be considered.
- //
- // By weighting the next count computation like described, it is able to
- // perform a uniformly-weighted sampling algorithm based on the number of
- // samples the reservoir has seen so far. The sampling will "slow down" as
- // more and more samples are offered so as to reduce a bias towards those
- // offered just prior to the end of the collection.
- //
- // This algorithm is preferred because of its balance of simplicity and
- // performance. It will compute three random numbers (the bulk of
- // computation time) for each item that becomes part of the reservoir, but
- // it does not spend any time on items that do not. In particular it has an
- // asymptotic runtime of O(k(1 + log(n/k)) where n is the number of
- // measurements offered and k is the reservoir size.
- //
- // See https://en.wikipedia.org/wiki/Reservoir_sampling for an overview of
- // this and other reservoir sampling algorithms. See
- // https://github.com/MrAlias/reservoir-sampling for a performance
- // comparison of reservoir sampling algorithms.
-
- if int(r.count) < cap(r.store) {
- r.store[r.count] = newMeasurement(ctx, t, n, a)
- } else {
- if r.count == r.next {
- // Overwrite a random existing measurement with the one offered.
- idx := int(r.rng.Int63n(int64(cap(r.store))))
- r.store[idx] = newMeasurement(ctx, t, n, a)
- r.advance()
- }
- }
- r.count++
-}
-
-// reset resets r to the initial state.
-func (r *FixedSizeReservoir) reset() {
- // This resets the number of exemplars known.
- r.count = 0
- // Random index inserts should only happen after the storage is full.
- r.next = int64(cap(r.store))
-
- // Initial random number in the series used to generate r.next.
- //
- // This is set before r.advance to reset or initialize the random number
- // series. Without doing so it would always be 0 or never restart a new
- // random number series.
- //
- // This maps the uniform random number in (0,1) to a geometric distribution
- // over the same interval. The mean of the distribution is inversely
- // proportional to the storage capacity.
- r.w = math.Exp(math.Log(r.randomFloat64()) / float64(cap(r.store)))
-
- r.advance()
-}
-
-// advance updates the count at which the offered measurement will overwrite an
-// existing exemplar.
-func (r *FixedSizeReservoir) advance() {
- // Calculate the next value in the random number series.
- //
- // The current value of r.w is based on the max of a distribution of random
- // numbers (i.e. `w = max(u_1,u_2,...,u_k)` for `k` equal to the capacity
- // of the storage and each `u` in the interval (0,w)). To calculate the
- // next r.w we use the fact that when the next exemplar is selected to be
- // included in the storage an existing one will be dropped, and the
- // corresponding random number in the set used to calculate r.w will also
- // be replaced. The replacement random number will also be within (0,w),
- // therefore the next r.w will be based on the same distribution (i.e.
- // `max(u_1,u_2,...,u_k)`). Therefore, we can sample the next r.w by
- // computing the next random number `u` and take r.w as `w * u^(1/k)`.
- r.w *= math.Exp(math.Log(r.randomFloat64()) / float64(cap(r.store)))
- // Use the new random number in the series to calculate the count of the
- // next measurement that will be stored.
- //
- // Given 0 < r.w < 1, each iteration will result in subsequent r.w being
- // smaller. This translates here into the next next being selected against
- // a distribution with a higher mean (i.e. the expected value will increase
- // and replacements become less likely)
- //
- // Important to note, the new r.next will always be at least 1 more than
- // the last r.next.
- r.next += int64(math.Log(r.randomFloat64())/math.Log(1-r.w)) + 1
-}
-
-// Collect returns all the held exemplars.
-//
-// The Reservoir state is preserved after this call.
-func (r *FixedSizeReservoir) Collect(dest *[]Exemplar) {
- r.storage.Collect(dest)
- // Call reset here even though it will reset r.count and restart the random
- // number series. This will persist any old exemplars as long as no new
- // measurements are offered, but it will also prioritize those new
- // measurements that are made over the older collection cycle ones.
- r.reset()
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/histogram_reservoir.go b/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/histogram_reservoir.go
deleted file mode 100644
index 3b76cf305..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/histogram_reservoir.go
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package exemplar // import "go.opentelemetry.io/otel/sdk/metric/exemplar"
-
-import (
- "context"
- "slices"
- "sort"
- "time"
-
- "go.opentelemetry.io/otel/attribute"
-)
-
-// HistogramReservoirProvider is a provider of [HistogramReservoir].
-func HistogramReservoirProvider(bounds []float64) ReservoirProvider {
- cp := slices.Clone(bounds)
- slices.Sort(cp)
- return func(_ attribute.Set) Reservoir {
- return NewHistogramReservoir(cp)
- }
-}
-
-// NewHistogramReservoir returns a [HistogramReservoir] that samples the last
-// measurement that falls within a histogram bucket. The histogram bucket
-// upper-boundaries are define by bounds.
-//
-// The passed bounds must be sorted before calling this function.
-func NewHistogramReservoir(bounds []float64) *HistogramReservoir {
- return &HistogramReservoir{
- bounds: bounds,
- storage: newStorage(len(bounds) + 1),
- }
-}
-
-var _ Reservoir = &HistogramReservoir{}
-
-// HistogramReservoir is a [Reservoir] that samples the last measurement that
-// falls within a histogram bucket. The histogram bucket upper-boundaries are
-// define by bounds.
-type HistogramReservoir struct {
- *storage
-
- // bounds are bucket bounds in ascending order.
- bounds []float64
-}
-
-// Offer accepts the parameters associated with a measurement. The
-// parameters will be stored as an exemplar if the Reservoir decides to
-// sample the measurement.
-//
-// The passed ctx needs to contain any baggage or span that were active
-// when the measurement was made. This information may be used by the
-// Reservoir in making a sampling decision.
-//
-// The time t is the time when the measurement was made. The v and a
-// parameters are the value and dropped (filtered) attributes of the
-// measurement respectively.
-func (r *HistogramReservoir) Offer(ctx context.Context, t time.Time, v Value, a []attribute.KeyValue) {
- var x float64
- switch v.Type() {
- case Int64ValueType:
- x = float64(v.Int64())
- case Float64ValueType:
- x = v.Float64()
- default:
- panic("unknown value type")
- }
- r.store[sort.SearchFloat64s(r.bounds, x)] = newMeasurement(ctx, t, v, a)
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/reservoir.go b/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/reservoir.go
deleted file mode 100644
index ba5cd1a6b..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/reservoir.go
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package exemplar // import "go.opentelemetry.io/otel/sdk/metric/exemplar"
-
-import (
- "context"
- "time"
-
- "go.opentelemetry.io/otel/attribute"
-)
-
-// Reservoir holds the sampled exemplar of measurements made.
-type Reservoir interface {
- // Offer accepts the parameters associated with a measurement. The
- // parameters will be stored as an exemplar if the Reservoir decides to
- // sample the measurement.
- //
- // The passed ctx needs to contain any baggage or span that were active
- // when the measurement was made. This information may be used by the
- // Reservoir in making a sampling decision.
- //
- // The time t is the time when the measurement was made. The val and attr
- // parameters are the value and dropped (filtered) attributes of the
- // measurement respectively.
- Offer(ctx context.Context, t time.Time, val Value, attr []attribute.KeyValue)
-
- // Collect returns all the held exemplars.
- //
- // The Reservoir state is preserved after this call.
- Collect(dest *[]Exemplar)
-}
-
-// ReservoirProvider creates new [Reservoir]s.
-//
-// The attributes provided are attributes which are kept by the aggregation, and
-// are exclusive with attributes passed to Offer. The combination of these
-// attributes and the attributes passed to Offer is the complete set of
-// attributes a measurement was made with.
-type ReservoirProvider func(attr attribute.Set) Reservoir
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/storage.go b/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/storage.go
deleted file mode 100644
index 0e2e26dfb..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/storage.go
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package exemplar // import "go.opentelemetry.io/otel/sdk/metric/exemplar"
-
-import (
- "context"
- "time"
-
- "go.opentelemetry.io/otel/attribute"
- "go.opentelemetry.io/otel/trace"
-)
-
-// storage is an exemplar storage for [Reservoir] implementations.
-type storage struct {
- // store are the measurements sampled.
- //
- // This does not use []metricdata.Exemplar because it potentially would
- // require an allocation for trace and span IDs in the hot path of Offer.
- store []measurement
-}
-
-func newStorage(n int) *storage {
- return &storage{store: make([]measurement, n)}
-}
-
-// Collect returns all the held exemplars.
-//
-// The Reservoir state is preserved after this call.
-func (r *storage) Collect(dest *[]Exemplar) {
- *dest = reset(*dest, len(r.store), len(r.store))
- var n int
- for _, m := range r.store {
- if !m.valid {
- continue
- }
-
- m.exemplar(&(*dest)[n])
- n++
- }
- *dest = (*dest)[:n]
-}
-
-// measurement is a measurement made by a telemetry system.
-type measurement struct {
- // FilteredAttributes are the attributes dropped during the measurement.
- FilteredAttributes []attribute.KeyValue
- // Time is the time when the measurement was made.
- Time time.Time
- // Value is the value of the measurement.
- Value Value
- // SpanContext is the SpanContext active when a measurement was made.
- SpanContext trace.SpanContext
-
- valid bool
-}
-
-// newMeasurement returns a new non-empty Measurement.
-func newMeasurement(ctx context.Context, ts time.Time, v Value, droppedAttr []attribute.KeyValue) measurement {
- return measurement{
- FilteredAttributes: droppedAttr,
- Time: ts,
- Value: v,
- SpanContext: trace.SpanContextFromContext(ctx),
- valid: true,
- }
-}
-
-// exemplar returns m as an [Exemplar].
-func (m measurement) exemplar(dest *Exemplar) {
- dest.FilteredAttributes = m.FilteredAttributes
- dest.Time = m.Time
- dest.Value = m.Value
-
- if m.SpanContext.HasTraceID() {
- traceID := m.SpanContext.TraceID()
- dest.TraceID = traceID[:]
- } else {
- dest.TraceID = dest.TraceID[:0]
- }
-
- if m.SpanContext.HasSpanID() {
- spanID := m.SpanContext.SpanID()
- dest.SpanID = spanID[:]
- } else {
- dest.SpanID = dest.SpanID[:0]
- }
-}
-
-func reset[T any](s []T, length, capacity int) []T {
- if cap(s) < capacity {
- return make([]T, length, capacity)
- }
- return s[:length]
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/value.go b/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/value.go
deleted file mode 100644
index 590b089a8..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/value.go
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package exemplar // import "go.opentelemetry.io/otel/sdk/metric/exemplar"
-
-import "math"
-
-// ValueType identifies the type of value used in exemplar data.
-type ValueType uint8
-
-const (
- // UnknownValueType should not be used. It represents a misconfigured
- // Value.
- UnknownValueType ValueType = 0
- // Int64ValueType represents a Value with int64 data.
- Int64ValueType ValueType = 1
- // Float64ValueType represents a Value with float64 data.
- Float64ValueType ValueType = 2
-)
-
-// Value is the value of data held by an exemplar.
-type Value struct {
- t ValueType
- val uint64
-}
-
-// NewValue returns a new [Value] for the provided value.
-func NewValue[N int64 | float64](value N) Value {
- switch v := any(value).(type) {
- case int64:
- // This can be later converted back to int64 (overflow not checked).
- return Value{t: Int64ValueType, val: uint64(v)} // nolint:gosec
- case float64:
- return Value{t: Float64ValueType, val: math.Float64bits(v)}
- }
- return Value{}
-}
-
-// Type returns the [ValueType] of data held by v.
-func (v Value) Type() ValueType { return v.t }
-
-// Int64 returns the value of v as an int64. If the ValueType of v is not an
-// Int64ValueType, 0 is returned.
-func (v Value) Int64() int64 {
- if v.t == Int64ValueType {
- // Assumes the correct int64 was stored in v.val based on type.
- return int64(v.val) // nolint: gosec
- }
- return 0
-}
-
-// Float64 returns the value of v as an float64. If the ValueType of v is not
-// an Float64ValueType, 0 is returned.
-func (v Value) Float64() float64 {
- if v.t == Float64ValueType {
- return math.Float64frombits(v.val)
- }
- return 0
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/exporter.go b/vendor/go.opentelemetry.io/otel/sdk/metric/exporter.go
deleted file mode 100644
index 1969cb42c..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/exporter.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package metric // import "go.opentelemetry.io/otel/sdk/metric"
-
-import (
- "context"
- "errors"
-
- "go.opentelemetry.io/otel/sdk/metric/metricdata"
-)
-
-// ErrExporterShutdown is returned if Export or Shutdown are called after an
-// Exporter has been Shutdown.
-var ErrExporterShutdown = errors.New("exporter is shutdown")
-
-// Exporter handles the delivery of metric data to external receivers. This is
-// the final component in the metric push pipeline.
-type Exporter interface {
- // Temporality returns the Temporality to use for an instrument kind.
- //
- // This method needs to be concurrent safe with itself and all the other
- // Exporter methods.
- Temporality(InstrumentKind) metricdata.Temporality
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-
- // Aggregation returns the Aggregation to use for an instrument kind.
- //
- // This method needs to be concurrent safe with itself and all the other
- // Exporter methods.
- Aggregation(InstrumentKind) Aggregation
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-
- // Export serializes and transmits metric data to a receiver.
- //
- // This is called synchronously, there is no concurrency safety
- // requirement. Because of this, it is critical that all timeouts and
- // cancellations of the passed context be honored.
- //
- // All retry logic must be contained in this function. The SDK does not
- // implement any retry logic. All errors returned by this function are
- // considered unrecoverable and will be reported to a configured error
- // Handler.
- //
- // The passed ResourceMetrics may be reused when the call completes. If an
- // exporter needs to hold this data after it returns, it needs to make a
- // copy.
- Export(context.Context, *metricdata.ResourceMetrics) error
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-
- // ForceFlush flushes any metric data held by an exporter.
- //
- // The deadline or cancellation of the passed context must be honored. An
- // appropriate error should be returned in these situations.
- //
- // This method needs to be concurrent safe.
- ForceFlush(context.Context) error
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-
- // Shutdown flushes all metric data held by an exporter and releases any
- // held computational resources.
- //
- // The deadline or cancellation of the passed context must be honored. An
- // appropriate error should be returned in these situations.
- //
- // After Shutdown is called, calls to Export will perform no operation and
- // instead will return an error indicating the shutdown state.
- //
- // This method needs to be concurrent safe.
- Shutdown(context.Context) error
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/instrument.go b/vendor/go.opentelemetry.io/otel/sdk/metric/instrument.go
deleted file mode 100644
index c33e1a28c..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/instrument.go
+++ /dev/null
@@ -1,364 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-//go:generate stringer -type=InstrumentKind -trimprefix=InstrumentKind
-
-package metric // import "go.opentelemetry.io/otel/sdk/metric"
-
-import (
- "context"
- "errors"
- "fmt"
- "strings"
-
- "go.opentelemetry.io/otel/attribute"
- "go.opentelemetry.io/otel/metric"
- "go.opentelemetry.io/otel/metric/embedded"
- "go.opentelemetry.io/otel/sdk/instrumentation"
- "go.opentelemetry.io/otel/sdk/metric/internal/aggregate"
- "go.opentelemetry.io/otel/sdk/metric/internal/x"
-)
-
-var zeroScope instrumentation.Scope
-
-// InstrumentKind is the identifier of a group of instruments that all
-// performing the same function.
-type InstrumentKind uint8
-
-const (
- // instrumentKindUndefined is an undefined instrument kind, it should not
- // be used by any initialized type.
- instrumentKindUndefined InstrumentKind = 0 // nolint:deadcode,varcheck,unused
- // InstrumentKindCounter identifies a group of instruments that record
- // increasing values synchronously with the code path they are measuring.
- InstrumentKindCounter InstrumentKind = 1
- // InstrumentKindUpDownCounter identifies a group of instruments that
- // record increasing and decreasing values synchronously with the code path
- // they are measuring.
- InstrumentKindUpDownCounter InstrumentKind = 2
- // InstrumentKindHistogram identifies a group of instruments that record a
- // distribution of values synchronously with the code path they are
- // measuring.
- InstrumentKindHistogram InstrumentKind = 3
- // InstrumentKindObservableCounter identifies a group of instruments that
- // record increasing values in an asynchronous callback.
- InstrumentKindObservableCounter InstrumentKind = 4
- // InstrumentKindObservableUpDownCounter identifies a group of instruments
- // that record increasing and decreasing values in an asynchronous
- // callback.
- InstrumentKindObservableUpDownCounter InstrumentKind = 5
- // InstrumentKindObservableGauge identifies a group of instruments that
- // record current values in an asynchronous callback.
- InstrumentKindObservableGauge InstrumentKind = 6
- // InstrumentKindGauge identifies a group of instruments that record
- // instantaneous values synchronously with the code path they are
- // measuring.
- InstrumentKindGauge InstrumentKind = 7
-)
-
-type nonComparable [0]func() // nolint: unused // This is indeed used.
-
-// Instrument describes properties an instrument is created with.
-type Instrument struct {
- // Name is the human-readable identifier of the instrument.
- Name string
- // Description describes the purpose of the instrument.
- Description string
- // Kind defines the functional group of the instrument.
- Kind InstrumentKind
- // Unit is the unit of measurement recorded by the instrument.
- Unit string
- // Scope identifies the instrumentation that created the instrument.
- Scope instrumentation.Scope
-
- // Ensure forward compatibility if non-comparable fields need to be added.
- nonComparable // nolint: unused
-}
-
-// IsEmpty returns if all Instrument fields are their zero-value.
-func (i Instrument) IsEmpty() bool {
- return i.Name == "" &&
- i.Description == "" &&
- i.Kind == instrumentKindUndefined &&
- i.Unit == "" &&
- i.Scope == zeroScope
-}
-
-// matches returns whether all the non-zero-value fields of i match the
-// corresponding fields of other. If i is empty it will match all other, and
-// true will always be returned.
-func (i Instrument) matches(other Instrument) bool {
- return i.matchesName(other) &&
- i.matchesDescription(other) &&
- i.matchesKind(other) &&
- i.matchesUnit(other) &&
- i.matchesScope(other)
-}
-
-// matchesName returns true if the Name of i is "" or it equals the Name of
-// other, otherwise false.
-func (i Instrument) matchesName(other Instrument) bool {
- return i.Name == "" || i.Name == other.Name
-}
-
-// matchesDescription returns true if the Description of i is "" or it equals
-// the Description of other, otherwise false.
-func (i Instrument) matchesDescription(other Instrument) bool {
- return i.Description == "" || i.Description == other.Description
-}
-
-// matchesKind returns true if the Kind of i is its zero-value or it equals the
-// Kind of other, otherwise false.
-func (i Instrument) matchesKind(other Instrument) bool {
- return i.Kind == instrumentKindUndefined || i.Kind == other.Kind
-}
-
-// matchesUnit returns true if the Unit of i is its zero-value or it equals the
-// Unit of other, otherwise false.
-func (i Instrument) matchesUnit(other Instrument) bool {
- return i.Unit == "" || i.Unit == other.Unit
-}
-
-// matchesScope returns true if the Scope of i is its zero-value or it equals
-// the Scope of other, otherwise false.
-func (i Instrument) matchesScope(other Instrument) bool {
- return (i.Scope.Name == "" || i.Scope.Name == other.Scope.Name) &&
- (i.Scope.Version == "" || i.Scope.Version == other.Scope.Version) &&
- (i.Scope.SchemaURL == "" || i.Scope.SchemaURL == other.Scope.SchemaURL)
-}
-
-// Stream describes the stream of data an instrument produces.
-type Stream struct {
- // Name is the human-readable identifier of the stream.
- Name string
- // Description describes the purpose of the data.
- Description string
- // Unit is the unit of measurement recorded.
- Unit string
- // Aggregation the stream uses for an instrument.
- Aggregation Aggregation
- // AttributeFilter is an attribute Filter applied to the attributes
- // recorded for an instrument's measurement. If the filter returns false
- // the attribute will not be recorded, otherwise, if it returns true, it
- // will record the attribute.
- //
- // Use NewAllowKeysFilter from "go.opentelemetry.io/otel/attribute" to
- // provide an allow-list of attribute keys here.
- AttributeFilter attribute.Filter
- // ExemplarReservoirProvider selects the
- // [go.opentelemetry.io/otel/sdk/metric/exemplar.ReservoirProvider] based
- // on the [Aggregation].
- //
- // If unspecified, [DefaultExemplarReservoirProviderSelector] is used.
- ExemplarReservoirProviderSelector ExemplarReservoirProviderSelector
-}
-
-// instID are the identifying properties of a instrument.
-type instID struct {
- // Name is the name of the stream.
- Name string
- // Description is the description of the stream.
- Description string
- // Kind defines the functional group of the instrument.
- Kind InstrumentKind
- // Unit is the unit of the stream.
- Unit string
- // Number is the number type of the stream.
- Number string
-}
-
-// Returns a normalized copy of the instID i.
-//
-// Instrument names are considered case-insensitive. Standardize the instrument
-// name to always be lowercase for the returned instID so it can be compared
-// without the name casing affecting the comparison.
-func (i instID) normalize() instID {
- i.Name = strings.ToLower(i.Name)
- return i
-}
-
-type int64Inst struct {
- measures []aggregate.Measure[int64]
-
- embedded.Int64Counter
- embedded.Int64UpDownCounter
- embedded.Int64Histogram
- embedded.Int64Gauge
-}
-
-var (
- _ metric.Int64Counter = (*int64Inst)(nil)
- _ metric.Int64UpDownCounter = (*int64Inst)(nil)
- _ metric.Int64Histogram = (*int64Inst)(nil)
- _ metric.Int64Gauge = (*int64Inst)(nil)
- _ x.EnabledInstrument = (*int64Inst)(nil)
-)
-
-func (i *int64Inst) Add(ctx context.Context, val int64, opts ...metric.AddOption) {
- c := metric.NewAddConfig(opts)
- i.aggregate(ctx, val, c.Attributes())
-}
-
-func (i *int64Inst) Record(ctx context.Context, val int64, opts ...metric.RecordOption) {
- c := metric.NewRecordConfig(opts)
- i.aggregate(ctx, val, c.Attributes())
-}
-
-func (i *int64Inst) Enabled(_ context.Context) bool {
- return len(i.measures) != 0
-}
-
-func (i *int64Inst) aggregate(ctx context.Context, val int64, s attribute.Set) { // nolint:revive // okay to shadow pkg with method.
- for _, in := range i.measures {
- in(ctx, val, s)
- }
-}
-
-type float64Inst struct {
- measures []aggregate.Measure[float64]
-
- embedded.Float64Counter
- embedded.Float64UpDownCounter
- embedded.Float64Histogram
- embedded.Float64Gauge
-}
-
-var (
- _ metric.Float64Counter = (*float64Inst)(nil)
- _ metric.Float64UpDownCounter = (*float64Inst)(nil)
- _ metric.Float64Histogram = (*float64Inst)(nil)
- _ metric.Float64Gauge = (*float64Inst)(nil)
- _ x.EnabledInstrument = (*float64Inst)(nil)
-)
-
-func (i *float64Inst) Add(ctx context.Context, val float64, opts ...metric.AddOption) {
- c := metric.NewAddConfig(opts)
- i.aggregate(ctx, val, c.Attributes())
-}
-
-func (i *float64Inst) Record(ctx context.Context, val float64, opts ...metric.RecordOption) {
- c := metric.NewRecordConfig(opts)
- i.aggregate(ctx, val, c.Attributes())
-}
-
-func (i *float64Inst) Enabled(_ context.Context) bool {
- return len(i.measures) != 0
-}
-
-func (i *float64Inst) aggregate(ctx context.Context, val float64, s attribute.Set) {
- for _, in := range i.measures {
- in(ctx, val, s)
- }
-}
-
-// observableID is a comparable unique identifier of an observable.
-type observableID[N int64 | float64] struct {
- name string
- description string
- kind InstrumentKind
- unit string
- scope instrumentation.Scope
-}
-
-type float64Observable struct {
- metric.Float64Observable
- *observable[float64]
-
- embedded.Float64ObservableCounter
- embedded.Float64ObservableUpDownCounter
- embedded.Float64ObservableGauge
-}
-
-var (
- _ metric.Float64ObservableCounter = float64Observable{}
- _ metric.Float64ObservableUpDownCounter = float64Observable{}
- _ metric.Float64ObservableGauge = float64Observable{}
-)
-
-func newFloat64Observable(m *meter, kind InstrumentKind, name, desc, u string) float64Observable {
- return float64Observable{
- observable: newObservable[float64](m, kind, name, desc, u),
- }
-}
-
-type int64Observable struct {
- metric.Int64Observable
- *observable[int64]
-
- embedded.Int64ObservableCounter
- embedded.Int64ObservableUpDownCounter
- embedded.Int64ObservableGauge
-}
-
-var (
- _ metric.Int64ObservableCounter = int64Observable{}
- _ metric.Int64ObservableUpDownCounter = int64Observable{}
- _ metric.Int64ObservableGauge = int64Observable{}
-)
-
-func newInt64Observable(m *meter, kind InstrumentKind, name, desc, u string) int64Observable {
- return int64Observable{
- observable: newObservable[int64](m, kind, name, desc, u),
- }
-}
-
-type observable[N int64 | float64] struct {
- metric.Observable
- observableID[N]
-
- meter *meter
- measures measures[N]
- dropAggregation bool
-}
-
-func newObservable[N int64 | float64](m *meter, kind InstrumentKind, name, desc, u string) *observable[N] {
- return &observable[N]{
- observableID: observableID[N]{
- name: name,
- description: desc,
- kind: kind,
- unit: u,
- scope: m.scope,
- },
- meter: m,
- }
-}
-
-// observe records the val for the set of attrs.
-func (o *observable[N]) observe(val N, s attribute.Set) {
- o.measures.observe(val, s)
-}
-
-func (o *observable[N]) appendMeasures(meas []aggregate.Measure[N]) {
- o.measures = append(o.measures, meas...)
-}
-
-type measures[N int64 | float64] []aggregate.Measure[N]
-
-// observe records the val for the set of attrs.
-func (m measures[N]) observe(val N, s attribute.Set) {
- for _, in := range m {
- in(context.Background(), val, s)
- }
-}
-
-var errEmptyAgg = errors.New("no aggregators for observable instrument")
-
-// registerable returns an error if the observable o should not be registered,
-// and nil if it should. An errEmptyAgg error is returned if o is effectively a
-// no-op because it does not have any aggregators. Also, an error is returned
-// if scope defines a Meter other than the one o was created by.
-func (o *observable[N]) registerable(m *meter) error {
- if len(o.measures) == 0 {
- return errEmptyAgg
- }
- if m != o.meter {
- return fmt.Errorf(
- "invalid registration: observable %q from Meter %q, registered with Meter %q",
- o.name,
- o.scope.Name,
- m.scope.Name,
- )
- }
- return nil
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/instrumentkind_string.go b/vendor/go.opentelemetry.io/otel/sdk/metric/instrumentkind_string.go
deleted file mode 100644
index 25ea6244e..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/instrumentkind_string.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Code generated by "stringer -type=InstrumentKind -trimprefix=InstrumentKind"; DO NOT EDIT.
-
-package metric
-
-import "strconv"
-
-func _() {
- // An "invalid array index" compiler error signifies that the constant values have changed.
- // Re-run the stringer command to generate them again.
- var x [1]struct{}
- _ = x[instrumentKindUndefined-0]
- _ = x[InstrumentKindCounter-1]
- _ = x[InstrumentKindUpDownCounter-2]
- _ = x[InstrumentKindHistogram-3]
- _ = x[InstrumentKindObservableCounter-4]
- _ = x[InstrumentKindObservableUpDownCounter-5]
- _ = x[InstrumentKindObservableGauge-6]
- _ = x[InstrumentKindGauge-7]
-}
-
-const _InstrumentKind_name = "instrumentKindUndefinedCounterUpDownCounterHistogramObservableCounterObservableUpDownCounterObservableGaugeGauge"
-
-var _InstrumentKind_index = [...]uint8{0, 23, 30, 43, 52, 69, 92, 107, 112}
-
-func (i InstrumentKind) String() string {
- if i >= InstrumentKind(len(_InstrumentKind_index)-1) {
- return "InstrumentKind(" + strconv.FormatInt(int64(i), 10) + ")"
- }
- return _InstrumentKind_name[_InstrumentKind_index[i]:_InstrumentKind_index[i+1]]
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/aggregate.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/aggregate.go
deleted file mode 100644
index fde219333..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/aggregate.go
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package aggregate // import "go.opentelemetry.io/otel/sdk/metric/internal/aggregate"
-
-import (
- "context"
- "time"
-
- "go.opentelemetry.io/otel/attribute"
- "go.opentelemetry.io/otel/sdk/metric/metricdata"
-)
-
-// now is used to return the current local time while allowing tests to
-// override the default time.Now function.
-var now = time.Now
-
-// Measure receives measurements to be aggregated.
-type Measure[N int64 | float64] func(context.Context, N, attribute.Set)
-
-// ComputeAggregation stores the aggregate of measurements into dest and
-// returns the number of aggregate data-points output.
-type ComputeAggregation func(dest *metricdata.Aggregation) int
-
-// Builder builds an aggregate function.
-type Builder[N int64 | float64] struct {
- // Temporality is the temporality used for the returned aggregate function.
- //
- // If this is not provided a default of cumulative will be used (except for
- // the last-value aggregate function where delta is the only appropriate
- // temporality).
- Temporality metricdata.Temporality
- // Filter is the attribute filter the aggregate function will use on the
- // input of measurements.
- Filter attribute.Filter
- // ReservoirFunc is the factory function used by aggregate functions to
- // create new exemplar reservoirs for a new seen attribute set.
- //
- // If this is not provided a default factory function that returns an
- // dropReservoir reservoir will be used.
- ReservoirFunc func(attribute.Set) FilteredExemplarReservoir[N]
- // AggregationLimit is the cardinality limit of measurement attributes. Any
- // measurement for new attributes once the limit has been reached will be
- // aggregated into a single aggregate for the "otel.metric.overflow"
- // attribute.
- //
- // If AggregationLimit is less than or equal to zero there will not be an
- // aggregation limit imposed (i.e. unlimited attribute sets).
- AggregationLimit int
-}
-
-func (b Builder[N]) resFunc() func(attribute.Set) FilteredExemplarReservoir[N] {
- if b.ReservoirFunc != nil {
- return b.ReservoirFunc
- }
-
- return dropReservoir
-}
-
-type fltrMeasure[N int64 | float64] func(ctx context.Context, value N, fltrAttr attribute.Set, droppedAttr []attribute.KeyValue)
-
-func (b Builder[N]) filter(f fltrMeasure[N]) Measure[N] {
- if b.Filter != nil {
- fltr := b.Filter // Copy to make it immutable after assignment.
- return func(ctx context.Context, n N, a attribute.Set) {
- fAttr, dropped := a.Filter(fltr)
- f(ctx, n, fAttr, dropped)
- }
- }
- return func(ctx context.Context, n N, a attribute.Set) {
- f(ctx, n, a, nil)
- }
-}
-
-// LastValue returns a last-value aggregate function input and output.
-func (b Builder[N]) LastValue() (Measure[N], ComputeAggregation) {
- lv := newLastValue[N](b.AggregationLimit, b.resFunc())
- switch b.Temporality {
- case metricdata.DeltaTemporality:
- return b.filter(lv.measure), lv.delta
- default:
- return b.filter(lv.measure), lv.cumulative
- }
-}
-
-// PrecomputedLastValue returns a last-value aggregate function input and
-// output. The aggregation returned from the returned ComputeAggregation
-// function will always only return values from the previous collection cycle.
-func (b Builder[N]) PrecomputedLastValue() (Measure[N], ComputeAggregation) {
- lv := newPrecomputedLastValue[N](b.AggregationLimit, b.resFunc())
- switch b.Temporality {
- case metricdata.DeltaTemporality:
- return b.filter(lv.measure), lv.delta
- default:
- return b.filter(lv.measure), lv.cumulative
- }
-}
-
-// PrecomputedSum returns a sum aggregate function input and output. The
-// arguments passed to the input are expected to be the precomputed sum values.
-func (b Builder[N]) PrecomputedSum(monotonic bool) (Measure[N], ComputeAggregation) {
- s := newPrecomputedSum[N](monotonic, b.AggregationLimit, b.resFunc())
- switch b.Temporality {
- case metricdata.DeltaTemporality:
- return b.filter(s.measure), s.delta
- default:
- return b.filter(s.measure), s.cumulative
- }
-}
-
-// Sum returns a sum aggregate function input and output.
-func (b Builder[N]) Sum(monotonic bool) (Measure[N], ComputeAggregation) {
- s := newSum[N](monotonic, b.AggregationLimit, b.resFunc())
- switch b.Temporality {
- case metricdata.DeltaTemporality:
- return b.filter(s.measure), s.delta
- default:
- return b.filter(s.measure), s.cumulative
- }
-}
-
-// ExplicitBucketHistogram returns a histogram aggregate function input and
-// output.
-func (b Builder[N]) ExplicitBucketHistogram(boundaries []float64, noMinMax, noSum bool) (Measure[N], ComputeAggregation) {
- h := newHistogram[N](boundaries, noMinMax, noSum, b.AggregationLimit, b.resFunc())
- switch b.Temporality {
- case metricdata.DeltaTemporality:
- return b.filter(h.measure), h.delta
- default:
- return b.filter(h.measure), h.cumulative
- }
-}
-
-// ExponentialBucketHistogram returns a histogram aggregate function input and
-// output.
-func (b Builder[N]) ExponentialBucketHistogram(maxSize, maxScale int32, noMinMax, noSum bool) (Measure[N], ComputeAggregation) {
- h := newExponentialHistogram[N](maxSize, maxScale, noMinMax, noSum, b.AggregationLimit, b.resFunc())
- switch b.Temporality {
- case metricdata.DeltaTemporality:
- return b.filter(h.measure), h.delta
- default:
- return b.filter(h.measure), h.cumulative
- }
-}
-
-// reset ensures s has capacity and sets it length. If the capacity of s too
-// small, a new slice is returned with the specified capacity and length.
-func reset[T any](s []T, length, capacity int) []T {
- if cap(s) < capacity {
- return make([]T, length, capacity)
- }
- return s[:length]
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/doc.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/doc.go
deleted file mode 100644
index 7b7225e6e..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/doc.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-// Package aggregate provides aggregate types used compute aggregations and
-// cycle the state of metric measurements made by the SDK. These types and
-// functionality are meant only for internal SDK use.
-package aggregate // import "go.opentelemetry.io/otel/sdk/metric/internal/aggregate"
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/drop.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/drop.go
deleted file mode 100644
index 8396faaa4..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/drop.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package aggregate // import "go.opentelemetry.io/otel/sdk/metric/internal/aggregate"
-
-import (
- "context"
-
- "go.opentelemetry.io/otel/attribute"
- "go.opentelemetry.io/otel/sdk/metric/exemplar"
-)
-
-// dropReservoir returns a [FilteredReservoir] that drops all measurements it is offered.
-func dropReservoir[N int64 | float64](attribute.Set) FilteredExemplarReservoir[N] {
- return &dropRes[N]{}
-}
-
-type dropRes[N int64 | float64] struct{}
-
-// Offer does nothing, all measurements offered will be dropped.
-func (r *dropRes[N]) Offer(context.Context, N, []attribute.KeyValue) {}
-
-// Collect resets dest. No exemplars will ever be returned.
-func (r *dropRes[N]) Collect(dest *[]exemplar.Exemplar) {
- clear(*dest) // Erase elements to let GC collect objects
- *dest = (*dest)[:0]
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/exemplar.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/exemplar.go
deleted file mode 100644
index 25d709948..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/exemplar.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package aggregate // import "go.opentelemetry.io/otel/sdk/metric/internal/aggregate"
-
-import (
- "sync"
-
- "go.opentelemetry.io/otel/sdk/metric/exemplar"
- "go.opentelemetry.io/otel/sdk/metric/metricdata"
-)
-
-var exemplarPool = sync.Pool{
- New: func() any { return new([]exemplar.Exemplar) },
-}
-
-func collectExemplars[N int64 | float64](out *[]metricdata.Exemplar[N], f func(*[]exemplar.Exemplar)) {
- dest := exemplarPool.Get().(*[]exemplar.Exemplar)
- defer func() {
- clear(*dest) // Erase elements to let GC collect objects.
- *dest = (*dest)[:0]
- exemplarPool.Put(dest)
- }()
-
- *dest = reset(*dest, len(*out), cap(*out))
-
- f(dest)
-
- *out = reset(*out, len(*dest), cap(*dest))
- for i, e := range *dest {
- (*out)[i].FilteredAttributes = e.FilteredAttributes
- (*out)[i].Time = e.Time
- (*out)[i].SpanID = e.SpanID
- (*out)[i].TraceID = e.TraceID
-
- switch e.Value.Type() {
- case exemplar.Int64ValueType:
- (*out)[i].Value = N(e.Value.Int64())
- case exemplar.Float64ValueType:
- (*out)[i].Value = N(e.Value.Float64())
- }
- }
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/exponential_histogram.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/exponential_histogram.go
deleted file mode 100644
index 336ea91d1..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/exponential_histogram.go
+++ /dev/null
@@ -1,443 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package aggregate // import "go.opentelemetry.io/otel/sdk/metric/internal/aggregate"
-
-import (
- "context"
- "errors"
- "math"
- "sync"
- "time"
-
- "go.opentelemetry.io/otel"
- "go.opentelemetry.io/otel/attribute"
- "go.opentelemetry.io/otel/sdk/metric/metricdata"
-)
-
-const (
- expoMaxScale = 20
- expoMinScale = -10
-
- smallestNonZeroNormalFloat64 = 0x1p-1022
-
- // These redefine the Math constants with a type, so the compiler won't coerce
- // them into an int on 32 bit platforms.
- maxInt64 int64 = math.MaxInt64
- minInt64 int64 = math.MinInt64
-)
-
-// expoHistogramDataPoint is a single data point in an exponential histogram.
-type expoHistogramDataPoint[N int64 | float64] struct {
- attrs attribute.Set
- res FilteredExemplarReservoir[N]
-
- count uint64
- min N
- max N
- sum N
-
- maxSize int
- noMinMax bool
- noSum bool
-
- scale int32
-
- posBuckets expoBuckets
- negBuckets expoBuckets
- zeroCount uint64
-}
-
-func newExpoHistogramDataPoint[N int64 | float64](attrs attribute.Set, maxSize int, maxScale int32, noMinMax, noSum bool) *expoHistogramDataPoint[N] {
- f := math.MaxFloat64
- ma := N(f) // if N is int64, max will overflow to -9223372036854775808
- mi := N(-f)
- if N(maxInt64) > N(f) {
- ma = N(maxInt64)
- mi = N(minInt64)
- }
- return &expoHistogramDataPoint[N]{
- attrs: attrs,
- min: ma,
- max: mi,
- maxSize: maxSize,
- noMinMax: noMinMax,
- noSum: noSum,
- scale: maxScale,
- }
-}
-
-// record adds a new measurement to the histogram. It will rescale the buckets if needed.
-func (p *expoHistogramDataPoint[N]) record(v N) {
- p.count++
-
- if !p.noMinMax {
- if v < p.min {
- p.min = v
- }
- if v > p.max {
- p.max = v
- }
- }
- if !p.noSum {
- p.sum += v
- }
-
- absV := math.Abs(float64(v))
-
- if float64(absV) == 0.0 {
- p.zeroCount++
- return
- }
-
- bin := p.getBin(absV)
-
- bucket := &p.posBuckets
- if v < 0 {
- bucket = &p.negBuckets
- }
-
- // If the new bin would make the counts larger than maxScale, we need to
- // downscale current measurements.
- if scaleDelta := p.scaleChange(bin, bucket.startBin, len(bucket.counts)); scaleDelta > 0 {
- if p.scale-scaleDelta < expoMinScale {
- // With a scale of -10 there is only two buckets for the whole range of float64 values.
- // This can only happen if there is a max size of 1.
- otel.Handle(errors.New("exponential histogram scale underflow"))
- return
- }
- // Downscale
- p.scale -= scaleDelta
- p.posBuckets.downscale(scaleDelta)
- p.negBuckets.downscale(scaleDelta)
-
- bin = p.getBin(absV)
- }
-
- bucket.record(bin)
-}
-
-// getBin returns the bin v should be recorded into.
-func (p *expoHistogramDataPoint[N]) getBin(v float64) int32 {
- frac, expInt := math.Frexp(v)
- // 11-bit exponential.
- exp := int32(expInt) // nolint: gosec
- if p.scale <= 0 {
- // Because of the choice of fraction is always 1 power of two higher than we want.
- var correction int32 = 1
- if frac == .5 {
- // If v is an exact power of two the frac will be .5 and the exp
- // will be one higher than we want.
- correction = 2
- }
- return (exp - correction) >> (-p.scale)
- }
- return exp<<p.scale + int32(math.Log(frac)*scaleFactors[p.scale]) - 1
-}
-
-// scaleFactors are constants used in calculating the logarithm index. They are
-// equivalent to 2^index/log(2).
-var scaleFactors = [21]float64{
- math.Ldexp(math.Log2E, 0),
- math.Ldexp(math.Log2E, 1),
- math.Ldexp(math.Log2E, 2),
- math.Ldexp(math.Log2E, 3),
- math.Ldexp(math.Log2E, 4),
- math.Ldexp(math.Log2E, 5),
- math.Ldexp(math.Log2E, 6),
- math.Ldexp(math.Log2E, 7),
- math.Ldexp(math.Log2E, 8),
- math.Ldexp(math.Log2E, 9),
- math.Ldexp(math.Log2E, 10),
- math.Ldexp(math.Log2E, 11),
- math.Ldexp(math.Log2E, 12),
- math.Ldexp(math.Log2E, 13),
- math.Ldexp(math.Log2E, 14),
- math.Ldexp(math.Log2E, 15),
- math.Ldexp(math.Log2E, 16),
- math.Ldexp(math.Log2E, 17),
- math.Ldexp(math.Log2E, 18),
- math.Ldexp(math.Log2E, 19),
- math.Ldexp(math.Log2E, 20),
-}
-
-// scaleChange returns the magnitude of the scale change needed to fit bin in
-// the bucket. If no scale change is needed 0 is returned.
-func (p *expoHistogramDataPoint[N]) scaleChange(bin, startBin int32, length int) int32 {
- if length == 0 {
- // No need to rescale if there are no buckets.
- return 0
- }
-
- low := int(startBin)
- high := int(bin)
- if startBin >= bin {
- low = int(bin)
- high = int(startBin) + length - 1
- }
-
- var count int32
- for high-low >= p.maxSize {
- low = low >> 1
- high = high >> 1
- count++
- if count > expoMaxScale-expoMinScale {
- return count
- }
- }
- return count
-}
-
-// expoBuckets is a set of buckets in an exponential histogram.
-type expoBuckets struct {
- startBin int32
- counts []uint64
-}
-
-// record increments the count for the given bin, and expands the buckets if needed.
-// Size changes must be done before calling this function.
-func (b *expoBuckets) record(bin int32) {
- if len(b.counts) == 0 {
- b.counts = []uint64{1}
- b.startBin = bin
- return
- }
-
- endBin := int(b.startBin) + len(b.counts) - 1
-
- // if the new bin is inside the current range
- if bin >= b.startBin && int(bin) <= endBin {
- b.counts[bin-b.startBin]++
- return
- }
- // if the new bin is before the current start add spaces to the counts
- if bin < b.startBin {
- origLen := len(b.counts)
- newLength := endBin - int(bin) + 1
- shift := b.startBin - bin
-
- if newLength > cap(b.counts) {
- b.counts = append(b.counts, make([]uint64, newLength-len(b.counts))...)
- }
-
- copy(b.counts[shift:origLen+int(shift)], b.counts[:])
- b.counts = b.counts[:newLength]
- for i := 1; i < int(shift); i++ {
- b.counts[i] = 0
- }
- b.startBin = bin
- b.counts[0] = 1
- return
- }
- // if the new is after the end add spaces to the end
- if int(bin) > endBin {
- if int(bin-b.startBin) < cap(b.counts) {
- b.counts = b.counts[:bin-b.startBin+1]
- for i := endBin + 1 - int(b.startBin); i < len(b.counts); i++ {
- b.counts[i] = 0
- }
- b.counts[bin-b.startBin] = 1
- return
- }
-
- end := make([]uint64, int(bin-b.startBin)-len(b.counts)+1)
- b.counts = append(b.counts, end...)
- b.counts[bin-b.startBin] = 1
- }
-}
-
-// downscale shrinks a bucket by a factor of 2*s. It will sum counts into the
-// correct lower resolution bucket.
-func (b *expoBuckets) downscale(delta int32) {
- // Example
- // delta = 2
- // Original offset: -6
- // Counts: [ 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- // bins: -6 -5, -4, -3, -2, -1, 0, 1, 2, 3, 4
- // new bins:-2, -2, -1, -1, -1, -1, 0, 0, 0, 0, 1
- // new Offset: -2
- // new Counts: [4, 14, 30, 10]
-
- if len(b.counts) <= 1 || delta < 1 {
- b.startBin = b.startBin >> delta
- return
- }
-
- steps := int32(1) << delta
- offset := b.startBin % steps
- offset = (offset + steps) % steps // to make offset positive
- for i := 1; i < len(b.counts); i++ {
- idx := i + int(offset)
- if idx%int(steps) == 0 {
- b.counts[idx/int(steps)] = b.counts[i]
- continue
- }
- b.counts[idx/int(steps)] += b.counts[i]
- }
-
- lastIdx := (len(b.counts) - 1 + int(offset)) / int(steps)
- b.counts = b.counts[:lastIdx+1]
- b.startBin = b.startBin >> delta
-}
-
-// newExponentialHistogram returns an Aggregator that summarizes a set of
-// measurements as an exponential histogram. Each histogram is scoped by attributes
-// and the aggregation cycle the measurements were made in.
-func newExponentialHistogram[N int64 | float64](maxSize, maxScale int32, noMinMax, noSum bool, limit int, r func(attribute.Set) FilteredExemplarReservoir[N]) *expoHistogram[N] {
- return &expoHistogram[N]{
- noSum: noSum,
- noMinMax: noMinMax,
- maxSize: int(maxSize),
- maxScale: maxScale,
-
- newRes: r,
- limit: newLimiter[*expoHistogramDataPoint[N]](limit),
- values: make(map[attribute.Distinct]*expoHistogramDataPoint[N]),
-
- start: now(),
- }
-}
-
-// expoHistogram summarizes a set of measurements as an histogram with exponentially
-// defined buckets.
-type expoHistogram[N int64 | float64] struct {
- noSum bool
- noMinMax bool
- maxSize int
- maxScale int32
-
- newRes func(attribute.Set) FilteredExemplarReservoir[N]
- limit limiter[*expoHistogramDataPoint[N]]
- values map[attribute.Distinct]*expoHistogramDataPoint[N]
- valuesMu sync.Mutex
-
- start time.Time
-}
-
-func (e *expoHistogram[N]) measure(ctx context.Context, value N, fltrAttr attribute.Set, droppedAttr []attribute.KeyValue) {
- // Ignore NaN and infinity.
- if math.IsInf(float64(value), 0) || math.IsNaN(float64(value)) {
- return
- }
-
- e.valuesMu.Lock()
- defer e.valuesMu.Unlock()
-
- attr := e.limit.Attributes(fltrAttr, e.values)
- v, ok := e.values[attr.Equivalent()]
- if !ok {
- v = newExpoHistogramDataPoint[N](attr, e.maxSize, e.maxScale, e.noMinMax, e.noSum)
- v.res = e.newRes(attr)
-
- e.values[attr.Equivalent()] = v
- }
- v.record(value)
- v.res.Offer(ctx, value, droppedAttr)
-}
-
-func (e *expoHistogram[N]) delta(dest *metricdata.Aggregation) int {
- t := now()
-
- // If *dest is not a metricdata.ExponentialHistogram, memory reuse is missed.
- // In that case, use the zero-value h and hope for better alignment next cycle.
- h, _ := (*dest).(metricdata.ExponentialHistogram[N])
- h.Temporality = metricdata.DeltaTemporality
-
- e.valuesMu.Lock()
- defer e.valuesMu.Unlock()
-
- n := len(e.values)
- hDPts := reset(h.DataPoints, n, n)
-
- var i int
- for _, val := range e.values {
- hDPts[i].Attributes = val.attrs
- hDPts[i].StartTime = e.start
- hDPts[i].Time = t
- hDPts[i].Count = val.count
- hDPts[i].Scale = val.scale
- hDPts[i].ZeroCount = val.zeroCount
- hDPts[i].ZeroThreshold = 0.0
-
- hDPts[i].PositiveBucket.Offset = val.posBuckets.startBin
- hDPts[i].PositiveBucket.Counts = reset(hDPts[i].PositiveBucket.Counts, len(val.posBuckets.counts), len(val.posBuckets.counts))
- copy(hDPts[i].PositiveBucket.Counts, val.posBuckets.counts)
-
- hDPts[i].NegativeBucket.Offset = val.negBuckets.startBin
- hDPts[i].NegativeBucket.Counts = reset(hDPts[i].NegativeBucket.Counts, len(val.negBuckets.counts), len(val.negBuckets.counts))
- copy(hDPts[i].NegativeBucket.Counts, val.negBuckets.counts)
-
- if !e.noSum {
- hDPts[i].Sum = val.sum
- }
- if !e.noMinMax {
- hDPts[i].Min = metricdata.NewExtrema(val.min)
- hDPts[i].Max = metricdata.NewExtrema(val.max)
- }
-
- collectExemplars(&hDPts[i].Exemplars, val.res.Collect)
-
- i++
- }
- // Unused attribute sets do not report.
- clear(e.values)
-
- e.start = t
- h.DataPoints = hDPts
- *dest = h
- return n
-}
-
-func (e *expoHistogram[N]) cumulative(dest *metricdata.Aggregation) int {
- t := now()
-
- // If *dest is not a metricdata.ExponentialHistogram, memory reuse is missed.
- // In that case, use the zero-value h and hope for better alignment next cycle.
- h, _ := (*dest).(metricdata.ExponentialHistogram[N])
- h.Temporality = metricdata.CumulativeTemporality
-
- e.valuesMu.Lock()
- defer e.valuesMu.Unlock()
-
- n := len(e.values)
- hDPts := reset(h.DataPoints, n, n)
-
- var i int
- for _, val := range e.values {
- hDPts[i].Attributes = val.attrs
- hDPts[i].StartTime = e.start
- hDPts[i].Time = t
- hDPts[i].Count = val.count
- hDPts[i].Scale = val.scale
- hDPts[i].ZeroCount = val.zeroCount
- hDPts[i].ZeroThreshold = 0.0
-
- hDPts[i].PositiveBucket.Offset = val.posBuckets.startBin
- hDPts[i].PositiveBucket.Counts = reset(hDPts[i].PositiveBucket.Counts, len(val.posBuckets.counts), len(val.posBuckets.counts))
- copy(hDPts[i].PositiveBucket.Counts, val.posBuckets.counts)
-
- hDPts[i].NegativeBucket.Offset = val.negBuckets.startBin
- hDPts[i].NegativeBucket.Counts = reset(hDPts[i].NegativeBucket.Counts, len(val.negBuckets.counts), len(val.negBuckets.counts))
- copy(hDPts[i].NegativeBucket.Counts, val.negBuckets.counts)
-
- if !e.noSum {
- hDPts[i].Sum = val.sum
- }
- if !e.noMinMax {
- hDPts[i].Min = metricdata.NewExtrema(val.min)
- hDPts[i].Max = metricdata.NewExtrema(val.max)
- }
-
- collectExemplars(&hDPts[i].Exemplars, val.res.Collect)
-
- i++
- // TODO (#3006): This will use an unbounded amount of memory if there
- // are unbounded number of attribute sets being aggregated. Attribute
- // sets that become "stale" need to be forgotten so this will not
- // overload the system.
- }
-
- h.DataPoints = hDPts
- *dest = h
- return n
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/filtered_reservoir.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/filtered_reservoir.go
deleted file mode 100644
index 691a91060..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/filtered_reservoir.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package aggregate // import "go.opentelemetry.io/otel/sdk/metric/internal/aggregate"
-
-import (
- "context"
- "time"
-
- "go.opentelemetry.io/otel/attribute"
- "go.opentelemetry.io/otel/sdk/metric/exemplar"
-)
-
-// FilteredExemplarReservoir wraps a [exemplar.Reservoir] with a filter.
-type FilteredExemplarReservoir[N int64 | float64] interface {
- // Offer accepts the parameters associated with a measurement. The
- // parameters will be stored as an exemplar if the filter decides to
- // sample the measurement.
- //
- // The passed ctx needs to contain any baggage or span that were active
- // when the measurement was made. This information may be used by the
- // Reservoir in making a sampling decision.
- Offer(ctx context.Context, val N, attr []attribute.KeyValue)
- // Collect returns all the held exemplars in the reservoir.
- Collect(dest *[]exemplar.Exemplar)
-}
-
-// filteredExemplarReservoir handles the pre-sampled exemplar of measurements made.
-type filteredExemplarReservoir[N int64 | float64] struct {
- filter exemplar.Filter
- reservoir exemplar.Reservoir
-}
-
-// NewFilteredExemplarReservoir creates a [FilteredExemplarReservoir] which only offers values
-// that are allowed by the filter.
-func NewFilteredExemplarReservoir[N int64 | float64](f exemplar.Filter, r exemplar.Reservoir) FilteredExemplarReservoir[N] {
- return &filteredExemplarReservoir[N]{
- filter: f,
- reservoir: r,
- }
-}
-
-func (f *filteredExemplarReservoir[N]) Offer(ctx context.Context, val N, attr []attribute.KeyValue) {
- if f.filter(ctx) {
- // only record the current time if we are sampling this measurement.
- f.reservoir.Offer(ctx, time.Now(), exemplar.NewValue(val), attr)
- }
-}
-
-func (f *filteredExemplarReservoir[N]) Collect(dest *[]exemplar.Exemplar) { f.reservoir.Collect(dest) }
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/histogram.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/histogram.go
deleted file mode 100644
index d577ae2c1..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/histogram.go
+++ /dev/null
@@ -1,232 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package aggregate // import "go.opentelemetry.io/otel/sdk/metric/internal/aggregate"
-
-import (
- "context"
- "slices"
- "sort"
- "sync"
- "time"
-
- "go.opentelemetry.io/otel/attribute"
- "go.opentelemetry.io/otel/sdk/metric/metricdata"
-)
-
-type buckets[N int64 | float64] struct {
- attrs attribute.Set
- res FilteredExemplarReservoir[N]
-
- counts []uint64
- count uint64
- total N
- min, max N
-}
-
-// newBuckets returns buckets with n bins.
-func newBuckets[N int64 | float64](attrs attribute.Set, n int) *buckets[N] {
- return &buckets[N]{attrs: attrs, counts: make([]uint64, n)}
-}
-
-func (b *buckets[N]) sum(value N) { b.total += value }
-
-func (b *buckets[N]) bin(idx int, value N) {
- b.counts[idx]++
- b.count++
- if value < b.min {
- b.min = value
- } else if value > b.max {
- b.max = value
- }
-}
-
-// histValues summarizes a set of measurements as an histValues with
-// explicitly defined buckets.
-type histValues[N int64 | float64] struct {
- noSum bool
- bounds []float64
-
- newRes func(attribute.Set) FilteredExemplarReservoir[N]
- limit limiter[*buckets[N]]
- values map[attribute.Distinct]*buckets[N]
- valuesMu sync.Mutex
-}
-
-func newHistValues[N int64 | float64](bounds []float64, noSum bool, limit int, r func(attribute.Set) FilteredExemplarReservoir[N]) *histValues[N] {
- // The responsibility of keeping all buckets correctly associated with the
- // passed boundaries is ultimately this type's responsibility. Make a copy
- // here so we can always guarantee this. Or, in the case of failure, have
- // complete control over the fix.
- b := slices.Clone(bounds)
- slices.Sort(b)
- return &histValues[N]{
- noSum: noSum,
- bounds: b,
- newRes: r,
- limit: newLimiter[*buckets[N]](limit),
- values: make(map[attribute.Distinct]*buckets[N]),
- }
-}
-
-// Aggregate records the measurement value, scoped by attr, and aggregates it
-// into a histogram.
-func (s *histValues[N]) measure(ctx context.Context, value N, fltrAttr attribute.Set, droppedAttr []attribute.KeyValue) {
- // This search will return an index in the range [0, len(s.bounds)], where
- // it will return len(s.bounds) if value is greater than the last element
- // of s.bounds. This aligns with the buckets in that the length of buckets
- // is len(s.bounds)+1, with the last bucket representing:
- // (s.bounds[len(s.bounds)-1], +∞).
- idx := sort.SearchFloat64s(s.bounds, float64(value))
-
- s.valuesMu.Lock()
- defer s.valuesMu.Unlock()
-
- attr := s.limit.Attributes(fltrAttr, s.values)
- b, ok := s.values[attr.Equivalent()]
- if !ok {
- // N+1 buckets. For example:
- //
- // bounds = [0, 5, 10]
- //
- // Then,
- //
- // buckets = (-∞, 0], (0, 5.0], (5.0, 10.0], (10.0, +∞)
- b = newBuckets[N](attr, len(s.bounds)+1)
- b.res = s.newRes(attr)
-
- // Ensure min and max are recorded values (not zero), for new buckets.
- b.min, b.max = value, value
- s.values[attr.Equivalent()] = b
- }
- b.bin(idx, value)
- if !s.noSum {
- b.sum(value)
- }
- b.res.Offer(ctx, value, droppedAttr)
-}
-
-// newHistogram returns an Aggregator that summarizes a set of measurements as
-// an histogram.
-func newHistogram[N int64 | float64](boundaries []float64, noMinMax, noSum bool, limit int, r func(attribute.Set) FilteredExemplarReservoir[N]) *histogram[N] {
- return &histogram[N]{
- histValues: newHistValues[N](boundaries, noSum, limit, r),
- noMinMax: noMinMax,
- start: now(),
- }
-}
-
-// histogram summarizes a set of measurements as an histogram with explicitly
-// defined buckets.
-type histogram[N int64 | float64] struct {
- *histValues[N]
-
- noMinMax bool
- start time.Time
-}
-
-func (s *histogram[N]) delta(dest *metricdata.Aggregation) int {
- t := now()
-
- // If *dest is not a metricdata.Histogram, memory reuse is missed. In that
- // case, use the zero-value h and hope for better alignment next cycle.
- h, _ := (*dest).(metricdata.Histogram[N])
- h.Temporality = metricdata.DeltaTemporality
-
- s.valuesMu.Lock()
- defer s.valuesMu.Unlock()
-
- // Do not allow modification of our copy of bounds.
- bounds := slices.Clone(s.bounds)
-
- n := len(s.values)
- hDPts := reset(h.DataPoints, n, n)
-
- var i int
- for _, val := range s.values {
- hDPts[i].Attributes = val.attrs
- hDPts[i].StartTime = s.start
- hDPts[i].Time = t
- hDPts[i].Count = val.count
- hDPts[i].Bounds = bounds
- hDPts[i].BucketCounts = val.counts
-
- if !s.noSum {
- hDPts[i].Sum = val.total
- }
-
- if !s.noMinMax {
- hDPts[i].Min = metricdata.NewExtrema(val.min)
- hDPts[i].Max = metricdata.NewExtrema(val.max)
- }
-
- collectExemplars(&hDPts[i].Exemplars, val.res.Collect)
-
- i++
- }
- // Unused attribute sets do not report.
- clear(s.values)
- // The delta collection cycle resets.
- s.start = t
-
- h.DataPoints = hDPts
- *dest = h
-
- return n
-}
-
-func (s *histogram[N]) cumulative(dest *metricdata.Aggregation) int {
- t := now()
-
- // If *dest is not a metricdata.Histogram, memory reuse is missed. In that
- // case, use the zero-value h and hope for better alignment next cycle.
- h, _ := (*dest).(metricdata.Histogram[N])
- h.Temporality = metricdata.CumulativeTemporality
-
- s.valuesMu.Lock()
- defer s.valuesMu.Unlock()
-
- // Do not allow modification of our copy of bounds.
- bounds := slices.Clone(s.bounds)
-
- n := len(s.values)
- hDPts := reset(h.DataPoints, n, n)
-
- var i int
- for _, val := range s.values {
- hDPts[i].Attributes = val.attrs
- hDPts[i].StartTime = s.start
- hDPts[i].Time = t
- hDPts[i].Count = val.count
- hDPts[i].Bounds = bounds
-
- // The HistogramDataPoint field values returned need to be copies of
- // the buckets value as we will keep updating them.
- //
- // TODO (#3047): Making copies for bounds and counts incurs a large
- // memory allocation footprint. Alternatives should be explored.
- hDPts[i].BucketCounts = slices.Clone(val.counts)
-
- if !s.noSum {
- hDPts[i].Sum = val.total
- }
-
- if !s.noMinMax {
- hDPts[i].Min = metricdata.NewExtrema(val.min)
- hDPts[i].Max = metricdata.NewExtrema(val.max)
- }
-
- collectExemplars(&hDPts[i].Exemplars, val.res.Collect)
-
- i++
- // TODO (#3006): This will use an unbounded amount of memory if there
- // are unbounded number of attribute sets being aggregated. Attribute
- // sets that become "stale" need to be forgotten so this will not
- // overload the system.
- }
-
- h.DataPoints = hDPts
- *dest = h
-
- return n
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/lastvalue.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/lastvalue.go
deleted file mode 100644
index d3a93f085..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/lastvalue.go
+++ /dev/null
@@ -1,161 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package aggregate // import "go.opentelemetry.io/otel/sdk/metric/internal/aggregate"
-
-import (
- "context"
- "sync"
- "time"
-
- "go.opentelemetry.io/otel/attribute"
- "go.opentelemetry.io/otel/sdk/metric/metricdata"
-)
-
-// datapoint is timestamped measurement data.
-type datapoint[N int64 | float64] struct {
- attrs attribute.Set
- value N
- res FilteredExemplarReservoir[N]
-}
-
-func newLastValue[N int64 | float64](limit int, r func(attribute.Set) FilteredExemplarReservoir[N]) *lastValue[N] {
- return &lastValue[N]{
- newRes: r,
- limit: newLimiter[datapoint[N]](limit),
- values: make(map[attribute.Distinct]datapoint[N]),
- start: now(),
- }
-}
-
-// lastValue summarizes a set of measurements as the last one made.
-type lastValue[N int64 | float64] struct {
- sync.Mutex
-
- newRes func(attribute.Set) FilteredExemplarReservoir[N]
- limit limiter[datapoint[N]]
- values map[attribute.Distinct]datapoint[N]
- start time.Time
-}
-
-func (s *lastValue[N]) measure(ctx context.Context, value N, fltrAttr attribute.Set, droppedAttr []attribute.KeyValue) {
- s.Lock()
- defer s.Unlock()
-
- attr := s.limit.Attributes(fltrAttr, s.values)
- d, ok := s.values[attr.Equivalent()]
- if !ok {
- d.res = s.newRes(attr)
- }
-
- d.attrs = attr
- d.value = value
- d.res.Offer(ctx, value, droppedAttr)
-
- s.values[attr.Equivalent()] = d
-}
-
-func (s *lastValue[N]) delta(dest *metricdata.Aggregation) int {
- t := now()
- // Ignore if dest is not a metricdata.Gauge. The chance for memory reuse of
- // the DataPoints is missed (better luck next time).
- gData, _ := (*dest).(metricdata.Gauge[N])
-
- s.Lock()
- defer s.Unlock()
-
- n := s.copyDpts(&gData.DataPoints, t)
- // Do not report stale values.
- clear(s.values)
- // Update start time for delta temporality.
- s.start = t
-
- *dest = gData
-
- return n
-}
-
-func (s *lastValue[N]) cumulative(dest *metricdata.Aggregation) int {
- t := now()
- // Ignore if dest is not a metricdata.Gauge. The chance for memory reuse of
- // the DataPoints is missed (better luck next time).
- gData, _ := (*dest).(metricdata.Gauge[N])
-
- s.Lock()
- defer s.Unlock()
-
- n := s.copyDpts(&gData.DataPoints, t)
- // TODO (#3006): This will use an unbounded amount of memory if there
- // are unbounded number of attribute sets being aggregated. Attribute
- // sets that become "stale" need to be forgotten so this will not
- // overload the system.
- *dest = gData
-
- return n
-}
-
-// copyDpts copies the datapoints held by s into dest. The number of datapoints
-// copied is returned.
-func (s *lastValue[N]) copyDpts(dest *[]metricdata.DataPoint[N], t time.Time) int {
- n := len(s.values)
- *dest = reset(*dest, n, n)
-
- var i int
- for _, v := range s.values {
- (*dest)[i].Attributes = v.attrs
- (*dest)[i].StartTime = s.start
- (*dest)[i].Time = t
- (*dest)[i].Value = v.value
- collectExemplars(&(*dest)[i].Exemplars, v.res.Collect)
- i++
- }
- return n
-}
-
-// newPrecomputedLastValue returns an aggregator that summarizes a set of
-// observations as the last one made.
-func newPrecomputedLastValue[N int64 | float64](limit int, r func(attribute.Set) FilteredExemplarReservoir[N]) *precomputedLastValue[N] {
- return &precomputedLastValue[N]{lastValue: newLastValue[N](limit, r)}
-}
-
-// precomputedLastValue summarizes a set of observations as the last one made.
-type precomputedLastValue[N int64 | float64] struct {
- *lastValue[N]
-}
-
-func (s *precomputedLastValue[N]) delta(dest *metricdata.Aggregation) int {
- t := now()
- // Ignore if dest is not a metricdata.Gauge. The chance for memory reuse of
- // the DataPoints is missed (better luck next time).
- gData, _ := (*dest).(metricdata.Gauge[N])
-
- s.Lock()
- defer s.Unlock()
-
- n := s.copyDpts(&gData.DataPoints, t)
- // Do not report stale values.
- clear(s.values)
- // Update start time for delta temporality.
- s.start = t
-
- *dest = gData
-
- return n
-}
-
-func (s *precomputedLastValue[N]) cumulative(dest *metricdata.Aggregation) int {
- t := now()
- // Ignore if dest is not a metricdata.Gauge. The chance for memory reuse of
- // the DataPoints is missed (better luck next time).
- gData, _ := (*dest).(metricdata.Gauge[N])
-
- s.Lock()
- defer s.Unlock()
-
- n := s.copyDpts(&gData.DataPoints, t)
- // Do not report stale values.
- clear(s.values)
- *dest = gData
-
- return n
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/limit.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/limit.go
deleted file mode 100644
index 9ea0251ed..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/limit.go
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package aggregate // import "go.opentelemetry.io/otel/sdk/metric/internal/aggregate"
-
-import "go.opentelemetry.io/otel/attribute"
-
-// overflowSet is the attribute set used to record a measurement when adding
-// another distinct attribute set to the aggregate would exceed the aggregate
-// limit.
-var overflowSet = attribute.NewSet(attribute.Bool("otel.metric.overflow", true))
-
-// limiter limits aggregate values.
-type limiter[V any] struct {
- // aggLimit is the maximum number of metric streams that can be aggregated.
- //
- // Any metric stream with attributes distinct from any set already
- // aggregated once the aggLimit will be meet will instead be aggregated
- // into an "overflow" metric stream. That stream will only contain the
- // "otel.metric.overflow"=true attribute.
- aggLimit int
-}
-
-// newLimiter returns a new Limiter with the provided aggregation limit.
-func newLimiter[V any](aggregation int) limiter[V] {
- return limiter[V]{aggLimit: aggregation}
-}
-
-// Attributes checks if adding a measurement for attrs will exceed the
-// aggregation cardinality limit for the existing measurements. If it will,
-// overflowSet is returned. Otherwise, if it will not exceed the limit, or the
-// limit is not set (limit <= 0), attr is returned.
-func (l limiter[V]) Attributes(attrs attribute.Set, measurements map[attribute.Distinct]V) attribute.Set {
- if l.aggLimit > 0 {
- _, exists := measurements[attrs.Equivalent()]
- if !exists && len(measurements) >= l.aggLimit-1 {
- return overflowSet
- }
- }
-
- return attrs
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/sum.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/sum.go
deleted file mode 100644
index 8e132ad61..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/sum.go
+++ /dev/null
@@ -1,237 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package aggregate // import "go.opentelemetry.io/otel/sdk/metric/internal/aggregate"
-
-import (
- "context"
- "sync"
- "time"
-
- "go.opentelemetry.io/otel/attribute"
- "go.opentelemetry.io/otel/sdk/metric/metricdata"
-)
-
-type sumValue[N int64 | float64] struct {
- n N
- res FilteredExemplarReservoir[N]
- attrs attribute.Set
-}
-
-// valueMap is the storage for sums.
-type valueMap[N int64 | float64] struct {
- sync.Mutex
- newRes func(attribute.Set) FilteredExemplarReservoir[N]
- limit limiter[sumValue[N]]
- values map[attribute.Distinct]sumValue[N]
-}
-
-func newValueMap[N int64 | float64](limit int, r func(attribute.Set) FilteredExemplarReservoir[N]) *valueMap[N] {
- return &valueMap[N]{
- newRes: r,
- limit: newLimiter[sumValue[N]](limit),
- values: make(map[attribute.Distinct]sumValue[N]),
- }
-}
-
-func (s *valueMap[N]) measure(ctx context.Context, value N, fltrAttr attribute.Set, droppedAttr []attribute.KeyValue) {
- s.Lock()
- defer s.Unlock()
-
- attr := s.limit.Attributes(fltrAttr, s.values)
- v, ok := s.values[attr.Equivalent()]
- if !ok {
- v.res = s.newRes(attr)
- }
-
- v.attrs = attr
- v.n += value
- v.res.Offer(ctx, value, droppedAttr)
-
- s.values[attr.Equivalent()] = v
-}
-
-// newSum returns an aggregator that summarizes a set of measurements as their
-// arithmetic sum. Each sum is scoped by attributes and the aggregation cycle
-// the measurements were made in.
-func newSum[N int64 | float64](monotonic bool, limit int, r func(attribute.Set) FilteredExemplarReservoir[N]) *sum[N] {
- return &sum[N]{
- valueMap: newValueMap[N](limit, r),
- monotonic: monotonic,
- start: now(),
- }
-}
-
-// sum summarizes a set of measurements made as their arithmetic sum.
-type sum[N int64 | float64] struct {
- *valueMap[N]
-
- monotonic bool
- start time.Time
-}
-
-func (s *sum[N]) delta(dest *metricdata.Aggregation) int {
- t := now()
-
- // If *dest is not a metricdata.Sum, memory reuse is missed. In that case,
- // use the zero-value sData and hope for better alignment next cycle.
- sData, _ := (*dest).(metricdata.Sum[N])
- sData.Temporality = metricdata.DeltaTemporality
- sData.IsMonotonic = s.monotonic
-
- s.Lock()
- defer s.Unlock()
-
- n := len(s.values)
- dPts := reset(sData.DataPoints, n, n)
-
- var i int
- for _, val := range s.values {
- dPts[i].Attributes = val.attrs
- dPts[i].StartTime = s.start
- dPts[i].Time = t
- dPts[i].Value = val.n
- collectExemplars(&dPts[i].Exemplars, val.res.Collect)
- i++
- }
- // Do not report stale values.
- clear(s.values)
- // The delta collection cycle resets.
- s.start = t
-
- sData.DataPoints = dPts
- *dest = sData
-
- return n
-}
-
-func (s *sum[N]) cumulative(dest *metricdata.Aggregation) int {
- t := now()
-
- // If *dest is not a metricdata.Sum, memory reuse is missed. In that case,
- // use the zero-value sData and hope for better alignment next cycle.
- sData, _ := (*dest).(metricdata.Sum[N])
- sData.Temporality = metricdata.CumulativeTemporality
- sData.IsMonotonic = s.monotonic
-
- s.Lock()
- defer s.Unlock()
-
- n := len(s.values)
- dPts := reset(sData.DataPoints, n, n)
-
- var i int
- for _, value := range s.values {
- dPts[i].Attributes = value.attrs
- dPts[i].StartTime = s.start
- dPts[i].Time = t
- dPts[i].Value = value.n
- collectExemplars(&dPts[i].Exemplars, value.res.Collect)
- // TODO (#3006): This will use an unbounded amount of memory if there
- // are unbounded number of attribute sets being aggregated. Attribute
- // sets that become "stale" need to be forgotten so this will not
- // overload the system.
- i++
- }
-
- sData.DataPoints = dPts
- *dest = sData
-
- return n
-}
-
-// newPrecomputedSum returns an aggregator that summarizes a set of
-// observations as their arithmetic sum. Each sum is scoped by attributes and
-// the aggregation cycle the measurements were made in.
-func newPrecomputedSum[N int64 | float64](monotonic bool, limit int, r func(attribute.Set) FilteredExemplarReservoir[N]) *precomputedSum[N] {
- return &precomputedSum[N]{
- valueMap: newValueMap[N](limit, r),
- monotonic: monotonic,
- start: now(),
- }
-}
-
-// precomputedSum summarizes a set of observations as their arithmetic sum.
-type precomputedSum[N int64 | float64] struct {
- *valueMap[N]
-
- monotonic bool
- start time.Time
-
- reported map[attribute.Distinct]N
-}
-
-func (s *precomputedSum[N]) delta(dest *metricdata.Aggregation) int {
- t := now()
- newReported := make(map[attribute.Distinct]N)
-
- // If *dest is not a metricdata.Sum, memory reuse is missed. In that case,
- // use the zero-value sData and hope for better alignment next cycle.
- sData, _ := (*dest).(metricdata.Sum[N])
- sData.Temporality = metricdata.DeltaTemporality
- sData.IsMonotonic = s.monotonic
-
- s.Lock()
- defer s.Unlock()
-
- n := len(s.values)
- dPts := reset(sData.DataPoints, n, n)
-
- var i int
- for key, value := range s.values {
- delta := value.n - s.reported[key]
-
- dPts[i].Attributes = value.attrs
- dPts[i].StartTime = s.start
- dPts[i].Time = t
- dPts[i].Value = delta
- collectExemplars(&dPts[i].Exemplars, value.res.Collect)
-
- newReported[key] = value.n
- i++
- }
- // Unused attribute sets do not report.
- clear(s.values)
- s.reported = newReported
- // The delta collection cycle resets.
- s.start = t
-
- sData.DataPoints = dPts
- *dest = sData
-
- return n
-}
-
-func (s *precomputedSum[N]) cumulative(dest *metricdata.Aggregation) int {
- t := now()
-
- // If *dest is not a metricdata.Sum, memory reuse is missed. In that case,
- // use the zero-value sData and hope for better alignment next cycle.
- sData, _ := (*dest).(metricdata.Sum[N])
- sData.Temporality = metricdata.CumulativeTemporality
- sData.IsMonotonic = s.monotonic
-
- s.Lock()
- defer s.Unlock()
-
- n := len(s.values)
- dPts := reset(sData.DataPoints, n, n)
-
- var i int
- for _, val := range s.values {
- dPts[i].Attributes = val.attrs
- dPts[i].StartTime = s.start
- dPts[i].Time = t
- dPts[i].Value = val.n
- collectExemplars(&dPts[i].Exemplars, val.res.Collect)
-
- i++
- }
- // Unused attribute sets do not report.
- clear(s.values)
-
- sData.DataPoints = dPts
- *dest = sData
-
- return n
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/reuse_slice.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/reuse_slice.go
deleted file mode 100644
index 19ec6806f..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/reuse_slice.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package internal // import "go.opentelemetry.io/otel/sdk/metric/internal"
-
-// ReuseSlice returns a zeroed view of slice if its capacity is greater than or
-// equal to n. Otherwise, it returns a new []T with capacity equal to n.
-func ReuseSlice[T any](slice []T, n int) []T {
- if cap(slice) >= n {
- return slice[:n]
- }
- return make([]T, n)
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/x/README.md b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/x/README.md
deleted file mode 100644
index 59f736b73..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/x/README.md
+++ /dev/null
@@ -1,131 +0,0 @@
-# Experimental Features
-
-The metric SDK contains features that have not yet stabilized in the OpenTelemetry specification.
-These features are added to the OpenTelemetry Go metric SDK prior to stabilization in the specification so that users can start experimenting with them and provide feedback.
-
-These feature may change in backwards incompatible ways as feedback is applied.
-See the [Compatibility and Stability](#compatibility-and-stability) section for more information.
-
-## Features
-
-- [Cardinality Limit](#cardinality-limit)
-- [Exemplars](#exemplars)
-- [Instrument Enabled](#instrument-enabled)
-
-### Cardinality Limit
-
-The cardinality limit is the hard limit on the number of metric streams that can be collected for a single instrument.
-
-This experimental feature can be enabled by setting the `OTEL_GO_X_CARDINALITY_LIMIT` environment value.
-The value must be an integer value.
-All other values are ignored.
-
-If the value set is less than or equal to `0`, no limit will be applied.
-
-#### Examples
-
-Set the cardinality limit to 2000.
-
-```console
-export OTEL_GO_X_CARDINALITY_LIMIT=2000
-```
-
-Set an infinite cardinality limit (functionally equivalent to disabling the feature).
-
-```console
-export OTEL_GO_X_CARDINALITY_LIMIT=-1
-```
-
-Disable the cardinality limit.
-
-```console
-unset OTEL_GO_X_CARDINALITY_LIMIT
-```
-
-### Exemplars
-
-A sample of measurements made may be exported directly as a set of exemplars.
-
-This experimental feature can be enabled by setting the `OTEL_GO_X_EXEMPLAR` environment variable.
-The value of must be the case-insensitive string of `"true"` to enable the feature.
-All other values are ignored.
-
-Exemplar filters are a supported.
-The exemplar filter applies to all measurements made.
-They filter these measurements, only allowing certain measurements to be passed to the underlying exemplar reservoir.
-
-To change the exemplar filter from the default `"trace_based"` filter set the `OTEL_METRICS_EXEMPLAR_FILTER` environment variable.
-The value must be the case-sensitive string defined by the [OpenTelemetry specification].
-
-- `"always_on"`: allows all measurements
-- `"always_off"`: denies all measurements
-- `"trace_based"`: allows only sampled measurements
-
-All values other than these will result in the default, `"trace_based"`, exemplar filter being used.
-
-[OpenTelemetry specification]: https://github.com/open-telemetry/opentelemetry-specification/blob/a6ca2fd484c9e76fe1d8e1c79c99f08f4745b5ee/specification/configuration/sdk-environment-variables.md#exemplar
-
-#### Examples
-
-Enable exemplars to be exported.
-
-```console
-export OTEL_GO_X_EXEMPLAR=true
-```
-
-Disable exemplars from being exported.
-
-```console
-unset OTEL_GO_X_EXEMPLAR
-```
-
-Set the exemplar filter to allow all measurements.
-
-```console
-export OTEL_METRICS_EXEMPLAR_FILTER=always_on
-```
-
-Set the exemplar filter to deny all measurements.
-
-```console
-export OTEL_METRICS_EXEMPLAR_FILTER=always_off
-```
-
-Set the exemplar filter to only allow sampled measurements.
-
-```console
-export OTEL_METRICS_EXEMPLAR_FILTER=trace_based
-```
-
-Revert to the default exemplar filter (`"trace_based"`)
-
-```console
-unset OTEL_METRICS_EXEMPLAR_FILTER
-```
-
-### Instrument Enabled
-
-To help users avoid performing computationally expensive operations when recording measurements, synchronous instruments provide an `Enabled` method.
-
-#### Examples
-
-The following code shows an example of how to check if an instrument implements the `EnabledInstrument` interface before using the `Enabled` function to avoid doing an expensive computation:
-
-```go
-type enabledInstrument interface { Enabled(context.Context) bool }
-
-ctr, err := m.Int64Counter("expensive-counter")
-c, ok := ctr.(enabledInstrument)
-if !ok || c.Enabled(context.Background()) {
- c.Add(expensiveComputation())
-}
-```
-
-## Compatibility and Stability
-
-Experimental features do not fall within the scope of the OpenTelemetry Go versioning and stability [policy](../../../../VERSIONING.md).
-These features may be removed or modified in successive version releases, including patch versions.
-
-When an experimental feature is promoted to a stable feature, a migration path will be included in the changelog entry of the release.
-There is no guarantee that any environment variable feature flags that enabled the experimental feature will be supported by the stable version.
-If they are supported, they may be accompanied with a deprecation notice stating a timeline for the removal of that support.
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/x/x.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/x/x.go
deleted file mode 100644
index a98606238..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/x/x.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-// Package x contains support for OTel metric SDK experimental features.
-//
-// This package should only be used for features defined in the specification.
-// It should not be used for experiments or new project ideas.
-package x // import "go.opentelemetry.io/otel/sdk/metric/internal/x"
-
-import (
- "context"
- "os"
- "strconv"
-)
-
-// CardinalityLimit is an experimental feature flag that defines if
-// cardinality limits should be applied to the recorded metric data-points.
-//
-// To enable this feature set the OTEL_GO_X_CARDINALITY_LIMIT environment
-// variable to the integer limit value you want to use.
-//
-// Setting OTEL_GO_X_CARDINALITY_LIMIT to a value less than or equal to 0
-// will disable the cardinality limits.
-var CardinalityLimit = newFeature("CARDINALITY_LIMIT", func(v string) (int, bool) {
- n, err := strconv.Atoi(v)
- if err != nil {
- return 0, false
- }
- return n, true
-})
-
-// Feature is an experimental feature control flag. It provides a uniform way
-// to interact with these feature flags and parse their values.
-type Feature[T any] struct {
- key string
- parse func(v string) (T, bool)
-}
-
-func newFeature[T any](suffix string, parse func(string) (T, bool)) Feature[T] {
- const envKeyRoot = "OTEL_GO_X_"
- return Feature[T]{
- key: envKeyRoot + suffix,
- parse: parse,
- }
-}
-
-// Key returns the environment variable key that needs to be set to enable the
-// feature.
-func (f Feature[T]) Key() string { return f.key }
-
-// Lookup returns the user configured value for the feature and true if the
-// user has enabled the feature. Otherwise, if the feature is not enabled, a
-// zero-value and false are returned.
-func (f Feature[T]) Lookup() (v T, ok bool) {
- // https://github.com/open-telemetry/opentelemetry-specification/blob/62effed618589a0bec416a87e559c0a9d96289bb/specification/configuration/sdk-environment-variables.md#parsing-empty-value
- //
- // > The SDK MUST interpret an empty value of an environment variable the
- // > same way as when the variable is unset.
- vRaw := os.Getenv(f.key)
- if vRaw == "" {
- return v, ok
- }
- return f.parse(vRaw)
-}
-
-// Enabled returns if the feature is enabled.
-func (f Feature[T]) Enabled() bool {
- _, ok := f.Lookup()
- return ok
-}
-
-// EnabledInstrument informs whether the instrument is enabled.
-//
-// EnabledInstrument interface is implemented by synchronous instruments.
-type EnabledInstrument interface {
- // Enabled returns whether the instrument will process measurements for the given context.
- //
- // This function can be used in places where measuring an instrument
- // would result in computationally expensive operations.
- Enabled(context.Context) bool
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/manual_reader.go b/vendor/go.opentelemetry.io/otel/sdk/metric/manual_reader.go
deleted file mode 100644
index c495985bc..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/manual_reader.go
+++ /dev/null
@@ -1,202 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package metric // import "go.opentelemetry.io/otel/sdk/metric"
-
-import (
- "context"
- "errors"
- "fmt"
- "sync"
- "sync/atomic"
-
- "go.opentelemetry.io/otel/internal/global"
- "go.opentelemetry.io/otel/sdk/metric/metricdata"
-)
-
-// ManualReader is a simple Reader that allows an application to
-// read metrics on demand.
-type ManualReader struct {
- sdkProducer atomic.Value
- shutdownOnce sync.Once
-
- mu sync.Mutex
- isShutdown bool
- externalProducers atomic.Value
-
- temporalitySelector TemporalitySelector
- aggregationSelector AggregationSelector
-}
-
-// Compile time check the manualReader implements Reader and is comparable.
-var _ = map[Reader]struct{}{&ManualReader{}: {}}
-
-// NewManualReader returns a Reader which is directly called to collect metrics.
-func NewManualReader(opts ...ManualReaderOption) *ManualReader {
- cfg := newManualReaderConfig(opts)
- r := &ManualReader{
- temporalitySelector: cfg.temporalitySelector,
- aggregationSelector: cfg.aggregationSelector,
- }
- r.externalProducers.Store(cfg.producers)
- return r
-}
-
-// register stores the sdkProducer which enables the caller
-// to read metrics from the SDK on demand.
-func (mr *ManualReader) register(p sdkProducer) {
- // Only register once. If producer is already set, do nothing.
- if !mr.sdkProducer.CompareAndSwap(nil, produceHolder{produce: p.produce}) {
- msg := "did not register manual reader"
- global.Error(errDuplicateRegister, msg)
- }
-}
-
-// temporality reports the Temporality for the instrument kind provided.
-func (mr *ManualReader) temporality(kind InstrumentKind) metricdata.Temporality {
- return mr.temporalitySelector(kind)
-}
-
-// aggregation returns what Aggregation to use for kind.
-func (mr *ManualReader) aggregation(kind InstrumentKind) Aggregation { // nolint:revive // import-shadow for method scoped by type.
- return mr.aggregationSelector(kind)
-}
-
-// Shutdown closes any connections and frees any resources used by the reader.
-//
-// This method is safe to call concurrently.
-func (mr *ManualReader) Shutdown(context.Context) error {
- err := ErrReaderShutdown
- mr.shutdownOnce.Do(func() {
- // Any future call to Collect will now return ErrReaderShutdown.
- mr.sdkProducer.Store(produceHolder{
- produce: shutdownProducer{}.produce,
- })
- mr.mu.Lock()
- defer mr.mu.Unlock()
- mr.isShutdown = true
- // release references to Producer(s)
- mr.externalProducers.Store([]Producer{})
- err = nil
- })
- return err
-}
-
-// Collect gathers all metric data related to the Reader from
-// the SDK and other Producers and stores the result in rm.
-//
-// Collect will return an error if called after shutdown.
-// Collect will return an error if rm is a nil ResourceMetrics.
-// Collect will return an error if the context's Done channel is closed.
-//
-// This method is safe to call concurrently.
-func (mr *ManualReader) Collect(ctx context.Context, rm *metricdata.ResourceMetrics) error {
- if rm == nil {
- return errors.New("manual reader: *metricdata.ResourceMetrics is nil")
- }
- p := mr.sdkProducer.Load()
- if p == nil {
- return ErrReaderNotRegistered
- }
-
- ph, ok := p.(produceHolder)
- if !ok {
- // The atomic.Value is entirely in the periodicReader's control so
- // this should never happen. In the unforeseen case that this does
- // happen, return an error instead of panicking so a users code does
- // not halt in the processes.
- err := fmt.Errorf("manual reader: invalid producer: %T", p)
- return err
- }
-
- err := ph.produce(ctx, rm)
- if err != nil {
- return err
- }
- for _, producer := range mr.externalProducers.Load().([]Producer) {
- externalMetrics, e := producer.Produce(ctx)
- if e != nil {
- err = errors.Join(err, e)
- }
- rm.ScopeMetrics = append(rm.ScopeMetrics, externalMetrics...)
- }
-
- global.Debug("ManualReader collection", "Data", rm)
-
- return err
-}
-
-// MarshalLog returns logging data about the ManualReader.
-func (r *ManualReader) MarshalLog() interface{} {
- r.mu.Lock()
- down := r.isShutdown
- r.mu.Unlock()
- return struct {
- Type string
- Registered bool
- Shutdown bool
- }{
- Type: "ManualReader",
- Registered: r.sdkProducer.Load() != nil,
- Shutdown: down,
- }
-}
-
-// manualReaderConfig contains configuration options for a ManualReader.
-type manualReaderConfig struct {
- temporalitySelector TemporalitySelector
- aggregationSelector AggregationSelector
- producers []Producer
-}
-
-// newManualReaderConfig returns a manualReaderConfig configured with options.
-func newManualReaderConfig(opts []ManualReaderOption) manualReaderConfig {
- cfg := manualReaderConfig{
- temporalitySelector: DefaultTemporalitySelector,
- aggregationSelector: DefaultAggregationSelector,
- }
- for _, opt := range opts {
- cfg = opt.applyManual(cfg)
- }
- return cfg
-}
-
-// ManualReaderOption applies a configuration option value to a ManualReader.
-type ManualReaderOption interface {
- applyManual(manualReaderConfig) manualReaderConfig
-}
-
-// WithTemporalitySelector sets the TemporalitySelector a reader will use to
-// determine the Temporality of an instrument based on its kind. If this
-// option is not used, the reader will use the DefaultTemporalitySelector.
-func WithTemporalitySelector(selector TemporalitySelector) ManualReaderOption {
- return temporalitySelectorOption{selector: selector}
-}
-
-type temporalitySelectorOption struct {
- selector func(instrument InstrumentKind) metricdata.Temporality
-}
-
-// applyManual returns a manualReaderConfig with option applied.
-func (t temporalitySelectorOption) applyManual(mrc manualReaderConfig) manualReaderConfig {
- mrc.temporalitySelector = t.selector
- return mrc
-}
-
-// WithAggregationSelector sets the AggregationSelector a reader will use to
-// determine the aggregation to use for an instrument based on its kind. If
-// this option is not used, the reader will use the DefaultAggregationSelector
-// or the aggregation explicitly passed for a view matching an instrument.
-func WithAggregationSelector(selector AggregationSelector) ManualReaderOption {
- return aggregationSelectorOption{selector: selector}
-}
-
-type aggregationSelectorOption struct {
- selector AggregationSelector
-}
-
-// applyManual returns a manualReaderConfig with option applied.
-func (t aggregationSelectorOption) applyManual(c manualReaderConfig) manualReaderConfig {
- c.aggregationSelector = t.selector
- return c
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/meter.go b/vendor/go.opentelemetry.io/otel/sdk/metric/meter.go
deleted file mode 100644
index a6ccd117b..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/meter.go
+++ /dev/null
@@ -1,736 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package metric // import "go.opentelemetry.io/otel/sdk/metric"
-
-import (
- "context"
- "errors"
- "fmt"
-
- "go.opentelemetry.io/otel/internal/global"
- "go.opentelemetry.io/otel/metric"
- "go.opentelemetry.io/otel/metric/embedded"
- "go.opentelemetry.io/otel/sdk/instrumentation"
-
- "go.opentelemetry.io/otel/sdk/metric/internal/aggregate"
-)
-
-// ErrInstrumentName indicates the created instrument has an invalid name.
-// Valid names must consist of 255 or fewer characters including alphanumeric, _, ., -, / and start with a letter.
-var ErrInstrumentName = errors.New("invalid instrument name")
-
-// meter handles the creation and coordination of all metric instruments. A
-// meter represents a single instrumentation scope; all metric telemetry
-// produced by an instrumentation scope will use metric instruments from a
-// single meter.
-type meter struct {
- embedded.Meter
-
- scope instrumentation.Scope
- pipes pipelines
-
- int64Insts *cacheWithErr[instID, *int64Inst]
- float64Insts *cacheWithErr[instID, *float64Inst]
- int64ObservableInsts *cacheWithErr[instID, int64Observable]
- float64ObservableInsts *cacheWithErr[instID, float64Observable]
-
- int64Resolver resolver[int64]
- float64Resolver resolver[float64]
-}
-
-func newMeter(s instrumentation.Scope, p pipelines) *meter {
- // viewCache ensures instrument conflicts, including number conflicts, this
- // meter is asked to create are logged to the user.
- var viewCache cache[string, instID]
-
- var int64Insts cacheWithErr[instID, *int64Inst]
- var float64Insts cacheWithErr[instID, *float64Inst]
- var int64ObservableInsts cacheWithErr[instID, int64Observable]
- var float64ObservableInsts cacheWithErr[instID, float64Observable]
-
- return &meter{
- scope: s,
- pipes: p,
- int64Insts: &int64Insts,
- float64Insts: &float64Insts,
- int64ObservableInsts: &int64ObservableInsts,
- float64ObservableInsts: &float64ObservableInsts,
- int64Resolver: newResolver[int64](p, &viewCache),
- float64Resolver: newResolver[float64](p, &viewCache),
- }
-}
-
-// Compile-time check meter implements metric.Meter.
-var _ metric.Meter = (*meter)(nil)
-
-// Int64Counter returns a new instrument identified by name and configured with
-// options. The instrument is used to synchronously record increasing int64
-// measurements during a computational operation.
-func (m *meter) Int64Counter(name string, options ...metric.Int64CounterOption) (metric.Int64Counter, error) {
- cfg := metric.NewInt64CounterConfig(options...)
- const kind = InstrumentKindCounter
- p := int64InstProvider{m}
- i, err := p.lookup(kind, name, cfg.Description(), cfg.Unit())
- if err != nil {
- return i, err
- }
-
- return i, validateInstrumentName(name)
-}
-
-// Int64UpDownCounter returns a new instrument identified by name and
-// configured with options. The instrument is used to synchronously record
-// int64 measurements during a computational operation.
-func (m *meter) Int64UpDownCounter(name string, options ...metric.Int64UpDownCounterOption) (metric.Int64UpDownCounter, error) {
- cfg := metric.NewInt64UpDownCounterConfig(options...)
- const kind = InstrumentKindUpDownCounter
- p := int64InstProvider{m}
- i, err := p.lookup(kind, name, cfg.Description(), cfg.Unit())
- if err != nil {
- return i, err
- }
-
- return i, validateInstrumentName(name)
-}
-
-// Int64Histogram returns a new instrument identified by name and configured
-// with options. The instrument is used to synchronously record the
-// distribution of int64 measurements during a computational operation.
-func (m *meter) Int64Histogram(name string, options ...metric.Int64HistogramOption) (metric.Int64Histogram, error) {
- cfg := metric.NewInt64HistogramConfig(options...)
- p := int64InstProvider{m}
- i, err := p.lookupHistogram(name, cfg)
- if err != nil {
- return i, err
- }
-
- return i, validateInstrumentName(name)
-}
-
-// Int64Gauge returns a new instrument identified by name and configured
-// with options. The instrument is used to synchronously record the
-// distribution of int64 measurements during a computational operation.
-func (m *meter) Int64Gauge(name string, options ...metric.Int64GaugeOption) (metric.Int64Gauge, error) {
- cfg := metric.NewInt64GaugeConfig(options...)
- const kind = InstrumentKindGauge
- p := int64InstProvider{m}
- i, err := p.lookup(kind, name, cfg.Description(), cfg.Unit())
- if err != nil {
- return i, err
- }
-
- return i, validateInstrumentName(name)
-}
-
-// int64ObservableInstrument returns a new observable identified by the Instrument.
-// It registers callbacks for each reader's pipeline.
-func (m *meter) int64ObservableInstrument(id Instrument, callbacks []metric.Int64Callback) (int64Observable, error) {
- key := instID{
- Name: id.Name,
- Description: id.Description,
- Unit: id.Unit,
- Kind: id.Kind,
- }
- if m.int64ObservableInsts.HasKey(key) && len(callbacks) > 0 {
- warnRepeatedObservableCallbacks(id)
- }
- return m.int64ObservableInsts.Lookup(key, func() (int64Observable, error) {
- inst := newInt64Observable(m, id.Kind, id.Name, id.Description, id.Unit)
- for _, insert := range m.int64Resolver.inserters {
- // Connect the measure functions for instruments in this pipeline with the
- // callbacks for this pipeline.
- in, err := insert.Instrument(id, insert.readerDefaultAggregation(id.Kind))
- if err != nil {
- return inst, err
- }
- // Drop aggregation
- if len(in) == 0 {
- inst.dropAggregation = true
- continue
- }
- inst.appendMeasures(in)
-
- // Add the measures to the pipeline. It is required to maintain
- // measures per pipeline to avoid calling the measure that
- // is not part of the pipeline.
- insert.pipeline.addInt64Measure(inst.observableID, in)
- for _, cback := range callbacks {
- inst := int64Observer{measures: in}
- fn := cback
- insert.addCallback(func(ctx context.Context) error { return fn(ctx, inst) })
- }
- }
- return inst, validateInstrumentName(id.Name)
- })
-}
-
-// Int64ObservableCounter returns a new instrument identified by name and
-// configured with options. The instrument is used to asynchronously record
-// increasing int64 measurements once per a measurement collection cycle.
-// Only the measurements recorded during the collection cycle are exported.
-//
-// If Int64ObservableCounter is invoked repeatedly with the same Name,
-// Description, and Unit, only the first set of callbacks provided are used.
-// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
-// if instrumentation can be created multiple times with different callbacks.
-func (m *meter) Int64ObservableCounter(name string, options ...metric.Int64ObservableCounterOption) (metric.Int64ObservableCounter, error) {
- cfg := metric.NewInt64ObservableCounterConfig(options...)
- id := Instrument{
- Name: name,
- Description: cfg.Description(),
- Unit: cfg.Unit(),
- Kind: InstrumentKindObservableCounter,
- Scope: m.scope,
- }
- return m.int64ObservableInstrument(id, cfg.Callbacks())
-}
-
-// Int64ObservableUpDownCounter returns a new instrument identified by name and
-// configured with options. The instrument is used to asynchronously record
-// int64 measurements once per a measurement collection cycle. Only the
-// measurements recorded during the collection cycle are exported.
-//
-// If Int64ObservableUpDownCounter is invoked repeatedly with the same Name,
-// Description, and Unit, only the first set of callbacks provided are used.
-// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
-// if instrumentation can be created multiple times with different callbacks.
-func (m *meter) Int64ObservableUpDownCounter(name string, options ...metric.Int64ObservableUpDownCounterOption) (metric.Int64ObservableUpDownCounter, error) {
- cfg := metric.NewInt64ObservableUpDownCounterConfig(options...)
- id := Instrument{
- Name: name,
- Description: cfg.Description(),
- Unit: cfg.Unit(),
- Kind: InstrumentKindObservableUpDownCounter,
- Scope: m.scope,
- }
- return m.int64ObservableInstrument(id, cfg.Callbacks())
-}
-
-// Int64ObservableGauge returns a new instrument identified by name and
-// configured with options. The instrument is used to asynchronously record
-// instantaneous int64 measurements once per a measurement collection cycle.
-// Only the measurements recorded during the collection cycle are exported.
-//
-// If Int64ObservableGauge is invoked repeatedly with the same Name,
-// Description, and Unit, only the first set of callbacks provided are used.
-// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
-// if instrumentation can be created multiple times with different callbacks.
-func (m *meter) Int64ObservableGauge(name string, options ...metric.Int64ObservableGaugeOption) (metric.Int64ObservableGauge, error) {
- cfg := metric.NewInt64ObservableGaugeConfig(options...)
- id := Instrument{
- Name: name,
- Description: cfg.Description(),
- Unit: cfg.Unit(),
- Kind: InstrumentKindObservableGauge,
- Scope: m.scope,
- }
- return m.int64ObservableInstrument(id, cfg.Callbacks())
-}
-
-// Float64Counter returns a new instrument identified by name and configured
-// with options. The instrument is used to synchronously record increasing
-// float64 measurements during a computational operation.
-func (m *meter) Float64Counter(name string, options ...metric.Float64CounterOption) (metric.Float64Counter, error) {
- cfg := metric.NewFloat64CounterConfig(options...)
- const kind = InstrumentKindCounter
- p := float64InstProvider{m}
- i, err := p.lookup(kind, name, cfg.Description(), cfg.Unit())
- if err != nil {
- return i, err
- }
-
- return i, validateInstrumentName(name)
-}
-
-// Float64UpDownCounter returns a new instrument identified by name and
-// configured with options. The instrument is used to synchronously record
-// float64 measurements during a computational operation.
-func (m *meter) Float64UpDownCounter(name string, options ...metric.Float64UpDownCounterOption) (metric.Float64UpDownCounter, error) {
- cfg := metric.NewFloat64UpDownCounterConfig(options...)
- const kind = InstrumentKindUpDownCounter
- p := float64InstProvider{m}
- i, err := p.lookup(kind, name, cfg.Description(), cfg.Unit())
- if err != nil {
- return i, err
- }
-
- return i, validateInstrumentName(name)
-}
-
-// Float64Histogram returns a new instrument identified by name and configured
-// with options. The instrument is used to synchronously record the
-// distribution of float64 measurements during a computational operation.
-func (m *meter) Float64Histogram(name string, options ...metric.Float64HistogramOption) (metric.Float64Histogram, error) {
- cfg := metric.NewFloat64HistogramConfig(options...)
- p := float64InstProvider{m}
- i, err := p.lookupHistogram(name, cfg)
- if err != nil {
- return i, err
- }
-
- return i, validateInstrumentName(name)
-}
-
-// Float64Gauge returns a new instrument identified by name and configured
-// with options. The instrument is used to synchronously record the
-// distribution of float64 measurements during a computational operation.
-func (m *meter) Float64Gauge(name string, options ...metric.Float64GaugeOption) (metric.Float64Gauge, error) {
- cfg := metric.NewFloat64GaugeConfig(options...)
- const kind = InstrumentKindGauge
- p := float64InstProvider{m}
- i, err := p.lookup(kind, name, cfg.Description(), cfg.Unit())
- if err != nil {
- return i, err
- }
-
- return i, validateInstrumentName(name)
-}
-
-// float64ObservableInstrument returns a new observable identified by the Instrument.
-// It registers callbacks for each reader's pipeline.
-func (m *meter) float64ObservableInstrument(id Instrument, callbacks []metric.Float64Callback) (float64Observable, error) {
- key := instID{
- Name: id.Name,
- Description: id.Description,
- Unit: id.Unit,
- Kind: id.Kind,
- }
- if m.int64ObservableInsts.HasKey(key) && len(callbacks) > 0 {
- warnRepeatedObservableCallbacks(id)
- }
- return m.float64ObservableInsts.Lookup(key, func() (float64Observable, error) {
- inst := newFloat64Observable(m, id.Kind, id.Name, id.Description, id.Unit)
- for _, insert := range m.float64Resolver.inserters {
- // Connect the measure functions for instruments in this pipeline with the
- // callbacks for this pipeline.
- in, err := insert.Instrument(id, insert.readerDefaultAggregation(id.Kind))
- if err != nil {
- return inst, err
- }
- // Drop aggregation
- if len(in) == 0 {
- inst.dropAggregation = true
- continue
- }
- inst.appendMeasures(in)
-
- // Add the measures to the pipeline. It is required to maintain
- // measures per pipeline to avoid calling the measure that
- // is not part of the pipeline.
- insert.pipeline.addFloat64Measure(inst.observableID, in)
- for _, cback := range callbacks {
- inst := float64Observer{measures: in}
- fn := cback
- insert.addCallback(func(ctx context.Context) error { return fn(ctx, inst) })
- }
- }
- return inst, validateInstrumentName(id.Name)
- })
-}
-
-// Float64ObservableCounter returns a new instrument identified by name and
-// configured with options. The instrument is used to asynchronously record
-// increasing float64 measurements once per a measurement collection cycle.
-// Only the measurements recorded during the collection cycle are exported.
-//
-// If Float64ObservableCounter is invoked repeatedly with the same Name,
-// Description, and Unit, only the first set of callbacks provided are used.
-// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
-// if instrumentation can be created multiple times with different callbacks.
-func (m *meter) Float64ObservableCounter(name string, options ...metric.Float64ObservableCounterOption) (metric.Float64ObservableCounter, error) {
- cfg := metric.NewFloat64ObservableCounterConfig(options...)
- id := Instrument{
- Name: name,
- Description: cfg.Description(),
- Unit: cfg.Unit(),
- Kind: InstrumentKindObservableCounter,
- Scope: m.scope,
- }
- return m.float64ObservableInstrument(id, cfg.Callbacks())
-}
-
-// Float64ObservableUpDownCounter returns a new instrument identified by name
-// and configured with options. The instrument is used to asynchronously record
-// float64 measurements once per a measurement collection cycle. Only the
-// measurements recorded during the collection cycle are exported.
-//
-// If Float64ObservableUpDownCounter is invoked repeatedly with the same Name,
-// Description, and Unit, only the first set of callbacks provided are used.
-// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
-// if instrumentation can be created multiple times with different callbacks.
-func (m *meter) Float64ObservableUpDownCounter(name string, options ...metric.Float64ObservableUpDownCounterOption) (metric.Float64ObservableUpDownCounter, error) {
- cfg := metric.NewFloat64ObservableUpDownCounterConfig(options...)
- id := Instrument{
- Name: name,
- Description: cfg.Description(),
- Unit: cfg.Unit(),
- Kind: InstrumentKindObservableUpDownCounter,
- Scope: m.scope,
- }
- return m.float64ObservableInstrument(id, cfg.Callbacks())
-}
-
-// Float64ObservableGauge returns a new instrument identified by name and
-// configured with options. The instrument is used to asynchronously record
-// instantaneous float64 measurements once per a measurement collection cycle.
-// Only the measurements recorded during the collection cycle are exported.
-//
-// If Float64ObservableGauge is invoked repeatedly with the same Name,
-// Description, and Unit, only the first set of callbacks provided are used.
-// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
-// if instrumentation can be created multiple times with different callbacks.
-func (m *meter) Float64ObservableGauge(name string, options ...metric.Float64ObservableGaugeOption) (metric.Float64ObservableGauge, error) {
- cfg := metric.NewFloat64ObservableGaugeConfig(options...)
- id := Instrument{
- Name: name,
- Description: cfg.Description(),
- Unit: cfg.Unit(),
- Kind: InstrumentKindObservableGauge,
- Scope: m.scope,
- }
- return m.float64ObservableInstrument(id, cfg.Callbacks())
-}
-
-func validateInstrumentName(name string) error {
- if len(name) == 0 {
- return fmt.Errorf("%w: %s: is empty", ErrInstrumentName, name)
- }
- if len(name) > 255 {
- return fmt.Errorf("%w: %s: longer than 255 characters", ErrInstrumentName, name)
- }
- if !isAlpha([]rune(name)[0]) {
- return fmt.Errorf("%w: %s: must start with a letter", ErrInstrumentName, name)
- }
- if len(name) == 1 {
- return nil
- }
- for _, c := range name[1:] {
- if !isAlphanumeric(c) && c != '_' && c != '.' && c != '-' && c != '/' {
- return fmt.Errorf("%w: %s: must only contain [A-Za-z0-9_.-/]", ErrInstrumentName, name)
- }
- }
- return nil
-}
-
-func isAlpha(c rune) bool {
- return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')
-}
-
-func isAlphanumeric(c rune) bool {
- return isAlpha(c) || ('0' <= c && c <= '9')
-}
-
-func warnRepeatedObservableCallbacks(id Instrument) {
- inst := fmt.Sprintf(
- "Instrument{Name: %q, Description: %q, Kind: %q, Unit: %q}",
- id.Name, id.Description, "InstrumentKind"+id.Kind.String(), id.Unit,
- )
- global.Warn("Repeated observable instrument creation with callbacks. Ignoring new callbacks. Use meter.RegisterCallback and Registration.Unregister to manage callbacks.",
- "instrument", inst,
- )
-}
-
-// RegisterCallback registers f to be called each collection cycle so it will
-// make observations for insts during those cycles.
-//
-// The only instruments f can make observations for are insts. All other
-// observations will be dropped and an error will be logged.
-//
-// Only instruments from this meter can be registered with f, an error is
-// returned if other instrument are provided.
-//
-// Only observations made in the callback will be exported. Unlike synchronous
-// instruments, asynchronous callbacks can "forget" attribute sets that are no
-// longer relevant by omitting the observation during the callback.
-//
-// The returned Registration can be used to unregister f.
-func (m *meter) RegisterCallback(f metric.Callback, insts ...metric.Observable) (metric.Registration, error) {
- if len(insts) == 0 {
- // Don't allocate a observer if not needed.
- return noopRegister{}, nil
- }
-
- var err error
- validInstruments := make([]metric.Observable, 0, len(insts))
- for _, inst := range insts {
- switch o := inst.(type) {
- case int64Observable:
- if e := o.registerable(m); e != nil {
- if !errors.Is(e, errEmptyAgg) {
- err = errors.Join(err, e)
- }
- continue
- }
-
- validInstruments = append(validInstruments, inst)
- case float64Observable:
- if e := o.registerable(m); e != nil {
- if !errors.Is(e, errEmptyAgg) {
- err = errors.Join(err, e)
- }
- continue
- }
-
- validInstruments = append(validInstruments, inst)
- default:
- // Instrument external to the SDK.
- return nil, errors.New("invalid observable: from different implementation")
- }
- }
-
- if len(validInstruments) == 0 {
- // All insts use drop aggregation or are invalid.
- return noopRegister{}, err
- }
-
- unregs := make([]func(), len(m.pipes))
- for ix, pipe := range m.pipes {
- reg := newObserver(pipe)
- for _, inst := range validInstruments {
- switch o := inst.(type) {
- case int64Observable:
- reg.registerInt64(o.observableID)
- case float64Observable:
- reg.registerFloat64(o.observableID)
- }
- }
-
- // Some or all instruments were valid.
- cBack := func(ctx context.Context) error { return f(ctx, reg) }
- unregs[ix] = pipe.addMultiCallback(cBack)
- }
-
- return unregisterFuncs{f: unregs}, err
-}
-
-type observer struct {
- embedded.Observer
-
- pipe *pipeline
- float64 map[observableID[float64]]struct{}
- int64 map[observableID[int64]]struct{}
-}
-
-func newObserver(p *pipeline) observer {
- return observer{
- pipe: p,
- float64: make(map[observableID[float64]]struct{}),
- int64: make(map[observableID[int64]]struct{}),
- }
-}
-
-func (r observer) registerFloat64(id observableID[float64]) {
- r.float64[id] = struct{}{}
-}
-
-func (r observer) registerInt64(id observableID[int64]) {
- r.int64[id] = struct{}{}
-}
-
-var (
- errUnknownObserver = errors.New("unknown observable instrument")
- errUnregObserver = errors.New("observable instrument not registered for callback")
-)
-
-func (r observer) ObserveFloat64(o metric.Float64Observable, v float64, opts ...metric.ObserveOption) {
- var oImpl float64Observable
- switch conv := o.(type) {
- case float64Observable:
- oImpl = conv
- default:
- global.Error(errUnknownObserver, "failed to record")
- return
- }
-
- if _, registered := r.float64[oImpl.observableID]; !registered {
- if !oImpl.dropAggregation {
- global.Error(errUnregObserver, "failed to record",
- "name", oImpl.name,
- "description", oImpl.description,
- "unit", oImpl.unit,
- "number", fmt.Sprintf("%T", float64(0)),
- )
- }
- return
- }
- c := metric.NewObserveConfig(opts)
- // Access to r.pipe.float64Measure is already guarded by a lock in pipeline.produce.
- // TODO (#5946): Refactor pipeline and observable measures.
- measures := r.pipe.float64Measures[oImpl.observableID]
- for _, m := range measures {
- m(context.Background(), v, c.Attributes())
- }
-}
-
-func (r observer) ObserveInt64(o metric.Int64Observable, v int64, opts ...metric.ObserveOption) {
- var oImpl int64Observable
- switch conv := o.(type) {
- case int64Observable:
- oImpl = conv
- default:
- global.Error(errUnknownObserver, "failed to record")
- return
- }
-
- if _, registered := r.int64[oImpl.observableID]; !registered {
- if !oImpl.dropAggregation {
- global.Error(errUnregObserver, "failed to record",
- "name", oImpl.name,
- "description", oImpl.description,
- "unit", oImpl.unit,
- "number", fmt.Sprintf("%T", int64(0)),
- )
- }
- return
- }
- c := metric.NewObserveConfig(opts)
- // Access to r.pipe.int64Measures is already guarded b a lock in pipeline.produce.
- // TODO (#5946): Refactor pipeline and observable measures.
- measures := r.pipe.int64Measures[oImpl.observableID]
- for _, m := range measures {
- m(context.Background(), v, c.Attributes())
- }
-}
-
-type noopRegister struct{ embedded.Registration }
-
-func (noopRegister) Unregister() error {
- return nil
-}
-
-// int64InstProvider provides int64 OpenTelemetry instruments.
-type int64InstProvider struct{ *meter }
-
-func (p int64InstProvider) aggs(kind InstrumentKind, name, desc, u string) ([]aggregate.Measure[int64], error) {
- inst := Instrument{
- Name: name,
- Description: desc,
- Unit: u,
- Kind: kind,
- Scope: p.scope,
- }
- return p.int64Resolver.Aggregators(inst)
-}
-
-func (p int64InstProvider) histogramAggs(name string, cfg metric.Int64HistogramConfig) ([]aggregate.Measure[int64], error) {
- boundaries := cfg.ExplicitBucketBoundaries()
- aggError := AggregationExplicitBucketHistogram{Boundaries: boundaries}.err()
- if aggError != nil {
- // If boundaries are invalid, ignore them.
- boundaries = nil
- }
- inst := Instrument{
- Name: name,
- Description: cfg.Description(),
- Unit: cfg.Unit(),
- Kind: InstrumentKindHistogram,
- Scope: p.scope,
- }
- measures, err := p.int64Resolver.HistogramAggregators(inst, boundaries)
- return measures, errors.Join(aggError, err)
-}
-
-// lookup returns the resolved instrumentImpl.
-func (p int64InstProvider) lookup(kind InstrumentKind, name, desc, u string) (*int64Inst, error) {
- return p.meter.int64Insts.Lookup(instID{
- Name: name,
- Description: desc,
- Unit: u,
- Kind: kind,
- }, func() (*int64Inst, error) {
- aggs, err := p.aggs(kind, name, desc, u)
- return &int64Inst{measures: aggs}, err
- })
-}
-
-// lookupHistogram returns the resolved instrumentImpl.
-func (p int64InstProvider) lookupHistogram(name string, cfg metric.Int64HistogramConfig) (*int64Inst, error) {
- return p.meter.int64Insts.Lookup(instID{
- Name: name,
- Description: cfg.Description(),
- Unit: cfg.Unit(),
- Kind: InstrumentKindHistogram,
- }, func() (*int64Inst, error) {
- aggs, err := p.histogramAggs(name, cfg)
- return &int64Inst{measures: aggs}, err
- })
-}
-
-// float64InstProvider provides float64 OpenTelemetry instruments.
-type float64InstProvider struct{ *meter }
-
-func (p float64InstProvider) aggs(kind InstrumentKind, name, desc, u string) ([]aggregate.Measure[float64], error) {
- inst := Instrument{
- Name: name,
- Description: desc,
- Unit: u,
- Kind: kind,
- Scope: p.scope,
- }
- return p.float64Resolver.Aggregators(inst)
-}
-
-func (p float64InstProvider) histogramAggs(name string, cfg metric.Float64HistogramConfig) ([]aggregate.Measure[float64], error) {
- boundaries := cfg.ExplicitBucketBoundaries()
- aggError := AggregationExplicitBucketHistogram{Boundaries: boundaries}.err()
- if aggError != nil {
- // If boundaries are invalid, ignore them.
- boundaries = nil
- }
- inst := Instrument{
- Name: name,
- Description: cfg.Description(),
- Unit: cfg.Unit(),
- Kind: InstrumentKindHistogram,
- Scope: p.scope,
- }
- measures, err := p.float64Resolver.HistogramAggregators(inst, boundaries)
- return measures, errors.Join(aggError, err)
-}
-
-// lookup returns the resolved instrumentImpl.
-func (p float64InstProvider) lookup(kind InstrumentKind, name, desc, u string) (*float64Inst, error) {
- return p.meter.float64Insts.Lookup(instID{
- Name: name,
- Description: desc,
- Unit: u,
- Kind: kind,
- }, func() (*float64Inst, error) {
- aggs, err := p.aggs(kind, name, desc, u)
- return &float64Inst{measures: aggs}, err
- })
-}
-
-// lookupHistogram returns the resolved instrumentImpl.
-func (p float64InstProvider) lookupHistogram(name string, cfg metric.Float64HistogramConfig) (*float64Inst, error) {
- return p.meter.float64Insts.Lookup(instID{
- Name: name,
- Description: cfg.Description(),
- Unit: cfg.Unit(),
- Kind: InstrumentKindHistogram,
- }, func() (*float64Inst, error) {
- aggs, err := p.histogramAggs(name, cfg)
- return &float64Inst{measures: aggs}, err
- })
-}
-
-type int64Observer struct {
- embedded.Int64Observer
- measures[int64]
-}
-
-func (o int64Observer) Observe(val int64, opts ...metric.ObserveOption) {
- c := metric.NewObserveConfig(opts)
- o.observe(val, c.Attributes())
-}
-
-type float64Observer struct {
- embedded.Float64Observer
- measures[float64]
-}
-
-func (o float64Observer) Observe(val float64, opts ...metric.ObserveOption) {
- c := metric.NewObserveConfig(opts)
- o.observe(val, c.Attributes())
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/README.md b/vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/README.md
deleted file mode 100644
index d1390df1b..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# SDK Metric data
-
-[![PkgGoDev](https://pkg.go.dev/badge/go.opentelemetry.io/otel/sdk/metric/metricdata)](https://pkg.go.dev/go.opentelemetry.io/otel/sdk/metric/metricdata)
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/data.go b/vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/data.go
deleted file mode 100644
index d32cfc67d..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/data.go
+++ /dev/null
@@ -1,296 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package metricdata // import "go.opentelemetry.io/otel/sdk/metric/metricdata"
-
-import (
- "encoding/json"
- "time"
-
- "go.opentelemetry.io/otel/attribute"
- "go.opentelemetry.io/otel/sdk/instrumentation"
- "go.opentelemetry.io/otel/sdk/resource"
-)
-
-// ResourceMetrics is a collection of ScopeMetrics and the associated Resource
-// that created them.
-type ResourceMetrics struct {
- // Resource represents the entity that collected the metrics.
- Resource *resource.Resource
- // ScopeMetrics are the collection of metrics with unique Scopes.
- ScopeMetrics []ScopeMetrics
-}
-
-// ScopeMetrics is a collection of Metrics Produces by a Meter.
-type ScopeMetrics struct {
- // Scope is the Scope that the Meter was created with.
- Scope instrumentation.Scope
- // Metrics are a list of aggregations created by the Meter.
- Metrics []Metrics
-}
-
-// Metrics is a collection of one or more aggregated timeseries from an Instrument.
-type Metrics struct {
- // Name is the name of the Instrument that created this data.
- Name string
- // Description is the description of the Instrument, which can be used in documentation.
- Description string
- // Unit is the unit in which the Instrument reports.
- Unit string
- // Data is the aggregated data from an Instrument.
- Data Aggregation
-}
-
-// Aggregation is the store of data reported by an Instrument.
-// It will be one of: Gauge, Sum, Histogram.
-type Aggregation interface {
- privateAggregation()
-}
-
-// Gauge represents a measurement of the current value of an instrument.
-type Gauge[N int64 | float64] struct {
- // DataPoints are the individual aggregated measurements with unique
- // Attributes.
- DataPoints []DataPoint[N]
-}
-
-func (Gauge[N]) privateAggregation() {}
-
-// Sum represents the sum of all measurements of values from an instrument.
-type Sum[N int64 | float64] struct {
- // DataPoints are the individual aggregated measurements with unique
- // Attributes.
- DataPoints []DataPoint[N]
- // Temporality describes if the aggregation is reported as the change from the
- // last report time, or the cumulative changes since a fixed start time.
- Temporality Temporality
- // IsMonotonic represents if this aggregation only increases or decreases.
- IsMonotonic bool
-}
-
-func (Sum[N]) privateAggregation() {}
-
-// DataPoint is a single data point in a timeseries.
-type DataPoint[N int64 | float64] struct {
- // Attributes is the set of key value pairs that uniquely identify the
- // timeseries.
- Attributes attribute.Set
- // StartTime is when the timeseries was started. (optional)
- StartTime time.Time `json:",omitempty"`
- // Time is the time when the timeseries was recorded. (optional)
- Time time.Time `json:",omitempty"`
- // Value is the value of this data point.
- Value N
-
- // Exemplars is the sampled Exemplars collected during the timeseries.
- Exemplars []Exemplar[N] `json:",omitempty"`
-}
-
-// Histogram represents the histogram of all measurements of values from an instrument.
-type Histogram[N int64 | float64] struct {
- // DataPoints are the individual aggregated measurements with unique
- // Attributes.
- DataPoints []HistogramDataPoint[N]
- // Temporality describes if the aggregation is reported as the change from the
- // last report time, or the cumulative changes since a fixed start time.
- Temporality Temporality
-}
-
-func (Histogram[N]) privateAggregation() {}
-
-// HistogramDataPoint is a single histogram data point in a timeseries.
-type HistogramDataPoint[N int64 | float64] struct {
- // Attributes is the set of key value pairs that uniquely identify the
- // timeseries.
- Attributes attribute.Set
- // StartTime is when the timeseries was started.
- StartTime time.Time
- // Time is the time when the timeseries was recorded.
- Time time.Time
-
- // Count is the number of updates this histogram has been calculated with.
- Count uint64
- // Bounds are the upper bounds of the buckets of the histogram. Because the
- // last boundary is +infinity this one is implied.
- Bounds []float64
- // BucketCounts is the count of each of the buckets.
- BucketCounts []uint64
-
- // Min is the minimum value recorded. (optional)
- Min Extrema[N]
- // Max is the maximum value recorded. (optional)
- Max Extrema[N]
- // Sum is the sum of the values recorded.
- Sum N
-
- // Exemplars is the sampled Exemplars collected during the timeseries.
- Exemplars []Exemplar[N] `json:",omitempty"`
-}
-
-// ExponentialHistogram represents the histogram of all measurements of values from an instrument.
-type ExponentialHistogram[N int64 | float64] struct {
- // DataPoints are the individual aggregated measurements with unique
- // attributes.
- DataPoints []ExponentialHistogramDataPoint[N]
- // Temporality describes if the aggregation is reported as the change from the
- // last report time, or the cumulative changes since a fixed start time.
- Temporality Temporality
-}
-
-func (ExponentialHistogram[N]) privateAggregation() {}
-
-// ExponentialHistogramDataPoint is a single exponential histogram data point in a timeseries.
-type ExponentialHistogramDataPoint[N int64 | float64] struct {
- // Attributes is the set of key value pairs that uniquely identify the
- // timeseries.
- Attributes attribute.Set
- // StartTime is when the timeseries was started.
- StartTime time.Time
- // Time is the time when the timeseries was recorded.
- Time time.Time
-
- // Count is the number of updates this histogram has been calculated with.
- Count uint64
- // Min is the minimum value recorded. (optional)
- Min Extrema[N]
- // Max is the maximum value recorded. (optional)
- Max Extrema[N]
- // Sum is the sum of the values recorded.
- Sum N
-
- // Scale describes the resolution of the histogram. Boundaries are
- // located at powers of the base, where:
- //
- // base = 2 ^ (2 ^ -Scale)
- Scale int32
- // ZeroCount is the number of values whose absolute value
- // is less than or equal to [ZeroThreshold].
- // When ZeroThreshold is 0, this is the number of values that
- // cannot be expressed using the standard exponential formula
- // as well as values that have been rounded to zero.
- // ZeroCount represents the special zero count bucket.
- ZeroCount uint64
-
- // PositiveBucket is range of positive value bucket counts.
- PositiveBucket ExponentialBucket
- // NegativeBucket is range of negative value bucket counts.
- NegativeBucket ExponentialBucket
-
- // ZeroThreshold is the width of the zero region. Where the zero region is
- // defined as the closed interval [-ZeroThreshold, ZeroThreshold].
- ZeroThreshold float64
-
- // Exemplars is the sampled Exemplars collected during the timeseries.
- Exemplars []Exemplar[N] `json:",omitempty"`
-}
-
-// ExponentialBucket are a set of bucket counts, encoded in a contiguous array
-// of counts.
-type ExponentialBucket struct {
- // Offset is the bucket index of the first entry in the Counts slice.
- Offset int32
- // Counts is an slice where Counts[i] carries the count of the bucket at
- // index (Offset+i). Counts[i] is the count of values greater than
- // base^(Offset+i) and less than or equal to base^(Offset+i+1).
- Counts []uint64
-}
-
-// Extrema is the minimum or maximum value of a dataset.
-type Extrema[N int64 | float64] struct {
- value N
- valid bool
-}
-
-// MarshalText converts the Extrema value to text.
-func (e Extrema[N]) MarshalText() ([]byte, error) {
- if !e.valid {
- return json.Marshal(nil)
- }
- return json.Marshal(e.value)
-}
-
-// MarshalJSON converts the Extrema value to JSON number.
-func (e *Extrema[N]) MarshalJSON() ([]byte, error) {
- return e.MarshalText()
-}
-
-// NewExtrema returns an Extrema set to v.
-func NewExtrema[N int64 | float64](v N) Extrema[N] {
- return Extrema[N]{value: v, valid: true}
-}
-
-// Value returns the Extrema value and true if the Extrema is defined.
-// Otherwise, if the Extrema is its zero-value, defined will be false.
-func (e Extrema[N]) Value() (v N, defined bool) {
- return e.value, e.valid
-}
-
-// Exemplar is a measurement sampled from a timeseries providing a typical
-// example.
-type Exemplar[N int64 | float64] struct {
- // FilteredAttributes are the attributes recorded with the measurement but
- // filtered out of the timeseries' aggregated data.
- FilteredAttributes []attribute.KeyValue
- // Time is the time when the measurement was recorded.
- Time time.Time
- // Value is the measured value.
- Value N
- // SpanID is the ID of the span that was active during the measurement. If
- // no span was active or the span was not sampled this will be empty.
- SpanID []byte `json:",omitempty"`
- // TraceID is the ID of the trace the active span belonged to during the
- // measurement. If no span was active or the span was not sampled this will
- // be empty.
- TraceID []byte `json:",omitempty"`
-}
-
-// Summary metric data are used to convey quantile summaries,
-// a Prometheus (see: https://prometheus.io/docs/concepts/metric_types/#summary)
-// data type.
-//
-// These data points cannot always be merged in a meaningful way. The Summary
-// type is only used by bridges from other metrics libraries, and cannot be
-// produced using OpenTelemetry instrumentation.
-type Summary struct {
- // DataPoints are the individual aggregated measurements with unique
- // attributes.
- DataPoints []SummaryDataPoint
-}
-
-func (Summary) privateAggregation() {}
-
-// SummaryDataPoint is a single data point in a timeseries that describes the
-// time-varying values of a Summary metric.
-type SummaryDataPoint struct {
- // Attributes is the set of key value pairs that uniquely identify the
- // timeseries.
- Attributes attribute.Set
-
- // StartTime is when the timeseries was started.
- StartTime time.Time
- // Time is the time when the timeseries was recorded.
- Time time.Time
-
- // Count is the number of updates this summary has been calculated with.
- Count uint64
-
- // Sum is the sum of the values recorded.
- Sum float64
-
- // (Optional) list of values at different quantiles of the distribution calculated
- // from the current snapshot. The quantiles must be strictly increasing.
- QuantileValues []QuantileValue
-}
-
-// QuantileValue is the value at a given quantile of a summary.
-type QuantileValue struct {
- // Quantile is the quantile of this value.
- //
- // Must be in the interval [0.0, 1.0].
- Quantile float64
-
- // Value is the value at the given quantile of a summary.
- //
- // Quantile values must NOT be negative.
- Value float64
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/temporality.go b/vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/temporality.go
deleted file mode 100644
index 187713dad..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/temporality.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-//go:generate stringer -type=Temporality
-
-package metricdata // import "go.opentelemetry.io/otel/sdk/metric/metricdata"
-
-// Temporality defines the window that an aggregation was calculated over.
-type Temporality uint8
-
-const (
- // undefinedTemporality represents an unset Temporality.
- //nolint:deadcode,unused,varcheck
- undefinedTemporality Temporality = iota
-
- // CumulativeTemporality defines a measurement interval that continues to
- // expand forward in time from a starting point. New measurements are
- // added to all previous measurements since a start time.
- CumulativeTemporality
-
- // DeltaTemporality defines a measurement interval that resets each cycle.
- // Measurements from one cycle are recorded independently, measurements
- // from other cycles do not affect them.
- DeltaTemporality
-)
-
-// MarshalText returns the byte encoded of t.
-func (t Temporality) MarshalText() ([]byte, error) {
- return []byte(t.String()), nil
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/temporality_string.go b/vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/temporality_string.go
deleted file mode 100644
index 4da833cdc..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/temporality_string.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// Code generated by "stringer -type=Temporality"; DO NOT EDIT.
-
-package metricdata
-
-import "strconv"
-
-func _() {
- // An "invalid array index" compiler error signifies that the constant values have changed.
- // Re-run the stringer command to generate them again.
- var x [1]struct{}
- _ = x[undefinedTemporality-0]
- _ = x[CumulativeTemporality-1]
- _ = x[DeltaTemporality-2]
-}
-
-const _Temporality_name = "undefinedTemporalityCumulativeTemporalityDeltaTemporality"
-
-var _Temporality_index = [...]uint8{0, 20, 41, 57}
-
-func (i Temporality) String() string {
- if i >= Temporality(len(_Temporality_index)-1) {
- return "Temporality(" + strconv.FormatInt(int64(i), 10) + ")"
- }
- return _Temporality_name[_Temporality_index[i]:_Temporality_index[i+1]]
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/periodic_reader.go b/vendor/go.opentelemetry.io/otel/sdk/metric/periodic_reader.go
deleted file mode 100644
index dcd2182d9..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/periodic_reader.go
+++ /dev/null
@@ -1,369 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package metric // import "go.opentelemetry.io/otel/sdk/metric"
-
-import (
- "context"
- "errors"
- "fmt"
- "sync"
- "sync/atomic"
- "time"
-
- "go.opentelemetry.io/otel"
- "go.opentelemetry.io/otel/internal/global"
- "go.opentelemetry.io/otel/sdk/metric/metricdata"
-)
-
-// Default periodic reader timing.
-const (
- defaultTimeout = time.Millisecond * 30000
- defaultInterval = time.Millisecond * 60000
-)
-
-// periodicReaderConfig contains configuration options for a PeriodicReader.
-type periodicReaderConfig struct {
- interval time.Duration
- timeout time.Duration
- producers []Producer
-}
-
-// newPeriodicReaderConfig returns a periodicReaderConfig configured with
-// options.
-func newPeriodicReaderConfig(options []PeriodicReaderOption) periodicReaderConfig {
- c := periodicReaderConfig{
- interval: envDuration(envInterval, defaultInterval),
- timeout: envDuration(envTimeout, defaultTimeout),
- }
- for _, o := range options {
- c = o.applyPeriodic(c)
- }
- return c
-}
-
-// PeriodicReaderOption applies a configuration option value to a PeriodicReader.
-type PeriodicReaderOption interface {
- applyPeriodic(periodicReaderConfig) periodicReaderConfig
-}
-
-// periodicReaderOptionFunc applies a set of options to a periodicReaderConfig.
-type periodicReaderOptionFunc func(periodicReaderConfig) periodicReaderConfig
-
-// applyPeriodic returns a periodicReaderConfig with option(s) applied.
-func (o periodicReaderOptionFunc) applyPeriodic(conf periodicReaderConfig) periodicReaderConfig {
- return o(conf)
-}
-
-// WithTimeout configures the time a PeriodicReader waits for an export to
-// complete before canceling it. This includes an export which occurs as part
-// of Shutdown or ForceFlush if the user passed context does not have a
-// deadline. If the user passed context does have a deadline, it will be used
-// instead.
-//
-// This option overrides any value set for the
-// OTEL_METRIC_EXPORT_TIMEOUT environment variable.
-//
-// If this option is not used or d is less than or equal to zero, 30 seconds
-// is used as the default.
-func WithTimeout(d time.Duration) PeriodicReaderOption {
- return periodicReaderOptionFunc(func(conf periodicReaderConfig) periodicReaderConfig {
- if d <= 0 {
- return conf
- }
- conf.timeout = d
- return conf
- })
-}
-
-// WithInterval configures the intervening time between exports for a
-// PeriodicReader.
-//
-// This option overrides any value set for the
-// OTEL_METRIC_EXPORT_INTERVAL environment variable.
-//
-// If this option is not used or d is less than or equal to zero, 60 seconds
-// is used as the default.
-func WithInterval(d time.Duration) PeriodicReaderOption {
- return periodicReaderOptionFunc(func(conf periodicReaderConfig) periodicReaderConfig {
- if d <= 0 {
- return conf
- }
- conf.interval = d
- return conf
- })
-}
-
-// NewPeriodicReader returns a Reader that collects and exports metric data to
-// the exporter at a defined interval. By default, the returned Reader will
-// collect and export data every 60 seconds, and will cancel any attempts that
-// exceed 30 seconds, collect and export combined. The collect and export time
-// are not counted towards the interval between attempts.
-//
-// The Collect method of the returned Reader continues to gather and return
-// metric data to the user. It will not automatically send that data to the
-// exporter. That is left to the user to accomplish.
-func NewPeriodicReader(exporter Exporter, options ...PeriodicReaderOption) *PeriodicReader {
- conf := newPeriodicReaderConfig(options)
- ctx, cancel := context.WithCancel(context.Background())
- r := &PeriodicReader{
- interval: conf.interval,
- timeout: conf.timeout,
- exporter: exporter,
- flushCh: make(chan chan error),
- cancel: cancel,
- done: make(chan struct{}),
- rmPool: sync.Pool{
- New: func() interface{} {
- return &metricdata.ResourceMetrics{}
- },
- },
- }
- r.externalProducers.Store(conf.producers)
-
- go func() {
- defer func() { close(r.done) }()
- r.run(ctx, conf.interval)
- }()
-
- return r
-}
-
-// PeriodicReader is a Reader that continuously collects and exports metric
-// data at a set interval.
-type PeriodicReader struct {
- sdkProducer atomic.Value
-
- mu sync.Mutex
- isShutdown bool
- externalProducers atomic.Value
-
- interval time.Duration
- timeout time.Duration
- exporter Exporter
- flushCh chan chan error
-
- done chan struct{}
- cancel context.CancelFunc
- shutdownOnce sync.Once
-
- rmPool sync.Pool
-}
-
-// Compile time check the periodicReader implements Reader and is comparable.
-var _ = map[Reader]struct{}{&PeriodicReader{}: {}}
-
-// newTicker allows testing override.
-var newTicker = time.NewTicker
-
-// run continuously collects and exports metric data at the specified
-// interval. This will run until ctx is canceled or times out.
-func (r *PeriodicReader) run(ctx context.Context, interval time.Duration) {
- ticker := newTicker(interval)
- defer ticker.Stop()
-
- for {
- select {
- case <-ticker.C:
- err := r.collectAndExport(ctx)
- if err != nil {
- otel.Handle(err)
- }
- case errCh := <-r.flushCh:
- errCh <- r.collectAndExport(ctx)
- ticker.Reset(interval)
- case <-ctx.Done():
- return
- }
- }
-}
-
-// register registers p as the producer of this reader.
-func (r *PeriodicReader) register(p sdkProducer) {
- // Only register once. If producer is already set, do nothing.
- if !r.sdkProducer.CompareAndSwap(nil, produceHolder{produce: p.produce}) {
- msg := "did not register periodic reader"
- global.Error(errDuplicateRegister, msg)
- }
-}
-
-// temporality reports the Temporality for the instrument kind provided.
-func (r *PeriodicReader) temporality(kind InstrumentKind) metricdata.Temporality {
- return r.exporter.Temporality(kind)
-}
-
-// aggregation returns what Aggregation to use for kind.
-func (r *PeriodicReader) aggregation(kind InstrumentKind) Aggregation { // nolint:revive // import-shadow for method scoped by type.
- return r.exporter.Aggregation(kind)
-}
-
-// collectAndExport gather all metric data related to the periodicReader r from
-// the SDK and exports it with r's exporter.
-func (r *PeriodicReader) collectAndExport(ctx context.Context) error {
- ctx, cancel := context.WithTimeout(ctx, r.timeout)
- defer cancel()
-
- // TODO (#3047): Use a sync.Pool or persistent pointer instead of allocating rm every Collect.
- rm := r.rmPool.Get().(*metricdata.ResourceMetrics)
- err := r.Collect(ctx, rm)
- if err == nil {
- err = r.export(ctx, rm)
- }
- r.rmPool.Put(rm)
- return err
-}
-
-// Collect gathers all metric data related to the Reader from
-// the SDK and other Producers and stores the result in rm. The metric
-// data is not exported to the configured exporter, it is left to the caller to
-// handle that if desired.
-//
-// Collect will return an error if called after shutdown.
-// Collect will return an error if rm is a nil ResourceMetrics.
-// Collect will return an error if the context's Done channel is closed.
-//
-// This method is safe to call concurrently.
-func (r *PeriodicReader) Collect(ctx context.Context, rm *metricdata.ResourceMetrics) error {
- if rm == nil {
- return errors.New("periodic reader: *metricdata.ResourceMetrics is nil")
- }
- // TODO (#3047): When collect is updated to accept output as param, pass rm.
- return r.collect(ctx, r.sdkProducer.Load(), rm)
-}
-
-// collect unwraps p as a produceHolder and returns its produce results.
-func (r *PeriodicReader) collect(ctx context.Context, p interface{}, rm *metricdata.ResourceMetrics) error {
- if p == nil {
- return ErrReaderNotRegistered
- }
-
- ph, ok := p.(produceHolder)
- if !ok {
- // The atomic.Value is entirely in the periodicReader's control so
- // this should never happen. In the unforeseen case that this does
- // happen, return an error instead of panicking so a users code does
- // not halt in the processes.
- err := fmt.Errorf("periodic reader: invalid producer: %T", p)
- return err
- }
-
- err := ph.produce(ctx, rm)
- if err != nil {
- return err
- }
- for _, producer := range r.externalProducers.Load().([]Producer) {
- externalMetrics, e := producer.Produce(ctx)
- if e != nil {
- err = errors.Join(err, e)
- }
- rm.ScopeMetrics = append(rm.ScopeMetrics, externalMetrics...)
- }
-
- global.Debug("PeriodicReader collection", "Data", rm)
-
- return err
-}
-
-// export exports metric data m using r's exporter.
-func (r *PeriodicReader) export(ctx context.Context, m *metricdata.ResourceMetrics) error {
- return r.exporter.Export(ctx, m)
-}
-
-// ForceFlush flushes pending telemetry.
-//
-// This method is safe to call concurrently.
-func (r *PeriodicReader) ForceFlush(ctx context.Context) error {
- // Prioritize the ctx timeout if it is set.
- if _, ok := ctx.Deadline(); !ok {
- var cancel context.CancelFunc
- ctx, cancel = context.WithTimeout(ctx, r.timeout)
- defer cancel()
- }
-
- errCh := make(chan error, 1)
- select {
- case r.flushCh <- errCh:
- select {
- case err := <-errCh:
- if err != nil {
- return err
- }
- close(errCh)
- case <-ctx.Done():
- return ctx.Err()
- }
- case <-r.done:
- return ErrReaderShutdown
- case <-ctx.Done():
- return ctx.Err()
- }
- return r.exporter.ForceFlush(ctx)
-}
-
-// Shutdown flushes pending telemetry and then stops the export pipeline.
-//
-// This method is safe to call concurrently.
-func (r *PeriodicReader) Shutdown(ctx context.Context) error {
- err := ErrReaderShutdown
- r.shutdownOnce.Do(func() {
- // Prioritize the ctx timeout if it is set.
- if _, ok := ctx.Deadline(); !ok {
- var cancel context.CancelFunc
- ctx, cancel = context.WithTimeout(ctx, r.timeout)
- defer cancel()
- }
-
- // Stop the run loop.
- r.cancel()
- <-r.done
-
- // Any future call to Collect will now return ErrReaderShutdown.
- ph := r.sdkProducer.Swap(produceHolder{
- produce: shutdownProducer{}.produce,
- })
-
- if ph != nil { // Reader was registered.
- // Flush pending telemetry.
- m := r.rmPool.Get().(*metricdata.ResourceMetrics)
- err = r.collect(ctx, ph, m)
- if err == nil {
- err = r.export(ctx, m)
- }
- r.rmPool.Put(m)
- }
-
- sErr := r.exporter.Shutdown(ctx)
- if err == nil || errors.Is(err, ErrReaderShutdown) {
- err = sErr
- }
-
- r.mu.Lock()
- defer r.mu.Unlock()
- r.isShutdown = true
- // release references to Producer(s)
- r.externalProducers.Store([]Producer{})
- })
- return err
-}
-
-// MarshalLog returns logging data about the PeriodicReader.
-func (r *PeriodicReader) MarshalLog() interface{} {
- r.mu.Lock()
- down := r.isShutdown
- r.mu.Unlock()
- return struct {
- Type string
- Exporter Exporter
- Registered bool
- Shutdown bool
- Interval time.Duration
- Timeout time.Duration
- }{
- Type: "PeriodicReader",
- Exporter: r.exporter,
- Registered: r.sdkProducer.Load() != nil,
- Shutdown: down,
- Interval: r.interval,
- Timeout: r.timeout,
- }
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/pipeline.go b/vendor/go.opentelemetry.io/otel/sdk/metric/pipeline.go
deleted file mode 100644
index 775e24526..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/pipeline.go
+++ /dev/null
@@ -1,659 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package metric // import "go.opentelemetry.io/otel/sdk/metric"
-
-import (
- "container/list"
- "context"
- "errors"
- "fmt"
- "sync"
- "sync/atomic"
-
- "go.opentelemetry.io/otel/internal/global"
- "go.opentelemetry.io/otel/metric/embedded"
- "go.opentelemetry.io/otel/sdk/instrumentation"
- "go.opentelemetry.io/otel/sdk/metric/exemplar"
- "go.opentelemetry.io/otel/sdk/metric/internal"
- "go.opentelemetry.io/otel/sdk/metric/internal/aggregate"
- "go.opentelemetry.io/otel/sdk/metric/internal/x"
- "go.opentelemetry.io/otel/sdk/metric/metricdata"
- "go.opentelemetry.io/otel/sdk/resource"
-)
-
-var (
- errCreatingAggregators = errors.New("could not create all aggregators")
- errIncompatibleAggregation = errors.New("incompatible aggregation")
- errUnknownAggregation = errors.New("unrecognized aggregation")
-)
-
-// instrumentSync is a synchronization point between a pipeline and an
-// instrument's aggregate function.
-type instrumentSync struct {
- name string
- description string
- unit string
- compAgg aggregate.ComputeAggregation
-}
-
-func newPipeline(res *resource.Resource, reader Reader, views []View, exemplarFilter exemplar.Filter) *pipeline {
- if res == nil {
- res = resource.Empty()
- }
- return &pipeline{
- resource: res,
- reader: reader,
- views: views,
- int64Measures: map[observableID[int64]][]aggregate.Measure[int64]{},
- float64Measures: map[observableID[float64]][]aggregate.Measure[float64]{},
- exemplarFilter: exemplarFilter,
- // aggregations is lazy allocated when needed.
- }
-}
-
-// pipeline connects all of the instruments created by a meter provider to a Reader.
-// This is the object that will be `Reader.register()` when a meter provider is created.
-//
-// As instruments are created the instrument should be checked if it exists in
-// the views of a the Reader, and if so each aggregate function should be added
-// to the pipeline.
-type pipeline struct {
- resource *resource.Resource
-
- reader Reader
- views []View
-
- sync.Mutex
- int64Measures map[observableID[int64]][]aggregate.Measure[int64]
- float64Measures map[observableID[float64]][]aggregate.Measure[float64]
- aggregations map[instrumentation.Scope][]instrumentSync
- callbacks []func(context.Context) error
- multiCallbacks list.List
- exemplarFilter exemplar.Filter
-}
-
-// addInt64Measure adds a new int64 measure to the pipeline for each observer.
-func (p *pipeline) addInt64Measure(id observableID[int64], m []aggregate.Measure[int64]) {
- p.Lock()
- defer p.Unlock()
- p.int64Measures[id] = m
-}
-
-// addFloat64Measure adds a new float64 measure to the pipeline for each observer.
-func (p *pipeline) addFloat64Measure(id observableID[float64], m []aggregate.Measure[float64]) {
- p.Lock()
- defer p.Unlock()
- p.float64Measures[id] = m
-}
-
-// addSync adds the instrumentSync to pipeline p with scope. This method is not
-// idempotent. Duplicate calls will result in duplicate additions, it is the
-// callers responsibility to ensure this is called with unique values.
-func (p *pipeline) addSync(scope instrumentation.Scope, iSync instrumentSync) {
- p.Lock()
- defer p.Unlock()
- if p.aggregations == nil {
- p.aggregations = map[instrumentation.Scope][]instrumentSync{
- scope: {iSync},
- }
- return
- }
- p.aggregations[scope] = append(p.aggregations[scope], iSync)
-}
-
-type multiCallback func(context.Context) error
-
-// addMultiCallback registers a multi-instrument callback to be run when
-// `produce()` is called.
-func (p *pipeline) addMultiCallback(c multiCallback) (unregister func()) {
- p.Lock()
- defer p.Unlock()
- e := p.multiCallbacks.PushBack(c)
- return func() {
- p.Lock()
- p.multiCallbacks.Remove(e)
- p.Unlock()
- }
-}
-
-// produce returns aggregated metrics from a single collection.
-//
-// This method is safe to call concurrently.
-func (p *pipeline) produce(ctx context.Context, rm *metricdata.ResourceMetrics) error {
- p.Lock()
- defer p.Unlock()
-
- var err error
- for _, c := range p.callbacks {
- // TODO make the callbacks parallel. ( #3034 )
- if e := c(ctx); e != nil {
- err = errors.Join(err, e)
- }
- if err := ctx.Err(); err != nil {
- rm.Resource = nil
- clear(rm.ScopeMetrics) // Erase elements to let GC collect objects.
- rm.ScopeMetrics = rm.ScopeMetrics[:0]
- return err
- }
- }
- for e := p.multiCallbacks.Front(); e != nil; e = e.Next() {
- // TODO make the callbacks parallel. ( #3034 )
- f := e.Value.(multiCallback)
- if e := f(ctx); e != nil {
- err = errors.Join(err, e)
- }
- if err := ctx.Err(); err != nil {
- // This means the context expired before we finished running callbacks.
- rm.Resource = nil
- clear(rm.ScopeMetrics) // Erase elements to let GC collect objects.
- rm.ScopeMetrics = rm.ScopeMetrics[:0]
- return err
- }
- }
-
- rm.Resource = p.resource
- rm.ScopeMetrics = internal.ReuseSlice(rm.ScopeMetrics, len(p.aggregations))
-
- i := 0
- for scope, instruments := range p.aggregations {
- rm.ScopeMetrics[i].Metrics = internal.ReuseSlice(rm.ScopeMetrics[i].Metrics, len(instruments))
- j := 0
- for _, inst := range instruments {
- data := rm.ScopeMetrics[i].Metrics[j].Data
- if n := inst.compAgg(&data); n > 0 {
- rm.ScopeMetrics[i].Metrics[j].Name = inst.name
- rm.ScopeMetrics[i].Metrics[j].Description = inst.description
- rm.ScopeMetrics[i].Metrics[j].Unit = inst.unit
- rm.ScopeMetrics[i].Metrics[j].Data = data
- j++
- }
- }
- rm.ScopeMetrics[i].Metrics = rm.ScopeMetrics[i].Metrics[:j]
- if len(rm.ScopeMetrics[i].Metrics) > 0 {
- rm.ScopeMetrics[i].Scope = scope
- i++
- }
- }
-
- rm.ScopeMetrics = rm.ScopeMetrics[:i]
-
- return err
-}
-
-// inserter facilitates inserting of new instruments from a single scope into a
-// pipeline.
-type inserter[N int64 | float64] struct {
- // aggregators is a cache that holds aggregate function inputs whose
- // outputs have been inserted into the underlying reader pipeline. This
- // cache ensures no duplicate aggregate functions are inserted into the
- // reader pipeline and if a new request during an instrument creation asks
- // for the same aggregate function input the same instance is returned.
- aggregators *cache[instID, aggVal[N]]
-
- // views is a cache that holds instrument identifiers for all the
- // instruments a Meter has created, it is provided from the Meter that owns
- // this inserter. This cache ensures during the creation of instruments
- // with the same name but different options (e.g. description, unit) a
- // warning message is logged.
- views *cache[string, instID]
-
- pipeline *pipeline
-}
-
-func newInserter[N int64 | float64](p *pipeline, vc *cache[string, instID]) *inserter[N] {
- if vc == nil {
- vc = &cache[string, instID]{}
- }
- return &inserter[N]{
- aggregators: &cache[instID, aggVal[N]]{},
- views: vc,
- pipeline: p,
- }
-}
-
-// Instrument inserts the instrument inst with instUnit into a pipeline. All
-// views the pipeline contains are matched against, and any matching view that
-// creates a unique aggregate function will have its output inserted into the
-// pipeline and its input included in the returned slice.
-//
-// The returned aggregate function inputs are ensured to be deduplicated and
-// unique. If another view in another pipeline that is cached by this
-// inserter's cache has already inserted the same aggregate function for the
-// same instrument, that functions input instance is returned.
-//
-// If another instrument has already been inserted by this inserter, or any
-// other using the same cache, and it conflicts with the instrument being
-// inserted in this call, an aggregate function input matching the arguments
-// will still be returned but an Info level log message will also be logged to
-// the OTel global logger.
-//
-// If the passed instrument would result in an incompatible aggregate function,
-// an error is returned and that aggregate function output is not inserted nor
-// is its input returned.
-//
-// If an instrument is determined to use a Drop aggregation, that instrument is
-// not inserted nor returned.
-func (i *inserter[N]) Instrument(inst Instrument, readerAggregation Aggregation) ([]aggregate.Measure[N], error) {
- var (
- matched bool
- measures []aggregate.Measure[N]
- )
-
- var err error
- seen := make(map[uint64]struct{})
- for _, v := range i.pipeline.views {
- stream, match := v(inst)
- if !match {
- continue
- }
- matched = true
- in, id, e := i.cachedAggregator(inst.Scope, inst.Kind, stream, readerAggregation)
- if e != nil {
- err = errors.Join(err, e)
- }
- if in == nil { // Drop aggregation.
- continue
- }
- if _, ok := seen[id]; ok {
- // This aggregate function has already been added.
- continue
- }
- seen[id] = struct{}{}
- measures = append(measures, in)
- }
-
- if err != nil {
- err = errors.Join(errCreatingAggregators, err)
- }
-
- if matched {
- return measures, err
- }
-
- // Apply implicit default view if no explicit matched.
- stream := Stream{
- Name: inst.Name,
- Description: inst.Description,
- Unit: inst.Unit,
- }
- in, _, e := i.cachedAggregator(inst.Scope, inst.Kind, stream, readerAggregation)
- if e != nil {
- if err == nil {
- err = errCreatingAggregators
- }
- err = errors.Join(err, e)
- }
- if in != nil {
- // Ensured to have not seen given matched was false.
- measures = append(measures, in)
- }
- return measures, err
-}
-
-// addCallback registers a single instrument callback to be run when
-// `produce()` is called.
-func (i *inserter[N]) addCallback(cback func(context.Context) error) {
- i.pipeline.Lock()
- defer i.pipeline.Unlock()
- i.pipeline.callbacks = append(i.pipeline.callbacks, cback)
-}
-
-var aggIDCount uint64
-
-// aggVal is the cached value in an aggregators cache.
-type aggVal[N int64 | float64] struct {
- ID uint64
- Measure aggregate.Measure[N]
- Err error
-}
-
-// readerDefaultAggregation returns the default aggregation for the instrument
-// kind based on the reader's aggregation preferences. This is used unless the
-// aggregation is overridden with a view.
-func (i *inserter[N]) readerDefaultAggregation(kind InstrumentKind) Aggregation {
- aggregation := i.pipeline.reader.aggregation(kind)
- switch aggregation.(type) {
- case nil, AggregationDefault:
- // If the reader returns default or nil use the default selector.
- aggregation = DefaultAggregationSelector(kind)
- default:
- // Deep copy and validate before using.
- aggregation = aggregation.copy()
- if err := aggregation.err(); err != nil {
- orig := aggregation
- aggregation = DefaultAggregationSelector(kind)
- global.Error(
- err, "using default aggregation instead",
- "aggregation", orig,
- "replacement", aggregation,
- )
- }
- }
- return aggregation
-}
-
-// cachedAggregator returns the appropriate aggregate input and output
-// functions for an instrument configuration. If the exact instrument has been
-// created within the inst.Scope, those aggregate function instances will be
-// returned. Otherwise, new computed aggregate functions will be cached and
-// returned.
-//
-// If the instrument configuration conflicts with an instrument that has
-// already been created (e.g. description, unit, data type) a warning will be
-// logged at the "Info" level with the global OTel logger. Valid new aggregate
-// functions for the instrument configuration will still be returned without an
-// error.
-//
-// If the instrument defines an unknown or incompatible aggregation, an error
-// is returned.
-func (i *inserter[N]) cachedAggregator(scope instrumentation.Scope, kind InstrumentKind, stream Stream, readerAggregation Aggregation) (meas aggregate.Measure[N], aggID uint64, err error) {
- switch stream.Aggregation.(type) {
- case nil:
- // The aggregation was not overridden with a view. Use the aggregation
- // provided by the reader.
- stream.Aggregation = readerAggregation
- case AggregationDefault:
- // The view explicitly requested the default aggregation.
- stream.Aggregation = DefaultAggregationSelector(kind)
- }
- if stream.ExemplarReservoirProviderSelector == nil {
- stream.ExemplarReservoirProviderSelector = DefaultExemplarReservoirProviderSelector
- }
-
- if err := isAggregatorCompatible(kind, stream.Aggregation); err != nil {
- return nil, 0, fmt.Errorf(
- "creating aggregator with instrumentKind: %d, aggregation %v: %w",
- kind, stream.Aggregation, err,
- )
- }
-
- id := i.instID(kind, stream)
- // If there is a conflict, the specification says the view should
- // still be applied and a warning should be logged.
- i.logConflict(id)
-
- // If there are requests for the same instrument with different name
- // casing, the first-seen needs to be returned. Use a normalize ID for the
- // cache lookup to ensure the correct comparison.
- normID := id.normalize()
- cv := i.aggregators.Lookup(normID, func() aggVal[N] {
- b := aggregate.Builder[N]{
- Temporality: i.pipeline.reader.temporality(kind),
- ReservoirFunc: reservoirFunc[N](stream.ExemplarReservoirProviderSelector(stream.Aggregation), i.pipeline.exemplarFilter),
- }
- b.Filter = stream.AttributeFilter
- // A value less than or equal to zero will disable the aggregation
- // limits for the builder (an all the created aggregates).
- // CardinalityLimit.Lookup returns 0 by default if unset (or
- // unrecognized input). Use that value directly.
- b.AggregationLimit, _ = x.CardinalityLimit.Lookup()
-
- in, out, err := i.aggregateFunc(b, stream.Aggregation, kind)
- if err != nil {
- return aggVal[N]{0, nil, err}
- }
- if in == nil { // Drop aggregator.
- return aggVal[N]{0, nil, nil}
- }
- i.pipeline.addSync(scope, instrumentSync{
- // Use the first-seen name casing for this and all subsequent
- // requests of this instrument.
- name: stream.Name,
- description: stream.Description,
- unit: stream.Unit,
- compAgg: out,
- })
- id := atomic.AddUint64(&aggIDCount, 1)
- return aggVal[N]{id, in, err}
- })
- return cv.Measure, cv.ID, cv.Err
-}
-
-// logConflict validates if an instrument with the same case-insensitive name
-// as id has already been created. If that instrument conflicts with id, a
-// warning is logged.
-func (i *inserter[N]) logConflict(id instID) {
- // The API specification defines names as case-insensitive. If there is a
- // different casing of a name it needs to be a conflict.
- name := id.normalize().Name
- existing := i.views.Lookup(name, func() instID { return id })
- if id == existing {
- return
- }
-
- const msg = "duplicate metric stream definitions"
- args := []interface{}{
- "names", fmt.Sprintf("%q, %q", existing.Name, id.Name),
- "descriptions", fmt.Sprintf("%q, %q", existing.Description, id.Description),
- "kinds", fmt.Sprintf("%s, %s", existing.Kind, id.Kind),
- "units", fmt.Sprintf("%s, %s", existing.Unit, id.Unit),
- "numbers", fmt.Sprintf("%s, %s", existing.Number, id.Number),
- }
-
- // The specification recommends logging a suggested view to resolve
- // conflicts if possible.
- //
- // https://github.com/open-telemetry/opentelemetry-specification/blob/v1.21.0/specification/metrics/sdk.md#duplicate-instrument-registration
- if id.Unit != existing.Unit || id.Number != existing.Number {
- // There is no view resolution for these, don't make a suggestion.
- global.Warn(msg, args...)
- return
- }
-
- var stream string
- if id.Name != existing.Name || id.Kind != existing.Kind {
- stream = `Stream{Name: "{{NEW_NAME}}"}`
- } else if id.Description != existing.Description {
- stream = fmt.Sprintf("Stream{Description: %q}", existing.Description)
- }
-
- inst := fmt.Sprintf(
- "Instrument{Name: %q, Description: %q, Kind: %q, Unit: %q}",
- id.Name, id.Description, "InstrumentKind"+id.Kind.String(), id.Unit,
- )
- args = append(args, "suggested.view", fmt.Sprintf("NewView(%s, %s)", inst, stream))
-
- global.Warn(msg, args...)
-}
-
-func (i *inserter[N]) instID(kind InstrumentKind, stream Stream) instID {
- var zero N
- return instID{
- Name: stream.Name,
- Description: stream.Description,
- Unit: stream.Unit,
- Kind: kind,
- Number: fmt.Sprintf("%T", zero),
- }
-}
-
-// aggregateFunc returns new aggregate functions matching agg, kind, and
-// monotonic. If the agg is unknown or temporality is invalid, an error is
-// returned.
-func (i *inserter[N]) aggregateFunc(b aggregate.Builder[N], agg Aggregation, kind InstrumentKind) (meas aggregate.Measure[N], comp aggregate.ComputeAggregation, err error) {
- switch a := agg.(type) {
- case AggregationDefault:
- return i.aggregateFunc(b, DefaultAggregationSelector(kind), kind)
- case AggregationDrop:
- // Return nil in and out to signify the drop aggregator.
- case AggregationLastValue:
- switch kind {
- case InstrumentKindGauge:
- meas, comp = b.LastValue()
- case InstrumentKindObservableGauge:
- meas, comp = b.PrecomputedLastValue()
- }
- case AggregationSum:
- switch kind {
- case InstrumentKindObservableCounter:
- meas, comp = b.PrecomputedSum(true)
- case InstrumentKindObservableUpDownCounter:
- meas, comp = b.PrecomputedSum(false)
- case InstrumentKindCounter, InstrumentKindHistogram:
- meas, comp = b.Sum(true)
- default:
- // InstrumentKindUpDownCounter, InstrumentKindObservableGauge, and
- // instrumentKindUndefined or other invalid instrument kinds.
- meas, comp = b.Sum(false)
- }
- case AggregationExplicitBucketHistogram:
- var noSum bool
- switch kind {
- case InstrumentKindUpDownCounter, InstrumentKindObservableUpDownCounter, InstrumentKindObservableGauge, InstrumentKindGauge:
- // The sum should not be collected for any instrument that can make
- // negative measurements:
- // https://github.com/open-telemetry/opentelemetry-specification/blob/v1.21.0/specification/metrics/sdk.md#histogram-aggregations
- noSum = true
- }
- meas, comp = b.ExplicitBucketHistogram(a.Boundaries, a.NoMinMax, noSum)
- case AggregationBase2ExponentialHistogram:
- var noSum bool
- switch kind {
- case InstrumentKindUpDownCounter, InstrumentKindObservableUpDownCounter, InstrumentKindObservableGauge, InstrumentKindGauge:
- // The sum should not be collected for any instrument that can make
- // negative measurements:
- // https://github.com/open-telemetry/opentelemetry-specification/blob/v1.21.0/specification/metrics/sdk.md#histogram-aggregations
- noSum = true
- }
- meas, comp = b.ExponentialBucketHistogram(a.MaxSize, a.MaxScale, a.NoMinMax, noSum)
-
- default:
- err = errUnknownAggregation
- }
-
- return meas, comp, err
-}
-
-// isAggregatorCompatible checks if the aggregation can be used by the instrument.
-// Current compatibility:
-//
-// | Instrument Kind | Drop | LastValue | Sum | Histogram | Exponential Histogram |
-// |--------------------------|------|-----------|-----|-----------|-----------------------|
-// | Counter | ✓ | | ✓ | ✓ | ✓ |
-// | UpDownCounter | ✓ | | ✓ | ✓ | ✓ |
-// | Histogram | ✓ | | ✓ | ✓ | ✓ |
-// | Gauge | ✓ | ✓ | | ✓ | ✓ |
-// | Observable Counter | ✓ | | ✓ | ✓ | ✓ |
-// | Observable UpDownCounter | ✓ | | ✓ | ✓ | ✓ |
-// | Observable Gauge | ✓ | ✓ | | ✓ | ✓ |.
-func isAggregatorCompatible(kind InstrumentKind, agg Aggregation) error {
- switch agg.(type) {
- case AggregationDefault:
- return nil
- case AggregationExplicitBucketHistogram, AggregationBase2ExponentialHistogram:
- switch kind {
- case InstrumentKindCounter,
- InstrumentKindUpDownCounter,
- InstrumentKindHistogram,
- InstrumentKindGauge,
- InstrumentKindObservableCounter,
- InstrumentKindObservableUpDownCounter,
- InstrumentKindObservableGauge:
- return nil
- default:
- return errIncompatibleAggregation
- }
- case AggregationSum:
- switch kind {
- case InstrumentKindObservableCounter, InstrumentKindObservableUpDownCounter, InstrumentKindCounter, InstrumentKindHistogram, InstrumentKindUpDownCounter:
- return nil
- default:
- // TODO: review need for aggregation check after
- // https://github.com/open-telemetry/opentelemetry-specification/issues/2710
- return errIncompatibleAggregation
- }
- case AggregationLastValue:
- switch kind {
- case InstrumentKindObservableGauge, InstrumentKindGauge:
- return nil
- }
- // TODO: review need for aggregation check after
- // https://github.com/open-telemetry/opentelemetry-specification/issues/2710
- return errIncompatibleAggregation
- case AggregationDrop:
- return nil
- default:
- // This is used passed checking for default, it should be an error at this point.
- return fmt.Errorf("%w: %v", errUnknownAggregation, agg)
- }
-}
-
-// pipelines is the group of pipelines connecting Readers with instrument
-// measurement.
-type pipelines []*pipeline
-
-func newPipelines(res *resource.Resource, readers []Reader, views []View, exemplarFilter exemplar.Filter) pipelines {
- pipes := make([]*pipeline, 0, len(readers))
- for _, r := range readers {
- p := newPipeline(res, r, views, exemplarFilter)
- r.register(p)
- pipes = append(pipes, p)
- }
- return pipes
-}
-
-type unregisterFuncs struct {
- embedded.Registration
- f []func()
-}
-
-func (u unregisterFuncs) Unregister() error {
- for _, f := range u.f {
- f()
- }
- return nil
-}
-
-// resolver facilitates resolving aggregate functions an instrument calls to
-// aggregate measurements with while updating all pipelines that need to pull
-// from those aggregations.
-type resolver[N int64 | float64] struct {
- inserters []*inserter[N]
-}
-
-func newResolver[N int64 | float64](p pipelines, vc *cache[string, instID]) resolver[N] {
- in := make([]*inserter[N], len(p))
- for i := range in {
- in[i] = newInserter[N](p[i], vc)
- }
- return resolver[N]{in}
-}
-
-// Aggregators returns the Aggregators that must be updated by the instrument
-// defined by key.
-func (r resolver[N]) Aggregators(id Instrument) ([]aggregate.Measure[N], error) {
- var measures []aggregate.Measure[N]
-
- var err error
- for _, i := range r.inserters {
- in, e := i.Instrument(id, i.readerDefaultAggregation(id.Kind))
- if e != nil {
- err = errors.Join(err, e)
- }
- measures = append(measures, in...)
- }
- return measures, err
-}
-
-// HistogramAggregators returns the histogram Aggregators that must be updated by the instrument
-// defined by key. If boundaries were provided on instrument instantiation, those take precedence
-// over boundaries provided by the reader.
-func (r resolver[N]) HistogramAggregators(id Instrument, boundaries []float64) ([]aggregate.Measure[N], error) {
- var measures []aggregate.Measure[N]
-
- var err error
- for _, i := range r.inserters {
- agg := i.readerDefaultAggregation(id.Kind)
- if histAgg, ok := agg.(AggregationExplicitBucketHistogram); ok && len(boundaries) > 0 {
- histAgg.Boundaries = boundaries
- agg = histAgg
- }
- in, e := i.Instrument(id, agg)
- if e != nil {
- err = errors.Join(err, e)
- }
- measures = append(measures, in...)
- }
- return measures, err
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/provider.go b/vendor/go.opentelemetry.io/otel/sdk/metric/provider.go
deleted file mode 100644
index 2fca89e5a..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/provider.go
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package metric // import "go.opentelemetry.io/otel/sdk/metric"
-
-import (
- "context"
- "sync/atomic"
-
- "go.opentelemetry.io/otel/internal/global"
- "go.opentelemetry.io/otel/metric"
- "go.opentelemetry.io/otel/metric/embedded"
- "go.opentelemetry.io/otel/metric/noop"
- "go.opentelemetry.io/otel/sdk/instrumentation"
-)
-
-// MeterProvider handles the creation and coordination of Meters. All Meters
-// created by a MeterProvider will be associated with the same Resource, have
-// the same Views applied to them, and have their produced metric telemetry
-// passed to the configured Readers.
-type MeterProvider struct {
- embedded.MeterProvider
-
- pipes pipelines
- meters cache[instrumentation.Scope, *meter]
-
- forceFlush, shutdown func(context.Context) error
- stopped atomic.Bool
-}
-
-// Compile-time check MeterProvider implements metric.MeterProvider.
-var _ metric.MeterProvider = (*MeterProvider)(nil)
-
-// NewMeterProvider returns a new and configured MeterProvider.
-//
-// By default, the returned MeterProvider is configured with the default
-// Resource and no Readers. Readers cannot be added after a MeterProvider is
-// created. This means the returned MeterProvider, one created with no
-// Readers, will perform no operations.
-func NewMeterProvider(options ...Option) *MeterProvider {
- conf := newConfig(options)
- flush, sdown := conf.readerSignals()
-
- mp := &MeterProvider{
- pipes: newPipelines(conf.res, conf.readers, conf.views, conf.exemplarFilter),
- forceFlush: flush,
- shutdown: sdown,
- }
- // Log after creation so all readers show correctly they are registered.
- global.Info("MeterProvider created",
- "Resource", conf.res,
- "Readers", conf.readers,
- "Views", len(conf.views),
- )
- return mp
-}
-
-// Meter returns a Meter with the given name and configured with options.
-//
-// The name should be the name of the instrumentation scope creating
-// telemetry. This name may be the same as the instrumented code only if that
-// code provides built-in instrumentation.
-//
-// Calls to the Meter method after Shutdown has been called will return Meters
-// that perform no operations.
-//
-// This method is safe to call concurrently.
-func (mp *MeterProvider) Meter(name string, options ...metric.MeterOption) metric.Meter {
- if name == "" {
- global.Warn("Invalid Meter name.", "name", name)
- }
-
- if mp.stopped.Load() {
- return noop.Meter{}
- }
-
- c := metric.NewMeterConfig(options...)
- s := instrumentation.Scope{
- Name: name,
- Version: c.InstrumentationVersion(),
- SchemaURL: c.SchemaURL(),
- Attributes: c.InstrumentationAttributes(),
- }
-
- global.Info("Meter created",
- "Name", s.Name,
- "Version", s.Version,
- "SchemaURL", s.SchemaURL,
- "Attributes", s.Attributes,
- )
-
- return mp.meters.Lookup(s, func() *meter {
- return newMeter(s, mp.pipes)
- })
-}
-
-// ForceFlush flushes all pending telemetry.
-//
-// This method honors the deadline or cancellation of ctx. An appropriate
-// error will be returned in these situations. There is no guaranteed that all
-// telemetry be flushed or all resources have been released in these
-// situations.
-//
-// ForceFlush calls ForceFlush(context.Context) error
-// on all Readers that implements this method.
-//
-// This method is safe to call concurrently.
-func (mp *MeterProvider) ForceFlush(ctx context.Context) error {
- if mp.forceFlush != nil {
- return mp.forceFlush(ctx)
- }
- return nil
-}
-
-// Shutdown shuts down the MeterProvider flushing all pending telemetry and
-// releasing any held computational resources.
-//
-// This call is idempotent. The first call will perform all flush and
-// releasing operations. Subsequent calls will perform no action and will
-// return an error stating this.
-//
-// Measurements made by instruments from meters this MeterProvider created
-// will not be exported after Shutdown is called.
-//
-// This method honors the deadline or cancellation of ctx. An appropriate
-// error will be returned in these situations. There is no guaranteed that all
-// telemetry be flushed or all resources have been released in these
-// situations.
-//
-// This method is safe to call concurrently.
-func (mp *MeterProvider) Shutdown(ctx context.Context) error {
- // Even though it may seem like there is a synchronization issue between the
- // call to `Store` and checking `shutdown`, the Go concurrency model ensures
- // that is not the case, as all the atomic operations executed in a program
- // behave as though executed in some sequentially consistent order. This
- // definition provides the same semantics as C++'s sequentially consistent
- // atomics and Java's volatile variables.
- // See https://go.dev/ref/mem#atomic and https://pkg.go.dev/sync/atomic.
-
- mp.stopped.Store(true)
- if mp.shutdown != nil {
- return mp.shutdown(ctx)
- }
- return nil
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/reader.go b/vendor/go.opentelemetry.io/otel/sdk/metric/reader.go
deleted file mode 100644
index d13a70697..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/reader.go
+++ /dev/null
@@ -1,189 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package metric // import "go.opentelemetry.io/otel/sdk/metric"
-
-import (
- "context"
- "errors"
-
- "go.opentelemetry.io/otel/sdk/metric/metricdata"
-)
-
-// errDuplicateRegister is logged by a Reader when an attempt to registered it
-// more than once occurs.
-var errDuplicateRegister = errors.New("duplicate reader registration")
-
-// ErrReaderNotRegistered is returned if Collect or Shutdown are called before
-// the reader is registered with a MeterProvider.
-var ErrReaderNotRegistered = errors.New("reader is not registered")
-
-// ErrReaderShutdown is returned if Collect or Shutdown are called after a
-// reader has been Shutdown once.
-var ErrReaderShutdown = errors.New("reader is shutdown")
-
-// errNonPositiveDuration is logged when an environmental variable
-// has non-positive value.
-var errNonPositiveDuration = errors.New("non-positive duration")
-
-// Reader is the interface used between the SDK and an
-// exporter. Control flow is bi-directional through the
-// Reader, since the SDK initiates ForceFlush and Shutdown
-// while the exporter initiates collection. The Register() method here
-// informs the Reader that it can begin reading, signaling the
-// start of bi-directional control flow.
-//
-// Typically, push-based exporters that are periodic will
-// implement PeriodicExporter themselves and construct a
-// PeriodicReader to satisfy this interface.
-//
-// Pull-based exporters will typically implement Register
-// themselves, since they read on demand.
-//
-// Warning: methods may be added to this interface in minor releases.
-type Reader interface {
- // register registers a Reader with a MeterProvider.
- // The producer argument allows the Reader to signal the sdk to collect
- // and send aggregated metric measurements.
- register(sdkProducer)
-
- // temporality reports the Temporality for the instrument kind provided.
- //
- // This method needs to be concurrent safe with itself and all the other
- // Reader methods.
- temporality(InstrumentKind) metricdata.Temporality
-
- // aggregation returns what Aggregation to use for an instrument kind.
- //
- // This method needs to be concurrent safe with itself and all the other
- // Reader methods.
- aggregation(InstrumentKind) Aggregation // nolint:revive // import-shadow for method scoped by type.
-
- // Collect gathers and returns all metric data related to the Reader from
- // the SDK and stores it in rm. An error is returned if this is called
- // after Shutdown or if rm is nil.
- //
- // This method needs to be concurrent safe, and the cancellation of the
- // passed context is expected to be honored.
- Collect(ctx context.Context, rm *metricdata.ResourceMetrics) error
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-
- // Shutdown flushes all metric measurements held in an export pipeline and releases any
- // held computational resources.
- //
- // This deadline or cancellation of the passed context are honored. An appropriate
- // error will be returned in these situations. There is no guaranteed that all
- // telemetry be flushed or all resources have been released in these
- // situations.
- //
- // After Shutdown is called, calls to Collect will perform no operation and instead will return
- // an error indicating the shutdown state.
- //
- // This method needs to be concurrent safe.
- Shutdown(context.Context) error
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-}
-
-// sdkProducer produces metrics for a Reader.
-type sdkProducer interface {
- // produce returns aggregated metrics from a single collection.
- //
- // This method is safe to call concurrently.
- produce(context.Context, *metricdata.ResourceMetrics) error
-}
-
-// Producer produces metrics for a Reader from an external source.
-type Producer interface {
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-
- // Produce returns aggregated metrics from an external source.
- //
- // This method should be safe to call concurrently.
- Produce(context.Context) ([]metricdata.ScopeMetrics, error)
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-}
-
-// produceHolder is used as an atomic.Value to wrap the non-concrete producer
-// type.
-type produceHolder struct {
- produce func(context.Context, *metricdata.ResourceMetrics) error
-}
-
-// shutdownProducer produces an ErrReaderShutdown error always.
-type shutdownProducer struct{}
-
-// produce returns an ErrReaderShutdown error.
-func (p shutdownProducer) produce(context.Context, *metricdata.ResourceMetrics) error {
- return ErrReaderShutdown
-}
-
-// TemporalitySelector selects the temporality to use based on the InstrumentKind.
-type TemporalitySelector func(InstrumentKind) metricdata.Temporality
-
-// DefaultTemporalitySelector is the default TemporalitySelector used if
-// WithTemporalitySelector is not provided. CumulativeTemporality will be used
-// for all instrument kinds if this TemporalitySelector is used.
-func DefaultTemporalitySelector(InstrumentKind) metricdata.Temporality {
- return metricdata.CumulativeTemporality
-}
-
-// AggregationSelector selects the aggregation and the parameters to use for
-// that aggregation based on the InstrumentKind.
-//
-// If the Aggregation returned is nil or DefaultAggregation, the selection from
-// DefaultAggregationSelector will be used.
-type AggregationSelector func(InstrumentKind) Aggregation
-
-// DefaultAggregationSelector returns the default aggregation and parameters
-// that will be used to summarize measurement made from an instrument of
-// InstrumentKind. This AggregationSelector using the following selection
-// mapping: Counter ⇨ Sum, Observable Counter ⇨ Sum, UpDownCounter ⇨ Sum,
-// Observable UpDownCounter ⇨ Sum, Observable Gauge ⇨ LastValue,
-// Histogram ⇨ ExplicitBucketHistogram.
-func DefaultAggregationSelector(ik InstrumentKind) Aggregation {
- switch ik {
- case InstrumentKindCounter, InstrumentKindUpDownCounter, InstrumentKindObservableCounter, InstrumentKindObservableUpDownCounter:
- return AggregationSum{}
- case InstrumentKindObservableGauge, InstrumentKindGauge:
- return AggregationLastValue{}
- case InstrumentKindHistogram:
- return AggregationExplicitBucketHistogram{
- Boundaries: []float64{0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000},
- NoMinMax: false,
- }
- }
- panic("unknown instrument kind")
-}
-
-// ReaderOption is an option which can be applied to manual or Periodic
-// readers.
-type ReaderOption interface {
- PeriodicReaderOption
- ManualReaderOption
-}
-
-// WithProducer registers producers as an external Producer of metric data
-// for this Reader.
-func WithProducer(p Producer) ReaderOption {
- return producerOption{p: p}
-}
-
-type producerOption struct {
- p Producer
-}
-
-// applyManual returns a manualReaderConfig with option applied.
-func (o producerOption) applyManual(c manualReaderConfig) manualReaderConfig {
- c.producers = append(c.producers, o.p)
- return c
-}
-
-// applyPeriodic returns a periodicReaderConfig with option applied.
-func (o producerOption) applyPeriodic(c periodicReaderConfig) periodicReaderConfig {
- c.producers = append(c.producers, o.p)
- return c
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/version.go b/vendor/go.opentelemetry.io/otel/sdk/metric/version.go
deleted file mode 100644
index 7c4b8530d..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/version.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package metric // import "go.opentelemetry.io/otel/sdk/metric"
-
-// version is the current release version of the metric SDK in use.
-func version() string {
- return "1.34.0"
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/view.go b/vendor/go.opentelemetry.io/otel/sdk/metric/view.go
deleted file mode 100644
index 630890f42..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/view.go
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package metric // import "go.opentelemetry.io/otel/sdk/metric"
-
-import (
- "errors"
- "regexp"
- "strings"
-
- "go.opentelemetry.io/otel/internal/global"
-)
-
-var (
- errMultiInst = errors.New("name replacement for multiple instruments")
- errEmptyView = errors.New("no criteria provided for view")
-
- emptyView = func(Instrument) (Stream, bool) { return Stream{}, false }
-)
-
-// View is an override to the default behavior of the SDK. It defines how data
-// should be collected for certain instruments. It returns true and the exact
-// Stream to use for matching Instruments. Otherwise, if the view does not
-// match, false is returned.
-type View func(Instrument) (Stream, bool)
-
-// NewView returns a View that applies the Stream mask for all instruments that
-// match criteria. The returned View will only apply mask if all non-zero-value
-// fields of criteria match the corresponding Instrument passed to the view. If
-// no criteria are provided, all field of criteria are their zero-values, a
-// view that matches no instruments is returned. If you need to match a
-// zero-value field, create a View directly.
-//
-// The Name field of criteria supports wildcard pattern matching. The "*"
-// wildcard is recognized as matching zero or more characters, and "?" is
-// recognized as matching exactly one character. For example, a pattern of "*"
-// matches all instrument names.
-//
-// The Stream mask only applies updates for non-zero-value fields. By default,
-// the Instrument the View matches against will be use for the Name,
-// Description, and Unit of the returned Stream and no Aggregation or
-// AttributeFilter are set. All non-zero-value fields of mask are used instead
-// of the default. If you need to zero out an Stream field returned from a
-// View, create a View directly.
-func NewView(criteria Instrument, mask Stream) View {
- if criteria.IsEmpty() {
- global.Error(
- errEmptyView, "dropping view",
- "mask", mask,
- )
- return emptyView
- }
-
- var matchFunc func(Instrument) bool
- if strings.ContainsAny(criteria.Name, "*?") {
- if mask.Name != "" {
- global.Error(
- errMultiInst, "dropping view",
- "criteria", criteria,
- "mask", mask,
- )
- return emptyView
- }
-
- // Handle branching here in NewView instead of criteria.matches so
- // criteria.matches remains inlinable for the simple case.
- pattern := regexp.QuoteMeta(criteria.Name)
- pattern = "^" + pattern + "$"
- pattern = strings.ReplaceAll(pattern, `\?`, ".")
- pattern = strings.ReplaceAll(pattern, `\*`, ".*")
- re := regexp.MustCompile(pattern)
- matchFunc = func(i Instrument) bool {
- return re.MatchString(i.Name) &&
- criteria.matchesDescription(i) &&
- criteria.matchesKind(i) &&
- criteria.matchesUnit(i) &&
- criteria.matchesScope(i)
- }
- } else {
- matchFunc = criteria.matches
- }
-
- var agg Aggregation
- if mask.Aggregation != nil {
- agg = mask.Aggregation.copy()
- if err := agg.err(); err != nil {
- global.Error(
- err, "not using aggregation with view",
- "criteria", criteria,
- "mask", mask,
- )
- agg = nil
- }
- }
-
- return func(i Instrument) (Stream, bool) {
- if matchFunc(i) {
- return Stream{
- Name: nonZero(mask.Name, i.Name),
- Description: nonZero(mask.Description, i.Description),
- Unit: nonZero(mask.Unit, i.Unit),
- Aggregation: agg,
- AttributeFilter: mask.AttributeFilter,
- ExemplarReservoirProviderSelector: mask.ExemplarReservoirProviderSelector,
- }, true
- }
- return Stream{}, false
- }
-}
-
-// nonZero returns v if it is non-zero-valued, otherwise alt.
-func nonZero[T comparable](v, alt T) T {
- var zero T
- if v != zero {
- return v
- }
- return alt
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/README.md b/vendor/go.opentelemetry.io/otel/sdk/resource/README.md
deleted file mode 100644
index 4ad864d71..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# SDK Resource
-
-[![PkgGoDev](https://pkg.go.dev/badge/go.opentelemetry.io/otel/sdk/resource)](https://pkg.go.dev/go.opentelemetry.io/otel/sdk/resource)
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/auto.go b/vendor/go.opentelemetry.io/otel/sdk/resource/auto.go
deleted file mode 100644
index c02aeefdd..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/auto.go
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
-
-import (
- "context"
- "errors"
- "fmt"
-)
-
-// ErrPartialResource is returned by a detector when complete source
-// information for a Resource is unavailable or the source information
-// contains invalid values that are omitted from the returned Resource.
-var ErrPartialResource = errors.New("partial resource")
-
-// Detector detects OpenTelemetry resource information.
-type Detector interface {
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-
- // Detect returns an initialized Resource based on gathered information.
- // If the source information to construct a Resource contains invalid
- // values, a Resource is returned with the valid parts of the source
- // information used for initialization along with an appropriately
- // wrapped ErrPartialResource error.
- Detect(ctx context.Context) (*Resource, error)
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-}
-
-// Detect returns a new [Resource] merged from all the Resources each of the
-// detectors produces. Each of the detectors are called sequentially, in the
-// order they are passed, merging the produced resource into the previous.
-//
-// This may return a partial Resource along with an error containing
-// [ErrPartialResource] if that error is returned from a detector. It may also
-// return a merge-conflicting Resource along with an error containing
-// [ErrSchemaURLConflict] if merging Resources from different detectors results
-// in a schema URL conflict. It is up to the caller to determine if this
-// returned Resource should be used or not.
-//
-// If one of the detectors returns an error that is not [ErrPartialResource],
-// the resource produced by the detector will not be merged and the returned
-// error will wrap that detector's error.
-func Detect(ctx context.Context, detectors ...Detector) (*Resource, error) {
- r := new(Resource)
- return r, detect(ctx, r, detectors)
-}
-
-// detect runs all detectors using ctx and merges the result into res. This
-// assumes res is allocated and not nil, it will panic otherwise.
-//
-// If the detectors or merging resources produces any errors (i.e.
-// [ErrPartialResource] [ErrSchemaURLConflict]), a single error wrapping all of
-// these errors will be returned. Otherwise, nil is returned.
-func detect(ctx context.Context, res *Resource, detectors []Detector) error {
- var (
- r *Resource
- err error
- e error
- )
-
- for _, detector := range detectors {
- if detector == nil {
- continue
- }
- r, e = detector.Detect(ctx)
- if e != nil {
- err = errors.Join(err, e)
- if !errors.Is(e, ErrPartialResource) {
- continue
- }
- }
- r, e = Merge(res, r)
- if e != nil {
- err = errors.Join(err, e)
- }
- *res = *r
- }
-
- if err != nil {
- if errors.Is(err, ErrSchemaURLConflict) {
- // If there has been a merge conflict, ensure the resource has no
- // schema URL.
- res.schemaURL = ""
- }
-
- err = fmt.Errorf("error detecting resource: %w", err)
- }
- return err
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/builtin.go b/vendor/go.opentelemetry.io/otel/sdk/resource/builtin.go
deleted file mode 100644
index cf3c88e15..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/builtin.go
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
-
-import (
- "context"
- "fmt"
- "os"
- "path/filepath"
-
- "github.com/google/uuid"
-
- "go.opentelemetry.io/otel/attribute"
- "go.opentelemetry.io/otel/sdk"
- semconv "go.opentelemetry.io/otel/semconv/v1.26.0"
-)
-
-type (
- // telemetrySDK is a Detector that provides information about
- // the OpenTelemetry SDK used. This Detector is included as a
- // builtin. If these resource attributes are not wanted, use
- // resource.New() to explicitly disable them.
- telemetrySDK struct{}
-
- // host is a Detector that provides information about the host
- // being run on. This Detector is included as a builtin. If
- // these resource attributes are not wanted, use the
- // resource.New() to explicitly disable them.
- host struct{}
-
- stringDetector struct {
- schemaURL string
- K attribute.Key
- F func() (string, error)
- }
-
- defaultServiceNameDetector struct{}
-
- defaultServiceInstanceIDDetector struct{}
-)
-
-var (
- _ Detector = telemetrySDK{}
- _ Detector = host{}
- _ Detector = stringDetector{}
- _ Detector = defaultServiceNameDetector{}
- _ Detector = defaultServiceInstanceIDDetector{}
-)
-
-// Detect returns a *Resource that describes the OpenTelemetry SDK used.
-func (telemetrySDK) Detect(context.Context) (*Resource, error) {
- return NewWithAttributes(
- semconv.SchemaURL,
- semconv.TelemetrySDKName("opentelemetry"),
- semconv.TelemetrySDKLanguageGo,
- semconv.TelemetrySDKVersion(sdk.Version()),
- ), nil
-}
-
-// Detect returns a *Resource that describes the host being run on.
-func (host) Detect(ctx context.Context) (*Resource, error) {
- return StringDetector(semconv.SchemaURL, semconv.HostNameKey, os.Hostname).Detect(ctx)
-}
-
-// StringDetector returns a Detector that will produce a *Resource
-// containing the string as a value corresponding to k. The resulting Resource
-// will have the specified schemaURL.
-func StringDetector(schemaURL string, k attribute.Key, f func() (string, error)) Detector {
- return stringDetector{schemaURL: schemaURL, K: k, F: f}
-}
-
-// Detect returns a *Resource that describes the string as a value
-// corresponding to attribute.Key as well as the specific schemaURL.
-func (sd stringDetector) Detect(ctx context.Context) (*Resource, error) {
- value, err := sd.F()
- if err != nil {
- return nil, fmt.Errorf("%s: %w", string(sd.K), err)
- }
- a := sd.K.String(value)
- if !a.Valid() {
- return nil, fmt.Errorf("invalid attribute: %q -> %q", a.Key, a.Value.Emit())
- }
- return NewWithAttributes(sd.schemaURL, sd.K.String(value)), nil
-}
-
-// Detect implements Detector.
-func (defaultServiceNameDetector) Detect(ctx context.Context) (*Resource, error) {
- return StringDetector(
- semconv.SchemaURL,
- semconv.ServiceNameKey,
- func() (string, error) {
- executable, err := os.Executable()
- if err != nil {
- return "unknown_service:go", nil
- }
- return "unknown_service:" + filepath.Base(executable), nil
- },
- ).Detect(ctx)
-}
-
-// Detect implements Detector.
-func (defaultServiceInstanceIDDetector) Detect(ctx context.Context) (*Resource, error) {
- return StringDetector(
- semconv.SchemaURL,
- semconv.ServiceInstanceIDKey,
- func() (string, error) {
- version4Uuid, err := uuid.NewRandom()
- if err != nil {
- return "", err
- }
-
- return version4Uuid.String(), nil
- },
- ).Detect(ctx)
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/config.go b/vendor/go.opentelemetry.io/otel/sdk/resource/config.go
deleted file mode 100644
index 0d6e213d9..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/config.go
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
-
-import (
- "context"
-
- "go.opentelemetry.io/otel/attribute"
-)
-
-// config contains configuration for Resource creation.
-type config struct {
- // detectors that will be evaluated.
- detectors []Detector
- // SchemaURL to associate with the Resource.
- schemaURL string
-}
-
-// Option is the interface that applies a configuration option.
-type Option interface {
- // apply sets the Option value of a config.
- apply(config) config
-}
-
-// WithAttributes adds attributes to the configured Resource.
-func WithAttributes(attributes ...attribute.KeyValue) Option {
- return WithDetectors(detectAttributes{attributes})
-}
-
-type detectAttributes struct {
- attributes []attribute.KeyValue
-}
-
-func (d detectAttributes) Detect(context.Context) (*Resource, error) {
- return NewSchemaless(d.attributes...), nil
-}
-
-// WithDetectors adds detectors to be evaluated for the configured resource.
-func WithDetectors(detectors ...Detector) Option {
- return detectorsOption{detectors: detectors}
-}
-
-type detectorsOption struct {
- detectors []Detector
-}
-
-func (o detectorsOption) apply(cfg config) config {
- cfg.detectors = append(cfg.detectors, o.detectors...)
- return cfg
-}
-
-// WithFromEnv adds attributes from environment variables to the configured resource.
-func WithFromEnv() Option {
- return WithDetectors(fromEnv{})
-}
-
-// WithHost adds attributes from the host to the configured resource.
-func WithHost() Option {
- return WithDetectors(host{})
-}
-
-// WithHostID adds host ID information to the configured resource.
-func WithHostID() Option {
- return WithDetectors(hostIDDetector{})
-}
-
-// WithTelemetrySDK adds TelemetrySDK version info to the configured resource.
-func WithTelemetrySDK() Option {
- return WithDetectors(telemetrySDK{})
-}
-
-// WithSchemaURL sets the schema URL for the configured resource.
-func WithSchemaURL(schemaURL string) Option {
- return schemaURLOption(schemaURL)
-}
-
-type schemaURLOption string
-
-func (o schemaURLOption) apply(cfg config) config {
- cfg.schemaURL = string(o)
- return cfg
-}
-
-// WithOS adds all the OS attributes to the configured Resource.
-// See individual WithOS* functions to configure specific attributes.
-func WithOS() Option {
- return WithDetectors(
- osTypeDetector{},
- osDescriptionDetector{},
- )
-}
-
-// WithOSType adds an attribute with the operating system type to the configured Resource.
-func WithOSType() Option {
- return WithDetectors(osTypeDetector{})
-}
-
-// WithOSDescription adds an attribute with the operating system description to the
-// configured Resource. The formatted string is equivalent to the output of the
-// `uname -snrvm` command.
-func WithOSDescription() Option {
- return WithDetectors(osDescriptionDetector{})
-}
-
-// WithProcess adds all the Process attributes to the configured Resource.
-//
-// Warning! This option will include process command line arguments. If these
-// contain sensitive information it will be included in the exported resource.
-//
-// This option is equivalent to calling WithProcessPID,
-// WithProcessExecutableName, WithProcessExecutablePath,
-// WithProcessCommandArgs, WithProcessOwner, WithProcessRuntimeName,
-// WithProcessRuntimeVersion, and WithProcessRuntimeDescription. See each
-// option function for information about what resource attributes each
-// includes.
-func WithProcess() Option {
- return WithDetectors(
- processPIDDetector{},
- processExecutableNameDetector{},
- processExecutablePathDetector{},
- processCommandArgsDetector{},
- processOwnerDetector{},
- processRuntimeNameDetector{},
- processRuntimeVersionDetector{},
- processRuntimeDescriptionDetector{},
- )
-}
-
-// WithProcessPID adds an attribute with the process identifier (PID) to the
-// configured Resource.
-func WithProcessPID() Option {
- return WithDetectors(processPIDDetector{})
-}
-
-// WithProcessExecutableName adds an attribute with the name of the process
-// executable to the configured Resource.
-func WithProcessExecutableName() Option {
- return WithDetectors(processExecutableNameDetector{})
-}
-
-// WithProcessExecutablePath adds an attribute with the full path to the process
-// executable to the configured Resource.
-func WithProcessExecutablePath() Option {
- return WithDetectors(processExecutablePathDetector{})
-}
-
-// WithProcessCommandArgs adds an attribute with all the command arguments (including
-// the command/executable itself) as received by the process to the configured
-// Resource.
-//
-// Warning! This option will include process command line arguments. If these
-// contain sensitive information it will be included in the exported resource.
-func WithProcessCommandArgs() Option {
- return WithDetectors(processCommandArgsDetector{})
-}
-
-// WithProcessOwner adds an attribute with the username of the user that owns the process
-// to the configured Resource.
-func WithProcessOwner() Option {
- return WithDetectors(processOwnerDetector{})
-}
-
-// WithProcessRuntimeName adds an attribute with the name of the runtime of this
-// process to the configured Resource.
-func WithProcessRuntimeName() Option {
- return WithDetectors(processRuntimeNameDetector{})
-}
-
-// WithProcessRuntimeVersion adds an attribute with the version of the runtime of
-// this process to the configured Resource.
-func WithProcessRuntimeVersion() Option {
- return WithDetectors(processRuntimeVersionDetector{})
-}
-
-// WithProcessRuntimeDescription adds an attribute with an additional description
-// about the runtime of the process to the configured Resource.
-func WithProcessRuntimeDescription() Option {
- return WithDetectors(processRuntimeDescriptionDetector{})
-}
-
-// WithContainer adds all the Container attributes to the configured Resource.
-// See individual WithContainer* functions to configure specific attributes.
-func WithContainer() Option {
- return WithDetectors(
- cgroupContainerIDDetector{},
- )
-}
-
-// WithContainerID adds an attribute with the id of the container to the configured Resource.
-// Note: WithContainerID will not extract the correct container ID in an ECS environment.
-// Please use the ECS resource detector instead (https://pkg.go.dev/go.opentelemetry.io/contrib/detectors/aws/ecs).
-func WithContainerID() Option {
- return WithDetectors(cgroupContainerIDDetector{})
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/container.go b/vendor/go.opentelemetry.io/otel/sdk/resource/container.go
deleted file mode 100644
index 5ecd859a5..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/container.go
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
-
-import (
- "bufio"
- "context"
- "errors"
- "io"
- "os"
- "regexp"
-
- semconv "go.opentelemetry.io/otel/semconv/v1.26.0"
-)
-
-type containerIDProvider func() (string, error)
-
-var (
- containerID containerIDProvider = getContainerIDFromCGroup
- cgroupContainerIDRe = regexp.MustCompile(`^.*/(?:.*[-:])?([0-9a-f]+)(?:\.|\s*$)`)
-)
-
-type cgroupContainerIDDetector struct{}
-
-const cgroupPath = "/proc/self/cgroup"
-
-// Detect returns a *Resource that describes the id of the container.
-// If no container id found, an empty resource will be returned.
-func (cgroupContainerIDDetector) Detect(ctx context.Context) (*Resource, error) {
- containerID, err := containerID()
- if err != nil {
- return nil, err
- }
-
- if containerID == "" {
- return Empty(), nil
- }
- return NewWithAttributes(semconv.SchemaURL, semconv.ContainerID(containerID)), nil
-}
-
-var (
- defaultOSStat = os.Stat
- osStat = defaultOSStat
-
- defaultOSOpen = func(name string) (io.ReadCloser, error) {
- return os.Open(name)
- }
- osOpen = defaultOSOpen
-)
-
-// getContainerIDFromCGroup returns the id of the container from the cgroup file.
-// If no container id found, an empty string will be returned.
-func getContainerIDFromCGroup() (string, error) {
- if _, err := osStat(cgroupPath); errors.Is(err, os.ErrNotExist) {
- // File does not exist, skip
- return "", nil
- }
-
- file, err := osOpen(cgroupPath)
- if err != nil {
- return "", err
- }
- defer file.Close()
-
- return getContainerIDFromReader(file), nil
-}
-
-// getContainerIDFromReader returns the id of the container from reader.
-func getContainerIDFromReader(reader io.Reader) string {
- scanner := bufio.NewScanner(reader)
- for scanner.Scan() {
- line := scanner.Text()
-
- if id := getContainerIDFromLine(line); id != "" {
- return id
- }
- }
- return ""
-}
-
-// getContainerIDFromLine returns the id of the container from one string line.
-func getContainerIDFromLine(line string) string {
- matches := cgroupContainerIDRe.FindStringSubmatch(line)
- if len(matches) <= 1 {
- return ""
- }
- return matches[1]
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/doc.go b/vendor/go.opentelemetry.io/otel/sdk/resource/doc.go
deleted file mode 100644
index 64939a271..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/doc.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-// Package resource provides detecting and representing resources.
-//
-// The fundamental struct is a Resource which holds identifying information
-// about the entities for which telemetry is exported.
-//
-// To automatically construct Resources from an environment a Detector
-// interface is defined. Implementations of this interface can be passed to
-// the Detect function to generate a Resource from the merged information.
-//
-// To load a user defined Resource from the environment variable
-// OTEL_RESOURCE_ATTRIBUTES the FromEnv Detector can be used. It will interpret
-// the value as a list of comma delimited key/value pairs
-// (e.g. `<key1>=<value1>,<key2>=<value2>,...`).
-//
-// While this package provides a stable API,
-// the attributes added by resource detectors may change.
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/env.go b/vendor/go.opentelemetry.io/otel/sdk/resource/env.go
deleted file mode 100644
index 813f05624..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/env.go
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
-
-import (
- "context"
- "fmt"
- "net/url"
- "os"
- "strings"
-
- "go.opentelemetry.io/otel"
- "go.opentelemetry.io/otel/attribute"
- semconv "go.opentelemetry.io/otel/semconv/v1.26.0"
-)
-
-const (
- // resourceAttrKey is the environment variable name OpenTelemetry Resource information will be read from.
- resourceAttrKey = "OTEL_RESOURCE_ATTRIBUTES" //nolint:gosec // False positive G101: Potential hardcoded credentials
-
- // svcNameKey is the environment variable name that Service Name information will be read from.
- svcNameKey = "OTEL_SERVICE_NAME"
-)
-
-// errMissingValue is returned when a resource value is missing.
-var errMissingValue = fmt.Errorf("%w: missing value", ErrPartialResource)
-
-// fromEnv is a Detector that implements the Detector and collects
-// resources from environment. This Detector is included as a
-// builtin.
-type fromEnv struct{}
-
-// compile time assertion that FromEnv implements Detector interface.
-var _ Detector = fromEnv{}
-
-// Detect collects resources from environment.
-func (fromEnv) Detect(context.Context) (*Resource, error) {
- attrs := strings.TrimSpace(os.Getenv(resourceAttrKey))
- svcName := strings.TrimSpace(os.Getenv(svcNameKey))
-
- if attrs == "" && svcName == "" {
- return Empty(), nil
- }
-
- var res *Resource
-
- if svcName != "" {
- res = NewSchemaless(semconv.ServiceName(svcName))
- }
-
- r2, err := constructOTResources(attrs)
-
- // Ensure that the resource with the service name from OTEL_SERVICE_NAME
- // takes precedence, if it was defined.
- res, err2 := Merge(r2, res)
-
- if err == nil {
- err = err2
- } else if err2 != nil {
- err = fmt.Errorf("detecting resources: %s", []string{err.Error(), err2.Error()})
- }
-
- return res, err
-}
-
-func constructOTResources(s string) (*Resource, error) {
- if s == "" {
- return Empty(), nil
- }
- pairs := strings.Split(s, ",")
- var attrs []attribute.KeyValue
- var invalid []string
- for _, p := range pairs {
- k, v, found := strings.Cut(p, "=")
- if !found {
- invalid = append(invalid, p)
- continue
- }
- key := strings.TrimSpace(k)
- val, err := url.PathUnescape(strings.TrimSpace(v))
- if err != nil {
- // Retain original value if decoding fails, otherwise it will be
- // an empty string.
- val = v
- otel.Handle(err)
- }
- attrs = append(attrs, attribute.String(key, val))
- }
- var err error
- if len(invalid) > 0 {
- err = fmt.Errorf("%w: %v", errMissingValue, invalid)
- }
- return NewSchemaless(attrs...), err
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id.go b/vendor/go.opentelemetry.io/otel/sdk/resource/host_id.go
deleted file mode 100644
index 2d0f65498..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id.go
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
-
-import (
- "context"
- "errors"
- "strings"
-
- semconv "go.opentelemetry.io/otel/semconv/v1.26.0"
-)
-
-type hostIDProvider func() (string, error)
-
-var defaultHostIDProvider hostIDProvider = platformHostIDReader.read
-
-var hostID = defaultHostIDProvider
-
-type hostIDReader interface {
- read() (string, error)
-}
-
-type fileReader func(string) (string, error)
-
-type commandExecutor func(string, ...string) (string, error)
-
-// hostIDReaderBSD implements hostIDReader.
-type hostIDReaderBSD struct {
- execCommand commandExecutor
- readFile fileReader
-}
-
-// read attempts to read the machine-id from /etc/hostid. If not found it will
-// execute `kenv -q smbios.system.uuid`. If neither location yields an id an
-// error will be returned.
-func (r *hostIDReaderBSD) read() (string, error) {
- if result, err := r.readFile("/etc/hostid"); err == nil {
- return strings.TrimSpace(result), nil
- }
-
- if result, err := r.execCommand("kenv", "-q", "smbios.system.uuid"); err == nil {
- return strings.TrimSpace(result), nil
- }
-
- return "", errors.New("host id not found in: /etc/hostid or kenv")
-}
-
-// hostIDReaderDarwin implements hostIDReader.
-type hostIDReaderDarwin struct {
- execCommand commandExecutor
-}
-
-// read executes `ioreg -rd1 -c "IOPlatformExpertDevice"` and parses host id
-// from the IOPlatformUUID line. If the command fails or the uuid cannot be
-// parsed an error will be returned.
-func (r *hostIDReaderDarwin) read() (string, error) {
- result, err := r.execCommand("ioreg", "-rd1", "-c", "IOPlatformExpertDevice")
- if err != nil {
- return "", err
- }
-
- lines := strings.Split(result, "\n")
- for _, line := range lines {
- if strings.Contains(line, "IOPlatformUUID") {
- parts := strings.Split(line, " = ")
- if len(parts) == 2 {
- return strings.Trim(parts[1], "\""), nil
- }
- break
- }
- }
-
- return "", errors.New("could not parse IOPlatformUUID")
-}
-
-type hostIDReaderLinux struct {
- readFile fileReader
-}
-
-// read attempts to read the machine-id from /etc/machine-id followed by
-// /var/lib/dbus/machine-id. If neither location yields an ID an error will
-// be returned.
-func (r *hostIDReaderLinux) read() (string, error) {
- if result, err := r.readFile("/etc/machine-id"); err == nil {
- return strings.TrimSpace(result), nil
- }
-
- if result, err := r.readFile("/var/lib/dbus/machine-id"); err == nil {
- return strings.TrimSpace(result), nil
- }
-
- return "", errors.New("host id not found in: /etc/machine-id or /var/lib/dbus/machine-id")
-}
-
-type hostIDDetector struct{}
-
-// Detect returns a *Resource containing the platform specific host id.
-func (hostIDDetector) Detect(ctx context.Context) (*Resource, error) {
- hostID, err := hostID()
- if err != nil {
- return nil, err
- }
-
- return NewWithAttributes(
- semconv.SchemaURL,
- semconv.HostID(hostID),
- ), nil
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_bsd.go b/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_bsd.go
deleted file mode 100644
index cc8b8938e..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_bsd.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-//go:build dragonfly || freebsd || netbsd || openbsd || solaris
-// +build dragonfly freebsd netbsd openbsd solaris
-
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
-
-var platformHostIDReader hostIDReader = &hostIDReaderBSD{
- execCommand: execCommand,
- readFile: readFile,
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_darwin.go b/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_darwin.go
deleted file mode 100644
index b09fde3b7..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_darwin.go
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
-
-var platformHostIDReader hostIDReader = &hostIDReaderDarwin{
- execCommand: execCommand,
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_exec.go b/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_exec.go
deleted file mode 100644
index d9e5d1a8f..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_exec.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-//go:build darwin || dragonfly || freebsd || netbsd || openbsd || solaris
-
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
-
-import "os/exec"
-
-func execCommand(name string, arg ...string) (string, error) {
- cmd := exec.Command(name, arg...)
- b, err := cmd.Output()
- if err != nil {
- return "", err
- }
-
- return string(b), nil
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_linux.go b/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_linux.go
deleted file mode 100644
index f84f17324..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_linux.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-//go:build linux
-// +build linux
-
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
-
-var platformHostIDReader hostIDReader = &hostIDReaderLinux{
- readFile: readFile,
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_readfile.go b/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_readfile.go
deleted file mode 100644
index 6354b3560..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_readfile.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-//go:build linux || dragonfly || freebsd || netbsd || openbsd || solaris
-
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
-
-import "os"
-
-func readFile(filename string) (string, error) {
- b, err := os.ReadFile(filename)
- if err != nil {
- return "", err
- }
-
- return string(b), nil
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_unsupported.go b/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_unsupported.go
deleted file mode 100644
index df12c44c5..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_unsupported.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-//go:build !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows
-// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows
-
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
-
-// hostIDReaderUnsupported is a placeholder implementation for operating systems
-// for which this project currently doesn't support host.id
-// attribute detection. See build tags declaration early on this file
-// for a list of unsupported OSes.
-type hostIDReaderUnsupported struct{}
-
-func (*hostIDReaderUnsupported) read() (string, error) {
- return "<unknown>", nil
-}
-
-var platformHostIDReader hostIDReader = &hostIDReaderUnsupported{}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_windows.go b/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_windows.go
deleted file mode 100644
index 3677c83d7..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_windows.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-//go:build windows
-// +build windows
-
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
-
-import (
- "golang.org/x/sys/windows/registry"
-)
-
-// implements hostIDReader.
-type hostIDReaderWindows struct{}
-
-// read reads MachineGuid from the Windows registry key:
-// SOFTWARE\Microsoft\Cryptography.
-func (*hostIDReaderWindows) read() (string, error) {
- k, err := registry.OpenKey(
- registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Cryptography`,
- registry.QUERY_VALUE|registry.WOW64_64KEY,
- )
- if err != nil {
- return "", err
- }
- defer k.Close()
-
- guid, _, err := k.GetStringValue("MachineGuid")
- if err != nil {
- return "", err
- }
-
- return guid, nil
-}
-
-var platformHostIDReader hostIDReader = &hostIDReaderWindows{}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/os.go b/vendor/go.opentelemetry.io/otel/sdk/resource/os.go
deleted file mode 100644
index 8a48ab4fa..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/os.go
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
-
-import (
- "context"
- "strings"
-
- "go.opentelemetry.io/otel/attribute"
- semconv "go.opentelemetry.io/otel/semconv/v1.26.0"
-)
-
-type osDescriptionProvider func() (string, error)
-
-var defaultOSDescriptionProvider osDescriptionProvider = platformOSDescription
-
-var osDescription = defaultOSDescriptionProvider
-
-func setDefaultOSDescriptionProvider() {
- setOSDescriptionProvider(defaultOSDescriptionProvider)
-}
-
-func setOSDescriptionProvider(osDescriptionProvider osDescriptionProvider) {
- osDescription = osDescriptionProvider
-}
-
-type (
- osTypeDetector struct{}
- osDescriptionDetector struct{}
-)
-
-// Detect returns a *Resource that describes the operating system type the
-// service is running on.
-func (osTypeDetector) Detect(ctx context.Context) (*Resource, error) {
- osType := runtimeOS()
-
- osTypeAttribute := mapRuntimeOSToSemconvOSType(osType)
-
- return NewWithAttributes(
- semconv.SchemaURL,
- osTypeAttribute,
- ), nil
-}
-
-// Detect returns a *Resource that describes the operating system the
-// service is running on.
-func (osDescriptionDetector) Detect(ctx context.Context) (*Resource, error) {
- description, err := osDescription()
- if err != nil {
- return nil, err
- }
-
- return NewWithAttributes(
- semconv.SchemaURL,
- semconv.OSDescription(description),
- ), nil
-}
-
-// mapRuntimeOSToSemconvOSType translates the OS name as provided by the Go runtime
-// into an OS type attribute with the corresponding value defined by the semantic
-// conventions. In case the provided OS name isn't mapped, it's transformed to lowercase
-// and used as the value for the returned OS type attribute.
-func mapRuntimeOSToSemconvOSType(osType string) attribute.KeyValue {
- // the elements in this map are the intersection between
- // available GOOS values and defined semconv OS types
- osTypeAttributeMap := map[string]attribute.KeyValue{
- "aix": semconv.OSTypeAIX,
- "darwin": semconv.OSTypeDarwin,
- "dragonfly": semconv.OSTypeDragonflyBSD,
- "freebsd": semconv.OSTypeFreeBSD,
- "linux": semconv.OSTypeLinux,
- "netbsd": semconv.OSTypeNetBSD,
- "openbsd": semconv.OSTypeOpenBSD,
- "solaris": semconv.OSTypeSolaris,
- "windows": semconv.OSTypeWindows,
- "zos": semconv.OSTypeZOS,
- }
-
- var osTypeAttribute attribute.KeyValue
-
- if attr, ok := osTypeAttributeMap[osType]; ok {
- osTypeAttribute = attr
- } else {
- osTypeAttribute = semconv.OSTypeKey.String(strings.ToLower(osType))
- }
-
- return osTypeAttribute
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/os_release_darwin.go b/vendor/go.opentelemetry.io/otel/sdk/resource/os_release_darwin.go
deleted file mode 100644
index ce455dc54..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/os_release_darwin.go
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
-
-import (
- "encoding/xml"
- "fmt"
- "io"
- "os"
-)
-
-type plist struct {
- XMLName xml.Name `xml:"plist"`
- Dict dict `xml:"dict"`
-}
-
-type dict struct {
- Key []string `xml:"key"`
- String []string `xml:"string"`
-}
-
-// osRelease builds a string describing the operating system release based on the
-// contents of the property list (.plist) system files. If no .plist files are found,
-// or if the required properties to build the release description string are missing,
-// an empty string is returned instead. The generated string resembles the output of
-// the `sw_vers` commandline program, but in a single-line string. For more information
-// about the `sw_vers` program, see: https://www.unix.com/man-page/osx/1/SW_VERS.
-func osRelease() string {
- file, err := getPlistFile()
- if err != nil {
- return ""
- }
-
- defer file.Close()
-
- values, err := parsePlistFile(file)
- if err != nil {
- return ""
- }
-
- return buildOSRelease(values)
-}
-
-// getPlistFile returns a *os.File pointing to one of the well-known .plist files
-// available on macOS. If no file can be opened, it returns an error.
-func getPlistFile() (*os.File, error) {
- return getFirstAvailableFile([]string{
- "/System/Library/CoreServices/SystemVersion.plist",
- "/System/Library/CoreServices/ServerVersion.plist",
- })
-}
-
-// parsePlistFile process the file pointed by `file` as a .plist file and returns
-// a map with the key-values for each pair of correlated <key> and <string> elements
-// contained in it.
-func parsePlistFile(file io.Reader) (map[string]string, error) {
- var v plist
-
- err := xml.NewDecoder(file).Decode(&v)
- if err != nil {
- return nil, err
- }
-
- if len(v.Dict.Key) != len(v.Dict.String) {
- return nil, fmt.Errorf("the number of <key> and <string> elements doesn't match")
- }
-
- properties := make(map[string]string, len(v.Dict.Key))
- for i, key := range v.Dict.Key {
- properties[key] = v.Dict.String[i]
- }
-
- return properties, nil
-}
-
-// buildOSRelease builds a string describing the OS release based on the properties
-// available on the provided map. It tries to find the `ProductName`, `ProductVersion`
-// and `ProductBuildVersion` properties. If some of these properties are not found,
-// it returns an empty string.
-func buildOSRelease(properties map[string]string) string {
- productName := properties["ProductName"]
- productVersion := properties["ProductVersion"]
- productBuildVersion := properties["ProductBuildVersion"]
-
- if productName == "" || productVersion == "" || productBuildVersion == "" {
- return ""
- }
-
- return fmt.Sprintf("%s %s (%s)", productName, productVersion, productBuildVersion)
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/os_release_unix.go b/vendor/go.opentelemetry.io/otel/sdk/resource/os_release_unix.go
deleted file mode 100644
index f537e5ca5..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/os_release_unix.go
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-//go:build aix || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos
-// +build aix dragonfly freebsd linux netbsd openbsd solaris zos
-
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
-
-import (
- "bufio"
- "fmt"
- "io"
- "os"
- "strings"
-)
-
-// osRelease builds a string describing the operating system release based on the
-// properties of the os-release file. If no os-release file is found, or if the
-// required properties to build the release description string are missing, an empty
-// string is returned instead. For more information about os-release files, see:
-// https://www.freedesktop.org/software/systemd/man/os-release.html
-func osRelease() string {
- file, err := getOSReleaseFile()
- if err != nil {
- return ""
- }
-
- defer file.Close()
-
- values := parseOSReleaseFile(file)
-
- return buildOSRelease(values)
-}
-
-// getOSReleaseFile returns a *os.File pointing to one of the well-known os-release
-// files, according to their order of preference. If no file can be opened, it
-// returns an error.
-func getOSReleaseFile() (*os.File, error) {
- return getFirstAvailableFile([]string{"/etc/os-release", "/usr/lib/os-release"})
-}
-
-// parseOSReleaseFile process the file pointed by `file` as an os-release file and
-// returns a map with the key-values contained in it. Empty lines or lines starting
-// with a '#' character are ignored, as well as lines with the missing key=value
-// separator. Values are unquoted and unescaped.
-func parseOSReleaseFile(file io.Reader) map[string]string {
- values := make(map[string]string)
- scanner := bufio.NewScanner(file)
-
- for scanner.Scan() {
- line := scanner.Text()
-
- if skip(line) {
- continue
- }
-
- key, value, ok := parse(line)
- if ok {
- values[key] = value
- }
- }
-
- return values
-}
-
-// skip returns true if the line is blank or starts with a '#' character, and
-// therefore should be skipped from processing.
-func skip(line string) bool {
- line = strings.TrimSpace(line)
-
- return len(line) == 0 || strings.HasPrefix(line, "#")
-}
-
-// parse attempts to split the provided line on the first '=' character, and then
-// sanitize each side of the split before returning them as a key-value pair.
-func parse(line string) (string, string, bool) {
- k, v, found := strings.Cut(line, "=")
-
- if !found || len(k) == 0 {
- return "", "", false
- }
-
- key := strings.TrimSpace(k)
- value := unescape(unquote(strings.TrimSpace(v)))
-
- return key, value, true
-}
-
-// unquote checks whether the string `s` is quoted with double or single quotes
-// and, if so, returns a version of the string without them. Otherwise it returns
-// the provided string unchanged.
-func unquote(s string) string {
- if len(s) < 2 {
- return s
- }
-
- if (s[0] == '"' || s[0] == '\'') && s[0] == s[len(s)-1] {
- return s[1 : len(s)-1]
- }
-
- return s
-}
-
-// unescape removes the `\` prefix from some characters that are expected
-// to have it added in front of them for escaping purposes.
-func unescape(s string) string {
- return strings.NewReplacer(
- `\$`, `$`,
- `\"`, `"`,
- `\'`, `'`,
- `\\`, `\`,
- "\\`", "`",
- ).Replace(s)
-}
-
-// buildOSRelease builds a string describing the OS release based on the properties
-// available on the provided map. It favors a combination of the `NAME` and `VERSION`
-// properties as first option (falling back to `VERSION_ID` if `VERSION` isn't
-// found), and using `PRETTY_NAME` alone if some of the previous are not present. If
-// none of these properties are found, it returns an empty string.
-//
-// The rationale behind not using `PRETTY_NAME` as first choice was that, for some
-// Linux distributions, it doesn't include the same detail that can be found on the
-// individual `NAME` and `VERSION` properties, and combining `PRETTY_NAME` with
-// other properties can produce "pretty" redundant strings in some cases.
-func buildOSRelease(values map[string]string) string {
- var osRelease string
-
- name := values["NAME"]
- version := values["VERSION"]
-
- if version == "" {
- version = values["VERSION_ID"]
- }
-
- if name != "" && version != "" {
- osRelease = fmt.Sprintf("%s %s", name, version)
- } else {
- osRelease = values["PRETTY_NAME"]
- }
-
- return osRelease
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/os_unix.go b/vendor/go.opentelemetry.io/otel/sdk/resource/os_unix.go
deleted file mode 100644
index a6ff26a4d..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/os_unix.go
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos
-// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos
-
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
-
-import (
- "fmt"
- "os"
-
- "golang.org/x/sys/unix"
-)
-
-type unameProvider func(buf *unix.Utsname) (err error)
-
-var defaultUnameProvider unameProvider = unix.Uname
-
-var currentUnameProvider = defaultUnameProvider
-
-func setDefaultUnameProvider() {
- setUnameProvider(defaultUnameProvider)
-}
-
-func setUnameProvider(unameProvider unameProvider) {
- currentUnameProvider = unameProvider
-}
-
-// platformOSDescription returns a human readable OS version information string.
-// The final string combines OS release information (where available) and the
-// result of the `uname` system call.
-func platformOSDescription() (string, error) {
- uname, err := uname()
- if err != nil {
- return "", err
- }
-
- osRelease := osRelease()
- if osRelease != "" {
- return fmt.Sprintf("%s (%s)", osRelease, uname), nil
- }
-
- return uname, nil
-}
-
-// uname issues a uname(2) system call (or equivalent on systems which doesn't
-// have one) and formats the output in a single string, similar to the output
-// of the `uname` commandline program. The final string resembles the one
-// obtained with a call to `uname -snrvm`.
-func uname() (string, error) {
- var utsName unix.Utsname
-
- err := currentUnameProvider(&utsName)
- if err != nil {
- return "", err
- }
-
- return fmt.Sprintf("%s %s %s %s %s",
- unix.ByteSliceToString(utsName.Sysname[:]),
- unix.ByteSliceToString(utsName.Nodename[:]),
- unix.ByteSliceToString(utsName.Release[:]),
- unix.ByteSliceToString(utsName.Version[:]),
- unix.ByteSliceToString(utsName.Machine[:]),
- ), nil
-}
-
-// getFirstAvailableFile returns an *os.File of the first available
-// file from a list of candidate file paths.
-func getFirstAvailableFile(candidates []string) (*os.File, error) {
- for _, c := range candidates {
- file, err := os.Open(c)
- if err == nil {
- return file, nil
- }
- }
-
- return nil, fmt.Errorf("no candidate file available: %v", candidates)
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/os_unsupported.go b/vendor/go.opentelemetry.io/otel/sdk/resource/os_unsupported.go
deleted file mode 100644
index a77742b07..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/os_unsupported.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-//go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos
-// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos
-
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
-
-// platformOSDescription is a placeholder implementation for OSes
-// for which this project currently doesn't support os.description
-// attribute detection. See build tags declaration early on this file
-// for a list of unsupported OSes.
-func platformOSDescription() (string, error) {
- return "<unknown>", nil
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/os_windows.go b/vendor/go.opentelemetry.io/otel/sdk/resource/os_windows.go
deleted file mode 100644
index a6a5a53c0..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/os_windows.go
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
-
-import (
- "fmt"
- "strconv"
-
- "golang.org/x/sys/windows/registry"
-)
-
-// platformOSDescription returns a human readable OS version information string.
-// It does so by querying registry values under the
-// `SOFTWARE\Microsoft\Windows NT\CurrentVersion` key. The final string
-// resembles the one displayed by the Version Reporter Applet (winver.exe).
-func platformOSDescription() (string, error) {
- k, err := registry.OpenKey(
- registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE)
- if err != nil {
- return "", err
- }
-
- defer k.Close()
-
- var (
- productName = readProductName(k)
- displayVersion = readDisplayVersion(k)
- releaseID = readReleaseID(k)
- currentMajorVersionNumber = readCurrentMajorVersionNumber(k)
- currentMinorVersionNumber = readCurrentMinorVersionNumber(k)
- currentBuildNumber = readCurrentBuildNumber(k)
- ubr = readUBR(k)
- )
-
- if displayVersion != "" {
- displayVersion += " "
- }
-
- return fmt.Sprintf("%s %s(%s) [Version %s.%s.%s.%s]",
- productName,
- displayVersion,
- releaseID,
- currentMajorVersionNumber,
- currentMinorVersionNumber,
- currentBuildNumber,
- ubr,
- ), nil
-}
-
-func getStringValue(name string, k registry.Key) string {
- value, _, _ := k.GetStringValue(name)
-
- return value
-}
-
-func getIntegerValue(name string, k registry.Key) uint64 {
- value, _, _ := k.GetIntegerValue(name)
-
- return value
-}
-
-func readProductName(k registry.Key) string {
- return getStringValue("ProductName", k)
-}
-
-func readDisplayVersion(k registry.Key) string {
- return getStringValue("DisplayVersion", k)
-}
-
-func readReleaseID(k registry.Key) string {
- return getStringValue("ReleaseID", k)
-}
-
-func readCurrentMajorVersionNumber(k registry.Key) string {
- return strconv.FormatUint(getIntegerValue("CurrentMajorVersionNumber", k), 10)
-}
-
-func readCurrentMinorVersionNumber(k registry.Key) string {
- return strconv.FormatUint(getIntegerValue("CurrentMinorVersionNumber", k), 10)
-}
-
-func readCurrentBuildNumber(k registry.Key) string {
- return getStringValue("CurrentBuildNumber", k)
-}
-
-func readUBR(k registry.Key) string {
- return strconv.FormatUint(getIntegerValue("UBR", k), 10)
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/process.go b/vendor/go.opentelemetry.io/otel/sdk/resource/process.go
deleted file mode 100644
index 085fe68fd..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/process.go
+++ /dev/null
@@ -1,173 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
-
-import (
- "context"
- "fmt"
- "os"
- "os/user"
- "path/filepath"
- "runtime"
-
- semconv "go.opentelemetry.io/otel/semconv/v1.26.0"
-)
-
-type (
- pidProvider func() int
- executablePathProvider func() (string, error)
- commandArgsProvider func() []string
- ownerProvider func() (*user.User, error)
- runtimeNameProvider func() string
- runtimeVersionProvider func() string
- runtimeOSProvider func() string
- runtimeArchProvider func() string
-)
-
-var (
- defaultPidProvider pidProvider = os.Getpid
- defaultExecutablePathProvider executablePathProvider = os.Executable
- defaultCommandArgsProvider commandArgsProvider = func() []string { return os.Args }
- defaultOwnerProvider ownerProvider = user.Current
- defaultRuntimeNameProvider runtimeNameProvider = func() string {
- if runtime.Compiler == "gc" {
- return "go"
- }
- return runtime.Compiler
- }
- defaultRuntimeVersionProvider runtimeVersionProvider = runtime.Version
- defaultRuntimeOSProvider runtimeOSProvider = func() string { return runtime.GOOS }
- defaultRuntimeArchProvider runtimeArchProvider = func() string { return runtime.GOARCH }
-)
-
-var (
- pid = defaultPidProvider
- executablePath = defaultExecutablePathProvider
- commandArgs = defaultCommandArgsProvider
- owner = defaultOwnerProvider
- runtimeName = defaultRuntimeNameProvider
- runtimeVersion = defaultRuntimeVersionProvider
- runtimeOS = defaultRuntimeOSProvider
- runtimeArch = defaultRuntimeArchProvider
-)
-
-func setDefaultOSProviders() {
- setOSProviders(
- defaultPidProvider,
- defaultExecutablePathProvider,
- defaultCommandArgsProvider,
- )
-}
-
-func setOSProviders(
- pidProvider pidProvider,
- executablePathProvider executablePathProvider,
- commandArgsProvider commandArgsProvider,
-) {
- pid = pidProvider
- executablePath = executablePathProvider
- commandArgs = commandArgsProvider
-}
-
-func setDefaultRuntimeProviders() {
- setRuntimeProviders(
- defaultRuntimeNameProvider,
- defaultRuntimeVersionProvider,
- defaultRuntimeOSProvider,
- defaultRuntimeArchProvider,
- )
-}
-
-func setRuntimeProviders(
- runtimeNameProvider runtimeNameProvider,
- runtimeVersionProvider runtimeVersionProvider,
- runtimeOSProvider runtimeOSProvider,
- runtimeArchProvider runtimeArchProvider,
-) {
- runtimeName = runtimeNameProvider
- runtimeVersion = runtimeVersionProvider
- runtimeOS = runtimeOSProvider
- runtimeArch = runtimeArchProvider
-}
-
-func setDefaultUserProviders() {
- setUserProviders(defaultOwnerProvider)
-}
-
-func setUserProviders(ownerProvider ownerProvider) {
- owner = ownerProvider
-}
-
-type (
- processPIDDetector struct{}
- processExecutableNameDetector struct{}
- processExecutablePathDetector struct{}
- processCommandArgsDetector struct{}
- processOwnerDetector struct{}
- processRuntimeNameDetector struct{}
- processRuntimeVersionDetector struct{}
- processRuntimeDescriptionDetector struct{}
-)
-
-// Detect returns a *Resource that describes the process identifier (PID) of the
-// executing process.
-func (processPIDDetector) Detect(ctx context.Context) (*Resource, error) {
- return NewWithAttributes(semconv.SchemaURL, semconv.ProcessPID(pid())), nil
-}
-
-// Detect returns a *Resource that describes the name of the process executable.
-func (processExecutableNameDetector) Detect(ctx context.Context) (*Resource, error) {
- executableName := filepath.Base(commandArgs()[0])
-
- return NewWithAttributes(semconv.SchemaURL, semconv.ProcessExecutableName(executableName)), nil
-}
-
-// Detect returns a *Resource that describes the full path of the process executable.
-func (processExecutablePathDetector) Detect(ctx context.Context) (*Resource, error) {
- executablePath, err := executablePath()
- if err != nil {
- return nil, err
- }
-
- return NewWithAttributes(semconv.SchemaURL, semconv.ProcessExecutablePath(executablePath)), nil
-}
-
-// Detect returns a *Resource that describes all the command arguments as received
-// by the process.
-func (processCommandArgsDetector) Detect(ctx context.Context) (*Resource, error) {
- return NewWithAttributes(semconv.SchemaURL, semconv.ProcessCommandArgs(commandArgs()...)), nil
-}
-
-// Detect returns a *Resource that describes the username of the user that owns the
-// process.
-func (processOwnerDetector) Detect(ctx context.Context) (*Resource, error) {
- owner, err := owner()
- if err != nil {
- return nil, err
- }
-
- return NewWithAttributes(semconv.SchemaURL, semconv.ProcessOwner(owner.Username)), nil
-}
-
-// Detect returns a *Resource that describes the name of the compiler used to compile
-// this process image.
-func (processRuntimeNameDetector) Detect(ctx context.Context) (*Resource, error) {
- return NewWithAttributes(semconv.SchemaURL, semconv.ProcessRuntimeName(runtimeName())), nil
-}
-
-// Detect returns a *Resource that describes the version of the runtime of this process.
-func (processRuntimeVersionDetector) Detect(ctx context.Context) (*Resource, error) {
- return NewWithAttributes(semconv.SchemaURL, semconv.ProcessRuntimeVersion(runtimeVersion())), nil
-}
-
-// Detect returns a *Resource that describes the runtime of this process.
-func (processRuntimeDescriptionDetector) Detect(ctx context.Context) (*Resource, error) {
- runtimeDescription := fmt.Sprintf(
- "go version %s %s/%s", runtimeVersion(), runtimeOS(), runtimeArch())
-
- return NewWithAttributes(
- semconv.SchemaURL,
- semconv.ProcessRuntimeDescription(runtimeDescription),
- ), nil
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/resource.go b/vendor/go.opentelemetry.io/otel/sdk/resource/resource.go
deleted file mode 100644
index ad4b50df4..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/resource/resource.go
+++ /dev/null
@@ -1,294 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package resource // import "go.opentelemetry.io/otel/sdk/resource"
-
-import (
- "context"
- "errors"
- "fmt"
- "sync"
-
- "go.opentelemetry.io/otel"
- "go.opentelemetry.io/otel/attribute"
- "go.opentelemetry.io/otel/sdk/internal/x"
-)
-
-// Resource describes an entity about which identifying information
-// and metadata is exposed. Resource is an immutable object,
-// equivalent to a map from key to unique value.
-//
-// Resources should be passed and stored as pointers
-// (`*resource.Resource`). The `nil` value is equivalent to an empty
-// Resource.
-type Resource struct {
- attrs attribute.Set
- schemaURL string
-}
-
-var (
- defaultResource *Resource
- defaultResourceOnce sync.Once
-)
-
-// ErrSchemaURLConflict is an error returned when two Resources are merged
-// together that contain different, non-empty, schema URLs.
-var ErrSchemaURLConflict = errors.New("conflicting Schema URL")
-
-// New returns a [Resource] built using opts.
-//
-// This may return a partial Resource along with an error containing
-// [ErrPartialResource] if options that provide a [Detector] are used and that
-// error is returned from one or more of the Detectors. It may also return a
-// merge-conflict Resource along with an error containing
-// [ErrSchemaURLConflict] if merging Resources from the opts results in a
-// schema URL conflict (see [Resource.Merge] for more information). It is up to
-// the caller to determine if this returned Resource should be used or not
-// based on these errors.
-func New(ctx context.Context, opts ...Option) (*Resource, error) {
- cfg := config{}
- for _, opt := range opts {
- cfg = opt.apply(cfg)
- }
-
- r := &Resource{schemaURL: cfg.schemaURL}
- return r, detect(ctx, r, cfg.detectors)
-}
-
-// NewWithAttributes creates a resource from attrs and associates the resource with a
-// schema URL. If attrs contains duplicate keys, the last value will be used. If attrs
-// contains any invalid items those items will be dropped. The attrs are assumed to be
-// in a schema identified by schemaURL.
-func NewWithAttributes(schemaURL string, attrs ...attribute.KeyValue) *Resource {
- resource := NewSchemaless(attrs...)
- resource.schemaURL = schemaURL
- return resource
-}
-
-// NewSchemaless creates a resource from attrs. If attrs contains duplicate keys,
-// the last value will be used. If attrs contains any invalid items those items will
-// be dropped. The resource will not be associated with a schema URL. If the schema
-// of the attrs is known use NewWithAttributes instead.
-func NewSchemaless(attrs ...attribute.KeyValue) *Resource {
- if len(attrs) == 0 {
- return &Resource{}
- }
-
- // Ensure attributes comply with the specification:
- // https://github.com/open-telemetry/opentelemetry-specification/blob/v1.20.0/specification/common/README.md#attribute
- s, _ := attribute.NewSetWithFiltered(attrs, func(kv attribute.KeyValue) bool {
- return kv.Valid()
- })
-
- // If attrs only contains invalid entries do not allocate a new resource.
- if s.Len() == 0 {
- return &Resource{}
- }
-
- return &Resource{attrs: s} //nolint
-}
-
-// String implements the Stringer interface and provides a
-// human-readable form of the resource.
-//
-// Avoid using this representation as the key in a map of resources,
-// use Equivalent() as the key instead.
-func (r *Resource) String() string {
- if r == nil {
- return ""
- }
- return r.attrs.Encoded(attribute.DefaultEncoder())
-}
-
-// MarshalLog is the marshaling function used by the logging system to represent this Resource.
-func (r *Resource) MarshalLog() interface{} {
- return struct {
- Attributes attribute.Set
- SchemaURL string
- }{
- Attributes: r.attrs,
- SchemaURL: r.schemaURL,
- }
-}
-
-// Attributes returns a copy of attributes from the resource in a sorted order.
-// To avoid allocating a new slice, use an iterator.
-func (r *Resource) Attributes() []attribute.KeyValue {
- if r == nil {
- r = Empty()
- }
- return r.attrs.ToSlice()
-}
-
-// SchemaURL returns the schema URL associated with Resource r.
-func (r *Resource) SchemaURL() string {
- if r == nil {
- return ""
- }
- return r.schemaURL
-}
-
-// Iter returns an iterator of the Resource attributes.
-// This is ideal to use if you do not want a copy of the attributes.
-func (r *Resource) Iter() attribute.Iterator {
- if r == nil {
- r = Empty()
- }
- return r.attrs.Iter()
-}
-
-// Equal returns true when a Resource is equivalent to this Resource.
-func (r *Resource) Equal(eq *Resource) bool {
- if r == nil {
- r = Empty()
- }
- if eq == nil {
- eq = Empty()
- }
- return r.Equivalent() == eq.Equivalent()
-}
-
-// Merge creates a new [Resource] by merging a and b.
-//
-// If there are common keys between a and b, then the value from b will
-// overwrite the value from a, even if b's value is empty.
-//
-// The SchemaURL of the resources will be merged according to the
-// [OpenTelemetry specification rules]:
-//
-// - If a's schema URL is empty then the returned Resource's schema URL will
-// be set to the schema URL of b,
-// - Else if b's schema URL is empty then the returned Resource's schema URL
-// will be set to the schema URL of a,
-// - Else if the schema URLs of a and b are the same then that will be the
-// schema URL of the returned Resource,
-// - Else this is a merging error. If the resources have different,
-// non-empty, schema URLs an error containing [ErrSchemaURLConflict] will
-// be returned with the merged Resource. The merged Resource will have an
-// empty schema URL. It may be the case that some unintended attributes
-// have been overwritten or old semantic conventions persisted in the
-// returned Resource. It is up to the caller to determine if this returned
-// Resource should be used or not.
-//
-// [OpenTelemetry specification rules]: https://github.com/open-telemetry/opentelemetry-specification/blob/v1.20.0/specification/resource/sdk.md#merge
-func Merge(a, b *Resource) (*Resource, error) {
- if a == nil && b == nil {
- return Empty(), nil
- }
- if a == nil {
- return b, nil
- }
- if b == nil {
- return a, nil
- }
-
- // Note: 'b' attributes will overwrite 'a' with last-value-wins in attribute.Key()
- // Meaning this is equivalent to: append(a.Attributes(), b.Attributes()...)
- mi := attribute.NewMergeIterator(b.Set(), a.Set())
- combine := make([]attribute.KeyValue, 0, a.Len()+b.Len())
- for mi.Next() {
- combine = append(combine, mi.Attribute())
- }
-
- switch {
- case a.schemaURL == "":
- return NewWithAttributes(b.schemaURL, combine...), nil
- case b.schemaURL == "":
- return NewWithAttributes(a.schemaURL, combine...), nil
- case a.schemaURL == b.schemaURL:
- return NewWithAttributes(a.schemaURL, combine...), nil
- }
- // Return the merged resource with an appropriate error. It is up to
- // the user to decide if the returned resource can be used or not.
- return NewSchemaless(combine...), fmt.Errorf(
- "%w: %s and %s",
- ErrSchemaURLConflict,
- a.schemaURL,
- b.schemaURL,
- )
-}
-
-// Empty returns an instance of Resource with no attributes. It is
-// equivalent to a `nil` Resource.
-func Empty() *Resource {
- return &Resource{}
-}
-
-// Default returns an instance of Resource with a default
-// "service.name" and OpenTelemetrySDK attributes.
-func Default() *Resource {
- defaultResourceOnce.Do(func() {
- var err error
- defaultDetectors := []Detector{
- defaultServiceNameDetector{},
- fromEnv{},
- telemetrySDK{},
- }
- if x.Resource.Enabled() {
- defaultDetectors = append([]Detector{defaultServiceInstanceIDDetector{}}, defaultDetectors...)
- }
- defaultResource, err = Detect(
- context.Background(),
- defaultDetectors...,
- )
- if err != nil {
- otel.Handle(err)
- }
- // If Detect did not return a valid resource, fall back to emptyResource.
- if defaultResource == nil {
- defaultResource = &Resource{}
- }
- })
- return defaultResource
-}
-
-// Environment returns an instance of Resource with attributes
-// extracted from the OTEL_RESOURCE_ATTRIBUTES environment variable.
-func Environment() *Resource {
- detector := &fromEnv{}
- resource, err := detector.Detect(context.Background())
- if err != nil {
- otel.Handle(err)
- }
- return resource
-}
-
-// Equivalent returns an object that can be compared for equality
-// between two resources. This value is suitable for use as a key in
-// a map.
-func (r *Resource) Equivalent() attribute.Distinct {
- return r.Set().Equivalent()
-}
-
-// Set returns the equivalent *attribute.Set of this resource's attributes.
-func (r *Resource) Set() *attribute.Set {
- if r == nil {
- r = Empty()
- }
- return &r.attrs
-}
-
-// MarshalJSON encodes the resource attributes as a JSON list of { "Key":
-// "...", "Value": ... } pairs in order sorted by key.
-func (r *Resource) MarshalJSON() ([]byte, error) {
- if r == nil {
- r = Empty()
- }
- return r.attrs.MarshalJSON()
-}
-
-// Len returns the number of unique key-values in this Resource.
-func (r *Resource) Len() int {
- if r == nil {
- return 0
- }
- return r.attrs.Len()
-}
-
-// Encoded returns an encoded representation of the resource.
-func (r *Resource) Encoded(enc attribute.Encoder) string {
- if r == nil {
- return ""
- }
- return r.attrs.Encoded(enc)
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/README.md b/vendor/go.opentelemetry.io/otel/sdk/trace/README.md
deleted file mode 100644
index f2936e143..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/trace/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# SDK Trace
-
-[![PkgGoDev](https://pkg.go.dev/badge/go.opentelemetry.io/otel/sdk/trace)](https://pkg.go.dev/go.opentelemetry.io/otel/sdk/trace)
diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/batch_span_processor.go b/vendor/go.opentelemetry.io/otel/sdk/trace/batch_span_processor.go
deleted file mode 100644
index ccc97e1b6..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/trace/batch_span_processor.go
+++ /dev/null
@@ -1,414 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package trace // import "go.opentelemetry.io/otel/sdk/trace"
-
-import (
- "context"
- "sync"
- "sync/atomic"
- "time"
-
- "go.opentelemetry.io/otel"
- "go.opentelemetry.io/otel/internal/global"
- "go.opentelemetry.io/otel/sdk/internal/env"
- "go.opentelemetry.io/otel/trace"
-)
-
-// Defaults for BatchSpanProcessorOptions.
-const (
- DefaultMaxQueueSize = 2048
- DefaultScheduleDelay = 5000
- DefaultExportTimeout = 30000
- DefaultMaxExportBatchSize = 512
-)
-
-// BatchSpanProcessorOption configures a BatchSpanProcessor.
-type BatchSpanProcessorOption func(o *BatchSpanProcessorOptions)
-
-// BatchSpanProcessorOptions is configuration settings for a
-// BatchSpanProcessor.
-type BatchSpanProcessorOptions struct {
- // MaxQueueSize is the maximum queue size to buffer spans for delayed processing. If the
- // queue gets full it drops the spans. Use BlockOnQueueFull to change this behavior.
- // The default value of MaxQueueSize is 2048.
- MaxQueueSize int
-
- // BatchTimeout is the maximum duration for constructing a batch. Processor
- // forcefully sends available spans when timeout is reached.
- // The default value of BatchTimeout is 5000 msec.
- BatchTimeout time.Duration
-
- // ExportTimeout specifies the maximum duration for exporting spans. If the timeout
- // is reached, the export will be cancelled.
- // The default value of ExportTimeout is 30000 msec.
- ExportTimeout time.Duration
-
- // MaxExportBatchSize is the maximum number of spans to process in a single batch.
- // If there are more than one batch worth of spans then it processes multiple batches
- // of spans one batch after the other without any delay.
- // The default value of MaxExportBatchSize is 512.
- MaxExportBatchSize int
-
- // BlockOnQueueFull blocks onEnd() and onStart() method if the queue is full
- // AND if BlockOnQueueFull is set to true.
- // Blocking option should be used carefully as it can severely affect the performance of an
- // application.
- BlockOnQueueFull bool
-}
-
-// batchSpanProcessor is a SpanProcessor that batches asynchronously-received
-// spans and sends them to a trace.Exporter when complete.
-type batchSpanProcessor struct {
- e SpanExporter
- o BatchSpanProcessorOptions
-
- queue chan ReadOnlySpan
- dropped uint32
-
- batch []ReadOnlySpan
- batchMutex sync.Mutex
- timer *time.Timer
- stopWait sync.WaitGroup
- stopOnce sync.Once
- stopCh chan struct{}
- stopped atomic.Bool
-}
-
-var _ SpanProcessor = (*batchSpanProcessor)(nil)
-
-// NewBatchSpanProcessor creates a new SpanProcessor that will send completed
-// span batches to the exporter with the supplied options.
-//
-// If the exporter is nil, the span processor will perform no action.
-func NewBatchSpanProcessor(exporter SpanExporter, options ...BatchSpanProcessorOption) SpanProcessor {
- maxQueueSize := env.BatchSpanProcessorMaxQueueSize(DefaultMaxQueueSize)
- maxExportBatchSize := env.BatchSpanProcessorMaxExportBatchSize(DefaultMaxExportBatchSize)
-
- if maxExportBatchSize > maxQueueSize {
- if DefaultMaxExportBatchSize > maxQueueSize {
- maxExportBatchSize = maxQueueSize
- } else {
- maxExportBatchSize = DefaultMaxExportBatchSize
- }
- }
-
- o := BatchSpanProcessorOptions{
- BatchTimeout: time.Duration(env.BatchSpanProcessorScheduleDelay(DefaultScheduleDelay)) * time.Millisecond,
- ExportTimeout: time.Duration(env.BatchSpanProcessorExportTimeout(DefaultExportTimeout)) * time.Millisecond,
- MaxQueueSize: maxQueueSize,
- MaxExportBatchSize: maxExportBatchSize,
- }
- for _, opt := range options {
- opt(&o)
- }
- bsp := &batchSpanProcessor{
- e: exporter,
- o: o,
- batch: make([]ReadOnlySpan, 0, o.MaxExportBatchSize),
- timer: time.NewTimer(o.BatchTimeout),
- queue: make(chan ReadOnlySpan, o.MaxQueueSize),
- stopCh: make(chan struct{}),
- }
-
- bsp.stopWait.Add(1)
- go func() {
- defer bsp.stopWait.Done()
- bsp.processQueue()
- bsp.drainQueue()
- }()
-
- return bsp
-}
-
-// OnStart method does nothing.
-func (bsp *batchSpanProcessor) OnStart(parent context.Context, s ReadWriteSpan) {}
-
-// OnEnd method enqueues a ReadOnlySpan for later processing.
-func (bsp *batchSpanProcessor) OnEnd(s ReadOnlySpan) {
- // Do not enqueue spans after Shutdown.
- if bsp.stopped.Load() {
- return
- }
-
- // Do not enqueue spans if we are just going to drop them.
- if bsp.e == nil {
- return
- }
- bsp.enqueue(s)
-}
-
-// Shutdown flushes the queue and waits until all spans are processed.
-// It only executes once. Subsequent call does nothing.
-func (bsp *batchSpanProcessor) Shutdown(ctx context.Context) error {
- var err error
- bsp.stopOnce.Do(func() {
- bsp.stopped.Store(true)
- wait := make(chan struct{})
- go func() {
- close(bsp.stopCh)
- bsp.stopWait.Wait()
- if bsp.e != nil {
- if err := bsp.e.Shutdown(ctx); err != nil {
- otel.Handle(err)
- }
- }
- close(wait)
- }()
- // Wait until the wait group is done or the context is cancelled
- select {
- case <-wait:
- case <-ctx.Done():
- err = ctx.Err()
- }
- })
- return err
-}
-
-type forceFlushSpan struct {
- ReadOnlySpan
- flushed chan struct{}
-}
-
-func (f forceFlushSpan) SpanContext() trace.SpanContext {
- return trace.NewSpanContext(trace.SpanContextConfig{TraceFlags: trace.FlagsSampled})
-}
-
-// ForceFlush exports all ended spans that have not yet been exported.
-func (bsp *batchSpanProcessor) ForceFlush(ctx context.Context) error {
- // Interrupt if context is already canceled.
- if err := ctx.Err(); err != nil {
- return err
- }
-
- // Do nothing after Shutdown.
- if bsp.stopped.Load() {
- return nil
- }
-
- var err error
- if bsp.e != nil {
- flushCh := make(chan struct{})
- if bsp.enqueueBlockOnQueueFull(ctx, forceFlushSpan{flushed: flushCh}) {
- select {
- case <-bsp.stopCh:
- // The batchSpanProcessor is Shutdown.
- return nil
- case <-flushCh:
- // Processed any items in queue prior to ForceFlush being called
- case <-ctx.Done():
- return ctx.Err()
- }
- }
-
- wait := make(chan error)
- go func() {
- wait <- bsp.exportSpans(ctx)
- close(wait)
- }()
- // Wait until the export is finished or the context is cancelled/timed out
- select {
- case err = <-wait:
- case <-ctx.Done():
- err = ctx.Err()
- }
- }
- return err
-}
-
-// WithMaxQueueSize returns a BatchSpanProcessorOption that configures the
-// maximum queue size allowed for a BatchSpanProcessor.
-func WithMaxQueueSize(size int) BatchSpanProcessorOption {
- return func(o *BatchSpanProcessorOptions) {
- o.MaxQueueSize = size
- }
-}
-
-// WithMaxExportBatchSize returns a BatchSpanProcessorOption that configures
-// the maximum export batch size allowed for a BatchSpanProcessor.
-func WithMaxExportBatchSize(size int) BatchSpanProcessorOption {
- return func(o *BatchSpanProcessorOptions) {
- o.MaxExportBatchSize = size
- }
-}
-
-// WithBatchTimeout returns a BatchSpanProcessorOption that configures the
-// maximum delay allowed for a BatchSpanProcessor before it will export any
-// held span (whether the queue is full or not).
-func WithBatchTimeout(delay time.Duration) BatchSpanProcessorOption {
- return func(o *BatchSpanProcessorOptions) {
- o.BatchTimeout = delay
- }
-}
-
-// WithExportTimeout returns a BatchSpanProcessorOption that configures the
-// amount of time a BatchSpanProcessor waits for an exporter to export before
-// abandoning the export.
-func WithExportTimeout(timeout time.Duration) BatchSpanProcessorOption {
- return func(o *BatchSpanProcessorOptions) {
- o.ExportTimeout = timeout
- }
-}
-
-// WithBlocking returns a BatchSpanProcessorOption that configures a
-// BatchSpanProcessor to wait for enqueue operations to succeed instead of
-// dropping data when the queue is full.
-func WithBlocking() BatchSpanProcessorOption {
- return func(o *BatchSpanProcessorOptions) {
- o.BlockOnQueueFull = true
- }
-}
-
-// exportSpans is a subroutine of processing and draining the queue.
-func (bsp *batchSpanProcessor) exportSpans(ctx context.Context) error {
- bsp.timer.Reset(bsp.o.BatchTimeout)
-
- bsp.batchMutex.Lock()
- defer bsp.batchMutex.Unlock()
-
- if bsp.o.ExportTimeout > 0 {
- var cancel context.CancelFunc
- ctx, cancel = context.WithTimeout(ctx, bsp.o.ExportTimeout)
- defer cancel()
- }
-
- if l := len(bsp.batch); l > 0 {
- global.Debug("exporting spans", "count", len(bsp.batch), "total_dropped", atomic.LoadUint32(&bsp.dropped))
- err := bsp.e.ExportSpans(ctx, bsp.batch)
-
- // A new batch is always created after exporting, even if the batch failed to be exported.
- //
- // It is up to the exporter to implement any type of retry logic if a batch is failing
- // to be exported, since it is specific to the protocol and backend being sent to.
- clear(bsp.batch) // Erase elements to let GC collect objects
- bsp.batch = bsp.batch[:0]
-
- if err != nil {
- return err
- }
- }
- return nil
-}
-
-// processQueue removes spans from the `queue` channel until processor
-// is shut down. It calls the exporter in batches of up to MaxExportBatchSize
-// waiting up to BatchTimeout to form a batch.
-func (bsp *batchSpanProcessor) processQueue() {
- defer bsp.timer.Stop()
-
- ctx, cancel := context.WithCancel(context.Background())
- defer cancel()
- for {
- select {
- case <-bsp.stopCh:
- return
- case <-bsp.timer.C:
- if err := bsp.exportSpans(ctx); err != nil {
- otel.Handle(err)
- }
- case sd := <-bsp.queue:
- if ffs, ok := sd.(forceFlushSpan); ok {
- close(ffs.flushed)
- continue
- }
- bsp.batchMutex.Lock()
- bsp.batch = append(bsp.batch, sd)
- shouldExport := len(bsp.batch) >= bsp.o.MaxExportBatchSize
- bsp.batchMutex.Unlock()
- if shouldExport {
- if !bsp.timer.Stop() {
- // Handle both GODEBUG=asynctimerchan=[0|1] properly.
- select {
- case <-bsp.timer.C:
- default:
- }
- }
- if err := bsp.exportSpans(ctx); err != nil {
- otel.Handle(err)
- }
- }
- }
- }
-}
-
-// drainQueue awaits the any caller that had added to bsp.stopWait
-// to finish the enqueue, then exports the final batch.
-func (bsp *batchSpanProcessor) drainQueue() {
- ctx, cancel := context.WithCancel(context.Background())
- defer cancel()
- for {
- select {
- case sd := <-bsp.queue:
- if _, ok := sd.(forceFlushSpan); ok {
- // Ignore flush requests as they are not valid spans.
- continue
- }
-
- bsp.batchMutex.Lock()
- bsp.batch = append(bsp.batch, sd)
- shouldExport := len(bsp.batch) == bsp.o.MaxExportBatchSize
- bsp.batchMutex.Unlock()
-
- if shouldExport {
- if err := bsp.exportSpans(ctx); err != nil {
- otel.Handle(err)
- }
- }
- default:
- // There are no more enqueued spans. Make final export.
- if err := bsp.exportSpans(ctx); err != nil {
- otel.Handle(err)
- }
- return
- }
- }
-}
-
-func (bsp *batchSpanProcessor) enqueue(sd ReadOnlySpan) {
- ctx := context.TODO()
- if bsp.o.BlockOnQueueFull {
- bsp.enqueueBlockOnQueueFull(ctx, sd)
- } else {
- bsp.enqueueDrop(ctx, sd)
- }
-}
-
-func (bsp *batchSpanProcessor) enqueueBlockOnQueueFull(ctx context.Context, sd ReadOnlySpan) bool {
- if !sd.SpanContext().IsSampled() {
- return false
- }
-
- select {
- case bsp.queue <- sd:
- return true
- case <-ctx.Done():
- return false
- }
-}
-
-func (bsp *batchSpanProcessor) enqueueDrop(_ context.Context, sd ReadOnlySpan) bool {
- if !sd.SpanContext().IsSampled() {
- return false
- }
-
- select {
- case bsp.queue <- sd:
- return true
- default:
- atomic.AddUint32(&bsp.dropped, 1)
- }
- return false
-}
-
-// MarshalLog is the marshaling function used by the logging system to represent this Span Processor.
-func (bsp *batchSpanProcessor) MarshalLog() interface{} {
- return struct {
- Type string
- SpanExporter SpanExporter
- Config BatchSpanProcessorOptions
- }{
- Type: "BatchSpanProcessor",
- SpanExporter: bsp.e,
- Config: bsp.o,
- }
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/doc.go b/vendor/go.opentelemetry.io/otel/sdk/trace/doc.go
deleted file mode 100644
index 1f60524e3..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/trace/doc.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-/*
-Package trace contains support for OpenTelemetry distributed tracing.
-
-The following assumes a basic familiarity with OpenTelemetry concepts.
-See https://opentelemetry.io.
-*/
-package trace // import "go.opentelemetry.io/otel/sdk/trace"
diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/event.go b/vendor/go.opentelemetry.io/otel/sdk/trace/event.go
deleted file mode 100644
index 60a7ed134..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/trace/event.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package trace // import "go.opentelemetry.io/otel/sdk/trace"
-
-import (
- "time"
-
- "go.opentelemetry.io/otel/attribute"
-)
-
-// Event is a thing that happened during a Span's lifetime.
-type Event struct {
- // Name is the name of this event
- Name string
-
- // Attributes describe the aspects of the event.
- Attributes []attribute.KeyValue
-
- // DroppedAttributeCount is the number of attributes that were not
- // recorded due to configured limits being reached.
- DroppedAttributeCount int
-
- // Time at which this event was recorded.
- Time time.Time
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/evictedqueue.go b/vendor/go.opentelemetry.io/otel/sdk/trace/evictedqueue.go
deleted file mode 100644
index 8c308dd60..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/trace/evictedqueue.go
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package trace // import "go.opentelemetry.io/otel/sdk/trace"
-
-import (
- "slices"
- "sync"
-
- "go.opentelemetry.io/otel/internal/global"
-)
-
-// evictedQueue is a FIFO queue with a configurable capacity.
-type evictedQueue[T any] struct {
- queue []T
- capacity int
- droppedCount int
- logDroppedMsg string
- logDroppedOnce sync.Once
-}
-
-func newEvictedQueueEvent(capacity int) evictedQueue[Event] {
- // Do not pre-allocate queue, do this lazily.
- return evictedQueue[Event]{
- capacity: capacity,
- logDroppedMsg: "limit reached: dropping trace trace.Event",
- }
-}
-
-func newEvictedQueueLink(capacity int) evictedQueue[Link] {
- // Do not pre-allocate queue, do this lazily.
- return evictedQueue[Link]{
- capacity: capacity,
- logDroppedMsg: "limit reached: dropping trace trace.Link",
- }
-}
-
-// add adds value to the evictedQueue eq. If eq is at capacity, the oldest
-// queued value will be discarded and the drop count incremented.
-func (eq *evictedQueue[T]) add(value T) {
- if eq.capacity == 0 {
- eq.droppedCount++
- eq.logDropped()
- return
- }
-
- if eq.capacity > 0 && len(eq.queue) == eq.capacity {
- // Drop first-in while avoiding allocating more capacity to eq.queue.
- copy(eq.queue[:eq.capacity-1], eq.queue[1:])
- eq.queue = eq.queue[:eq.capacity-1]
- eq.droppedCount++
- eq.logDropped()
- }
- eq.queue = append(eq.queue, value)
-}
-
-func (eq *evictedQueue[T]) logDropped() {
- eq.logDroppedOnce.Do(func() { global.Warn(eq.logDroppedMsg) })
-}
-
-// copy returns a copy of the evictedQueue.
-func (eq *evictedQueue[T]) copy() []T {
- return slices.Clone(eq.queue)
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/id_generator.go b/vendor/go.opentelemetry.io/otel/sdk/trace/id_generator.go
deleted file mode 100644
index 925bcf993..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/trace/id_generator.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package trace // import "go.opentelemetry.io/otel/sdk/trace"
-
-import (
- "context"
- crand "crypto/rand"
- "encoding/binary"
- "math/rand"
- "sync"
-
- "go.opentelemetry.io/otel/trace"
-)
-
-// IDGenerator allows custom generators for TraceID and SpanID.
-type IDGenerator interface {
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-
- // NewIDs returns a new trace and span ID.
- NewIDs(ctx context.Context) (trace.TraceID, trace.SpanID)
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-
- // NewSpanID returns a ID for a new span in the trace with traceID.
- NewSpanID(ctx context.Context, traceID trace.TraceID) trace.SpanID
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-}
-
-type randomIDGenerator struct {
- sync.Mutex
- randSource *rand.Rand
-}
-
-var _ IDGenerator = &randomIDGenerator{}
-
-// NewSpanID returns a non-zero span ID from a randomly-chosen sequence.
-func (gen *randomIDGenerator) NewSpanID(ctx context.Context, traceID trace.TraceID) trace.SpanID {
- gen.Lock()
- defer gen.Unlock()
- sid := trace.SpanID{}
- for {
- _, _ = gen.randSource.Read(sid[:])
- if sid.IsValid() {
- break
- }
- }
- return sid
-}
-
-// NewIDs returns a non-zero trace ID and a non-zero span ID from a
-// randomly-chosen sequence.
-func (gen *randomIDGenerator) NewIDs(ctx context.Context) (trace.TraceID, trace.SpanID) {
- gen.Lock()
- defer gen.Unlock()
- tid := trace.TraceID{}
- sid := trace.SpanID{}
- for {
- _, _ = gen.randSource.Read(tid[:])
- if tid.IsValid() {
- break
- }
- }
- for {
- _, _ = gen.randSource.Read(sid[:])
- if sid.IsValid() {
- break
- }
- }
- return tid, sid
-}
-
-func defaultIDGenerator() IDGenerator {
- gen := &randomIDGenerator{}
- var rngSeed int64
- _ = binary.Read(crand.Reader, binary.LittleEndian, &rngSeed)
- gen.randSource = rand.New(rand.NewSource(rngSeed))
- return gen
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/link.go b/vendor/go.opentelemetry.io/otel/sdk/trace/link.go
deleted file mode 100644
index c03bdc90f..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/trace/link.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package trace // import "go.opentelemetry.io/otel/sdk/trace"
-
-import (
- "go.opentelemetry.io/otel/attribute"
- "go.opentelemetry.io/otel/trace"
-)
-
-// Link is the relationship between two Spans. The relationship can be within
-// the same Trace or across different Traces.
-type Link struct {
- // SpanContext of the linked Span.
- SpanContext trace.SpanContext
-
- // Attributes describe the aspects of the link.
- Attributes []attribute.KeyValue
-
- // DroppedAttributeCount is the number of attributes that were not
- // recorded due to configured limits being reached.
- DroppedAttributeCount int
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/provider.go b/vendor/go.opentelemetry.io/otel/sdk/trace/provider.go
deleted file mode 100644
index 185aa7c08..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/trace/provider.go
+++ /dev/null
@@ -1,494 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package trace // import "go.opentelemetry.io/otel/sdk/trace"
-
-import (
- "context"
- "fmt"
- "sync"
- "sync/atomic"
-
- "go.opentelemetry.io/otel"
- "go.opentelemetry.io/otel/internal/global"
- "go.opentelemetry.io/otel/sdk/instrumentation"
- "go.opentelemetry.io/otel/sdk/resource"
- "go.opentelemetry.io/otel/trace"
- "go.opentelemetry.io/otel/trace/embedded"
- "go.opentelemetry.io/otel/trace/noop"
-)
-
-const (
- defaultTracerName = "go.opentelemetry.io/otel/sdk/tracer"
-)
-
-// tracerProviderConfig.
-type tracerProviderConfig struct {
- // processors contains collection of SpanProcessors that are processing pipeline
- // for spans in the trace signal.
- // SpanProcessors registered with a TracerProvider and are called at the start
- // and end of a Span's lifecycle, and are called in the order they are
- // registered.
- processors []SpanProcessor
-
- // sampler is the default sampler used when creating new spans.
- sampler Sampler
-
- // idGenerator is used to generate all Span and Trace IDs when needed.
- idGenerator IDGenerator
-
- // spanLimits defines the attribute, event, and link limits for spans.
- spanLimits SpanLimits
-
- // resource contains attributes representing an entity that produces telemetry.
- resource *resource.Resource
-}
-
-// MarshalLog is the marshaling function used by the logging system to represent this Provider.
-func (cfg tracerProviderConfig) MarshalLog() interface{} {
- return struct {
- SpanProcessors []SpanProcessor
- SamplerType string
- IDGeneratorType string
- SpanLimits SpanLimits
- Resource *resource.Resource
- }{
- SpanProcessors: cfg.processors,
- SamplerType: fmt.Sprintf("%T", cfg.sampler),
- IDGeneratorType: fmt.Sprintf("%T", cfg.idGenerator),
- SpanLimits: cfg.spanLimits,
- Resource: cfg.resource,
- }
-}
-
-// TracerProvider is an OpenTelemetry TracerProvider. It provides Tracers to
-// instrumentation so it can trace operational flow through a system.
-type TracerProvider struct {
- embedded.TracerProvider
-
- mu sync.Mutex
- namedTracer map[instrumentation.Scope]*tracer
- spanProcessors atomic.Pointer[spanProcessorStates]
-
- isShutdown atomic.Bool
-
- // These fields are not protected by the lock mu. They are assumed to be
- // immutable after creation of the TracerProvider.
- sampler Sampler
- idGenerator IDGenerator
- spanLimits SpanLimits
- resource *resource.Resource
-}
-
-var _ trace.TracerProvider = &TracerProvider{}
-
-// NewTracerProvider returns a new and configured TracerProvider.
-//
-// By default the returned TracerProvider is configured with:
-// - a ParentBased(AlwaysSample) Sampler
-// - a random number IDGenerator
-// - the resource.Default() Resource
-// - the default SpanLimits.
-//
-// The passed opts are used to override these default values and configure the
-// returned TracerProvider appropriately.
-func NewTracerProvider(opts ...TracerProviderOption) *TracerProvider {
- o := tracerProviderConfig{
- spanLimits: NewSpanLimits(),
- }
- o = applyTracerProviderEnvConfigs(o)
-
- for _, opt := range opts {
- o = opt.apply(o)
- }
-
- o = ensureValidTracerProviderConfig(o)
-
- tp := &TracerProvider{
- namedTracer: make(map[instrumentation.Scope]*tracer),
- sampler: o.sampler,
- idGenerator: o.idGenerator,
- spanLimits: o.spanLimits,
- resource: o.resource,
- }
- global.Info("TracerProvider created", "config", o)
-
- spss := make(spanProcessorStates, 0, len(o.processors))
- for _, sp := range o.processors {
- spss = append(spss, newSpanProcessorState(sp))
- }
- tp.spanProcessors.Store(&spss)
-
- return tp
-}
-
-// Tracer returns a Tracer with the given name and options. If a Tracer for
-// the given name and options does not exist it is created, otherwise the
-// existing Tracer is returned.
-//
-// If name is empty, DefaultTracerName is used instead.
-//
-// This method is safe to be called concurrently.
-func (p *TracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer {
- // This check happens before the mutex is acquired to avoid deadlocking if Tracer() is called from within Shutdown().
- if p.isShutdown.Load() {
- return noop.NewTracerProvider().Tracer(name, opts...)
- }
- c := trace.NewTracerConfig(opts...)
- if name == "" {
- name = defaultTracerName
- }
- is := instrumentation.Scope{
- Name: name,
- Version: c.InstrumentationVersion(),
- SchemaURL: c.SchemaURL(),
- Attributes: c.InstrumentationAttributes(),
- }
-
- t, ok := func() (trace.Tracer, bool) {
- p.mu.Lock()
- defer p.mu.Unlock()
- // Must check the flag after acquiring the mutex to avoid returning a valid tracer if Shutdown() ran
- // after the first check above but before we acquired the mutex.
- if p.isShutdown.Load() {
- return noop.NewTracerProvider().Tracer(name, opts...), true
- }
- t, ok := p.namedTracer[is]
- if !ok {
- t = &tracer{
- provider: p,
- instrumentationScope: is,
- }
- p.namedTracer[is] = t
- }
- return t, ok
- }()
- if !ok {
- // This code is outside the mutex to not hold the lock while calling third party logging code:
- // - That code may do slow things like I/O, which would prolong the duration the lock is held,
- // slowing down all tracing consumers.
- // - Logging code may be instrumented with tracing and deadlock because it could try
- // acquiring the same non-reentrant mutex.
- global.Info("Tracer created", "name", name, "version", is.Version, "schemaURL", is.SchemaURL, "attributes", is.Attributes)
- }
- return t
-}
-
-// RegisterSpanProcessor adds the given SpanProcessor to the list of SpanProcessors.
-func (p *TracerProvider) RegisterSpanProcessor(sp SpanProcessor) {
- // This check prevents calls during a shutdown.
- if p.isShutdown.Load() {
- return
- }
- p.mu.Lock()
- defer p.mu.Unlock()
- // This check prevents calls after a shutdown.
- if p.isShutdown.Load() {
- return
- }
-
- current := p.getSpanProcessors()
- newSPS := make(spanProcessorStates, 0, len(current)+1)
- newSPS = append(newSPS, current...)
- newSPS = append(newSPS, newSpanProcessorState(sp))
- p.spanProcessors.Store(&newSPS)
-}
-
-// UnregisterSpanProcessor removes the given SpanProcessor from the list of SpanProcessors.
-func (p *TracerProvider) UnregisterSpanProcessor(sp SpanProcessor) {
- // This check prevents calls during a shutdown.
- if p.isShutdown.Load() {
- return
- }
- p.mu.Lock()
- defer p.mu.Unlock()
- // This check prevents calls after a shutdown.
- if p.isShutdown.Load() {
- return
- }
- old := p.getSpanProcessors()
- if len(old) == 0 {
- return
- }
- spss := make(spanProcessorStates, len(old))
- copy(spss, old)
-
- // stop the span processor if it is started and remove it from the list
- var stopOnce *spanProcessorState
- var idx int
- for i, sps := range spss {
- if sps.sp == sp {
- stopOnce = sps
- idx = i
- }
- }
- if stopOnce != nil {
- stopOnce.state.Do(func() {
- if err := sp.Shutdown(context.Background()); err != nil {
- otel.Handle(err)
- }
- })
- }
- if len(spss) > 1 {
- copy(spss[idx:], spss[idx+1:])
- }
- spss[len(spss)-1] = nil
- spss = spss[:len(spss)-1]
-
- p.spanProcessors.Store(&spss)
-}
-
-// ForceFlush immediately exports all spans that have not yet been exported for
-// all the registered span processors.
-func (p *TracerProvider) ForceFlush(ctx context.Context) error {
- spss := p.getSpanProcessors()
- if len(spss) == 0 {
- return nil
- }
-
- for _, sps := range spss {
- select {
- case <-ctx.Done():
- return ctx.Err()
- default:
- }
-
- if err := sps.sp.ForceFlush(ctx); err != nil {
- return err
- }
- }
- return nil
-}
-
-// Shutdown shuts down TracerProvider. All registered span processors are shut down
-// in the order they were registered and any held computational resources are released.
-// After Shutdown is called, all methods are no-ops.
-func (p *TracerProvider) Shutdown(ctx context.Context) error {
- // This check prevents deadlocks in case of recursive shutdown.
- if p.isShutdown.Load() {
- return nil
- }
- p.mu.Lock()
- defer p.mu.Unlock()
- // This check prevents calls after a shutdown has already been done concurrently.
- if !p.isShutdown.CompareAndSwap(false, true) { // did toggle?
- return nil
- }
-
- var retErr error
- for _, sps := range p.getSpanProcessors() {
- select {
- case <-ctx.Done():
- return ctx.Err()
- default:
- }
-
- var err error
- sps.state.Do(func() {
- err = sps.sp.Shutdown(ctx)
- })
- if err != nil {
- if retErr == nil {
- retErr = err
- } else {
- // Poor man's list of errors
- retErr = fmt.Errorf("%w; %w", retErr, err)
- }
- }
- }
- p.spanProcessors.Store(&spanProcessorStates{})
- return retErr
-}
-
-func (p *TracerProvider) getSpanProcessors() spanProcessorStates {
- return *(p.spanProcessors.Load())
-}
-
-// TracerProviderOption configures a TracerProvider.
-type TracerProviderOption interface {
- apply(tracerProviderConfig) tracerProviderConfig
-}
-
-type traceProviderOptionFunc func(tracerProviderConfig) tracerProviderConfig
-
-func (fn traceProviderOptionFunc) apply(cfg tracerProviderConfig) tracerProviderConfig {
- return fn(cfg)
-}
-
-// WithSyncer registers the exporter with the TracerProvider using a
-// SimpleSpanProcessor.
-//
-// This is not recommended for production use. The synchronous nature of the
-// SimpleSpanProcessor that will wrap the exporter make it good for testing,
-// debugging, or showing examples of other feature, but it will be slow and
-// have a high computation resource usage overhead. The WithBatcher option is
-// recommended for production use instead.
-func WithSyncer(e SpanExporter) TracerProviderOption {
- return WithSpanProcessor(NewSimpleSpanProcessor(e))
-}
-
-// WithBatcher registers the exporter with the TracerProvider using a
-// BatchSpanProcessor configured with the passed opts.
-func WithBatcher(e SpanExporter, opts ...BatchSpanProcessorOption) TracerProviderOption {
- return WithSpanProcessor(NewBatchSpanProcessor(e, opts...))
-}
-
-// WithSpanProcessor registers the SpanProcessor with a TracerProvider.
-func WithSpanProcessor(sp SpanProcessor) TracerProviderOption {
- return traceProviderOptionFunc(func(cfg tracerProviderConfig) tracerProviderConfig {
- cfg.processors = append(cfg.processors, sp)
- return cfg
- })
-}
-
-// WithResource returns a TracerProviderOption that will configure the
-// Resource r as a TracerProvider's Resource. The configured Resource is
-// referenced by all the Tracers the TracerProvider creates. It represents the
-// entity producing telemetry.
-//
-// If this option is not used, the TracerProvider will use the
-// resource.Default() Resource by default.
-func WithResource(r *resource.Resource) TracerProviderOption {
- return traceProviderOptionFunc(func(cfg tracerProviderConfig) tracerProviderConfig {
- var err error
- cfg.resource, err = resource.Merge(resource.Environment(), r)
- if err != nil {
- otel.Handle(err)
- }
- return cfg
- })
-}
-
-// WithIDGenerator returns a TracerProviderOption that will configure the
-// IDGenerator g as a TracerProvider's IDGenerator. The configured IDGenerator
-// is used by the Tracers the TracerProvider creates to generate new Span and
-// Trace IDs.
-//
-// If this option is not used, the TracerProvider will use a random number
-// IDGenerator by default.
-func WithIDGenerator(g IDGenerator) TracerProviderOption {
- return traceProviderOptionFunc(func(cfg tracerProviderConfig) tracerProviderConfig {
- if g != nil {
- cfg.idGenerator = g
- }
- return cfg
- })
-}
-
-// WithSampler returns a TracerProviderOption that will configure the Sampler
-// s as a TracerProvider's Sampler. The configured Sampler is used by the
-// Tracers the TracerProvider creates to make their sampling decisions for the
-// Spans they create.
-//
-// This option overrides the Sampler configured through the OTEL_TRACES_SAMPLER
-// and OTEL_TRACES_SAMPLER_ARG environment variables. If this option is not used
-// and the sampler is not configured through environment variables or the environment
-// contains invalid/unsupported configuration, the TracerProvider will use a
-// ParentBased(AlwaysSample) Sampler by default.
-func WithSampler(s Sampler) TracerProviderOption {
- return traceProviderOptionFunc(func(cfg tracerProviderConfig) tracerProviderConfig {
- if s != nil {
- cfg.sampler = s
- }
- return cfg
- })
-}
-
-// WithSpanLimits returns a TracerProviderOption that configures a
-// TracerProvider to use the SpanLimits sl. These SpanLimits bound any Span
-// created by a Tracer from the TracerProvider.
-//
-// If any field of sl is zero or negative it will be replaced with the default
-// value for that field.
-//
-// If this or WithRawSpanLimits are not provided, the TracerProvider will use
-// the limits defined by environment variables, or the defaults if unset.
-// Refer to the NewSpanLimits documentation for information about this
-// relationship.
-//
-// Deprecated: Use WithRawSpanLimits instead which allows setting unlimited
-// and zero limits. This option will be kept until the next major version
-// incremented release.
-func WithSpanLimits(sl SpanLimits) TracerProviderOption {
- if sl.AttributeValueLengthLimit <= 0 {
- sl.AttributeValueLengthLimit = DefaultAttributeValueLengthLimit
- }
- if sl.AttributeCountLimit <= 0 {
- sl.AttributeCountLimit = DefaultAttributeCountLimit
- }
- if sl.EventCountLimit <= 0 {
- sl.EventCountLimit = DefaultEventCountLimit
- }
- if sl.AttributePerEventCountLimit <= 0 {
- sl.AttributePerEventCountLimit = DefaultAttributePerEventCountLimit
- }
- if sl.LinkCountLimit <= 0 {
- sl.LinkCountLimit = DefaultLinkCountLimit
- }
- if sl.AttributePerLinkCountLimit <= 0 {
- sl.AttributePerLinkCountLimit = DefaultAttributePerLinkCountLimit
- }
- return traceProviderOptionFunc(func(cfg tracerProviderConfig) tracerProviderConfig {
- cfg.spanLimits = sl
- return cfg
- })
-}
-
-// WithRawSpanLimits returns a TracerProviderOption that configures a
-// TracerProvider to use these limits. These limits bound any Span created by
-// a Tracer from the TracerProvider.
-//
-// The limits will be used as-is. Zero or negative values will not be changed
-// to the default value like WithSpanLimits does. Setting a limit to zero will
-// effectively disable the related resource it limits and setting to a
-// negative value will mean that resource is unlimited. Consequentially, this
-// means that the zero-value SpanLimits will disable all span resources.
-// Because of this, limits should be constructed using NewSpanLimits and
-// updated accordingly.
-//
-// If this or WithSpanLimits are not provided, the TracerProvider will use the
-// limits defined by environment variables, or the defaults if unset. Refer to
-// the NewSpanLimits documentation for information about this relationship.
-func WithRawSpanLimits(limits SpanLimits) TracerProviderOption {
- return traceProviderOptionFunc(func(cfg tracerProviderConfig) tracerProviderConfig {
- cfg.spanLimits = limits
- return cfg
- })
-}
-
-func applyTracerProviderEnvConfigs(cfg tracerProviderConfig) tracerProviderConfig {
- for _, opt := range tracerProviderOptionsFromEnv() {
- cfg = opt.apply(cfg)
- }
-
- return cfg
-}
-
-func tracerProviderOptionsFromEnv() []TracerProviderOption {
- var opts []TracerProviderOption
-
- sampler, err := samplerFromEnv()
- if err != nil {
- otel.Handle(err)
- }
-
- if sampler != nil {
- opts = append(opts, WithSampler(sampler))
- }
-
- return opts
-}
-
-// ensureValidTracerProviderConfig ensures that given TracerProviderConfig is valid.
-func ensureValidTracerProviderConfig(cfg tracerProviderConfig) tracerProviderConfig {
- if cfg.sampler == nil {
- cfg.sampler = ParentBased(AlwaysSample())
- }
- if cfg.idGenerator == nil {
- cfg.idGenerator = defaultIDGenerator()
- }
- if cfg.resource == nil {
- cfg.resource = resource.Default()
- }
- return cfg
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/sampler_env.go b/vendor/go.opentelemetry.io/otel/sdk/trace/sampler_env.go
deleted file mode 100644
index 9b672a1d7..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/trace/sampler_env.go
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package trace // import "go.opentelemetry.io/otel/sdk/trace"
-
-import (
- "errors"
- "os"
- "strconv"
- "strings"
-)
-
-const (
- tracesSamplerKey = "OTEL_TRACES_SAMPLER"
- tracesSamplerArgKey = "OTEL_TRACES_SAMPLER_ARG"
-
- samplerAlwaysOn = "always_on"
- samplerAlwaysOff = "always_off"
- samplerTraceIDRatio = "traceidratio"
- samplerParentBasedAlwaysOn = "parentbased_always_on"
- samplerParsedBasedAlwaysOff = "parentbased_always_off"
- samplerParentBasedTraceIDRatio = "parentbased_traceidratio"
-)
-
-type errUnsupportedSampler string
-
-func (e errUnsupportedSampler) Error() string {
- return "unsupported sampler: " + string(e)
-}
-
-var (
- errNegativeTraceIDRatio = errors.New("invalid trace ID ratio: less than 0.0")
- errGreaterThanOneTraceIDRatio = errors.New("invalid trace ID ratio: greater than 1.0")
-)
-
-type samplerArgParseError struct {
- parseErr error
-}
-
-func (e samplerArgParseError) Error() string {
- return "parsing sampler argument: " + e.parseErr.Error()
-}
-
-func (e samplerArgParseError) Unwrap() error {
- return e.parseErr
-}
-
-func samplerFromEnv() (Sampler, error) {
- sampler, ok := os.LookupEnv(tracesSamplerKey)
- if !ok {
- return nil, nil
- }
-
- sampler = strings.ToLower(strings.TrimSpace(sampler))
- samplerArg, hasSamplerArg := os.LookupEnv(tracesSamplerArgKey)
- samplerArg = strings.TrimSpace(samplerArg)
-
- switch sampler {
- case samplerAlwaysOn:
- return AlwaysSample(), nil
- case samplerAlwaysOff:
- return NeverSample(), nil
- case samplerTraceIDRatio:
- if !hasSamplerArg {
- return TraceIDRatioBased(1.0), nil
- }
- return parseTraceIDRatio(samplerArg)
- case samplerParentBasedAlwaysOn:
- return ParentBased(AlwaysSample()), nil
- case samplerParsedBasedAlwaysOff:
- return ParentBased(NeverSample()), nil
- case samplerParentBasedTraceIDRatio:
- if !hasSamplerArg {
- return ParentBased(TraceIDRatioBased(1.0)), nil
- }
- ratio, err := parseTraceIDRatio(samplerArg)
- return ParentBased(ratio), err
- default:
- return nil, errUnsupportedSampler(sampler)
- }
-}
-
-func parseTraceIDRatio(arg string) (Sampler, error) {
- v, err := strconv.ParseFloat(arg, 64)
- if err != nil {
- return TraceIDRatioBased(1.0), samplerArgParseError{err}
- }
- if v < 0.0 {
- return TraceIDRatioBased(1.0), errNegativeTraceIDRatio
- }
- if v > 1.0 {
- return TraceIDRatioBased(1.0), errGreaterThanOneTraceIDRatio
- }
-
- return TraceIDRatioBased(v), nil
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/sampling.go b/vendor/go.opentelemetry.io/otel/sdk/trace/sampling.go
deleted file mode 100644
index ebb6df6c9..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/trace/sampling.go
+++ /dev/null
@@ -1,282 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package trace // import "go.opentelemetry.io/otel/sdk/trace"
-
-import (
- "context"
- "encoding/binary"
- "fmt"
-
- "go.opentelemetry.io/otel/attribute"
- "go.opentelemetry.io/otel/trace"
-)
-
-// Sampler decides whether a trace should be sampled and exported.
-type Sampler interface {
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-
- // ShouldSample returns a SamplingResult based on a decision made from the
- // passed parameters.
- ShouldSample(parameters SamplingParameters) SamplingResult
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-
- // Description returns information describing the Sampler.
- Description() string
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-}
-
-// SamplingParameters contains the values passed to a Sampler.
-type SamplingParameters struct {
- ParentContext context.Context
- TraceID trace.TraceID
- Name string
- Kind trace.SpanKind
- Attributes []attribute.KeyValue
- Links []trace.Link
-}
-
-// SamplingDecision indicates whether a span is dropped, recorded and/or sampled.
-type SamplingDecision uint8
-
-// Valid sampling decisions.
-const (
- // Drop will not record the span and all attributes/events will be dropped.
- Drop SamplingDecision = iota
-
- // Record indicates the span's `IsRecording() == true`, but `Sampled` flag
- // *must not* be set.
- RecordOnly
-
- // RecordAndSample has span's `IsRecording() == true` and `Sampled` flag
- // *must* be set.
- RecordAndSample
-)
-
-// SamplingResult conveys a SamplingDecision, set of Attributes and a Tracestate.
-type SamplingResult struct {
- Decision SamplingDecision
- Attributes []attribute.KeyValue
- Tracestate trace.TraceState
-}
-
-type traceIDRatioSampler struct {
- traceIDUpperBound uint64
- description string
-}
-
-func (ts traceIDRatioSampler) ShouldSample(p SamplingParameters) SamplingResult {
- psc := trace.SpanContextFromContext(p.ParentContext)
- x := binary.BigEndian.Uint64(p.TraceID[8:16]) >> 1
- if x < ts.traceIDUpperBound {
- return SamplingResult{
- Decision: RecordAndSample,
- Tracestate: psc.TraceState(),
- }
- }
- return SamplingResult{
- Decision: Drop,
- Tracestate: psc.TraceState(),
- }
-}
-
-func (ts traceIDRatioSampler) Description() string {
- return ts.description
-}
-
-// TraceIDRatioBased samples a given fraction of traces. Fractions >= 1 will
-// always sample. Fractions < 0 are treated as zero. To respect the
-// parent trace's `SampledFlag`, the `TraceIDRatioBased` sampler should be used
-// as a delegate of a `Parent` sampler.
-//
-//nolint:revive // revive complains about stutter of `trace.TraceIDRatioBased`
-func TraceIDRatioBased(fraction float64) Sampler {
- if fraction >= 1 {
- return AlwaysSample()
- }
-
- if fraction <= 0 {
- fraction = 0
- }
-
- return &traceIDRatioSampler{
- traceIDUpperBound: uint64(fraction * (1 << 63)),
- description: fmt.Sprintf("TraceIDRatioBased{%g}", fraction),
- }
-}
-
-type alwaysOnSampler struct{}
-
-func (as alwaysOnSampler) ShouldSample(p SamplingParameters) SamplingResult {
- return SamplingResult{
- Decision: RecordAndSample,
- Tracestate: trace.SpanContextFromContext(p.ParentContext).TraceState(),
- }
-}
-
-func (as alwaysOnSampler) Description() string {
- return "AlwaysOnSampler"
-}
-
-// AlwaysSample returns a Sampler that samples every trace.
-// Be careful about using this sampler in a production application with
-// significant traffic: a new trace will be started and exported for every
-// request.
-func AlwaysSample() Sampler {
- return alwaysOnSampler{}
-}
-
-type alwaysOffSampler struct{}
-
-func (as alwaysOffSampler) ShouldSample(p SamplingParameters) SamplingResult {
- return SamplingResult{
- Decision: Drop,
- Tracestate: trace.SpanContextFromContext(p.ParentContext).TraceState(),
- }
-}
-
-func (as alwaysOffSampler) Description() string {
- return "AlwaysOffSampler"
-}
-
-// NeverSample returns a Sampler that samples no traces.
-func NeverSample() Sampler {
- return alwaysOffSampler{}
-}
-
-// ParentBased returns a sampler decorator which behaves differently,
-// based on the parent of the span. If the span has no parent,
-// the decorated sampler is used to make sampling decision. If the span has
-// a parent, depending on whether the parent is remote and whether it
-// is sampled, one of the following samplers will apply:
-// - remoteParentSampled(Sampler) (default: AlwaysOn)
-// - remoteParentNotSampled(Sampler) (default: AlwaysOff)
-// - localParentSampled(Sampler) (default: AlwaysOn)
-// - localParentNotSampled(Sampler) (default: AlwaysOff)
-func ParentBased(root Sampler, samplers ...ParentBasedSamplerOption) Sampler {
- return parentBased{
- root: root,
- config: configureSamplersForParentBased(samplers),
- }
-}
-
-type parentBased struct {
- root Sampler
- config samplerConfig
-}
-
-func configureSamplersForParentBased(samplers []ParentBasedSamplerOption) samplerConfig {
- c := samplerConfig{
- remoteParentSampled: AlwaysSample(),
- remoteParentNotSampled: NeverSample(),
- localParentSampled: AlwaysSample(),
- localParentNotSampled: NeverSample(),
- }
-
- for _, so := range samplers {
- c = so.apply(c)
- }
-
- return c
-}
-
-// samplerConfig is a group of options for parentBased sampler.
-type samplerConfig struct {
- remoteParentSampled, remoteParentNotSampled Sampler
- localParentSampled, localParentNotSampled Sampler
-}
-
-// ParentBasedSamplerOption configures the sampler for a particular sampling case.
-type ParentBasedSamplerOption interface {
- apply(samplerConfig) samplerConfig
-}
-
-// WithRemoteParentSampled sets the sampler for the case of sampled remote parent.
-func WithRemoteParentSampled(s Sampler) ParentBasedSamplerOption {
- return remoteParentSampledOption{s}
-}
-
-type remoteParentSampledOption struct {
- s Sampler
-}
-
-func (o remoteParentSampledOption) apply(config samplerConfig) samplerConfig {
- config.remoteParentSampled = o.s
- return config
-}
-
-// WithRemoteParentNotSampled sets the sampler for the case of remote parent
-// which is not sampled.
-func WithRemoteParentNotSampled(s Sampler) ParentBasedSamplerOption {
- return remoteParentNotSampledOption{s}
-}
-
-type remoteParentNotSampledOption struct {
- s Sampler
-}
-
-func (o remoteParentNotSampledOption) apply(config samplerConfig) samplerConfig {
- config.remoteParentNotSampled = o.s
- return config
-}
-
-// WithLocalParentSampled sets the sampler for the case of sampled local parent.
-func WithLocalParentSampled(s Sampler) ParentBasedSamplerOption {
- return localParentSampledOption{s}
-}
-
-type localParentSampledOption struct {
- s Sampler
-}
-
-func (o localParentSampledOption) apply(config samplerConfig) samplerConfig {
- config.localParentSampled = o.s
- return config
-}
-
-// WithLocalParentNotSampled sets the sampler for the case of local parent
-// which is not sampled.
-func WithLocalParentNotSampled(s Sampler) ParentBasedSamplerOption {
- return localParentNotSampledOption{s}
-}
-
-type localParentNotSampledOption struct {
- s Sampler
-}
-
-func (o localParentNotSampledOption) apply(config samplerConfig) samplerConfig {
- config.localParentNotSampled = o.s
- return config
-}
-
-func (pb parentBased) ShouldSample(p SamplingParameters) SamplingResult {
- psc := trace.SpanContextFromContext(p.ParentContext)
- if psc.IsValid() {
- if psc.IsRemote() {
- if psc.IsSampled() {
- return pb.config.remoteParentSampled.ShouldSample(p)
- }
- return pb.config.remoteParentNotSampled.ShouldSample(p)
- }
-
- if psc.IsSampled() {
- return pb.config.localParentSampled.ShouldSample(p)
- }
- return pb.config.localParentNotSampled.ShouldSample(p)
- }
- return pb.root.ShouldSample(p)
-}
-
-func (pb parentBased) Description() string {
- return fmt.Sprintf("ParentBased{root:%s,remoteParentSampled:%s,"+
- "remoteParentNotSampled:%s,localParentSampled:%s,localParentNotSampled:%s}",
- pb.root.Description(),
- pb.config.remoteParentSampled.Description(),
- pb.config.remoteParentNotSampled.Description(),
- pb.config.localParentSampled.Description(),
- pb.config.localParentNotSampled.Description(),
- )
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/simple_span_processor.go b/vendor/go.opentelemetry.io/otel/sdk/trace/simple_span_processor.go
deleted file mode 100644
index 554111bb4..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/trace/simple_span_processor.go
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package trace // import "go.opentelemetry.io/otel/sdk/trace"
-
-import (
- "context"
- "sync"
-
- "go.opentelemetry.io/otel"
- "go.opentelemetry.io/otel/internal/global"
-)
-
-// simpleSpanProcessor is a SpanProcessor that synchronously sends all
-// completed Spans to a trace.Exporter immediately.
-type simpleSpanProcessor struct {
- exporterMu sync.Mutex
- exporter SpanExporter
- stopOnce sync.Once
-}
-
-var _ SpanProcessor = (*simpleSpanProcessor)(nil)
-
-// NewSimpleSpanProcessor returns a new SpanProcessor that will synchronously
-// send completed spans to the exporter immediately.
-//
-// This SpanProcessor is not recommended for production use. The synchronous
-// nature of this SpanProcessor makes it good for testing, debugging, or showing
-// examples of other features, but it will be slow and have a high computation
-// resource usage overhead. The BatchSpanProcessor is recommended for production
-// use instead.
-func NewSimpleSpanProcessor(exporter SpanExporter) SpanProcessor {
- ssp := &simpleSpanProcessor{
- exporter: exporter,
- }
- global.Warn("SimpleSpanProcessor is not recommended for production use, consider using BatchSpanProcessor instead.")
-
- return ssp
-}
-
-// OnStart does nothing.
-func (ssp *simpleSpanProcessor) OnStart(context.Context, ReadWriteSpan) {}
-
-// OnEnd immediately exports a ReadOnlySpan.
-func (ssp *simpleSpanProcessor) OnEnd(s ReadOnlySpan) {
- ssp.exporterMu.Lock()
- defer ssp.exporterMu.Unlock()
-
- if ssp.exporter != nil && s.SpanContext().TraceFlags().IsSampled() {
- if err := ssp.exporter.ExportSpans(context.Background(), []ReadOnlySpan{s}); err != nil {
- otel.Handle(err)
- }
- }
-}
-
-// Shutdown shuts down the exporter this SimpleSpanProcessor exports to.
-func (ssp *simpleSpanProcessor) Shutdown(ctx context.Context) error {
- var err error
- ssp.stopOnce.Do(func() {
- stopFunc := func(exp SpanExporter) (<-chan error, func()) {
- done := make(chan error)
- return done, func() { done <- exp.Shutdown(ctx) }
- }
-
- // The exporter field of the simpleSpanProcessor needs to be zeroed to
- // signal it is shut down, meaning all subsequent calls to OnEnd will
- // be gracefully ignored. This needs to be done synchronously to avoid
- // any race condition.
- //
- // A closure is used to keep reference to the exporter and then the
- // field is zeroed. This ensures the simpleSpanProcessor is shut down
- // before the exporter. This order is important as it avoids a potential
- // deadlock. If the exporter shut down operation generates a span, that
- // span would need to be exported. Meaning, OnEnd would be called and
- // try acquiring the lock that is held here.
- ssp.exporterMu.Lock()
- done, shutdown := stopFunc(ssp.exporter)
- ssp.exporter = nil
- ssp.exporterMu.Unlock()
-
- go shutdown()
-
- // Wait for the exporter to shut down or the deadline to expire.
- select {
- case err = <-done:
- case <-ctx.Done():
- // It is possible for the exporter to have immediately shut down and
- // the context to be done simultaneously. In that case this outer
- // select statement will randomly choose a case. This will result in
- // a different returned error for similar scenarios. Instead, double
- // check if the exporter shut down at the same time and return that
- // error if so. This will ensure consistency as well as ensure
- // the caller knows the exporter shut down successfully (they can
- // already determine if the deadline is expired given they passed
- // the context).
- select {
- case err = <-done:
- default:
- err = ctx.Err()
- }
- }
- })
- return err
-}
-
-// ForceFlush does nothing as there is no data to flush.
-func (ssp *simpleSpanProcessor) ForceFlush(context.Context) error {
- return nil
-}
-
-// MarshalLog is the marshaling function used by the logging system to represent
-// this Span Processor.
-func (ssp *simpleSpanProcessor) MarshalLog() interface{} {
- return struct {
- Type string
- Exporter SpanExporter
- }{
- Type: "SimpleSpanProcessor",
- Exporter: ssp.exporter,
- }
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/snapshot.go b/vendor/go.opentelemetry.io/otel/sdk/trace/snapshot.go
deleted file mode 100644
index d511d0f27..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/trace/snapshot.go
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package trace // import "go.opentelemetry.io/otel/sdk/trace"
-
-import (
- "time"
-
- "go.opentelemetry.io/otel/attribute"
- "go.opentelemetry.io/otel/sdk/instrumentation"
- "go.opentelemetry.io/otel/sdk/resource"
- "go.opentelemetry.io/otel/trace"
-)
-
-// snapshot is an record of a spans state at a particular checkpointed time.
-// It is used as a read-only representation of that state.
-type snapshot struct {
- name string
- spanContext trace.SpanContext
- parent trace.SpanContext
- spanKind trace.SpanKind
- startTime time.Time
- endTime time.Time
- attributes []attribute.KeyValue
- events []Event
- links []Link
- status Status
- childSpanCount int
- droppedAttributeCount int
- droppedEventCount int
- droppedLinkCount int
- resource *resource.Resource
- instrumentationScope instrumentation.Scope
-}
-
-var _ ReadOnlySpan = snapshot{}
-
-func (s snapshot) private() {}
-
-// Name returns the name of the span.
-func (s snapshot) Name() string {
- return s.name
-}
-
-// SpanContext returns the unique SpanContext that identifies the span.
-func (s snapshot) SpanContext() trace.SpanContext {
- return s.spanContext
-}
-
-// Parent returns the unique SpanContext that identifies the parent of the
-// span if one exists. If the span has no parent the returned SpanContext
-// will be invalid.
-func (s snapshot) Parent() trace.SpanContext {
- return s.parent
-}
-
-// SpanKind returns the role the span plays in a Trace.
-func (s snapshot) SpanKind() trace.SpanKind {
- return s.spanKind
-}
-
-// StartTime returns the time the span started recording.
-func (s snapshot) StartTime() time.Time {
- return s.startTime
-}
-
-// EndTime returns the time the span stopped recording. It will be zero if
-// the span has not ended.
-func (s snapshot) EndTime() time.Time {
- return s.endTime
-}
-
-// Attributes returns the defining attributes of the span.
-func (s snapshot) Attributes() []attribute.KeyValue {
- return s.attributes
-}
-
-// Links returns all the links the span has to other spans.
-func (s snapshot) Links() []Link {
- return s.links
-}
-
-// Events returns all the events that occurred within in the spans
-// lifetime.
-func (s snapshot) Events() []Event {
- return s.events
-}
-
-// Status returns the spans status.
-func (s snapshot) Status() Status {
- return s.status
-}
-
-// InstrumentationScope returns information about the instrumentation
-// scope that created the span.
-func (s snapshot) InstrumentationScope() instrumentation.Scope {
- return s.instrumentationScope
-}
-
-// InstrumentationLibrary returns information about the instrumentation
-// library that created the span.
-func (s snapshot) InstrumentationLibrary() instrumentation.Library { //nolint:staticcheck // This method needs to be define for backwards compatibility
- return s.instrumentationScope
-}
-
-// Resource returns information about the entity that produced the span.
-func (s snapshot) Resource() *resource.Resource {
- return s.resource
-}
-
-// DroppedAttributes returns the number of attributes dropped by the span
-// due to limits being reached.
-func (s snapshot) DroppedAttributes() int {
- return s.droppedAttributeCount
-}
-
-// DroppedLinks returns the number of links dropped by the span due to limits
-// being reached.
-func (s snapshot) DroppedLinks() int {
- return s.droppedLinkCount
-}
-
-// DroppedEvents returns the number of events dropped by the span due to
-// limits being reached.
-func (s snapshot) DroppedEvents() int {
- return s.droppedEventCount
-}
-
-// ChildSpanCount returns the count of spans that consider the span a
-// direct parent.
-func (s snapshot) ChildSpanCount() int {
- return s.childSpanCount
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/span.go b/vendor/go.opentelemetry.io/otel/sdk/trace/span.go
deleted file mode 100644
index 8f4fc3850..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/trace/span.go
+++ /dev/null
@@ -1,937 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package trace // import "go.opentelemetry.io/otel/sdk/trace"
-
-import (
- "context"
- "fmt"
- "reflect"
- "runtime"
- rt "runtime/trace"
- "slices"
- "strings"
- "sync"
- "time"
- "unicode/utf8"
-
- "go.opentelemetry.io/otel/attribute"
- "go.opentelemetry.io/otel/codes"
- "go.opentelemetry.io/otel/internal/global"
- "go.opentelemetry.io/otel/sdk/instrumentation"
- "go.opentelemetry.io/otel/sdk/resource"
- semconv "go.opentelemetry.io/otel/semconv/v1.26.0"
- "go.opentelemetry.io/otel/trace"
- "go.opentelemetry.io/otel/trace/embedded"
-)
-
-// ReadOnlySpan allows reading information from the data structure underlying a
-// trace.Span. It is used in places where reading information from a span is
-// necessary but changing the span isn't necessary or allowed.
-//
-// Warning: methods may be added to this interface in minor releases.
-type ReadOnlySpan interface {
- // Name returns the name of the span.
- Name() string
- // SpanContext returns the unique SpanContext that identifies the span.
- SpanContext() trace.SpanContext
- // Parent returns the unique SpanContext that identifies the parent of the
- // span if one exists. If the span has no parent the returned SpanContext
- // will be invalid.
- Parent() trace.SpanContext
- // SpanKind returns the role the span plays in a Trace.
- SpanKind() trace.SpanKind
- // StartTime returns the time the span started recording.
- StartTime() time.Time
- // EndTime returns the time the span stopped recording. It will be zero if
- // the span has not ended.
- EndTime() time.Time
- // Attributes returns the defining attributes of the span.
- // The order of the returned attributes is not guaranteed to be stable across invocations.
- Attributes() []attribute.KeyValue
- // Links returns all the links the span has to other spans.
- Links() []Link
- // Events returns all the events that occurred within in the spans
- // lifetime.
- Events() []Event
- // Status returns the spans status.
- Status() Status
- // InstrumentationScope returns information about the instrumentation
- // scope that created the span.
- InstrumentationScope() instrumentation.Scope
- // InstrumentationLibrary returns information about the instrumentation
- // library that created the span.
- // Deprecated: please use InstrumentationScope instead.
- InstrumentationLibrary() instrumentation.Library //nolint:staticcheck // This method needs to be define for backwards compatibility
- // Resource returns information about the entity that produced the span.
- Resource() *resource.Resource
- // DroppedAttributes returns the number of attributes dropped by the span
- // due to limits being reached.
- DroppedAttributes() int
- // DroppedLinks returns the number of links dropped by the span due to
- // limits being reached.
- DroppedLinks() int
- // DroppedEvents returns the number of events dropped by the span due to
- // limits being reached.
- DroppedEvents() int
- // ChildSpanCount returns the count of spans that consider the span a
- // direct parent.
- ChildSpanCount() int
-
- // A private method to prevent users implementing the
- // interface and so future additions to it will not
- // violate compatibility.
- private()
-}
-
-// ReadWriteSpan exposes the same methods as trace.Span and in addition allows
-// reading information from the underlying data structure.
-// This interface exposes the union of the methods of trace.Span (which is a
-// "write-only" span) and ReadOnlySpan. New methods for writing or reading span
-// information should be added under trace.Span or ReadOnlySpan, respectively.
-//
-// Warning: methods may be added to this interface in minor releases.
-type ReadWriteSpan interface {
- trace.Span
- ReadOnlySpan
-}
-
-// recordingSpan is an implementation of the OpenTelemetry Span API
-// representing the individual component of a trace that is sampled.
-type recordingSpan struct {
- embedded.Span
-
- // mu protects the contents of this span.
- mu sync.Mutex
-
- // parent holds the parent span of this span as a trace.SpanContext.
- parent trace.SpanContext
-
- // spanKind represents the kind of this span as a trace.SpanKind.
- spanKind trace.SpanKind
-
- // name is the name of this span.
- name string
-
- // startTime is the time at which this span was started.
- startTime time.Time
-
- // endTime is the time at which this span was ended. It contains the zero
- // value of time.Time until the span is ended.
- endTime time.Time
-
- // status is the status of this span.
- status Status
-
- // childSpanCount holds the number of child spans created for this span.
- childSpanCount int
-
- // spanContext holds the SpanContext of this span.
- spanContext trace.SpanContext
-
- // attributes is a collection of user provided key/values. The collection
- // is constrained by a configurable maximum held by the parent
- // TracerProvider. When additional attributes are added after this maximum
- // is reached these attributes the user is attempting to add are dropped.
- // This dropped number of attributes is tracked and reported in the
- // ReadOnlySpan exported when the span ends.
- attributes []attribute.KeyValue
- droppedAttributes int
- logDropAttrsOnce sync.Once
-
- // events are stored in FIFO queue capped by configured limit.
- events evictedQueue[Event]
-
- // links are stored in FIFO queue capped by configured limit.
- links evictedQueue[Link]
-
- // executionTracerTaskEnd ends the execution tracer span.
- executionTracerTaskEnd func()
-
- // tracer is the SDK tracer that created this span.
- tracer *tracer
-}
-
-var (
- _ ReadWriteSpan = (*recordingSpan)(nil)
- _ runtimeTracer = (*recordingSpan)(nil)
-)
-
-// SpanContext returns the SpanContext of this span.
-func (s *recordingSpan) SpanContext() trace.SpanContext {
- if s == nil {
- return trace.SpanContext{}
- }
- return s.spanContext
-}
-
-// IsRecording returns if this span is being recorded. If this span has ended
-// this will return false.
-func (s *recordingSpan) IsRecording() bool {
- if s == nil {
- return false
- }
- s.mu.Lock()
- defer s.mu.Unlock()
-
- return s.isRecording()
-}
-
-// isRecording returns if this span is being recorded. If this span has ended
-// this will return false.
-//
-// This method assumes s.mu.Lock is held by the caller.
-func (s *recordingSpan) isRecording() bool {
- if s == nil {
- return false
- }
- return s.endTime.IsZero()
-}
-
-// SetStatus sets the status of the Span in the form of a code and a
-// description, overriding previous values set. The description is only
-// included in the set status when the code is for an error. If this span is
-// not being recorded than this method does nothing.
-func (s *recordingSpan) SetStatus(code codes.Code, description string) {
- if s == nil {
- return
- }
-
- s.mu.Lock()
- defer s.mu.Unlock()
- if !s.isRecording() {
- return
- }
- if s.status.Code > code {
- return
- }
-
- status := Status{Code: code}
- if code == codes.Error {
- status.Description = description
- }
-
- s.status = status
-}
-
-// SetAttributes sets attributes of this span.
-//
-// If a key from attributes already exists the value associated with that key
-// will be overwritten with the value contained in attributes.
-//
-// If this span is not being recorded than this method does nothing.
-//
-// If adding attributes to the span would exceed the maximum amount of
-// attributes the span is configured to have, the last added attributes will
-// be dropped.
-func (s *recordingSpan) SetAttributes(attributes ...attribute.KeyValue) {
- if s == nil || len(attributes) == 0 {
- return
- }
-
- s.mu.Lock()
- defer s.mu.Unlock()
- if !s.isRecording() {
- return
- }
-
- limit := s.tracer.provider.spanLimits.AttributeCountLimit
- if limit == 0 {
- // No attributes allowed.
- s.addDroppedAttr(len(attributes))
- return
- }
-
- // If adding these attributes could exceed the capacity of s perform a
- // de-duplication and truncation while adding to avoid over allocation.
- if limit > 0 && len(s.attributes)+len(attributes) > limit {
- s.addOverCapAttrs(limit, attributes)
- return
- }
-
- // Otherwise, add without deduplication. When attributes are read they
- // will be deduplicated, optimizing the operation.
- s.attributes = slices.Grow(s.attributes, len(attributes))
- for _, a := range attributes {
- if !a.Valid() {
- // Drop all invalid attributes.
- s.addDroppedAttr(1)
- continue
- }
- a = truncateAttr(s.tracer.provider.spanLimits.AttributeValueLengthLimit, a)
- s.attributes = append(s.attributes, a)
- }
-}
-
-// Declared as a var so tests can override.
-var logDropAttrs = func() {
- global.Warn("limit reached: dropping trace Span attributes")
-}
-
-// addDroppedAttr adds incr to the count of dropped attributes.
-//
-// The first, and only the first, time this method is called a warning will be
-// logged.
-//
-// This method assumes s.mu.Lock is held by the caller.
-func (s *recordingSpan) addDroppedAttr(incr int) {
- s.droppedAttributes += incr
- s.logDropAttrsOnce.Do(logDropAttrs)
-}
-
-// addOverCapAttrs adds the attributes attrs to the span s while
-// de-duplicating the attributes of s and attrs and dropping attributes that
-// exceed the limit.
-//
-// This method assumes s.mu.Lock is held by the caller.
-//
-// This method should only be called when there is a possibility that adding
-// attrs to s will exceed the limit. Otherwise, attrs should be added to s
-// without checking for duplicates and all retrieval methods of the attributes
-// for s will de-duplicate as needed.
-//
-// This method assumes limit is a value > 0. The argument should be validated
-// by the caller.
-func (s *recordingSpan) addOverCapAttrs(limit int, attrs []attribute.KeyValue) {
- // In order to not allocate more capacity to s.attributes than needed,
- // prune and truncate this addition of attributes while adding.
-
- // Do not set a capacity when creating this map. Benchmark testing has
- // showed this to only add unused memory allocations in general use.
- exists := make(map[attribute.Key]int, len(s.attributes))
- s.dedupeAttrsFromRecord(exists)
-
- // Now that s.attributes is deduplicated, adding unique attributes up to
- // the capacity of s will not over allocate s.attributes.
-
- // max size = limit
- maxCap := min(len(attrs)+len(s.attributes), limit)
- if cap(s.attributes) < maxCap {
- s.attributes = slices.Grow(s.attributes, maxCap-cap(s.attributes))
- }
- for _, a := range attrs {
- if !a.Valid() {
- // Drop all invalid attributes.
- s.addDroppedAttr(1)
- continue
- }
-
- if idx, ok := exists[a.Key]; ok {
- // Perform all updates before dropping, even when at capacity.
- a = truncateAttr(s.tracer.provider.spanLimits.AttributeValueLengthLimit, a)
- s.attributes[idx] = a
- continue
- }
-
- if len(s.attributes) >= limit {
- // Do not just drop all of the remaining attributes, make sure
- // updates are checked and performed.
- s.addDroppedAttr(1)
- } else {
- a = truncateAttr(s.tracer.provider.spanLimits.AttributeValueLengthLimit, a)
- s.attributes = append(s.attributes, a)
- exists[a.Key] = len(s.attributes) - 1
- }
- }
-}
-
-// truncateAttr returns a truncated version of attr. Only string and string
-// slice attribute values are truncated. String values are truncated to at
-// most a length of limit. Each string slice value is truncated in this fashion
-// (the slice length itself is unaffected).
-//
-// No truncation is performed for a negative limit.
-func truncateAttr(limit int, attr attribute.KeyValue) attribute.KeyValue {
- if limit < 0 {
- return attr
- }
- switch attr.Value.Type() {
- case attribute.STRING:
- v := attr.Value.AsString()
- return attr.Key.String(truncate(limit, v))
- case attribute.STRINGSLICE:
- v := attr.Value.AsStringSlice()
- for i := range v {
- v[i] = truncate(limit, v[i])
- }
- return attr.Key.StringSlice(v)
- }
- return attr
-}
-
-// truncate returns a truncated version of s such that it contains less than
-// the limit number of characters. Truncation is applied by returning the limit
-// number of valid characters contained in s.
-//
-// If limit is negative, it returns the original string.
-//
-// UTF-8 is supported. When truncating, all invalid characters are dropped
-// before applying truncation.
-//
-// If s already contains less than the limit number of bytes, it is returned
-// unchanged. No invalid characters are removed.
-func truncate(limit int, s string) string {
- // This prioritize performance in the following order based on the most
- // common expected use-cases.
- //
- // - Short values less than the default limit (128).
- // - Strings with valid encodings that exceed the limit.
- // - No limit.
- // - Strings with invalid encodings that exceed the limit.
- if limit < 0 || len(s) <= limit {
- return s
- }
-
- // Optimistically, assume all valid UTF-8.
- var b strings.Builder
- count := 0
- for i, c := range s {
- if c != utf8.RuneError {
- count++
- if count > limit {
- return s[:i]
- }
- continue
- }
-
- _, size := utf8.DecodeRuneInString(s[i:])
- if size == 1 {
- // Invalid encoding.
- b.Grow(len(s) - 1)
- _, _ = b.WriteString(s[:i])
- s = s[i:]
- break
- }
- }
-
- // Fast-path, no invalid input.
- if b.Cap() == 0 {
- return s
- }
-
- // Truncate while validating UTF-8.
- for i := 0; i < len(s) && count < limit; {
- c := s[i]
- if c < utf8.RuneSelf {
- // Optimization for single byte runes (common case).
- _ = b.WriteByte(c)
- i++
- count++
- continue
- }
-
- _, size := utf8.DecodeRuneInString(s[i:])
- if size == 1 {
- // We checked for all 1-byte runes above, this is a RuneError.
- i++
- continue
- }
-
- _, _ = b.WriteString(s[i : i+size])
- i += size
- count++
- }
-
- return b.String()
-}
-
-// End ends the span. This method does nothing if the span is already ended or
-// is not being recorded.
-//
-// The only SpanEndOption currently supported are [trace.WithTimestamp], and
-// [trace.WithStackTrace].
-//
-// If this method is called while panicking an error event is added to the
-// Span before ending it and the panic is continued.
-func (s *recordingSpan) End(options ...trace.SpanEndOption) {
- // Do not start by checking if the span is being recorded which requires
- // acquiring a lock. Make a minimal check that the span is not nil.
- if s == nil {
- return
- }
-
- // Store the end time as soon as possible to avoid artificially increasing
- // the span's duration in case some operation below takes a while.
- et := monotonicEndTime(s.startTime)
-
- // Lock the span now that we have an end time and see if we need to do any more processing.
- s.mu.Lock()
- if !s.isRecording() {
- s.mu.Unlock()
- return
- }
-
- config := trace.NewSpanEndConfig(options...)
- if recovered := recover(); recovered != nil {
- // Record but don't stop the panic.
- defer panic(recovered)
- opts := []trace.EventOption{
- trace.WithAttributes(
- semconv.ExceptionType(typeStr(recovered)),
- semconv.ExceptionMessage(fmt.Sprint(recovered)),
- ),
- }
-
- if config.StackTrace() {
- opts = append(opts, trace.WithAttributes(
- semconv.ExceptionStacktrace(recordStackTrace()),
- ))
- }
-
- s.addEvent(semconv.ExceptionEventName, opts...)
- }
-
- if s.executionTracerTaskEnd != nil {
- s.mu.Unlock()
- s.executionTracerTaskEnd()
- s.mu.Lock()
- }
-
- // Setting endTime to non-zero marks the span as ended and not recording.
- if config.Timestamp().IsZero() {
- s.endTime = et
- } else {
- s.endTime = config.Timestamp()
- }
- s.mu.Unlock()
-
- sps := s.tracer.provider.getSpanProcessors()
- if len(sps) == 0 {
- return
- }
- snap := s.snapshot()
- for _, sp := range sps {
- sp.sp.OnEnd(snap)
- }
-}
-
-// monotonicEndTime returns the end time at present but offset from start,
-// monotonically.
-//
-// The monotonic clock is used in subtractions hence the duration since start
-// added back to start gives end as a monotonic time. See
-// https://golang.org/pkg/time/#hdr-Monotonic_Clocks
-func monotonicEndTime(start time.Time) time.Time {
- return start.Add(time.Since(start))
-}
-
-// RecordError will record err as a span event for this span. An additional call to
-// SetStatus is required if the Status of the Span should be set to Error, this method
-// does not change the Span status. If this span is not being recorded or err is nil
-// than this method does nothing.
-func (s *recordingSpan) RecordError(err error, opts ...trace.EventOption) {
- if s == nil || err == nil {
- return
- }
-
- s.mu.Lock()
- defer s.mu.Unlock()
- if !s.isRecording() {
- return
- }
-
- opts = append(opts, trace.WithAttributes(
- semconv.ExceptionType(typeStr(err)),
- semconv.ExceptionMessage(err.Error()),
- ))
-
- c := trace.NewEventConfig(opts...)
- if c.StackTrace() {
- opts = append(opts, trace.WithAttributes(
- semconv.ExceptionStacktrace(recordStackTrace()),
- ))
- }
-
- s.addEvent(semconv.ExceptionEventName, opts...)
-}
-
-func typeStr(i interface{}) string {
- t := reflect.TypeOf(i)
- if t.PkgPath() == "" && t.Name() == "" {
- // Likely a builtin type.
- return t.String()
- }
- return fmt.Sprintf("%s.%s", t.PkgPath(), t.Name())
-}
-
-func recordStackTrace() string {
- stackTrace := make([]byte, 2048)
- n := runtime.Stack(stackTrace, false)
-
- return string(stackTrace[0:n])
-}
-
-// AddEvent adds an event with the provided name and options. If this span is
-// not being recorded then this method does nothing.
-func (s *recordingSpan) AddEvent(name string, o ...trace.EventOption) {
- if s == nil {
- return
- }
-
- s.mu.Lock()
- defer s.mu.Unlock()
- if !s.isRecording() {
- return
- }
- s.addEvent(name, o...)
-}
-
-// addEvent adds an event with the provided name and options.
-//
-// This method assumes s.mu.Lock is held by the caller.
-func (s *recordingSpan) addEvent(name string, o ...trace.EventOption) {
- c := trace.NewEventConfig(o...)
- e := Event{Name: name, Attributes: c.Attributes(), Time: c.Timestamp()}
-
- // Discard attributes over limit.
- limit := s.tracer.provider.spanLimits.AttributePerEventCountLimit
- if limit == 0 {
- // Drop all attributes.
- e.DroppedAttributeCount = len(e.Attributes)
- e.Attributes = nil
- } else if limit > 0 && len(e.Attributes) > limit {
- // Drop over capacity.
- e.DroppedAttributeCount = len(e.Attributes) - limit
- e.Attributes = e.Attributes[:limit]
- }
-
- s.events.add(e)
-}
-
-// SetName sets the name of this span. If this span is not being recorded than
-// this method does nothing.
-func (s *recordingSpan) SetName(name string) {
- if s == nil {
- return
- }
-
- s.mu.Lock()
- defer s.mu.Unlock()
- if !s.isRecording() {
- return
- }
- s.name = name
-}
-
-// Name returns the name of this span.
-func (s *recordingSpan) Name() string {
- s.mu.Lock()
- defer s.mu.Unlock()
- return s.name
-}
-
-// Name returns the SpanContext of this span's parent span.
-func (s *recordingSpan) Parent() trace.SpanContext {
- s.mu.Lock()
- defer s.mu.Unlock()
- return s.parent
-}
-
-// SpanKind returns the SpanKind of this span.
-func (s *recordingSpan) SpanKind() trace.SpanKind {
- s.mu.Lock()
- defer s.mu.Unlock()
- return s.spanKind
-}
-
-// StartTime returns the time this span started.
-func (s *recordingSpan) StartTime() time.Time {
- s.mu.Lock()
- defer s.mu.Unlock()
- return s.startTime
-}
-
-// EndTime returns the time this span ended. For spans that have not yet
-// ended, the returned value will be the zero value of time.Time.
-func (s *recordingSpan) EndTime() time.Time {
- s.mu.Lock()
- defer s.mu.Unlock()
- return s.endTime
-}
-
-// Attributes returns the attributes of this span.
-//
-// The order of the returned attributes is not guaranteed to be stable.
-func (s *recordingSpan) Attributes() []attribute.KeyValue {
- s.mu.Lock()
- defer s.mu.Unlock()
- s.dedupeAttrs()
- return s.attributes
-}
-
-// dedupeAttrs deduplicates the attributes of s to fit capacity.
-//
-// This method assumes s.mu.Lock is held by the caller.
-func (s *recordingSpan) dedupeAttrs() {
- // Do not set a capacity when creating this map. Benchmark testing has
- // showed this to only add unused memory allocations in general use.
- exists := make(map[attribute.Key]int, len(s.attributes))
- s.dedupeAttrsFromRecord(exists)
-}
-
-// dedupeAttrsFromRecord deduplicates the attributes of s to fit capacity
-// using record as the record of unique attribute keys to their index.
-//
-// This method assumes s.mu.Lock is held by the caller.
-func (s *recordingSpan) dedupeAttrsFromRecord(record map[attribute.Key]int) {
- // Use the fact that slices share the same backing array.
- unique := s.attributes[:0]
- for _, a := range s.attributes {
- if idx, ok := record[a.Key]; ok {
- unique[idx] = a
- } else {
- unique = append(unique, a)
- record[a.Key] = len(unique) - 1
- }
- }
- clear(s.attributes[len(unique):]) // Erase unneeded elements to let GC collect objects.
- s.attributes = unique
-}
-
-// Links returns the links of this span.
-func (s *recordingSpan) Links() []Link {
- s.mu.Lock()
- defer s.mu.Unlock()
- if len(s.links.queue) == 0 {
- return []Link{}
- }
- return s.links.copy()
-}
-
-// Events returns the events of this span.
-func (s *recordingSpan) Events() []Event {
- s.mu.Lock()
- defer s.mu.Unlock()
- if len(s.events.queue) == 0 {
- return []Event{}
- }
- return s.events.copy()
-}
-
-// Status returns the status of this span.
-func (s *recordingSpan) Status() Status {
- s.mu.Lock()
- defer s.mu.Unlock()
- return s.status
-}
-
-// InstrumentationScope returns the instrumentation.Scope associated with
-// the Tracer that created this span.
-func (s *recordingSpan) InstrumentationScope() instrumentation.Scope {
- s.mu.Lock()
- defer s.mu.Unlock()
- return s.tracer.instrumentationScope
-}
-
-// InstrumentationLibrary returns the instrumentation.Library associated with
-// the Tracer that created this span.
-func (s *recordingSpan) InstrumentationLibrary() instrumentation.Library { //nolint:staticcheck // This method needs to be define for backwards compatibility
- s.mu.Lock()
- defer s.mu.Unlock()
- return s.tracer.instrumentationScope
-}
-
-// Resource returns the Resource associated with the Tracer that created this
-// span.
-func (s *recordingSpan) Resource() *resource.Resource {
- s.mu.Lock()
- defer s.mu.Unlock()
- return s.tracer.provider.resource
-}
-
-func (s *recordingSpan) AddLink(link trace.Link) {
- if s == nil {
- return
- }
- if !link.SpanContext.IsValid() && len(link.Attributes) == 0 &&
- link.SpanContext.TraceState().Len() == 0 {
- return
- }
-
- s.mu.Lock()
- defer s.mu.Unlock()
- if !s.isRecording() {
- return
- }
-
- l := Link{SpanContext: link.SpanContext, Attributes: link.Attributes}
-
- // Discard attributes over limit.
- limit := s.tracer.provider.spanLimits.AttributePerLinkCountLimit
- if limit == 0 {
- // Drop all attributes.
- l.DroppedAttributeCount = len(l.Attributes)
- l.Attributes = nil
- } else if limit > 0 && len(l.Attributes) > limit {
- l.DroppedAttributeCount = len(l.Attributes) - limit
- l.Attributes = l.Attributes[:limit]
- }
-
- s.links.add(l)
-}
-
-// DroppedAttributes returns the number of attributes dropped by the span
-// due to limits being reached.
-func (s *recordingSpan) DroppedAttributes() int {
- s.mu.Lock()
- defer s.mu.Unlock()
- return s.droppedAttributes
-}
-
-// DroppedLinks returns the number of links dropped by the span due to limits
-// being reached.
-func (s *recordingSpan) DroppedLinks() int {
- s.mu.Lock()
- defer s.mu.Unlock()
- return s.links.droppedCount
-}
-
-// DroppedEvents returns the number of events dropped by the span due to
-// limits being reached.
-func (s *recordingSpan) DroppedEvents() int {
- s.mu.Lock()
- defer s.mu.Unlock()
- return s.events.droppedCount
-}
-
-// ChildSpanCount returns the count of spans that consider the span a
-// direct parent.
-func (s *recordingSpan) ChildSpanCount() int {
- s.mu.Lock()
- defer s.mu.Unlock()
- return s.childSpanCount
-}
-
-// TracerProvider returns a trace.TracerProvider that can be used to generate
-// additional Spans on the same telemetry pipeline as the current Span.
-func (s *recordingSpan) TracerProvider() trace.TracerProvider {
- return s.tracer.provider
-}
-
-// snapshot creates a read-only copy of the current state of the span.
-func (s *recordingSpan) snapshot() ReadOnlySpan {
- var sd snapshot
- s.mu.Lock()
- defer s.mu.Unlock()
-
- sd.endTime = s.endTime
- sd.instrumentationScope = s.tracer.instrumentationScope
- sd.name = s.name
- sd.parent = s.parent
- sd.resource = s.tracer.provider.resource
- sd.spanContext = s.spanContext
- sd.spanKind = s.spanKind
- sd.startTime = s.startTime
- sd.status = s.status
- sd.childSpanCount = s.childSpanCount
-
- if len(s.attributes) > 0 {
- s.dedupeAttrs()
- sd.attributes = s.attributes
- }
- sd.droppedAttributeCount = s.droppedAttributes
- if len(s.events.queue) > 0 {
- sd.events = s.events.copy()
- sd.droppedEventCount = s.events.droppedCount
- }
- if len(s.links.queue) > 0 {
- sd.links = s.links.copy()
- sd.droppedLinkCount = s.links.droppedCount
- }
- return &sd
-}
-
-func (s *recordingSpan) addChild() {
- if s == nil {
- return
- }
-
- s.mu.Lock()
- defer s.mu.Unlock()
- if !s.isRecording() {
- return
- }
- s.childSpanCount++
-}
-
-func (*recordingSpan) private() {}
-
-// runtimeTrace starts a "runtime/trace".Task for the span and returns a
-// context containing the task.
-func (s *recordingSpan) runtimeTrace(ctx context.Context) context.Context {
- if !rt.IsEnabled() {
- // Avoid additional overhead if runtime/trace is not enabled.
- return ctx
- }
- nctx, task := rt.NewTask(ctx, s.name)
-
- s.mu.Lock()
- s.executionTracerTaskEnd = task.End
- s.mu.Unlock()
-
- return nctx
-}
-
-// nonRecordingSpan is a minimal implementation of the OpenTelemetry Span API
-// that wraps a SpanContext. It performs no operations other than to return
-// the wrapped SpanContext or TracerProvider that created it.
-type nonRecordingSpan struct {
- embedded.Span
-
- // tracer is the SDK tracer that created this span.
- tracer *tracer
- sc trace.SpanContext
-}
-
-var _ trace.Span = nonRecordingSpan{}
-
-// SpanContext returns the wrapped SpanContext.
-func (s nonRecordingSpan) SpanContext() trace.SpanContext { return s.sc }
-
-// IsRecording always returns false.
-func (nonRecordingSpan) IsRecording() bool { return false }
-
-// SetStatus does nothing.
-func (nonRecordingSpan) SetStatus(codes.Code, string) {}
-
-// SetError does nothing.
-func (nonRecordingSpan) SetError(bool) {}
-
-// SetAttributes does nothing.
-func (nonRecordingSpan) SetAttributes(...attribute.KeyValue) {}
-
-// End does nothing.
-func (nonRecordingSpan) End(...trace.SpanEndOption) {}
-
-// RecordError does nothing.
-func (nonRecordingSpan) RecordError(error, ...trace.EventOption) {}
-
-// AddEvent does nothing.
-func (nonRecordingSpan) AddEvent(string, ...trace.EventOption) {}
-
-// AddLink does nothing.
-func (nonRecordingSpan) AddLink(trace.Link) {}
-
-// SetName does nothing.
-func (nonRecordingSpan) SetName(string) {}
-
-// TracerProvider returns the trace.TracerProvider that provided the Tracer
-// that created this span.
-func (s nonRecordingSpan) TracerProvider() trace.TracerProvider { return s.tracer.provider }
-
-func isRecording(s SamplingResult) bool {
- return s.Decision == RecordOnly || s.Decision == RecordAndSample
-}
-
-func isSampled(s SamplingResult) bool {
- return s.Decision == RecordAndSample
-}
-
-// Status is the classified state of a Span.
-type Status struct {
- // Code is an identifier of a Spans state classification.
- Code codes.Code
- // Description is a user hint about why that status was set. It is only
- // applicable when Code is Error.
- Description string
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/span_exporter.go b/vendor/go.opentelemetry.io/otel/sdk/trace/span_exporter.go
deleted file mode 100644
index 6bdda3d94..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/trace/span_exporter.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package trace // import "go.opentelemetry.io/otel/sdk/trace"
-
-import "context"
-
-// SpanExporter handles the delivery of spans to external receivers. This is
-// the final component in the trace export pipeline.
-type SpanExporter interface {
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-
- // ExportSpans exports a batch of spans.
- //
- // This function is called synchronously, so there is no concurrency
- // safety requirement. However, due to the synchronous calling pattern,
- // it is critical that all timeouts and cancellations contained in the
- // passed context must be honored.
- //
- // Any retry logic must be contained in this function. The SDK that
- // calls this function will not implement any retry logic. All errors
- // returned by this function are considered unrecoverable and will be
- // reported to a configured error Handler.
- ExportSpans(ctx context.Context, spans []ReadOnlySpan) error
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-
- // Shutdown notifies the exporter of a pending halt to operations. The
- // exporter is expected to perform any cleanup or synchronization it
- // requires while honoring all timeouts and cancellations contained in
- // the passed context.
- Shutdown(ctx context.Context) error
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/span_limits.go b/vendor/go.opentelemetry.io/otel/sdk/trace/span_limits.go
deleted file mode 100644
index bec5e2097..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/trace/span_limits.go
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package trace // import "go.opentelemetry.io/otel/sdk/trace"
-
-import "go.opentelemetry.io/otel/sdk/internal/env"
-
-const (
- // DefaultAttributeValueLengthLimit is the default maximum allowed
- // attribute value length, unlimited.
- DefaultAttributeValueLengthLimit = -1
-
- // DefaultAttributeCountLimit is the default maximum number of attributes
- // a span can have.
- DefaultAttributeCountLimit = 128
-
- // DefaultEventCountLimit is the default maximum number of events a span
- // can have.
- DefaultEventCountLimit = 128
-
- // DefaultLinkCountLimit is the default maximum number of links a span can
- // have.
- DefaultLinkCountLimit = 128
-
- // DefaultAttributePerEventCountLimit is the default maximum number of
- // attributes a span event can have.
- DefaultAttributePerEventCountLimit = 128
-
- // DefaultAttributePerLinkCountLimit is the default maximum number of
- // attributes a span link can have.
- DefaultAttributePerLinkCountLimit = 128
-)
-
-// SpanLimits represents the limits of a span.
-type SpanLimits struct {
- // AttributeValueLengthLimit is the maximum allowed attribute value length.
- //
- // This limit only applies to string and string slice attribute values.
- // Any string longer than this value will be truncated to this length.
- //
- // Setting this to a negative value means no limit is applied.
- AttributeValueLengthLimit int
-
- // AttributeCountLimit is the maximum allowed span attribute count. Any
- // attribute added to a span once this limit is reached will be dropped.
- //
- // Setting this to zero means no attributes will be recorded.
- //
- // Setting this to a negative value means no limit is applied.
- AttributeCountLimit int
-
- // EventCountLimit is the maximum allowed span event count. Any event
- // added to a span once this limit is reached means it will be added but
- // the oldest event will be dropped.
- //
- // Setting this to zero means no events we be recorded.
- //
- // Setting this to a negative value means no limit is applied.
- EventCountLimit int
-
- // LinkCountLimit is the maximum allowed span link count. Any link added
- // to a span once this limit is reached means it will be added but the
- // oldest link will be dropped.
- //
- // Setting this to zero means no links we be recorded.
- //
- // Setting this to a negative value means no limit is applied.
- LinkCountLimit int
-
- // AttributePerEventCountLimit is the maximum number of attributes allowed
- // per span event. Any attribute added after this limit reached will be
- // dropped.
- //
- // Setting this to zero means no attributes will be recorded for events.
- //
- // Setting this to a negative value means no limit is applied.
- AttributePerEventCountLimit int
-
- // AttributePerLinkCountLimit is the maximum number of attributes allowed
- // per span link. Any attribute added after this limit reached will be
- // dropped.
- //
- // Setting this to zero means no attributes will be recorded for links.
- //
- // Setting this to a negative value means no limit is applied.
- AttributePerLinkCountLimit int
-}
-
-// NewSpanLimits returns a SpanLimits with all limits set to the value their
-// corresponding environment variable holds, or the default if unset.
-//
-// • AttributeValueLengthLimit: OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT
-// (default: unlimited)
-//
-// • AttributeCountLimit: OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT (default: 128)
-//
-// • EventCountLimit: OTEL_SPAN_EVENT_COUNT_LIMIT (default: 128)
-//
-// • AttributePerEventCountLimit: OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT (default:
-// 128)
-//
-// • LinkCountLimit: OTEL_SPAN_LINK_COUNT_LIMIT (default: 128)
-//
-// • AttributePerLinkCountLimit: OTEL_LINK_ATTRIBUTE_COUNT_LIMIT (default: 128)
-func NewSpanLimits() SpanLimits {
- return SpanLimits{
- AttributeValueLengthLimit: env.SpanAttributeValueLength(DefaultAttributeValueLengthLimit),
- AttributeCountLimit: env.SpanAttributeCount(DefaultAttributeCountLimit),
- EventCountLimit: env.SpanEventCount(DefaultEventCountLimit),
- LinkCountLimit: env.SpanLinkCount(DefaultLinkCountLimit),
- AttributePerEventCountLimit: env.SpanEventAttributeCount(DefaultAttributePerEventCountLimit),
- AttributePerLinkCountLimit: env.SpanLinkAttributeCount(DefaultAttributePerLinkCountLimit),
- }
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/span_processor.go b/vendor/go.opentelemetry.io/otel/sdk/trace/span_processor.go
deleted file mode 100644
index af7f9177f..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/trace/span_processor.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package trace // import "go.opentelemetry.io/otel/sdk/trace"
-
-import (
- "context"
- "sync"
-)
-
-// SpanProcessor is a processing pipeline for spans in the trace signal.
-// SpanProcessors registered with a TracerProvider and are called at the start
-// and end of a Span's lifecycle, and are called in the order they are
-// registered.
-type SpanProcessor interface {
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-
- // OnStart is called when a span is started. It is called synchronously
- // and should not block.
- OnStart(parent context.Context, s ReadWriteSpan)
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-
- // OnEnd is called when span is finished. It is called synchronously and
- // hence not block.
- OnEnd(s ReadOnlySpan)
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-
- // Shutdown is called when the SDK shuts down. Any cleanup or release of
- // resources held by the processor should be done in this call.
- //
- // Calls to OnStart, OnEnd, or ForceFlush after this has been called
- // should be ignored.
- //
- // All timeouts and cancellations contained in ctx must be honored, this
- // should not block indefinitely.
- Shutdown(ctx context.Context) error
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-
- // ForceFlush exports all ended spans to the configured Exporter that have not yet
- // been exported. It should only be called when absolutely necessary, such as when
- // using a FaaS provider that may suspend the process after an invocation, but before
- // the Processor can export the completed spans.
- ForceFlush(ctx context.Context) error
- // DO NOT CHANGE: any modification will not be backwards compatible and
- // must never be done outside of a new major release.
-}
-
-type spanProcessorState struct {
- sp SpanProcessor
- state sync.Once
-}
-
-func newSpanProcessorState(sp SpanProcessor) *spanProcessorState {
- return &spanProcessorState{sp: sp}
-}
-
-type spanProcessorStates []*spanProcessorState
diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/tracer.go b/vendor/go.opentelemetry.io/otel/sdk/trace/tracer.go
deleted file mode 100644
index 43419d3b5..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/trace/tracer.go
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package trace // import "go.opentelemetry.io/otel/sdk/trace"
-
-import (
- "context"
- "time"
-
- "go.opentelemetry.io/otel/sdk/instrumentation"
- "go.opentelemetry.io/otel/trace"
- "go.opentelemetry.io/otel/trace/embedded"
-)
-
-type tracer struct {
- embedded.Tracer
-
- provider *TracerProvider
- instrumentationScope instrumentation.Scope
-}
-
-var _ trace.Tracer = &tracer{}
-
-// Start starts a Span and returns it along with a context containing it.
-//
-// The Span is created with the provided name and as a child of any existing
-// span context found in the passed context. The created Span will be
-// configured appropriately by any SpanOption passed.
-func (tr *tracer) Start(ctx context.Context, name string, options ...trace.SpanStartOption) (context.Context, trace.Span) {
- config := trace.NewSpanStartConfig(options...)
-
- if ctx == nil {
- // Prevent trace.ContextWithSpan from panicking.
- ctx = context.Background()
- }
-
- // For local spans created by this SDK, track child span count.
- if p := trace.SpanFromContext(ctx); p != nil {
- if sdkSpan, ok := p.(*recordingSpan); ok {
- sdkSpan.addChild()
- }
- }
-
- s := tr.newSpan(ctx, name, &config)
- if rw, ok := s.(ReadWriteSpan); ok && s.IsRecording() {
- sps := tr.provider.getSpanProcessors()
- for _, sp := range sps {
- sp.sp.OnStart(ctx, rw)
- }
- }
- if rtt, ok := s.(runtimeTracer); ok {
- ctx = rtt.runtimeTrace(ctx)
- }
-
- return trace.ContextWithSpan(ctx, s), s
-}
-
-type runtimeTracer interface {
- // runtimeTrace starts a "runtime/trace".Task for the span and
- // returns a context containing the task.
- runtimeTrace(ctx context.Context) context.Context
-}
-
-// newSpan returns a new configured span.
-func (tr *tracer) newSpan(ctx context.Context, name string, config *trace.SpanConfig) trace.Span {
- // If told explicitly to make this a new root use a zero value SpanContext
- // as a parent which contains an invalid trace ID and is not remote.
- var psc trace.SpanContext
- if config.NewRoot() {
- ctx = trace.ContextWithSpanContext(ctx, psc)
- } else {
- psc = trace.SpanContextFromContext(ctx)
- }
-
- // If there is a valid parent trace ID, use it to ensure the continuity of
- // the trace. Always generate a new span ID so other components can rely
- // on a unique span ID, even if the Span is non-recording.
- var tid trace.TraceID
- var sid trace.SpanID
- if !psc.TraceID().IsValid() {
- tid, sid = tr.provider.idGenerator.NewIDs(ctx)
- } else {
- tid = psc.TraceID()
- sid = tr.provider.idGenerator.NewSpanID(ctx, tid)
- }
-
- samplingResult := tr.provider.sampler.ShouldSample(SamplingParameters{
- ParentContext: ctx,
- TraceID: tid,
- Name: name,
- Kind: config.SpanKind(),
- Attributes: config.Attributes(),
- Links: config.Links(),
- })
-
- scc := trace.SpanContextConfig{
- TraceID: tid,
- SpanID: sid,
- TraceState: samplingResult.Tracestate,
- }
- if isSampled(samplingResult) {
- scc.TraceFlags = psc.TraceFlags() | trace.FlagsSampled
- } else {
- scc.TraceFlags = psc.TraceFlags() &^ trace.FlagsSampled
- }
- sc := trace.NewSpanContext(scc)
-
- if !isRecording(samplingResult) {
- return tr.newNonRecordingSpan(sc)
- }
- return tr.newRecordingSpan(psc, sc, name, samplingResult, config)
-}
-
-// newRecordingSpan returns a new configured recordingSpan.
-func (tr *tracer) newRecordingSpan(psc, sc trace.SpanContext, name string, sr SamplingResult, config *trace.SpanConfig) *recordingSpan {
- startTime := config.Timestamp()
- if startTime.IsZero() {
- startTime = time.Now()
- }
-
- s := &recordingSpan{
- // Do not pre-allocate the attributes slice here! Doing so will
- // allocate memory that is likely never going to be used, or if used,
- // will be over-sized. The default Go compiler has been tested to
- // dynamically allocate needed space very well. Benchmarking has shown
- // it to be more performant than what we can predetermine here,
- // especially for the common use case of few to no added
- // attributes.
-
- parent: psc,
- spanContext: sc,
- spanKind: trace.ValidateSpanKind(config.SpanKind()),
- name: name,
- startTime: startTime,
- events: newEvictedQueueEvent(tr.provider.spanLimits.EventCountLimit),
- links: newEvictedQueueLink(tr.provider.spanLimits.LinkCountLimit),
- tracer: tr,
- }
-
- for _, l := range config.Links() {
- s.AddLink(l)
- }
-
- s.SetAttributes(sr.Attributes...)
- s.SetAttributes(config.Attributes()...)
-
- return s
-}
-
-// newNonRecordingSpan returns a new configured nonRecordingSpan.
-func (tr *tracer) newNonRecordingSpan(sc trace.SpanContext) nonRecordingSpan {
- return nonRecordingSpan{tracer: tr, sc: sc}
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/version.go b/vendor/go.opentelemetry.io/otel/sdk/trace/version.go
deleted file mode 100644
index b84dd2c5e..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/trace/version.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package trace // import "go.opentelemetry.io/otel/sdk/trace"
-
-// version is the current release version of the metric SDK in use.
-func version() string {
- return "1.16.0-rc.1"
-}
diff --git a/vendor/go.opentelemetry.io/otel/sdk/version.go b/vendor/go.opentelemetry.io/otel/sdk/version.go
deleted file mode 100644
index 6b4038510..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/version.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package sdk // import "go.opentelemetry.io/otel/sdk"
-
-// Version is the current release version of the OpenTelemetry SDK in use.
-func Version() string {
- return "1.34.0"
-}