mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2025-02-10 14:50:17 +00:00
[chore] update otel libraries (#3740)
* chore: update otel dependencies * refactor: combine tracing & metrics in observability package * chore: update example tracing compose file
This commit is contained in:
parent
baed591a1d
commit
dd094e4012
|
@ -50,9 +50,9 @@
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/media"
|
"github.com/superseriousbusiness/gotosocial/internal/media"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/media/ffmpeg"
|
"github.com/superseriousbusiness/gotosocial/internal/media/ffmpeg"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/messages"
|
"github.com/superseriousbusiness/gotosocial/internal/messages"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/metrics"
|
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/middleware"
|
"github.com/superseriousbusiness/gotosocial/internal/middleware"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/oauth"
|
"github.com/superseriousbusiness/gotosocial/internal/oauth"
|
||||||
|
"github.com/superseriousbusiness/gotosocial/internal/observability"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/oidc"
|
"github.com/superseriousbusiness/gotosocial/internal/oidc"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/processing"
|
"github.com/superseriousbusiness/gotosocial/internal/processing"
|
||||||
tlprocessor "github.com/superseriousbusiness/gotosocial/internal/processing/timeline"
|
tlprocessor "github.com/superseriousbusiness/gotosocial/internal/processing/timeline"
|
||||||
|
@ -61,7 +61,6 @@
|
||||||
gtsstorage "github.com/superseriousbusiness/gotosocial/internal/storage"
|
gtsstorage "github.com/superseriousbusiness/gotosocial/internal/storage"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/subscriptions"
|
"github.com/superseriousbusiness/gotosocial/internal/subscriptions"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/timeline"
|
"github.com/superseriousbusiness/gotosocial/internal/timeline"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/tracing"
|
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/transport"
|
"github.com/superseriousbusiness/gotosocial/internal/transport"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/typeutils"
|
"github.com/superseriousbusiness/gotosocial/internal/typeutils"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/web"
|
"github.com/superseriousbusiness/gotosocial/internal/web"
|
||||||
|
@ -196,7 +195,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize tracing (noop if not enabled).
|
// Initialize tracing (noop if not enabled).
|
||||||
if err := tracing.Initialize(); err != nil {
|
if err := observability.InitializeTracing(); err != nil {
|
||||||
return fmt.Errorf("error initializing tracing: %w", err)
|
return fmt.Errorf("error initializing tracing: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -393,7 +392,7 @@ func(context.Context, time.Time) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize metrics.
|
// Initialize metrics.
|
||||||
if err := metrics.Initialize(state.DB); err != nil {
|
if err := observability.InitializeMetrics(state.DB); err != nil {
|
||||||
return fmt.Errorf("error initializing metrics: %w", err)
|
return fmt.Errorf("error initializing metrics: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -426,12 +425,12 @@ func(context.Context, time.Time) {
|
||||||
|
|
||||||
// Add tracing middleware if enabled.
|
// Add tracing middleware if enabled.
|
||||||
if config.GetTracingEnabled() {
|
if config.GetTracingEnabled() {
|
||||||
middlewares = append(middlewares, tracing.InstrumentGin())
|
middlewares = append(middlewares, observability.TracingMiddleware())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add metrics middleware if enabled.
|
// Add metrics middleware if enabled.
|
||||||
if config.GetMetricsEnabled() {
|
if config.GetMetricsEnabled() {
|
||||||
middlewares = append(middlewares, metrics.InstrumentGin())
|
middlewares = append(middlewares, observability.MetricsMiddleware())
|
||||||
}
|
}
|
||||||
|
|
||||||
middlewares = append(middlewares, []gin.HandlerFunc{
|
middlewares = append(middlewares, []gin.HandlerFunc{
|
||||||
|
|
|
@ -38,8 +38,8 @@
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/gtserror"
|
"github.com/superseriousbusiness/gotosocial/internal/gtserror"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/language"
|
"github.com/superseriousbusiness/gotosocial/internal/language"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/log"
|
"github.com/superseriousbusiness/gotosocial/internal/log"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/metrics"
|
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/middleware"
|
"github.com/superseriousbusiness/gotosocial/internal/middleware"
|
||||||
|
"github.com/superseriousbusiness/gotosocial/internal/observability"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/oidc"
|
"github.com/superseriousbusiness/gotosocial/internal/oidc"
|
||||||
tlprocessor "github.com/superseriousbusiness/gotosocial/internal/processing/timeline"
|
tlprocessor "github.com/superseriousbusiness/gotosocial/internal/processing/timeline"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/router"
|
"github.com/superseriousbusiness/gotosocial/internal/router"
|
||||||
|
@ -47,7 +47,6 @@
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/storage"
|
"github.com/superseriousbusiness/gotosocial/internal/storage"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/subscriptions"
|
"github.com/superseriousbusiness/gotosocial/internal/subscriptions"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/timeline"
|
"github.com/superseriousbusiness/gotosocial/internal/timeline"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/tracing"
|
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/typeutils"
|
"github.com/superseriousbusiness/gotosocial/internal/typeutils"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/web"
|
"github.com/superseriousbusiness/gotosocial/internal/web"
|
||||||
"github.com/superseriousbusiness/gotosocial/testrig"
|
"github.com/superseriousbusiness/gotosocial/testrig"
|
||||||
|
@ -127,7 +126,7 @@
|
||||||
}
|
}
|
||||||
config.SetInstanceLanguages(parsedLangs)
|
config.SetInstanceLanguages(parsedLangs)
|
||||||
|
|
||||||
if err := tracing.Initialize(); err != nil {
|
if err := observability.InitializeTracing(); err != nil {
|
||||||
return fmt.Errorf("error initializing tracing: %w", err)
|
return fmt.Errorf("error initializing tracing: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -195,7 +194,7 @@
|
||||||
defer testrig.StopWorkers(state)
|
defer testrig.StopWorkers(state)
|
||||||
|
|
||||||
// Initialize metrics.
|
// Initialize metrics.
|
||||||
if err := metrics.Initialize(state.DB); err != nil {
|
if err := observability.InitializeMetrics(state.DB); err != nil {
|
||||||
return fmt.Errorf("error initializing metrics: %w", err)
|
return fmt.Errorf("error initializing metrics: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -213,11 +212,11 @@
|
||||||
middleware.AddRequestID(config.GetRequestIDHeader()), // requestID middleware must run before tracing
|
middleware.AddRequestID(config.GetRequestIDHeader()), // requestID middleware must run before tracing
|
||||||
}
|
}
|
||||||
if config.GetTracingEnabled() {
|
if config.GetTracingEnabled() {
|
||||||
middlewares = append(middlewares, tracing.InstrumentGin())
|
middlewares = append(middlewares, observability.TracingMiddleware())
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.GetMetricsEnabled() {
|
if config.GetMetricsEnabled() {
|
||||||
middlewares = append(middlewares, metrics.InstrumentGin())
|
middlewares = append(middlewares, observability.MetricsMiddleware())
|
||||||
}
|
}
|
||||||
|
|
||||||
middlewares = append(middlewares, []gin.HandlerFunc{
|
middlewares = append(middlewares, []gin.HandlerFunc{
|
||||||
|
|
|
@ -1,20 +1,20 @@
|
||||||
version: "3"
|
version: "3"
|
||||||
services:
|
services:
|
||||||
tempo:
|
tempo:
|
||||||
image: docker.io/grafana/tempo:2.1.1
|
image: docker.io/grafana/tempo:latest
|
||||||
command: [ "-config.file=/etc/tempo.yaml" ]
|
command: [ "-config.file=/etc/tempo.yaml" ]
|
||||||
volumes:
|
volumes:
|
||||||
- ./tempo.yaml:/etc/tempo.yaml
|
- ./tempo.yaml:/etc/tempo.yaml:Z
|
||||||
- ./tempo-data:/tmp/tempo
|
|
||||||
ports:
|
ports:
|
||||||
- "3200:3200" # tempo
|
- "3200:3200" # tempo
|
||||||
- "9095:9095" # tempo grpc
|
- "9095:9095" # tempo grpc
|
||||||
- "4317:4317" # otlp grpc
|
- "4317:4317" # otlp grpc
|
||||||
|
- "4318:4318" # otlp http
|
||||||
|
|
||||||
grafana:
|
grafana:
|
||||||
image: docker.io/grafana/grafana:9.5.2
|
image: docker.io/grafana/grafana:latest
|
||||||
volumes:
|
volumes:
|
||||||
- ./grafana-datasources.yaml:/etc/grafana/provisioning/datasources/datasources.yaml
|
- ./grafana-datasources.yaml:/etc/grafana/provisioning/datasources/datasources.yaml:Z
|
||||||
environment:
|
environment:
|
||||||
- GF_AUTH_ANONYMOUS_ENABLED=true
|
- GF_AUTH_ANONYMOUS_ENABLED=true
|
||||||
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
|
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
|
||||||
|
|
|
@ -5,7 +5,10 @@ distributor:
|
||||||
receivers:
|
receivers:
|
||||||
otlp:
|
otlp:
|
||||||
protocols:
|
protocols:
|
||||||
|
http:
|
||||||
|
endpoint: '0.0.0.0:4318'
|
||||||
grpc:
|
grpc:
|
||||||
|
endpoint: '0.0.0.0:4317'
|
||||||
|
|
||||||
ingester:
|
ingester:
|
||||||
max_block_duration: 5m
|
max_block_duration: 5m
|
||||||
|
|
42
go.mod
42
go.mod
|
@ -8,21 +8,6 @@ replace github.com/go-swagger/go-swagger => github.com/superseriousbusiness/go-s
|
||||||
// Replace modernc/sqlite with our version that fixes the concurrency INTERRUPT issue
|
// Replace modernc/sqlite with our version that fixes the concurrency INTERRUPT issue
|
||||||
replace modernc.org/sqlite => gitlab.com/NyaaaWhatsUpDoc/sqlite v1.34.5-concurrency-workaround
|
replace modernc.org/sqlite => gitlab.com/NyaaaWhatsUpDoc/sqlite v1.34.5-concurrency-workaround
|
||||||
|
|
||||||
// Below pin otel libraries to v1.29.0 until we can figure out issues
|
|
||||||
replace go.opentelemetry.io/otel => go.opentelemetry.io/otel v1.29.0
|
|
||||||
|
|
||||||
replace go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc => go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0
|
|
||||||
|
|
||||||
replace go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp => go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.29.0
|
|
||||||
|
|
||||||
replace go.opentelemetry.io/otel/metric => go.opentelemetry.io/otel/metric v1.29.0
|
|
||||||
|
|
||||||
replace go.opentelemetry.io/otel/sdk => go.opentelemetry.io/otel/sdk v1.29.0
|
|
||||||
|
|
||||||
replace go.opentelemetry.io/otel/sdk/metric => go.opentelemetry.io/otel/sdk/metric v1.29.0
|
|
||||||
|
|
||||||
replace go.opentelemetry.io/otel/trace => go.opentelemetry.io/otel/trace v1.29.0
|
|
||||||
|
|
||||||
require (
|
require (
|
||||||
codeberg.org/gruf/go-bytes v1.0.2
|
codeberg.org/gruf/go-bytes v1.0.2
|
||||||
codeberg.org/gruf/go-bytesize v1.0.3
|
codeberg.org/gruf/go-bytesize v1.0.3
|
||||||
|
@ -85,12 +70,12 @@ require (
|
||||||
github.com/wagslane/go-password-validator v0.3.0
|
github.com/wagslane/go-password-validator v0.3.0
|
||||||
github.com/yuin/goldmark v1.7.8
|
github.com/yuin/goldmark v1.7.8
|
||||||
go.opentelemetry.io/otel v1.34.0
|
go.opentelemetry.io/otel v1.34.0
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0
|
||||||
go.opentelemetry.io/otel/exporters/prometheus v0.51.0
|
go.opentelemetry.io/otel/exporters/prometheus v0.56.0
|
||||||
go.opentelemetry.io/otel/metric v1.34.0
|
go.opentelemetry.io/otel/metric v1.34.0
|
||||||
go.opentelemetry.io/otel/sdk v1.32.0
|
go.opentelemetry.io/otel/sdk v1.34.0
|
||||||
go.opentelemetry.io/otel/sdk/metric v1.32.0
|
go.opentelemetry.io/otel/sdk/metric v1.34.0
|
||||||
go.opentelemetry.io/otel/trace v1.34.0
|
go.opentelemetry.io/otel/trace v1.34.0
|
||||||
go.uber.org/automaxprocs v1.6.0
|
go.uber.org/automaxprocs v1.6.0
|
||||||
golang.org/x/crypto v0.32.0
|
golang.org/x/crypto v0.32.0
|
||||||
|
@ -160,7 +145,7 @@ require (
|
||||||
github.com/gorilla/handlers v1.5.2 // indirect
|
github.com/gorilla/handlers v1.5.2 // indirect
|
||||||
github.com/gorilla/securecookie v1.1.2 // indirect
|
github.com/gorilla/securecookie v1.1.2 // indirect
|
||||||
github.com/gorilla/sessions v1.2.2 // indirect
|
github.com/gorilla/sessions v1.2.2 // indirect
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 // indirect
|
||||||
github.com/hashicorp/hcl v1.0.0 // indirect
|
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||||
github.com/huandu/xstrings v1.4.0 // indirect
|
github.com/huandu/xstrings v1.4.0 // indirect
|
||||||
github.com/imdario/mergo v0.3.16 // indirect
|
github.com/imdario/mergo v0.3.16 // indirect
|
||||||
|
@ -193,7 +178,7 @@ require (
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||||
github.com/prometheus/client_model v0.6.1 // indirect
|
github.com/prometheus/client_model v0.6.1 // indirect
|
||||||
github.com/prometheus/common v0.59.1 // indirect
|
github.com/prometheus/common v0.61.0 // indirect
|
||||||
github.com/prometheus/procfs v0.15.1 // indirect
|
github.com/prometheus/procfs v0.15.1 // indirect
|
||||||
github.com/puzpuzpuz/xsync/v3 v3.5.0 // indirect
|
github.com/puzpuzpuz/xsync/v3 v3.5.0 // indirect
|
||||||
github.com/quasoft/memstore v0.0.0-20191010062613-2bce066d2b0b // indirect
|
github.com/quasoft/memstore v0.0.0-20191010062613-2bce066d2b0b // indirect
|
||||||
|
@ -219,8 +204,9 @@ require (
|
||||||
github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect
|
github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect
|
||||||
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
|
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
|
||||||
go.mongodb.org/mongo-driver v1.14.0 // indirect
|
go.mongodb.org/mongo-driver v1.14.0 // indirect
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 // indirect
|
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
|
||||||
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
|
||||||
|
go.opentelemetry.io/proto/otlp v1.5.0 // indirect
|
||||||
go.uber.org/multierr v1.11.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
golang.org/x/arch v0.13.0 // indirect
|
golang.org/x/arch v0.13.0 // indirect
|
||||||
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect
|
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect
|
||||||
|
@ -228,10 +214,10 @@ require (
|
||||||
golang.org/x/sync v0.10.0 // indirect
|
golang.org/x/sync v0.10.0 // indirect
|
||||||
golang.org/x/sys v0.29.0 // indirect
|
golang.org/x/sys v0.29.0 // indirect
|
||||||
golang.org/x/tools v0.28.0 // indirect
|
golang.org/x/tools v0.28.0 // indirect
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect
|
google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f // indirect
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect
|
||||||
google.golang.org/grpc v1.66.1 // indirect
|
google.golang.org/grpc v1.69.4 // indirect
|
||||||
google.golang.org/protobuf v1.36.2 // indirect
|
google.golang.org/protobuf v1.36.3 // indirect
|
||||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
modernc.org/libc v1.55.3 // indirect
|
modernc.org/libc v1.55.3 // indirect
|
||||||
|
|
68
go.sum
generated
68
go.sum
generated
|
@ -274,6 +274,8 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W
|
||||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||||
|
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
|
||||||
|
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
|
||||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
|
@ -324,8 +326,8 @@ github.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8L
|
||||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
|
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
|
||||||
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys=
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 h1:VNqngBF40hVlDloBruUehVYC3ArSgIyScOAyMRqBxRg=
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I=
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1/go.mod h1:RBRO7fro65R6tjKzYgLAFo0t1QEXY1Dp+i/bvpRiqiQ=
|
||||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
||||||
|
@ -453,8 +455,8 @@ github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/j
|
||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
|
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
|
||||||
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
|
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
|
||||||
github.com/prometheus/common v0.59.1 h1:LXb1quJHWm1P6wq/U824uxYi4Sg0oGvNeUm1z5dJoX0=
|
github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ=
|
||||||
github.com/prometheus/common v0.59.1/go.mod h1:GpWM7dewqmVYcd7SmRaiWVe9SSqjf0UrwnYnpEZNuT0=
|
github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s=
|
||||||
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
|
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
|
||||||
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
|
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
|
||||||
github.com/puzpuzpuz/xsync/v3 v3.5.0 h1:i+cMcpEDY1BkNm7lPDkCtE4oElsYLn+EKF8kAu2vXT4=
|
github.com/puzpuzpuz/xsync/v3 v3.5.0 h1:i+cMcpEDY1BkNm7lPDkCtE4oElsYLn+EKF8kAu2vXT4=
|
||||||
|
@ -622,26 +624,28 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw=
|
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
|
||||||
go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8=
|
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E=
|
go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI=
|
go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 h1:nSiV3s7wiCam610XcLbYOmMfJxB9gO4uK3Xgv5gmTgg=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0/go.mod h1:hKn/e/Nmd19/x1gvIHwtOwVWM+VhuITSWip3JUDghj0=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.29.0 h1:JAv0Jwtl01UFiyWZEMiJZBiTlv5A50zNs8lsthXqIio=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.29.0/go.mod h1:QNKLmUEAq2QUbPQUfvw4fmv0bgbK7UlOSFCnXyfvSNc=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE=
|
||||||
go.opentelemetry.io/otel/exporters/prometheus v0.51.0 h1:G7uexXb/K3T+T9fNLCCKncweEtNEBMTO+46hKX5EdKw=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3SPM81McUZHYjRS5pEgNgnmzGJ5tRpU5krWnV8Bs=
|
||||||
go.opentelemetry.io/otel/exporters/prometheus v0.51.0/go.mod h1:v0mFe5Kk7woIh938mrZBJBmENYquyA0IICrlYm4Y0t4=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4=
|
||||||
go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc=
|
go.opentelemetry.io/otel/exporters/prometheus v0.56.0 h1:GnCIi0QyG0yy2MrJLzVrIM7laaJstj//flf1zEJCG+E=
|
||||||
go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8=
|
go.opentelemetry.io/otel/exporters/prometheus v0.56.0/go.mod h1:JQcVZtbIIPM+7SWBB+T6FK+xunlyidwLp++fN0sUaOk=
|
||||||
go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo=
|
go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
|
||||||
go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok=
|
go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
|
||||||
go.opentelemetry.io/otel/sdk/metric v1.29.0 h1:K2CfmJohnRgvZ9UAj2/FhIf/okdWcNdBwe1m8xFXiSY=
|
go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
|
||||||
go.opentelemetry.io/otel/sdk/metric v1.29.0/go.mod h1:6zZLdCl2fkauYoZIOn/soQIDSWFmNSRcICarHfuhNJQ=
|
go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
|
||||||
go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4=
|
go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk=
|
||||||
go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ=
|
go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
|
||||||
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
|
go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
|
||||||
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
|
go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
|
||||||
|
go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4=
|
||||||
|
go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4=
|
||||||
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
|
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
|
||||||
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
|
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
|
||||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||||
|
@ -943,10 +947,10 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc
|
||||||
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc=
|
google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f h1:gap6+3Gk41EItBuyi4XX/bp4oqJ3UwuIMl25yGinuAA=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I=
|
google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:Ic02D47M+zbarjYYUlK57y316f2MoN0gjAwI3f2S95o=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f h1:OxYkA3wjPsZyBylwymxSHa7ViiW1Sml4ToBrncvFehI=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50=
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||||
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||||
|
@ -959,8 +963,8 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa
|
||||||
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
|
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
|
||||||
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
google.golang.org/grpc v1.66.1 h1:hO5qAXR19+/Z44hmvIM4dQFMSYX9XcWsByfoxutBpAM=
|
google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A=
|
||||||
google.golang.org/grpc v1.66.1/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y=
|
google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4=
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
|
@ -971,8 +975,8 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2
|
||||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
||||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||||
google.golang.org/protobuf v1.36.2 h1:R8FeyR1/eLmkutZOM5CWghmo5itiG9z0ktFlTVLuTmU=
|
google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU=
|
||||||
google.golang.org/protobuf v1.36.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
|
google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
//go:build !nometrics
|
//go:build !nootel
|
||||||
|
|
||||||
package metrics
|
package metrics
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
//go:build nometrics
|
//go:build nootel
|
||||||
|
|
||||||
package metrics
|
package metrics
|
||||||
|
|
||||||
|
|
|
@ -41,9 +41,8 @@
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/db/bundb/migrations"
|
"github.com/superseriousbusiness/gotosocial/internal/db/bundb/migrations"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/gtsmodel"
|
"github.com/superseriousbusiness/gotosocial/internal/gtsmodel"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/log"
|
"github.com/superseriousbusiness/gotosocial/internal/log"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/metrics"
|
"github.com/superseriousbusiness/gotosocial/internal/observability"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/state"
|
"github.com/superseriousbusiness/gotosocial/internal/state"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/tracing"
|
|
||||||
"github.com/uptrace/bun"
|
"github.com/uptrace/bun"
|
||||||
"github.com/uptrace/bun/dialect"
|
"github.com/uptrace/bun/dialect"
|
||||||
"github.com/uptrace/bun/dialect/pgdialect"
|
"github.com/uptrace/bun/dialect/pgdialect"
|
||||||
|
@ -324,11 +323,10 @@ func bunDB(sqldb *sql.DB, dialect func() schema.Dialect) *bun.DB {
|
||||||
|
|
||||||
// Add our SQL connection hooks.
|
// Add our SQL connection hooks.
|
||||||
db.AddQueryHook(queryHook{})
|
db.AddQueryHook(queryHook{})
|
||||||
if config.GetTracingEnabled() {
|
metricsEnabled := config.GetMetricsEnabled()
|
||||||
db.AddQueryHook(tracing.InstrumentBun())
|
tracingEnabled := config.GetTracingEnabled()
|
||||||
}
|
if metricsEnabled || tracingEnabled {
|
||||||
if config.GetMetricsEnabled() {
|
db.AddQueryHook(observability.InstrumentBun(tracingEnabled, metricsEnabled))
|
||||||
db.AddQueryHook(metrics.InstrumentBun())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// table registration is needed for many-to-many, see:
|
// table registration is needed for many-to-many, see:
|
||||||
|
|
|
@ -15,29 +15,28 @@
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
//go:build notracing
|
//go:build !nootel
|
||||||
|
|
||||||
package tracing
|
package observability
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/config"
|
|
||||||
"github.com/uptrace/bun"
|
"github.com/uptrace/bun"
|
||||||
|
"github.com/uptrace/bun/extra/bunotel"
|
||||||
|
metricnoop "go.opentelemetry.io/otel/metric/noop"
|
||||||
|
tracenoop "go.opentelemetry.io/otel/trace/noop"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Initialize() error {
|
func InstrumentBun(traces bool, metrics bool) bun.QueryHook {
|
||||||
if config.GetTracingEnabled() {
|
opts := []bunotel.Option{
|
||||||
return errors.New("tracing was disabled at build time")
|
bunotel.WithFormattedQueries(true),
|
||||||
}
|
}
|
||||||
return nil
|
if !traces {
|
||||||
}
|
opts = append(opts, bunotel.WithTracerProvider(tracenoop.NewTracerProvider()))
|
||||||
|
}
|
||||||
func InstrumentGin() gin.HandlerFunc {
|
if !metrics {
|
||||||
return func(c *gin.Context) {}
|
opts = append(opts, bunotel.WithMeterProvider(metricnoop.NewMeterProvider()))
|
||||||
}
|
}
|
||||||
|
return bunotel.NewQueryHook(
|
||||||
func InstrumentBun() bun.QueryHook {
|
opts...,
|
||||||
return nil
|
)
|
||||||
}
|
}
|
|
@ -15,24 +15,24 @@
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
//go:build !nometrics
|
//go:build !nootel
|
||||||
|
|
||||||
package metrics
|
package observability
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/config"
|
"github.com/superseriousbusiness/gotosocial/internal/config"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/db"
|
"github.com/superseriousbusiness/gotosocial/internal/db"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/technologize/otel-go-contrib/otelginmetrics"
|
"github.com/technologize/otel-go-contrib/otelginmetrics"
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/extra/bunotel"
|
|
||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
"go.opentelemetry.io/otel/exporters/prometheus"
|
"go.opentelemetry.io/otel/exporters/prometheus"
|
||||||
"go.opentelemetry.io/otel/metric"
|
"go.opentelemetry.io/otel/metric"
|
||||||
sdk "go.opentelemetry.io/otel/sdk/metric"
|
sdk "go.opentelemetry.io/otel/sdk/metric"
|
||||||
|
"go.opentelemetry.io/otel/sdk/metric/exemplar"
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
semconv "go.opentelemetry.io/otel/semconv/v1.24.0"
|
semconv "go.opentelemetry.io/otel/semconv/v1.24.0"
|
||||||
)
|
)
|
||||||
|
@ -41,7 +41,7 @@
|
||||||
serviceName = "GoToSocial"
|
serviceName = "GoToSocial"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Initialize(db db.DB) error {
|
func InitializeMetrics(db db.DB) error {
|
||||||
if !config.GetMetricsEnabled() {
|
if !config.GetMetricsEnabled() {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -66,6 +66,7 @@ func Initialize(db db.DB) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
meterProvider := sdk.NewMeterProvider(
|
meterProvider := sdk.NewMeterProvider(
|
||||||
|
sdk.WithExemplarFilter(exemplar.AlwaysOffFilter),
|
||||||
sdk.WithResource(r),
|
sdk.WithResource(r),
|
||||||
sdk.WithReader(prometheusExporter),
|
sdk.WithReader(prometheusExporter),
|
||||||
)
|
)
|
||||||
|
@ -127,12 +128,6 @@ func Initialize(db db.DB) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func InstrumentGin() gin.HandlerFunc {
|
func MetricsMiddleware() gin.HandlerFunc {
|
||||||
return otelginmetrics.Middleware(serviceName)
|
return otelginmetrics.Middleware(serviceName)
|
||||||
}
|
}
|
||||||
|
|
||||||
func InstrumentBun() bun.QueryHook {
|
|
||||||
return bunotel.NewQueryHook(
|
|
||||||
bunotel.WithMeterProvider(otel.GetMeterProvider()),
|
|
||||||
)
|
|
||||||
}
|
|
|
@ -15,30 +15,32 @@
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
//go:build nometrics
|
//go:build nootel
|
||||||
|
|
||||||
package metrics
|
package observability
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"github.com/superseriousbusiness/gotosocial/internal/db"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/config"
|
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/db"
|
|
||||||
"github.com/uptrace/bun"
|
"github.com/uptrace/bun"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Initialize(db db.DB) error {
|
func InitializeMetrics(db db.DB) error {
|
||||||
if config.GetMetricsEnabled() {
|
return nil
|
||||||
return errors.New("metrics was disabled at build time")
|
}
|
||||||
}
|
func InitializeTracing() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func InstrumentGin() gin.HandlerFunc {
|
func MetricsMiddleware() gin.HandlerFunc {
|
||||||
return func(c *gin.Context) {}
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func InstrumentBun() bun.QueryHook {
|
func TracingMiddleware() gin.HandlerFunc {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func InstrumentBun(traces bool, metrics bool) bun.QueryHook {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
|
@ -15,9 +15,9 @@
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
//go:build !notracing
|
//go:build !nootel
|
||||||
|
|
||||||
package tracing
|
package observability
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
@ -25,8 +25,6 @@
|
||||||
|
|
||||||
"codeberg.org/gruf/go-kv"
|
"codeberg.org/gruf/go-kv"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/extra/bunotel"
|
|
||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
|
||||||
|
@ -45,10 +43,10 @@
|
||||||
|
|
||||||
const (
|
const (
|
||||||
tracerKey = "gotosocial-server-tracer"
|
tracerKey = "gotosocial-server-tracer"
|
||||||
tracerName = "github.com/superseriousbusiness/gotosocial/internal/tracing"
|
tracerName = "github.com/superseriousbusiness/gotosocial/internal/observability"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Initialize() error {
|
func InitializeTracing() error {
|
||||||
if !config.GetTracingEnabled() {
|
if !config.GetTracingEnabled() {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -119,7 +117,7 @@ func Initialize() error {
|
||||||
// InstrumentGin is a middleware injecting tracing information based on the
|
// InstrumentGin is a middleware injecting tracing information based on the
|
||||||
// otelgin implementation found at
|
// otelgin implementation found at
|
||||||
// https://github.com/open-telemetry/opentelemetry-go-contrib/blob/main/instrumentation/github.com/gin-gonic/gin/otelgin/gintrace.go
|
// https://github.com/open-telemetry/opentelemetry-go-contrib/blob/main/instrumentation/github.com/gin-gonic/gin/otelgin/gintrace.go
|
||||||
func InstrumentGin() gin.HandlerFunc {
|
func TracingMiddleware() gin.HandlerFunc {
|
||||||
provider := otel.GetTracerProvider()
|
provider := otel.GetTracerProvider()
|
||||||
tracer := provider.Tracer(
|
tracer := provider.Tracer(
|
||||||
tracerName,
|
tracerName,
|
||||||
|
@ -182,9 +180,3 @@ func InjectRequestID() gin.HandlerFunc {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func InstrumentBun() bun.QueryHook {
|
|
||||||
return bunotel.NewQueryHook(
|
|
||||||
bunotel.WithFormattedQueries(true),
|
|
||||||
)
|
|
||||||
}
|
|
|
@ -17,8 +17,7 @@ GO_GCFLAGS=${GO_GCFLAGS-}
|
||||||
# Available Go build tags, with explanation, followed by benefits of enabling it:
|
# Available Go build tags, with explanation, followed by benefits of enabling it:
|
||||||
# - kvformat: enables prettier output of log fields (slightly better performance)
|
# - kvformat: enables prettier output of log fields (slightly better performance)
|
||||||
# - timetzdata: embed timezone database inside binary (allow setting local time inside Docker containers, at cost of 450KB)
|
# - timetzdata: embed timezone database inside binary (allow setting local time inside Docker containers, at cost of 450KB)
|
||||||
# - notracing: disables compiling-in otel tracing support (reduced binary size, better performance)
|
# - nootel: disables compiling-in otel support (reduced binary size)
|
||||||
# - nometrics: disables compiling-in otel metrics support (reduced binary size, better performance)
|
|
||||||
# - noerrcaller: disables caller function prefix in errors (slightly better performance, at cost of err readability)
|
# - noerrcaller: disables caller function prefix in errors (slightly better performance, at cost of err readability)
|
||||||
# - debug: enables /debug/pprof endpoint (adds debug, at performance cost)
|
# - debug: enables /debug/pprof endpoint (adds debug, at performance cost)
|
||||||
# - debugenv: enables /debug/pprof endpoint if DEBUG=1 env during runtime (adds debug, at performance cost)
|
# - debugenv: enables /debug/pprof endpoint if DEBUG=1 env during runtime (adds debug, at performance cost)
|
||||||
|
|
6
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/convert.go
generated
vendored
6
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/convert.go
generated
vendored
|
@ -94,7 +94,7 @@ func Int64(val string) (int64, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int64Slice converts 'val' where individual integers are separated by
|
// Int64Slice converts 'val' where individual integers are separated by
|
||||||
// 'sep' into a int64 slice.
|
// 'sep' into an int64 slice.
|
||||||
func Int64Slice(val, sep string) ([]int64, error) {
|
func Int64Slice(val, sep string) ([]int64, error) {
|
||||||
s := strings.Split(val, sep)
|
s := strings.Split(val, sep)
|
||||||
values := make([]int64, len(s))
|
values := make([]int64, len(s))
|
||||||
|
@ -118,7 +118,7 @@ func Int32(val string) (int32, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int32Slice converts 'val' where individual integers are separated by
|
// Int32Slice converts 'val' where individual integers are separated by
|
||||||
// 'sep' into a int32 slice.
|
// 'sep' into an int32 slice.
|
||||||
func Int32Slice(val, sep string) ([]int32, error) {
|
func Int32Slice(val, sep string) ([]int32, error) {
|
||||||
s := strings.Split(val, sep)
|
s := strings.Split(val, sep)
|
||||||
values := make([]int32, len(s))
|
values := make([]int32, len(s))
|
||||||
|
@ -190,7 +190,7 @@ func Bytes(val string) ([]byte, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// BytesSlice converts 'val' where individual bytes sequences, encoded in URL-safe
|
// BytesSlice converts 'val' where individual bytes sequences, encoded in URL-safe
|
||||||
// base64 without padding, are separated by 'sep' into a slice of bytes slices slice.
|
// base64 without padding, are separated by 'sep' into a slice of byte slices.
|
||||||
func BytesSlice(val, sep string) ([][]byte, error) {
|
func BytesSlice(val, sep string) ([][]byte, error) {
|
||||||
s := strings.Split(val, sep)
|
s := strings.Split(val, sep)
|
||||||
values := make([][]byte, len(s))
|
values := make([][]byte, len(s))
|
||||||
|
|
15
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/errors.go
generated
vendored
15
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/errors.go
generated
vendored
|
@ -81,6 +81,21 @@ func HTTPError(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.R
|
||||||
mux.errorHandler(ctx, mux, marshaler, w, r, err)
|
mux.errorHandler(ctx, mux, marshaler, w, r, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HTTPStreamError uses the mux-configured stream error handler to notify error to the client without closing the connection.
|
||||||
|
func HTTPStreamError(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, r *http.Request, err error) {
|
||||||
|
st := mux.streamErrorHandler(ctx, err)
|
||||||
|
msg := errorChunk(st)
|
||||||
|
buf, err := marshaler.Marshal(msg)
|
||||||
|
if err != nil {
|
||||||
|
grpclog.Errorf("Failed to marshal an error: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if _, err := w.Write(buf); err != nil {
|
||||||
|
grpclog.Errorf("Failed to notify error to client: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// DefaultHTTPErrorHandler is the default error handler.
|
// DefaultHTTPErrorHandler is the default error handler.
|
||||||
// If "err" is a gRPC Status, the function replies with the status code mapped by HTTPStatusFromCode.
|
// If "err" is a gRPC Status, the function replies with the status code mapped by HTTPStatusFromCode.
|
||||||
// If "err" is a HTTPStatusError, the function replies with the status code provide by that struct. This is
|
// If "err" is a HTTPStatusError, the function replies with the status code provide by that struct. This is
|
||||||
|
|
2
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/fieldmask.go
generated
vendored
2
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/fieldmask.go
generated
vendored
|
@ -155,7 +155,7 @@ func buildPathsBlindly(name string, in interface{}) []string {
|
||||||
return paths
|
return paths
|
||||||
}
|
}
|
||||||
|
|
||||||
// fieldMaskPathItem stores a in-progress deconstruction of a path for a fieldmask
|
// fieldMaskPathItem stores an in-progress deconstruction of a path for a fieldmask
|
||||||
type fieldMaskPathItem struct {
|
type fieldMaskPathItem struct {
|
||||||
// the list of prior fields leading up to node connected by dots
|
// the list of prior fields leading up to node connected by dots
|
||||||
path string
|
path string
|
||||||
|
|
10
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/handler.go
generated
vendored
10
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/handler.go
generated
vendored
|
@ -64,7 +64,13 @@ func ForwardResponseStream(ctx context.Context, mux *ServeMux, marshaler Marshal
|
||||||
}
|
}
|
||||||
|
|
||||||
if !wroteHeader {
|
if !wroteHeader {
|
||||||
w.Header().Set("Content-Type", marshaler.ContentType(respRw))
|
var contentType string
|
||||||
|
if sct, ok := marshaler.(StreamContentType); ok {
|
||||||
|
contentType = sct.StreamContentType(respRw)
|
||||||
|
} else {
|
||||||
|
contentType = marshaler.ContentType(respRw)
|
||||||
|
}
|
||||||
|
w.Header().Set("Content-Type", contentType)
|
||||||
}
|
}
|
||||||
|
|
||||||
var buf []byte
|
var buf []byte
|
||||||
|
@ -194,7 +200,7 @@ func ForwardResponseMessage(ctx context.Context, mux *ServeMux, marshaler Marsha
|
||||||
w.Header().Set("Content-Length", strconv.Itoa(len(buf)))
|
w.Header().Set("Content-Length", strconv.Itoa(len(buf)))
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err = w.Write(buf); err != nil {
|
if _, err = w.Write(buf); err != nil && !errors.Is(err, http.ErrBodyNotAllowed) {
|
||||||
grpclog.Errorf("Failed to write response: %v", err)
|
grpclog.Errorf("Failed to write response: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
8
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/marshaler.go
generated
vendored
8
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/marshaler.go
generated
vendored
|
@ -48,3 +48,11 @@ type Delimited interface {
|
||||||
// Delimiter returns the record separator for the stream.
|
// Delimiter returns the record separator for the stream.
|
||||||
Delimiter() []byte
|
Delimiter() []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StreamContentType defines the streaming content type.
|
||||||
|
type StreamContentType interface {
|
||||||
|
// StreamContentType returns the content type for a stream. This shares the
|
||||||
|
// same behaviour as for `Marshaler.ContentType`, but is called, if present,
|
||||||
|
// in the case of a streamed response.
|
||||||
|
StreamContentType(v interface{}) string
|
||||||
|
}
|
||||||
|
|
4
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/marshaler_registry.go
generated
vendored
4
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/marshaler_registry.go
generated
vendored
|
@ -86,8 +86,8 @@ func (m marshalerRegistry) add(mime string, marshaler Marshaler) error {
|
||||||
// It allows for a mapping of case-sensitive Content-Type MIME type string to runtime.Marshaler interfaces.
|
// It allows for a mapping of case-sensitive Content-Type MIME type string to runtime.Marshaler interfaces.
|
||||||
//
|
//
|
||||||
// For example, you could allow the client to specify the use of the runtime.JSONPb marshaler
|
// For example, you could allow the client to specify the use of the runtime.JSONPb marshaler
|
||||||
// with a "application/jsonpb" Content-Type and the use of the runtime.JSONBuiltin marshaler
|
// with an "application/jsonpb" Content-Type and the use of the runtime.JSONBuiltin marshaler
|
||||||
// with a "application/json" Content-Type.
|
// with an "application/json" Content-Type.
|
||||||
// "*" can be used to match any Content-Type.
|
// "*" can be used to match any Content-Type.
|
||||||
// This can be attached to a ServerMux with the marshaler option.
|
// This can be attached to a ServerMux with the marshaler option.
|
||||||
func makeMarshalerMIMERegistry() marshalerRegistry {
|
func makeMarshalerMIMERegistry() marshalerRegistry {
|
||||||
|
|
4
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/proto2_convert.go
generated
vendored
4
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/proto2_convert.go
generated
vendored
|
@ -40,7 +40,7 @@ func Float32P(val string) (*float32, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int64P parses the given string representation of an integer
|
// Int64P parses the given string representation of an integer
|
||||||
// and returns a pointer to a int64 whose value is same as the parsed integer.
|
// and returns a pointer to an int64 whose value is same as the parsed integer.
|
||||||
func Int64P(val string) (*int64, error) {
|
func Int64P(val string) (*int64, error) {
|
||||||
i, err := Int64(val)
|
i, err := Int64(val)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -50,7 +50,7 @@ func Int64P(val string) (*int64, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int32P parses the given string representation of an integer
|
// Int32P parses the given string representation of an integer
|
||||||
// and returns a pointer to a int32 whose value is same as the parsed integer.
|
// and returns a pointer to an int32 whose value is same as the parsed integer.
|
||||||
func Int32P(val string) (*int32, error) {
|
func Int32P(val string) (*int32, error) {
|
||||||
i, err := Int32(val)
|
i, err := Int32(val)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
8
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/query.go
generated
vendored
8
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/query.go
generated
vendored
|
@ -141,7 +141,7 @@ func populateFieldValueFromPath(msgValue protoreflect.Message, fieldPath []strin
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if oneof already set
|
// Check if oneof already set
|
||||||
if of := fieldDescriptor.ContainingOneof(); of != nil {
|
if of := fieldDescriptor.ContainingOneof(); of != nil && !of.IsSynthetic() {
|
||||||
if f := msgValue.WhichOneof(of); f != nil {
|
if f := msgValue.WhichOneof(of); f != nil {
|
||||||
return fmt.Errorf("field already set for oneof %q", of.FullName().Name())
|
return fmt.Errorf("field already set for oneof %q", of.FullName().Name())
|
||||||
}
|
}
|
||||||
|
@ -291,7 +291,11 @@ func parseMessage(msgDescriptor protoreflect.MessageDescriptor, value string) (p
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return protoreflect.Value{}, err
|
return protoreflect.Value{}, err
|
||||||
}
|
}
|
||||||
msg = timestamppb.New(t)
|
timestamp := timestamppb.New(t)
|
||||||
|
if ok := timestamp.IsValid(); !ok {
|
||||||
|
return protoreflect.Value{}, fmt.Errorf("%s before 0001-01-01", value)
|
||||||
|
}
|
||||||
|
msg = timestamp
|
||||||
case "google.protobuf.Duration":
|
case "google.protobuf.Duration":
|
||||||
d, err := time.ParseDuration(value)
|
d, err := time.ParseDuration(value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
2
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/utilities/pattern.go
generated
vendored
2
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/utilities/pattern.go
generated
vendored
|
@ -1,6 +1,6 @@
|
||||||
package utilities
|
package utilities
|
||||||
|
|
||||||
// An OpCode is a opcode of compiled path patterns.
|
// OpCode is an opcode of compiled path patterns.
|
||||||
type OpCode int
|
type OpCode int
|
||||||
|
|
||||||
// These constants are the valid values of OpCode.
|
// These constants are the valid values of OpCode.
|
||||||
|
|
2
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/utilities/string_array_flag.go
generated
vendored
2
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/utilities/string_array_flag.go
generated
vendored
|
@ -5,7 +5,7 @@
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// flagInterface is an cut down interface to `flag`
|
// flagInterface is a cut down interface to `flag`
|
||||||
type flagInterface interface {
|
type flagInterface interface {
|
||||||
Var(value flag.Value, name string, usage string)
|
Var(value flag.Value, name string, usage string)
|
||||||
}
|
}
|
||||||
|
|
4
vendor/github.com/prometheus/common/expfmt/encode.go
generated
vendored
4
vendor/github.com/prometheus/common/expfmt/encode.go
generated
vendored
|
@ -68,7 +68,7 @@ func Negotiate(h http.Header) Format {
|
||||||
if escapeParam := ac.Params[model.EscapingKey]; escapeParam != "" {
|
if escapeParam := ac.Params[model.EscapingKey]; escapeParam != "" {
|
||||||
switch Format(escapeParam) {
|
switch Format(escapeParam) {
|
||||||
case model.AllowUTF8, model.EscapeUnderscores, model.EscapeDots, model.EscapeValues:
|
case model.AllowUTF8, model.EscapeUnderscores, model.EscapeDots, model.EscapeValues:
|
||||||
escapingScheme = Format(fmt.Sprintf("; escaping=%s", escapeParam))
|
escapingScheme = Format("; escaping=" + escapeParam)
|
||||||
default:
|
default:
|
||||||
// If the escaping parameter is unknown, ignore it.
|
// If the escaping parameter is unknown, ignore it.
|
||||||
}
|
}
|
||||||
|
@ -101,7 +101,7 @@ func NegotiateIncludingOpenMetrics(h http.Header) Format {
|
||||||
if escapeParam := ac.Params[model.EscapingKey]; escapeParam != "" {
|
if escapeParam := ac.Params[model.EscapingKey]; escapeParam != "" {
|
||||||
switch Format(escapeParam) {
|
switch Format(escapeParam) {
|
||||||
case model.AllowUTF8, model.EscapeUnderscores, model.EscapeDots, model.EscapeValues:
|
case model.AllowUTF8, model.EscapeUnderscores, model.EscapeDots, model.EscapeValues:
|
||||||
escapingScheme = Format(fmt.Sprintf("; escaping=%s", escapeParam))
|
escapingScheme = Format("; escaping=" + escapeParam)
|
||||||
default:
|
default:
|
||||||
// If the escaping parameter is unknown, ignore it.
|
// If the escaping parameter is unknown, ignore it.
|
||||||
}
|
}
|
||||||
|
|
4
vendor/github.com/prometheus/common/expfmt/expfmt.go
generated
vendored
4
vendor/github.com/prometheus/common/expfmt/expfmt.go
generated
vendored
|
@ -15,7 +15,7 @@
|
||||||
package expfmt
|
package expfmt
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"errors"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/prometheus/common/model"
|
"github.com/prometheus/common/model"
|
||||||
|
@ -109,7 +109,7 @@ func NewOpenMetricsFormat(version string) (Format, error) {
|
||||||
if version == OpenMetricsVersion_1_0_0 {
|
if version == OpenMetricsVersion_1_0_0 {
|
||||||
return FmtOpenMetrics_1_0_0, nil
|
return FmtOpenMetrics_1_0_0, nil
|
||||||
}
|
}
|
||||||
return FmtUnknown, fmt.Errorf("unknown open metrics version string")
|
return FmtUnknown, errors.New("unknown open metrics version string")
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithEscapingScheme returns a copy of Format with the specified escaping
|
// WithEscapingScheme returns a copy of Format with the specified escaping
|
||||||
|
|
4
vendor/github.com/prometheus/common/expfmt/openmetrics_create.go
generated
vendored
4
vendor/github.com/prometheus/common/expfmt/openmetrics_create.go
generated
vendored
|
@ -152,8 +152,8 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily, options ...E
|
||||||
if metricType == dto.MetricType_COUNTER && strings.HasSuffix(compliantName, "_total") {
|
if metricType == dto.MetricType_COUNTER && strings.HasSuffix(compliantName, "_total") {
|
||||||
compliantName = name[:len(name)-6]
|
compliantName = name[:len(name)-6]
|
||||||
}
|
}
|
||||||
if toOM.withUnit && in.Unit != nil && !strings.HasSuffix(compliantName, fmt.Sprintf("_%s", *in.Unit)) {
|
if toOM.withUnit && in.Unit != nil && !strings.HasSuffix(compliantName, "_"+*in.Unit) {
|
||||||
compliantName = compliantName + fmt.Sprintf("_%s", *in.Unit)
|
compliantName = compliantName + "_" + *in.Unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// Comments, first HELP, then TYPE.
|
// Comments, first HELP, then TYPE.
|
||||||
|
|
2
vendor/github.com/prometheus/common/expfmt/text_parse.go
generated
vendored
2
vendor/github.com/prometheus/common/expfmt/text_parse.go
generated
vendored
|
@ -895,7 +895,7 @@ func histogramMetricName(name string) string {
|
||||||
|
|
||||||
func parseFloat(s string) (float64, error) {
|
func parseFloat(s string) (float64, error) {
|
||||||
if strings.ContainsAny(s, "pP_") {
|
if strings.ContainsAny(s, "pP_") {
|
||||||
return 0, fmt.Errorf("unsupported character in float")
|
return 0, errors.New("unsupported character in float")
|
||||||
}
|
}
|
||||||
return strconv.ParseFloat(s, 64)
|
return strconv.ParseFloat(s, 64)
|
||||||
}
|
}
|
||||||
|
|
7
vendor/github.com/prometheus/common/model/alert.go
generated
vendored
7
vendor/github.com/prometheus/common/model/alert.go
generated
vendored
|
@ -14,6 +14,7 @@
|
||||||
package model
|
package model
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
@ -89,16 +90,16 @@ func (a *Alert) StatusAt(ts time.Time) AlertStatus {
|
||||||
// Validate checks whether the alert data is inconsistent.
|
// Validate checks whether the alert data is inconsistent.
|
||||||
func (a *Alert) Validate() error {
|
func (a *Alert) Validate() error {
|
||||||
if a.StartsAt.IsZero() {
|
if a.StartsAt.IsZero() {
|
||||||
return fmt.Errorf("start time missing")
|
return errors.New("start time missing")
|
||||||
}
|
}
|
||||||
if !a.EndsAt.IsZero() && a.EndsAt.Before(a.StartsAt) {
|
if !a.EndsAt.IsZero() && a.EndsAt.Before(a.StartsAt) {
|
||||||
return fmt.Errorf("start time must be before end time")
|
return errors.New("start time must be before end time")
|
||||||
}
|
}
|
||||||
if err := a.Labels.Validate(); err != nil {
|
if err := a.Labels.Validate(); err != nil {
|
||||||
return fmt.Errorf("invalid label set: %w", err)
|
return fmt.Errorf("invalid label set: %w", err)
|
||||||
}
|
}
|
||||||
if len(a.Labels) == 0 {
|
if len(a.Labels) == 0 {
|
||||||
return fmt.Errorf("at least one label pair required")
|
return errors.New("at least one label pair required")
|
||||||
}
|
}
|
||||||
if err := a.Annotations.Validate(); err != nil {
|
if err := a.Annotations.Validate(); err != nil {
|
||||||
return fmt.Errorf("invalid annotations: %w", err)
|
return fmt.Errorf("invalid annotations: %w", err)
|
||||||
|
|
2
vendor/github.com/prometheus/common/model/labelset_string.go
generated
vendored
2
vendor/github.com/prometheus/common/model/labelset_string.go
generated
vendored
|
@ -11,8 +11,6 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
//go:build go1.21
|
|
||||||
|
|
||||||
package model
|
package model
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
39
vendor/github.com/prometheus/common/model/labelset_string_go120.go
generated
vendored
39
vendor/github.com/prometheus/common/model/labelset_string_go120.go
generated
vendored
|
@ -1,39 +0,0 @@
|
||||||
// Copyright 2024 The Prometheus Authors
|
|
||||||
// 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.
|
|
||||||
|
|
||||||
//go:build !go1.21
|
|
||||||
|
|
||||||
package model
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"sort"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// String was optimized using functions not available for go 1.20
|
|
||||||
// or lower. We keep the old implementation for compatibility with client_golang.
|
|
||||||
// Once client golang drops support for go 1.20 (scheduled for August 2024), this
|
|
||||||
// file can be removed.
|
|
||||||
func (l LabelSet) String() string {
|
|
||||||
labelNames := make([]string, 0, len(l))
|
|
||||||
for name := range l {
|
|
||||||
labelNames = append(labelNames, string(name))
|
|
||||||
}
|
|
||||||
sort.Strings(labelNames)
|
|
||||||
lstrs := make([]string, 0, len(l))
|
|
||||||
for _, name := range labelNames {
|
|
||||||
lstrs = append(lstrs, fmt.Sprintf("%s=%q", name, l[LabelName(name)]))
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("{%s}", strings.Join(lstrs, ", "))
|
|
||||||
}
|
|
31
vendor/github.com/prometheus/common/model/metric.go
generated
vendored
31
vendor/github.com/prometheus/common/model/metric.go
generated
vendored
|
@ -14,9 +14,11 @@
|
||||||
package model
|
package model
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"regexp"
|
"regexp"
|
||||||
"sort"
|
"sort"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
|
|
||||||
|
@ -269,10 +271,6 @@ func metricNeedsEscaping(m *dto.Metric) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
|
||||||
lowerhex = "0123456789abcdef"
|
|
||||||
)
|
|
||||||
|
|
||||||
// EscapeName escapes the incoming name according to the provided escaping
|
// EscapeName escapes the incoming name according to the provided escaping
|
||||||
// scheme. Depending on the rules of escaping, this may cause no change in the
|
// scheme. Depending on the rules of escaping, this may cause no change in the
|
||||||
// string that is returned. (Especially NoEscaping, which by definition is a
|
// string that is returned. (Especially NoEscaping, which by definition is a
|
||||||
|
@ -307,7 +305,7 @@ func EscapeName(name string, scheme EscapingScheme) string {
|
||||||
} else if isValidLegacyRune(b, i) {
|
} else if isValidLegacyRune(b, i) {
|
||||||
escaped.WriteRune(b)
|
escaped.WriteRune(b)
|
||||||
} else {
|
} else {
|
||||||
escaped.WriteRune('_')
|
escaped.WriteString("__")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return escaped.String()
|
return escaped.String()
|
||||||
|
@ -317,21 +315,15 @@ func EscapeName(name string, scheme EscapingScheme) string {
|
||||||
}
|
}
|
||||||
escaped.WriteString("U__")
|
escaped.WriteString("U__")
|
||||||
for i, b := range name {
|
for i, b := range name {
|
||||||
if isValidLegacyRune(b, i) {
|
if b == '_' {
|
||||||
|
escaped.WriteString("__")
|
||||||
|
} else if isValidLegacyRune(b, i) {
|
||||||
escaped.WriteRune(b)
|
escaped.WriteRune(b)
|
||||||
} else if !utf8.ValidRune(b) {
|
} else if !utf8.ValidRune(b) {
|
||||||
escaped.WriteString("_FFFD_")
|
escaped.WriteString("_FFFD_")
|
||||||
} else if b < 0x100 {
|
} else {
|
||||||
escaped.WriteRune('_')
|
escaped.WriteRune('_')
|
||||||
for s := 4; s >= 0; s -= 4 {
|
escaped.WriteString(strconv.FormatInt(int64(b), 16))
|
||||||
escaped.WriteByte(lowerhex[b>>uint(s)&0xF])
|
|
||||||
}
|
|
||||||
escaped.WriteRune('_')
|
|
||||||
} else if b < 0x10000 {
|
|
||||||
escaped.WriteRune('_')
|
|
||||||
for s := 12; s >= 0; s -= 4 {
|
|
||||||
escaped.WriteByte(lowerhex[b>>uint(s)&0xF])
|
|
||||||
}
|
|
||||||
escaped.WriteRune('_')
|
escaped.WriteRune('_')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -389,8 +381,9 @@ func UnescapeName(name string, scheme EscapingScheme) string {
|
||||||
// We think we are in a UTF-8 code, process it.
|
// We think we are in a UTF-8 code, process it.
|
||||||
var utf8Val uint
|
var utf8Val uint
|
||||||
for j := 0; i < len(escapedName); j++ {
|
for j := 0; i < len(escapedName); j++ {
|
||||||
// This is too many characters for a utf8 value.
|
// This is too many characters for a utf8 value based on the MaxRune
|
||||||
if j > 4 {
|
// value of '\U0010FFFF'.
|
||||||
|
if j >= 6 {
|
||||||
return name
|
return name
|
||||||
}
|
}
|
||||||
// Found a closing underscore, convert to a rune, check validity, and append.
|
// Found a closing underscore, convert to a rune, check validity, and append.
|
||||||
|
@ -443,7 +436,7 @@ func (e EscapingScheme) String() string {
|
||||||
|
|
||||||
func ToEscapingScheme(s string) (EscapingScheme, error) {
|
func ToEscapingScheme(s string) (EscapingScheme, error) {
|
||||||
if s == "" {
|
if s == "" {
|
||||||
return NoEscaping, fmt.Errorf("got empty string instead of escaping scheme")
|
return NoEscaping, errors.New("got empty string instead of escaping scheme")
|
||||||
}
|
}
|
||||||
switch s {
|
switch s {
|
||||||
case AllowUTF8:
|
case AllowUTF8:
|
||||||
|
|
17
vendor/github.com/prometheus/common/model/silence.go
generated
vendored
17
vendor/github.com/prometheus/common/model/silence.go
generated
vendored
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"regexp"
|
"regexp"
|
||||||
"time"
|
"time"
|
||||||
|
@ -34,7 +35,7 @@ func (m *Matcher) UnmarshalJSON(b []byte) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(m.Name) == 0 {
|
if len(m.Name) == 0 {
|
||||||
return fmt.Errorf("label name in matcher must not be empty")
|
return errors.New("label name in matcher must not be empty")
|
||||||
}
|
}
|
||||||
if m.IsRegex {
|
if m.IsRegex {
|
||||||
if _, err := regexp.Compile(m.Value); err != nil {
|
if _, err := regexp.Compile(m.Value); err != nil {
|
||||||
|
@ -77,7 +78,7 @@ type Silence struct {
|
||||||
// Validate returns true iff all fields of the silence have valid values.
|
// Validate returns true iff all fields of the silence have valid values.
|
||||||
func (s *Silence) Validate() error {
|
func (s *Silence) Validate() error {
|
||||||
if len(s.Matchers) == 0 {
|
if len(s.Matchers) == 0 {
|
||||||
return fmt.Errorf("at least one matcher required")
|
return errors.New("at least one matcher required")
|
||||||
}
|
}
|
||||||
for _, m := range s.Matchers {
|
for _, m := range s.Matchers {
|
||||||
if err := m.Validate(); err != nil {
|
if err := m.Validate(); err != nil {
|
||||||
|
@ -85,22 +86,22 @@ func (s *Silence) Validate() error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if s.StartsAt.IsZero() {
|
if s.StartsAt.IsZero() {
|
||||||
return fmt.Errorf("start time missing")
|
return errors.New("start time missing")
|
||||||
}
|
}
|
||||||
if s.EndsAt.IsZero() {
|
if s.EndsAt.IsZero() {
|
||||||
return fmt.Errorf("end time missing")
|
return errors.New("end time missing")
|
||||||
}
|
}
|
||||||
if s.EndsAt.Before(s.StartsAt) {
|
if s.EndsAt.Before(s.StartsAt) {
|
||||||
return fmt.Errorf("start time must be before end time")
|
return errors.New("start time must be before end time")
|
||||||
}
|
}
|
||||||
if s.CreatedBy == "" {
|
if s.CreatedBy == "" {
|
||||||
return fmt.Errorf("creator information missing")
|
return errors.New("creator information missing")
|
||||||
}
|
}
|
||||||
if s.Comment == "" {
|
if s.Comment == "" {
|
||||||
return fmt.Errorf("comment missing")
|
return errors.New("comment missing")
|
||||||
}
|
}
|
||||||
if s.CreatedAt.IsZero() {
|
if s.CreatedAt.IsZero() {
|
||||||
return fmt.Errorf("creation timestamp missing")
|
return errors.New("creation timestamp missing")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
3
vendor/github.com/prometheus/common/model/value_float.go
generated
vendored
3
vendor/github.com/prometheus/common/model/value_float.go
generated
vendored
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
@ -39,7 +40,7 @@ func (v SampleValue) MarshalJSON() ([]byte, error) {
|
||||||
// UnmarshalJSON implements json.Unmarshaler.
|
// UnmarshalJSON implements json.Unmarshaler.
|
||||||
func (v *SampleValue) UnmarshalJSON(b []byte) error {
|
func (v *SampleValue) UnmarshalJSON(b []byte) error {
|
||||||
if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' {
|
if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' {
|
||||||
return fmt.Errorf("sample value must be a quoted string")
|
return errors.New("sample value must be a quoted string")
|
||||||
}
|
}
|
||||||
f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64)
|
f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
7
vendor/github.com/prometheus/common/model/value_histogram.go
generated
vendored
7
vendor/github.com/prometheus/common/model/value_histogram.go
generated
vendored
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -32,7 +33,7 @@ func (v FloatString) MarshalJSON() ([]byte, error) {
|
||||||
|
|
||||||
func (v *FloatString) UnmarshalJSON(b []byte) error {
|
func (v *FloatString) UnmarshalJSON(b []byte) error {
|
||||||
if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' {
|
if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' {
|
||||||
return fmt.Errorf("float value must be a quoted string")
|
return errors.New("float value must be a quoted string")
|
||||||
}
|
}
|
||||||
f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64)
|
f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -141,7 +142,7 @@ type SampleHistogramPair struct {
|
||||||
|
|
||||||
func (s SampleHistogramPair) MarshalJSON() ([]byte, error) {
|
func (s SampleHistogramPair) MarshalJSON() ([]byte, error) {
|
||||||
if s.Histogram == nil {
|
if s.Histogram == nil {
|
||||||
return nil, fmt.Errorf("histogram is nil")
|
return nil, errors.New("histogram is nil")
|
||||||
}
|
}
|
||||||
t, err := json.Marshal(s.Timestamp)
|
t, err := json.Marshal(s.Timestamp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -164,7 +165,7 @@ func (s *SampleHistogramPair) UnmarshalJSON(buf []byte) error {
|
||||||
return fmt.Errorf("wrong number of fields: %d != %d", gotLen, wantLen)
|
return fmt.Errorf("wrong number of fields: %d != %d", gotLen, wantLen)
|
||||||
}
|
}
|
||||||
if s.Histogram == nil {
|
if s.Histogram == nil {
|
||||||
return fmt.Errorf("histogram is null")
|
return errors.New("histogram is null")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
27
vendor/go.opentelemetry.io/auto/sdk/CONTRIBUTING.md
generated
vendored
Normal file
27
vendor/go.opentelemetry.io/auto/sdk/CONTRIBUTING.md
generated
vendored
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
# Contributing to go.opentelemetry.io/auto/sdk
|
||||||
|
|
||||||
|
The `go.opentelemetry.io/auto/sdk` module is a purpose built OpenTelemetry SDK.
|
||||||
|
It is designed to be:
|
||||||
|
|
||||||
|
0. An OpenTelemetry compliant SDK
|
||||||
|
1. Instrumented by auto-instrumentation (serializable into OTLP JSON)
|
||||||
|
2. Lightweight
|
||||||
|
3. User-friendly
|
||||||
|
|
||||||
|
These design choices are listed in the order of their importance.
|
||||||
|
|
||||||
|
The primary design goal of this module is to be an OpenTelemetry SDK.
|
||||||
|
This means that it needs to implement the Go APIs found in `go.opentelemetry.io/otel`.
|
||||||
|
|
||||||
|
Having met the requirement of SDK compliance, this module needs to provide code that the `go.opentelemetry.io/auto` module can instrument.
|
||||||
|
The chosen approach to meet this goal is to ensure the telemetry from the SDK is serializable into JSON encoded OTLP.
|
||||||
|
This ensures then that the serialized form is compatible with other OpenTelemetry systems, and the auto-instrumentation can use these systems to deserialize any telemetry it is sent.
|
||||||
|
|
||||||
|
Outside of these first two goals, the intended use becomes relevant.
|
||||||
|
This package is intended to be used in the `go.opentelemetry.io/otel` global API as a default when the auto-instrumentation is running.
|
||||||
|
Because of this, this package needs to not add unnecessary dependencies to that API.
|
||||||
|
Ideally, it adds none.
|
||||||
|
It also needs to operate efficiently.
|
||||||
|
|
||||||
|
Finally, this module is designed to be user-friendly to Go development.
|
||||||
|
It hides complexity in order to provide simpler APIs when the previous goals can all still be met.
|
201
vendor/go.opentelemetry.io/auto/sdk/LICENSE
generated
vendored
Normal file
201
vendor/go.opentelemetry.io/auto/sdk/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,201 @@
|
||||||
|
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.
|
15
vendor/go.opentelemetry.io/auto/sdk/VERSIONING.md
generated
vendored
Normal file
15
vendor/go.opentelemetry.io/auto/sdk/VERSIONING.md
generated
vendored
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# Versioning
|
||||||
|
|
||||||
|
This document describes the versioning policy for this module.
|
||||||
|
This policy is designed so the following goals can be achieved.
|
||||||
|
|
||||||
|
**Users are provided a codebase of value that is stable and secure.**
|
||||||
|
|
||||||
|
## Policy
|
||||||
|
|
||||||
|
* Versioning of this module will be idiomatic of a Go project using [Go modules](https://github.com/golang/go/wiki/Modules).
|
||||||
|
* [Semantic import versioning](https://github.com/golang/go/wiki/Modules#semantic-import-versioning) will be used.
|
||||||
|
* Versions will comply with [semver 2.0](https://semver.org/spec/v2.0.0.html).
|
||||||
|
* Any `v2` or higher version of this module will be included as a `/vN` at the end of the module path used in `go.mod` files and in the package import path.
|
||||||
|
|
||||||
|
* GitHub releases will be made for all releases.
|
14
vendor/go.opentelemetry.io/auto/sdk/doc.go
generated
vendored
Normal file
14
vendor/go.opentelemetry.io/auto/sdk/doc.go
generated
vendored
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package sdk provides an auto-instrumentable OpenTelemetry SDK.
|
||||||
|
|
||||||
|
An [go.opentelemetry.io/auto.Instrumentation] can be configured to target the
|
||||||
|
process running this SDK. In that case, all telemetry the SDK produces will be
|
||||||
|
processed and handled by that [go.opentelemetry.io/auto.Instrumentation].
|
||||||
|
|
||||||
|
By default, if there is no [go.opentelemetry.io/auto.Instrumentation] set to
|
||||||
|
auto-instrument the SDK, the SDK will not generate any telemetry.
|
||||||
|
*/
|
||||||
|
package sdk
|
58
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/attr.go
generated
vendored
Normal file
58
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/attr.go
generated
vendored
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package telemetry
|
||||||
|
|
||||||
|
// Attr is a key-value pair.
|
||||||
|
type Attr struct {
|
||||||
|
Key string `json:"key,omitempty"`
|
||||||
|
Value Value `json:"value,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns an Attr for a string value.
|
||||||
|
func String(key, value string) Attr {
|
||||||
|
return Attr{key, StringValue(value)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64 returns an Attr for an int64 value.
|
||||||
|
func Int64(key string, value int64) Attr {
|
||||||
|
return Attr{key, Int64Value(value)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int returns an Attr for an int value.
|
||||||
|
func Int(key string, value int) Attr {
|
||||||
|
return Int64(key, int64(value))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64 returns an Attr for a float64 value.
|
||||||
|
func Float64(key string, value float64) Attr {
|
||||||
|
return Attr{key, Float64Value(value)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bool returns an Attr for a bool value.
|
||||||
|
func Bool(key string, value bool) Attr {
|
||||||
|
return Attr{key, BoolValue(value)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bytes returns an Attr for a []byte value.
|
||||||
|
// The passed slice must not be changed after it is passed.
|
||||||
|
func Bytes(key string, value []byte) Attr {
|
||||||
|
return Attr{key, BytesValue(value)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Slice returns an Attr for a []Value value.
|
||||||
|
// The passed slice must not be changed after it is passed.
|
||||||
|
func Slice(key string, value ...Value) Attr {
|
||||||
|
return Attr{key, SliceValue(value...)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map returns an Attr for a map value.
|
||||||
|
// The passed slice must not be changed after it is passed.
|
||||||
|
func Map(key string, value ...Attr) Attr {
|
||||||
|
return Attr{key, MapValue(value...)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Equal returns if a is equal to b.
|
||||||
|
func (a Attr) Equal(b Attr) bool {
|
||||||
|
return a.Key == b.Key && a.Value.Equal(b.Value)
|
||||||
|
}
|
8
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/doc.go
generated
vendored
Normal file
8
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/doc.go
generated
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package telemetry provides a lightweight representations of OpenTelemetry
|
||||||
|
telemetry that is compatible with the OTLP JSON protobuf encoding.
|
||||||
|
*/
|
||||||
|
package telemetry
|
103
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/id.go
generated
vendored
Normal file
103
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/id.go
generated
vendored
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package telemetry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/hex"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
traceIDSize = 16
|
||||||
|
spanIDSize = 8
|
||||||
|
)
|
||||||
|
|
||||||
|
// TraceID is a custom data type that is used for all trace IDs.
|
||||||
|
type TraceID [traceIDSize]byte
|
||||||
|
|
||||||
|
// String returns the hex string representation form of a TraceID.
|
||||||
|
func (tid TraceID) String() string {
|
||||||
|
return hex.EncodeToString(tid[:])
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsEmpty returns false if id contains at least one non-zero byte.
|
||||||
|
func (tid TraceID) IsEmpty() bool {
|
||||||
|
return tid == [traceIDSize]byte{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON converts the trace ID into a hex string enclosed in quotes.
|
||||||
|
func (tid TraceID) MarshalJSON() ([]byte, error) {
|
||||||
|
if tid.IsEmpty() {
|
||||||
|
return []byte(`""`), nil
|
||||||
|
}
|
||||||
|
return marshalJSON(tid[:])
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON inflates the trace ID from hex string, possibly enclosed in
|
||||||
|
// quotes.
|
||||||
|
func (tid *TraceID) UnmarshalJSON(data []byte) error {
|
||||||
|
*tid = [traceIDSize]byte{}
|
||||||
|
return unmarshalJSON(tid[:], data)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SpanID is a custom data type that is used for all span IDs.
|
||||||
|
type SpanID [spanIDSize]byte
|
||||||
|
|
||||||
|
// String returns the hex string representation form of a SpanID.
|
||||||
|
func (sid SpanID) String() string {
|
||||||
|
return hex.EncodeToString(sid[:])
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsEmpty returns true if the span ID contains at least one non-zero byte.
|
||||||
|
func (sid SpanID) IsEmpty() bool {
|
||||||
|
return sid == [spanIDSize]byte{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON converts span ID into a hex string enclosed in quotes.
|
||||||
|
func (sid SpanID) MarshalJSON() ([]byte, error) {
|
||||||
|
if sid.IsEmpty() {
|
||||||
|
return []byte(`""`), nil
|
||||||
|
}
|
||||||
|
return marshalJSON(sid[:])
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes span ID from hex string, possibly enclosed in quotes.
|
||||||
|
func (sid *SpanID) UnmarshalJSON(data []byte) error {
|
||||||
|
*sid = [spanIDSize]byte{}
|
||||||
|
return unmarshalJSON(sid[:], data)
|
||||||
|
}
|
||||||
|
|
||||||
|
// marshalJSON converts id into a hex string enclosed in quotes.
|
||||||
|
func marshalJSON(id []byte) ([]byte, error) {
|
||||||
|
// Plus 2 quote chars at the start and end.
|
||||||
|
hexLen := hex.EncodedLen(len(id)) + 2
|
||||||
|
|
||||||
|
b := make([]byte, hexLen)
|
||||||
|
hex.Encode(b[1:hexLen-1], id)
|
||||||
|
b[0], b[hexLen-1] = '"', '"'
|
||||||
|
|
||||||
|
return b, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// unmarshalJSON inflates trace id from hex string, possibly enclosed in quotes.
|
||||||
|
func unmarshalJSON(dst []byte, src []byte) error {
|
||||||
|
if l := len(src); l >= 2 && src[0] == '"' && src[l-1] == '"' {
|
||||||
|
src = src[1 : l-1]
|
||||||
|
}
|
||||||
|
nLen := len(src)
|
||||||
|
if nLen == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(dst) != hex.DecodedLen(nLen) {
|
||||||
|
return errors.New("invalid length for ID")
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := hex.Decode(dst, src)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("cannot unmarshal ID from string '%s': %w", string(src), err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
67
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/number.go
generated
vendored
Normal file
67
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/number.go
generated
vendored
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package telemetry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
// protoInt64 represents the protobuf encoding of integers which can be either
|
||||||
|
// strings or integers.
|
||||||
|
type protoInt64 int64
|
||||||
|
|
||||||
|
// Int64 returns the protoInt64 as an int64.
|
||||||
|
func (i *protoInt64) Int64() int64 { return int64(*i) }
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes both strings and integers.
|
||||||
|
func (i *protoInt64) UnmarshalJSON(data []byte) error {
|
||||||
|
if data[0] == '"' {
|
||||||
|
var str string
|
||||||
|
if err := json.Unmarshal(data, &str); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
parsedInt, err := strconv.ParseInt(str, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*i = protoInt64(parsedInt)
|
||||||
|
} else {
|
||||||
|
var parsedInt int64
|
||||||
|
if err := json.Unmarshal(data, &parsedInt); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*i = protoInt64(parsedInt)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// protoUint64 represents the protobuf encoding of integers which can be either
|
||||||
|
// strings or integers.
|
||||||
|
type protoUint64 uint64
|
||||||
|
|
||||||
|
// Int64 returns the protoUint64 as a uint64.
|
||||||
|
func (i *protoUint64) Uint64() uint64 { return uint64(*i) }
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes both strings and integers.
|
||||||
|
func (i *protoUint64) UnmarshalJSON(data []byte) error {
|
||||||
|
if data[0] == '"' {
|
||||||
|
var str string
|
||||||
|
if err := json.Unmarshal(data, &str); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
parsedUint, err := strconv.ParseUint(str, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*i = protoUint64(parsedUint)
|
||||||
|
} else {
|
||||||
|
var parsedUint uint64
|
||||||
|
if err := json.Unmarshal(data, &parsedUint); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*i = protoUint64(parsedUint)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
66
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/resource.go
generated
vendored
Normal file
66
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/resource.go
generated
vendored
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package telemetry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Resource information.
|
||||||
|
type Resource struct {
|
||||||
|
// Attrs are the set of attributes that describe the resource. Attribute
|
||||||
|
// keys MUST be unique (it is not allowed to have more than one attribute
|
||||||
|
// with the same key).
|
||||||
|
Attrs []Attr `json:"attributes,omitempty"`
|
||||||
|
// DroppedAttrs is the number of dropped attributes. If the value
|
||||||
|
// is 0, then no attributes were dropped.
|
||||||
|
DroppedAttrs uint32 `json:"droppedAttributesCount,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes the OTLP formatted JSON contained in data into r.
|
||||||
|
func (r *Resource) UnmarshalJSON(data []byte) error {
|
||||||
|
decoder := json.NewDecoder(bytes.NewReader(data))
|
||||||
|
|
||||||
|
t, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if t != json.Delim('{') {
|
||||||
|
return errors.New("invalid Resource type")
|
||||||
|
}
|
||||||
|
|
||||||
|
for decoder.More() {
|
||||||
|
keyIface, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, io.EOF) {
|
||||||
|
// Empty.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
key, ok := keyIface.(string)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("invalid Resource field: %#v", keyIface)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case "attributes":
|
||||||
|
err = decoder.Decode(&r.Attrs)
|
||||||
|
case "droppedAttributesCount", "dropped_attributes_count":
|
||||||
|
err = decoder.Decode(&r.DroppedAttrs)
|
||||||
|
default:
|
||||||
|
// Skip unknown.
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
67
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/scope.go
generated
vendored
Normal file
67
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/scope.go
generated
vendored
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package telemetry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Scope is the identifying values of the instrumentation scope.
|
||||||
|
type Scope struct {
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
Version string `json:"version,omitempty"`
|
||||||
|
Attrs []Attr `json:"attributes,omitempty"`
|
||||||
|
DroppedAttrs uint32 `json:"droppedAttributesCount,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes the OTLP formatted JSON contained in data into r.
|
||||||
|
func (s *Scope) UnmarshalJSON(data []byte) error {
|
||||||
|
decoder := json.NewDecoder(bytes.NewReader(data))
|
||||||
|
|
||||||
|
t, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if t != json.Delim('{') {
|
||||||
|
return errors.New("invalid Scope type")
|
||||||
|
}
|
||||||
|
|
||||||
|
for decoder.More() {
|
||||||
|
keyIface, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, io.EOF) {
|
||||||
|
// Empty.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
key, ok := keyIface.(string)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("invalid Scope field: %#v", keyIface)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case "name":
|
||||||
|
err = decoder.Decode(&s.Name)
|
||||||
|
case "version":
|
||||||
|
err = decoder.Decode(&s.Version)
|
||||||
|
case "attributes":
|
||||||
|
err = decoder.Decode(&s.Attrs)
|
||||||
|
case "droppedAttributesCount", "dropped_attributes_count":
|
||||||
|
err = decoder.Decode(&s.DroppedAttrs)
|
||||||
|
default:
|
||||||
|
// Skip unknown.
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
456
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/span.go
generated
vendored
Normal file
456
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/span.go
generated
vendored
Normal file
|
@ -0,0 +1,456 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package telemetry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/hex"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// A Span represents a single operation performed by a single component of the
|
||||||
|
// system.
|
||||||
|
type Span struct {
|
||||||
|
// A unique identifier for a trace. All spans from the same trace share
|
||||||
|
// the same `trace_id`. The ID is a 16-byte array. An ID with all zeroes OR
|
||||||
|
// of length other than 16 bytes is considered invalid (empty string in OTLP/JSON
|
||||||
|
// is zero-length and thus is also invalid).
|
||||||
|
//
|
||||||
|
// This field is required.
|
||||||
|
TraceID TraceID `json:"traceId,omitempty"`
|
||||||
|
// A unique identifier for a span within a trace, assigned when the span
|
||||||
|
// is created. The ID is an 8-byte array. An ID with all zeroes OR of length
|
||||||
|
// other than 8 bytes is considered invalid (empty string in OTLP/JSON
|
||||||
|
// is zero-length and thus is also invalid).
|
||||||
|
//
|
||||||
|
// This field is required.
|
||||||
|
SpanID SpanID `json:"spanId,omitempty"`
|
||||||
|
// trace_state conveys information about request position in multiple distributed tracing graphs.
|
||||||
|
// It is a trace_state in w3c-trace-context format: https://www.w3.org/TR/trace-context/#tracestate-header
|
||||||
|
// See also https://github.com/w3c/distributed-tracing for more details about this field.
|
||||||
|
TraceState string `json:"traceState,omitempty"`
|
||||||
|
// The `span_id` of this span's parent span. If this is a root span, then this
|
||||||
|
// field must be empty. The ID is an 8-byte array.
|
||||||
|
ParentSpanID SpanID `json:"parentSpanId,omitempty"`
|
||||||
|
// Flags, a bit field.
|
||||||
|
//
|
||||||
|
// Bits 0-7 (8 least significant bits) are the trace flags as defined in W3C Trace
|
||||||
|
// Context specification. To read the 8-bit W3C trace flag, use
|
||||||
|
// `flags & SPAN_FLAGS_TRACE_FLAGS_MASK`.
|
||||||
|
//
|
||||||
|
// See https://www.w3.org/TR/trace-context-2/#trace-flags for the flag definitions.
|
||||||
|
//
|
||||||
|
// Bits 8 and 9 represent the 3 states of whether a span's parent
|
||||||
|
// is remote. The states are (unknown, is not remote, is remote).
|
||||||
|
// To read whether the value is known, use `(flags & SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK) != 0`.
|
||||||
|
// To read whether the span is remote, use `(flags & SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK) != 0`.
|
||||||
|
//
|
||||||
|
// When creating span messages, if the message is logically forwarded from another source
|
||||||
|
// with an equivalent flags fields (i.e., usually another OTLP span message), the field SHOULD
|
||||||
|
// be copied as-is. If creating from a source that does not have an equivalent flags field
|
||||||
|
// (such as a runtime representation of an OpenTelemetry span), the high 22 bits MUST
|
||||||
|
// be set to zero.
|
||||||
|
// Readers MUST NOT assume that bits 10-31 (22 most significant bits) will be zero.
|
||||||
|
//
|
||||||
|
// [Optional].
|
||||||
|
Flags uint32 `json:"flags,omitempty"`
|
||||||
|
// A description of the span's operation.
|
||||||
|
//
|
||||||
|
// For example, the name can be a qualified method name or a file name
|
||||||
|
// and a line number where the operation is called. A best practice is to use
|
||||||
|
// the same display name at the same call point in an application.
|
||||||
|
// This makes it easier to correlate spans in different traces.
|
||||||
|
//
|
||||||
|
// This field is semantically required to be set to non-empty string.
|
||||||
|
// Empty value is equivalent to an unknown span name.
|
||||||
|
//
|
||||||
|
// This field is required.
|
||||||
|
Name string `json:"name"`
|
||||||
|
// Distinguishes between spans generated in a particular context. For example,
|
||||||
|
// two spans with the same name may be distinguished using `CLIENT` (caller)
|
||||||
|
// and `SERVER` (callee) to identify queueing latency associated with the span.
|
||||||
|
Kind SpanKind `json:"kind,omitempty"`
|
||||||
|
// start_time_unix_nano is the start time of the span. On the client side, this is the time
|
||||||
|
// kept by the local machine where the span execution starts. On the server side, this
|
||||||
|
// is the time when the server's application handler starts running.
|
||||||
|
// Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970.
|
||||||
|
//
|
||||||
|
// This field is semantically required and it is expected that end_time >= start_time.
|
||||||
|
StartTime time.Time `json:"startTimeUnixNano,omitempty"`
|
||||||
|
// end_time_unix_nano is the end time of the span. On the client side, this is the time
|
||||||
|
// kept by the local machine where the span execution ends. On the server side, this
|
||||||
|
// is the time when the server application handler stops running.
|
||||||
|
// Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970.
|
||||||
|
//
|
||||||
|
// This field is semantically required and it is expected that end_time >= start_time.
|
||||||
|
EndTime time.Time `json:"endTimeUnixNano,omitempty"`
|
||||||
|
// attributes is a collection of key/value pairs. Note, global attributes
|
||||||
|
// like server name can be set using the resource API. Examples of attributes:
|
||||||
|
//
|
||||||
|
// "/http/user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
|
||||||
|
// "/http/server_latency": 300
|
||||||
|
// "example.com/myattribute": true
|
||||||
|
// "example.com/score": 10.239
|
||||||
|
//
|
||||||
|
// The OpenTelemetry API specification further restricts the allowed value types:
|
||||||
|
// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/common/README.md#attribute
|
||||||
|
// Attribute keys MUST be unique (it is not allowed to have more than one
|
||||||
|
// attribute with the same key).
|
||||||
|
Attrs []Attr `json:"attributes,omitempty"`
|
||||||
|
// dropped_attributes_count is the number of attributes that were discarded. Attributes
|
||||||
|
// can be discarded because their keys are too long or because there are too many
|
||||||
|
// attributes. If this value is 0, then no attributes were dropped.
|
||||||
|
DroppedAttrs uint32 `json:"droppedAttributesCount,omitempty"`
|
||||||
|
// events is a collection of Event items.
|
||||||
|
Events []*SpanEvent `json:"events,omitempty"`
|
||||||
|
// dropped_events_count is the number of dropped events. If the value is 0, then no
|
||||||
|
// events were dropped.
|
||||||
|
DroppedEvents uint32 `json:"droppedEventsCount,omitempty"`
|
||||||
|
// links is a collection of Links, which are references from this span to a span
|
||||||
|
// in the same or different trace.
|
||||||
|
Links []*SpanLink `json:"links,omitempty"`
|
||||||
|
// dropped_links_count is the number of dropped links after the maximum size was
|
||||||
|
// enforced. If this value is 0, then no links were dropped.
|
||||||
|
DroppedLinks uint32 `json:"droppedLinksCount,omitempty"`
|
||||||
|
// An optional final status for this span. Semantically when Status isn't set, it means
|
||||||
|
// span's status code is unset, i.e. assume STATUS_CODE_UNSET (code = 0).
|
||||||
|
Status *Status `json:"status,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON encodes s into OTLP formatted JSON.
|
||||||
|
func (s Span) MarshalJSON() ([]byte, error) {
|
||||||
|
startT := s.StartTime.UnixNano()
|
||||||
|
if s.StartTime.IsZero() || startT < 0 {
|
||||||
|
startT = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
endT := s.EndTime.UnixNano()
|
||||||
|
if s.EndTime.IsZero() || endT < 0 {
|
||||||
|
endT = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Override non-empty default SpanID marshal and omitempty.
|
||||||
|
var parentSpanId string
|
||||||
|
if !s.ParentSpanID.IsEmpty() {
|
||||||
|
b := make([]byte, hex.EncodedLen(spanIDSize))
|
||||||
|
hex.Encode(b, s.ParentSpanID[:])
|
||||||
|
parentSpanId = string(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Alias Span
|
||||||
|
return json.Marshal(struct {
|
||||||
|
Alias
|
||||||
|
ParentSpanID string `json:"parentSpanId,omitempty"`
|
||||||
|
StartTime uint64 `json:"startTimeUnixNano,omitempty"`
|
||||||
|
EndTime uint64 `json:"endTimeUnixNano,omitempty"`
|
||||||
|
}{
|
||||||
|
Alias: Alias(s),
|
||||||
|
ParentSpanID: parentSpanId,
|
||||||
|
StartTime: uint64(startT),
|
||||||
|
EndTime: uint64(endT),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes the OTLP formatted JSON contained in data into s.
|
||||||
|
func (s *Span) UnmarshalJSON(data []byte) error {
|
||||||
|
decoder := json.NewDecoder(bytes.NewReader(data))
|
||||||
|
|
||||||
|
t, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if t != json.Delim('{') {
|
||||||
|
return errors.New("invalid Span type")
|
||||||
|
}
|
||||||
|
|
||||||
|
for decoder.More() {
|
||||||
|
keyIface, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, io.EOF) {
|
||||||
|
// Empty.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
key, ok := keyIface.(string)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("invalid Span field: %#v", keyIface)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case "traceId", "trace_id":
|
||||||
|
err = decoder.Decode(&s.TraceID)
|
||||||
|
case "spanId", "span_id":
|
||||||
|
err = decoder.Decode(&s.SpanID)
|
||||||
|
case "traceState", "trace_state":
|
||||||
|
err = decoder.Decode(&s.TraceState)
|
||||||
|
case "parentSpanId", "parent_span_id":
|
||||||
|
err = decoder.Decode(&s.ParentSpanID)
|
||||||
|
case "flags":
|
||||||
|
err = decoder.Decode(&s.Flags)
|
||||||
|
case "name":
|
||||||
|
err = decoder.Decode(&s.Name)
|
||||||
|
case "kind":
|
||||||
|
err = decoder.Decode(&s.Kind)
|
||||||
|
case "startTimeUnixNano", "start_time_unix_nano":
|
||||||
|
var val protoUint64
|
||||||
|
err = decoder.Decode(&val)
|
||||||
|
s.StartTime = time.Unix(0, int64(val.Uint64()))
|
||||||
|
case "endTimeUnixNano", "end_time_unix_nano":
|
||||||
|
var val protoUint64
|
||||||
|
err = decoder.Decode(&val)
|
||||||
|
s.EndTime = time.Unix(0, int64(val.Uint64()))
|
||||||
|
case "attributes":
|
||||||
|
err = decoder.Decode(&s.Attrs)
|
||||||
|
case "droppedAttributesCount", "dropped_attributes_count":
|
||||||
|
err = decoder.Decode(&s.DroppedAttrs)
|
||||||
|
case "events":
|
||||||
|
err = decoder.Decode(&s.Events)
|
||||||
|
case "droppedEventsCount", "dropped_events_count":
|
||||||
|
err = decoder.Decode(&s.DroppedEvents)
|
||||||
|
case "links":
|
||||||
|
err = decoder.Decode(&s.Links)
|
||||||
|
case "droppedLinksCount", "dropped_links_count":
|
||||||
|
err = decoder.Decode(&s.DroppedLinks)
|
||||||
|
case "status":
|
||||||
|
err = decoder.Decode(&s.Status)
|
||||||
|
default:
|
||||||
|
// Skip unknown.
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SpanFlags represents constants used to interpret the
|
||||||
|
// Span.flags field, which is protobuf 'fixed32' type and is to
|
||||||
|
// be used as bit-fields. Each non-zero value defined in this enum is
|
||||||
|
// a bit-mask. To extract the bit-field, for example, use an
|
||||||
|
// expression like:
|
||||||
|
//
|
||||||
|
// (span.flags & SPAN_FLAGS_TRACE_FLAGS_MASK)
|
||||||
|
//
|
||||||
|
// See https://www.w3.org/TR/trace-context-2/#trace-flags for the flag definitions.
|
||||||
|
//
|
||||||
|
// Note that Span flags were introduced in version 1.1 of the
|
||||||
|
// OpenTelemetry protocol. Older Span producers do not set this
|
||||||
|
// field, consequently consumers should not rely on the absence of a
|
||||||
|
// particular flag bit to indicate the presence of a particular feature.
|
||||||
|
type SpanFlags int32
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Bits 0-7 are used for trace flags.
|
||||||
|
SpanFlagsTraceFlagsMask SpanFlags = 255
|
||||||
|
// Bits 8 and 9 are used to indicate that the parent span or link span is remote.
|
||||||
|
// Bit 8 (`HAS_IS_REMOTE`) indicates whether the value is known.
|
||||||
|
// Bit 9 (`IS_REMOTE`) indicates whether the span or link is remote.
|
||||||
|
SpanFlagsContextHasIsRemoteMask SpanFlags = 256
|
||||||
|
// SpanFlagsContextHasIsRemoteMask indicates the Span is remote.
|
||||||
|
SpanFlagsContextIsRemoteMask SpanFlags = 512
|
||||||
|
)
|
||||||
|
|
||||||
|
// SpanKind is the type of span. Can be used to specify additional relationships between spans
|
||||||
|
// in addition to a parent/child relationship.
|
||||||
|
type SpanKind int32
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Indicates that the span represents an internal operation within an application,
|
||||||
|
// as opposed to an operation happening at the boundaries. Default value.
|
||||||
|
SpanKindInternal SpanKind = 1
|
||||||
|
// Indicates that the span covers server-side handling of an RPC or other
|
||||||
|
// remote network request.
|
||||||
|
SpanKindServer SpanKind = 2
|
||||||
|
// Indicates that the span describes a request to some remote service.
|
||||||
|
SpanKindClient SpanKind = 3
|
||||||
|
// Indicates that the span describes a producer sending a message to a broker.
|
||||||
|
// Unlike CLIENT and SERVER, there is often no direct critical path latency relationship
|
||||||
|
// between producer and consumer spans. A PRODUCER span ends when the message was accepted
|
||||||
|
// by the broker while the logical processing of the message might span a much longer time.
|
||||||
|
SpanKindProducer SpanKind = 4
|
||||||
|
// Indicates that the span describes consumer receiving a message from a broker.
|
||||||
|
// Like the PRODUCER kind, there is often no direct critical path latency relationship
|
||||||
|
// between producer and consumer spans.
|
||||||
|
SpanKindConsumer SpanKind = 5
|
||||||
|
)
|
||||||
|
|
||||||
|
// Event is a time-stamped annotation of the span, consisting of user-supplied
|
||||||
|
// text description and key-value pairs.
|
||||||
|
type SpanEvent struct {
|
||||||
|
// time_unix_nano is the time the event occurred.
|
||||||
|
Time time.Time `json:"timeUnixNano,omitempty"`
|
||||||
|
// name of the event.
|
||||||
|
// This field is semantically required to be set to non-empty string.
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
// attributes is a collection of attribute key/value pairs on the event.
|
||||||
|
// Attribute keys MUST be unique (it is not allowed to have more than one
|
||||||
|
// attribute with the same key).
|
||||||
|
Attrs []Attr `json:"attributes,omitempty"`
|
||||||
|
// dropped_attributes_count is the number of dropped attributes. If the value is 0,
|
||||||
|
// then no attributes were dropped.
|
||||||
|
DroppedAttrs uint32 `json:"droppedAttributesCount,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON encodes e into OTLP formatted JSON.
|
||||||
|
func (e SpanEvent) MarshalJSON() ([]byte, error) {
|
||||||
|
t := e.Time.UnixNano()
|
||||||
|
if e.Time.IsZero() || t < 0 {
|
||||||
|
t = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
type Alias SpanEvent
|
||||||
|
return json.Marshal(struct {
|
||||||
|
Alias
|
||||||
|
Time uint64 `json:"timeUnixNano,omitempty"`
|
||||||
|
}{
|
||||||
|
Alias: Alias(e),
|
||||||
|
Time: uint64(t),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes the OTLP formatted JSON contained in data into se.
|
||||||
|
func (se *SpanEvent) UnmarshalJSON(data []byte) error {
|
||||||
|
decoder := json.NewDecoder(bytes.NewReader(data))
|
||||||
|
|
||||||
|
t, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if t != json.Delim('{') {
|
||||||
|
return errors.New("invalid SpanEvent type")
|
||||||
|
}
|
||||||
|
|
||||||
|
for decoder.More() {
|
||||||
|
keyIface, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, io.EOF) {
|
||||||
|
// Empty.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
key, ok := keyIface.(string)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("invalid SpanEvent field: %#v", keyIface)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case "timeUnixNano", "time_unix_nano":
|
||||||
|
var val protoUint64
|
||||||
|
err = decoder.Decode(&val)
|
||||||
|
se.Time = time.Unix(0, int64(val.Uint64()))
|
||||||
|
case "name":
|
||||||
|
err = decoder.Decode(&se.Name)
|
||||||
|
case "attributes":
|
||||||
|
err = decoder.Decode(&se.Attrs)
|
||||||
|
case "droppedAttributesCount", "dropped_attributes_count":
|
||||||
|
err = decoder.Decode(&se.DroppedAttrs)
|
||||||
|
default:
|
||||||
|
// Skip unknown.
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// A pointer from the current span to another span in the same trace or in a
|
||||||
|
// different trace. For example, this can be used in batching operations,
|
||||||
|
// where a single batch handler processes multiple requests from different
|
||||||
|
// traces or when the handler receives a request from a different project.
|
||||||
|
type SpanLink struct {
|
||||||
|
// A unique identifier of a trace that this linked span is part of. The ID is a
|
||||||
|
// 16-byte array.
|
||||||
|
TraceID TraceID `json:"traceId,omitempty"`
|
||||||
|
// A unique identifier for the linked span. The ID is an 8-byte array.
|
||||||
|
SpanID SpanID `json:"spanId,omitempty"`
|
||||||
|
// The trace_state associated with the link.
|
||||||
|
TraceState string `json:"traceState,omitempty"`
|
||||||
|
// attributes is a collection of attribute key/value pairs on the link.
|
||||||
|
// Attribute keys MUST be unique (it is not allowed to have more than one
|
||||||
|
// attribute with the same key).
|
||||||
|
Attrs []Attr `json:"attributes,omitempty"`
|
||||||
|
// dropped_attributes_count is the number of dropped attributes. If the value is 0,
|
||||||
|
// then no attributes were dropped.
|
||||||
|
DroppedAttrs uint32 `json:"droppedAttributesCount,omitempty"`
|
||||||
|
// Flags, a bit field.
|
||||||
|
//
|
||||||
|
// Bits 0-7 (8 least significant bits) are the trace flags as defined in W3C Trace
|
||||||
|
// Context specification. To read the 8-bit W3C trace flag, use
|
||||||
|
// `flags & SPAN_FLAGS_TRACE_FLAGS_MASK`.
|
||||||
|
//
|
||||||
|
// See https://www.w3.org/TR/trace-context-2/#trace-flags for the flag definitions.
|
||||||
|
//
|
||||||
|
// Bits 8 and 9 represent the 3 states of whether the link is remote.
|
||||||
|
// The states are (unknown, is not remote, is remote).
|
||||||
|
// To read whether the value is known, use `(flags & SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK) != 0`.
|
||||||
|
// To read whether the link is remote, use `(flags & SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK) != 0`.
|
||||||
|
//
|
||||||
|
// Readers MUST NOT assume that bits 10-31 (22 most significant bits) will be zero.
|
||||||
|
// When creating new spans, bits 10-31 (most-significant 22-bits) MUST be zero.
|
||||||
|
//
|
||||||
|
// [Optional].
|
||||||
|
Flags uint32 `json:"flags,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes the OTLP formatted JSON contained in data into sl.
|
||||||
|
func (sl *SpanLink) UnmarshalJSON(data []byte) error {
|
||||||
|
decoder := json.NewDecoder(bytes.NewReader(data))
|
||||||
|
|
||||||
|
t, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if t != json.Delim('{') {
|
||||||
|
return errors.New("invalid SpanLink type")
|
||||||
|
}
|
||||||
|
|
||||||
|
for decoder.More() {
|
||||||
|
keyIface, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, io.EOF) {
|
||||||
|
// Empty.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
key, ok := keyIface.(string)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("invalid SpanLink field: %#v", keyIface)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case "traceId", "trace_id":
|
||||||
|
err = decoder.Decode(&sl.TraceID)
|
||||||
|
case "spanId", "span_id":
|
||||||
|
err = decoder.Decode(&sl.SpanID)
|
||||||
|
case "traceState", "trace_state":
|
||||||
|
err = decoder.Decode(&sl.TraceState)
|
||||||
|
case "attributes":
|
||||||
|
err = decoder.Decode(&sl.Attrs)
|
||||||
|
case "droppedAttributesCount", "dropped_attributes_count":
|
||||||
|
err = decoder.Decode(&sl.DroppedAttrs)
|
||||||
|
case "flags":
|
||||||
|
err = decoder.Decode(&sl.Flags)
|
||||||
|
default:
|
||||||
|
// Skip unknown.
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
40
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/status.go
generated
vendored
Normal file
40
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/status.go
generated
vendored
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package telemetry
|
||||||
|
|
||||||
|
// For the semantics of status codes see
|
||||||
|
// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#set-status
|
||||||
|
type StatusCode int32
|
||||||
|
|
||||||
|
const (
|
||||||
|
// The default status.
|
||||||
|
StatusCodeUnset StatusCode = 0
|
||||||
|
// The Span has been validated by an Application developer or Operator to
|
||||||
|
// have completed successfully.
|
||||||
|
StatusCodeOK StatusCode = 1
|
||||||
|
// The Span contains an error.
|
||||||
|
StatusCodeError StatusCode = 2
|
||||||
|
)
|
||||||
|
|
||||||
|
var statusCodeStrings = []string{
|
||||||
|
"Unset",
|
||||||
|
"OK",
|
||||||
|
"Error",
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s StatusCode) String() string {
|
||||||
|
if s >= 0 && int(s) < len(statusCodeStrings) {
|
||||||
|
return statusCodeStrings[s]
|
||||||
|
}
|
||||||
|
return "<unknown telemetry.StatusCode>"
|
||||||
|
}
|
||||||
|
|
||||||
|
// The Status type defines a logical error model that is suitable for different
|
||||||
|
// programming environments, including REST APIs and RPC APIs.
|
||||||
|
type Status struct {
|
||||||
|
// A developer-facing human readable error message.
|
||||||
|
Message string `json:"message,omitempty"`
|
||||||
|
// The status code.
|
||||||
|
Code StatusCode `json:"code,omitempty"`
|
||||||
|
}
|
189
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/traces.go
generated
vendored
Normal file
189
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/traces.go
generated
vendored
Normal file
|
@ -0,0 +1,189 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package telemetry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Traces represents the traces data that can be stored in a persistent storage,
|
||||||
|
// OR can be embedded by other protocols that transfer OTLP traces data but do
|
||||||
|
// not implement the OTLP protocol.
|
||||||
|
//
|
||||||
|
// The main difference between this message and collector protocol is that
|
||||||
|
// in this message there will not be any "control" or "metadata" specific to
|
||||||
|
// OTLP protocol.
|
||||||
|
//
|
||||||
|
// When new fields are added into this message, the OTLP request MUST be updated
|
||||||
|
// as well.
|
||||||
|
type Traces struct {
|
||||||
|
// An array of ResourceSpans.
|
||||||
|
// For data coming from a single resource this array will typically contain
|
||||||
|
// one element. Intermediary nodes that receive data from multiple origins
|
||||||
|
// typically batch the data before forwarding further and in that case this
|
||||||
|
// array will contain multiple elements.
|
||||||
|
ResourceSpans []*ResourceSpans `json:"resourceSpans,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes the OTLP formatted JSON contained in data into td.
|
||||||
|
func (td *Traces) UnmarshalJSON(data []byte) error {
|
||||||
|
decoder := json.NewDecoder(bytes.NewReader(data))
|
||||||
|
|
||||||
|
t, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if t != json.Delim('{') {
|
||||||
|
return errors.New("invalid TracesData type")
|
||||||
|
}
|
||||||
|
|
||||||
|
for decoder.More() {
|
||||||
|
keyIface, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, io.EOF) {
|
||||||
|
// Empty.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
key, ok := keyIface.(string)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("invalid TracesData field: %#v", keyIface)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case "resourceSpans", "resource_spans":
|
||||||
|
err = decoder.Decode(&td.ResourceSpans)
|
||||||
|
default:
|
||||||
|
// Skip unknown.
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// A collection of ScopeSpans from a Resource.
|
||||||
|
type ResourceSpans struct {
|
||||||
|
// The resource for the spans in this message.
|
||||||
|
// If this field is not set then no resource info is known.
|
||||||
|
Resource Resource `json:"resource"`
|
||||||
|
// A list of ScopeSpans that originate from a resource.
|
||||||
|
ScopeSpans []*ScopeSpans `json:"scopeSpans,omitempty"`
|
||||||
|
// This schema_url applies to the data in the "resource" field. It does not apply
|
||||||
|
// to the data in the "scope_spans" field which have their own schema_url field.
|
||||||
|
SchemaURL string `json:"schemaUrl,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes the OTLP formatted JSON contained in data into rs.
|
||||||
|
func (rs *ResourceSpans) UnmarshalJSON(data []byte) error {
|
||||||
|
decoder := json.NewDecoder(bytes.NewReader(data))
|
||||||
|
|
||||||
|
t, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if t != json.Delim('{') {
|
||||||
|
return errors.New("invalid ResourceSpans type")
|
||||||
|
}
|
||||||
|
|
||||||
|
for decoder.More() {
|
||||||
|
keyIface, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, io.EOF) {
|
||||||
|
// Empty.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
key, ok := keyIface.(string)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("invalid ResourceSpans field: %#v", keyIface)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case "resource":
|
||||||
|
err = decoder.Decode(&rs.Resource)
|
||||||
|
case "scopeSpans", "scope_spans":
|
||||||
|
err = decoder.Decode(&rs.ScopeSpans)
|
||||||
|
case "schemaUrl", "schema_url":
|
||||||
|
err = decoder.Decode(&rs.SchemaURL)
|
||||||
|
default:
|
||||||
|
// Skip unknown.
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// A collection of Spans produced by an InstrumentationScope.
|
||||||
|
type ScopeSpans struct {
|
||||||
|
// The instrumentation scope information for the spans in this message.
|
||||||
|
// Semantically when InstrumentationScope isn't set, it is equivalent with
|
||||||
|
// an empty instrumentation scope name (unknown).
|
||||||
|
Scope *Scope `json:"scope"`
|
||||||
|
// A list of Spans that originate from an instrumentation scope.
|
||||||
|
Spans []*Span `json:"spans,omitempty"`
|
||||||
|
// The Schema URL, if known. This is the identifier of the Schema that the span data
|
||||||
|
// is recorded in. To learn more about Schema URL see
|
||||||
|
// https://opentelemetry.io/docs/specs/otel/schemas/#schema-url
|
||||||
|
// This schema_url applies to all spans and span events in the "spans" field.
|
||||||
|
SchemaURL string `json:"schemaUrl,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes the OTLP formatted JSON contained in data into ss.
|
||||||
|
func (ss *ScopeSpans) UnmarshalJSON(data []byte) error {
|
||||||
|
decoder := json.NewDecoder(bytes.NewReader(data))
|
||||||
|
|
||||||
|
t, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if t != json.Delim('{') {
|
||||||
|
return errors.New("invalid ScopeSpans type")
|
||||||
|
}
|
||||||
|
|
||||||
|
for decoder.More() {
|
||||||
|
keyIface, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, io.EOF) {
|
||||||
|
// Empty.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
key, ok := keyIface.(string)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("invalid ScopeSpans field: %#v", keyIface)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case "scope":
|
||||||
|
err = decoder.Decode(&ss.Scope)
|
||||||
|
case "spans":
|
||||||
|
err = decoder.Decode(&ss.Spans)
|
||||||
|
case "schemaUrl", "schema_url":
|
||||||
|
err = decoder.Decode(&ss.SchemaURL)
|
||||||
|
default:
|
||||||
|
// Skip unknown.
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
452
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/value.go
generated
vendored
Normal file
452
vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/value.go
generated
vendored
Normal file
|
@ -0,0 +1,452 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
//go:generate stringer -type=ValueKind -trimprefix=ValueKind
|
||||||
|
|
||||||
|
package telemetry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"cmp"
|
||||||
|
"encoding/base64"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"math"
|
||||||
|
"slices"
|
||||||
|
"strconv"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
// A Value represents a structured value.
|
||||||
|
// A zero value is valid and represents an empty value.
|
||||||
|
type Value struct {
|
||||||
|
// Ensure forward compatibility by explicitly making this not comparable.
|
||||||
|
noCmp [0]func() //nolint: unused // This is indeed used.
|
||||||
|
|
||||||
|
// num holds the value for Int64, Float64, and Bool. It holds the length
|
||||||
|
// for String, Bytes, Slice, Map.
|
||||||
|
num uint64
|
||||||
|
// any holds either the KindBool, KindInt64, KindFloat64, stringptr,
|
||||||
|
// bytesptr, sliceptr, or mapptr. If KindBool, KindInt64, or KindFloat64
|
||||||
|
// then the value of Value is in num as described above. Otherwise, it
|
||||||
|
// contains the value wrapped in the appropriate type.
|
||||||
|
any any
|
||||||
|
}
|
||||||
|
|
||||||
|
type (
|
||||||
|
// sliceptr represents a value in Value.any for KindString Values.
|
||||||
|
stringptr *byte
|
||||||
|
// bytesptr represents a value in Value.any for KindBytes Values.
|
||||||
|
bytesptr *byte
|
||||||
|
// sliceptr represents a value in Value.any for KindSlice Values.
|
||||||
|
sliceptr *Value
|
||||||
|
// mapptr represents a value in Value.any for KindMap Values.
|
||||||
|
mapptr *Attr
|
||||||
|
)
|
||||||
|
|
||||||
|
// ValueKind is the kind of a [Value].
|
||||||
|
type ValueKind int
|
||||||
|
|
||||||
|
// ValueKind values.
|
||||||
|
const (
|
||||||
|
ValueKindEmpty ValueKind = iota
|
||||||
|
ValueKindBool
|
||||||
|
ValueKindFloat64
|
||||||
|
ValueKindInt64
|
||||||
|
ValueKindString
|
||||||
|
ValueKindBytes
|
||||||
|
ValueKindSlice
|
||||||
|
ValueKindMap
|
||||||
|
)
|
||||||
|
|
||||||
|
var valueKindStrings = []string{
|
||||||
|
"Empty",
|
||||||
|
"Bool",
|
||||||
|
"Float64",
|
||||||
|
"Int64",
|
||||||
|
"String",
|
||||||
|
"Bytes",
|
||||||
|
"Slice",
|
||||||
|
"Map",
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k ValueKind) String() string {
|
||||||
|
if k >= 0 && int(k) < len(valueKindStrings) {
|
||||||
|
return valueKindStrings[k]
|
||||||
|
}
|
||||||
|
return "<unknown telemetry.ValueKind>"
|
||||||
|
}
|
||||||
|
|
||||||
|
// StringValue returns a new [Value] for a string.
|
||||||
|
func StringValue(v string) Value {
|
||||||
|
return Value{
|
||||||
|
num: uint64(len(v)),
|
||||||
|
any: stringptr(unsafe.StringData(v)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntValue returns a [Value] for an int.
|
||||||
|
func IntValue(v int) Value { return Int64Value(int64(v)) }
|
||||||
|
|
||||||
|
// Int64Value returns a [Value] for an int64.
|
||||||
|
func Int64Value(v int64) Value {
|
||||||
|
return Value{num: uint64(v), any: ValueKindInt64}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64Value returns a [Value] for a float64.
|
||||||
|
func Float64Value(v float64) Value {
|
||||||
|
return Value{num: math.Float64bits(v), any: ValueKindFloat64}
|
||||||
|
}
|
||||||
|
|
||||||
|
// BoolValue returns a [Value] for a bool.
|
||||||
|
func BoolValue(v bool) Value { //nolint:revive // Not a control flag.
|
||||||
|
var n uint64
|
||||||
|
if v {
|
||||||
|
n = 1
|
||||||
|
}
|
||||||
|
return Value{num: n, any: ValueKindBool}
|
||||||
|
}
|
||||||
|
|
||||||
|
// BytesValue returns a [Value] for a byte slice. The passed slice must not be
|
||||||
|
// changed after it is passed.
|
||||||
|
func BytesValue(v []byte) Value {
|
||||||
|
return Value{
|
||||||
|
num: uint64(len(v)),
|
||||||
|
any: bytesptr(unsafe.SliceData(v)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SliceValue returns a [Value] for a slice of [Value]. The passed slice must
|
||||||
|
// not be changed after it is passed.
|
||||||
|
func SliceValue(vs ...Value) Value {
|
||||||
|
return Value{
|
||||||
|
num: uint64(len(vs)),
|
||||||
|
any: sliceptr(unsafe.SliceData(vs)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MapValue returns a new [Value] for a slice of key-value pairs. The passed
|
||||||
|
// slice must not be changed after it is passed.
|
||||||
|
func MapValue(kvs ...Attr) Value {
|
||||||
|
return Value{
|
||||||
|
num: uint64(len(kvs)),
|
||||||
|
any: mapptr(unsafe.SliceData(kvs)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AsString returns the value held by v as a string.
|
||||||
|
func (v Value) AsString() string {
|
||||||
|
if sp, ok := v.any.(stringptr); ok {
|
||||||
|
return unsafe.String(sp, v.num)
|
||||||
|
}
|
||||||
|
// TODO: error handle
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// asString returns the value held by v as a string. It will panic if the Value
|
||||||
|
// is not KindString.
|
||||||
|
func (v Value) asString() string {
|
||||||
|
return unsafe.String(v.any.(stringptr), v.num)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AsInt64 returns the value held by v as an int64.
|
||||||
|
func (v Value) AsInt64() int64 {
|
||||||
|
if v.Kind() != ValueKindInt64 {
|
||||||
|
// TODO: error handle
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return v.asInt64()
|
||||||
|
}
|
||||||
|
|
||||||
|
// asInt64 returns the value held by v as an int64. If v is not of KindInt64,
|
||||||
|
// this will return garbage.
|
||||||
|
func (v Value) asInt64() int64 {
|
||||||
|
// Assumes v.num was a valid int64 (overflow not checked).
|
||||||
|
return int64(v.num) // nolint: gosec
|
||||||
|
}
|
||||||
|
|
||||||
|
// AsBool returns the value held by v as a bool.
|
||||||
|
func (v Value) AsBool() bool {
|
||||||
|
if v.Kind() != ValueKindBool {
|
||||||
|
// TODO: error handle
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return v.asBool()
|
||||||
|
}
|
||||||
|
|
||||||
|
// asBool returns the value held by v as a bool. If v is not of KindBool, this
|
||||||
|
// will return garbage.
|
||||||
|
func (v Value) asBool() bool { return v.num == 1 }
|
||||||
|
|
||||||
|
// AsFloat64 returns the value held by v as a float64.
|
||||||
|
func (v Value) AsFloat64() float64 {
|
||||||
|
if v.Kind() != ValueKindFloat64 {
|
||||||
|
// TODO: error handle
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return v.asFloat64()
|
||||||
|
}
|
||||||
|
|
||||||
|
// asFloat64 returns the value held by v as a float64. If v is not of
|
||||||
|
// KindFloat64, this will return garbage.
|
||||||
|
func (v Value) asFloat64() float64 { return math.Float64frombits(v.num) }
|
||||||
|
|
||||||
|
// AsBytes returns the value held by v as a []byte.
|
||||||
|
func (v Value) AsBytes() []byte {
|
||||||
|
if sp, ok := v.any.(bytesptr); ok {
|
||||||
|
return unsafe.Slice((*byte)(sp), v.num)
|
||||||
|
}
|
||||||
|
// TODO: error handle
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// asBytes returns the value held by v as a []byte. It will panic if the Value
|
||||||
|
// is not KindBytes.
|
||||||
|
func (v Value) asBytes() []byte {
|
||||||
|
return unsafe.Slice((*byte)(v.any.(bytesptr)), v.num)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AsSlice returns the value held by v as a []Value.
|
||||||
|
func (v Value) AsSlice() []Value {
|
||||||
|
if sp, ok := v.any.(sliceptr); ok {
|
||||||
|
return unsafe.Slice((*Value)(sp), v.num)
|
||||||
|
}
|
||||||
|
// TODO: error handle
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// asSlice returns the value held by v as a []Value. It will panic if the Value
|
||||||
|
// is not KindSlice.
|
||||||
|
func (v Value) asSlice() []Value {
|
||||||
|
return unsafe.Slice((*Value)(v.any.(sliceptr)), v.num)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AsMap returns the value held by v as a []Attr.
|
||||||
|
func (v Value) AsMap() []Attr {
|
||||||
|
if sp, ok := v.any.(mapptr); ok {
|
||||||
|
return unsafe.Slice((*Attr)(sp), v.num)
|
||||||
|
}
|
||||||
|
// TODO: error handle
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// asMap returns the value held by v as a []Attr. It will panic if the
|
||||||
|
// Value is not KindMap.
|
||||||
|
func (v Value) asMap() []Attr {
|
||||||
|
return unsafe.Slice((*Attr)(v.any.(mapptr)), v.num)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Kind returns the Kind of v.
|
||||||
|
func (v Value) Kind() ValueKind {
|
||||||
|
switch x := v.any.(type) {
|
||||||
|
case ValueKind:
|
||||||
|
return x
|
||||||
|
case stringptr:
|
||||||
|
return ValueKindString
|
||||||
|
case bytesptr:
|
||||||
|
return ValueKindBytes
|
||||||
|
case sliceptr:
|
||||||
|
return ValueKindSlice
|
||||||
|
case mapptr:
|
||||||
|
return ValueKindMap
|
||||||
|
default:
|
||||||
|
return ValueKindEmpty
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Empty returns if v does not hold any value.
|
||||||
|
func (v Value) Empty() bool { return v.Kind() == ValueKindEmpty }
|
||||||
|
|
||||||
|
// Equal returns if v is equal to w.
|
||||||
|
func (v Value) Equal(w Value) bool {
|
||||||
|
k1 := v.Kind()
|
||||||
|
k2 := w.Kind()
|
||||||
|
if k1 != k2 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
switch k1 {
|
||||||
|
case ValueKindInt64, ValueKindBool:
|
||||||
|
return v.num == w.num
|
||||||
|
case ValueKindString:
|
||||||
|
return v.asString() == w.asString()
|
||||||
|
case ValueKindFloat64:
|
||||||
|
return v.asFloat64() == w.asFloat64()
|
||||||
|
case ValueKindSlice:
|
||||||
|
return slices.EqualFunc(v.asSlice(), w.asSlice(), Value.Equal)
|
||||||
|
case ValueKindMap:
|
||||||
|
sv := sortMap(v.asMap())
|
||||||
|
sw := sortMap(w.asMap())
|
||||||
|
return slices.EqualFunc(sv, sw, Attr.Equal)
|
||||||
|
case ValueKindBytes:
|
||||||
|
return bytes.Equal(v.asBytes(), w.asBytes())
|
||||||
|
case ValueKindEmpty:
|
||||||
|
return true
|
||||||
|
default:
|
||||||
|
// TODO: error handle
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func sortMap(m []Attr) []Attr {
|
||||||
|
sm := make([]Attr, len(m))
|
||||||
|
copy(sm, m)
|
||||||
|
slices.SortFunc(sm, func(a, b Attr) int {
|
||||||
|
return cmp.Compare(a.Key, b.Key)
|
||||||
|
})
|
||||||
|
|
||||||
|
return sm
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns Value's value as a string, formatted like [fmt.Sprint].
|
||||||
|
//
|
||||||
|
// The returned string is meant for debugging;
|
||||||
|
// the string representation is not stable.
|
||||||
|
func (v Value) String() string {
|
||||||
|
switch v.Kind() {
|
||||||
|
case ValueKindString:
|
||||||
|
return v.asString()
|
||||||
|
case ValueKindInt64:
|
||||||
|
// Assumes v.num was a valid int64 (overflow not checked).
|
||||||
|
return strconv.FormatInt(int64(v.num), 10) // nolint: gosec
|
||||||
|
case ValueKindFloat64:
|
||||||
|
return strconv.FormatFloat(v.asFloat64(), 'g', -1, 64)
|
||||||
|
case ValueKindBool:
|
||||||
|
return strconv.FormatBool(v.asBool())
|
||||||
|
case ValueKindBytes:
|
||||||
|
return fmt.Sprint(v.asBytes())
|
||||||
|
case ValueKindMap:
|
||||||
|
return fmt.Sprint(v.asMap())
|
||||||
|
case ValueKindSlice:
|
||||||
|
return fmt.Sprint(v.asSlice())
|
||||||
|
case ValueKindEmpty:
|
||||||
|
return "<nil>"
|
||||||
|
default:
|
||||||
|
// Try to handle this as gracefully as possible.
|
||||||
|
//
|
||||||
|
// Don't panic here. The goal here is to have developers find this
|
||||||
|
// first if a slog.Kind is is not handled. It is
|
||||||
|
// preferable to have user's open issue asking why their attributes
|
||||||
|
// have a "unhandled: " prefix than say that their code is panicking.
|
||||||
|
return fmt.Sprintf("<unhandled telemetry.ValueKind: %s>", v.Kind())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON encodes v into OTLP formatted JSON.
|
||||||
|
func (v *Value) MarshalJSON() ([]byte, error) {
|
||||||
|
switch v.Kind() {
|
||||||
|
case ValueKindString:
|
||||||
|
return json.Marshal(struct {
|
||||||
|
Value string `json:"stringValue"`
|
||||||
|
}{v.asString()})
|
||||||
|
case ValueKindInt64:
|
||||||
|
return json.Marshal(struct {
|
||||||
|
Value string `json:"intValue"`
|
||||||
|
}{strconv.FormatInt(int64(v.num), 10)})
|
||||||
|
case ValueKindFloat64:
|
||||||
|
return json.Marshal(struct {
|
||||||
|
Value float64 `json:"doubleValue"`
|
||||||
|
}{v.asFloat64()})
|
||||||
|
case ValueKindBool:
|
||||||
|
return json.Marshal(struct {
|
||||||
|
Value bool `json:"boolValue"`
|
||||||
|
}{v.asBool()})
|
||||||
|
case ValueKindBytes:
|
||||||
|
return json.Marshal(struct {
|
||||||
|
Value []byte `json:"bytesValue"`
|
||||||
|
}{v.asBytes()})
|
||||||
|
case ValueKindMap:
|
||||||
|
return json.Marshal(struct {
|
||||||
|
Value struct {
|
||||||
|
Values []Attr `json:"values"`
|
||||||
|
} `json:"kvlistValue"`
|
||||||
|
}{struct {
|
||||||
|
Values []Attr `json:"values"`
|
||||||
|
}{v.asMap()}})
|
||||||
|
case ValueKindSlice:
|
||||||
|
return json.Marshal(struct {
|
||||||
|
Value struct {
|
||||||
|
Values []Value `json:"values"`
|
||||||
|
} `json:"arrayValue"`
|
||||||
|
}{struct {
|
||||||
|
Values []Value `json:"values"`
|
||||||
|
}{v.asSlice()}})
|
||||||
|
case ValueKindEmpty:
|
||||||
|
return nil, nil
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("unknown Value kind: %s", v.Kind().String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON decodes the OTLP formatted JSON contained in data into v.
|
||||||
|
func (v *Value) UnmarshalJSON(data []byte) error {
|
||||||
|
decoder := json.NewDecoder(bytes.NewReader(data))
|
||||||
|
|
||||||
|
t, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if t != json.Delim('{') {
|
||||||
|
return errors.New("invalid Value type")
|
||||||
|
}
|
||||||
|
|
||||||
|
for decoder.More() {
|
||||||
|
keyIface, err := decoder.Token()
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, io.EOF) {
|
||||||
|
// Empty.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
key, ok := keyIface.(string)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("invalid Value key: %#v", keyIface)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case "stringValue", "string_value":
|
||||||
|
var val string
|
||||||
|
err = decoder.Decode(&val)
|
||||||
|
*v = StringValue(val)
|
||||||
|
case "boolValue", "bool_value":
|
||||||
|
var val bool
|
||||||
|
err = decoder.Decode(&val)
|
||||||
|
*v = BoolValue(val)
|
||||||
|
case "intValue", "int_value":
|
||||||
|
var val protoInt64
|
||||||
|
err = decoder.Decode(&val)
|
||||||
|
*v = Int64Value(val.Int64())
|
||||||
|
case "doubleValue", "double_value":
|
||||||
|
var val float64
|
||||||
|
err = decoder.Decode(&val)
|
||||||
|
*v = Float64Value(val)
|
||||||
|
case "bytesValue", "bytes_value":
|
||||||
|
var val64 string
|
||||||
|
if err := decoder.Decode(&val64); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var val []byte
|
||||||
|
val, err = base64.StdEncoding.DecodeString(val64)
|
||||||
|
*v = BytesValue(val)
|
||||||
|
case "arrayValue", "array_value":
|
||||||
|
var val struct{ Values []Value }
|
||||||
|
err = decoder.Decode(&val)
|
||||||
|
*v = SliceValue(val.Values...)
|
||||||
|
case "kvlistValue", "kvlist_value":
|
||||||
|
var val struct{ Values []Attr }
|
||||||
|
err = decoder.Decode(&val)
|
||||||
|
*v = MapValue(val.Values...)
|
||||||
|
default:
|
||||||
|
// Skip unknown.
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// Use first valid. Ignore the rest.
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only unknown fields. Return nil without unmarshaling any value.
|
||||||
|
return nil
|
||||||
|
}
|
94
vendor/go.opentelemetry.io/auto/sdk/limit.go
generated
vendored
Normal file
94
vendor/go.opentelemetry.io/auto/sdk/limit.go
generated
vendored
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package sdk
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log/slog"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
// maxSpan are the span limits resolved during startup.
|
||||||
|
var maxSpan = newSpanLimits()
|
||||||
|
|
||||||
|
type spanLimits struct {
|
||||||
|
// Attrs is the number of allowed attributes for a span.
|
||||||
|
//
|
||||||
|
// This is resolved from 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, or 128 if
|
||||||
|
// that is not set, is used.
|
||||||
|
Attrs int
|
||||||
|
// AttrValueLen is the maximum attribute value length allowed for a span.
|
||||||
|
//
|
||||||
|
// This is resolved from 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, or -1
|
||||||
|
// if that is not set, is used.
|
||||||
|
AttrValueLen int
|
||||||
|
// Events is the number of allowed events for a span.
|
||||||
|
//
|
||||||
|
// This is resolved from the environment variable value for the
|
||||||
|
// OTEL_SPAN_EVENT_COUNT_LIMIT key, or 128 is used if that is not set.
|
||||||
|
Events int
|
||||||
|
// EventAttrs is the number of allowed attributes for a span event.
|
||||||
|
//
|
||||||
|
// The is resolved from the environment variable value for the
|
||||||
|
// OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT key, or 128 is used if that is not set.
|
||||||
|
EventAttrs int
|
||||||
|
// Links is the number of allowed Links for a span.
|
||||||
|
//
|
||||||
|
// This is resolved from the environment variable value for the
|
||||||
|
// OTEL_SPAN_LINK_COUNT_LIMIT, or 128 is used if that is not set.
|
||||||
|
Links int
|
||||||
|
// LinkAttrs is the number of allowed attributes for a span link.
|
||||||
|
//
|
||||||
|
// This is resolved from the environment variable value for the
|
||||||
|
// OTEL_LINK_ATTRIBUTE_COUNT_LIMIT, or 128 is used if that is not set.
|
||||||
|
LinkAttrs int
|
||||||
|
}
|
||||||
|
|
||||||
|
func newSpanLimits() spanLimits {
|
||||||
|
return spanLimits{
|
||||||
|
Attrs: firstEnv(
|
||||||
|
128,
|
||||||
|
"OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT",
|
||||||
|
"OTEL_ATTRIBUTE_COUNT_LIMIT",
|
||||||
|
),
|
||||||
|
AttrValueLen: firstEnv(
|
||||||
|
-1, // Unlimited.
|
||||||
|
"OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT",
|
||||||
|
"OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT",
|
||||||
|
),
|
||||||
|
Events: firstEnv(128, "OTEL_SPAN_EVENT_COUNT_LIMIT"),
|
||||||
|
EventAttrs: firstEnv(128, "OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT"),
|
||||||
|
Links: firstEnv(128, "OTEL_SPAN_LINK_COUNT_LIMIT"),
|
||||||
|
LinkAttrs: firstEnv(128, "OTEL_LINK_ATTRIBUTE_COUNT_LIMIT"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// firstEnv returns the parsed integer value of the first matching environment
|
||||||
|
// variable from keys. The defaultVal is returned if the value is not an
|
||||||
|
// integer or no match is found.
|
||||||
|
func firstEnv(defaultVal int, keys ...string) int {
|
||||||
|
for _, key := range keys {
|
||||||
|
strV := os.Getenv(key)
|
||||||
|
if strV == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
v, err := strconv.Atoi(strV)
|
||||||
|
if err == nil {
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
slog.Warn(
|
||||||
|
"invalid limit environment variable",
|
||||||
|
"error", err,
|
||||||
|
"key", key,
|
||||||
|
"value", strV,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return defaultVal
|
||||||
|
}
|
432
vendor/go.opentelemetry.io/auto/sdk/span.go
generated
vendored
Normal file
432
vendor/go.opentelemetry.io/auto/sdk/span.go
generated
vendored
Normal file
|
@ -0,0 +1,432 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package sdk
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
|
"time"
|
||||||
|
"unicode/utf8"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/attribute"
|
||||||
|
"go.opentelemetry.io/otel/codes"
|
||||||
|
semconv "go.opentelemetry.io/otel/semconv/v1.26.0"
|
||||||
|
"go.opentelemetry.io/otel/trace"
|
||||||
|
"go.opentelemetry.io/otel/trace/noop"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/auto/sdk/internal/telemetry"
|
||||||
|
)
|
||||||
|
|
||||||
|
type span struct {
|
||||||
|
noop.Span
|
||||||
|
|
||||||
|
spanContext trace.SpanContext
|
||||||
|
sampled atomic.Bool
|
||||||
|
|
||||||
|
mu sync.Mutex
|
||||||
|
traces *telemetry.Traces
|
||||||
|
span *telemetry.Span
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *span) SpanContext() trace.SpanContext {
|
||||||
|
if s == nil {
|
||||||
|
return trace.SpanContext{}
|
||||||
|
}
|
||||||
|
// s.spanContext is immutable, do not acquire lock s.mu.
|
||||||
|
return s.spanContext
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *span) IsRecording() bool {
|
||||||
|
if s == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return s.sampled.Load()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *span) SetStatus(c codes.Code, msg string) {
|
||||||
|
if s == nil || !s.sampled.Load() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
s.mu.Lock()
|
||||||
|
defer s.mu.Unlock()
|
||||||
|
|
||||||
|
if s.span.Status == nil {
|
||||||
|
s.span.Status = new(telemetry.Status)
|
||||||
|
}
|
||||||
|
|
||||||
|
s.span.Status.Message = msg
|
||||||
|
|
||||||
|
switch c {
|
||||||
|
case codes.Unset:
|
||||||
|
s.span.Status.Code = telemetry.StatusCodeUnset
|
||||||
|
case codes.Error:
|
||||||
|
s.span.Status.Code = telemetry.StatusCodeError
|
||||||
|
case codes.Ok:
|
||||||
|
s.span.Status.Code = telemetry.StatusCodeOK
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *span) SetAttributes(attrs ...attribute.KeyValue) {
|
||||||
|
if s == nil || !s.sampled.Load() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
s.mu.Lock()
|
||||||
|
defer s.mu.Unlock()
|
||||||
|
|
||||||
|
limit := maxSpan.Attrs
|
||||||
|
if limit == 0 {
|
||||||
|
// No attributes allowed.
|
||||||
|
s.span.DroppedAttrs += uint32(len(attrs))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
m := make(map[string]int)
|
||||||
|
for i, a := range s.span.Attrs {
|
||||||
|
m[a.Key] = i
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, a := range attrs {
|
||||||
|
val := convAttrValue(a.Value)
|
||||||
|
if val.Empty() {
|
||||||
|
s.span.DroppedAttrs++
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if idx, ok := m[string(a.Key)]; ok {
|
||||||
|
s.span.Attrs[idx] = telemetry.Attr{
|
||||||
|
Key: string(a.Key),
|
||||||
|
Value: val,
|
||||||
|
}
|
||||||
|
} else if limit < 0 || len(s.span.Attrs) < limit {
|
||||||
|
s.span.Attrs = append(s.span.Attrs, telemetry.Attr{
|
||||||
|
Key: string(a.Key),
|
||||||
|
Value: val,
|
||||||
|
})
|
||||||
|
m[string(a.Key)] = len(s.span.Attrs) - 1
|
||||||
|
} else {
|
||||||
|
s.span.DroppedAttrs++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// convCappedAttrs converts up to limit attrs into a []telemetry.Attr. The
|
||||||
|
// number of dropped attributes is also returned.
|
||||||
|
func convCappedAttrs(limit int, attrs []attribute.KeyValue) ([]telemetry.Attr, uint32) {
|
||||||
|
if limit == 0 {
|
||||||
|
return nil, uint32(len(attrs))
|
||||||
|
}
|
||||||
|
|
||||||
|
if limit < 0 {
|
||||||
|
// Unlimited.
|
||||||
|
return convAttrs(attrs), 0
|
||||||
|
}
|
||||||
|
|
||||||
|
limit = min(len(attrs), limit)
|
||||||
|
return convAttrs(attrs[:limit]), uint32(len(attrs) - limit)
|
||||||
|
}
|
||||||
|
|
||||||
|
func convAttrs(attrs []attribute.KeyValue) []telemetry.Attr {
|
||||||
|
if len(attrs) == 0 {
|
||||||
|
// Avoid allocations if not necessary.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
out := make([]telemetry.Attr, 0, len(attrs))
|
||||||
|
for _, attr := range attrs {
|
||||||
|
key := string(attr.Key)
|
||||||
|
val := convAttrValue(attr.Value)
|
||||||
|
if val.Empty() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
out = append(out, telemetry.Attr{Key: key, Value: val})
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
func convAttrValue(value attribute.Value) telemetry.Value {
|
||||||
|
switch value.Type() {
|
||||||
|
case attribute.BOOL:
|
||||||
|
return telemetry.BoolValue(value.AsBool())
|
||||||
|
case attribute.INT64:
|
||||||
|
return telemetry.Int64Value(value.AsInt64())
|
||||||
|
case attribute.FLOAT64:
|
||||||
|
return telemetry.Float64Value(value.AsFloat64())
|
||||||
|
case attribute.STRING:
|
||||||
|
v := truncate(maxSpan.AttrValueLen, value.AsString())
|
||||||
|
return telemetry.StringValue(v)
|
||||||
|
case attribute.BOOLSLICE:
|
||||||
|
slice := value.AsBoolSlice()
|
||||||
|
out := make([]telemetry.Value, 0, len(slice))
|
||||||
|
for _, v := range slice {
|
||||||
|
out = append(out, telemetry.BoolValue(v))
|
||||||
|
}
|
||||||
|
return telemetry.SliceValue(out...)
|
||||||
|
case attribute.INT64SLICE:
|
||||||
|
slice := value.AsInt64Slice()
|
||||||
|
out := make([]telemetry.Value, 0, len(slice))
|
||||||
|
for _, v := range slice {
|
||||||
|
out = append(out, telemetry.Int64Value(v))
|
||||||
|
}
|
||||||
|
return telemetry.SliceValue(out...)
|
||||||
|
case attribute.FLOAT64SLICE:
|
||||||
|
slice := value.AsFloat64Slice()
|
||||||
|
out := make([]telemetry.Value, 0, len(slice))
|
||||||
|
for _, v := range slice {
|
||||||
|
out = append(out, telemetry.Float64Value(v))
|
||||||
|
}
|
||||||
|
return telemetry.SliceValue(out...)
|
||||||
|
case attribute.STRINGSLICE:
|
||||||
|
slice := value.AsStringSlice()
|
||||||
|
out := make([]telemetry.Value, 0, len(slice))
|
||||||
|
for _, v := range slice {
|
||||||
|
v = truncate(maxSpan.AttrValueLen, v)
|
||||||
|
out = append(out, telemetry.StringValue(v))
|
||||||
|
}
|
||||||
|
return telemetry.SliceValue(out...)
|
||||||
|
}
|
||||||
|
return telemetry.Value{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *span) End(opts ...trace.SpanEndOption) {
|
||||||
|
if s == nil || !s.sampled.Swap(false) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// s.end exists so the lock (s.mu) is not held while s.ended is called.
|
||||||
|
s.ended(s.end(opts))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *span) end(opts []trace.SpanEndOption) []byte {
|
||||||
|
s.mu.Lock()
|
||||||
|
defer s.mu.Unlock()
|
||||||
|
|
||||||
|
cfg := trace.NewSpanEndConfig(opts...)
|
||||||
|
if t := cfg.Timestamp(); !t.IsZero() {
|
||||||
|
s.span.EndTime = cfg.Timestamp()
|
||||||
|
} else {
|
||||||
|
s.span.EndTime = time.Now()
|
||||||
|
}
|
||||||
|
|
||||||
|
b, _ := json.Marshal(s.traces) // TODO: do not ignore this error.
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// Expected to be implemented in eBPF.
|
||||||
|
//
|
||||||
|
//go:noinline
|
||||||
|
func (*span) ended(buf []byte) { ended(buf) }
|
||||||
|
|
||||||
|
// ended is used for testing.
|
||||||
|
var ended = func([]byte) {}
|
||||||
|
|
||||||
|
func (s *span) RecordError(err error, opts ...trace.EventOption) {
|
||||||
|
if s == nil || err == nil || !s.sampled.Load() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := trace.NewEventConfig(opts...)
|
||||||
|
|
||||||
|
attrs := cfg.Attributes()
|
||||||
|
attrs = append(attrs,
|
||||||
|
semconv.ExceptionType(typeStr(err)),
|
||||||
|
semconv.ExceptionMessage(err.Error()),
|
||||||
|
)
|
||||||
|
if cfg.StackTrace() {
|
||||||
|
buf := make([]byte, 2048)
|
||||||
|
n := runtime.Stack(buf, false)
|
||||||
|
attrs = append(attrs, semconv.ExceptionStacktrace(string(buf[0:n])))
|
||||||
|
}
|
||||||
|
|
||||||
|
s.mu.Lock()
|
||||||
|
defer s.mu.Unlock()
|
||||||
|
|
||||||
|
s.addEvent(semconv.ExceptionEventName, cfg.Timestamp(), attrs)
|
||||||
|
}
|
||||||
|
|
||||||
|
func typeStr(i any) 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 (s *span) AddEvent(name string, opts ...trace.EventOption) {
|
||||||
|
if s == nil || !s.sampled.Load() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := trace.NewEventConfig(opts...)
|
||||||
|
|
||||||
|
s.mu.Lock()
|
||||||
|
defer s.mu.Unlock()
|
||||||
|
|
||||||
|
s.addEvent(name, cfg.Timestamp(), cfg.Attributes())
|
||||||
|
}
|
||||||
|
|
||||||
|
// addEvent adds an event with name and attrs at tStamp to the span. The span
|
||||||
|
// lock (s.mu) needs to be held by the caller.
|
||||||
|
func (s *span) addEvent(name string, tStamp time.Time, attrs []attribute.KeyValue) {
|
||||||
|
limit := maxSpan.Events
|
||||||
|
|
||||||
|
if limit == 0 {
|
||||||
|
s.span.DroppedEvents++
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if limit > 0 && len(s.span.Events) == limit {
|
||||||
|
// Drop head while avoiding allocation of more capacity.
|
||||||
|
copy(s.span.Events[:limit-1], s.span.Events[1:])
|
||||||
|
s.span.Events = s.span.Events[:limit-1]
|
||||||
|
s.span.DroppedEvents++
|
||||||
|
}
|
||||||
|
|
||||||
|
e := &telemetry.SpanEvent{Time: tStamp, Name: name}
|
||||||
|
e.Attrs, e.DroppedAttrs = convCappedAttrs(maxSpan.EventAttrs, attrs)
|
||||||
|
|
||||||
|
s.span.Events = append(s.span.Events, e)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *span) AddLink(link trace.Link) {
|
||||||
|
if s == nil || !s.sampled.Load() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
l := maxSpan.Links
|
||||||
|
|
||||||
|
s.mu.Lock()
|
||||||
|
defer s.mu.Unlock()
|
||||||
|
|
||||||
|
if l == 0 {
|
||||||
|
s.span.DroppedLinks++
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if l > 0 && len(s.span.Links) == l {
|
||||||
|
// Drop head while avoiding allocation of more capacity.
|
||||||
|
copy(s.span.Links[:l-1], s.span.Links[1:])
|
||||||
|
s.span.Links = s.span.Links[:l-1]
|
||||||
|
s.span.DroppedLinks++
|
||||||
|
}
|
||||||
|
|
||||||
|
s.span.Links = append(s.span.Links, convLink(link))
|
||||||
|
}
|
||||||
|
|
||||||
|
func convLinks(links []trace.Link) []*telemetry.SpanLink {
|
||||||
|
out := make([]*telemetry.SpanLink, 0, len(links))
|
||||||
|
for _, link := range links {
|
||||||
|
out = append(out, convLink(link))
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
func convLink(link trace.Link) *telemetry.SpanLink {
|
||||||
|
l := &telemetry.SpanLink{
|
||||||
|
TraceID: telemetry.TraceID(link.SpanContext.TraceID()),
|
||||||
|
SpanID: telemetry.SpanID(link.SpanContext.SpanID()),
|
||||||
|
TraceState: link.SpanContext.TraceState().String(),
|
||||||
|
Flags: uint32(link.SpanContext.TraceFlags()),
|
||||||
|
}
|
||||||
|
l.Attrs, l.DroppedAttrs = convCappedAttrs(maxSpan.LinkAttrs, link.Attributes)
|
||||||
|
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *span) SetName(name string) {
|
||||||
|
if s == nil || !s.sampled.Load() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
s.mu.Lock()
|
||||||
|
defer s.mu.Unlock()
|
||||||
|
|
||||||
|
s.span.Name = name
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*span) TracerProvider() trace.TracerProvider { return TracerProvider() }
|
124
vendor/go.opentelemetry.io/auto/sdk/tracer.go
generated
vendored
Normal file
124
vendor/go.opentelemetry.io/auto/sdk/tracer.go
generated
vendored
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package sdk
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/trace"
|
||||||
|
"go.opentelemetry.io/otel/trace/noop"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/auto/sdk/internal/telemetry"
|
||||||
|
)
|
||||||
|
|
||||||
|
type tracer struct {
|
||||||
|
noop.Tracer
|
||||||
|
|
||||||
|
name, schemaURL, version string
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ trace.Tracer = tracer{}
|
||||||
|
|
||||||
|
func (t tracer) Start(ctx context.Context, name string, opts ...trace.SpanStartOption) (context.Context, trace.Span) {
|
||||||
|
var psc trace.SpanContext
|
||||||
|
sampled := true
|
||||||
|
span := new(span)
|
||||||
|
|
||||||
|
// Ask eBPF for sampling decision and span context info.
|
||||||
|
t.start(ctx, span, &psc, &sampled, &span.spanContext)
|
||||||
|
|
||||||
|
span.sampled.Store(sampled)
|
||||||
|
|
||||||
|
ctx = trace.ContextWithSpan(ctx, span)
|
||||||
|
|
||||||
|
if sampled {
|
||||||
|
// Only build traces if sampled.
|
||||||
|
cfg := trace.NewSpanStartConfig(opts...)
|
||||||
|
span.traces, span.span = t.traces(name, cfg, span.spanContext, psc)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctx, span
|
||||||
|
}
|
||||||
|
|
||||||
|
// Expected to be implemented in eBPF.
|
||||||
|
//
|
||||||
|
//go:noinline
|
||||||
|
func (t *tracer) start(
|
||||||
|
ctx context.Context,
|
||||||
|
spanPtr *span,
|
||||||
|
psc *trace.SpanContext,
|
||||||
|
sampled *bool,
|
||||||
|
sc *trace.SpanContext,
|
||||||
|
) {
|
||||||
|
start(ctx, spanPtr, psc, sampled, sc)
|
||||||
|
}
|
||||||
|
|
||||||
|
// start is used for testing.
|
||||||
|
var start = func(context.Context, *span, *trace.SpanContext, *bool, *trace.SpanContext) {}
|
||||||
|
|
||||||
|
func (t tracer) traces(name string, cfg trace.SpanConfig, sc, psc trace.SpanContext) (*telemetry.Traces, *telemetry.Span) {
|
||||||
|
span := &telemetry.Span{
|
||||||
|
TraceID: telemetry.TraceID(sc.TraceID()),
|
||||||
|
SpanID: telemetry.SpanID(sc.SpanID()),
|
||||||
|
Flags: uint32(sc.TraceFlags()),
|
||||||
|
TraceState: sc.TraceState().String(),
|
||||||
|
ParentSpanID: telemetry.SpanID(psc.SpanID()),
|
||||||
|
Name: name,
|
||||||
|
Kind: spanKind(cfg.SpanKind()),
|
||||||
|
}
|
||||||
|
|
||||||
|
span.Attrs, span.DroppedAttrs = convCappedAttrs(maxSpan.Attrs, cfg.Attributes())
|
||||||
|
|
||||||
|
links := cfg.Links()
|
||||||
|
if limit := maxSpan.Links; limit == 0 {
|
||||||
|
span.DroppedLinks = uint32(len(links))
|
||||||
|
} else {
|
||||||
|
if limit > 0 {
|
||||||
|
n := max(len(links)-limit, 0)
|
||||||
|
span.DroppedLinks = uint32(n)
|
||||||
|
links = links[n:]
|
||||||
|
}
|
||||||
|
span.Links = convLinks(links)
|
||||||
|
}
|
||||||
|
|
||||||
|
if t := cfg.Timestamp(); !t.IsZero() {
|
||||||
|
span.StartTime = cfg.Timestamp()
|
||||||
|
} else {
|
||||||
|
span.StartTime = time.Now()
|
||||||
|
}
|
||||||
|
|
||||||
|
return &telemetry.Traces{
|
||||||
|
ResourceSpans: []*telemetry.ResourceSpans{
|
||||||
|
{
|
||||||
|
ScopeSpans: []*telemetry.ScopeSpans{
|
||||||
|
{
|
||||||
|
Scope: &telemetry.Scope{
|
||||||
|
Name: t.name,
|
||||||
|
Version: t.version,
|
||||||
|
},
|
||||||
|
Spans: []*telemetry.Span{span},
|
||||||
|
SchemaURL: t.schemaURL,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}, span
|
||||||
|
}
|
||||||
|
|
||||||
|
func spanKind(kind trace.SpanKind) telemetry.SpanKind {
|
||||||
|
switch kind {
|
||||||
|
case trace.SpanKindInternal:
|
||||||
|
return telemetry.SpanKindInternal
|
||||||
|
case trace.SpanKindServer:
|
||||||
|
return telemetry.SpanKindServer
|
||||||
|
case trace.SpanKindClient:
|
||||||
|
return telemetry.SpanKindClient
|
||||||
|
case trace.SpanKindProducer:
|
||||||
|
return telemetry.SpanKindProducer
|
||||||
|
case trace.SpanKindConsumer:
|
||||||
|
return telemetry.SpanKindConsumer
|
||||||
|
}
|
||||||
|
return telemetry.SpanKind(0) // undefined.
|
||||||
|
}
|
33
vendor/go.opentelemetry.io/auto/sdk/tracer_provider.go
generated
vendored
Normal file
33
vendor/go.opentelemetry.io/auto/sdk/tracer_provider.go
generated
vendored
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package sdk
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.opentelemetry.io/otel/trace"
|
||||||
|
"go.opentelemetry.io/otel/trace/noop"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TracerProvider returns an auto-instrumentable [trace.TracerProvider].
|
||||||
|
//
|
||||||
|
// If an [go.opentelemetry.io/auto.Instrumentation] is configured to instrument
|
||||||
|
// the process using the returned TracerProvider, all of the telemetry it
|
||||||
|
// produces will be processed and handled by that Instrumentation. By default,
|
||||||
|
// if no Instrumentation instruments the TracerProvider it will not generate
|
||||||
|
// any trace telemetry.
|
||||||
|
func TracerProvider() trace.TracerProvider { return tracerProviderInstance }
|
||||||
|
|
||||||
|
var tracerProviderInstance = new(tracerProvider)
|
||||||
|
|
||||||
|
type tracerProvider struct{ noop.TracerProvider }
|
||||||
|
|
||||||
|
var _ trace.TracerProvider = tracerProvider{}
|
||||||
|
|
||||||
|
func (p tracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer {
|
||||||
|
cfg := trace.NewTracerConfig(opts...)
|
||||||
|
return tracer{
|
||||||
|
name: name,
|
||||||
|
version: cfg.InstrumentationVersion(),
|
||||||
|
schemaURL: cfg.SchemaURL(),
|
||||||
|
}
|
||||||
|
}
|
8
vendor/go.opentelemetry.io/otel/.gitignore
generated
vendored
8
vendor/go.opentelemetry.io/otel/.gitignore
generated
vendored
|
@ -12,11 +12,3 @@ go.work
|
||||||
go.work.sum
|
go.work.sum
|
||||||
|
|
||||||
gen/
|
gen/
|
||||||
|
|
||||||
/example/dice/dice
|
|
||||||
/example/namedtracer/namedtracer
|
|
||||||
/example/otel-collector/otel-collector
|
|
||||||
/example/opencensus/opencensus
|
|
||||||
/example/passthrough/passthrough
|
|
||||||
/example/prometheus/prometheus
|
|
||||||
/example/zipkin/zipkin
|
|
||||||
|
|
31
vendor/go.opentelemetry.io/otel/.golangci.yml
generated
vendored
31
vendor/go.opentelemetry.io/otel/.golangci.yml
generated
vendored
|
@ -22,13 +22,16 @@ linters:
|
||||||
- govet
|
- govet
|
||||||
- ineffassign
|
- ineffassign
|
||||||
- misspell
|
- misspell
|
||||||
|
- perfsprint
|
||||||
- revive
|
- revive
|
||||||
- staticcheck
|
- staticcheck
|
||||||
- tenv
|
- tenv
|
||||||
|
- testifylint
|
||||||
- typecheck
|
- typecheck
|
||||||
- unconvert
|
- unconvert
|
||||||
- unused
|
- unused
|
||||||
- unparam
|
- unparam
|
||||||
|
- usestdlibvars
|
||||||
|
|
||||||
issues:
|
issues:
|
||||||
# Maximum issues count per one linter.
|
# Maximum issues count per one linter.
|
||||||
|
@ -60,16 +63,17 @@ issues:
|
||||||
text: "calls to (.+) only in main[(][)] or init[(][)] functions"
|
text: "calls to (.+) only in main[(][)] or init[(][)] functions"
|
||||||
linters:
|
linters:
|
||||||
- revive
|
- revive
|
||||||
# It's okay to not run gosec in a test.
|
# It's okay to not run gosec and perfsprint in a test.
|
||||||
- path: _test\.go
|
- path: _test\.go
|
||||||
linters:
|
linters:
|
||||||
- gosec
|
- gosec
|
||||||
# Igonoring gosec G404: Use of weak random number generator (math/rand instead of crypto/rand)
|
- perfsprint
|
||||||
|
# Ignoring gosec G404: Use of weak random number generator (math/rand instead of crypto/rand)
|
||||||
# as we commonly use it in tests and examples.
|
# as we commonly use it in tests and examples.
|
||||||
- text: "G404:"
|
- text: "G404:"
|
||||||
linters:
|
linters:
|
||||||
- gosec
|
- gosec
|
||||||
# Igonoring gosec G402: TLS MinVersion too low
|
# Ignoring gosec G402: TLS MinVersion too low
|
||||||
# as the https://pkg.go.dev/crypto/tls#Config handles MinVersion default well.
|
# as the https://pkg.go.dev/crypto/tls#Config handles MinVersion default well.
|
||||||
- text: "G402: TLS MinVersion too low."
|
- text: "G402: TLS MinVersion too low."
|
||||||
linters:
|
linters:
|
||||||
|
@ -94,6 +98,13 @@ linters-settings:
|
||||||
- pkg: "crypto/md5"
|
- pkg: "crypto/md5"
|
||||||
- pkg: "crypto/sha1"
|
- pkg: "crypto/sha1"
|
||||||
- pkg: "crypto/**/pkix"
|
- pkg: "crypto/**/pkix"
|
||||||
|
auto/sdk:
|
||||||
|
files:
|
||||||
|
- "!internal/global/trace.go"
|
||||||
|
- "~internal/global/trace_test.go"
|
||||||
|
deny:
|
||||||
|
- pkg: "go.opentelemetry.io/auto/sdk"
|
||||||
|
desc: Do not use SDK from automatic instrumentation.
|
||||||
otlp-internal:
|
otlp-internal:
|
||||||
files:
|
files:
|
||||||
- "!**/exporters/otlp/internal/**/*.go"
|
- "!**/exporters/otlp/internal/**/*.go"
|
||||||
|
@ -126,8 +137,6 @@ linters-settings:
|
||||||
- "**/metric/**/*.go"
|
- "**/metric/**/*.go"
|
||||||
- "**/bridge/*.go"
|
- "**/bridge/*.go"
|
||||||
- "**/bridge/**/*.go"
|
- "**/bridge/**/*.go"
|
||||||
- "**/example/*.go"
|
|
||||||
- "**/example/**/*.go"
|
|
||||||
- "**/trace/*.go"
|
- "**/trace/*.go"
|
||||||
- "**/trace/**/*.go"
|
- "**/trace/**/*.go"
|
||||||
- "**/log/*.go"
|
- "**/log/*.go"
|
||||||
|
@ -155,6 +164,12 @@ linters-settings:
|
||||||
locale: US
|
locale: US
|
||||||
ignore-words:
|
ignore-words:
|
||||||
- cancelled
|
- cancelled
|
||||||
|
perfsprint:
|
||||||
|
err-error: true
|
||||||
|
errorf: true
|
||||||
|
int-conversion: true
|
||||||
|
sprintf1: true
|
||||||
|
strconcat: true
|
||||||
revive:
|
revive:
|
||||||
# Sets the default failure confidence.
|
# Sets the default failure confidence.
|
||||||
# This means that linting errors with less than 0.8 confidence will be ignored.
|
# This means that linting errors with less than 0.8 confidence will be ignored.
|
||||||
|
@ -302,3 +317,9 @@ linters-settings:
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#waitgroup-by-value
|
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#waitgroup-by-value
|
||||||
- name: waitgroup-by-value
|
- name: waitgroup-by-value
|
||||||
disabled: false
|
disabled: false
|
||||||
|
testifylint:
|
||||||
|
enable-all: true
|
||||||
|
disable:
|
||||||
|
- float-compare
|
||||||
|
- go-require
|
||||||
|
- require-error
|
||||||
|
|
146
vendor/go.opentelemetry.io/otel/CHANGELOG.md
generated
vendored
146
vendor/go.opentelemetry.io/otel/CHANGELOG.md
generated
vendored
|
@ -11,6 +11,141 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
|
||||||
<!-- Released section -->
|
<!-- Released section -->
|
||||||
<!-- Don't change this section unless doing release -->
|
<!-- Don't change this section unless doing release -->
|
||||||
|
|
||||||
|
## [1.34.0/0.56.0/0.10.0] 2025-01-17
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Remove the notices from `Logger` to make the whole Logs API user-facing in `go.opentelemetry.io/otel/log`. (#6167)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Relax minimum Go version to 1.22.0 in various modules. (#6073)
|
||||||
|
- The `Type` name logged for the `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc` client is corrected from `otlphttpgrpc` to `otlptracegrpc`. (#6143)
|
||||||
|
- The `Type` name logged for the `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlphttpgrpc` client is corrected from `otlphttphttp` to `otlptracehttp`. (#6143)
|
||||||
|
|
||||||
|
## [1.33.0/0.55.0/0.9.0/0.0.12] 2024-12-12
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add `Reset` method to `SpanRecorder` in `go.opentelemetry.io/otel/sdk/trace/tracetest`. (#5994)
|
||||||
|
- Add `EnabledInstrument` interface in `go.opentelemetry.io/otel/sdk/metric/internal/x`.
|
||||||
|
This is an experimental interface that is implemented by synchronous instruments provided by `go.opentelemetry.io/otel/sdk/metric`.
|
||||||
|
Users can use it to avoid performing computationally expensive operations when recording measurements.
|
||||||
|
It does not fall within the scope of the OpenTelemetry Go versioning and stability [policy](./VERSIONING.md) and it may be changed in backwards incompatible ways or removed in feature releases. (#6016)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- The default global API now supports full auto-instrumentation from the `go.opentelemetry.io/auto` package.
|
||||||
|
See that package for more information. (#5920)
|
||||||
|
- Propagate non-retryable error messages to client in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#5929)
|
||||||
|
- Propagate non-retryable error messages to client in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. (#5929)
|
||||||
|
- Propagate non-retryable error messages to client in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. (#5929)
|
||||||
|
- Performance improvements for attribute value `AsStringSlice`, `AsFloat64Slice`, `AsInt64Slice`, `AsBoolSlice`. (#6011)
|
||||||
|
- Change `EnabledParameters` to have a `Severity` field instead of a getter and setter in `go.opentelemetry.io/otel/log`. (#6009)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix inconsistent request body closing in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#5954)
|
||||||
|
- Fix inconsistent request body closing in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. (#5954)
|
||||||
|
- Fix inconsistent request body closing in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. (#5954)
|
||||||
|
- Fix invalid exemplar keys in `go.opentelemetry.io/otel/exporters/prometheus`. (#5995)
|
||||||
|
- Fix attribute value truncation in `go.opentelemetry.io/otel/sdk/trace`. (#5997)
|
||||||
|
- Fix attribute value truncation in `go.opentelemetry.io/otel/sdk/log`. (#6032)
|
||||||
|
|
||||||
|
## [1.32.0/0.54.0/0.8.0/0.0.11] 2024-11-08
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add `go.opentelemetry.io/otel/sdk/metric/exemplar.AlwaysOffFilter`, which can be used to disable exemplar recording. (#5850)
|
||||||
|
- Add `go.opentelemetry.io/otel/sdk/metric.WithExemplarFilter`, which can be used to configure the exemplar filter used by the metrics SDK. (#5850)
|
||||||
|
- Add `ExemplarReservoirProviderSelector` and `DefaultExemplarReservoirProviderSelector` to `go.opentelemetry.io/otel/sdk/metric`, which defines the exemplar reservoir to use based on the aggregation of the metric. (#5861)
|
||||||
|
- Add `ExemplarReservoirProviderSelector` to `go.opentelemetry.io/otel/sdk/metric.Stream` to allow using views to configure the exemplar reservoir to use for a metric. (#5861)
|
||||||
|
- Add `ReservoirProvider`, `HistogramReservoirProvider` and `FixedSizeReservoirProvider` to `go.opentelemetry.io/otel/sdk/metric/exemplar` to make it convenient to use providers of Reservoirs. (#5861)
|
||||||
|
- The `go.opentelemetry.io/otel/semconv/v1.27.0` package.
|
||||||
|
The package contains semantic conventions from the `v1.27.0` version of the OpenTelemetry Semantic Conventions. (#5894)
|
||||||
|
- Add `Attributes attribute.Set` field to `Scope` in `go.opentelemetry.io/otel/sdk/instrumentation`. (#5903)
|
||||||
|
- Add `Attributes attribute.Set` field to `ScopeRecords` in `go.opentelemetry.io/otel/log/logtest`. (#5927)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc` adds instrumentation scope attributes. (#5934)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp` adds instrumentation scope attributes. (#5934)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc` adds instrumentation scope attributes. (#5935)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp` adds instrumentation scope attributes. (#5935)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc` adds instrumentation scope attributes. (#5933)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp` adds instrumentation scope attributes. (#5933)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/prometheus` adds instrumentation scope attributes in `otel_scope_info` metric as labels. (#5932)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Support scope attributes and make them as identifying for `Tracer` in `go.opentelemetry.io/otel` and `go.opentelemetry.io/otel/sdk/trace`. (#5924)
|
||||||
|
- Support scope attributes and make them as identifying for `Meter` in `go.opentelemetry.io/otel` and `go.opentelemetry.io/otel/sdk/metric`. (#5926)
|
||||||
|
- Support scope attributes and make them as identifying for `Logger` in `go.opentelemetry.io/otel` and `go.opentelemetry.io/otel/sdk/log`. (#5925)
|
||||||
|
- Make schema URL and scope attributes as identifying for `Tracer` in `go.opentelemetry.io/otel/bridge/opentracing`. (#5931)
|
||||||
|
- Clear unneeded slice elements to allow GC to collect the objects in `go.opentelemetry.io/otel/sdk/metric` and `go.opentelemetry.io/otel/sdk/trace`. (#5804)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Global MeterProvider registration unwraps global instrument Observers, the undocumented Unwrap() methods are now private. (#5881)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc` now keeps the metadata already present in the context when `WithHeaders` is used. (#5892)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc` now keeps the metadata already present in the context when `WithHeaders` is used. (#5911)
|
||||||
|
- `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc` now keeps the metadata already present in the context when `WithHeaders` is used. (#5915)
|
||||||
|
- Fix `go.opentelemetry.io/otel/exporters/prometheus` trying to add exemplars to Gauge metrics, which is unsupported. (#5912)
|
||||||
|
- Fix `WithEndpointURL` to always use a secure connection when an https URL is passed in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc`. (#5944)
|
||||||
|
- Fix `WithEndpointURL` to always use a secure connection when an https URL is passed in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. (#5944)
|
||||||
|
- Fix `WithEndpointURL` to always use a secure connection when an https URL is passed in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc`. (#5944)
|
||||||
|
- Fix `WithEndpointURL` to always use a secure connection when an https URL is passed in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. (#5944)
|
||||||
|
- Fix incorrect metrics generated from callbacks when multiple readers are used in `go.opentelemetry.io/otel/sdk/metric`. (#5900)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Remove all examples under `go.opentelemetry.io/otel/example` as they are moved to [Contrib repository](https://github.com/open-telemetry/opentelemetry-go-contrib/tree/main/examples). (#5930)
|
||||||
|
|
||||||
|
## [1.31.0/0.53.0/0.7.0/0.0.10] 2024-10-11
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add `go.opentelemetry.io/otel/sdk/metric/exemplar` package which includes `Exemplar`, `Filter`, `TraceBasedFilter`, `AlwaysOnFilter`, `HistogramReservoir`, `FixedSizeReservoir`, `Reservoir`, `Value` and `ValueType` types. These will be used for configuring the exemplar reservoir for the metrics sdk. (#5747, #5862)
|
||||||
|
- Add `WithExportBufferSize` option to log batch processor.(#5877)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Enable exemplars by default in `go.opentelemetry.io/otel/sdk/metric`. Exemplars can be disabled by setting `OTEL_METRICS_EXEMPLAR_FILTER=always_off` (#5778)
|
||||||
|
- `Logger.Enabled` in `go.opentelemetry.io/otel/log` now accepts a newly introduced `EnabledParameters` type instead of `Record`. (#5791)
|
||||||
|
- `FilterProcessor.Enabled` in `go.opentelemetry.io/otel/sdk/log/internal/x` now accepts `EnabledParameters` instead of `Record`. (#5791)
|
||||||
|
- The `Record` type in `go.opentelemetry.io/otel/log` is no longer comparable. (#5847)
|
||||||
|
- Performance improvements for the trace SDK `SetAttributes` method in `Span`. (#5864)
|
||||||
|
- Reduce memory allocations for the `Event` and `Link` lists in `Span`. (#5858)
|
||||||
|
- Performance improvements for the trace SDK `AddEvent`, `AddLink`, `RecordError` and `End` methods in `Span`. (#5874)
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
|
||||||
|
- Deprecate all examples under `go.opentelemetry.io/otel/example` as they are moved to [Contrib repository](https://github.com/open-telemetry/opentelemetry-go-contrib/tree/main/examples). (#5854)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- The race condition for multiple `FixedSize` exemplar reservoirs identified in #5814 is resolved. (#5819)
|
||||||
|
- Fix log records duplication in case of heterogeneous resource attributes by correctly mapping each log record to it's resource and scope. (#5803)
|
||||||
|
- Fix timer channel drain to avoid hanging on Go 1.23. (#5868)
|
||||||
|
- Fix delegation for global meter providers, and panic when calling otel.SetMeterProvider. (#5827)
|
||||||
|
- Change the `reflect.TypeOf` to use a nil pointer to not allocate on the heap unless necessary. (#5827)
|
||||||
|
|
||||||
|
## [1.30.0/0.52.0/0.6.0/0.0.9] 2024-09-09
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Support `OTEL_EXPORTER_OTLP_LOGS_INSECURE` and `OTEL_EXPORTER_OTLP_INSECURE` environments in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc`. (#5739)
|
||||||
|
- The `WithResource` option for `NewMeterProvider` now merges the provided resources with the ones from environment variables. (#5773)
|
||||||
|
- The `WithResource` option for `NewLoggerProvider` now merges the provided resources with the ones from environment variables. (#5773)
|
||||||
|
- Add UTF-8 support to `go.opentelemetry.io/otel/exporters/prometheus`. (#5755)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix memory leak in the global `MeterProvider` when identical instruments are repeatedly created. (#5754)
|
||||||
|
- Fix panic on instruments creation when setting meter provider. (#5758)
|
||||||
|
- Fix an issue where `SetMeterProvider` in `go.opentelemetry.io/otel` might miss the delegation for instruments and registries. (#5780)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Drop support for [Go 1.21]. (#5736, #5740, #5800)
|
||||||
|
|
||||||
## [1.29.0/0.51.0/0.5.0] 2024-08-23
|
## [1.29.0/0.51.0/0.5.0] 2024-08-23
|
||||||
|
|
||||||
This release is the last to support [Go 1.21].
|
This release is the last to support [Go 1.21].
|
||||||
|
@ -1895,7 +2030,7 @@ with major version 0.
|
||||||
- Setting error status while recording error with Span from oteltest package. (#1729)
|
- Setting error status while recording error with Span from oteltest package. (#1729)
|
||||||
- The concept of a remote and local Span stored in a context is unified to just the current Span.
|
- The concept of a remote and local Span stored in a context is unified to just the current Span.
|
||||||
Because of this `"go.opentelemetry.io/otel/trace".RemoteSpanContextFromContext` is removed as it is no longer needed.
|
Because of this `"go.opentelemetry.io/otel/trace".RemoteSpanContextFromContext` is removed as it is no longer needed.
|
||||||
Instead, `"go.opentelemetry.io/otel/trace".SpanContextFromContex` can be used to return the current Span.
|
Instead, `"go.opentelemetry.io/otel/trace".SpanContextFromContext` can be used to return the current Span.
|
||||||
If needed, that Span's `SpanContext.IsRemote()` can then be used to determine if it is remote or not. (#1731)
|
If needed, that Span's `SpanContext.IsRemote()` can then be used to determine if it is remote or not. (#1731)
|
||||||
- The `HasRemoteParent` field of the `"go.opentelemetry.io/otel/sdk/trace".SamplingParameters` is removed.
|
- The `HasRemoteParent` field of the `"go.opentelemetry.io/otel/sdk/trace".SamplingParameters` is removed.
|
||||||
This field is redundant to the information returned from the `Remote` method of the `SpanContext` held in the `ParentContext` field. (#1749)
|
This field is redundant to the information returned from the `Remote` method of the `SpanContext` held in the `ParentContext` field. (#1749)
|
||||||
|
@ -2469,7 +2604,7 @@ This release migrates the default OpenTelemetry SDK into its own Go module, deco
|
||||||
- Prometheus exporter will not apply stale updates or forget inactive metrics. (#903)
|
- Prometheus exporter will not apply stale updates or forget inactive metrics. (#903)
|
||||||
- Add test for api.standard `HTTPClientAttributesFromHTTPRequest`. (#905)
|
- Add test for api.standard `HTTPClientAttributesFromHTTPRequest`. (#905)
|
||||||
- Bump github.com/golangci/golangci-lint from 1.27.0 to 1.28.1 in /tools. (#901, #913)
|
- Bump github.com/golangci/golangci-lint from 1.27.0 to 1.28.1 in /tools. (#901, #913)
|
||||||
- Update otel-colector example to use the v0.5.0 collector. (#915)
|
- Update otel-collector example to use the v0.5.0 collector. (#915)
|
||||||
- The `grpctrace` instrumentation uses a span name conforming to the OpenTelemetry semantic conventions (does not contain a leading slash (`/`)). (#922)
|
- The `grpctrace` instrumentation uses a span name conforming to the OpenTelemetry semantic conventions (does not contain a leading slash (`/`)). (#922)
|
||||||
- The `grpctrace` instrumentation includes an `rpc.method` attribute now set to the gRPC method name. (#900, #922)
|
- The `grpctrace` instrumentation includes an `rpc.method` attribute now set to the gRPC method name. (#900, #922)
|
||||||
- The `grpctrace` instrumentation `rpc.service` attribute now contains the package name if one exists.
|
- The `grpctrace` instrumentation `rpc.service` attribute now contains the package name if one exists.
|
||||||
|
@ -3062,7 +3197,12 @@ It contains api and sdk for trace and meter.
|
||||||
- CircleCI build CI manifest files.
|
- CircleCI build CI manifest files.
|
||||||
- CODEOWNERS file to track owners of this project.
|
- CODEOWNERS file to track owners of this project.
|
||||||
|
|
||||||
[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.29.0...HEAD
|
[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.34.0...HEAD
|
||||||
|
[1.34.0/0.56.0/0.10.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.34.0
|
||||||
|
[1.33.0/0.55.0/0.9.0/0.0.12]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.33.0
|
||||||
|
[1.32.0/0.54.0/0.8.0/0.0.11]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.32.0
|
||||||
|
[1.31.0/0.53.0/0.7.0/0.0.10]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.31.0
|
||||||
|
[1.30.0/0.52.0/0.6.0/0.0.9]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.30.0
|
||||||
[1.29.0/0.51.0/0.5.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.29.0
|
[1.29.0/0.51.0/0.5.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.29.0
|
||||||
[1.28.0/0.50.0/0.4.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.28.0
|
[1.28.0/0.50.0/0.4.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.28.0
|
||||||
[1.27.0/0.49.0/0.3.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.27.0
|
[1.27.0/0.49.0/0.3.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.27.0
|
||||||
|
|
4
vendor/go.opentelemetry.io/otel/CODEOWNERS
generated
vendored
4
vendor/go.opentelemetry.io/otel/CODEOWNERS
generated
vendored
|
@ -12,6 +12,6 @@
|
||||||
# https://help.github.com/en/articles/about-code-owners
|
# https://help.github.com/en/articles/about-code-owners
|
||||||
#
|
#
|
||||||
|
|
||||||
* @MrAlias @XSAM @dashpole @MadVikingGod @pellared @hanyuancheung @dmathieu
|
* @MrAlias @XSAM @dashpole @pellared @dmathieu
|
||||||
|
|
||||||
CODEOWNERS @MrAlias @MadVikingGod @pellared @dashpole @XSAM @dmathieu
|
CODEOWNERS @MrAlias @pellared @dashpole @XSAM @dmathieu
|
||||||
|
|
24
vendor/go.opentelemetry.io/otel/CONTRIBUTING.md
generated
vendored
24
vendor/go.opentelemetry.io/otel/CONTRIBUTING.md
generated
vendored
|
@ -578,7 +578,10 @@ See also:
|
||||||
The tests should never leak goroutines.
|
The tests should never leak goroutines.
|
||||||
|
|
||||||
Use the term `ConcurrentSafe` in the test name when it aims to verify the
|
Use the term `ConcurrentSafe` in the test name when it aims to verify the
|
||||||
absence of race conditions.
|
absence of race conditions. The top-level tests with this term will be run
|
||||||
|
many times in the `test-concurrent-safe` CI job to increase the chance of
|
||||||
|
catching concurrency issues. This does not apply to subtests when this term
|
||||||
|
is not in their root name.
|
||||||
|
|
||||||
### Internal packages
|
### Internal packages
|
||||||
|
|
||||||
|
@ -626,13 +629,14 @@ should be canceled.
|
||||||
|
|
||||||
## Approvers and Maintainers
|
## Approvers and Maintainers
|
||||||
|
|
||||||
### Approvers
|
### Triagers
|
||||||
|
|
||||||
- [Chester Cheung](https://github.com/hanyuancheung), Tencent
|
- [Cheng-Zhen Yang](https://github.com/scorpionknifes), Independent
|
||||||
|
|
||||||
|
### Approvers
|
||||||
|
|
||||||
### Maintainers
|
### Maintainers
|
||||||
|
|
||||||
- [Aaron Clawson](https://github.com/MadVikingGod), LightStep
|
|
||||||
- [Damien Mathieu](https://github.com/dmathieu), Elastic
|
- [Damien Mathieu](https://github.com/dmathieu), Elastic
|
||||||
- [David Ashpole](https://github.com/dashpole), Google
|
- [David Ashpole](https://github.com/dashpole), Google
|
||||||
- [Robert Pająk](https://github.com/pellared), Splunk
|
- [Robert Pająk](https://github.com/pellared), Splunk
|
||||||
|
@ -641,11 +645,13 @@ should be canceled.
|
||||||
|
|
||||||
### Emeritus
|
### Emeritus
|
||||||
|
|
||||||
- [Liz Fong-Jones](https://github.com/lizthegrey), Honeycomb
|
- [Aaron Clawson](https://github.com/MadVikingGod)
|
||||||
- [Gustavo Silva Paiva](https://github.com/paivagustavo), LightStep
|
- [Anthony Mirabella](https://github.com/Aneurysm9)
|
||||||
- [Josh MacDonald](https://github.com/jmacd), LightStep
|
- [Chester Cheung](https://github.com/hanyuancheung)
|
||||||
- [Anthony Mirabella](https://github.com/Aneurysm9), AWS
|
- [Evan Torrie](https://github.com/evantorrie)
|
||||||
- [Evan Torrie](https://github.com/evantorrie), Yahoo
|
- [Gustavo Silva Paiva](https://github.com/paivagustavo)
|
||||||
|
- [Josh MacDonald](https://github.com/jmacd)
|
||||||
|
- [Liz Fong-Jones](https://github.com/lizthegrey)
|
||||||
|
|
||||||
### Become an Approver or a Maintainer
|
### Become an Approver or a Maintainer
|
||||||
|
|
||||||
|
|
25
vendor/go.opentelemetry.io/otel/Makefile
generated
vendored
25
vendor/go.opentelemetry.io/otel/Makefile
generated
vendored
|
@ -14,8 +14,8 @@ TIMEOUT = 60
|
||||||
.DEFAULT_GOAL := precommit
|
.DEFAULT_GOAL := precommit
|
||||||
|
|
||||||
.PHONY: precommit ci
|
.PHONY: precommit ci
|
||||||
precommit: generate license-check misspell go-mod-tidy golangci-lint-fix verify-readmes verify-mods test-default
|
precommit: generate toolchain-check license-check misspell go-mod-tidy golangci-lint-fix verify-readmes verify-mods test-default
|
||||||
ci: generate license-check lint vanity-import-check verify-readmes verify-mods build test-default check-clean-work-tree test-coverage
|
ci: generate toolchain-check license-check lint vanity-import-check verify-readmes verify-mods build test-default check-clean-work-tree test-coverage
|
||||||
|
|
||||||
# Tools
|
# Tools
|
||||||
|
|
||||||
|
@ -54,9 +54,6 @@ $(TOOLS)/stringer: PACKAGE=golang.org/x/tools/cmd/stringer
|
||||||
PORTO = $(TOOLS)/porto
|
PORTO = $(TOOLS)/porto
|
||||||
$(TOOLS)/porto: PACKAGE=github.com/jcchavezs/porto/cmd/porto
|
$(TOOLS)/porto: PACKAGE=github.com/jcchavezs/porto/cmd/porto
|
||||||
|
|
||||||
GOJQ = $(TOOLS)/gojq
|
|
||||||
$(TOOLS)/gojq: PACKAGE=github.com/itchyny/gojq/cmd/gojq
|
|
||||||
|
|
||||||
GOTMPL = $(TOOLS)/gotmpl
|
GOTMPL = $(TOOLS)/gotmpl
|
||||||
$(GOTMPL): PACKAGE=go.opentelemetry.io/build-tools/gotmpl
|
$(GOTMPL): PACKAGE=go.opentelemetry.io/build-tools/gotmpl
|
||||||
|
|
||||||
|
@ -67,7 +64,7 @@ GOVULNCHECK = $(TOOLS)/govulncheck
|
||||||
$(TOOLS)/govulncheck: PACKAGE=golang.org/x/vuln/cmd/govulncheck
|
$(TOOLS)/govulncheck: PACKAGE=golang.org/x/vuln/cmd/govulncheck
|
||||||
|
|
||||||
.PHONY: tools
|
.PHONY: tools
|
||||||
tools: $(CROSSLINK) $(GOLANGCI_LINT) $(MISSPELL) $(GOCOVMERGE) $(STRINGER) $(PORTO) $(GOJQ) $(SEMCONVGEN) $(MULTIMOD) $(SEMCONVKIT) $(GOTMPL) $(GORELEASE)
|
tools: $(CROSSLINK) $(GOLANGCI_LINT) $(MISSPELL) $(GOCOVMERGE) $(STRINGER) $(PORTO) $(SEMCONVGEN) $(MULTIMOD) $(SEMCONVKIT) $(GOTMPL) $(GORELEASE)
|
||||||
|
|
||||||
# Virtualized python tools via docker
|
# Virtualized python tools via docker
|
||||||
|
|
||||||
|
@ -145,12 +142,14 @@ build-tests/%:
|
||||||
|
|
||||||
# Tests
|
# Tests
|
||||||
|
|
||||||
TEST_TARGETS := test-default test-bench test-short test-verbose test-race
|
TEST_TARGETS := test-default test-bench test-short test-verbose test-race test-concurrent-safe
|
||||||
.PHONY: $(TEST_TARGETS) test
|
.PHONY: $(TEST_TARGETS) test
|
||||||
test-default test-race: ARGS=-race
|
test-default test-race: ARGS=-race
|
||||||
test-bench: ARGS=-run=xxxxxMatchNothingxxxxx -test.benchtime=1ms -bench=.
|
test-bench: ARGS=-run=xxxxxMatchNothingxxxxx -test.benchtime=1ms -bench=.
|
||||||
test-short: ARGS=-short
|
test-short: ARGS=-short
|
||||||
test-verbose: ARGS=-v -race
|
test-verbose: ARGS=-v -race
|
||||||
|
test-concurrent-safe: ARGS=-run=ConcurrentSafe -count=100 -race
|
||||||
|
test-concurrent-safe: TIMEOUT=120
|
||||||
$(TEST_TARGETS): test
|
$(TEST_TARGETS): test
|
||||||
test: $(OTEL_GO_MOD_DIRS:%=test/%)
|
test: $(OTEL_GO_MOD_DIRS:%=test/%)
|
||||||
test/%: DIR=$*
|
test/%: DIR=$*
|
||||||
|
@ -236,6 +235,16 @@ govulncheck/%: $(GOVULNCHECK)
|
||||||
codespell: $(CODESPELL)
|
codespell: $(CODESPELL)
|
||||||
@$(DOCKERPY) $(CODESPELL)
|
@$(DOCKERPY) $(CODESPELL)
|
||||||
|
|
||||||
|
.PHONY: toolchain-check
|
||||||
|
toolchain-check:
|
||||||
|
@toolchainRes=$$(for f in $(ALL_GO_MOD_DIRS); do \
|
||||||
|
awk '/^toolchain/ { found=1; next } END { if (found) print FILENAME }' $$f/go.mod; \
|
||||||
|
done); \
|
||||||
|
if [ -n "$${toolchainRes}" ]; then \
|
||||||
|
echo "toolchain checking failed:"; echo "$${toolchainRes}"; \
|
||||||
|
exit 1; \
|
||||||
|
fi
|
||||||
|
|
||||||
.PHONY: license-check
|
.PHONY: license-check
|
||||||
license-check:
|
license-check:
|
||||||
@licRes=$$(for f in $$(find . -type f \( -iname '*.go' -o -iname '*.sh' \) ! -path '**/third_party/*' ! -path './.git/*' ) ; do \
|
@licRes=$$(for f in $$(find . -type f \( -iname '*.go' -o -iname '*.sh' \) ! -path '**/third_party/*' ! -path './.git/*' ) ; do \
|
||||||
|
@ -261,7 +270,7 @@ SEMCONVPKG ?= "semconv/"
|
||||||
semconv-generate: $(SEMCONVGEN) $(SEMCONVKIT)
|
semconv-generate: $(SEMCONVGEN) $(SEMCONVKIT)
|
||||||
[ "$(TAG)" ] || ( echo "TAG unset: missing opentelemetry semantic-conventions tag"; exit 1 )
|
[ "$(TAG)" ] || ( echo "TAG unset: missing opentelemetry semantic-conventions tag"; exit 1 )
|
||||||
[ "$(OTEL_SEMCONV_REPO)" ] || ( echo "OTEL_SEMCONV_REPO unset: missing path to opentelemetry semantic-conventions repo"; exit 1 )
|
[ "$(OTEL_SEMCONV_REPO)" ] || ( echo "OTEL_SEMCONV_REPO unset: missing path to opentelemetry semantic-conventions repo"; exit 1 )
|
||||||
$(SEMCONVGEN) -i "$(OTEL_SEMCONV_REPO)/model/." --only=attribute_group -p conventionType=trace -f attribute_group.go -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)"
|
$(SEMCONVGEN) -i "$(OTEL_SEMCONV_REPO)/model/." --only=attribute_group -p conventionType=trace -f attribute_group.go -z "$(SEMCONVPKG)/capitalizations.txt" -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)"
|
||||||
$(SEMCONVGEN) -i "$(OTEL_SEMCONV_REPO)/model/." --only=metric -f metric.go -t "$(SEMCONVPKG)/metric_template.j2" -s "$(TAG)"
|
$(SEMCONVGEN) -i "$(OTEL_SEMCONV_REPO)/model/." --only=metric -f metric.go -t "$(SEMCONVPKG)/metric_template.j2" -s "$(TAG)"
|
||||||
$(SEMCONVKIT) -output "$(SEMCONVPKG)/$(TAG)" -tag "$(TAG)"
|
$(SEMCONVKIT) -output "$(SEMCONVPKG)/$(TAG)" -tag "$(TAG)"
|
||||||
|
|
||||||
|
|
13
vendor/go.opentelemetry.io/otel/README.md
generated
vendored
13
vendor/go.opentelemetry.io/otel/README.md
generated
vendored
|
@ -1,6 +1,6 @@
|
||||||
# OpenTelemetry-Go
|
# OpenTelemetry-Go
|
||||||
|
|
||||||
[![CI](https://github.com/open-telemetry/opentelemetry-go/workflows/ci/badge.svg)](https://github.com/open-telemetry/opentelemetry-go/actions?query=workflow%3Aci+branch%3Amain)
|
[![ci](https://github.com/open-telemetry/opentelemetry-go/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/open-telemetry/opentelemetry-go/actions/workflows/ci.yml)
|
||||||
[![codecov.io](https://codecov.io/gh/open-telemetry/opentelemetry-go/coverage.svg?branch=main)](https://app.codecov.io/gh/open-telemetry/opentelemetry-go?branch=main)
|
[![codecov.io](https://codecov.io/gh/open-telemetry/opentelemetry-go/coverage.svg?branch=main)](https://app.codecov.io/gh/open-telemetry/opentelemetry-go?branch=main)
|
||||||
[![PkgGoDev](https://pkg.go.dev/badge/go.opentelemetry.io/otel)](https://pkg.go.dev/go.opentelemetry.io/otel)
|
[![PkgGoDev](https://pkg.go.dev/badge/go.opentelemetry.io/otel)](https://pkg.go.dev/go.opentelemetry.io/otel)
|
||||||
[![Go Report Card](https://goreportcard.com/badge/go.opentelemetry.io/otel)](https://goreportcard.com/report/go.opentelemetry.io/otel)
|
[![Go Report Card](https://goreportcard.com/badge/go.opentelemetry.io/otel)](https://goreportcard.com/report/go.opentelemetry.io/otel)
|
||||||
|
@ -51,25 +51,18 @@ Currently, this project supports the following environments.
|
||||||
|----------|------------|--------------|
|
|----------|------------|--------------|
|
||||||
| Ubuntu | 1.23 | amd64 |
|
| Ubuntu | 1.23 | amd64 |
|
||||||
| Ubuntu | 1.22 | amd64 |
|
| Ubuntu | 1.22 | amd64 |
|
||||||
| Ubuntu | 1.21 | amd64 |
|
|
||||||
| Ubuntu | 1.23 | 386 |
|
| Ubuntu | 1.23 | 386 |
|
||||||
| Ubuntu | 1.22 | 386 |
|
| Ubuntu | 1.22 | 386 |
|
||||||
| Ubuntu | 1.21 | 386 |
|
|
||||||
| Linux | 1.23 | arm64 |
|
| Linux | 1.23 | arm64 |
|
||||||
| Linux | 1.22 | arm64 |
|
| Linux | 1.22 | arm64 |
|
||||||
| Linux | 1.21 | arm64 |
|
|
||||||
| macOS 13 | 1.23 | amd64 |
|
| macOS 13 | 1.23 | amd64 |
|
||||||
| macOS 13 | 1.22 | amd64 |
|
| macOS 13 | 1.22 | amd64 |
|
||||||
| macOS 13 | 1.21 | amd64 |
|
|
||||||
| macOS | 1.23 | arm64 |
|
| macOS | 1.23 | arm64 |
|
||||||
| macOS | 1.22 | arm64 |
|
| macOS | 1.22 | arm64 |
|
||||||
| macOS | 1.21 | arm64 |
|
|
||||||
| Windows | 1.23 | amd64 |
|
| Windows | 1.23 | amd64 |
|
||||||
| Windows | 1.22 | amd64 |
|
| Windows | 1.22 | amd64 |
|
||||||
| Windows | 1.21 | amd64 |
|
|
||||||
| Windows | 1.23 | 386 |
|
| Windows | 1.23 | 386 |
|
||||||
| Windows | 1.22 | 386 |
|
| Windows | 1.22 | 386 |
|
||||||
| Windows | 1.21 | 386 |
|
|
||||||
|
|
||||||
While this project should work for other systems, no compatibility guarantees
|
While this project should work for other systems, no compatibility guarantees
|
||||||
are made for those systems currently.
|
are made for those systems currently.
|
||||||
|
@ -96,8 +89,8 @@ If you need to extend the telemetry an instrumentation library provides or want
|
||||||
to build your own instrumentation for your application directly you will need
|
to build your own instrumentation for your application directly you will need
|
||||||
to use the
|
to use the
|
||||||
[Go otel](https://pkg.go.dev/go.opentelemetry.io/otel)
|
[Go otel](https://pkg.go.dev/go.opentelemetry.io/otel)
|
||||||
package. The included [examples](./example/) are a good way to see some
|
package. The [examples](https://github.com/open-telemetry/opentelemetry-go-contrib/tree/main/examples)
|
||||||
practical uses of this process.
|
are a good way to see some practical uses of this process.
|
||||||
|
|
||||||
### Export
|
### Export
|
||||||
|
|
||||||
|
|
17
vendor/go.opentelemetry.io/otel/RELEASING.md
generated
vendored
17
vendor/go.opentelemetry.io/otel/RELEASING.md
generated
vendored
|
@ -111,17 +111,6 @@ It is critical you make sure the version you push upstream is correct.
|
||||||
Finally create a Release for the new `<new tag>` on GitHub.
|
Finally create a Release for the new `<new tag>` on GitHub.
|
||||||
The release body should include all the release notes from the Changelog for this release.
|
The release body should include all the release notes from the Changelog for this release.
|
||||||
|
|
||||||
## Verify Examples
|
|
||||||
|
|
||||||
After releasing verify that examples build outside of the repository.
|
|
||||||
|
|
||||||
```
|
|
||||||
./verify_examples.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
The script copies examples into a different directory removes any `replace` declarations in `go.mod` and builds them.
|
|
||||||
This ensures they build with the published release, not the local copy.
|
|
||||||
|
|
||||||
## Post-Release
|
## Post-Release
|
||||||
|
|
||||||
### Contrib Repository
|
### Contrib Repository
|
||||||
|
@ -141,6 +130,6 @@ Importantly, bump any package versions referenced to be the latest one you just
|
||||||
|
|
||||||
Bump the dependencies in the following Go services:
|
Bump the dependencies in the following Go services:
|
||||||
|
|
||||||
- [`accountingservice`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/accountingservice)
|
- [`accounting`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/accounting)
|
||||||
- [`checkoutservice`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/checkoutservice)
|
- [`checkoutservice`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/checkout)
|
||||||
- [`productcatalogservice`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/productcatalogservice)
|
- [`productcatalogservice`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/product-catalog)
|
||||||
|
|
2
vendor/go.opentelemetry.io/otel/VERSIONING.md
generated
vendored
2
vendor/go.opentelemetry.io/otel/VERSIONING.md
generated
vendored
|
@ -26,7 +26,7 @@ is designed so the following goals can be achieved.
|
||||||
go.opentelemetry.io/otel/v2 v2.0.1`) and in the package import path
|
go.opentelemetry.io/otel/v2 v2.0.1`) and in the package import path
|
||||||
(e.g., `import "go.opentelemetry.io/otel/v2/trace"`). This includes the
|
(e.g., `import "go.opentelemetry.io/otel/v2/trace"`). This includes the
|
||||||
paths used in `go get` commands (e.g., `go get
|
paths used in `go get` commands (e.g., `go get
|
||||||
go.opentelemetry.io/otel/v2@v2.0.1`. Note there is both a `/v2` and a
|
go.opentelemetry.io/otel/v2@v2.0.1`). Note there is both a `/v2` and a
|
||||||
`@v2.0.1` in that example. One way to think about it is that the module
|
`@v2.0.1` in that example. One way to think about it is that the module
|
||||||
name now includes the `/v2`, so include `/v2` whenever you are using the
|
name now includes the `/v2`, so include `/v2` whenever you are using the
|
||||||
module name).
|
module name).
|
||||||
|
|
40
vendor/go.opentelemetry.io/otel/attribute/set.go
generated
vendored
40
vendor/go.opentelemetry.io/otel/attribute/set.go
generated
vendored
|
@ -347,45 +347,25 @@ func computeDistinct(kvs []KeyValue) Distinct {
|
||||||
func computeDistinctFixed(kvs []KeyValue) interface{} {
|
func computeDistinctFixed(kvs []KeyValue) interface{} {
|
||||||
switch len(kvs) {
|
switch len(kvs) {
|
||||||
case 1:
|
case 1:
|
||||||
ptr := new([1]KeyValue)
|
return [1]KeyValue(kvs)
|
||||||
copy((*ptr)[:], kvs)
|
|
||||||
return *ptr
|
|
||||||
case 2:
|
case 2:
|
||||||
ptr := new([2]KeyValue)
|
return [2]KeyValue(kvs)
|
||||||
copy((*ptr)[:], kvs)
|
|
||||||
return *ptr
|
|
||||||
case 3:
|
case 3:
|
||||||
ptr := new([3]KeyValue)
|
return [3]KeyValue(kvs)
|
||||||
copy((*ptr)[:], kvs)
|
|
||||||
return *ptr
|
|
||||||
case 4:
|
case 4:
|
||||||
ptr := new([4]KeyValue)
|
return [4]KeyValue(kvs)
|
||||||
copy((*ptr)[:], kvs)
|
|
||||||
return *ptr
|
|
||||||
case 5:
|
case 5:
|
||||||
ptr := new([5]KeyValue)
|
return [5]KeyValue(kvs)
|
||||||
copy((*ptr)[:], kvs)
|
|
||||||
return *ptr
|
|
||||||
case 6:
|
case 6:
|
||||||
ptr := new([6]KeyValue)
|
return [6]KeyValue(kvs)
|
||||||
copy((*ptr)[:], kvs)
|
|
||||||
return *ptr
|
|
||||||
case 7:
|
case 7:
|
||||||
ptr := new([7]KeyValue)
|
return [7]KeyValue(kvs)
|
||||||
copy((*ptr)[:], kvs)
|
|
||||||
return *ptr
|
|
||||||
case 8:
|
case 8:
|
||||||
ptr := new([8]KeyValue)
|
return [8]KeyValue(kvs)
|
||||||
copy((*ptr)[:], kvs)
|
|
||||||
return *ptr
|
|
||||||
case 9:
|
case 9:
|
||||||
ptr := new([9]KeyValue)
|
return [9]KeyValue(kvs)
|
||||||
copy((*ptr)[:], kvs)
|
|
||||||
return *ptr
|
|
||||||
case 10:
|
case 10:
|
||||||
ptr := new([10]KeyValue)
|
return [10]KeyValue(kvs)
|
||||||
copy((*ptr)[:], kvs)
|
|
||||||
return *ptr
|
|
||||||
default:
|
default:
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
10
vendor/go.opentelemetry.io/otel/baggage/baggage.go
generated
vendored
10
vendor/go.opentelemetry.io/otel/baggage/baggage.go
generated
vendored
|
@ -50,7 +50,7 @@ type Property struct {
|
||||||
// component boundaries may impose their own restrictions on Property key.
|
// component boundaries may impose their own restrictions on Property key.
|
||||||
// For example, the W3C Baggage specification restricts the Property keys to strings that
|
// For example, the W3C Baggage specification restricts the Property keys to strings that
|
||||||
// satisfy the token definition from RFC7230, Section 3.2.6.
|
// satisfy the token definition from RFC7230, Section 3.2.6.
|
||||||
// For maximum compatibility, alpha-numeric value are strongly recommended to be used as Property key.
|
// For maximum compatibility, alphanumeric value are strongly recommended to be used as Property key.
|
||||||
func NewKeyProperty(key string) (Property, error) {
|
func NewKeyProperty(key string) (Property, error) {
|
||||||
if !validateBaggageName(key) {
|
if !validateBaggageName(key) {
|
||||||
return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidKey, key)
|
return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidKey, key)
|
||||||
|
@ -90,7 +90,7 @@ func NewKeyValueProperty(key, value string) (Property, error) {
|
||||||
// component boundaries may impose their own restrictions on Property key.
|
// component boundaries may impose their own restrictions on Property key.
|
||||||
// For example, the W3C Baggage specification restricts the Property keys to strings that
|
// For example, the W3C Baggage specification restricts the Property keys to strings that
|
||||||
// satisfy the token definition from RFC7230, Section 3.2.6.
|
// satisfy the token definition from RFC7230, Section 3.2.6.
|
||||||
// For maximum compatibility, alpha-numeric value are strongly recommended to be used as Property key.
|
// For maximum compatibility, alphanumeric value are strongly recommended to be used as Property key.
|
||||||
func NewKeyValuePropertyRaw(key, value string) (Property, error) {
|
func NewKeyValuePropertyRaw(key, value string) (Property, error) {
|
||||||
if !validateBaggageName(key) {
|
if !validateBaggageName(key) {
|
||||||
return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidKey, key)
|
return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidKey, key)
|
||||||
|
@ -287,7 +287,7 @@ func NewMember(key, value string, props ...Property) (Member, error) {
|
||||||
// component boundaries may impose their own restrictions on baggage key.
|
// component boundaries may impose their own restrictions on baggage key.
|
||||||
// For example, the W3C Baggage specification restricts the baggage keys to strings that
|
// For example, the W3C Baggage specification restricts the baggage keys to strings that
|
||||||
// satisfy the token definition from RFC7230, Section 3.2.6.
|
// satisfy the token definition from RFC7230, Section 3.2.6.
|
||||||
// For maximum compatibility, alpha-numeric value are strongly recommended to be used as baggage key.
|
// For maximum compatibility, alphanumeric value are strongly recommended to be used as baggage key.
|
||||||
func NewMemberRaw(key, value string, props ...Property) (Member, error) {
|
func NewMemberRaw(key, value string, props ...Property) (Member, error) {
|
||||||
m := Member{
|
m := Member{
|
||||||
key: key,
|
key: key,
|
||||||
|
@ -355,7 +355,7 @@ func parseMember(member string) (Member, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// replaceInvalidUTF8Sequences replaces invalid UTF-8 sequences with '<27>'.
|
// replaceInvalidUTF8Sequences replaces invalid UTF-8 sequences with '<27>'.
|
||||||
func replaceInvalidUTF8Sequences(cap int, unescapeVal string) string {
|
func replaceInvalidUTF8Sequences(c int, unescapeVal string) string {
|
||||||
if utf8.ValidString(unescapeVal) {
|
if utf8.ValidString(unescapeVal) {
|
||||||
return unescapeVal
|
return unescapeVal
|
||||||
}
|
}
|
||||||
|
@ -363,7 +363,7 @@ func replaceInvalidUTF8Sequences(cap int, unescapeVal string) string {
|
||||||
// https://github.com/w3c/baggage/blob/8c215efbeebd3fa4b1aceb937a747e56444f22f3/baggage/HTTP_HEADER_FORMAT.md?plain=1#L69
|
// https://github.com/w3c/baggage/blob/8c215efbeebd3fa4b1aceb937a747e56444f22f3/baggage/HTTP_HEADER_FORMAT.md?plain=1#L69
|
||||||
|
|
||||||
var b strings.Builder
|
var b strings.Builder
|
||||||
b.Grow(cap)
|
b.Grow(c)
|
||||||
for i := 0; i < len(unescapeVal); {
|
for i := 0; i < len(unescapeVal); {
|
||||||
r, size := utf8.DecodeRuneInString(unescapeVal[i:])
|
r, size := utf8.DecodeRuneInString(unescapeVal[i:])
|
||||||
if r == utf8.RuneError && size == 1 {
|
if r == utf8.RuneError && size == 1 {
|
||||||
|
|
3
vendor/go.opentelemetry.io/otel/codes/codes.go
generated
vendored
3
vendor/go.opentelemetry.io/otel/codes/codes.go
generated
vendored
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
@ -63,7 +64,7 @@ func (c *Code) UnmarshalJSON(b []byte) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if c == nil {
|
if c == nil {
|
||||||
return fmt.Errorf("nil receiver passed to UnmarshalJSON")
|
return errors.New("nil receiver passed to UnmarshalJSON")
|
||||||
}
|
}
|
||||||
|
|
||||||
var x interface{}
|
var x interface{}
|
||||||
|
|
|
@ -13,7 +13,8 @@ func InstrumentationScope(il instrumentation.Scope) *commonpb.InstrumentationSco
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return &commonpb.InstrumentationScope{
|
return &commonpb.InstrumentationScope{
|
||||||
Name: il.Name,
|
Name: il.Name,
|
||||||
Version: il.Version,
|
Version: il.Version,
|
||||||
|
Attributes: Iterator(il.Attributes.Iter()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,8 +97,8 @@ func span(sd tracesdk.ReadOnlySpan) *tracepb.Span {
|
||||||
SpanId: sid[:],
|
SpanId: sid[:],
|
||||||
TraceState: sd.SpanContext().TraceState().String(),
|
TraceState: sd.SpanContext().TraceState().String(),
|
||||||
Status: status(sd.Status().Code, sd.Status().Description),
|
Status: status(sd.Status().Code, sd.Status().Description),
|
||||||
StartTimeUnixNano: uint64(sd.StartTime().UnixNano()),
|
StartTimeUnixNano: uint64(max(0, sd.StartTime().UnixNano())), // nolint:gosec // Overflow checked.
|
||||||
EndTimeUnixNano: uint64(sd.EndTime().UnixNano()),
|
EndTimeUnixNano: uint64(max(0, sd.EndTime().UnixNano())), // nolint:gosec // Overflow checked.
|
||||||
Links: links(sd.Links()),
|
Links: links(sd.Links()),
|
||||||
Kind: spanKind(sd.SpanKind()),
|
Kind: spanKind(sd.SpanKind()),
|
||||||
Name: sd.Name(),
|
Name: sd.Name(),
|
||||||
|
@ -178,7 +178,7 @@ func buildSpanFlags(sc trace.SpanContext) uint32 {
|
||||||
flags |= tracepb.SpanFlags_SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK
|
flags |= tracepb.SpanFlags_SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK
|
||||||
}
|
}
|
||||||
|
|
||||||
return uint32(flags)
|
return uint32(flags) // nolint:gosec // Flags is a bitmask and can't be negative
|
||||||
}
|
}
|
||||||
|
|
||||||
// spanEvents transforms span Events to an OTLP span events.
|
// spanEvents transforms span Events to an OTLP span events.
|
||||||
|
@ -192,7 +192,7 @@ func spanEvents(es []tracesdk.Event) []*tracepb.Span_Event {
|
||||||
for i := 0; i < len(es); i++ {
|
for i := 0; i < len(es); i++ {
|
||||||
events[i] = &tracepb.Span_Event{
|
events[i] = &tracepb.Span_Event{
|
||||||
Name: es[i].Name,
|
Name: es[i].Name,
|
||||||
TimeUnixNano: uint64(es[i].Time.UnixNano()),
|
TimeUnixNano: uint64(max(0, es[i].Time.UnixNano())), // nolint:gosec // Overflow checked.
|
||||||
Attributes: KeyValues(es[i].Attributes),
|
Attributes: KeyValues(es[i].Attributes),
|
||||||
DroppedAttributesCount: clampUint32(es[i].DroppedAttributeCount),
|
DroppedAttributesCount: clampUint32(es[i].DroppedAttributeCount),
|
||||||
}
|
}
|
||||||
|
|
9
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/client.go
generated
vendored
9
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/client.go
generated
vendored
|
@ -229,7 +229,12 @@ func (c *client) exportContext(parent context.Context) (context.Context, context
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.metadata.Len() > 0 {
|
if c.metadata.Len() > 0 {
|
||||||
ctx = metadata.NewOutgoingContext(ctx, c.metadata)
|
md := c.metadata
|
||||||
|
if outMD, ok := metadata.FromOutgoingContext(ctx); ok {
|
||||||
|
md = metadata.Join(md, outMD)
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx = metadata.NewOutgoingContext(ctx, md)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unify the client stopCtx with the parent.
|
// Unify the client stopCtx with the parent.
|
||||||
|
@ -289,7 +294,7 @@ func (c *client) MarshalLog() interface{} {
|
||||||
Type string
|
Type string
|
||||||
Endpoint string
|
Endpoint string
|
||||||
}{
|
}{
|
||||||
Type: "otlphttpgrpc",
|
Type: "otlptracegrpc",
|
||||||
Endpoint: c.endpoint,
|
Endpoint: c.endpoint,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,7 +98,7 @@ func cleanPath(urlPath string, defaultPath string) string {
|
||||||
return defaultPath
|
return defaultPath
|
||||||
}
|
}
|
||||||
if !path.IsAbs(tmp) {
|
if !path.IsAbs(tmp) {
|
||||||
tmp = fmt.Sprintf("/%s", tmp)
|
tmp = "/" + tmp
|
||||||
}
|
}
|
||||||
return tmp
|
return tmp
|
||||||
}
|
}
|
||||||
|
@ -125,7 +125,7 @@ func NewGRPCConfig(opts ...GRPCOption) Config {
|
||||||
if cfg.ServiceConfig != "" {
|
if cfg.ServiceConfig != "" {
|
||||||
cfg.DialOptions = append(cfg.DialOptions, grpc.WithDefaultServiceConfig(cfg.ServiceConfig))
|
cfg.DialOptions = append(cfg.DialOptions, grpc.WithDefaultServiceConfig(cfg.ServiceConfig))
|
||||||
}
|
}
|
||||||
// Priroritize GRPCCredentials over Insecure (passing both is an error).
|
// Prioritize GRPCCredentials over Insecure (passing both is an error).
|
||||||
if cfg.Traces.GRPCCredentials != nil {
|
if cfg.Traces.GRPCCredentials != nil {
|
||||||
cfg.DialOptions = append(cfg.DialOptions, grpc.WithTransportCredentials(cfg.Traces.GRPCCredentials))
|
cfg.DialOptions = append(cfg.DialOptions, grpc.WithTransportCredentials(cfg.Traces.GRPCCredentials))
|
||||||
} else if cfg.Traces.Insecure {
|
} else if cfg.Traces.Insecure {
|
||||||
|
@ -278,9 +278,7 @@ func WithEndpointURL(v string) GenericOption {
|
||||||
|
|
||||||
cfg.Traces.Endpoint = u.Host
|
cfg.Traces.Endpoint = u.Host
|
||||||
cfg.Traces.URLPath = u.Path
|
cfg.Traces.URLPath = u.Path
|
||||||
if u.Scheme != "https" {
|
cfg.Traces.Insecure = u.Scheme != "https"
|
||||||
cfg.Traces.Insecure = true
|
|
||||||
}
|
|
||||||
|
|
||||||
return cfg
|
return cfg
|
||||||
})
|
})
|
||||||
|
|
56
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/client.go
generated
vendored
56
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/client.go
generated
vendored
|
@ -166,8 +166,7 @@ func (d *client) UploadTraces(ctx context.Context, protoSpans []*tracepb.Resourc
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
switch sc := resp.StatusCode; {
|
if sc := resp.StatusCode; sc >= 200 && sc <= 299 {
|
||||||
case sc >= 200 && sc <= 299:
|
|
||||||
// Success, do not retry.
|
// Success, do not retry.
|
||||||
// Read the partial success message, if any.
|
// Read the partial success message, if any.
|
||||||
var respData bytes.Buffer
|
var respData bytes.Buffer
|
||||||
|
@ -194,34 +193,33 @@ func (d *client) UploadTraces(ctx context.Context, protoSpans []*tracepb.Resourc
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
}
|
||||||
|
// Error cases.
|
||||||
|
|
||||||
case sc == http.StatusTooManyRequests,
|
// server may return a message with the response
|
||||||
sc == http.StatusBadGateway,
|
// body, so we read it to include in the error
|
||||||
sc == http.StatusServiceUnavailable,
|
// message to be returned. It will help in
|
||||||
sc == http.StatusGatewayTimeout:
|
// debugging the actual issue.
|
||||||
// Retry-able failures.
|
var respData bytes.Buffer
|
||||||
rErr := newResponseError(resp.Header, nil)
|
if _, err := io.Copy(&respData, resp.Body); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
respStr := strings.TrimSpace(respData.String())
|
||||||
|
if len(respStr) == 0 {
|
||||||
|
respStr = "(empty)"
|
||||||
|
}
|
||||||
|
bodyErr := fmt.Errorf("body: %s", respStr)
|
||||||
|
|
||||||
// server may return a message with the response
|
switch resp.StatusCode {
|
||||||
// body, so we read it to include in the error
|
case http.StatusTooManyRequests,
|
||||||
// message to be returned. It will help in
|
http.StatusBadGateway,
|
||||||
// debugging the actual issue.
|
http.StatusServiceUnavailable,
|
||||||
var respData bytes.Buffer
|
http.StatusGatewayTimeout:
|
||||||
if _, err := io.Copy(&respData, resp.Body); err != nil {
|
// Retryable failure.
|
||||||
_ = resp.Body.Close()
|
return newResponseError(resp.Header, bodyErr)
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// overwrite the error message with the response body
|
|
||||||
// if it is not empty
|
|
||||||
if respStr := strings.TrimSpace(respData.String()); respStr != "" {
|
|
||||||
// Include response for context.
|
|
||||||
e := errors.New(respStr)
|
|
||||||
rErr = newResponseError(resp.Header, e)
|
|
||||||
}
|
|
||||||
return rErr
|
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("failed to send to %s: %s", request.URL, resp.Status)
|
// Non-retryable failure.
|
||||||
|
return fmt.Errorf("failed to send to %s: %s (%w)", request.URL, resp.Status, bodyErr)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -278,7 +276,7 @@ func (d *client) MarshalLog() interface{} {
|
||||||
Endpoint string
|
Endpoint string
|
||||||
Insecure bool
|
Insecure bool
|
||||||
}{
|
}{
|
||||||
Type: "otlphttphttp",
|
Type: "otlptracehttp",
|
||||||
Endpoint: d.cfg.Endpoint,
|
Endpoint: d.cfg.Endpoint,
|
||||||
Insecure: d.cfg.Insecure,
|
Insecure: d.cfg.Insecure,
|
||||||
}
|
}
|
||||||
|
@ -328,7 +326,7 @@ func newResponseError(header http.Header, wrapped error) error {
|
||||||
|
|
||||||
func (e retryableError) Error() string {
|
func (e retryableError) Error() string {
|
||||||
if e.err != nil {
|
if e.err != nil {
|
||||||
return fmt.Sprintf("retry-able request failure: %s", e.err.Error())
|
return "retry-able request failure: " + e.err.Error()
|
||||||
}
|
}
|
||||||
|
|
||||||
return "retry-able request failure"
|
return "retry-able request failure"
|
||||||
|
|
2
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/doc.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/doc.go
generated
vendored
|
@ -22,7 +22,7 @@
|
||||||
The value must contain a scheme ("http" or "https") and host.
|
The value must contain a scheme ("http" or "https") and host.
|
||||||
The value may additionally contain a port and a path.
|
The value may additionally contain a port and a path.
|
||||||
The value should not contain a query string or fragment.
|
The value should not contain a query string or fragment.
|
||||||
The configuration can be overridden by [WithEndpoint], [WithEndpointURL], [WitnInsecure], and [WithURLPath] options.
|
The configuration can be overridden by [WithEndpoint], [WithEndpointURL], [WithInsecure], and [WithURLPath] options.
|
||||||
|
|
||||||
OTEL_EXPORTER_OTLP_HEADERS, OTEL_EXPORTER_OTLP_TRACES_HEADERS (default: none) -
|
OTEL_EXPORTER_OTLP_HEADERS, OTEL_EXPORTER_OTLP_TRACES_HEADERS (default: none) -
|
||||||
key-value pairs used as headers associated with HTTP requests.
|
key-value pairs used as headers associated with HTTP requests.
|
||||||
|
|
|
@ -98,7 +98,7 @@ func cleanPath(urlPath string, defaultPath string) string {
|
||||||
return defaultPath
|
return defaultPath
|
||||||
}
|
}
|
||||||
if !path.IsAbs(tmp) {
|
if !path.IsAbs(tmp) {
|
||||||
tmp = fmt.Sprintf("/%s", tmp)
|
tmp = "/" + tmp
|
||||||
}
|
}
|
||||||
return tmp
|
return tmp
|
||||||
}
|
}
|
||||||
|
@ -125,7 +125,7 @@ func NewGRPCConfig(opts ...GRPCOption) Config {
|
||||||
if cfg.ServiceConfig != "" {
|
if cfg.ServiceConfig != "" {
|
||||||
cfg.DialOptions = append(cfg.DialOptions, grpc.WithDefaultServiceConfig(cfg.ServiceConfig))
|
cfg.DialOptions = append(cfg.DialOptions, grpc.WithDefaultServiceConfig(cfg.ServiceConfig))
|
||||||
}
|
}
|
||||||
// Priroritize GRPCCredentials over Insecure (passing both is an error).
|
// Prioritize GRPCCredentials over Insecure (passing both is an error).
|
||||||
if cfg.Traces.GRPCCredentials != nil {
|
if cfg.Traces.GRPCCredentials != nil {
|
||||||
cfg.DialOptions = append(cfg.DialOptions, grpc.WithTransportCredentials(cfg.Traces.GRPCCredentials))
|
cfg.DialOptions = append(cfg.DialOptions, grpc.WithTransportCredentials(cfg.Traces.GRPCCredentials))
|
||||||
} else if cfg.Traces.Insecure {
|
} else if cfg.Traces.Insecure {
|
||||||
|
@ -278,9 +278,7 @@ func WithEndpointURL(v string) GenericOption {
|
||||||
|
|
||||||
cfg.Traces.Endpoint = u.Host
|
cfg.Traces.Endpoint = u.Host
|
||||||
cfg.Traces.URLPath = u.Path
|
cfg.Traces.URLPath = u.Path
|
||||||
if u.Scheme != "https" {
|
cfg.Traces.Insecure = u.Scheme != "https"
|
||||||
cfg.Traces.Insecure = true
|
|
||||||
}
|
|
||||||
|
|
||||||
return cfg
|
return cfg
|
||||||
})
|
})
|
||||||
|
|
2
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/version.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/version.go
generated
vendored
|
@ -5,5 +5,5 @@
|
||||||
|
|
||||||
// Version is the current release version of the OpenTelemetry OTLP trace exporter in use.
|
// Version is the current release version of the OpenTelemetry OTLP trace exporter in use.
|
||||||
func Version() string {
|
func Version() string {
|
||||||
return "1.29.0"
|
return "1.34.0"
|
||||||
}
|
}
|
||||||
|
|
6
vendor/go.opentelemetry.io/otel/exporters/prometheus/config.go
generated
vendored
6
vendor/go.opentelemetry.io/otel/exporters/prometheus/config.go
generated
vendored
|
@ -7,6 +7,7 @@
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
"github.com/prometheus/common/model"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/sdk/metric"
|
"go.opentelemetry.io/otel/sdk/metric"
|
||||||
|
@ -131,7 +132,10 @@ func WithoutScopeInfo() Option {
|
||||||
// have special behavior based on their name.
|
// have special behavior based on their name.
|
||||||
func WithNamespace(ns string) Option {
|
func WithNamespace(ns string) Option {
|
||||||
return optionFunc(func(cfg config) config {
|
return optionFunc(func(cfg config) config {
|
||||||
ns = sanitizeName(ns)
|
if model.NameValidationScheme != model.UTF8Validation {
|
||||||
|
// Only sanitize if prometheus does not support UTF-8.
|
||||||
|
ns = model.EscapeName(ns, model.NameEscapingScheme)
|
||||||
|
}
|
||||||
if !strings.HasSuffix(ns, "_") {
|
if !strings.HasSuffix(ns, "_") {
|
||||||
// namespace and metric names should be separated with an underscore,
|
// namespace and metric names should be separated with an underscore,
|
||||||
// adds a trailing underscore if there is not one already.
|
// adds a trailing underscore if there is not one already.
|
||||||
|
|
204
vendor/go.opentelemetry.io/otel/exporters/prometheus/exporter.go
generated
vendored
204
vendor/go.opentelemetry.io/otel/exporters/prometheus/exporter.go
generated
vendored
|
@ -11,11 +11,10 @@
|
||||||
"slices"
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"unicode"
|
|
||||||
"unicode/utf8"
|
|
||||||
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
|
"github.com/prometheus/common/model"
|
||||||
"google.golang.org/protobuf/proto"
|
"google.golang.org/protobuf/proto"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
|
@ -34,15 +33,14 @@
|
||||||
scopeInfoMetricName = "otel_scope_info"
|
scopeInfoMetricName = "otel_scope_info"
|
||||||
scopeInfoDescription = "Instrumentation Scope metadata"
|
scopeInfoDescription = "Instrumentation Scope metadata"
|
||||||
|
|
||||||
|
scopeNameLabel = "otel_scope_name"
|
||||||
|
scopeVersionLabel = "otel_scope_version"
|
||||||
|
|
||||||
traceIDExemplarKey = "trace_id"
|
traceIDExemplarKey = "trace_id"
|
||||||
spanIDExemplarKey = "span_id"
|
spanIDExemplarKey = "span_id"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var errScopeInvalid = errors.New("invalid scope")
|
||||||
scopeInfoKeys = [2]string{"otel_scope_name", "otel_scope_version"}
|
|
||||||
|
|
||||||
errScopeInvalid = errors.New("invalid scope")
|
|
||||||
)
|
|
||||||
|
|
||||||
// Exporter is a Prometheus Exporter that embeds the OTel metric.Reader
|
// Exporter is a Prometheus Exporter that embeds the OTel metric.Reader
|
||||||
// interface for easy instantiation with a MeterProvider.
|
// interface for easy instantiation with a MeterProvider.
|
||||||
|
@ -188,7 +186,11 @@ func() {
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, scopeMetrics := range metrics.ScopeMetrics {
|
for _, scopeMetrics := range metrics.ScopeMetrics {
|
||||||
var keys, values [2]string
|
n := len(c.resourceKeyVals.keys) + 2 // resource attrs + scope name + scope version
|
||||||
|
kv := keyVals{
|
||||||
|
keys: make([]string, 0, n),
|
||||||
|
vals: make([]string, 0, n),
|
||||||
|
}
|
||||||
|
|
||||||
if !c.disableScopeInfo {
|
if !c.disableScopeInfo {
|
||||||
scopeInfo, err := c.scopeInfo(scopeMetrics.Scope)
|
scopeInfo, err := c.scopeInfo(scopeMetrics.Scope)
|
||||||
|
@ -203,10 +205,13 @@ func() {
|
||||||
|
|
||||||
ch <- scopeInfo
|
ch <- scopeInfo
|
||||||
|
|
||||||
keys = scopeInfoKeys
|
kv.keys = append(kv.keys, scopeNameLabel, scopeVersionLabel)
|
||||||
values = [2]string{scopeMetrics.Scope.Name, scopeMetrics.Scope.Version}
|
kv.vals = append(kv.vals, scopeMetrics.Scope.Name, scopeMetrics.Scope.Version)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kv.keys = append(kv.keys, c.resourceKeyVals.keys...)
|
||||||
|
kv.vals = append(kv.vals, c.resourceKeyVals.vals...)
|
||||||
|
|
||||||
for _, m := range scopeMetrics.Metrics {
|
for _, m := range scopeMetrics.Metrics {
|
||||||
typ := c.metricType(m)
|
typ := c.metricType(m)
|
||||||
if typ == nil {
|
if typ == nil {
|
||||||
|
@ -225,25 +230,27 @@ func() {
|
||||||
|
|
||||||
switch v := m.Data.(type) {
|
switch v := m.Data.(type) {
|
||||||
case metricdata.Histogram[int64]:
|
case metricdata.Histogram[int64]:
|
||||||
addHistogramMetric(ch, v, m, keys, values, name, c.resourceKeyVals)
|
addHistogramMetric(ch, v, m, name, kv)
|
||||||
case metricdata.Histogram[float64]:
|
case metricdata.Histogram[float64]:
|
||||||
addHistogramMetric(ch, v, m, keys, values, name, c.resourceKeyVals)
|
addHistogramMetric(ch, v, m, name, kv)
|
||||||
case metricdata.Sum[int64]:
|
case metricdata.Sum[int64]:
|
||||||
addSumMetric(ch, v, m, keys, values, name, c.resourceKeyVals)
|
addSumMetric(ch, v, m, name, kv)
|
||||||
case metricdata.Sum[float64]:
|
case metricdata.Sum[float64]:
|
||||||
addSumMetric(ch, v, m, keys, values, name, c.resourceKeyVals)
|
addSumMetric(ch, v, m, name, kv)
|
||||||
case metricdata.Gauge[int64]:
|
case metricdata.Gauge[int64]:
|
||||||
addGaugeMetric(ch, v, m, keys, values, name, c.resourceKeyVals)
|
addGaugeMetric(ch, v, m, name, kv)
|
||||||
case metricdata.Gauge[float64]:
|
case metricdata.Gauge[float64]:
|
||||||
addGaugeMetric(ch, v, m, keys, values, name, c.resourceKeyVals)
|
addGaugeMetric(ch, v, m, name, kv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func addHistogramMetric[N int64 | float64](ch chan<- prometheus.Metric, histogram metricdata.Histogram[N], m metricdata.Metrics, ks, vs [2]string, name string, resourceKV keyVals) {
|
func addHistogramMetric[N int64 | float64](ch chan<- prometheus.Metric, histogram metricdata.Histogram[N], m metricdata.Metrics, name string, kv keyVals) {
|
||||||
for _, dp := range histogram.DataPoints {
|
for _, dp := range histogram.DataPoints {
|
||||||
keys, values := getAttrs(dp.Attributes, ks, vs, resourceKV)
|
keys, values := getAttrs(dp.Attributes)
|
||||||
|
keys = append(keys, kv.keys...)
|
||||||
|
values = append(values, kv.vals...)
|
||||||
|
|
||||||
desc := prometheus.NewDesc(name, m.Description, keys, nil)
|
desc := prometheus.NewDesc(name, m.Description, keys, nil)
|
||||||
buckets := make(map[float64]uint64, len(dp.Bounds))
|
buckets := make(map[float64]uint64, len(dp.Bounds))
|
||||||
|
@ -263,14 +270,16 @@ func addHistogramMetric[N int64 | float64](ch chan<- prometheus.Metric, histogra
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func addSumMetric[N int64 | float64](ch chan<- prometheus.Metric, sum metricdata.Sum[N], m metricdata.Metrics, ks, vs [2]string, name string, resourceKV keyVals) {
|
func addSumMetric[N int64 | float64](ch chan<- prometheus.Metric, sum metricdata.Sum[N], m metricdata.Metrics, name string, kv keyVals) {
|
||||||
valueType := prometheus.CounterValue
|
valueType := prometheus.CounterValue
|
||||||
if !sum.IsMonotonic {
|
if !sum.IsMonotonic {
|
||||||
valueType = prometheus.GaugeValue
|
valueType = prometheus.GaugeValue
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, dp := range sum.DataPoints {
|
for _, dp := range sum.DataPoints {
|
||||||
keys, values := getAttrs(dp.Attributes, ks, vs, resourceKV)
|
keys, values := getAttrs(dp.Attributes)
|
||||||
|
keys = append(keys, kv.keys...)
|
||||||
|
values = append(values, kv.vals...)
|
||||||
|
|
||||||
desc := prometheus.NewDesc(name, m.Description, keys, nil)
|
desc := prometheus.NewDesc(name, m.Description, keys, nil)
|
||||||
m, err := prometheus.NewConstMetric(desc, valueType, float64(dp.Value), values...)
|
m, err := prometheus.NewConstMetric(desc, valueType, float64(dp.Value), values...)
|
||||||
|
@ -278,14 +287,20 @@ func addSumMetric[N int64 | float64](ch chan<- prometheus.Metric, sum metricdata
|
||||||
otel.Handle(err)
|
otel.Handle(err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
m = addExemplars(m, dp.Exemplars)
|
// GaugeValues don't support Exemplars at this time
|
||||||
|
// https://github.com/prometheus/client_golang/blob/aef8aedb4b6e1fb8ac1c90790645169125594096/prometheus/metric.go#L199
|
||||||
|
if valueType != prometheus.GaugeValue {
|
||||||
|
m = addExemplars(m, dp.Exemplars)
|
||||||
|
}
|
||||||
ch <- m
|
ch <- m
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func addGaugeMetric[N int64 | float64](ch chan<- prometheus.Metric, gauge metricdata.Gauge[N], m metricdata.Metrics, ks, vs [2]string, name string, resourceKV keyVals) {
|
func addGaugeMetric[N int64 | float64](ch chan<- prometheus.Metric, gauge metricdata.Gauge[N], m metricdata.Metrics, name string, kv keyVals) {
|
||||||
for _, dp := range gauge.DataPoints {
|
for _, dp := range gauge.DataPoints {
|
||||||
keys, values := getAttrs(dp.Attributes, ks, vs, resourceKV)
|
keys, values := getAttrs(dp.Attributes)
|
||||||
|
keys = append(keys, kv.keys...)
|
||||||
|
values = append(values, kv.vals...)
|
||||||
|
|
||||||
desc := prometheus.NewDesc(name, m.Description, keys, nil)
|
desc := prometheus.NewDesc(name, m.Description, keys, nil)
|
||||||
m, err := prometheus.NewConstMetric(desc, prometheus.GaugeValue, float64(dp.Value), values...)
|
m, err := prometheus.NewConstMetric(desc, prometheus.GaugeValue, float64(dp.Value), values...)
|
||||||
|
@ -297,61 +312,58 @@ func addGaugeMetric[N int64 | float64](ch chan<- prometheus.Metric, gauge metric
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// getAttrs parses the attribute.Set to two lists of matching Prometheus-style
|
// getAttrs converts the attribute.Set to two lists of matching Prometheus-style
|
||||||
// keys and values. It sanitizes invalid characters and handles duplicate keys
|
// keys and values.
|
||||||
// (due to sanitization) by sorting and concatenating the values following the spec.
|
func getAttrs(attrs attribute.Set) ([]string, []string) {
|
||||||
func getAttrs(attrs attribute.Set, ks, vs [2]string, resourceKV keyVals) ([]string, []string) {
|
|
||||||
keysMap := make(map[string][]string)
|
|
||||||
itr := attrs.Iter()
|
|
||||||
for itr.Next() {
|
|
||||||
kv := itr.Attribute()
|
|
||||||
key := strings.Map(sanitizeRune, string(kv.Key))
|
|
||||||
if _, ok := keysMap[key]; !ok {
|
|
||||||
keysMap[key] = []string{kv.Value.Emit()}
|
|
||||||
} else {
|
|
||||||
// if the sanitized key is a duplicate, append to the list of keys
|
|
||||||
keysMap[key] = append(keysMap[key], kv.Value.Emit())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
keys := make([]string, 0, attrs.Len())
|
keys := make([]string, 0, attrs.Len())
|
||||||
values := make([]string, 0, attrs.Len())
|
values := make([]string, 0, attrs.Len())
|
||||||
for key, vals := range keysMap {
|
itr := attrs.Iter()
|
||||||
keys = append(keys, key)
|
|
||||||
slices.Sort(vals)
|
|
||||||
values = append(values, strings.Join(vals, ";"))
|
|
||||||
}
|
|
||||||
|
|
||||||
if ks[0] != "" {
|
if model.NameValidationScheme == model.UTF8Validation {
|
||||||
keys = append(keys, ks[:]...)
|
// Do not perform sanitization if prometheus supports UTF-8.
|
||||||
values = append(values, vs[:]...)
|
for itr.Next() {
|
||||||
|
kv := itr.Attribute()
|
||||||
|
keys = append(keys, string(kv.Key))
|
||||||
|
values = append(values, kv.Value.Emit())
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// It sanitizes invalid characters and handles duplicate keys
|
||||||
|
// (due to sanitization) by sorting and concatenating the values following the spec.
|
||||||
|
keysMap := make(map[string][]string)
|
||||||
|
for itr.Next() {
|
||||||
|
kv := itr.Attribute()
|
||||||
|
key := model.EscapeName(string(kv.Key), model.NameEscapingScheme)
|
||||||
|
if _, ok := keysMap[key]; !ok {
|
||||||
|
keysMap[key] = []string{kv.Value.Emit()}
|
||||||
|
} else {
|
||||||
|
// if the sanitized key is a duplicate, append to the list of keys
|
||||||
|
keysMap[key] = append(keysMap[key], kv.Value.Emit())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for key, vals := range keysMap {
|
||||||
|
keys = append(keys, key)
|
||||||
|
slices.Sort(vals)
|
||||||
|
values = append(values, strings.Join(vals, ";"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for idx := range resourceKV.keys {
|
|
||||||
keys = append(keys, resourceKV.keys[idx])
|
|
||||||
values = append(values, resourceKV.vals[idx])
|
|
||||||
}
|
|
||||||
|
|
||||||
return keys, values
|
return keys, values
|
||||||
}
|
}
|
||||||
|
|
||||||
func createInfoMetric(name, description string, res *resource.Resource) (prometheus.Metric, error) {
|
func createInfoMetric(name, description string, res *resource.Resource) (prometheus.Metric, error) {
|
||||||
keys, values := getAttrs(*res.Set(), [2]string{}, [2]string{}, keyVals{})
|
keys, values := getAttrs(*res.Set())
|
||||||
desc := prometheus.NewDesc(name, description, keys, nil)
|
desc := prometheus.NewDesc(name, description, keys, nil)
|
||||||
return prometheus.NewConstMetric(desc, prometheus.GaugeValue, float64(1), values...)
|
return prometheus.NewConstMetric(desc, prometheus.GaugeValue, float64(1), values...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func createScopeInfoMetric(scope instrumentation.Scope) (prometheus.Metric, error) {
|
func createScopeInfoMetric(scope instrumentation.Scope) (prometheus.Metric, error) {
|
||||||
keys := scopeInfoKeys[:]
|
attrs := make([]attribute.KeyValue, 0, scope.Attributes.Len()+2) // resource attrs + scope name + scope version
|
||||||
desc := prometheus.NewDesc(scopeInfoMetricName, scopeInfoDescription, keys, nil)
|
attrs = append(attrs, scope.Attributes.ToSlice()...)
|
||||||
return prometheus.NewConstMetric(desc, prometheus.GaugeValue, float64(1), scope.Name, scope.Version)
|
attrs = append(attrs, attribute.String(scopeNameLabel, scope.Name))
|
||||||
}
|
attrs = append(attrs, attribute.String(scopeVersionLabel, scope.Version))
|
||||||
|
|
||||||
func sanitizeRune(r rune) rune {
|
keys, values := getAttrs(attribute.NewSet(attrs...))
|
||||||
if unicode.IsLetter(r) || unicode.IsDigit(r) || r == ':' || r == '_' {
|
desc := prometheus.NewDesc(scopeInfoMetricName, scopeInfoDescription, keys, nil)
|
||||||
return r
|
return prometheus.NewConstMetric(desc, prometheus.GaugeValue, float64(1), values...)
|
||||||
}
|
|
||||||
return '_'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var unitSuffixes = map[string]string{
|
var unitSuffixes = map[string]string{
|
||||||
|
@ -392,7 +404,11 @@ func sanitizeRune(r rune) rune {
|
||||||
|
|
||||||
// getName returns the sanitized name, prefixed with the namespace and suffixed with unit.
|
// getName returns the sanitized name, prefixed with the namespace and suffixed with unit.
|
||||||
func (c *collector) getName(m metricdata.Metrics, typ *dto.MetricType) string {
|
func (c *collector) getName(m metricdata.Metrics, typ *dto.MetricType) string {
|
||||||
name := sanitizeName(m.Name)
|
name := m.Name
|
||||||
|
if model.NameValidationScheme != model.UTF8Validation {
|
||||||
|
// Only sanitize if prometheus does not support UTF-8.
|
||||||
|
name = model.EscapeName(name, model.NameEscapingScheme)
|
||||||
|
}
|
||||||
addCounterSuffix := !c.withoutCounterSuffixes && *typ == dto.MetricType_COUNTER
|
addCounterSuffix := !c.withoutCounterSuffixes && *typ == dto.MetricType_COUNTER
|
||||||
if addCounterSuffix {
|
if addCounterSuffix {
|
||||||
// Remove the _total suffix here, as we will re-add the total suffix
|
// Remove the _total suffix here, as we will re-add the total suffix
|
||||||
|
@ -411,59 +427,6 @@ func (c *collector) getName(m metricdata.Metrics, typ *dto.MetricType) string {
|
||||||
return name
|
return name
|
||||||
}
|
}
|
||||||
|
|
||||||
func sanitizeName(n string) string {
|
|
||||||
// This algorithm is based on strings.Map from Go 1.19.
|
|
||||||
const replacement = '_'
|
|
||||||
|
|
||||||
valid := func(i int, r rune) bool {
|
|
||||||
// Taken from
|
|
||||||
// https://github.com/prometheus/common/blob/dfbc25bd00225c70aca0d94c3c4bb7744f28ace0/model/metric.go#L92-L102
|
|
||||||
if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') || r == '_' || r == ':' || (r >= '0' && r <= '9' && i > 0) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// This output buffer b is initialized on demand, the first time a
|
|
||||||
// character needs to be replaced.
|
|
||||||
var b strings.Builder
|
|
||||||
for i, c := range n {
|
|
||||||
if valid(i, c) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if i == 0 && c >= '0' && c <= '9' {
|
|
||||||
// Prefix leading number with replacement character.
|
|
||||||
b.Grow(len(n) + 1)
|
|
||||||
_ = b.WriteByte(byte(replacement))
|
|
||||||
break
|
|
||||||
}
|
|
||||||
b.Grow(len(n))
|
|
||||||
_, _ = b.WriteString(n[:i])
|
|
||||||
_ = b.WriteByte(byte(replacement))
|
|
||||||
width := utf8.RuneLen(c)
|
|
||||||
n = n[i+width:]
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fast path for unchanged input.
|
|
||||||
if b.Cap() == 0 { // b.Grow was not called above.
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, c := range n {
|
|
||||||
// Due to inlining, it is more performant to invoke WriteByte rather then
|
|
||||||
// WriteRune.
|
|
||||||
if valid(1, c) { // We are guaranteed to not be at the start.
|
|
||||||
_ = b.WriteByte(byte(c))
|
|
||||||
} else {
|
|
||||||
_ = b.WriteByte(byte(replacement))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return b.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *collector) metricType(m metricdata.Metrics) *dto.MetricType {
|
func (c *collector) metricType(m metricdata.Metrics) *dto.MetricType {
|
||||||
switch v := m.Data.(type) {
|
switch v := m.Data.(type) {
|
||||||
case metricdata.Histogram[int64], metricdata.Histogram[float64]:
|
case metricdata.Histogram[int64], metricdata.Histogram[float64]:
|
||||||
|
@ -489,7 +452,7 @@ func (c *collector) createResourceAttributes(res *resource.Resource) {
|
||||||
defer c.mu.Unlock()
|
defer c.mu.Unlock()
|
||||||
|
|
||||||
resourceAttrs, _ := res.Set().Filter(c.resourceAttributesFilter)
|
resourceAttrs, _ := res.Set().Filter(c.resourceAttributesFilter)
|
||||||
resourceKeys, resourceValues := getAttrs(resourceAttrs, [2]string{}, [2]string{}, keyVals{})
|
resourceKeys, resourceValues := getAttrs(resourceAttrs)
|
||||||
c.resourceKeyVals = keyVals{keys: resourceKeys, vals: resourceValues}
|
c.resourceKeyVals = keyVals{keys: resourceKeys, vals: resourceValues}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -584,7 +547,8 @@ func addExemplars[N int64 | float64](m prometheus.Metric, exemplars []metricdata
|
||||||
func attributesToLabels(attrs []attribute.KeyValue) prometheus.Labels {
|
func attributesToLabels(attrs []attribute.KeyValue) prometheus.Labels {
|
||||||
labels := make(map[string]string)
|
labels := make(map[string]string)
|
||||||
for _, attr := range attrs {
|
for _, attr := range attrs {
|
||||||
labels[string(attr.Key)] = attr.Value.Emit()
|
key := model.EscapeName(string(attr.Key), model.NameEscapingScheme)
|
||||||
|
labels[key] = attr.Value.Emit()
|
||||||
}
|
}
|
||||||
return labels
|
return labels
|
||||||
}
|
}
|
||||||
|
|
44
vendor/go.opentelemetry.io/otel/internal/attribute/attribute.go
generated
vendored
44
vendor/go.opentelemetry.io/otel/internal/attribute/attribute.go
generated
vendored
|
@ -49,12 +49,11 @@ func AsBoolSlice(v interface{}) []bool {
|
||||||
if rv.Type().Kind() != reflect.Array {
|
if rv.Type().Kind() != reflect.Array {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var zero bool
|
cpy := make([]bool, rv.Len())
|
||||||
correctLen := rv.Len()
|
if len(cpy) > 0 {
|
||||||
correctType := reflect.ArrayOf(correctLen, reflect.TypeOf(zero))
|
_ = reflect.Copy(reflect.ValueOf(cpy), rv)
|
||||||
cpy := reflect.New(correctType)
|
}
|
||||||
_ = reflect.Copy(cpy.Elem(), rv)
|
return cpy
|
||||||
return cpy.Elem().Slice(0, correctLen).Interface().([]bool)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// AsInt64Slice converts an int64 array into a slice into with same elements as array.
|
// AsInt64Slice converts an int64 array into a slice into with same elements as array.
|
||||||
|
@ -63,12 +62,11 @@ func AsInt64Slice(v interface{}) []int64 {
|
||||||
if rv.Type().Kind() != reflect.Array {
|
if rv.Type().Kind() != reflect.Array {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var zero int64
|
cpy := make([]int64, rv.Len())
|
||||||
correctLen := rv.Len()
|
if len(cpy) > 0 {
|
||||||
correctType := reflect.ArrayOf(correctLen, reflect.TypeOf(zero))
|
_ = reflect.Copy(reflect.ValueOf(cpy), rv)
|
||||||
cpy := reflect.New(correctType)
|
}
|
||||||
_ = reflect.Copy(cpy.Elem(), rv)
|
return cpy
|
||||||
return cpy.Elem().Slice(0, correctLen).Interface().([]int64)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// AsFloat64Slice converts a float64 array into a slice into with same elements as array.
|
// AsFloat64Slice converts a float64 array into a slice into with same elements as array.
|
||||||
|
@ -77,12 +75,11 @@ func AsFloat64Slice(v interface{}) []float64 {
|
||||||
if rv.Type().Kind() != reflect.Array {
|
if rv.Type().Kind() != reflect.Array {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var zero float64
|
cpy := make([]float64, rv.Len())
|
||||||
correctLen := rv.Len()
|
if len(cpy) > 0 {
|
||||||
correctType := reflect.ArrayOf(correctLen, reflect.TypeOf(zero))
|
_ = reflect.Copy(reflect.ValueOf(cpy), rv)
|
||||||
cpy := reflect.New(correctType)
|
}
|
||||||
_ = reflect.Copy(cpy.Elem(), rv)
|
return cpy
|
||||||
return cpy.Elem().Slice(0, correctLen).Interface().([]float64)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// AsStringSlice converts a string array into a slice into with same elements as array.
|
// AsStringSlice converts a string array into a slice into with same elements as array.
|
||||||
|
@ -91,10 +88,9 @@ func AsStringSlice(v interface{}) []string {
|
||||||
if rv.Type().Kind() != reflect.Array {
|
if rv.Type().Kind() != reflect.Array {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var zero string
|
cpy := make([]string, rv.Len())
|
||||||
correctLen := rv.Len()
|
if len(cpy) > 0 {
|
||||||
correctType := reflect.ArrayOf(correctLen, reflect.TypeOf(zero))
|
_ = reflect.Copy(reflect.ValueOf(cpy), rv)
|
||||||
cpy := reflect.New(correctType)
|
}
|
||||||
_ = reflect.Copy(cpy.Elem(), rv)
|
return cpy
|
||||||
return cpy.Elem().Slice(0, correctLen).Interface().([]string)
|
|
||||||
}
|
}
|
||||||
|
|
14
vendor/go.opentelemetry.io/otel/internal/global/instruments.go
generated
vendored
14
vendor/go.opentelemetry.io/otel/internal/global/instruments.go
generated
vendored
|
@ -13,7 +13,7 @@
|
||||||
|
|
||||||
// unwrapper unwraps to return the underlying instrument implementation.
|
// unwrapper unwraps to return the underlying instrument implementation.
|
||||||
type unwrapper interface {
|
type unwrapper interface {
|
||||||
Unwrap() metric.Observable
|
unwrap() metric.Observable
|
||||||
}
|
}
|
||||||
|
|
||||||
type afCounter struct {
|
type afCounter struct {
|
||||||
|
@ -40,7 +40,7 @@ func (i *afCounter) setDelegate(m metric.Meter) {
|
||||||
i.delegate.Store(ctr)
|
i.delegate.Store(ctr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *afCounter) Unwrap() metric.Observable {
|
func (i *afCounter) unwrap() metric.Observable {
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
return ctr.(metric.Float64ObservableCounter)
|
return ctr.(metric.Float64ObservableCounter)
|
||||||
}
|
}
|
||||||
|
@ -71,7 +71,7 @@ func (i *afUpDownCounter) setDelegate(m metric.Meter) {
|
||||||
i.delegate.Store(ctr)
|
i.delegate.Store(ctr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *afUpDownCounter) Unwrap() metric.Observable {
|
func (i *afUpDownCounter) unwrap() metric.Observable {
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
return ctr.(metric.Float64ObservableUpDownCounter)
|
return ctr.(metric.Float64ObservableUpDownCounter)
|
||||||
}
|
}
|
||||||
|
@ -102,7 +102,7 @@ func (i *afGauge) setDelegate(m metric.Meter) {
|
||||||
i.delegate.Store(ctr)
|
i.delegate.Store(ctr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *afGauge) Unwrap() metric.Observable {
|
func (i *afGauge) unwrap() metric.Observable {
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
return ctr.(metric.Float64ObservableGauge)
|
return ctr.(metric.Float64ObservableGauge)
|
||||||
}
|
}
|
||||||
|
@ -133,7 +133,7 @@ func (i *aiCounter) setDelegate(m metric.Meter) {
|
||||||
i.delegate.Store(ctr)
|
i.delegate.Store(ctr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *aiCounter) Unwrap() metric.Observable {
|
func (i *aiCounter) unwrap() metric.Observable {
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
return ctr.(metric.Int64ObservableCounter)
|
return ctr.(metric.Int64ObservableCounter)
|
||||||
}
|
}
|
||||||
|
@ -164,7 +164,7 @@ func (i *aiUpDownCounter) setDelegate(m metric.Meter) {
|
||||||
i.delegate.Store(ctr)
|
i.delegate.Store(ctr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *aiUpDownCounter) Unwrap() metric.Observable {
|
func (i *aiUpDownCounter) unwrap() metric.Observable {
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
return ctr.(metric.Int64ObservableUpDownCounter)
|
return ctr.(metric.Int64ObservableUpDownCounter)
|
||||||
}
|
}
|
||||||
|
@ -195,7 +195,7 @@ func (i *aiGauge) setDelegate(m metric.Meter) {
|
||||||
i.delegate.Store(ctr)
|
i.delegate.Store(ctr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *aiGauge) Unwrap() metric.Observable {
|
func (i *aiGauge) unwrap() metric.Observable {
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
return ctr.(metric.Int64ObservableGauge)
|
return ctr.(metric.Int64ObservableGauge)
|
||||||
}
|
}
|
||||||
|
|
382
vendor/go.opentelemetry.io/otel/internal/global/meter.go
generated
vendored
382
vendor/go.opentelemetry.io/otel/internal/global/meter.go
generated
vendored
|
@ -5,8 +5,9 @@
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"container/list"
|
"container/list"
|
||||||
|
"context"
|
||||||
|
"reflect"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/metric"
|
"go.opentelemetry.io/otel/metric"
|
||||||
"go.opentelemetry.io/otel/metric/embedded"
|
"go.opentelemetry.io/otel/metric/embedded"
|
||||||
|
@ -66,6 +67,7 @@ func (p *meterProvider) Meter(name string, opts ...metric.MeterOption) metric.Me
|
||||||
name: name,
|
name: name,
|
||||||
version: c.InstrumentationVersion(),
|
version: c.InstrumentationVersion(),
|
||||||
schema: c.SchemaURL(),
|
schema: c.SchemaURL(),
|
||||||
|
attrs: c.InstrumentationAttributes(),
|
||||||
}
|
}
|
||||||
|
|
||||||
if p.meters == nil {
|
if p.meters == nil {
|
||||||
|
@ -76,7 +78,7 @@ func (p *meterProvider) Meter(name string, opts ...metric.MeterOption) metric.Me
|
||||||
return val
|
return val
|
||||||
}
|
}
|
||||||
|
|
||||||
t := &meter{name: name, opts: opts}
|
t := &meter{name: name, opts: opts, instruments: make(map[instID]delegatedInstrument)}
|
||||||
p.meters[key] = t
|
p.meters[key] = t
|
||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
|
@ -92,17 +94,29 @@ type meter struct {
|
||||||
opts []metric.MeterOption
|
opts []metric.MeterOption
|
||||||
|
|
||||||
mtx sync.Mutex
|
mtx sync.Mutex
|
||||||
instruments []delegatedInstrument
|
instruments map[instID]delegatedInstrument
|
||||||
|
|
||||||
registry list.List
|
registry list.List
|
||||||
|
|
||||||
delegate atomic.Value // metric.Meter
|
delegate metric.Meter
|
||||||
}
|
}
|
||||||
|
|
||||||
type delegatedInstrument interface {
|
type delegatedInstrument interface {
|
||||||
setDelegate(metric.Meter)
|
setDelegate(metric.Meter)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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 reflect.Type
|
||||||
|
// unit is the unit of the stream.
|
||||||
|
unit string
|
||||||
|
}
|
||||||
|
|
||||||
// setDelegate configures m to delegate all Meter functionality to Meters
|
// setDelegate configures m to delegate all Meter functionality to Meters
|
||||||
// created by provider.
|
// created by provider.
|
||||||
//
|
//
|
||||||
|
@ -110,12 +124,12 @@ type delegatedInstrument interface {
|
||||||
//
|
//
|
||||||
// It is guaranteed by the caller that this happens only once.
|
// It is guaranteed by the caller that this happens only once.
|
||||||
func (m *meter) setDelegate(provider metric.MeterProvider) {
|
func (m *meter) setDelegate(provider metric.MeterProvider) {
|
||||||
meter := provider.Meter(m.name, m.opts...)
|
|
||||||
m.delegate.Store(meter)
|
|
||||||
|
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
|
meter := provider.Meter(m.name, m.opts...)
|
||||||
|
m.delegate = meter
|
||||||
|
|
||||||
for _, inst := range m.instruments {
|
for _, inst := range m.instruments {
|
||||||
inst.setDelegate(meter)
|
inst.setDelegate(meter)
|
||||||
}
|
}
|
||||||
|
@ -133,169 +147,336 @@ func (m *meter) setDelegate(provider metric.MeterProvider) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Int64Counter(name string, options ...metric.Int64CounterOption) (metric.Int64Counter, error) {
|
func (m *meter) Int64Counter(name string, options ...metric.Int64CounterOption) (metric.Int64Counter, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
|
||||||
return del.Int64Counter(name, options...)
|
|
||||||
}
|
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
|
if m.delegate != nil {
|
||||||
|
return m.delegate.Int64Counter(name, options...)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := metric.NewInt64CounterConfig(options...)
|
||||||
|
id := instID{
|
||||||
|
name: name,
|
||||||
|
kind: reflect.TypeOf((*siCounter)(nil)),
|
||||||
|
description: cfg.Description(),
|
||||||
|
unit: cfg.Unit(),
|
||||||
|
}
|
||||||
|
if f, ok := m.instruments[id]; ok {
|
||||||
|
return f.(metric.Int64Counter), nil
|
||||||
|
}
|
||||||
i := &siCounter{name: name, opts: options}
|
i := &siCounter{name: name, opts: options}
|
||||||
m.instruments = append(m.instruments, i)
|
m.instruments[id] = i
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Int64UpDownCounter(name string, options ...metric.Int64UpDownCounterOption) (metric.Int64UpDownCounter, error) {
|
func (m *meter) Int64UpDownCounter(name string, options ...metric.Int64UpDownCounterOption) (metric.Int64UpDownCounter, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
|
||||||
return del.Int64UpDownCounter(name, options...)
|
|
||||||
}
|
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
|
if m.delegate != nil {
|
||||||
|
return m.delegate.Int64UpDownCounter(name, options...)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := metric.NewInt64UpDownCounterConfig(options...)
|
||||||
|
id := instID{
|
||||||
|
name: name,
|
||||||
|
kind: reflect.TypeOf((*siUpDownCounter)(nil)),
|
||||||
|
description: cfg.Description(),
|
||||||
|
unit: cfg.Unit(),
|
||||||
|
}
|
||||||
|
if f, ok := m.instruments[id]; ok {
|
||||||
|
return f.(metric.Int64UpDownCounter), nil
|
||||||
|
}
|
||||||
i := &siUpDownCounter{name: name, opts: options}
|
i := &siUpDownCounter{name: name, opts: options}
|
||||||
m.instruments = append(m.instruments, i)
|
m.instruments[id] = i
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Int64Histogram(name string, options ...metric.Int64HistogramOption) (metric.Int64Histogram, error) {
|
func (m *meter) Int64Histogram(name string, options ...metric.Int64HistogramOption) (metric.Int64Histogram, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
|
||||||
return del.Int64Histogram(name, options...)
|
|
||||||
}
|
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
|
if m.delegate != nil {
|
||||||
|
return m.delegate.Int64Histogram(name, options...)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := metric.NewInt64HistogramConfig(options...)
|
||||||
|
id := instID{
|
||||||
|
name: name,
|
||||||
|
kind: reflect.TypeOf((*siHistogram)(nil)),
|
||||||
|
description: cfg.Description(),
|
||||||
|
unit: cfg.Unit(),
|
||||||
|
}
|
||||||
|
if f, ok := m.instruments[id]; ok {
|
||||||
|
return f.(metric.Int64Histogram), nil
|
||||||
|
}
|
||||||
i := &siHistogram{name: name, opts: options}
|
i := &siHistogram{name: name, opts: options}
|
||||||
m.instruments = append(m.instruments, i)
|
m.instruments[id] = i
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Int64Gauge(name string, options ...metric.Int64GaugeOption) (metric.Int64Gauge, error) {
|
func (m *meter) Int64Gauge(name string, options ...metric.Int64GaugeOption) (metric.Int64Gauge, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
|
||||||
return del.Int64Gauge(name, options...)
|
|
||||||
}
|
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
|
if m.delegate != nil {
|
||||||
|
return m.delegate.Int64Gauge(name, options...)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := metric.NewInt64GaugeConfig(options...)
|
||||||
|
id := instID{
|
||||||
|
name: name,
|
||||||
|
kind: reflect.TypeOf((*siGauge)(nil)),
|
||||||
|
description: cfg.Description(),
|
||||||
|
unit: cfg.Unit(),
|
||||||
|
}
|
||||||
|
if f, ok := m.instruments[id]; ok {
|
||||||
|
return f.(metric.Int64Gauge), nil
|
||||||
|
}
|
||||||
i := &siGauge{name: name, opts: options}
|
i := &siGauge{name: name, opts: options}
|
||||||
m.instruments = append(m.instruments, i)
|
m.instruments[id] = i
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Int64ObservableCounter(name string, options ...metric.Int64ObservableCounterOption) (metric.Int64ObservableCounter, error) {
|
func (m *meter) Int64ObservableCounter(name string, options ...metric.Int64ObservableCounterOption) (metric.Int64ObservableCounter, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
|
||||||
return del.Int64ObservableCounter(name, options...)
|
|
||||||
}
|
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
|
if m.delegate != nil {
|
||||||
|
return m.delegate.Int64ObservableCounter(name, options...)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := metric.NewInt64ObservableCounterConfig(options...)
|
||||||
|
id := instID{
|
||||||
|
name: name,
|
||||||
|
kind: reflect.TypeOf((*aiCounter)(nil)),
|
||||||
|
description: cfg.Description(),
|
||||||
|
unit: cfg.Unit(),
|
||||||
|
}
|
||||||
|
if f, ok := m.instruments[id]; ok {
|
||||||
|
return f.(metric.Int64ObservableCounter), nil
|
||||||
|
}
|
||||||
i := &aiCounter{name: name, opts: options}
|
i := &aiCounter{name: name, opts: options}
|
||||||
m.instruments = append(m.instruments, i)
|
m.instruments[id] = i
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Int64ObservableUpDownCounter(name string, options ...metric.Int64ObservableUpDownCounterOption) (metric.Int64ObservableUpDownCounter, error) {
|
func (m *meter) Int64ObservableUpDownCounter(name string, options ...metric.Int64ObservableUpDownCounterOption) (metric.Int64ObservableUpDownCounter, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
|
||||||
return del.Int64ObservableUpDownCounter(name, options...)
|
|
||||||
}
|
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
|
if m.delegate != nil {
|
||||||
|
return m.delegate.Int64ObservableUpDownCounter(name, options...)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := metric.NewInt64ObservableUpDownCounterConfig(options...)
|
||||||
|
id := instID{
|
||||||
|
name: name,
|
||||||
|
kind: reflect.TypeOf((*aiUpDownCounter)(nil)),
|
||||||
|
description: cfg.Description(),
|
||||||
|
unit: cfg.Unit(),
|
||||||
|
}
|
||||||
|
if f, ok := m.instruments[id]; ok {
|
||||||
|
return f.(metric.Int64ObservableUpDownCounter), nil
|
||||||
|
}
|
||||||
i := &aiUpDownCounter{name: name, opts: options}
|
i := &aiUpDownCounter{name: name, opts: options}
|
||||||
m.instruments = append(m.instruments, i)
|
m.instruments[id] = i
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Int64ObservableGauge(name string, options ...metric.Int64ObservableGaugeOption) (metric.Int64ObservableGauge, error) {
|
func (m *meter) Int64ObservableGauge(name string, options ...metric.Int64ObservableGaugeOption) (metric.Int64ObservableGauge, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
|
||||||
return del.Int64ObservableGauge(name, options...)
|
|
||||||
}
|
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
|
if m.delegate != nil {
|
||||||
|
return m.delegate.Int64ObservableGauge(name, options...)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := metric.NewInt64ObservableGaugeConfig(options...)
|
||||||
|
id := instID{
|
||||||
|
name: name,
|
||||||
|
kind: reflect.TypeOf((*aiGauge)(nil)),
|
||||||
|
description: cfg.Description(),
|
||||||
|
unit: cfg.Unit(),
|
||||||
|
}
|
||||||
|
if f, ok := m.instruments[id]; ok {
|
||||||
|
return f.(metric.Int64ObservableGauge), nil
|
||||||
|
}
|
||||||
i := &aiGauge{name: name, opts: options}
|
i := &aiGauge{name: name, opts: options}
|
||||||
m.instruments = append(m.instruments, i)
|
m.instruments[id] = i
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Float64Counter(name string, options ...metric.Float64CounterOption) (metric.Float64Counter, error) {
|
func (m *meter) Float64Counter(name string, options ...metric.Float64CounterOption) (metric.Float64Counter, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
|
||||||
return del.Float64Counter(name, options...)
|
|
||||||
}
|
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
|
if m.delegate != nil {
|
||||||
|
return m.delegate.Float64Counter(name, options...)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := metric.NewFloat64CounterConfig(options...)
|
||||||
|
id := instID{
|
||||||
|
name: name,
|
||||||
|
kind: reflect.TypeOf((*sfCounter)(nil)),
|
||||||
|
description: cfg.Description(),
|
||||||
|
unit: cfg.Unit(),
|
||||||
|
}
|
||||||
|
if f, ok := m.instruments[id]; ok {
|
||||||
|
return f.(metric.Float64Counter), nil
|
||||||
|
}
|
||||||
i := &sfCounter{name: name, opts: options}
|
i := &sfCounter{name: name, opts: options}
|
||||||
m.instruments = append(m.instruments, i)
|
m.instruments[id] = i
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Float64UpDownCounter(name string, options ...metric.Float64UpDownCounterOption) (metric.Float64UpDownCounter, error) {
|
func (m *meter) Float64UpDownCounter(name string, options ...metric.Float64UpDownCounterOption) (metric.Float64UpDownCounter, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
|
||||||
return del.Float64UpDownCounter(name, options...)
|
|
||||||
}
|
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
|
if m.delegate != nil {
|
||||||
|
return m.delegate.Float64UpDownCounter(name, options...)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := metric.NewFloat64UpDownCounterConfig(options...)
|
||||||
|
id := instID{
|
||||||
|
name: name,
|
||||||
|
kind: reflect.TypeOf((*sfUpDownCounter)(nil)),
|
||||||
|
description: cfg.Description(),
|
||||||
|
unit: cfg.Unit(),
|
||||||
|
}
|
||||||
|
if f, ok := m.instruments[id]; ok {
|
||||||
|
return f.(metric.Float64UpDownCounter), nil
|
||||||
|
}
|
||||||
i := &sfUpDownCounter{name: name, opts: options}
|
i := &sfUpDownCounter{name: name, opts: options}
|
||||||
m.instruments = append(m.instruments, i)
|
m.instruments[id] = i
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Float64Histogram(name string, options ...metric.Float64HistogramOption) (metric.Float64Histogram, error) {
|
func (m *meter) Float64Histogram(name string, options ...metric.Float64HistogramOption) (metric.Float64Histogram, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
|
||||||
return del.Float64Histogram(name, options...)
|
|
||||||
}
|
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
|
if m.delegate != nil {
|
||||||
|
return m.delegate.Float64Histogram(name, options...)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := metric.NewFloat64HistogramConfig(options...)
|
||||||
|
id := instID{
|
||||||
|
name: name,
|
||||||
|
kind: reflect.TypeOf((*sfHistogram)(nil)),
|
||||||
|
description: cfg.Description(),
|
||||||
|
unit: cfg.Unit(),
|
||||||
|
}
|
||||||
|
if f, ok := m.instruments[id]; ok {
|
||||||
|
return f.(metric.Float64Histogram), nil
|
||||||
|
}
|
||||||
i := &sfHistogram{name: name, opts: options}
|
i := &sfHistogram{name: name, opts: options}
|
||||||
m.instruments = append(m.instruments, i)
|
m.instruments[id] = i
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Float64Gauge(name string, options ...metric.Float64GaugeOption) (metric.Float64Gauge, error) {
|
func (m *meter) Float64Gauge(name string, options ...metric.Float64GaugeOption) (metric.Float64Gauge, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
|
||||||
return del.Float64Gauge(name, options...)
|
|
||||||
}
|
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
|
if m.delegate != nil {
|
||||||
|
return m.delegate.Float64Gauge(name, options...)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := metric.NewFloat64GaugeConfig(options...)
|
||||||
|
id := instID{
|
||||||
|
name: name,
|
||||||
|
kind: reflect.TypeOf((*sfGauge)(nil)),
|
||||||
|
description: cfg.Description(),
|
||||||
|
unit: cfg.Unit(),
|
||||||
|
}
|
||||||
|
if f, ok := m.instruments[id]; ok {
|
||||||
|
return f.(metric.Float64Gauge), nil
|
||||||
|
}
|
||||||
i := &sfGauge{name: name, opts: options}
|
i := &sfGauge{name: name, opts: options}
|
||||||
m.instruments = append(m.instruments, i)
|
m.instruments[id] = i
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Float64ObservableCounter(name string, options ...metric.Float64ObservableCounterOption) (metric.Float64ObservableCounter, error) {
|
func (m *meter) Float64ObservableCounter(name string, options ...metric.Float64ObservableCounterOption) (metric.Float64ObservableCounter, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
|
||||||
return del.Float64ObservableCounter(name, options...)
|
|
||||||
}
|
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
|
if m.delegate != nil {
|
||||||
|
return m.delegate.Float64ObservableCounter(name, options...)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := metric.NewFloat64ObservableCounterConfig(options...)
|
||||||
|
id := instID{
|
||||||
|
name: name,
|
||||||
|
kind: reflect.TypeOf((*afCounter)(nil)),
|
||||||
|
description: cfg.Description(),
|
||||||
|
unit: cfg.Unit(),
|
||||||
|
}
|
||||||
|
if f, ok := m.instruments[id]; ok {
|
||||||
|
return f.(metric.Float64ObservableCounter), nil
|
||||||
|
}
|
||||||
i := &afCounter{name: name, opts: options}
|
i := &afCounter{name: name, opts: options}
|
||||||
m.instruments = append(m.instruments, i)
|
m.instruments[id] = i
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Float64ObservableUpDownCounter(name string, options ...metric.Float64ObservableUpDownCounterOption) (metric.Float64ObservableUpDownCounter, error) {
|
func (m *meter) Float64ObservableUpDownCounter(name string, options ...metric.Float64ObservableUpDownCounterOption) (metric.Float64ObservableUpDownCounter, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
|
||||||
return del.Float64ObservableUpDownCounter(name, options...)
|
|
||||||
}
|
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
|
if m.delegate != nil {
|
||||||
|
return m.delegate.Float64ObservableUpDownCounter(name, options...)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := metric.NewFloat64ObservableUpDownCounterConfig(options...)
|
||||||
|
id := instID{
|
||||||
|
name: name,
|
||||||
|
kind: reflect.TypeOf((*afUpDownCounter)(nil)),
|
||||||
|
description: cfg.Description(),
|
||||||
|
unit: cfg.Unit(),
|
||||||
|
}
|
||||||
|
if f, ok := m.instruments[id]; ok {
|
||||||
|
return f.(metric.Float64ObservableUpDownCounter), nil
|
||||||
|
}
|
||||||
i := &afUpDownCounter{name: name, opts: options}
|
i := &afUpDownCounter{name: name, opts: options}
|
||||||
m.instruments = append(m.instruments, i)
|
m.instruments[id] = i
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Float64ObservableGauge(name string, options ...metric.Float64ObservableGaugeOption) (metric.Float64ObservableGauge, error) {
|
func (m *meter) Float64ObservableGauge(name string, options ...metric.Float64ObservableGaugeOption) (metric.Float64ObservableGauge, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
|
||||||
return del.Float64ObservableGauge(name, options...)
|
|
||||||
}
|
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
|
if m.delegate != nil {
|
||||||
|
return m.delegate.Float64ObservableGauge(name, options...)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := metric.NewFloat64ObservableGaugeConfig(options...)
|
||||||
|
id := instID{
|
||||||
|
name: name,
|
||||||
|
kind: reflect.TypeOf((*afGauge)(nil)),
|
||||||
|
description: cfg.Description(),
|
||||||
|
unit: cfg.Unit(),
|
||||||
|
}
|
||||||
|
if f, ok := m.instruments[id]; ok {
|
||||||
|
return f.(metric.Float64ObservableGauge), nil
|
||||||
|
}
|
||||||
i := &afGauge{name: name, opts: options}
|
i := &afGauge{name: name, opts: options}
|
||||||
m.instruments = append(m.instruments, i)
|
m.instruments[id] = i
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// RegisterCallback captures the function that will be called during Collect.
|
// RegisterCallback captures the function that will be called during Collect.
|
||||||
func (m *meter) RegisterCallback(f metric.Callback, insts ...metric.Observable) (metric.Registration, error) {
|
func (m *meter) RegisterCallback(f metric.Callback, insts ...metric.Observable) (metric.Registration, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
|
||||||
insts = unwrapInstruments(insts)
|
|
||||||
return del.RegisterCallback(f, insts...)
|
|
||||||
}
|
|
||||||
|
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
|
||||||
|
if m.delegate != nil {
|
||||||
|
return m.delegate.RegisterCallback(unwrapCallback(f), unwrapInstruments(insts)...)
|
||||||
|
}
|
||||||
|
|
||||||
reg := ®istration{instruments: insts, function: f}
|
reg := ®istration{instruments: insts, function: f}
|
||||||
e := m.registry.PushBack(reg)
|
e := m.registry.PushBack(reg)
|
||||||
reg.unreg = func() error {
|
reg.unreg = func() error {
|
||||||
|
@ -307,15 +488,11 @@ func (m *meter) RegisterCallback(f metric.Callback, insts ...metric.Observable)
|
||||||
return reg, nil
|
return reg, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type wrapped interface {
|
|
||||||
unwrap() metric.Observable
|
|
||||||
}
|
|
||||||
|
|
||||||
func unwrapInstruments(instruments []metric.Observable) []metric.Observable {
|
func unwrapInstruments(instruments []metric.Observable) []metric.Observable {
|
||||||
out := make([]metric.Observable, 0, len(instruments))
|
out := make([]metric.Observable, 0, len(instruments))
|
||||||
|
|
||||||
for _, inst := range instruments {
|
for _, inst := range instruments {
|
||||||
if in, ok := inst.(wrapped); ok {
|
if in, ok := inst.(unwrapper); ok {
|
||||||
out = append(out, in.unwrap())
|
out = append(out, in.unwrap())
|
||||||
} else {
|
} else {
|
||||||
out = append(out, inst)
|
out = append(out, inst)
|
||||||
|
@ -335,9 +512,61 @@ function metric.Callback
|
||||||
unregMu sync.Mutex
|
unregMu sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *registration) setDelegate(m metric.Meter) {
|
type unwrapObs struct {
|
||||||
insts := unwrapInstruments(c.instruments)
|
embedded.Observer
|
||||||
|
obs metric.Observer
|
||||||
|
}
|
||||||
|
|
||||||
|
// unwrapFloat64Observable returns an expected metric.Float64Observable after
|
||||||
|
// unwrapping the global object.
|
||||||
|
func unwrapFloat64Observable(inst metric.Float64Observable) metric.Float64Observable {
|
||||||
|
if unwrapped, ok := inst.(unwrapper); ok {
|
||||||
|
if floatObs, ok := unwrapped.unwrap().(metric.Float64Observable); ok {
|
||||||
|
// Note: if the unwrapped object does not
|
||||||
|
// unwrap as an observable for either of the
|
||||||
|
// predicates here, it means an internal bug in
|
||||||
|
// this package. We avoid logging an error in
|
||||||
|
// this case, because the SDK has to try its
|
||||||
|
// own type conversion on the object. The SDK
|
||||||
|
// will see this and be forced to respond with
|
||||||
|
// its own error.
|
||||||
|
//
|
||||||
|
// This code uses a double-nested if statement
|
||||||
|
// to avoid creating a branch that is
|
||||||
|
// impossible to cover.
|
||||||
|
inst = floatObs
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return inst
|
||||||
|
}
|
||||||
|
|
||||||
|
// unwrapInt64Observable returns an expected metric.Int64Observable after
|
||||||
|
// unwrapping the global object.
|
||||||
|
func unwrapInt64Observable(inst metric.Int64Observable) metric.Int64Observable {
|
||||||
|
if unwrapped, ok := inst.(unwrapper); ok {
|
||||||
|
if unint, ok := unwrapped.unwrap().(metric.Int64Observable); ok {
|
||||||
|
// See the comment in unwrapFloat64Observable().
|
||||||
|
inst = unint
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return inst
|
||||||
|
}
|
||||||
|
|
||||||
|
func (uo *unwrapObs) ObserveFloat64(inst metric.Float64Observable, value float64, opts ...metric.ObserveOption) {
|
||||||
|
uo.obs.ObserveFloat64(unwrapFloat64Observable(inst), value, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (uo *unwrapObs) ObserveInt64(inst metric.Int64Observable, value int64, opts ...metric.ObserveOption) {
|
||||||
|
uo.obs.ObserveInt64(unwrapInt64Observable(inst), value, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func unwrapCallback(f metric.Callback) metric.Callback {
|
||||||
|
return func(ctx context.Context, obs metric.Observer) error {
|
||||||
|
return f(ctx, &unwrapObs{obs: obs})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *registration) setDelegate(m metric.Meter) {
|
||||||
c.unregMu.Lock()
|
c.unregMu.Lock()
|
||||||
defer c.unregMu.Unlock()
|
defer c.unregMu.Unlock()
|
||||||
|
|
||||||
|
@ -346,9 +575,10 @@ func (c *registration) setDelegate(m metric.Meter) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
reg, err := m.RegisterCallback(c.function, insts...)
|
reg, err := m.RegisterCallback(unwrapCallback(c.function), unwrapInstruments(c.instruments)...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
GetErrorHandler().Handle(err)
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
c.unreg = reg.Unregister
|
c.unreg = reg.Unregister
|
||||||
|
|
33
vendor/go.opentelemetry.io/otel/internal/global/trace.go
generated
vendored
33
vendor/go.opentelemetry.io/otel/internal/global/trace.go
generated
vendored
|
@ -25,6 +25,7 @@
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/auto/sdk"
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/codes"
|
"go.opentelemetry.io/otel/codes"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
|
@ -87,6 +88,7 @@ func (p *tracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.T
|
||||||
name: name,
|
name: name,
|
||||||
version: c.InstrumentationVersion(),
|
version: c.InstrumentationVersion(),
|
||||||
schema: c.SchemaURL(),
|
schema: c.SchemaURL(),
|
||||||
|
attrs: c.InstrumentationAttributes(),
|
||||||
}
|
}
|
||||||
|
|
||||||
if p.tracers == nil {
|
if p.tracers == nil {
|
||||||
|
@ -102,7 +104,12 @@ func (p *tracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.T
|
||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
|
|
||||||
type il struct{ name, version, schema string }
|
type il struct {
|
||||||
|
name string
|
||||||
|
version string
|
||||||
|
schema string
|
||||||
|
attrs attribute.Set
|
||||||
|
}
|
||||||
|
|
||||||
// tracer is a placeholder for a trace.Tracer.
|
// tracer is a placeholder for a trace.Tracer.
|
||||||
//
|
//
|
||||||
|
@ -139,6 +146,30 @@ func (t *tracer) Start(ctx context.Context, name string, opts ...trace.SpanStart
|
||||||
return delegate.(trace.Tracer).Start(ctx, name, opts...)
|
return delegate.(trace.Tracer).Start(ctx, name, opts...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return t.newSpan(ctx, autoInstEnabled, name, opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
// autoInstEnabled determines if the auto-instrumentation SDK span is returned
|
||||||
|
// from the tracer when not backed by a delegate and auto-instrumentation has
|
||||||
|
// attached to this process.
|
||||||
|
//
|
||||||
|
// The auto-instrumentation is expected to overwrite this value to true when it
|
||||||
|
// attaches. By default, this will point to false and mean a tracer will return
|
||||||
|
// a nonRecordingSpan by default.
|
||||||
|
var autoInstEnabled = new(bool)
|
||||||
|
|
||||||
|
func (t *tracer) newSpan(ctx context.Context, autoSpan *bool, name string, opts []trace.SpanStartOption) (context.Context, trace.Span) {
|
||||||
|
// autoInstEnabled is passed to newSpan via the autoSpan parameter. This is
|
||||||
|
// so the auto-instrumentation can define a uprobe for (*t).newSpan and be
|
||||||
|
// provided with the address of the bool autoInstEnabled points to. It
|
||||||
|
// needs to be a parameter so that pointer can be reliably determined, it
|
||||||
|
// should not be read from the global.
|
||||||
|
|
||||||
|
if *autoSpan {
|
||||||
|
tracer := sdk.TracerProvider().Tracer(t.name, t.opts...)
|
||||||
|
return tracer.Start(ctx, name, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
s := nonRecordingSpan{sc: trace.SpanContextFromContext(ctx), tracer: t}
|
s := nonRecordingSpan{sc: trace.SpanContextFromContext(ctx), tracer: t}
|
||||||
ctx = trace.ContextWithSpan(ctx, s)
|
ctx = trace.ContextWithSpan(ctx, s)
|
||||||
return ctx, s
|
return ctx, s
|
||||||
|
|
3
vendor/go.opentelemetry.io/otel/internal/rawhelpers.go
generated
vendored
3
vendor/go.opentelemetry.io/otel/internal/rawhelpers.go
generated
vendored
|
@ -20,7 +20,8 @@ func RawToBool(r uint64) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func Int64ToRaw(i int64) uint64 {
|
func Int64ToRaw(i int64) uint64 {
|
||||||
return uint64(i)
|
// Assumes original was a valid int64 (overflow not checked).
|
||||||
|
return uint64(i) // nolint: gosec
|
||||||
}
|
}
|
||||||
|
|
||||||
func RawToInt64(r uint64) int64 {
|
func RawToInt64(r uint64) int64 {
|
||||||
|
|
2
vendor/go.opentelemetry.io/otel/metric/asyncfloat64.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/metric/asyncfloat64.go
generated
vendored
|
@ -213,7 +213,7 @@ type Float64Observer interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Float64Callback is a function registered with a Meter that makes
|
// Float64Callback is a function registered with a Meter that makes
|
||||||
// observations for a Float64Observerable instrument it is registered with.
|
// observations for a Float64Observable instrument it is registered with.
|
||||||
// Calls to the Float64Observer record measurement values for the
|
// Calls to the Float64Observer record measurement values for the
|
||||||
// Float64Observable.
|
// Float64Observable.
|
||||||
//
|
//
|
||||||
|
|
2
vendor/go.opentelemetry.io/otel/metric/asyncint64.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/metric/asyncint64.go
generated
vendored
|
@ -212,7 +212,7 @@ type Int64Observer interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int64Callback is a function registered with a Meter that makes observations
|
// Int64Callback is a function registered with a Meter that makes observations
|
||||||
// for an Int64Observerable instrument it is registered with. Calls to the
|
// for an Int64Observable instrument it is registered with. Calls to the
|
||||||
// Int64Observer record measurement values for the Int64Observable.
|
// Int64Observer record measurement values for the Int64Observable.
|
||||||
//
|
//
|
||||||
// The function needs to complete in a finite amount of time and the deadline
|
// The function needs to complete in a finite amount of time and the deadline
|
||||||
|
|
2
vendor/go.opentelemetry.io/otel/metric/instrument.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/metric/instrument.go
generated
vendored
|
@ -351,7 +351,7 @@ func WithAttributeSet(attributes attribute.Set) MeasurementOption {
|
||||||
//
|
//
|
||||||
// cp := make([]attribute.KeyValue, len(attributes))
|
// cp := make([]attribute.KeyValue, len(attributes))
|
||||||
// copy(cp, attributes)
|
// copy(cp, attributes)
|
||||||
// WithAttributes(attribute.NewSet(cp...))
|
// WithAttributeSet(attribute.NewSet(cp...))
|
||||||
//
|
//
|
||||||
// [attribute.NewSet] may modify the passed attributes so this will make a copy
|
// [attribute.NewSet] may modify the passed attributes so this will make a copy
|
||||||
// of attributes before creating a set in order to ensure this function is
|
// of attributes before creating a set in order to ensure this function is
|
||||||
|
|
10
vendor/go.opentelemetry.io/otel/renovate.json
generated
vendored
10
vendor/go.opentelemetry.io/otel/renovate.json
generated
vendored
|
@ -15,10 +15,12 @@
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"matchFileNames": ["internal/tools/**"],
|
"matchPackageNames": ["google.golang.org/genproto/googleapis/**"],
|
||||||
"matchManagers": ["gomod"],
|
"groupName": "googleapis"
|
||||||
"matchDepTypes": ["indirect"],
|
},
|
||||||
"enabled": false
|
{
|
||||||
|
"matchPackageNames": ["golang.org/x/**"],
|
||||||
|
"groupName": "golang.org/x"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
4
vendor/go.opentelemetry.io/otel/sdk/instrumentation/scope.go
generated
vendored
4
vendor/go.opentelemetry.io/otel/sdk/instrumentation/scope.go
generated
vendored
|
@ -3,6 +3,8 @@
|
||||||
|
|
||||||
package instrumentation // import "go.opentelemetry.io/otel/sdk/instrumentation"
|
package instrumentation // import "go.opentelemetry.io/otel/sdk/instrumentation"
|
||||||
|
|
||||||
|
import "go.opentelemetry.io/otel/attribute"
|
||||||
|
|
||||||
// Scope represents the instrumentation scope.
|
// Scope represents the instrumentation scope.
|
||||||
type Scope struct {
|
type Scope struct {
|
||||||
// Name is the name of the instrumentation scope. This should be the
|
// Name is the name of the instrumentation scope. This should be the
|
||||||
|
@ -12,4 +14,6 @@ type Scope struct {
|
||||||
Version string
|
Version string
|
||||||
// SchemaURL of the telemetry emitted by the scope.
|
// SchemaURL of the telemetry emitted by the scope.
|
||||||
SchemaURL string
|
SchemaURL string
|
||||||
|
// Attributes of the telemetry emitted by the scope.
|
||||||
|
Attributes attribute.Set
|
||||||
}
|
}
|
||||||
|
|
79
vendor/go.opentelemetry.io/otel/sdk/metric/config.go
generated
vendored
79
vendor/go.opentelemetry.io/otel/sdk/metric/config.go
generated
vendored
|
@ -5,17 +5,22 @@
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"errors"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel"
|
||||||
|
"go.opentelemetry.io/otel/sdk/metric/exemplar"
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
)
|
)
|
||||||
|
|
||||||
// config contains configuration options for a MeterProvider.
|
// config contains configuration options for a MeterProvider.
|
||||||
type config struct {
|
type config struct {
|
||||||
res *resource.Resource
|
res *resource.Resource
|
||||||
readers []Reader
|
readers []Reader
|
||||||
views []View
|
views []View
|
||||||
|
exemplarFilter exemplar.Filter
|
||||||
}
|
}
|
||||||
|
|
||||||
// readerSignals returns a force-flush and shutdown function for a
|
// readerSignals returns a force-flush and shutdown function for a
|
||||||
|
@ -39,25 +44,13 @@ func (c config) readerSignals() (forceFlush, shutdown func(context.Context) erro
|
||||||
// value.
|
// value.
|
||||||
func unify(funcs []func(context.Context) error) func(context.Context) error {
|
func unify(funcs []func(context.Context) error) func(context.Context) error {
|
||||||
return func(ctx context.Context) error {
|
return func(ctx context.Context) error {
|
||||||
var errs []error
|
var err error
|
||||||
for _, f := range funcs {
|
for _, f := range funcs {
|
||||||
if err := f(ctx); err != nil {
|
if e := f(ctx); e != nil {
|
||||||
errs = append(errs, err)
|
err = errors.Join(err, e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return unifyErrors(errs)
|
return err
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// unifyErrors combines multiple errors into a single error.
|
|
||||||
func unifyErrors(errs []error) error {
|
|
||||||
switch len(errs) {
|
|
||||||
case 0:
|
|
||||||
return nil
|
|
||||||
case 1:
|
|
||||||
return errs[0]
|
|
||||||
default:
|
|
||||||
return fmt.Errorf("%v", errs)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,7 +68,13 @@ func unifyShutdown(funcs []func(context.Context) error) func(context.Context) er
|
||||||
|
|
||||||
// newConfig returns a config configured with options.
|
// newConfig returns a config configured with options.
|
||||||
func newConfig(options []Option) config {
|
func newConfig(options []Option) config {
|
||||||
conf := config{res: resource.Default()}
|
conf := config{
|
||||||
|
res: resource.Default(),
|
||||||
|
exemplarFilter: exemplar.TraceBasedFilter,
|
||||||
|
}
|
||||||
|
for _, o := range meterProviderOptionsFromEnv() {
|
||||||
|
conf = o.apply(conf)
|
||||||
|
}
|
||||||
for _, o := range options {
|
for _, o := range options {
|
||||||
conf = o.apply(conf)
|
conf = o.apply(conf)
|
||||||
}
|
}
|
||||||
|
@ -103,7 +102,11 @@ func (o optionFunc) apply(conf config) config {
|
||||||
// go.opentelemetry.io/otel/sdk/resource package will be used.
|
// go.opentelemetry.io/otel/sdk/resource package will be used.
|
||||||
func WithResource(res *resource.Resource) Option {
|
func WithResource(res *resource.Resource) Option {
|
||||||
return optionFunc(func(conf config) config {
|
return optionFunc(func(conf config) config {
|
||||||
conf.res = res
|
var err error
|
||||||
|
conf.res, err = resource.Merge(resource.Environment(), res)
|
||||||
|
if err != nil {
|
||||||
|
otel.Handle(err)
|
||||||
|
}
|
||||||
return conf
|
return conf
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -135,3 +138,35 @@ func WithView(views ...View) Option {
|
||||||
return cfg
|
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
|
||||||
|
}
|
||||||
|
|
70
vendor/go.opentelemetry.io/otel/sdk/metric/exemplar.go
generated
vendored
70
vendor/go.opentelemetry.io/otel/sdk/metric/exemplar.go
generated
vendored
|
@ -4,51 +4,49 @@
|
||||||
package metric // import "go.opentelemetry.io/otel/sdk/metric"
|
package metric // import "go.opentelemetry.io/otel/sdk/metric"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
|
||||||
"runtime"
|
"runtime"
|
||||||
"slices"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/sdk/metric/internal/exemplar"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/sdk/metric/internal/x"
|
"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
|
// reservoirFunc returns the appropriately configured exemplar reservoir
|
||||||
// creation func based on the passed InstrumentKind and user defined
|
// creation func based on the passed InstrumentKind and filter configuration.
|
||||||
// environment variables.
|
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].
|
||||||
//
|
//
|
||||||
// Note: This will only return non-nil values when the experimental exemplar
|
// For explicit bucket histograms with more than 1 bucket, it uses the
|
||||||
// feature is enabled and the OTEL_METRICS_EXEMPLAR_FILTER environment variable
|
// [exemplar.HistogramReservoirProvider].
|
||||||
// is not set to always_off.
|
// For exponential histograms, it uses the
|
||||||
func reservoirFunc[N int64 | float64](agg Aggregation) func() exemplar.FilteredReservoir[N] {
|
// [exemplar.FixedSizeReservoirProvider]
|
||||||
if !x.Exemplars.Enabled() {
|
// with a size of min(20, max_buckets).
|
||||||
return nil
|
// For all other aggregations, it uses the
|
||||||
}
|
// [exemplar.FixedSizeReservoirProvider]
|
||||||
// https://github.com/open-telemetry/opentelemetry-specification/blob/d4b241f451674e8f611bb589477680341006ad2b/specification/configuration/sdk-environment-variables.md#exemplar
|
// with a size equal to the number of CPUs.
|
||||||
const filterEnvKey = "OTEL_METRICS_EXEMPLAR_FILTER"
|
//
|
||||||
|
// Exemplar default reservoirs MAY change in a minor version bump. No
|
||||||
var filter exemplar.Filter
|
// guarantees are made on the shape or statistical properties of returned
|
||||||
|
// exemplars.
|
||||||
switch os.Getenv(filterEnvKey) {
|
func DefaultExemplarReservoirProviderSelector(agg Aggregation) exemplar.ReservoirProvider {
|
||||||
case "always_on":
|
|
||||||
filter = exemplar.AlwaysOnFilter
|
|
||||||
case "always_off":
|
|
||||||
return exemplar.Drop
|
|
||||||
case "trace_based":
|
|
||||||
fallthrough
|
|
||||||
default:
|
|
||||||
filter = exemplar.SampledFilter
|
|
||||||
}
|
|
||||||
|
|
||||||
// https://github.com/open-telemetry/opentelemetry-specification/blob/d4b241f451674e8f611bb589477680341006ad2b/specification/metrics/sdk.md#exemplar-defaults
|
// 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
|
// Explicit bucket histogram aggregation with more than 1 bucket will
|
||||||
// use AlignedHistogramBucketExemplarReservoir.
|
// use AlignedHistogramBucketExemplarReservoir.
|
||||||
a, ok := agg.(AggregationExplicitBucketHistogram)
|
a, ok := agg.(AggregationExplicitBucketHistogram)
|
||||||
if ok && len(a.Boundaries) > 0 {
|
if ok && len(a.Boundaries) > 0 {
|
||||||
cp := slices.Clone(a.Boundaries)
|
return exemplar.HistogramReservoirProvider(a.Boundaries)
|
||||||
return func() exemplar.FilteredReservoir[N] {
|
|
||||||
bounds := cp
|
|
||||||
return exemplar.NewFilteredReservoir[N](filter, exemplar.Histogram(bounds))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var n int
|
var n int
|
||||||
|
@ -75,7 +73,5 @@ func reservoirFunc[N int64 | float64](agg Aggregation) func() exemplar.FilteredR
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return func() exemplar.FilteredReservoir[N] {
|
return exemplar.FixedSizeReservoirProvider(n)
|
||||||
return exemplar.NewFilteredReservoir[N](filter, exemplar.FixedSize(n))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
3
vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/README.md
generated
vendored
Normal file
3
vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/README.md
generated
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# 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)
|
|
@ -3,4 +3,4 @@
|
||||||
|
|
||||||
// Package exemplar provides an implementation of the OpenTelemetry exemplar
|
// Package exemplar provides an implementation of the OpenTelemetry exemplar
|
||||||
// reservoir to be used in metric collection pipelines.
|
// reservoir to be used in metric collection pipelines.
|
||||||
package exemplar // import "go.opentelemetry.io/otel/sdk/metric/internal/exemplar"
|
package exemplar // import "go.opentelemetry.io/otel/sdk/metric/exemplar"
|
|
@ -1,7 +1,7 @@
|
||||||
// Copyright The OpenTelemetry Authors
|
// Copyright The OpenTelemetry Authors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
package exemplar // import "go.opentelemetry.io/otel/sdk/metric/internal/exemplar"
|
package exemplar // import "go.opentelemetry.io/otel/sdk/metric/exemplar"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
|
@ -1,7 +1,7 @@
|
||||||
// Copyright The OpenTelemetry Authors
|
// Copyright The OpenTelemetry Authors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
package exemplar // import "go.opentelemetry.io/otel/sdk/metric/internal/exemplar"
|
package exemplar // import "go.opentelemetry.io/otel/sdk/metric/exemplar"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
@ -16,10 +16,10 @@
|
||||||
// Reservoir in making a sampling decision.
|
// Reservoir in making a sampling decision.
|
||||||
type Filter func(context.Context) bool
|
type Filter func(context.Context) bool
|
||||||
|
|
||||||
// SampledFilter is a [Filter] that will only offer measurements
|
// TraceBasedFilter is a [Filter] that will only offer measurements
|
||||||
// if the passed context associated with the measurement contains a sampled
|
// if the passed context associated with the measurement contains a sampled
|
||||||
// [go.opentelemetry.io/otel/trace.SpanContext].
|
// [go.opentelemetry.io/otel/trace.SpanContext].
|
||||||
func SampledFilter(ctx context.Context) bool {
|
func TraceBasedFilter(ctx context.Context) bool {
|
||||||
return trace.SpanContextFromContext(ctx).IsSampled()
|
return trace.SpanContextFromContext(ctx).IsSampled()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,3 +27,8 @@ func SampledFilter(ctx context.Context) bool {
|
||||||
func AlwaysOnFilter(ctx context.Context) bool {
|
func AlwaysOnFilter(ctx context.Context) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AlwaysOffFilter is a [Filter] that never offers measurements.
|
||||||
|
func AlwaysOffFilter(ctx context.Context) bool {
|
||||||
|
return false
|
||||||
|
}
|
|
@ -1,31 +1,69 @@
|
||||||
// Copyright The OpenTelemetry Authors
|
// Copyright The OpenTelemetry Authors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
package exemplar // import "go.opentelemetry.io/otel/sdk/metric/internal/exemplar"
|
package exemplar // import "go.opentelemetry.io/otel/sdk/metric/exemplar"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"math"
|
"math"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"sync"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
// 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.
|
// rng is used to make sampling decisions.
|
||||||
//
|
//
|
||||||
// Do not use crypto/rand. There is no reason for the decrease in performance
|
// Do not use crypto/rand. There is no reason for the decrease in performance
|
||||||
// given this is not a security sensitive decision.
|
// given this is not a security sensitive decision.
|
||||||
rng = rand.New(rand.NewSource(time.Now().UnixNano()))
|
rng *rand.Rand
|
||||||
// Ensure concurrent safe accecess to rng and its underlying source.
|
}
|
||||||
rngMu sync.Mutex
|
|
||||||
)
|
|
||||||
|
|
||||||
// random returns, as a float64, a uniform pseudo-random number in the open
|
func newFixedSizeReservoir(s *storage) *FixedSizeReservoir {
|
||||||
// interval (0.0,1.0).
|
r := &FixedSizeReservoir{
|
||||||
func random() float64 {
|
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
|
// 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
|
// 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
|
// returns multiples of 2^-53, and not all floating point numbers between 0
|
||||||
|
@ -43,40 +81,25 @@ func random() float64 {
|
||||||
//
|
//
|
||||||
// There are likely many other methods to explore here as well.
|
// There are likely many other methods to explore here as well.
|
||||||
|
|
||||||
rngMu.Lock()
|
f := r.rng.Float64()
|
||||||
defer rngMu.Unlock()
|
|
||||||
|
|
||||||
f := rng.Float64()
|
|
||||||
for f == 0 {
|
for f == 0 {
|
||||||
f = rng.Float64()
|
f = r.rng.Float64()
|
||||||
}
|
}
|
||||||
return f
|
return f
|
||||||
}
|
}
|
||||||
|
|
||||||
// FixedSize returns a [Reservoir] that samples at most k exemplars. If there
|
// Offer accepts the parameters associated with a measurement. The
|
||||||
// are k or less measurements made, the Reservoir will sample each one. If
|
// parameters will be stored as an exemplar if the Reservoir decides to
|
||||||
// there are more than k, the Reservoir will then randomly sample all
|
// sample the measurement.
|
||||||
// additional measurement with a decreasing probability.
|
//
|
||||||
func FixedSize(k int) Reservoir {
|
// The passed ctx needs to contain any baggage or span that were active
|
||||||
r := &randRes{storage: newStorage(k)}
|
// when the measurement was made. This information may be used by the
|
||||||
r.reset()
|
// Reservoir in making a sampling decision.
|
||||||
return r
|
//
|
||||||
}
|
// 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
|
||||||
type randRes struct {
|
// measurement respectively.
|
||||||
*storage
|
func (r *FixedSizeReservoir) Offer(ctx context.Context, t time.Time, n Value, a []attribute.KeyValue) {
|
||||||
|
|
||||||
// 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
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *randRes) Offer(ctx context.Context, t time.Time, n Value, a []attribute.KeyValue) {
|
|
||||||
// The following algorithm is "Algorithm L" from Li, Kim-Hung (4 December
|
// The following algorithm is "Algorithm L" from Li, Kim-Hung (4 December
|
||||||
// 1994). "Reservoir-Sampling Algorithms of Time Complexity
|
// 1994). "Reservoir-Sampling Algorithms of Time Complexity
|
||||||
// O(n(1+log(N/n)))". ACM Transactions on Mathematical Software. 20 (4):
|
// O(n(1+log(N/n)))". ACM Transactions on Mathematical Software. 20 (4):
|
||||||
|
@ -123,7 +146,7 @@ func (r *randRes) Offer(ctx context.Context, t time.Time, n Value, a []attribute
|
||||||
} else {
|
} else {
|
||||||
if r.count == r.next {
|
if r.count == r.next {
|
||||||
// Overwrite a random existing measurement with the one offered.
|
// Overwrite a random existing measurement with the one offered.
|
||||||
idx := int(rng.Int63n(int64(cap(r.store))))
|
idx := int(r.rng.Int63n(int64(cap(r.store))))
|
||||||
r.store[idx] = newMeasurement(ctx, t, n, a)
|
r.store[idx] = newMeasurement(ctx, t, n, a)
|
||||||
r.advance()
|
r.advance()
|
||||||
}
|
}
|
||||||
|
@ -132,7 +155,7 @@ func (r *randRes) Offer(ctx context.Context, t time.Time, n Value, a []attribute
|
||||||
}
|
}
|
||||||
|
|
||||||
// reset resets r to the initial state.
|
// reset resets r to the initial state.
|
||||||
func (r *randRes) reset() {
|
func (r *FixedSizeReservoir) reset() {
|
||||||
// This resets the number of exemplars known.
|
// This resets the number of exemplars known.
|
||||||
r.count = 0
|
r.count = 0
|
||||||
// Random index inserts should only happen after the storage is full.
|
// Random index inserts should only happen after the storage is full.
|
||||||
|
@ -147,14 +170,14 @@ func (r *randRes) reset() {
|
||||||
// This maps the uniform random number in (0,1) to a geometric distribution
|
// This maps the uniform random number in (0,1) to a geometric distribution
|
||||||
// over the same interval. The mean of the distribution is inversely
|
// over the same interval. The mean of the distribution is inversely
|
||||||
// proportional to the storage capacity.
|
// proportional to the storage capacity.
|
||||||
r.w = math.Exp(math.Log(random()) / float64(cap(r.store)))
|
r.w = math.Exp(math.Log(r.randomFloat64()) / float64(cap(r.store)))
|
||||||
|
|
||||||
r.advance()
|
r.advance()
|
||||||
}
|
}
|
||||||
|
|
||||||
// advance updates the count at which the offered measurement will overwrite an
|
// advance updates the count at which the offered measurement will overwrite an
|
||||||
// existing exemplar.
|
// existing exemplar.
|
||||||
func (r *randRes) advance() {
|
func (r *FixedSizeReservoir) advance() {
|
||||||
// Calculate the next value in the random number series.
|
// 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
|
// The current value of r.w is based on the max of a distribution of random
|
||||||
|
@ -167,7 +190,7 @@ func (r *randRes) advance() {
|
||||||
// therefore the next r.w will be based on the same distribution (i.e.
|
// 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
|
// `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)`.
|
// computing the next random number `u` and take r.w as `w * u^(1/k)`.
|
||||||
r.w *= math.Exp(math.Log(random()) / float64(cap(r.store)))
|
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
|
// Use the new random number in the series to calculate the count of the
|
||||||
// next measurement that will be stored.
|
// next measurement that will be stored.
|
||||||
//
|
//
|
||||||
|
@ -178,10 +201,13 @@ func (r *randRes) advance() {
|
||||||
//
|
//
|
||||||
// Important to note, the new r.next will always be at least 1 more than
|
// Important to note, the new r.next will always be at least 1 more than
|
||||||
// the last r.next.
|
// the last r.next.
|
||||||
r.next += int64(math.Log(random())/math.Log(1-r.w)) + 1
|
r.next += int64(math.Log(r.randomFloat64())/math.Log(1-r.w)) + 1
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *randRes) Collect(dest *[]Exemplar) {
|
// Collect returns all the held exemplars.
|
||||||
|
//
|
||||||
|
// The Reservoir state is preserved after this call.
|
||||||
|
func (r *FixedSizeReservoir) Collect(dest *[]Exemplar) {
|
||||||
r.storage.Collect(dest)
|
r.storage.Collect(dest)
|
||||||
// Call reset here even though it will reset r.count and restart the random
|
// 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
|
// number series. This will persist any old exemplars as long as no new
|
70
vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/histogram_reservoir.go
generated
vendored
Normal file
70
vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/histogram_reservoir.go
generated
vendored
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
// 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)
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
// Copyright The OpenTelemetry Authors
|
// Copyright The OpenTelemetry Authors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
package exemplar // import "go.opentelemetry.io/otel/sdk/metric/internal/exemplar"
|
package exemplar // import "go.opentelemetry.io/otel/sdk/metric/exemplar"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
@ -30,3 +30,11 @@ type Reservoir interface {
|
||||||
// The Reservoir state is preserved after this call.
|
// The Reservoir state is preserved after this call.
|
||||||
Collect(dest *[]Exemplar)
|
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
|
|
@ -1,7 +1,7 @@
|
||||||
// Copyright The OpenTelemetry Authors
|
// Copyright The OpenTelemetry Authors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
package exemplar // import "go.opentelemetry.io/otel/sdk/metric/internal/exemplar"
|
package exemplar // import "go.opentelemetry.io/otel/sdk/metric/exemplar"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
@ -35,7 +35,7 @@ func (r *storage) Collect(dest *[]Exemplar) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
m.Exemplar(&(*dest)[n])
|
m.exemplar(&(*dest)[n])
|
||||||
n++
|
n++
|
||||||
}
|
}
|
||||||
*dest = (*dest)[:n]
|
*dest = (*dest)[:n]
|
||||||
|
@ -66,8 +66,8 @@ func newMeasurement(ctx context.Context, ts time.Time, v Value, droppedAttr []at
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Exemplar returns m as an [Exemplar].
|
// exemplar returns m as an [Exemplar].
|
||||||
func (m measurement) Exemplar(dest *Exemplar) {
|
func (m measurement) exemplar(dest *Exemplar) {
|
||||||
dest.FilteredAttributes = m.FilteredAttributes
|
dest.FilteredAttributes = m.FilteredAttributes
|
||||||
dest.Time = m.Time
|
dest.Time = m.Time
|
||||||
dest.Value = m.Value
|
dest.Value = m.Value
|
|
@ -1,7 +1,7 @@
|
||||||
// Copyright The OpenTelemetry Authors
|
// Copyright The OpenTelemetry Authors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
package exemplar // import "go.opentelemetry.io/otel/sdk/metric/internal/exemplar"
|
package exemplar // import "go.opentelemetry.io/otel/sdk/metric/exemplar"
|
||||||
|
|
||||||
import "math"
|
import "math"
|
||||||
|
|
||||||
|
@ -28,7 +28,8 @@ type Value struct {
|
||||||
func NewValue[N int64 | float64](value N) Value {
|
func NewValue[N int64 | float64](value N) Value {
|
||||||
switch v := any(value).(type) {
|
switch v := any(value).(type) {
|
||||||
case int64:
|
case int64:
|
||||||
return Value{t: Int64ValueType, val: uint64(v)}
|
// This can be later converted back to int64 (overflow not checked).
|
||||||
|
return Value{t: Int64ValueType, val: uint64(v)} // nolint:gosec
|
||||||
case float64:
|
case float64:
|
||||||
return Value{t: Float64ValueType, val: math.Float64bits(v)}
|
return Value{t: Float64ValueType, val: math.Float64bits(v)}
|
||||||
}
|
}
|
4
vendor/go.opentelemetry.io/otel/sdk/metric/exporter.go
generated
vendored
4
vendor/go.opentelemetry.io/otel/sdk/metric/exporter.go
generated
vendored
|
@ -5,14 +5,14 @@
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"errors"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/sdk/metric/metricdata"
|
"go.opentelemetry.io/otel/sdk/metric/metricdata"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ErrExporterShutdown is returned if Export or Shutdown are called after an
|
// ErrExporterShutdown is returned if Export or Shutdown are called after an
|
||||||
// Exporter has been Shutdown.
|
// Exporter has been Shutdown.
|
||||||
var ErrExporterShutdown = fmt.Errorf("exporter is shutdown")
|
var ErrExporterShutdown = errors.New("exporter is shutdown")
|
||||||
|
|
||||||
// Exporter handles the delivery of metric data to external receivers. This is
|
// Exporter handles the delivery of metric data to external receivers. This is
|
||||||
// the final component in the metric push pipeline.
|
// the final component in the metric push pipeline.
|
||||||
|
|
25
vendor/go.opentelemetry.io/otel/sdk/metric/instrument.go
generated
vendored
25
vendor/go.opentelemetry.io/otel/sdk/metric/instrument.go
generated
vendored
|
@ -16,6 +16,7 @@
|
||||||
"go.opentelemetry.io/otel/metric/embedded"
|
"go.opentelemetry.io/otel/metric/embedded"
|
||||||
"go.opentelemetry.io/otel/sdk/instrumentation"
|
"go.opentelemetry.io/otel/sdk/instrumentation"
|
||||||
"go.opentelemetry.io/otel/sdk/metric/internal/aggregate"
|
"go.opentelemetry.io/otel/sdk/metric/internal/aggregate"
|
||||||
|
"go.opentelemetry.io/otel/sdk/metric/internal/x"
|
||||||
)
|
)
|
||||||
|
|
||||||
var zeroScope instrumentation.Scope
|
var zeroScope instrumentation.Scope
|
||||||
|
@ -144,6 +145,12 @@ type Stream struct {
|
||||||
// Use NewAllowKeysFilter from "go.opentelemetry.io/otel/attribute" to
|
// Use NewAllowKeysFilter from "go.opentelemetry.io/otel/attribute" to
|
||||||
// provide an allow-list of attribute keys here.
|
// provide an allow-list of attribute keys here.
|
||||||
AttributeFilter attribute.Filter
|
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.
|
// instID are the identifying properties of a instrument.
|
||||||
|
@ -184,6 +191,7 @@ type int64Inst struct {
|
||||||
_ metric.Int64UpDownCounter = (*int64Inst)(nil)
|
_ metric.Int64UpDownCounter = (*int64Inst)(nil)
|
||||||
_ metric.Int64Histogram = (*int64Inst)(nil)
|
_ metric.Int64Histogram = (*int64Inst)(nil)
|
||||||
_ metric.Int64Gauge = (*int64Inst)(nil)
|
_ metric.Int64Gauge = (*int64Inst)(nil)
|
||||||
|
_ x.EnabledInstrument = (*int64Inst)(nil)
|
||||||
)
|
)
|
||||||
|
|
||||||
func (i *int64Inst) Add(ctx context.Context, val int64, opts ...metric.AddOption) {
|
func (i *int64Inst) Add(ctx context.Context, val int64, opts ...metric.AddOption) {
|
||||||
|
@ -196,6 +204,10 @@ func (i *int64Inst) Record(ctx context.Context, val int64, opts ...metric.Record
|
||||||
i.aggregate(ctx, val, c.Attributes())
|
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.
|
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 {
|
for _, in := range i.measures {
|
||||||
in(ctx, val, s)
|
in(ctx, val, s)
|
||||||
|
@ -216,6 +228,7 @@ type float64Inst struct {
|
||||||
_ metric.Float64UpDownCounter = (*float64Inst)(nil)
|
_ metric.Float64UpDownCounter = (*float64Inst)(nil)
|
||||||
_ metric.Float64Histogram = (*float64Inst)(nil)
|
_ metric.Float64Histogram = (*float64Inst)(nil)
|
||||||
_ metric.Float64Gauge = (*float64Inst)(nil)
|
_ metric.Float64Gauge = (*float64Inst)(nil)
|
||||||
|
_ x.EnabledInstrument = (*float64Inst)(nil)
|
||||||
)
|
)
|
||||||
|
|
||||||
func (i *float64Inst) Add(ctx context.Context, val float64, opts ...metric.AddOption) {
|
func (i *float64Inst) Add(ctx context.Context, val float64, opts ...metric.AddOption) {
|
||||||
|
@ -228,14 +241,18 @@ func (i *float64Inst) Record(ctx context.Context, val float64, opts ...metric.Re
|
||||||
i.aggregate(ctx, val, c.Attributes())
|
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) {
|
func (i *float64Inst) aggregate(ctx context.Context, val float64, s attribute.Set) {
|
||||||
for _, in := range i.measures {
|
for _, in := range i.measures {
|
||||||
in(ctx, val, s)
|
in(ctx, val, s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// observablID is a comparable unique identifier of an observable.
|
// observableID is a comparable unique identifier of an observable.
|
||||||
type observablID[N int64 | float64] struct {
|
type observableID[N int64 | float64] struct {
|
||||||
name string
|
name string
|
||||||
description string
|
description string
|
||||||
kind InstrumentKind
|
kind InstrumentKind
|
||||||
|
@ -287,7 +304,7 @@ func newInt64Observable(m *meter, kind InstrumentKind, name, desc, u string) int
|
||||||
|
|
||||||
type observable[N int64 | float64] struct {
|
type observable[N int64 | float64] struct {
|
||||||
metric.Observable
|
metric.Observable
|
||||||
observablID[N]
|
observableID[N]
|
||||||
|
|
||||||
meter *meter
|
meter *meter
|
||||||
measures measures[N]
|
measures measures[N]
|
||||||
|
@ -296,7 +313,7 @@ type observable[N int64 | float64] struct {
|
||||||
|
|
||||||
func newObservable[N int64 | float64](m *meter, kind InstrumentKind, name, desc, u string) *observable[N] {
|
func newObservable[N int64 | float64](m *meter, kind InstrumentKind, name, desc, u string) *observable[N] {
|
||||||
return &observable[N]{
|
return &observable[N]{
|
||||||
observablID: observablID[N]{
|
observableID: observableID[N]{
|
||||||
name: name,
|
name: name,
|
||||||
description: desc,
|
description: desc,
|
||||||
kind: kind,
|
kind: kind,
|
||||||
|
|
9
vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/aggregate.go
generated
vendored
9
vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/aggregate.go
generated
vendored
|
@ -8,7 +8,6 @@
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/sdk/metric/internal/exemplar"
|
|
||||||
"go.opentelemetry.io/otel/sdk/metric/metricdata"
|
"go.opentelemetry.io/otel/sdk/metric/metricdata"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -38,8 +37,8 @@ type Builder[N int64 | float64] struct {
|
||||||
// create new exemplar reservoirs for a new seen attribute set.
|
// create new exemplar reservoirs for a new seen attribute set.
|
||||||
//
|
//
|
||||||
// If this is not provided a default factory function that returns an
|
// If this is not provided a default factory function that returns an
|
||||||
// exemplar.Drop reservoir will be used.
|
// dropReservoir reservoir will be used.
|
||||||
ReservoirFunc func() exemplar.FilteredReservoir[N]
|
ReservoirFunc func(attribute.Set) FilteredExemplarReservoir[N]
|
||||||
// AggregationLimit is the cardinality limit of measurement attributes. Any
|
// AggregationLimit is the cardinality limit of measurement attributes. Any
|
||||||
// measurement for new attributes once the limit has been reached will be
|
// measurement for new attributes once the limit has been reached will be
|
||||||
// aggregated into a single aggregate for the "otel.metric.overflow"
|
// aggregated into a single aggregate for the "otel.metric.overflow"
|
||||||
|
@ -50,12 +49,12 @@ type Builder[N int64 | float64] struct {
|
||||||
AggregationLimit int
|
AggregationLimit int
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b Builder[N]) resFunc() func() exemplar.FilteredReservoir[N] {
|
func (b Builder[N]) resFunc() func(attribute.Set) FilteredExemplarReservoir[N] {
|
||||||
if b.ReservoirFunc != nil {
|
if b.ReservoirFunc != nil {
|
||||||
return b.ReservoirFunc
|
return b.ReservoirFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
return exemplar.Drop
|
return dropReservoir
|
||||||
}
|
}
|
||||||
|
|
||||||
type fltrMeasure[N int64 | float64] func(ctx context.Context, value N, fltrAttr attribute.Set, droppedAttr []attribute.KeyValue)
|
type fltrMeasure[N int64 | float64] func(ctx context.Context, value N, fltrAttr attribute.Set, droppedAttr []attribute.KeyValue)
|
||||||
|
|
27
vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/drop.go
generated
vendored
Normal file
27
vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/drop.go
generated
vendored
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
// 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]
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue