Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
c5d152e
feat: add opentelemetry
janishorsts Dec 28, 2025
0467932
chore: wip
janishorsts Jan 2, 2026
b4a1e04
chore(lint): enable gocritic
janishorsts Jan 2, 2026
e04b99b
chore(lint): handle exit code correctly for autocomplete
janishorsts Jan 2, 2026
c3e44ad
Merge remote-tracking branch 'origin/main' into feat-otel
janishorsts Jan 3, 2026
8981a62
chore: wip
janishorsts Jan 3, 2026
20c9072
Merge remote-tracking branch 'origin/chore-lint-gocritic' into feat-otel
janishorsts Jan 3, 2026
829ebc7
chore: tidy
janishorsts Jan 7, 2026
6f756a7
feat: handle exit code
janishorsts Jan 7, 2026
0c1dc9f
Merge remote-tracking branch 'origin/main' into feat-otel
janishorsts Jan 10, 2026
0625446
Merge remote-tracking branch 'origin/main' into feat-otel
janishorsts Jan 10, 2026
137c316
Merge branch 'main' into feat-otel
janishorsts Jan 16, 2026
0c37068
chore: tidy
janishorsts Jan 19, 2026
9df14e0
Merge remote-tracking branch 'origin/main' into feat-otel
janishorsts Jan 19, 2026
a8b6c0a
Merge branch 'main' into feat-otel
janishorsts Feb 4, 2026
0a20fbb
feat: add OTel
janishorsts Feb 4, 2026
1a077e6
chore: tidy
janishorsts Feb 4, 2026
624be9a
chore: remove phase spans
janishorsts Feb 5, 2026
4c00206
chore: set span exporters to none
janishorsts Feb 5, 2026
363a83f
chore: tidy
janishorsts Feb 5, 2026
c0e5478
Merge branch 'main' into feat-otel
janishorsts Feb 5, 2026
cb01dfc
chore: tidy
janishorsts Feb 5, 2026
a152427
chore: tidy deps
janishorsts Feb 5, 2026
283f205
chore: rollback none exporter
janishorsts Feb 11, 2026
4f2c4ca
Merge remote-tracking branch 'origin/main' into feat-otel
janishorsts Feb 18, 2026
9ed8636
Merge branch 'main' into feat-otel
janishorsts Feb 25, 2026
d923de3
Merge remote-tracking branch 'origin/main' into feat-otel
janishorsts Feb 26, 2026
425bdd9
feat: opt in
janishorsts Feb 26, 2026
18a64f3
Merge remote-tracking branch 'origin/main' into feat-otel
janishorsts Feb 27, 2026
6a5a6d7
chore: gemini feedback
janishorsts Feb 27, 2026
4c75374
Merge branch 'main' into feat-otel
janishorsts Feb 27, 2026
1908976
chore: tidy
janishorsts Feb 27, 2026
1fda1ba
chore: tidy
janishorsts Feb 27, 2026
f089273
chore: tidy
janishorsts Feb 27, 2026
c791d32
Merge branch 'main' into feat-otel
janishorsts Feb 27, 2026
608eecd
fix(otel): only wrap HTTP transport when tracing is opted inPreviousl…
gilescope Mar 11, 2026
d081cdd
fix(otel): always set logger
gilescope Mar 11, 2026
691a6df
fix(otel): delay setting up trace till propagator is setup.
gilescope Mar 11, 2026
7d12f9e
Merge branch 'main' into feat-otel
janishorsts Mar 11, 2026
35cd680
style: pass lint
janishorsts Mar 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 33 additions & 13 deletions cmd/earthly/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,22 @@ import (
"syscall"
"time"

"github.com/EarthBuild/earthbuild/internal/version"
"github.com/fatih/color"
"github.com/joho/godotenv"
_ "github.com/moby/buildkit/client/connhelper/dockercontainer" // Load "docker-container://" helper.
"github.com/pkg/errors"
"github.com/sirupsen/logrus"

"github.com/EarthBuild/earthbuild/cmd/earthly/app"
"github.com/EarthBuild/earthbuild/cmd/earthly/base"
"github.com/EarthBuild/earthbuild/cmd/earthly/common"
eFlag "github.com/EarthBuild/earthbuild/cmd/earthly/flag"
"github.com/EarthBuild/earthbuild/cmd/earthly/subcmd"
"github.com/EarthBuild/earthbuild/conslogging"
"github.com/EarthBuild/earthbuild/internal/telemetry"
"github.com/EarthBuild/earthbuild/internal/version"
"github.com/EarthBuild/earthbuild/util/envutil"
"github.com/EarthBuild/earthbuild/util/syncutil"
"github.com/fatih/color"
"github.com/joho/godotenv"
_ "github.com/moby/buildkit/client/connhelper/dockercontainer" // Load "docker-container://" helper.
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
semconv "go.opentelemetry.io/otel/semconv/v1.37.0"
)

