mirror of
https://github.com/crazy-max/diun.git
synced 2025-12-21 13:23:09 +01:00
chore(deps): bump github.com/moby/buildkit from 0.17.3 to 0.23.2
Bumps [github.com/moby/buildkit](https://github.com/moby/buildkit) from 0.17.3 to 0.23.2. - [Release notes](https://github.com/moby/buildkit/releases) - [Commits](https://github.com/moby/buildkit/compare/v0.17.3...v0.23.2) --- updated-dependencies: - dependency-name: github.com/moby/buildkit dependency-version: 0.23.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
This commit is contained in:
35
go.mod
35
go.mod
@@ -8,7 +8,7 @@ require (
|
|||||||
github.com/PaulSonOfLars/gotgbot/v2 v2.0.0-rc.33
|
github.com/PaulSonOfLars/gotgbot/v2 v2.0.0-rc.33
|
||||||
github.com/alecthomas/kong v1.6.1
|
github.com/alecthomas/kong v1.6.1
|
||||||
github.com/bmatcuk/doublestar/v3 v3.0.0
|
github.com/bmatcuk/doublestar/v3 v3.0.0
|
||||||
github.com/containerd/platforms v0.2.1
|
github.com/containerd/platforms v1.0.0-rc.1
|
||||||
github.com/containers/image/v5 v5.33.1
|
github.com/containers/image/v5 v5.33.1
|
||||||
github.com/crazy-max/cron/v3 v3.1.1
|
github.com/crazy-max/cron/v3 v3.1.1
|
||||||
github.com/crazy-max/gohealthchecks v0.5.0
|
github.com/crazy-max/gohealthchecks v0.5.0
|
||||||
@@ -27,7 +27,7 @@ require (
|
|||||||
github.com/matcornic/hermes/v2 v2.1.0
|
github.com/matcornic/hermes/v2 v2.1.0
|
||||||
github.com/matrix-org/gomatrix v0.0.0-20210324163249-be2af5ef2e16
|
github.com/matrix-org/gomatrix v0.0.0-20210324163249-be2af5ef2e16
|
||||||
github.com/microcosm-cc/bluemonday v1.0.27
|
github.com/microcosm-cc/bluemonday v1.0.27
|
||||||
github.com/moby/buildkit v0.17.3
|
github.com/moby/buildkit v0.23.2
|
||||||
github.com/nlopes/slack v0.6.0
|
github.com/nlopes/slack v0.6.0
|
||||||
github.com/opencontainers/go-digest v1.0.0
|
github.com/opencontainers/go-digest v1.0.0
|
||||||
github.com/opencontainers/image-spec v1.1.1
|
github.com/opencontainers/image-spec v1.1.1
|
||||||
@@ -63,16 +63,16 @@ require (
|
|||||||
github.com/andybalholm/cascadia v1.3.2 // indirect
|
github.com/andybalholm/cascadia v1.3.2 // indirect
|
||||||
github.com/aokoli/goutils v1.0.1 // indirect
|
github.com/aokoli/goutils v1.0.1 // indirect
|
||||||
github.com/aymerick/douceur v0.2.0 // indirect
|
github.com/aymerick/douceur v0.2.0 // indirect
|
||||||
github.com/containerd/errdefs v0.3.0 // indirect
|
github.com/containerd/errdefs v1.0.0 // indirect
|
||||||
github.com/containerd/errdefs/pkg v0.3.0 // indirect
|
github.com/containerd/errdefs/pkg v0.3.0 // indirect
|
||||||
github.com/containerd/log v0.1.0 // indirect
|
github.com/containerd/log v0.1.0 // indirect
|
||||||
github.com/containerd/typeurl/v2 v2.2.0 // indirect
|
github.com/containerd/typeurl/v2 v2.2.3 // indirect
|
||||||
github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 // indirect
|
github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 // indirect
|
||||||
github.com/containers/ocicrypt v1.2.0 // indirect
|
github.com/containers/ocicrypt v1.2.0 // indirect
|
||||||
github.com/containers/storage v1.56.1 // indirect
|
github.com/containers/storage v1.56.1 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||||
github.com/docker/distribution v2.8.3+incompatible // indirect
|
github.com/docker/distribution v2.8.3+incompatible // indirect
|
||||||
github.com/docker/docker-credential-helpers v0.8.2 // indirect
|
github.com/docker/docker-credential-helpers v0.9.3 // indirect
|
||||||
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
|
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
|
||||||
github.com/felixge/fgprof v0.9.5 // indirect
|
github.com/felixge/fgprof v0.9.5 // indirect
|
||||||
github.com/felixge/httpsnoop v1.0.4 // indirect
|
github.com/felixge/httpsnoop v1.0.4 // indirect
|
||||||
@@ -90,7 +90,7 @@ require (
|
|||||||
github.com/google/gnostic-models v0.6.8 // indirect
|
github.com/google/gnostic-models v0.6.8 // indirect
|
||||||
github.com/google/go-cmp v0.7.0 // indirect
|
github.com/google/go-cmp v0.7.0 // indirect
|
||||||
github.com/google/gofuzz v1.2.0 // indirect
|
github.com/google/gofuzz v1.2.0 // indirect
|
||||||
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db // indirect
|
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect
|
||||||
github.com/google/uuid v1.6.0 // indirect
|
github.com/google/uuid v1.6.0 // indirect
|
||||||
github.com/gorilla/css v1.0.1 // indirect
|
github.com/gorilla/css v1.0.1 // indirect
|
||||||
github.com/gorilla/mux v1.8.1 // indirect
|
github.com/gorilla/mux v1.8.1 // indirect
|
||||||
@@ -115,37 +115,36 @@ require (
|
|||||||
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||||
github.com/moby/docker-image-spec v1.3.1 // indirect
|
github.com/moby/docker-image-spec v1.3.1 // indirect
|
||||||
github.com/moby/sys/atomicwriter v0.1.0 // indirect
|
|
||||||
github.com/moby/sys/capability v0.3.0 // indirect
|
github.com/moby/sys/capability v0.3.0 // indirect
|
||||||
github.com/moby/sys/mountinfo v0.7.2 // indirect
|
github.com/moby/sys/mountinfo v0.7.2 // indirect
|
||||||
github.com/moby/sys/user v0.3.0 // indirect
|
github.com/moby/sys/user v0.4.0 // indirect
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||||
github.com/olekukonko/tablewriter v0.0.1 // indirect
|
github.com/olekukonko/tablewriter v0.0.1 // indirect
|
||||||
github.com/opencontainers/runtime-spec v1.2.0 // indirect
|
github.com/opencontainers/runtime-spec v1.2.1 // indirect
|
||||||
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect
|
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||||
github.com/rivo/uniseg v0.4.7 // indirect
|
github.com/rivo/uniseg v0.4.7 // indirect
|
||||||
github.com/spf13/pflag v1.0.6 // indirect
|
github.com/spf13/pflag v1.0.6 // indirect
|
||||||
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect
|
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect
|
||||||
github.com/tonistiigi/go-csvvalue v0.0.0-20240710180619-ddb21b71c0b4 // indirect
|
github.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0 // indirect
|
||||||
github.com/vanng822/css v0.0.0-20190504095207-a21e860bcd04 // indirect
|
github.com/vanng822/css v0.0.0-20190504095207-a21e860bcd04 // indirect
|
||||||
github.com/vanng822/go-premailer v0.0.0-20191214114701-be27abe028fe // indirect
|
github.com/vanng822/go-premailer v0.0.0-20191214114701-be27abe028fe // indirect
|
||||||
github.com/x448/float16 v0.8.4 // indirect
|
github.com/x448/float16 v0.8.4 // indirect
|
||||||
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
|
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect
|
||||||
go.opentelemetry.io/otel v1.35.0 // indirect
|
go.opentelemetry.io/otel v1.35.0 // indirect
|
||||||
go.opentelemetry.io/otel/metric v1.35.0 // indirect
|
go.opentelemetry.io/otel/metric v1.35.0 // indirect
|
||||||
go.opentelemetry.io/otel/trace v1.35.0 // indirect
|
go.opentelemetry.io/otel/trace v1.35.0 // indirect
|
||||||
golang.org/x/crypto v0.36.0 // indirect
|
golang.org/x/crypto v0.37.0 // indirect
|
||||||
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c // indirect
|
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect
|
||||||
golang.org/x/net v0.38.0 // indirect
|
golang.org/x/net v0.39.0 // indirect
|
||||||
golang.org/x/oauth2 v0.28.0 // indirect
|
golang.org/x/oauth2 v0.28.0 // indirect
|
||||||
golang.org/x/sync v0.12.0 // indirect
|
golang.org/x/sync v0.14.0 // indirect
|
||||||
golang.org/x/term v0.30.0 // indirect
|
golang.org/x/term v0.31.0 // indirect
|
||||||
golang.org/x/text v0.23.0 // indirect
|
golang.org/x/text v0.24.0 // indirect
|
||||||
golang.org/x/time v0.7.0 // indirect
|
golang.org/x/time v0.11.0 // indirect
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 // indirect
|
||||||
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
|
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
|
||||||
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
|
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
|
||||||
|
|||||||
111
go.sum
111
go.sum
@@ -40,8 +40,8 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
|||||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||||
github.com/bmatcuk/doublestar/v3 v3.0.0 h1:TQtVPlDnAYwcrVNB2JiGuMc++H5qzWZd9PhkNo5WyHI=
|
github.com/bmatcuk/doublestar/v3 v3.0.0 h1:TQtVPlDnAYwcrVNB2JiGuMc++H5qzWZd9PhkNo5WyHI=
|
||||||
github.com/bmatcuk/doublestar/v3 v3.0.0/go.mod h1:6PcTVMw80pCY1RVuoqu3V++99uQB3vsSYKPTd8AWA0k=
|
github.com/bmatcuk/doublestar/v3 v3.0.0/go.mod h1:6PcTVMw80pCY1RVuoqu3V++99uQB3vsSYKPTd8AWA0k=
|
||||||
github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
|
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
|
||||||
github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
|
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
|
||||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs=
|
github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs=
|
||||||
@@ -53,16 +53,16 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P
|
|||||||
github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk=
|
github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk=
|
||||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||||
github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8=
|
github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8=
|
||||||
github.com/containerd/errdefs v0.3.0 h1:FSZgGOeK4yuT/+DnF07/Olde/q4KBoMsaamhXxIMDp4=
|
github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI=
|
||||||
github.com/containerd/errdefs v0.3.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M=
|
github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M=
|
||||||
github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE=
|
github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE=
|
||||||
github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk=
|
github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk=
|
||||||
github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
|
github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
|
||||||
github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
|
github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
|
||||||
github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A=
|
github.com/containerd/platforms v1.0.0-rc.1 h1:83KIq4yy1erSRgOVHNk1HYdPvzdJ5CnsWaRoJX4C41E=
|
||||||
github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw=
|
github.com/containerd/platforms v1.0.0-rc.1/go.mod h1:J71L7B+aiM5SdIEqmd9wp6THLVRzJGXfNuWCZCllLA4=
|
||||||
github.com/containerd/typeurl/v2 v2.2.0 h1:6NBDbQzr7I5LHgp34xAXYF5DOTQDn05X58lsPEmzLso=
|
github.com/containerd/typeurl/v2 v2.2.3 h1:yNA/94zxWdvYACdYO8zofhrTVuQY73fFU1y++dYSw40=
|
||||||
github.com/containerd/typeurl/v2 v2.2.0/go.mod h1:8XOOxnyatxSWuG8OfsZXVnAF4iZfedjS/8UHSPJnX4g=
|
github.com/containerd/typeurl/v2 v2.2.3/go.mod h1:95ljDnPfD3bAbDJRugOiShd/DlAAsxGtUBhJxIn7SCk=
|
||||||
github.com/containers/image/v5 v5.33.1 h1:nTWKwxAlY0aJrilvvhssqssJVnley6VqxkLiLzTEYIs=
|
github.com/containers/image/v5 v5.33.1 h1:nTWKwxAlY0aJrilvvhssqssJVnley6VqxkLiLzTEYIs=
|
||||||
github.com/containers/image/v5 v5.33.1/go.mod h1:/FJiLlvVbeBxWNMPVPPIWJxHTAzwBoFvyN0a51zo1CE=
|
github.com/containers/image/v5 v5.33.1/go.mod h1:/FJiLlvVbeBxWNMPVPPIWJxHTAzwBoFvyN0a51zo1CE=
|
||||||
github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 h1:Qzk5C6cYglewc+UyGf6lc8Mj2UaPTHy/iF2De0/77CA=
|
github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 h1:Qzk5C6cYglewc+UyGf6lc8Mj2UaPTHy/iF2De0/77CA=
|
||||||
@@ -86,14 +86,14 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1
|
|||||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
|
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
|
||||||
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
|
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
|
||||||
github.com/docker/cli v27.3.1+incompatible h1:qEGdFBF3Xu6SCvCYhc7CzaQTlBmqDuzxPDpigSyeKQQ=
|
github.com/docker/cli v28.2.2+incompatible h1:qzx5BNUDFqlvyq4AHzdNB7gSyVTmU4cgsyN9SdInc1A=
|
||||||
github.com/docker/cli v27.3.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
github.com/docker/cli v28.2.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
||||||
github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
|
github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
|
||||||
github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||||
github.com/docker/docker v28.3.3+incompatible h1:Dypm25kh4rmk49v1eiVbsAtpAsYURjYkaKubwuBdxEI=
|
github.com/docker/docker v28.3.3+incompatible h1:Dypm25kh4rmk49v1eiVbsAtpAsYURjYkaKubwuBdxEI=
|
||||||
github.com/docker/docker v28.3.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
github.com/docker/docker v28.3.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||||
github.com/docker/docker-credential-helpers v0.8.2 h1:bX3YxiGzFP5sOXWc3bTPEXdEaZSeVMrFgOr3T+zrFAo=
|
github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8=
|
||||||
github.com/docker/docker-credential-helpers v0.8.2/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M=
|
github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo=
|
||||||
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
|
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
|
||||||
github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
|
github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
|
||||||
github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8=
|
github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8=
|
||||||
@@ -156,8 +156,8 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
|
|||||||
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=
|
github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=
|
||||||
github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
|
github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
|
||||||
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo=
|
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8=
|
||||||
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
|
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
|
||||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
@@ -171,8 +171,8 @@ github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aN
|
|||||||
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
github.com/gregdel/pushover v1.3.1 h1:4bMLITOZ15+Zpi6qqoGqOPuVHCwSUvMCgVnN5Xhilfo=
|
github.com/gregdel/pushover v1.3.1 h1:4bMLITOZ15+Zpi6qqoGqOPuVHCwSUvMCgVnN5Xhilfo=
|
||||||
github.com/gregdel/pushover v1.3.1/go.mod h1:EcaO66Nn1StkpEm1iKtBTV3d2A16SoMsVER1PthX7to=
|
github.com/gregdel/pushover v1.3.1/go.mod h1:EcaO66Nn1StkpEm1iKtBTV3d2A16SoMsVER1PthX7to=
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA=
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M=
|
||||||
github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A=
|
github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A=
|
||||||
github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4=
|
github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4=
|
||||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||||
@@ -208,8 +208,8 @@ github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNU
|
|||||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
|
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
|
||||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
|
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
|
||||||
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
|
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
|
||||||
github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU=
|
github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU=
|
||||||
github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
|
github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
@@ -248,8 +248,8 @@ github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJ
|
|||||||
github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8=
|
github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8=
|
||||||
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
||||||
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||||
github.com/moby/buildkit v0.17.3 h1:XN8ddC5gO1kGJJfi86kzvDlPOyLyPk66hTvswqhj6NQ=
|
github.com/moby/buildkit v0.23.2 h1:gt/dkfcpgTXKx+B9I310kV767hhVqTvEyxGgI3mqsGQ=
|
||||||
github.com/moby/buildkit v0.17.3/go.mod h1:vr5vltV8wt4F2jThbNOChfbAklJ0DOW11w36v210hOg=
|
github.com/moby/buildkit v0.23.2/go.mod h1:iEjAfPQKIuO+8y6OcInInvzqTMiKMbb2RdJz1K/95a0=
|
||||||
github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
|
github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
|
||||||
github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
|
github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
|
||||||
github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw=
|
github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw=
|
||||||
@@ -260,8 +260,8 @@ github.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9Kou
|
|||||||
github.com/moby/sys/mountinfo v0.7.2/go.mod h1:1YOa8w8Ih7uW0wALDUgT1dTTSBrZ+HiBLGws92L2RU4=
|
github.com/moby/sys/mountinfo v0.7.2/go.mod h1:1YOa8w8Ih7uW0wALDUgT1dTTSBrZ+HiBLGws92L2RU4=
|
||||||
github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU=
|
github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU=
|
||||||
github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko=
|
github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko=
|
||||||
github.com/moby/sys/user v0.3.0 h1:9ni5DlcW5an3SvRSx4MouotOygvzaXbaSrc/wGDFWPo=
|
github.com/moby/sys/user v0.4.0 h1:jhcMKit7SA80hivmFJcbB1vqmw//wU61Zdui2eQXuMs=
|
||||||
github.com/moby/sys/user v0.3.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs=
|
github.com/moby/sys/user v0.4.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs=
|
||||||
github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
|
github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
|
||||||
github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
|
github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
@@ -285,8 +285,8 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8
|
|||||||
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
|
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
|
||||||
github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
|
github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
|
||||||
github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
|
github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
|
||||||
github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk=
|
github.com/opencontainers/runtime-spec v1.2.1 h1:S4k4ryNgEpxW1dzyqffOmhI1BHYcjzU8lpJfSlR0xww=
|
||||||
github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
github.com/opencontainers/runtime-spec v1.2.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0=
|
github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0=
|
||||||
github.com/panjf2000/ants/v2 v2.11.3 h1:AfI0ngBoXJmYOpDh9m516vjqoUu2sLrIVgppI9TZVpg=
|
github.com/panjf2000/ants/v2 v2.11.3 h1:AfI0ngBoXJmYOpDh9m516vjqoUu2sLrIVgppI9TZVpg=
|
||||||
github.com/panjf2000/ants/v2 v2.11.3/go.mod h1:8u92CYMUc6gyvTIw8Ru7Mt7+/ESnJahz5EVtqfrilek=
|
github.com/panjf2000/ants/v2 v2.11.3/go.mod h1:8u92CYMUc6gyvTIw8Ru7Mt7+/ESnJahz5EVtqfrilek=
|
||||||
@@ -300,12 +300,12 @@ github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1
|
|||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/prometheus/client_golang v1.20.2 h1:5ctymQzZlyOON1666svgwn3s6IKWgfbjsejTMiXIyjg=
|
github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
|
||||||
github.com/prometheus/client_golang v1.20.2/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
|
github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
|
||||||
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
|
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
|
||||||
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
|
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
|
||||||
github.com/prometheus/common v0.57.0 h1:Ro/rKjwdq9mZn1K5QPctzh+MA4Lp0BuYk5ZZEVhoNcY=
|
github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io=
|
||||||
github.com/prometheus/common v0.57.0/go.mod h1:7uRPFSUTbfZWsJ7MHY56sqt7hLQu3bxXHDnNhl8E9qI=
|
github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
|
||||||
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
|
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
|
||||||
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
|
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
|
||||||
github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw=
|
github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw=
|
||||||
@@ -342,16 +342,16 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf
|
|||||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
|
github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
|
||||||
github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
|
github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
|
||||||
github.com/tonistiigi/go-csvvalue v0.0.0-20240710180619-ddb21b71c0b4 h1:7I5c2Ig/5FgqkYOh/N87NzoyI9U15qUPXhDD8uCupv8=
|
github.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0 h1:2f304B10LaZdB8kkVEaoXvAMVan2tl9AiK4G0odjQtE=
|
||||||
github.com/tonistiigi/go-csvvalue v0.0.0-20240710180619-ddb21b71c0b4/go.mod h1:278M4p8WsNh3n4a1eqiFcV2FGk7wE5fwUpUom9mK9lE=
|
github.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0/go.mod h1:278M4p8WsNh3n4a1eqiFcV2FGk7wE5fwUpUom9mK9lE=
|
||||||
github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
|
github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
|
||||||
github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
||||||
github.com/vanng822/css v0.0.0-20190504095207-a21e860bcd04 h1:L0rPdfzq43+NV8rfIx2kA4iSSLRj2jN5ijYHoeXRwvQ=
|
github.com/vanng822/css v0.0.0-20190504095207-a21e860bcd04 h1:L0rPdfzq43+NV8rfIx2kA4iSSLRj2jN5ijYHoeXRwvQ=
|
||||||
github.com/vanng822/css v0.0.0-20190504095207-a21e860bcd04/go.mod h1:tcnB1voG49QhCrwq1W0w5hhGasvOg+VQp9i9H1rCM1w=
|
github.com/vanng822/css v0.0.0-20190504095207-a21e860bcd04/go.mod h1:tcnB1voG49QhCrwq1W0w5hhGasvOg+VQp9i9H1rCM1w=
|
||||||
github.com/vanng822/go-premailer v0.0.0-20191214114701-be27abe028fe h1:9YnI5plmy+ad6BM+JCLJb2ZV7/TNiE5l7SNKfumYKgc=
|
github.com/vanng822/go-premailer v0.0.0-20191214114701-be27abe028fe h1:9YnI5plmy+ad6BM+JCLJb2ZV7/TNiE5l7SNKfumYKgc=
|
||||||
github.com/vanng822/go-premailer v0.0.0-20191214114701-be27abe028fe/go.mod h1:JTFJA/t820uFDoyPpErFQ3rb3amdZoPtxcKervG0OE4=
|
github.com/vanng822/go-premailer v0.0.0-20191214114701-be27abe028fe/go.mod h1:JTFJA/t820uFDoyPpErFQ3rb3amdZoPtxcKervG0OE4=
|
||||||
github.com/vbatts/tar-split v0.11.6 h1:4SjTW5+PU11n6fZenf2IPoV8/tz3AaYHMWjf23envGs=
|
github.com/vbatts/tar-split v0.12.1 h1:CqKoORW7BUWBe7UL/iqTVvkTBOF8UvOMKOIZykxnnbo=
|
||||||
github.com/vbatts/tar-split v0.11.6/go.mod h1:dqKNtesIOr2j2Qv3W/cHjnvk9I8+G7oAkFDFN6TCBEI=
|
github.com/vbatts/tar-split v0.12.1/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA=
|
||||||
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
|
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
|
||||||
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
|
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
|
||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
@@ -361,14 +361,14 @@ go.etcd.io/bbolt v1.4.2 h1:IrUHp260R8c+zYx/Tm8QZr04CX+qWS5PGfPdevhdm1I=
|
|||||||
go.etcd.io/bbolt v1.4.2/go.mod h1:Is8rSHO/b4f3XigBC0lL0+4FwAQv3HXEEIgFMuKHceM=
|
go.etcd.io/bbolt v1.4.2/go.mod h1:Is8rSHO/b4f3XigBC0lL0+4FwAQv3HXEEIgFMuKHceM=
|
||||||
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
|
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
|
||||||
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
|
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ=
|
||||||
go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
|
go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
|
||||||
go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
|
go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 h1:1fTNlAIJZGWLP5FVu0fikVry1IsiUnXjf7QFvoNN3Xw=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0/go.mod h1:zjPK58DtkqQFn+YUMbx0M2XV3QgKU0gS9LeGohREyK4=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0 h1:xJ2qHD0C1BeYVTLLR9sX12+Qb95kfeD/byKj6Ky1pXg=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0/go.mod h1:u5BF1xyjstDowA1R5QAO9JHzqK+ublenEW/dyqTjBVk=
|
||||||
go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
|
go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
|
||||||
go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
|
go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
|
||||||
go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY=
|
go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY=
|
||||||
@@ -377,8 +377,8 @@ go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5J
|
|||||||
go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
|
go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
|
||||||
go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
|
go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
|
||||||
go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
|
go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
|
||||||
go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=
|
go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4=
|
||||||
go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=
|
go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4=
|
||||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||||
golang.org/x/crypto v0.0.0-20181029175232-7e6ffbd03851/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20181029175232-7e6ffbd03851/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
@@ -386,10 +386,10 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
|
|||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
|
golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
|
||||||
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
|
golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
|
||||||
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY=
|
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM=
|
||||||
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8=
|
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8=
|
||||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
@@ -408,8 +408,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug
|
|||||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
||||||
golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
|
golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
|
||||||
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
|
golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
|
||||||
golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc=
|
golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc=
|
||||||
golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
|
golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
@@ -417,8 +417,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ
|
|||||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
|
golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
|
||||||
golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190225065934-cc5685c2db12/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190225065934-cc5685c2db12/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
@@ -444,8 +444,8 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn
|
|||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||||
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
|
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
|
||||||
golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y=
|
golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
|
||||||
golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
|
golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
@@ -453,10 +453,10 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
|||||||
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||||
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
|
golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
|
||||||
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
|
golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
|
||||||
golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
|
golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
|
||||||
golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
@@ -469,9 +469,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
|
|||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ=
|
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 h1:hE3bRWtU6uceqlh4fhrSnUyjKHMKB9KrTLLG+bc0ddM=
|
google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 h1:hE3bRWtU6uceqlh4fhrSnUyjKHMKB9KrTLLG+bc0ddM=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463/go.mod h1:U90ffi8eUL9MwPcrJylN5+Mk2v3vuPDptd5yyNUiRR8=
|
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 h1:e0AIkUUhxyBKh6ssZNrAMeqhA7RKUj42346d1y02i2g=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 h1:e0AIkUUhxyBKh6ssZNrAMeqhA7RKUj42346d1y02i2g=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
|
||||||
google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok=
|
google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok=
|
||||||
|
|||||||
8
vendor/github.com/containerd/platforms/.golangci.yml
generated
vendored
8
vendor/github.com/containerd/platforms/.golangci.yml
generated
vendored
@@ -1,6 +1,6 @@
|
|||||||
linters:
|
linters:
|
||||||
enable:
|
enable:
|
||||||
- exportloopref # Checks for pointers to enclosing loop variables
|
- copyloopvar
|
||||||
- gofmt
|
- gofmt
|
||||||
- goimports
|
- goimports
|
||||||
- gosec
|
- gosec
|
||||||
@@ -12,14 +12,16 @@ linters:
|
|||||||
- tenv # Detects using os.Setenv instead of t.Setenv since Go 1.17
|
- tenv # Detects using os.Setenv instead of t.Setenv since Go 1.17
|
||||||
- unconvert
|
- unconvert
|
||||||
- unused
|
- unused
|
||||||
- vet
|
- govet
|
||||||
- dupword # Checks for duplicate words in the source code
|
- dupword # Checks for duplicate words in the source code
|
||||||
disable:
|
disable:
|
||||||
- errcheck
|
- errcheck
|
||||||
|
|
||||||
run:
|
run:
|
||||||
timeout: 5m
|
timeout: 5m
|
||||||
skip-dirs:
|
|
||||||
|
issues:
|
||||||
|
exclude-dirs:
|
||||||
- api
|
- api
|
||||||
- cluster
|
- cluster
|
||||||
- design
|
- design
|
||||||
|
|||||||
57
vendor/github.com/containerd/platforms/compare.go
generated
vendored
57
vendor/github.com/containerd/platforms/compare.go
generated
vendored
@@ -31,6 +31,34 @@ type MatchComparer interface {
|
|||||||
Less(specs.Platform, specs.Platform) bool
|
Less(specs.Platform, specs.Platform) bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type platformVersions struct {
|
||||||
|
major []int
|
||||||
|
minor []int
|
||||||
|
}
|
||||||
|
|
||||||
|
var arm64variantToVersion = map[string]platformVersions{
|
||||||
|
"v8": {[]int{8}, []int{0}},
|
||||||
|
"v8.0": {[]int{8}, []int{0}},
|
||||||
|
"v8.1": {[]int{8}, []int{1}},
|
||||||
|
"v8.2": {[]int{8}, []int{2}},
|
||||||
|
"v8.3": {[]int{8}, []int{3}},
|
||||||
|
"v8.4": {[]int{8}, []int{4}},
|
||||||
|
"v8.5": {[]int{8}, []int{5}},
|
||||||
|
"v8.6": {[]int{8}, []int{6}},
|
||||||
|
"v8.7": {[]int{8}, []int{7}},
|
||||||
|
"v8.8": {[]int{8}, []int{8}},
|
||||||
|
"v8.9": {[]int{8}, []int{9}},
|
||||||
|
"v9": {[]int{9, 8}, []int{0, 5}},
|
||||||
|
"v9.0": {[]int{9, 8}, []int{0, 5}},
|
||||||
|
"v9.1": {[]int{9, 8}, []int{1, 6}},
|
||||||
|
"v9.2": {[]int{9, 8}, []int{2, 7}},
|
||||||
|
"v9.3": {[]int{9, 8}, []int{3, 8}},
|
||||||
|
"v9.4": {[]int{9, 8}, []int{4, 9}},
|
||||||
|
"v9.5": {[]int{9, 8}, []int{5, 9}},
|
||||||
|
"v9.6": {[]int{9, 8}, []int{6, 9}},
|
||||||
|
"v9.7": {[]int{9, 8}, []int{7, 9}},
|
||||||
|
}
|
||||||
|
|
||||||
// platformVector returns an (ordered) vector of appropriate specs.Platform
|
// platformVector returns an (ordered) vector of appropriate specs.Platform
|
||||||
// objects to try matching for the given platform object (see platforms.Only).
|
// objects to try matching for the given platform object (see platforms.Only).
|
||||||
func platformVector(platform specs.Platform) []specs.Platform {
|
func platformVector(platform specs.Platform) []specs.Platform {
|
||||||
@@ -72,6 +100,33 @@ func platformVector(platform specs.Platform) []specs.Platform {
|
|||||||
if variant == "" {
|
if variant == "" {
|
||||||
variant = "v8"
|
variant = "v8"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vector = []specs.Platform{} // Reset vector, the first variant will be added in loop.
|
||||||
|
arm64Versions, ok := arm64variantToVersion[variant]
|
||||||
|
if !ok {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
for i, major := range arm64Versions.major {
|
||||||
|
for minor := arm64Versions.minor[i]; minor >= 0; minor-- {
|
||||||
|
arm64Variant := "v" + strconv.Itoa(major) + "." + strconv.Itoa(minor)
|
||||||
|
if minor == 0 {
|
||||||
|
arm64Variant = "v" + strconv.Itoa(major)
|
||||||
|
}
|
||||||
|
vector = append(vector, specs.Platform{
|
||||||
|
Architecture: "arm64",
|
||||||
|
OS: platform.OS,
|
||||||
|
OSVersion: platform.OSVersion,
|
||||||
|
OSFeatures: platform.OSFeatures,
|
||||||
|
Variant: arm64Variant,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// All arm64/v8.x and arm64/v9.x are compatible with arm/v8 (32-bits) and below.
|
||||||
|
// There's no arm64 v9 variant, so it's normalized to v8.
|
||||||
|
if strings.HasPrefix(variant, "v8") || strings.HasPrefix(variant, "v9") {
|
||||||
|
variant = "v8"
|
||||||
|
}
|
||||||
vector = append(vector, platformVector(specs.Platform{
|
vector = append(vector, platformVector(specs.Platform{
|
||||||
Architecture: "arm",
|
Architecture: "arm",
|
||||||
OS: platform.OS,
|
OS: platform.OS,
|
||||||
@@ -87,6 +142,8 @@ func platformVector(platform specs.Platform) []specs.Platform {
|
|||||||
// Only returns a match comparer for a single platform
|
// Only returns a match comparer for a single platform
|
||||||
// using default resolution logic for the platform.
|
// using default resolution logic for the platform.
|
||||||
//
|
//
|
||||||
|
// For arm64/v9.x, will also match arm64/v9.{0..x-1} and arm64/v8.{0..x+5}
|
||||||
|
// For arm64/v8.x, will also match arm64/v8.{0..x-1}
|
||||||
// For arm/v8, will also match arm/v7, arm/v6 and arm/v5
|
// For arm/v8, will also match arm/v7, arm/v6 and arm/v5
|
||||||
// For arm/v7, will also match arm/v6 and arm/v5
|
// For arm/v7, will also match arm/v6 and arm/v5
|
||||||
// For arm/v6, will also match arm/v5
|
// For arm/v6, will also match arm/v5
|
||||||
|
|||||||
4
vendor/github.com/containerd/platforms/database.go
generated
vendored
4
vendor/github.com/containerd/platforms/database.go
generated
vendored
@@ -87,8 +87,10 @@ func normalizeArch(arch, variant string) (string, string) {
|
|||||||
case "aarch64", "arm64":
|
case "aarch64", "arm64":
|
||||||
arch = "arm64"
|
arch = "arm64"
|
||||||
switch variant {
|
switch variant {
|
||||||
case "8", "v8":
|
case "8", "v8", "v8.0":
|
||||||
variant = ""
|
variant = ""
|
||||||
|
case "9", "9.0", "v9.0":
|
||||||
|
variant = "v9"
|
||||||
}
|
}
|
||||||
case "armhf":
|
case "armhf":
|
||||||
arch = "arm"
|
arch = "arm"
|
||||||
|
|||||||
76
vendor/github.com/containerd/platforms/defaults_windows.go
generated
vendored
76
vendor/github.com/containerd/platforms/defaults_windows.go
generated
vendored
@@ -19,8 +19,6 @@ package platforms
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
specs "github.com/opencontainers/image-spec/specs-go/v1"
|
specs "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
"golang.org/x/sys/windows"
|
"golang.org/x/sys/windows"
|
||||||
@@ -38,80 +36,6 @@ func DefaultSpec() specs.Platform {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type windowsmatcher struct {
|
|
||||||
specs.Platform
|
|
||||||
osVersionPrefix string
|
|
||||||
defaultMatcher Matcher
|
|
||||||
}
|
|
||||||
|
|
||||||
// Match matches platform with the same windows major, minor
|
|
||||||
// and build version.
|
|
||||||
func (m windowsmatcher) Match(p specs.Platform) bool {
|
|
||||||
match := m.defaultMatcher.Match(p)
|
|
||||||
|
|
||||||
if match && m.OS == "windows" {
|
|
||||||
// HPC containers do not have OS version filled
|
|
||||||
if m.OSVersion == "" || p.OSVersion == "" {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
hostOsVersion := getOSVersion(m.osVersionPrefix)
|
|
||||||
ctrOsVersion := getOSVersion(p.OSVersion)
|
|
||||||
return checkHostAndContainerCompat(hostOsVersion, ctrOsVersion)
|
|
||||||
}
|
|
||||||
|
|
||||||
return match
|
|
||||||
}
|
|
||||||
|
|
||||||
func getOSVersion(osVersionPrefix string) osVersion {
|
|
||||||
parts := strings.Split(osVersionPrefix, ".")
|
|
||||||
if len(parts) < 3 {
|
|
||||||
return osVersion{}
|
|
||||||
}
|
|
||||||
|
|
||||||
majorVersion, _ := strconv.Atoi(parts[0])
|
|
||||||
minorVersion, _ := strconv.Atoi(parts[1])
|
|
||||||
buildNumber, _ := strconv.Atoi(parts[2])
|
|
||||||
|
|
||||||
return osVersion{
|
|
||||||
MajorVersion: uint8(majorVersion),
|
|
||||||
MinorVersion: uint8(minorVersion),
|
|
||||||
Build: uint16(buildNumber),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Less sorts matched platforms in front of other platforms.
|
|
||||||
// For matched platforms, it puts platforms with larger revision
|
|
||||||
// number in front.
|
|
||||||
func (m windowsmatcher) Less(p1, p2 specs.Platform) bool {
|
|
||||||
m1, m2 := m.Match(p1), m.Match(p2)
|
|
||||||
if m1 && m2 {
|
|
||||||
r1, r2 := revision(p1.OSVersion), revision(p2.OSVersion)
|
|
||||||
return r1 > r2
|
|
||||||
}
|
|
||||||
return m1 && !m2
|
|
||||||
}
|
|
||||||
|
|
||||||
func revision(v string) int {
|
|
||||||
parts := strings.Split(v, ".")
|
|
||||||
if len(parts) < 4 {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
r, err := strconv.Atoi(parts[3])
|
|
||||||
if err != nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
func prefix(v string) string {
|
|
||||||
parts := strings.Split(v, ".")
|
|
||||||
if len(parts) < 4 {
|
|
||||||
return v
|
|
||||||
}
|
|
||||||
return strings.Join(parts[0:3], ".")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Default returns the current platform's default platform specification.
|
// Default returns the current platform's default platform specification.
|
||||||
func Default() MatchComparer {
|
func Default() MatchComparer {
|
||||||
return Only(DefaultSpec())
|
return Only(DefaultSpec())
|
||||||
|
|||||||
@@ -16,9 +16,16 @@
|
|||||||
|
|
||||||
package platforms
|
package platforms
|
||||||
|
|
||||||
// osVersion is a wrapper for Windows version information
|
import (
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
specs "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// windowsOSVersion is a wrapper for Windows version information
|
||||||
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx
|
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx
|
||||||
type osVersion struct {
|
type windowsOSVersion struct {
|
||||||
Version uint32
|
Version uint32
|
||||||
MajorVersion uint8
|
MajorVersion uint8
|
||||||
MinorVersion uint8
|
MinorVersion uint8
|
||||||
@@ -55,7 +62,7 @@ var compatLTSCReleases = []uint16{
|
|||||||
// Every release after WS 2022 will support the previous ltsc
|
// Every release after WS 2022 will support the previous ltsc
|
||||||
// container image. Stable ABI is in preview mode for windows 11 client.
|
// container image. Stable ABI is in preview mode for windows 11 client.
|
||||||
// Refer: https://learn.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility?tabs=windows-server-2022%2Cwindows-10#windows-server-host-os-compatibility
|
// Refer: https://learn.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility?tabs=windows-server-2022%2Cwindows-10#windows-server-host-os-compatibility
|
||||||
func checkHostAndContainerCompat(host, ctr osVersion) bool {
|
func checkWindowsHostAndContainerCompat(host, ctr windowsOSVersion) bool {
|
||||||
// check major minor versions of host and guest
|
// check major minor versions of host and guest
|
||||||
if host.MajorVersion != ctr.MajorVersion ||
|
if host.MajorVersion != ctr.MajorVersion ||
|
||||||
host.MinorVersion != ctr.MinorVersion {
|
host.MinorVersion != ctr.MinorVersion {
|
||||||
@@ -76,3 +83,74 @@ func checkHostAndContainerCompat(host, ctr osVersion) bool {
|
|||||||
}
|
}
|
||||||
return ctr.Build >= supportedLtscRelease && ctr.Build <= host.Build
|
return ctr.Build >= supportedLtscRelease && ctr.Build <= host.Build
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getWindowsOSVersion(osVersionPrefix string) windowsOSVersion {
|
||||||
|
if strings.Count(osVersionPrefix, ".") < 2 {
|
||||||
|
return windowsOSVersion{}
|
||||||
|
}
|
||||||
|
|
||||||
|
major, extra, _ := strings.Cut(osVersionPrefix, ".")
|
||||||
|
minor, extra, _ := strings.Cut(extra, ".")
|
||||||
|
build, _, _ := strings.Cut(extra, ".")
|
||||||
|
|
||||||
|
majorVersion, err := strconv.ParseUint(major, 10, 8)
|
||||||
|
if err != nil {
|
||||||
|
return windowsOSVersion{}
|
||||||
|
}
|
||||||
|
|
||||||
|
minorVersion, err := strconv.ParseUint(minor, 10, 8)
|
||||||
|
if err != nil {
|
||||||
|
return windowsOSVersion{}
|
||||||
|
}
|
||||||
|
buildNumber, err := strconv.ParseUint(build, 10, 16)
|
||||||
|
if err != nil {
|
||||||
|
return windowsOSVersion{}
|
||||||
|
}
|
||||||
|
|
||||||
|
return windowsOSVersion{
|
||||||
|
MajorVersion: uint8(majorVersion),
|
||||||
|
MinorVersion: uint8(minorVersion),
|
||||||
|
Build: uint16(buildNumber),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func winRevision(v string) int {
|
||||||
|
parts := strings.Split(v, ".")
|
||||||
|
if len(parts) < 4 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
r, err := strconv.Atoi(parts[3])
|
||||||
|
if err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
type windowsVersionMatcher struct {
|
||||||
|
windowsOSVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m windowsVersionMatcher) Match(v string) bool {
|
||||||
|
if m.isEmpty() || v == "" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
osv := getWindowsOSVersion(v)
|
||||||
|
return checkWindowsHostAndContainerCompat(m.windowsOSVersion, osv)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m windowsVersionMatcher) isEmpty() bool {
|
||||||
|
return m.MajorVersion == 0 && m.MinorVersion == 0 && m.Build == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
type windowsMatchComparer struct {
|
||||||
|
Matcher
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *windowsMatchComparer) Less(p1, p2 specs.Platform) bool {
|
||||||
|
m1, m2 := c.Match(p1), c.Match(p2)
|
||||||
|
if m1 && m2 {
|
||||||
|
r1, r2 := winRevision(p1.OSVersion), winRevision(p2.OSVersion)
|
||||||
|
return r1 > r2
|
||||||
|
}
|
||||||
|
return m1 && !m2
|
||||||
|
}
|
||||||
39
vendor/github.com/containerd/platforms/platforms.go
generated
vendored
39
vendor/github.com/containerd/platforms/platforms.go
generated
vendored
@@ -121,7 +121,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
specifierRe = regexp.MustCompile(`^[A-Za-z0-9_-]+$`)
|
specifierRe = regexp.MustCompile(`^[A-Za-z0-9_.-]+$`)
|
||||||
osAndVersionRe = regexp.MustCompile(`^([A-Za-z0-9_-]+)(?:\(([A-Za-z0-9_.-]*)\))?$`)
|
osAndVersionRe = regexp.MustCompile(`^([A-Za-z0-9_-]+)(?:\(([A-Za-z0-9_.-]*)\))?$`)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -144,18 +144,51 @@ type Matcher interface {
|
|||||||
//
|
//
|
||||||
// Applications should opt to use `Match` over directly parsing specifiers.
|
// Applications should opt to use `Match` over directly parsing specifiers.
|
||||||
func NewMatcher(platform specs.Platform) Matcher {
|
func NewMatcher(platform specs.Platform) Matcher {
|
||||||
return newDefaultMatcher(platform)
|
m := &matcher{
|
||||||
|
Platform: Normalize(platform),
|
||||||
|
}
|
||||||
|
|
||||||
|
if platform.OS == "windows" {
|
||||||
|
m.osvM = &windowsVersionMatcher{
|
||||||
|
windowsOSVersion: getWindowsOSVersion(platform.OSVersion),
|
||||||
|
}
|
||||||
|
// In prior versions, on windows, the returned matcher implements a
|
||||||
|
// MatchComprarer interface.
|
||||||
|
// This preserves that behavior for backwards compatibility.
|
||||||
|
//
|
||||||
|
// TODO: This isn't actually used in this package, except for a test case,
|
||||||
|
// which may have been an unintended side of some refactor.
|
||||||
|
// It was likely intended to be used in `Ordered` but it is not since
|
||||||
|
// `Less` that is implemented here ends up getting masked due to wrapping.
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
return &windowsMatchComparer{m}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
type osVerMatcher interface {
|
||||||
|
Match(string) bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type matcher struct {
|
type matcher struct {
|
||||||
specs.Platform
|
specs.Platform
|
||||||
|
osvM osVerMatcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *matcher) Match(platform specs.Platform) bool {
|
func (m *matcher) Match(platform specs.Platform) bool {
|
||||||
normalized := Normalize(platform)
|
normalized := Normalize(platform)
|
||||||
return m.OS == normalized.OS &&
|
return m.OS == normalized.OS &&
|
||||||
m.Architecture == normalized.Architecture &&
|
m.Architecture == normalized.Architecture &&
|
||||||
m.Variant == normalized.Variant
|
m.Variant == normalized.Variant &&
|
||||||
|
m.matchOSVersion(platform)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *matcher) matchOSVersion(platform specs.Platform) bool {
|
||||||
|
if m.osvM != nil {
|
||||||
|
return m.osvM.Match(platform.OSVersion)
|
||||||
|
}
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *matcher) String() string {
|
func (m *matcher) String() string {
|
||||||
|
|||||||
30
vendor/github.com/containerd/platforms/platforms_other.go
generated
vendored
30
vendor/github.com/containerd/platforms/platforms_other.go
generated
vendored
@@ -1,30 +0,0 @@
|
|||||||
//go:build !windows
|
|
||||||
|
|
||||||
/*
|
|
||||||
Copyright The containerd Authors.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package platforms
|
|
||||||
|
|
||||||
import (
|
|
||||||
specs "github.com/opencontainers/image-spec/specs-go/v1"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NewMatcher returns the default Matcher for containerd
|
|
||||||
func newDefaultMatcher(platform specs.Platform) Matcher {
|
|
||||||
return &matcher{
|
|
||||||
Platform: Normalize(platform),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
34
vendor/github.com/containerd/platforms/platforms_windows.go
generated
vendored
34
vendor/github.com/containerd/platforms/platforms_windows.go
generated
vendored
@@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright The containerd Authors.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package platforms
|
|
||||||
|
|
||||||
import (
|
|
||||||
specs "github.com/opencontainers/image-spec/specs-go/v1"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NewMatcher returns a Windows matcher that will match on osVersionPrefix if
|
|
||||||
// the platform is Windows otherwise use the default matcher
|
|
||||||
func newDefaultMatcher(platform specs.Platform) Matcher {
|
|
||||||
prefix := prefix(platform.OSVersion)
|
|
||||||
return windowsmatcher{
|
|
||||||
Platform: platform,
|
|
||||||
osVersionPrefix: prefix,
|
|
||||||
defaultMatcher: &matcher{
|
|
||||||
Platform: Normalize(platform),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
6
vendor/github.com/containerd/typeurl/v2/README.md
generated
vendored
6
vendor/github.com/containerd/typeurl/v2/README.md
generated
vendored
@@ -18,3 +18,9 @@ As a containerd sub-project, you will find the:
|
|||||||
* and [Contributing guidelines](https://github.com/containerd/project/blob/main/CONTRIBUTING.md)
|
* and [Contributing guidelines](https://github.com/containerd/project/blob/main/CONTRIBUTING.md)
|
||||||
|
|
||||||
information in our [`containerd/project`](https://github.com/containerd/project) repository.
|
information in our [`containerd/project`](https://github.com/containerd/project) repository.
|
||||||
|
|
||||||
|
## Optional
|
||||||
|
|
||||||
|
By default, support for gogoproto is available along side the standard Google
|
||||||
|
protobuf types.
|
||||||
|
You can choose to leave gogo support out by using the `!no_gogo` build tag.
|
||||||
|
|||||||
89
vendor/github.com/containerd/typeurl/v2/types.go
generated
vendored
89
vendor/github.com/containerd/typeurl/v2/types.go
generated
vendored
@@ -24,7 +24,6 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
gogoproto "github.com/gogo/protobuf/proto"
|
|
||||||
"google.golang.org/protobuf/proto"
|
"google.golang.org/protobuf/proto"
|
||||||
"google.golang.org/protobuf/reflect/protoregistry"
|
"google.golang.org/protobuf/reflect/protoregistry"
|
||||||
"google.golang.org/protobuf/types/known/anypb"
|
"google.golang.org/protobuf/types/known/anypb"
|
||||||
@@ -33,8 +32,16 @@ import (
|
|||||||
var (
|
var (
|
||||||
mu sync.RWMutex
|
mu sync.RWMutex
|
||||||
registry = make(map[reflect.Type]string)
|
registry = make(map[reflect.Type]string)
|
||||||
|
handlers []handler
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type handler interface {
|
||||||
|
Marshaller(interface{}) func() ([]byte, error)
|
||||||
|
Unmarshaller(interface{}) func([]byte) error
|
||||||
|
TypeURL(interface{}) string
|
||||||
|
GetType(url string) (reflect.Type, bool)
|
||||||
|
}
|
||||||
|
|
||||||
// Definitions of common error types used throughout typeurl.
|
// Definitions of common error types used throughout typeurl.
|
||||||
//
|
//
|
||||||
// These error types are used with errors.Wrap and errors.Wrapf to add context
|
// These error types are used with errors.Wrap and errors.Wrapf to add context
|
||||||
@@ -112,9 +119,12 @@ func TypeURL(v interface{}) (string, error) {
|
|||||||
switch t := v.(type) {
|
switch t := v.(type) {
|
||||||
case proto.Message:
|
case proto.Message:
|
||||||
return string(t.ProtoReflect().Descriptor().FullName()), nil
|
return string(t.ProtoReflect().Descriptor().FullName()), nil
|
||||||
case gogoproto.Message:
|
|
||||||
return gogoproto.MessageName(t), nil
|
|
||||||
default:
|
default:
|
||||||
|
for _, h := range handlers {
|
||||||
|
if u := h.TypeURL(v); u != "" {
|
||||||
|
return u, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
return "", fmt.Errorf("type %s: %w", reflect.TypeOf(v), ErrNotFound)
|
return "", fmt.Errorf("type %s: %w", reflect.TypeOf(v), ErrNotFound)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -149,12 +159,19 @@ func MarshalAny(v interface{}) (Any, error) {
|
|||||||
marshal = func(v interface{}) ([]byte, error) {
|
marshal = func(v interface{}) ([]byte, error) {
|
||||||
return proto.Marshal(t)
|
return proto.Marshal(t)
|
||||||
}
|
}
|
||||||
case gogoproto.Message:
|
|
||||||
marshal = func(v interface{}) ([]byte, error) {
|
|
||||||
return gogoproto.Marshal(t)
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
marshal = json.Marshal
|
for _, h := range handlers {
|
||||||
|
if m := h.Marshaller(v); m != nil {
|
||||||
|
marshal = func(v interface{}) ([]byte, error) {
|
||||||
|
return m()
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if marshal == nil {
|
||||||
|
marshal = json.Marshal
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
url, err := TypeURL(v)
|
url, err := TypeURL(v)
|
||||||
@@ -223,13 +240,13 @@ func MarshalAnyToProto(from interface{}) (*anypb.Any, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func unmarshal(typeURL string, value []byte, v interface{}) (interface{}, error) {
|
func unmarshal(typeURL string, value []byte, v interface{}) (interface{}, error) {
|
||||||
t, err := getTypeByUrl(typeURL)
|
t, isProto, err := getTypeByUrl(typeURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if v == nil {
|
if v == nil {
|
||||||
v = reflect.New(t.t).Interface()
|
v = reflect.New(t).Interface()
|
||||||
} else {
|
} else {
|
||||||
// Validate interface type provided by client
|
// Validate interface type provided by client
|
||||||
vURL, err := TypeURL(v)
|
vURL, err := TypeURL(v)
|
||||||
@@ -241,51 +258,45 @@ func unmarshal(typeURL string, value []byte, v interface{}) (interface{}, error)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if t.isProto {
|
if isProto {
|
||||||
switch t := v.(type) {
|
pm, ok := v.(proto.Message)
|
||||||
case proto.Message:
|
if ok {
|
||||||
err = proto.Unmarshal(value, t)
|
return v, proto.Unmarshal(value, pm)
|
||||||
case gogoproto.Message:
|
}
|
||||||
err = gogoproto.Unmarshal(value, t)
|
|
||||||
|
for _, h := range handlers {
|
||||||
|
if unmarshal := h.Unmarshaller(v); unmarshal != nil {
|
||||||
|
return v, unmarshal(value)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
err = json.Unmarshal(value, v)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return v, err
|
// fallback to json unmarshaller
|
||||||
|
return v, json.Unmarshal(value, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
type urlType struct {
|
func getTypeByUrl(url string) (_ reflect.Type, isProto bool, _ error) {
|
||||||
t reflect.Type
|
|
||||||
isProto bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func getTypeByUrl(url string) (urlType, error) {
|
|
||||||
mu.RLock()
|
mu.RLock()
|
||||||
for t, u := range registry {
|
for t, u := range registry {
|
||||||
if u == url {
|
if u == url {
|
||||||
mu.RUnlock()
|
mu.RUnlock()
|
||||||
return urlType{
|
return t, false, nil
|
||||||
t: t,
|
|
||||||
}, nil
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mu.RUnlock()
|
mu.RUnlock()
|
||||||
// fallback to proto registry
|
|
||||||
t := gogoproto.MessageType(url)
|
|
||||||
if t != nil {
|
|
||||||
return urlType{
|
|
||||||
// get the underlying Elem because proto returns a pointer to the type
|
|
||||||
t: t.Elem(),
|
|
||||||
isProto: true,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
mt, err := protoregistry.GlobalTypes.FindMessageByURL(url)
|
mt, err := protoregistry.GlobalTypes.FindMessageByURL(url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return urlType{}, fmt.Errorf("type with url %s: %w", url, ErrNotFound)
|
if errors.Is(err, protoregistry.NotFound) {
|
||||||
|
for _, h := range handlers {
|
||||||
|
if t, isProto := h.GetType(url); t != nil {
|
||||||
|
return t, isProto, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil, false, fmt.Errorf("type with url %s: %w", url, ErrNotFound)
|
||||||
}
|
}
|
||||||
empty := mt.New().Interface()
|
empty := mt.New().Interface()
|
||||||
return urlType{t: reflect.TypeOf(empty).Elem(), isProto: true}, nil
|
return reflect.TypeOf(empty).Elem(), true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func tryDereference(v interface{}) reflect.Type {
|
func tryDereference(v interface{}) reflect.Type {
|
||||||
|
|||||||
68
vendor/github.com/containerd/typeurl/v2/types_gogo.go
generated
vendored
Normal file
68
vendor/github.com/containerd/typeurl/v2/types_gogo.go
generated
vendored
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
//go:build !no_gogo
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copyright The containerd Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package typeurl
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
|
||||||
|
gogoproto "github.com/gogo/protobuf/proto"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
handlers = append(handlers, gogoHandler{})
|
||||||
|
}
|
||||||
|
|
||||||
|
type gogoHandler struct{}
|
||||||
|
|
||||||
|
func (gogoHandler) Marshaller(v interface{}) func() ([]byte, error) {
|
||||||
|
pm, ok := v.(gogoproto.Message)
|
||||||
|
if !ok {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return func() ([]byte, error) {
|
||||||
|
return gogoproto.Marshal(pm)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (gogoHandler) Unmarshaller(v interface{}) func([]byte) error {
|
||||||
|
pm, ok := v.(gogoproto.Message)
|
||||||
|
if !ok {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return func(dt []byte) error {
|
||||||
|
return gogoproto.Unmarshal(dt, pm)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (gogoHandler) TypeURL(v interface{}) string {
|
||||||
|
pm, ok := v.(gogoproto.Message)
|
||||||
|
if !ok {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return gogoproto.MessageName(pm)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (gogoHandler) GetType(url string) (reflect.Type, bool) {
|
||||||
|
t := gogoproto.MessageType(url)
|
||||||
|
if t == nil {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
return t.Elem(), true
|
||||||
|
}
|
||||||
29
vendor/github.com/docker/docker-credential-helpers/client/command.go
generated
vendored
29
vendor/github.com/docker/docker-credential-helpers/client/command.go
generated
vendored
@@ -15,27 +15,30 @@ type Program interface {
|
|||||||
// ProgramFunc is a type of function that initializes programs based on arguments.
|
// ProgramFunc is a type of function that initializes programs based on arguments.
|
||||||
type ProgramFunc func(args ...string) Program
|
type ProgramFunc func(args ...string) Program
|
||||||
|
|
||||||
// NewShellProgramFunc creates programs that are executed in a Shell.
|
// NewShellProgramFunc creates a [ProgramFunc] to run command in a [Shell].
|
||||||
func NewShellProgramFunc(name string) ProgramFunc {
|
func NewShellProgramFunc(command string) ProgramFunc {
|
||||||
return NewShellProgramFuncWithEnv(name, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewShellProgramFuncWithEnv creates programs that are executed in a Shell with environment variables
|
|
||||||
func NewShellProgramFuncWithEnv(name string, env *map[string]string) ProgramFunc {
|
|
||||||
return func(args ...string) Program {
|
return func(args ...string) Program {
|
||||||
return &Shell{cmd: createProgramCmdRedirectErr(name, args, env)}
|
return createProgramCmdRedirectErr(command, args, nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func createProgramCmdRedirectErr(commandName string, args []string, env *map[string]string) *exec.Cmd {
|
// NewShellProgramFuncWithEnv creates a [ProgramFunc] tu run command
|
||||||
programCmd := exec.Command(commandName, args...)
|
// in a [Shell] with the given environment variables.
|
||||||
|
func NewShellProgramFuncWithEnv(command string, env *map[string]string) ProgramFunc {
|
||||||
|
return func(args ...string) Program {
|
||||||
|
return createProgramCmdRedirectErr(command, args, env)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func createProgramCmdRedirectErr(command string, args []string, env *map[string]string) *Shell {
|
||||||
|
ec := exec.Command(command, args...)
|
||||||
if env != nil {
|
if env != nil {
|
||||||
for k, v := range *env {
|
for k, v := range *env {
|
||||||
programCmd.Env = append(programCmd.Environ(), k+"="+v)
|
ec.Env = append(ec.Environ(), k+"="+v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
programCmd.Stderr = os.Stderr
|
ec.Stderr = os.Stderr
|
||||||
return programCmd
|
return &Shell{cmd: ec}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shell invokes shell commands to talk with a remote credentials-helper.
|
// Shell invokes shell commands to talk with a remote credentials-helper.
|
||||||
|
|||||||
9
vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/commands.go
generated
vendored
9
vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/commands.go
generated
vendored
@@ -246,6 +246,7 @@ type AddCommand struct {
|
|||||||
ExcludePatterns []string
|
ExcludePatterns []string
|
||||||
KeepGitDir bool // whether to keep .git dir, only meaningful for git sources
|
KeepGitDir bool // whether to keep .git dir, only meaningful for git sources
|
||||||
Checksum string
|
Checksum string
|
||||||
|
Unpack *bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *AddCommand) Expand(expander SingleWordExpander) error {
|
func (c *AddCommand) Expand(expander SingleWordExpander) error {
|
||||||
@@ -551,16 +552,16 @@ func HasStage(s []Stage, name string) (int, bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type withExternalData struct {
|
type withExternalData struct {
|
||||||
m map[interface{}]interface{}
|
m map[any]any
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *withExternalData) getExternalValue(k interface{}) interface{} {
|
func (c *withExternalData) getExternalValue(k any) any {
|
||||||
return c.m[k]
|
return c.m[k]
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *withExternalData) setExternalValue(k, v interface{}) {
|
func (c *withExternalData) setExternalValue(k, v any) {
|
||||||
if c.m == nil {
|
if c.m == nil {
|
||||||
c.m = map[interface{}]interface{}{}
|
c.m = map[any]any{}
|
||||||
}
|
}
|
||||||
c.m[k] = v
|
c.m[k] = v
|
||||||
}
|
}
|
||||||
|
|||||||
118
vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/commands_rundevice.go
generated
vendored
Normal file
118
vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/commands_rundevice.go
generated
vendored
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
package instructions
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/moby/buildkit/util/suggest"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"github.com/tonistiigi/go-csvvalue"
|
||||||
|
)
|
||||||
|
|
||||||
|
var devicesKey = "dockerfile/run/devices"
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
parseRunPreHooks = append(parseRunPreHooks, runDevicePreHook)
|
||||||
|
parseRunPostHooks = append(parseRunPostHooks, runDevicePostHook)
|
||||||
|
}
|
||||||
|
|
||||||
|
func runDevicePreHook(cmd *RunCommand, req parseRequest) error {
|
||||||
|
st := &deviceState{}
|
||||||
|
st.flag = req.flags.AddStrings("device")
|
||||||
|
cmd.setExternalValue(devicesKey, st)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func runDevicePostHook(cmd *RunCommand, req parseRequest) error {
|
||||||
|
return setDeviceState(cmd)
|
||||||
|
}
|
||||||
|
|
||||||
|
func setDeviceState(cmd *RunCommand) error {
|
||||||
|
st := getDeviceState(cmd)
|
||||||
|
if st == nil {
|
||||||
|
return errors.Errorf("no device state")
|
||||||
|
}
|
||||||
|
devices := make([]*Device, len(st.flag.StringValues))
|
||||||
|
for i, str := range st.flag.StringValues {
|
||||||
|
d, err := ParseDevice(str)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
devices[i] = d
|
||||||
|
}
|
||||||
|
st.devices = devices
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getDeviceState(cmd *RunCommand) *deviceState {
|
||||||
|
v := cmd.getExternalValue(devicesKey)
|
||||||
|
if v == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return v.(*deviceState)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetDevices(cmd *RunCommand) []*Device {
|
||||||
|
return getDeviceState(cmd).devices
|
||||||
|
}
|
||||||
|
|
||||||
|
type deviceState struct {
|
||||||
|
flag *Flag
|
||||||
|
devices []*Device
|
||||||
|
}
|
||||||
|
|
||||||
|
type Device struct {
|
||||||
|
Name string
|
||||||
|
Required bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseDevice(val string) (*Device, error) {
|
||||||
|
fields, err := csvvalue.Fields(val, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Wrap(err, "failed to parse csv devices")
|
||||||
|
}
|
||||||
|
|
||||||
|
d := &Device{}
|
||||||
|
|
||||||
|
for _, field := range fields {
|
||||||
|
key, value, ok := strings.Cut(field, "=")
|
||||||
|
key = strings.ToLower(key)
|
||||||
|
|
||||||
|
if !ok {
|
||||||
|
switch key {
|
||||||
|
case "required":
|
||||||
|
d.Required = true
|
||||||
|
continue
|
||||||
|
default:
|
||||||
|
if d.Name == "" {
|
||||||
|
d.Name = field
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// any other option requires a value.
|
||||||
|
return nil, errors.Errorf("invalid field '%s' must be a key=value pair", field)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case "name":
|
||||||
|
if d.Name != "" {
|
||||||
|
return nil, errors.Errorf("device name already set to %s", d.Name)
|
||||||
|
}
|
||||||
|
d.Name = value
|
||||||
|
case "required":
|
||||||
|
d.Required, err = strconv.ParseBool(value)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Errorf("invalid value for %s: %s", key, value)
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
if d.Name == "" {
|
||||||
|
d.Name = field
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
allKeys := []string{"name", "required"}
|
||||||
|
return nil, suggest.WrapError(errors.Errorf("unexpected key '%s' in '%s'", key, field), key, allKeys, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return d, nil
|
||||||
|
}
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
//go:build dfrunsecurity
|
//go:build dfrunsecurity
|
||||||
// +build dfrunsecurity
|
|
||||||
|
|
||||||
package instructions
|
package instructions
|
||||||
|
|
||||||
|
|||||||
1
vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/errors_unix.go
generated
vendored
1
vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/errors_unix.go
generated
vendored
@@ -1,5 +1,4 @@
|
|||||||
//go:build !windows
|
//go:build !windows
|
||||||
// +build !windows
|
|
||||||
|
|
||||||
package instructions
|
package instructions
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
//go:build dfexcludepatterns
|
//go:build dfexcludepatterns
|
||||||
// +build dfexcludepatterns
|
|
||||||
|
|
||||||
package instructions
|
package instructions
|
||||||
|
|
||||||
|
|||||||
26
vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/parse.go
generated
vendored
26
vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/parse.go
generated
vendored
@@ -7,7 +7,7 @@ package instructions
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"regexp"
|
"regexp"
|
||||||
"sort"
|
"slices"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@@ -66,12 +66,12 @@ func newParseRequestFromNode(node *parser.Node) parseRequest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ParseInstruction(node *parser.Node) (v interface{}, err error) {
|
func ParseInstruction(node *parser.Node) (v any, err error) {
|
||||||
return ParseInstructionWithLinter(node, nil)
|
return ParseInstructionWithLinter(node, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ParseInstruction converts an AST to a typed instruction (either a command or a build stage beginning when encountering a `FROM` statement)
|
// ParseInstruction converts an AST to a typed instruction (either a command or a build stage beginning when encountering a `FROM` statement)
|
||||||
func ParseInstructionWithLinter(node *parser.Node, lint *linter.Linter) (v interface{}, err error) {
|
func ParseInstructionWithLinter(node *parser.Node, lint *linter.Linter) (v any, err error) {
|
||||||
defer func() {
|
defer func() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = parser.WithLocation(err, node.Location())
|
err = parser.WithLocation(err, node.Location())
|
||||||
@@ -338,6 +338,7 @@ func parseAdd(req parseRequest) (*AddCommand, error) {
|
|||||||
flLink := req.flags.AddBool("link", false)
|
flLink := req.flags.AddBool("link", false)
|
||||||
flKeepGitDir := req.flags.AddBool("keep-git-dir", false)
|
flKeepGitDir := req.flags.AddBool("keep-git-dir", false)
|
||||||
flChecksum := req.flags.AddString("checksum", "")
|
flChecksum := req.flags.AddString("checksum", "")
|
||||||
|
flUnpack := req.flags.AddBool("unpack", false)
|
||||||
if err := req.flags.Parse(); err != nil {
|
if err := req.flags.Parse(); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -347,6 +348,12 @@ func parseAdd(req parseRequest) (*AddCommand, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var unpack *bool
|
||||||
|
if _, ok := req.flags.used["unpack"]; ok {
|
||||||
|
b := flUnpack.Value == "true"
|
||||||
|
unpack = &b
|
||||||
|
}
|
||||||
|
|
||||||
return &AddCommand{
|
return &AddCommand{
|
||||||
withNameAndCode: newWithNameAndCode(req),
|
withNameAndCode: newWithNameAndCode(req),
|
||||||
SourcesAndDest: *sourcesAndDest,
|
SourcesAndDest: *sourcesAndDest,
|
||||||
@@ -356,6 +363,7 @@ func parseAdd(req parseRequest) (*AddCommand, error) {
|
|||||||
KeepGitDir: flKeepGitDir.Value == "true",
|
KeepGitDir: flKeepGitDir.Value == "true",
|
||||||
Checksum: flChecksum.Value,
|
Checksum: flChecksum.Value,
|
||||||
ExcludePatterns: stringValuesFromFlagIfPossible(flExcludes),
|
ExcludePatterns: stringValuesFromFlagIfPossible(flExcludes),
|
||||||
|
Unpack: unpack,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -687,7 +695,7 @@ func parseExpose(req parseRequest) (*ExposeCommand, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
sort.Strings(portsTab)
|
slices.Sort(portsTab)
|
||||||
return &ExposeCommand{
|
return &ExposeCommand{
|
||||||
Ports: portsTab,
|
Ports: portsTab,
|
||||||
withNameAndCode: newWithNameAndCode(req),
|
withNameAndCode: newWithNameAndCode(req),
|
||||||
@@ -831,8 +839,8 @@ func getComment(comments []string, name string) string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
for _, line := range comments {
|
for _, line := range comments {
|
||||||
if strings.HasPrefix(line, name+" ") {
|
if after, ok := strings.CutPrefix(line, name+" "); ok {
|
||||||
return strings.TrimPrefix(line, name+" ")
|
return after
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
@@ -880,10 +888,8 @@ func validateDefinitionDescription(instruction string, argKeys []string, descCom
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
descCommentParts := strings.Split(descComments[len(descComments)-1], " ")
|
descCommentParts := strings.Split(descComments[len(descComments)-1], " ")
|
||||||
for _, key := range argKeys {
|
if slices.Contains(argKeys, descCommentParts[0]) {
|
||||||
if key == descCommentParts[0] {
|
return
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
exampleKey := argKeys[0]
|
exampleKey := argKeys[0]
|
||||||
if len(argKeys) > 1 {
|
if len(argKeys) > 1 {
|
||||||
|
|||||||
1
vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/parse_parents.go
generated
vendored
1
vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/parse_parents.go
generated
vendored
@@ -1,5 +1,4 @@
|
|||||||
//go:build dfparents
|
//go:build dfparents
|
||||||
// +build dfparents
|
|
||||||
|
|
||||||
package instructions
|
package instructions
|
||||||
|
|
||||||
|
|||||||
2
vendor/github.com/moby/buildkit/frontend/dockerfile/linter/linter.go
generated
vendored
2
vendor/github.com/moby/buildkit/frontend/dockerfile/linter/linter.go
generated
vendored
@@ -55,7 +55,7 @@ func (lc *Linter) Run(rule LinterRuleI, location []parser.Range, txt ...string)
|
|||||||
rulename := rule.RuleName()
|
rulename := rule.RuleName()
|
||||||
if rule.IsExperimental() {
|
if rule.IsExperimental() {
|
||||||
_, experimentalOk := lc.ExperimentalRules[rulename]
|
_, experimentalOk := lc.ExperimentalRules[rulename]
|
||||||
if !(lc.ExperimentalAll || experimentalOk) {
|
if !lc.ExperimentalAll && !experimentalOk {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
31
vendor/github.com/moby/buildkit/frontend/dockerfile/parser/directives.go
generated
vendored
31
vendor/github.com/moby/buildkit/frontend/dockerfile/parser/directives.go
generated
vendored
@@ -112,10 +112,15 @@ func (d *DirectiveParser) ParseAll(data []byte) ([]*Directive, error) {
|
|||||||
// This allows for a flexible range of input formats, and appropriate syntax
|
// This allows for a flexible range of input formats, and appropriate syntax
|
||||||
// selection.
|
// selection.
|
||||||
func DetectSyntax(dt []byte) (string, string, []Range, bool) {
|
func DetectSyntax(dt []byte) (string, string, []Range, bool) {
|
||||||
return ParseDirective(keySyntax, dt)
|
return parseDirective(keySyntax, dt, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ParseDirective(key string, dt []byte) (string, string, []Range, bool) {
|
func ParseDirective(key string, dt []byte) (string, string, []Range, bool) {
|
||||||
|
return parseDirective(key, dt, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseDirective(key string, dt []byte, anyFormat bool) (string, string, []Range, bool) {
|
||||||
|
dt = discardBOM(dt)
|
||||||
dt, hadShebang, err := discardShebang(dt)
|
dt, hadShebang, err := discardShebang(dt)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", "", nil, false
|
return "", "", nil, false
|
||||||
@@ -131,6 +136,10 @@ func ParseDirective(key string, dt []byte) (string, string, []Range, bool) {
|
|||||||
return syntax, cmdline, loc, true
|
return syntax, cmdline, loc, true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !anyFormat {
|
||||||
|
return "", "", nil, false
|
||||||
|
}
|
||||||
|
|
||||||
// use directive with different comment prefix, and search for //key=
|
// use directive with different comment prefix, and search for //key=
|
||||||
directiveParser = DirectiveParser{line: line}
|
directiveParser = DirectiveParser{line: line}
|
||||||
directiveParser.setComment("//")
|
directiveParser.setComment("//")
|
||||||
@@ -139,14 +148,16 @@ func ParseDirective(key string, dt []byte) (string, string, []Range, bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// use json directive, and search for { "key": "..." }
|
// use json directive, and search for { "key": "..." }
|
||||||
jsonDirective := map[string]string{}
|
jsonDirective := map[string]any{}
|
||||||
if err := json.Unmarshal(dt, &jsonDirective); err == nil {
|
if err := json.Unmarshal(dt, &jsonDirective); err == nil {
|
||||||
if v, ok := jsonDirective[key]; ok {
|
if vAny, ok := jsonDirective[key]; ok {
|
||||||
loc := []Range{{
|
if v, ok := vAny.(string); ok {
|
||||||
Start: Position{Line: line},
|
loc := []Range{{
|
||||||
End: Position{Line: line},
|
Start: Position{Line: line},
|
||||||
}}
|
End: Position{Line: line},
|
||||||
return v, v, loc, true
|
}}
|
||||||
|
return v, v, loc, true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,3 +182,7 @@ func discardShebang(dt []byte) ([]byte, bool, error) {
|
|||||||
}
|
}
|
||||||
return dt, false, nil
|
return dt, false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func discardBOM(dt []byte) []byte {
|
||||||
|
return bytes.TrimPrefix(dt, []byte{0xEF, 0xBB, 0xBF})
|
||||||
|
}
|
||||||
|
|||||||
10
vendor/github.com/moby/buildkit/frontend/dockerfile/parser/errors.go
generated
vendored
10
vendor/github.com/moby/buildkit/frontend/dockerfile/parser/errors.go
generated
vendored
@@ -5,14 +5,14 @@ import (
|
|||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ErrorLocation gives a location in source code that caused the error
|
// LocationError gives a location in source code that caused the error
|
||||||
type ErrorLocation struct {
|
type LocationError struct {
|
||||||
Locations [][]Range
|
Locations [][]Range
|
||||||
error
|
error
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unwrap unwraps to the next error
|
// Unwrap unwraps to the next error
|
||||||
func (e *ErrorLocation) Unwrap() error {
|
func (e *LocationError) Unwrap() error {
|
||||||
return e.error
|
return e.error
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,7 +45,7 @@ func setLocation(err error, location []Range, add bool) error {
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var el *ErrorLocation
|
var el *LocationError
|
||||||
if errors.As(err, &el) {
|
if errors.As(err, &el) {
|
||||||
if add {
|
if add {
|
||||||
el.Locations = append(el.Locations, location)
|
el.Locations = append(el.Locations, location)
|
||||||
@@ -54,7 +54,7 @@ func setLocation(err error, location []Range, add bool) error {
|
|||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return stack.Enable(&ErrorLocation{
|
return stack.Enable(&LocationError{
|
||||||
error: err,
|
error: err,
|
||||||
Locations: [][]Range{location},
|
Locations: [][]Range{location},
|
||||||
})
|
})
|
||||||
|
|||||||
6
vendor/github.com/moby/buildkit/frontend/dockerfile/parser/line_parsers.go
generated
vendored
6
vendor/github.com/moby/buildkit/frontend/dockerfile/parser/line_parsers.go
generated
vendored
@@ -281,7 +281,7 @@ func parseJSON(rest string) (*Node, map[string]bool, error) {
|
|||||||
return nil, nil, errDockerfileNotJSONArray
|
return nil, nil, errDockerfileNotJSONArray
|
||||||
}
|
}
|
||||||
|
|
||||||
var myJSON []interface{}
|
var myJSON []any
|
||||||
if err := json.Unmarshal([]byte(rest), &myJSON); err != nil {
|
if err := json.Unmarshal([]byte(rest), &myJSON); err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
@@ -318,7 +318,7 @@ func parseMaybeJSON(rest string, d *directives) (*Node, map[string]bool, error)
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
return node, attrs, nil
|
return node, attrs, nil
|
||||||
}
|
}
|
||||||
if err == errDockerfileNotStringArray {
|
if errors.Is(err, errDockerfileNotStringArray) {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -336,7 +336,7 @@ func parseMaybeJSONToList(rest string, d *directives) (*Node, map[string]bool, e
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
return node, attrs, nil
|
return node, attrs, nil
|
||||||
}
|
}
|
||||||
if err == errDockerfileNotStringArray {
|
if errors.Is(err, errDockerfileNotStringArray) {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
12
vendor/github.com/moby/buildkit/frontend/dockerfile/parser/parser.go
generated
vendored
12
vendor/github.com/moby/buildkit/frontend/dockerfile/parser/parser.go
generated
vendored
@@ -114,7 +114,7 @@ type Heredoc struct {
|
|||||||
var (
|
var (
|
||||||
dispatch map[string]func(string, *directives) (*Node, map[string]bool, error)
|
dispatch map[string]func(string, *directives) (*Node, map[string]bool, error)
|
||||||
reWhitespace = regexp.MustCompile(`[\t\v\f\r ]+`)
|
reWhitespace = regexp.MustCompile(`[\t\v\f\r ]+`)
|
||||||
reHeredoc = regexp.MustCompile(`^(\d*)<<(-?)([^<]*)$`)
|
reHeredoc = regexp.MustCompile(`^(\d*)<<(-?)\s*([^<]*)$`)
|
||||||
reLeadingTabs = regexp.MustCompile(`(?m)^\t+`)
|
reLeadingTabs = regexp.MustCompile(`(?m)^\t+`)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -220,7 +220,7 @@ func init() {
|
|||||||
// based on the command and command arguments. A Node is created from the
|
// based on the command and command arguments. A Node is created from the
|
||||||
// result of the dispatch.
|
// result of the dispatch.
|
||||||
func newNodeFromLine(line string, d *directives, comments []string) (*Node, error) {
|
func newNodeFromLine(line string, d *directives, comments []string) (*Node, error) {
|
||||||
cmd, flags, args, err := splitCommand(line)
|
cmd, flags, args, err := splitCommand(line, d)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -291,7 +291,7 @@ func Parse(rwc io.Reader) (*Result, error) {
|
|||||||
bytesRead := scanner.Bytes()
|
bytesRead := scanner.Bytes()
|
||||||
if currentLine == 0 {
|
if currentLine == 0 {
|
||||||
// First line, strip the byte-order-marker if present
|
// First line, strip the byte-order-marker if present
|
||||||
bytesRead = bytes.TrimPrefix(bytesRead, utf8bom)
|
bytesRead = discardBOM(bytesRead)
|
||||||
}
|
}
|
||||||
if isComment(bytesRead) {
|
if isComment(bytesRead) {
|
||||||
comment := strings.TrimSpace(string(bytesRead[1:]))
|
comment := strings.TrimSpace(string(bytesRead[1:]))
|
||||||
@@ -522,8 +522,6 @@ func isEmptyContinuationLine(line []byte) bool {
|
|||||||
return len(trimLeadingWhitespace(trimNewline(line))) == 0
|
return len(trimLeadingWhitespace(trimNewline(line))) == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
var utf8bom = []byte{0xEF, 0xBB, 0xBF}
|
|
||||||
|
|
||||||
func trimContinuationCharacter(line []byte, d *directives) ([]byte, bool) {
|
func trimContinuationCharacter(line []byte, d *directives) ([]byte, bool) {
|
||||||
if d.lineContinuationRegex.Match(line) {
|
if d.lineContinuationRegex.Match(line) {
|
||||||
line = d.lineContinuationRegex.ReplaceAll(line, []byte("$1"))
|
line = d.lineContinuationRegex.ReplaceAll(line, []byte("$1"))
|
||||||
@@ -558,8 +556,8 @@ func scanLines(data []byte, atEOF bool) (advance int, token []byte, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func handleScannerError(err error) error {
|
func handleScannerError(err error) error {
|
||||||
switch err {
|
switch {
|
||||||
case bufio.ErrTooLong:
|
case errors.Is(err, bufio.ErrTooLong):
|
||||||
return errors.Errorf("dockerfile line greater than max allowed size of %d", bufio.MaxScanTokenSize-1)
|
return errors.Errorf("dockerfile line greater than max allowed size of %d", bufio.MaxScanTokenSize-1)
|
||||||
default:
|
default:
|
||||||
return err
|
return err
|
||||||
|
|||||||
10
vendor/github.com/moby/buildkit/frontend/dockerfile/parser/split_command.go
generated
vendored
10
vendor/github.com/moby/buildkit/frontend/dockerfile/parser/split_command.go
generated
vendored
@@ -7,7 +7,7 @@ import (
|
|||||||
|
|
||||||
// splitCommand takes a single line of text and parses out the cmd and args,
|
// splitCommand takes a single line of text and parses out the cmd and args,
|
||||||
// which are used for dispatching to more exact parsing functions.
|
// which are used for dispatching to more exact parsing functions.
|
||||||
func splitCommand(line string) (string, []string, string, error) {
|
func splitCommand(line string, d *directives) (string, []string, string, error) {
|
||||||
var args string
|
var args string
|
||||||
var flags []string
|
var flags []string
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ func splitCommand(line string) (string, []string, string, error) {
|
|||||||
|
|
||||||
if len(cmdline) == 2 {
|
if len(cmdline) == 2 {
|
||||||
var err error
|
var err error
|
||||||
args, flags, err = extractBuilderFlags(cmdline[1])
|
args, flags, err = extractBuilderFlags(cmdline[1], d)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", nil, "", err
|
return "", nil, "", err
|
||||||
}
|
}
|
||||||
@@ -25,7 +25,7 @@ func splitCommand(line string) (string, []string, string, error) {
|
|||||||
return cmdline[0], flags, strings.TrimSpace(args), nil
|
return cmdline[0], flags, strings.TrimSpace(args), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func extractBuilderFlags(line string) (string, []string, error) {
|
func extractBuilderFlags(line string, d *directives) (string, []string, error) {
|
||||||
// Parses the BuilderFlags and returns the remaining part of the line
|
// Parses the BuilderFlags and returns the remaining part of the line
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -87,7 +87,7 @@ func extractBuilderFlags(line string) (string, []string, error) {
|
|||||||
phase = inQuote
|
phase = inQuote
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if ch == '\\' {
|
if ch == d.escapeToken {
|
||||||
if pos+1 == len(line) {
|
if pos+1 == len(line) {
|
||||||
continue // just skip \ at end
|
continue // just skip \ at end
|
||||||
}
|
}
|
||||||
@@ -104,7 +104,7 @@ func extractBuilderFlags(line string) (string, []string, error) {
|
|||||||
phase = inWord
|
phase = inWord
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if ch == '\\' {
|
if ch == d.escapeToken {
|
||||||
if pos+1 == len(line) {
|
if pos+1 == len(line) {
|
||||||
phase = inWord
|
phase = inWord
|
||||||
continue // just skip \ at end
|
continue // just skip \ at end
|
||||||
|
|||||||
1
vendor/github.com/moby/buildkit/frontend/dockerfile/shell/equal_env_unix.go
generated
vendored
1
vendor/github.com/moby/buildkit/frontend/dockerfile/shell/equal_env_unix.go
generated
vendored
@@ -1,5 +1,4 @@
|
|||||||
//go:build !windows
|
//go:build !windows
|
||||||
// +build !windows
|
|
||||||
|
|
||||||
package shell
|
package shell
|
||||||
|
|
||||||
|
|||||||
28
vendor/github.com/moby/buildkit/frontend/dockerfile/shell/lex.go
generated
vendored
28
vendor/github.com/moby/buildkit/frontend/dockerfile/shell/lex.go
generated
vendored
@@ -177,6 +177,7 @@ func (sw *shellWord) processStopOn(stopChar rune, rawEscapes bool) (string, []st
|
|||||||
// no need to initialize all the time
|
// no need to initialize all the time
|
||||||
var charFuncMapping = map[rune]func() (string, error){
|
var charFuncMapping = map[rune]func() (string, error){
|
||||||
'$': sw.processDollar,
|
'$': sw.processDollar,
|
||||||
|
'<': sw.processPossibleHeredoc,
|
||||||
}
|
}
|
||||||
if !sw.SkipProcessQuotes {
|
if !sw.SkipProcessQuotes {
|
||||||
charFuncMapping['\''] = sw.processSingleQuote
|
charFuncMapping['\''] = sw.processSingleQuote
|
||||||
@@ -512,6 +513,25 @@ func (sw *shellWord) processName() string {
|
|||||||
return name.String()
|
return name.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sw *shellWord) processPossibleHeredoc() (string, error) {
|
||||||
|
sw.scanner.Next()
|
||||||
|
if sw.scanner.Peek() != '<' {
|
||||||
|
return "<", nil // not a heredoc
|
||||||
|
}
|
||||||
|
sw.scanner.Next()
|
||||||
|
|
||||||
|
// heredoc might have whitespace between << and word terminator
|
||||||
|
var space bytes.Buffer
|
||||||
|
nextCh := sw.scanner.Peek()
|
||||||
|
for isWhitespace(nextCh) {
|
||||||
|
space.WriteRune(nextCh)
|
||||||
|
sw.scanner.Next()
|
||||||
|
nextCh = sw.scanner.Peek()
|
||||||
|
}
|
||||||
|
result := "<<" + space.String()
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
// isSpecialParam checks if the provided character is a special parameters,
|
// isSpecialParam checks if the provided character is a special parameters,
|
||||||
// as defined in http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_05_02
|
// as defined in http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_05_02
|
||||||
func isSpecialParam(char rune) bool {
|
func isSpecialParam(char rune) bool {
|
||||||
@@ -677,3 +697,11 @@ func trimSuffix(pattern, word string, greedy bool) (string, error) {
|
|||||||
}
|
}
|
||||||
return reverseString(str), nil
|
return reverseString(str), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isWhitespace(r rune) bool {
|
||||||
|
switch r {
|
||||||
|
case '\t', '\r', ' ':
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|||||||
2
vendor/github.com/moby/buildkit/util/stack/compress.go
generated
vendored
2
vendor/github.com/moby/buildkit/util/stack/compress.go
generated
vendored
@@ -25,7 +25,7 @@ loop0:
|
|||||||
}
|
}
|
||||||
// full match, potentially skip all
|
// full match, potentially skip all
|
||||||
if idx == len(st.Frames)-1 {
|
if idx == len(st.Frames)-1 {
|
||||||
if st.Pid == prev.Pid && st.Version == prev.Version && slices.Compare(st.Cmdline, st.Cmdline) == 0 {
|
if st.Pid == prev.Pid && st.Version == prev.Version && slices.Equal(st.Cmdline, prev.Cmdline) {
|
||||||
continue loop0
|
continue loop0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
12
vendor/github.com/moby/buildkit/util/stack/stack.go
generated
vendored
12
vendor/github.com/moby/buildkit/util/stack/stack.go
generated
vendored
@@ -50,7 +50,7 @@ func Traces(err error) []*Stack {
|
|||||||
func traces(err error) []*Stack {
|
func traces(err error) []*Stack {
|
||||||
var st []*Stack
|
var st []*Stack
|
||||||
|
|
||||||
switch e := err.(type) {
|
switch e := err.(type) { //nolint:errorlint
|
||||||
case interface{ Unwrap() error }:
|
case interface{ Unwrap() error }:
|
||||||
st = Traces(e.Unwrap())
|
st = Traces(e.Unwrap())
|
||||||
case interface{ Unwrap() []error }:
|
case interface{ Unwrap() []error }:
|
||||||
@@ -63,7 +63,7 @@ func traces(err error) []*Stack {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ste := err.(type) {
|
switch ste := err.(type) { //nolint:errorlint
|
||||||
case interface{ StackTrace() errors.StackTrace }:
|
case interface{ StackTrace() errors.StackTrace }:
|
||||||
st = append(st, convertStack(ste.StackTrace()))
|
st = append(st, convertStack(ste.StackTrace()))
|
||||||
case interface{ StackTrace() *Stack }:
|
case interface{ StackTrace() *Stack }:
|
||||||
@@ -85,7 +85,7 @@ func Enable(err error) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func Wrap(err error, s *Stack) error {
|
func Wrap(err error, s *Stack) error {
|
||||||
return &withStack{stack: s, error: err}
|
return &withStackError{stack: s, error: err}
|
||||||
}
|
}
|
||||||
|
|
||||||
func hasLocalStackTrace(err error) bool {
|
func hasLocalStackTrace(err error) bool {
|
||||||
@@ -173,15 +173,15 @@ func convertStack(s errors.StackTrace) *Stack {
|
|||||||
return &out
|
return &out
|
||||||
}
|
}
|
||||||
|
|
||||||
type withStack struct {
|
type withStackError struct {
|
||||||
stack *Stack
|
stack *Stack
|
||||||
error
|
error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *withStack) Unwrap() error {
|
func (e *withStackError) Unwrap() error {
|
||||||
return e.error
|
return e.error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *withStack) StackTrace() *Stack {
|
func (e *withStackError) StackTrace() *Stack {
|
||||||
return e.stack
|
return e.stack
|
||||||
}
|
}
|
||||||
|
|||||||
71
vendor/github.com/moby/buildkit/util/stack/stack.pb.go
generated
vendored
71
vendor/github.com/moby/buildkit/util/stack/stack.pb.go
generated
vendored
@@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.35.1
|
// protoc-gen-go v1.36.6
|
||||||
// protoc v3.11.4
|
// protoc v3.11.4
|
||||||
// source: github.com/moby/buildkit/util/stack/stack.proto
|
// source: github.com/moby/buildkit/util/stack/stack.proto
|
||||||
|
|
||||||
@@ -11,6 +11,7 @@ import (
|
|||||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
sync "sync"
|
sync "sync"
|
||||||
|
unsafe "unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -21,15 +22,14 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Stack struct {
|
type Stack struct {
|
||||||
state protoimpl.MessageState
|
state protoimpl.MessageState `protogen:"open.v1"`
|
||||||
sizeCache protoimpl.SizeCache
|
Frames []*Frame `protobuf:"bytes,1,rep,name=frames,proto3" json:"frames,omitempty"`
|
||||||
|
Cmdline []string `protobuf:"bytes,2,rep,name=cmdline,proto3" json:"cmdline,omitempty"`
|
||||||
|
Pid int32 `protobuf:"varint,3,opt,name=pid,proto3" json:"pid,omitempty"`
|
||||||
|
Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"`
|
||||||
|
Revision string `protobuf:"bytes,5,opt,name=revision,proto3" json:"revision,omitempty"`
|
||||||
unknownFields protoimpl.UnknownFields
|
unknownFields protoimpl.UnknownFields
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
Frames []*Frame `protobuf:"bytes,1,rep,name=frames,proto3" json:"frames,omitempty"`
|
|
||||||
Cmdline []string `protobuf:"bytes,2,rep,name=cmdline,proto3" json:"cmdline,omitempty"`
|
|
||||||
Pid int32 `protobuf:"varint,3,opt,name=pid,proto3" json:"pid,omitempty"`
|
|
||||||
Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"`
|
|
||||||
Revision string `protobuf:"bytes,5,opt,name=revision,proto3" json:"revision,omitempty"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *Stack) Reset() {
|
func (x *Stack) Reset() {
|
||||||
@@ -98,13 +98,12 @@ func (x *Stack) GetRevision() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Frame struct {
|
type Frame struct {
|
||||||
state protoimpl.MessageState
|
state protoimpl.MessageState `protogen:"open.v1"`
|
||||||
sizeCache protoimpl.SizeCache
|
Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"`
|
||||||
|
File string `protobuf:"bytes,2,opt,name=File,proto3" json:"File,omitempty"`
|
||||||
|
Line int32 `protobuf:"varint,3,opt,name=Line,proto3" json:"Line,omitempty"`
|
||||||
unknownFields protoimpl.UnknownFields
|
unknownFields protoimpl.UnknownFields
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"`
|
|
||||||
File string `protobuf:"bytes,2,opt,name=File,proto3" json:"File,omitempty"`
|
|
||||||
Line int32 `protobuf:"varint,3,opt,name=Line,proto3" json:"Line,omitempty"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *Frame) Reset() {
|
func (x *Frame) Reset() {
|
||||||
@@ -160,37 +159,28 @@ func (x *Frame) GetLine() int32 {
|
|||||||
|
|
||||||
var File_github_com_moby_buildkit_util_stack_stack_proto protoreflect.FileDescriptor
|
var File_github_com_moby_buildkit_util_stack_stack_proto protoreflect.FileDescriptor
|
||||||
|
|
||||||
var file_github_com_moby_buildkit_util_stack_stack_proto_rawDesc = []byte{
|
const file_github_com_moby_buildkit_util_stack_stack_proto_rawDesc = "" +
|
||||||
0x0a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x6f, 0x62,
|
"\n" +
|
||||||
0x79, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x6b, 0x69, 0x74, 0x2f, 0x75, 0x74, 0x69, 0x6c, 0x2f,
|
"/github.com/moby/buildkit/util/stack/stack.proto\x12\x05stack\"\x8f\x01\n" +
|
||||||
0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74,
|
"\x05Stack\x12$\n" +
|
||||||
0x6f, 0x12, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0x8f, 0x01, 0x0a, 0x05, 0x53, 0x74, 0x61,
|
"\x06frames\x18\x01 \x03(\v2\f.stack.FrameR\x06frames\x12\x18\n" +
|
||||||
0x63, 0x6b, 0x12, 0x24, 0x0a, 0x06, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03,
|
"\acmdline\x18\x02 \x03(\tR\acmdline\x12\x10\n" +
|
||||||
0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x46, 0x72, 0x61, 0x6d, 0x65,
|
"\x03pid\x18\x03 \x01(\x05R\x03pid\x12\x18\n" +
|
||||||
0x52, 0x06, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6d, 0x64, 0x6c,
|
"\aversion\x18\x04 \x01(\tR\aversion\x12\x1a\n" +
|
||||||
0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6d, 0x64, 0x6c, 0x69,
|
"\brevision\x18\x05 \x01(\tR\brevision\"C\n" +
|
||||||
0x6e, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52,
|
"\x05Frame\x12\x12\n" +
|
||||||
0x03, 0x70, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18,
|
"\x04Name\x18\x01 \x01(\tR\x04Name\x12\x12\n" +
|
||||||
0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a,
|
"\x04File\x18\x02 \x01(\tR\x04File\x12\x12\n" +
|
||||||
0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,
|
"\x04Line\x18\x03 \x01(\x05R\x04LineB%Z#github.com/moby/buildkit/util/stackb\x06proto3"
|
||||||
0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x05, 0x46, 0x72,
|
|
||||||
0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
|
|
||||||
0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18,
|
|
||||||
0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4c,
|
|
||||||
0x69, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x4c, 0x69, 0x6e, 0x65, 0x42,
|
|
||||||
0x25, 0x5a, 0x23, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x6f,
|
|
||||||
0x62, 0x79, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x6b, 0x69, 0x74, 0x2f, 0x75, 0x74, 0x69, 0x6c,
|
|
||||||
0x2f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
file_github_com_moby_buildkit_util_stack_stack_proto_rawDescOnce sync.Once
|
file_github_com_moby_buildkit_util_stack_stack_proto_rawDescOnce sync.Once
|
||||||
file_github_com_moby_buildkit_util_stack_stack_proto_rawDescData = file_github_com_moby_buildkit_util_stack_stack_proto_rawDesc
|
file_github_com_moby_buildkit_util_stack_stack_proto_rawDescData []byte
|
||||||
)
|
)
|
||||||
|
|
||||||
func file_github_com_moby_buildkit_util_stack_stack_proto_rawDescGZIP() []byte {
|
func file_github_com_moby_buildkit_util_stack_stack_proto_rawDescGZIP() []byte {
|
||||||
file_github_com_moby_buildkit_util_stack_stack_proto_rawDescOnce.Do(func() {
|
file_github_com_moby_buildkit_util_stack_stack_proto_rawDescOnce.Do(func() {
|
||||||
file_github_com_moby_buildkit_util_stack_stack_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_moby_buildkit_util_stack_stack_proto_rawDescData)
|
file_github_com_moby_buildkit_util_stack_stack_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_github_com_moby_buildkit_util_stack_stack_proto_rawDesc), len(file_github_com_moby_buildkit_util_stack_stack_proto_rawDesc)))
|
||||||
})
|
})
|
||||||
return file_github_com_moby_buildkit_util_stack_stack_proto_rawDescData
|
return file_github_com_moby_buildkit_util_stack_stack_proto_rawDescData
|
||||||
}
|
}
|
||||||
@@ -218,7 +208,7 @@ func file_github_com_moby_buildkit_util_stack_stack_proto_init() {
|
|||||||
out := protoimpl.TypeBuilder{
|
out := protoimpl.TypeBuilder{
|
||||||
File: protoimpl.DescBuilder{
|
File: protoimpl.DescBuilder{
|
||||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||||
RawDescriptor: file_github_com_moby_buildkit_util_stack_stack_proto_rawDesc,
|
RawDescriptor: unsafe.Slice(unsafe.StringData(file_github_com_moby_buildkit_util_stack_stack_proto_rawDesc), len(file_github_com_moby_buildkit_util_stack_stack_proto_rawDesc)),
|
||||||
NumEnums: 0,
|
NumEnums: 0,
|
||||||
NumMessages: 2,
|
NumMessages: 2,
|
||||||
NumExtensions: 0,
|
NumExtensions: 0,
|
||||||
@@ -229,7 +219,6 @@ func file_github_com_moby_buildkit_util_stack_stack_proto_init() {
|
|||||||
MessageInfos: file_github_com_moby_buildkit_util_stack_stack_proto_msgTypes,
|
MessageInfos: file_github_com_moby_buildkit_util_stack_stack_proto_msgTypes,
|
||||||
}.Build()
|
}.Build()
|
||||||
File_github_com_moby_buildkit_util_stack_stack_proto = out.File
|
File_github_com_moby_buildkit_util_stack_stack_proto = out.File
|
||||||
file_github_com_moby_buildkit_util_stack_stack_proto_rawDesc = nil
|
|
||||||
file_github_com_moby_buildkit_util_stack_stack_proto_goTypes = nil
|
file_github_com_moby_buildkit_util_stack_stack_proto_goTypes = nil
|
||||||
file_github_com_moby_buildkit_util_stack_stack_proto_depIdxs = nil
|
file_github_com_moby_buildkit_util_stack_stack_proto_depIdxs = nil
|
||||||
}
|
}
|
||||||
|
|||||||
141
vendor/github.com/moby/sys/user/idtools.go
generated
vendored
Normal file
141
vendor/github.com/moby/sys/user/idtools.go
generated
vendored
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
package user
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// MkdirOpt is a type for options to pass to Mkdir calls
|
||||||
|
type MkdirOpt func(*mkdirOptions)
|
||||||
|
|
||||||
|
type mkdirOptions struct {
|
||||||
|
onlyNew bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithOnlyNew is an option for MkdirAllAndChown that will only change ownership and permissions
|
||||||
|
// on newly created directories. If the directory already exists, it will not be modified
|
||||||
|
func WithOnlyNew(o *mkdirOptions) {
|
||||||
|
o.onlyNew = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// MkdirAllAndChown creates a directory (include any along the path) and then modifies
|
||||||
|
// ownership to the requested uid/gid. By default, if the directory already exists, this
|
||||||
|
// function will still change ownership and permissions. If WithOnlyNew is passed as an
|
||||||
|
// option, then only the newly created directories will have ownership and permissions changed.
|
||||||
|
func MkdirAllAndChown(path string, mode os.FileMode, uid, gid int, opts ...MkdirOpt) error {
|
||||||
|
var options mkdirOptions
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(&options)
|
||||||
|
}
|
||||||
|
|
||||||
|
return mkdirAs(path, mode, uid, gid, true, options.onlyNew)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MkdirAndChown creates a directory and then modifies ownership to the requested uid/gid.
|
||||||
|
// By default, if the directory already exists, this function still changes ownership and permissions.
|
||||||
|
// If WithOnlyNew is passed as an option, then only the newly created directory will have ownership
|
||||||
|
// and permissions changed.
|
||||||
|
// Note that unlike os.Mkdir(), this function does not return IsExist error
|
||||||
|
// in case path already exists.
|
||||||
|
func MkdirAndChown(path string, mode os.FileMode, uid, gid int, opts ...MkdirOpt) error {
|
||||||
|
var options mkdirOptions
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(&options)
|
||||||
|
}
|
||||||
|
return mkdirAs(path, mode, uid, gid, false, options.onlyNew)
|
||||||
|
}
|
||||||
|
|
||||||
|
// getRootUIDGID retrieves the remapped root uid/gid pair from the set of maps.
|
||||||
|
// If the maps are empty, then the root uid/gid will default to "real" 0/0
|
||||||
|
func getRootUIDGID(uidMap, gidMap []IDMap) (int, int, error) {
|
||||||
|
uid, err := toHost(0, uidMap)
|
||||||
|
if err != nil {
|
||||||
|
return -1, -1, err
|
||||||
|
}
|
||||||
|
gid, err := toHost(0, gidMap)
|
||||||
|
if err != nil {
|
||||||
|
return -1, -1, err
|
||||||
|
}
|
||||||
|
return uid, gid, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// toContainer takes an id mapping, and uses it to translate a
|
||||||
|
// host ID to the remapped ID. If no map is provided, then the translation
|
||||||
|
// assumes a 1-to-1 mapping and returns the passed in id
|
||||||
|
func toContainer(hostID int, idMap []IDMap) (int, error) {
|
||||||
|
if idMap == nil {
|
||||||
|
return hostID, nil
|
||||||
|
}
|
||||||
|
for _, m := range idMap {
|
||||||
|
if (int64(hostID) >= m.ParentID) && (int64(hostID) <= (m.ParentID + m.Count - 1)) {
|
||||||
|
contID := int(m.ID + (int64(hostID) - m.ParentID))
|
||||||
|
return contID, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1, fmt.Errorf("host ID %d cannot be mapped to a container ID", hostID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// toHost takes an id mapping and a remapped ID, and translates the
|
||||||
|
// ID to the mapped host ID. If no map is provided, then the translation
|
||||||
|
// assumes a 1-to-1 mapping and returns the passed in id #
|
||||||
|
func toHost(contID int, idMap []IDMap) (int, error) {
|
||||||
|
if idMap == nil {
|
||||||
|
return contID, nil
|
||||||
|
}
|
||||||
|
for _, m := range idMap {
|
||||||
|
if (int64(contID) >= m.ID) && (int64(contID) <= (m.ID + m.Count - 1)) {
|
||||||
|
hostID := int(m.ParentID + (int64(contID) - m.ID))
|
||||||
|
return hostID, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1, fmt.Errorf("container ID %d cannot be mapped to a host ID", contID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IdentityMapping contains a mappings of UIDs and GIDs.
|
||||||
|
// The zero value represents an empty mapping.
|
||||||
|
type IdentityMapping struct {
|
||||||
|
UIDMaps []IDMap `json:"UIDMaps"`
|
||||||
|
GIDMaps []IDMap `json:"GIDMaps"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// RootPair returns a uid and gid pair for the root user. The error is ignored
|
||||||
|
// because a root user always exists, and the defaults are correct when the uid
|
||||||
|
// and gid maps are empty.
|
||||||
|
func (i IdentityMapping) RootPair() (int, int) {
|
||||||
|
uid, gid, _ := getRootUIDGID(i.UIDMaps, i.GIDMaps)
|
||||||
|
return uid, gid
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToHost returns the host UID and GID for the container uid, gid.
|
||||||
|
// Remapping is only performed if the ids aren't already the remapped root ids
|
||||||
|
func (i IdentityMapping) ToHost(uid, gid int) (int, int, error) {
|
||||||
|
var err error
|
||||||
|
ruid, rgid := i.RootPair()
|
||||||
|
|
||||||
|
if uid != ruid {
|
||||||
|
ruid, err = toHost(uid, i.UIDMaps)
|
||||||
|
if err != nil {
|
||||||
|
return ruid, rgid, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if gid != rgid {
|
||||||
|
rgid, err = toHost(gid, i.GIDMaps)
|
||||||
|
}
|
||||||
|
return ruid, rgid, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToContainer returns the container UID and GID for the host uid and gid
|
||||||
|
func (i IdentityMapping) ToContainer(uid, gid int) (int, int, error) {
|
||||||
|
ruid, err := toContainer(uid, i.UIDMaps)
|
||||||
|
if err != nil {
|
||||||
|
return -1, -1, err
|
||||||
|
}
|
||||||
|
rgid, err := toContainer(gid, i.GIDMaps)
|
||||||
|
return ruid, rgid, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Empty returns true if there are no id mappings
|
||||||
|
func (i IdentityMapping) Empty() bool {
|
||||||
|
return len(i.UIDMaps) == 0 && len(i.GIDMaps) == 0
|
||||||
|
}
|
||||||
143
vendor/github.com/moby/sys/user/idtools_unix.go
generated
vendored
Normal file
143
vendor/github.com/moby/sys/user/idtools_unix.go
generated
vendored
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
//go:build !windows
|
||||||
|
|
||||||
|
package user
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strconv"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
func mkdirAs(path string, mode os.FileMode, uid, gid int, mkAll, onlyNew bool) error {
|
||||||
|
path, err := filepath.Abs(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
stat, err := os.Stat(path)
|
||||||
|
if err == nil {
|
||||||
|
if !stat.IsDir() {
|
||||||
|
return &os.PathError{Op: "mkdir", Path: path, Err: syscall.ENOTDIR}
|
||||||
|
}
|
||||||
|
if onlyNew {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// short-circuit -- we were called with an existing directory and chown was requested
|
||||||
|
return setPermissions(path, mode, uid, gid, stat)
|
||||||
|
}
|
||||||
|
|
||||||
|
// make an array containing the original path asked for, plus (for mkAll == true)
|
||||||
|
// all path components leading up to the complete path that don't exist before we MkdirAll
|
||||||
|
// so that we can chown all of them properly at the end. If onlyNew is true, we won't
|
||||||
|
// chown the full directory path if it exists
|
||||||
|
var paths []string
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
paths = append(paths, path)
|
||||||
|
}
|
||||||
|
|
||||||
|
if mkAll {
|
||||||
|
// walk back to "/" looking for directories which do not exist
|
||||||
|
// and add them to the paths array for chown after creation
|
||||||
|
dirPath := path
|
||||||
|
for {
|
||||||
|
dirPath = filepath.Dir(dirPath)
|
||||||
|
if dirPath == "/" {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if _, err = os.Stat(dirPath); os.IsNotExist(err) {
|
||||||
|
paths = append(paths, dirPath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err = os.MkdirAll(path, mode); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else if err = os.Mkdir(path, mode); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// even if it existed, we will chown the requested path + any subpaths that
|
||||||
|
// didn't exist when we called MkdirAll
|
||||||
|
for _, pathComponent := range paths {
|
||||||
|
if err = setPermissions(pathComponent, mode, uid, gid, nil); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// setPermissions performs a chown/chmod only if the uid/gid don't match what's requested
|
||||||
|
// Normally a Chown is a no-op if uid/gid match, but in some cases this can still cause an error, e.g. if the
|
||||||
|
// dir is on an NFS share, so don't call chown unless we absolutely must.
|
||||||
|
// Likewise for setting permissions.
|
||||||
|
func setPermissions(p string, mode os.FileMode, uid, gid int, stat os.FileInfo) error {
|
||||||
|
if stat == nil {
|
||||||
|
var err error
|
||||||
|
stat, err = os.Stat(p)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if stat.Mode().Perm() != mode.Perm() {
|
||||||
|
if err := os.Chmod(p, mode.Perm()); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ssi := stat.Sys().(*syscall.Stat_t)
|
||||||
|
if ssi.Uid == uint32(uid) && ssi.Gid == uint32(gid) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return os.Chown(p, uid, gid)
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadIdentityMapping takes a requested username and
|
||||||
|
// using the data from /etc/sub{uid,gid} ranges, creates the
|
||||||
|
// proper uid and gid remapping ranges for that user/group pair
|
||||||
|
func LoadIdentityMapping(name string) (IdentityMapping, error) {
|
||||||
|
// TODO: Consider adding support for calling out to "getent"
|
||||||
|
usr, err := LookupUser(name)
|
||||||
|
if err != nil {
|
||||||
|
return IdentityMapping{}, fmt.Errorf("could not get user for username %s: %w", name, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
subuidRanges, err := lookupSubRangesFile("/etc/subuid", usr)
|
||||||
|
if err != nil {
|
||||||
|
return IdentityMapping{}, err
|
||||||
|
}
|
||||||
|
subgidRanges, err := lookupSubRangesFile("/etc/subgid", usr)
|
||||||
|
if err != nil {
|
||||||
|
return IdentityMapping{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return IdentityMapping{
|
||||||
|
UIDMaps: subuidRanges,
|
||||||
|
GIDMaps: subgidRanges,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func lookupSubRangesFile(path string, usr User) ([]IDMap, error) {
|
||||||
|
uidstr := strconv.Itoa(usr.Uid)
|
||||||
|
rangeList, err := ParseSubIDFileFilter(path, func(sid SubID) bool {
|
||||||
|
return sid.Name == usr.Name || sid.Name == uidstr
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if len(rangeList) == 0 {
|
||||||
|
return nil, fmt.Errorf("no subuid ranges found for user %q", usr.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
idMap := []IDMap{}
|
||||||
|
|
||||||
|
var containerID int64
|
||||||
|
for _, idrange := range rangeList {
|
||||||
|
idMap = append(idMap, IDMap{
|
||||||
|
ID: containerID,
|
||||||
|
ParentID: idrange.SubID,
|
||||||
|
Count: idrange.Count,
|
||||||
|
})
|
||||||
|
containerID = containerID + idrange.Count
|
||||||
|
}
|
||||||
|
return idMap, nil
|
||||||
|
}
|
||||||
13
vendor/github.com/moby/sys/user/idtools_windows.go
generated
vendored
Normal file
13
vendor/github.com/moby/sys/user/idtools_windows.go
generated
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
package user
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// This is currently a wrapper around [os.MkdirAll] since currently
|
||||||
|
// permissions aren't set through this path, the identity isn't utilized.
|
||||||
|
// Ownership is handled elsewhere, but in the future could be support here
|
||||||
|
// too.
|
||||||
|
func mkdirAs(path string, _ os.FileMode, _, _ int, _, _ bool) error {
|
||||||
|
return os.MkdirAll(path, 0)
|
||||||
|
}
|
||||||
68
vendor/github.com/opencontainers/runtime-spec/specs-go/config.go
generated
vendored
68
vendor/github.com/opencontainers/runtime-spec/specs-go/config.go
generated
vendored
@@ -83,7 +83,7 @@ type Process struct {
|
|||||||
// Rlimits specifies rlimit options to apply to the process.
|
// Rlimits specifies rlimit options to apply to the process.
|
||||||
Rlimits []POSIXRlimit `json:"rlimits,omitempty" platform:"linux,solaris,zos"`
|
Rlimits []POSIXRlimit `json:"rlimits,omitempty" platform:"linux,solaris,zos"`
|
||||||
// NoNewPrivileges controls whether additional privileges could be gained by processes in the container.
|
// NoNewPrivileges controls whether additional privileges could be gained by processes in the container.
|
||||||
NoNewPrivileges bool `json:"noNewPrivileges,omitempty" platform:"linux"`
|
NoNewPrivileges bool `json:"noNewPrivileges,omitempty" platform:"linux,zos"`
|
||||||
// ApparmorProfile specifies the apparmor profile for the container.
|
// ApparmorProfile specifies the apparmor profile for the container.
|
||||||
ApparmorProfile string `json:"apparmorProfile,omitempty" platform:"linux"`
|
ApparmorProfile string `json:"apparmorProfile,omitempty" platform:"linux"`
|
||||||
// Specify an oom_score_adj for the container.
|
// Specify an oom_score_adj for the container.
|
||||||
@@ -94,10 +94,12 @@ type Process struct {
|
|||||||
SelinuxLabel string `json:"selinuxLabel,omitempty" platform:"linux"`
|
SelinuxLabel string `json:"selinuxLabel,omitempty" platform:"linux"`
|
||||||
// IOPriority contains the I/O priority settings for the cgroup.
|
// IOPriority contains the I/O priority settings for the cgroup.
|
||||||
IOPriority *LinuxIOPriority `json:"ioPriority,omitempty" platform:"linux"`
|
IOPriority *LinuxIOPriority `json:"ioPriority,omitempty" platform:"linux"`
|
||||||
|
// ExecCPUAffinity specifies CPU affinity for exec processes.
|
||||||
|
ExecCPUAffinity *CPUAffinity `json:"execCPUAffinity,omitempty" platform:"linux"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// LinuxCapabilities specifies the list of allowed capabilities that are kept for a process.
|
// LinuxCapabilities specifies the list of allowed capabilities that are kept for a process.
|
||||||
// http://man7.org/linux/man-pages/man7/capabilities.7.html
|
// https://man7.org/linux/man-pages/man7/capabilities.7.html
|
||||||
type LinuxCapabilities struct {
|
type LinuxCapabilities struct {
|
||||||
// Bounding is the set of capabilities checked by the kernel.
|
// Bounding is the set of capabilities checked by the kernel.
|
||||||
Bounding []string `json:"bounding,omitempty" platform:"linux"`
|
Bounding []string `json:"bounding,omitempty" platform:"linux"`
|
||||||
@@ -127,6 +129,12 @@ const (
|
|||||||
IOPRIO_CLASS_IDLE IOPriorityClass = "IOPRIO_CLASS_IDLE"
|
IOPRIO_CLASS_IDLE IOPriorityClass = "IOPRIO_CLASS_IDLE"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// CPUAffinity specifies process' CPU affinity.
|
||||||
|
type CPUAffinity struct {
|
||||||
|
Initial string `json:"initial,omitempty"`
|
||||||
|
Final string `json:"final,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
// Box specifies dimensions of a rectangle. Used for specifying the size of a console.
|
// Box specifies dimensions of a rectangle. Used for specifying the size of a console.
|
||||||
type Box struct {
|
type Box struct {
|
||||||
// Height is the vertical dimension of a box.
|
// Height is the vertical dimension of a box.
|
||||||
@@ -627,6 +635,17 @@ type WindowsCPUResources struct {
|
|||||||
// cycles per 10,000 cycles. Set processor `maximum` to a percentage times
|
// cycles per 10,000 cycles. Set processor `maximum` to a percentage times
|
||||||
// 100.
|
// 100.
|
||||||
Maximum *uint16 `json:"maximum,omitempty"`
|
Maximum *uint16 `json:"maximum,omitempty"`
|
||||||
|
// Set of CPUs to affinitize for this container.
|
||||||
|
Affinity []WindowsCPUGroupAffinity `json:"affinity,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Similar to _GROUP_AFFINITY struct defined in
|
||||||
|
// https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/miniport/ns-miniport-_group_affinity
|
||||||
|
type WindowsCPUGroupAffinity struct {
|
||||||
|
// CPU mask relative to this CPU group.
|
||||||
|
Mask uint64 `json:"mask,omitempty"`
|
||||||
|
// Processor group the mask refers to, as returned by GetLogicalProcessorInformationEx.
|
||||||
|
Group uint32 `json:"group,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// WindowsStorageResources contains storage resource management settings.
|
// WindowsStorageResources contains storage resource management settings.
|
||||||
@@ -751,6 +770,10 @@ const (
|
|||||||
ArchPARISC Arch = "SCMP_ARCH_PARISC"
|
ArchPARISC Arch = "SCMP_ARCH_PARISC"
|
||||||
ArchPARISC64 Arch = "SCMP_ARCH_PARISC64"
|
ArchPARISC64 Arch = "SCMP_ARCH_PARISC64"
|
||||||
ArchRISCV64 Arch = "SCMP_ARCH_RISCV64"
|
ArchRISCV64 Arch = "SCMP_ARCH_RISCV64"
|
||||||
|
ArchLOONGARCH64 Arch = "SCMP_ARCH_LOONGARCH64"
|
||||||
|
ArchM68K Arch = "SCMP_ARCH_M68K"
|
||||||
|
ArchSH Arch = "SCMP_ARCH_SH"
|
||||||
|
ArchSHEB Arch = "SCMP_ARCH_SHEB"
|
||||||
)
|
)
|
||||||
|
|
||||||
// LinuxSeccompAction taken upon Seccomp rule match
|
// LinuxSeccompAction taken upon Seccomp rule match
|
||||||
@@ -826,28 +849,33 @@ type LinuxIntelRdt struct {
|
|||||||
|
|
||||||
// ZOS contains platform-specific configuration for z/OS based containers.
|
// ZOS contains platform-specific configuration for z/OS based containers.
|
||||||
type ZOS struct {
|
type ZOS struct {
|
||||||
// Devices are a list of device nodes that are created for the container
|
// Namespaces contains the namespaces that are created and/or joined by the container
|
||||||
Devices []ZOSDevice `json:"devices,omitempty"`
|
Namespaces []ZOSNamespace `json:"namespaces,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ZOSDevice represents the mknod information for a z/OS special device file
|
// ZOSNamespace is the configuration for a z/OS namespace
|
||||||
type ZOSDevice struct {
|
type ZOSNamespace struct {
|
||||||
// Path to the device.
|
// Type is the type of namespace
|
||||||
Path string `json:"path"`
|
Type ZOSNamespaceType `json:"type"`
|
||||||
// Device type, block, char, etc.
|
// Path is a path to an existing namespace persisted on disk that can be joined
|
||||||
Type string `json:"type"`
|
// and is of the same type
|
||||||
// Major is the device's major number.
|
Path string `json:"path,omitempty"`
|
||||||
Major int64 `json:"major"`
|
|
||||||
// Minor is the device's minor number.
|
|
||||||
Minor int64 `json:"minor"`
|
|
||||||
// FileMode permission bits for the device.
|
|
||||||
FileMode *os.FileMode `json:"fileMode,omitempty"`
|
|
||||||
// UID of the device.
|
|
||||||
UID *uint32 `json:"uid,omitempty"`
|
|
||||||
// Gid of the device.
|
|
||||||
GID *uint32 `json:"gid,omitempty"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ZOSNamespaceType is one of the z/OS namespaces
|
||||||
|
type ZOSNamespaceType string
|
||||||
|
|
||||||
|
const (
|
||||||
|
// PIDNamespace for isolating process IDs
|
||||||
|
ZOSPIDNamespace ZOSNamespaceType = "pid"
|
||||||
|
// MountNamespace for isolating mount points
|
||||||
|
ZOSMountNamespace ZOSNamespaceType = "mount"
|
||||||
|
// IPCNamespace for isolating System V IPC, POSIX message queues
|
||||||
|
ZOSIPCNamespace ZOSNamespaceType = "ipc"
|
||||||
|
// UTSNamespace for isolating hostname and NIS domain name
|
||||||
|
ZOSUTSNamespace ZOSNamespaceType = "uts"
|
||||||
|
)
|
||||||
|
|
||||||
// LinuxSchedulerPolicy represents different scheduling policies used with the Linux Scheduler
|
// LinuxSchedulerPolicy represents different scheduling policies used with the Linux Scheduler
|
||||||
type LinuxSchedulerPolicy string
|
type LinuxSchedulerPolicy string
|
||||||
|
|
||||||
|
|||||||
2
vendor/github.com/opencontainers/runtime-spec/specs-go/version.go
generated
vendored
2
vendor/github.com/opencontainers/runtime-spec/specs-go/version.go
generated
vendored
@@ -8,7 +8,7 @@ const (
|
|||||||
// VersionMinor is for functionality in a backwards-compatible manner
|
// VersionMinor is for functionality in a backwards-compatible manner
|
||||||
VersionMinor = 2
|
VersionMinor = 2
|
||||||
// VersionPatch is for backwards-compatible bug fixes
|
// VersionPatch is for backwards-compatible bug fixes
|
||||||
VersionPatch = 0
|
VersionPatch = 1
|
||||||
|
|
||||||
// VersionDev indicates development branch. Releases will be empty string.
|
// VersionDev indicates development branch. Releases will be empty string.
|
||||||
VersionDev = ""
|
VersionDev = ""
|
||||||
|
|||||||
2
vendor/github.com/tonistiigi/go-csvvalue/Dockerfile
generated
vendored
2
vendor/github.com/tonistiigi/go-csvvalue/Dockerfile
generated
vendored
@@ -1,7 +1,7 @@
|
|||||||
#syntax=docker/dockerfile:1.8
|
#syntax=docker/dockerfile:1.8
|
||||||
#check=error=true
|
#check=error=true
|
||||||
|
|
||||||
ARG GO_VERSION=1.22
|
ARG GO_VERSION=1.23
|
||||||
ARG XX_VERSION=1.4.0
|
ARG XX_VERSION=1.4.0
|
||||||
|
|
||||||
ARG COVER_FILENAME="cover.out"
|
ARG COVER_FILENAME="cover.out"
|
||||||
|
|||||||
6
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/client.go
generated
vendored
6
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/client.go
generated
vendored
@@ -18,7 +18,7 @@ var DefaultClient = &http.Client{Transport: NewTransport(http.DefaultTransport)}
|
|||||||
|
|
||||||
// Get is a convenient replacement for http.Get that adds a span around the request.
|
// Get is a convenient replacement for http.Get that adds a span around the request.
|
||||||
func Get(ctx context.Context, targetURL string) (resp *http.Response, err error) {
|
func Get(ctx context.Context, targetURL string) (resp *http.Response, err error) {
|
||||||
req, err := http.NewRequestWithContext(ctx, "GET", targetURL, nil)
|
req, err := http.NewRequestWithContext(ctx, http.MethodGet, targetURL, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -27,7 +27,7 @@ func Get(ctx context.Context, targetURL string) (resp *http.Response, err error)
|
|||||||
|
|
||||||
// Head is a convenient replacement for http.Head that adds a span around the request.
|
// Head is a convenient replacement for http.Head that adds a span around the request.
|
||||||
func Head(ctx context.Context, targetURL string) (resp *http.Response, err error) {
|
func Head(ctx context.Context, targetURL string) (resp *http.Response, err error) {
|
||||||
req, err := http.NewRequestWithContext(ctx, "HEAD", targetURL, nil)
|
req, err := http.NewRequestWithContext(ctx, http.MethodHead, targetURL, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -36,7 +36,7 @@ func Head(ctx context.Context, targetURL string) (resp *http.Response, err error
|
|||||||
|
|
||||||
// Post is a convenient replacement for http.Post that adds a span around the request.
|
// Post is a convenient replacement for http.Post that adds a span around the request.
|
||||||
func Post(ctx context.Context, targetURL, contentType string, body io.Reader) (resp *http.Response, err error) {
|
func Post(ctx context.Context, targetURL, contentType string, body io.Reader) (resp *http.Response, err error) {
|
||||||
req, err := http.NewRequestWithContext(ctx, "POST", targetURL, body)
|
req, err := http.NewRequestWithContext(ctx, http.MethodPost, targetURL, body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
14
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/common.go
generated
vendored
14
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/common.go
generated
vendored
@@ -18,20 +18,6 @@ const (
|
|||||||
WriteErrorKey = attribute.Key("http.write_error") // if an error occurred while writing a reply, the string of the error (io.EOF is not recorded)
|
WriteErrorKey = attribute.Key("http.write_error") // if an error occurred while writing a reply, the string of the error (io.EOF is not recorded)
|
||||||
)
|
)
|
||||||
|
|
||||||
// Server HTTP metrics.
|
|
||||||
const (
|
|
||||||
serverRequestSize = "http.server.request.size" // Incoming request bytes total
|
|
||||||
serverResponseSize = "http.server.response.size" // Incoming response bytes total
|
|
||||||
serverDuration = "http.server.duration" // Incoming end to end duration, milliseconds
|
|
||||||
)
|
|
||||||
|
|
||||||
// Client HTTP metrics.
|
|
||||||
const (
|
|
||||||
clientRequestSize = "http.client.request.size" // Outgoing request bytes total
|
|
||||||
clientResponseSize = "http.client.response.size" // Outgoing response bytes total
|
|
||||||
clientDuration = "http.client.duration" // Outgoing end to end duration, milliseconds
|
|
||||||
)
|
|
||||||
|
|
||||||
// Filter is a predicate used to determine whether a given http.request should
|
// Filter is a predicate used to determine whether a given http.request should
|
||||||
// be traced. A Filter must return true if the request should be traced.
|
// be traced. A Filter must return true if the request should be traced.
|
||||||
type Filter func(*http.Request) bool
|
type Filter func(*http.Request) bool
|
||||||
|
|||||||
15
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/config.go
generated
vendored
15
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/config.go
generated
vendored
@@ -8,6 +8,8 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptrace"
|
"net/http/httptrace"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/attribute"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
"go.opentelemetry.io/otel/metric"
|
"go.opentelemetry.io/otel/metric"
|
||||||
"go.opentelemetry.io/otel/propagation"
|
"go.opentelemetry.io/otel/propagation"
|
||||||
@@ -33,8 +35,9 @@ type config struct {
|
|||||||
SpanNameFormatter func(string, *http.Request) string
|
SpanNameFormatter func(string, *http.Request) string
|
||||||
ClientTrace func(context.Context) *httptrace.ClientTrace
|
ClientTrace func(context.Context) *httptrace.ClientTrace
|
||||||
|
|
||||||
TracerProvider trace.TracerProvider
|
TracerProvider trace.TracerProvider
|
||||||
MeterProvider metric.MeterProvider
|
MeterProvider metric.MeterProvider
|
||||||
|
MetricAttributesFn func(*http.Request) []attribute.KeyValue
|
||||||
}
|
}
|
||||||
|
|
||||||
// Option interface used for setting optional config properties.
|
// Option interface used for setting optional config properties.
|
||||||
@@ -194,3 +197,11 @@ func WithServerName(server string) Option {
|
|||||||
c.ServerName = server
|
c.ServerName = server
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithMetricAttributesFn returns an Option to set a function that maps an HTTP request to a slice of attribute.KeyValue.
|
||||||
|
// These attributes will be included in metrics for every request.
|
||||||
|
func WithMetricAttributesFn(metricAttributesFn func(r *http.Request) []attribute.KeyValue) Option {
|
||||||
|
return optionFunc(func(c *config) {
|
||||||
|
c.MetricAttributesFn = metricAttributesFn
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
137
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/handler.go
generated
vendored
137
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/handler.go
generated
vendored
@@ -9,11 +9,10 @@ import (
|
|||||||
|
|
||||||
"github.com/felixge/httpsnoop"
|
"github.com/felixge/httpsnoop"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/request"
|
||||||
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv"
|
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv"
|
||||||
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil"
|
|
||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/metric"
|
|
||||||
"go.opentelemetry.io/otel/propagation"
|
"go.opentelemetry.io/otel/propagation"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
@@ -23,21 +22,18 @@ type middleware struct {
|
|||||||
operation string
|
operation string
|
||||||
server string
|
server string
|
||||||
|
|
||||||
tracer trace.Tracer
|
tracer trace.Tracer
|
||||||
meter metric.Meter
|
propagators propagation.TextMapPropagator
|
||||||
propagators propagation.TextMapPropagator
|
spanStartOptions []trace.SpanStartOption
|
||||||
spanStartOptions []trace.SpanStartOption
|
readEvent bool
|
||||||
readEvent bool
|
writeEvent bool
|
||||||
writeEvent bool
|
filters []Filter
|
||||||
filters []Filter
|
spanNameFormatter func(string, *http.Request) string
|
||||||
spanNameFormatter func(string, *http.Request) string
|
publicEndpoint bool
|
||||||
publicEndpoint bool
|
publicEndpointFn func(*http.Request) bool
|
||||||
publicEndpointFn func(*http.Request) bool
|
metricAttributesFn func(*http.Request) []attribute.KeyValue
|
||||||
|
|
||||||
traceSemconv semconv.HTTPServer
|
semconv semconv.HTTPServer
|
||||||
requestBytesCounter metric.Int64Counter
|
|
||||||
responseBytesCounter metric.Int64Counter
|
|
||||||
serverLatencyMeasure metric.Float64Histogram
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func defaultHandlerFormatter(operation string, _ *http.Request) string {
|
func defaultHandlerFormatter(operation string, _ *http.Request) string {
|
||||||
@@ -56,8 +52,6 @@ func NewHandler(handler http.Handler, operation string, opts ...Option) http.Han
|
|||||||
func NewMiddleware(operation string, opts ...Option) func(http.Handler) http.Handler {
|
func NewMiddleware(operation string, opts ...Option) func(http.Handler) http.Handler {
|
||||||
h := middleware{
|
h := middleware{
|
||||||
operation: operation,
|
operation: operation,
|
||||||
|
|
||||||
traceSemconv: semconv.NewHTTPServer(),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultOpts := []Option{
|
defaultOpts := []Option{
|
||||||
@@ -67,7 +61,6 @@ func NewMiddleware(operation string, opts ...Option) func(http.Handler) http.Han
|
|||||||
|
|
||||||
c := newConfig(append(defaultOpts, opts...)...)
|
c := newConfig(append(defaultOpts, opts...)...)
|
||||||
h.configure(c)
|
h.configure(c)
|
||||||
h.createMeasures()
|
|
||||||
|
|
||||||
return func(next http.Handler) http.Handler {
|
return func(next http.Handler) http.Handler {
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
@@ -78,7 +71,6 @@ func NewMiddleware(operation string, opts ...Option) func(http.Handler) http.Han
|
|||||||
|
|
||||||
func (h *middleware) configure(c *config) {
|
func (h *middleware) configure(c *config) {
|
||||||
h.tracer = c.Tracer
|
h.tracer = c.Tracer
|
||||||
h.meter = c.Meter
|
|
||||||
h.propagators = c.Propagators
|
h.propagators = c.Propagators
|
||||||
h.spanStartOptions = c.SpanStartOptions
|
h.spanStartOptions = c.SpanStartOptions
|
||||||
h.readEvent = c.ReadEvent
|
h.readEvent = c.ReadEvent
|
||||||
@@ -88,36 +80,8 @@ func (h *middleware) configure(c *config) {
|
|||||||
h.publicEndpoint = c.PublicEndpoint
|
h.publicEndpoint = c.PublicEndpoint
|
||||||
h.publicEndpointFn = c.PublicEndpointFn
|
h.publicEndpointFn = c.PublicEndpointFn
|
||||||
h.server = c.ServerName
|
h.server = c.ServerName
|
||||||
}
|
h.semconv = semconv.NewHTTPServer(c.Meter)
|
||||||
|
h.metricAttributesFn = c.MetricAttributesFn
|
||||||
func handleErr(err error) {
|
|
||||||
if err != nil {
|
|
||||||
otel.Handle(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *middleware) createMeasures() {
|
|
||||||
var err error
|
|
||||||
h.requestBytesCounter, err = h.meter.Int64Counter(
|
|
||||||
serverRequestSize,
|
|
||||||
metric.WithUnit("By"),
|
|
||||||
metric.WithDescription("Measures the size of HTTP request messages."),
|
|
||||||
)
|
|
||||||
handleErr(err)
|
|
||||||
|
|
||||||
h.responseBytesCounter, err = h.meter.Int64Counter(
|
|
||||||
serverResponseSize,
|
|
||||||
metric.WithUnit("By"),
|
|
||||||
metric.WithDescription("Measures the size of HTTP response messages."),
|
|
||||||
)
|
|
||||||
handleErr(err)
|
|
||||||
|
|
||||||
h.serverLatencyMeasure, err = h.meter.Float64Histogram(
|
|
||||||
serverDuration,
|
|
||||||
metric.WithUnit("ms"),
|
|
||||||
metric.WithDescription("Measures the duration of inbound HTTP requests."),
|
|
||||||
)
|
|
||||||
handleErr(err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// serveHTTP sets up tracing and calls the given next http.Handler with the span
|
// serveHTTP sets up tracing and calls the given next http.Handler with the span
|
||||||
@@ -134,7 +98,7 @@ func (h *middleware) serveHTTP(w http.ResponseWriter, r *http.Request, next http
|
|||||||
|
|
||||||
ctx := h.propagators.Extract(r.Context(), propagation.HeaderCarrier(r.Header))
|
ctx := h.propagators.Extract(r.Context(), propagation.HeaderCarrier(r.Header))
|
||||||
opts := []trace.SpanStartOption{
|
opts := []trace.SpanStartOption{
|
||||||
trace.WithAttributes(h.traceSemconv.RequestTraceAttrs(h.server, r)...),
|
trace.WithAttributes(h.semconv.RequestTraceAttrs(h.server, r)...),
|
||||||
}
|
}
|
||||||
|
|
||||||
opts = append(opts, h.spanStartOptions...)
|
opts = append(opts, h.spanStartOptions...)
|
||||||
@@ -156,6 +120,11 @@ func (h *middleware) serveHTTP(w http.ResponseWriter, r *http.Request, next http
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if startTime := StartTimeFromContext(ctx); !startTime.IsZero() {
|
||||||
|
opts = append(opts, trace.WithTimestamp(startTime))
|
||||||
|
requestStartTime = startTime
|
||||||
|
}
|
||||||
|
|
||||||
ctx, span := tracer.Start(ctx, h.spanNameFormatter(h.operation, r), opts...)
|
ctx, span := tracer.Start(ctx, h.spanNameFormatter(h.operation, r), opts...)
|
||||||
defer span.End()
|
defer span.End()
|
||||||
|
|
||||||
@@ -166,14 +135,12 @@ func (h *middleware) serveHTTP(w http.ResponseWriter, r *http.Request, next http
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var bw bodyWrapper
|
|
||||||
// if request body is nil or NoBody, we don't want to mutate the body as it
|
// if request body is nil or NoBody, we don't want to mutate the body as it
|
||||||
// will affect the identity of it in an unforeseeable way because we assert
|
// will affect the identity of it in an unforeseeable way because we assert
|
||||||
// ReadCloser fulfills a certain interface and it is indeed nil or NoBody.
|
// ReadCloser fulfills a certain interface and it is indeed nil or NoBody.
|
||||||
|
bw := request.NewBodyWrapper(r.Body, readRecordFunc)
|
||||||
if r.Body != nil && r.Body != http.NoBody {
|
if r.Body != nil && r.Body != http.NoBody {
|
||||||
bw.ReadCloser = r.Body
|
r.Body = bw
|
||||||
bw.record = readRecordFunc
|
|
||||||
r.Body = &bw
|
|
||||||
}
|
}
|
||||||
|
|
||||||
writeRecordFunc := func(int64) {}
|
writeRecordFunc := func(int64) {}
|
||||||
@@ -183,13 +150,7 @@ func (h *middleware) serveHTTP(w http.ResponseWriter, r *http.Request, next http
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rww := &respWriterWrapper{
|
rww := request.NewRespWriterWrapper(w, writeRecordFunc)
|
||||||
ResponseWriter: w,
|
|
||||||
record: writeRecordFunc,
|
|
||||||
ctx: ctx,
|
|
||||||
props: h.propagators,
|
|
||||||
statusCode: http.StatusOK, // default status code in case the Handler doesn't write anything
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wrap w to use our ResponseWriter methods while also exposing
|
// Wrap w to use our ResponseWriter methods while also exposing
|
||||||
// other interfaces that w may implement (http.CloseNotifier,
|
// other interfaces that w may implement (http.CloseNotifier,
|
||||||
@@ -217,35 +178,49 @@ func (h *middleware) serveHTTP(w http.ResponseWriter, r *http.Request, next http
|
|||||||
|
|
||||||
next.ServeHTTP(w, r.WithContext(ctx))
|
next.ServeHTTP(w, r.WithContext(ctx))
|
||||||
|
|
||||||
span.SetStatus(semconv.ServerStatus(rww.statusCode))
|
statusCode := rww.StatusCode()
|
||||||
span.SetAttributes(h.traceSemconv.ResponseTraceAttrs(semconv.ResponseTelemetry{
|
bytesWritten := rww.BytesWritten()
|
||||||
StatusCode: rww.statusCode,
|
span.SetStatus(h.semconv.Status(statusCode))
|
||||||
ReadBytes: bw.read.Load(),
|
span.SetAttributes(h.semconv.ResponseTraceAttrs(semconv.ResponseTelemetry{
|
||||||
ReadError: bw.err,
|
StatusCode: statusCode,
|
||||||
WriteBytes: rww.written,
|
ReadBytes: bw.BytesRead(),
|
||||||
WriteError: rww.err,
|
ReadError: bw.Error(),
|
||||||
|
WriteBytes: bytesWritten,
|
||||||
|
WriteError: rww.Error(),
|
||||||
})...)
|
})...)
|
||||||
|
|
||||||
// Add metrics
|
|
||||||
attributes := append(labeler.Get(), semconvutil.HTTPServerRequestMetrics(h.server, r)...)
|
|
||||||
if rww.statusCode > 0 {
|
|
||||||
attributes = append(attributes, semconv.HTTPStatusCode(rww.statusCode))
|
|
||||||
}
|
|
||||||
o := metric.WithAttributeSet(attribute.NewSet(attributes...))
|
|
||||||
addOpts := []metric.AddOption{o} // Allocate vararg slice once.
|
|
||||||
h.requestBytesCounter.Add(ctx, bw.read.Load(), addOpts...)
|
|
||||||
h.responseBytesCounter.Add(ctx, rww.written, addOpts...)
|
|
||||||
|
|
||||||
// Use floating point division here for higher precision (instead of Millisecond method).
|
// Use floating point division here for higher precision (instead of Millisecond method).
|
||||||
elapsedTime := float64(time.Since(requestStartTime)) / float64(time.Millisecond)
|
elapsedTime := float64(time.Since(requestStartTime)) / float64(time.Millisecond)
|
||||||
|
|
||||||
h.serverLatencyMeasure.Record(ctx, elapsedTime, o)
|
metricAttributes := semconv.MetricAttributes{
|
||||||
|
Req: r,
|
||||||
|
StatusCode: statusCode,
|
||||||
|
AdditionalAttributes: append(labeler.Get(), h.metricAttributesFromRequest(r)...),
|
||||||
|
}
|
||||||
|
|
||||||
|
h.semconv.RecordMetrics(ctx, semconv.ServerMetricData{
|
||||||
|
ServerName: h.server,
|
||||||
|
ResponseSize: bytesWritten,
|
||||||
|
MetricAttributes: metricAttributes,
|
||||||
|
MetricData: semconv.MetricData{
|
||||||
|
RequestSize: bw.BytesRead(),
|
||||||
|
ElapsedTime: elapsedTime,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *middleware) metricAttributesFromRequest(r *http.Request) []attribute.KeyValue {
|
||||||
|
var attributeForRequest []attribute.KeyValue
|
||||||
|
if h.metricAttributesFn != nil {
|
||||||
|
attributeForRequest = h.metricAttributesFn(r)
|
||||||
|
}
|
||||||
|
return attributeForRequest
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithRouteTag annotates spans and metrics with the provided route name
|
// WithRouteTag annotates spans and metrics with the provided route name
|
||||||
// with HTTP route attribute.
|
// with HTTP route attribute.
|
||||||
func WithRouteTag(route string, h http.Handler) http.Handler {
|
func WithRouteTag(route string, h http.Handler) http.Handler {
|
||||||
attr := semconv.NewHTTPServer().Route(route)
|
attr := semconv.NewHTTPServer(nil).Route(route)
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
span := trace.SpanFromContext(r.Context())
|
span := trace.SpanFromContext(r.Context())
|
||||||
span.SetAttributes(attr)
|
span.SetAttributes(attr)
|
||||||
|
|||||||
78
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/request/body_wrapper.go
generated
vendored
Normal file
78
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/request/body_wrapper.go
generated
vendored
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
// Code created by gotmpl. DO NOT MODIFY.
|
||||||
|
// source: internal/shared/request/body_wrapper.go.tmpl
|
||||||
|
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package request // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/request"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ io.ReadCloser = &BodyWrapper{}
|
||||||
|
|
||||||
|
// BodyWrapper wraps a http.Request.Body (an io.ReadCloser) to track the number
|
||||||
|
// of bytes read and the last error.
|
||||||
|
type BodyWrapper struct {
|
||||||
|
io.ReadCloser
|
||||||
|
OnRead func(n int64) // must not be nil
|
||||||
|
|
||||||
|
mu sync.Mutex
|
||||||
|
read int64
|
||||||
|
err error
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewBodyWrapper creates a new BodyWrapper.
|
||||||
|
//
|
||||||
|
// The onRead attribute is a callback that will be called every time the data
|
||||||
|
// is read, with the number of bytes being read.
|
||||||
|
func NewBodyWrapper(body io.ReadCloser, onRead func(int64)) *BodyWrapper {
|
||||||
|
return &BodyWrapper{
|
||||||
|
ReadCloser: body,
|
||||||
|
OnRead: onRead,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read reads the data from the io.ReadCloser, and stores the number of bytes
|
||||||
|
// read and the error.
|
||||||
|
func (w *BodyWrapper) Read(b []byte) (int, error) {
|
||||||
|
n, err := w.ReadCloser.Read(b)
|
||||||
|
n1 := int64(n)
|
||||||
|
|
||||||
|
w.updateReadData(n1, err)
|
||||||
|
w.OnRead(n1)
|
||||||
|
return n, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *BodyWrapper) updateReadData(n int64, err error) {
|
||||||
|
w.mu.Lock()
|
||||||
|
defer w.mu.Unlock()
|
||||||
|
|
||||||
|
w.read += n
|
||||||
|
if err != nil {
|
||||||
|
w.err = err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Closes closes the io.ReadCloser.
|
||||||
|
func (w *BodyWrapper) Close() error {
|
||||||
|
return w.ReadCloser.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
// BytesRead returns the number of bytes read up to this point.
|
||||||
|
func (w *BodyWrapper) BytesRead() int64 {
|
||||||
|
w.mu.Lock()
|
||||||
|
defer w.mu.Unlock()
|
||||||
|
|
||||||
|
return w.read
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error returns the last error.
|
||||||
|
func (w *BodyWrapper) Error() error {
|
||||||
|
w.mu.Lock()
|
||||||
|
defer w.mu.Unlock()
|
||||||
|
|
||||||
|
return w.err
|
||||||
|
}
|
||||||
10
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/request/gen.go
generated
vendored
Normal file
10
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/request/gen.go
generated
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package request // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/request"
|
||||||
|
|
||||||
|
// Generate request package:
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/request/body_wrapper.go.tmpl "--data={}" --out=body_wrapper.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/request/body_wrapper_test.go.tmpl "--data={}" --out=body_wrapper_test.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/request/resp_writer_wrapper.go.tmpl "--data={}" --out=resp_writer_wrapper.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/request/resp_writer_wrapper_test.go.tmpl "--data={}" --out=resp_writer_wrapper_test.go
|
||||||
122
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/request/resp_writer_wrapper.go
generated
vendored
Normal file
122
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/request/resp_writer_wrapper.go
generated
vendored
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
// Code created by gotmpl. DO NOT MODIFY.
|
||||||
|
// source: internal/shared/request/resp_writer_wrapper.go.tmpl
|
||||||
|
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package request // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/request"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ http.ResponseWriter = &RespWriterWrapper{}
|
||||||
|
|
||||||
|
// RespWriterWrapper wraps a http.ResponseWriter in order to track the number of
|
||||||
|
// bytes written, the last error, and to catch the first written statusCode.
|
||||||
|
// TODO: The wrapped http.ResponseWriter doesn't implement any of the optional
|
||||||
|
// types (http.Hijacker, http.Pusher, http.CloseNotifier, etc)
|
||||||
|
// that may be useful when using it in real life situations.
|
||||||
|
type RespWriterWrapper struct {
|
||||||
|
http.ResponseWriter
|
||||||
|
OnWrite func(n int64) // must not be nil
|
||||||
|
|
||||||
|
mu sync.RWMutex
|
||||||
|
written int64
|
||||||
|
statusCode int
|
||||||
|
err error
|
||||||
|
wroteHeader bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewRespWriterWrapper creates a new RespWriterWrapper.
|
||||||
|
//
|
||||||
|
// The onWrite attribute is a callback that will be called every time the data
|
||||||
|
// is written, with the number of bytes that were written.
|
||||||
|
func NewRespWriterWrapper(w http.ResponseWriter, onWrite func(int64)) *RespWriterWrapper {
|
||||||
|
return &RespWriterWrapper{
|
||||||
|
ResponseWriter: w,
|
||||||
|
OnWrite: onWrite,
|
||||||
|
statusCode: http.StatusOK, // default status code in case the Handler doesn't write anything
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write writes the bytes array into the [ResponseWriter], and tracks the
|
||||||
|
// number of bytes written and last error.
|
||||||
|
func (w *RespWriterWrapper) Write(p []byte) (int, error) {
|
||||||
|
w.mu.Lock()
|
||||||
|
defer w.mu.Unlock()
|
||||||
|
|
||||||
|
if !w.wroteHeader {
|
||||||
|
w.writeHeader(http.StatusOK)
|
||||||
|
}
|
||||||
|
|
||||||
|
n, err := w.ResponseWriter.Write(p)
|
||||||
|
n1 := int64(n)
|
||||||
|
w.OnWrite(n1)
|
||||||
|
w.written += n1
|
||||||
|
w.err = err
|
||||||
|
return n, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteHeader persists initial statusCode for span attribution.
|
||||||
|
// All calls to WriteHeader will be propagated to the underlying ResponseWriter
|
||||||
|
// and will persist the statusCode from the first call.
|
||||||
|
// Blocking consecutive calls to WriteHeader alters expected behavior and will
|
||||||
|
// remove warning logs from net/http where developers will notice incorrect handler implementations.
|
||||||
|
func (w *RespWriterWrapper) WriteHeader(statusCode int) {
|
||||||
|
w.mu.Lock()
|
||||||
|
defer w.mu.Unlock()
|
||||||
|
|
||||||
|
w.writeHeader(statusCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
// writeHeader persists the status code for span attribution, and propagates
|
||||||
|
// the call to the underlying ResponseWriter.
|
||||||
|
// It does not acquire a lock, and therefore assumes that is being handled by a
|
||||||
|
// parent method.
|
||||||
|
func (w *RespWriterWrapper) writeHeader(statusCode int) {
|
||||||
|
if !w.wroteHeader {
|
||||||
|
w.wroteHeader = true
|
||||||
|
w.statusCode = statusCode
|
||||||
|
}
|
||||||
|
w.ResponseWriter.WriteHeader(statusCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flush implements [http.Flusher].
|
||||||
|
func (w *RespWriterWrapper) Flush() {
|
||||||
|
w.mu.Lock()
|
||||||
|
defer w.mu.Unlock()
|
||||||
|
|
||||||
|
if !w.wroteHeader {
|
||||||
|
w.writeHeader(http.StatusOK)
|
||||||
|
}
|
||||||
|
|
||||||
|
if f, ok := w.ResponseWriter.(http.Flusher); ok {
|
||||||
|
f.Flush()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// BytesWritten returns the number of bytes written.
|
||||||
|
func (w *RespWriterWrapper) BytesWritten() int64 {
|
||||||
|
w.mu.RLock()
|
||||||
|
defer w.mu.RUnlock()
|
||||||
|
|
||||||
|
return w.written
|
||||||
|
}
|
||||||
|
|
||||||
|
// BytesWritten returns the HTTP status code that was sent.
|
||||||
|
func (w *RespWriterWrapper) StatusCode() int {
|
||||||
|
w.mu.RLock()
|
||||||
|
defer w.mu.RUnlock()
|
||||||
|
|
||||||
|
return w.statusCode
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error returns the last error.
|
||||||
|
func (w *RespWriterWrapper) Error() error {
|
||||||
|
w.mu.RLock()
|
||||||
|
defer w.mu.RUnlock()
|
||||||
|
|
||||||
|
return w.err
|
||||||
|
}
|
||||||
249
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/env.go
generated
vendored
249
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/env.go
generated
vendored
@@ -1,18 +1,28 @@
|
|||||||
|
// Code created by gotmpl. DO NOT MODIFY.
|
||||||
|
// source: internal/shared/semconv/env.go.tmpl
|
||||||
|
|
||||||
// Copyright The OpenTelemetry Authors
|
// Copyright The OpenTelemetry Authors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
package semconv // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv"
|
package semconv // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/codes"
|
"go.opentelemetry.io/otel/codes"
|
||||||
|
"go.opentelemetry.io/otel/metric"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// OTelSemConvStabilityOptIn is an environment variable.
|
||||||
|
// That can be set to "old" or "http/dup" to opt into the new HTTP semantic conventions.
|
||||||
|
const OTelSemConvStabilityOptIn = "OTEL_SEMCONV_STABILITY_OPT_IN"
|
||||||
|
|
||||||
type ResponseTelemetry struct {
|
type ResponseTelemetry struct {
|
||||||
StatusCode int
|
StatusCode int
|
||||||
ReadBytes int64
|
ReadBytes int64
|
||||||
@@ -23,6 +33,16 @@ type ResponseTelemetry struct {
|
|||||||
|
|
||||||
type HTTPServer struct {
|
type HTTPServer struct {
|
||||||
duplicate bool
|
duplicate bool
|
||||||
|
|
||||||
|
// Old metrics
|
||||||
|
requestBytesCounter metric.Int64Counter
|
||||||
|
responseBytesCounter metric.Int64Counter
|
||||||
|
serverLatencyMeasure metric.Float64Histogram
|
||||||
|
|
||||||
|
// New metrics
|
||||||
|
requestBodySizeHistogram metric.Int64Histogram
|
||||||
|
responseBodySizeHistogram metric.Int64Histogram
|
||||||
|
requestDurationHistogram metric.Float64Histogram
|
||||||
}
|
}
|
||||||
|
|
||||||
// RequestTraceAttrs returns trace attributes for an HTTP request received by a
|
// RequestTraceAttrs returns trace attributes for an HTTP request received by a
|
||||||
@@ -43,9 +63,18 @@ type HTTPServer struct {
|
|||||||
// The req Host will be used to determine the server instead.
|
// The req Host will be used to determine the server instead.
|
||||||
func (s HTTPServer) RequestTraceAttrs(server string, req *http.Request) []attribute.KeyValue {
|
func (s HTTPServer) RequestTraceAttrs(server string, req *http.Request) []attribute.KeyValue {
|
||||||
if s.duplicate {
|
if s.duplicate {
|
||||||
return append(oldHTTPServer{}.RequestTraceAttrs(server, req), newHTTPServer{}.RequestTraceAttrs(server, req)...)
|
return append(OldHTTPServer{}.RequestTraceAttrs(server, req), CurrentHTTPServer{}.RequestTraceAttrs(server, req)...)
|
||||||
|
}
|
||||||
|
return OldHTTPServer{}.RequestTraceAttrs(server, req)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s HTTPServer) NetworkTransportAttr(network string) []attribute.KeyValue {
|
||||||
|
if s.duplicate {
|
||||||
|
return append([]attribute.KeyValue{OldHTTPServer{}.NetworkTransportAttr(network)}, CurrentHTTPServer{}.NetworkTransportAttr(network))
|
||||||
|
}
|
||||||
|
return []attribute.KeyValue{
|
||||||
|
OldHTTPServer{}.NetworkTransportAttr(network),
|
||||||
}
|
}
|
||||||
return oldHTTPServer{}.RequestTraceAttrs(server, req)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ResponseTraceAttrs returns trace attributes for telemetry from an HTTP response.
|
// ResponseTraceAttrs returns trace attributes for telemetry from an HTTP response.
|
||||||
@@ -53,25 +82,20 @@ func (s HTTPServer) RequestTraceAttrs(server string, req *http.Request) []attrib
|
|||||||
// If any of the fields in the ResponseTelemetry are not set the attribute will be omitted.
|
// If any of the fields in the ResponseTelemetry are not set the attribute will be omitted.
|
||||||
func (s HTTPServer) ResponseTraceAttrs(resp ResponseTelemetry) []attribute.KeyValue {
|
func (s HTTPServer) ResponseTraceAttrs(resp ResponseTelemetry) []attribute.KeyValue {
|
||||||
if s.duplicate {
|
if s.duplicate {
|
||||||
return append(oldHTTPServer{}.ResponseTraceAttrs(resp), newHTTPServer{}.ResponseTraceAttrs(resp)...)
|
return append(OldHTTPServer{}.ResponseTraceAttrs(resp), CurrentHTTPServer{}.ResponseTraceAttrs(resp)...)
|
||||||
}
|
}
|
||||||
return oldHTTPServer{}.ResponseTraceAttrs(resp)
|
return OldHTTPServer{}.ResponseTraceAttrs(resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Route returns the attribute for the route.
|
// Route returns the attribute for the route.
|
||||||
func (s HTTPServer) Route(route string) attribute.KeyValue {
|
func (s HTTPServer) Route(route string) attribute.KeyValue {
|
||||||
return oldHTTPServer{}.Route(route)
|
return OldHTTPServer{}.Route(route)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewHTTPServer() HTTPServer {
|
// Status returns a span status code and message for an HTTP status code
|
||||||
env := strings.ToLower(os.Getenv("OTEL_HTTP_CLIENT_COMPATIBILITY_MODE"))
|
|
||||||
return HTTPServer{duplicate: env == "http/dup"}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ServerStatus returns a span status code and message for an HTTP status code
|
|
||||||
// value returned by a server. Status codes in the 400-499 range are not
|
// value returned by a server. Status codes in the 400-499 range are not
|
||||||
// returned as errors.
|
// returned as errors.
|
||||||
func ServerStatus(code int) (codes.Code, string) {
|
func (s HTTPServer) Status(code int) (codes.Code, string) {
|
||||||
if code < 100 || code >= 600 {
|
if code < 100 || code >= 600 {
|
||||||
return codes.Error, fmt.Sprintf("Invalid HTTP status code %d", code)
|
return codes.Error, fmt.Sprintf("Invalid HTTP status code %d", code)
|
||||||
}
|
}
|
||||||
@@ -80,3 +104,204 @@ func ServerStatus(code int) (codes.Code, string) {
|
|||||||
}
|
}
|
||||||
return codes.Unset, ""
|
return codes.Unset, ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ServerMetricData struct {
|
||||||
|
ServerName string
|
||||||
|
ResponseSize int64
|
||||||
|
|
||||||
|
MetricData
|
||||||
|
MetricAttributes
|
||||||
|
}
|
||||||
|
|
||||||
|
type MetricAttributes struct {
|
||||||
|
Req *http.Request
|
||||||
|
StatusCode int
|
||||||
|
AdditionalAttributes []attribute.KeyValue
|
||||||
|
}
|
||||||
|
|
||||||
|
type MetricData struct {
|
||||||
|
RequestSize int64
|
||||||
|
ElapsedTime float64
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
metricAddOptionPool = &sync.Pool{
|
||||||
|
New: func() interface{} {
|
||||||
|
return &[]metric.AddOption{}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
metricRecordOptionPool = &sync.Pool{
|
||||||
|
New: func() interface{} {
|
||||||
|
return &[]metric.RecordOption{}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func (s HTTPServer) RecordMetrics(ctx context.Context, md ServerMetricData) {
|
||||||
|
if s.requestBytesCounter != nil && s.responseBytesCounter != nil && s.serverLatencyMeasure != nil {
|
||||||
|
attributes := OldHTTPServer{}.MetricAttributes(md.ServerName, md.Req, md.StatusCode, md.AdditionalAttributes)
|
||||||
|
o := metric.WithAttributeSet(attribute.NewSet(attributes...))
|
||||||
|
addOpts := metricAddOptionPool.Get().(*[]metric.AddOption)
|
||||||
|
*addOpts = append(*addOpts, o)
|
||||||
|
s.requestBytesCounter.Add(ctx, md.RequestSize, *addOpts...)
|
||||||
|
s.responseBytesCounter.Add(ctx, md.ResponseSize, *addOpts...)
|
||||||
|
s.serverLatencyMeasure.Record(ctx, md.ElapsedTime, o)
|
||||||
|
*addOpts = (*addOpts)[:0]
|
||||||
|
metricAddOptionPool.Put(addOpts)
|
||||||
|
}
|
||||||
|
|
||||||
|
if s.duplicate && s.requestDurationHistogram != nil && s.requestBodySizeHistogram != nil && s.responseBodySizeHistogram != nil {
|
||||||
|
attributes := CurrentHTTPServer{}.MetricAttributes(md.ServerName, md.Req, md.StatusCode, md.AdditionalAttributes)
|
||||||
|
o := metric.WithAttributeSet(attribute.NewSet(attributes...))
|
||||||
|
recordOpts := metricRecordOptionPool.Get().(*[]metric.RecordOption)
|
||||||
|
*recordOpts = append(*recordOpts, o)
|
||||||
|
s.requestBodySizeHistogram.Record(ctx, md.RequestSize, *recordOpts...)
|
||||||
|
s.responseBodySizeHistogram.Record(ctx, md.ResponseSize, *recordOpts...)
|
||||||
|
s.requestDurationHistogram.Record(ctx, md.ElapsedTime, o)
|
||||||
|
*recordOpts = (*recordOpts)[:0]
|
||||||
|
metricRecordOptionPool.Put(recordOpts)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewHTTPServer(meter metric.Meter) HTTPServer {
|
||||||
|
env := strings.ToLower(os.Getenv(OTelSemConvStabilityOptIn))
|
||||||
|
duplicate := env == "http/dup"
|
||||||
|
server := HTTPServer{
|
||||||
|
duplicate: duplicate,
|
||||||
|
}
|
||||||
|
server.requestBytesCounter, server.responseBytesCounter, server.serverLatencyMeasure = OldHTTPServer{}.createMeasures(meter)
|
||||||
|
if duplicate {
|
||||||
|
server.requestBodySizeHistogram, server.responseBodySizeHistogram, server.requestDurationHistogram = CurrentHTTPServer{}.createMeasures(meter)
|
||||||
|
}
|
||||||
|
return server
|
||||||
|
}
|
||||||
|
|
||||||
|
type HTTPClient struct {
|
||||||
|
duplicate bool
|
||||||
|
|
||||||
|
// old metrics
|
||||||
|
requestBytesCounter metric.Int64Counter
|
||||||
|
responseBytesCounter metric.Int64Counter
|
||||||
|
latencyMeasure metric.Float64Histogram
|
||||||
|
|
||||||
|
// new metrics
|
||||||
|
requestBodySize metric.Int64Histogram
|
||||||
|
requestDuration metric.Float64Histogram
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewHTTPClient(meter metric.Meter) HTTPClient {
|
||||||
|
env := strings.ToLower(os.Getenv(OTelSemConvStabilityOptIn))
|
||||||
|
duplicate := env == "http/dup"
|
||||||
|
client := HTTPClient{
|
||||||
|
duplicate: duplicate,
|
||||||
|
}
|
||||||
|
client.requestBytesCounter, client.responseBytesCounter, client.latencyMeasure = OldHTTPClient{}.createMeasures(meter)
|
||||||
|
if duplicate {
|
||||||
|
client.requestBodySize, client.requestDuration = CurrentHTTPClient{}.createMeasures(meter)
|
||||||
|
}
|
||||||
|
|
||||||
|
return client
|
||||||
|
}
|
||||||
|
|
||||||
|
// RequestTraceAttrs returns attributes for an HTTP request made by a client.
|
||||||
|
func (c HTTPClient) RequestTraceAttrs(req *http.Request) []attribute.KeyValue {
|
||||||
|
if c.duplicate {
|
||||||
|
return append(OldHTTPClient{}.RequestTraceAttrs(req), CurrentHTTPClient{}.RequestTraceAttrs(req)...)
|
||||||
|
}
|
||||||
|
return OldHTTPClient{}.RequestTraceAttrs(req)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ResponseTraceAttrs returns metric attributes for an HTTP request made by a client.
|
||||||
|
func (c HTTPClient) ResponseTraceAttrs(resp *http.Response) []attribute.KeyValue {
|
||||||
|
if c.duplicate {
|
||||||
|
return append(OldHTTPClient{}.ResponseTraceAttrs(resp), CurrentHTTPClient{}.ResponseTraceAttrs(resp)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return OldHTTPClient{}.ResponseTraceAttrs(resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c HTTPClient) Status(code int) (codes.Code, string) {
|
||||||
|
if code < 100 || code >= 600 {
|
||||||
|
return codes.Error, fmt.Sprintf("Invalid HTTP status code %d", code)
|
||||||
|
}
|
||||||
|
if code >= 400 {
|
||||||
|
return codes.Error, ""
|
||||||
|
}
|
||||||
|
return codes.Unset, ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c HTTPClient) ErrorType(err error) attribute.KeyValue {
|
||||||
|
if c.duplicate {
|
||||||
|
return CurrentHTTPClient{}.ErrorType(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return attribute.KeyValue{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type MetricOpts struct {
|
||||||
|
measurement metric.MeasurementOption
|
||||||
|
addOptions metric.AddOption
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o MetricOpts) MeasurementOption() metric.MeasurementOption {
|
||||||
|
return o.measurement
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o MetricOpts) AddOptions() metric.AddOption {
|
||||||
|
return o.addOptions
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c HTTPClient) MetricOptions(ma MetricAttributes) map[string]MetricOpts {
|
||||||
|
opts := map[string]MetricOpts{}
|
||||||
|
|
||||||
|
attributes := OldHTTPClient{}.MetricAttributes(ma.Req, ma.StatusCode, ma.AdditionalAttributes)
|
||||||
|
set := metric.WithAttributeSet(attribute.NewSet(attributes...))
|
||||||
|
opts["old"] = MetricOpts{
|
||||||
|
measurement: set,
|
||||||
|
addOptions: set,
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.duplicate {
|
||||||
|
attributes := CurrentHTTPClient{}.MetricAttributes(ma.Req, ma.StatusCode, ma.AdditionalAttributes)
|
||||||
|
set := metric.WithAttributeSet(attribute.NewSet(attributes...))
|
||||||
|
opts["new"] = MetricOpts{
|
||||||
|
measurement: set,
|
||||||
|
addOptions: set,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return opts
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s HTTPClient) RecordMetrics(ctx context.Context, md MetricData, opts map[string]MetricOpts) {
|
||||||
|
if s.requestBytesCounter == nil || s.latencyMeasure == nil {
|
||||||
|
// This will happen if an HTTPClient{} is used instead of NewHTTPClient().
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
s.requestBytesCounter.Add(ctx, md.RequestSize, opts["old"].AddOptions())
|
||||||
|
s.latencyMeasure.Record(ctx, md.ElapsedTime, opts["old"].MeasurementOption())
|
||||||
|
|
||||||
|
if s.duplicate {
|
||||||
|
s.requestBodySize.Record(ctx, md.RequestSize, opts["new"].MeasurementOption())
|
||||||
|
s.requestDuration.Record(ctx, md.ElapsedTime, opts["new"].MeasurementOption())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s HTTPClient) RecordResponseSize(ctx context.Context, responseData int64, opts map[string]MetricOpts) {
|
||||||
|
if s.responseBytesCounter == nil {
|
||||||
|
// This will happen if an HTTPClient{} is used instead of NewHTTPClient().
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
s.responseBytesCounter.Add(ctx, responseData, opts["old"].AddOptions())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s HTTPClient) TraceAttributes(host string) []attribute.KeyValue {
|
||||||
|
if s.duplicate {
|
||||||
|
return append(OldHTTPClient{}.TraceAttributes(host), CurrentHTTPClient{}.TraceAttributes(host)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return OldHTTPClient{}.TraceAttributes(host)
|
||||||
|
}
|
||||||
|
|||||||
14
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/gen.go
generated
vendored
Normal file
14
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/gen.go
generated
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package semconv // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv"
|
||||||
|
|
||||||
|
// Generate semconv package:
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/semconv/bench_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=bench_test.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/semconv/env.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=env.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/semconv/env_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=env_test.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/semconv/httpconv.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=httpconv.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/semconv/httpconv_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=httpconv_test.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/semconv/util.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=util.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/semconv/util_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=util_test.go
|
||||||
|
//go:generate gotmpl --body=../../../../../../internal/shared/semconv/v1.20.0.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=v1.20.0.go
|
||||||
539
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/httpconv.go
generated
vendored
Normal file
539
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/httpconv.go
generated
vendored
Normal file
@@ -0,0 +1,539 @@
|
|||||||
|
// Code created by gotmpl. DO NOT MODIFY.
|
||||||
|
// source: internal/shared/semconv/httpconv.go.tmpl
|
||||||
|
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package semconv // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"reflect"
|
||||||
|
"slices"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/attribute"
|
||||||
|
"go.opentelemetry.io/otel/metric"
|
||||||
|
"go.opentelemetry.io/otel/metric/noop"
|
||||||
|
semconvNew "go.opentelemetry.io/otel/semconv/v1.26.0"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CurrentHTTPServer struct{}
|
||||||
|
|
||||||
|
// TraceRequest returns trace attributes for an HTTP request received by a
|
||||||
|
// server.
|
||||||
|
//
|
||||||
|
// The server must be the primary server name if it is known. For example this
|
||||||
|
// would be the ServerName directive
|
||||||
|
// (https://httpd.apache.org/docs/2.4/mod/core.html#servername) for an Apache
|
||||||
|
// server, and the server_name directive
|
||||||
|
// (http://nginx.org/en/docs/http/ngx_http_core_module.html#server_name) for an
|
||||||
|
// nginx server. More generically, the primary server name would be the host
|
||||||
|
// header value that matches the default virtual host of an HTTP server. It
|
||||||
|
// should include the host identifier and if a port is used to route to the
|
||||||
|
// server that port identifier should be included as an appropriate port
|
||||||
|
// suffix.
|
||||||
|
//
|
||||||
|
// If the primary server name is not known, server should be an empty string.
|
||||||
|
// The req Host will be used to determine the server instead.
|
||||||
|
func (n CurrentHTTPServer) RequestTraceAttrs(server string, req *http.Request) []attribute.KeyValue {
|
||||||
|
count := 3 // ServerAddress, Method, Scheme
|
||||||
|
|
||||||
|
var host string
|
||||||
|
var p int
|
||||||
|
if server == "" {
|
||||||
|
host, p = SplitHostPort(req.Host)
|
||||||
|
} else {
|
||||||
|
// Prioritize the primary server name.
|
||||||
|
host, p = SplitHostPort(server)
|
||||||
|
if p < 0 {
|
||||||
|
_, p = SplitHostPort(req.Host)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hostPort := requiredHTTPPort(req.TLS != nil, p)
|
||||||
|
if hostPort > 0 {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
|
||||||
|
method, methodOriginal := n.method(req.Method)
|
||||||
|
if methodOriginal != (attribute.KeyValue{}) {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
|
||||||
|
scheme := n.scheme(req.TLS != nil)
|
||||||
|
|
||||||
|
if peer, peerPort := SplitHostPort(req.RemoteAddr); peer != "" {
|
||||||
|
// The Go HTTP server sets RemoteAddr to "IP:port", this will not be a
|
||||||
|
// file-path that would be interpreted with a sock family.
|
||||||
|
count++
|
||||||
|
if peerPort > 0 {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
useragent := req.UserAgent()
|
||||||
|
if useragent != "" {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
|
||||||
|
clientIP := serverClientIP(req.Header.Get("X-Forwarded-For"))
|
||||||
|
if clientIP != "" {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
|
||||||
|
if req.URL != nil && req.URL.Path != "" {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
|
||||||
|
protoName, protoVersion := netProtocol(req.Proto)
|
||||||
|
if protoName != "" && protoName != "http" {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
if protoVersion != "" {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
|
||||||
|
attrs := make([]attribute.KeyValue, 0, count)
|
||||||
|
attrs = append(attrs,
|
||||||
|
semconvNew.ServerAddress(host),
|
||||||
|
method,
|
||||||
|
scheme,
|
||||||
|
)
|
||||||
|
|
||||||
|
if hostPort > 0 {
|
||||||
|
attrs = append(attrs, semconvNew.ServerPort(hostPort))
|
||||||
|
}
|
||||||
|
if methodOriginal != (attribute.KeyValue{}) {
|
||||||
|
attrs = append(attrs, methodOriginal)
|
||||||
|
}
|
||||||
|
|
||||||
|
if peer, peerPort := SplitHostPort(req.RemoteAddr); peer != "" {
|
||||||
|
// The Go HTTP server sets RemoteAddr to "IP:port", this will not be a
|
||||||
|
// file-path that would be interpreted with a sock family.
|
||||||
|
attrs = append(attrs, semconvNew.NetworkPeerAddress(peer))
|
||||||
|
if peerPort > 0 {
|
||||||
|
attrs = append(attrs, semconvNew.NetworkPeerPort(peerPort))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if useragent := req.UserAgent(); useragent != "" {
|
||||||
|
attrs = append(attrs, semconvNew.UserAgentOriginal(useragent))
|
||||||
|
}
|
||||||
|
|
||||||
|
if clientIP != "" {
|
||||||
|
attrs = append(attrs, semconvNew.ClientAddress(clientIP))
|
||||||
|
}
|
||||||
|
|
||||||
|
if req.URL != nil && req.URL.Path != "" {
|
||||||
|
attrs = append(attrs, semconvNew.URLPath(req.URL.Path))
|
||||||
|
}
|
||||||
|
|
||||||
|
if protoName != "" && protoName != "http" {
|
||||||
|
attrs = append(attrs, semconvNew.NetworkProtocolName(protoName))
|
||||||
|
}
|
||||||
|
if protoVersion != "" {
|
||||||
|
attrs = append(attrs, semconvNew.NetworkProtocolVersion(protoVersion))
|
||||||
|
}
|
||||||
|
|
||||||
|
return attrs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o CurrentHTTPServer) NetworkTransportAttr(network string) attribute.KeyValue {
|
||||||
|
switch network {
|
||||||
|
case "tcp", "tcp4", "tcp6":
|
||||||
|
return semconvNew.NetworkTransportTCP
|
||||||
|
case "udp", "udp4", "udp6":
|
||||||
|
return semconvNew.NetworkTransportUDP
|
||||||
|
case "unix", "unixgram", "unixpacket":
|
||||||
|
return semconvNew.NetworkTransportUnix
|
||||||
|
default:
|
||||||
|
return semconvNew.NetworkTransportPipe
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n CurrentHTTPServer) method(method string) (attribute.KeyValue, attribute.KeyValue) {
|
||||||
|
if method == "" {
|
||||||
|
return semconvNew.HTTPRequestMethodGet, attribute.KeyValue{}
|
||||||
|
}
|
||||||
|
if attr, ok := methodLookup[method]; ok {
|
||||||
|
return attr, attribute.KeyValue{}
|
||||||
|
}
|
||||||
|
|
||||||
|
orig := semconvNew.HTTPRequestMethodOriginal(method)
|
||||||
|
if attr, ok := methodLookup[strings.ToUpper(method)]; ok {
|
||||||
|
return attr, orig
|
||||||
|
}
|
||||||
|
return semconvNew.HTTPRequestMethodGet, orig
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n CurrentHTTPServer) scheme(https bool) attribute.KeyValue { // nolint:revive
|
||||||
|
if https {
|
||||||
|
return semconvNew.URLScheme("https")
|
||||||
|
}
|
||||||
|
return semconvNew.URLScheme("http")
|
||||||
|
}
|
||||||
|
|
||||||
|
// TraceResponse returns trace attributes for telemetry from an HTTP response.
|
||||||
|
//
|
||||||
|
// If any of the fields in the ResponseTelemetry are not set the attribute will be omitted.
|
||||||
|
func (n CurrentHTTPServer) ResponseTraceAttrs(resp ResponseTelemetry) []attribute.KeyValue {
|
||||||
|
var count int
|
||||||
|
|
||||||
|
if resp.ReadBytes > 0 {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
if resp.WriteBytes > 0 {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
if resp.StatusCode > 0 {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
|
||||||
|
attributes := make([]attribute.KeyValue, 0, count)
|
||||||
|
|
||||||
|
if resp.ReadBytes > 0 {
|
||||||
|
attributes = append(attributes,
|
||||||
|
semconvNew.HTTPRequestBodySize(int(resp.ReadBytes)),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
if resp.WriteBytes > 0 {
|
||||||
|
attributes = append(attributes,
|
||||||
|
semconvNew.HTTPResponseBodySize(int(resp.WriteBytes)),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
if resp.StatusCode > 0 {
|
||||||
|
attributes = append(attributes,
|
||||||
|
semconvNew.HTTPResponseStatusCode(resp.StatusCode),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return attributes
|
||||||
|
}
|
||||||
|
|
||||||
|
// Route returns the attribute for the route.
|
||||||
|
func (n CurrentHTTPServer) Route(route string) attribute.KeyValue {
|
||||||
|
return semconvNew.HTTPRoute(route)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n CurrentHTTPServer) createMeasures(meter metric.Meter) (metric.Int64Histogram, metric.Int64Histogram, metric.Float64Histogram) {
|
||||||
|
if meter == nil {
|
||||||
|
return noop.Int64Histogram{}, noop.Int64Histogram{}, noop.Float64Histogram{}
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
requestBodySizeHistogram, err := meter.Int64Histogram(
|
||||||
|
semconvNew.HTTPServerRequestBodySizeName,
|
||||||
|
metric.WithUnit(semconvNew.HTTPServerRequestBodySizeUnit),
|
||||||
|
metric.WithDescription(semconvNew.HTTPServerRequestBodySizeDescription),
|
||||||
|
)
|
||||||
|
handleErr(err)
|
||||||
|
|
||||||
|
responseBodySizeHistogram, err := meter.Int64Histogram(
|
||||||
|
semconvNew.HTTPServerResponseBodySizeName,
|
||||||
|
metric.WithUnit(semconvNew.HTTPServerResponseBodySizeUnit),
|
||||||
|
metric.WithDescription(semconvNew.HTTPServerResponseBodySizeDescription),
|
||||||
|
)
|
||||||
|
handleErr(err)
|
||||||
|
requestDurationHistogram, err := meter.Float64Histogram(
|
||||||
|
semconvNew.HTTPServerRequestDurationName,
|
||||||
|
metric.WithUnit(semconvNew.HTTPServerRequestDurationUnit),
|
||||||
|
metric.WithDescription(semconvNew.HTTPServerRequestDurationDescription),
|
||||||
|
)
|
||||||
|
handleErr(err)
|
||||||
|
|
||||||
|
return requestBodySizeHistogram, responseBodySizeHistogram, requestDurationHistogram
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n CurrentHTTPServer) MetricAttributes(server string, req *http.Request, statusCode int, additionalAttributes []attribute.KeyValue) []attribute.KeyValue {
|
||||||
|
num := len(additionalAttributes) + 3
|
||||||
|
var host string
|
||||||
|
var p int
|
||||||
|
if server == "" {
|
||||||
|
host, p = SplitHostPort(req.Host)
|
||||||
|
} else {
|
||||||
|
// Prioritize the primary server name.
|
||||||
|
host, p = SplitHostPort(server)
|
||||||
|
if p < 0 {
|
||||||
|
_, p = SplitHostPort(req.Host)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hostPort := requiredHTTPPort(req.TLS != nil, p)
|
||||||
|
if hostPort > 0 {
|
||||||
|
num++
|
||||||
|
}
|
||||||
|
protoName, protoVersion := netProtocol(req.Proto)
|
||||||
|
if protoName != "" {
|
||||||
|
num++
|
||||||
|
}
|
||||||
|
if protoVersion != "" {
|
||||||
|
num++
|
||||||
|
}
|
||||||
|
|
||||||
|
if statusCode > 0 {
|
||||||
|
num++
|
||||||
|
}
|
||||||
|
|
||||||
|
attributes := slices.Grow(additionalAttributes, num)
|
||||||
|
attributes = append(attributes,
|
||||||
|
semconvNew.HTTPRequestMethodKey.String(standardizeHTTPMethod(req.Method)),
|
||||||
|
n.scheme(req.TLS != nil),
|
||||||
|
semconvNew.ServerAddress(host))
|
||||||
|
|
||||||
|
if hostPort > 0 {
|
||||||
|
attributes = append(attributes, semconvNew.ServerPort(hostPort))
|
||||||
|
}
|
||||||
|
if protoName != "" {
|
||||||
|
attributes = append(attributes, semconvNew.NetworkProtocolName(protoName))
|
||||||
|
}
|
||||||
|
if protoVersion != "" {
|
||||||
|
attributes = append(attributes, semconvNew.NetworkProtocolVersion(protoVersion))
|
||||||
|
}
|
||||||
|
|
||||||
|
if statusCode > 0 {
|
||||||
|
attributes = append(attributes, semconvNew.HTTPResponseStatusCode(statusCode))
|
||||||
|
}
|
||||||
|
return attributes
|
||||||
|
}
|
||||||
|
|
||||||
|
type CurrentHTTPClient struct{}
|
||||||
|
|
||||||
|
// RequestTraceAttrs returns trace attributes for an HTTP request made by a client.
|
||||||
|
func (n CurrentHTTPClient) RequestTraceAttrs(req *http.Request) []attribute.KeyValue {
|
||||||
|
/*
|
||||||
|
below attributes are returned:
|
||||||
|
- http.request.method
|
||||||
|
- http.request.method.original
|
||||||
|
- url.full
|
||||||
|
- server.address
|
||||||
|
- server.port
|
||||||
|
- network.protocol.name
|
||||||
|
- network.protocol.version
|
||||||
|
*/
|
||||||
|
numOfAttributes := 3 // URL, server address, proto, and method.
|
||||||
|
|
||||||
|
var urlHost string
|
||||||
|
if req.URL != nil {
|
||||||
|
urlHost = req.URL.Host
|
||||||
|
}
|
||||||
|
var requestHost string
|
||||||
|
var requestPort int
|
||||||
|
for _, hostport := range []string{urlHost, req.Header.Get("Host")} {
|
||||||
|
requestHost, requestPort = SplitHostPort(hostport)
|
||||||
|
if requestHost != "" || requestPort > 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
eligiblePort := requiredHTTPPort(req.URL != nil && req.URL.Scheme == "https", requestPort)
|
||||||
|
if eligiblePort > 0 {
|
||||||
|
numOfAttributes++
|
||||||
|
}
|
||||||
|
useragent := req.UserAgent()
|
||||||
|
if useragent != "" {
|
||||||
|
numOfAttributes++
|
||||||
|
}
|
||||||
|
|
||||||
|
protoName, protoVersion := netProtocol(req.Proto)
|
||||||
|
if protoName != "" && protoName != "http" {
|
||||||
|
numOfAttributes++
|
||||||
|
}
|
||||||
|
if protoVersion != "" {
|
||||||
|
numOfAttributes++
|
||||||
|
}
|
||||||
|
|
||||||
|
method, originalMethod := n.method(req.Method)
|
||||||
|
if originalMethod != (attribute.KeyValue{}) {
|
||||||
|
numOfAttributes++
|
||||||
|
}
|
||||||
|
|
||||||
|
attrs := make([]attribute.KeyValue, 0, numOfAttributes)
|
||||||
|
|
||||||
|
attrs = append(attrs, method)
|
||||||
|
if originalMethod != (attribute.KeyValue{}) {
|
||||||
|
attrs = append(attrs, originalMethod)
|
||||||
|
}
|
||||||
|
|
||||||
|
var u string
|
||||||
|
if req.URL != nil {
|
||||||
|
// Remove any username/password info that may be in the URL.
|
||||||
|
userinfo := req.URL.User
|
||||||
|
req.URL.User = nil
|
||||||
|
u = req.URL.String()
|
||||||
|
// Restore any username/password info that was removed.
|
||||||
|
req.URL.User = userinfo
|
||||||
|
}
|
||||||
|
attrs = append(attrs, semconvNew.URLFull(u))
|
||||||
|
|
||||||
|
attrs = append(attrs, semconvNew.ServerAddress(requestHost))
|
||||||
|
if eligiblePort > 0 {
|
||||||
|
attrs = append(attrs, semconvNew.ServerPort(eligiblePort))
|
||||||
|
}
|
||||||
|
|
||||||
|
if protoName != "" && protoName != "http" {
|
||||||
|
attrs = append(attrs, semconvNew.NetworkProtocolName(protoName))
|
||||||
|
}
|
||||||
|
if protoVersion != "" {
|
||||||
|
attrs = append(attrs, semconvNew.NetworkProtocolVersion(protoVersion))
|
||||||
|
}
|
||||||
|
|
||||||
|
return attrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// ResponseTraceAttrs returns trace attributes for an HTTP response made by a client.
|
||||||
|
func (n CurrentHTTPClient) ResponseTraceAttrs(resp *http.Response) []attribute.KeyValue {
|
||||||
|
/*
|
||||||
|
below attributes are returned:
|
||||||
|
- http.response.status_code
|
||||||
|
- error.type
|
||||||
|
*/
|
||||||
|
var count int
|
||||||
|
if resp.StatusCode > 0 {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
|
||||||
|
if isErrorStatusCode(resp.StatusCode) {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
|
||||||
|
attrs := make([]attribute.KeyValue, 0, count)
|
||||||
|
if resp.StatusCode > 0 {
|
||||||
|
attrs = append(attrs, semconvNew.HTTPResponseStatusCode(resp.StatusCode))
|
||||||
|
}
|
||||||
|
|
||||||
|
if isErrorStatusCode(resp.StatusCode) {
|
||||||
|
errorType := strconv.Itoa(resp.StatusCode)
|
||||||
|
attrs = append(attrs, semconvNew.ErrorTypeKey.String(errorType))
|
||||||
|
}
|
||||||
|
return attrs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n CurrentHTTPClient) ErrorType(err error) attribute.KeyValue {
|
||||||
|
t := reflect.TypeOf(err)
|
||||||
|
var value string
|
||||||
|
if t.PkgPath() == "" && t.Name() == "" {
|
||||||
|
// Likely a builtin type.
|
||||||
|
value = t.String()
|
||||||
|
} else {
|
||||||
|
value = fmt.Sprintf("%s.%s", t.PkgPath(), t.Name())
|
||||||
|
}
|
||||||
|
|
||||||
|
if value == "" {
|
||||||
|
return semconvNew.ErrorTypeOther
|
||||||
|
}
|
||||||
|
|
||||||
|
return semconvNew.ErrorTypeKey.String(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n CurrentHTTPClient) method(method string) (attribute.KeyValue, attribute.KeyValue) {
|
||||||
|
if method == "" {
|
||||||
|
return semconvNew.HTTPRequestMethodGet, attribute.KeyValue{}
|
||||||
|
}
|
||||||
|
if attr, ok := methodLookup[method]; ok {
|
||||||
|
return attr, attribute.KeyValue{}
|
||||||
|
}
|
||||||
|
|
||||||
|
orig := semconvNew.HTTPRequestMethodOriginal(method)
|
||||||
|
if attr, ok := methodLookup[strings.ToUpper(method)]; ok {
|
||||||
|
return attr, orig
|
||||||
|
}
|
||||||
|
return semconvNew.HTTPRequestMethodGet, orig
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n CurrentHTTPClient) createMeasures(meter metric.Meter) (metric.Int64Histogram, metric.Float64Histogram) {
|
||||||
|
if meter == nil {
|
||||||
|
return noop.Int64Histogram{}, noop.Float64Histogram{}
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
requestBodySize, err := meter.Int64Histogram(
|
||||||
|
semconvNew.HTTPClientRequestBodySizeName,
|
||||||
|
metric.WithUnit(semconvNew.HTTPClientRequestBodySizeUnit),
|
||||||
|
metric.WithDescription(semconvNew.HTTPClientRequestBodySizeDescription),
|
||||||
|
)
|
||||||
|
handleErr(err)
|
||||||
|
|
||||||
|
requestDuration, err := meter.Float64Histogram(
|
||||||
|
semconvNew.HTTPClientRequestDurationName,
|
||||||
|
metric.WithUnit(semconvNew.HTTPClientRequestDurationUnit),
|
||||||
|
metric.WithDescription(semconvNew.HTTPClientRequestDurationDescription),
|
||||||
|
)
|
||||||
|
handleErr(err)
|
||||||
|
|
||||||
|
return requestBodySize, requestDuration
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n CurrentHTTPClient) MetricAttributes(req *http.Request, statusCode int, additionalAttributes []attribute.KeyValue) []attribute.KeyValue {
|
||||||
|
num := len(additionalAttributes) + 2
|
||||||
|
var h string
|
||||||
|
if req.URL != nil {
|
||||||
|
h = req.URL.Host
|
||||||
|
}
|
||||||
|
var requestHost string
|
||||||
|
var requestPort int
|
||||||
|
for _, hostport := range []string{h, req.Header.Get("Host")} {
|
||||||
|
requestHost, requestPort = SplitHostPort(hostport)
|
||||||
|
if requestHost != "" || requestPort > 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
port := requiredHTTPPort(req.URL != nil && req.URL.Scheme == "https", requestPort)
|
||||||
|
if port > 0 {
|
||||||
|
num++
|
||||||
|
}
|
||||||
|
|
||||||
|
protoName, protoVersion := netProtocol(req.Proto)
|
||||||
|
if protoName != "" {
|
||||||
|
num++
|
||||||
|
}
|
||||||
|
if protoVersion != "" {
|
||||||
|
num++
|
||||||
|
}
|
||||||
|
|
||||||
|
if statusCode > 0 {
|
||||||
|
num++
|
||||||
|
}
|
||||||
|
|
||||||
|
attributes := slices.Grow(additionalAttributes, num)
|
||||||
|
attributes = append(attributes,
|
||||||
|
semconvNew.HTTPRequestMethodKey.String(standardizeHTTPMethod(req.Method)),
|
||||||
|
semconvNew.ServerAddress(requestHost),
|
||||||
|
n.scheme(req.TLS != nil),
|
||||||
|
)
|
||||||
|
|
||||||
|
if port > 0 {
|
||||||
|
attributes = append(attributes, semconvNew.ServerPort(port))
|
||||||
|
}
|
||||||
|
if protoName != "" {
|
||||||
|
attributes = append(attributes, semconvNew.NetworkProtocolName(protoName))
|
||||||
|
}
|
||||||
|
if protoVersion != "" {
|
||||||
|
attributes = append(attributes, semconvNew.NetworkProtocolVersion(protoVersion))
|
||||||
|
}
|
||||||
|
|
||||||
|
if statusCode > 0 {
|
||||||
|
attributes = append(attributes, semconvNew.HTTPResponseStatusCode(statusCode))
|
||||||
|
}
|
||||||
|
return attributes
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attributes for httptrace.
|
||||||
|
func (n CurrentHTTPClient) TraceAttributes(host string) []attribute.KeyValue {
|
||||||
|
return []attribute.KeyValue{
|
||||||
|
semconvNew.ServerAddress(host),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n CurrentHTTPClient) scheme(https bool) attribute.KeyValue { // nolint:revive
|
||||||
|
if https {
|
||||||
|
return semconvNew.URLScheme("https")
|
||||||
|
}
|
||||||
|
return semconvNew.URLScheme("http")
|
||||||
|
}
|
||||||
|
|
||||||
|
func isErrorStatusCode(code int) bool {
|
||||||
|
return code >= 400 || code < 100
|
||||||
|
}
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Code created by gotmpl. DO NOT MODIFY.
|
||||||
|
// source: internal/shared/semconv/util.go.tmpl
|
||||||
|
|
||||||
// Copyright The OpenTelemetry Authors
|
// Copyright The OpenTelemetry Authors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
@@ -9,18 +12,19 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel"
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
semconvNew "go.opentelemetry.io/otel/semconv/v1.24.0"
|
semconvNew "go.opentelemetry.io/otel/semconv/v1.26.0"
|
||||||
)
|
)
|
||||||
|
|
||||||
// splitHostPort splits a network address hostport of the form "host",
|
// SplitHostPort splits a network address hostport of the form "host",
|
||||||
// "host%zone", "[host]", "[host%zone], "host:port", "host%zone:port",
|
// "host%zone", "[host]", "[host%zone], "host:port", "host%zone:port",
|
||||||
// "[host]:port", "[host%zone]:port", or ":port" into host or host%zone and
|
// "[host]:port", "[host%zone]:port", or ":port" into host or host%zone and
|
||||||
// port.
|
// port.
|
||||||
//
|
//
|
||||||
// An empty host is returned if it is not provided or unparsable. A negative
|
// An empty host is returned if it is not provided or unparsable. A negative
|
||||||
// port is returned if it is not provided or unparsable.
|
// port is returned if it is not provided or unparsable.
|
||||||
func splitHostPort(hostport string) (host string, port int) {
|
func SplitHostPort(hostport string) (host string, port int) {
|
||||||
port = -1
|
port = -1
|
||||||
|
|
||||||
if strings.HasPrefix(hostport, "[") {
|
if strings.HasPrefix(hostport, "[") {
|
||||||
@@ -49,7 +53,7 @@ func splitHostPort(hostport string) (host string, port int) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
return host, int(p)
|
return host, int(p) // nolint: gosec // Byte size checked 16 above.
|
||||||
}
|
}
|
||||||
|
|
||||||
func requiredHTTPPort(https bool, port int) int { // nolint:revive
|
func requiredHTTPPort(https bool, port int) int { // nolint:revive
|
||||||
@@ -74,7 +78,16 @@ func serverClientIP(xForwardedFor string) string {
|
|||||||
|
|
||||||
func netProtocol(proto string) (name string, version string) {
|
func netProtocol(proto string) (name string, version string) {
|
||||||
name, version, _ = strings.Cut(proto, "/")
|
name, version, _ = strings.Cut(proto, "/")
|
||||||
name = strings.ToLower(name)
|
switch name {
|
||||||
|
case "HTTP":
|
||||||
|
name = "http"
|
||||||
|
case "QUIC":
|
||||||
|
name = "quic"
|
||||||
|
case "SPDY":
|
||||||
|
name = "spdy"
|
||||||
|
default:
|
||||||
|
name = strings.ToLower(name)
|
||||||
|
}
|
||||||
return name, version
|
return name, version
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,3 +102,19 @@ var methodLookup = map[string]attribute.KeyValue{
|
|||||||
http.MethodPut: semconvNew.HTTPRequestMethodPut,
|
http.MethodPut: semconvNew.HTTPRequestMethodPut,
|
||||||
http.MethodTrace: semconvNew.HTTPRequestMethodTrace,
|
http.MethodTrace: semconvNew.HTTPRequestMethodTrace,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func handleErr(err error) {
|
||||||
|
if err != nil {
|
||||||
|
otel.Handle(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func standardizeHTTPMethod(method string) string {
|
||||||
|
method = strings.ToUpper(method)
|
||||||
|
switch method {
|
||||||
|
case http.MethodConnect, http.MethodDelete, http.MethodGet, http.MethodHead, http.MethodOptions, http.MethodPatch, http.MethodPost, http.MethodPut, http.MethodTrace:
|
||||||
|
default:
|
||||||
|
method = "_OTHER"
|
||||||
|
}
|
||||||
|
return method
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Code created by gotmpl. DO NOT MODIFY.
|
||||||
|
// source: internal/shared/semconv/v120.0.go.tmpl
|
||||||
|
|
||||||
// Copyright The OpenTelemetry Authors
|
// Copyright The OpenTelemetry Authors
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
@@ -7,13 +10,16 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"slices"
|
||||||
|
|
||||||
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil"
|
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil"
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
|
"go.opentelemetry.io/otel/metric"
|
||||||
|
"go.opentelemetry.io/otel/metric/noop"
|
||||||
semconv "go.opentelemetry.io/otel/semconv/v1.20.0"
|
semconv "go.opentelemetry.io/otel/semconv/v1.20.0"
|
||||||
)
|
)
|
||||||
|
|
||||||
type oldHTTPServer struct{}
|
type OldHTTPServer struct{}
|
||||||
|
|
||||||
// RequestTraceAttrs returns trace attributes for an HTTP request received by a
|
// RequestTraceAttrs returns trace attributes for an HTTP request received by a
|
||||||
// server.
|
// server.
|
||||||
@@ -31,14 +37,18 @@ type oldHTTPServer struct{}
|
|||||||
//
|
//
|
||||||
// If the primary server name is not known, server should be an empty string.
|
// If the primary server name is not known, server should be an empty string.
|
||||||
// The req Host will be used to determine the server instead.
|
// The req Host will be used to determine the server instead.
|
||||||
func (o oldHTTPServer) RequestTraceAttrs(server string, req *http.Request) []attribute.KeyValue {
|
func (o OldHTTPServer) RequestTraceAttrs(server string, req *http.Request) []attribute.KeyValue {
|
||||||
return semconvutil.HTTPServerRequest(server, req)
|
return semconvutil.HTTPServerRequest(server, req)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (o OldHTTPServer) NetworkTransportAttr(network string) attribute.KeyValue {
|
||||||
|
return semconvutil.NetTransport(network)
|
||||||
|
}
|
||||||
|
|
||||||
// ResponseTraceAttrs returns trace attributes for telemetry from an HTTP response.
|
// ResponseTraceAttrs returns trace attributes for telemetry from an HTTP response.
|
||||||
//
|
//
|
||||||
// If any of the fields in the ResponseTelemetry are not set the attribute will be omitted.
|
// If any of the fields in the ResponseTelemetry are not set the attribute will be omitted.
|
||||||
func (o oldHTTPServer) ResponseTraceAttrs(resp ResponseTelemetry) []attribute.KeyValue {
|
func (o OldHTTPServer) ResponseTraceAttrs(resp ResponseTelemetry) []attribute.KeyValue {
|
||||||
attributes := []attribute.KeyValue{}
|
attributes := []attribute.KeyValue{}
|
||||||
|
|
||||||
if resp.ReadBytes > 0 {
|
if resp.ReadBytes > 0 {
|
||||||
@@ -63,7 +73,7 @@ func (o oldHTTPServer) ResponseTraceAttrs(resp ResponseTelemetry) []attribute.Ke
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Route returns the attribute for the route.
|
// Route returns the attribute for the route.
|
||||||
func (o oldHTTPServer) Route(route string) attribute.KeyValue {
|
func (o OldHTTPServer) Route(route string) attribute.KeyValue {
|
||||||
return semconv.HTTPRoute(route)
|
return semconv.HTTPRoute(route)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,3 +82,196 @@ func (o oldHTTPServer) Route(route string) attribute.KeyValue {
|
|||||||
func HTTPStatusCode(status int) attribute.KeyValue {
|
func HTTPStatusCode(status int) attribute.KeyValue {
|
||||||
return semconv.HTTPStatusCode(status)
|
return semconv.HTTPStatusCode(status)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Server HTTP metrics.
|
||||||
|
const (
|
||||||
|
serverRequestSize = "http.server.request.size" // Incoming request bytes total
|
||||||
|
serverResponseSize = "http.server.response.size" // Incoming response bytes total
|
||||||
|
serverDuration = "http.server.duration" // Incoming end to end duration, milliseconds
|
||||||
|
)
|
||||||
|
|
||||||
|
func (h OldHTTPServer) createMeasures(meter metric.Meter) (metric.Int64Counter, metric.Int64Counter, metric.Float64Histogram) {
|
||||||
|
if meter == nil {
|
||||||
|
return noop.Int64Counter{}, noop.Int64Counter{}, noop.Float64Histogram{}
|
||||||
|
}
|
||||||
|
var err error
|
||||||
|
requestBytesCounter, err := meter.Int64Counter(
|
||||||
|
serverRequestSize,
|
||||||
|
metric.WithUnit("By"),
|
||||||
|
metric.WithDescription("Measures the size of HTTP request messages."),
|
||||||
|
)
|
||||||
|
handleErr(err)
|
||||||
|
|
||||||
|
responseBytesCounter, err := meter.Int64Counter(
|
||||||
|
serverResponseSize,
|
||||||
|
metric.WithUnit("By"),
|
||||||
|
metric.WithDescription("Measures the size of HTTP response messages."),
|
||||||
|
)
|
||||||
|
handleErr(err)
|
||||||
|
|
||||||
|
serverLatencyMeasure, err := meter.Float64Histogram(
|
||||||
|
serverDuration,
|
||||||
|
metric.WithUnit("ms"),
|
||||||
|
metric.WithDescription("Measures the duration of inbound HTTP requests."),
|
||||||
|
)
|
||||||
|
handleErr(err)
|
||||||
|
|
||||||
|
return requestBytesCounter, responseBytesCounter, serverLatencyMeasure
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o OldHTTPServer) MetricAttributes(server string, req *http.Request, statusCode int, additionalAttributes []attribute.KeyValue) []attribute.KeyValue {
|
||||||
|
n := len(additionalAttributes) + 3
|
||||||
|
var host string
|
||||||
|
var p int
|
||||||
|
if server == "" {
|
||||||
|
host, p = SplitHostPort(req.Host)
|
||||||
|
} else {
|
||||||
|
// Prioritize the primary server name.
|
||||||
|
host, p = SplitHostPort(server)
|
||||||
|
if p < 0 {
|
||||||
|
_, p = SplitHostPort(req.Host)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hostPort := requiredHTTPPort(req.TLS != nil, p)
|
||||||
|
if hostPort > 0 {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
protoName, protoVersion := netProtocol(req.Proto)
|
||||||
|
if protoName != "" {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
if protoVersion != "" {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
|
||||||
|
if statusCode > 0 {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
|
||||||
|
attributes := slices.Grow(additionalAttributes, n)
|
||||||
|
attributes = append(attributes,
|
||||||
|
semconv.HTTPMethod(standardizeHTTPMethod(req.Method)),
|
||||||
|
o.scheme(req.TLS != nil),
|
||||||
|
semconv.NetHostName(host))
|
||||||
|
|
||||||
|
if hostPort > 0 {
|
||||||
|
attributes = append(attributes, semconv.NetHostPort(hostPort))
|
||||||
|
}
|
||||||
|
if protoName != "" {
|
||||||
|
attributes = append(attributes, semconv.NetProtocolName(protoName))
|
||||||
|
}
|
||||||
|
if protoVersion != "" {
|
||||||
|
attributes = append(attributes, semconv.NetProtocolVersion(protoVersion))
|
||||||
|
}
|
||||||
|
|
||||||
|
if statusCode > 0 {
|
||||||
|
attributes = append(attributes, semconv.HTTPStatusCode(statusCode))
|
||||||
|
}
|
||||||
|
return attributes
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o OldHTTPServer) scheme(https bool) attribute.KeyValue { // nolint:revive
|
||||||
|
if https {
|
||||||
|
return semconv.HTTPSchemeHTTPS
|
||||||
|
}
|
||||||
|
return semconv.HTTPSchemeHTTP
|
||||||
|
}
|
||||||
|
|
||||||
|
type OldHTTPClient struct{}
|
||||||
|
|
||||||
|
func (o OldHTTPClient) RequestTraceAttrs(req *http.Request) []attribute.KeyValue {
|
||||||
|
return semconvutil.HTTPClientRequest(req)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o OldHTTPClient) ResponseTraceAttrs(resp *http.Response) []attribute.KeyValue {
|
||||||
|
return semconvutil.HTTPClientResponse(resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o OldHTTPClient) MetricAttributes(req *http.Request, statusCode int, additionalAttributes []attribute.KeyValue) []attribute.KeyValue {
|
||||||
|
/* The following semantic conventions are returned if present:
|
||||||
|
http.method string
|
||||||
|
http.status_code int
|
||||||
|
net.peer.name string
|
||||||
|
net.peer.port int
|
||||||
|
*/
|
||||||
|
|
||||||
|
n := 2 // method, peer name.
|
||||||
|
var h string
|
||||||
|
if req.URL != nil {
|
||||||
|
h = req.URL.Host
|
||||||
|
}
|
||||||
|
var requestHost string
|
||||||
|
var requestPort int
|
||||||
|
for _, hostport := range []string{h, req.Header.Get("Host")} {
|
||||||
|
requestHost, requestPort = SplitHostPort(hostport)
|
||||||
|
if requestHost != "" || requestPort > 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
port := requiredHTTPPort(req.URL != nil && req.URL.Scheme == "https", requestPort)
|
||||||
|
if port > 0 {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
|
||||||
|
if statusCode > 0 {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
|
||||||
|
attributes := slices.Grow(additionalAttributes, n)
|
||||||
|
attributes = append(attributes,
|
||||||
|
semconv.HTTPMethod(standardizeHTTPMethod(req.Method)),
|
||||||
|
semconv.NetPeerName(requestHost),
|
||||||
|
)
|
||||||
|
|
||||||
|
if port > 0 {
|
||||||
|
attributes = append(attributes, semconv.NetPeerPort(port))
|
||||||
|
}
|
||||||
|
|
||||||
|
if statusCode > 0 {
|
||||||
|
attributes = append(attributes, semconv.HTTPStatusCode(statusCode))
|
||||||
|
}
|
||||||
|
return attributes
|
||||||
|
}
|
||||||
|
|
||||||
|
// Client HTTP metrics.
|
||||||
|
const (
|
||||||
|
clientRequestSize = "http.client.request.size" // Incoming request bytes total
|
||||||
|
clientResponseSize = "http.client.response.size" // Incoming response bytes total
|
||||||
|
clientDuration = "http.client.duration" // Incoming end to end duration, milliseconds
|
||||||
|
)
|
||||||
|
|
||||||
|
func (o OldHTTPClient) createMeasures(meter metric.Meter) (metric.Int64Counter, metric.Int64Counter, metric.Float64Histogram) {
|
||||||
|
if meter == nil {
|
||||||
|
return noop.Int64Counter{}, noop.Int64Counter{}, noop.Float64Histogram{}
|
||||||
|
}
|
||||||
|
requestBytesCounter, err := meter.Int64Counter(
|
||||||
|
clientRequestSize,
|
||||||
|
metric.WithUnit("By"),
|
||||||
|
metric.WithDescription("Measures the size of HTTP request messages."),
|
||||||
|
)
|
||||||
|
handleErr(err)
|
||||||
|
|
||||||
|
responseBytesCounter, err := meter.Int64Counter(
|
||||||
|
clientResponseSize,
|
||||||
|
metric.WithUnit("By"),
|
||||||
|
metric.WithDescription("Measures the size of HTTP response messages."),
|
||||||
|
)
|
||||||
|
handleErr(err)
|
||||||
|
|
||||||
|
latencyMeasure, err := meter.Float64Histogram(
|
||||||
|
clientDuration,
|
||||||
|
metric.WithUnit("ms"),
|
||||||
|
metric.WithDescription("Measures the duration of outbound HTTP requests."),
|
||||||
|
)
|
||||||
|
handleErr(err)
|
||||||
|
|
||||||
|
return requestBytesCounter, responseBytesCounter, latencyMeasure
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attributes for httptrace.
|
||||||
|
func (c OldHTTPClient) TraceAttributes(host string) []attribute.KeyValue {
|
||||||
|
return []attribute.KeyValue{
|
||||||
|
semconv.NetHostName(host),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,197 +0,0 @@
|
|||||||
// Copyright The OpenTelemetry Authors
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
package semconv // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
|
||||||
semconvNew "go.opentelemetry.io/otel/semconv/v1.24.0"
|
|
||||||
)
|
|
||||||
|
|
||||||
type newHTTPServer struct{}
|
|
||||||
|
|
||||||
// TraceRequest returns trace attributes for an HTTP request received by a
|
|
||||||
// server.
|
|
||||||
//
|
|
||||||
// The server must be the primary server name if it is known. For example this
|
|
||||||
// would be the ServerName directive
|
|
||||||
// (https://httpd.apache.org/docs/2.4/mod/core.html#servername) for an Apache
|
|
||||||
// server, and the server_name directive
|
|
||||||
// (http://nginx.org/en/docs/http/ngx_http_core_module.html#server_name) for an
|
|
||||||
// nginx server. More generically, the primary server name would be the host
|
|
||||||
// header value that matches the default virtual host of an HTTP server. It
|
|
||||||
// should include the host identifier and if a port is used to route to the
|
|
||||||
// server that port identifier should be included as an appropriate port
|
|
||||||
// suffix.
|
|
||||||
//
|
|
||||||
// If the primary server name is not known, server should be an empty string.
|
|
||||||
// The req Host will be used to determine the server instead.
|
|
||||||
func (n newHTTPServer) RequestTraceAttrs(server string, req *http.Request) []attribute.KeyValue {
|
|
||||||
count := 3 // ServerAddress, Method, Scheme
|
|
||||||
|
|
||||||
var host string
|
|
||||||
var p int
|
|
||||||
if server == "" {
|
|
||||||
host, p = splitHostPort(req.Host)
|
|
||||||
} else {
|
|
||||||
// Prioritize the primary server name.
|
|
||||||
host, p = splitHostPort(server)
|
|
||||||
if p < 0 {
|
|
||||||
_, p = splitHostPort(req.Host)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hostPort := requiredHTTPPort(req.TLS != nil, p)
|
|
||||||
if hostPort > 0 {
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
|
|
||||||
method, methodOriginal := n.method(req.Method)
|
|
||||||
if methodOriginal != (attribute.KeyValue{}) {
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
|
|
||||||
scheme := n.scheme(req.TLS != nil)
|
|
||||||
|
|
||||||
if peer, peerPort := splitHostPort(req.RemoteAddr); peer != "" {
|
|
||||||
// The Go HTTP server sets RemoteAddr to "IP:port", this will not be a
|
|
||||||
// file-path that would be interpreted with a sock family.
|
|
||||||
count++
|
|
||||||
if peerPort > 0 {
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
useragent := req.UserAgent()
|
|
||||||
if useragent != "" {
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
|
|
||||||
clientIP := serverClientIP(req.Header.Get("X-Forwarded-For"))
|
|
||||||
if clientIP != "" {
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
|
|
||||||
if req.URL != nil && req.URL.Path != "" {
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
|
|
||||||
protoName, protoVersion := netProtocol(req.Proto)
|
|
||||||
if protoName != "" && protoName != "http" {
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
if protoVersion != "" {
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
|
|
||||||
attrs := make([]attribute.KeyValue, 0, count)
|
|
||||||
attrs = append(attrs,
|
|
||||||
semconvNew.ServerAddress(host),
|
|
||||||
method,
|
|
||||||
scheme,
|
|
||||||
)
|
|
||||||
|
|
||||||
if hostPort > 0 {
|
|
||||||
attrs = append(attrs, semconvNew.ServerPort(hostPort))
|
|
||||||
}
|
|
||||||
if methodOriginal != (attribute.KeyValue{}) {
|
|
||||||
attrs = append(attrs, methodOriginal)
|
|
||||||
}
|
|
||||||
|
|
||||||
if peer, peerPort := splitHostPort(req.RemoteAddr); peer != "" {
|
|
||||||
// The Go HTTP server sets RemoteAddr to "IP:port", this will not be a
|
|
||||||
// file-path that would be interpreted with a sock family.
|
|
||||||
attrs = append(attrs, semconvNew.NetworkPeerAddress(peer))
|
|
||||||
if peerPort > 0 {
|
|
||||||
attrs = append(attrs, semconvNew.NetworkPeerPort(peerPort))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if useragent := req.UserAgent(); useragent != "" {
|
|
||||||
attrs = append(attrs, semconvNew.UserAgentOriginal(useragent))
|
|
||||||
}
|
|
||||||
|
|
||||||
if clientIP != "" {
|
|
||||||
attrs = append(attrs, semconvNew.ClientAddress(clientIP))
|
|
||||||
}
|
|
||||||
|
|
||||||
if req.URL != nil && req.URL.Path != "" {
|
|
||||||
attrs = append(attrs, semconvNew.URLPath(req.URL.Path))
|
|
||||||
}
|
|
||||||
|
|
||||||
if protoName != "" && protoName != "http" {
|
|
||||||
attrs = append(attrs, semconvNew.NetworkProtocolName(protoName))
|
|
||||||
}
|
|
||||||
if protoVersion != "" {
|
|
||||||
attrs = append(attrs, semconvNew.NetworkProtocolVersion(protoVersion))
|
|
||||||
}
|
|
||||||
|
|
||||||
return attrs
|
|
||||||
}
|
|
||||||
|
|
||||||
func (n newHTTPServer) method(method string) (attribute.KeyValue, attribute.KeyValue) {
|
|
||||||
if method == "" {
|
|
||||||
return semconvNew.HTTPRequestMethodGet, attribute.KeyValue{}
|
|
||||||
}
|
|
||||||
if attr, ok := methodLookup[method]; ok {
|
|
||||||
return attr, attribute.KeyValue{}
|
|
||||||
}
|
|
||||||
|
|
||||||
orig := semconvNew.HTTPRequestMethodOriginal(method)
|
|
||||||
if attr, ok := methodLookup[strings.ToUpper(method)]; ok {
|
|
||||||
return attr, orig
|
|
||||||
}
|
|
||||||
return semconvNew.HTTPRequestMethodGet, orig
|
|
||||||
}
|
|
||||||
|
|
||||||
func (n newHTTPServer) scheme(https bool) attribute.KeyValue { // nolint:revive
|
|
||||||
if https {
|
|
||||||
return semconvNew.URLScheme("https")
|
|
||||||
}
|
|
||||||
return semconvNew.URLScheme("http")
|
|
||||||
}
|
|
||||||
|
|
||||||
// TraceResponse returns trace attributes for telemetry from an HTTP response.
|
|
||||||
//
|
|
||||||
// If any of the fields in the ResponseTelemetry are not set the attribute will be omitted.
|
|
||||||
func (n newHTTPServer) ResponseTraceAttrs(resp ResponseTelemetry) []attribute.KeyValue {
|
|
||||||
var count int
|
|
||||||
|
|
||||||
if resp.ReadBytes > 0 {
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
if resp.WriteBytes > 0 {
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
if resp.StatusCode > 0 {
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
|
|
||||||
attributes := make([]attribute.KeyValue, 0, count)
|
|
||||||
|
|
||||||
if resp.ReadBytes > 0 {
|
|
||||||
attributes = append(attributes,
|
|
||||||
semconvNew.HTTPRequestBodySize(int(resp.ReadBytes)),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
if resp.WriteBytes > 0 {
|
|
||||||
attributes = append(attributes,
|
|
||||||
semconvNew.HTTPResponseBodySize(int(resp.WriteBytes)),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
if resp.StatusCode > 0 {
|
|
||||||
attributes = append(attributes,
|
|
||||||
semconvNew.HTTPResponseStatusCode(resp.StatusCode),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
return attributes
|
|
||||||
}
|
|
||||||
|
|
||||||
// Route returns the attribute for the route.
|
|
||||||
func (n newHTTPServer) Route(route string) attribute.KeyValue {
|
|
||||||
return semconvNew.HTTPRoute(route)
|
|
||||||
}
|
|
||||||
@@ -195,11 +195,20 @@ func splitHostPort(hostport string) (host string, port int) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
return host, int(p)
|
return host, int(p) // nolint: gosec // Bitsize checked to be 16 above.
|
||||||
}
|
}
|
||||||
|
|
||||||
func netProtocol(proto string) (name string, version string) {
|
func netProtocol(proto string) (name string, version string) {
|
||||||
name, version, _ = strings.Cut(proto, "/")
|
name, version, _ = strings.Cut(proto, "/")
|
||||||
name = strings.ToLower(name)
|
switch name {
|
||||||
|
case "HTTP":
|
||||||
|
name = "http"
|
||||||
|
case "QUIC":
|
||||||
|
name = "quic"
|
||||||
|
case "SPDY":
|
||||||
|
name = "spdy"
|
||||||
|
default:
|
||||||
|
name = strings.ToLower(name)
|
||||||
|
}
|
||||||
return name, version
|
return name, version
|
||||||
}
|
}
|
||||||
|
|||||||
29
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/start_time_context.go
generated
vendored
Normal file
29
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/start_time_context.go
generated
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package otelhttp // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type startTimeContextKeyType int
|
||||||
|
|
||||||
|
const startTimeContextKey startTimeContextKeyType = 0
|
||||||
|
|
||||||
|
// ContextWithStartTime returns a new context with the provided start time. The
|
||||||
|
// start time will be used for metrics and traces emitted by the
|
||||||
|
// instrumentation. Only one labeller can be injected into the context.
|
||||||
|
// Injecting it multiple times will override the previous calls.
|
||||||
|
func ContextWithStartTime(parent context.Context, start time.Time) context.Context {
|
||||||
|
return context.WithValue(parent, startTimeContextKey, start)
|
||||||
|
}
|
||||||
|
|
||||||
|
// StartTimeFromContext retrieves a time.Time from the provided context if one
|
||||||
|
// is available. If no start time was found in the provided context, a new,
|
||||||
|
// zero start time is returned and the second return value is false.
|
||||||
|
func StartTimeFromContext(ctx context.Context) time.Time {
|
||||||
|
t, _ := ctx.Value(startTimeContextKey).(time.Time)
|
||||||
|
return t
|
||||||
|
}
|
||||||
106
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/transport.go
generated
vendored
106
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/transport.go
generated
vendored
@@ -11,13 +11,13 @@ import (
|
|||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil"
|
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/request"
|
||||||
|
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv"
|
||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/codes"
|
"go.opentelemetry.io/otel/codes"
|
||||||
"go.opentelemetry.io/otel/metric"
|
|
||||||
"go.opentelemetry.io/otel/propagation"
|
"go.opentelemetry.io/otel/propagation"
|
||||||
semconv "go.opentelemetry.io/otel/semconv/v1.20.0"
|
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -26,17 +26,15 @@ import (
|
|||||||
type Transport struct {
|
type Transport struct {
|
||||||
rt http.RoundTripper
|
rt http.RoundTripper
|
||||||
|
|
||||||
tracer trace.Tracer
|
tracer trace.Tracer
|
||||||
meter metric.Meter
|
propagators propagation.TextMapPropagator
|
||||||
propagators propagation.TextMapPropagator
|
spanStartOptions []trace.SpanStartOption
|
||||||
spanStartOptions []trace.SpanStartOption
|
filters []Filter
|
||||||
filters []Filter
|
spanNameFormatter func(string, *http.Request) string
|
||||||
spanNameFormatter func(string, *http.Request) string
|
clientTrace func(context.Context) *httptrace.ClientTrace
|
||||||
clientTrace func(context.Context) *httptrace.ClientTrace
|
metricAttributesFn func(*http.Request) []attribute.KeyValue
|
||||||
|
|
||||||
requestBytesCounter metric.Int64Counter
|
semconv semconv.HTTPClient
|
||||||
responseBytesCounter metric.Int64Counter
|
|
||||||
latencyMeasure metric.Float64Histogram
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ http.RoundTripper = &Transport{}
|
var _ http.RoundTripper = &Transport{}
|
||||||
@@ -63,43 +61,19 @@ func NewTransport(base http.RoundTripper, opts ...Option) *Transport {
|
|||||||
|
|
||||||
c := newConfig(append(defaultOpts, opts...)...)
|
c := newConfig(append(defaultOpts, opts...)...)
|
||||||
t.applyConfig(c)
|
t.applyConfig(c)
|
||||||
t.createMeasures()
|
|
||||||
|
|
||||||
return &t
|
return &t
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Transport) applyConfig(c *config) {
|
func (t *Transport) applyConfig(c *config) {
|
||||||
t.tracer = c.Tracer
|
t.tracer = c.Tracer
|
||||||
t.meter = c.Meter
|
|
||||||
t.propagators = c.Propagators
|
t.propagators = c.Propagators
|
||||||
t.spanStartOptions = c.SpanStartOptions
|
t.spanStartOptions = c.SpanStartOptions
|
||||||
t.filters = c.Filters
|
t.filters = c.Filters
|
||||||
t.spanNameFormatter = c.SpanNameFormatter
|
t.spanNameFormatter = c.SpanNameFormatter
|
||||||
t.clientTrace = c.ClientTrace
|
t.clientTrace = c.ClientTrace
|
||||||
}
|
t.semconv = semconv.NewHTTPClient(c.Meter)
|
||||||
|
t.metricAttributesFn = c.MetricAttributesFn
|
||||||
func (t *Transport) createMeasures() {
|
|
||||||
var err error
|
|
||||||
t.requestBytesCounter, err = t.meter.Int64Counter(
|
|
||||||
clientRequestSize,
|
|
||||||
metric.WithUnit("By"),
|
|
||||||
metric.WithDescription("Measures the size of HTTP request messages."),
|
|
||||||
)
|
|
||||||
handleErr(err)
|
|
||||||
|
|
||||||
t.responseBytesCounter, err = t.meter.Int64Counter(
|
|
||||||
clientResponseSize,
|
|
||||||
metric.WithUnit("By"),
|
|
||||||
metric.WithDescription("Measures the size of HTTP response messages."),
|
|
||||||
)
|
|
||||||
handleErr(err)
|
|
||||||
|
|
||||||
t.latencyMeasure, err = t.meter.Float64Histogram(
|
|
||||||
clientDuration,
|
|
||||||
metric.WithUnit("ms"),
|
|
||||||
metric.WithDescription("Measures the duration of outbound HTTP requests."),
|
|
||||||
)
|
|
||||||
handleErr(err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func defaultTransportFormatter(_ string, r *http.Request) string {
|
func defaultTransportFormatter(_ string, r *http.Request) string {
|
||||||
@@ -143,54 +117,68 @@ func (t *Transport) RoundTrip(r *http.Request) (*http.Response, error) {
|
|||||||
|
|
||||||
r = r.Clone(ctx) // According to RoundTripper spec, we shouldn't modify the origin request.
|
r = r.Clone(ctx) // According to RoundTripper spec, we shouldn't modify the origin request.
|
||||||
|
|
||||||
// use a body wrapper to determine the request size
|
|
||||||
var bw bodyWrapper
|
|
||||||
// if request body is nil or NoBody, we don't want to mutate the body as it
|
// if request body is nil or NoBody, we don't want to mutate the body as it
|
||||||
// will affect the identity of it in an unforeseeable way because we assert
|
// will affect the identity of it in an unforeseeable way because we assert
|
||||||
// ReadCloser fulfills a certain interface and it is indeed nil or NoBody.
|
// ReadCloser fulfills a certain interface and it is indeed nil or NoBody.
|
||||||
|
bw := request.NewBodyWrapper(r.Body, func(int64) {})
|
||||||
if r.Body != nil && r.Body != http.NoBody {
|
if r.Body != nil && r.Body != http.NoBody {
|
||||||
bw.ReadCloser = r.Body
|
r.Body = bw
|
||||||
// noop to prevent nil panic. not using this record fun yet.
|
|
||||||
bw.record = func(int64) {}
|
|
||||||
r.Body = &bw
|
|
||||||
}
|
}
|
||||||
|
|
||||||
span.SetAttributes(semconvutil.HTTPClientRequest(r)...)
|
span.SetAttributes(t.semconv.RequestTraceAttrs(r)...)
|
||||||
t.propagators.Inject(ctx, propagation.HeaderCarrier(r.Header))
|
t.propagators.Inject(ctx, propagation.HeaderCarrier(r.Header))
|
||||||
|
|
||||||
res, err := t.rt.RoundTrip(r)
|
res, err := t.rt.RoundTrip(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
span.RecordError(err)
|
// set error type attribute if the error is part of the predefined
|
||||||
|
// error types.
|
||||||
|
// otherwise, record it as an exception
|
||||||
|
if errType := t.semconv.ErrorType(err); errType.Valid() {
|
||||||
|
span.SetAttributes(errType)
|
||||||
|
} else {
|
||||||
|
span.RecordError(err)
|
||||||
|
}
|
||||||
|
|
||||||
span.SetStatus(codes.Error, err.Error())
|
span.SetStatus(codes.Error, err.Error())
|
||||||
span.End()
|
span.End()
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// metrics
|
// metrics
|
||||||
metricAttrs := append(labeler.Get(), semconvutil.HTTPClientRequestMetrics(r)...)
|
metricOpts := t.semconv.MetricOptions(semconv.MetricAttributes{
|
||||||
if res.StatusCode > 0 {
|
Req: r,
|
||||||
metricAttrs = append(metricAttrs, semconv.HTTPStatusCode(res.StatusCode))
|
StatusCode: res.StatusCode,
|
||||||
}
|
AdditionalAttributes: append(labeler.Get(), t.metricAttributesFromRequest(r)...),
|
||||||
o := metric.WithAttributeSet(attribute.NewSet(metricAttrs...))
|
})
|
||||||
addOpts := []metric.AddOption{o} // Allocate vararg slice once.
|
|
||||||
t.requestBytesCounter.Add(ctx, bw.read.Load(), addOpts...)
|
|
||||||
// For handling response bytes we leverage a callback when the client reads the http response
|
// For handling response bytes we leverage a callback when the client reads the http response
|
||||||
readRecordFunc := func(n int64) {
|
readRecordFunc := func(n int64) {
|
||||||
t.responseBytesCounter.Add(ctx, n, addOpts...)
|
t.semconv.RecordResponseSize(ctx, n, metricOpts)
|
||||||
}
|
}
|
||||||
|
|
||||||
// traces
|
// traces
|
||||||
span.SetAttributes(semconvutil.HTTPClientResponse(res)...)
|
span.SetAttributes(t.semconv.ResponseTraceAttrs(res)...)
|
||||||
span.SetStatus(semconvutil.HTTPClientStatus(res.StatusCode))
|
span.SetStatus(t.semconv.Status(res.StatusCode))
|
||||||
|
|
||||||
res.Body = newWrappedBody(span, readRecordFunc, res.Body)
|
res.Body = newWrappedBody(span, readRecordFunc, res.Body)
|
||||||
|
|
||||||
// Use floating point division here for higher precision (instead of Millisecond method).
|
// Use floating point division here for higher precision (instead of Millisecond method).
|
||||||
elapsedTime := float64(time.Since(requestStartTime)) / float64(time.Millisecond)
|
elapsedTime := float64(time.Since(requestStartTime)) / float64(time.Millisecond)
|
||||||
|
|
||||||
t.latencyMeasure.Record(ctx, elapsedTime, o)
|
t.semconv.RecordMetrics(ctx, semconv.MetricData{
|
||||||
|
RequestSize: bw.BytesRead(),
|
||||||
|
ElapsedTime: elapsedTime,
|
||||||
|
}, metricOpts)
|
||||||
|
|
||||||
return res, err
|
return res, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Transport) metricAttributesFromRequest(r *http.Request) []attribute.KeyValue {
|
||||||
|
var attributeForRequest []attribute.KeyValue
|
||||||
|
if t.metricAttributesFn != nil {
|
||||||
|
attributeForRequest = t.metricAttributesFn(r)
|
||||||
|
}
|
||||||
|
return attributeForRequest
|
||||||
}
|
}
|
||||||
|
|
||||||
// newWrappedBody returns a new and appropriately scoped *wrappedBody as an
|
// newWrappedBody returns a new and appropriately scoped *wrappedBody as an
|
||||||
|
|||||||
2
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/version.go
generated
vendored
2
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/version.go
generated
vendored
@@ -5,7 +5,7 @@ package otelhttp // import "go.opentelemetry.io/contrib/instrumentation/net/http
|
|||||||
|
|
||||||
// Version is the current release version of the otelhttp instrumentation.
|
// Version is the current release version of the otelhttp instrumentation.
|
||||||
func Version() string {
|
func Version() string {
|
||||||
return "0.53.0"
|
return "0.60.0"
|
||||||
// This string is updated by the pre_release.sh script during release
|
// This string is updated by the pre_release.sh script during release
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
99
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/wrap.go
generated
vendored
99
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/wrap.go
generated
vendored
@@ -1,99 +0,0 @@
|
|||||||
// Copyright The OpenTelemetry Authors
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
package otelhttp // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"io"
|
|
||||||
"net/http"
|
|
||||||
"sync/atomic"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/propagation"
|
|
||||||
)
|
|
||||||
|
|
||||||
var _ io.ReadCloser = &bodyWrapper{}
|
|
||||||
|
|
||||||
// bodyWrapper wraps a http.Request.Body (an io.ReadCloser) to track the number
|
|
||||||
// of bytes read and the last error.
|
|
||||||
type bodyWrapper struct {
|
|
||||||
io.ReadCloser
|
|
||||||
record func(n int64) // must not be nil
|
|
||||||
|
|
||||||
read atomic.Int64
|
|
||||||
err error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *bodyWrapper) Read(b []byte) (int, error) {
|
|
||||||
n, err := w.ReadCloser.Read(b)
|
|
||||||
n1 := int64(n)
|
|
||||||
w.read.Add(n1)
|
|
||||||
w.err = err
|
|
||||||
w.record(n1)
|
|
||||||
return n, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *bodyWrapper) Close() error {
|
|
||||||
return w.ReadCloser.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ http.ResponseWriter = &respWriterWrapper{}
|
|
||||||
|
|
||||||
// respWriterWrapper wraps a http.ResponseWriter in order to track the number of
|
|
||||||
// bytes written, the last error, and to catch the first written statusCode.
|
|
||||||
// TODO: The wrapped http.ResponseWriter doesn't implement any of the optional
|
|
||||||
// types (http.Hijacker, http.Pusher, http.CloseNotifier, http.Flusher, etc)
|
|
||||||
// that may be useful when using it in real life situations.
|
|
||||||
type respWriterWrapper struct {
|
|
||||||
http.ResponseWriter
|
|
||||||
record func(n int64) // must not be nil
|
|
||||||
|
|
||||||
// used to inject the header
|
|
||||||
ctx context.Context
|
|
||||||
|
|
||||||
props propagation.TextMapPropagator
|
|
||||||
|
|
||||||
written int64
|
|
||||||
statusCode int
|
|
||||||
err error
|
|
||||||
wroteHeader bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *respWriterWrapper) Header() http.Header {
|
|
||||||
return w.ResponseWriter.Header()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *respWriterWrapper) Write(p []byte) (int, error) {
|
|
||||||
if !w.wroteHeader {
|
|
||||||
w.WriteHeader(http.StatusOK)
|
|
||||||
}
|
|
||||||
n, err := w.ResponseWriter.Write(p)
|
|
||||||
n1 := int64(n)
|
|
||||||
w.record(n1)
|
|
||||||
w.written += n1
|
|
||||||
w.err = err
|
|
||||||
return n, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// WriteHeader persists initial statusCode for span attribution.
|
|
||||||
// All calls to WriteHeader will be propagated to the underlying ResponseWriter
|
|
||||||
// and will persist the statusCode from the first call.
|
|
||||||
// Blocking consecutive calls to WriteHeader alters expected behavior and will
|
|
||||||
// remove warning logs from net/http where developers will notice incorrect handler implementations.
|
|
||||||
func (w *respWriterWrapper) WriteHeader(statusCode int) {
|
|
||||||
if !w.wroteHeader {
|
|
||||||
w.wroteHeader = true
|
|
||||||
w.statusCode = statusCode
|
|
||||||
}
|
|
||||||
w.ResponseWriter.WriteHeader(statusCode)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *respWriterWrapper) Flush() {
|
|
||||||
if !w.wroteHeader {
|
|
||||||
w.WriteHeader(http.StatusOK)
|
|
||||||
}
|
|
||||||
|
|
||||||
if f, ok := w.ResponseWriter.(http.Flusher); ok {
|
|
||||||
f.Flush()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
3
vendor/go.opentelemetry.io/otel/metric/noop/README.md
generated
vendored
Normal file
3
vendor/go.opentelemetry.io/otel/metric/noop/README.md
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Metric Noop
|
||||||
|
|
||||||
|
[](https://pkg.go.dev/go.opentelemetry.io/otel/metric/noop)
|
||||||
281
vendor/go.opentelemetry.io/otel/metric/noop/noop.go
generated
vendored
Normal file
281
vendor/go.opentelemetry.io/otel/metric/noop/noop.go
generated
vendored
Normal file
@@ -0,0 +1,281 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
// Package noop provides an implementation of the OpenTelemetry metric API that
|
||||||
|
// produces no telemetry and minimizes used computation resources.
|
||||||
|
//
|
||||||
|
// Using this package to implement the OpenTelemetry metric API will
|
||||||
|
// effectively disable OpenTelemetry.
|
||||||
|
//
|
||||||
|
// This implementation can be embedded in other implementations of the
|
||||||
|
// OpenTelemetry metric API. Doing so will mean the implementation defaults to
|
||||||
|
// no operation for methods it does not implement.
|
||||||
|
package noop // import "go.opentelemetry.io/otel/metric/noop"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/metric"
|
||||||
|
"go.opentelemetry.io/otel/metric/embedded"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// Compile-time check this implements the OpenTelemetry API.
|
||||||
|
|
||||||
|
_ metric.MeterProvider = MeterProvider{}
|
||||||
|
_ metric.Meter = Meter{}
|
||||||
|
_ metric.Observer = Observer{}
|
||||||
|
_ metric.Registration = Registration{}
|
||||||
|
_ metric.Int64Counter = Int64Counter{}
|
||||||
|
_ metric.Float64Counter = Float64Counter{}
|
||||||
|
_ metric.Int64UpDownCounter = Int64UpDownCounter{}
|
||||||
|
_ metric.Float64UpDownCounter = Float64UpDownCounter{}
|
||||||
|
_ metric.Int64Histogram = Int64Histogram{}
|
||||||
|
_ metric.Float64Histogram = Float64Histogram{}
|
||||||
|
_ metric.Int64Gauge = Int64Gauge{}
|
||||||
|
_ metric.Float64Gauge = Float64Gauge{}
|
||||||
|
_ metric.Int64ObservableCounter = Int64ObservableCounter{}
|
||||||
|
_ metric.Float64ObservableCounter = Float64ObservableCounter{}
|
||||||
|
_ metric.Int64ObservableGauge = Int64ObservableGauge{}
|
||||||
|
_ metric.Float64ObservableGauge = Float64ObservableGauge{}
|
||||||
|
_ metric.Int64ObservableUpDownCounter = Int64ObservableUpDownCounter{}
|
||||||
|
_ metric.Float64ObservableUpDownCounter = Float64ObservableUpDownCounter{}
|
||||||
|
_ metric.Int64Observer = Int64Observer{}
|
||||||
|
_ metric.Float64Observer = Float64Observer{}
|
||||||
|
)
|
||||||
|
|
||||||
|
// MeterProvider is an OpenTelemetry No-Op MeterProvider.
|
||||||
|
type MeterProvider struct{ embedded.MeterProvider }
|
||||||
|
|
||||||
|
// NewMeterProvider returns a MeterProvider that does not record any telemetry.
|
||||||
|
func NewMeterProvider() MeterProvider {
|
||||||
|
return MeterProvider{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Meter returns an OpenTelemetry Meter that does not record any telemetry.
|
||||||
|
func (MeterProvider) Meter(string, ...metric.MeterOption) metric.Meter {
|
||||||
|
return Meter{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Meter is an OpenTelemetry No-Op Meter.
|
||||||
|
type Meter struct{ embedded.Meter }
|
||||||
|
|
||||||
|
// Int64Counter returns a Counter used to record int64 measurements that
|
||||||
|
// produces no telemetry.
|
||||||
|
func (Meter) Int64Counter(string, ...metric.Int64CounterOption) (metric.Int64Counter, error) {
|
||||||
|
return Int64Counter{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64UpDownCounter returns an UpDownCounter used to record int64
|
||||||
|
// measurements that produces no telemetry.
|
||||||
|
func (Meter) Int64UpDownCounter(string, ...metric.Int64UpDownCounterOption) (metric.Int64UpDownCounter, error) {
|
||||||
|
return Int64UpDownCounter{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64Histogram returns a Histogram used to record int64 measurements that
|
||||||
|
// produces no telemetry.
|
||||||
|
func (Meter) Int64Histogram(string, ...metric.Int64HistogramOption) (metric.Int64Histogram, error) {
|
||||||
|
return Int64Histogram{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64Gauge returns a Gauge used to record int64 measurements that
|
||||||
|
// produces no telemetry.
|
||||||
|
func (Meter) Int64Gauge(string, ...metric.Int64GaugeOption) (metric.Int64Gauge, error) {
|
||||||
|
return Int64Gauge{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableCounter returns an ObservableCounter used to record int64
|
||||||
|
// measurements that produces no telemetry.
|
||||||
|
func (Meter) Int64ObservableCounter(string, ...metric.Int64ObservableCounterOption) (metric.Int64ObservableCounter, error) {
|
||||||
|
return Int64ObservableCounter{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableUpDownCounter returns an ObservableUpDownCounter used to
|
||||||
|
// record int64 measurements that produces no telemetry.
|
||||||
|
func (Meter) Int64ObservableUpDownCounter(string, ...metric.Int64ObservableUpDownCounterOption) (metric.Int64ObservableUpDownCounter, error) {
|
||||||
|
return Int64ObservableUpDownCounter{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableGauge returns an ObservableGauge used to record int64
|
||||||
|
// measurements that produces no telemetry.
|
||||||
|
func (Meter) Int64ObservableGauge(string, ...metric.Int64ObservableGaugeOption) (metric.Int64ObservableGauge, error) {
|
||||||
|
return Int64ObservableGauge{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64Counter returns a Counter used to record int64 measurements that
|
||||||
|
// produces no telemetry.
|
||||||
|
func (Meter) Float64Counter(string, ...metric.Float64CounterOption) (metric.Float64Counter, error) {
|
||||||
|
return Float64Counter{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64UpDownCounter returns an UpDownCounter used to record int64
|
||||||
|
// measurements that produces no telemetry.
|
||||||
|
func (Meter) Float64UpDownCounter(string, ...metric.Float64UpDownCounterOption) (metric.Float64UpDownCounter, error) {
|
||||||
|
return Float64UpDownCounter{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64Histogram returns a Histogram used to record int64 measurements that
|
||||||
|
// produces no telemetry.
|
||||||
|
func (Meter) Float64Histogram(string, ...metric.Float64HistogramOption) (metric.Float64Histogram, error) {
|
||||||
|
return Float64Histogram{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64Gauge returns a Gauge used to record float64 measurements that
|
||||||
|
// produces no telemetry.
|
||||||
|
func (Meter) Float64Gauge(string, ...metric.Float64GaugeOption) (metric.Float64Gauge, error) {
|
||||||
|
return Float64Gauge{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableCounter returns an ObservableCounter used to record int64
|
||||||
|
// measurements that produces no telemetry.
|
||||||
|
func (Meter) Float64ObservableCounter(string, ...metric.Float64ObservableCounterOption) (metric.Float64ObservableCounter, error) {
|
||||||
|
return Float64ObservableCounter{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableUpDownCounter returns an ObservableUpDownCounter used to
|
||||||
|
// record int64 measurements that produces no telemetry.
|
||||||
|
func (Meter) Float64ObservableUpDownCounter(string, ...metric.Float64ObservableUpDownCounterOption) (metric.Float64ObservableUpDownCounter, error) {
|
||||||
|
return Float64ObservableUpDownCounter{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableGauge returns an ObservableGauge used to record int64
|
||||||
|
// measurements that produces no telemetry.
|
||||||
|
func (Meter) Float64ObservableGauge(string, ...metric.Float64ObservableGaugeOption) (metric.Float64ObservableGauge, error) {
|
||||||
|
return Float64ObservableGauge{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterCallback performs no operation.
|
||||||
|
func (Meter) RegisterCallback(metric.Callback, ...metric.Observable) (metric.Registration, error) {
|
||||||
|
return Registration{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Observer acts as a recorder of measurements for multiple instruments in a
|
||||||
|
// Callback, it performing no operation.
|
||||||
|
type Observer struct{ embedded.Observer }
|
||||||
|
|
||||||
|
// ObserveFloat64 performs no operation.
|
||||||
|
func (Observer) ObserveFloat64(metric.Float64Observable, float64, ...metric.ObserveOption) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// ObserveInt64 performs no operation.
|
||||||
|
func (Observer) ObserveInt64(metric.Int64Observable, int64, ...metric.ObserveOption) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Registration is the registration of a Callback with a No-Op Meter.
|
||||||
|
type Registration struct{ embedded.Registration }
|
||||||
|
|
||||||
|
// Unregister unregisters the Callback the Registration represents with the
|
||||||
|
// No-Op Meter. This will always return nil because the No-Op Meter performs no
|
||||||
|
// operation, including hold any record of registrations.
|
||||||
|
func (Registration) Unregister() error { return nil }
|
||||||
|
|
||||||
|
// Int64Counter is an OpenTelemetry Counter used to record int64 measurements.
|
||||||
|
// It produces no telemetry.
|
||||||
|
type Int64Counter struct{ embedded.Int64Counter }
|
||||||
|
|
||||||
|
// Add performs no operation.
|
||||||
|
func (Int64Counter) Add(context.Context, int64, ...metric.AddOption) {}
|
||||||
|
|
||||||
|
// Float64Counter is an OpenTelemetry Counter used to record float64
|
||||||
|
// measurements. It produces no telemetry.
|
||||||
|
type Float64Counter struct{ embedded.Float64Counter }
|
||||||
|
|
||||||
|
// Add performs no operation.
|
||||||
|
func (Float64Counter) Add(context.Context, float64, ...metric.AddOption) {}
|
||||||
|
|
||||||
|
// Int64UpDownCounter is an OpenTelemetry UpDownCounter used to record int64
|
||||||
|
// measurements. It produces no telemetry.
|
||||||
|
type Int64UpDownCounter struct{ embedded.Int64UpDownCounter }
|
||||||
|
|
||||||
|
// Add performs no operation.
|
||||||
|
func (Int64UpDownCounter) Add(context.Context, int64, ...metric.AddOption) {}
|
||||||
|
|
||||||
|
// Float64UpDownCounter is an OpenTelemetry UpDownCounter used to record
|
||||||
|
// float64 measurements. It produces no telemetry.
|
||||||
|
type Float64UpDownCounter struct{ embedded.Float64UpDownCounter }
|
||||||
|
|
||||||
|
// Add performs no operation.
|
||||||
|
func (Float64UpDownCounter) Add(context.Context, float64, ...metric.AddOption) {}
|
||||||
|
|
||||||
|
// Int64Histogram is an OpenTelemetry Histogram used to record int64
|
||||||
|
// measurements. It produces no telemetry.
|
||||||
|
type Int64Histogram struct{ embedded.Int64Histogram }
|
||||||
|
|
||||||
|
// Record performs no operation.
|
||||||
|
func (Int64Histogram) Record(context.Context, int64, ...metric.RecordOption) {}
|
||||||
|
|
||||||
|
// Float64Histogram is an OpenTelemetry Histogram used to record float64
|
||||||
|
// measurements. It produces no telemetry.
|
||||||
|
type Float64Histogram struct{ embedded.Float64Histogram }
|
||||||
|
|
||||||
|
// Record performs no operation.
|
||||||
|
func (Float64Histogram) Record(context.Context, float64, ...metric.RecordOption) {}
|
||||||
|
|
||||||
|
// Int64Gauge is an OpenTelemetry Gauge used to record instantaneous int64
|
||||||
|
// measurements. It produces no telemetry.
|
||||||
|
type Int64Gauge struct{ embedded.Int64Gauge }
|
||||||
|
|
||||||
|
// Record performs no operation.
|
||||||
|
func (Int64Gauge) Record(context.Context, int64, ...metric.RecordOption) {}
|
||||||
|
|
||||||
|
// Float64Gauge is an OpenTelemetry Gauge used to record instantaneous float64
|
||||||
|
// measurements. It produces no telemetry.
|
||||||
|
type Float64Gauge struct{ embedded.Float64Gauge }
|
||||||
|
|
||||||
|
// Record performs no operation.
|
||||||
|
func (Float64Gauge) Record(context.Context, float64, ...metric.RecordOption) {}
|
||||||
|
|
||||||
|
// Int64ObservableCounter is an OpenTelemetry ObservableCounter used to record
|
||||||
|
// int64 measurements. It produces no telemetry.
|
||||||
|
type Int64ObservableCounter struct {
|
||||||
|
metric.Int64Observable
|
||||||
|
embedded.Int64ObservableCounter
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableCounter is an OpenTelemetry ObservableCounter used to record
|
||||||
|
// float64 measurements. It produces no telemetry.
|
||||||
|
type Float64ObservableCounter struct {
|
||||||
|
metric.Float64Observable
|
||||||
|
embedded.Float64ObservableCounter
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableGauge is an OpenTelemetry ObservableGauge used to record
|
||||||
|
// int64 measurements. It produces no telemetry.
|
||||||
|
type Int64ObservableGauge struct {
|
||||||
|
metric.Int64Observable
|
||||||
|
embedded.Int64ObservableGauge
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableGauge is an OpenTelemetry ObservableGauge used to record
|
||||||
|
// float64 measurements. It produces no telemetry.
|
||||||
|
type Float64ObservableGauge struct {
|
||||||
|
metric.Float64Observable
|
||||||
|
embedded.Float64ObservableGauge
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableUpDownCounter is an OpenTelemetry ObservableUpDownCounter
|
||||||
|
// used to record int64 measurements. It produces no telemetry.
|
||||||
|
type Int64ObservableUpDownCounter struct {
|
||||||
|
metric.Int64Observable
|
||||||
|
embedded.Int64ObservableUpDownCounter
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableUpDownCounter is an OpenTelemetry ObservableUpDownCounter
|
||||||
|
// used to record float64 measurements. It produces no telemetry.
|
||||||
|
type Float64ObservableUpDownCounter struct {
|
||||||
|
metric.Float64Observable
|
||||||
|
embedded.Float64ObservableUpDownCounter
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64Observer is a recorder of int64 measurements that performs no operation.
|
||||||
|
type Int64Observer struct{ embedded.Int64Observer }
|
||||||
|
|
||||||
|
// Observe performs no operation.
|
||||||
|
func (Int64Observer) Observe(int64, ...metric.ObserveOption) {}
|
||||||
|
|
||||||
|
// Float64Observer is a recorder of float64 measurements that performs no
|
||||||
|
// operation.
|
||||||
|
type Float64Observer struct{ embedded.Float64Observer }
|
||||||
|
|
||||||
|
// Observe performs no operation.
|
||||||
|
func (Float64Observer) Observe(float64, ...metric.ObserveOption) {}
|
||||||
3
vendor/go.opentelemetry.io/otel/semconv/v1.24.0/README.md
generated
vendored
3
vendor/go.opentelemetry.io/otel/semconv/v1.24.0/README.md
generated
vendored
@@ -1,3 +0,0 @@
|
|||||||
# Semconv v1.24.0
|
|
||||||
|
|
||||||
[](https://pkg.go.dev/go.opentelemetry.io/otel/semconv/v1.24.0)
|
|
||||||
4387
vendor/go.opentelemetry.io/otel/semconv/v1.24.0/attribute_group.go
generated
vendored
4387
vendor/go.opentelemetry.io/otel/semconv/v1.24.0/attribute_group.go
generated
vendored
File diff suppressed because it is too large
Load Diff
9
vendor/go.opentelemetry.io/otel/semconv/v1.24.0/doc.go
generated
vendored
9
vendor/go.opentelemetry.io/otel/semconv/v1.24.0/doc.go
generated
vendored
@@ -1,9 +0,0 @@
|
|||||||
// Copyright The OpenTelemetry Authors
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
// Package semconv implements OpenTelemetry semantic conventions.
|
|
||||||
//
|
|
||||||
// OpenTelemetry semantic conventions are agreed standardized naming
|
|
||||||
// patterns for OpenTelemetry things. This package represents the v1.24.0
|
|
||||||
// version of the OpenTelemetry semantic conventions.
|
|
||||||
package semconv // import "go.opentelemetry.io/otel/semconv/v1.24.0"
|
|
||||||
200
vendor/go.opentelemetry.io/otel/semconv/v1.24.0/event.go
generated
vendored
200
vendor/go.opentelemetry.io/otel/semconv/v1.24.0/event.go
generated
vendored
@@ -1,200 +0,0 @@
|
|||||||
// Copyright The OpenTelemetry Authors
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
// Code generated from semantic convention specification. DO NOT EDIT.
|
|
||||||
|
|
||||||
package semconv // import "go.opentelemetry.io/otel/semconv/v1.24.0"
|
|
||||||
|
|
||||||
import "go.opentelemetry.io/otel/attribute"
|
|
||||||
|
|
||||||
// This event represents an occurrence of a lifecycle transition on the iOS
|
|
||||||
// platform.
|
|
||||||
const (
|
|
||||||
// IosStateKey is the attribute Key conforming to the "ios.state" semantic
|
|
||||||
// conventions. It represents the this attribute represents the state the
|
|
||||||
// application has transitioned into at the occurrence of the event.
|
|
||||||
//
|
|
||||||
// Type: Enum
|
|
||||||
// RequirementLevel: Required
|
|
||||||
// Stability: experimental
|
|
||||||
// Note: The iOS lifecycle states are defined in the [UIApplicationDelegate
|
|
||||||
// documentation](https://developer.apple.com/documentation/uikit/uiapplicationdelegate#1656902),
|
|
||||||
// and from which the `OS terminology` column values are derived.
|
|
||||||
IosStateKey = attribute.Key("ios.state")
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
// The app has become `active`. Associated with UIKit notification `applicationDidBecomeActive`
|
|
||||||
IosStateActive = IosStateKey.String("active")
|
|
||||||
// The app is now `inactive`. Associated with UIKit notification `applicationWillResignActive`
|
|
||||||
IosStateInactive = IosStateKey.String("inactive")
|
|
||||||
// The app is now in the background. This value is associated with UIKit notification `applicationDidEnterBackground`
|
|
||||||
IosStateBackground = IosStateKey.String("background")
|
|
||||||
// The app is now in the foreground. This value is associated with UIKit notification `applicationWillEnterForeground`
|
|
||||||
IosStateForeground = IosStateKey.String("foreground")
|
|
||||||
// The app is about to terminate. Associated with UIKit notification `applicationWillTerminate`
|
|
||||||
IosStateTerminate = IosStateKey.String("terminate")
|
|
||||||
)
|
|
||||||
|
|
||||||
// This event represents an occurrence of a lifecycle transition on the Android
|
|
||||||
// platform.
|
|
||||||
const (
|
|
||||||
// AndroidStateKey is the attribute Key conforming to the "android.state"
|
|
||||||
// semantic conventions. It represents the this attribute represents the
|
|
||||||
// state the application has transitioned into at the occurrence of the
|
|
||||||
// event.
|
|
||||||
//
|
|
||||||
// Type: Enum
|
|
||||||
// RequirementLevel: Required
|
|
||||||
// Stability: experimental
|
|
||||||
// Note: The Android lifecycle states are defined in [Activity lifecycle
|
|
||||||
// callbacks](https://developer.android.com/guide/components/activities/activity-lifecycle#lc),
|
|
||||||
// and from which the `OS identifiers` are derived.
|
|
||||||
AndroidStateKey = attribute.Key("android.state")
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
// Any time before Activity.onResume() or, if the app has no Activity, Context.startService() has been called in the app for the first time
|
|
||||||
AndroidStateCreated = AndroidStateKey.String("created")
|
|
||||||
// Any time after Activity.onPause() or, if the app has no Activity, Context.stopService() has been called when the app was in the foreground state
|
|
||||||
AndroidStateBackground = AndroidStateKey.String("background")
|
|
||||||
// Any time after Activity.onResume() or, if the app has no Activity, Context.startService() has been called when the app was in either the created or background states
|
|
||||||
AndroidStateForeground = AndroidStateKey.String("foreground")
|
|
||||||
)
|
|
||||||
|
|
||||||
// This semantic convention defines the attributes used to represent a feature
|
|
||||||
// flag evaluation as an event.
|
|
||||||
const (
|
|
||||||
// FeatureFlagKeyKey is the attribute Key conforming to the
|
|
||||||
// "feature_flag.key" semantic conventions. It represents the unique
|
|
||||||
// identifier of the feature flag.
|
|
||||||
//
|
|
||||||
// Type: string
|
|
||||||
// RequirementLevel: Required
|
|
||||||
// Stability: experimental
|
|
||||||
// Examples: 'logo-color'
|
|
||||||
FeatureFlagKeyKey = attribute.Key("feature_flag.key")
|
|
||||||
|
|
||||||
// FeatureFlagProviderNameKey is the attribute Key conforming to the
|
|
||||||
// "feature_flag.provider_name" semantic conventions. It represents the
|
|
||||||
// name of the service provider that performs the flag evaluation.
|
|
||||||
//
|
|
||||||
// Type: string
|
|
||||||
// RequirementLevel: Recommended
|
|
||||||
// Stability: experimental
|
|
||||||
// Examples: 'Flag Manager'
|
|
||||||
FeatureFlagProviderNameKey = attribute.Key("feature_flag.provider_name")
|
|
||||||
|
|
||||||
// FeatureFlagVariantKey is the attribute Key conforming to the
|
|
||||||
// "feature_flag.variant" semantic conventions. It represents the sHOULD be
|
|
||||||
// a semantic identifier for a value. If one is unavailable, a stringified
|
|
||||||
// version of the value can be used.
|
|
||||||
//
|
|
||||||
// Type: string
|
|
||||||
// RequirementLevel: Recommended
|
|
||||||
// Stability: experimental
|
|
||||||
// Examples: 'red', 'true', 'on'
|
|
||||||
// Note: A semantic identifier, commonly referred to as a variant, provides
|
|
||||||
// a means
|
|
||||||
// for referring to a value without including the value itself. This can
|
|
||||||
// provide additional context for understanding the meaning behind a value.
|
|
||||||
// For example, the variant `red` maybe be used for the value `#c05543`.
|
|
||||||
//
|
|
||||||
// A stringified version of the value can be used in situations where a
|
|
||||||
// semantic identifier is unavailable. String representation of the value
|
|
||||||
// should be determined by the implementer.
|
|
||||||
FeatureFlagVariantKey = attribute.Key("feature_flag.variant")
|
|
||||||
)
|
|
||||||
|
|
||||||
// FeatureFlagKey returns an attribute KeyValue conforming to the
|
|
||||||
// "feature_flag.key" semantic conventions. It represents the unique identifier
|
|
||||||
// of the feature flag.
|
|
||||||
func FeatureFlagKey(val string) attribute.KeyValue {
|
|
||||||
return FeatureFlagKeyKey.String(val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// FeatureFlagProviderName returns an attribute KeyValue conforming to the
|
|
||||||
// "feature_flag.provider_name" semantic conventions. It represents the name of
|
|
||||||
// the service provider that performs the flag evaluation.
|
|
||||||
func FeatureFlagProviderName(val string) attribute.KeyValue {
|
|
||||||
return FeatureFlagProviderNameKey.String(val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// FeatureFlagVariant returns an attribute KeyValue conforming to the
|
|
||||||
// "feature_flag.variant" semantic conventions. It represents the sHOULD be a
|
|
||||||
// semantic identifier for a value. If one is unavailable, a stringified
|
|
||||||
// version of the value can be used.
|
|
||||||
func FeatureFlagVariant(val string) attribute.KeyValue {
|
|
||||||
return FeatureFlagVariantKey.String(val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// RPC received/sent message.
|
|
||||||
const (
|
|
||||||
// MessageCompressedSizeKey is the attribute Key conforming to the
|
|
||||||
// "message.compressed_size" semantic conventions. It represents the
|
|
||||||
// compressed size of the message in bytes.
|
|
||||||
//
|
|
||||||
// Type: int
|
|
||||||
// RequirementLevel: Optional
|
|
||||||
// Stability: experimental
|
|
||||||
MessageCompressedSizeKey = attribute.Key("message.compressed_size")
|
|
||||||
|
|
||||||
// MessageIDKey is the attribute Key conforming to the "message.id"
|
|
||||||
// semantic conventions. It represents the mUST be calculated as two
|
|
||||||
// different counters starting from `1` one for sent messages and one for
|
|
||||||
// received message.
|
|
||||||
//
|
|
||||||
// Type: int
|
|
||||||
// RequirementLevel: Optional
|
|
||||||
// Stability: experimental
|
|
||||||
// Note: This way we guarantee that the values will be consistent between
|
|
||||||
// different implementations.
|
|
||||||
MessageIDKey = attribute.Key("message.id")
|
|
||||||
|
|
||||||
// MessageTypeKey is the attribute Key conforming to the "message.type"
|
|
||||||
// semantic conventions. It represents the whether this is a received or
|
|
||||||
// sent message.
|
|
||||||
//
|
|
||||||
// Type: Enum
|
|
||||||
// RequirementLevel: Optional
|
|
||||||
// Stability: experimental
|
|
||||||
MessageTypeKey = attribute.Key("message.type")
|
|
||||||
|
|
||||||
// MessageUncompressedSizeKey is the attribute Key conforming to the
|
|
||||||
// "message.uncompressed_size" semantic conventions. It represents the
|
|
||||||
// uncompressed size of the message in bytes.
|
|
||||||
//
|
|
||||||
// Type: int
|
|
||||||
// RequirementLevel: Optional
|
|
||||||
// Stability: experimental
|
|
||||||
MessageUncompressedSizeKey = attribute.Key("message.uncompressed_size")
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
// sent
|
|
||||||
MessageTypeSent = MessageTypeKey.String("SENT")
|
|
||||||
// received
|
|
||||||
MessageTypeReceived = MessageTypeKey.String("RECEIVED")
|
|
||||||
)
|
|
||||||
|
|
||||||
// MessageCompressedSize returns an attribute KeyValue conforming to the
|
|
||||||
// "message.compressed_size" semantic conventions. It represents the compressed
|
|
||||||
// size of the message in bytes.
|
|
||||||
func MessageCompressedSize(val int) attribute.KeyValue {
|
|
||||||
return MessageCompressedSizeKey.Int(val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MessageID returns an attribute KeyValue conforming to the "message.id"
|
|
||||||
// semantic conventions. It represents the mUST be calculated as two different
|
|
||||||
// counters starting from `1` one for sent messages and one for received
|
|
||||||
// message.
|
|
||||||
func MessageID(val int) attribute.KeyValue {
|
|
||||||
return MessageIDKey.Int(val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MessageUncompressedSize returns an attribute KeyValue conforming to the
|
|
||||||
// "message.uncompressed_size" semantic conventions. It represents the
|
|
||||||
// uncompressed size of the message in bytes.
|
|
||||||
func MessageUncompressedSize(val int) attribute.KeyValue {
|
|
||||||
return MessageUncompressedSizeKey.Int(val)
|
|
||||||
}
|
|
||||||
9
vendor/go.opentelemetry.io/otel/semconv/v1.24.0/exception.go
generated
vendored
9
vendor/go.opentelemetry.io/otel/semconv/v1.24.0/exception.go
generated
vendored
@@ -1,9 +0,0 @@
|
|||||||
// Copyright The OpenTelemetry Authors
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
package semconv // import "go.opentelemetry.io/otel/semconv/v1.24.0"
|
|
||||||
|
|
||||||
const (
|
|
||||||
// ExceptionEventName is the name of the Span event representing an exception.
|
|
||||||
ExceptionEventName = "exception"
|
|
||||||
)
|
|
||||||
1071
vendor/go.opentelemetry.io/otel/semconv/v1.24.0/metric.go
generated
vendored
1071
vendor/go.opentelemetry.io/otel/semconv/v1.24.0/metric.go
generated
vendored
File diff suppressed because it is too large
Load Diff
2545
vendor/go.opentelemetry.io/otel/semconv/v1.24.0/resource.go
generated
vendored
2545
vendor/go.opentelemetry.io/otel/semconv/v1.24.0/resource.go
generated
vendored
File diff suppressed because it is too large
Load Diff
9
vendor/go.opentelemetry.io/otel/semconv/v1.24.0/schema.go
generated
vendored
9
vendor/go.opentelemetry.io/otel/semconv/v1.24.0/schema.go
generated
vendored
@@ -1,9 +0,0 @@
|
|||||||
// Copyright The OpenTelemetry Authors
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
package semconv // import "go.opentelemetry.io/otel/semconv/v1.24.0"
|
|
||||||
|
|
||||||
// SchemaURL is the schema URL that matches the version of the semantic conventions
|
|
||||||
// that this package defines. Semconv packages starting from v1.4.0 must declare
|
|
||||||
// non-empty schema URL in the form https://opentelemetry.io/schemas/<version>
|
|
||||||
const SchemaURL = "https://opentelemetry.io/schemas/1.24.0"
|
|
||||||
1323
vendor/go.opentelemetry.io/otel/semconv/v1.24.0/trace.go
generated
vendored
1323
vendor/go.opentelemetry.io/otel/semconv/v1.24.0/trace.go
generated
vendored
File diff suppressed because it is too large
Load Diff
68
vendor/golang.org/x/exp/maps/maps.go
generated
vendored
68
vendor/golang.org/x/exp/maps/maps.go
generated
vendored
@@ -5,9 +5,16 @@
|
|||||||
// Package maps defines various functions useful with maps of any type.
|
// Package maps defines various functions useful with maps of any type.
|
||||||
package maps
|
package maps
|
||||||
|
|
||||||
|
import "maps"
|
||||||
|
|
||||||
// Keys returns the keys of the map m.
|
// Keys returns the keys of the map m.
|
||||||
// The keys will be in an indeterminate order.
|
// The keys will be in an indeterminate order.
|
||||||
|
//
|
||||||
|
// The simplest true equivalent using the standard library is:
|
||||||
|
//
|
||||||
|
// slices.AppendSeq(make([]K, 0, len(m)), maps.Keys(m))
|
||||||
func Keys[M ~map[K]V, K comparable, V any](m M) []K {
|
func Keys[M ~map[K]V, K comparable, V any](m M) []K {
|
||||||
|
|
||||||
r := make([]K, 0, len(m))
|
r := make([]K, 0, len(m))
|
||||||
for k := range m {
|
for k := range m {
|
||||||
r = append(r, k)
|
r = append(r, k)
|
||||||
@@ -17,7 +24,12 @@ func Keys[M ~map[K]V, K comparable, V any](m M) []K {
|
|||||||
|
|
||||||
// Values returns the values of the map m.
|
// Values returns the values of the map m.
|
||||||
// The values will be in an indeterminate order.
|
// The values will be in an indeterminate order.
|
||||||
|
//
|
||||||
|
// The simplest true equivalent using the standard library is:
|
||||||
|
//
|
||||||
|
// slices.AppendSeq(make([]V, 0, len(m)), maps.Values(m))
|
||||||
func Values[M ~map[K]V, K comparable, V any](m M) []V {
|
func Values[M ~map[K]V, K comparable, V any](m M) []V {
|
||||||
|
|
||||||
r := make([]V, 0, len(m))
|
r := make([]V, 0, len(m))
|
||||||
for _, v := range m {
|
for _, v := range m {
|
||||||
r = append(r, v)
|
r = append(r, v)
|
||||||
@@ -27,68 +39,48 @@ func Values[M ~map[K]V, K comparable, V any](m M) []V {
|
|||||||
|
|
||||||
// Equal reports whether two maps contain the same key/value pairs.
|
// Equal reports whether two maps contain the same key/value pairs.
|
||||||
// Values are compared using ==.
|
// Values are compared using ==.
|
||||||
|
//
|
||||||
|
//go:fix inline
|
||||||
func Equal[M1, M2 ~map[K]V, K, V comparable](m1 M1, m2 M2) bool {
|
func Equal[M1, M2 ~map[K]V, K, V comparable](m1 M1, m2 M2) bool {
|
||||||
if len(m1) != len(m2) {
|
return maps.Equal(m1, m2)
|
||||||
return false
|
|
||||||
}
|
|
||||||
for k, v1 := range m1 {
|
|
||||||
if v2, ok := m2[k]; !ok || v1 != v2 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// EqualFunc is like Equal, but compares values using eq.
|
// EqualFunc is like Equal, but compares values using eq.
|
||||||
// Keys are still compared with ==.
|
// Keys are still compared with ==.
|
||||||
|
//
|
||||||
|
//go:fix inline
|
||||||
func EqualFunc[M1 ~map[K]V1, M2 ~map[K]V2, K comparable, V1, V2 any](m1 M1, m2 M2, eq func(V1, V2) bool) bool {
|
func EqualFunc[M1 ~map[K]V1, M2 ~map[K]V2, K comparable, V1, V2 any](m1 M1, m2 M2, eq func(V1, V2) bool) bool {
|
||||||
if len(m1) != len(m2) {
|
return maps.EqualFunc(m1, m2, eq)
|
||||||
return false
|
|
||||||
}
|
|
||||||
for k, v1 := range m1 {
|
|
||||||
if v2, ok := m2[k]; !ok || !eq(v1, v2) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear removes all entries from m, leaving it empty.
|
// Clear removes all entries from m, leaving it empty.
|
||||||
|
//
|
||||||
|
//go:fix inline
|
||||||
func Clear[M ~map[K]V, K comparable, V any](m M) {
|
func Clear[M ~map[K]V, K comparable, V any](m M) {
|
||||||
for k := range m {
|
clear(m)
|
||||||
delete(m, k)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clone returns a copy of m. This is a shallow clone:
|
// Clone returns a copy of m. This is a shallow clone:
|
||||||
// the new keys and values are set using ordinary assignment.
|
// the new keys and values are set using ordinary assignment.
|
||||||
|
//
|
||||||
|
//go:fix inline
|
||||||
func Clone[M ~map[K]V, K comparable, V any](m M) M {
|
func Clone[M ~map[K]V, K comparable, V any](m M) M {
|
||||||
// Preserve nil in case it matters.
|
return maps.Clone(m)
|
||||||
if m == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
r := make(M, len(m))
|
|
||||||
for k, v := range m {
|
|
||||||
r[k] = v
|
|
||||||
}
|
|
||||||
return r
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy copies all key/value pairs in src adding them to dst.
|
// Copy copies all key/value pairs in src adding them to dst.
|
||||||
// When a key in src is already present in dst,
|
// When a key in src is already present in dst,
|
||||||
// the value in dst will be overwritten by the value associated
|
// the value in dst will be overwritten by the value associated
|
||||||
// with the key in src.
|
// with the key in src.
|
||||||
|
//
|
||||||
|
//go:fix inline
|
||||||
func Copy[M1 ~map[K]V, M2 ~map[K]V, K comparable, V any](dst M1, src M2) {
|
func Copy[M1 ~map[K]V, M2 ~map[K]V, K comparable, V any](dst M1, src M2) {
|
||||||
for k, v := range src {
|
maps.Copy(dst, src)
|
||||||
dst[k] = v
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteFunc deletes any key/value pairs from m for which del returns true.
|
// DeleteFunc deletes any key/value pairs from m for which del returns true.
|
||||||
|
//
|
||||||
|
//go:fix inline
|
||||||
func DeleteFunc[M ~map[K]V, K comparable, V any](m M, del func(K, V) bool) {
|
func DeleteFunc[M ~map[K]V, K comparable, V any](m M, del func(K, V) bool) {
|
||||||
for k, v := range m {
|
maps.DeleteFunc(m, del)
|
||||||
if del(k, v) {
|
|
||||||
delete(m, k)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
110
vendor/golang.org/x/sync/errgroup/errgroup.go
generated
vendored
110
vendor/golang.org/x/sync/errgroup/errgroup.go
generated
vendored
@@ -12,13 +12,15 @@ package errgroup
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"runtime"
|
||||||
|
"runtime/debug"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
type token struct{}
|
type token struct{}
|
||||||
|
|
||||||
// A Group is a collection of goroutines working on subtasks that are part of
|
// A Group is a collection of goroutines working on subtasks that are part of
|
||||||
// the same overall task.
|
// the same overall task. A Group should not be reused for different tasks.
|
||||||
//
|
//
|
||||||
// A zero Group is valid, has no limit on the number of active goroutines,
|
// A zero Group is valid, has no limit on the number of active goroutines,
|
||||||
// and does not cancel on error.
|
// and does not cancel on error.
|
||||||
@@ -31,6 +33,10 @@ type Group struct {
|
|||||||
|
|
||||||
errOnce sync.Once
|
errOnce sync.Once
|
||||||
err error
|
err error
|
||||||
|
|
||||||
|
mu sync.Mutex
|
||||||
|
panicValue any // = PanicError | PanicValue; non-nil if some Group.Go goroutine panicked.
|
||||||
|
abnormal bool // some Group.Go goroutine terminated abnormally (panic or goexit).
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *Group) done() {
|
func (g *Group) done() {
|
||||||
@@ -50,32 +56,80 @@ func WithContext(ctx context.Context) (*Group, context.Context) {
|
|||||||
return &Group{cancel: cancel}, ctx
|
return &Group{cancel: cancel}, ctx
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wait blocks until all function calls from the Go method have returned, then
|
// Wait blocks until all function calls from the Go method have returned
|
||||||
// returns the first non-nil error (if any) from them.
|
// normally, then returns the first non-nil error (if any) from them.
|
||||||
|
//
|
||||||
|
// If any of the calls panics, Wait panics with a [PanicValue];
|
||||||
|
// and if any of them calls [runtime.Goexit], Wait calls runtime.Goexit.
|
||||||
func (g *Group) Wait() error {
|
func (g *Group) Wait() error {
|
||||||
g.wg.Wait()
|
g.wg.Wait()
|
||||||
if g.cancel != nil {
|
if g.cancel != nil {
|
||||||
g.cancel(g.err)
|
g.cancel(g.err)
|
||||||
}
|
}
|
||||||
|
if g.panicValue != nil {
|
||||||
|
panic(g.panicValue)
|
||||||
|
}
|
||||||
|
if g.abnormal {
|
||||||
|
runtime.Goexit()
|
||||||
|
}
|
||||||
return g.err
|
return g.err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Go calls the given function in a new goroutine.
|
// Go calls the given function in a new goroutine.
|
||||||
|
// The first call to Go must happen before a Wait.
|
||||||
// It blocks until the new goroutine can be added without the number of
|
// It blocks until the new goroutine can be added without the number of
|
||||||
// active goroutines in the group exceeding the configured limit.
|
// active goroutines in the group exceeding the configured limit.
|
||||||
//
|
//
|
||||||
// The first call to return a non-nil error cancels the group's context, if the
|
// It blocks until the new goroutine can be added without the number of
|
||||||
// group was created by calling WithContext. The error will be returned by Wait.
|
// goroutines in the group exceeding the configured limit.
|
||||||
|
//
|
||||||
|
// The first goroutine in the group that returns a non-nil error, panics, or
|
||||||
|
// invokes [runtime.Goexit] will cancel the associated Context, if any.
|
||||||
func (g *Group) Go(f func() error) {
|
func (g *Group) Go(f func() error) {
|
||||||
if g.sem != nil {
|
if g.sem != nil {
|
||||||
g.sem <- token{}
|
g.sem <- token{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g.add(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Group) add(f func() error) {
|
||||||
g.wg.Add(1)
|
g.wg.Add(1)
|
||||||
go func() {
|
go func() {
|
||||||
defer g.done()
|
defer g.done()
|
||||||
|
normalReturn := false
|
||||||
|
defer func() {
|
||||||
|
if normalReturn {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
v := recover()
|
||||||
|
g.mu.Lock()
|
||||||
|
defer g.mu.Unlock()
|
||||||
|
if !g.abnormal {
|
||||||
|
if g.cancel != nil {
|
||||||
|
g.cancel(g.err)
|
||||||
|
}
|
||||||
|
g.abnormal = true
|
||||||
|
}
|
||||||
|
if v != nil && g.panicValue == nil {
|
||||||
|
switch v := v.(type) {
|
||||||
|
case error:
|
||||||
|
g.panicValue = PanicError{
|
||||||
|
Recovered: v,
|
||||||
|
Stack: debug.Stack(),
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
g.panicValue = PanicValue{
|
||||||
|
Recovered: v,
|
||||||
|
Stack: debug.Stack(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
if err := f(); err != nil {
|
err := f()
|
||||||
|
normalReturn = true
|
||||||
|
if err != nil {
|
||||||
g.errOnce.Do(func() {
|
g.errOnce.Do(func() {
|
||||||
g.err = err
|
g.err = err
|
||||||
if g.cancel != nil {
|
if g.cancel != nil {
|
||||||
@@ -100,19 +154,7 @@ func (g *Group) TryGo(f func() error) bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
g.wg.Add(1)
|
g.add(f)
|
||||||
go func() {
|
|
||||||
defer g.done()
|
|
||||||
|
|
||||||
if err := f(); err != nil {
|
|
||||||
g.errOnce.Do(func() {
|
|
||||||
g.err = err
|
|
||||||
if g.cancel != nil {
|
|
||||||
g.cancel(g.err)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,3 +176,33 @@ func (g *Group) SetLimit(n int) {
|
|||||||
}
|
}
|
||||||
g.sem = make(chan token, n)
|
g.sem = make(chan token, n)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PanicError wraps an error recovered from an unhandled panic
|
||||||
|
// when calling a function passed to Go or TryGo.
|
||||||
|
type PanicError struct {
|
||||||
|
Recovered error
|
||||||
|
Stack []byte // result of call to [debug.Stack]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p PanicError) Error() string {
|
||||||
|
// A Go Error method conventionally does not include a stack dump, so omit it
|
||||||
|
// here. (Callers who care can extract it from the Stack field.)
|
||||||
|
return fmt.Sprintf("recovered from errgroup.Group: %v", p.Recovered)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p PanicError) Unwrap() error { return p.Recovered }
|
||||||
|
|
||||||
|
// PanicValue wraps a value that does not implement the error interface,
|
||||||
|
// recovered from an unhandled panic when calling a function passed to Go or
|
||||||
|
// TryGo.
|
||||||
|
type PanicValue struct {
|
||||||
|
Recovered any
|
||||||
|
Stack []byte // result of call to [debug.Stack]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p PanicValue) String() string {
|
||||||
|
if len(p.Stack) > 0 {
|
||||||
|
return fmt.Sprintf("recovered from errgroup.Group: %v\n%s", p.Recovered, p.Stack)
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("recovered from errgroup.Group: %v", p.Recovered)
|
||||||
|
}
|
||||||
|
|||||||
9
vendor/golang.org/x/term/terminal.go
generated
vendored
9
vendor/golang.org/x/term/terminal.go
generated
vendored
@@ -44,6 +44,8 @@ type Terminal struct {
|
|||||||
// bytes, as an index into |line|). If it returns ok=false, the key
|
// bytes, as an index into |line|). If it returns ok=false, the key
|
||||||
// press is processed normally. Otherwise it returns a replacement line
|
// press is processed normally. Otherwise it returns a replacement line
|
||||||
// and the new cursor position.
|
// and the new cursor position.
|
||||||
|
//
|
||||||
|
// This will be disabled during ReadPassword.
|
||||||
AutoCompleteCallback func(line string, pos int, key rune) (newLine string, newPos int, ok bool)
|
AutoCompleteCallback func(line string, pos int, key rune) (newLine string, newPos int, ok bool)
|
||||||
|
|
||||||
// Escape contains a pointer to the escape codes for this terminal.
|
// Escape contains a pointer to the escape codes for this terminal.
|
||||||
@@ -692,6 +694,8 @@ func (t *Terminal) Write(buf []byte) (n int, err error) {
|
|||||||
|
|
||||||
// ReadPassword temporarily changes the prompt and reads a password, without
|
// ReadPassword temporarily changes the prompt and reads a password, without
|
||||||
// echo, from the terminal.
|
// echo, from the terminal.
|
||||||
|
//
|
||||||
|
// The AutoCompleteCallback is disabled during this call.
|
||||||
func (t *Terminal) ReadPassword(prompt string) (line string, err error) {
|
func (t *Terminal) ReadPassword(prompt string) (line string, err error) {
|
||||||
t.lock.Lock()
|
t.lock.Lock()
|
||||||
defer t.lock.Unlock()
|
defer t.lock.Unlock()
|
||||||
@@ -699,6 +703,11 @@ func (t *Terminal) ReadPassword(prompt string) (line string, err error) {
|
|||||||
oldPrompt := t.prompt
|
oldPrompt := t.prompt
|
||||||
t.prompt = []rune(prompt)
|
t.prompt = []rune(prompt)
|
||||||
t.echo = false
|
t.echo = false
|
||||||
|
oldAutoCompleteCallback := t.AutoCompleteCallback
|
||||||
|
t.AutoCompleteCallback = nil
|
||||||
|
defer func() {
|
||||||
|
t.AutoCompleteCallback = oldAutoCompleteCallback
|
||||||
|
}()
|
||||||
|
|
||||||
line, err = t.readLine()
|
line, err = t.readLine()
|
||||||
|
|
||||||
|
|||||||
28
vendor/golang.org/x/time/rate/rate.go
generated
vendored
28
vendor/golang.org/x/time/rate/rate.go
generated
vendored
@@ -85,7 +85,7 @@ func (lim *Limiter) Burst() int {
|
|||||||
// TokensAt returns the number of tokens available at time t.
|
// TokensAt returns the number of tokens available at time t.
|
||||||
func (lim *Limiter) TokensAt(t time.Time) float64 {
|
func (lim *Limiter) TokensAt(t time.Time) float64 {
|
||||||
lim.mu.Lock()
|
lim.mu.Lock()
|
||||||
_, tokens := lim.advance(t) // does not mutate lim
|
tokens := lim.advance(t) // does not mutate lim
|
||||||
lim.mu.Unlock()
|
lim.mu.Unlock()
|
||||||
return tokens
|
return tokens
|
||||||
}
|
}
|
||||||
@@ -186,7 +186,7 @@ func (r *Reservation) CancelAt(t time.Time) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
// advance time to now
|
// advance time to now
|
||||||
t, tokens := r.lim.advance(t)
|
tokens := r.lim.advance(t)
|
||||||
// calculate new number of tokens
|
// calculate new number of tokens
|
||||||
tokens += restoreTokens
|
tokens += restoreTokens
|
||||||
if burst := float64(r.lim.burst); tokens > burst {
|
if burst := float64(r.lim.burst); tokens > burst {
|
||||||
@@ -307,7 +307,7 @@ func (lim *Limiter) SetLimitAt(t time.Time, newLimit Limit) {
|
|||||||
lim.mu.Lock()
|
lim.mu.Lock()
|
||||||
defer lim.mu.Unlock()
|
defer lim.mu.Unlock()
|
||||||
|
|
||||||
t, tokens := lim.advance(t)
|
tokens := lim.advance(t)
|
||||||
|
|
||||||
lim.last = t
|
lim.last = t
|
||||||
lim.tokens = tokens
|
lim.tokens = tokens
|
||||||
@@ -324,7 +324,7 @@ func (lim *Limiter) SetBurstAt(t time.Time, newBurst int) {
|
|||||||
lim.mu.Lock()
|
lim.mu.Lock()
|
||||||
defer lim.mu.Unlock()
|
defer lim.mu.Unlock()
|
||||||
|
|
||||||
t, tokens := lim.advance(t)
|
tokens := lim.advance(t)
|
||||||
|
|
||||||
lim.last = t
|
lim.last = t
|
||||||
lim.tokens = tokens
|
lim.tokens = tokens
|
||||||
@@ -347,7 +347,7 @@ func (lim *Limiter) reserveN(t time.Time, n int, maxFutureReserve time.Duration)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
t, tokens := lim.advance(t)
|
tokens := lim.advance(t)
|
||||||
|
|
||||||
// Calculate the remaining number of tokens resulting from the request.
|
// Calculate the remaining number of tokens resulting from the request.
|
||||||
tokens -= float64(n)
|
tokens -= float64(n)
|
||||||
@@ -380,10 +380,11 @@ func (lim *Limiter) reserveN(t time.Time, n int, maxFutureReserve time.Duration)
|
|||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
// advance calculates and returns an updated state for lim resulting from the passage of time.
|
// advance calculates and returns an updated number of tokens for lim
|
||||||
|
// resulting from the passage of time.
|
||||||
// lim is not changed.
|
// lim is not changed.
|
||||||
// advance requires that lim.mu is held.
|
// advance requires that lim.mu is held.
|
||||||
func (lim *Limiter) advance(t time.Time) (newT time.Time, newTokens float64) {
|
func (lim *Limiter) advance(t time.Time) (newTokens float64) {
|
||||||
last := lim.last
|
last := lim.last
|
||||||
if t.Before(last) {
|
if t.Before(last) {
|
||||||
last = t
|
last = t
|
||||||
@@ -396,7 +397,7 @@ func (lim *Limiter) advance(t time.Time) (newT time.Time, newTokens float64) {
|
|||||||
if burst := float64(lim.burst); tokens > burst {
|
if burst := float64(lim.burst); tokens > burst {
|
||||||
tokens = burst
|
tokens = burst
|
||||||
}
|
}
|
||||||
return t, tokens
|
return tokens
|
||||||
}
|
}
|
||||||
|
|
||||||
// durationFromTokens is a unit conversion function from the number of tokens to the duration
|
// durationFromTokens is a unit conversion function from the number of tokens to the duration
|
||||||
@@ -405,8 +406,15 @@ func (limit Limit) durationFromTokens(tokens float64) time.Duration {
|
|||||||
if limit <= 0 {
|
if limit <= 0 {
|
||||||
return InfDuration
|
return InfDuration
|
||||||
}
|
}
|
||||||
seconds := tokens / float64(limit)
|
|
||||||
return time.Duration(float64(time.Second) * seconds)
|
duration := (tokens / float64(limit)) * float64(time.Second)
|
||||||
|
|
||||||
|
// Cap the duration to the maximum representable int64 value, to avoid overflow.
|
||||||
|
if duration > float64(math.MaxInt64) {
|
||||||
|
return InfDuration
|
||||||
|
}
|
||||||
|
|
||||||
|
return time.Duration(duration)
|
||||||
}
|
}
|
||||||
|
|
||||||
// tokensFromDuration is a unit conversion function from a time duration to the number of tokens
|
// tokensFromDuration is a unit conversion function from a time duration to the number of tokens
|
||||||
|
|||||||
51
vendor/modules.txt
vendored
51
vendor/modules.txt
vendored
@@ -50,7 +50,7 @@ github.com/aymerick/douceur/parser
|
|||||||
# github.com/bmatcuk/doublestar/v3 v3.0.0
|
# github.com/bmatcuk/doublestar/v3 v3.0.0
|
||||||
## explicit; go 1.12
|
## explicit; go 1.12
|
||||||
github.com/bmatcuk/doublestar/v3
|
github.com/bmatcuk/doublestar/v3
|
||||||
# github.com/containerd/errdefs v0.3.0
|
# github.com/containerd/errdefs v1.0.0
|
||||||
## explicit; go 1.20
|
## explicit; go 1.20
|
||||||
github.com/containerd/errdefs
|
github.com/containerd/errdefs
|
||||||
# github.com/containerd/errdefs/pkg v0.3.0
|
# github.com/containerd/errdefs/pkg v0.3.0
|
||||||
@@ -60,10 +60,10 @@ github.com/containerd/errdefs/pkg/internal/cause
|
|||||||
# github.com/containerd/log v0.1.0
|
# github.com/containerd/log v0.1.0
|
||||||
## explicit; go 1.20
|
## explicit; go 1.20
|
||||||
github.com/containerd/log
|
github.com/containerd/log
|
||||||
# github.com/containerd/platforms v0.2.1
|
# github.com/containerd/platforms v1.0.0-rc.1
|
||||||
## explicit; go 1.20
|
## explicit; go 1.20
|
||||||
github.com/containerd/platforms
|
github.com/containerd/platforms
|
||||||
# github.com/containerd/typeurl/v2 v2.2.0
|
# github.com/containerd/typeurl/v2 v2.2.3
|
||||||
## explicit; go 1.21
|
## explicit; go 1.21
|
||||||
github.com/containerd/typeurl/v2
|
github.com/containerd/typeurl/v2
|
||||||
# github.com/containers/image/v5 v5.33.1
|
# github.com/containers/image/v5 v5.33.1
|
||||||
@@ -172,8 +172,8 @@ github.com/docker/docker/api/types/volume
|
|||||||
github.com/docker/docker/client
|
github.com/docker/docker/client
|
||||||
github.com/docker/docker/internal/lazyregexp
|
github.com/docker/docker/internal/lazyregexp
|
||||||
github.com/docker/docker/internal/multierror
|
github.com/docker/docker/internal/multierror
|
||||||
# github.com/docker/docker-credential-helpers v0.8.2
|
# github.com/docker/docker-credential-helpers v0.9.3
|
||||||
## explicit; go 1.19
|
## explicit; go 1.21
|
||||||
github.com/docker/docker-credential-helpers/client
|
github.com/docker/docker-credential-helpers/client
|
||||||
github.com/docker/docker-credential-helpers/credentials
|
github.com/docker/docker-credential-helpers/credentials
|
||||||
# github.com/docker/go-connections v0.5.0
|
# github.com/docker/go-connections v0.5.0
|
||||||
@@ -274,8 +274,8 @@ github.com/google/go-cmp/cmp/internal/value
|
|||||||
## explicit; go 1.12
|
## explicit; go 1.12
|
||||||
github.com/google/gofuzz
|
github.com/google/gofuzz
|
||||||
github.com/google/gofuzz/bytesource
|
github.com/google/gofuzz/bytesource
|
||||||
# github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db
|
# github.com/google/pprof v0.0.0-20250403155104-27863c87afa6
|
||||||
## explicit; go 1.22
|
## explicit; go 1.23
|
||||||
github.com/google/pprof/profile
|
github.com/google/pprof/profile
|
||||||
# github.com/google/uuid v1.6.0
|
# github.com/google/uuid v1.6.0
|
||||||
## explicit
|
## explicit
|
||||||
@@ -370,8 +370,8 @@ github.com/mitchellh/go-homedir
|
|||||||
# github.com/mitchellh/mapstructure v1.5.0
|
# github.com/mitchellh/mapstructure v1.5.0
|
||||||
## explicit; go 1.14
|
## explicit; go 1.14
|
||||||
github.com/mitchellh/mapstructure
|
github.com/mitchellh/mapstructure
|
||||||
# github.com/moby/buildkit v0.17.3
|
# github.com/moby/buildkit v0.23.2
|
||||||
## explicit; go 1.22.0
|
## explicit; go 1.23.0
|
||||||
github.com/moby/buildkit/frontend/dockerfile/command
|
github.com/moby/buildkit/frontend/dockerfile/command
|
||||||
github.com/moby/buildkit/frontend/dockerfile/instructions
|
github.com/moby/buildkit/frontend/dockerfile/instructions
|
||||||
github.com/moby/buildkit/frontend/dockerfile/linter
|
github.com/moby/buildkit/frontend/dockerfile/linter
|
||||||
@@ -382,15 +382,13 @@ github.com/moby/buildkit/util/suggest
|
|||||||
# github.com/moby/docker-image-spec v1.3.1
|
# github.com/moby/docker-image-spec v1.3.1
|
||||||
## explicit; go 1.18
|
## explicit; go 1.18
|
||||||
github.com/moby/docker-image-spec/specs-go/v1
|
github.com/moby/docker-image-spec/specs-go/v1
|
||||||
# github.com/moby/sys/atomicwriter v0.1.0
|
|
||||||
## explicit; go 1.18
|
|
||||||
# github.com/moby/sys/capability v0.3.0
|
# github.com/moby/sys/capability v0.3.0
|
||||||
## explicit; go 1.21
|
## explicit; go 1.21
|
||||||
github.com/moby/sys/capability
|
github.com/moby/sys/capability
|
||||||
# github.com/moby/sys/mountinfo v0.7.2
|
# github.com/moby/sys/mountinfo v0.7.2
|
||||||
## explicit; go 1.17
|
## explicit; go 1.17
|
||||||
github.com/moby/sys/mountinfo
|
github.com/moby/sys/mountinfo
|
||||||
# github.com/moby/sys/user v0.3.0
|
# github.com/moby/sys/user v0.4.0
|
||||||
## explicit; go 1.17
|
## explicit; go 1.17
|
||||||
github.com/moby/sys/user
|
github.com/moby/sys/user
|
||||||
# github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
|
# github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
|
||||||
@@ -418,7 +416,7 @@ github.com/opencontainers/go-digest
|
|||||||
## explicit; go 1.18
|
## explicit; go 1.18
|
||||||
github.com/opencontainers/image-spec/specs-go
|
github.com/opencontainers/image-spec/specs-go
|
||||||
github.com/opencontainers/image-spec/specs-go/v1
|
github.com/opencontainers/image-spec/specs-go/v1
|
||||||
# github.com/opencontainers/runtime-spec v1.2.0
|
# github.com/opencontainers/runtime-spec v1.2.1
|
||||||
## explicit
|
## explicit
|
||||||
github.com/opencontainers/runtime-spec/specs-go
|
github.com/opencontainers/runtime-spec/specs-go
|
||||||
# github.com/panjf2000/ants/v2 v2.11.3
|
# github.com/panjf2000/ants/v2 v2.11.3
|
||||||
@@ -469,7 +467,7 @@ github.com/stretchr/testify/require
|
|||||||
# github.com/tidwall/pretty v1.2.1
|
# github.com/tidwall/pretty v1.2.1
|
||||||
## explicit; go 1.16
|
## explicit; go 1.16
|
||||||
github.com/tidwall/pretty
|
github.com/tidwall/pretty
|
||||||
# github.com/tonistiigi/go-csvvalue v0.0.0-20240710180619-ddb21b71c0b4
|
# github.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0
|
||||||
## explicit; go 1.16
|
## explicit; go 1.16
|
||||||
github.com/tonistiigi/go-csvvalue
|
github.com/tonistiigi/go-csvvalue
|
||||||
# github.com/vanng822/css v0.0.0-20190504095207-a21e860bcd04
|
# github.com/vanng822/css v0.0.0-20190504095207-a21e860bcd04
|
||||||
@@ -491,9 +489,10 @@ go.etcd.io/bbolt/internal/freelist
|
|||||||
## explicit; go 1.22.0
|
## explicit; go 1.22.0
|
||||||
go.opentelemetry.io/auto/sdk
|
go.opentelemetry.io/auto/sdk
|
||||||
go.opentelemetry.io/auto/sdk/internal/telemetry
|
go.opentelemetry.io/auto/sdk/internal/telemetry
|
||||||
# go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0
|
# go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0
|
||||||
## explicit; go 1.21
|
## explicit; go 1.22.0
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/request
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil
|
||||||
# go.opentelemetry.io/otel v1.35.0
|
# go.opentelemetry.io/otel v1.35.0
|
||||||
@@ -508,30 +507,30 @@ go.opentelemetry.io/otel/internal/baggage
|
|||||||
go.opentelemetry.io/otel/internal/global
|
go.opentelemetry.io/otel/internal/global
|
||||||
go.opentelemetry.io/otel/propagation
|
go.opentelemetry.io/otel/propagation
|
||||||
go.opentelemetry.io/otel/semconv/v1.20.0
|
go.opentelemetry.io/otel/semconv/v1.20.0
|
||||||
go.opentelemetry.io/otel/semconv/v1.24.0
|
|
||||||
go.opentelemetry.io/otel/semconv/v1.26.0
|
go.opentelemetry.io/otel/semconv/v1.26.0
|
||||||
# go.opentelemetry.io/otel/metric v1.35.0
|
# go.opentelemetry.io/otel/metric v1.35.0
|
||||||
## explicit; go 1.22.0
|
## explicit; go 1.22.0
|
||||||
go.opentelemetry.io/otel/metric
|
go.opentelemetry.io/otel/metric
|
||||||
go.opentelemetry.io/otel/metric/embedded
|
go.opentelemetry.io/otel/metric/embedded
|
||||||
|
go.opentelemetry.io/otel/metric/noop
|
||||||
# go.opentelemetry.io/otel/trace v1.35.0
|
# go.opentelemetry.io/otel/trace v1.35.0
|
||||||
## explicit; go 1.22.0
|
## explicit; go 1.22.0
|
||||||
go.opentelemetry.io/otel/trace
|
go.opentelemetry.io/otel/trace
|
||||||
go.opentelemetry.io/otel/trace/embedded
|
go.opentelemetry.io/otel/trace/embedded
|
||||||
go.opentelemetry.io/otel/trace/internal/telemetry
|
go.opentelemetry.io/otel/trace/internal/telemetry
|
||||||
go.opentelemetry.io/otel/trace/noop
|
go.opentelemetry.io/otel/trace/noop
|
||||||
# golang.org/x/crypto v0.36.0
|
# golang.org/x/crypto v0.37.0
|
||||||
## explicit; go 1.23.0
|
## explicit; go 1.23.0
|
||||||
golang.org/x/crypto/pbkdf2
|
golang.org/x/crypto/pbkdf2
|
||||||
golang.org/x/crypto/scrypt
|
golang.org/x/crypto/scrypt
|
||||||
golang.org/x/crypto/sha3
|
golang.org/x/crypto/sha3
|
||||||
# golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c
|
# golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0
|
||||||
## explicit; go 1.22.0
|
## explicit; go 1.23.0
|
||||||
golang.org/x/exp/maps
|
golang.org/x/exp/maps
|
||||||
# golang.org/x/mod v0.26.0
|
# golang.org/x/mod v0.26.0
|
||||||
## explicit; go 1.23.0
|
## explicit; go 1.23.0
|
||||||
golang.org/x/mod/semver
|
golang.org/x/mod/semver
|
||||||
# golang.org/x/net v0.38.0
|
# golang.org/x/net v0.39.0
|
||||||
## explicit; go 1.23.0
|
## explicit; go 1.23.0
|
||||||
golang.org/x/net/html
|
golang.org/x/net/html
|
||||||
golang.org/x/net/html/atom
|
golang.org/x/net/html/atom
|
||||||
@@ -548,7 +547,7 @@ golang.org/x/net/trace
|
|||||||
## explicit; go 1.23.0
|
## explicit; go 1.23.0
|
||||||
golang.org/x/oauth2
|
golang.org/x/oauth2
|
||||||
golang.org/x/oauth2/internal
|
golang.org/x/oauth2/internal
|
||||||
# golang.org/x/sync v0.12.0
|
# golang.org/x/sync v0.14.0
|
||||||
## explicit; go 1.23.0
|
## explicit; go 1.23.0
|
||||||
golang.org/x/sync/errgroup
|
golang.org/x/sync/errgroup
|
||||||
golang.org/x/sync/semaphore
|
golang.org/x/sync/semaphore
|
||||||
@@ -558,10 +557,10 @@ golang.org/x/sys/cpu
|
|||||||
golang.org/x/sys/plan9
|
golang.org/x/sys/plan9
|
||||||
golang.org/x/sys/unix
|
golang.org/x/sys/unix
|
||||||
golang.org/x/sys/windows
|
golang.org/x/sys/windows
|
||||||
# golang.org/x/term v0.30.0
|
# golang.org/x/term v0.31.0
|
||||||
## explicit; go 1.23.0
|
## explicit; go 1.23.0
|
||||||
golang.org/x/term
|
golang.org/x/term
|
||||||
# golang.org/x/text v0.23.0
|
# golang.org/x/text v0.24.0
|
||||||
## explicit; go 1.23.0
|
## explicit; go 1.23.0
|
||||||
golang.org/x/text/cases
|
golang.org/x/text/cases
|
||||||
golang.org/x/text/internal
|
golang.org/x/text/internal
|
||||||
@@ -574,8 +573,8 @@ golang.org/x/text/transform
|
|||||||
golang.org/x/text/unicode/bidi
|
golang.org/x/text/unicode/bidi
|
||||||
golang.org/x/text/unicode/norm
|
golang.org/x/text/unicode/norm
|
||||||
golang.org/x/text/width
|
golang.org/x/text/width
|
||||||
# golang.org/x/time v0.7.0
|
# golang.org/x/time v0.11.0
|
||||||
## explicit; go 1.18
|
## explicit; go 1.23.0
|
||||||
golang.org/x/time/rate
|
golang.org/x/time/rate
|
||||||
# google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463
|
# google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463
|
||||||
## explicit; go 1.23.0
|
## explicit; go 1.23.0
|
||||||
|
|||||||
Reference in New Issue
Block a user