@cryptotaxi247 / kubo / commits / f7cab554f

feat: boxo tracing and traceparent support (#9811)

https://www.w3.org/TR/trace-context/ https://github.com/ipfs/bifrost-gateway/issues/68

Henrique Dias committed Apr 12, 2023 at 01:51 UTC f7cab554f9a8d1fc2b16742c10ea75f8f05e4190
7 files changed +14 -212
docs/environment-variables.md
+1 -70
@@ -164,74 +164,5 @@ and outputs it to `rcmgr.json.gz`
164 Default: disabled (not set)
165
166 # Tracing
167 -For advanced configuration (e.g. ratio-based sampling), see also: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md
167
169 -## `OTEL_TRACES_EXPORTER`
170 -Specifies the exporters to use as a comma-separated string. Each exporter has a set of additional environment variables used to configure it. The following values are supported:
171 -
172 -- `otlp`
173 -- `jaeger`
174 -- `zipkin`
175 -- `file` -- appends traces to a JSON file on the filesystem
176 -
177 -Setting this enables OpenTelemetry tracing.
178 -
179 -**NOTE** Tracing support is experimental: releases may contain tracing-related breaking changes.
180 -
181 -Default: "" (no exporters)
182 -
183 -## `OTLP Exporter`
184 -Unless specified in this section, the OTLP exporter uses the environment variables documented here: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md
185 -
186 -### `OTEL_EXPORTER_OTLP_PROTOCOL`
187 -Specifies the OTLP protocol to use, which is one of:
188 -
189 -- `grpc`
190 -- `http/protobuf`
191 -
192 -Default: "grpc"
193 -
194 -## `Jaeger Exporter`
195 -
196 -See: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md#jaeger-exporter
197 -
198 -## `Zipkin Exporter`
199 -See: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md#zipkin-exporter
200 -
201 -## `File Exporter`
202 -### `OTEL_EXPORTER_FILE_PATH`
203 -Specifies the filesystem path for the JSON file.
204 -
205 -Default: "$PWD/traces.json"
206 -
207 -### How to use Jaeger UI
208 -
209 -One can use the `jaegertracing/all-in-one` Docker image to run a full Jaeger
210 -stack and configure Kubo to publish traces to it (here, in an ephemeral
211 -container):
212 -
213 -```console
214 -$ docker run --rm -it --name jaeger \
215 - -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
216 - -p 5775:5775/udp \
217 - -p 6831:6831/udp \
218 - -p 6832:6832/udp \
219 - -p 5778:5778 \
220 - -p 16686:16686 \
221 - -p 14268:14268 \
222 - -p 14269:14269 \
223 - -p 14250:14250 \
224 - -p 9411:9411 \
225 - jaegertracing/all-in-one
226 -```
227 -
228 -Then, in other terminal, start Kubo with Jaeger tracing enabled:
229 -```
230 -$ OTEL_TRACES_EXPORTER=jaeger ipfs daemon
231 -```
232 -
233 -Finally, the [Jaeger UI](https://github.com/jaegertracing/jaeger-ui#readme) is available at http://localhost:16686
234 -
235 -## `OTEL_PROPAGATORS`
236 -
237 -See https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md#general-sdk-configuration
168 +For tracing configuration, please check: https://github.com/ipfs/boxo/blob/main/docs/tracing.md
docs/examples/kubo-as-a-library/go.mod
+1 -1
@@ -7,7 +7,7 @@ go 1.18
7 replace github.com/ipfs/kubo => ./../../..
8
9 require (
10 - github.com/ipfs/boxo v0.8.0
10 + github.com/ipfs/boxo v0.8.1-0.20230411232920-5d6c73c8e35e
11 github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
12 github.com/libp2p/go-libp2p v0.27.0
13 github.com/multiformats/go-multiaddr v0.9.0
docs/examples/kubo-as-a-library/go.sum
+2 -2
@@ -321,8 +321,8 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:
321 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
322 github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
323 github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
324 -github.com/ipfs/boxo v0.8.0 h1:UdjAJmHzQHo/j3g3b1bAcAXCj/GM6iTwvSlBDvPBNBs=
325 -github.com/ipfs/boxo v0.8.0/go.mod h1:RIsi4CnTyQ7AUsNn5gXljJYZlQrHBMnJp94p73liFiA=
324 +github.com/ipfs/boxo v0.8.1-0.20230411232920-5d6c73c8e35e h1:8wmBhjwJk2drWZjNwoN7uc+IkG+N93laIhjY69rjMqw=
325 +github.com/ipfs/boxo v0.8.1-0.20230411232920-5d6c73c8e35e/go.mod h1:xJ2hVb4La5WyD7GvKYE0lq2g1rmQZoCD2K4WNrV6aZI=
326 github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
327 github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
328 github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY=
go.mod
+6 -6
@@ -16,7 +16,7 @@ require (
16 github.com/gogo/protobuf v1.3.2
17 github.com/google/uuid v1.3.0
18 github.com/hashicorp/go-multierror v1.1.1
19 - github.com/ipfs/boxo v0.8.0
19 + github.com/ipfs/boxo v0.8.1-0.20230411232920-5d6c73c8e35e
20 github.com/ipfs/go-block-format v0.1.2
21 github.com/ipfs/go-cid v0.4.1
22 github.com/ipfs/go-cidutil v0.1.0
@@ -75,11 +75,6 @@ require (
75 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.40.0
76 go.opentelemetry.io/contrib/propagators/autoprop v0.40.0
77 go.opentelemetry.io/otel v1.14.0
78 - go.opentelemetry.io/otel/exporters/jaeger v1.14.0
79 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.14.0
80 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.14.0
81 - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.14.0
82 - go.opentelemetry.io/otel/exporters/zipkin v1.14.0
78 go.opentelemetry.io/otel/sdk v1.14.0
79 go.opentelemetry.io/otel/trace v1.14.0
80 go.uber.org/dig v1.16.1
@@ -208,8 +203,13 @@ require (
203 go.opentelemetry.io/contrib/propagators/b3 v1.15.0 // indirect
204 go.opentelemetry.io/contrib/propagators/jaeger v1.15.0 // indirect
205 go.opentelemetry.io/contrib/propagators/ot v1.15.0 // indirect
206 + go.opentelemetry.io/otel/exporters/jaeger v1.14.0 // indirect
207 go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.14.0 // indirect
208 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.14.0 // indirect
209 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.14.0 // indirect
210 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.14.0 // indirect
211 + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.14.0 // indirect
212 + go.opentelemetry.io/otel/exporters/zipkin v1.14.0 // indirect
213 go.opentelemetry.io/otel/metric v0.37.0 // indirect
214 go.opentelemetry.io/proto/otlp v0.19.0 // indirect
215 go.uber.org/atomic v1.10.0 // indirect
go.sum
+2 -2
@@ -356,8 +356,8 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:
356 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
357 github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
358 github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
359 -github.com/ipfs/boxo v0.8.0 h1:UdjAJmHzQHo/j3g3b1bAcAXCj/GM6iTwvSlBDvPBNBs=
360 -github.com/ipfs/boxo v0.8.0/go.mod h1:RIsi4CnTyQ7AUsNn5gXljJYZlQrHBMnJp94p73liFiA=
359 +github.com/ipfs/boxo v0.8.1-0.20230411232920-5d6c73c8e35e h1:8wmBhjwJk2drWZjNwoN7uc+IkG+N93laIhjY69rjMqw=
360 +github.com/ipfs/boxo v0.8.1-0.20230411232920-5d6c73c8e35e/go.mod h1:xJ2hVb4La5WyD7GvKYE0lq2g1rmQZoCD2K4WNrV6aZI=
361 github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
362 github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
363 github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY=
tracing/file_exporter.go deleted
-45
@@ -1,45 +0,0 @@
1 -package tracing
2 -
3 -import (
4 - "context"
5 - "fmt"
6 - "os"
7 -
8 - "go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
9 - "go.opentelemetry.io/otel/sdk/trace"
10 -)
11 -
12 -// fileExporter wraps a file-writing exporter and closes the file when the exporter is shutdown.
13 -type fileExporter struct {
14 - file *os.File
15 - writerExporter *stdouttrace.Exporter
16 -}
17 -
18 -func newFileExporter(file string) (*fileExporter, error) {
19 - f, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
20 - if err != nil {
21 - return nil, fmt.Errorf("opening '%s' for OpenTelemetry file exporter: %w", file, err)
22 - }
23 - stdoutExporter, err := stdouttrace.New(stdouttrace.WithWriter(f))
24 - if err != nil {
25 - return nil, err
26 - }
27 - return &fileExporter{
28 - writerExporter: stdoutExporter,
29 - file: f,
30 - }, nil
31 -}
32 -
33 -func (e *fileExporter) ExportSpans(ctx context.Context, spans []trace.ReadOnlySpan) error {
34 - return e.writerExporter.ExportSpans(ctx, spans)
35 -}
36 -
37 -func (e *fileExporter) Shutdown(ctx context.Context) error {
38 - if err := e.writerExporter.Shutdown(ctx); err != nil {
39 - return err
40 - }
41 - if err := e.file.Close(); err != nil {
42 - return fmt.Errorf("closing trace file: %w", err)
43 - }
44 - return nil
45 -}
tracing/tracing.go
+2 -86
@@ -3,16 +3,10 @@ package tracing
3 import (
4 "context"
5 "fmt"
6 - "os"
7 - "path"
8 - "strings"
6
7 + "github.com/ipfs/boxo/tracing"
8 version "github.com/ipfs/kubo"
9 "go.opentelemetry.io/otel"
12 - "go.opentelemetry.io/otel/exporters/jaeger"
13 - "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
14 - "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
15 - "go.opentelemetry.io/otel/exporters/zipkin"
10 "go.opentelemetry.io/otel/sdk/resource"
11 "go.opentelemetry.io/otel/sdk/trace"
12 semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
@@ -33,87 +27,9 @@ type noopShutdownTracerProvider struct{ traceapi.TracerProvider }
27
28 func (n *noopShutdownTracerProvider) Shutdown(ctx context.Context) error { return nil }
29
36 -func buildExporters(ctx context.Context) ([]trace.SpanExporter, error) {
37 - // These env vars are standardized but not yet supported by opentelemetry-go.
38 - // Once supported, we can remove most of this code.
39 - //
40 - // Specs:
41 - // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md#exporter-selection
42 - // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md
43 - var exporters []trace.SpanExporter
44 - for _, exporterStr := range strings.Split(os.Getenv("OTEL_TRACES_EXPORTER"), ",") {
45 - switch exporterStr {
46 - case "otlp":
47 - protocol := "http/protobuf"
48 - if v := os.Getenv("OTEL_EXPORTER_OTLP_PROTOCOL"); v != "" {
49 - protocol = v
50 - }
51 - if v := os.Getenv("OTEL_EXPORTER_OTLP_TRACES_PROTOCOL"); v != "" {
52 - protocol = v
53 - }
54 -
55 - switch protocol {
56 - case "http/protobuf":
57 - exporter, err := otlptracehttp.New(ctx)
58 - if err != nil {
59 - return nil, fmt.Errorf("building OTLP HTTP exporter: %w", err)
60 - }
61 - exporters = append(exporters, exporter)
62 - case "grpc":
63 - exporter, err := otlptracegrpc.New(ctx)
64 - if err != nil {
65 - return nil, fmt.Errorf("building OTLP gRPC exporter: %w", err)
66 - }
67 - exporters = append(exporters, exporter)
68 - default:
69 - return nil, fmt.Errorf("unknown or unsupported OTLP exporter '%s'", exporterStr)
70 - }
71 - case "jaeger":
72 - exporter, err := jaeger.New(jaeger.WithCollectorEndpoint())
73 - if err != nil {
74 - return nil, fmt.Errorf("building Jaeger exporter: %w", err)
75 - }
76 - exporters = append(exporters, exporter)
77 - case "zipkin":
78 - exporter, err := zipkin.New("")
79 - if err != nil {
80 - return nil, fmt.Errorf("building Zipkin exporter: %w", err)
81 - }
82 - exporters = append(exporters, exporter)
83 - case "file":
84 - // This is not part of the spec, but provided for convenience
85 - // so that you don't have to setup a collector,
86 - // and because we don't support the stdout exporter.
87 - filePath := os.Getenv("OTEL_EXPORTER_FILE_PATH")
88 - if filePath == "" {
89 - cwd, err := os.Getwd()
90 - if err != nil {
91 - return nil, fmt.Errorf("finding working directory for the OpenTelemetry file exporter: %w", err)
92 - }
93 - filePath = path.Join(cwd, "traces.json")
94 - }
95 - exporter, err := newFileExporter(filePath)
96 - if err != nil {
97 - return nil, err
98 - }
99 - exporters = append(exporters, exporter)
100 - case "none":
101 - continue
102 - case "":
103 - continue
104 - case "stdout":
105 - // stdout is already used for certain kinds of logging, so we don't support this
106 - fallthrough
107 - default:
108 - return nil, fmt.Errorf("unknown or unsupported exporter '%s'", exporterStr)
109 - }
110 - }
111 - return exporters, nil
112 -}
113 -
30 // NewTracerProvider creates and configures a TracerProvider.
31 func NewTracerProvider(ctx context.Context) (shutdownTracerProvider, error) {
116 - exporters, err := buildExporters(ctx)
32 + exporters, err := tracing.NewSpanExporters(ctx)
33 if err != nil {
34 return nil, err
35 }