From 0d8883b6dcb915bf5683f454b860cc9f90537e48 Mon Sep 17 00:00:00 2001 From: Cindy Li Date: Thu, 30 Jul 2026 21:08:16 -0700 Subject: [PATCH] client: trace image pull stages Signed-off-by: Cindy Li --- client/pull.go | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/client/pull.go b/client/pull.go index 7435394306d3a..2d0279164aa73 100644 --- a/client/pull.go +++ b/client/pull.go @@ -167,6 +167,7 @@ func (c *Client) Pull(ctx context.Context, ref string, opts ...RemoteOpt) (_ Ima unpackSpan.End() return nil, err } + unpackSpan.SetAttributes(tracing.Attribute("unpack.count", ur.Unpacks)) unpackSpan.End() } @@ -197,6 +198,12 @@ func (c *Client) fetch(ctx context.Context, rCtx *RemoteContext, ref string, lim if err != nil { return images.Image{}, fmt.Errorf("failed to resolve reference %q: %w", ref, err) } + span.SetAttributes( + tracing.Attribute("container.image.ref", ref), + tracing.Attribute("image.name", name), + tracing.Attribute("target.mediaType", desc.MediaType), + tracing.Attribute("image.digest", desc.Digest.String()), + ) fetcher, err := rCtx.Resolver.Fetcher(ctx, name) if err != nil { @@ -268,12 +275,20 @@ func (c *Client) fetch(ctx context.Context, rCtx *RemoteContext, ref string, lim handler = rCtx.HandlerWrapper(handler) } - if err := images.Dispatch(ctx, handler, limiter, desc); err != nil { + dispatchCtx, dispatchSpan := tracing.StartSpan(ctx, tracing.Name(pullSpanPrefix, "dispatch")) + err = images.Dispatch(dispatchCtx, handler, limiter, desc) + dispatchSpan.SetStatus(err) + dispatchSpan.End() + if err != nil { return images.Image{}, err } if isConvertible { - if desc, err = converterFunc(ctx, desc); err != nil { + convertCtx, convertSpan := tracing.StartSpan(ctx, tracing.Name(pullSpanPrefix, "convert_manifest")) + desc, err = converterFunc(convertCtx, desc) + convertSpan.SetStatus(err) + convertSpan.End() + if err != nil { return images.Image{}, err } }