mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-28 13:52:25 -05: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
					
				
			
		
					 217 changed files with 6873 additions and 2734 deletions
				
			
		|  | @ -50,9 +50,9 @@ import ( | ||||||
| 	"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 @@ import ( | ||||||
| 	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 @@ var Start action.GTSAction = func(ctx context.Context) error { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// 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 @@ var Start action.GTSAction = func(ctx context.Context) error { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// 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 @@ var Start action.GTSAction = func(ctx context.Context) error { | ||||||
| 
 | 
 | ||||||
| 	// 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 @@ import ( | ||||||
| 	"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 @@ import ( | ||||||
| 	"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 @@ var Start action.GTSAction = func(ctx context.Context) error { | ||||||
| 	} | 	} | ||||||
| 	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 @@ var Start action.GTSAction = func(ctx context.Context) error { | ||||||
| 	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 @@ var Start action.GTSAction = func(ctx context.Context) error { | ||||||
| 		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 @@ import ( | ||||||
| 	"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 @@ const ( | ||||||
| 	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 @@ import ( | ||||||
| 
 | 
 | ||||||
| 	"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 @@ import ( | ||||||
| 
 | 
 | ||||||
| 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 @@ import ( | ||||||
| 	"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 @@ package model | ||||||
| 
 | 
 | ||||||
| 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 @@ package model | ||||||
| 
 | 
 | ||||||
| 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 @@ package model | ||||||
| 
 | 
 | ||||||
| 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 | ||||||
| 
 | 
 | ||||||
| [](https://github.com/open-telemetry/opentelemetry-go/actions?query=workflow%3Aci+branch%3Amain) | [](https://github.com/open-telemetry/opentelemetry-go/actions/workflows/ci.yml) | ||||||
| [](https://app.codecov.io/gh/open-telemetry/opentelemetry-go?branch=main) | [](https://app.codecov.io/gh/open-telemetry/opentelemetry-go?branch=main) | ||||||
| [](https://pkg.go.dev/go.opentelemetry.io/otel) | [](https://pkg.go.dev/go.opentelemetry.io/otel) | ||||||
| [](https://goreportcard.com/report/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 @@ package codes // import "go.opentelemetry.io/otel/codes" | ||||||
| 
 | 
 | ||||||
| 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 @@ target URL to which the exporter sends telemetry. | ||||||
| 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 @@ package otlptrace // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace" | ||||||
| 
 | 
 | ||||||
| // 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 @@ import ( | ||||||
| 	"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 @@ import ( | ||||||
| 	"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 @@ const ( | ||||||
| 	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 (c *collector) Collect(ch chan<- prometheus.Metric) { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	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 (c *collector) Collect(ch chan<- prometheus.Metric) { | ||||||
| 
 | 
 | ||||||
| 			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 (c *collector) Collect(ch chan<- prometheus.Metric) { | ||||||
| 
 | 
 | ||||||
| 			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 @@ var unitSuffixes = map[string]string{ | ||||||
| 
 | 
 | ||||||
| // 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 @@ import ( | ||||||
| 
 | 
 | ||||||
| // 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 @@ package global // import "go.opentelemetry.io/otel/internal/global" | ||||||
| 
 | 
 | ||||||
| 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 @@ type registration struct { | ||||||
| 	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 @@ import ( | ||||||
| 	"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 @@ package metric // import "go.opentelemetry.io/otel/sdk/metric" | ||||||
| 
 | 
 | ||||||
| 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 | ||||||
|  | 
 | ||||||
|  | [](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 @@ import ( | ||||||
| // 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 @@ package metric // import "go.opentelemetry.io/otel/sdk/metric" | ||||||
| 
 | 
 | ||||||
| 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 @@ import ( | ||||||
| 	"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 @@ var ( | ||||||
| 	_ 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 @@ var ( | ||||||
| 	_ 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 @@ import ( | ||||||
| 	"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…
	
	Add table
		Add a link
		
	
		Reference in a new issue