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
e4fa9cb7ac7f8cc71144d21be476d5f9830578ef
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
}