Skip to content

Commit

Permalink
Move to OpenTelemetry
Browse files Browse the repository at this point in the history
Signed-off-by: Alvise <vitalvise@gmail.com>
  • Loading branch information
Alvise88 authored and avitturi committed Jul 9, 2021
1 parent 7fd80c7 commit 99d2514
Show file tree
Hide file tree
Showing 7 changed files with 128 additions and 72 deletions.
17 changes: 11 additions & 6 deletions client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import (
"path/filepath"
"strings"

"go.opentelemetry.io/otel"
"golang.org/x/sync/errgroup"

"github.com/opentracing/opentracing-go"
"github.com/rs/zerolog/log"

// Cue
Expand Down Expand Up @@ -50,9 +50,12 @@ func New(ctx context.Context, host string, noCache bool) (*Client, error) {
host = h
}
opts := []bk.ClientOpt{}
if span := opentracing.SpanFromContext(ctx); span != nil {
opts = append(opts, bk.WithTracer(span.Tracer()))
}

// FIXME: uncomment when next version of buildkit will be released
// if span := trace.SpanFromContext(ctx); span != nil {
// opts = append(opts, bk.WithTracerProvider(span.TracerProvider()))
// }

c, err := bk.New(ctx, host, opts...)
if err != nil {
return nil, fmt.Errorf("buildkit client: %w", err)
Expand Down Expand Up @@ -152,8 +155,10 @@ func (c *Client) buildfn(ctx context.Context, st *state.State, env *environment.
// Export environment to a cue directory
// FIXME: this should be elsewhere
lg.Debug().Msg("exporting environment")
span, _ := opentracing.StartSpanFromContext(ctx, "Environment.Export")
defer span.Finish()

tr := otel.Tracer("client")
_, span := tr.Start(ctx, "environment.Export")
defer span.End()

computed := env.Computed().JSON().PrettyString()
st := llb.
Expand Down
18 changes: 12 additions & 6 deletions cmd/dagger/cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,16 @@ import (
"strings"

"github.com/moby/buildkit/util/appcontext"
"github.com/opentracing/opentracing-go"
otlog "github.com/opentracing/opentracing-go/log"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"go.dagger.io/dagger/cmd/dagger/cmd/input"
"go.dagger.io/dagger/cmd/dagger/cmd/output"
"go.dagger.io/dagger/cmd/dagger/logger"
"go.dagger.io/dagger/keychain"

"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/trace"
)

var rootCmd = &cobra.Command{
Expand Down Expand Up @@ -74,17 +76,21 @@ func Execute() {
// default logger. Therefore, we can't store the logger into the context.
lg = logger.New()
closer = logger.InitTracing()
span opentracing.Span
span trace.Span
)

if len(os.Args) > 1 {
span, ctx = opentracing.StartSpanFromContext(ctx, os.Args[1])
span.LogFields(otlog.String("command", strings.Join(os.Args, " ")))
tr := otel.Tracer("cmd")
ctx, span = tr.Start(ctx, os.Args[1])
// Record the action
span.AddEvent("command", trace.WithAttributes(
attribute.String("args", strings.Join(os.Args, " ")),
))
}

defer func() {
if span != nil {
span.Finish()
span.End()
}
closer.Close()
}()
Expand Down
61 changes: 50 additions & 11 deletions cmd/dagger/logger/tracer.go
Original file line number Diff line number Diff line change
@@ -1,31 +1,70 @@
package logger

import (
"context"
"io"
"os"
"time"

opentracing "github.com/opentracing/opentracing-go"
jaeger "github.com/uber/jaeger-client-go"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/jaeger"
"go.opentelemetry.io/otel/sdk/resource"
tracesdk "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
)

type tracer struct {
provider *tracesdk.TracerProvider
}

func InitTracing() io.Closer {
traceAddr := os.Getenv("JAEGER_TRACE")
if traceAddr == "" {
traceEndpoint := os.Getenv("OTEL_EXPORTER_JAEGER_ENDPOINT")
if traceEndpoint == "" {
return &nopCloser{}
}

tr, err := jaeger.NewUDPTransport(traceAddr, 0)
tp, err := tracerProvider(traceEndpoint)
if err != nil {
panic(err)
}

tracer, closer := jaeger.NewTracer(
"dagger",
jaeger.NewConstSampler(true),
jaeger.NewRemoteReporter(tr),
// Register our TracerProvider as the global so any imported
// instrumentation in the future will default to using it.
otel.SetTracerProvider(tp)

tracer := tracer{
provider: tp,
}

return tracer
}

// tracerProvider returns an OpenTelemetry TracerProvider configured to use
// the Jaeger exporter that will send spans to the provided url. The returned
// TracerProvider will also use a Resource configured with all the information
// about the application.
func tracerProvider(url string) (*tracesdk.TracerProvider, error) {
// Create the Jaeger exporter
exp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url)))
if err != nil {
return nil, err
}
tp := tracesdk.NewTracerProvider(
// Always be sure to batch in production.
tracesdk.WithBatcher(exp, tracesdk.WithMaxExportBatchSize(1)),
// Record information about this application in an Resource.
tracesdk.WithResource(resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceNameKey.String("dagger"),
)),
)
opentracing.SetGlobalTracer(tracer)
return closer
return tp, nil
}

func (t tracer) Close() error {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
return t.provider.Shutdown(ctx)
}

type nopCloser struct {
Expand Down
36 changes: 21 additions & 15 deletions environment/environment.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,10 @@ import (
"go.dagger.io/dagger/solver"
"go.dagger.io/dagger/state"

"github.com/opentracing/opentracing-go"
"github.com/opentracing/opentracing-go/ext"
otlog "github.com/opentracing/opentracing-go/log"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/trace"

"github.com/rs/zerolog/log"
)

Expand Down Expand Up @@ -78,8 +79,9 @@ func (e *Environment) Computed() *compiler.Value {

// LoadPlan loads the plan
func (e *Environment) LoadPlan(ctx context.Context, s solver.Solver) error {
span, ctx := opentracing.StartSpanFromContext(ctx, "environment.LoadPlan")
defer span.Finish()
tr := otel.Tracer("environment")
ctx, span := tr.Start(ctx, "environment.LoadPlan")
defer span.End()

// FIXME: universe vendoring
// This is already done on `dagger init` and shouldn't be done here too.
Expand Down Expand Up @@ -177,8 +179,9 @@ func (e *Environment) LocalDirs() map[string]string {

// prepare initializes the Environment with inputs and plan code
func (e *Environment) prepare(ctx context.Context) (*compiler.Value, error) {
span, _ := opentracing.StartSpanFromContext(ctx, "environment.Prepare")
defer span.Finish()
tr := otel.Tracer("environment")
_, span := tr.Start(ctx, "environment.Prepare")
defer span.End()

// Reset the computed values
e.computed = compiler.NewValue()
Expand All @@ -196,8 +199,9 @@ func (e *Environment) prepare(ctx context.Context) (*compiler.Value, error) {

// Up missing values in environment configuration, and write them to state.
func (e *Environment) Up(ctx context.Context, s solver.Solver) error {
span, ctx := opentracing.StartSpanFromContext(ctx, "environment.Up")
defer span.Finish()
tr := otel.Tracer("environment")
ctx, span := tr.Start(ctx, "environment.Up")
defer span.End()

// Set user inputs and plan code
src, err := e.prepare(ctx)
Expand Down Expand Up @@ -250,10 +254,10 @@ func newPipelineRunner(computed *compiler.Value, s solver.Solver) cueflow.Runner
Str("component", t.Path().String()).
Logger()
ctx = lg.WithContext(ctx)
span, ctx := opentracing.StartSpanFromContext(ctx,
fmt.Sprintf("compute: %s", t.Path().String()),
)
defer span.Finish()

tr := otel.Tracer("environment")
ctx, span := tr.Start(ctx, fmt.Sprintf("compute: %s", t.Path().String()))
defer span.End()

start := time.Now()
lg.
Expand All @@ -269,8 +273,10 @@ func newPipelineRunner(computed *compiler.Value, s solver.Solver) cueflow.Runner
p := NewPipeline(v, s)
err := p.Run(ctx)
if err != nil {
span.LogFields(otlog.String("error", err.Error()))
ext.Error.Set(span, true)
// Record the error
span.AddEvent("command", trace.WithAttributes(
attribute.String("error", err.Error()),
))

// FIXME: this should use errdefs.IsCanceled(err)
if strings.Contains(err.Error(), "context canceled") {
Expand Down
12 changes: 6 additions & 6 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ go 1.16
require (
cuelang.org/go v0.4.0
filippo.io/age v1.0.0-rc.3
github.com/HdrHistogram/hdrhistogram-go v1.1.0 // indirect
github.com/KromDaniel/jonson v0.0.0-20180630143114-d2f9c3c389db
github.com/containerd/console v1.0.2
github.com/docker/distribution v2.7.1+incompatible
Expand All @@ -19,20 +18,21 @@ require (
github.com/moby/buildkit v0.8.3
github.com/morikuni/aec v1.0.0
github.com/opencontainers/go-digest v1.0.0
github.com/opentracing/opentracing-go v1.2.0
github.com/rs/zerolog v1.23.0
github.com/spf13/cobra v1.2.1
github.com/spf13/viper v1.8.1
github.com/stretchr/testify v1.7.0
github.com/tonistiigi/fsutil v0.0.0-20201103201449-0834f99b7b85
github.com/tonistiigi/fsutil v0.0.0-20210609172227-d72af97c0eaf
github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea
github.com/uber/jaeger-client-go v2.29.1+incompatible
github.com/uber/jaeger-lib v2.4.1+incompatible // indirect
go.mozilla.org/sops/v3 v3.7.1
go.opentelemetry.io/otel v1.0.0-RC1
go.opentelemetry.io/otel/exporters/jaeger v1.0.0-RC1
go.opentelemetry.io/otel/sdk v1.0.0-RC1
go.opentelemetry.io/otel/trace v1.0.0-RC1
golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c // indirect
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e
google.golang.org/grpc v1.39.0
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
)
Expand Down

0 comments on commit 99d2514

Please sign in to comment.