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

Add otel spans #783

Merged
merged 1 commit into from
Jul 5, 2023
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ require (
github.com/spf13/cobra v1.7.0
github.com/stretchr/testify v1.8.4
gitlab.alpinelinux.org/alpine/go v0.7.1-0.20230613043312-f696350aabb4
go.opentelemetry.io/otel v1.16.0
golang.org/x/build v0.0.0-20220928220451-9294235e16f5
golang.org/x/sync v0.3.0
golang.org/x/sys v0.9.0
Expand Down Expand Up @@ -75,6 +76,8 @@ require (
github.com/emirpasic/gods v1.18.1 // indirect
github.com/go-git/gcfg v1.5.0 // indirect
github.com/go-git/go-billy/v5 v5.4.1 // indirect
github.com/go-logr/logr v1.2.4 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/analysis v0.21.4 // indirect
github.com/go-openapi/errors v0.20.3 // indirect
github.com/go-openapi/jsonpointer v0.19.6 // indirect
Expand Down Expand Up @@ -121,6 +124,8 @@ require (
github.com/xanzy/ssh-agent v0.3.3 // indirect
go.lsp.dev/uri v0.3.0 // indirect
go.mongodb.org/mongo-driver v1.11.3 // indirect
go.opentelemetry.io/otel/metric v1.16.0 // indirect
go.opentelemetry.io/otel/trace v1.16.0 // indirect
golang.org/x/crypto v0.10.0 // indirect
golang.org/x/mod v0.11.0 // indirect
golang.org/x/net v0.11.0 // indirect
Expand Down
11 changes: 11 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,11 @@ github.com/go-git/go-git-fixtures/v4 v4.3.1 h1:y5z6dd3qi8Hl+stezc8p3JxDkoTRqMAlK
github.com/go-git/go-git-fixtures/v4 v4.3.1/go.mod h1:8LHG1a3SRW71ettAD/jW13h8c6AqjVSeL11RAdgaqpo=
github.com/go-git/go-git/v5 v5.6.1 h1:q4ZRqQl4pR/ZJHc1L5CFjGA1a10u76aV1iC+nh+bHsk=
github.com/go-git/go-git/v5 v5.6.1/go.mod h1:mvyoL6Unz0PiTQrGQfSfiLFhBH1c1e84ylC2MDs4ee8=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY=
github.com/go-openapi/analysis v0.21.4 h1:ZDFLvSNxpDaomuCueM0BlSXxpANBlFYiBvr+GXrvIHc=
github.com/go-openapi/analysis v0.21.4/go.mod h1:4zQ35W4neeZTqh3ol0rv/O8JBbka9QyAgQRPp9y3pfo=
Expand Down Expand Up @@ -413,6 +418,12 @@ go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4x
go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8=
go.mongodb.org/mongo-driver v1.11.3 h1:Ql6K6qYHEzB6xvu4+AU0BoRoqf9vFPcc4o7MUIdPW8Y=
go.mongodb.org/mongo-driver v1.11.3/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g=
go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s=
go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4=
go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo=
go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4=
go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs=
go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0=
golang.org/x/arch v0.1.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/build v0.0.0-20220928220451-9294235e16f5 h1:g6/rDfRDvg9YmyUh+Gh15jXoboibZhuv+MiKh8uR8dU=
golang.org/x/build v0.0.0-20220928220451-9294235e16f5/go.mod h1:09OhLJI8jZv4jqec7zqh+ZlRZKsSZgDyM5MV3pjurk4=
Expand Down
2 changes: 1 addition & 1 deletion internal/cli/build-minirootfs.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ func BuildMinirootFSCmd(ctx context.Context, opts ...build.Option) error {

bc.Logger().Printf("building minirootfs '%s'", bc.Options.TarballPath)

layerTarGZ, _, err := bc.BuildLayer()
layerTarGZ, _, err := bc.BuildLayer(ctx)
if err != nil {
return fmt.Errorf("failed to build layer image: %w", err)
}
Expand Down
10 changes: 7 additions & 3 deletions internal/cli/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
coci "github.com/sigstore/cosign/v2/pkg/oci"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"go.opentelemetry.io/otel"
"golang.org/x/sync/errgroup"
"golang.org/x/sys/unix"

Expand Down Expand Up @@ -178,6 +179,9 @@ func BuildCmd(ctx context.Context, imageRef, outputTarGZ string, archs []types.A
// buildImage build all of the components of an image in a single working directory.
// Each layer is a separate file, as are config, manifests, index and sbom.
func buildImageComponents(ctx context.Context, wd string, archs []types.Architecture, opts ...build.Option) (idx coci.SignedImageIndex, sboms []types.SBOM, err error) {
ctx, span := otel.Tracer("apko").Start(ctx, "buildImageComponents")
defer span.End()

bc, err := build.New(wd, opts...)
if err != nil {
return nil, nil, err
Expand Down Expand Up @@ -270,7 +274,7 @@ func buildImageComponents(ctx context.Context, wd string, archs []types.Architec
}
bc.Options.TarballPath = filepath.Join(imageDir, bc.Options.TarballFileName())

layerTarGZ, layer, err := bc.BuildLayer()
layerTarGZ, layer, err := bc.BuildLayer(ctx)
if err != nil {
return fmt.Errorf("failed to build layer image for %q: %w", arch, err)
}
Expand Down Expand Up @@ -336,7 +340,7 @@ func buildImageComponents(ctx context.Context, wd string, archs []types.Architec
bc.Options.SBOMPath = imageDir

g.Go(func() error {
outputs, err := bc.GenerateImageSBOM(arch, img)
outputs, err := bc.GenerateImageSBOM(ctx, arch, img)
if err != nil {
return fmt.Errorf("generating sbom for %s: %w", arch, err)
}
Expand All @@ -353,7 +357,7 @@ func buildImageComponents(ctx context.Context, wd string, archs []types.Architec
bc.Options.WantSBOM = true
bc.Options.SBOMFormats = formats
bc.Options.SBOMPath = imageDir
files, err := bc.GenerateIndexSBOM(finalDigest, imgs)
files, err := bc.GenerateIndexSBOM(ctx, finalDigest, imgs)
if err != nil {
return nil, nil, fmt.Errorf("generating index SBOM: %w", err)
}
Expand Down
4 changes: 4 additions & 0 deletions internal/cli/publish.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import (
"github.com/google/go-containerregistry/pkg/v1/google"
"github.com/google/go-containerregistry/pkg/v1/remote"
"github.com/spf13/cobra"
"go.opentelemetry.io/otel"
"golang.org/x/sync/errgroup"

"chainguard.dev/apko/pkg/build"
Expand Down Expand Up @@ -187,6 +188,9 @@ in a keychain.`,
}

func PublishCmd(ctx context.Context, outputRefs string, archs []types.Architecture, ropt []remote.Option, buildOpts []build.Option, publishOpts []PublishOption) error {
ctx, span := otel.Tracer("apko").Start(ctx, "PublishCmd")
defer span.End()

var opts publishOpt
for _, opt := range publishOpts {
if err := opt(&opts); err != nil {
Expand Down
2 changes: 1 addition & 1 deletion internal/cli/show-packages.go
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ func ShowPackagesCmd(ctx context.Context, format string, archs []types.Architect
return fmt.Errorf("failed to update build context for %q: %w", arch, err)
}

pkgs, _, err := bc.BuildPackageList()
pkgs, _, err := bc.BuildPackageList(ctx)
if err != nil {
return fmt.Errorf("failed to get package list for image: %w", err)
}
Expand Down
14 changes: 7 additions & 7 deletions pkg/apk/apk.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,18 +74,18 @@ type Option func(*APK) error

// Initialize sets the image in Context.WorkDir according to the image configuration,
// and does everything short of installing the packages.
func (a *APK) Initialize(ic *types.ImageConfiguration) error {
func (a *APK) Initialize(ctx context.Context, ic *types.ImageConfiguration) error {
// initialize apk
alpineVersions := parseOptionsFromRepositories(ic.Contents.Repositories)
if err := a.impl.InitDB(context.Background(), alpineVersions...); err != nil {
if err := a.impl.InitDB(ctx, alpineVersions...); err != nil {
return fmt.Errorf("failed to initialize apk database: %w", err)
}

var eg errgroup.Group

eg.Go(func() error {
keyring := sets.List(sets.New(ic.Contents.Keyring...).Insert(a.Options.ExtraKeyFiles...))
if err := a.impl.InitKeyring(context.Background(), keyring, nil); err != nil {
if err := a.impl.InitKeyring(ctx, keyring, nil); err != nil {
return fmt.Errorf("failed to initialize apk keyring: %w", err)
}
return nil
Expand Down Expand Up @@ -115,15 +115,15 @@ func (a *APK) Initialize(ic *types.ImageConfiguration) error {
}

// Install install packages. Only works if already initialized.
func (a *APK) Install() error {
func (a *APK) Install(ctx context.Context) error {
// sync reality with desired apk world
return a.impl.FixateWorld(context.Background(), &a.Options.SourceDateEpoch)
return a.impl.FixateWorld(ctx, &a.Options.SourceDateEpoch)
}

// ResolvePackages gets list of packages that should be installed
func (a *APK) ResolvePackages() (toInstall []*repository.RepositoryPackage, conflicts []string, err error) {
func (a *APK) ResolvePackages(ctx context.Context) (toInstall []*repository.RepositoryPackage, conflicts []string, err error) {
// sync reality with desired apk world
return a.impl.ResolveWorld(context.Background())
return a.impl.ResolveWorld(ctx)
}

func (a *APK) GetInstalled() ([]*apkimpl.InstalledPackage, error) {
Expand Down
44 changes: 26 additions & 18 deletions pkg/build/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package build

import (
"compress/gzip"
"context"
"encoding/hex"
"fmt"
"hash"
Expand All @@ -36,6 +37,7 @@ import (
"github.com/hashicorp/go-multierror"
coci "github.com/sigstore/cosign/v2/pkg/oci"
"gitlab.alpinelinux.org/alpine/go/repository"
"go.opentelemetry.io/otel"
"gopkg.in/yaml.v3"

"chainguard.dev/apko/pkg/build/types"
Expand Down Expand Up @@ -72,8 +74,8 @@ func (bc *Context) Summarize() {
// BuildTarball calls the underlying implementation's BuildTarball
// which takes the fully populated working directory and saves it to
// an OCI image layer tar.gz file.
func (bc *Context) BuildTarball() (string, hash.Hash, hash.Hash, int64, error) {
return bc.impl.BuildTarball(&bc.Options, bc.fs)
func (bc *Context) BuildTarball(ctx context.Context) (string, hash.Hash, hash.Hash, int64, error) {
return bc.impl.BuildTarball(ctx, &bc.Options, bc.fs)
}

// WriteIndex calls the underlying implementation's WriteIndex
Expand All @@ -82,18 +84,18 @@ func (bc *Context) WriteIndex(idx coci.SignedImageIndex) (string, int64, error)
return bc.impl.WriteIndex(&bc.Options, idx)
}

func (bc *Context) GenerateImageSBOM(arch types.Architecture, img coci.SignedImage) ([]types.SBOM, error) {
func (bc *Context) GenerateImageSBOM(ctx context.Context, arch types.Architecture, img coci.SignedImage) ([]types.SBOM, error) {
opts := bc.Options
opts.Arch = arch
return bc.impl.GenerateImageSBOM(&opts, &bc.ImageConfiguration, img)
return bc.impl.GenerateImageSBOM(ctx, &opts, &bc.ImageConfiguration, img)
}

func (bc *Context) GenerateIndexSBOM(indexDigest name.Digest, imgs map[types.Architecture]coci.SignedImage) ([]types.SBOM, error) {
return bc.impl.GenerateIndexSBOM(&bc.Options, &bc.ImageConfiguration, indexDigest, imgs)
func (bc *Context) GenerateIndexSBOM(ctx context.Context, indexDigest name.Digest, imgs map[types.Architecture]coci.SignedImage) ([]types.SBOM, error) {
return bc.impl.GenerateIndexSBOM(ctx, &bc.Options, &bc.ImageConfiguration, indexDigest, imgs)
}

func (bc *Context) GenerateSBOM() error {
return bc.impl.GenerateSBOM(&bc.Options, &bc.ImageConfiguration)
func (bc *Context) GenerateSBOM(ctx context.Context) error {
return bc.impl.GenerateSBOM(ctx, &bc.Options, &bc.ImageConfiguration)
}

func (bc *Context) InstalledPackages() ([]*apkimpl.InstalledPackage, error) {
Expand All @@ -117,9 +119,9 @@ func (bc *Context) GetBuildDateEpoch() (time.Time, error) {
return bde, nil
}

func (bc *Context) BuildImage() (fs.FS, error) {
func (bc *Context) BuildImage(ctx context.Context) (fs.FS, error) {
// TODO(puerco): Point to final interface (see comment on buildImage fn)
if err := buildImage(bc.fs, bc.impl, &bc.Options, &bc.ImageConfiguration, bc.s6); err != nil {
if err := buildImage(ctx, bc.fs, bc.impl, &bc.Options, &bc.ImageConfiguration, bc.s6); err != nil {
logger := bc.Options.Logger()
logger.Debugf("buildImage failed: %v", err)
b, err2 := yaml.Marshal(bc.ImageConfiguration)
Expand All @@ -133,9 +135,9 @@ func (bc *Context) BuildImage() (fs.FS, error) {
return bc.fs, nil
}

func (bc *Context) BuildPackageList() (toInstall []*repository.RepositoryPackage, conflicts []string, err error) {
func (bc *Context) BuildPackageList(ctx context.Context) (toInstall []*repository.RepositoryPackage, conflicts []string, err error) {
// TODO(puerco): Point to final interface (see comment on buildImage fn)
return buildPackageList(bc.fs, bc.impl, &bc.Options, &bc.ImageConfiguration)
return buildPackageList(ctx, bc.fs, bc.impl, &bc.Options, &bc.ImageConfiguration)
}

func (bc *Context) Logger() log.Logger {
Expand All @@ -149,35 +151,41 @@ func (bc *Context) Logger() log.Logger {
// and sets everything up in the directory. Then
// packages it all up into a standard OCI image layer
// tar.gz file.
func (bc *Context) BuildLayer() (string, v1.Layer, error) {
func (bc *Context) BuildLayer(ctx context.Context) (string, v1.Layer, error) {
ctx, span := otel.Tracer("apko").Start(ctx, "BuildLayer")
defer span.End()

bc.Summarize()

// build image filesystem
if _, err := bc.BuildImage(); err != nil {
if _, err := bc.BuildImage(ctx); err != nil {
return "", nil, err
}

return bc.ImageLayoutToLayer()
return bc.ImageLayoutToLayer(ctx)
}

// ImageLayoutToLayer given an already built-out
// image in an fs from BuildImage(), create
// an OCI image layer tgz.
func (bc *Context) ImageLayoutToLayer() (string, v1.Layer, error) {
func (bc *Context) ImageLayoutToLayer(ctx context.Context) (string, v1.Layer, error) {
ctx, span := otel.Tracer("apko").Start(ctx, "ImageLayoutToLayer")
defer span.End()

// run any assertions defined
if err := bc.runAssertions(); err != nil {
return "", nil, err
}

layerTarGZ, diffid, digest, size, err := bc.BuildTarball()
layerTarGZ, diffid, digest, size, err := bc.BuildTarball(ctx)
// build layer tarball
if err != nil {
return "", nil, err
}

// generate SBOM
if bc.Options.WantSBOM {
if err := bc.GenerateSBOM(); err != nil {
if err := bc.GenerateSBOM(ctx); err != nil {
return "", nil, fmt.Errorf("generating SBOMs: %w", err)
}
} else {
Expand Down
Loading