Skip to content

Commit

Permalink
first working version, emits traces but all spans are disconnected
Browse files Browse the repository at this point in the history
  • Loading branch information
ldemailly committed Nov 29, 2022
1 parent aaa4b9b commit 75bc983
Show file tree
Hide file tree
Showing 6 changed files with 485 additions and 6 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.vscode

*.json
dist/
fortiotel
9 changes: 9 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,12 @@ docker-test:
GOOS=linux go build
docker build . --tag fortio/fortiotel:test
docker run fortio/fortiotel:test

start-local-jaeger:
docker run -d --name jaeger -p 16686:16686 -p 4317:4317 jaegertracing/all-in-one:latest \
--collector.otlp.enabled=true --collector.otlp.grpc.host-port=:4317
@echo "Jaeger UI:\nhttp://localhost:16686"

stop-local-jaeger:
docker stop jaeger
docker rm jaeger
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,20 @@ You can also download one of the many binary [releases](https://github.com/forti

We publish a multi architecture docker image (linux/amd64, linux/arm64) `docker run fortio/fortiotel`

# Testing:

Start a local jaeger with otel receiver:
```
docker run -p 16686:16686 -p 4317:4317 jaegertracing/all-in-one:latest --collector.otlp.enabled=true --collector.otlp.grpc.host-port=:4317
```

Run fortio server and then for instance:
```
go run . load localhost:8080
```

Get disjoint traces (for now): http://localhost:16686/search

# Documentation

Loosely based on
Expand Down
41 changes: 40 additions & 1 deletion fortio_with_otel.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,17 @@ package main
import (
"context"
"flag"
"fmt"

"fortio.org/fortio/cli"
"fortio.org/fortio/fhttp"
"fortio.org/fortio/log"
"fortio.org/fortio/periodic"
"go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
)

// changeDefaults sets some flags to true by default instead of false.
Expand All @@ -38,12 +43,46 @@ func changeDefaults(flagNames []string) {
}
}

// Sort of inspired from
// https://github.com/open-telemetry/opentelemetry-go/blob/main/exporters/otlp/otlptrace/otlptracehttp/example_test.go

func installExportPipeline(ctx context.Context) (func(context.Context) error, error) {
// Insecure needed for jaeger otel grpc endpoint by default/using all-in-one.
// (and istio envoy will mtls secure it when not running local tests anyway)
client := otlptracegrpc.NewClient(otlptracegrpc.WithInsecure())
exporter, err := otlptrace.New(ctx, client)
if err != nil {
return nil, fmt.Errorf("creating OTLP trace exporter: %w", err)
}

tracerProvider := sdktrace.NewTracerProvider(
sdktrace.WithBatcher(exporter),
)
otel.SetTracerProvider(tracerProvider)

return tracerProvider.Shutdown, nil
}

var shutdown func(context.Context) error

func hook(ho *fhttp.HTTPOptions, ro *periodic.RunnerOptions) {
ho.ClientTrace = otelhttptrace.NewClientTrace(context.Background())
ctx := context.Background()
ho.ClientTrace = otelhttptrace.NewClientTrace(ctx)
// Registers a tracer Provider globally.
var err error
shutdown, err = installExportPipeline(ctx)
if err != nil {
log.Fatalf("Error setting up export pipeline: %v", err)
}
log.Infof("OTEL export pipeline setup successfully")
}

func main() {
// Change a bunch of defaults to better ones "2.0" afforded by this being a new binary.
changeDefaults([]string{"stdclient", "nocatchup", "uniform", "a"})
cli.FortioMain(hook)
if err := shutdown(context.Background()); err != nil {
log.Fatalf("Error shutting down up export pipeline: %v", err)
}
log.Infof("OTEL export pipeline shut down successfully")
}
11 changes: 9 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,31 @@ go 1.18
require (
fortio.org/fortio v1.39.0-pre4
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.36.4
go.opentelemetry.io/otel v1.11.1
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.11.1
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.11.1
go.opentelemetry.io/otel/sdk v1.11.1
)

// During development, point to local repo for fortio
// replace fortio.org/fortio => ../fortio

require (
github.com/cenkalti/backoff/v4 v4.1.3 // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/go-logr/logr v1.2.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/uuid v1.3.0 // indirect
go.opentelemetry.io/otel v1.11.1 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.1 // indirect
go.opentelemetry.io/otel/trace v1.11.1 // indirect
go.opentelemetry.io/proto/otlp v0.19.0 // indirect
golang.org/x/exp v0.0.0-20221111204811-129d8d6c17ab // indirect
golang.org/x/net v0.2.0 // indirect
golang.org/x/sys v0.2.0 // indirect
golang.org/x/text v0.4.0 // indirect
google.golang.org/genproto v0.0.0-20220714211235-042d03aeabc9 // indirect
google.golang.org/grpc v1.51.0 // indirect
google.golang.org/protobuf v1.28.0 // indirect
google.golang.org/protobuf v1.28.1 // indirect
)
Loading

0 comments on commit 75bc983

Please sign in to comment.