tracing: support OTLP/HTTP in addition to gRPC
This change adds OTLP/HTTP, specifically http/protobuf support. http/protobuf is recommended in https://github.com/open-telemetry/opentelemetry-specification/blob/v1.8.0/specification/protocol/exporter.md. However kube-apiserver and CRI-O use gRPC, kubelet may support gRPC in future. So we should support gRPC as well. Signed-off-by: Kazuyoshi Kato <katokazu@amazon.com>
This commit is contained in:
		
							
								
								
									
										84
									
								
								docs/tracing.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								docs/tracing.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | |||||||
|  | # Tracing | ||||||
|  |  | ||||||
|  | containerd supports OpenTelemetry tracing since v1.6.0. | ||||||
|  | Tracing currently targets only gRPC calls. | ||||||
|  |  | ||||||
|  | ## Sending traces from containerd deamon | ||||||
|  |  | ||||||
|  | By configuring `io.containerd.tracing.processor.v1.otlp` plugin. | ||||||
|  | containerd daemon can send traces to the specified OpenTelemetry endpoint. | ||||||
|  |  | ||||||
|  | ```toml | ||||||
|  | [plugins."io.containerd.tracing.processor.v1.otlp"] | ||||||
|  |     endpoint = "http://localhost:4318" | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | The following options are supported. | ||||||
|  |  | ||||||
|  | - `endpoint`: The address of a server that receives [OpenTelemetry Protocol](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.8.0/specification/protocol/otlp.md). | ||||||
|  | - `protocol`: OpenTelemetry supports multiple protocols. | ||||||
|  |   The default value is "http/protobuf". "grpc" is also supported. | ||||||
|  | - `insecure`: Disable transport security when the protocol is "grpc". The default is false. | ||||||
|  |   "http/protobuf" always uses the schema provided by the endpoint and | ||||||
|  |   the value of this setting being ignored. | ||||||
|  |  | ||||||
|  | The sampling ratio and the service name on the traces could be configured by | ||||||
|  | `io.containerd.internal.v1.tracing` plugin. | ||||||
|  |  | ||||||
|  | ```toml | ||||||
|  | [plugins."io.containerd.internal.v1.tracing"] | ||||||
|  |     sampling_ratio = 1.0 | ||||||
|  |     service_name = "containerd" | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ## Sending traces from containerd client | ||||||
|  |  | ||||||
|  | By configuring its underlying gRPC client, containerd's Go client can send | ||||||
|  | traces to an OpenTelemetry endpoint. | ||||||
|  |  | ||||||
|  | Note that the Go client's methods and gRPC calls are not 1:1. Single method | ||||||
|  | call would issue multiple gRPC calls. | ||||||
|  |  | ||||||
|  | ```go | ||||||
|  | func clientWithTrace() error { | ||||||
|  | 	exp, err := otlptracehttp.New(ctx, | ||||||
|  | 		otlptracehttp.WithEndpoint("localhost:4318"), | ||||||
|  | 		otlptracehttp.WithInsecure(), | ||||||
|  | 	) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	res, err := resource.New(ctx, resource.WithAttributes( | ||||||
|  | 		semconv.ServiceNameKey.String("CLIENT NAME"), | ||||||
|  | 	)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	provider := trace.NewTracerProvider( | ||||||
|  | 		trace.WithSampler(trace.AlwaysSample()), | ||||||
|  | 		trace.WithSpanProcessor(trace.NewSimpleSpanProcessor(exp)), | ||||||
|  | 		trace.WithResource(res), | ||||||
|  | 	) | ||||||
|  | 	otel.SetTracerProvider(provider) | ||||||
|  | 	otel.SetTextMapPropagator(propagation.TraceContext{}) | ||||||
|  |  | ||||||
|  |     ... | ||||||
|  |  | ||||||
|  |     dialOpts := []grpc.DialOption{ | ||||||
|  |         grpc.WithTransportCredentials(insecure.NewCredentials()), | ||||||
|  |         grpc.WithStreamInterceptor(otelgrpc.StreamClientInterceptor()), | ||||||
|  |         grpc.WithUnaryInterceptor(otelgrpc.UnaryClientInterceptor()), | ||||||
|  |     } | ||||||
|  |     client, ctx, cancel, err := commands.NewClient(context, containerd.WithDialOpts(dialOpts)) | ||||||
|  |     if err != nil { | ||||||
|  |         return err | ||||||
|  |     } | ||||||
|  |     defer cancel() | ||||||
|  |  | ||||||
|  |     span, ctx := tracing.StartSpan(ctx, "OPERATION NAME") | ||||||
|  |     defer span.End() | ||||||
|  |     ... | ||||||
|  | } | ||||||
|  | ``` | ||||||
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							| @@ -60,7 +60,9 @@ require ( | |||||||
| 	go.etcd.io/bbolt v1.3.6 | 	go.etcd.io/bbolt v1.3.6 | ||||||
| 	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0 | 	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0 | ||||||
| 	go.opentelemetry.io/otel v1.3.0 | 	go.opentelemetry.io/otel v1.3.0 | ||||||
|  | 	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0 | ||||||
| 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0 | 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0 | ||||||
|  | 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0 | ||||||
| 	go.opentelemetry.io/otel/sdk v1.3.0 | 	go.opentelemetry.io/otel/sdk v1.3.0 | ||||||
| 	go.opentelemetry.io/otel/trace v1.3.0 | 	go.opentelemetry.io/otel/trace v1.3.0 | ||||||
| 	golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect | 	golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.sum
									
									
									
									
									
								
							| @@ -692,6 +692,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0 h1:giGm8w67Ja7amYNfYMdm | |||||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= | go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= | ||||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0 h1:VQbUHoJqytHHSJ1OZodPH9tvZZSVzUHjPHpkO85sT6k= | go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0 h1:VQbUHoJqytHHSJ1OZodPH9tvZZSVzUHjPHpkO85sT6k= | ||||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= | go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= | ||||||
|  | go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0 h1:Ydage/P0fRrSPpZeCVxzjqGcI6iVmG2xb43+IR8cjqM= | ||||||
|  | go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= | ||||||
| go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= | go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= | ||||||
| go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= | go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= | ||||||
| go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= | go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= | ||||||
|   | |||||||
| @@ -642,6 +642,7 @@ go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKi | |||||||
| go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= | go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= | ||||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= | go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= | ||||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= | go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= | ||||||
|  | go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= | ||||||
| go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= | go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= | ||||||
| go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= | go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= | ||||||
| go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= | go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= | ||||||
|   | |||||||
| @@ -20,24 +20,24 @@ import ( | |||||||
| 	"context" | 	"context" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io" | 	"io" | ||||||
|  | 	"net/url" | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/containerd/containerd/log" | 	"github.com/containerd/containerd/log" | ||||||
| 	"github.com/containerd/containerd/plugin" | 	"github.com/containerd/containerd/plugin" | ||||||
| 	"go.opentelemetry.io/otel" | 	"go.opentelemetry.io/otel" | ||||||
|  | 	"go.opentelemetry.io/otel/exporters/otlp/otlptrace" | ||||||
| 	"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" | 	"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" | ||||||
|  | 	"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" | ||||||
| 	"go.opentelemetry.io/otel/propagation" | 	"go.opentelemetry.io/otel/propagation" | ||||||
| 	"go.opentelemetry.io/otel/sdk/resource" | 	"go.opentelemetry.io/otel/sdk/resource" | ||||||
| 	sdktrace "go.opentelemetry.io/otel/sdk/trace" | 	sdktrace "go.opentelemetry.io/otel/sdk/trace" | ||||||
| 	semconv "go.opentelemetry.io/otel/semconv/v1.4.0" | 	semconv "go.opentelemetry.io/otel/semconv/v1.4.0" | ||||||
| 	"google.golang.org/grpc" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| const exporterPlugin = "otlp" | const exporterPlugin = "otlp" | ||||||
|  |  | ||||||
| func init() { | func init() { | ||||||
| 	const timeout = 5 * time.Second |  | ||||||
|  |  | ||||||
| 	plugin.Register(&plugin.Registration{ | 	plugin.Register(&plugin.Registration{ | ||||||
| 		ID:     exporterPlugin, | 		ID:     exporterPlugin, | ||||||
| 		Type:   plugin.TracingProcessorPlugin, | 		Type:   plugin.TracingProcessorPlugin, | ||||||
| @@ -45,28 +45,9 @@ func init() { | |||||||
| 		InitFn: func(ic *plugin.InitContext) (interface{}, error) { | 		InitFn: func(ic *plugin.InitContext) (interface{}, error) { | ||||||
| 			cfg := ic.Config.(*OTLPConfig) | 			cfg := ic.Config.(*OTLPConfig) | ||||||
| 			if cfg.Endpoint == "" { | 			if cfg.Endpoint == "" { | ||||||
| 				return nil, fmt.Errorf("otlp endpoint not set: %w", plugin.ErrSkipPlugin) | 				return nil, fmt.Errorf("no OpenTelemetry endpoint: %w", plugin.ErrSkipPlugin) | ||||||
| 			} | 			} | ||||||
|  | 			return newExporter(ic.Context, cfg) | ||||||
| 			opts := []otlptracegrpc.Option{ |  | ||||||
| 				otlptracegrpc.WithEndpoint(cfg.Endpoint), |  | ||||||
| 				otlptracegrpc.WithDialOption( |  | ||||||
| 					grpc.WithBlock(), |  | ||||||
| 					grpc.WithReturnConnectionError(), |  | ||||||
| 				), |  | ||||||
| 			} |  | ||||||
| 			if cfg.Insecure { |  | ||||||
| 				opts = append(opts, otlptracegrpc.WithInsecure()) |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			ctx, cancel := context.WithTimeout(ic.Context, timeout) |  | ||||||
| 			defer cancel() |  | ||||||
|  |  | ||||||
| 			exp, err := otlptracegrpc.New(ctx, opts...) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return nil, fmt.Errorf("failed to create otlp exporter: %w", err) |  | ||||||
| 			} |  | ||||||
| 			return sdktrace.NewBatchSpanProcessor(exp), nil |  | ||||||
| 		}, | 		}, | ||||||
| 	}) | 	}) | ||||||
| 	plugin.Register(&plugin.Registration{ | 	plugin.Register(&plugin.Registration{ | ||||||
| @@ -83,6 +64,7 @@ func init() { | |||||||
| // OTLPConfig holds the configurations for the built-in otlp span processor | // OTLPConfig holds the configurations for the built-in otlp span processor | ||||||
| type OTLPConfig struct { | type OTLPConfig struct { | ||||||
| 	Endpoint string `toml:"endpoint"` | 	Endpoint string `toml:"endpoint"` | ||||||
|  | 	Protocol string `toml:"protocol"` | ||||||
| 	Insecure bool   `toml:"insecure"` | 	Insecure bool   `toml:"insecure"` | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -100,8 +82,46 @@ func (c *closer) Close() error { | |||||||
| 	return c.close() | 	return c.close() | ||||||
| } | } | ||||||
|  |  | ||||||
| // InitOpenTelemetry reads config and initializes otel middleware, sets the exporter | // newExporter creates an exporter based on the given configuration. | ||||||
| // propagator and global tracer provider | // | ||||||
|  | // The default protocol is http/protobuf since it is recommended by | ||||||
|  | // https://github.com/open-telemetry/opentelemetry-specification/blob/v1.8.0/specification/protocol/exporter.md#specify-protocol. | ||||||
|  | func newExporter(ctx context.Context, cfg *OTLPConfig) (*otlptrace.Exporter, error) { | ||||||
|  | 	const timeout = 5 * time.Second | ||||||
|  |  | ||||||
|  | 	ctx, cancel := context.WithTimeout(ctx, timeout) | ||||||
|  | 	defer cancel() | ||||||
|  |  | ||||||
|  | 	if cfg.Protocol == "http/protobuf" || cfg.Protocol == "" { | ||||||
|  | 		u, err := url.Parse(cfg.Endpoint) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, fmt.Errorf("OpenTelemetry endpoint %q is invalid: %w", cfg.Endpoint, err) | ||||||
|  | 		} | ||||||
|  | 		opts := []otlptracehttp.Option{ | ||||||
|  | 			otlptracehttp.WithEndpoint(u.Host), | ||||||
|  | 		} | ||||||
|  | 		if u.Scheme == "http" { | ||||||
|  | 			opts = append(opts, otlptracehttp.WithInsecure()) | ||||||
|  | 		} | ||||||
|  | 		return otlptracehttp.New(ctx, opts...) | ||||||
|  | 	} else if cfg.Protocol == "grpc" { | ||||||
|  | 		opts := []otlptracegrpc.Option{ | ||||||
|  | 			otlptracegrpc.WithEndpoint(cfg.Endpoint), | ||||||
|  | 		} | ||||||
|  | 		if cfg.Insecure { | ||||||
|  | 			opts = append(opts, otlptracegrpc.WithInsecure()) | ||||||
|  | 		} | ||||||
|  | 		return otlptracegrpc.New(ctx, opts...) | ||||||
|  | 	} else { | ||||||
|  | 		// Other protocols such as "http/json" are not supported. | ||||||
|  | 		return nil, fmt.Errorf("OpenTelemetry protocol %q is not supported", cfg.Protocol) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // newTracer configures protocol-agonostic tracing settings such as | ||||||
|  | // its sampling ratio and returns io.Closer. | ||||||
|  | // | ||||||
|  | // Note that this function sets process-wide tracing configuration. | ||||||
| func newTracer(ic *plugin.InitContext) (io.Closer, error) { | func newTracer(ic *plugin.InitContext) (io.Closer, error) { | ||||||
| 	ctx := ic.Context | 	ctx := ic.Context | ||||||
| 	config := ic.Config.(*TraceConfig) | 	config := ic.Config.(*TraceConfig) | ||||||
| @@ -130,7 +150,7 @@ func newTracer(ic *plugin.InitContext) (io.Closer, error) { | |||||||
| 	for id, pctx := range ls { | 	for id, pctx := range ls { | ||||||
| 		p, err := pctx.Instance() | 		p, err := pctx.Instance() | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			log.G(ctx).WithError(err).Errorf("Failed to init tracing processor %q", id) | 			log.G(ctx).WithError(err).Errorf("failed to initialize a tracing processor %q", id) | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
| 		proc := p.(sdktrace.SpanProcessor) | 		proc := p.(sdktrace.SpanProcessor) | ||||||
|   | |||||||
							
								
								
									
										201
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/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. | ||||||
							
								
								
									
										324
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/client.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										324
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/client.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,324 @@ | |||||||
|  | // Copyright The OpenTelemetry 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. | ||||||
|  |  | ||||||
|  | package otlptracehttp // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"compress/gzip" | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | 	"io" | ||||||
|  | 	"io/ioutil" | ||||||
|  | 	"net" | ||||||
|  | 	"net/http" | ||||||
|  | 	"net/url" | ||||||
|  | 	"path" | ||||||
|  | 	"strconv" | ||||||
|  | 	"strings" | ||||||
|  | 	"sync" | ||||||
|  | 	"time" | ||||||
|  |  | ||||||
|  | 	"google.golang.org/protobuf/proto" | ||||||
|  |  | ||||||
|  | 	"go.opentelemetry.io/otel/exporters/otlp/internal/retry" | ||||||
|  | 	"go.opentelemetry.io/otel/exporters/otlp/otlptrace" | ||||||
|  | 	"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig" | ||||||
|  | 	coltracepb "go.opentelemetry.io/proto/otlp/collector/trace/v1" | ||||||
|  | 	tracepb "go.opentelemetry.io/proto/otlp/trace/v1" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | const contentTypeProto = "application/x-protobuf" | ||||||
|  |  | ||||||
|  | var gzPool = sync.Pool{ | ||||||
|  | 	New: func() interface{} { | ||||||
|  | 		w := gzip.NewWriter(ioutil.Discard) | ||||||
|  | 		return w | ||||||
|  | 	}, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Keep it in sync with golang's DefaultTransport from net/http! We | ||||||
|  | // have our own copy to avoid handling a situation where the | ||||||
|  | // DefaultTransport is overwritten with some different implementation | ||||||
|  | // of http.RoundTripper or it's modified by other package. | ||||||
|  | var ourTransport = &http.Transport{ | ||||||
|  | 	Proxy: http.ProxyFromEnvironment, | ||||||
|  | 	DialContext: (&net.Dialer{ | ||||||
|  | 		Timeout:   30 * time.Second, | ||||||
|  | 		KeepAlive: 30 * time.Second, | ||||||
|  | 	}).DialContext, | ||||||
|  | 	ForceAttemptHTTP2:     true, | ||||||
|  | 	MaxIdleConns:          100, | ||||||
|  | 	IdleConnTimeout:       90 * time.Second, | ||||||
|  | 	TLSHandshakeTimeout:   10 * time.Second, | ||||||
|  | 	ExpectContinueTimeout: 1 * time.Second, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type client struct { | ||||||
|  | 	name        string | ||||||
|  | 	cfg         otlpconfig.SignalConfig | ||||||
|  | 	generalCfg  otlpconfig.Config | ||||||
|  | 	requestFunc retry.RequestFunc | ||||||
|  | 	client      *http.Client | ||||||
|  | 	stopCh      chan struct{} | ||||||
|  | 	stopOnce    sync.Once | ||||||
|  | } | ||||||
|  |  | ||||||
|  | var _ otlptrace.Client = (*client)(nil) | ||||||
|  |  | ||||||
|  | // NewClient creates a new HTTP trace client. | ||||||
|  | func NewClient(opts ...Option) otlptrace.Client { | ||||||
|  | 	cfg := otlpconfig.NewDefaultConfig() | ||||||
|  | 	otlpconfig.ApplyHTTPEnvConfigs(&cfg) | ||||||
|  | 	for _, opt := range opts { | ||||||
|  | 		opt.applyHTTPOption(&cfg) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for pathPtr, defaultPath := range map[*string]string{ | ||||||
|  | 		&cfg.Traces.URLPath: otlpconfig.DefaultTracesPath, | ||||||
|  | 	} { | ||||||
|  | 		tmp := strings.TrimSpace(*pathPtr) | ||||||
|  | 		if tmp == "" { | ||||||
|  | 			tmp = defaultPath | ||||||
|  | 		} else { | ||||||
|  | 			tmp = path.Clean(tmp) | ||||||
|  | 			if !path.IsAbs(tmp) { | ||||||
|  | 				tmp = fmt.Sprintf("/%s", tmp) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		*pathPtr = tmp | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	httpClient := &http.Client{ | ||||||
|  | 		Transport: ourTransport, | ||||||
|  | 		Timeout:   cfg.Traces.Timeout, | ||||||
|  | 	} | ||||||
|  | 	if cfg.Traces.TLSCfg != nil { | ||||||
|  | 		transport := ourTransport.Clone() | ||||||
|  | 		transport.TLSClientConfig = cfg.Traces.TLSCfg | ||||||
|  | 		httpClient.Transport = transport | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	stopCh := make(chan struct{}) | ||||||
|  | 	return &client{ | ||||||
|  | 		name:        "traces", | ||||||
|  | 		cfg:         cfg.Traces, | ||||||
|  | 		generalCfg:  cfg, | ||||||
|  | 		requestFunc: cfg.RetryConfig.RequestFunc(evaluate), | ||||||
|  | 		stopCh:      stopCh, | ||||||
|  | 		client:      httpClient, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Start does nothing in a HTTP client | ||||||
|  | func (d *client) Start(ctx context.Context) error { | ||||||
|  | 	// nothing to do | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		return ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Stop shuts down the client and interrupt any in-flight request. | ||||||
|  | func (d *client) Stop(ctx context.Context) error { | ||||||
|  | 	d.stopOnce.Do(func() { | ||||||
|  | 		close(d.stopCh) | ||||||
|  | 	}) | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		return ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // UploadTraces sends a batch of spans to the collector. | ||||||
|  | func (d *client) UploadTraces(ctx context.Context, protoSpans []*tracepb.ResourceSpans) error { | ||||||
|  | 	pbRequest := &coltracepb.ExportTraceServiceRequest{ | ||||||
|  | 		ResourceSpans: protoSpans, | ||||||
|  | 	} | ||||||
|  | 	rawRequest, err := proto.Marshal(pbRequest) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	ctx, cancel := d.contextWithStop(ctx) | ||||||
|  | 	defer cancel() | ||||||
|  |  | ||||||
|  | 	request, err := d.newRequest(rawRequest) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return d.requestFunc(ctx, func(ctx context.Context) error { | ||||||
|  | 		select { | ||||||
|  | 		case <-ctx.Done(): | ||||||
|  | 			return ctx.Err() | ||||||
|  | 		default: | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		request.reset(ctx) | ||||||
|  | 		resp, err := d.client.Do(request.Request) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		var rErr error | ||||||
|  | 		switch resp.StatusCode { | ||||||
|  | 		case http.StatusOK: | ||||||
|  | 			// Success, do not retry. | ||||||
|  | 		case http.StatusTooManyRequests, | ||||||
|  | 			http.StatusServiceUnavailable: | ||||||
|  | 			// Retry-able failure. | ||||||
|  | 			rErr = newResponseError(resp.Header) | ||||||
|  |  | ||||||
|  | 			// Going to retry, drain the body to reuse the connection. | ||||||
|  | 			if _, err := io.Copy(ioutil.Discard, resp.Body); err != nil { | ||||||
|  | 				_ = resp.Body.Close() | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 		default: | ||||||
|  | 			rErr = fmt.Errorf("failed to send %s to %s: %s", d.name, request.URL, resp.Status) | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if err := resp.Body.Close(); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		return rErr | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (d *client) newRequest(body []byte) (request, error) { | ||||||
|  | 	u := url.URL{Scheme: d.getScheme(), Host: d.cfg.Endpoint, Path: d.cfg.URLPath} | ||||||
|  | 	r, err := http.NewRequest(http.MethodPost, u.String(), nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return request{Request: r}, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for k, v := range d.cfg.Headers { | ||||||
|  | 		r.Header.Set(k, v) | ||||||
|  | 	} | ||||||
|  | 	r.Header.Set("Content-Type", contentTypeProto) | ||||||
|  |  | ||||||
|  | 	req := request{Request: r} | ||||||
|  | 	switch Compression(d.cfg.Compression) { | ||||||
|  | 	case NoCompression: | ||||||
|  | 		r.ContentLength = (int64)(len(body)) | ||||||
|  | 		req.bodyReader = bodyReader(body) | ||||||
|  | 	case GzipCompression: | ||||||
|  | 		// Ensure the content length is not used. | ||||||
|  | 		r.ContentLength = -1 | ||||||
|  | 		r.Header.Set("Content-Encoding", "gzip") | ||||||
|  |  | ||||||
|  | 		gz := gzPool.Get().(*gzip.Writer) | ||||||
|  | 		defer gzPool.Put(gz) | ||||||
|  |  | ||||||
|  | 		var b bytes.Buffer | ||||||
|  | 		gz.Reset(&b) | ||||||
|  |  | ||||||
|  | 		if _, err := gz.Write(body); err != nil { | ||||||
|  | 			return req, err | ||||||
|  | 		} | ||||||
|  | 		// Close needs to be called to ensure body if fully written. | ||||||
|  | 		if err := gz.Close(); err != nil { | ||||||
|  | 			return req, err | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		req.bodyReader = bodyReader(b.Bytes()) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return req, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // bodyReader returns a closure returning a new reader for buf. | ||||||
|  | func bodyReader(buf []byte) func() io.ReadCloser { | ||||||
|  | 	return func() io.ReadCloser { | ||||||
|  | 		return ioutil.NopCloser(bytes.NewReader(buf)) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // request wraps an http.Request with a resettable body reader. | ||||||
|  | type request struct { | ||||||
|  | 	*http.Request | ||||||
|  |  | ||||||
|  | 	// bodyReader allows the same body to be used for multiple requests. | ||||||
|  | 	bodyReader func() io.ReadCloser | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // reset reinitializes the request Body and uses ctx for the request. | ||||||
|  | func (r *request) reset(ctx context.Context) { | ||||||
|  | 	r.Body = r.bodyReader() | ||||||
|  | 	r.Request = r.Request.WithContext(ctx) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // retryableError represents a request failure that can be retried. | ||||||
|  | type retryableError struct { | ||||||
|  | 	throttle int64 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // newResponseError returns a retryableError and will extract any explicit | ||||||
|  | // throttle delay contained in headers. | ||||||
|  | func newResponseError(header http.Header) error { | ||||||
|  | 	var rErr retryableError | ||||||
|  | 	if s, ok := header["Retry-After"]; ok { | ||||||
|  | 		if t, err := strconv.ParseInt(s[0], 10, 64); err == nil { | ||||||
|  | 			rErr.throttle = t | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return rErr | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e retryableError) Error() string { | ||||||
|  | 	return "retry-able request failure" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // evaluate returns if err is retry-able. If it is and it includes an explicit | ||||||
|  | // throttling delay, that delay is also returned. | ||||||
|  | func evaluate(err error) (bool, time.Duration) { | ||||||
|  | 	if err == nil { | ||||||
|  | 		return false, 0 | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	rErr, ok := err.(retryableError) | ||||||
|  | 	if !ok { | ||||||
|  | 		return false, 0 | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return true, time.Duration(rErr.throttle) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (d *client) getScheme() string { | ||||||
|  | 	if d.cfg.Insecure { | ||||||
|  | 		return "http" | ||||||
|  | 	} | ||||||
|  | 	return "https" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (d *client) contextWithStop(ctx context.Context) (context.Context, context.CancelFunc) { | ||||||
|  | 	// Unify the parent context Done signal with the client's stop | ||||||
|  | 	// channel. | ||||||
|  | 	ctx, cancel := context.WithCancel(ctx) | ||||||
|  | 	go func(ctx context.Context, cancel context.CancelFunc) { | ||||||
|  | 		select { | ||||||
|  | 		case <-ctx.Done(): | ||||||
|  | 			// Nothing to do, either cancelled or deadline | ||||||
|  | 			// happened. | ||||||
|  | 		case <-d.stopCh: | ||||||
|  | 			cancel() | ||||||
|  | 		} | ||||||
|  | 	}(ctx, cancel) | ||||||
|  | 	return ctx, cancel | ||||||
|  | } | ||||||
							
								
								
									
										19
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | // Copyright The OpenTelemetry 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. | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | Package otlptracehttp a client that sends traces to the collector using HTTP | ||||||
|  | with binary protobuf payloads. | ||||||
|  | */ | ||||||
|  | package otlptracehttp // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" | ||||||
							
								
								
									
										31
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/exporter.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/exporter.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | // Copyright The OpenTelemetry 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. | ||||||
|  |  | ||||||
|  | package otlptracehttp // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  |  | ||||||
|  | 	"go.opentelemetry.io/otel/exporters/otlp/otlptrace" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // New constructs a new Exporter and starts it. | ||||||
|  | func New(ctx context.Context, opts ...Option) (*otlptrace.Exporter, error) { | ||||||
|  | 	return otlptrace.New(ctx, NewClient(opts...)) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // NewUnstarted constructs a new Exporter and does not start it. | ||||||
|  | func NewUnstarted(opts ...Option) *otlptrace.Exporter { | ||||||
|  | 	return otlptrace.NewUnstarted(NewClient(opts...)) | ||||||
|  | } | ||||||
							
								
								
									
										80
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | |||||||
|  | module go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp | ||||||
|  |  | ||||||
|  | go 1.16 | ||||||
|  |  | ||||||
|  | require ( | ||||||
|  | 	github.com/stretchr/testify v1.7.0 | ||||||
|  | 	go.opentelemetry.io/otel v1.3.0 | ||||||
|  | 	go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 | ||||||
|  | 	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0 | ||||||
|  | 	go.opentelemetry.io/otel/sdk v1.3.0 | ||||||
|  | 	go.opentelemetry.io/otel/trace v1.3.0 | ||||||
|  | 	go.opentelemetry.io/proto/otlp v0.11.0 | ||||||
|  | 	google.golang.org/protobuf v1.27.1 | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/exporters/otlp/otlptrace => ../ | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel => ../../../.. | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/bridge/opencensus => ../../../../bridge/opencensus | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/bridge/opentracing => ../../../../bridge/opentracing | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/example/jaeger => ../../../../example/jaeger | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/example/namedtracer => ../../../../example/namedtracer | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/example/opencensus => ../../../../example/opencensus | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/example/otel-collector => ../../../../example/otel-collector | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/example/passthrough => ../../../../example/passthrough | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/example/prom-collector => ../../../../example/prom-collector | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/example/prometheus => ../../../../example/prometheus | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/example/zipkin => ../../../../example/zipkin | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/exporters/prometheus => ../../../prometheus | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc => ../otlptracegrpc | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp => ./ | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/exporters/jaeger => ../../../jaeger | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/exporters/zipkin => ../../../zipkin | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/internal/tools => ../../../../internal/tools | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/metric => ../../../../metric | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/sdk => ../../../../sdk | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/sdk/export/metric => ../../../../sdk/export/metric | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/sdk/metric => ../../../../sdk/metric | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/trace => ../../../../trace | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/internal/metric => ../../../../internal/metric | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric => ../../otlpmetric | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc => ../../otlpmetric/otlpmetricgrpc | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/exporters/stdout/stdoutmetric => ../../../stdout/stdoutmetric | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/exporters/stdout/stdouttrace => ../../../stdout/stdouttrace | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp => ../../otlpmetric/otlpmetrichttp | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../../../bridge/opencensus/test | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/example/fib => ../../../../example/fib | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/schema => ../../../../schema | ||||||
|  |  | ||||||
|  | replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../internal/retry | ||||||
							
								
								
									
										138
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/go.sum
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/go.sum
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,138 @@ | |||||||
|  | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= | ||||||
|  | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= | ||||||
|  | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | ||||||
|  | github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= | ||||||
|  | github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo= | ||||||
|  | github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= | ||||||
|  | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | ||||||
|  | github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= | ||||||
|  | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= | ||||||
|  | github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= | ||||||
|  | github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= | ||||||
|  | github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= | ||||||
|  | github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= | ||||||
|  | github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= | ||||||
|  | github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= | ||||||
|  | github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= | ||||||
|  | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||||
|  | github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= | ||||||
|  | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= | ||||||
|  | github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= | ||||||
|  | github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= | ||||||
|  | github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= | ||||||
|  | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= | ||||||
|  | github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= | ||||||
|  | github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= | ||||||
|  | github.com/go-logr/logr v1.2.1 h1:DX7uPQ4WgAWfoh+NGGlbJQswnYIVvz0SRlLS3rPZQDA= | ||||||
|  | github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= | ||||||
|  | github.com/go-logr/stdr v1.2.0 h1:j4LrlVXgrbIWO83mmQUnK0Hi+YnbD+vzrE1z/EphbFE= | ||||||
|  | github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= | ||||||
|  | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= | ||||||
|  | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= | ||||||
|  | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||||
|  | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||||
|  | github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= | ||||||
|  | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= | ||||||
|  | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= | ||||||
|  | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= | ||||||
|  | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= | ||||||
|  | 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.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | ||||||
|  | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | ||||||
|  | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= | ||||||
|  | github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= | ||||||
|  | github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= | ||||||
|  | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= | ||||||
|  | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | ||||||
|  | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | ||||||
|  | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||||
|  | github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||||
|  | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||||
|  | github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= | ||||||
|  | github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||||
|  | github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||||
|  | github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= | ||||||
|  | github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= | ||||||
|  | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | ||||||
|  | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||||
|  | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= | ||||||
|  | github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= | ||||||
|  | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||||
|  | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= | ||||||
|  | github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= | ||||||
|  | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||||
|  | go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= | ||||||
|  | go.opentelemetry.io/proto/otlp v0.11.0 h1:cLDgIBTf4lLOlztkhzAEdQsJ4Lj+i5Wc9k6Nn0K1VyU= | ||||||
|  | go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= | ||||||
|  | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||||
|  | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||||
|  | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | ||||||
|  | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= | ||||||
|  | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= | ||||||
|  | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= | ||||||
|  | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||||
|  | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||||
|  | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||||
|  | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||||
|  | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||||
|  | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||||
|  | golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= | ||||||
|  | golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= | ||||||
|  | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||||
|  | golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||||
|  | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
|  | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
|  | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
|  | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
|  | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||||
|  | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||||
|  | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
|  | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
|  | golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7 h1:iGu644GcxtEcrInvDsQRCwJjtCIOlT2V7IRt6ah2Whw= | ||||||
|  | golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
|  | golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= | ||||||
|  | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||||
|  | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||||
|  | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= | ||||||
|  | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | ||||||
|  | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | ||||||
|  | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
|  | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= | ||||||
|  | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
|  | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= | ||||||
|  | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | ||||||
|  | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= | ||||||
|  | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= | ||||||
|  | google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= | ||||||
|  | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= | ||||||
|  | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= | ||||||
|  | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= | ||||||
|  | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= | ||||||
|  | google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= | ||||||
|  | google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= | ||||||
|  | google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= | ||||||
|  | google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= | ||||||
|  | google.golang.org/grpc v1.42.0 h1:XT2/MFpuPFsEX2fWh3YQtHkZ+WYZFQRfaUgLZYj/p6A= | ||||||
|  | google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= | ||||||
|  | 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-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= | ||||||
|  | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= | ||||||
|  | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= | ||||||
|  | google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= | ||||||
|  | google.golang.org/protobuf v1.23.0/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.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= | ||||||
|  | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= | ||||||
|  | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= | ||||||
|  | google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= | ||||||
|  | google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= | ||||||
|  | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= | ||||||
|  | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||||
|  | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||||
|  | gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||||
|  | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= | ||||||
|  | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||||
|  | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||||
|  | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||||
							
								
								
									
										108
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/options.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/options.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,108 @@ | |||||||
|  | // Copyright The OpenTelemetry 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. | ||||||
|  |  | ||||||
|  | package otlptracehttp // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"crypto/tls" | ||||||
|  | 	"time" | ||||||
|  |  | ||||||
|  | 	"go.opentelemetry.io/otel/exporters/otlp/internal/retry" | ||||||
|  | 	"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // Compression describes the compression used for payloads sent to the | ||||||
|  | // collector. | ||||||
|  | type Compression otlpconfig.Compression | ||||||
|  |  | ||||||
|  | const ( | ||||||
|  | 	// NoCompression tells the driver to send payloads without | ||||||
|  | 	// compression. | ||||||
|  | 	NoCompression = Compression(otlpconfig.NoCompression) | ||||||
|  | 	// GzipCompression tells the driver to send payloads after | ||||||
|  | 	// compressing them with gzip. | ||||||
|  | 	GzipCompression = Compression(otlpconfig.GzipCompression) | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // Option applies an option to the HTTP client. | ||||||
|  | type Option interface { | ||||||
|  | 	applyHTTPOption(*otlpconfig.Config) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // RetryConfig defines configuration for retrying batches in case of export | ||||||
|  | // failure using an exponential backoff. | ||||||
|  | type RetryConfig retry.Config | ||||||
|  |  | ||||||
|  | type wrappedOption struct { | ||||||
|  | 	otlpconfig.HTTPOption | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (w wrappedOption) applyHTTPOption(cfg *otlpconfig.Config) { | ||||||
|  | 	w.ApplyHTTPOption(cfg) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // WithEndpoint allows one to set the address of the collector | ||||||
|  | // endpoint that the driver will use to send spans. If | ||||||
|  | // unset, it will instead try to use | ||||||
|  | // the default endpoint (localhost:4317). Note that the endpoint | ||||||
|  | // must not contain any URL path. | ||||||
|  | func WithEndpoint(endpoint string) Option { | ||||||
|  | 	return wrappedOption{otlpconfig.WithEndpoint(endpoint)} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // WithCompression tells the driver to compress the sent data. | ||||||
|  | func WithCompression(compression Compression) Option { | ||||||
|  | 	return wrappedOption{otlpconfig.WithCompression(otlpconfig.Compression(compression))} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // WithURLPath allows one to override the default URL path used | ||||||
|  | // for sending traces. If unset, default ("/v1/traces") will be used. | ||||||
|  | func WithURLPath(urlPath string) Option { | ||||||
|  | 	return wrappedOption{otlpconfig.WithURLPath(urlPath)} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // WithTLSClientConfig can be used to set up a custom TLS | ||||||
|  | // configuration for the client used to send payloads to the | ||||||
|  | // collector. Use it if you want to use a custom certificate. | ||||||
|  | func WithTLSClientConfig(tlsCfg *tls.Config) Option { | ||||||
|  | 	return wrappedOption{otlpconfig.WithTLSClientConfig(tlsCfg)} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // WithInsecure tells the driver to connect to the collector using the | ||||||
|  | // HTTP scheme, instead of HTTPS. | ||||||
|  | func WithInsecure() Option { | ||||||
|  | 	return wrappedOption{otlpconfig.WithInsecure()} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // WithHeaders allows one to tell the driver to send additional HTTP | ||||||
|  | // headers with the payloads. Specifying headers like Content-Length, | ||||||
|  | // Content-Encoding and Content-Type may result in a broken driver. | ||||||
|  | func WithHeaders(headers map[string]string) Option { | ||||||
|  | 	return wrappedOption{otlpconfig.WithHeaders(headers)} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // WithTimeout tells the driver the max waiting time for the backend to process | ||||||
|  | // each spans batch.  If unset, the default will be 10 seconds. | ||||||
|  | func WithTimeout(duration time.Duration) Option { | ||||||
|  | 	return wrappedOption{otlpconfig.WithTimeout(duration)} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // WithRetry configures the retry policy for transient errors that may occurs | ||||||
|  | // when exporting traces. An exponential back-off algorithm is used to ensure | ||||||
|  | // endpoints are not overwhelmed with retries. If unset, the default retry | ||||||
|  | // policy will retry after 5 seconds and increase exponentially after each | ||||||
|  | // error for a total of 1 minute. | ||||||
|  | func WithRetry(rc RetryConfig) Option { | ||||||
|  | 	return wrappedOption{otlpconfig.WithRetry(retry.Config(rc))} | ||||||
|  | } | ||||||
							
								
								
									
										4
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							| @@ -399,12 +399,16 @@ go.opentelemetry.io/otel/semconv/v1.7.0 | |||||||
| # go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 | # go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 | ||||||
| go.opentelemetry.io/otel/exporters/otlp/internal/retry | go.opentelemetry.io/otel/exporters/otlp/internal/retry | ||||||
| # go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0 | # go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0 | ||||||
|  | ## explicit | ||||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace | go.opentelemetry.io/otel/exporters/otlp/otlptrace | ||||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig | go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig | ||||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform | go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform | ||||||
| # go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0 | # go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0 | ||||||
| ## explicit | ## explicit | ||||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc | go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc | ||||||
|  | # go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0 | ||||||
|  | ## explicit | ||||||
|  | go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp | ||||||
| # go.opentelemetry.io/otel/sdk v1.3.0 | # go.opentelemetry.io/otel/sdk v1.3.0 | ||||||
| ## explicit | ## explicit | ||||||
| go.opentelemetry.io/otel/sdk/instrumentation | go.opentelemetry.io/otel/sdk/instrumentation | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Kazuyoshi Kato
					Kazuyoshi Kato