// These vars are set by ldflags.
Expand Down Expand Up @@ -59,10 +60,30 @@ func main() {

// run executes the CLI and returns an exit code to pass to [os.Exit].
func run() (code int) {
// set up OpenTelemetry
ctx := context.Background()

shutdown, err := telemetry.Setup(ctx)
if err != nil {
fmt.Fprintf(os.Stderr, "Error setting up OpenTelemetry: %s\n", err.Error())
} else {
defer shutdown(ctx)
}

ctx = telemetry.WithTraceparent(ctx)

ctx, span := telemetry.Tracer().Start(ctx, "main")
defer span.End()

defer func() {
span.SetAttributes(semconv.ProcessExitCode(code))
}()

// main

setExportableVars()

startTime := time.Now()
ctx := context.Background()
ctx, cancel := context.WithCancel(ctx)
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
Expand Down Expand Up @@ -126,15 +147,15 @@ func run() (code int) {
rootApp := subcmd.NewRoot(cli, buildApp)

for _, f := range cli.Flags().RootFlags(DefaultInstallationName, DefaultBuildkitdImage) {
err := f.Apply(flagSet)
err = f.Apply(flagSet)
if err != nil {
envFileFromArgOK = false
break
}
}

if envFileFromArgOK {
err := flagSet.Parse(os.Args[1:])
err = flagSet.Parse(os.Args[1:])
if err == nil {
if envFileFlag := flagSet.Lookup(eFlag.EnvFileFlag); envFileFlag != nil {
envFile = envFileFlag.Value.String()
Expand All @@ -143,7 +164,7 @@ func run() (code int) {
}
}

err := godotenv.Load(envFile)
err = godotenv.Load(envFile)
if err != nil {
// ignore ErrNotExist when using default .env file
if envFileOverride || !errors.Is(err, os.ErrNotExist) {
Expand Down Expand Up @@ -181,7 +202,6 @@ func run() (code int) {

cli.SetConsole(logging)
earthly := app.NewEarthlyApp(cli, rootApp, buildApp, ctx)
code = earthly.Run(ctx, logging, startTime, lastSignal)

return code
return earthly.Run(ctx, logging, startTime, lastSignal)
}
2 changes: 1 addition & 1 deletion earthfile2llb/converter.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ type Converter struct {

// NewConverter constructs a new converter for a given earthly target.
func NewConverter(
ctx context.Context, target domain.Target, bc *buildcontext.Data, sts *states.SingleTarget, opt ConvertOpt,
target domain.Target, bc *buildcontext.Data, sts *states.SingleTarget, opt ConvertOpt,
) (*Converter, error) {
opt.BuildContextProvider.AddDirs(bc.LocalDirs)
sts.HasDangling = opt.HasDangling
Expand Down
6 changes: 5 additions & 1 deletion earthfile2llb/earthfile2llb.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/EarthBuild/earthbuild/conslogging"
"github.com/EarthBuild/earthbuild/domain"
"github.com/EarthBuild/earthbuild/features"
"github.com/EarthBuild/earthbuild/internal/telemetry"
"github.com/EarthBuild/earthbuild/logbus"
"github.com/EarthBuild/earthbuild/states"
"github.com/EarthBuild/earthbuild/util/containerutil"
Expand Down Expand Up @@ -181,6 +182,9 @@ type ConvertOpt struct {
func Earthfile2LLB(
ctx context.Context, target domain.Target, opt ConvertOpt, initialCall bool,
) (mts *states.MultiTarget, retErr error) {
ctx, span := telemetry.Tracer().Start(ctx, "+"+target.Target)
defer span.End()

if opt.SolveCache == nil {
opt.SolveCache = states.NewSolveCache()
}
Expand Down Expand Up @@ -324,7 +328,7 @@ func Earthfile2LLB(
opt.Console.VerbosePrintf("earthfile2llb building %s with OverridingVars=%v",
targetWithMetadata.StringCanonical(), opt.OverridingVars.Map())

converter, err := NewConverter(ctx, targetWithMetadata, bc, sts, opt)
converter, err := NewConverter(targetWithMetadata, bc, sts, opt)
if err != nil {
return nil, err
}
Expand Down
61 changes: 42 additions & 19 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ require (
github.com/dustin/go-humanize v1.0.1
github.com/elastic/go-sysinfo v1.15.4
github.com/fatih/color v1.18.0
github.com/go-logr/stdr v1.2.2
github.com/gofrs/flock v0.13.0
github.com/google/uuid v1.6.0
github.com/hashicorp/go-multierror v1.1.1
Expand All @@ -44,11 +45,20 @@ require (
github.com/tonistiigi/fsutil v0.0.0-20230825212630-f09800878302
github.com/urfave/cli/v2 v2.27.7
go.etcd.io/bbolt v1.4.3
go.opentelemetry.io/contrib/exporters/autoexport v0.55.0
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0
go.opentelemetry.io/otel v1.40.0
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.16.0
go.opentelemetry.io/otel/log v0.16.0
go.opentelemetry.io/otel/sdk v1.40.0
go.opentelemetry.io/otel/sdk/log v0.16.0
go.opentelemetry.io/otel/sdk/metric v1.40.0
go.opentelemetry.io/otel/trace v1.40.0
golang.org/x/crypto v0.48.0
golang.org/x/sync v0.19.0
golang.org/x/term v0.40.0
golang.org/x/text v0.34.0
google.golang.org/grpc v1.66.2
google.golang.org/grpc v1.66.3
google.golang.org/protobuf v1.36.11
gopkg.in/yaml.v3 v3.0.1
)
Expand All @@ -71,6 +81,9 @@ require (
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.13 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.41.6 // indirect
github.com/aws/smithy-go v1.24.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/containerd/console v1.0.3 // indirect
github.com/containerd/containerd v1.7.27 // indirect
github.com/containerd/containerd/api v1.8.0 // indirect
Expand All @@ -84,28 +97,32 @@ require (
github.com/docker/docker v24.0.0-rc.2.0.20230905130451-032797ea4bcb+incompatible // indirect
github.com/docker/docker-credential-helpers v0.7.0 // indirect
github.com/elastic/go-windows v1.0.2 // indirect
github.com/felixge/httpsnoop v1.0.3 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/gogo/googleapis v1.4.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/in-toto/in-toto-golang v0.5.0 // indirect
github.com/klauspost/compress v1.17.2 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/moby/locker v1.0.1 // indirect
github.com/moby/sys/signal v0.7.0 // indirect
github.com/morikuni/aec v1.0.0 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/opencontainers/runc v1.1.9 // indirect
github.com/opencontainers/runtime-spec v1.1.0 // indirect
github.com/otiai10/mint v1.6.3 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/prometheus/client_golang v1.23.2 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
github.com/prometheus/common v0.67.4 // indirect
github.com/prometheus/otlptranslator v1.0.0 // indirect
github.com/prometheus/procfs v0.19.2 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/secure-systems-lab/go-securesystemslib v0.4.0 // indirect
github.com/shibumi/go-pathspec v1.3.0 // indirect
Expand All @@ -114,22 +131,28 @@ require (
github.com/vbatts/tar-split v0.11.3 // indirect
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0 // indirect
go.opentelemetry.io/otel v1.38.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect
go.opentelemetry.io/otel/metric v1.38.0 // indirect
go.opentelemetry.io/otel/sdk v1.38.0 // indirect
go.opentelemetry.io/otel/trace v1.38.0 // indirect
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect
go.opentelemetry.io/contrib/bridges/prometheus v0.64.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.6.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.30.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 // indirect
go.opentelemetry.io/otel/exporters/prometheus v0.61.0 // indirect
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.39.0 // indirect
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.39.0 // indirect
go.opentelemetry.io/otel/metric v1.40.0 // indirect
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
go.yaml.in/yaml/v2 v2.4.3 // indirect
golang.org/x/exp v0.0.0-20260112195511-716be5621a96 // indirect
golang.org/x/net v0.49.0 // indirect
golang.org/x/oauth2 v0.32.0 // indirect
golang.org/x/sys v0.41.0 // indirect
golang.org/x/time v0.3.0 // indirect
golang.org/x/time v0.14.0 // indirect
google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20251029180050-ab9386a59fda // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect
gotest.tools/v3 v3.4.0 // indirect
howett.net/plist v0.0.0-20181124034731-591f970eefbb // indirect
)
Expand Down
Loading
Loading