From 81567df634012aca193458da3bd037fc3427d50c Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Mon, 27 Sep 2021 10:54:22 +0200 Subject: [PATCH 01/60] opentelemetry: create a new module --- caddyconfig/httpcaddyfile/directives.go | 2 + .../caddyfile_adapt/opentelemetry.txt | 35 +++ go.mod | 6 + go.sum | 23 +- modules/caddyhttp/opentelemetry/README.md | 59 +++++ modules/caddyhttp/opentelemetry/module.go | 123 +++++++++ .../caddyhttp/opentelemetry/module_test.go | 237 ++++++++++++++++++ modules/caddyhttp/opentelemetry/tracer.go | 225 +++++++++++++++++ .../caddyhttp/opentelemetry/tracer_test.go | 138 ++++++++++ .../caddyhttp/opentelemetry/tracerprovider.go | 63 +++++ .../opentelemetry/tracerprovider_test.go | 42 ++++ modules/caddyhttp/standard/imports.go | 1 + 12 files changed, 953 insertions(+), 1 deletion(-) create mode 100644 caddytest/integration/caddyfile_adapt/opentelemetry.txt create mode 100644 modules/caddyhttp/opentelemetry/README.md create mode 100644 modules/caddyhttp/opentelemetry/module.go create mode 100644 modules/caddyhttp/opentelemetry/module_test.go create mode 100644 modules/caddyhttp/opentelemetry/tracer.go create mode 100644 modules/caddyhttp/opentelemetry/tracer_test.go create mode 100644 modules/caddyhttp/opentelemetry/tracerprovider.go create mode 100644 modules/caddyhttp/opentelemetry/tracerprovider_test.go diff --git a/caddyconfig/httpcaddyfile/directives.go b/caddyconfig/httpcaddyfile/directives.go index 360f91e7c62..d97bd283ebf 100644 --- a/caddyconfig/httpcaddyfile/directives.go +++ b/caddyconfig/httpcaddyfile/directives.go @@ -37,6 +37,8 @@ import ( // The header directive goes second so that headers // can be manipulated before doing redirects. var directiveOrder = []string{ + "opentelemetry", + "map", "root", diff --git a/caddytest/integration/caddyfile_adapt/opentelemetry.txt b/caddytest/integration/caddyfile_adapt/opentelemetry.txt new file mode 100644 index 00000000000..1ba777ea2a7 --- /dev/null +++ b/caddytest/integration/caddyfile_adapt/opentelemetry.txt @@ -0,0 +1,35 @@ +:80 { + opentelemetry /myhandler { + span_name my-span + } +} +---------- +{ + "apps": { + "http": { + "servers": { + "srv0": { + "listen": [ + ":80" + ], + "routes": [ + { + "match": [ + { + "path": [ + "/myhandler" + ] + } + ], + "handle": [ + { + "span_name": "my-span", + } + ] + } + ] + } + } + } + } +} \ No newline at end of file diff --git a/go.mod b/go.mod index 522abd8c8eb..1516bd9b32d 100644 --- a/go.mod +++ b/go.mod @@ -24,11 +24,17 @@ require ( github.com/smallstep/truststore v0.9.6 github.com/yuin/goldmark v1.4.0 github.com/yuin/goldmark-highlighting v0.0.0-20210516132338-9216f9c5aa01 + go.opentelemetry.io/otel v1.0.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.0 + go.opentelemetry.io/otel/sdk v1.0.0 + go.opentelemetry.io/otel/trace v1.0.0 go.uber.org/zap v1.19.0 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e golang.org/x/net v0.0.0-20210614182718-04defd469f4e golang.org/x/term v0.0.0-20210503060354-a79de5458b56 google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08 + google.golang.org/grpc v1.40.0 google.golang.org/protobuf v1.27.1 gopkg.in/natefinch/lumberjack.v2 v2.0.0 gopkg.in/yaml.v2 v2.4.0 diff --git a/go.sum b/go.sum index ec17c2d26c2..3c55ae2f838 100644 --- a/go.sum +++ b/go.sum @@ -178,7 +178,10 @@ github.com/caddyserver/certmagic v0.14.5/go.mod h1:/0VQ5og2Jxa5yBQ8eT80wWS7fi/Dg github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A= +github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -201,6 +204,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= @@ -271,6 +275,7 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE= @@ -468,6 +473,7 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.9.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= +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/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= @@ -973,14 +979,27 @@ go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel v1.0.0 h1:qTTn6x71GVBvoafHK/yaRUmFzI4LcONZD0/kXxl5PHI= +go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg= +go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.0 h1:Vv4wbLEjheCTPV07jEav7fyUpJkyftQK7Ss2G7qgdSo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.0/go.mod h1:3VqVbIbjAycfL1C7sIu/Uh/kACIUPWHztt8ODYwR3oM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.0 h1:B9VtEB1u41Ohnl8U6rMCh1jjedu8HwFh4D0QeB+1N+0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.0/go.mod h1:zhEt6O5GGJ3NCAICr4hlCPoDb2GQuh4Obb4gZBgkoQQ= 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/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.0.0 h1:BNPMYUONPNbLneMttKSjQhOTlFLOD9U22HNG1KrIN2Y= +go.opentelemetry.io/otel/sdk v1.0.0/go.mod h1:PCrDHlSy5x1kjezSdL37PhbFUMjrsLRshJ2zCzeXwbM= go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/otel/trace v1.0.0 h1:TSBr8GTEtKevYMG/2d21M989r5WJYVimhTHBKVEZuh4= +go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.9.0 h1:C0g6TWmQYvjKRnljRULLWUVJGy8Uvu0NEL/5frY2/t4= +go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= go.step.sm/cli-utils v0.4.1 h1:QztRUhGYjOPM1I2Nmi7V6XejQyVtcESmo+sbegxvX7Q= go.step.sm/cli-utils v0.4.1/go.mod h1:hWYVOSlw8W9Pd+BwIbs/aftVVMRms3EG7Q2qLRwc0WA= go.step.sm/crypto v0.9.0 h1:q2AllTSnVj4NRtyEPkGW2ohArLmbGbe6ZAL/VIOKDzA= @@ -1247,6 +1266,7 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210412220455-f1c623a9e750/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1486,8 +1506,9 @@ google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= 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= diff --git a/modules/caddyhttp/opentelemetry/README.md b/modules/caddyhttp/opentelemetry/README.md new file mode 100644 index 00000000000..1a351648479 --- /dev/null +++ b/modules/caddyhttp/opentelemetry/README.md @@ -0,0 +1,59 @@ +# OpenTelemetry module + +This module provides integration with OpenTelemetry tracing facilities. It is implemented +as `caddyhttp.MiddlewareHandler` and can be chained into a list of other handlers. + +When enabled, it propagates an existing tracing context or will init a new one otherwise. + +It is based on `https://github.com/open-telemetry/opentelemetry-go`. + +## Configuration + +### Environment variables + +It can be configured using environment variables defined +by [spec](https://github.com/open-telemetry/opentelemetry-specification). + +IMPORTANT: Please, consider the version +of [https://github.com/open-telemetry/opentelemetry-go](https://github.com/open-telemetry/opentelemetry-go). Some parts +of the specification may be not implemented yet. + +Required by module environment variables are: OTEL_EXPORTER_OTLP_PROTOCOL/OTEL_EXPORTER_OTLP_TRACES_PROTOCOL and +OTEL_PROPAGATORS. + +If neither OTEL_EXPORTER_OTLP_INSECURE nor OTEL_EXPORTER_OTLP_SPAN_INSECURE is provided, then: + +1. If OTEL_EXPORTER_OTLP_CERTIFICATE or OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE are specified they will be used for TLS. +2. Else if both OTEL_EXPORTER_OTLP_CERTIFICATE and OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE are not specified, then default + TLS with the default `tls.Config` config will be used for an exporter. + +For the exporter configuration details, please +see [spec](https://github.com/open-telemetry/opentelemetry-specification/blob/a4440931b522c7351b0485ff4899f786b4ff4459/specification/protocol/exporter.md) +. + +Example: + +```bash +export OTEL_EXPORTER_OTLP_HEADERS="myAuthHeader=myToken" +export OTEL_EXPORTER_OTLP_PROTOCOL=grpc +export OTEL_PROPAGATORS=tracecontext,baggage +export OTEL_EXPORTER_OTLP_SPAN_INSECURE=false +export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=localhost:12345 +``` + +### Caddy file configuration + +Here is an example of **Caddyfile**: + +``` +handle /myHanlder { + opentelemetry { + span_name my-span + } + reverse_proxy 127.0.0.1:8081 +} +``` + +Please check span +naming [guideline](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#span) +. \ No newline at end of file diff --git a/modules/caddyhttp/opentelemetry/module.go b/modules/caddyhttp/opentelemetry/module.go new file mode 100644 index 00000000000..ed67db4912b --- /dev/null +++ b/modules/caddyhttp/opentelemetry/module.go @@ -0,0 +1,123 @@ +package opentelemetry + +import ( + "errors" + "fmt" + "net/http" + + "github.com/caddyserver/caddy/v2" + "github.com/caddyserver/caddy/v2/caddyconfig/caddyfile" + "github.com/caddyserver/caddy/v2/caddyconfig/httpcaddyfile" + "github.com/caddyserver/caddy/v2/modules/caddyhttp" + "go.uber.org/zap" +) + +func init() { + caddy.RegisterModule(OpenTelemetry{}) + httpcaddyfile.RegisterHandlerDirective("opentelemetry", parseCaddyfile) +} + +// OpenTelemetry implements an HTTP handler that adds support for the opentelemetry tracing. +// It is responsible for the injection and propagation of the tracing contexts. +// OpenTelemetry module can be configured via environment variables https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md. Some values can be overwritten with values from the configuration file. +type OpenTelemetry struct { + // SpanName is a span name. It SHOULD follow the naming guideline https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#span + SpanName string `json:"span_name"` + + // otel implements opentelemetry related logic. + otel openTelemetryWrapper + + logger *zap.Logger +} + +// CaddyModule returns the Caddy module information. +func (OpenTelemetry) CaddyModule() caddy.ModuleInfo { + return caddy.ModuleInfo{ + ID: "http.handlers.opentelemetry", + New: func() caddy.Module { return new(OpenTelemetry) }, + } +} + +// Provision implements caddy.Provisioner. +func (ot *OpenTelemetry) Provision(ctx caddy.Context) error { + ot.logger = ctx.Logger(ot) + + var err error + ot.otel, err = newOpenTelemetryWrapper(ctx, ot.SpanName) + + return err +} + +// Cleanup implements caddy.CleanerUpper and closes any idle connections. It calls Shutdown method for a trace provider https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/sdk.md#shutdown. +func (ot *OpenTelemetry) Cleanup() error { + if err := ot.otel.cleanup(ot.logger); err != nil { + return fmt.Errorf("tracerProvider shutdown: %w", err) + } + return nil +} + +// Validate implements caddy.Validator. +func (ot *OpenTelemetry) Validate() error { + if ot.otel.tracer == nil { + return errors.New("openTelemetry tracer is nil") + } + + return nil +} + +// ServeHTTP implements caddyhttp.MiddlewareHandler. +func (ot *OpenTelemetry) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyhttp.Handler) error { + return ot.otel.ServeHTTP(w, r, next) +} + +// UnmarshalCaddyfile sets up the module from Caddyfile tokens. +func (ot *OpenTelemetry) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { + setParameter := func(d *caddyfile.Dispenser, val *string) error { + if d.NextArg() { + *val = d.Val() + } else { + return d.ArgErr() + } + if d.NextArg() { + return d.ArgErr() + } + return nil + } + + // paramsMap is a mapping between "string" parameter from the Caddyfile and its destination within the module + paramsMap := map[string]*string{ + "span_name": &ot.SpanName, + } + + for d.Next() { + args := d.RemainingArgs() + if len(args) > 0 { + return d.ArgErr() + } + + for d.NextBlock(0) { + if dst, ok := paramsMap[d.Val()]; ok { + if err := setParameter(d, dst); err != nil { + return err + } + } else { + return d.ArgErr() + } + } + } + return nil +} + +func parseCaddyfile(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error) { + var m OpenTelemetry + err := m.UnmarshalCaddyfile(h.Dispenser) + return &m, err +} + +// Interface guards +var ( + _ caddy.Provisioner = (*OpenTelemetry)(nil) + _ caddy.Validator = (*OpenTelemetry)(nil) + _ caddyhttp.MiddlewareHandler = (*OpenTelemetry)(nil) + _ caddyfile.Unmarshaler = (*OpenTelemetry)(nil) +) diff --git a/modules/caddyhttp/opentelemetry/module_test.go b/modules/caddyhttp/opentelemetry/module_test.go new file mode 100644 index 00000000000..814b87c02e6 --- /dev/null +++ b/modules/caddyhttp/opentelemetry/module_test.go @@ -0,0 +1,237 @@ +package opentelemetry + +import ( + "context" + "net/http" + "net/http/httptest" + "os" + "strings" + "testing" + + "github.com/caddyserver/caddy/v2" + "github.com/caddyserver/caddy/v2/caddyconfig/caddyfile" + "github.com/caddyserver/caddy/v2/modules/caddyhttp" +) + +func TestOpenTelemetry_UnmarshalCaddyfile(t *testing.T) { + tests := []struct { + name string + spanName string + d *caddyfile.Dispenser + wantErr bool + }{ + { + name: "Full config", + spanName: "my-span", + d: caddyfile.NewTestDispenser(` +opentelemetry { + span_name my-span +}`), + wantErr: false, + }, + { + name: "Only span name in the config", + spanName: "my-span", + d: caddyfile.NewTestDispenser(` +opentelemetry { + span_name my-span +}`), + wantErr: false, + }, + { + name: "Empty config", + d: caddyfile.NewTestDispenser(` +opentelemetry { +}`), + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ot := &OpenTelemetry{} + if err := ot.UnmarshalCaddyfile(tt.d); (err != nil) != tt.wantErr { + t.Errorf("UnmarshalCaddyfile() error = %v, wantErrType %v", err, tt.wantErr) + } + + if ot.SpanName != tt.spanName { + t.Errorf("UnmarshalCaddyfile() SpanName = %v, want SpanName %v", ot.SpanName, tt.spanName) + } + }) + } +} + +func TestOpenTelemetry_UnmarshalCaddyfile_Error(t *testing.T) { + tests := []struct { + name string + d *caddyfile.Dispenser + wantErr bool + }{ + { + name: "Unknown parameter", + d: caddyfile.NewTestDispenser(` + opentelemetry { + foo bar + }`), + wantErr: true, + }, + { + name: "Missed argument", + d: caddyfile.NewTestDispenser(` +opentelemetry { + span_name +}`), + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ot := &OpenTelemetry{} + if err := ot.UnmarshalCaddyfile(tt.d); (err != nil) != tt.wantErr { + t.Errorf("UnmarshalCaddyfile() error = %v, wantErrType %v", err, tt.wantErr) + } + }) + } +} + +func TestOpenTelemetry_Provision(t *testing.T) { + ctx, cancel := caddy.NewContext(caddy.Context{Context: context.Background()}) + defer cancel() + + if err := th.SetEnv(); err != nil { + t.Errorf("Environment variable set error: %v", err) + } + + defer func() { + if err := th.UnsetEnv(); err != nil { + t.Errorf("Environment variable unset error: %v", err) + } + }() + + ot := &OpenTelemetry{} + + if err := ot.Provision(ctx); err != nil { + t.Errorf("Provision() error = %v", err) + } +} + +func TestOpenTelemetry_Provision_WithoutEnvironmentVariables(t *testing.T) { + ctx, cancel := caddy.NewContext(caddy.Context{Context: context.Background()}) + defer cancel() + + ot := &OpenTelemetry{} + + if err := ot.Provision(ctx); err == nil { + t.Errorf("Provision() error should not be nil") + } +} + +func TestOpenTelemetry_ServeHTTP_Propagation_Without_Initial_Headers(t *testing.T) { + if err := th.SetEnv(); err != nil { + t.Errorf("Environment variable set error: %v", err) + } + + defer func() { + if err := th.UnsetEnv(); err != nil { + t.Errorf("Environment variable unset error: %v", err) + } + }() + + ot := &OpenTelemetry{ + SpanName: "mySpan", + } + + req := httptest.NewRequest("GET", "https://example.com/foo", nil) + w := httptest.NewRecorder() + + var handler caddyhttp.HandlerFunc = func(writer http.ResponseWriter, request *http.Request) error { + traceparent := request.Header.Get("Traceparent") + if traceparent == "" || strings.HasPrefix(traceparent, "00-00000000000000000000000000000000-0000000000000000") { + t.Errorf("Invalid traceparent: %v", traceparent) + } + + return nil + } + + ctx, cancel := caddy.NewContext(caddy.Context{Context: context.Background()}) + defer cancel() + + if err := ot.Provision(ctx); err != nil { + t.Errorf("Provision error: %v", err) + t.FailNow() + } + + if err := ot.ServeHTTP(w, req, handler); err != nil { + t.Errorf("ServeHTTP error: %v", err) + } +} + +func TestOpenTelemetry_ServeHTTP_Propagation_With_Initial_Headers(t *testing.T) { + if err := th.SetEnv(); err != nil { + t.Errorf("Environment variable set error: %v", err) + } + + defer func() { + if err := th.UnsetEnv(); err != nil { + t.Errorf("Environment variable unset error: %v", err) + } + }() + + ot := &OpenTelemetry{ + SpanName: "mySpan", + } + + req := httptest.NewRequest("GET", "https://example.com/foo", nil) + req.Header.Set("traceparent", "00-11111111111111111111111111111111-1111111111111111-01") + w := httptest.NewRecorder() + + var handler caddyhttp.HandlerFunc = func(writer http.ResponseWriter, request *http.Request) error { + traceparent := request.Header.Get("Traceparent") + if !strings.HasPrefix(traceparent, "00-11111111111111111111111111111111") { + t.Errorf("Invalid traceparent: %v", traceparent) + } + + return nil + } + + ctx, cancel := caddy.NewContext(caddy.Context{Context: context.Background()}) + defer cancel() + + if err := ot.Provision(ctx); err != nil { + t.Errorf("Provision error: %v", err) + t.FailNow() + } + + if err := ot.ServeHTTP(w, req, handler); err != nil { + t.Errorf("ServeHTTP error: %v", err) + } +} + +type testHelper struct { + SetEnv func() error + UnsetEnv func() error +} + +var th = testHelper{ + SetEnv: func() error { + if err := os.Setenv("OTEL_EXPORTER_OTLP_PROTOCOL", "grpc"); err != nil { + return err + } + + if err := os.Setenv("OTEL_PROPAGATORS", "tracecontext,baggage"); err != nil { + return err + } + + return nil + }, + UnsetEnv: func() error { + if err := os.Unsetenv("OTEL_EXPORTER_OTLP_PROTOCOL"); err != nil { + return err + } + + if err := os.Unsetenv("OTEL_PROPAGATORS"); err != nil { + return err + } + + return nil + }, +} diff --git a/modules/caddyhttp/opentelemetry/tracer.go b/modules/caddyhttp/opentelemetry/tracer.go new file mode 100644 index 00000000000..9829a1d2c63 --- /dev/null +++ b/modules/caddyhttp/opentelemetry/tracer.go @@ -0,0 +1,225 @@ +package opentelemetry + +import ( + "context" + "crypto/tls" + "errors" + "fmt" + "go.opentelemetry.io/otel/attribute" + "net/http" + "os" + "strings" + + caddycmd "github.com/caddyserver/caddy/v2/cmd" + "github.com/caddyserver/caddy/v2/modules/caddyhttp" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" + "go.opentelemetry.io/otel/propagation" + "go.opentelemetry.io/otel/sdk/resource" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.4.0" + "go.opentelemetry.io/otel/trace" + "go.uber.org/zap" + "google.golang.org/grpc/credentials" +) + +const ( + envOtelPropagators = "OTEL_PROPAGATORS" + + envOtelExporterOtlpProtocol = "OTEL_EXPORTER_OTLP_PROTOCOL" + envOtelExporterOtlpTracesProtocol = "OTEL_EXPORTER_OTLP_TRACES_PROTOCOL" + + envOtelExporterOtlpCertificate = "OTEL_EXPORTER_OTLP_CERTIFICATE" + envOtelExporterOtlpTracesCertificate = "OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE" + + envOtelExporterOtlpInsecure = "OTEL_EXPORTER_OTLP_INSECURE" + envOtelExporterOtlpSpanInsecure = "OTEL_EXPORTER_OTLP_SPAN_INSECURE" + + webEngineName = "Caddy" + defaultSpanName = "handler" +) + +var ( + ErrUnspecifiedTracesProtocol = errors.New("unspecified opentelemetry traces protocol") + ErrNonSupportedTracesProtocol = errors.New("non supported opentelemetry traces protocol") + ErrUnspecifiedPropagators = errors.New("unspecified opentelemtry propagators") +) + +// openTelemetryWrapper is responsible for the tracing injection, extraction and propagation. +type openTelemetryWrapper struct { + tracer trace.Tracer + propagators propagation.TextMapPropagator + + spanName string +} + +// newOpenTelemetryWrapper is responsible for the openTelemetryWrapper initialization using provided configuration. +func newOpenTelemetryWrapper( + ctx context.Context, + spanName string, +) (openTelemetryWrapper, error) { + if spanName == "" { + spanName = defaultSpanName + } + + ot := openTelemetryWrapper{ + spanName: spanName, + } + + res, err := ot.newResource(ctx, webEngineName, caddycmd.CaddyVersion()) + if err != nil { + return ot, fmt.Errorf("creating resource error: %w", err) + } + + // + traceExporter, err := ot.getTracerExporter(ctx) + if err != nil { + return ot, fmt.Errorf("creating trace exporter error: %w", err) + } + + // handle propagators related configuration, because it is not supported by opentelemetry lib yet. + // Please check status of https://github.com/open-telemetry/opentelemetry-go/issues/1698. + propagators := os.Getenv(envOtelPropagators) + if propagators == "" { + return ot, ErrUnspecifiedPropagators + } + + ot.propagators = ot.getPropagators(propagators) + + // create a tracer + ot.tracer = globalTracerProvider.getTracerProvider( + sdktrace.WithBatcher(traceExporter), + sdktrace.WithResource(res), + ).Tracer("github.com/caddyserver/caddy/v2/modules/caddyhttp/opentelemetry") + + return ot, nil +} + +// ServeHTTP extract current tracing context or create a new one, then method propagates it to the wrapped next handler. +func (ot *openTelemetryWrapper) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyhttp.Handler) error { + + commonLabels := []attribute.KeyValue{ + attribute.String("http.method", r.Method), + attribute.String("http.scheme", r.URL.Scheme), + attribute.String("http.host", r.Host), + attribute.String("http.user_agent", r.UserAgent()), + } + + // It will be default span kind as for now. Proper span kind (Span.Kind.LOAD_BALANCER (PROXY/SIDECAR)) is being discussed here https://github.com/open-telemetry/opentelemetry-specification/issues/51. + ctx, span := ot.tracer.Start( + ot.propagators.Extract(r.Context(), propagation.HeaderCarrier(r.Header)), + ot.spanName, + trace.WithAttributes(commonLabels...), + ) + defer span.End() + + ot.propagators.Inject(ctx, propagation.HeaderCarrier(r.Header)) + + return next.ServeHTTP(w, r) +} + +// cleanup flush all remaining data and shutdown a tracerProvider +func (ot *openTelemetryWrapper) cleanup(logger *zap.Logger) error { + return globalTracerProvider.cleanupTracerProvider(logger) +} + +// newResource creates a resource that describe current handler instance and merge it with a default attributes value. +func (ot *openTelemetryWrapper) newResource( + ctx context.Context, + webEngineName, + webEngineVersion string, +) (*resource.Resource, error) { + option := resource.WithAttributes( + semconv.WebEngineNameKey.String(webEngineName), + semconv.WebEngineVersionKey.String(webEngineVersion), + ) + + caddyResource, err := resource.New(ctx, + option, + resource.WithFromEnv(), + ) + + if err != nil { + return nil, err + } + + return resource.Merge(resource.Default(), caddyResource) +} + +// getTracerExporter returns protocol specific exporter or error if the protocol is not supported by current module implementation. +// +// If opentelemetry is not configured with "insecure" parameter and certificate related headers missed, +// then default TLS with default `tls.Config` config will be used. +func (ot *openTelemetryWrapper) getTracerExporter(ctx context.Context) (*otlptrace.Exporter, error) { + exporterTracesProtocol := ot.getTracesProtocolFromEnv() + + switch exporterTracesProtocol { + case "grpc": + var opts []otlptracegrpc.Option + if ot.getInsecureFromEnv() { + opts = append(opts, otlptracegrpc.WithInsecure()) + } else { + if !ot.isCertificateHeaderSet() { + var tlsConf tls.Config + transportCredentials := credentials.NewTLS(&tlsConf) + opts = append(opts, otlptracegrpc.WithTLSCredentials(transportCredentials)) + } + } + + return otlptracegrpc.New(ctx, opts...) + case "": + return nil, ErrUnspecifiedTracesProtocol + default: + return nil, fmt.Errorf("%w: tracesProtocol %s", ErrNonSupportedTracesProtocol, exporterTracesProtocol) + } +} + +// getTracesProtocolFromEnv returns opentelemetry exporter otlp protocol, if it is specified via environment variable or empty string if not. +func (ot *openTelemetryWrapper) getTracesProtocolFromEnv() string { + protocol := os.Getenv(envOtelExporterOtlpTracesProtocol) + if protocol == "" { + protocol = os.Getenv(envOtelExporterOtlpProtocol) + } + + return protocol +} + +// getInsecureFromEnv returns value of "insecure" option if it was specified by environment variable. +func (ot *openTelemetryWrapper) getInsecureFromEnv() bool { + insecure := os.Getenv(envOtelExporterOtlpSpanInsecure) + if insecure == "" { + insecure = os.Getenv(envOtelExporterOtlpInsecure) + } + + return strings.ToLower(insecure) == "true" +} + +func (ot *openTelemetryWrapper) isCertificateHeaderSet() bool { + return os.Getenv(envOtelExporterOtlpCertificate) != "" || os.Getenv(envOtelExporterOtlpTracesCertificate) != "" +} + +// getPropagators deduplicate propagators, according to the specification https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md#general-sdk-configuration. +// Parameter propagators is a "," separated string, ex: "baggage,tracecontext". +// Current implementation supports only "baggage" and "tracecontext" values. +func (ot *openTelemetryWrapper) getPropagators(propagators string) propagation.TextMapPropagator { + // deduplicationMap filters duplicated propagator + deduplicationMap := make(map[string]struct{}) + + // store unique values + var propagatorsList []propagation.TextMapPropagator + + for _, v := range strings.Split(propagators, ",") { + propagatorName := strings.TrimSpace(v) + if _, ok := deduplicationMap[propagatorName]; !ok { + deduplicationMap[propagatorName] = struct{}{} + switch propagatorName { + case "baggage": + propagatorsList = append(propagatorsList, propagation.Baggage{}) + case "tracecontext": + propagatorsList = append(propagatorsList, propagation.TraceContext{}) + } + } + } + + return propagation.NewCompositeTextMapPropagator(propagatorsList...) +} diff --git a/modules/caddyhttp/opentelemetry/tracer_test.go b/modules/caddyhttp/opentelemetry/tracer_test.go new file mode 100644 index 00000000000..12f5ed78ff8 --- /dev/null +++ b/modules/caddyhttp/opentelemetry/tracer_test.go @@ -0,0 +1,138 @@ +package opentelemetry + +import ( + "context" + "errors" + "os" + "testing" + + "github.com/caddyserver/caddy/v2" +) + +func TestOpenTelemetry_newOpenTelemetryWrapper(t *testing.T) { + ctx, cancel := caddy.NewContext(caddy.Context{Context: context.Background()}) + defer cancel() + + if err := th.SetEnv(); err != nil { + t.Errorf("Environment variable set error: %v", err) + } + defer func() { + if err := th.UnsetEnv(); err != nil { + t.Errorf("Environment variable set error: %v", err) + } + }() + + var otw openTelemetryWrapper + var err error + + if otw, err = newOpenTelemetryWrapper(ctx, + "", + ); err != nil { + t.Errorf("newOpenTelemetryWrapper() error = %v", err) + t.FailNow() + } + + if otw.tracer == nil { + t.Errorf("Tracer should not be empty") + } + + if otw.propagators == nil { + t.Errorf("Propagators should not be empty") + } +} + +func TestOpenTelemetry_newOpenTelemetryWrapper_Error(t *testing.T) { + tests := []struct { + name string + wantErrType error + setEnv func() error + unsetEnv func() error + }{ + { + name: "With OTEL_EXPORTER_OTLP_PROTOCOL environment variables only", + setEnv: func() error { + return os.Setenv("OTEL_EXPORTER_OTLP_PROTOCOL", "grpc") + }, + unsetEnv: func() error { + return os.Unsetenv("OTEL_EXPORTER_OTLP_PROTOCOL") + }, + wantErrType: ErrUnspecifiedPropagators, + }, + { + name: "With OTEL_PROPAGATORS environment variables only", + setEnv: func() error { + return os.Setenv("OTEL_PROPAGATORS", "tracecontext,baggage") + }, + unsetEnv: func() error { + return os.Unsetenv("OTEL_PROPAGATORS") + }, + wantErrType: ErrUnspecifiedTracesProtocol, + }, + { + name: "Not supported protocol", + setEnv: func() error { + return os.Setenv("OTEL_EXPORTER_OTLP_PROTOCOL", "ftp") + }, + unsetEnv: func() error { + return os.Unsetenv("OTEL_EXPORTER_OTLP_PROTOCOL") + }, + wantErrType: ErrNonSupportedTracesProtocol, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctx, cancel := caddy.NewContext(caddy.Context{Context: context.Background()}) + defer cancel() + + if err := tt.setEnv(); err != nil { + t.Errorf("Environment variable set error: %v", err) + } + defer func() { + if err := tt.unsetEnv(); err != nil { + t.Errorf("Environment variable unset error: %v", err) + } + }() + + _, err := newOpenTelemetryWrapper(ctx, + "", + ) + + if !errors.Is(err, tt.wantErrType) { + t.Errorf("newOpenTelemetryWrapper() error is %v, expected %v", err, tt.wantErrType) + } + }) + } +} + +func Test_openTelemetryWrapper_newResource_WithServiceName(t *testing.T) { + err := os.Setenv("OTEL_SERVICE_NAME", "MyService") + defer os.Unsetenv("OTEL_SERVICE_NAME") + + res, err := (&openTelemetryWrapper{}).newResource(context.Background(), "TestEngine", "Version 1") + + if err != nil { + t.Errorf("can not create resource: %v", err) + } + + const expectedAttributesNumber = 6 + if len(res.Attributes()) != expectedAttributesNumber { + t.Errorf("resource should have %d attributes, has : %v", expectedAttributesNumber, len(res.Attributes())) + } + + attributesMap := make(map[string]string) + for i := 0; i < expectedAttributesNumber; i++ { + attributesMap[string(res.Attributes()[i].Key)] = res.Attributes()[i].Value.AsString() + } + + for k, v := range map[string]string{ + "telemetry.sdk.language": "go", + "telemetry.sdk.name": "opentelemetry", + "webengine.version": "Version 1", + "webengine.name": "TestEngine", + "service.name": "MyService", + } { + if attributesMap[k] != v { + t.Errorf("attribute %v is %v, expeted %v", k, attributesMap[k], v) + } + } +} diff --git a/modules/caddyhttp/opentelemetry/tracerprovider.go b/modules/caddyhttp/opentelemetry/tracerprovider.go new file mode 100644 index 00000000000..f3003b9bd60 --- /dev/null +++ b/modules/caddyhttp/opentelemetry/tracerprovider.go @@ -0,0 +1,63 @@ +package opentelemetry + +import ( + "context" + "fmt" + "sync" + + sdktrace "go.opentelemetry.io/otel/sdk/trace" + "go.uber.org/zap" +) + +// globalTracerProvider stores global tracer provider and is responsible for graceful shutdown when nobody is using it. +var globalTracerProvider = &tracerProvider{} + +type tracerProvider struct { + mu sync.Mutex + tracerProvider *sdktrace.TracerProvider + tracerProvidersCounter int +} + +// getTracerProvider create or return an existing global TracerProvider +func (t *tracerProvider) getTracerProvider(opts ...sdktrace.TracerProviderOption) *sdktrace.TracerProvider { + t.mu.Lock() + defer t.mu.Unlock() + + t.tracerProvidersCounter++ + + if t.tracerProvider == nil { + t.tracerProvider = sdktrace.NewTracerProvider( + opts..., + ) + } + + return t.tracerProvider +} + +// cleanupTracerProvider gracefully shutdown a TracerProvider +func (t *tracerProvider) cleanupTracerProvider(logger *zap.Logger) error { + t.mu.Lock() + defer t.mu.Unlock() + + if t.tracerProvidersCounter > 0 { + t.tracerProvidersCounter-- + } + + if t.tracerProvidersCounter == 0 { + if t.tracerProvider != nil { + // tracerProvider.ForceFlush SHOULD be invoked according to https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/sdk.md#forceflush + if err := t.tracerProvider.ForceFlush(context.Background()); err != nil { + logger.Error("forceFlush error: " + err.Error()) + } + + // tracerProvider.Shutdown MUST be invoked according to https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/sdk.md#shutdown + if err := t.tracerProvider.Shutdown(context.Background()); err != nil { + return fmt.Errorf("tracerProvider shutdown error: %w", err) + } + } + + t.tracerProvider = nil + } + + return nil +} diff --git a/modules/caddyhttp/opentelemetry/tracerprovider_test.go b/modules/caddyhttp/opentelemetry/tracerprovider_test.go new file mode 100644 index 00000000000..c3e8b3ead7c --- /dev/null +++ b/modules/caddyhttp/opentelemetry/tracerprovider_test.go @@ -0,0 +1,42 @@ +package opentelemetry + +import ( + "go.uber.org/zap" + "testing" +) + +func Test_tracersProvider_getTracerProvider(t *testing.T) { + tp := tracerProvider{} + + tp.getTracerProvider() + tp.getTracerProvider() + + if tp.tracerProvider == nil { + t.Errorf("There should be tracer provider") + } + + if tp.tracerProvidersCounter != 2 { + t.Errorf("Tracer providers counter should equal to 2") + } +} + +func Test_tracersProvider_cleanupTracerProvider(t *testing.T) { + tp := tracerProvider{} + + tp.getTracerProvider() + tp.getTracerProvider() + + err := tp.cleanupTracerProvider(zap.NewNop()) + + if err != nil { + t.Errorf("There should be no error: %v", err) + } + + if tp.tracerProvider == nil { + t.Errorf("There should be tracer provider") + } + + if tp.tracerProvidersCounter != 1 { + t.Errorf("Tracer providers counter should equal to 1") + } +} diff --git a/modules/caddyhttp/standard/imports.go b/modules/caddyhttp/standard/imports.go index 0e2203c1ebd..79dd8aaf01e 100644 --- a/modules/caddyhttp/standard/imports.go +++ b/modules/caddyhttp/standard/imports.go @@ -11,6 +11,7 @@ import ( _ "github.com/caddyserver/caddy/v2/modules/caddyhttp/fileserver" _ "github.com/caddyserver/caddy/v2/modules/caddyhttp/headers" _ "github.com/caddyserver/caddy/v2/modules/caddyhttp/map" + _ "github.com/caddyserver/caddy/v2/modules/caddyhttp/opentelemetry" _ "github.com/caddyserver/caddy/v2/modules/caddyhttp/push" _ "github.com/caddyserver/caddy/v2/modules/caddyhttp/requestbody" _ "github.com/caddyserver/caddy/v2/modules/caddyhttp/reverseproxy" From a7fe341646afdc583b1635f5791b037e249f142b Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Mon, 27 Sep 2021 13:55:08 +0200 Subject: [PATCH 02/60] fix imports --- modules/caddyhttp/opentelemetry/tracer.go | 3 ++- modules/caddyhttp/opentelemetry/tracerprovider_test.go | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/caddyhttp/opentelemetry/tracer.go b/modules/caddyhttp/opentelemetry/tracer.go index 9829a1d2c63..6ce807c2ea0 100644 --- a/modules/caddyhttp/opentelemetry/tracer.go +++ b/modules/caddyhttp/opentelemetry/tracer.go @@ -5,11 +5,12 @@ import ( "crypto/tls" "errors" "fmt" - "go.opentelemetry.io/otel/attribute" "net/http" "os" "strings" + "go.opentelemetry.io/otel/attribute" + caddycmd "github.com/caddyserver/caddy/v2/cmd" "github.com/caddyserver/caddy/v2/modules/caddyhttp" "go.opentelemetry.io/otel/exporters/otlp/otlptrace" diff --git a/modules/caddyhttp/opentelemetry/tracerprovider_test.go b/modules/caddyhttp/opentelemetry/tracerprovider_test.go index c3e8b3ead7c..75974de82e5 100644 --- a/modules/caddyhttp/opentelemetry/tracerprovider_test.go +++ b/modules/caddyhttp/opentelemetry/tracerprovider_test.go @@ -1,8 +1,9 @@ package opentelemetry import ( - "go.uber.org/zap" "testing" + + "go.uber.org/zap" ) func Test_tracersProvider_getTracerProvider(t *testing.T) { From 8323fbdde6e9592fb686d62c125ed76487441b27 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Mon, 27 Sep 2021 14:01:52 +0200 Subject: [PATCH 03/60] fix test --- caddytest/integration/caddyfile_adapt/opentelemetry.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/caddytest/integration/caddyfile_adapt/opentelemetry.txt b/caddytest/integration/caddyfile_adapt/opentelemetry.txt index 1ba777ea2a7..fb61c7641bc 100644 --- a/caddytest/integration/caddyfile_adapt/opentelemetry.txt +++ b/caddytest/integration/caddyfile_adapt/opentelemetry.txt @@ -23,7 +23,8 @@ ], "handle": [ { - "span_name": "my-span", + "handler": "opentelemetry", + "span_name": "my-span" } ] } From f3092b45a2f7759433891256a6b9d4f4adfc221c Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Mon, 27 Sep 2021 14:20:20 +0200 Subject: [PATCH 04/60] Update modules/caddyhttp/opentelemetry/README.md Co-authored-by: Dave Henderson --- modules/caddyhttp/opentelemetry/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/caddyhttp/opentelemetry/README.md b/modules/caddyhttp/opentelemetry/README.md index 1a351648479..3fc913ec57a 100644 --- a/modules/caddyhttp/opentelemetry/README.md +++ b/modules/caddyhttp/opentelemetry/README.md @@ -11,8 +11,8 @@ It is based on `https://github.com/open-telemetry/opentelemetry-go`. ### Environment variables -It can be configured using environment variables defined -by [spec](https://github.com/open-telemetry/opentelemetry-specification). +It can be configured using the environment variables defined +by the [OpenTelemetry Environment Variable Specification](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md). IMPORTANT: Please, consider the version of [https://github.com/open-telemetry/opentelemetry-go](https://github.com/open-telemetry/opentelemetry-go). Some parts From 01577b5936e5937bfa8d1f10e05810679cc0a72b Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Mon, 27 Sep 2021 14:39:06 +0200 Subject: [PATCH 05/60] Update modules/caddyhttp/opentelemetry/README.md Co-authored-by: Dave Henderson --- modules/caddyhttp/opentelemetry/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/caddyhttp/opentelemetry/README.md b/modules/caddyhttp/opentelemetry/README.md index 3fc913ec57a..c32a1841f1c 100644 --- a/modules/caddyhttp/opentelemetry/README.md +++ b/modules/caddyhttp/opentelemetry/README.md @@ -46,7 +46,7 @@ export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=localhost:12345 Here is an example of **Caddyfile**: ``` -handle /myHanlder { +handle /myHandler { opentelemetry { span_name my-span } From b9df83e2c442be46c194830151c4f500edc9416c Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Mon, 27 Sep 2021 14:50:10 +0200 Subject: [PATCH 06/60] Update modules/caddyhttp/opentelemetry/README.md Co-authored-by: Dave Henderson --- modules/caddyhttp/opentelemetry/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/caddyhttp/opentelemetry/README.md b/modules/caddyhttp/opentelemetry/README.md index c32a1841f1c..597cab689fd 100644 --- a/modules/caddyhttp/opentelemetry/README.md +++ b/modules/caddyhttp/opentelemetry/README.md @@ -18,8 +18,9 @@ IMPORTANT: Please, consider the version of [https://github.com/open-telemetry/opentelemetry-go](https://github.com/open-telemetry/opentelemetry-go). Some parts of the specification may be not implemented yet. -Required by module environment variables are: OTEL_EXPORTER_OTLP_PROTOCOL/OTEL_EXPORTER_OTLP_TRACES_PROTOCOL and -OTEL_PROPAGATORS. +These environment variables are required by this module: +- `OTEL_EXPORTER_OTLP_PROTOCOL` or `OTEL_EXPORTER_OTLP_TRACES_PROTOCOL` +- `OTEL_PROPAGATORS` If neither OTEL_EXPORTER_OTLP_INSECURE nor OTEL_EXPORTER_OTLP_SPAN_INSECURE is provided, then: From 9d0c1e8f9c208b17f67bbc3dfea091cccd71d878 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Mon, 27 Sep 2021 14:59:06 +0200 Subject: [PATCH 07/60] Update modules/caddyhttp/opentelemetry/tracer.go Co-authored-by: Dave Henderson --- modules/caddyhttp/opentelemetry/tracer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/caddyhttp/opentelemetry/tracer.go b/modules/caddyhttp/opentelemetry/tracer.go index 6ce807c2ea0..96663b59a2b 100644 --- a/modules/caddyhttp/opentelemetry/tracer.go +++ b/modules/caddyhttp/opentelemetry/tracer.go @@ -42,7 +42,7 @@ const ( var ( ErrUnspecifiedTracesProtocol = errors.New("unspecified opentelemetry traces protocol") - ErrNonSupportedTracesProtocol = errors.New("non supported opentelemetry traces protocol") + ErrUnsupportedTracesProtocol = errors.New("unsupported opentelemetry traces protocol") ErrUnspecifiedPropagators = errors.New("unspecified opentelemtry propagators") ) From 9a461e17b6fcb34d37947b29fc43dff9f09ace5b Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Mon, 27 Sep 2021 15:01:46 +0200 Subject: [PATCH 08/60] rename error ErrUnsupportedTracesProtocol --- modules/caddyhttp/opentelemetry/tracer.go | 6 +++--- modules/caddyhttp/opentelemetry/tracer_test.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/caddyhttp/opentelemetry/tracer.go b/modules/caddyhttp/opentelemetry/tracer.go index 96663b59a2b..0e75ef720d0 100644 --- a/modules/caddyhttp/opentelemetry/tracer.go +++ b/modules/caddyhttp/opentelemetry/tracer.go @@ -41,9 +41,9 @@ const ( ) var ( - ErrUnspecifiedTracesProtocol = errors.New("unspecified opentelemetry traces protocol") + ErrUnspecifiedTracesProtocol = errors.New("unspecified opentelemetry traces protocol") ErrUnsupportedTracesProtocol = errors.New("unsupported opentelemetry traces protocol") - ErrUnspecifiedPropagators = errors.New("unspecified opentelemtry propagators") + ErrUnspecifiedPropagators = errors.New("unspecified opentelemtry propagators") ) // openTelemetryWrapper is responsible for the tracing injection, extraction and propagation. @@ -171,7 +171,7 @@ func (ot *openTelemetryWrapper) getTracerExporter(ctx context.Context) (*otlptra case "": return nil, ErrUnspecifiedTracesProtocol default: - return nil, fmt.Errorf("%w: tracesProtocol %s", ErrNonSupportedTracesProtocol, exporterTracesProtocol) + return nil, fmt.Errorf("%w: tracesProtocol %s", ErrUnsupportedTracesProtocol, exporterTracesProtocol) } } diff --git a/modules/caddyhttp/opentelemetry/tracer_test.go b/modules/caddyhttp/opentelemetry/tracer_test.go index 12f5ed78ff8..72638c1dfd3 100644 --- a/modules/caddyhttp/opentelemetry/tracer_test.go +++ b/modules/caddyhttp/opentelemetry/tracer_test.go @@ -76,7 +76,7 @@ func TestOpenTelemetry_newOpenTelemetryWrapper_Error(t *testing.T) { unsetEnv: func() error { return os.Unsetenv("OTEL_EXPORTER_OTLP_PROTOCOL") }, - wantErrType: ErrNonSupportedTracesProtocol, + wantErrType: ErrUnsupportedTracesProtocol, }, } for _, tt := range tests { From cd9cfb2f8c42f8612344320343fa0b219ff0dddb Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Mon, 11 Oct 2021 11:39:16 +0200 Subject: [PATCH 09/60] replace spaces with tabs in the test data --- caddytest/integration/caddyfile_adapt/opentelemetry.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/caddytest/integration/caddyfile_adapt/opentelemetry.txt b/caddytest/integration/caddyfile_adapt/opentelemetry.txt index fb61c7641bc..d81a3fc2d6a 100644 --- a/caddytest/integration/caddyfile_adapt/opentelemetry.txt +++ b/caddytest/integration/caddyfile_adapt/opentelemetry.txt @@ -1,6 +1,6 @@ :80 { opentelemetry /myhandler { - span_name my-span + span_name my-span } } ---------- From 8c8ef68404cf5ec090838129d33423759af219a8 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Mon, 11 Oct 2021 11:41:47 +0200 Subject: [PATCH 10/60] Update modules/caddyhttp/opentelemetry/README.md Co-authored-by: Francis Lavoie --- modules/caddyhttp/opentelemetry/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/caddyhttp/opentelemetry/README.md b/modules/caddyhttp/opentelemetry/README.md index 597cab689fd..c715d5737fd 100644 --- a/modules/caddyhttp/opentelemetry/README.md +++ b/modules/caddyhttp/opentelemetry/README.md @@ -44,7 +44,7 @@ export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=localhost:12345 ### Caddy file configuration -Here is an example of **Caddyfile**: +Here is a **Caddyfile** example: ``` handle /myHandler { From 155d0c56d775b5fe51cff1ab9ccc2639febc9a26 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Mon, 11 Oct 2021 11:42:03 +0200 Subject: [PATCH 11/60] Update modules/caddyhttp/opentelemetry/README.md Co-authored-by: Francis Lavoie --- modules/caddyhttp/opentelemetry/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/caddyhttp/opentelemetry/README.md b/modules/caddyhttp/opentelemetry/README.md index c715d5737fd..3999bef740e 100644 --- a/modules/caddyhttp/opentelemetry/README.md +++ b/modules/caddyhttp/opentelemetry/README.md @@ -1,7 +1,7 @@ # OpenTelemetry module This module provides integration with OpenTelemetry tracing facilities. It is implemented -as `caddyhttp.MiddlewareHandler` and can be chained into a list of other handlers. +as a `caddyhttp.MiddlewareHandler` and can be chained into a list of other handlers. When enabled, it propagates an existing tracing context or will init a new one otherwise. From a13ac1261698b43a548c6b5c265cbbbcbba0118e Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Mon, 11 Oct 2021 11:44:41 +0200 Subject: [PATCH 12/60] replace spaces with tabs in the README.md --- modules/caddyhttp/opentelemetry/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/caddyhttp/opentelemetry/README.md b/modules/caddyhttp/opentelemetry/README.md index 3999bef740e..6fda1a1b567 100644 --- a/modules/caddyhttp/opentelemetry/README.md +++ b/modules/caddyhttp/opentelemetry/README.md @@ -48,10 +48,10 @@ Here is a **Caddyfile** example: ``` handle /myHandler { - opentelemetry { - span_name my-span - } - reverse_proxy 127.0.0.1:8081 + opentelemetry { + span_name my-span + } + reverse_proxy 127.0.0.1:8081 } ``` From 3fce97eca279688ce1e55fe829ea4cf159ab9026 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Mon, 11 Oct 2021 13:53:41 +0200 Subject: [PATCH 13/60] use default values for a propagation and exporter protocol --- go.mod | 4 +-- go.sum | 15 ++++++++-- modules/caddyhttp/opentelemetry/README.md | 4 --- .../caddyhttp/opentelemetry/module_test.go | 4 +-- modules/caddyhttp/opentelemetry/tracer.go | 15 +++++----- .../caddyhttp/opentelemetry/tracer_test.go | 29 ------------------- 6 files changed, 25 insertions(+), 46 deletions(-) diff --git a/go.mod b/go.mod index 1516bd9b32d..3ce31354798 100644 --- a/go.mod +++ b/go.mod @@ -24,11 +24,11 @@ require ( github.com/smallstep/truststore v0.9.6 github.com/yuin/goldmark v1.4.0 github.com/yuin/goldmark-highlighting v0.0.0-20210516132338-9216f9c5aa01 - go.opentelemetry.io/otel v1.0.0 + go.opentelemetry.io/otel v1.0.1 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.0 go.opentelemetry.io/otel/sdk v1.0.0 - go.opentelemetry.io/otel/trace v1.0.0 + go.opentelemetry.io/otel/trace v1.0.1 go.uber.org/zap v1.19.0 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e golang.org/x/net v0.0.0-20210614182718-04defd469f4e diff --git a/go.sum b/go.sum index 3c55ae2f838..90de045e617 100644 --- a/go.sum +++ b/go.sum @@ -281,6 +281,8 @@ github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4 github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= +github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= @@ -976,18 +978,26 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.25.0 h1:FIbb8m2PtTWjvXLHOEnXAoSmkaiXbg3fuvoZAjsAT3Q= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.25.0/go.mod h1:NyB05cd+yPX6W5SiRNuJ90w7PV2+g2cgRbsPL7MvpME= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel v1.0.0 h1:qTTn6x71GVBvoafHK/yaRUmFzI4LcONZD0/kXxl5PHI= go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg= +go.opentelemetry.io/otel v1.0.1 h1:4XKyXmfqJLOQ7feyV5DB6gsBFZ0ltB8vLtp6pj4JIcc= +go.opentelemetry.io/otel v1.0.1/go.mod h1:OPEOD4jIT2SlZPMmwT6FqZz2C0ZNdQqiWcoK6M0SNFU= go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.0 h1:Vv4wbLEjheCTPV07jEav7fyUpJkyftQK7Ss2G7qgdSo= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.0/go.mod h1:3VqVbIbjAycfL1C7sIu/Uh/kACIUPWHztt8ODYwR3oM= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.0 h1:B9VtEB1u41Ohnl8U6rMCh1jjedu8HwFh4D0QeB+1N+0= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.0/go.mod h1:zhEt6O5GGJ3NCAICr4hlCPoDb2GQuh4Obb4gZBgkoQQ= +go.opentelemetry.io/otel/internal/metric v0.24.0 h1:O5lFy6kAl0LMWBjzy3k//M8VjEaTDWL9DPJuqZmWIAA= +go.opentelemetry.io/otel/internal/metric v0.24.0/go.mod h1:PSkQG+KuApZjBpC6ea6082ZrWUUy/w132tJ/LOU3TXk= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/metric v0.24.0 h1:Rg4UYHS6JKR1Sw1TxnI13z7q/0p/XAbgIqUTagvLJuU= +go.opentelemetry.io/otel/metric v0.24.0/go.mod h1:tpMFnCD9t+BEGiWY2bWF5+AwjuAdM0lSowQ4SBA3/K4= 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 v1.0.0 h1:BNPMYUONPNbLneMttKSjQhOTlFLOD9U22HNG1KrIN2Y= @@ -995,8 +1005,9 @@ go.opentelemetry.io/otel/sdk v1.0.0/go.mod h1:PCrDHlSy5x1kjezSdL37PhbFUMjrsLRshJ go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/otel/trace v1.0.0 h1:TSBr8GTEtKevYMG/2d21M989r5WJYVimhTHBKVEZuh4= go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs= +go.opentelemetry.io/otel/trace v1.0.1 h1:StTeIH6Q3G4r0Fiw34LTokUFESZgIDUr0qIJ7mKmAfw= +go.opentelemetry.io/otel/trace v1.0.1/go.mod h1:5g4i4fKLaX2BQpSBsxw8YYcgKpMMSW3x7ZTuYBr3sUk= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.9.0 h1:C0g6TWmQYvjKRnljRULLWUVJGy8Uvu0NEL/5frY2/t4= go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= diff --git a/modules/caddyhttp/opentelemetry/README.md b/modules/caddyhttp/opentelemetry/README.md index 6fda1a1b567..28eb2012ddb 100644 --- a/modules/caddyhttp/opentelemetry/README.md +++ b/modules/caddyhttp/opentelemetry/README.md @@ -18,10 +18,6 @@ IMPORTANT: Please, consider the version of [https://github.com/open-telemetry/opentelemetry-go](https://github.com/open-telemetry/opentelemetry-go). Some parts of the specification may be not implemented yet. -These environment variables are required by this module: -- `OTEL_EXPORTER_OTLP_PROTOCOL` or `OTEL_EXPORTER_OTLP_TRACES_PROTOCOL` -- `OTEL_PROPAGATORS` - If neither OTEL_EXPORTER_OTLP_INSECURE nor OTEL_EXPORTER_OTLP_SPAN_INSECURE is provided, then: 1. If OTEL_EXPORTER_OTLP_CERTIFICATE or OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE are specified they will be used for TLS. diff --git a/modules/caddyhttp/opentelemetry/module_test.go b/modules/caddyhttp/opentelemetry/module_test.go index 814b87c02e6..e48802c6454 100644 --- a/modules/caddyhttp/opentelemetry/module_test.go +++ b/modules/caddyhttp/opentelemetry/module_test.go @@ -120,8 +120,8 @@ func TestOpenTelemetry_Provision_WithoutEnvironmentVariables(t *testing.T) { ot := &OpenTelemetry{} - if err := ot.Provision(ctx); err == nil { - t.Errorf("Provision() error should not be nil") + if err := ot.Provision(ctx); err != nil { + t.Errorf("Provision() error should be nil") } } diff --git a/modules/caddyhttp/opentelemetry/tracer.go b/modules/caddyhttp/opentelemetry/tracer.go index 0e75ef720d0..2a15de8d97b 100644 --- a/modules/caddyhttp/opentelemetry/tracer.go +++ b/modules/caddyhttp/opentelemetry/tracer.go @@ -36,14 +36,14 @@ const ( envOtelExporterOtlpInsecure = "OTEL_EXPORTER_OTLP_INSECURE" envOtelExporterOtlpSpanInsecure = "OTEL_EXPORTER_OTLP_SPAN_INSECURE" - webEngineName = "Caddy" - defaultSpanName = "handler" + webEngineName = "Caddy" + defaultSpanName = "handler" + defaultOtelExporterOtlpProtocol = "grpc" + defaultOtelPropagators = "tracecontext" ) var ( - ErrUnspecifiedTracesProtocol = errors.New("unspecified opentelemetry traces protocol") ErrUnsupportedTracesProtocol = errors.New("unsupported opentelemetry traces protocol") - ErrUnspecifiedPropagators = errors.New("unspecified opentelemtry propagators") ) // openTelemetryWrapper is responsible for the tracing injection, extraction and propagation. @@ -82,7 +82,7 @@ func newOpenTelemetryWrapper( // Please check status of https://github.com/open-telemetry/opentelemetry-go/issues/1698. propagators := os.Getenv(envOtelPropagators) if propagators == "" { - return ot, ErrUnspecifiedPropagators + propagators = defaultOtelPropagators } ot.propagators = ot.getPropagators(propagators) @@ -153,6 +153,9 @@ func (ot *openTelemetryWrapper) newResource( // then default TLS with default `tls.Config` config will be used. func (ot *openTelemetryWrapper) getTracerExporter(ctx context.Context) (*otlptrace.Exporter, error) { exporterTracesProtocol := ot.getTracesProtocolFromEnv() + if exporterTracesProtocol == "" { + exporterTracesProtocol = defaultOtelExporterOtlpProtocol + } switch exporterTracesProtocol { case "grpc": @@ -168,8 +171,6 @@ func (ot *openTelemetryWrapper) getTracerExporter(ctx context.Context) (*otlptra } return otlptracegrpc.New(ctx, opts...) - case "": - return nil, ErrUnspecifiedTracesProtocol default: return nil, fmt.Errorf("%w: tracesProtocol %s", ErrUnsupportedTracesProtocol, exporterTracesProtocol) } diff --git a/modules/caddyhttp/opentelemetry/tracer_test.go b/modules/caddyhttp/opentelemetry/tracer_test.go index 72638c1dfd3..336dc6ced5c 100644 --- a/modules/caddyhttp/opentelemetry/tracer_test.go +++ b/modules/caddyhttp/opentelemetry/tracer_test.go @@ -13,15 +13,6 @@ func TestOpenTelemetry_newOpenTelemetryWrapper(t *testing.T) { ctx, cancel := caddy.NewContext(caddy.Context{Context: context.Background()}) defer cancel() - if err := th.SetEnv(); err != nil { - t.Errorf("Environment variable set error: %v", err) - } - defer func() { - if err := th.UnsetEnv(); err != nil { - t.Errorf("Environment variable set error: %v", err) - } - }() - var otw openTelemetryWrapper var err error @@ -48,26 +39,6 @@ func TestOpenTelemetry_newOpenTelemetryWrapper_Error(t *testing.T) { setEnv func() error unsetEnv func() error }{ - { - name: "With OTEL_EXPORTER_OTLP_PROTOCOL environment variables only", - setEnv: func() error { - return os.Setenv("OTEL_EXPORTER_OTLP_PROTOCOL", "grpc") - }, - unsetEnv: func() error { - return os.Unsetenv("OTEL_EXPORTER_OTLP_PROTOCOL") - }, - wantErrType: ErrUnspecifiedPropagators, - }, - { - name: "With OTEL_PROPAGATORS environment variables only", - setEnv: func() error { - return os.Setenv("OTEL_PROPAGATORS", "tracecontext,baggage") - }, - unsetEnv: func() error { - return os.Unsetenv("OTEL_PROPAGATORS") - }, - wantErrType: ErrUnspecifiedTracesProtocol, - }, { name: "Not supported protocol", setEnv: func() error { From 5a7d40bd49e56526c883451d34837cad253f0d58 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Mon, 11 Oct 2021 14:34:28 +0200 Subject: [PATCH 14/60] set http attributes with helper --- modules/caddyhttp/opentelemetry/tracer.go | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/modules/caddyhttp/opentelemetry/tracer.go b/modules/caddyhttp/opentelemetry/tracer.go index 2a15de8d97b..3bfb2d51a75 100644 --- a/modules/caddyhttp/opentelemetry/tracer.go +++ b/modules/caddyhttp/opentelemetry/tracer.go @@ -9,8 +9,6 @@ import ( "os" "strings" - "go.opentelemetry.io/otel/attribute" - caddycmd "github.com/caddyserver/caddy/v2/cmd" "github.com/caddyserver/caddy/v2/modules/caddyhttp" "go.opentelemetry.io/otel/exporters/otlp/otlptrace" @@ -98,13 +96,7 @@ func newOpenTelemetryWrapper( // ServeHTTP extract current tracing context or create a new one, then method propagates it to the wrapped next handler. func (ot *openTelemetryWrapper) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyhttp.Handler) error { - - commonLabels := []attribute.KeyValue{ - attribute.String("http.method", r.Method), - attribute.String("http.scheme", r.URL.Scheme), - attribute.String("http.host", r.Host), - attribute.String("http.user_agent", r.UserAgent()), - } + commonLabels := semconv.HTTPServerAttributesFromHTTPRequest("", "", r) // It will be default span kind as for now. Proper span kind (Span.Kind.LOAD_BALANCER (PROXY/SIDECAR)) is being discussed here https://github.com/open-telemetry/opentelemetry-specification/issues/51. ctx, span := ot.tracer.Start( From 5fcb4945e8df6843cd7300830d780d9c0dc73244 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Mon, 11 Oct 2021 14:39:38 +0200 Subject: [PATCH 15/60] simplify code --- modules/caddyhttp/opentelemetry/tracer.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/caddyhttp/opentelemetry/tracer.go b/modules/caddyhttp/opentelemetry/tracer.go index 3bfb2d51a75..bea37c5460d 100644 --- a/modules/caddyhttp/opentelemetry/tracer.go +++ b/modules/caddyhttp/opentelemetry/tracer.go @@ -96,13 +96,11 @@ func newOpenTelemetryWrapper( // ServeHTTP extract current tracing context or create a new one, then method propagates it to the wrapped next handler. func (ot *openTelemetryWrapper) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyhttp.Handler) error { - commonLabels := semconv.HTTPServerAttributesFromHTTPRequest("", "", r) - // It will be default span kind as for now. Proper span kind (Span.Kind.LOAD_BALANCER (PROXY/SIDECAR)) is being discussed here https://github.com/open-telemetry/opentelemetry-specification/issues/51. ctx, span := ot.tracer.Start( ot.propagators.Extract(r.Context(), propagation.HeaderCarrier(r.Header)), ot.spanName, - trace.WithAttributes(commonLabels...), + trace.WithAttributes(semconv.HTTPServerAttributesFromHTTPRequest("", "", r)...), ) defer span.End() From 1a39834f44aab542895e374218254e0314e369e5 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 09:50:25 +0100 Subject: [PATCH 16/60] Cleanup modules/caddyhttp/opentelemetry/README.md Co-authored-by: Dave Henderson --- modules/caddyhttp/opentelemetry/README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/caddyhttp/opentelemetry/README.md b/modules/caddyhttp/opentelemetry/README.md index 28eb2012ddb..446571741a1 100644 --- a/modules/caddyhttp/opentelemetry/README.md +++ b/modules/caddyhttp/opentelemetry/README.md @@ -14,9 +14,6 @@ It is based on `https://github.com/open-telemetry/opentelemetry-go`. It can be configured using the environment variables defined by the [OpenTelemetry Environment Variable Specification](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md). -IMPORTANT: Please, consider the version -of [https://github.com/open-telemetry/opentelemetry-go](https://github.com/open-telemetry/opentelemetry-go). Some parts -of the specification may be not implemented yet. If neither OTEL_EXPORTER_OTLP_INSECURE nor OTEL_EXPORTER_OTLP_SPAN_INSECURE is provided, then: From 3c5277ff1990e4224185846358d0d13d2fd01408 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 10:44:09 +0100 Subject: [PATCH 17/60] Update link in README.md Co-authored-by: Dave Henderson --- modules/caddyhttp/opentelemetry/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/caddyhttp/opentelemetry/README.md b/modules/caddyhttp/opentelemetry/README.md index 446571741a1..93c057c8dc6 100644 --- a/modules/caddyhttp/opentelemetry/README.md +++ b/modules/caddyhttp/opentelemetry/README.md @@ -22,7 +22,7 @@ If neither OTEL_EXPORTER_OTLP_INSECURE nor OTEL_EXPORTER_OTLP_SPAN_INSECURE is p TLS with the default `tls.Config` config will be used for an exporter. For the exporter configuration details, please -see [spec](https://github.com/open-telemetry/opentelemetry-specification/blob/a4440931b522c7351b0485ff4899f786b4ff4459/specification/protocol/exporter.md) +see [spec](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.7.0/specification/protocol/exporter.md) . Example: From 0f6602c6fca4f8fa11a264a3808f8c9c40e44ec4 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 11:10:33 +0100 Subject: [PATCH 18/60] Update documentation in README.md Co-authored-by: Dave Henderson --- modules/caddyhttp/opentelemetry/README.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/modules/caddyhttp/opentelemetry/README.md b/modules/caddyhttp/opentelemetry/README.md index 93c057c8dc6..5b7b4d95d3e 100644 --- a/modules/caddyhttp/opentelemetry/README.md +++ b/modules/caddyhttp/opentelemetry/README.md @@ -28,11 +28,8 @@ see [spec](https://github.com/open-telemetry/opentelemetry-specification/blob/v1 Example: ```bash -export OTEL_EXPORTER_OTLP_HEADERS="myAuthHeader=myToken" -export OTEL_EXPORTER_OTLP_PROTOCOL=grpc -export OTEL_PROPAGATORS=tracecontext,baggage -export OTEL_EXPORTER_OTLP_SPAN_INSECURE=false -export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=localhost:12345 +export OTEL_EXPORTER_OTLP_HEADERS="myAuthHeader=myToken,anotherHeader=value" +export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=https://my-otlp-endpoint:55680 ``` ### Caddy file configuration From e380d17a8a2af380f497d9b0d8758ca250e8a9ed Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 11:11:45 +0100 Subject: [PATCH 19/60] Update link to naming spec in README.md Co-authored-by: Dave Henderson --- modules/caddyhttp/opentelemetry/README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/caddyhttp/opentelemetry/README.md b/modules/caddyhttp/opentelemetry/README.md index 5b7b4d95d3e..92dca23dbae 100644 --- a/modules/caddyhttp/opentelemetry/README.md +++ b/modules/caddyhttp/opentelemetry/README.md @@ -45,6 +45,4 @@ handle /myHandler { } ``` -Please check span -naming [guideline](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#span) -. \ No newline at end of file +Please see span naming [guidelines](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.7.0/specification/trace/api.md). \ No newline at end of file From 7abe411c66cb1fcf83683a9987e63d3056a84a72 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 11:15:04 +0100 Subject: [PATCH 20/60] Rename module from opentelemetry to tracing Co-authored-by: Dave Henderson --- modules/caddyhttp/opentelemetry/module.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/caddyhttp/opentelemetry/module.go b/modules/caddyhttp/opentelemetry/module.go index ed67db4912b..8573ded68d1 100644 --- a/modules/caddyhttp/opentelemetry/module.go +++ b/modules/caddyhttp/opentelemetry/module.go @@ -13,8 +13,8 @@ import ( ) func init() { - caddy.RegisterModule(OpenTelemetry{}) - httpcaddyfile.RegisterHandlerDirective("opentelemetry", parseCaddyfile) + caddy.RegisterModule(Tracing{}) + httpcaddyfile.RegisterHandlerDirective("tracing", parseCaddyfile) } // OpenTelemetry implements an HTTP handler that adds support for the opentelemetry tracing. From e239a53640a4be86e7b09db4ced29adf786f2b13 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 11:20:24 +0100 Subject: [PATCH 21/60] Rename span_name to span Co-authored-by: Dave Henderson --- modules/caddyhttp/opentelemetry/module.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/caddyhttp/opentelemetry/module.go b/modules/caddyhttp/opentelemetry/module.go index 8573ded68d1..787658cc833 100644 --- a/modules/caddyhttp/opentelemetry/module.go +++ b/modules/caddyhttp/opentelemetry/module.go @@ -22,7 +22,7 @@ func init() { // OpenTelemetry module can be configured via environment variables https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md. Some values can be overwritten with values from the configuration file. type OpenTelemetry struct { // SpanName is a span name. It SHOULD follow the naming guideline https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#span - SpanName string `json:"span_name"` + SpanName string `json:"span"` // otel implements opentelemetry related logic. otel openTelemetryWrapper From 70fe0d2206decfc0bf9e48d8b91a540af9c6311f Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 11:20:33 +0100 Subject: [PATCH 22/60] Rename span_name to span Co-authored-by: Dave Henderson --- modules/caddyhttp/opentelemetry/module.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/caddyhttp/opentelemetry/module.go b/modules/caddyhttp/opentelemetry/module.go index 787658cc833..af29bed3f1d 100644 --- a/modules/caddyhttp/opentelemetry/module.go +++ b/modules/caddyhttp/opentelemetry/module.go @@ -86,7 +86,7 @@ func (ot *OpenTelemetry) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { // paramsMap is a mapping between "string" parameter from the Caddyfile and its destination within the module paramsMap := map[string]*string{ - "span_name": &ot.SpanName, + "span": &ot.SpanName, } for d.Next() { From 8d75f56a9431c619ee20aed6f46da49c08f5ae29 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 11:22:52 +0100 Subject: [PATCH 23/60] Simplify otel resource creation Co-authored-by: Dave Henderson --- modules/caddyhttp/opentelemetry/tracer.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/modules/caddyhttp/opentelemetry/tracer.go b/modules/caddyhttp/opentelemetry/tracer.go index bea37c5460d..09e5215d86b 100644 --- a/modules/caddyhttp/opentelemetry/tracer.go +++ b/modules/caddyhttp/opentelemetry/tracer.go @@ -125,11 +125,7 @@ func (ot *openTelemetryWrapper) newResource( semconv.WebEngineVersionKey.String(webEngineVersion), ) - caddyResource, err := resource.New(ctx, - option, - resource.WithFromEnv(), - ) - + caddyResource, err := resource.New(ctx, option) if err != nil { return nil, err } From c21b4175b4038cedc1103572be7b9922da9eea27 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 11:29:46 +0100 Subject: [PATCH 24/60] handle extra attributes Co-authored-by: Dave Henderson --- modules/caddyhttp/opentelemetry/tracer.go | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/modules/caddyhttp/opentelemetry/tracer.go b/modules/caddyhttp/opentelemetry/tracer.go index 09e5215d86b..cca276f6c49 100644 --- a/modules/caddyhttp/opentelemetry/tracer.go +++ b/modules/caddyhttp/opentelemetry/tracer.go @@ -96,17 +96,27 @@ func newOpenTelemetryWrapper( // ServeHTTP extract current tracing context or create a new one, then method propagates it to the wrapped next handler. func (ot *openTelemetryWrapper) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyhttp.Handler) error { - // It will be default span kind as for now. Proper span kind (Span.Kind.LOAD_BALANCER (PROXY/SIDECAR)) is being discussed here https://github.com/open-telemetry/opentelemetry-specification/issues/51. - ctx, span := ot.tracer.Start( - ot.propagators.Extract(r.Context(), propagation.HeaderCarrier(r.Header)), - ot.spanName, + opts := []trace.SpanStartOption{ + trace.WithAttributes(semconv.NetAttributesFromHTTPRequest("tcp", r)...), + trace.WithAttributes(semconv.EndUserAttributesFromHTTPRequest(r)...), trace.WithAttributes(semconv.HTTPServerAttributesFromHTTPRequest("", "", r)...), - ) + } + + ctx := ot.propagators.Extract(r.Context(), propagation.HeaderCarrier(r.Header)) + + // It will be default span kind as for now. Proper span kind (Span.Kind.LOAD_BALANCER (PROXY/SIDECAR)) is being discussed here https://github.com/open-telemetry/opentelemetry-specification/issues/51. + ctx, span := ot.tracer.Start(ctx, ot.spanName, opts...) defer span.End() ot.propagators.Inject(ctx, propagation.HeaderCarrier(r.Header)) - return next.ServeHTTP(w, r) + err := next.ServeHTTP(w, r) + if err != nil { + span.RecordError(err) + return err + } + + return nil } // cleanup flush all remaining data and shutdown a tracerProvider From 2e147e3b38c56871587c8ba5df79336a3470bb76 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 11:31:46 +0100 Subject: [PATCH 25/60] update go.opentelemetry.io/otel/semconv to 1.7.0 Co-authored-by: Dave Henderson --- modules/caddyhttp/opentelemetry/tracer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/caddyhttp/opentelemetry/tracer.go b/modules/caddyhttp/opentelemetry/tracer.go index cca276f6c49..2e03b77dd6a 100644 --- a/modules/caddyhttp/opentelemetry/tracer.go +++ b/modules/caddyhttp/opentelemetry/tracer.go @@ -16,7 +16,7 @@ import ( "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" - semconv "go.opentelemetry.io/otel/semconv/v1.4.0" + semconv "go.opentelemetry.io/otel/semconv/v1.7.0" "go.opentelemetry.io/otel/trace" "go.uber.org/zap" "google.golang.org/grpc/credentials" From 3453c140189afe6e7b26136d72f26292cf26cd5c Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 10:32:26 +0100 Subject: [PATCH 26/60] update go.opentelemetry.io/otel version --- go.mod | 11 +++++------ go.sum | 39 ++++++++++++++------------------------- 2 files changed, 19 insertions(+), 31 deletions(-) diff --git a/go.mod b/go.mod index 3ce31354798..7fa53ab9714 100644 --- a/go.mod +++ b/go.mod @@ -24,17 +24,16 @@ require ( github.com/smallstep/truststore v0.9.6 github.com/yuin/goldmark v1.4.0 github.com/yuin/goldmark-highlighting v0.0.0-20210516132338-9216f9c5aa01 - go.opentelemetry.io/otel v1.0.1 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.0 - go.opentelemetry.io/otel/sdk v1.0.0 - go.opentelemetry.io/otel/trace v1.0.1 + go.opentelemetry.io/otel v1.1.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.1.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.1.0 + go.opentelemetry.io/otel/sdk v1.1.0 + go.opentelemetry.io/otel/trace v1.1.0 go.uber.org/zap v1.19.0 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e golang.org/x/net v0.0.0-20210614182718-04defd469f4e golang.org/x/term v0.0.0-20210503060354-a79de5458b56 google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08 - google.golang.org/grpc v1.40.0 google.golang.org/protobuf v1.27.1 gopkg.in/natefinch/lumberjack.v2 v2.0.0 gopkg.in/yaml.v2 v2.4.0 diff --git a/go.sum b/go.sum index 90de045e617..70c7ba89f66 100644 --- a/go.sum +++ b/go.sum @@ -204,7 +204,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= @@ -275,14 +275,12 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +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/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= -github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= @@ -978,36 +976,27 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.25.0 h1:FIbb8m2PtTWjvXLHOEnXAoSmkaiXbg3fuvoZAjsAT3Q= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.25.0/go.mod h1:NyB05cd+yPX6W5SiRNuJ90w7PV2+g2cgRbsPL7MvpME= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg= -go.opentelemetry.io/otel v1.0.1 h1:4XKyXmfqJLOQ7feyV5DB6gsBFZ0ltB8vLtp6pj4JIcc= -go.opentelemetry.io/otel v1.0.1/go.mod h1:OPEOD4jIT2SlZPMmwT6FqZz2C0ZNdQqiWcoK6M0SNFU= +go.opentelemetry.io/otel v1.1.0 h1:8p0uMLcyyIx0KHNTgO8o3CW8A1aA+dJZJW6PvnMz0Wc= +go.opentelemetry.io/otel v1.1.0/go.mod h1:7cww0OW51jQ8IaZChIEdqLwgh+44+7uiTdWsAL0wQpA= go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.0 h1:Vv4wbLEjheCTPV07jEav7fyUpJkyftQK7Ss2G7qgdSo= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.0/go.mod h1:3VqVbIbjAycfL1C7sIu/Uh/kACIUPWHztt8ODYwR3oM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.0 h1:B9VtEB1u41Ohnl8U6rMCh1jjedu8HwFh4D0QeB+1N+0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.0/go.mod h1:zhEt6O5GGJ3NCAICr4hlCPoDb2GQuh4Obb4gZBgkoQQ= -go.opentelemetry.io/otel/internal/metric v0.24.0 h1:O5lFy6kAl0LMWBjzy3k//M8VjEaTDWL9DPJuqZmWIAA= -go.opentelemetry.io/otel/internal/metric v0.24.0/go.mod h1:PSkQG+KuApZjBpC6ea6082ZrWUUy/w132tJ/LOU3TXk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.1.0 h1:PxBRMkrJnY4HRgToPzoLrTdQDHQf9MeFg5oGzTqtzco= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.1.0/go.mod h1:/E4iniSqAEvqbq6KM5qThKZR2sd42kDvD+SrYt00vRw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.1.0 h1:4UC7muAl2UqSoTV0RqgmpTz/cRLH6R9cHt9BvVcq5Bo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.1.0/go.mod h1:Gyc0evUosTBVNRqTFGuu0xqebkEWLkLwv42qggTCwro= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/metric v0.24.0 h1:Rg4UYHS6JKR1Sw1TxnI13z7q/0p/XAbgIqUTagvLJuU= -go.opentelemetry.io/otel/metric v0.24.0/go.mod h1:tpMFnCD9t+BEGiWY2bWF5+AwjuAdM0lSowQ4SBA3/K4= 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 v1.0.0 h1:BNPMYUONPNbLneMttKSjQhOTlFLOD9U22HNG1KrIN2Y= -go.opentelemetry.io/otel/sdk v1.0.0/go.mod h1:PCrDHlSy5x1kjezSdL37PhbFUMjrsLRshJ2zCzeXwbM= +go.opentelemetry.io/otel/sdk v1.1.0 h1:j/1PngUJIDOddkCILQYTevrTIbWd494djgGkSsMit+U= +go.opentelemetry.io/otel/sdk v1.1.0/go.mod h1:3aQvM6uLm6C4wJpHtT8Od3vNzeZ34Pqc6bps8MywWzo= go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs= -go.opentelemetry.io/otel/trace v1.0.1 h1:StTeIH6Q3G4r0Fiw34LTokUFESZgIDUr0qIJ7mKmAfw= -go.opentelemetry.io/otel/trace v1.0.1/go.mod h1:5g4i4fKLaX2BQpSBsxw8YYcgKpMMSW3x7ZTuYBr3sUk= +go.opentelemetry.io/otel/trace v1.1.0 h1:N25T9qCL0+7IpOT8RrRy0WYlL7y6U0WiUJzXcVdXY/o= +go.opentelemetry.io/otel/trace v1.1.0/go.mod h1:i47XtdcBQiktu5IsrPqOHe8w+sBmnLwwHt8wiUsWGTI= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.9.0 h1:C0g6TWmQYvjKRnljRULLWUVJGy8Uvu0NEL/5frY2/t4= go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= @@ -1518,8 +1507,8 @@ google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.41.0 h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E= +google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= 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= From a8041eb4de0de6084418d158f6587ec140463531 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 10:34:19 +0100 Subject: [PATCH 27/60] remove environment variable handling --- modules/caddyhttp/opentelemetry/tracer.go | 75 ++--------------------- 1 file changed, 4 insertions(+), 71 deletions(-) diff --git a/modules/caddyhttp/opentelemetry/tracer.go b/modules/caddyhttp/opentelemetry/tracer.go index 2e03b77dd6a..345288896a6 100644 --- a/modules/caddyhttp/opentelemetry/tracer.go +++ b/modules/caddyhttp/opentelemetry/tracer.go @@ -2,7 +2,6 @@ package opentelemetry import ( "context" - "crypto/tls" "errors" "fmt" "net/http" @@ -11,7 +10,6 @@ import ( caddycmd "github.com/caddyserver/caddy/v2/cmd" "github.com/caddyserver/caddy/v2/modules/caddyhttp" - "go.opentelemetry.io/otel/exporters/otlp/otlptrace" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/sdk/resource" @@ -19,25 +17,14 @@ import ( semconv "go.opentelemetry.io/otel/semconv/v1.7.0" "go.opentelemetry.io/otel/trace" "go.uber.org/zap" - "google.golang.org/grpc/credentials" ) const ( envOtelPropagators = "OTEL_PROPAGATORS" - envOtelExporterOtlpProtocol = "OTEL_EXPORTER_OTLP_PROTOCOL" - envOtelExporterOtlpTracesProtocol = "OTEL_EXPORTER_OTLP_TRACES_PROTOCOL" - - envOtelExporterOtlpCertificate = "OTEL_EXPORTER_OTLP_CERTIFICATE" - envOtelExporterOtlpTracesCertificate = "OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE" - - envOtelExporterOtlpInsecure = "OTEL_EXPORTER_OTLP_INSECURE" - envOtelExporterOtlpSpanInsecure = "OTEL_EXPORTER_OTLP_SPAN_INSECURE" - - webEngineName = "Caddy" - defaultSpanName = "handler" - defaultOtelExporterOtlpProtocol = "grpc" - defaultOtelPropagators = "tracecontext" + webEngineName = "Caddy" + defaultSpanName = "handler" + defaultOtelPropagators = "tracecontext" ) var ( @@ -70,8 +57,7 @@ func newOpenTelemetryWrapper( return ot, fmt.Errorf("creating resource error: %w", err) } - // - traceExporter, err := ot.getTracerExporter(ctx) + traceExporter, err := otlptracegrpc.New(ctx) if err != nil { return ot, fmt.Errorf("creating trace exporter error: %w", err) } @@ -143,59 +129,6 @@ func (ot *openTelemetryWrapper) newResource( return resource.Merge(resource.Default(), caddyResource) } -// getTracerExporter returns protocol specific exporter or error if the protocol is not supported by current module implementation. -// -// If opentelemetry is not configured with "insecure" parameter and certificate related headers missed, -// then default TLS with default `tls.Config` config will be used. -func (ot *openTelemetryWrapper) getTracerExporter(ctx context.Context) (*otlptrace.Exporter, error) { - exporterTracesProtocol := ot.getTracesProtocolFromEnv() - if exporterTracesProtocol == "" { - exporterTracesProtocol = defaultOtelExporterOtlpProtocol - } - - switch exporterTracesProtocol { - case "grpc": - var opts []otlptracegrpc.Option - if ot.getInsecureFromEnv() { - opts = append(opts, otlptracegrpc.WithInsecure()) - } else { - if !ot.isCertificateHeaderSet() { - var tlsConf tls.Config - transportCredentials := credentials.NewTLS(&tlsConf) - opts = append(opts, otlptracegrpc.WithTLSCredentials(transportCredentials)) - } - } - - return otlptracegrpc.New(ctx, opts...) - default: - return nil, fmt.Errorf("%w: tracesProtocol %s", ErrUnsupportedTracesProtocol, exporterTracesProtocol) - } -} - -// getTracesProtocolFromEnv returns opentelemetry exporter otlp protocol, if it is specified via environment variable or empty string if not. -func (ot *openTelemetryWrapper) getTracesProtocolFromEnv() string { - protocol := os.Getenv(envOtelExporterOtlpTracesProtocol) - if protocol == "" { - protocol = os.Getenv(envOtelExporterOtlpProtocol) - } - - return protocol -} - -// getInsecureFromEnv returns value of "insecure" option if it was specified by environment variable. -func (ot *openTelemetryWrapper) getInsecureFromEnv() bool { - insecure := os.Getenv(envOtelExporterOtlpSpanInsecure) - if insecure == "" { - insecure = os.Getenv(envOtelExporterOtlpInsecure) - } - - return strings.ToLower(insecure) == "true" -} - -func (ot *openTelemetryWrapper) isCertificateHeaderSet() bool { - return os.Getenv(envOtelExporterOtlpCertificate) != "" || os.Getenv(envOtelExporterOtlpTracesCertificate) != "" -} - // getPropagators deduplicate propagators, according to the specification https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md#general-sdk-configuration. // Parameter propagators is a "," separated string, ex: "baggage,tracecontext". // Current implementation supports only "baggage" and "tracecontext" values. From 9102435586b858aaad7485ace2a850144779c73c Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 10:36:40 +0100 Subject: [PATCH 28/60] always use tracecontext,baggage as propagators --- modules/caddyhttp/opentelemetry/tracer.go | 47 ++--------------------- 1 file changed, 4 insertions(+), 43 deletions(-) diff --git a/modules/caddyhttp/opentelemetry/tracer.go b/modules/caddyhttp/opentelemetry/tracer.go index 345288896a6..15a0d9550f9 100644 --- a/modules/caddyhttp/opentelemetry/tracer.go +++ b/modules/caddyhttp/opentelemetry/tracer.go @@ -4,10 +4,6 @@ import ( "context" "errors" "fmt" - "net/http" - "os" - "strings" - caddycmd "github.com/caddyserver/caddy/v2/cmd" "github.com/caddyserver/caddy/v2/modules/caddyhttp" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" @@ -17,14 +13,12 @@ import ( semconv "go.opentelemetry.io/otel/semconv/v1.7.0" "go.opentelemetry.io/otel/trace" "go.uber.org/zap" + "net/http" ) const ( - envOtelPropagators = "OTEL_PROPAGATORS" - - webEngineName = "Caddy" - defaultSpanName = "handler" - defaultOtelPropagators = "tracecontext" + webEngineName = "Caddy" + defaultSpanName = "handler" ) var ( @@ -62,14 +56,7 @@ func newOpenTelemetryWrapper( return ot, fmt.Errorf("creating trace exporter error: %w", err) } - // handle propagators related configuration, because it is not supported by opentelemetry lib yet. - // Please check status of https://github.com/open-telemetry/opentelemetry-go/issues/1698. - propagators := os.Getenv(envOtelPropagators) - if propagators == "" { - propagators = defaultOtelPropagators - } - - ot.propagators = ot.getPropagators(propagators) + ot.propagators = propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}) // create a tracer ot.tracer = globalTracerProvider.getTracerProvider( @@ -128,29 +115,3 @@ func (ot *openTelemetryWrapper) newResource( return resource.Merge(resource.Default(), caddyResource) } - -// getPropagators deduplicate propagators, according to the specification https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md#general-sdk-configuration. -// Parameter propagators is a "," separated string, ex: "baggage,tracecontext". -// Current implementation supports only "baggage" and "tracecontext" values. -func (ot *openTelemetryWrapper) getPropagators(propagators string) propagation.TextMapPropagator { - // deduplicationMap filters duplicated propagator - deduplicationMap := make(map[string]struct{}) - - // store unique values - var propagatorsList []propagation.TextMapPropagator - - for _, v := range strings.Split(propagators, ",") { - propagatorName := strings.TrimSpace(v) - if _, ok := deduplicationMap[propagatorName]; !ok { - deduplicationMap[propagatorName] = struct{}{} - switch propagatorName { - case "baggage": - propagatorsList = append(propagatorsList, propagation.Baggage{}) - case "tracecontext": - propagatorsList = append(propagatorsList, propagation.TraceContext{}) - } - } - } - - return propagation.NewCompositeTextMapPropagator(propagatorsList...) -} From c8977fd410ff3c49a4a35d7acc5ea62bafb66fc4 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 10:42:50 +0100 Subject: [PATCH 29/60] extract tracer name into variable --- modules/caddyhttp/opentelemetry/tracer.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/caddyhttp/opentelemetry/tracer.go b/modules/caddyhttp/opentelemetry/tracer.go index 15a0d9550f9..649e76be32c 100644 --- a/modules/caddyhttp/opentelemetry/tracer.go +++ b/modules/caddyhttp/opentelemetry/tracer.go @@ -19,6 +19,7 @@ import ( const ( webEngineName = "Caddy" defaultSpanName = "handler" + tracerName = "github.com/caddyserver/caddy/v2/modules/caddyhttp/opentelemetry" ) var ( @@ -62,7 +63,7 @@ func newOpenTelemetryWrapper( ot.tracer = globalTracerProvider.getTracerProvider( sdktrace.WithBatcher(traceExporter), sdktrace.WithResource(res), - ).Tracer("github.com/caddyserver/caddy/v2/modules/caddyhttp/opentelemetry") + ).Tracer(tracerName) return ot, nil } From 23d3500b2dd9c77d798e2e3717c31947ed313f4f Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 11:19:59 +0100 Subject: [PATCH 30/60] rename OpenTelemetry to Tracing --- caddyconfig/httpcaddyfile/directives.go | 2 +- .../{opentelemetry.txt => tracing.txt} | 2 +- modules/caddyhttp/opentelemetry/module.go | 32 +++++++++---------- .../caddyhttp/opentelemetry/module_test.go | 12 +++---- modules/caddyhttp/opentelemetry/tracer.go | 2 +- .../caddyhttp/opentelemetry/tracer_test.go | 2 +- 6 files changed, 26 insertions(+), 26 deletions(-) rename caddytest/integration/caddyfile_adapt/{opentelemetry.txt => tracing.txt} (91%) diff --git a/caddyconfig/httpcaddyfile/directives.go b/caddyconfig/httpcaddyfile/directives.go index d97bd283ebf..ba0d0d0ce89 100644 --- a/caddyconfig/httpcaddyfile/directives.go +++ b/caddyconfig/httpcaddyfile/directives.go @@ -37,7 +37,7 @@ import ( // The header directive goes second so that headers // can be manipulated before doing redirects. var directiveOrder = []string{ - "opentelemetry", + "tracing", "map", "root", diff --git a/caddytest/integration/caddyfile_adapt/opentelemetry.txt b/caddytest/integration/caddyfile_adapt/tracing.txt similarity index 91% rename from caddytest/integration/caddyfile_adapt/opentelemetry.txt rename to caddytest/integration/caddyfile_adapt/tracing.txt index d81a3fc2d6a..17ad3343ed7 100644 --- a/caddytest/integration/caddyfile_adapt/opentelemetry.txt +++ b/caddytest/integration/caddyfile_adapt/tracing.txt @@ -23,7 +23,7 @@ ], "handle": [ { - "handler": "opentelemetry", + "handler": "tracing", "span_name": "my-span" } ] diff --git a/modules/caddyhttp/opentelemetry/module.go b/modules/caddyhttp/opentelemetry/module.go index af29bed3f1d..b0950049198 100644 --- a/modules/caddyhttp/opentelemetry/module.go +++ b/modules/caddyhttp/opentelemetry/module.go @@ -17,10 +17,10 @@ func init() { httpcaddyfile.RegisterHandlerDirective("tracing", parseCaddyfile) } -// OpenTelemetry implements an HTTP handler that adds support for the opentelemetry tracing. +// Tracing implements an HTTP handler that adds support for the opentelemetry tracing. // It is responsible for the injection and propagation of the tracing contexts. -// OpenTelemetry module can be configured via environment variables https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md. Some values can be overwritten with values from the configuration file. -type OpenTelemetry struct { +// Tracing module can be configured via environment variables https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md. Some values can be overwritten with values from the configuration file. +type Tracing struct { // SpanName is a span name. It SHOULD follow the naming guideline https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#span SpanName string `json:"span"` @@ -31,15 +31,15 @@ type OpenTelemetry struct { } // CaddyModule returns the Caddy module information. -func (OpenTelemetry) CaddyModule() caddy.ModuleInfo { +func (Tracing) CaddyModule() caddy.ModuleInfo { return caddy.ModuleInfo{ - ID: "http.handlers.opentelemetry", - New: func() caddy.Module { return new(OpenTelemetry) }, + ID: "http.handlers.tracing", + New: func() caddy.Module { return new(Tracing) }, } } // Provision implements caddy.Provisioner. -func (ot *OpenTelemetry) Provision(ctx caddy.Context) error { +func (ot *Tracing) Provision(ctx caddy.Context) error { ot.logger = ctx.Logger(ot) var err error @@ -49,7 +49,7 @@ func (ot *OpenTelemetry) Provision(ctx caddy.Context) error { } // Cleanup implements caddy.CleanerUpper and closes any idle connections. It calls Shutdown method for a trace provider https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/sdk.md#shutdown. -func (ot *OpenTelemetry) Cleanup() error { +func (ot *Tracing) Cleanup() error { if err := ot.otel.cleanup(ot.logger); err != nil { return fmt.Errorf("tracerProvider shutdown: %w", err) } @@ -57,7 +57,7 @@ func (ot *OpenTelemetry) Cleanup() error { } // Validate implements caddy.Validator. -func (ot *OpenTelemetry) Validate() error { +func (ot *Tracing) Validate() error { if ot.otel.tracer == nil { return errors.New("openTelemetry tracer is nil") } @@ -66,12 +66,12 @@ func (ot *OpenTelemetry) Validate() error { } // ServeHTTP implements caddyhttp.MiddlewareHandler. -func (ot *OpenTelemetry) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyhttp.Handler) error { +func (ot *Tracing) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyhttp.Handler) error { return ot.otel.ServeHTTP(w, r, next) } // UnmarshalCaddyfile sets up the module from Caddyfile tokens. -func (ot *OpenTelemetry) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { +func (ot *Tracing) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { setParameter := func(d *caddyfile.Dispenser, val *string) error { if d.NextArg() { *val = d.Val() @@ -109,15 +109,15 @@ func (ot *OpenTelemetry) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { } func parseCaddyfile(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error) { - var m OpenTelemetry + var m Tracing err := m.UnmarshalCaddyfile(h.Dispenser) return &m, err } // Interface guards var ( - _ caddy.Provisioner = (*OpenTelemetry)(nil) - _ caddy.Validator = (*OpenTelemetry)(nil) - _ caddyhttp.MiddlewareHandler = (*OpenTelemetry)(nil) - _ caddyfile.Unmarshaler = (*OpenTelemetry)(nil) + _ caddy.Provisioner = (*Tracing)(nil) + _ caddy.Validator = (*Tracing)(nil) + _ caddyhttp.MiddlewareHandler = (*Tracing)(nil) + _ caddyfile.Unmarshaler = (*Tracing)(nil) ) diff --git a/modules/caddyhttp/opentelemetry/module_test.go b/modules/caddyhttp/opentelemetry/module_test.go index e48802c6454..1af1ea29572 100644 --- a/modules/caddyhttp/opentelemetry/module_test.go +++ b/modules/caddyhttp/opentelemetry/module_test.go @@ -48,7 +48,7 @@ opentelemetry { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - ot := &OpenTelemetry{} + ot := &Tracing{} if err := ot.UnmarshalCaddyfile(tt.d); (err != nil) != tt.wantErr { t.Errorf("UnmarshalCaddyfile() error = %v, wantErrType %v", err, tt.wantErr) } @@ -85,7 +85,7 @@ opentelemetry { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - ot := &OpenTelemetry{} + ot := &Tracing{} if err := ot.UnmarshalCaddyfile(tt.d); (err != nil) != tt.wantErr { t.Errorf("UnmarshalCaddyfile() error = %v, wantErrType %v", err, tt.wantErr) } @@ -107,7 +107,7 @@ func TestOpenTelemetry_Provision(t *testing.T) { } }() - ot := &OpenTelemetry{} + ot := &Tracing{} if err := ot.Provision(ctx); err != nil { t.Errorf("Provision() error = %v", err) @@ -118,7 +118,7 @@ func TestOpenTelemetry_Provision_WithoutEnvironmentVariables(t *testing.T) { ctx, cancel := caddy.NewContext(caddy.Context{Context: context.Background()}) defer cancel() - ot := &OpenTelemetry{} + ot := &Tracing{} if err := ot.Provision(ctx); err != nil { t.Errorf("Provision() error should be nil") @@ -136,7 +136,7 @@ func TestOpenTelemetry_ServeHTTP_Propagation_Without_Initial_Headers(t *testing. } }() - ot := &OpenTelemetry{ + ot := &Tracing{ SpanName: "mySpan", } @@ -176,7 +176,7 @@ func TestOpenTelemetry_ServeHTTP_Propagation_With_Initial_Headers(t *testing.T) } }() - ot := &OpenTelemetry{ + ot := &Tracing{ SpanName: "mySpan", } diff --git a/modules/caddyhttp/opentelemetry/tracer.go b/modules/caddyhttp/opentelemetry/tracer.go index 649e76be32c..24ec71e80d9 100644 --- a/modules/caddyhttp/opentelemetry/tracer.go +++ b/modules/caddyhttp/opentelemetry/tracer.go @@ -19,7 +19,7 @@ import ( const ( webEngineName = "Caddy" defaultSpanName = "handler" - tracerName = "github.com/caddyserver/caddy/v2/modules/caddyhttp/opentelemetry" + tracerName = "github.com/caddyserver/caddy/v2/modules/caddyhttp/tracing" ) var ( diff --git a/modules/caddyhttp/opentelemetry/tracer_test.go b/modules/caddyhttp/opentelemetry/tracer_test.go index 336dc6ced5c..dc4e7898582 100644 --- a/modules/caddyhttp/opentelemetry/tracer_test.go +++ b/modules/caddyhttp/opentelemetry/tracer_test.go @@ -97,7 +97,7 @@ func Test_openTelemetryWrapper_newResource_WithServiceName(t *testing.T) { for k, v := range map[string]string{ "telemetry.sdk.language": "go", - "telemetry.sdk.name": "opentelemetry", + "telemetry.sdk.name": "tracing", "webengine.version": "Version 1", "webengine.name": "TestEngine", "service.name": "MyService", From 4a12e48d4eaa816af22f6ecd0603fa34b9466a1b Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 11:27:54 +0100 Subject: [PATCH 31/60] simplify resource creation --- modules/caddyhttp/opentelemetry/tracer.go | 14 +++----------- modules/caddyhttp/opentelemetry/tracer_test.go | 2 +- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/modules/caddyhttp/opentelemetry/tracer.go b/modules/caddyhttp/opentelemetry/tracer.go index 24ec71e80d9..442824b6681 100644 --- a/modules/caddyhttp/opentelemetry/tracer.go +++ b/modules/caddyhttp/opentelemetry/tracer.go @@ -47,7 +47,7 @@ func newOpenTelemetryWrapper( spanName: spanName, } - res, err := ot.newResource(ctx, webEngineName, caddycmd.CaddyVersion()) + res, err := ot.newResource(webEngineName, caddycmd.CaddyVersion()) if err != nil { return ot, fmt.Errorf("creating resource error: %w", err) } @@ -100,19 +100,11 @@ func (ot *openTelemetryWrapper) cleanup(logger *zap.Logger) error { // newResource creates a resource that describe current handler instance and merge it with a default attributes value. func (ot *openTelemetryWrapper) newResource( - ctx context.Context, webEngineName, webEngineVersion string, ) (*resource.Resource, error) { - option := resource.WithAttributes( + return resource.Merge(resource.Default(), resource.NewSchemaless( semconv.WebEngineNameKey.String(webEngineName), semconv.WebEngineVersionKey.String(webEngineVersion), - ) - - caddyResource, err := resource.New(ctx, option) - if err != nil { - return nil, err - } - - return resource.Merge(resource.Default(), caddyResource) + )) } diff --git a/modules/caddyhttp/opentelemetry/tracer_test.go b/modules/caddyhttp/opentelemetry/tracer_test.go index dc4e7898582..d1e577a3e14 100644 --- a/modules/caddyhttp/opentelemetry/tracer_test.go +++ b/modules/caddyhttp/opentelemetry/tracer_test.go @@ -79,7 +79,7 @@ func Test_openTelemetryWrapper_newResource_WithServiceName(t *testing.T) { err := os.Setenv("OTEL_SERVICE_NAME", "MyService") defer os.Unsetenv("OTEL_SERVICE_NAME") - res, err := (&openTelemetryWrapper{}).newResource(context.Background(), "TestEngine", "Version 1") + res, err := (&openTelemetryWrapper{}).newResource("TestEngine", "Version 1") if err != nil { t.Errorf("can not create resource: %v", err) From c70f0e94efa940815c281cf9ce71c1f8b17957d7 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 11:33:08 +0100 Subject: [PATCH 32/60] update go.mod --- go.mod | 1 - 1 file changed, 1 deletion(-) diff --git a/go.mod b/go.mod index 7fa53ab9714..c4c8868de77 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,6 @@ require ( github.com/yuin/goldmark v1.4.0 github.com/yuin/goldmark-highlighting v0.0.0-20210516132338-9216f9c5aa01 go.opentelemetry.io/otel v1.1.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.1.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.1.0 go.opentelemetry.io/otel/sdk v1.1.0 go.opentelemetry.io/otel/trace v1.1.0 From 61fbe68e2c8e14c18f1cb3878891ceebba8678d6 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 11:41:38 +0100 Subject: [PATCH 33/60] rename package from opentelemetry to tracing --- .../integration/caddyfile_adapt/tracing.txt | 2 +- modules/caddyhttp/standard/imports.go | 2 +- .../{opentelemetry => tracing}/README.md | 0 .../{opentelemetry => tracing}/module.go | 4 +- .../{opentelemetry => tracing}/module_test.go | 12 ++--- .../{opentelemetry => tracing}/tracer.go | 7 +-- .../{opentelemetry => tracing}/tracer_test.go | 46 +------------------ .../tracerprovider.go | 2 +- .../tracerprovider_test.go | 2 +- 9 files changed, 14 insertions(+), 63 deletions(-) rename modules/caddyhttp/{opentelemetry => tracing}/README.md (100%) rename modules/caddyhttp/{opentelemetry => tracing}/module.go (97%) rename modules/caddyhttp/{opentelemetry => tracing}/module_test.go (98%) rename modules/caddyhttp/{opentelemetry => tracing}/tracer.go (96%) rename modules/caddyhttp/{opentelemetry => tracing}/tracer_test.go (59%) rename modules/caddyhttp/{opentelemetry => tracing}/tracerprovider.go (98%) rename modules/caddyhttp/{opentelemetry => tracing}/tracerprovider_test.go (97%) diff --git a/caddytest/integration/caddyfile_adapt/tracing.txt b/caddytest/integration/caddyfile_adapt/tracing.txt index 17ad3343ed7..1a5af65735e 100644 --- a/caddytest/integration/caddyfile_adapt/tracing.txt +++ b/caddytest/integration/caddyfile_adapt/tracing.txt @@ -1,5 +1,5 @@ :80 { - opentelemetry /myhandler { + tracing /myhandler { span_name my-span } } diff --git a/modules/caddyhttp/standard/imports.go b/modules/caddyhttp/standard/imports.go index 79dd8aaf01e..8ce239579a5 100644 --- a/modules/caddyhttp/standard/imports.go +++ b/modules/caddyhttp/standard/imports.go @@ -11,11 +11,11 @@ import ( _ "github.com/caddyserver/caddy/v2/modules/caddyhttp/fileserver" _ "github.com/caddyserver/caddy/v2/modules/caddyhttp/headers" _ "github.com/caddyserver/caddy/v2/modules/caddyhttp/map" - _ "github.com/caddyserver/caddy/v2/modules/caddyhttp/opentelemetry" _ "github.com/caddyserver/caddy/v2/modules/caddyhttp/push" _ "github.com/caddyserver/caddy/v2/modules/caddyhttp/requestbody" _ "github.com/caddyserver/caddy/v2/modules/caddyhttp/reverseproxy" _ "github.com/caddyserver/caddy/v2/modules/caddyhttp/reverseproxy/fastcgi" _ "github.com/caddyserver/caddy/v2/modules/caddyhttp/rewrite" _ "github.com/caddyserver/caddy/v2/modules/caddyhttp/templates" + _ "github.com/caddyserver/caddy/v2/modules/caddyhttp/tracing" ) diff --git a/modules/caddyhttp/opentelemetry/README.md b/modules/caddyhttp/tracing/README.md similarity index 100% rename from modules/caddyhttp/opentelemetry/README.md rename to modules/caddyhttp/tracing/README.md diff --git a/modules/caddyhttp/opentelemetry/module.go b/modules/caddyhttp/tracing/module.go similarity index 97% rename from modules/caddyhttp/opentelemetry/module.go rename to modules/caddyhttp/tracing/module.go index b0950049198..c52f06d4d4b 100644 --- a/modules/caddyhttp/opentelemetry/module.go +++ b/modules/caddyhttp/tracing/module.go @@ -1,4 +1,4 @@ -package opentelemetry +package tracing import ( "errors" @@ -59,7 +59,7 @@ func (ot *Tracing) Cleanup() error { // Validate implements caddy.Validator. func (ot *Tracing) Validate() error { if ot.otel.tracer == nil { - return errors.New("openTelemetry tracer is nil") + return errors.New("tracer is nil") } return nil diff --git a/modules/caddyhttp/opentelemetry/module_test.go b/modules/caddyhttp/tracing/module_test.go similarity index 98% rename from modules/caddyhttp/opentelemetry/module_test.go rename to modules/caddyhttp/tracing/module_test.go index 1af1ea29572..f1f58f9bc9c 100644 --- a/modules/caddyhttp/opentelemetry/module_test.go +++ b/modules/caddyhttp/tracing/module_test.go @@ -1,4 +1,4 @@ -package opentelemetry +package tracing import ( "context" @@ -24,7 +24,7 @@ func TestOpenTelemetry_UnmarshalCaddyfile(t *testing.T) { name: "Full config", spanName: "my-span", d: caddyfile.NewTestDispenser(` -opentelemetry { +tracing { span_name my-span }`), wantErr: false, @@ -33,7 +33,7 @@ opentelemetry { name: "Only span name in the config", spanName: "my-span", d: caddyfile.NewTestDispenser(` -opentelemetry { +tracing { span_name my-span }`), wantErr: false, @@ -41,7 +41,7 @@ opentelemetry { { name: "Empty config", d: caddyfile.NewTestDispenser(` -opentelemetry { +tracing { }`), wantErr: false, }, @@ -69,7 +69,7 @@ func TestOpenTelemetry_UnmarshalCaddyfile_Error(t *testing.T) { { name: "Unknown parameter", d: caddyfile.NewTestDispenser(` - opentelemetry { + tracing { foo bar }`), wantErr: true, @@ -77,7 +77,7 @@ func TestOpenTelemetry_UnmarshalCaddyfile_Error(t *testing.T) { { name: "Missed argument", d: caddyfile.NewTestDispenser(` -opentelemetry { +tracing { span_name }`), wantErr: true, diff --git a/modules/caddyhttp/opentelemetry/tracer.go b/modules/caddyhttp/tracing/tracer.go similarity index 96% rename from modules/caddyhttp/opentelemetry/tracer.go rename to modules/caddyhttp/tracing/tracer.go index 442824b6681..e6f8d02b1bd 100644 --- a/modules/caddyhttp/opentelemetry/tracer.go +++ b/modules/caddyhttp/tracing/tracer.go @@ -1,8 +1,7 @@ -package opentelemetry +package tracing import ( "context" - "errors" "fmt" caddycmd "github.com/caddyserver/caddy/v2/cmd" "github.com/caddyserver/caddy/v2/modules/caddyhttp" @@ -22,10 +21,6 @@ const ( tracerName = "github.com/caddyserver/caddy/v2/modules/caddyhttp/tracing" ) -var ( - ErrUnsupportedTracesProtocol = errors.New("unsupported opentelemetry traces protocol") -) - // openTelemetryWrapper is responsible for the tracing injection, extraction and propagation. type openTelemetryWrapper struct { tracer trace.Tracer diff --git a/modules/caddyhttp/opentelemetry/tracer_test.go b/modules/caddyhttp/tracing/tracer_test.go similarity index 59% rename from modules/caddyhttp/opentelemetry/tracer_test.go rename to modules/caddyhttp/tracing/tracer_test.go index d1e577a3e14..e4adefa2ba3 100644 --- a/modules/caddyhttp/opentelemetry/tracer_test.go +++ b/modules/caddyhttp/tracing/tracer_test.go @@ -1,8 +1,7 @@ -package opentelemetry +package tracing import ( "context" - "errors" "os" "testing" @@ -32,49 +31,6 @@ func TestOpenTelemetry_newOpenTelemetryWrapper(t *testing.T) { } } -func TestOpenTelemetry_newOpenTelemetryWrapper_Error(t *testing.T) { - tests := []struct { - name string - wantErrType error - setEnv func() error - unsetEnv func() error - }{ - { - name: "Not supported protocol", - setEnv: func() error { - return os.Setenv("OTEL_EXPORTER_OTLP_PROTOCOL", "ftp") - }, - unsetEnv: func() error { - return os.Unsetenv("OTEL_EXPORTER_OTLP_PROTOCOL") - }, - wantErrType: ErrUnsupportedTracesProtocol, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx, cancel := caddy.NewContext(caddy.Context{Context: context.Background()}) - defer cancel() - - if err := tt.setEnv(); err != nil { - t.Errorf("Environment variable set error: %v", err) - } - defer func() { - if err := tt.unsetEnv(); err != nil { - t.Errorf("Environment variable unset error: %v", err) - } - }() - - _, err := newOpenTelemetryWrapper(ctx, - "", - ) - - if !errors.Is(err, tt.wantErrType) { - t.Errorf("newOpenTelemetryWrapper() error is %v, expected %v", err, tt.wantErrType) - } - }) - } -} - func Test_openTelemetryWrapper_newResource_WithServiceName(t *testing.T) { err := os.Setenv("OTEL_SERVICE_NAME", "MyService") defer os.Unsetenv("OTEL_SERVICE_NAME") diff --git a/modules/caddyhttp/opentelemetry/tracerprovider.go b/modules/caddyhttp/tracing/tracerprovider.go similarity index 98% rename from modules/caddyhttp/opentelemetry/tracerprovider.go rename to modules/caddyhttp/tracing/tracerprovider.go index f3003b9bd60..0ba8e25f8be 100644 --- a/modules/caddyhttp/opentelemetry/tracerprovider.go +++ b/modules/caddyhttp/tracing/tracerprovider.go @@ -1,4 +1,4 @@ -package opentelemetry +package tracing import ( "context" diff --git a/modules/caddyhttp/opentelemetry/tracerprovider_test.go b/modules/caddyhttp/tracing/tracerprovider_test.go similarity index 97% rename from modules/caddyhttp/opentelemetry/tracerprovider_test.go rename to modules/caddyhttp/tracing/tracerprovider_test.go index 75974de82e5..cb2e5936f9a 100644 --- a/modules/caddyhttp/opentelemetry/tracerprovider_test.go +++ b/modules/caddyhttp/tracing/tracerprovider_test.go @@ -1,4 +1,4 @@ -package opentelemetry +package tracing import ( "testing" From 52d440093c6ec8cec944d2a321f50361b5ff5487 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 14:22:33 +0100 Subject: [PATCH 34/60] cleanup tests --- modules/caddyhttp/tracing/module_test.go | 67 ++---------------------- modules/caddyhttp/tracing/tracer_test.go | 34 ------------ 2 files changed, 3 insertions(+), 98 deletions(-) diff --git a/modules/caddyhttp/tracing/module_test.go b/modules/caddyhttp/tracing/module_test.go index f1f58f9bc9c..d0cc46d1d3f 100644 --- a/modules/caddyhttp/tracing/module_test.go +++ b/modules/caddyhttp/tracing/module_test.go @@ -4,7 +4,6 @@ import ( "context" "net/http" "net/http/httptest" - "os" "strings" "testing" @@ -25,7 +24,7 @@ func TestOpenTelemetry_UnmarshalCaddyfile(t *testing.T) { spanName: "my-span", d: caddyfile.NewTestDispenser(` tracing { - span_name my-span + span my-span }`), wantErr: false, }, @@ -34,7 +33,7 @@ tracing { spanName: "my-span", d: caddyfile.NewTestDispenser(` tracing { - span_name my-span + span my-span }`), wantErr: false, }, @@ -78,7 +77,7 @@ func TestOpenTelemetry_UnmarshalCaddyfile_Error(t *testing.T) { name: "Missed argument", d: caddyfile.NewTestDispenser(` tracing { - span_name + span }`), wantErr: true, }, @@ -97,16 +96,6 @@ func TestOpenTelemetry_Provision(t *testing.T) { ctx, cancel := caddy.NewContext(caddy.Context{Context: context.Background()}) defer cancel() - if err := th.SetEnv(); err != nil { - t.Errorf("Environment variable set error: %v", err) - } - - defer func() { - if err := th.UnsetEnv(); err != nil { - t.Errorf("Environment variable unset error: %v", err) - } - }() - ot := &Tracing{} if err := ot.Provision(ctx); err != nil { @@ -126,16 +115,6 @@ func TestOpenTelemetry_Provision_WithoutEnvironmentVariables(t *testing.T) { } func TestOpenTelemetry_ServeHTTP_Propagation_Without_Initial_Headers(t *testing.T) { - if err := th.SetEnv(); err != nil { - t.Errorf("Environment variable set error: %v", err) - } - - defer func() { - if err := th.UnsetEnv(); err != nil { - t.Errorf("Environment variable unset error: %v", err) - } - }() - ot := &Tracing{ SpanName: "mySpan", } @@ -166,16 +145,6 @@ func TestOpenTelemetry_ServeHTTP_Propagation_Without_Initial_Headers(t *testing. } func TestOpenTelemetry_ServeHTTP_Propagation_With_Initial_Headers(t *testing.T) { - if err := th.SetEnv(); err != nil { - t.Errorf("Environment variable set error: %v", err) - } - - defer func() { - if err := th.UnsetEnv(); err != nil { - t.Errorf("Environment variable unset error: %v", err) - } - }() - ot := &Tracing{ SpanName: "mySpan", } @@ -205,33 +174,3 @@ func TestOpenTelemetry_ServeHTTP_Propagation_With_Initial_Headers(t *testing.T) t.Errorf("ServeHTTP error: %v", err) } } - -type testHelper struct { - SetEnv func() error - UnsetEnv func() error -} - -var th = testHelper{ - SetEnv: func() error { - if err := os.Setenv("OTEL_EXPORTER_OTLP_PROTOCOL", "grpc"); err != nil { - return err - } - - if err := os.Setenv("OTEL_PROPAGATORS", "tracecontext,baggage"); err != nil { - return err - } - - return nil - }, - UnsetEnv: func() error { - if err := os.Unsetenv("OTEL_EXPORTER_OTLP_PROTOCOL"); err != nil { - return err - } - - if err := os.Unsetenv("OTEL_PROPAGATORS"); err != nil { - return err - } - - return nil - }, -} diff --git a/modules/caddyhttp/tracing/tracer_test.go b/modules/caddyhttp/tracing/tracer_test.go index e4adefa2ba3..430e2bf8b6d 100644 --- a/modules/caddyhttp/tracing/tracer_test.go +++ b/modules/caddyhttp/tracing/tracer_test.go @@ -2,7 +2,6 @@ package tracing import ( "context" - "os" "testing" "github.com/caddyserver/caddy/v2" @@ -30,36 +29,3 @@ func TestOpenTelemetry_newOpenTelemetryWrapper(t *testing.T) { t.Errorf("Propagators should not be empty") } } - -func Test_openTelemetryWrapper_newResource_WithServiceName(t *testing.T) { - err := os.Setenv("OTEL_SERVICE_NAME", "MyService") - defer os.Unsetenv("OTEL_SERVICE_NAME") - - res, err := (&openTelemetryWrapper{}).newResource("TestEngine", "Version 1") - - if err != nil { - t.Errorf("can not create resource: %v", err) - } - - const expectedAttributesNumber = 6 - if len(res.Attributes()) != expectedAttributesNumber { - t.Errorf("resource should have %d attributes, has : %v", expectedAttributesNumber, len(res.Attributes())) - } - - attributesMap := make(map[string]string) - for i := 0; i < expectedAttributesNumber; i++ { - attributesMap[string(res.Attributes()[i].Key)] = res.Attributes()[i].Value.AsString() - } - - for k, v := range map[string]string{ - "telemetry.sdk.language": "go", - "telemetry.sdk.name": "tracing", - "webengine.version": "Version 1", - "webengine.name": "TestEngine", - "service.name": "MyService", - } { - if attributesMap[k] != v { - t.Errorf("attribute %v is %v, expeted %v", k, attributesMap[k], v) - } - } -} From 31b61479b8c2f337ea7291d3a7cd9913e8962c63 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 14:26:00 +0100 Subject: [PATCH 35/60] update Caddyfile example in README.md --- modules/caddyhttp/tracing/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/caddyhttp/tracing/README.md b/modules/caddyhttp/tracing/README.md index 92dca23dbae..0476ca66a44 100644 --- a/modules/caddyhttp/tracing/README.md +++ b/modules/caddyhttp/tracing/README.md @@ -32,14 +32,14 @@ export OTEL_EXPORTER_OTLP_HEADERS="myAuthHeader=myToken,anotherHeader=value" export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=https://my-otlp-endpoint:55680 ``` -### Caddy file configuration +### Caddyfile configuration Here is a **Caddyfile** example: ``` handle /myHandler { - opentelemetry { - span_name my-span + tracing { + span my-span } reverse_proxy 127.0.0.1:8081 } From 13b9338bbbef4c8f4e0a1c9ed032d20eeba44673 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 14:29:32 +0100 Subject: [PATCH 36/60] update README.md --- modules/caddyhttp/tracing/README.md | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/modules/caddyhttp/tracing/README.md b/modules/caddyhttp/tracing/README.md index 0476ca66a44..a00aaeed7bb 100644 --- a/modules/caddyhttp/tracing/README.md +++ b/modules/caddyhttp/tracing/README.md @@ -11,16 +11,9 @@ It is based on `https://github.com/open-telemetry/opentelemetry-go`. ### Environment variables -It can be configured using the environment variables defined +This module can be configured using the environment variables defined by the [OpenTelemetry Environment Variable Specification](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md). - -If neither OTEL_EXPORTER_OTLP_INSECURE nor OTEL_EXPORTER_OTLP_SPAN_INSECURE is provided, then: - -1. If OTEL_EXPORTER_OTLP_CERTIFICATE or OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE are specified they will be used for TLS. -2. Else if both OTEL_EXPORTER_OTLP_CERTIFICATE and OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE are not specified, then default - TLS with the default `tls.Config` config will be used for an exporter. - For the exporter configuration details, please see [spec](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.7.0/specification/protocol/exporter.md) . From fa7388389ced4f4738e19bcae541c16604a6f0f4 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 14:33:48 +0100 Subject: [PATCH 37/60] fix test --- caddytest/integration/caddyfile_adapt/tracing.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/caddytest/integration/caddyfile_adapt/tracing.txt b/caddytest/integration/caddyfile_adapt/tracing.txt index 1a5af65735e..32286600122 100644 --- a/caddytest/integration/caddyfile_adapt/tracing.txt +++ b/caddytest/integration/caddyfile_adapt/tracing.txt @@ -1,6 +1,6 @@ :80 { tracing /myhandler { - span_name my-span + span my-span } } ---------- @@ -24,7 +24,7 @@ "handle": [ { "handler": "tracing", - "span_name": "my-span" + "span": "my-span" } ] } From 320c4981572525e54fc34d50fd62c787a9c99582 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 16:18:10 +0100 Subject: [PATCH 38/60] fix module name in README.md --- modules/caddyhttp/tracing/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/caddyhttp/tracing/README.md b/modules/caddyhttp/tracing/README.md index a00aaeed7bb..284581847b7 100644 --- a/modules/caddyhttp/tracing/README.md +++ b/modules/caddyhttp/tracing/README.md @@ -1,4 +1,4 @@ -# OpenTelemetry module +# Tracing module This module provides integration with OpenTelemetry tracing facilities. It is implemented as a `caddyhttp.MiddlewareHandler` and can be chained into a list of other handlers. From 8c556dfe0b9e43620ae526d7ec6d872a188847e6 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 16:23:33 +0100 Subject: [PATCH 39/60] fix module name in README.md --- modules/caddyhttp/tracing/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/caddyhttp/tracing/README.md b/modules/caddyhttp/tracing/README.md index 284581847b7..169e5e8f3a1 100644 --- a/modules/caddyhttp/tracing/README.md +++ b/modules/caddyhttp/tracing/README.md @@ -7,6 +7,8 @@ When enabled, it propagates an existing tracing context or will init a new one o It is based on `https://github.com/open-telemetry/opentelemetry-go`. +This module uses `gRPC` as an exporter protocol and W3C `tracecontext` and `baggage` as propagators. + ## Configuration ### Environment variables From 50bf9210a3635235c2dc4a99caf9b2cb79c56b2c Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 16:26:19 +0100 Subject: [PATCH 40/60] change names in README.md and tests --- modules/caddyhttp/tracing/module_test.go | 12 ++++++------ modules/caddyhttp/tracing/tracer_test.go | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/caddyhttp/tracing/module_test.go b/modules/caddyhttp/tracing/module_test.go index d0cc46d1d3f..20938574a30 100644 --- a/modules/caddyhttp/tracing/module_test.go +++ b/modules/caddyhttp/tracing/module_test.go @@ -12,7 +12,7 @@ import ( "github.com/caddyserver/caddy/v2/modules/caddyhttp" ) -func TestOpenTelemetry_UnmarshalCaddyfile(t *testing.T) { +func TestTracing_UnmarshalCaddyfile(t *testing.T) { tests := []struct { name string spanName string @@ -59,7 +59,7 @@ tracing { } } -func TestOpenTelemetry_UnmarshalCaddyfile_Error(t *testing.T) { +func TestTracing_UnmarshalCaddyfile_Error(t *testing.T) { tests := []struct { name string d *caddyfile.Dispenser @@ -92,7 +92,7 @@ tracing { } } -func TestOpenTelemetry_Provision(t *testing.T) { +func TestTracing_Provision(t *testing.T) { ctx, cancel := caddy.NewContext(caddy.Context{Context: context.Background()}) defer cancel() @@ -103,7 +103,7 @@ func TestOpenTelemetry_Provision(t *testing.T) { } } -func TestOpenTelemetry_Provision_WithoutEnvironmentVariables(t *testing.T) { +func TestTracing_Provision_WithoutEnvironmentVariables(t *testing.T) { ctx, cancel := caddy.NewContext(caddy.Context{Context: context.Background()}) defer cancel() @@ -114,7 +114,7 @@ func TestOpenTelemetry_Provision_WithoutEnvironmentVariables(t *testing.T) { } } -func TestOpenTelemetry_ServeHTTP_Propagation_Without_Initial_Headers(t *testing.T) { +func TestTracing_ServeHTTP_Propagation_Without_Initial_Headers(t *testing.T) { ot := &Tracing{ SpanName: "mySpan", } @@ -144,7 +144,7 @@ func TestOpenTelemetry_ServeHTTP_Propagation_Without_Initial_Headers(t *testing. } } -func TestOpenTelemetry_ServeHTTP_Propagation_With_Initial_Headers(t *testing.T) { +func TestTracing_ServeHTTP_Propagation_With_Initial_Headers(t *testing.T) { ot := &Tracing{ SpanName: "mySpan", } diff --git a/modules/caddyhttp/tracing/tracer_test.go b/modules/caddyhttp/tracing/tracer_test.go index 430e2bf8b6d..29ba7a5cfea 100644 --- a/modules/caddyhttp/tracing/tracer_test.go +++ b/modules/caddyhttp/tracing/tracer_test.go @@ -7,7 +7,7 @@ import ( "github.com/caddyserver/caddy/v2" ) -func TestOpenTelemetry_newOpenTelemetryWrapper(t *testing.T) { +func TestOpenTelemetryWrapper_newOpenTelemetryWrapper(t *testing.T) { ctx, cancel := caddy.NewContext(caddy.Context{Context: context.Background()}) defer cancel() From c53b79a708a0577ead60c1d7eadb09828d4856f9 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 16:30:33 +0100 Subject: [PATCH 41/60] order imports --- modules/caddyhttp/tracing/tracer.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/caddyhttp/tracing/tracer.go b/modules/caddyhttp/tracing/tracer.go index e6f8d02b1bd..0ccf069b01b 100644 --- a/modules/caddyhttp/tracing/tracer.go +++ b/modules/caddyhttp/tracing/tracer.go @@ -3,6 +3,8 @@ package tracing import ( "context" "fmt" + "net/http" + caddycmd "github.com/caddyserver/caddy/v2/cmd" "github.com/caddyserver/caddy/v2/modules/caddyhttp" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" @@ -12,7 +14,6 @@ import ( semconv "go.opentelemetry.io/otel/semconv/v1.7.0" "go.opentelemetry.io/otel/trace" "go.uber.org/zap" - "net/http" ) const ( From da4633e96c27cf2db8119c730d30dccb434bb2e0 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 3 Nov 2021 16:33:21 +0100 Subject: [PATCH 42/60] remove redundant tests --- modules/caddyhttp/tracing/module_test.go | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/modules/caddyhttp/tracing/module_test.go b/modules/caddyhttp/tracing/module_test.go index 20938574a30..c2f56307fdb 100644 --- a/modules/caddyhttp/tracing/module_test.go +++ b/modules/caddyhttp/tracing/module_test.go @@ -92,28 +92,6 @@ tracing { } } -func TestTracing_Provision(t *testing.T) { - ctx, cancel := caddy.NewContext(caddy.Context{Context: context.Background()}) - defer cancel() - - ot := &Tracing{} - - if err := ot.Provision(ctx); err != nil { - t.Errorf("Provision() error = %v", err) - } -} - -func TestTracing_Provision_WithoutEnvironmentVariables(t *testing.T) { - ctx, cancel := caddy.NewContext(caddy.Context{Context: context.Background()}) - defer cancel() - - ot := &Tracing{} - - if err := ot.Provision(ctx); err != nil { - t.Errorf("Provision() error should be nil") - } -} - func TestTracing_ServeHTTP_Propagation_Without_Initial_Headers(t *testing.T) { ot := &Tracing{ SpanName: "mySpan", From 971a888ee92b81704712c0193344e57fec9ca043 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Tue, 30 Nov 2021 10:42:44 +0100 Subject: [PATCH 43/60] Update documentation README.md Co-authored-by: Dave Henderson --- modules/caddyhttp/tracing/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/caddyhttp/tracing/README.md b/modules/caddyhttp/tracing/README.md index 169e5e8f3a1..2191c6b534e 100644 --- a/modules/caddyhttp/tracing/README.md +++ b/modules/caddyhttp/tracing/README.md @@ -3,7 +3,7 @@ This module provides integration with OpenTelemetry tracing facilities. It is implemented as a `caddyhttp.MiddlewareHandler` and can be chained into a list of other handlers. -When enabled, it propagates an existing tracing context or will init a new one otherwise. +When enabled, it will propagate an existing trace context or initialize a new one. It is based on `https://github.com/open-telemetry/opentelemetry-go`. From 9afdd892295fad346303b30cd7b8e01101718c87 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Tue, 30 Nov 2021 10:43:39 +0100 Subject: [PATCH 44/60] Fix grammar Co-authored-by: Dave Henderson --- modules/caddyhttp/tracing/module.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/caddyhttp/tracing/module.go b/modules/caddyhttp/tracing/module.go index c52f06d4d4b..91ceb1c1ded 100644 --- a/modules/caddyhttp/tracing/module.go +++ b/modules/caddyhttp/tracing/module.go @@ -17,9 +17,11 @@ func init() { httpcaddyfile.RegisterHandlerDirective("tracing", parseCaddyfile) } -// Tracing implements an HTTP handler that adds support for the opentelemetry tracing. -// It is responsible for the injection and propagation of the tracing contexts. -// Tracing module can be configured via environment variables https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md. Some values can be overwritten with values from the configuration file. +// Tracing implements an HTTP handler that adds support for distributed tracing, +// using OpenTelemetry. This module is responsible for the injection and +// propagation of the trace context. Configure this module via environment +// variables (see https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md). +// Some values can be overwritten in the configuration file. type Tracing struct { // SpanName is a span name. It SHOULD follow the naming guideline https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#span SpanName string `json:"span"` From 773a83e466b0586be4ddcea1d0ade70784cb6d13 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Tue, 30 Nov 2021 10:45:12 +0100 Subject: [PATCH 45/60] Update comments Co-authored-by: Dave Henderson --- modules/caddyhttp/tracing/module.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/caddyhttp/tracing/module.go b/modules/caddyhttp/tracing/module.go index 91ceb1c1ded..9cfda17cc55 100644 --- a/modules/caddyhttp/tracing/module.go +++ b/modules/caddyhttp/tracing/module.go @@ -23,7 +23,8 @@ func init() { // variables (see https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md). // Some values can be overwritten in the configuration file. type Tracing struct { - // SpanName is a span name. It SHOULD follow the naming guideline https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#span + // SpanName is a span name. It should follow the naming guidelines here: + // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#span SpanName string `json:"span"` // otel implements opentelemetry related logic. From a463325c14ee30ee9bc939cf1703c9648f5e6200 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Tue, 30 Nov 2021 10:45:30 +0100 Subject: [PATCH 46/60] Update comments Co-authored-by: Dave Henderson --- modules/caddyhttp/tracing/module.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/caddyhttp/tracing/module.go b/modules/caddyhttp/tracing/module.go index 9cfda17cc55..b17bbf35d1e 100644 --- a/modules/caddyhttp/tracing/module.go +++ b/modules/caddyhttp/tracing/module.go @@ -51,7 +51,8 @@ func (ot *Tracing) Provision(ctx caddy.Context) error { return err } -// Cleanup implements caddy.CleanerUpper and closes any idle connections. It calls Shutdown method for a trace provider https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/sdk.md#shutdown. +// Cleanup implements caddy.CleanerUpper and closes any idle connections. It +// calls Shutdown method for a trace provider https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/sdk.md#shutdown. func (ot *Tracing) Cleanup() error { if err := ot.otel.cleanup(ot.logger); err != nil { return fmt.Errorf("tracerProvider shutdown: %w", err) From ca2a2e97402a03779f27f08465130d5025f38d07 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Tue, 30 Nov 2021 11:22:17 +0100 Subject: [PATCH 47/60] update go.sum --- go.sum | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/go.sum b/go.sum index f5307e4a14f..fe100d54653 100644 --- a/go.sum +++ b/go.sum @@ -202,6 +202,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= @@ -272,6 +273,7 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= 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/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -999,7 +1001,6 @@ go.opentelemetry.io/otel/trace v1.1.0/go.mod h1:i47XtdcBQiktu5IsrPqOHe8w+sBmnLww go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.9.0 h1:C0g6TWmQYvjKRnljRULLWUVJGy8Uvu0NEL/5frY2/t4= go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= -go.step.sm/cli-utils v0.4.1 h1:QztRUhGYjOPM1I2Nmi7V6XejQyVtcESmo+sbegxvX7Q= go.step.sm/cli-utils v0.4.1/go.mod h1:hWYVOSlw8W9Pd+BwIbs/aftVVMRms3EG7Q2qLRwc0WA= go.step.sm/cli-utils v0.6.0 h1:sH4FxBcjmbxyilKXheSyJuKF/QjpojpiW90ERwUWOgQ= go.step.sm/cli-utils v0.6.0/go.mod h1:jklBMavFl2PbmGlyxgax08ZnB0uWpadjuOlSKKXz+0U= @@ -1511,6 +1512,7 @@ google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.41.0 h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E= google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= From 067eb5eccf863a2f16688885f15ef892791ff175 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Mon, 13 Dec 2021 09:51:16 +0100 Subject: [PATCH 48/60] update go.sum --- go.sum | 3 --- 1 file changed, 3 deletions(-) diff --git a/go.sum b/go.sum index 96a4fc26f65..94b4ea0583d 100644 --- a/go.sum +++ b/go.sum @@ -1012,9 +1012,6 @@ go.opentelemetry.io/otel/trace v1.1.0/go.mod h1:i47XtdcBQiktu5IsrPqOHe8w+sBmnLww go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.9.0 h1:C0g6TWmQYvjKRnljRULLWUVJGy8Uvu0NEL/5frY2/t4= go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= -go.step.sm/cli-utils v0.4.1/go.mod h1:hWYVOSlw8W9Pd+BwIbs/aftVVMRms3EG7Q2qLRwc0WA= -go.step.sm/cli-utils v0.6.0 h1:sH4FxBcjmbxyilKXheSyJuKF/QjpojpiW90ERwUWOgQ= -go.step.sm/cli-utils v0.6.0/go.mod h1:jklBMavFl2PbmGlyxgax08ZnB0uWpadjuOlSKKXz+0U= go.step.sm/cli-utils v0.7.0 h1:2GvY5Muid1yzp7YQbfCCS+gK3q7zlHjjLL5Z0DXz8ds= go.step.sm/cli-utils v0.7.0/go.mod h1:Ur6bqA/yl636kCUJbp30J7Unv5JJ226eW2KqXPDwF/E= go.step.sm/crypto v0.9.0/go.mod h1:+CYG05Mek1YDqi5WK0ERc6cOpKly2i/a5aZmU1sfGj0= From 304895404e785b2a249989a5f2390393282f1267 Mon Sep 17 00:00:00 2001 From: Vibhav Pant Date: Sun, 16 Jan 2022 19:22:27 +0530 Subject: [PATCH 49/60] Add otelhttp instrumentation, update OpenTelemetry libraries. --- go.mod | 9 +++++---- go.sum | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index bafa74a2bba..d668bd02f09 100644 --- a/go.mod +++ b/go.mod @@ -24,10 +24,11 @@ require ( github.com/smallstep/truststore v0.10.1 github.com/yuin/goldmark v1.4.1 github.com/yuin/goldmark-highlighting v0.0.0-20210516132338-9216f9c5aa01 - go.opentelemetry.io/otel v1.1.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.1.0 - go.opentelemetry.io/otel/sdk v1.1.0 - go.opentelemetry.io/otel/trace v1.1.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.28.0 // indirect + go.opentelemetry.io/otel v1.3.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0 + go.opentelemetry.io/otel/sdk v1.3.0 + go.opentelemetry.io/otel/trace v1.3.0 go.uber.org/zap v1.19.0 golang.org/x/crypto v0.0.0-20210915214749-c084706c2272 golang.org/x/net v0.0.0-20210913180222-943fd674d43e diff --git a/go.sum b/go.sum index 94b4ea0583d..ee591ca0774 100644 --- a/go.sum +++ b/go.sum @@ -193,6 +193,8 @@ github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEe github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +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.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -215,8 +217,11 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= 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-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= 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/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= @@ -294,6 +299,8 @@ github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4 github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= +github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= @@ -329,6 +336,11 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +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/go-piv/piv-go v1.7.0/go.mod h1:ON2WvQncm7dIkCQ7kYJs+nc3V4jHGfrrJnSF8HKy7Gk= github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= @@ -988,30 +1000,51 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.28.0 h1:hpEoMBvKLC6CqFZogJypr9IHwwSNF3ayEkNzD502QAM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.28.0/go.mod h1:Ihno+mNBfZlT0Qot3XyRTdZ/9U/Cg2Pfgj75DTdIfq4= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= go.opentelemetry.io/otel v1.1.0 h1:8p0uMLcyyIx0KHNTgO8o3CW8A1aA+dJZJW6PvnMz0Wc= go.opentelemetry.io/otel v1.1.0/go.mod h1:7cww0OW51jQ8IaZChIEdqLwgh+44+7uiTdWsAL0wQpA= +go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= +go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 h1:R/OBkMoGgfy2fLhs2QhkCI1w4HLEQX92GCcJB6SSdNk= +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.1.0 h1:PxBRMkrJnY4HRgToPzoLrTdQDHQf9MeFg5oGzTqtzco= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.1.0/go.mod h1:/E4iniSqAEvqbq6KM5qThKZR2sd42kDvD+SrYt00vRw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0 h1:giGm8w67Ja7amYNfYMdme7xSp2pIxThWopw8+QP51Yk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.1.0 h1:4UC7muAl2UqSoTV0RqgmpTz/cRLH6R9cHt9BvVcq5Bo= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.1.0/go.mod h1:Gyc0evUosTBVNRqTFGuu0xqebkEWLkLwv42qggTCwro= +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/internal/metric v0.26.0 h1:dlrvawyd/A+X8Jp0EBT4wWEe4k5avYaXsXrBr4dbfnY= +go.opentelemetry.io/otel/internal/metric v0.26.0/go.mod h1:CbBP6AxKynRs3QCbhklyLUtpfzbqCLiafV9oY2Zj1Jk= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/metric v0.26.0 h1:VaPYBTvA13h/FsiWfxa3yZnZEm15BhStD8JZQSA773M= +go.opentelemetry.io/otel/metric v0.26.0/go.mod h1:c6YL0fhRo4YVoNs6GoByzUgBp36hBL523rECoZA5UWg= 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 v1.1.0 h1:j/1PngUJIDOddkCILQYTevrTIbWd494djgGkSsMit+U= go.opentelemetry.io/otel/sdk v1.1.0/go.mod h1:3aQvM6uLm6C4wJpHtT8Od3vNzeZ34Pqc6bps8MywWzo= +go.opentelemetry.io/otel/sdk v1.3.0 h1:3278edCoH89MEJ0Ky8WQXVmDQv3FX4ZJ3Pp+9fJreAI= +go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/otel/trace v1.1.0 h1:N25T9qCL0+7IpOT8RrRy0WYlL7y6U0WiUJzXcVdXY/o= go.opentelemetry.io/otel/trace v1.1.0/go.mod h1:i47XtdcBQiktu5IsrPqOHe8w+sBmnLwwHt8wiUsWGTI= +go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY= +go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.9.0 h1:C0g6TWmQYvjKRnljRULLWUVJGy8Uvu0NEL/5frY2/t4= go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= +go.opentelemetry.io/proto/otlp v0.11.0 h1:cLDgIBTf4lLOlztkhzAEdQsJ4Lj+i5Wc9k6Nn0K1VyU= +go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= go.step.sm/cli-utils v0.7.0 h1:2GvY5Muid1yzp7YQbfCCS+gK3q7zlHjjLL5Z0DXz8ds= go.step.sm/cli-utils v0.7.0/go.mod h1:Ur6bqA/yl636kCUJbp30J7Unv5JJ226eW2KqXPDwF/E= go.step.sm/crypto v0.9.0/go.mod h1:+CYG05Mek1YDqi5WK0ERc6cOpKly2i/a5aZmU1sfGj0= @@ -1027,6 +1060,7 @@ go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= @@ -1525,6 +1559,8 @@ google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.41.0 h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E= google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= +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/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= 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= From 595f9de936d7e93a7b2200fbb3fd3022577bd739 Mon Sep 17 00:00:00 2001 From: Vibhav Pant Date: Sun, 16 Jan 2022 19:57:14 +0530 Subject: [PATCH 50/60] Use otelhttp instrumentation for instrumenting HTTP requests. This change uses context.WithValue to inject the next handler into the request context via a "nextCall" carrier struct, and pass it on to a standard Go HTTP handler returned by otelhttp.NewHandler. The underlying handler will extract the next handler from the context, call it and pass the returned error to the carrier struct. --- modules/caddyhttp/tracing/module.go | 5 ---- modules/caddyhttp/tracing/module_test.go | 28 ++++++++++++++++++ modules/caddyhttp/tracing/serve.go | 23 +++++++++++++++ modules/caddyhttp/tracing/tracer.go | 36 ++++++++---------------- modules/caddyhttp/tracing/tracer_test.go | 4 --- 5 files changed, 62 insertions(+), 34 deletions(-) create mode 100644 modules/caddyhttp/tracing/serve.go diff --git a/modules/caddyhttp/tracing/module.go b/modules/caddyhttp/tracing/module.go index b17bbf35d1e..5d74b4b919b 100644 --- a/modules/caddyhttp/tracing/module.go +++ b/modules/caddyhttp/tracing/module.go @@ -1,7 +1,6 @@ package tracing import ( - "errors" "fmt" "net/http" @@ -62,10 +61,6 @@ func (ot *Tracing) Cleanup() error { // Validate implements caddy.Validator. func (ot *Tracing) Validate() error { - if ot.otel.tracer == nil { - return errors.New("tracer is nil") - } - return nil } diff --git a/modules/caddyhttp/tracing/module_test.go b/modules/caddyhttp/tracing/module_test.go index c2f56307fdb..0fbc05bbd6c 100644 --- a/modules/caddyhttp/tracing/module_test.go +++ b/modules/caddyhttp/tracing/module_test.go @@ -2,6 +2,7 @@ package tracing import ( "context" + "errors" "net/http" "net/http/httptest" "strings" @@ -152,3 +153,30 @@ func TestTracing_ServeHTTP_Propagation_With_Initial_Headers(t *testing.T) { t.Errorf("ServeHTTP error: %v", err) } } + +func TestTracing_ServeHTTP_Next_Error(t *testing.T) { + ot := &Tracing{ + SpanName: "mySpan", + } + + req := httptest.NewRequest("GET", "https://example.com/foo", nil) + w := httptest.NewRecorder() + + expectErr := errors.New("test error") + + var handler caddyhttp.HandlerFunc = func(writer http.ResponseWriter, request *http.Request) error { + return expectErr + } + + ctx, cancel := caddy.NewContext(caddy.Context{Context: context.Background()}) + defer cancel() + + if err := ot.Provision(ctx); err != nil { + t.Errorf("Provision error: %v", err) + t.FailNow() + } + + if err := ot.ServeHTTP(w, req, handler); err == nil || !errors.Is(err, expectErr) { + t.Errorf("expected error, got: %v", err) + } +} diff --git a/modules/caddyhttp/tracing/serve.go b/modules/caddyhttp/tracing/serve.go new file mode 100644 index 00000000000..b4fb00548fa --- /dev/null +++ b/modules/caddyhttp/tracing/serve.go @@ -0,0 +1,23 @@ +package tracing + +import ( + "net/http" + + "github.com/caddyserver/caddy/v2" + "github.com/caddyserver/caddy/v2/modules/caddyhttp" + "go.opentelemetry.io/otel/propagation" +) + +// nextCall store the next handler, and the error value return on calling it (if any) +type nextCall struct { + next caddyhttp.Handler + err error +} + +const nextCallCtxKey caddy.CtxKey = "nextCall" + +func (ot *openTelemetryWrapper) serveHTTP(w http.ResponseWriter, r *http.Request) { + ot.propagators.Inject(r.Context(), propagation.HeaderCarrier(r.Header)) + next := r.Context().Value(nextCallCtxKey).(*nextCall) + next.err = next.next.ServeHTTP(w, r) +} diff --git a/modules/caddyhttp/tracing/tracer.go b/modules/caddyhttp/tracing/tracer.go index 0ccf069b01b..eb251f822c9 100644 --- a/modules/caddyhttp/tracing/tracer.go +++ b/modules/caddyhttp/tracing/tracer.go @@ -7,26 +7,26 @@ import ( caddycmd "github.com/caddyserver/caddy/v2/cmd" "github.com/caddyserver/caddy/v2/modules/caddyhttp" + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.7.0" - "go.opentelemetry.io/otel/trace" "go.uber.org/zap" ) const ( webEngineName = "Caddy" defaultSpanName = "handler" - tracerName = "github.com/caddyserver/caddy/v2/modules/caddyhttp/tracing" ) // openTelemetryWrapper is responsible for the tracing injection, extraction and propagation. type openTelemetryWrapper struct { - tracer trace.Tracer propagators propagation.TextMapPropagator + handler http.Handler + spanName string } @@ -55,38 +55,24 @@ func newOpenTelemetryWrapper( ot.propagators = propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}) - // create a tracer - ot.tracer = globalTracerProvider.getTracerProvider( + tracerProvider := globalTracerProvider.getTracerProvider( sdktrace.WithBatcher(traceExporter), sdktrace.WithResource(res), - ).Tracer(tracerName) + ) + ot.handler = otelhttp.NewHandler(http.HandlerFunc(ot.serveHTTP), ot.spanName, otelhttp.WithTracerProvider(tracerProvider), otelhttp.WithPropagators(ot.propagators)) return ot, nil } // ServeHTTP extract current tracing context or create a new one, then method propagates it to the wrapped next handler. func (ot *openTelemetryWrapper) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyhttp.Handler) error { - opts := []trace.SpanStartOption{ - trace.WithAttributes(semconv.NetAttributesFromHTTPRequest("tcp", r)...), - trace.WithAttributes(semconv.EndUserAttributesFromHTTPRequest(r)...), - trace.WithAttributes(semconv.HTTPServerAttributesFromHTTPRequest("", "", r)...), - } - - ctx := ot.propagators.Extract(r.Context(), propagation.HeaderCarrier(r.Header)) - - // It will be default span kind as for now. Proper span kind (Span.Kind.LOAD_BALANCER (PROXY/SIDECAR)) is being discussed here https://github.com/open-telemetry/opentelemetry-specification/issues/51. - ctx, span := ot.tracer.Start(ctx, ot.spanName, opts...) - defer span.End() - - ot.propagators.Inject(ctx, propagation.HeaderCarrier(r.Header)) - - err := next.ServeHTTP(w, r) - if err != nil { - span.RecordError(err) - return err + n := &nextCall{ + next: next, + err: nil, } + ot.handler.ServeHTTP(w, r.WithContext(context.WithValue(r.Context(), nextCallCtxKey, n))) - return nil + return n.err } // cleanup flush all remaining data and shutdown a tracerProvider diff --git a/modules/caddyhttp/tracing/tracer_test.go b/modules/caddyhttp/tracing/tracer_test.go index 29ba7a5cfea..36a32ff46e0 100644 --- a/modules/caddyhttp/tracing/tracer_test.go +++ b/modules/caddyhttp/tracing/tracer_test.go @@ -21,10 +21,6 @@ func TestOpenTelemetryWrapper_newOpenTelemetryWrapper(t *testing.T) { t.FailNow() } - if otw.tracer == nil { - t.Errorf("Tracer should not be empty") - } - if otw.propagators == nil { t.Errorf("Propagators should not be empty") } From 5bd20b721c001dd521d8e27b7d462d84b2fddcd3 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Tue, 18 Jan 2022 11:53:54 +0100 Subject: [PATCH 51/60] use zap.Error() for the error log --- modules/caddyhttp/tracing/tracerprovider.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/caddyhttp/tracing/tracerprovider.go b/modules/caddyhttp/tracing/tracerprovider.go index 0ba8e25f8be..035425ed646 100644 --- a/modules/caddyhttp/tracing/tracerprovider.go +++ b/modules/caddyhttp/tracing/tracerprovider.go @@ -47,7 +47,7 @@ func (t *tracerProvider) cleanupTracerProvider(logger *zap.Logger) error { if t.tracerProvider != nil { // tracerProvider.ForceFlush SHOULD be invoked according to https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/sdk.md#forceflush if err := t.tracerProvider.ForceFlush(context.Background()); err != nil { - logger.Error("forceFlush error: " + err.Error()) + logger.Error("forcing flush", zap.Error(err)) } // tracerProvider.Shutdown MUST be invoked according to https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/sdk.md#shutdown From 0f35b4c1d172f88c22e006c5dddf0f7120c0834c Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 19 Jan 2022 12:53:02 +0100 Subject: [PATCH 52/60] remove README.md --- modules/caddyhttp/tracing/README.md | 43 ----------------------------- 1 file changed, 43 deletions(-) delete mode 100644 modules/caddyhttp/tracing/README.md diff --git a/modules/caddyhttp/tracing/README.md b/modules/caddyhttp/tracing/README.md deleted file mode 100644 index 2191c6b534e..00000000000 --- a/modules/caddyhttp/tracing/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# Tracing module - -This module provides integration with OpenTelemetry tracing facilities. It is implemented -as a `caddyhttp.MiddlewareHandler` and can be chained into a list of other handlers. - -When enabled, it will propagate an existing trace context or initialize a new one. - -It is based on `https://github.com/open-telemetry/opentelemetry-go`. - -This module uses `gRPC` as an exporter protocol and W3C `tracecontext` and `baggage` as propagators. - -## Configuration - -### Environment variables - -This module can be configured using the environment variables defined -by the [OpenTelemetry Environment Variable Specification](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md). - -For the exporter configuration details, please -see [spec](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.7.0/specification/protocol/exporter.md) -. - -Example: - -```bash -export OTEL_EXPORTER_OTLP_HEADERS="myAuthHeader=myToken,anotherHeader=value" -export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=https://my-otlp-endpoint:55680 -``` - -### Caddyfile configuration - -Here is a **Caddyfile** example: - -``` -handle /myHandler { - tracing { - span my-span - } - reverse_proxy 127.0.0.1:8081 -} -``` - -Please see span naming [guidelines](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.7.0/specification/trace/api.md). \ No newline at end of file From 2200fb37b2ce9f1da92cc65f478669a01838aeea Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 19 Jan 2022 14:22:21 +0100 Subject: [PATCH 53/60] update dependencies --- go.mod | 3 +-- go.sum | 19 +------------------ 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index d668bd02f09..10c914b1dde 100644 --- a/go.mod +++ b/go.mod @@ -24,11 +24,10 @@ require ( github.com/smallstep/truststore v0.10.1 github.com/yuin/goldmark v1.4.1 github.com/yuin/goldmark-highlighting v0.0.0-20210516132338-9216f9c5aa01 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.28.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.28.0 go.opentelemetry.io/otel v1.3.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0 go.opentelemetry.io/otel/sdk v1.3.0 - go.opentelemetry.io/otel/trace v1.3.0 go.uber.org/zap v1.19.0 golang.org/x/crypto v0.0.0-20210915214749-c084706c2272 golang.org/x/net v0.0.0-20210913180222-943fd674d43e diff --git a/go.sum b/go.sum index ee591ca0774..ee21597d394 100644 --- a/go.sum +++ b/go.sum @@ -191,8 +191,6 @@ github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= 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.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -1006,20 +1004,14 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.2 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.28.0 h1:hpEoMBvKLC6CqFZogJypr9IHwwSNF3ayEkNzD502QAM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.28.0/go.mod h1:Ihno+mNBfZlT0Qot3XyRTdZ/9U/Cg2Pfgj75DTdIfq4= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel v1.1.0 h1:8p0uMLcyyIx0KHNTgO8o3CW8A1aA+dJZJW6PvnMz0Wc= -go.opentelemetry.io/otel v1.1.0/go.mod h1:7cww0OW51jQ8IaZChIEdqLwgh+44+7uiTdWsAL0wQpA= go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 h1:R/OBkMoGgfy2fLhs2QhkCI1w4HLEQX92GCcJB6SSdNk= 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.1.0 h1:PxBRMkrJnY4HRgToPzoLrTdQDHQf9MeFg5oGzTqtzco= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.1.0/go.mod h1:/E4iniSqAEvqbq6KM5qThKZR2sd42kDvD+SrYt00vRw= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0 h1:giGm8w67Ja7amYNfYMdme7xSp2pIxThWopw8+QP51Yk= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.1.0 h1:4UC7muAl2UqSoTV0RqgmpTz/cRLH6R9cHt9BvVcq5Bo= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.1.0/go.mod h1:Gyc0evUosTBVNRqTFGuu0xqebkEWLkLwv42qggTCwro= 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/internal/metric v0.26.0 h1:dlrvawyd/A+X8Jp0EBT4wWEe4k5avYaXsXrBr4dbfnY= @@ -1029,20 +1021,14 @@ go.opentelemetry.io/otel/metric v0.26.0 h1:VaPYBTvA13h/FsiWfxa3yZnZEm15BhStD8JZQ go.opentelemetry.io/otel/metric v0.26.0/go.mod h1:c6YL0fhRo4YVoNs6GoByzUgBp36hBL523rECoZA5UWg= 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 v1.1.0 h1:j/1PngUJIDOddkCILQYTevrTIbWd494djgGkSsMit+U= -go.opentelemetry.io/otel/sdk v1.1.0/go.mod h1:3aQvM6uLm6C4wJpHtT8Od3vNzeZ34Pqc6bps8MywWzo= go.opentelemetry.io/otel/sdk v1.3.0 h1:3278edCoH89MEJ0Ky8WQXVmDQv3FX4ZJ3Pp+9fJreAI= go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/otel/trace v1.1.0 h1:N25T9qCL0+7IpOT8RrRy0WYlL7y6U0WiUJzXcVdXY/o= -go.opentelemetry.io/otel/trace v1.1.0/go.mod h1:i47XtdcBQiktu5IsrPqOHe8w+sBmnLwwHt8wiUsWGTI= go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY= go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.9.0 h1:C0g6TWmQYvjKRnljRULLWUVJGy8Uvu0NEL/5frY2/t4= -go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= go.opentelemetry.io/proto/otlp v0.11.0 h1:cLDgIBTf4lLOlztkhzAEdQsJ4Lj+i5Wc9k6Nn0K1VyU= go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= go.step.sm/cli-utils v0.7.0 h1:2GvY5Muid1yzp7YQbfCCS+gK3q7zlHjjLL5Z0DXz8ds= @@ -1058,8 +1044,8 @@ go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= @@ -1125,7 +1111,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -1557,8 +1542,6 @@ google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQ google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.41.0 h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E= -google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= 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/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= From c3e17dffb76a3e28f76ffdda52ff2488057b4ed6 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 19 Jan 2022 14:22:38 +0100 Subject: [PATCH 54/60] clean up the code --- modules/caddyhttp/tracing/module.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/modules/caddyhttp/tracing/module.go b/modules/caddyhttp/tracing/module.go index 5d74b4b919b..ff67d0f62e2 100644 --- a/modules/caddyhttp/tracing/module.go +++ b/modules/caddyhttp/tracing/module.go @@ -59,11 +59,6 @@ func (ot *Tracing) Cleanup() error { return nil } -// Validate implements caddy.Validator. -func (ot *Tracing) Validate() error { - return nil -} - // ServeHTTP implements caddyhttp.MiddlewareHandler. func (ot *Tracing) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyhttp.Handler) error { return ot.otel.ServeHTTP(w, r, next) @@ -116,7 +111,6 @@ func parseCaddyfile(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error) // Interface guards var ( _ caddy.Provisioner = (*Tracing)(nil) - _ caddy.Validator = (*Tracing)(nil) _ caddyhttp.MiddlewareHandler = (*Tracing)(nil) _ caddyfile.Unmarshaler = (*Tracing)(nil) ) From e3a28d442bc61314b64ad76c8d0c992aad59b9db Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Wed, 19 Jan 2022 14:23:11 +0100 Subject: [PATCH 55/60] change comment --- modules/caddyhttp/tracing/tracer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/caddyhttp/tracing/tracer.go b/modules/caddyhttp/tracing/tracer.go index eb251f822c9..9fe7dbfe540 100644 --- a/modules/caddyhttp/tracing/tracer.go +++ b/modules/caddyhttp/tracing/tracer.go @@ -64,7 +64,7 @@ func newOpenTelemetryWrapper( return ot, nil } -// ServeHTTP extract current tracing context or create a new one, then method propagates it to the wrapped next handler. +// ServeHTTP propagates call to the by wrapped by `otelhttp` next handler. func (ot *openTelemetryWrapper) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyhttp.Handler) error { n := &nextCall{ next: next, From 7a5766dcf450fa3dbaf85607be51c06595ecd74e Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Thu, 20 Jan 2022 10:16:01 +0100 Subject: [PATCH 56/60] move serveHTTP method from separate file --- modules/caddyhttp/tracing/serve.go | 23 ----------------------- modules/caddyhttp/tracing/tracer.go | 19 +++++++++++++++++-- 2 files changed, 17 insertions(+), 25 deletions(-) delete mode 100644 modules/caddyhttp/tracing/serve.go diff --git a/modules/caddyhttp/tracing/serve.go b/modules/caddyhttp/tracing/serve.go deleted file mode 100644 index b4fb00548fa..00000000000 --- a/modules/caddyhttp/tracing/serve.go +++ /dev/null @@ -1,23 +0,0 @@ -package tracing - -import ( - "net/http" - - "github.com/caddyserver/caddy/v2" - "github.com/caddyserver/caddy/v2/modules/caddyhttp" - "go.opentelemetry.io/otel/propagation" -) - -// nextCall store the next handler, and the error value return on calling it (if any) -type nextCall struct { - next caddyhttp.Handler - err error -} - -const nextCallCtxKey caddy.CtxKey = "nextCall" - -func (ot *openTelemetryWrapper) serveHTTP(w http.ResponseWriter, r *http.Request) { - ot.propagators.Inject(r.Context(), propagation.HeaderCarrier(r.Header)) - next := r.Context().Value(nextCallCtxKey).(*nextCall) - next.err = next.next.ServeHTTP(w, r) -} diff --git a/modules/caddyhttp/tracing/tracer.go b/modules/caddyhttp/tracing/tracer.go index 9fe7dbfe540..d3bc0ab0296 100644 --- a/modules/caddyhttp/tracing/tracer.go +++ b/modules/caddyhttp/tracing/tracer.go @@ -3,6 +3,7 @@ package tracing import ( "context" "fmt" + "github.com/caddyserver/caddy/v2" "net/http" caddycmd "github.com/caddyserver/caddy/v2/cmd" @@ -17,10 +18,17 @@ import ( ) const ( - webEngineName = "Caddy" - defaultSpanName = "handler" + webEngineName = "Caddy" + defaultSpanName = "handler" + nextCallCtxKey caddy.CtxKey = "nextCall" ) +// nextCall store the next handler, and the error value return on calling it (if any) +type nextCall struct { + next caddyhttp.Handler + err error +} + // openTelemetryWrapper is responsible for the tracing injection, extraction and propagation. type openTelemetryWrapper struct { propagators propagation.TextMapPropagator @@ -64,6 +72,13 @@ func newOpenTelemetryWrapper( return ot, nil } +// serveHTTP injects a tracing context and call the next handler. +func (ot *openTelemetryWrapper) serveHTTP(w http.ResponseWriter, r *http.Request) { + ot.propagators.Inject(r.Context(), propagation.HeaderCarrier(r.Header)) + next := r.Context().Value(nextCallCtxKey).(*nextCall) + next.err = next.next.ServeHTTP(w, r) +} + // ServeHTTP propagates call to the by wrapped by `otelhttp` next handler. func (ot *openTelemetryWrapper) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyhttp.Handler) error { n := &nextCall{ From c8025eafd64bfc86cabd9b88a74612bf9da96a1b Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Thu, 20 Jan 2022 10:21:24 +0100 Subject: [PATCH 57/60] add syntax to the UnmarshalCaddyfile comment --- modules/caddyhttp/tracing/module.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/caddyhttp/tracing/module.go b/modules/caddyhttp/tracing/module.go index ff67d0f62e2..7cce6692b1a 100644 --- a/modules/caddyhttp/tracing/module.go +++ b/modules/caddyhttp/tracing/module.go @@ -64,7 +64,12 @@ func (ot *Tracing) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyh return ot.otel.ServeHTTP(w, r, next) } -// UnmarshalCaddyfile sets up the module from Caddyfile tokens. +// UnmarshalCaddyfile sets up the module from Caddyfile tokens. Syntax: +// +// tracing { +// [span ] +// } +// func (ot *Tracing) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { setParameter := func(d *caddyfile.Dispenser, val *string) error { if d.NextArg() { From 13d82eeebcec189510bfc745779a3c224ce896d7 Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Thu, 20 Jan 2022 21:29:46 +0100 Subject: [PATCH 58/60] go import the file --- modules/caddyhttp/tracing/tracer.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/caddyhttp/tracing/tracer.go b/modules/caddyhttp/tracing/tracer.go index d3bc0ab0296..ce23944cfcd 100644 --- a/modules/caddyhttp/tracing/tracer.go +++ b/modules/caddyhttp/tracing/tracer.go @@ -3,9 +3,10 @@ package tracing import ( "context" "fmt" - "github.com/caddyserver/caddy/v2" "net/http" + "github.com/caddyserver/caddy/v2" + caddycmd "github.com/caddyserver/caddy/v2/cmd" "github.com/caddyserver/caddy/v2/modules/caddyhttp" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" From 07c7dc6e4fa32ae856cad57aa73f31da35512e48 Mon Sep 17 00:00:00 2001 From: Alok Naushad Date: Sat, 12 Feb 2022 01:53:45 +0530 Subject: [PATCH 59/60] admin: Write proper status on invalid requests (#4569) (fix #4561) --- admin.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/admin.go b/admin.go index 0a7b9330798..bd9c2aea7e4 100644 --- a/admin.go +++ b/admin.go @@ -905,10 +905,16 @@ func handleConfigID(w http.ResponseWriter, r *http.Request) error { parts := strings.Split(idPath, "/") if len(parts) < 3 || parts[2] == "" { - return fmt.Errorf("request path is missing object ID") + return APIError{ + HTTPStatus: http.StatusBadRequest, + Err: fmt.Errorf("request path is missing object ID"), + } } if parts[0] != "" || parts[1] != "id" { - return fmt.Errorf("malformed object path") + return APIError{ + HTTPStatus: http.StatusBadRequest, + Err: fmt.Errorf("malformed object path"), + } } id := parts[2] @@ -917,7 +923,10 @@ func handleConfigID(w http.ResponseWriter, r *http.Request) error { expanded, ok := rawCfgIndex[id] defer currentCfgMu.RUnlock() if !ok { - return fmt.Errorf("unknown object ID '%s'", id) + return APIError{ + HTTPStatus: http.StatusNotFound, + Err: fmt.Errorf("unknown object ID '%s'", id), + } } // piece the full URL path back together From faa786ca5e85f72238ca99d1b51852acdf66009c Mon Sep 17 00:00:00 2001 From: Andrii Kushch Date: Tue, 15 Feb 2022 12:56:23 +0100 Subject: [PATCH 60/60] update dependencies --- go.mod | 8 ++++---- go.sum | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 5493aa14d23..89298ec2295 100644 --- a/go.mod +++ b/go.mod @@ -24,10 +24,10 @@ require ( github.com/smallstep/truststore v0.10.1 github.com/yuin/goldmark v1.4.4 github.com/yuin/goldmark-highlighting v0.0.0-20210516132338-9216f9c5aa01 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.28.0 - go.opentelemetry.io/otel v1.3.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0 - go.opentelemetry.io/otel/sdk v1.3.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.29.0 + go.opentelemetry.io/otel v1.4.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.4.0 + go.opentelemetry.io/otel/sdk v1.4.0 go.uber.org/zap v1.20.0 golang.org/x/crypto v0.0.0-20210915214749-c084706c2272 golang.org/x/net v0.0.0-20210913180222-943fd674d43e diff --git a/go.sum b/go.sum index 14dcb18e400..36232a851a8 100644 --- a/go.sum +++ b/go.sum @@ -185,7 +185,10 @@ github.com/caddyserver/certmagic v0.15.3/go.mod h1:qhkAOthf72ufAcp3Y5jF2RaGE96oi github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A= +github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +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.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -209,7 +212,11 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= 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-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +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/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= @@ -280,11 +287,14 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +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/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= +github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= @@ -320,6 +330,10 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-piv/piv-go v1.7.0/go.mod h1:ON2WvQncm7dIkCQ7kYJs+nc3V4jHGfrrJnSF8HKy7Gk= github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= @@ -403,8 +417,9 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/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/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM= github.com/google/go-licenses v0.0.0-20210329231322-ce1d9163b77d/go.mod h1:+TYOmkVoJOpwnS0wfdsJCV9CoD5nJYsHoFk/0CrTK4M= @@ -476,6 +491,7 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.9.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= +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/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= @@ -984,17 +1000,39 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.29.0 h1:SLme4Porm+UwX0DdHMxlwRt7FzPSE0sys81bet2o0pU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.29.0/go.mod h1:tLYsuf2v8fZreBVwp9gVMhefZlLFZaUiNVSq8QxXRII= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel v1.4.0 h1:7ESuKPq6zpjRaY5nvVDGiuwK7VAJ8MwkKnmNJ9whNZ4= +go.opentelemetry.io/otel v1.4.0/go.mod h1:jeAqMFKy2uLIxCtKxoFj0FAL5zAPKQagc3+GtBWakzk= +go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.4.0 h1:j7AwzDdAQBJjcqayAaYbvpYeZzII7cEe5qJTu+De6UY= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.4.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.4.0 h1:lRpP10E8oTGVmY1nVXcwelCT1Z8ca41/l5ce7AqLAss= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.4.0/go.mod h1:3oS+j2WUoJVyj6/BzQN/52G17lNJDulngsOxDm1w2PY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.4.0 h1:buSx4AMC/0Z232slPhicN/fU5KIlj0bMngct5pcZhkI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.4.0/go.mod h1:ew1NcwkHo0QFT3uTm3m2IVZMkZdVIpbOYNPasgWwpdk= +go.opentelemetry.io/otel/internal/metric v0.27.0 h1:9dAVGAfFiiEq5NVB9FUJ5et+btbDQAUIJehJ+ikyryk= +go.opentelemetry.io/otel/internal/metric v0.27.0/go.mod h1:n1CVxRqKqYZtqyTh9U/onvKapPGv7y/rpyOTI+LFNzw= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/metric v0.27.0 h1:HhJPsGhJoKRSegPQILFbODU56NS/L1UE4fS1sC5kIwQ= +go.opentelemetry.io/otel/metric v0.27.0/go.mod h1:raXDJ7uP2/Jc0nVZWQjJtzoyssOYWu/+pjZqRzfvZ7g= 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 v1.4.0 h1:LJE4SW3jd4lQTESnlpQZcBhQ3oci0U2MLR5uhicfTHQ= +go.opentelemetry.io/otel/sdk v1.4.0/go.mod h1:71GJPNJh4Qju6zJuYl1CrYtXbrgfau/M9UAggqiy1UE= go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/otel/trace v1.4.0 h1:4OOUrPZdVFQkbzl/JSdvGCWIdw5ONXXxzHlaLlWppmo= +go.opentelemetry.io/otel/trace v1.4.0/go.mod h1:uc3eRsqDfWs9R7b92xbQbU42/eTNz4N+gLP8qJCi4aE= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.12.0 h1:CMJ/3Wp7iOWES+CYLfnBv+DVmPbB+kmy9PJ92XvlR6c= +go.opentelemetry.io/proto/otlp v0.12.0/go.mod h1:TsIjwGWIx5VFYv9KGVlOpxoBl5Dy+63SUguV7GGvlSQ= go.step.sm/cli-utils v0.7.0 h1:2GvY5Muid1yzp7YQbfCCS+gK3q7zlHjjLL5Z0DXz8ds= go.step.sm/cli-utils v0.7.0/go.mod h1:Ur6bqA/yl636kCUJbp30J7Unv5JJ226eW2KqXPDwF/E= go.step.sm/crypto v0.9.0/go.mod h1:+CYG05Mek1YDqi5WK0ERc6cOpKly2i/a5aZmU1sfGj0= @@ -1009,8 +1047,9 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= @@ -1260,6 +1299,7 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210412220455-f1c623a9e750/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1508,8 +1548,10 @@ google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQ google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= 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=