Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move to OpenTelemetry (#735) #778

Merged
merged 1 commit into from
Jul 13, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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(
Alvise88 marked this conversation as resolved.
Show resolved Hide resolved
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