diff --git a/.gitignore b/.gitignore index 981ef2cfb1..997b895a0a 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,10 @@ tools/metrics/metrics # ignore the ako.siging key local copy ako.pem +# e2e artifacts +*.tar.gz +urls.json + +# DOS artifacts +dos +urls.txt diff --git a/.licenses-gomod.sha256 b/.licenses-gomod.sha256 index d4b94024b5..b882027858 100644 --- a/.licenses-gomod.sha256 +++ b/.licenses-gomod.sha256 @@ -1 +1 @@ -100644 cc82b2933dc41b1ba0560cbc6b1709c13678dcf7 go.mod +100644 ab4107d3c86f6e3f05aea4afe80802e594572ac8 go.mod diff --git a/Makefile b/Makefile index c8e78a3c85..a060265c5f 100644 --- a/Makefile +++ b/Makefile @@ -584,7 +584,7 @@ endif VERSION=$(NEXT_VERSION) \ OPERATOR_POD_NAME=$(OPERATOR_POD_NAME) \ OPERATOR_NAMESPACE=$(OPERATOR_NAMESPACE) \ - bin/manager --object-deletion-protection=false --log-level=$(RUN_LOG_LEVEL) \ + bin/manager --log-encoder=json --object-deletion-protection=false --log-level=$(RUN_LOG_LEVEL) \ --atlas-domain=$(ATLAS_DOMAIN) \ --global-api-secret-name=$(ATLAS_KEY_SECRET_NAME) @@ -630,3 +630,13 @@ install-ako-helm: --set subobjectDeletionProtection=false \ --namespace=$(HELM_AKO_NAMESPACE) --create-namespace kubectl get crds + +.PHONY: license-headers +license-headers: + addlicense \ + -l apache \ + -c "MongoDB Inc" \ + -ignore "**/*.md" \ + -ignore "**/*.yaml" \ + -ignore "**/*.yml" \ + -ignore "**/*Dockerfile" . diff --git a/assets.go b/assets.go new file mode 100644 index 0000000000..40cf753d97 --- /dev/null +++ b/assets.go @@ -0,0 +1,20 @@ +// Copyright 2025 MongoDB Inc +// +// 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 root + +import "embed" + +//go:embed config/crd/* test/helper/observability/install/assets/* +var Assets embed.FS diff --git a/cmd/main.go b/cmd/main.go index e73ccd9686..5e2f6bdf80 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -84,6 +84,7 @@ func main() { WithLogger(logger). WithMetricAddress(config.MetricsAddr). WithProbeAddress(config.ProbeAddr). + WithPprofBindAddress(config.PprofAddress). WithLeaderElection(config.EnableLeaderElection). WithAtlasDomain(config.AtlasDomain). WithAPISecret(config.GlobalAPISecret). @@ -118,6 +119,7 @@ type Config struct { IndependentSyncPeriod int FeatureFlags *featureflags.FeatureFlags DryRun bool + PprofAddress string } // ParseConfiguration fills the 'OperatorConfig' from the flags passed to the program @@ -126,6 +128,7 @@ func parseConfiguration() Config { config := Config{} flag.StringVar(&config.AtlasDomain, "atlas-domain", operator.DefaultAtlasDomain, "the Atlas URL domain name (with slash in the end).") flag.StringVar(&config.MetricsAddr, "metrics-bind-address", ":8080", "The address the metric endpoint binds to.") + flag.StringVar(&config.PprofAddress, "pprof-bind-address", ":7070", "The address the pprof endpoint binds to.") flag.StringVar(&config.ProbeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.") flag.StringVar(&globalAPISecretName, "global-api-secret-name", "", "The name of the Secret that contains Atlas API keys. "+ "It is used by the Operator if AtlasProject configuration doesn't contain API key reference. Defaults to -api-key.") @@ -241,6 +244,7 @@ func initCustomZapLogger(level, encoding string) (*zap.Logger, error) { EncodeLevel: zapcore.CapitalLevelEncoder, TimeKey: "time", EncodeTime: zapcore.ISO8601TimeEncoder, + NameKey: "logger", }, } return cfg.Build() diff --git a/devbox.json b/devbox.json index 3e753df75e..4acd68ba68 100644 --- a/devbox.json +++ b/devbox.json @@ -25,6 +25,7 @@ "awscli2@latest", "go-mockery@latest", "docker-sbom@latest", - "openshift@latest" + "openshift@latest", + "addlicense@latest" ] } diff --git a/devbox.lock b/devbox.lock index 28692a7c52..c5cb4a4052 100644 --- a/devbox.lock +++ b/devbox.lock @@ -49,6 +49,54 @@ } } }, + "addlicense@latest": { + "last_modified": "2025-05-16T20:19:48Z", + "resolved": "github:NixOS/nixpkgs/12a55407652e04dcf2309436eb06fef0d3713ef3#addlicense", + "source": "devbox-search", + "version": "1.1.1", + "systems": { + "aarch64-darwin": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/866yzzrrgksaa052vbpxfrqkqsgw0khf-addlicense-1.1.1", + "default": true + } + ], + "store_path": "/nix/store/866yzzrrgksaa052vbpxfrqkqsgw0khf-addlicense-1.1.1" + }, + "aarch64-linux": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/lg4psq4bzdnl7jv4jhm7r20d5b0m3rks-addlicense-1.1.1", + "default": true + } + ], + "store_path": "/nix/store/lg4psq4bzdnl7jv4jhm7r20d5b0m3rks-addlicense-1.1.1" + }, + "x86_64-darwin": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/zaqc4vhc8n9n09pyqxpx18hh1qxli5i6-addlicense-1.1.1", + "default": true + } + ], + "store_path": "/nix/store/zaqc4vhc8n9n09pyqxpx18hh1qxli5i6-addlicense-1.1.1" + }, + "x86_64-linux": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/jxxsajb6qsk39jgrgn64mam4ir7nr66g-addlicense-1.1.1", + "default": true + } + ], + "store_path": "/nix/store/jxxsajb6qsk39jgrgn64mam4ir7nr66g-addlicense-1.1.1" + } + } + }, "awscli2@latest": { "last_modified": "2025-05-19T23:16:24Z", "resolved": "github:NixOS/nixpkgs/359c442b7d1f6229c1dc978116d32d6c07fe8440#awscli2", diff --git a/go.mod b/go.mod index cc82b2933d..ab4107d3c8 100644 --- a/go.mod +++ b/go.mod @@ -16,14 +16,18 @@ require ( github.com/Azure/go-autorest/autorest/to v0.4.1 github.com/Masterminds/semver v1.5.0 github.com/aws/aws-sdk-go v1.55.7 + github.com/go-kit/kit v0.12.0 github.com/go-logr/zapr v1.3.0 github.com/go-test/deep v1.1.1 github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 + github.com/grafana/dskit v0.0.0-20250317084829-9cdd36a91f10 + github.com/grafana/loki/v3 v3.5.1 github.com/mongodb-forks/digest v1.1.0 github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1 github.com/onsi/ginkgo/v2 v2.23.4 github.com/onsi/gomega v1.37.0 + github.com/prometheus/prometheus v0.302.1 github.com/sethvargo/go-password v0.3.1 github.com/stretchr/testify v1.10.0 go.mongodb.org/atlas v0.38.0 @@ -50,36 +54,130 @@ require ( cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/iam v1.5.2 // indirect cloud.google.com/go/longrunning v0.6.7 // indirect + dario.cat/mergo v1.0.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect + github.com/Masterminds/goutils v1.1.1 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Masterminds/sprig/v3 v3.3.0 // indirect + github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect github.com/antlr4-go/antlr/v4 v4.13.0 // indirect + github.com/armon/go-metrics v0.4.1 // indirect + github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect + github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 // indirect github.com/blang/semver/v4 v4.0.0 // indirect + github.com/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500 // indirect + github.com/coreos/go-semver v0.3.1 // indirect + github.com/coreos/go-systemd/v22 v22.5.0 // indirect + github.com/dennwc/varint v1.0.0 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/edsrzf/mmap-go v1.2.0 // indirect + github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb // indirect + github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-openapi/analysis v0.23.0 // indirect + github.com/go-openapi/errors v0.22.0 // indirect + github.com/go-openapi/loads v0.22.0 // indirect + github.com/go-openapi/spec v0.21.0 // indirect + github.com/go-openapi/strfmt v0.23.0 // indirect + github.com/go-openapi/validate v0.24.0 // indirect + github.com/go-redsync/redsync/v4 v4.13.0 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect + github.com/gogo/googleapis v1.4.1 // indirect + github.com/gogo/status v1.1.1 // indirect github.com/golang-jwt/jwt/v5 v5.2.2 // indirect github.com/google/btree v1.1.3 // indirect github.com/google/cel-go v0.23.2 // indirect github.com/google/gnostic-models v0.6.9 // indirect github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect github.com/google/s2a-go v0.1.9 // indirect + github.com/gorilla/mux v1.8.1 // indirect + github.com/grafana/gomemcache v0.0.0-20250228145437-da7b95fd2ac1 // indirect + github.com/grafana/jsonparser v0.0.0-20241004153430-023329977675 // indirect + github.com/grafana/loki/pkg/push v0.0.0-20240924133635-758364c7775f // indirect + github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect + github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect + github.com/hashicorp/consul/api v1.31.2 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-hclog v1.6.3 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-metrics v0.5.4 // indirect + github.com/hashicorp/go-msgpack/v2 v2.1.1 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-rootcerts v1.0.2 // indirect + github.com/hashicorp/go-sockaddr v1.0.7 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/memberlist v0.5.3 // indirect + github.com/hashicorp/serf v0.10.1 // indirect + github.com/huandu/xstrings v1.5.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/jpillora/backoff v1.0.0 // indirect + github.com/julienschmidt/httprouter v1.3.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mdlayher/socket v0.5.1 // indirect + github.com/mdlayher/vsock v1.2.1 // indirect + github.com/miekg/dns v1.1.63 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect + github.com/oklog/ulid v1.3.1 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor v0.116.0 // indirect + github.com/opentracing-contrib/go-grpc v0.1.1 // indirect + github.com/opentracing-contrib/go-stdlib v1.1.0 // indirect + github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect + github.com/pires/go-proxyproto v0.7.0 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect + github.com/prometheus/alertmanager v0.28.1 // indirect + github.com/prometheus/exporter-toolkit v0.13.2 // indirect + github.com/prometheus/sigv4 v0.1.2 // indirect + github.com/redis/go-redis/v9 v9.8.0 // indirect + github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect + github.com/sercand/kuberesolver/v5 v5.1.1 // indirect + github.com/shopspring/decimal v1.4.0 // indirect + github.com/sony/gobreaker/v2 v2.1.0 // indirect + github.com/spf13/cast v1.7.1 // indirect github.com/spf13/cobra v1.8.1 // indirect github.com/stoewer/go-strcase v1.3.0 // indirect github.com/stretchr/objx v0.5.2 // indirect + github.com/tjhop/slog-gokit v0.1.4 // indirect + github.com/uber/jaeger-client-go v2.30.0+incompatible // indirect + github.com/uber/jaeger-lib v2.4.1+incompatible // indirect github.com/x448/float16 v0.8.4 // indirect + go.etcd.io/etcd/api/v3 v3.5.21 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.5.21 // indirect + go.etcd.io/etcd/client/v3 v3.5.21 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v0.118.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.118.0 // indirect + go.opentelemetry.io/collector/consumer v1.24.0 // indirect + go.opentelemetry.io/collector/pdata v1.28.1 // indirect + go.opentelemetry.io/collector/pipeline v0.118.0 // indirect + go.opentelemetry.io/collector/processor v0.118.0 // indirect + go.opentelemetry.io/collector/semconv v0.118.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.59.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/metric v1.35.0 // indirect go.opentelemetry.io/otel/trace v1.35.0 // indirect + go.uber.org/atomic v1.11.0 // indirect go.uber.org/automaxprocs v1.6.0 // indirect + go.uber.org/goleak v1.3.0 // indirect + go4.org/netipx v0.0.0-20230125063823-8449b0a6169f // indirect + golang.org/x/mod v0.24.0 // indirect golang.org/x/tools v0.31.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a // indirect @@ -92,7 +190,7 @@ require ( cloud.google.com/go/compute v1.39.0 cloud.google.com/go/compute/metadata v0.7.0 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.22 // indirect + github.com/Azure/go-autorest/autorest/adal v0.9.24 // indirect github.com/Azure/go-autorest/autorest/azure/cli v0.4.6 // indirect github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect @@ -107,11 +205,12 @@ require ( github.com/evanphx/json-patch/v5 v5.9.11 // indirect github.com/go-logr/logr v1.4.3 github.com/go-openapi/jsonpointer v0.21.0 // indirect - github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect - github.com/gogo/protobuf v1.3.2 // indirect + github.com/gogo/protobuf v1.3.2 github.com/golang-jwt/jwt/v4 v4.5.2 // indirect - github.com/golang/snappy v0.0.4 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v1.0.0 github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect @@ -119,7 +218,7 @@ require ( github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.18.0 // indirect - github.com/mailru/easyjson v0.7.7 // indirect + github.com/mailru/easyjson v0.9.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -127,18 +226,18 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.22.0 // indirect + github.com/prometheus/client_golang v1.22.0 github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.62.0 // indirect + github.com/prometheus/common v0.62.0 github.com/prometheus/procfs v0.15.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/pflag v1.0.6 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.38.0 // indirect - golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 + golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 golang.org/x/net v0.40.0 // indirect golang.org/x/oauth2 v0.30.0 // indirect golang.org/x/sys v0.33.0 // indirect @@ -153,7 +252,7 @@ require ( k8s.io/apiextensions-apiserver v0.33.0 k8s.io/klog/v2 v2.130.1 k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect - k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect + k8s.io/utils v0.0.0-20241210054802-24370beab758 // indirect sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect sigs.k8s.io/yaml v1.4.0 diff --git a/go.sum b/go.sum index b3894eed87..dacee7d6b4 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,6 @@ cel.dev/expr v0.20.0 h1:OunBvVCfvpWlt4dN7zg3FM6TDkzOePe1+foGJ9AXeeI= cel.dev/expr v0.20.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.121.2 h1:v2qQpN6Dx9x2NmwrqlesOt3Ys4ol5/lFZ6Mg1B7OJCg= cloud.google.com/go v0.121.2/go.mod h1:nRFlrHq39MNVWu+zESP2PosMWA0ryJw8KUBZ2iZpxbw= cloud.google.com/go/auth v0.16.1 h1:XrXauHMd30LhQYVRHLGvJiYeczweKQXZxsTbV9TiguU= @@ -16,6 +17,8 @@ cloud.google.com/go/kms v1.22.0 h1:dBRIj7+GDeeEvatJeTB19oYZNV0aj6wEqSIT/7gLqtk= cloud.google.com/go/kms v1.22.0/go.mod h1:U7mf8Sva5jpOb4bxYZdtw/9zsbIjrklYwPcvMk34AL8= cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE= cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY= +dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= +dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U= @@ -26,6 +29,8 @@ github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+ github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 h1:FPKJS1T+clwv+OLGt13a8UjqeRuh0O4SJ3lUriThc+4= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0 h1:LkHbJbgF3YyvC53aqYGR+wWQDn2Rdp9AQdGndf9QvY4= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0/go.mod h1:QyiQdW4f4/BIfB8ZutZ2s+28RAgfa/pT+zS++ZHyM1I= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.1.2 h1:mLY+pNLjCUeKhgnAJWAKhEUQM+RJQo2H1fuGSw1Ky1E= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.1.2/go.mod h1:FbdwsQ2EzwvXxOPcMFYO8ogEc9uMMIj3YkmCdXdAFmk= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v3 v3.1.0 h1:2qsIIvxVT+uE6yrNldntJKlLRgxGbZ85kgtz5SNBhMw= @@ -34,6 +39,8 @@ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/keyvault/armkeyvault v1.5. github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/keyvault/armkeyvault v1.5.0/go.mod h1:4YIVtzMFVsPwBvitCDX7J9sqthSj43QD1sP6fYc1egc= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1 h1:bWh0Z2rOEDfB/ywv/l0iHN1JgyazE6kW/aIA89+CEK0= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1/go.mod h1:Bzf34hhAE9NSxailk8xVeLEZbUjOXcC+GnU1mMKdhLw= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 h1:bXwSugBiSbgtz7rOtbfGf+woewp4f06orW9OP5BjHLA= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0/go.mod h1:Y/HgrePTmGy9HjdSGTqZNa+apUpTVIEVKXJyARP2lrk= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 h1:Dd+RhdJn0OTtVGaeDLZpcumkIVCtA/3/Fo42+eoYvVM= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0/go.mod h1:5kakwfW5CjC9KK+Q4wjXAg+ShuIm2mBMua0ZFj2C8PE= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= @@ -42,8 +49,9 @@ github.com/Azure/go-autorest/autorest v0.11.28/go.mod h1:MrkzG3Y3AH668QyF9KRk5ne github.com/Azure/go-autorest/autorest v0.11.30 h1:iaZ1RGz/ALZtN5eq4Nr1SOFSlf2E4pDI3Tcsl+dZPVE= github.com/Azure/go-autorest/autorest v0.11.30/go.mod h1:t1kpPIOpIVX7annvothKvb0stsrXa37i7b+xpmBW8Fs= github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/adal v0.9.22 h1:/GblQdIudfEM3AWWZ0mrYJQSd7JS4S/Mbzh6F0ov0Xc= github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk= +github.com/Azure/go-autorest/autorest/adal v0.9.24 h1:BHZfgGsGwdkHDyZdtQRQk1WeUdW0m2WPAwuHZwUi5i4= +github.com/Azure/go-autorest/autorest/adal v0.9.24/go.mod h1:7T1+g0PYFmACYW5LlG2fcoPiPlFHjClyRGL7dRlP5c8= github.com/Azure/go-autorest/autorest/azure/auth v0.5.13 h1:Ov8avRZi2vmrE2JcXw+tu5K/yB41r7xK9GZDiBF7NdM= github.com/Azure/go-autorest/autorest/azure/auth v0.5.13/go.mod h1:5BAVfWLWXihP47vYrPuBKKf4cS0bXI+KM9Qx6ETDJYo= github.com/Azure/go-autorest/autorest/azure/cli v0.4.6 h1:w77/uPk80ZET2F+AfQExZyEWtn+0Rk/uw17m9fv5Ajc= @@ -65,40 +73,136 @@ github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJ github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs= github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/Code-Hex/go-generics-cache v1.5.1 h1:6vhZGc5M7Y/YD8cIUcY8kcuQLB4cHR7U+0KMqAA0KcU= +github.com/Code-Hex/go-generics-cache v1.5.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs= +github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Workiva/go-datastructures v1.1.5 h1:5YfhQ4ry7bZc2Mc7R0YZyYwpf5c6t1cEFvdAhd6Mkf4= +github.com/Workiva/go-datastructures v1.1.5/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0= +github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= +github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 h1:uvdUDbHQHO85qeSydJtItA4T55Pw6BtAejd0APRJOCE= +github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= +github.com/alicebob/miniredis v2.5.0+incompatible h1:yBHoLpsyjupjz3NL3MhKMVkR41j82Yjf3KFv7ApYzUI= +github.com/alicebob/miniredis/v2 v2.34.0 h1:mBFWMaJSNL9RwdGRyEDoAAv8OQc5UlEhLDQggTglU/0= +github.com/alicebob/miniredis/v2 v2.34.0/go.mod h1:kWShP4b58T1CW0Y5dViCd5ztzrDqRWqM3nksiyXk5s8= github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE= github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 h1:6df1vn4bBlDDo4tARvBm7l6KA9iVMnE3NWizDeWSrps= +github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3/go.mod h1:CIWtjkly68+yqLPbvwwR/fjNJA/idrtULjZWh2v1ys0= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 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/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= +github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500 h1:6lhrsTEnloDPXyeZBvSYvQf8u86jbKehZPVDDlkgDl4= +github.com/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 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/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42 h1:Om6kYQYDUk5wWbT0t0q6pvyM49i9XZAv9dDrkDA7gjk= +github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= +github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= +github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/digitalocean/godo v1.132.0 h1:n0x6+ZkwbyQBtIU1wwBhv26EINqHg0wWQiBXlwYg/HQ= +github.com/digitalocean/godo v1.132.0/go.mod h1:PU8JB6I1XYkQIdHFop8lLAY9ojp6M0XcU0TWaQSxbrc= github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +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/docker/docker v28.0.4+incompatible h1:JNNkBctYKurkw6FrHfKqY0nKIDf5nrbxjVBtS+cdcok= +github.com/docker/docker v28.0.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +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-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/edsrzf/mmap-go v1.2.0 h1:hXLYlkbaPzt1SaQk+anYwKSRNhufIDCchSPkUD6dD84= +github.com/edsrzf/mmap-go v1.2.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M= +github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= +github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= +github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= +github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= +github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb h1:IT4JYU7k4ikYg1SCxNI1/Tieq/NFvh6dzLdgi7eu0tM= +github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb/go.mod h1:bH6Xx7IW64qjjJq8M2u4dxNaBiDfKK+z/3eGDpXEQhc= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -106,20 +210,52 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= -github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU= +github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo= +github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w= +github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE= github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= -github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= -github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco= +github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs= +github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= +github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= +github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c= +github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4= github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58= +github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ= +github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= +github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis/v7 v7.4.1 h1:PASvf36gyUpr2zdOUS/9Zqc80GbM+9BDyiJSJDDOrTI= +github.com/go-redis/redis/v7 v7.4.1/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/go-redsync/redsync/v4 v4.13.0 h1:49X6GJfnbLGaIpBBREM/zA4uIMDXKAh1NDkvQ1EkZKA= +github.com/go-redsync/redsync/v4 v4.13.0/go.mod h1:HMW4Q224GZQz6x1Xc7040Yfgacukdzu7ifTDAKiyErQ= +github.com/go-resty/resty/v2 v2.16.3 h1:zacNT7lt4b8M/io2Ahj6yPypL7bqx9n1iprfQuodV+E= +github.com/go-resty/resty/v2 v2.16.3/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-zookeeper/zk v1.0.4 h1:DPzxraQx7OrPyXq2phlGlNSIyWEsAox0RJmjTseMV6I= +github.com/go-zookeeper/zk v1.0.4/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/gogo/status v1.1.1 h1:DuHXlSFHNKqTQ+/ACf5Vs6r4X/dH2EgIzR9Vr+H65kg= +github.com/gogo/status v1.1.1/go.mod h1:jpG3dM5QPcqu19Hg8lkUhBFBa3TcLs1DG7+2Jqci7oU= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= @@ -127,17 +263,35 @@ github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXe github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws= +github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/cel-go v0.23.2 h1:UdEe3CvQh3Nv+E/j9r1Y//WO0K0cSyD7/y0bzyLIMI4= github.com/google/cel-go v0.23.2/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo= github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= @@ -156,23 +310,124 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= github.com/googleapis/gax-go/v2 v2.14.2 h1:eBLnkZ9635krYIPD+ag1USrOAI0Nr0QYF3+/3GqO0k0= github.com/googleapis/gax-go/v2 v2.14.2/go.mod h1:ON64QhlJkhVtSqp4v1uaK92VyZ2gmvDQsweuyLV+8+w= +github.com/gophercloud/gophercloud/v2 v2.4.0 h1:XhP5tVEH3ni66NSNK1+0iSO6kaGPH/6srtx6Cr+8eCg= +github.com/gophercloud/gophercloud/v2 v2.4.0/go.mod h1:uJWNpTgJPSl2gyzJqcU/pIAhFUWvIkp8eE8M15n9rs4= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo= +github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= +github.com/grafana/dskit v0.0.0-20250317084829-9cdd36a91f10 h1:trIyc2EXciif3LGhcC4JlWT/EcJdkiOlitJGU8AgK48= +github.com/grafana/dskit v0.0.0-20250317084829-9cdd36a91f10/go.mod h1:GYazi+gM2La64jui4nDKrD6b8Drb8QDsUqyzBuiy1Ag= +github.com/grafana/gomemcache v0.0.0-20250228145437-da7b95fd2ac1 h1:vR5nELq+KtGO+IiGW+AclWeQ7uhLHCEz/zyQwbQVNnQ= +github.com/grafana/gomemcache v0.0.0-20250228145437-da7b95fd2ac1/go.mod h1:j/s0jkda4UXTemDs7Pgw/vMT06alWc42CHisvYac0qw= +github.com/grafana/jsonparser v0.0.0-20241004153430-023329977675 h1:U94jQ2TQr1m3HNyE8efSdyaBbDrdPaWImXyenuKZ/nw= +github.com/grafana/jsonparser v0.0.0-20241004153430-023329977675/go.mod h1:796sq+UcONnSlzA3RtlBZ+b/hrerkZXiEmO8oMjyRwY= +github.com/grafana/loki/pkg/push v0.0.0-20240924133635-758364c7775f h1:NcS5dQXH/BtoMpQtA1d0+ftwyzdwQk5/8SCj9eHl8w8= +github.com/grafana/loki/pkg/push v0.0.0-20240924133635-758364c7775f/go.mod h1:lJEF/Wh5MYlmBem6tOYAFObkLsuikfrEf8Iy9AdMPiQ= +github.com/grafana/loki/v3 v3.5.1 h1:muG+UNmUuLBcWIRtankVPRyee58VSUVkZg0NMUPGP7M= +github.com/grafana/loki/v3 v3.5.1/go.mod h1:BQiwDJF7fXVjFuKsN9U2uojfA2wE3sWOXbRFdN4y0mQ= +github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg= +github.com/grafana/pyroscope-go/godeltaprof v0.1.8/go.mod h1:2+l7K7twW49Ct4wFluZD3tZ6e0SjanjcUUBPVD/UuGU= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= +github.com/hashicorp/consul/api v1.31.2 h1:NicObVJHcCmyOIl7Z9iHPvvFrocgTYo9cITSGg0/7pw= +github.com/hashicorp/consul/api v1.31.2/go.mod h1:Z8YgY0eVPukT/17ejW+l+C7zJmKwgPHtjU1q16v/Y40= +github.com/hashicorp/consul/sdk v0.16.1 h1:V8TxTnImoPD5cj0U9Spl0TUxcytjcbbJeADFF07KdHg= +github.com/hashicorp/consul/sdk v0.16.1/go.mod h1:fSXvwxB2hmh1FMZCNl6PwX0Q/1wdWtHJcZ7Ea5tns0s= +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/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-metrics v0.5.4 h1:8mmPiIJkTPPEbAiV97IxdAGNdRdaWwVap1BU6elejKY= +github.com/hashicorp/go-metrics v0.5.4/go.mod h1:CG5yz4NZ/AI/aQt9Ucm/vdBnbh7fvmv4lxZ350i+QQI= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= +github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack/v2 v2.1.1 h1:xQEY9yB2wnHitoSzk/B9UjXWRQ67QKu5AOm8aFp8N3I= +github.com/hashicorp/go-msgpack/v2 v2.1.1/go.mod h1:upybraOAblm4S7rx0+jeNy+CWWhzywQsSRV5033mMu4= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= +github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw= +github.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/memberlist v0.5.3 h1:tQ1jOCypD0WvMemw/ZhhtH+PWpzcftQvgCorLu0hndk= +github.com/hashicorp/memberlist v0.5.3/go.mod h1:h60o12SZn/ua/j0B6iKAZezA4eDaGsIuPO70eOaJ6WE= +github.com/hashicorp/nomad/api v0.0.0-20241218080744-e3ac00f30eec h1:+YBzb977VrmffaCX/OBm17dEVJUcWn5dW+eqs3aIJ/A= +github.com/hashicorp/nomad/api v0.0.0-20241218080744-e3ac00f30eec/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= +github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/hetznercloud/hcloud-go/v2 v2.18.0 h1:BemrVGeWI8Kn/pvaC1jBsHZxQMnRqOydS7Ju4BERB4Q= +github.com/hetznercloud/hcloud-go/v2 v2.18.0/go.mod h1:r5RTzv+qi8IbLcDIskTzxkFIji7Ovc8yNgepQR9M+UA= +github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= +github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/ionos-cloud/sdk-go/v6 v6.3.2 h1:2mUmrZZz6cPyT9IRX0T8fBLc/7XU/eTxP2Y5tS7/09k= +github.com/ionos-cloud/sdk-go/v6 v6.3.2/go.mod h1:SXrO9OGyWjd2rZhAhEpdYN6VUAODzzqRdqA9BCviQtI= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/keybase/go-keychain v0.0.1 h1:way+bWYa6lDppZoZcgMbYsvC7GxljxrskdNInRtuthU= github.com/keybase/go-keychain v0.0.1/go.mod h1:PdEILRW3i9D8JcdM+FmY6RwkHGnhHxXwkPPMeUgOK1k= 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/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= +github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= +github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -181,13 +436,50 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/linode/linodego v1.46.0 h1:+uOG4SD2MIrhbrLrvOD5HrbdLN3D19Wgn3MgdUNQjeU= +github.com/linode/linodego v1.46.0/go.mod h1:vyklQRzZUWhFVBZdYx4dcYJU/gG9yKB9VUcUs6ub0Lk= +github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mdlayher/socket v0.5.1 h1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos= +github.com/mdlayher/socket v0.5.1/go.mod h1:TjPLHI1UgwEv5J1B5q0zTZq12A/6H7nKmtTanQE37IQ= +github.com/mdlayher/vsock v1.2.1 h1:pC1mTJTvjo1r9n9fbm7S1j04rCgCzhCOS5DY0zqHlnQ= +github.com/mdlayher/vsock v1.2.1/go.mod h1:NRfCibel++DgeMD8z/hP+PPTjlNJsdPOmxcnENvE+SE= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY= +github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmLKZf+SjVanKKhCgf3bg+511DmU9eDQTen7LLbY= +github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mongodb-forks/digest v1.1.0 h1:7eUdsR1BtqLv0mdNm4OXs6ddWvR4X2/OsLwdKksrOoc= @@ -196,53 +488,155 @@ github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8 github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1 h1:dOYG7LS/WK00RWZc8XGgcUTlTxpp3mKhdR2Q9z9HbXM= github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1/go.mod h1:mpRZBD8SJ55OIICQ3iWH0Yz3cjzA61JdqMLoWXeB2+8= +github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus= github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8= github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y= github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.116.0 h1:Kxk5Ral+Dc6VB9UmTketVjs+rbMZP8JxQ4SXDx4RivQ= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.116.0/go.mod h1:ctT6oQmGmWGGGgUIKyx2fDwqz77N9+04gqKkDyAzKCg= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 h1:RlEK9MbxWyBHbLel8EJ1L7DbYVLai9dZL6Ljl2cBgyA= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0/go.mod h1:AVUEyIjPb+0ARr7mhIkZkdNg3fd0ZcRhzAi53oZhl1Q= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 h1:jwnZYRBuPJnsKXE5H6ZvTEm91bXW5VP8+tLewzl54eg= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0/go.mod h1:NT3Ag+DdnIAZQfD7l7OHwlYqnaAJ19SoPZ0nhD9yx4s= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor v0.116.0 h1:ZBmLuipJv7BT9fho/2yAFsS8AtMsCOCe4ON8oqkX3n8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor v0.116.0/go.mod h1:f0GdYWGxUunyRZ088gHnoX78pc/gZc3dQlRtidiGXzg= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/opentracing-contrib/go-grpc v0.1.1 h1:Ws7IN1zyiL1DFqKQPhRXuKe5pLYzMfdxnC1qtajE2PE= +github.com/opentracing-contrib/go-grpc v0.1.1/go.mod h1:Nu6sz+4zzgxXu8rvKfnwjBEmHsuhTigxRwV2RhELrS8= +github.com/opentracing-contrib/go-stdlib v1.1.0 h1:cZBWc4pA4e65tqTJddbflK435S0tDImj6c9BMvkdUH0= +github.com/opentracing-contrib/go-stdlib v1.1.0/go.mod h1:S0p+X9p6dcBkoMTL+Qq2VOvxKs9ys5PpYWXWqlCS0bQ= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A= +github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU= +github.com/ovh/go-ovh v1.6.0 h1:ixLOwxQdzYDx296sXcgS35TOPEahJkpjMGtzPadCjQI= +github.com/ovh/go-ovh v1.6.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pires/go-proxyproto v0.7.0 h1:IukmRewDQFWC7kfnb66CSomk2q/seBuilHBYFwyq0Hs= +github.com/pires/go-proxyproto v0.7.0/go.mod h1:Vz/1JPY/OACxWGQNIRY2BeyDmpoaWmEP40O9LbuiFR4= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= 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/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= +github.com/prometheus/alertmanager v0.28.1 h1:BK5pCoAtaKg01BYRUJhEDV1tqJMEtYBGzPw8QdvnnvA= +github.com/prometheus/alertmanager v0.28.1/go.mod h1:0StpPUDDHi1VXeM7p2yYfeZgLVi/PPlt39vo9LQUHxM= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 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/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= +github.com/prometheus/exporter-toolkit v0.13.2 h1:Z02fYtbqTMy2i/f+xZ+UK5jy/bl1Ex3ndzh06T/Q9DQ= +github.com/prometheus/exporter-toolkit v0.13.2/go.mod h1:tCqnfx21q6qN1KA4U3Bfb8uWzXfijIrJz3/kTIqMV7g= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= 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/prometheus v0.302.1 h1:xqVdrwrB4WNpdgJqxsz5loqFWNUZitsK8myqLuSZ6Ag= +github.com/prometheus/prometheus v0.302.1/go.mod h1:YcyCoTbUR/TM8rY3Aoeqr0AWTu/pu1Ehh+trpX3eRzg= +github.com/prometheus/sigv4 v0.1.2 h1:R7570f8AoM5YnTUPFm3mjZH5q2k4D+I/phCWvZ4PXG8= +github.com/prometheus/sigv4 v0.1.2/go.mod h1:GF9fwrvLgkQwDdQ5BXeV9XUSCH/IPNqzvAoaohfjqMU= github.com/redis/go-redis/v9 v9.8.0 h1:q3nRvjrlge/6UD7eTu/DSg2uYiU2mCL0G/uzBWqhicI= github.com/redis/go-redis/v9 v9.8.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= +github.com/redis/rueidis v1.0.19 h1:s65oWtotzlIFN8eMPhyYwxlwLR1lUdhza2KtWprKYSo= +github.com/redis/rueidis v1.0.19/go.mod h1:8B+r5wdnjwK3lTFml5VtxjzGOQAC+5UmujoD12pDrEo= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.30 h1:yoKAVkEVwAqbGbR8n87rHQ1dulL25rKloGadb3vm770= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.30/go.mod h1:sH0u6fq6x4R5M7WxkoQFY/o7UaiItec0o1LinLCJNq8= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sercand/kuberesolver/v5 v5.1.1 h1:CYH+d67G0sGBj7q5wLK61yzqJJ8gLLC8aeprPTHb6yY= +github.com/sercand/kuberesolver/v5 v5.1.1/go.mod h1:Fs1KbKhVRnB2aDWN12NjKCB+RgYMWZJ294T3BtmVCpQ= github.com/sethvargo/go-password v0.3.1 h1:WqrLTjo7X6AcVYfC6R7GtSyuUQR9hGyAj/f1PYQZCJU= github.com/sethvargo/go-password v0.3.1/go.mod h1:rXofC1zT54N7R8K/h1WDUdkf9BOx5OptoxrMBcrXzvs= +github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sony/gobreaker/v2 v2.1.0 h1:av2BnjtRmVPWBvy5gSFPytm1J8BmN5AGhq875FfGKDM= +github.com/sony/gobreaker/v2 v2.1.0/go.mod h1:dO3Q/nCzxZj6ICjH6J/gM0r4oAwBMVLY8YAQf+NTtUg= +github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= +github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs= github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203 h1:QVqDTf3h2WHt08YuiTGPZLls0Wq99X9bWd0Q5ZSBesM= +github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203/go.mod h1:oqN97ltKNihBbwlX8dLpwxCl3+HnXKV/R0e+sRLd9C8= +github.com/tjhop/slog-gokit v0.1.4 h1:uj/vbDt3HaF0Py8bHPV4ti/s0utnO0miRbO277FLBKM= +github.com/tjhop/slog-gokit v0.1.4/go.mod h1:Bbu5v2748qpAWH7k6gse/kw3076IJf6owJmh7yArmJs= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= +github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= +github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= +github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= 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/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= @@ -256,6 +650,14 @@ github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfS github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M= +github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= +go.etcd.io/etcd/api/v3 v3.5.21 h1:A6O2/JDb3tvHhiIz3xf9nJ7REHvtEFJJ3veW3FbCnS8= +go.etcd.io/etcd/api/v3 v3.5.21/go.mod h1:c3aH5wcvXv/9dqIw2Y810LDXJfhSYdHQ0vxmP3CCHVY= +go.etcd.io/etcd/client/pkg/v3 v3.5.21 h1:lPBu71Y7osQmzlflM9OfeIV2JlmpBjqBNlLtcoBqUTc= +go.etcd.io/etcd/client/pkg/v3 v3.5.21/go.mod h1:BgqT/IXPjK9NkeSDjbzwsHySX3yIle2+ndz28nVsjUs= +go.etcd.io/etcd/client/v3 v3.5.21 h1:T6b1Ow6fNjOLOtM0xSoKNQt1ASPCLWrF9XMHcH9pEyY= +go.etcd.io/etcd/client/v3 v3.5.21/go.mod h1:mFYy67IOqmbRf/kRUvsHixzo3iG+1OF2W2+jVIQRAnU= go.mongodb.org/atlas v0.38.0 h1:zfwymq20GqivGwxPZfypfUDry+WwMGVui97z1d8V4bU= go.mongodb.org/atlas v0.38.0/go.mod h1:DJYtM+vsEpPEMSkQzJnFHrT0sP7ev6cseZc/GGjJYG8= go.mongodb.org/atlas-sdk/v20231115004 v20231115004.1.0 h1:vOvfk8bPedcphaTHIm6p8UB/ZPeVOqJZ7+MmTuI1eGs= @@ -268,8 +670,42 @@ go.mongodb.org/mongo-driver v1.17.3 h1:TQyXhnsWfWtgAhMtOgtYHMTkZIfBTpMTsMnd9ZBeH go.mongodb.org/mongo-driver v1.17.3/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= 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/collector/component v0.118.0 h1:sSO/ObxJ+yH77Z4DmT1mlSuxhbgUmY1ztt7xCA1F/8w= +go.opentelemetry.io/collector/component v0.118.0/go.mod h1:LUJ3AL2b+tmFr3hZol3hzKzCMvNdqNq0M5CF3SWdv4M= +go.opentelemetry.io/collector/component/componentstatus v0.118.0 h1:1aCIdUjqz0noKNQr1v04P+lwF89Lkua5U7BhH9IAxkE= +go.opentelemetry.io/collector/component/componentstatus v0.118.0/go.mod h1:ynO1Nyj0t1h6x/djIMJy35bhnnWEc2mlQaFgDNUO504= +go.opentelemetry.io/collector/component/componenttest v0.118.0 h1:knEHckoiL2fEWSIc0iehg39zP4IXzi9sHa45O+oxKo8= +go.opentelemetry.io/collector/component/componenttest v0.118.0/go.mod h1:aHc7t7zVwCpbhrWIWY+GMuaMxMCUP8C8P7pJOt8r/vU= +go.opentelemetry.io/collector/config/configtelemetry v0.118.0 h1:UlN46EViG2X42odWtXgWaqY7Y01ZKpsnswSwXTWx5mM= +go.opentelemetry.io/collector/config/configtelemetry v0.118.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.24.0 h1:7DeyBm9qdr1EPuCfPjWyChPK16DbVc0wZeSa9LZprFU= +go.opentelemetry.io/collector/consumer v1.24.0/go.mod h1:0G6jvZprIp4dpKMD1ZxCjriiP9GdFvFMObsQEtTk71s= +go.opentelemetry.io/collector/consumer/consumertest v0.118.0 h1:8AAS9ejQapP1zqt0+cI6u+AUBheT3X0171N9WtXWsVY= +go.opentelemetry.io/collector/consumer/consumertest v0.118.0/go.mod h1:spRM2wyGr4QZzqMHlLmZnqRCxqXN4Wd0piogC4Qb5PQ= +go.opentelemetry.io/collector/consumer/xconsumer v0.118.0 h1:guWnzzRqgCInjnYlOQ1BPrimppNGIVvnknAjlIbWXuY= +go.opentelemetry.io/collector/consumer/xconsumer v0.118.0/go.mod h1:C5V2d6Ys/Fi6k3tzjBmbdZ9v3J/rZSAMlhx4KVcMIIg= +go.opentelemetry.io/collector/pdata v1.28.1 h1:ORl5WLpQJvjzBVpHu12lqKMdcf/qDBwRXMcUubhybiQ= +go.opentelemetry.io/collector/pdata v1.28.1/go.mod h1:asKE8MD/4SOKz1mCrGdAz4VO2U2HUNg8A6094uK7pq0= +go.opentelemetry.io/collector/pdata/pprofile v0.118.0 h1:VK/fr65VFOwEhsSGRPj5c3lCv0yIK1Kt0sZxv9WZBb8= +go.opentelemetry.io/collector/pdata/pprofile v0.118.0/go.mod h1:eJyP/vBm179EghV3dPSnamGAWQwLyd+4z/3yG54YFoQ= +go.opentelemetry.io/collector/pdata/testdata v0.118.0 h1:5N0w1SX9KIRkwvtkrpzQgXy9eGk3vfNG0ds6mhEPMIM= +go.opentelemetry.io/collector/pdata/testdata v0.118.0/go.mod h1:UY+GHV5bOC1BnFburOZ0wiHReJj1XbW12mi2Ogbc5Lw= +go.opentelemetry.io/collector/pipeline v0.118.0 h1:RI1DMe7L0+5hGkx0EDGxG00TaJoh96MEQppgOlGx1Oc= +go.opentelemetry.io/collector/pipeline v0.118.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/processor v0.118.0 h1:NlqWiTTpPP+EPbrqTcNP9nh/4O4/9U9RGWVB49xo4ws= +go.opentelemetry.io/collector/processor v0.118.0/go.mod h1:Y8OD7wk51oPuBqrbn1qXIK91AbprRHP76hlvEzC24U4= +go.opentelemetry.io/collector/processor/processortest v0.118.0 h1:VfTLHuIaJWGyUmrvAOvf63gPMf1vAW68/jtJClEsKtU= +go.opentelemetry.io/collector/processor/processortest v0.118.0/go.mod h1:ZFWxsSoafGNOEk83FtGz43M5ypUzAOvGnfT0aQTDHdU= +go.opentelemetry.io/collector/processor/xprocessor v0.118.0 h1:M/EMhPRbadHLpv7g99fBjfgyuYexBZmgQqb2vjTXjvM= +go.opentelemetry.io/collector/processor/xprocessor v0.118.0/go.mod h1:lkoQoCv2Cz+C0kf2VHgBUDYWDecZLLeaHEvHDXbBCXU= +go.opentelemetry.io/collector/semconv v0.118.0 h1:V4vlMIK7TIaemrrn2VawvQPwruIKpj7Xgw9P5+BL56w= +go.opentelemetry.io/collector/semconv v0.118.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.59.0 h1:iQZYNQ7WwIcYXzOPR46FQv9O0dS1PW16RjvR0TjDOe8= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.59.0/go.mod h1:54CaSNqYEXvpzDh8KPjiMVoWm60t5R0dZRt0leEPgAs= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= 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= @@ -282,6 +718,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/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -290,7 +728,11 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go4.org/netipx v0.0.0-20230125063823-8449b0a6169f h1:ketMxHg+vWm3yccyYiq+uK8D3fRmna2Fcj+awpQp84s= +go4.org/netipx v0.0.0-20230125063823-8449b0a6169f/go.mod h1:tgPU4N2u9RByaTN3NC2p9xOzyFpte4jYwsIIRF7XlSc= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= 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-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -298,42 +740,80 @@ golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= +golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 h1:yqrTHse8TCMW1M1ZCP+VAR/l0kKxwaAIqN/il7x4voA= +golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= 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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= +golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/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-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/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.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= @@ -346,6 +826,7 @@ golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 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.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -358,6 +839,7 @@ golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= 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-20190907020128-2ca718005c18/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-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -373,24 +855,43 @@ gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= google.golang.org/api v0.236.0 h1:CAiEiDVtO4D/Qja2IA9VzlFrgPnK3XVMmRoJZlSWbc0= google.golang.org/api v0.236.0/go.mod h1:X1WF9CU2oTc+Jml1tiIxGmWFK/UZezdqEu09gcxZAj4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2 h1:1tXaIXCracvtsRxSBsYDiSBN0cuJvM7QYW+MrpIRY78= google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:49MsLSx0oWMOZqcpB3uL8ZOkAh1+TndpJ8ONoCBWiZk= google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a h1:SGktgSolFCo75dnHJF2yMvnns6jCmHFJ0vE4Vn2JKvQ= google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a/go.mod h1:a77HrdMjoeKbnd2jmgcWdaS++ZLZAEq3orIOAEIKiVw= google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a h1:v2PbRU4K3llS09c7zodFpNePeamkAwG3mPrAery9VeE= google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.72.2 h1:TdbGzwb82ty4OusHWepvFWGLgIbNo1/SUynEN0ssqv8= google.golang.org/grpc v1.72.2/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -412,8 +913,8 @@ k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= -k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= -k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0= +k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/controller-runtime v0.21.0 h1:CYfjpEuicjUecRk+KAeyYh+ouUBn4llGyDYytIGcJS8= sigs.k8s.io/controller-runtime v0.21.0/go.mod h1:OSg14+F65eWqIu4DceX7k/+QRAbTTvxeQSNSOQpukWM= sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= diff --git a/internal/operator/builder.go b/internal/operator/builder.go index e80a88ee2c..8e24798a98 100644 --- a/internal/operator/builder.go +++ b/internal/operator/builder.go @@ -89,6 +89,7 @@ type Builder struct { deletionProtection bool skipNameValidation bool dryRun bool + pprofBindAddress string } func (b *Builder) WithConfig(config *rest.Config) *Builder { @@ -116,6 +117,11 @@ func (b *Builder) WithMetricAddress(address string) *Builder { return b } +func (b *Builder) WithPprofBindAddress(address string) *Builder { + b.pprofBindAddress = address + return b +} + func (b *Builder) WithProbeAddress(address string) *Builder { b.probeAddress = address return b @@ -269,6 +275,7 @@ func (b *Builder) Build(ctx context.Context) (cluster.Cluster, error) { HealthProbeBindAddress: b.probeAddress, LeaderElection: b.leaderElection, LeaderElectionID: b.leaderElectionID, + PprofBindAddress: b.pprofBindAddress, }, ) diff --git a/licenses.csv b/licenses.csv index b7df06cb60..eebbdf0165 100644 --- a/licenses.csv +++ b/licenses.csv @@ -7,6 +7,7 @@ cloud.google.com/go/compute/metadata,https://github.com/googleapis/google-cloud- cloud.google.com/go/iam,https://github.com/googleapis/google-cloud-go/blob/iam/v1.5.2/iam/LICENSE,Apache-2.0 cloud.google.com/go/kms,https://github.com/googleapis/google-cloud-go/blob/kms/v1.22.0/kms/LICENSE,Apache-2.0 cloud.google.com/go/longrunning,https://github.com/googleapis/google-cloud-go/blob/longrunning/v0.6.7/longrunning/LICENSE,Apache-2.0 +dario.cat/mergo,https://github.com/imdario/mergo/blob/v1.0.1/LICENSE,BSD-3-Clause github.com/Azure/azure-sdk-for-go,https://github.com/Azure/azure-sdk-for-go/blob/v68.0.0/LICENSE.txt,MIT github.com/Azure/azure-sdk-for-go/sdk/azcore,https://github.com/Azure/azure-sdk-for-go/blob/sdk/azcore/v1.18.0/sdk/azcore/LICENSE.txt,MIT github.com/Azure/azure-sdk-for-go/sdk/azidentity,https://github.com/Azure/azure-sdk-for-go/blob/sdk/azidentity/v1.10.0/sdk/azidentity/LICENSE.txt,MIT @@ -14,7 +15,7 @@ github.com/Azure/azure-sdk-for-go/sdk/internal,https://github.com/Azure/azure-sd github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/keyvault/armkeyvault,https://github.com/Azure/azure-sdk-for-go/blob/sdk/resourcemanager/keyvault/armkeyvault/v1.5.0/sdk/resourcemanager/keyvault/armkeyvault/LICENSE.txt,MIT github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2,https://github.com/Azure/azure-sdk-for-go/blob/sdk/resourcemanager/network/armnetwork/v2.2.1/sdk/resourcemanager/network/armnetwork/LICENSE.txt,MIT github.com/Azure/go-autorest/autorest,https://github.com/Azure/go-autorest/blob/autorest/v0.11.30/autorest/LICENSE,Apache-2.0 -github.com/Azure/go-autorest/autorest/adal,https://github.com/Azure/go-autorest/blob/autorest/adal/v0.9.22/autorest/adal/LICENSE,Apache-2.0 +github.com/Azure/go-autorest/autorest/adal,https://github.com/Azure/go-autorest/blob/autorest/adal/v0.9.24/autorest/adal/LICENSE,Apache-2.0 github.com/Azure/go-autorest/autorest/azure/auth,https://github.com/Azure/go-autorest/blob/autorest/azure/auth/v0.5.13/autorest/azure/auth/LICENSE,Apache-2.0 github.com/Azure/go-autorest/autorest/azure/cli,https://github.com/Azure/go-autorest/blob/autorest/azure/cli/v0.4.6/autorest/azure/cli/LICENSE,Apache-2.0 github.com/Azure/go-autorest/autorest/date,https://github.com/Azure/go-autorest/blob/autorest/date/v0.3.0/autorest/date/LICENSE,Apache-2.0 @@ -23,31 +24,60 @@ github.com/Azure/go-autorest/autorest/validation,https://github.com/Azure/go-aut github.com/Azure/go-autorest/logger,https://github.com/Azure/go-autorest/blob/logger/v0.2.1/logger/LICENSE,Apache-2.0 github.com/Azure/go-autorest/tracing,https://github.com/Azure/go-autorest/blob/tracing/v0.6.0/tracing/LICENSE,Apache-2.0 github.com/AzureAD/microsoft-authentication-library-for-go/apps,https://github.com/AzureAD/microsoft-authentication-library-for-go/blob/v1.4.2/LICENSE,MIT +github.com/Masterminds/goutils,https://github.com/Masterminds/goutils/blob/v1.1.1/LICENSE.txt,Apache-2.0 github.com/Masterminds/semver,https://github.com/Masterminds/semver/blob/v1.5.0/LICENSE.txt,MIT +github.com/Masterminds/semver/v3,https://github.com/Masterminds/semver/blob/v3.3.1/LICENSE.txt,MIT +github.com/Masterminds/sprig/v3,https://github.com/Masterminds/sprig/blob/v3.3.0/LICENSE.txt,MIT +github.com/alecthomas/units,https://github.com/alecthomas/units/blob/0f3dac36c52b/COPYING,MIT github.com/antlr4-go/antlr/v4,https://github.com/antlr4-go/antlr/blob/v4.13.0/LICENSE,BSD-3-Clause +github.com/armon/go-metrics,https://github.com/armon/go-metrics/blob/v0.4.1/LICENSE,MIT +github.com/asaskevich/govalidator,https://github.com/asaskevich/govalidator/blob/a9d515a09cc2/LICENSE,MIT github.com/aws/aws-sdk-go,https://github.com/aws/aws-sdk-go/blob/v1.55.7/LICENSE.txt,Apache-2.0 github.com/aws/aws-sdk-go/internal/sync/singleflight,https://github.com/aws/aws-sdk-go/blob/v1.55.7/internal/sync/singleflight/LICENSE,BSD-3-Clause +github.com/bboreham/go-loser,https://github.com/bboreham/go-loser/blob/fcc2c21820a3/LICENSE,Apache-2.0 github.com/beorn7/perks/quantile,https://github.com/beorn7/perks/blob/v1.0.1/LICENSE,MIT github.com/blang/semver/v4,https://github.com/blang/semver/blob/v4.0.0/v4/LICENSE,MIT +github.com/c2h5oh/datasize,https://github.com/c2h5oh/datasize/blob/aa82cc1e6500/LICENSE,MIT github.com/cespare/xxhash/v2,https://github.com/cespare/xxhash/blob/v2.3.0/LICENSE.txt,MIT +github.com/coreos/go-semver/semver,https://github.com/coreos/go-semver/blob/v0.3.1/LICENSE,Apache-2.0 +github.com/coreos/go-systemd/v22,https://github.com/coreos/go-systemd/blob/v22.5.0/LICENSE,Apache-2.0 github.com/davecgh/go-spew/spew,https://github.com/davecgh/go-spew/blob/d8f796af33cc/LICENSE,ISC +github.com/dennwc/varint,https://github.com/dennwc/varint/blob/v1.0.0/LICENSE,MIT +github.com/dgryski/go-rendezvous,https://github.com/dgryski/go-rendezvous/blob/9f7001d12a5f/LICENSE,MIT github.com/dimchansky/utfbom,https://github.com/dimchansky/utfbom/blob/v1.1.1/LICENSE,Apache-2.0 +github.com/dustin/go-humanize,https://github.com/dustin/go-humanize/blob/v1.0.1/LICENSE,MIT +github.com/edsrzf/mmap-go,https://github.com/edsrzf/mmap-go/blob/v1.2.0/LICENSE,BSD-3-Clause github.com/emicklei/go-restful/v3,https://github.com/emicklei/go-restful/blob/v3.11.0/LICENSE,MIT github.com/evanphx/json-patch/v5,https://github.com/evanphx/json-patch/blob/v5.9.11/v5/LICENSE,BSD-3-Clause +github.com/facette/natsort,https://github.com/facette/natsort/blob/2cd4dd1e2dcb/LICENSE,BSD-3-Clause +github.com/fatih/color,https://github.com/fatih/color/blob/v1.18.0/LICENSE.md,MIT github.com/felixge/httpsnoop,https://github.com/felixge/httpsnoop/blob/v1.0.4/LICENSE.txt,MIT -github.com/fsnotify/fsnotify,https://github.com/fsnotify/fsnotify/blob/v1.7.0/LICENSE,BSD-3-Clause +github.com/fsnotify/fsnotify,https://github.com/fsnotify/fsnotify/blob/v1.8.0/LICENSE,BSD-3-Clause github.com/fxamacker/cbor/v2,https://github.com/fxamacker/cbor/blob/v2.7.0/LICENSE,MIT +github.com/go-kit/kit/log,https://github.com/go-kit/kit/blob/v0.12.0/LICENSE,MIT +github.com/go-kit/log,https://github.com/go-kit/log/blob/v0.2.1/LICENSE,MIT +github.com/go-logfmt/logfmt,https://github.com/go-logfmt/logfmt/blob/v0.6.0/LICENSE,MIT github.com/go-logr/logr,https://github.com/go-logr/logr/blob/v1.4.3/LICENSE,Apache-2.0 github.com/go-logr/stdr,https://github.com/go-logr/stdr/blob/v1.2.2/LICENSE,Apache-2.0 github.com/go-logr/zapr,https://github.com/go-logr/zapr/blob/v1.3.0/LICENSE,Apache-2.0 +github.com/go-openapi/analysis,https://github.com/go-openapi/analysis/blob/v0.23.0/LICENSE,Apache-2.0 +github.com/go-openapi/errors,https://github.com/go-openapi/errors/blob/v0.22.0/LICENSE,Apache-2.0 github.com/go-openapi/jsonpointer,https://github.com/go-openapi/jsonpointer/blob/v0.21.0/LICENSE,Apache-2.0 -github.com/go-openapi/jsonreference,https://github.com/go-openapi/jsonreference/blob/v0.20.2/LICENSE,Apache-2.0 +github.com/go-openapi/jsonreference,https://github.com/go-openapi/jsonreference/blob/v0.21.0/LICENSE,Apache-2.0 +github.com/go-openapi/loads,https://github.com/go-openapi/loads/blob/v0.22.0/LICENSE,Apache-2.0 +github.com/go-openapi/spec,https://github.com/go-openapi/spec/blob/v0.21.0/LICENSE,Apache-2.0 +github.com/go-openapi/strfmt,https://github.com/go-openapi/strfmt/blob/v0.23.0/LICENSE,Apache-2.0 github.com/go-openapi/swag,https://github.com/go-openapi/swag/blob/v0.23.0/LICENSE,Apache-2.0 +github.com/go-openapi/validate,https://github.com/go-openapi/validate/blob/v0.24.0/LICENSE,Apache-2.0 +github.com/go-redsync/redsync/v4,https://github.com/go-redsync/redsync/blob/v4.13.0/LICENSE,BSD-3-Clause github.com/go-test/deep,https://github.com/go-test/deep/blob/v1.1.1/LICENSE,MIT +github.com/gogo/googleapis/google/rpc,https://github.com/gogo/googleapis/blob/v1.4.1/LICENSE,Apache-2.0 github.com/gogo/protobuf,https://github.com/gogo/protobuf/blob/v1.3.2/LICENSE,BSD-3-Clause +github.com/gogo/status,https://github.com/gogo/status/blob/v1.1.1/LICENSE,Apache-2.0 github.com/golang-jwt/jwt/v4,https://github.com/golang-jwt/jwt/blob/v4.5.2/LICENSE,MIT github.com/golang-jwt/jwt/v5,https://github.com/golang-jwt/jwt/blob/v5.2.2/LICENSE,MIT -github.com/golang/snappy,https://github.com/golang/snappy/blob/v0.0.4/LICENSE,BSD-3-Clause +github.com/golang/protobuf,https://github.com/golang/protobuf/blob/v1.5.4/LICENSE,BSD-3-Clause +github.com/golang/snappy,https://github.com/golang/snappy/blob/v1.0.0/LICENSE,BSD-3-Clause github.com/google/btree,https://github.com/google/btree/blob/v1.1.3/LICENSE,Apache-2.0 github.com/google/cel-go,https://github.com/google/cel-go/blob/v0.23.2/LICENSE,Apache-2.0 github.com/google/gnostic-models,https://github.com/google/gnostic-models/blob/v0.6.9/LICENSE,Apache-2.0 @@ -58,58 +88,130 @@ github.com/google/s2a-go,https://github.com/google/s2a-go/blob/v0.1.9/LICENSE.md github.com/google/uuid,https://github.com/google/uuid/blob/v1.6.0/LICENSE,BSD-3-Clause github.com/googleapis/enterprise-certificate-proxy/client,https://github.com/googleapis/enterprise-certificate-proxy/blob/v0.3.6/LICENSE,Apache-2.0 github.com/googleapis/gax-go/v2,https://github.com/googleapis/gax-go/blob/v2.14.2/v2/LICENSE,BSD-3-Clause +github.com/gorilla/mux,https://github.com/gorilla/mux/blob/v1.8.1/LICENSE,BSD-3-Clause +github.com/grafana/dskit,https://github.com/grafana/dskit/blob/9cdd36a91f10/LICENSE,Apache-2.0 +github.com/grafana/gomemcache/memcache,https://github.com/grafana/gomemcache/blob/da7b95fd2ac1/LICENSE,Apache-2.0 +github.com/grafana/jsonparser,https://github.com/grafana/jsonparser/blob/023329977675/LICENSE,MIT +github.com/grafana/loki/pkg/push,https://github.com/grafana/loki/blob/758364c7775f/pkg/push/LICENSE,Apache-2.0 +github.com/grafana/loki/v3/clients/pkg/promtail,https://github.com/grafana/loki/blob/v3.5.1/clients/LICENSE_APACHE2,Apache-2.0 +github.com/grafana/loki/v3/pkg,https://github.com/grafana/loki/blob/v3.5.1/LICENSE,AGPL-3.0 +github.com/grafana/loki/v3/pkg/ingester/wal,https://github.com/grafana/loki/blob/v3.5.1/pkg/ingester/wal/LICENSE_APACHE2,Apache-2.0 +github.com/grafana/loki/v3/pkg/logproto,https://github.com/grafana/loki/blob/v3.5.1/pkg/logproto/LICENSE_APACHE2,Apache-2.0 +github.com/grafana/loki/v3/pkg/logqlmodel,https://github.com/grafana/loki/blob/v3.5.1/pkg/logqlmodel/LICENSE_APACHE2,Apache-2.0 +github.com/grafana/loki/v3/pkg/util,https://github.com/grafana/loki/blob/v3.5.1/pkg/util/LICENSE_APACHE2,Apache-2.0 +github.com/grafana/pyroscope-go/godeltaprof,https://github.com/grafana/pyroscope-go/blob/godeltaprof/v0.1.8/godeltaprof/LICENSE,Apache-2.0 +github.com/grafana/regexp,https://github.com/grafana/regexp/blob/a468a5bfb3bc/LICENSE,BSD-3-Clause +github.com/hashicorp/consul/api,https://github.com/hashicorp/consul/blob/api/v1.31.2/api/LICENSE,MPL-2.0 +github.com/hashicorp/errwrap,https://github.com/hashicorp/errwrap/blob/v1.1.0/LICENSE,MPL-2.0 +github.com/hashicorp/go-cleanhttp,https://github.com/hashicorp/go-cleanhttp/blob/v0.5.2/LICENSE,MPL-2.0 +github.com/hashicorp/go-hclog,https://github.com/hashicorp/go-hclog/blob/v1.6.3/LICENSE,MIT +github.com/hashicorp/go-immutable-radix,https://github.com/hashicorp/go-immutable-radix/blob/v1.3.1/LICENSE,MPL-2.0 +github.com/hashicorp/go-metrics/compat,https://github.com/hashicorp/go-metrics/blob/v0.5.4/LICENSE,MIT +github.com/hashicorp/go-msgpack/v2/codec,https://github.com/hashicorp/go-msgpack/blob/v2.1.1/LICENSE,MIT +github.com/hashicorp/go-multierror,https://github.com/hashicorp/go-multierror/blob/v1.1.1/LICENSE,MPL-2.0 +github.com/hashicorp/go-rootcerts,https://github.com/hashicorp/go-rootcerts/blob/v1.0.2/LICENSE,MPL-2.0 +github.com/hashicorp/go-sockaddr,https://github.com/hashicorp/go-sockaddr/blob/v1.0.7/LICENSE,MPL-2.0 +github.com/hashicorp/golang-lru/simplelru,https://github.com/hashicorp/golang-lru/blob/v1.0.2/LICENSE,MPL-2.0 +github.com/hashicorp/memberlist,https://github.com/hashicorp/memberlist/blob/v0.5.3/LICENSE,MPL-2.0 +github.com/hashicorp/serf/coordinate,https://github.com/hashicorp/serf/blob/v0.10.1/LICENSE,MPL-2.0 +github.com/huandu/xstrings,https://github.com/huandu/xstrings/blob/v1.5.0/LICENSE,MIT github.com/jmespath/go-jmespath,https://github.com/jmespath/go-jmespath/blob/v0.4.0/LICENSE,Apache-2.0 github.com/josharian/intern,https://github.com/josharian/intern/blob/v1.0.0/license.md,MIT +github.com/jpillora/backoff,https://github.com/jpillora/backoff/blob/v1.0.0/LICENSE,MIT github.com/json-iterator/go,https://github.com/json-iterator/go/blob/v1.1.12/LICENSE,MIT +github.com/julienschmidt/httprouter,https://github.com/julienschmidt/httprouter/blob/v1.3.0/LICENSE,BSD-3-Clause github.com/klauspost/compress,https://github.com/klauspost/compress/blob/v1.18.0/LICENSE,Apache-2.0 github.com/klauspost/compress/internal/snapref,https://github.com/klauspost/compress/blob/v1.18.0/internal/snapref/LICENSE,BSD-3-Clause github.com/klauspost/compress/zstd/internal/xxhash,https://github.com/klauspost/compress/blob/v1.18.0/zstd/internal/xxhash/LICENSE.txt,MIT github.com/kylelemons/godebug,https://github.com/kylelemons/godebug/blob/v1.1.0/LICENSE,Apache-2.0 -github.com/mailru/easyjson,https://github.com/mailru/easyjson/blob/v0.7.7/LICENSE,MIT +github.com/mailru/easyjson,https://github.com/mailru/easyjson/blob/v0.9.0/LICENSE,MIT +github.com/mattn/go-colorable,https://github.com/mattn/go-colorable/blob/v0.1.14/LICENSE,MIT +github.com/mattn/go-isatty,https://github.com/mattn/go-isatty/blob/v0.0.20/LICENSE,MIT +github.com/mdlayher/vsock,https://github.com/mdlayher/vsock/blob/v1.2.1/LICENSE.md,MIT +github.com/miekg/dns,https://github.com/miekg/dns/blob/v1.1.63/LICENSE,BSD-3-Clause +github.com/mitchellh/copystructure,https://github.com/mitchellh/copystructure/blob/v1.2.0/LICENSE,MIT github.com/mitchellh/go-homedir,https://github.com/mitchellh/go-homedir/blob/v1.1.0/LICENSE,MIT +github.com/mitchellh/mapstructure,https://github.com/mitchellh/mapstructure/blob/bf980b35cac4/LICENSE,MIT +github.com/mitchellh/reflectwalk,https://github.com/mitchellh/reflectwalk/blob/v1.0.2/LICENSE,MIT github.com/modern-go/concurrent,https://github.com/modern-go/concurrent/blob/bacd9c7ef1dd/LICENSE,Apache-2.0 github.com/modern-go/reflect2,https://github.com/modern-go/reflect2/blob/v1.0.2/LICENSE,Apache-2.0 github.com/mongodb-forks/digest,https://github.com/mongodb-forks/digest/blob/v1.1.0/COPYING,Apache-2.0 github.com/mongodb/mongodb-atlas-kubernetes/v2,https://github.com/mongodb/mongodb-atlas-kubernetes/blob/HEAD/LICENSE,Apache-2.0 github.com/montanaflynn/stats,https://github.com/montanaflynn/stats/blob/v0.7.1/LICENSE,MIT github.com/munnerz/goautoneg,https://github.com/munnerz/goautoneg/blob/a7dc8b61c822/LICENSE,BSD-3-Clause +github.com/mwitkow/go-conntrack,https://github.com/mwitkow/go-conntrack/blob/2f068394615f/LICENSE,Apache-2.0 github.com/nsf/jsondiff,https://github.com/nsf/jsondiff/blob/43f6cf3098c1/LICENSE,MIT +github.com/oklog/ulid,https://github.com/oklog/ulid/blob/v1.3.1/LICENSE,Apache-2.0 github.com/onsi/ginkgo/v2,https://github.com/onsi/ginkgo/blob/v2.23.4/LICENSE,MIT github.com/onsi/gomega,https://github.com/onsi/gomega/blob/v1.37.0/LICENSE,MIT +github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics,https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/internal/exp/metrics/v0.116.0/internal/exp/metrics/LICENSE,Apache-2.0 +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil,https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/pkg/pdatautil/v0.116.0/pkg/pdatautil/LICENSE,Apache-2.0 +github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor,https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/processor/deltatocumulativeprocessor/v0.116.0/processor/deltatocumulativeprocessor/LICENSE,Apache-2.0 +github.com/opentracing-contrib/go-grpc,https://github.com/opentracing-contrib/go-grpc/blob/v0.1.1/LICENSE,Apache-2.0 +github.com/opentracing-contrib/go-stdlib/nethttp,https://github.com/opentracing-contrib/go-stdlib/blob/v1.1.0/LICENSE,Apache-2.0 +github.com/opentracing/opentracing-go,https://github.com/opentracing/opentracing-go/blob/10b1cf09e00b/LICENSE,Apache-2.0 +github.com/pires/go-proxyproto,https://github.com/pires/go-proxyproto/blob/v0.7.0/LICENSE,Apache-2.0 github.com/pkg/browser,https://github.com/pkg/browser/blob/5ac0b6a4141c/LICENSE,BSD-2-Clause github.com/pkg/errors,https://github.com/pkg/errors/blob/v0.9.1/LICENSE,BSD-2-Clause github.com/pmezard/go-difflib/difflib,https://github.com/pmezard/go-difflib/blob/5d4384ee4fb2/LICENSE,BSD-3-Clause +github.com/prometheus/alertmanager/api/v2/models,https://github.com/prometheus/alertmanager/blob/v0.28.1/LICENSE,Apache-2.0 github.com/prometheus/client_golang/internal/github.com/golang/gddo/httputil,https://github.com/prometheus/client_golang/blob/v1.22.0/internal/github.com/golang/gddo/LICENSE,BSD-3-Clause github.com/prometheus/client_golang/prometheus,https://github.com/prometheus/client_golang/blob/v1.22.0/LICENSE,Apache-2.0 github.com/prometheus/client_model/go,https://github.com/prometheus/client_model/blob/v0.6.1/LICENSE,Apache-2.0 github.com/prometheus/common,https://github.com/prometheus/common/blob/v0.62.0/LICENSE,Apache-2.0 +github.com/prometheus/exporter-toolkit/web,https://github.com/prometheus/exporter-toolkit/blob/v0.13.2/LICENSE,Apache-2.0 github.com/prometheus/procfs,https://github.com/prometheus/procfs/blob/v0.15.1/LICENSE,Apache-2.0 +github.com/prometheus/prometheus,https://github.com/prometheus/prometheus/blob/v0.302.1/LICENSE,Apache-2.0 +github.com/prometheus/sigv4,https://github.com/prometheus/sigv4/blob/v0.1.2/LICENSE,Apache-2.0 +github.com/redis/go-redis/v9,https://github.com/redis/go-redis/blob/v9.8.0/LICENSE,BSD-2-Clause +github.com/sean-/seed,https://github.com/sean-/seed/blob/e2103e2c3529/LICENSE,MIT +github.com/sercand/kuberesolver/v5,https://github.com/sercand/kuberesolver/blob/v5.1.1/LICENSE,Apache-2.0 github.com/sethvargo/go-password/password,https://github.com/sethvargo/go-password/blob/v0.3.1/LICENSE,MIT +github.com/shopspring/decimal,https://github.com/shopspring/decimal/blob/v1.4.0/LICENSE,MIT +github.com/sony/gobreaker/v2,https://github.com/sony/gobreaker/blob/v2.1.0/v2/LICENSE,MIT +github.com/spf13/cast,https://github.com/spf13/cast/blob/v1.7.1/LICENSE,MIT github.com/spf13/cobra,https://github.com/spf13/cobra/blob/v1.8.1/LICENSE.txt,Apache-2.0 -github.com/spf13/pflag,https://github.com/spf13/pflag/blob/v1.0.5/LICENSE,BSD-3-Clause +github.com/spf13/pflag,https://github.com/spf13/pflag/blob/v1.0.6/LICENSE,BSD-3-Clause github.com/stoewer/go-strcase,https://github.com/stoewer/go-strcase/blob/v1.3.0/LICENSE,MIT github.com/stretchr/objx,https://github.com/stretchr/objx/blob/v0.5.2/LICENSE,MIT github.com/stretchr/testify,https://github.com/stretchr/testify/blob/v1.10.0/LICENSE,MIT +github.com/tjhop/slog-gokit,https://github.com/tjhop/slog-gokit/blob/v0.1.4/LICENSE,Apache-2.0 +github.com/uber/jaeger-client-go,https://github.com/uber/jaeger-client-go/blob/v2.30.0/LICENSE,Apache-2.0 +github.com/uber/jaeger-lib/metrics,https://github.com/uber/jaeger-lib/blob/v2.4.1/LICENSE,Apache-2.0 github.com/x448/float16,https://github.com/x448/float16/blob/v0.8.4/LICENSE,MIT github.com/xdg-go/pbkdf2,https://github.com/xdg-go/pbkdf2/blob/v1.0.0/LICENSE,Apache-2.0 github.com/xdg-go/scram,https://github.com/xdg-go/scram/blob/v1.1.2/LICENSE,Apache-2.0 github.com/xdg-go/stringprep,https://github.com/xdg-go/stringprep/blob/v1.0.4/LICENSE,Apache-2.0 github.com/youmark/pkcs8,https://github.com/youmark/pkcs8/blob/a2c0da244d78/LICENSE,MIT +go.etcd.io/etcd/api/v3,https://github.com/etcd-io/etcd/blob/api/v3.5.21/api/LICENSE,Apache-2.0 +go.etcd.io/etcd/client/pkg/v3,https://github.com/etcd-io/etcd/blob/client/pkg/v3.5.21/client/pkg/LICENSE,Apache-2.0 +go.etcd.io/etcd/client/v3,https://github.com/etcd-io/etcd/blob/client/v3.5.21/client/v3/LICENSE,Apache-2.0 go.mongodb.org/atlas-sdk/v20231115004,https://github.com/mongodb/atlas-sdk-go/blob/v20231115004.1.0/LICENSE,Apache-2.0 go.mongodb.org/atlas-sdk/v20231115008,https://github.com/mongodb/atlas-sdk-go/blob/v20231115008.5.0/LICENSE,Apache-2.0 go.mongodb.org/atlas-sdk/v20241113001,https://github.com/mongodb/atlas-sdk-go/blob/v20241113001.0.0/LICENSE,Apache-2.0 go.mongodb.org/atlas/mongodbatlas,https://github.com/mongodb/go-client-mongodb-atlas/blob/v0.38.0/LICENSE,Apache-2.0 go.mongodb.org/mongo-driver,https://github.com/mongodb/mongo-go-driver/blob/v1.17.3/LICENSE,Apache-2.0 go.opentelemetry.io/auto/sdk,https://github.com/open-telemetry/opentelemetry-go-instrumentation/blob/sdk/v1.1.0/sdk/LICENSE,Apache-2.0 +go.opentelemetry.io/collector/component,https://github.com/open-telemetry/opentelemetry-collector/blob/component/v0.118.0/component/LICENSE,Apache-2.0 +go.opentelemetry.io/collector/config/configtelemetry,https://github.com/open-telemetry/opentelemetry-collector/blob/config/configtelemetry/v0.118.0/config/configtelemetry/LICENSE,Apache-2.0 +go.opentelemetry.io/collector/consumer,https://github.com/open-telemetry/opentelemetry-collector/blob/consumer/v1.24.0/consumer/LICENSE,Apache-2.0 +go.opentelemetry.io/collector/pdata,https://github.com/open-telemetry/opentelemetry-collector/blob/pdata/v1.28.1/pdata/LICENSE,Apache-2.0 +go.opentelemetry.io/collector/pipeline,https://github.com/open-telemetry/opentelemetry-collector/blob/pipeline/v0.118.0/pipeline/LICENSE,Apache-2.0 +go.opentelemetry.io/collector/processor,https://github.com/open-telemetry/opentelemetry-collector/blob/processor/v0.118.0/processor/LICENSE,Apache-2.0 +go.opentelemetry.io/collector/semconv/v1.6.1,https://github.com/open-telemetry/opentelemetry-collector/blob/semconv/v0.118.0/semconv/LICENSE,Apache-2.0 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc,https://github.com/open-telemetry/opentelemetry-go-contrib/blob/instrumentation/google.golang.org/grpc/otelgrpc/v0.60.0/instrumentation/google.golang.org/grpc/otelgrpc/LICENSE,Apache-2.0 +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace,https://github.com/open-telemetry/opentelemetry-go-contrib/blob/instrumentation/net/http/httptrace/otelhttptrace/v0.59.0/instrumentation/net/http/httptrace/otelhttptrace/LICENSE,Apache-2.0 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp,https://github.com/open-telemetry/opentelemetry-go-contrib/blob/instrumentation/net/http/otelhttp/v0.60.0/instrumentation/net/http/otelhttp/LICENSE,Apache-2.0 go.opentelemetry.io/otel,https://github.com/open-telemetry/opentelemetry-go/blob/v1.35.0/LICENSE,Apache-2.0 go.opentelemetry.io/otel/metric,https://github.com/open-telemetry/opentelemetry-go/blob/metric/v1.35.0/metric/LICENSE,Apache-2.0 go.opentelemetry.io/otel/trace,https://github.com/open-telemetry/opentelemetry-go/blob/trace/v1.35.0/trace/LICENSE,Apache-2.0 +go.uber.org/atomic,https://github.com/uber-go/atomic/blob/v1.11.0/LICENSE.txt,MIT +go.uber.org/goleak,https://github.com/uber-go/goleak/blob/v1.3.0/LICENSE,MIT go.uber.org/multierr,https://github.com/uber-go/multierr/blob/v1.11.0/LICENSE.txt,MIT go.uber.org/zap,https://github.com/uber-go/zap/blob/v1.27.0/LICENSE,MIT +go4.org/netipx,https://github.com/go4org/netipx/blob/8449b0a6169f/LICENSE,BSD-3-Clause golang.org/x/crypto,https://cs.opensource.google/go/x/crypto/+/v0.38.0:LICENSE,BSD-3-Clause -golang.org/x/exp,https://cs.opensource.google/go/x/exp/+/8a7402ab:LICENSE,BSD-3-Clause +golang.org/x/exp,https://cs.opensource.google/go/x/exp/+/7588d65b:LICENSE,BSD-3-Clause golang.org/x/net,https://cs.opensource.google/go/x/net/+/v0.40.0:LICENSE,BSD-3-Clause golang.org/x/oauth2,https://cs.opensource.google/go/x/oauth2/+/v0.30.0:LICENSE,BSD-3-Clause golang.org/x/sync,https://cs.opensource.google/go/x/sync/+/v0.14.0:LICENSE,BSD-3-Clause @@ -143,8 +245,8 @@ k8s.io/kube-openapi/pkg/internal/third_party/govalidator,https://github.com/kube k8s.io/kube-openapi/pkg/validation/errors,https://github.com/kubernetes/kube-openapi/blob/c8a335a9a2ff/pkg/validation/errors/LICENSE,Apache-2.0 k8s.io/kube-openapi/pkg/validation/spec,https://github.com/kubernetes/kube-openapi/blob/c8a335a9a2ff/pkg/validation/spec/LICENSE,Apache-2.0 k8s.io/kube-openapi/pkg/validation/strfmt,https://github.com/kubernetes/kube-openapi/blob/c8a335a9a2ff/pkg/validation/strfmt/LICENSE,Apache-2.0 -k8s.io/utils,https://github.com/kubernetes/utils/blob/3ea5e8cea738/LICENSE,Apache-2.0 -k8s.io/utils/internal/third_party/forked/golang,https://github.com/kubernetes/utils/blob/3ea5e8cea738/internal/third_party/forked/golang/LICENSE,BSD-3-Clause +k8s.io/utils,https://github.com/kubernetes/utils/blob/24370beab758/LICENSE,Apache-2.0 +k8s.io/utils/internal/third_party/forked/golang,https://github.com/kubernetes/utils/blob/24370beab758/internal/third_party/forked/golang/LICENSE,BSD-3-Clause sigs.k8s.io/controller-runtime,https://github.com/kubernetes-sigs/controller-runtime/blob/v0.21.0/LICENSE,Apache-2.0 sigs.k8s.io/json,https://github.com/kubernetes-sigs/json/blob/9aa6b5e7a4b3/LICENSE,Apache-2.0 sigs.k8s.io/randfill,https://github.com/kubernetes-sigs/randfill/blob/v1.0.0/LICENSE,Apache-2.0 diff --git a/test/e2e/e2e_suite_test.go b/test/e2e/e2e_suite_test.go index fe63e01ac0..b4f08c8b7e 100644 --- a/test/e2e/e2e_suite_test.go +++ b/test/e2e/e2e_suite_test.go @@ -27,6 +27,7 @@ import ( "github.com/mongodb/mongodb-atlas-kubernetes/v2/test/helper/e2e/api/atlas" "github.com/mongodb/mongodb-atlas-kubernetes/v2/test/helper/e2e/config" "github.com/mongodb/mongodb-atlas-kubernetes/v2/test/helper/e2e/utils" + akoginkgo "github.com/mongodb/mongodb-atlas-kubernetes/v2/test/helper/observability/ginkgo" ) const ( @@ -42,6 +43,7 @@ var ( func TestE2e(t *testing.T) { control.SkipTestUnless(t, "AKO_E2E_TEST") + akoginkgo.RegisterCallbacks() RegisterFailHandler(Fail) RunSpecs(t, "Atlas Operator E2E Test Suite") } diff --git a/test/helper/e2e/k8s/operator.go b/test/helper/e2e/k8s/operator.go index a40f10f48d..750e2b7dd9 100644 --- a/test/helper/e2e/k8s/operator.go +++ b/test/helper/e2e/k8s/operator.go @@ -24,7 +24,6 @@ import ( . "github.com/onsi/ginkgo/v2" "go.uber.org/zap" "go.uber.org/zap/zapcore" - "go.uber.org/zap/zaptest" "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/client-go/kubernetes/scheme" @@ -32,6 +31,7 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/cluster" + ctrlruntimezap "sigs.k8s.io/controller-runtime/pkg/log/zap" akov2 "github.com/mongodb/mongodb-atlas-kubernetes/v2/api/v1" "github.com/mongodb/mongodb-atlas-kubernetes/v2/internal/collection" @@ -49,15 +49,21 @@ func BuildCluster(initCfg *Config) (cluster.Cluster, error) { utilruntime.Must(scheme.AddToScheme(akoScheme)) utilruntime.Must(akov2.AddToScheme(akoScheme)) - config := mergeConfiguration(initCfg) - logger := zaptest.NewLogger( - GinkgoT(), - zaptest.WrapOptions( - zap.ErrorOutput(zapcore.Lock(zapcore.AddSync(GinkgoWriter))), - ), + rawLogger := ctrlruntimezap.NewRaw( + ctrlruntimezap.WriteTo(GinkgoWriter), + func(options *ctrlruntimezap.Options) { + options.TimeEncoder = func(t time.Time, e zapcore.PrimitiveArrayEncoder) { + zapcore.TimeEncoderOfLayout(time.RFC3339)(t.UTC(), e) + } + }, ) - ctrl.SetLogger(zapr.NewLogger(logger)) - setupLog := logger.Named("setup").Sugar() + + logrLogger := zapr.NewLogger(rawLogger) + ctrl.SetLogger(logrLogger.WithName("ctrl")) + ctrl.SetLogger(logrLogger.WithName("klog")) + setupLog := rawLogger.Named("setup").Sugar() + + config := mergeConfiguration(initCfg) setupLog.Info("starting with configuration", zap.Any("config", *config)) // Ensure all concurrent managers configured per test share a single exit signal handler @@ -68,7 +74,7 @@ func BuildCluster(initCfg *Config) (cluster.Cluster, error) { return operator.NewBuilder(operator.ManagerProviderFunc(ctrl.NewManager), akoScheme, 5*time.Minute). WithConfig(ctrl.GetConfigOrDie()). WithNamespaces(collection.Keys(config.WatchedNamespaces)...). - WithLogger(logger). + WithLogger(rawLogger). WithMetricAddress(config.MetricsAddr). WithProbeAddress(config.ProbeAddr). WithLeaderElection(config.EnableLeaderElection). diff --git a/test/helper/observability/README.md b/test/helper/observability/README.md new file mode 100644 index 0000000000..8d9ac32ede --- /dev/null +++ b/test/helper/observability/README.md @@ -0,0 +1,90 @@ +# Developer Observability Stack + +Welcome to DOS, the Developer Observability Stack! This guide will help you set up and use the observability stack for monitoring and logging your local applications. + +### Prerequisites + +You need to have the following tools installed on your machine: +- kind +- docker +- kubectl + +### Building + +```bash +go build -o dos test/helper/observability/cmd/dos/main.go +``` + +### Installation +Run the following command to install the observability stack: +```bash +./dos install +``` + +Every executed command will be displayed in the terminal, so you can see what is happening under the hood.x +Once the installation is complete, you will see a message indicating that the observability stack has been successfully installed: +```shell +$ ./dos install +... +[kubectl -n loki rollout status --watch statefulset/loki] +Waiting for 1 pods to be ready... +partitioned roll out complete: 1 new pods have been updated... + +[kubectl -n promtail rollout status --watch deployment/promtail] +deployment "promtail" successfully rolled out + +[kubectl -n monitoring rollout status --watch deployment/kube-prometheus-kube-state-metrics] +deployment "kube-prometheus-kube-state-metrics" successfully rolled out + +[kubectl -n monitoring rollout status --watch statefulset/prometheus-kube-prometheus-kube-prome-prometheus] +statefulset rolling update complete 1 pods at revision prometheus-kube-prometheus-kube-prome-prometheus-7878868748... +``` + +**Note**: the initialisation of the loki statufulset may take a while, so please be patient. + +### Observing + +Run the following command to start observing your application: +```bash +./dos observe +``` + +Example: +```bash +./dos observe make run +``` + +**Note**: each line of the output will be prefixed with a timestamp, log level, logger name, and message unless it is already a JSON structure. + +### Loki + +1. Open http://localhost:30001/explore in your browser. +2. Use the user "admin" and password "prom-operator to log in. +3. Enter the following query to see logs from the MongoDB Atlas Operator: + +```loki +{job="ako"} | json | line_format "{{ .ts }} \033[1;37m{{ .level }}\033[0m \033[1;32m{{ .logger }}\033[0m {{ .msg }}" +``` +Or try this link directly in [Grafana (http://localhost:30001/...)](http://localhost:30001/explore?schemaVersion=1&panes=%7B%225c9%22:%7B%22datasource%22:%22loki%22,%22queries%22:%5B%7B%22refId%22:%22A%22,%22expr%22:%22%7Bjob%3D%5C%22ako%5C%22%7D%20%7C%20json%20%7C%20line_format%20%5C%22%7B%7B%20.ts%20%7D%7D%20%5C%5C033%5B1;37m%7B%7B%20.level%20%7D%7D%5C%5C033%5B0m%20%5C%5C033%5B1;32m%7B%7B%20.logger%20%7D%7D%5C%5C033%5B0m%20%7B%7B%20.msg%20%7D%7D%5C%22%22,%22queryType%22:%22range%22,%22datasource%22:%7B%22type%22:%22loki%22,%22uid%22:%22loki%22%7D,%22editorMode%22:%22code%22,%22direction%22:%22backward%22%7D%5D,%22range%22:%7B%22from%22:%22now-1h%22,%22to%22:%22now%22%7D%7D%7D&orgId=1) + +![loki.png](loki.png) + +### Prometheus + +Metrics are being scraped automatically from the docker/kind host (the developer) from the `:8080/metrics` endpoint. +Whatever is being started, this endpoint will be scraped an all metrics will have the label `job="ako"` attached. + +You can execute the following basic query to see all metrics scraped from the host: +```prometheus +{job="ako"} +``` + +Try this link directly in [Prometheus (http://localhost:30000/...)](http://localhost:30000/query?g0.expr=%7Bjob%3D%22ako%22%7D&g0.show_tree=0&g0.tab=table&g0.range_input=1h&g0.res_type=auto&g0.res_density=medium&g0.display_mode=lines&g0.show_exemplars=0) + +![prometheus.png](prometheus.png) + +or + +Try this link directly in [Grafana (http://localhost:30001/...)](http://localhost:30001/explore?schemaVersion=1&panes=%7B%226xc%22:%7B%22datasource%22:%22prometheus%22,%22queries%22:%5B%7B%22refId%22:%22A%22,%22expr%22:%22%7Bjob%3D%5C%22ako%5C%22%7D%22,%22range%22:true,%22datasource%22:%7B%22type%22:%22prometheus%22,%22uid%22:%22prometheus%22%7D,%22editorMode%22:%22code%22,%22legendFormat%22:%22__auto%22%7D%5D,%22range%22:%7B%22from%22:%22now-1h%22,%22to%22:%22now%22%7D%7D%7D&orgId=1) + +![grafana.png](grafana.png) \ No newline at end of file diff --git a/test/helper/observability/cmd/dos/main.go b/test/helper/observability/cmd/dos/main.go new file mode 100644 index 0000000000..5ab41aa86a --- /dev/null +++ b/test/helper/observability/cmd/dos/main.go @@ -0,0 +1,50 @@ +// Copyright 2025 MongoDB Inc +// +// 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 main + +import ( + "fmt" + "os" + + "github.com/mongodb/mongodb-atlas-kubernetes/v2/test/helper/observability/install" + "github.com/mongodb/mongodb-atlas-kubernetes/v2/test/helper/observability/observe" + "github.com/mongodb/mongodb-atlas-kubernetes/v2/test/helper/observability/snapshot" +) + +func main() { + if len(os.Args) < 2 { + fmt.Fprintln(os.Stderr, `available commands: "install", "teardown", "snapshot", "install-snapshot", "observe"`) + os.Exit(1) + } + + var err error + switch os.Args[1] { + case "install": + err = install.Install(os.Stdout) + case "teardown": + err = install.Teardown(os.Stdout) + case "snapshot": + err = snapshot.Snapshot(os.Stdout) + case "install-snapshot": + err = install.InstallSnapshot(os.Stdout) + case "observe": + err = observe.Observe(os.Args[2:]...) + } + + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} diff --git a/test/helper/observability/exec.go b/test/helper/observability/exec.go new file mode 100644 index 0000000000..e450c03dce --- /dev/null +++ b/test/helper/observability/exec.go @@ -0,0 +1,39 @@ +// Copyright 2025 MongoDB Inc +// +// 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 observability + +import ( + "errors" + "fmt" + "io" + "os/exec" +) + +func ExecCommand(logger io.Writer, cmdArgs ...string) error { + fmt.Fprintln(logger, cmdArgs) + //nolint:gosec + out, err := exec.Command(cmdArgs[0], cmdArgs[1:]...).Output() + fmt.Fprintln(logger, string(out)) + + var exitErr *exec.ExitError + if errors.As(err, &exitErr) { + logger.Write(exitErr.Stderr) + } + + if err != nil { + return fmt.Errorf("error executing command: %w", err) + } + return nil +} diff --git a/test/helper/observability/exec/test/gingo_test.go b/test/helper/observability/exec/test/gingo_test.go new file mode 100644 index 0000000000..e693d82d21 --- /dev/null +++ b/test/helper/observability/exec/test/gingo_test.go @@ -0,0 +1,41 @@ +// Copyright 2025 MongoDB Inc +// +// 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 test + +import ( + . "github.com/onsi/ginkgo/v2" +) + +var _ = Describe("Top-Level", func() { + Describe("Describe2", func() { + Context("Context2", func() { + It("It2.1", func() { + GinkgoWriter.Println("It2.1 GinkgoParallelProcess()", GinkgoParallelProcess()) + //time.Sleep(1 * time.Second) + GinkgoWriter.Println("It2.1 GinkgoParallelProcess()", GinkgoParallelProcess()) + }) + It("It2.2", func() { + GinkgoWriter.Println("It2.2 GinkgoParallelProcess()", GinkgoParallelProcess()) + //time.Sleep(1 * time.Second) + GinkgoWriter.Println("It2.2 GinkgoParallelProcess()", GinkgoParallelProcess()) + }) + It("It2.3", func() { + GinkgoWriter.Println("It2.3 GinkgoParallelProcess()", GinkgoParallelProcess()) + //time.Sleep(1 * time.Second) + GinkgoWriter.Println("It2.3 GinkgoParallelProcess()", GinkgoParallelProcess()) + }) + }) + }) +}) diff --git a/test/helper/observability/exec/test/some_test.go b/test/helper/observability/exec/test/some_test.go new file mode 100644 index 0000000000..943f37b3a5 --- /dev/null +++ b/test/helper/observability/exec/test/some_test.go @@ -0,0 +1,30 @@ +// Copyright 2025 MongoDB Inc +// +// 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 test + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "testing" + + akoginkgo "github.com/mongodb/mongodb-atlas-kubernetes/v2/test/helper/observability/ginkgo" +) + +func TestBooks(t *testing.T) { + akoginkgo.RegisterCallbacks() + RegisterFailHandler(Fail) + RunSpecs(t, "Books Suite") +} diff --git a/test/helper/observability/ginkgo/callbacks.go b/test/helper/observability/ginkgo/callbacks.go new file mode 100644 index 0000000000..fbeafabe35 --- /dev/null +++ b/test/helper/observability/ginkgo/callbacks.go @@ -0,0 +1,24 @@ +// Copyright 2025 MongoDB Inc +// +// 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 ginkgo + +import ( + "github.com/onsi/ginkgo/v2" +) + +func RegisterCallbacks() { + ginkgo.ReportAfterSuite("Ginkgo Metrics", UpdateMetricsAfterSuite) + ginkgo.ReportAfterSuite("Duration Reporter", ReportDuration) +} diff --git a/test/helper/observability/ginkgo/duration.go b/test/helper/observability/ginkgo/duration.go new file mode 100644 index 0000000000..104bdc640e --- /dev/null +++ b/test/helper/observability/ginkgo/duration.go @@ -0,0 +1,81 @@ +// Copyright 2025 MongoDB Inc +// +// 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 ginkgo + +import ( + "encoding/json" + "fmt" + "net/url" + "os" + "os/exec" + "path/filepath" + "strings" + "time" + + "github.com/onsi/ginkgo/v2" + ginkgotypes "github.com/onsi/ginkgo/v2/types" +) + +func ReportDuration(ctx ginkgo.SpecContext, report ginkgotypes.Report) { + durationReport := struct { + GrafanaURL string `json:"grafana_url"` + PrometheusURL string `json:"prometheus_url"` + }{} + + grafanaURL := &url.URL{ + Scheme: "http", + Host: "localhost:30001", + // take the uid from grafana-config.yaml's .data.ginkgo.json "uid" JSON field. + Path: "/d/12345678-1234-1234-1234-123456789000/ginkgo-status", + RawQuery: (&url.URL{ + Path: fmt.Sprintf( + "orgId=1&from=%v&to=%v", + report.StartTime.UnixMilli(), + report.EndTime.UnixMilli(), + ), + }).EscapedPath(), + } + + promURL := &url.URL{ + Scheme: "http", + Host: "localhost:30000", + Path: "/graph", + RawQuery: (&url.URL{ + Path: fmt.Sprintf( + "g0.expr=up&g0.tab=0&g0.display_mode=lines&g0.show_exemplars=0&g0.range_input=%v&g0.end_input=%v", + report.RunTime.Round(time.Second), + report.EndTime.UTC().Format("2006-01-02 15:04:05"), + ), + }).EscapedPath(), + } + + durationReport.PrometheusURL = promURL.String() + durationReport.GrafanaURL = grafanaURL.String() + + out, err := exec.Command("go", "list", "-m", "-f", `{{.Dir}}`).Output() + if err != nil { + ginkgo.GinkgoWriter.Printf("[ERROR] error executing command: %v\n", err) + return + } + + reportPath := filepath.Join(strings.TrimSpace(string(out)), "urls.json") + //nolint:gosec + file, _ := os.OpenFile(reportPath, os.O_CREATE|os.O_RDWR|os.O_TRUNC, os.ModePerm) + defer file.Close() + encoder := json.NewEncoder(file) + encoder.SetIndent("", " ") + encoder.SetEscapeHTML(false) + encoder.Encode(durationReport) +} diff --git a/test/helper/observability/ginkgo/metrics.go b/test/helper/observability/ginkgo/metrics.go new file mode 100644 index 0000000000..83ac7e225c --- /dev/null +++ b/test/helper/observability/ginkgo/metrics.go @@ -0,0 +1,177 @@ +// Copyright 2025 MongoDB Inc +// +// 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 ginkgo + +import ( + "bytes" + "context" + "fmt" + "net/http" + "strconv" + "strings" + + "github.com/gogo/protobuf/proto" + "github.com/golang/snappy" + "github.com/onsi/ginkgo/v2" + "github.com/onsi/ginkgo/v2/types" + "github.com/prometheus/prometheus/prompb" +) + +func sendMetrics(report types.Report) error { + tss := make([]prompb.TimeSeries, 0, len(report.SpecReports)) + for _, r := range report.SpecReports { + start := r.StartTime.UnixMilli() + if start < 0 { + continue + } + + node := strings.Join(append(r.ContainerHierarchyTexts, r.LeafNodeText), " ") + if node == "" { + node = r.LeafNodeLocation.FileName + ":" + strconv.Itoa(r.LeafNodeLocation.LineNumber) + } + + if r.LeafNodeLocation.CustomMessage != "" { + node = node + " (" + r.LeafNodeLocation.CustomMessage + ")" + } + + typ := nodeType(r.LeafNodeType) + + ts := prompb.TimeSeries{ + Labels: []prompb.Label{ + {Name: "__name__", Value: "ginkgo_spec"}, + {Name: "node", Value: node}, + {Name: "type", Value: typ}, + {Name: "parallel_process", Value: strconv.Itoa(r.ParallelProcess)}, + }, + Samples: []prompb.Sample{ + {Value: float64(r.State), Timestamp: start}, + }, + } + + if r.EndTime.After(r.StartTime) { + ts.Samples = append(ts.Samples, prompb.Sample{ + Value: float64(0.0), Timestamp: r.EndTime.UnixMilli(), + }) + } + + tss = append(tss, ts) + } + + var suiteSucceeded float64 + if report.SuiteSucceeded { + suiteSucceeded = 1.0 + } + suite := prompb.TimeSeries{ + Labels: []prompb.Label{ + {Name: "__name__", Value: "ginkgo_suite"}, + {Name: "description", Value: report.SuiteDescription}, + {Name: "path", Value: report.SuitePath}, + {Name: "focus", Value: strings.Join(report.SuiteConfig.FocusStrings, ", ")}, + }, + Samples: []prompb.Sample{ + {Value: suiteSucceeded, Timestamp: report.StartTime.UnixMilli()}, + }, + } + if report.EndTime.After(report.StartTime) { + suite.Samples = append(suite.Samples, prompb.Sample{ + Value: float64(0.0), Timestamp: report.EndTime.UnixMilli(), + }) + } + tss = append(tss, suite) + + req := &prompb.WriteRequest{ + Timeseries: tss, + } + + data, err := proto.Marshal(req) + if err != nil { + return fmt.Errorf("error marshaling WriteRequest: %w", err) + } + compressed := snappy.Encode(nil, data) + + httpReq, err := http.NewRequestWithContext(context.Background(), "POST", "http://localhost:30000/api/v1/write", bytes.NewReader(compressed)) + if err != nil { + return fmt.Errorf("error creating http request: %w", err) + } + httpReq.Header.Add("Content-Encoding", "snappy") + httpReq.Header.Set("Content-Type", "application/x-protobuf") + httpReq.Header.Set("X-Prometheus-Remote-Write-Version", "0.1.0") + httpResp, err := http.DefaultClient.Do(httpReq) + if err != nil { + return fmt.Errorf("error sending request: %w", err) + } + defer httpResp.Body.Close() + + if httpResp.StatusCode/100 != 2 { + err = fmt.Errorf("server returned HTTP status %s", httpResp.Status) + } + + return err +} + +func UpdateMetricsAfterSuite(ctx ginkgo.SpecContext, report types.Report) { + if err := sendMetrics(report); err != nil { + ginkgo.GinkgoWriter.Printf("[ERROR] error sending metrics: %v\n", err) + } +} + +func nodeType(leafNodeType types.NodeType) string { + var typ string + switch leafNodeType { + case types.NodeTypeInvalid: + typ = "NodeTypeInvalid" + case types.NodeTypeContainer: + typ = "NodeTypeContainer" + case types.NodeTypeIt: + typ = "NodeTypeIt" + case types.NodeTypeBeforeEach: + typ = "NodeTypeBeforeEach" + case types.NodeTypeJustBeforeEach: + typ = "NodeTypeJustBeforeEach" + case types.NodeTypeAfterEach: + typ = "NodeTypeAfterEach" + case types.NodeTypeJustAfterEach: + typ = "NodeTypeJustAfterEach" + case types.NodeTypeBeforeAll: + typ = "NodeTypeBeforeAll" + case types.NodeTypeAfterAll: + typ = "NodeTypeAfterAll" + case types.NodeTypeBeforeSuite: + typ = "NodeTypeBeforeSuite" + case types.NodeTypeSynchronizedBeforeSuite: + typ = "NodeTypeSynchronizedBeforeSuite" + case types.NodeTypeAfterSuite: + typ = "NodeTypeAfterSuite" + case types.NodeTypeSynchronizedAfterSuite: + typ = "NodeTypeSynchronizedAfterSuite" + case types.NodeTypeReportBeforeEach: + typ = "NodeTypeReportBeforeEach" + case types.NodeTypeReportAfterEach: + typ = "NodeTypeReportAfterEach" + case types.NodeTypeReportBeforeSuite: + typ = "NodeTypeReportBeforeSuite" + case types.NodeTypeReportAfterSuite: + typ = "NodeTypeReportAfterSuite" + case types.NodeTypeCleanupInvalid: + typ = "NodeTypeCleanupInvalid" + case types.NodeTypeCleanupAfterEach: + typ = "NodeTypeCleanupAfterEach" + case types.NodeTypeCleanupAfterAll: + typ = "NodeTypeCleanupAfterAll" + case types.NodeTypeCleanupAfterSuite: + typ = "NodeTypeCleanupAfterSuite" + } + return typ +} diff --git a/test/helper/observability/grafana.png b/test/helper/observability/grafana.png new file mode 100644 index 0000000000..2c6dc105ab Binary files /dev/null and b/test/helper/observability/grafana.png differ diff --git a/test/helper/observability/install/assets/grafana-config.yaml b/test/helper/observability/install/assets/grafana-config.yaml new file mode 100644 index 0000000000..d52e98d1db --- /dev/null +++ b/test/helper/observability/install/assets/grafana-config.yaml @@ -0,0 +1,531 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + grafana_datasource: "1" + name: grafana-datasource-loki + namespace: monitoring +data: + datasource.yaml: |- + apiVersion: 1 + datasources: + - name: Loki + type: loki + uid: loki + url: http://loki-gateway.loki.svc.cluster.local + jsonData: + maxLines: 5000 + - name: Parca + type: parca + uid: parca + url: http://parca.parca.svc.cluster.local:7070 +--- +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + grafana_dashboard: "1" + name: grafana-dashboard-ginkgo + namespace: monitoring +data: + ginkgo.json: | + { + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 1, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "fillOpacity": 70, + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": 120000, + "lineWidth": 0, + "spanNulls": false + }, + "mappings": [ + { + "options": { + "0": { + "color": "yellow", + "index": 0, + "text": "SpecStateInvalid" + }, + "1": { + "color": "#cecece", + "index": 1, + "text": "SpecStatePending" + }, + "8": { + "color": "green", + "index": 2, + "text": "SpecStatePassed" + }, + "16": { + "color": "red", + "index": 3, + "text": "SpecStateFailed" + }, + "32": { + "color": "red", + "index": 4, + "text": "SpecStateAborted" + } + }, + "type": "value" + } + ], + "max": -3, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "transparent", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "alignValue": "center", + "legend": { + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "mergeValues": true, + "rowHeight": 0.8, + "showValue": "never", + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "sum (ginkgo_spec{type=\"NodeTypeIt\"} != 4) by (node,type)", + "format": "table", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Ginkgo Node", + "transformations": [ + { + "id": "groupingToMatrix", + "options": { + "columnField": "node", + "rowField": "Time", + "valueField": "Value" + } + }, + { + "id": "convertFieldType", + "options": { + "conversions": [ + { + "destinationType": "time", + "targetField": "Time\\node" + } + ], + "fields": {} + } + } + ], + "type": "state-timeline" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd" + }, + "custom": { + "fillOpacity": 70, + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": 120000, + "lineWidth": 0, + "spanNulls": false + }, + "mappings": [ + { + "options": { + "False": { + "color": "red", + "index": 0 + }, + "True": { + "color": "green", + "index": 1 + } + }, + "type": "value" + }, + { + "options": { + "match": "empty", + "result": { + "color": "transparent", + "index": 2 + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "yellow", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 24, + "x": 0, + "y": 3 + }, + "id": 2, + "options": { + "alignValue": "left", + "legend": { + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "mergeValues": true, + "rowHeight": 0.8, + "showValue": "always", + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "label_join(\n sum (\n kube_customresource_atlasproject_status{type=\"Ready\"}\n ) by (\n kind, name, namespace, status,\n ),\n \"name_namespace\", \"/\", \"namespace\", \"name\"\n)", + "format": "table", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "AtlasProject Ready Status", + "transformations": [ + { + "id": "groupingToMatrix", + "options": { + "columnField": "name_namespace", + "rowField": "Time", + "valueField": "status" + } + }, + { + "id": "convertFieldType", + "options": { + "conversions": [ + { + "destinationType": "time", + "targetField": "Time\\name_namespace" + } + ], + "fields": {} + } + } + ], + "type": "state-timeline" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "fillOpacity": 70, + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": 60000, + "lineWidth": 0, + "spanNulls": false + }, + "mappings": [ + { + "options": { + "0": { + "color": "red", + "index": 0, + "text": "Ready=False" + }, + "1": { + "color": "green", + "index": 1, + "text": "Ready=True" + } + }, + "type": "value" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "transparent", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 24, + "x": 0, + "y": 6 + }, + "id": 3, + "options": { + "alignValue": "left", + "legend": { + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "mergeValues": true, + "rowHeight": 0.8, + "showValue": "never", + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "label_join(\n sum (\n kube_customresource_atlasdeployment_status{type=\"Ready\"}\n ) by (\n kind, name, namespace,\n ),\n \"name_namespace\", \"/\", \"namespace\", \"name\"\n)", + "format": "table", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "AtlasDeployment Ready Status", + "transformations": [ + { + "id": "groupingToMatrix", + "options": { + "columnField": "name_namespace", + "emptyValue": "null", + "rowField": "Time", + "valueField": "Value" + } + }, + { + "id": "convertFieldType", + "options": { + "conversions": [ + { + "destinationType": "time", + "targetField": "Time\\name_namespace" + } + ], + "fields": {} + } + } + ], + "type": "state-timeline" + }, + { + "datasource": { + "type": "loki", + "uid": "loki" + }, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 10 + }, + "id": 4, + "options": { + "dedupStrategy": "none", + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": false, + "sortOrder": "Descending", + "wrapLogMessage": true + }, + "targets": [ + { + "datasource": { + "type": "loki", + "uid": "loki" + }, + "editorMode": "code", + "expr": "{job=\"ako\"} | json | atlasdeployment=~\"$atlasdeployment\" | logger=~\"$logger\" | level=~\"$level\" | line_format \"{{ .ts }} \\033[1;37m{{ .level }}\\033[0m \\033[1;32m{{ .logger }}\\033[0m {{ .msg }}\"", + "queryType": "range", + "refId": "A" + } + ], + "title": "Ginkgo Logs", + "type": "logs" + } + ], + "refresh": "5s", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "", + "value": "" + }, + "description": "", + "hide": 0, + "name": "logger", + "options": [ + { + "selected": true, + "text": "", + "value": "" + } + ], + "query": "", + "skipUrlSync": false, + "type": "textbox" + }, + { + "current": { + "selected": false, + "text": "", + "value": "" + }, + "hide": 0, + "name": "level", + "options": [ + { + "selected": true, + "text": "", + "value": "" + } + ], + "query": "", + "skipUrlSync": false, + "type": "textbox" + }, + { + "current": { + "selected": false, + "text": "", + "value": "" + }, + "hide": 0, + "name": "atlasdeployment", + "options": [ + { + "selected": true, + "text": "", + "value": "" + } + ], + "query": "", + "skipUrlSync": false, + "type": "textbox" + } + ] + }, + "time": { + "from": "now-5m", + "to": "now" + }, + "timeRangeUpdatedDuringEditOrView": false, + "timepicker": {}, + "timezone": "", + "title": "ginkgo Status", + "uid": "12345678-1234-1234-1234-123456789000", + "version": 1, + "weekStart": "" + } diff --git a/test/helper/observability/install/assets/kind-config.yaml b/test/helper/observability/install/assets/kind-config.yaml new file mode 100644 index 0000000000..006e442603 --- /dev/null +++ b/test/helper/observability/install/assets/kind-config.yaml @@ -0,0 +1,25 @@ +kind: Cluster +apiVersion: kind.x-k8s.io/v1alpha4 +nodes: + - role: control-plane + extraPortMappings: + # prometheus + - containerPort: 30000 + hostPort: 30000 + listenAddress: "0.0.0.0" + protocol: tcp + # grafana + - containerPort: 30001 + hostPort: 30001 + listenAddress: "0.0.0.0" + protocol: tcp + # loki + - containerPort: 30002 + hostPort: 30002 + listenAddress: "0.0.0.0" + protocol: tcp + # parca + - containerPort: 30003 + hostPort: 30003 + listenAddress: "0.0.0.0" + protocol: tcp diff --git a/test/helper/observability/install/assets/ksm-cluster-role-binding.yaml b/test/helper/observability/install/assets/ksm-cluster-role-binding.yaml new file mode 100644 index 0000000000..8ecd5070dd --- /dev/null +++ b/test/helper/observability/install/assets/ksm-cluster-role-binding.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: kube-state-metrics +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin +subjects: + - kind: ServiceAccount + name: kube-prometheus-kube-state-metrics + namespace: monitoring diff --git a/test/helper/observability/install/assets/ksm-config.yaml b/test/helper/observability/install/assets/ksm-config.yaml new file mode 100644 index 0000000000..229ab6bb51 --- /dev/null +++ b/test/helper/observability/install/assets/ksm-config.yaml @@ -0,0 +1,41 @@ +kind: CustomResourceStateMetrics +spec: + resources: + - groupVersionKind: + version: "*" + group: atlas.mongodb.com + kind: AtlasProject + labelsFromPath: + name: [metadata, name] + namespace: [metadata, namespace] + kind: [kind] + version: [version] + metrics: + - name: "atlasproject_status" + each: + type: Gauge + gauge: + path: [status, conditions] + labelsFromPath: + type: ["type"] + status: ["status"] + valueFrom: ["status"] + - groupVersionKind: + version: "*" + group: atlas.mongodb.com + kind: AtlasDeployment + labelsFromPath: + name: [metadata, name] + namespace: [metadata, namespace] + kind: [kind] + version: [version] + metrics: + - name: "atlasdeployment_status" + each: + type: Gauge + gauge: + path: [status, conditions] + labelsFromPath: + type: ["type"] + status: ["status"] + valueFrom: ["status"] diff --git a/test/helper/observability/install/assets/ksm-deployment.yaml b/test/helper/observability/install/assets/ksm-deployment.yaml new file mode 100644 index 0000000000..a19afb2ab0 --- /dev/null +++ b/test/helper/observability/install/assets/ksm-deployment.yaml @@ -0,0 +1,25 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: kube-prometheus-kube-state-metrics + namespace: monitoring +spec: + template: + spec: + containers: + - name: kube-state-metrics + args: + - --port=8080 + - --resources=certificatesigningrequests,configmaps,cronjobs,daemonsets,deployments,endpoints,horizontalpodautoscalers,ingresses,jobs,leases,limitranges,mutatingwebhookconfigurations,namespaces,networkpolicies,nodes,persistentvolumeclaims,persistentvolumes,poddisruptionbudgets,pods,replicasets,replicationcontrollers,resourcequotas,secrets,services,statefulsets,storageclasses,validatingwebhookconfigurations,volumeattachments + - --custom-resource-state-config-file=/etc/kube-state-metrics/ksm-config.yaml + volumeMounts: + - mountPath: /etc/kube-state-metrics + name: ako + volumes: + - name: ako + configMap: + defaultMode: 420 + items: + - key: ksm-config.yaml + path: ksm-config.yaml + name: kube-state-metrics-config diff --git a/test/helper/observability/install/assets/kube-prometheus-helm.yaml b/test/helper/observability/install/assets/kube-prometheus-helm.yaml new file mode 100644 index 0000000000..414f6067d9 --- /dev/null +++ b/test/helper/observability/install/assets/kube-prometheus-helm.yaml @@ -0,0 +1,8 @@ +alertmanager: + enabled: false + +kube-state-metrics: + rbac: + create: false + monitor: + interval: 2s diff --git a/test/helper/observability/install/assets/loki-helm.yaml b/test/helper/observability/install/assets/loki-helm.yaml new file mode 100644 index 0000000000..724bb43a00 --- /dev/null +++ b/test/helper/observability/install/assets/loki-helm.yaml @@ -0,0 +1,30 @@ +deploymentMode: SingleBinary +loki: + auth_enabled: false + commonConfig: + replication_factor: 1 + storage: + type: 'filesystem' + compactor: + retention_enabled: false + limits_config: + retention_period: 9999d + reject_old_samples: false + reject_old_samples_max_age: 9999d + schemaConfig: + configs: + - from: "2024-01-01" + store: tsdb + index: + prefix: loki_index_ + period: 24h + object_store: filesystem # we're storing on filesystem so there's no real persistence here. + schema: v13 +singleBinary: + replicas: 1 +read: + replicas: 0 +backend: + replicas: 0 +write: + replicas: 0 diff --git a/test/helper/observability/install/assets/loki-snapshot-file.yaml b/test/helper/observability/install/assets/loki-snapshot-file.yaml new file mode 100644 index 0000000000..63d2df2259 --- /dev/null +++ b/test/helper/observability/install/assets/loki-snapshot-file.yaml @@ -0,0 +1,27 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: loki + namespace: loki +spec: + template: + spec: + initContainers: + - command: + - sh + - -c + - tar xvzf /loki.tar.gz + image: busybox:1.28 + imagePullPolicy: IfNotPresent + name: init + workingDir: /var/loki + volumeMounts: + - mountPath: /var/loki + name: storage + - mountPath: /loki.tar.gz + name: snapshot-file + volumes: + - name: snapshot-file + hostPath: + path: /home/loki.tar.gz + type: File diff --git a/test/helper/observability/install/assets/loki-snapshot-url.yaml b/test/helper/observability/install/assets/loki-snapshot-url.yaml new file mode 100644 index 0000000000..57627bc853 --- /dev/null +++ b/test/helper/observability/install/assets/loki-snapshot-url.yaml @@ -0,0 +1,23 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: loki + namespace: loki +spec: + template: + spec: + initContainers: + - command: + - sh + - -c + - rm -rf *; wget -O - $(LOKI_SNAPSHOT_URL) | tar xvzf - + image: busybox:1.28 + imagePullPolicy: IfNotPresent + name: init + workingDir: /var/loki + volumeMounts: + - mountPath: /var/loki + name: storage + envFrom: + - configMapRef: + name: artifact-urls diff --git a/test/helper/observability/install/assets/nodeports.yaml b/test/helper/observability/install/assets/nodeports.yaml new file mode 100644 index 0000000000..cb1b7459ca --- /dev/null +++ b/test/helper/observability/install/assets/nodeports.yaml @@ -0,0 +1,62 @@ +apiVersion: v1 +kind: Service +metadata: + name: prometheus-nodeport + namespace: monitoring +spec: + type: NodePort + ports: + - port: 9090 + nodePort: 30000 + name: http-web + targetPort: http-web + selector: + app.kubernetes.io/name: prometheus +--- +apiVersion: v1 +kind: Service +metadata: + name: grafana-nodeport + namespace: monitoring +spec: + type: NodePort + ports: + - port: 80 + nodePort: 30001 + name: http-web + targetPort: 3000 + selector: + app.kubernetes.io/name: grafana +--- +apiVersion: v1 +kind: Service +metadata: + name: loki-nodeport + namespace: loki +spec: + type: NodePort + ports: + - port: 80 + nodePort: 30002 + name: http-metrics + targetPort: http-metrics + selector: + app.kubernetes.io/component: gateway + app.kubernetes.io/name: loki +--- +apiVersion: v1 +kind: Service +metadata: + name: parca-nodeport + namespace: parca +spec: + type: NodePort + ports: + - port: 7070 + nodePort: 30003 + name: http + targetPort: http + selector: + app.kubernetes.io/component: observability + app.kubernetes.io/instance: parca + app.kubernetes.io/name: parca diff --git a/test/helper/observability/install/assets/parca-config.yaml b/test/helper/observability/install/assets/parca-config.yaml new file mode 100644 index 0000000000..ba7e00a26d --- /dev/null +++ b/test/helper/observability/install/assets/parca-config.yaml @@ -0,0 +1,11 @@ +"object_storage": + "bucket": + "config": + "directory": "/var/lib/parca" + "type": "FILESYSTEM" + +scrape_configs: + - job_name: "ako" + scrape_interval: "1s" + static_configs: + - targets: [ 'host.docker.internal:7070' ] diff --git a/test/helper/observability/install/assets/parca-deployment.yaml b/test/helper/observability/install/assets/parca-deployment.yaml new file mode 100644 index 0000000000..f7abe8ad0e --- /dev/null +++ b/test/helper/observability/install/assets/parca-deployment.yaml @@ -0,0 +1,21 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: parca + namespace: parca +spec: + template: + spec: + containers: + - args: + - /parca + - --http-address=:7070 + - --config-path=/etc/parca/parca.yaml + - --log-level=info + - --cors-allowed-origins=* + - --debuginfod-upstream-servers=debuginfod.systemtap.org + - --debuginfod-http-request-timeout=5m + - --enable-persistence + - --storage-enable-wal + - --storage-path=/var/lib/parca + name: parca diff --git a/test/helper/observability/install/assets/parca-helm.yaml b/test/helper/observability/install/assets/parca-helm.yaml new file mode 100644 index 0000000000..b64a186de6 --- /dev/null +++ b/test/helper/observability/install/assets/parca-helm.yaml @@ -0,0 +1,7 @@ +server: + image: + tag: v0.23.1 + +agent: + image: + tag: v0.39.0 diff --git a/test/helper/observability/install/assets/parca-snapshot-file.yaml b/test/helper/observability/install/assets/parca-snapshot-file.yaml new file mode 100644 index 0000000000..3c49ff87a3 --- /dev/null +++ b/test/helper/observability/install/assets/parca-snapshot-file.yaml @@ -0,0 +1,42 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: parca + namespace: parca +spec: + template: + spec: + initContainers: + - command: + - sh + - -c + - | + rm -rf *; \ + tar xvzf /parca.tar.gz + image: busybox:1.28 + imagePullPolicy: IfNotPresent + name: init-db + workingDir: /var/lib/parca + volumeMounts: + - mountPath: /var/lib/parca + name: data + - mountPath: /parca.tar.gz + name: snapshot-file + volumes: + - name: snapshot-file + hostPath: + path: /home/parca.tar.gz + type: File + containers: + - args: + - /parca + - --http-address=:7070 + - --config-path=/etc/parca/parca.yaml + - --log-level=info + - --cors-allowed-origins=* + - --debuginfod-upstream-servers=debuginfod.systemtap.org + - --debuginfod-http-request-timeout=5m + - --enable-persistence + - --storage-enable-wal + - --storage-path=/var/lib/parca + name: parca diff --git a/test/helper/observability/install/assets/prometheus-host-scrape-config.yaml b/test/helper/observability/install/assets/prometheus-host-scrape-config.yaml new file mode 100644 index 0000000000..e447011433 --- /dev/null +++ b/test/helper/observability/install/assets/prometheus-host-scrape-config.yaml @@ -0,0 +1,3 @@ +- job_name: "ako" + static_configs: + - targets: ["host.docker.internal:8080"] diff --git a/test/helper/observability/install/assets/prometheus-snapshot-file.yaml b/test/helper/observability/install/assets/prometheus-snapshot-file.yaml new file mode 100644 index 0000000000..dc1ba8cdff --- /dev/null +++ b/test/helper/observability/install/assets/prometheus-snapshot-file.yaml @@ -0,0 +1,28 @@ +apiVersion: monitoring.coreos.com/v1 +kind: Prometheus +metadata: + name: kube-prometheus-kube-prome-prometheus + namespace: monitoring +spec: + retention: 9999d + initContainers: + - command: + - sh + - -c + - | + rm -rf *; \ + tar xvzf /prometheus.tar.gz + image: busybox:1.28 + imagePullPolicy: IfNotPresent + name: init-db + workingDir: /prometheus + volumeMounts: + - mountPath: /prometheus + name: prometheus-kube-prometheus-kube-prome-prometheus-db + - mountPath: /prometheus.tar.gz + name: snapshot-file + volumes: + - name: snapshot-file + hostPath: + path: /home/prometheus.tar.gz + type: File diff --git a/test/helper/observability/install/assets/prometheus-snapshot-url.yaml b/test/helper/observability/install/assets/prometheus-snapshot-url.yaml new file mode 100644 index 0000000000..571fadb835 --- /dev/null +++ b/test/helper/observability/install/assets/prometheus-snapshot-url.yaml @@ -0,0 +1,24 @@ +apiVersion: monitoring.coreos.com/v1 +kind: Prometheus +metadata: + name: kube-prometheus-kube-prome-prometheus + namespace: monitoring +spec: + retention: 9999d + initContainers: + - command: + - sh + - -c + - | + rm -rf *; \ + wget -O - $(PROMETHEUS_SNAPSHOT_URL) | tar xvzf - + image: busybox:1.28 + imagePullPolicy: IfNotPresent + name: init-db + workingDir: /prometheus + volumeMounts: + - mountPath: /prometheus + name: prometheus-kube-prometheus-kube-prome-prometheus-db + envFrom: + - configMapRef: + name: artifact-urls diff --git a/test/helper/observability/install/assets/prometheus.yaml b/test/helper/observability/install/assets/prometheus.yaml new file mode 100644 index 0000000000..6d9f64265f --- /dev/null +++ b/test/helper/observability/install/assets/prometheus.yaml @@ -0,0 +1,17 @@ +apiVersion: monitoring.coreos.com/v1 +kind: Prometheus +metadata: + name: kube-prometheus-kube-prome-prometheus + namespace: monitoring +spec: + replicas: 1 + evaluationInterval: 2s + scrapeInterval: 2s + enableRemoteWriteReceiver: true + enableAdminAPI: true + scrapeConfigSelector: + matchLabels: + prometheus: ako + additionalScrapeConfigs: + name: host-scrape-config + key: prometheus-host-scrape-config.yaml diff --git a/test/helper/observability/install/assets/promtail-helm.yaml b/test/helper/observability/install/assets/promtail-helm.yaml new file mode 100644 index 0000000000..632381246e --- /dev/null +++ b/test/helper/observability/install/assets/promtail-helm.yaml @@ -0,0 +1,6 @@ +deployment: + enabled: true + +config: + clients: + - url: http://loki-gateway.loki.svc.cluster.local/loki/api/v1/push diff --git a/test/helper/observability/install/install.go b/test/helper/observability/install/install.go new file mode 100644 index 0000000000..e5ddf668dc --- /dev/null +++ b/test/helper/observability/install/install.go @@ -0,0 +1,268 @@ +// Copyright 2025 MongoDB Inc +// +// 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 install + +import ( + "context" + "flag" + "fmt" + "io" + url "net/url" + "os" + "path/filepath" + "time" + + "k8s.io/apimachinery/pkg/util/wait" + clientgoretry "k8s.io/client-go/util/retry" + + "github.com/mongodb/mongodb-atlas-kubernetes/v2/test/helper/observability" +) + +var defaultBackOff = wait.Backoff{ + Duration: 2 * time.Second, + Factor: 1.0, + Steps: 30 * 5, +} + +func InstallSnapshot(logger io.Writer) error { + var ( + snapshotURL string + lokiSnapshotPath string + promSnapshotPath string + parcaSnapshotPath string + ) + + flag.StringVar(&snapshotURL, "snapshot-url", "", "The snapshot URL to download the snapshots from. If set, it has precedence over -loki-snapshot and -prom-snapshot.") + flag.StringVar(&lokiSnapshotPath, "loki-snapshot", "", "The path to the loki snapshot .tar.gz file to use. If set, -prom-snapshot and -parca-snapshot must be provided.") + flag.StringVar(&promSnapshotPath, "prom-snapshot", "", "The path to the prometheus snapshot .tar.gz file to use. If set, -loki-snapshot and -parca-snapshot must be provided.") + flag.StringVar(&parcaSnapshotPath, "parca-snapshot", "", "The path to the parca snapshot .tar.gz file to use. If set, -loki-snapshot and -prom-snapshot must be provided.") + err := flag.CommandLine.Parse(os.Args[2:]) + if err != nil { + return fmt.Errorf("error parsing flags: %w", err) + } + + switch { + case snapshotURL != "": + u, err := url.Parse(snapshotURL) + if err != nil { + return fmt.Errorf("failed to parse snapshot url: %w", err) + } + snapshotURL = u.String() + case lokiSnapshotPath != "" && promSnapshotPath != "": + var err error + lokiSnapshotPath, err = filepath.Abs(lokiSnapshotPath) + if err != nil { + return fmt.Errorf("error getting absolute path for loki snapshot: %w", err) + } + promSnapshotPath, err = filepath.Abs(promSnapshotPath) + if err != nil { + return fmt.Errorf("error getting absolute path for prometheus snapshot: %w", err) + } + parcaSnapshotPath, err = filepath.Abs(parcaSnapshotPath) + if err != nil { + return fmt.Errorf("error getting absolute path for parca snapshot: %w", err) + } + default: + return fmt.Errorf("either -snapshot-url or both -loki-snapshot and -prom-snapshot must be provided") + } + + assetsDir, err := Unpack() + if err != nil { + return fmt.Errorf("error unpacking assets: %w", err) + } + defer os.RemoveAll(assetsDir) + + crdDir := filepath.Join(assetsDir, "config", "crd") + assetsDir = filepath.Join(assetsDir, "test", "helper", "observability", "install", "assets") + for _, cmdArgs := range [][]string{ + {"kind", "create", "cluster", `--name=dos`, fmt.Sprintf(`--config=%v/kind-config.yaml`, assetsDir)}, + {"kubectl", "apply", "-k", crdDir}, + } { + if err := observability.ExecCommand(logger, cmdArgs...); err != nil { + return err + } + } + + for _, cmdArgs := range [][]string{ + {"kubectl", "create", "ns", "parca"}, + {"kubectl", "apply", "--server-side", "-f", "https://github.com/parca-dev/parca/releases/download/v0.23.1/kubernetes-manifest.yaml"}, + {"kubectl", "apply", "--server-side", "-f", "https://github.com/parca-dev/parca-agent/releases/download/v0.39.0/kubernetes-manifest.yaml"}, + {"kubectl", "-n", "parca", "scale", "--replicas=0", "deployment/parca"}, + {"helm", "repo", "add", "prometheus-community", "https://prometheus-community.github.io/helm-charts"}, + {"helm", "repo", "add", "grafana", "https://grafana.github.io/helm-charts"}, + {"helm", "repo", "update"}, + {"helm", "upgrade", "--values", fmt.Sprintf("%v/kube-prometheus-helm.yaml", assetsDir), "--install", "kube-prometheus", "prometheus-community/kube-prometheus-stack", "-n", "monitoring", "--create-namespace"}, + {"helm", "upgrade", "--values", fmt.Sprintf("%v/loki-helm.yaml", assetsDir), "--install", "loki", "grafana/loki", "-n", "loki", "--create-namespace"}, + {"kubectl", "apply", "-f", fmt.Sprintf("%v/nodeports.yaml", assetsDir)}, + {"kubectl", "apply", "-f", fmt.Sprintf("%v/grafana-config.yaml", assetsDir)}, + {"kubectl", "-n", "loki", "scale", "--replicas=0", "sts/loki"}, + } { + if err := observability.ExecCommand(logger, cmdArgs...); err != nil { + return err + } + } + + if snapshotURL != "" { + for _, cmdArgs := range [][]string{ + {"kubectl", "-n", "monitoring", "delete", "--ignore-not-found", "configmap", "artifact-urls"}, + {"kubectl", "-n", "monitoring", "create", "configmap", "artifact-urls", + fmt.Sprintf(`--from-literal=PROMETHEUS_SNAPSHOT_URL='%v/prometheus.tar.gz'`, snapshotURL), + }, + {"kubectl", "apply", "--server-side", "--force-conflicts", "-f", fmt.Sprintf("%v/prometheus-snapshot-url.yaml", assetsDir)}, + + {"kubectl", "-n", "loki", "delete", "--ignore-not-found", "configmap", "artifact-urls"}, + {"kubectl", "-n", "loki", "create", "configmap", "artifact-urls", + fmt.Sprintf(`--from-literal=LOKI_SNAPSHOT_URL='%v/loki.tar.gz'`, snapshotURL), + }, + {"kubectl", "apply", "--server-side", "--force-conflicts", "-f", fmt.Sprintf("%v/loki-snapshot-url.yaml", assetsDir)}, + } { + if err := observability.ExecCommand(logger, cmdArgs...); err != nil { + return err + } + } + } else { + for _, cmdArgs := range [][]string{ + {"docker", "cp", lokiSnapshotPath, "dos-control-plane:/home/loki.tar.gz"}, + {"kubectl", "apply", "--server-side", "--force-conflicts", "-f", fmt.Sprintf("%v/loki-snapshot-file.yaml", assetsDir)}, + + {"docker", "cp", promSnapshotPath, "dos-control-plane:/home/prometheus.tar.gz"}, + {"kubectl", "apply", "--server-side", "--force-conflicts", "-f", fmt.Sprintf("%v/prometheus-snapshot-file.yaml", assetsDir)}, + + {"docker", "cp", parcaSnapshotPath, "dos-control-plane:/home/parca.tar.gz"}, + {"kubectl", "-n", "parca", "patch", "deployment/parca", "--patch-file", fmt.Sprintf("%v/parca-snapshot-file.yaml", assetsDir)}, + } { + if err := observability.ExecCommand(logger, cmdArgs...); err != nil { + return err + } + } + } + + for _, cmdArgs := range [][]string{ + {"kubectl", "-n", "parca", "scale", "--replicas=1", "deployment/parca"}, + {"kubectl", "-n", "loki", "scale", "--replicas=1", "sts/loki"}, + {"kubectl", "-n", "loki", "wait", "pods", "-l", `app.kubernetes.io/name=loki`, "--for", "condition=Ready", "--timeout=600s"}, + {"kubectl", "-n", "monitoring", "wait", "pods", "-l", `app.kubernetes.io/instance=kube-prometheus-kube-prome-prometheus`, "--for", "condition=Ready", "--timeout=600s"}, + // flush loki, as it was disconnected. + {"curl", "-XPOST", "-v", `http://localhost:30002/flush`}, + } { + if err := observability.ExecCommand(logger, cmdArgs...); err != nil { + return err + } + } + + return nil +} + +func Teardown(logger io.Writer) error { + if err := os.Chdir("test/helper/observability/install"); err != nil { + return fmt.Errorf("error changing directory: %w", err) + } + + for _, cmdArgs := range [][]string{ + {"kind", "delete", "cluster", `--name=dos`}, + } { + if err := observability.ExecCommand(logger, cmdArgs...); err != nil { + return err + } + } + return nil +} + +func Install(logger io.Writer) error { + assetsDir, err := Unpack() + if err != nil { + return fmt.Errorf("error unpacking assets: %w", err) + } + defer os.RemoveAll(assetsDir) + + crdDir := filepath.Join(assetsDir, "config", "crd") + assetsDir = filepath.Join(assetsDir, "test", "helper", "observability", "install", "assets") + + for _, cmdArgs := range [][]string{ + {"kind", "create", "cluster", `--name=dos`, fmt.Sprintf(`--config=%v/kind-config.yaml`, assetsDir)}, + {"kubectl", "apply", "-k", crdDir}, + } { + if err := observability.ExecCommand(logger, cmdArgs...); err != nil { + return err + } + } + + ctx := context.Background() + for _, cmdArgs := range [][]string{ + {"kubectl", "create", "ns", "parca"}, + {"kubectl", "apply", "--server-side", "-f", "https://github.com/parca-dev/parca/releases/download/v0.23.1/kubernetes-manifest.yaml"}, + {"kubectl", "apply", "--server-side", "-f", "https://github.com/parca-dev/parca-agent/releases/download/v0.39.0/kubernetes-manifest.yaml"}, + {"kubectl", "-n", "parca", "scale", "--replicas=0", "deployment/parca"}, + {"kubectl", "-n", "parca", "delete", "configmap", "parca"}, + {"kubectl", "-n", "parca", "create", "configmap", "parca", fmt.Sprintf("--from-file=parca.yaml=%v/parca-config.yaml", assetsDir)}, + {"kubectl", "-n", "parca", "patch", "deployment/parca", "--patch-file", fmt.Sprintf("%v/parca-deployment.yaml", assetsDir)}, + {"kubectl", "-n", "parca", "scale", "--replicas=1", "deployment/parca"}, + {"helm", "repo", "add", "prometheus-community", "https://prometheus-community.github.io/helm-charts"}, + {"helm", "repo", "add", "grafana", "https://grafana.github.io/helm-charts"}, + {"helm", "repo", "update"}, + {"helm", "upgrade", "--values", fmt.Sprintf("%v/kube-prometheus-helm.yaml", assetsDir), "--install", "kube-prometheus", "prometheus-community/kube-prometheus-stack", "-n", "monitoring", "--create-namespace"}, + {"helm", "upgrade", "--values", fmt.Sprintf("%v/loki-helm.yaml", assetsDir), "--install", "loki", "grafana/loki", "-n", "loki", "--create-namespace"}, + {"helm", "upgrade", "--values", fmt.Sprintf("%v/promtail-helm.yaml", assetsDir), "--install", "promtail", "grafana/promtail", "-n", "promtail", "--create-namespace"}, + {"kubectl", "apply", "-f", fmt.Sprintf("%v/nodeports.yaml", assetsDir)}, + {"kubectl", "apply", "-f", fmt.Sprintf("%v/grafana-config.yaml", assetsDir)}, + {"kubectl", "-n", "monitoring", "create", "secret", "generic", "host-scrape-config", fmt.Sprintf("--from-file=%v/prometheus-host-scrape-config.yaml", assetsDir)}, + {"kubectl", "apply", "--server-side", "--force-conflicts", "-f", fmt.Sprintf("%v/prometheus.yaml", assetsDir)}, + } { + if err := observability.ExecCommand(logger, cmdArgs...); err != nil { + return err + } + } + + err = retry(ctx, func() error { + return observability.ExecCommand(logger, "kubectl", "-n", "monitoring", "scale", "--replicas=0", "deployment/kube-prometheus-kube-state-metrics") + }) + if err != nil { + return fmt.Errorf("error executing command: %w", err) + } + + for _, cmdArgs := range [][]string{ + {"kubectl", "-n", "monitoring", "create", "configmap", "kube-state-metrics-config", fmt.Sprintf("--from-file=%v/ksm-config.yaml", assetsDir)}, + {"kubectl", "apply", "--server-side", `--field-manager="dos"`, "--force-conflicts", "-f", fmt.Sprintf("%v/ksm-deployment.yaml", assetsDir)}, + {"kubectl", "apply", "--server-side", "-f", fmt.Sprintf("%v/ksm-cluster-role-binding.yaml", assetsDir)}, + {"kubectl", "-n", "monitoring", "scale", "--replicas=1", "deployment/kube-prometheus-kube-state-metrics"}, + {"kubectl", "-n", "loki", "rollout", "status", "--watch", "statefulset/loki"}, + {"kubectl", "-n", "promtail", "rollout", "status", "--watch", "deployment/promtail"}, + {"kubectl", "-n", "monitoring", "rollout", "status", "--watch", "deployment/kube-prometheus-kube-state-metrics"}, + {"kubectl", "-n", "monitoring", "rollout", "status", "--watch", "statefulset/prometheus-kube-prometheus-kube-prome-prometheus"}, + } { + if err := observability.ExecCommand(logger, cmdArgs...); err != nil { + return err + } + } + return nil +} + +func retry(ctx context.Context, f func() error) error { + return clientgoretry.OnError( + defaultBackOff, func(err error) bool { return true }, + func() error { + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + err := f() + if err != nil { + fmt.Println(err) + } + return err + }, + ) +} diff --git a/test/helper/observability/install/unpack.go b/test/helper/observability/install/unpack.go new file mode 100644 index 0000000000..4deeac1a26 --- /dev/null +++ b/test/helper/observability/install/unpack.go @@ -0,0 +1,68 @@ +// Copyright 2025 MongoDB Inc +// +// 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 install + +import ( + "fmt" + "io/fs" + "os" + "path/filepath" + + root "github.com/mongodb/mongodb-atlas-kubernetes/v2" +) + +// Unpack unpacks assets to a temporary directory and returns the path to that directory or an error if it fails. +// use `defer os.RemoveAll(...)` to clean up the temporary directory after use. +func Unpack() (string, error) { + tempDir, err := os.MkdirTemp("", "unpacked-*") + if err != nil { + return "", fmt.Errorf("failed to create temp dir: %w", err) + } + + err = fs.WalkDir(root.Assets, ".", func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + + targetPath := filepath.Join(tempDir, path) + + if d.IsDir() { + //nolint:gosec + return os.MkdirAll(targetPath, 0755) + } + + // Read the file content + data, err := root.Assets.ReadFile(path) + if err != nil { + return fmt.Errorf("failed to read embedded file %s: %w", path, err) + } + + // Write to the temp directory + //nolint:gosec + err = os.WriteFile(targetPath, data, 0644) + if err != nil { + return fmt.Errorf("failed to write file %s: %w", targetPath, err) + } + + return nil + }) + + if err != nil { + os.RemoveAll(tempDir) + return "", fmt.Errorf("failed to unpack files: %w", err) + } + + return tempDir, nil +} diff --git a/test/helper/observability/jsonwriter/jsonwriter.go b/test/helper/observability/jsonwriter/jsonwriter.go new file mode 100644 index 0000000000..111bbf3fba --- /dev/null +++ b/test/helper/observability/jsonwriter/jsonwriter.go @@ -0,0 +1,61 @@ +// Copyright 2025 MongoDB Inc +// +// 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 jsonwriter + +import ( + "encoding/json" + "io" + "time" +) + +type JSONWriter struct { + delegate io.Writer + level string + logger string +} + +func NewJSONWriter(delegate io.Writer, level, logger string) *JSONWriter { + return &JSONWriter{ + delegate: delegate, + level: level, + logger: logger, + } +} + +func (j *JSONWriter) Write(b []byte) (int, error) { + var js json.RawMessage + if json.Unmarshal(b, &js) == nil { + return j.delegate.Write(b) + } + + entry := struct { + Msg string `json:"msg,omitempty"` + Time string `json:"time,omitempty"` + Level string `json:"level,omitempty"` + Logger string `json:"logger,omitempty"` + }{ + Time: time.Now().UTC().Format(time.RFC3339), + Level: j.level, + Msg: string(b), + Logger: j.logger, + } + + enc := json.NewEncoder(j.delegate) + if err := enc.Encode(&entry); err != nil { + return 0, err + } + + return len(b), nil +} diff --git a/test/helper/observability/loki.png b/test/helper/observability/loki.png new file mode 100644 index 0000000000..89bf99c110 Binary files /dev/null and b/test/helper/observability/loki.png differ diff --git a/test/helper/observability/loki_reporter/loki_reporter.go b/test/helper/observability/loki_reporter/loki_reporter.go new file mode 100644 index 0000000000..28ced8eb98 --- /dev/null +++ b/test/helper/observability/loki_reporter/loki_reporter.go @@ -0,0 +1,83 @@ +// Copyright 2025 MongoDB Inc +// +// 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 loki_reporter + +import ( + "fmt" + "io" + "net/url" + "time" + + "github.com/go-kit/kit/log" + "github.com/grafana/dskit/flagext" + "github.com/grafana/loki/v3/clients/pkg/promtail/api" + "github.com/grafana/loki/v3/clients/pkg/promtail/client" + "github.com/grafana/loki/v3/pkg/logproto" + lokiflag "github.com/grafana/loki/v3/pkg/util/flagext" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/common/model" +) + +type LokiReporter struct { + lokiClient client.Client +} + +func (l *LokiReporter) Write(p []byte) (n int, err error) { + l.lokiClient.Chan() <- api.Entry{ + Entry: logproto.Entry{ + Timestamp: time.Now(), + Line: string(p), + }, + } + + return len(p), nil +} + +func (l *LokiReporter) Stop() { + l.lokiClient.Stop() +} + +func New(lokiURL, job string, loggerWriter io.Writer) (*LokiReporter, error) { + u, err := url.Parse(lokiURL) + if err != nil { + return nil, fmt.Errorf("error parsing loki URL: %w", err) + } + u.Path = "/loki/api/v1/push" + + logger := log.NewLogfmtLogger(log.NewSyncWriter(loggerWriter)) + + lokiClient, err := client.New( + client.NewMetrics(prometheus.DefaultRegisterer), + client.Config{ + URL: flagext.URLValue{URL: u}, + BatchWait: client.BatchWait, + BatchSize: client.BatchSize, + ExternalLabels: lokiflag.LabelSet{ + LabelSet: map[model.LabelName]model.LabelValue{ + "job": model.LabelValue(job), + }, + }, + Timeout: client.Timeout, + }, + 0, // disable max streams cap + 0, // disable max line size + false, // disable line truncation + logger, + ) + if err != nil { + return nil, fmt.Errorf("error creating loki client: %w", err) + } + return &LokiReporter{lokiClient: lokiClient}, nil +} diff --git a/test/helper/observability/observe/observe.go b/test/helper/observability/observe/observe.go new file mode 100644 index 0000000000..faa84bbe68 --- /dev/null +++ b/test/helper/observability/observe/observe.go @@ -0,0 +1,97 @@ +// Copyright 2025 MongoDB Inc +// +// 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 observe + +import ( + "bufio" + "flag" + "fmt" + "io" + "os" + "os/exec" + "sync" + + "github.com/mongodb/mongodb-atlas-kubernetes/v2/test/helper/observability/jsonwriter" + "github.com/mongodb/mongodb-atlas-kubernetes/v2/test/helper/observability/loki_reporter" +) + +func Observe(cmdArgs ...string) error { + var ( + lokiURL string + jobName string + ) + + flag.StringVar(&jobName, "job-name", "ako", "The \"job\" label value to report to Loki") + flag.StringVar(&lokiURL, "loki-url", "http://localhost:30002", "The URL of the Loki instance to report to") + flag.Parse() + + target, err := loki_reporter.New(lokiURL, jobName, os.Stderr) + if err != nil { + return fmt.Errorf("error setting up loki: %w", err) + } + defer target.Stop() + + return forwardTo(target, cmdArgs...) +} + +func forwardTo(target io.Writer, cmdArgs ...string) error { + //nolint:gosec + cmd := exec.Command(cmdArgs[0], cmdArgs[1:]...) + + cmdStdout, err := cmd.StdoutPipe() + if err != nil { + return fmt.Errorf("failed to get cmdStdout pipe: %w", err) + } + + cmdStderr, err := cmd.StderrPipe() + if err != nil { + return fmt.Errorf("failed to get cmdStdout pipe: %w", err) + } + + if err := cmd.Start(); err != nil { + return fmt.Errorf("failed to start command: %w", err) + } + + var wg sync.WaitGroup + wg.Add(2) + for _, dest := range []struct { + writer io.Writer + reader io.Reader + }{ + { + writer: io.MultiWriter(os.Stdout, jsonwriter.NewJSONWriter(target, "INFO", "stdout")), + reader: cmdStdout, + }, + { + writer: io.MultiWriter(os.Stderr, jsonwriter.NewJSONWriter(target, "ERROR", "stderr")), + reader: cmdStderr, + }, + } { + go func() { + defer wg.Done() + scanner := bufio.NewScanner(dest.reader) + for scanner.Scan() { + _, err := dest.writer.Write(append(scanner.Bytes(), '\n')) + if err != nil { + fmt.Fprintln(os.Stderr, err) + return + } + } + }() + } + wg.Wait() + + return nil +} diff --git a/test/helper/observability/prometheus.png b/test/helper/observability/prometheus.png new file mode 100644 index 0000000000..459fd198ef Binary files /dev/null and b/test/helper/observability/prometheus.png differ diff --git a/test/helper/observability/snapshot/snapshot.go b/test/helper/observability/snapshot/snapshot.go new file mode 100644 index 0000000000..6d096488c7 --- /dev/null +++ b/test/helper/observability/snapshot/snapshot.go @@ -0,0 +1,81 @@ +// Copyright 2025 MongoDB Inc +// +// 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 snapshot + +import ( + "context" + "fmt" + "io" + "net/url" + "os" + "strings" + "time" + + corev1 "k8s.io/api/core/v1" + "sigs.k8s.io/controller-runtime/pkg/client" + + kubecli "github.com/mongodb/mongodb-atlas-kubernetes/v2/test/helper/e2e/k8s" + "github.com/mongodb/mongodb-atlas-kubernetes/v2/test/helper/observability" +) + +func Snapshot(logger io.Writer) error { + kubeClient, err := kubecli.CreateNewClient() + if err != nil { + return fmt.Errorf("Failed to create client: %w", err) + } + + n := &corev1.Node{} + err = kubeClient.Get(context.Background(), client.ObjectKey{Name: "dos-control-plane"}, n) + if err != nil { + return fmt.Errorf("Failed to get dos-control-plane node: %w", err) + } + start := n.GetObjectMeta().GetCreationTimestamp() + now := time.Now() + + promLayout := "2006-01-02+15:04:05" + endString := strings.ReplaceAll(url.QueryEscape(now.UTC().Format(promLayout)), "%2B", "+") + durationString := fmt.Sprintf("%dm", int(now.Sub(start.Time).Minutes())) + promQuery := `http://localhost:30000/query?g0.expr=%7Bjob%3D%22ako%22%7D&g0.show_tree=0&g0.tab=graph&g0.end_input=` + endString + `&g0.range_input=` + durationString + `&g0.res_type=auto&g0.res_density=medium&g0.display_mode=lines&g0.show_exemplars=0` + parcaQuery := `http://localhost:30003/?step_count=113&query_browser_mode=advanced&expression_a=goroutine%3Agoroutine%3Acount%3Agoroutine%3Acount%7Bjob%3D%22ako%22%7D&time_selection_a=absolute:` + fmt.Sprintf("%d", start.UnixMilli()) + `-` + fmt.Sprintf("%d", now.UnixMilli()) + `&sum_by_a=__none__` + lokiQuery := `http://localhost:30001/explore?schemaVersion=1&panes=%7B%22ooz%22%3A%7B%22datasource%22%3A%22loki%22%2C%22queries%22%3A%5B%7B%22refId%22%3A%22A%22%2C%22expr%22%3A%22%7Bjob%3D%5C%22ako%5C%22%7D+%7C+json+%7C+line_format+%5C%22%7B%7B+.ts+%7D%7D+%5C%5C033%5B1%3B37m%7B%7B+.level+%7D%7D%5C%5C033%5B0m+%5C%5C033%5B1%3B32m%7B%7B+.logger+%7D%7D%5C%5C033%5B0m+%7B%7B+.msg+%7D%7D%5C%22%22%2C%22queryType%22%3A%22range%22%2C%22datasource%22%3A%7B%22type%22%3A%22loki%22%2C%22uid%22%3A%22loki%22%7D%2C%22editorMode%22%3A%22code%22%2C%22direction%22%3A%22backward%22%7D%5D%2C%22range%22%3A%7B%22from%22%3A%22` + fmt.Sprintf("%d", start.UnixMilli()) + `%22%2C%22to%22%3A%22` + fmt.Sprintf("%d", now.UnixMilli()) + `%22%7D%7D%7D&orgId=1` + + out := fmt.Sprintf(`Prometheus query: +%s + +Loki query: +%s + +Parca query: +%s +`, promQuery, lokiQuery, parcaQuery) + //nolint:gosec + err = os.WriteFile("urls.txt", []byte(out), 0644) + if err != nil { + return fmt.Errorf("failed to write to file: %w", err) + } + + for _, cmdArgs := range [][]string{ + // tell prometheus to take snapshot so WAL is flushed + {"curl", "-XPOST", "-v", `http://localhost:30000/api/v1/admin/tsdb/snapshot`}, + {"sh", "-c", `kubectl exec -n monitoring prometheus-kube-prometheus-kube-prome-prometheus-0 -- tar cvzf - -C /prometheus . >prometheus.tar.gz`}, + {"sh", "-c", `kubectl exec -n loki -c loki loki-0 -- tar cvzf - -C /var/loki . >loki.tar.gz`}, + {"sh", "-c", `kubectl exec -n parca deployment/parca -- tar cvzf - -C /var/lib/parca . >parca.tar.gz`}, + } { + if err := observability.ExecCommand(logger, cmdArgs...); err != nil { + return err + } + } + return nil +} diff --git a/test/int/integration_suite_test.go b/test/int/integration_suite_test.go index 90e4b93f45..84184c4c34 100644 --- a/test/int/integration_suite_test.go +++ b/test/int/integration_suite_test.go @@ -30,6 +30,7 @@ import ( "go.mongodb.org/atlas-sdk/v20231115008/admin" adminv20241113001 "go.mongodb.org/atlas-sdk/v20241113001/admin" "go.uber.org/zap" + "go.uber.org/zap/zapcore" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" utilruntime "k8s.io/apimachinery/pkg/util/runtime" @@ -44,6 +45,7 @@ import ( "github.com/mongodb/mongodb-atlas-kubernetes/v2/internal/controller/atlas" "github.com/mongodb/mongodb-atlas-kubernetes/v2/internal/operator" "github.com/mongodb/mongodb-atlas-kubernetes/v2/test/helper/control" + akoginkgo "github.com/mongodb/mongodb-atlas-kubernetes/v2/test/helper/observability/ginkgo" ) // These tests use Ginkgo (BDD-style Go testing framework). Refer to @@ -81,6 +83,7 @@ func TestAPIs(t *testing.T) { utilruntime.Must(scheme.AddToScheme(scheme.Scheme)) utilruntime.Must(akov2.AddToScheme(scheme.Scheme)) + akoginkgo.RegisterCallbacks() RegisterFailHandler(Fail) RunSpecs(t, "Atlas Operator Namespaced Integration Test Suite") } @@ -189,8 +192,16 @@ func prepareControllers(deletionProtection bool) (*corev1.Namespace, context.Can Expect(namespace.Name).ToNot(BeEmpty()) GinkgoWriter.Printf("Generated namespace %q\n", namespace.Name) - logger := ctrzap.NewRaw(ctrzap.UseDevMode(true), ctrzap.WriteTo(GinkgoWriter), ctrzap.StacktraceLevel(zap.ErrorLevel)) - ctrl.SetLogger(zapr.NewLogger(logger)) + rawLogger := ctrzap.NewRaw( + ctrzap.WriteTo(GinkgoWriter), + func(options *ctrzap.Options) { + options.TimeEncoder = func(t time.Time, e zapcore.PrimitiveArrayEncoder) { + zapcore.TimeEncoderOfLayout(time.RFC3339)(t.UTC(), e) + } + }, + ) + + ctrl.SetLogger(zapr.NewLogger(rawLogger)) // shallow copy global config managerCfg := *cfg @@ -198,7 +209,7 @@ func prepareControllers(deletionProtection bool) (*corev1.Namespace, context.Can mgr, err := operator.NewBuilder(operator.ManagerProviderFunc(ctrl.NewManager), scheme.Scheme, 5*time.Minute). WithConfig(&managerCfg). WithNamespaces(namespace.Name). - WithLogger(logger). + WithLogger(rawLogger). WithAtlasDomain(atlasDomain). WithSyncPeriod(30 * time.Minute). WithAPISecret(client.ObjectKey{Name: "atlas-operator-api-key", Namespace: namespace.Name}).