history: add comparison support to trace

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
This commit is contained in:
Tonis Tiigi 2025-02-05 22:57:49 -08:00
parent 7433d37183
commit 1089ff7341
No known key found for this signature in database
GPG Key ID: AFA9DE5F8AB7AF39
3 changed files with 49 additions and 22 deletions

View File

@ -32,8 +32,8 @@ import (
type traceOptions struct { type traceOptions struct {
builder string builder string
ref string ref string
containerName string
addr string addr string
compare string
} }
func loadTrace(ctx context.Context, ref string, nodes []builder.Node) (string, []byte, error) { func loadTrace(ctx context.Context, ref string, nodes []builder.Node) (string, []byte, error) {
@ -175,39 +175,48 @@ func runTrace(ctx context.Context, dockerCli command.Cli, opts traceOptions) err
} }
} }
traceid, data, err := loadTrace(ctx, opts.ref, nodes) traceID, data, err := loadTrace(ctx, opts.ref, nodes)
if err != nil { if err != nil {
return err return err
} }
srv := jaegerui.NewServer(jaegerui.Config{})
if err := srv.AddTrace(traceID, bytes.NewReader(data)); err != nil {
return err
}
url := "/trace/" + traceID
if opts.compare != "" {
traceIDcomp, data, err := loadTrace(ctx, opts.compare, nodes)
if err != nil {
return errors.Wrapf(err, "failed to load trace for %s", opts.compare)
}
if err := srv.AddTrace(traceIDcomp, bytes.NewReader(data)); err != nil {
return err
}
url = "/trace/" + traceIDcomp + "..." + traceID
}
var term bool var term bool
if _, err := console.ConsoleFromFile(os.Stdout); err == nil { if _, err := console.ConsoleFromFile(os.Stdout); err == nil {
term = true term = true
} }
if !term { if !term && opts.compare == "" {
fmt.Fprintln(dockerCli.Out(), string(data)) fmt.Fprintln(dockerCli.Out(), string(data))
return nil return nil
} }
srv := jaegerui.NewServer(jaegerui.Config{})
if err := srv.AddTrace(traceid, bytes.NewReader(data)); err != nil {
return err
}
ln, err := net.Listen("tcp", opts.addr) ln, err := net.Listen("tcp", opts.addr)
if err != nil { if err != nil {
return err return err
} }
url := "http://" + ln.Addr().String() + "/trace/" + traceid
go func() { go func() {
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
browser.OpenURL(url) browser.OpenURL(url)
}() }()
url = "http://" + ln.Addr().String() + url
fmt.Fprintf(dockerCli.Err(), "Trace available at %s\n", url) fmt.Fprintf(dockerCli.Err(), "Trace available at %s\n", url)
go func() { go func() {
@ -244,8 +253,8 @@ func traceCmd(dockerCli command.Cli, rootOpts RootOptions) *cobra.Command {
} }
flags := cmd.Flags() flags := cmd.Flags()
flags.StringVar(&options.containerName, "container", "", "Container name")
flags.StringVar(&options.addr, "addr", "127.0.0.1:0", "Address to bind the UI server") flags.StringVar(&options.addr, "addr", "127.0.0.1:0", "Address to bind the UI server")
flags.StringVar(&options.compare, "compare", "", "Compare with another build reference")
return cmd return cmd
} }

View File

@ -6,12 +6,13 @@ Commands to work on build records
### Subcommands ### Subcommands
| Name | Description | | Name | Description |
|:---------------------------------------|:-------------------------------| |:---------------------------------------|:-----------------------------------------------|
| [`inspect`](buildx_history_inspect.md) | Inspect a build | | [`inspect`](buildx_history_inspect.md) | Inspect a build |
| [`logs`](buildx_history_logs.md) | Print the logs of a build | | [`logs`](buildx_history_logs.md) | Print the logs of a build |
| [`ls`](buildx_history_ls.md) | List build records | | [`ls`](buildx_history_ls.md) | List build records |
| [`open`](buildx_history_open.md) | Open a build in Docker Desktop | | [`open`](buildx_history_open.md) | Open a build in Docker Desktop |
| [`rm`](buildx_history_rm.md) | Remove build records | | [`rm`](buildx_history_rm.md) | Remove build records |
| [`trace`](buildx_history_trace.md) | Show the OpenTelemetry trace of a build record |
### Options ### Options

View File

@ -0,0 +1,17 @@
# docker buildx history trace
<!---MARKER_GEN_START-->
Show the OpenTelemetry trace of a build record
### Options
| Name | Type | Default | Description |
|:----------------|:---------|:--------------|:-----------------------------------------|
| `--addr` | `string` | `127.0.0.1:0` | Address to bind the UI server |
| `--builder` | `string` | | Override the configured builder instance |
| `--compare` | `string` | | Compare with another build reference |
| `-D`, `--debug` | `bool` | | Enable debug logging |
<!---MARKER_GEN_END-->