diff --git a/.circleci/config.yml b/.circleci/config.yml index 5bbeecedf5..d6fd087558 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -38,6 +38,7 @@ jobs: GO111MODULE: "on" - run: go test ./tsdb/ -test.tsdb-isolation=false - run: make -C documentation/examples/remote_storage + - run: make -C documentation/examples - prometheus/check_proto: version: "3.15.8" - prometheus/store_artifact: diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 8ee3cce791..0000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve. -title: '' -assignees: '' ---- - - - -**What did you do?** - -**What did you expect to see?** - -**What did you see instead? Under which circumstances?** - -**Environment** - -* System information: - - insert output of `uname -srm` here - -* Prometheus version: - - insert output of `prometheus --version` here - -* Alertmanager version: - - insert output of `alertmanager --version` here (if relevant to the issue) - -* Prometheus configuration file: -``` -insert configuration here -``` - -* Alertmanager configuration file: -``` -insert configuration here (if relevant to the issue) -``` - - -* Logs: -``` -insert Prometheus and Alertmanager logs relevant to the issue here -``` diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000000..90773a63ef --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,74 @@ +--- +name: Bug report +description: Create a report to help us improve. +body: + - type: markdown + attributes: + value: | + Thank you for opening a bug report for Prometheus. + + Please do *NOT* ask support questions in Github issues. + + If your issue is not a feature request or bug report use our [community support](https://prometheus.io/community/). + + There is also [commercial support](https://prometheus.io/support-training/) available. + - type: textarea + attributes: + label: What did you do? + description: Please provide steps for us to reproduce this issue. + validations: + required: true + - type: textarea + attributes: + label: What did you expect to see? + - type: textarea + attributes: + label: What did you see instead? Under which circumstances? + validations: + required: true + - type: markdown + attributes: + value: | + ## Environment + - type: input + attributes: + label: System information + description: insert output of `uname -srm` here, or operating system version + placeholder: e.g. Linux 5.16.15 x86_64 + - type: textarea + attributes: + label: Prometheus version + description: Insert output of `prometheus --version` here. + render: text + placeholder: | + e.g. prometheus, version 2.23.0 (branch: HEAD, revision: 26d89b4b0776fe4cd5a3656dfa520f119a375273) + build user: root@37609b3a0a21 + build date: 20201126-10:56:17 + go version: go1.15.5 + platform: linux/amd64 + - type: textarea + attributes: + label: Prometheus configuration file + description: Insert relevant configuration here. Don't forget to remove secrets. + render: yaml + - type: textarea + attributes: + label: Alertmanager version + description: Insert output of `alertmanager --version` here (if relevant to the issue). + render: text + placeholder: | + e.g. alertmanager, version 0.22.2 (branch: HEAD, revision: 44f8adc06af5101ad64bd8b9c8b18273f2922051) + build user: root@b595c7f32520 + build date: 20210602-07:50:37 + go version: go1.16.4 + platform: linux/amd64 + - type: textarea + attributes: + label: Alertmanager configuration file + description: Insert relevant configuration here. Don't forget to remove secrets. + render: yaml + - type: textarea + attributes: + label: Logs + description: Insert Prometheus and Alertmanager logs relevant to the issue here. + render: text diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ce621be9c6..4c4b4a5fba 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,6 +4,10 @@ updates: directory: "/" schedule: interval: "monthly" + - package-ecosystem: "gomod" + directory: "/documentation/examples/remote_storage" + schedule: + interval: "monthly" - package-ecosystem: "npm" directory: "/web/ui" schedule: diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml index 662ea3b6ee..6034bcbf8b 100644 --- a/.github/workflows/golangci-lint.yml +++ b/.github/workflows/golangci-lint.yml @@ -21,7 +21,10 @@ jobs: uses: actions/setup-go@v2 with: go-version: 1.18.x + - name: Install snmp_exporter/generator dependencies + run: sudo apt-get update && sudo apt-get -y install libsnmp-dev + if: github.repository == 'prometheus/snmp_exporter' - name: Lint - uses: golangci/golangci-lint-action@v3.1.0 + uses: golangci/golangci-lint-action@v3.2.0 with: version: v1.45.2 diff --git a/.golangci.yml b/.golangci.yml index 400924ab9a..81790e6e3a 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -16,6 +16,7 @@ linters: - misspell issues: + max-same-issues: 0 exclude-rules: - path: _test.go linters: @@ -29,6 +30,7 @@ linters-settings: - sync/atomic: "Use go.uber.org/atomic instead of sync/atomic" - github.com/stretchr/testify/assert: "Use github.com/stretchr/testify/require instead of github.com/stretchr/testify/assert" - github.com/go-kit/kit/log: "Use github.com/go-kit/log instead of github.com/go-kit/kit/log" + - io/ioutil: "Use corresponding 'os' or 'io' functions instead." - regexp: "Use github.com/grafana/regexp instead of regexp" errcheck: exclude: scripts/errcheck_excludes.txt diff --git a/.yamllint b/.yamllint index 281c946463..3878a31d30 100644 --- a/.yamllint +++ b/.yamllint @@ -14,6 +14,7 @@ rules: document-start: disable indentation: spaces: consistent + indent-sequences: consistent key-duplicates: ignore: | config/testdata/section_key_dup.bad.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index ca8f961c43..fd107d12fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,28 +1,49 @@ -## 2.35.0-rc1 / 2022-04-14 +# Changelog -* [ENHANCEMENT] Update package `uber.go/auomaxprocs` to support `cgroups2` #10584 -* [BUGFIX] Tracing/GRPC: Set TLS credentials only when insecure is false. #10592 -* [BUGFIX] Agent: Fix ID collision when loading a WAL with multiple segments. #10587 -* [BUGFIX] Revoke storing target and metadata cache in context. This can fix a memory link introduced in `2.35.0-rc0` #10590 +## 2.36.0 / 2022-05-30 -## 2.35.0-rc0 / 2022-04-08 +* [FEATURE] Add lowercase and uppercase relabel action. #10641 +* [FEATURE] SD: Add IONOS Cloud integration. #10514 +* [FEATURE] SD: Add Vultr integration. #10714 +* [FEATURE] SD: Add Linode SD failure count metric. #10673 +* [FEATURE] Add prometheus_ready metric. #10682 +* [ENHANCEMENT] Add stripDomain to template function. #10475 +* [ENHANCEMENT] UI: Enable active search through dropped targets. #10668 +* [ENHANCEMENT] promtool: support matchers when querying label values. #10727 +* [ENHANCEMENT] Add agent mode identifier. #9638 +* [BUGFIX] Changing TotalQueryableSamples from int to int64. #10549 +* [BUGFIX] tsdb/agent: Ignore duplicate exemplars. #10595 +* [BUGFIX] TSDB: Fix chunk overflow appending samples at a variable rate. #10607 +* [BUGFIX] Stop rule manager before TSDB is stopped. #10680 + +## 2.35.0 / 2022-04-21 + +This Prometheus release is built with go1.18, which contains two noticeable changes related to TLS: + +1. [TLS 1.0 and 1.1 disabled by default client-side](https://go.dev/doc/go1.18#tls10). +Prometheus users can override this with the `min_version` parameter of [tls_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#tls_config). +2. [Certificates signed with the SHA-1 hash function are rejected](https://go.dev/doc/go1.18#sha1). This doesn't apply to self-signed root certificates. * [CHANGE] TSDB: Delete `*.tmp` WAL files when Prometheus starts. #10317 * [CHANGE] promtool: Add new flag `--lint` (enabled by default) for the commands `check rules` and `check config`, resulting in a new exit code (`3`) for linter errors. #10435 -* [FEATURE] Support for automatically setting the variable `GOMAXPROCS` to the container CPU limit. Enable with the flag `--enable-feature=auto-gomaxprocs` #10498 -* [FEATURE] PromQL: Extend statistics with total and peak number of samples in a query. Additionally, per-step statistics are available with --enable-feature=promql-per-step-stats and using `stats=all` in the query API. -Enable with the flag `--enable-feature=per-step-stats` #10369 +* [FEATURE] Support for automatically setting the variable `GOMAXPROCS` to the container CPU limit. Enable with the flag `--enable-feature=auto-gomaxprocs`. #10498 +* [FEATURE] PromQL: Extend statistics with total and peak number of samples in a query. Additionally, per-step statistics are available with --enable-feature=promql-per-step-stats and using `stats=all` in the query API. +Enable with the flag `--enable-feature=per-step-stats`. #10369 * [ENHANCEMENT] Prometheus is built with Go 1.18. #10501 * [ENHANCEMENT] TSDB: more efficient sorting of postings read from WAL at startup. #10500 -* [ENHANCEMENT] Azure SD: Add metric to track Azure SD failures #10476 +* [ENHANCEMENT] Azure SD: Add metric to track Azure SD failures. #10476 * [ENHANCEMENT] Azure SD: Add an optional `resource_group` configuration. #10365 * [ENHANCEMENT] Kubernetes SD: Support `discovery.k8s.io/v1` `EndpointSlice` (previously only `discovery.k8s.io/v1beta1` `EndpointSlice` was supported). #9570 * [ENHANCEMENT] Kubernetes SD: Allow attaching node metadata to discovered pods. #10080 * [ENHANCEMENT] OAuth2: Support for using a proxy URL to fetch OAuth2 tokens. #10492 * [ENHANCEMENT] Configuration: Add the ability to disable HTTP2. #10492 +* [ENHANCEMENT] Config: Support overriding minimum TLS version. #10610 * [BUGFIX] Kubernetes SD: Explicitly include gcp auth from k8s.io. #10516 * [BUGFIX] Fix OpenMetrics parser to sort uppercase labels correctly. #10510 * [BUGFIX] UI: Fix scrape interval and duration tooltip not showing on target page. #10545 +* [BUGFIX] Tracing/GRPC: Set TLS credentials only when insecure is false. #10592 +* [BUGFIX] Agent: Fix ID collision when loading a WAL with multiple segments. #10587 +* [BUGFIX] Remote-write: Fix a deadlock between Batch and flushing the queue. #10608 ## 2.34.0 / 2022-03-15 @@ -38,7 +59,7 @@ Enable with the flag `--enable-feature=per-step-stats` #10369 * [ENHANCEMENT] UI: Optimize the alerts page and add a search bar. #10142 * [ENHANCEMENT] UI: Improve graph colors that were hard to see. #10179 * [ENHANCEMENT] Config: Allow escaping of `$` with `$$` when using environment variables with external labels. #10129 -* [BUGFIX] PromQL: Properly return an error from histogram_quantile when metrics have the same labelset. #10140 +* [BUGFIX] PromQL: Properly return an error from histogram_quantile when metrics have the same labelset. #10140 * [BUGFIX] UI: Fix bug that sets the range input to the resolution. #10227 * [BUGFIX] TSDB: Fix a query panic when `memory-snapshot-on-shutdown` is enabled. #10348 * [BUGFIX] Parser: Specify type in metadata parser errors. #10269 @@ -357,7 +378,7 @@ Alertmanager API v2 was released in Alertmanager v0.16.0 (released in January 2019). * [FEATURE] **experimental** API: Accept remote_write requests. Behind the --enable-feature=remote-write-receiver flag. #8424 -* [FEATURE] **experimental** PromQL: Add '@ ' modifier. Behind the --enable-feature=promql-at-modifier flag. #8121 #8436 #8425 +* [FEATURE] **experimental** PromQL: Add `@ ` modifier. Behind the --enable-feature=promql-at-modifier flag. #8121 #8436 #8425 * [ENHANCEMENT] Add optional name property to testgroup for better test failure output. #8440 * [ENHANCEMENT] Add warnings into React Panel on the Graph page. #8427 * [ENHANCEMENT] TSDB: Increase the number of buckets for the compaction duration metric. #8342 @@ -402,12 +423,12 @@ Alertmanager API v2 was released in Alertmanager v0.16.0 (released in January * [CHANGE] UI: Make the React UI default. #8142 * [CHANGE] Remote write: The following metrics were removed/renamed in remote write. #6815 - - `prometheus_remote_storage_succeeded_samples_total` was removed and `prometheus_remote_storage_samples_total` was introduced for all the samples attempted to send. - - `prometheus_remote_storage_sent_bytes_total` was removed and replaced with `prometheus_remote_storage_samples_bytes_total` and `prometheus_remote_storage_metadata_bytes_total`. - - `prometheus_remote_storage_failed_samples_total` -> `prometheus_remote_storage_samples_failed_total` . - - `prometheus_remote_storage_retried_samples_total` -> `prometheus_remote_storage_samples_retried_total`. - - `prometheus_remote_storage_dropped_samples_total` -> `prometheus_remote_storage_samples_dropped_total`. - - `prometheus_remote_storage_pending_samples` -> `prometheus_remote_storage_samples_pending`. + * `prometheus_remote_storage_succeeded_samples_total` was removed and `prometheus_remote_storage_samples_total` was introduced for all the samples attempted to send. + * `prometheus_remote_storage_sent_bytes_total` was removed and replaced with `prometheus_remote_storage_samples_bytes_total` and `prometheus_remote_storage_metadata_bytes_total`. + * `prometheus_remote_storage_failed_samples_total` -> `prometheus_remote_storage_samples_failed_total` . + * `prometheus_remote_storage_retried_samples_total` -> `prometheus_remote_storage_samples_retried_total`. + * `prometheus_remote_storage_dropped_samples_total` -> `prometheus_remote_storage_samples_dropped_total`. + * `prometheus_remote_storage_pending_samples` -> `prometheus_remote_storage_samples_pending`. * [CHANGE] Remote: Do not collect non-initialized timestamp metrics. #8060 * [FEATURE] [EXPERIMENTAL] Remote write: Allow metric metadata to be propagated via remote write. The following new metrics were introduced: `prometheus_remote_storage_metadata_total`, `prometheus_remote_storage_metadata_failed_total`, `prometheus_remote_storage_metadata_retried_total`, `prometheus_remote_storage_metadata_bytes_total`. #6815 * [ENHANCEMENT] Remote write: Added a metric `prometheus_remote_storage_max_samples_per_send` for remote write. #8102 @@ -583,7 +604,6 @@ This release changes WAL compression from opt-in to default. WAL compression wil * [BUGFIX] Remote Write: Fixed blocked resharding edge case. #7122 * [BUGFIX] Remote Write: Fixed remote write not updating on relabel configs change. #7073 - ## 2.17.2 / 2020-04-20 * [BUGFIX] Federation: Register federation metrics #7081 @@ -999,10 +1019,10 @@ We're rolling back the Dockerfile changes introduced in 2.6.0. If you made chang ## 2.4.2 / 2018-09-21 - The last release didn't have bugfix included due to a vendoring error. +The last release didn't have bugfix included due to a vendoring error. - * [BUGFIX] Handle WAL corruptions properly prometheus/tsdb#389 - * [BUGFIX] Handle WAL migrations correctly on Windows prometheus/tsdb#392 +* [BUGFIX] Handle WAL corruptions properly prometheus/tsdb#389 +* [BUGFIX] Handle WAL migrations correctly on Windows prometheus/tsdb#392 ## 2.4.1 / 2018-09-19 @@ -1149,15 +1169,14 @@ This release includes multiple bugfixes and features. Further, the WAL implement * [BUGFIX] tsdb: Cleanup and do not retry failing compactions. * [BUGFIX] tsdb: Close WAL while shutting down. - ## 2.0.0 / 2017-11-08 This release includes a completely rewritten storage, huge performance improvements, but also many backwards incompatible changes. For more information, read the announcement blog post and migration guide. -https://prometheus.io/blog/2017/11/08/announcing-prometheus-2-0/ -https://prometheus.io/docs/prometheus/2.0/migration/ + + * [CHANGE] Completely rewritten storage layer, with WAL. This is not backwards compatible with 1.x storage, and many flags have changed/disappeared. * [CHANGE] New staleness behavior. Series now marked stale after target scrapes no longer return them, and soon after targets disappear from service discovery. @@ -1567,7 +1586,7 @@ This release contains multiple breaking changes to the configuration schema. This version contains a breaking change to the query language. Please read the documentation on the grouping behavior of vector matching: -https://prometheus.io/docs/querying/operators/#vector-matching + * [FEATURE] Add experimental Microsoft Azure service discovery * [FEATURE] Add `ignoring` modifier for binary operations @@ -1693,7 +1712,7 @@ BREAKING CHANGES: with InfluxDB 0.9.x. 0.8.x versions of InfluxDB are not supported anymore. * Escape sequences in double- and single-quoted string literals in rules or query expressions are now interpreted like escape sequences in Go string literals - (https://golang.org/ref/spec#String_literals). + (). Future breaking changes / deprecated features: @@ -1829,6 +1848,7 @@ All changes: * [CLEANUP] Resolve relative paths during configuration loading. ## 0.15.1 / 2015-07-27 + * [BUGFIX] Fix vector matching behavior when there is a mix of equality and non-equality matchers in a vector selector and one matcher matches no series. * [ENHANCEMENT] Allow overriding `GOARCH` and `GOOS` in Makefile.INCLUDE. @@ -1946,6 +1966,7 @@ All changes: * [CLEANUP] Use new v1 HTTP API for querying and graphing. ## 0.14.0 / 2015-06-01 + * [CHANGE] Configuration format changed and switched to YAML. (See the provided [migration tool](https://github.com/prometheus/migrate/releases).) * [ENHANCEMENT] Redesign of state-preserving target discovery. @@ -1971,9 +1992,11 @@ All changes: * [ENHANCEMENT] Limit retrievable samples to the storage's retention window. ## 0.13.4 / 2015-05-23 + * [BUGFIX] Fix a race while checkpointing fingerprint mappings. ## 0.13.3 / 2015-05-11 + * [BUGFIX] Handle fingerprint collisions properly. * [CHANGE] Comments in rules file must start with `#`. (The undocumented `//` and `/*...*/` comment styles are no longer supported.) @@ -1984,6 +2007,7 @@ All changes: * [ENHANCEMENT] Terminate running queries during shutdown. ## 0.13.2 / 2015-05-05 + * [MAINTENANCE] Updated vendored dependencies to their newest versions. * [MAINTENANCE] Include rule_checker and console templates in release tarball. * [BUGFIX] Sort NaN as the lowest value. @@ -1994,10 +2018,12 @@ All changes: * [BUGFIX] Show correct error on wrong DNS response. ## 0.13.1 / 2015-04-09 + * [BUGFIX] Treat memory series with zero chunks correctly in series maintenance. * [ENHANCEMENT] Improve readability of usage text even more. ## 0.13.0 / 2015-04-08 + * [ENHANCEMENT] Double-delta encoding for chunks, saving typically 40% of space, both in RAM and on disk. * [ENHANCEMENT] Redesign of chunk persistence queuing, increasing performance @@ -2025,6 +2051,7 @@ All changes: * [MAINTENANCE] Updated vendored dependencies to their newest versions. ## 0.12.0 / 2015-03-04 + * [CHANGE] Use client_golang v0.3.1. THIS CHANGES FINGERPRINTING AND INVALIDATES ALL PERSISTED FINGERPRINTS. You have to wipe your storage to use this or later versions. There is a version guard in place that will prevent you to @@ -2040,6 +2067,7 @@ All changes: * [CHANGE] Makefile uses Go 1.4.2. ## 0.11.1 / 2015-02-27 + * [BUGFIX] Make series maintenance complete again. (Ever since 0.9.0rc4, or commit 0851945, series would not be archived, chunk descriptors would not be evicted, and stale head chunks would never be closed. This happened @@ -2052,6 +2080,7 @@ All changes: * [ENHANCEMENT] Limit the number of 'dirty' series counted during checkpointing. ## 0.11.0 / 2015-02-23 + * [FEATURE] Introduce new metric type Histogram with server-side aggregation. * [FEATURE] Add offset operator. * [FEATURE] Add floor, ceil and round functions. @@ -2076,18 +2105,20 @@ All changes: * [CLEANUP] Various code cleanups. ## 0.10.0 / 2015-01-26 + * [CHANGE] More efficient JSON result format in query API. This requires up-to-date versions of PromDash and prometheus_cli, too. * [ENHANCEMENT] Excluded non-minified Bootstrap assets and the Bootstrap maps from embedding into the binary. Those files are only used for debugging, and then you can use -web.use-local-assets. By including fewer files, the RAM usage during compilation is much more manageable. -* [ENHANCEMENT] Help link points to https://prometheus.github.io now. +* [ENHANCEMENT] Help link points to now. * [FEATURE] Consoles for haproxy and cloudwatch. * [BUGFIX] Several fixes to graphs in consoles. * [CLEANUP] Removed a file size check that did not check anything. ## 0.9.0 / 2015-01-23 + * [CHANGE] Reworked command line flags, now more consistent and taking into account needs of the new storage backend (see below). * [CHANGE] Metric names are dropped after certain transformations. @@ -2129,10 +2160,12 @@ All changes: * [CLEANUP] Removed dead code. ## 0.8.0 / 2014-09-04 + * [ENHANCEMENT] Stagger scrapes to spread out load. * [BUGFIX] Correctly quote HTTP Accept header. ## 0.7.0 / 2014-08-06 + * [FEATURE] Added new functions: abs(), topk(), bottomk(), drop_common_labels(). * [FEATURE] Let console templates get graph links from expressions. * [FEATURE] Allow console templates to dynamically include other templates. @@ -2147,6 +2180,7 @@ All changes: * [ENHANCEMENT] Dockerfile also builds Prometheus support tools now. ## 0.6.0 / 2014-06-30 + * [FEATURE] Added console and alert templates support, along with various template functions. * [PERFORMANCE] Much faster and more memory-efficient flushing to disk. * [ENHANCEMENT] Query results are now only logged when debugging. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 9a1aff4127..d325872bdf 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,3 +1,3 @@ -## Prometheus Community Code of Conduct +# Prometheus Community Code of Conduct -Prometheus follows the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/master/code-of-conduct.md). +Prometheus follows the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/main/code-of-conduct.md). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1b61c5de0c..844f8e09fc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -21,7 +21,6 @@ Prometheus uses GitHub to manage reviews of pull requests. * Be sure to sign off on the [DCO](https://github.com/probot/dco#how-it-works). - ## Steps to Contribute Should you wish to work on an issue, please claim it first by commenting on the GitHub issue that you want to work on it. This is to prevent duplicated efforts from contributors on the same issue. @@ -33,7 +32,8 @@ You can [spin up a prebuilt dev environment](https://gitpod.io/#https://github.c For complete instructions on how to compile see: [Building From Source](https://github.com/prometheus/prometheus#building-from-source) For quickly compiling and testing your changes do: -``` + +```bash # For building. go build ./cmd/prometheus/ ./prometheus diff --git a/MAINTAINERS.md b/MAINTAINERS.md index f45fa6b346..103ebdda64 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -1,7 +1,9 @@ +# Maintainers + Julien Pivotto ( / @roidelapluie) and Levi Harrison ( / @LeviHarrison) are the main/default maintainers, some parts of the codebase have other maintainers: * `cmd` - * `promtool`: David Leadbeater ( / @dgl), Jessica Grebenschikov ( / @jessicagreben) + * `promtool`: David Leadbeater ( / @dgl) * `discovery` * `k8s`: Frederic Branczyk ( / @brancz) * `documentation` diff --git a/README.md b/README.md index a0dbef6375..3a1784f629 100644 --- a/README.md +++ b/README.md @@ -17,18 +17,18 @@ displays the results, and can trigger alerts when specified conditions are obser The features that distinguish Prometheus from other metrics and monitoring systems are: -- A **multi-dimensional** data model (time series defined by metric name and set of key/value dimensions) -- PromQL, a **powerful and flexible query language** to leverage this dimensionality -- No dependency on distributed storage; **single server nodes are autonomous** -- An HTTP **pull model** for time series collection -- **Pushing time series** is supported via an intermediary gateway for batch jobs -- Targets are discovered via **service discovery** or **static configuration** -- Multiple modes of **graphing and dashboarding support** -- Support for hierarchical and horizontal **federation** +* A **multi-dimensional** data model (time series defined by metric name and set of key/value dimensions) +* PromQL, a **powerful and flexible query language** to leverage this dimensionality +* No dependency on distributed storage; **single server nodes are autonomous** +* An HTTP **pull model** for time series collection +* **Pushing time series** is supported via an intermediary gateway for batch jobs +* Targets are discovered via **service discovery** or **static configuration** +* Multiple modes of **graphing and dashboarding support** +* Support for hierarchical and horizontal **federation** ## Architecture overview -![](https://cdn.jsdelivr.net/gh/prometheus/prometheus@c34257d069c630685da35bcef084632ffd5d6209/documentation/images/architecture.svg) +![Architecture overview](https://cdn.jsdelivr.net/gh/prometheus/prometheus@c34257d069c630685da35bcef084632ffd5d6209/documentation/images/architecture.svg) ## Install @@ -49,49 +49,56 @@ Docker images are available on [Quay.io](https://quay.io/repository/prometheus/p You can launch a Prometheus container for trying it out with - $ docker run --name prometheus -d -p 127.0.0.1:9090:9090 prom/prometheus +```bash +docker run --name prometheus -d -p 127.0.0.1:9090:9090 prom/prometheus +``` -Prometheus will now be reachable at http://localhost:9090/. +Prometheus will now be reachable at . ### Building from source To build Prometheus from source code, You need: -* Go [version 1.16 or greater](https://golang.org/doc/install). + +* Go [version 1.17 or greater](https://golang.org/doc/install). * NodeJS [version 16 or greater](https://nodejs.org/). * npm [version 7 or greater](https://www.npmjs.com/). You can directly use the `go` tool to download and install the `prometheus` and `promtool` binaries into your `GOPATH`: - $ GO111MODULE=on go install github.com/prometheus/prometheus/cmd/... - $ prometheus --config.file=your_config.yml +```bash +GO111MODULE=on go install github.com/prometheus/prometheus/cmd/... +prometheus --config.file=your_config.yml +``` *However*, when using `go install` to build Prometheus, Prometheus will expect to be able to read its web assets from local filesystem directories under `web/ui/static` and `web/ui/templates`. In order for these assets to be found, you will have to run Prometheus from the root of the cloned repository. Note also that these directories do not include the -new experimental React UI unless it has been built explicitly using `make assets` or `make build`. +React UI unless it has been built explicitly using `make assets` or `make build`. An example of the above configuration file can be found [here.](https://github.com/prometheus/prometheus/blob/main/documentation/examples/prometheus.yml) You can also clone the repository yourself and build using `make build`, which will compile in the web assets so that Prometheus can be run from anywhere: - $ mkdir -p $GOPATH/src/github.com/prometheus - $ cd $GOPATH/src/github.com/prometheus - $ git clone https://github.com/prometheus/prometheus.git - $ cd prometheus - $ make build - $ ./prometheus --config.file=your_config.yml +```bash +mkdir -p $GOPATH/src/github.com/prometheus +cd $GOPATH/src/github.com/prometheus +git clone https://github.com/prometheus/prometheus.git +cd prometheus +make build +./prometheus --config.file=your_config.yml +``` The Makefile provides several targets: - * *build*: build the `prometheus` and `promtool` binaries (includes building and compiling in web assets) - * *test*: run the tests - * *test-short*: run the short tests - * *format*: format the source code - * *vet*: check the source code for common errors - * *assets*: build the new experimental React UI +* *build*: build the `prometheus` and `promtool` binaries (includes building and compiling in web assets) +* *test*: run the tests +* *test-short*: run the short tests +* *format*: format the source code +* *vet*: check the source code for common errors +* *assets*: build the React UI ### Service discovery plugins @@ -115,10 +122,12 @@ always, be extra careful when loading third party code. The `make docker` target is designed for use in our CI system. You can build a docker image locally with the following commands: - $ make promu - $ promu crossbuild -p linux/amd64 - $ make npm_licenses - $ make common-docker-amd64 +```bash +make promu +promu crossbuild -p linux/amd64 +make npm_licenses +make common-docker-amd64 +``` *NB* if you are on a Mac, you will need [gnu-tar](https://formulae.brew.sh/formula/gnu-tar). @@ -132,7 +141,7 @@ We are publishing our Remote Write protobuf independently at You can use that as a library: ```shell -$ go get go.buf.build/protocolbuffers/go/prometheus/prometheus +go get go.buf.build/protocolbuffers/go/prometheus/prometheus ``` This is experimental. @@ -145,8 +154,8 @@ Prometheus v2.y.z releases, we are publishing equivalent v0.y.z tags. Therefore, a user that would want to use Prometheus v2.35.0 as a library could do: -``` -$ go get github.com/prometheus/prometheus@v0.35.0 +```shell +go get github.com/prometheus/prometheus@v0.35.0 ``` This solution makes it clear that we might break our internal Go APIs between @@ -155,13 +164,13 @@ zero](https://semver.org/#spec-item-4). ## React UI Development -For more information on building, running, and developing on the new React-based UI, see the React app's [README.md](web/ui/README.md). +For more information on building, running, and developing on the React-based UI, see the React app's [README.md](web/ui/README.md). ## More information - * The source code is periodically indexed, but due to an issue with versioning, the "latest" docs shown on Godoc are outdated. Instead, you can use [the docs for v2.31.1](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab). - * You will find a CircleCI configuration in [`.circleci/config.yml`](.circleci/config.yml). - * See the [Community page](https://prometheus.io/community) for how to reach the Prometheus developers and users on various communication channels. +* Godoc documentation is available via [pkg.go.dev](https://pkg.go.dev/github.com/prometheus/prometheus). Due to peculiarities of Go Modules, v2.x.y will be displayed as v0.x.y. +* You will find a CircleCI configuration in [`.circleci/config.yml`](.circleci/config.yml). +* See the [Community page](https://prometheus.io/community) for how to reach the Prometheus developers and users on various communication channels. ## Contributing @@ -171,7 +180,6 @@ Refer to [CONTRIBUTING.md](https://github.com/prometheus/prometheus/blob/main/CO Apache License 2.0, see [LICENSE](https://github.com/prometheus/prometheus/blob/main/LICENSE). - [hub]: https://hub.docker.com/r/prom/prometheus/ [circleci]: https://circleci.com/gh/prometheus/prometheus [quay]: https://quay.io/repository/prometheus/prometheus diff --git a/RELEASE.md b/RELEASE.md index 65da3c0c3a..077dabe476 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -41,7 +41,9 @@ Release cadence of first pre-releases being cut is 6 weeks. | v2.34 | 2022-02-23 | Chris Marchbanks (GitHub: @csmarchbanks) | | v2.35 | 2022-04-06 | Augustin Husson (GitHub: @nexucis) | | v2.36 | 2022-05-18 | Matthias Loibl (GitHub: @metalmatze) | -| v2.37 | 2022-06-29 | **searching for volunteer** | +| v2.37 LTS | 2022-06-29 | Julien Pivotto (GitHub: @roidelapluie) | +| v2.38 | 2022-08-10 | **searching for volunteer** | +| v2.39 | 2022-09-21 | **searching for volunteer** | If you are interested in volunteering please create a pull request against the [prometheus/prometheus](https://github.com/prometheus/prometheus) repository and propose yourself for the release series of your choice. @@ -78,7 +80,10 @@ Maintaining the release branches for older minor releases happens on a best effo A few days before a major or minor release, consider updating the dependencies. -Then create a pull request against the main branch. +Note that we use [Dependabot](.github/dependabot.yml) to continuously update most things automatically. Therefore, most dependencies should be up to date. +Check the [dependencies GitHub label](https://github.com/prometheus/prometheus/labels/dependencies) to see if there are any pending updates. + +This bot currently does not manage `+incompatible` and `v0.0.0` in the version specifier for Go modules. Note that after a dependency update, you should look out for any weirdness that might have happened. Such weirdnesses include but are not limited to: flaky @@ -93,15 +98,17 @@ This is also a good time to consider any experimental features and feature flags for promotion to stable or for deprecation or ultimately removal. Do any of these in pull requests, one per feature. -#### Updating Go dependencies +#### Manually updating Go dependencies -``` +This is usually only needed for `+incompatible` and `v0.0.0` non-semver updates. + +```bash make update-go-deps git add go.mod go.sum git commit -m "Update dependencies" ``` -#### Updating React dependencies +#### Manually updating React dependencies The React application recently moved to a monorepo system with multiple internal npm packages. Dependency upgrades are quite sensitive for the time being. @@ -112,10 +119,10 @@ In case you want to update the UI dependencies, you can run the following comman make update-npm-deps ``` -Once this step completes, please verify that no additional `node_modules` directory was created in any of the module subdirectories +Once this step completes, please verify that no additional `node_modules` directory was created in any of the module subdirectories (which could indicate conflicting dependency versions across modules). Then run `make ui-build` to verify that the build is still working. -Note: Once in a while, the npm dependencies should also be updated to their latest release versions (major or minor) with `make upgrade-npm-deps`, +Note: Once in a while, the npm dependencies should also be updated to their latest release versions (major or minor) with `make upgrade-npm-deps`, though this may be done at convenient times (e.g. by the UI maintainers) that are out-of-sync with Prometheus releases. ### 1. Prepare your release @@ -142,9 +149,9 @@ Entries in the `CHANGELOG.md` are meant to be in this order: Tag the new release via the following commands: ```bash -$ tag="v$(< VERSION)" -$ git tag -s "${tag}" -m "${tag}" -$ git push origin "${tag}" +tag="v$(< VERSION)" +git tag -s "${tag}" -m "${tag}" +git push origin "${tag}" ``` Go modules versioning requires strict use of semver. Because we do not commit to @@ -154,9 +161,9 @@ the Prometheus server, we use major version zero releases for the libraries. Tag the new library release via the following commands: ```bash -$ tag="v$(sed s/2/0/ < VERSION)" -$ git tag -s "${tag}" -m "${tag}" -$ git push origin "${tag}" +tag="v$(sed s/2/0/ < VERSION)" +git tag -s "${tag}" -m "${tag}" +git push origin "${tag}" ``` Optionally, you can use this handy `.gitconfig` alias. diff --git a/SECURITY.md b/SECURITY.md index 67741f015a..fed02d85c7 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -3,4 +3,4 @@ The Prometheus security policy, including how to report vulnerabilities, can be found here: -https://prometheus.io/docs/operating/security/ + diff --git a/VERSION b/VERSION index 925692b07c..3a05135cd8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.35.0-rc1 +2.36.0 diff --git a/cmd/prometheus/main.go b/cmd/prometheus/main.go index c0848c766a..cacefbb200 100644 --- a/cmd/prometheus/main.go +++ b/cmd/prometheus/main.go @@ -16,6 +16,7 @@ package main import ( "context" + "errors" "fmt" "math" "math/bits" @@ -38,7 +39,6 @@ import ( "github.com/grafana/regexp" conntrack "github.com/mwitkow/go-conntrack" "github.com/oklog/run" - "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/model" "github.com/prometheus/common/promlog" @@ -387,6 +387,9 @@ func main() { serverOnlyFlag(a, "query.max-samples", "Maximum number of samples a single query can load into memory. Note that queries will fail if they try to load more samples than this into memory, so this also limits the number of samples a query can return."). Default("50000000").IntVar(&cfg.queryMaxSamples) + a.Flag("scrape.discovery-reload-interval", "Interval used by scrape manager to throttle target groups updates."). + Hidden().Default("5s").SetValue(&cfg.scrape.DiscoveryReloadInterval) + a.Flag("enable-feature", "Comma separated feature names to enable. Valid options: agent, exemplar-storage, expand-external-labels, memory-snapshot-on-shutdown, promql-at-modifier, promql-negative-offset, promql-per-step-stats, remote-write-receiver (DEPRECATED), extra-scrape-metrics, new-service-discovery-manager, auto-gomaxprocs. See https://prometheus.io/docs/prometheus/latest/feature_flags/ for more details."). Default("").StringsVar(&cfg.featureList) @@ -394,7 +397,7 @@ func main() { _, err := a.Parse(os.Args[1:]) if err != nil { - fmt.Fprintln(os.Stderr, errors.Wrapf(err, "Error parsing commandline arguments")) + fmt.Fprintln(os.Stderr, fmt.Errorf("Error parsing commandline arguments: %w", err)) a.Usage(os.Args[1:]) os.Exit(2) } @@ -402,7 +405,7 @@ func main() { logger := promlog.New(&cfg.promlogConfig) if err := cfg.setFeatureListOptions(logger); err != nil { - fmt.Fprintln(os.Stderr, errors.Wrapf(err, "Error parsing feature list")) + fmt.Fprintln(os.Stderr, fmt.Errorf("Error parsing feature list: %w", err)) os.Exit(1) } @@ -423,13 +426,13 @@ func main() { cfg.web.ExternalURL, err = computeExternalURL(cfg.prometheusURL, cfg.web.ListenAddress) if err != nil { - fmt.Fprintln(os.Stderr, errors.Wrapf(err, "parse external URL %q", cfg.prometheusURL)) + fmt.Fprintln(os.Stderr, fmt.Errorf("parse external URL %q: %w", cfg.prometheusURL, err)) os.Exit(2) } cfg.web.CORSOrigin, err = compileCORSRegexString(cfg.corsRegexString) if err != nil { - fmt.Fprintln(os.Stderr, errors.Wrapf(err, "could not compile CORS regex string %q", cfg.corsRegexString)) + fmt.Fprintln(os.Stderr, fmt.Errorf("could not compile CORS regex string %q: %w", cfg.corsRegexString, err)) os.Exit(2) } @@ -522,7 +525,14 @@ func main() { klogv2.ClampLevel(6) klogv2.SetLogger(log.With(logger, "component", "k8s_client_runtime")) - level.Info(logger).Log("msg", "Starting Prometheus", "version", version.Info()) + modeAppName := "Prometheus Server" + mode := "server" + if agentMode { + modeAppName = "Prometheus Agent" + mode = "agent" + } + + level.Info(logger).Log("msg", "Starting "+modeAppName, "mode", mode, "version", version.Info()) if bits.UintSize < 64 { level.Warn(logger).Log("msg", "This Prometheus binary has not been compiled for a 64-bit architecture. Due to virtual memory constraints of 32-bit systems, it is highly recommended to switch to a 64-bit binary of Prometheus.", "GOARCH", runtime.GOARCH) } @@ -626,6 +636,7 @@ func main() { cfg.web.Notifier = notifierManager cfg.web.LookbackDelta = time.Duration(cfg.lookbackDelta) cfg.web.IsAgent = agentMode + cfg.web.AppName = modeAppName cfg.web.Version = &web.PrometheusVersion{ Version: version.Version, @@ -729,7 +740,7 @@ func main() { fs, err := filepath.Glob(pat) if err != nil { // The only error can be a bad pattern. - return errors.Wrapf(err, "error retrieving rule files for %s", pat) + return fmt.Errorf("error retrieving rule files for %s: %w", pat, err) } files = append(files, fs...) } @@ -804,6 +815,7 @@ func main() { }, func(err error) { close(cancel) + webHandler.SetReady(false) }, ) } @@ -835,6 +847,19 @@ func main() { }, ) } + if !agentMode { + // Rule manager. + g.Add( + func() error { + <-reloadReady.C + ruleManager.Run() + return nil + }, + func(err error) { + ruleManager.Stop() + }, + ) + } { // Scrape manager. g.Add( @@ -852,6 +877,8 @@ func main() { func(err error) { // Scrape manager needs to be stopped before closing the local TSDB // so that it doesn't try to write samples to a closed storage. + // We should also wait for rule manager to be fully stopped to ensure + // we don't trigger any false positive alerts for rules using absent(). level.Info(logger).Log("msg", "Stopping scrape manager...") scrapeManager.Stop() }, @@ -921,12 +948,12 @@ func main() { } if err := reloadConfig(cfg.configFile, cfg.enableExpandExternalLabels, cfg.tsdb.EnableExemplarStorage, logger, noStepSubqueryInterval, reloaders...); err != nil { - return errors.Wrapf(err, "error loading config from %q", cfg.configFile) + return fmt.Errorf("error loading config from %q: %w", cfg.configFile, err) } reloadReady.Close() - webHandler.Ready() + webHandler.SetReady(true) level.Info(logger).Log("msg", "Server is ready to receive web requests.") <-cancel return nil @@ -937,18 +964,6 @@ func main() { ) } if !agentMode { - // Rule manager. - g.Add( - func() error { - <-reloadReady.C - ruleManager.Run() - return nil - }, - func(err error) { - ruleManager.Stop() - }, - ) - // TSDB. opts := cfg.tsdb.ToTSDBOptions() cancel := make(chan struct{}) @@ -968,7 +983,7 @@ func main() { db, err := openDBWithMetrics(localStoragePath, logger, prometheus.DefaultRegisterer, &opts, localStorage.getStats()) if err != nil { - return errors.Wrapf(err, "opening storage failed") + return fmt.Errorf("opening storage failed: %w", err) } switch fsType := prom_runtime.Statfs(localStoragePath); fsType { @@ -1024,7 +1039,7 @@ func main() { &opts, ) if err != nil { - return errors.Wrap(err, "opening storage failed") + return fmt.Errorf("opening storage failed: %w", err) } switch fsType := prom_runtime.Statfs(localStoragePath); fsType { @@ -1062,7 +1077,7 @@ func main() { g.Add( func() error { if err := webHandler.Run(ctxWeb, listener, *webConfig); err != nil { - return errors.Wrapf(err, "error starting web server") + return fmt.Errorf("error starting web server: %w", err) } return nil }, @@ -1172,7 +1187,7 @@ func reloadConfig(filename string, expandExternalLabels, enableExemplarStorage b conf, err := config.LoadFile(filename, agentMode, expandExternalLabels, logger) if err != nil { - return errors.Wrapf(err, "couldn't load configuration (--config.file=%q)", filename) + return fmt.Errorf("couldn't load configuration (--config.file=%q): %w", filename, err) } if enableExemplarStorage { @@ -1191,7 +1206,7 @@ func reloadConfig(filename string, expandExternalLabels, enableExemplarStorage b timings = append(timings, rl.name, time.Since(rstart)) } if failed { - return errors.Errorf("one or more errors occurred while applying the new configuration (--config.file=%q)", filename) + return fmt.Errorf("one or more errors occurred while applying the new configuration (--config.file=%q)", filename) } noStepSuqueryInterval.Set(conf.GlobalConfig.EvaluationInterval) diff --git a/cmd/prometheus/main_test.go b/cmd/prometheus/main_test.go index 1f161d26be..9a6dc66713 100644 --- a/cmd/prometheus/main_test.go +++ b/cmd/prometheus/main_test.go @@ -16,8 +16,9 @@ package main import ( "bytes" "context" + "errors" "fmt" - "io/ioutil" + "io" "math" "os" "os/exec" @@ -121,7 +122,8 @@ func TestFailedStartupExitCode(t *testing.T) { err := prom.Run() require.Error(t, err) - if exitError, ok := err.(*exec.ExitError); ok { + var exitError *exec.ExitError + if errors.As(err, &exitError) { status := exitError.Sys().(syscall.WaitStatus) require.Equal(t, expectedExitStatus, status.ExitStatus()) } else { @@ -211,7 +213,7 @@ func TestWALSegmentSizeBounds(t *testing.T) { stderr, err := prom.StderrPipe() require.NoError(t, err) go func() { - slurp, _ := ioutil.ReadAll(stderr) + slurp, _ := io.ReadAll(stderr) t.Log(string(slurp)) }() @@ -233,7 +235,8 @@ func TestWALSegmentSizeBounds(t *testing.T) { err = prom.Wait() require.Error(t, err) - if exitError, ok := err.(*exec.ExitError); ok { + var exitError *exec.ExitError + if errors.As(err, &exitError) { status := exitError.Sys().(syscall.WaitStatus) require.Equal(t, expectedExitStatus, status.ExitStatus()) } else { @@ -256,7 +259,7 @@ func TestMaxBlockChunkSegmentSizeBounds(t *testing.T) { stderr, err := prom.StderrPipe() require.NoError(t, err) go func() { - slurp, _ := ioutil.ReadAll(stderr) + slurp, _ := io.ReadAll(stderr) t.Log(string(slurp)) }() @@ -278,7 +281,8 @@ func TestMaxBlockChunkSegmentSizeBounds(t *testing.T) { err = prom.Wait() require.Error(t, err) - if exitError, ok := err.(*exec.ExitError); ok { + var exitError *exec.ExitError + if errors.As(err, &exitError) { status := exitError.Sys().(syscall.WaitStatus) require.Equal(t, expectedExitStatus, status.ExitStatus()) } else { @@ -445,7 +449,7 @@ func TestModeSpecificFlags(t *testing.T) { stderr, err := prom.StderrPipe() require.NoError(t, err) go func() { - slurp, _ := ioutil.ReadAll(stderr) + slurp, _ := io.ReadAll(stderr) t.Log(string(slurp)) }() @@ -467,7 +471,8 @@ func TestModeSpecificFlags(t *testing.T) { err = prom.Wait() require.Error(t, err) - if exitError, ok := err.(*exec.ExitError); ok { + var exitError *exec.ExitError + if errors.As(err, &exitError) { status := exitError.Sys().(syscall.WaitStatus) require.Equal(t, tc.exitStatus, status.ExitStatus()) } else { diff --git a/cmd/prometheus/query_log_test.go b/cmd/prometheus/query_log_test.go index 844bde1c96..d5dfbea509 100644 --- a/cmd/prometheus/query_log_test.go +++ b/cmd/prometheus/query_log_test.go @@ -17,7 +17,7 @@ import ( "bufio" "encoding/json" "fmt" - "io/ioutil" + "io" "net" "net/http" "net/url" @@ -235,10 +235,10 @@ func (p *queryLogTest) run(t *testing.T) { p.skip(t) // Setup temporary files for this test. - queryLogFile, err := ioutil.TempFile("", "query") + queryLogFile, err := os.CreateTemp("", "query") require.NoError(t, err) defer os.Remove(queryLogFile.Name()) - p.configFile, err = ioutil.TempFile("", "config") + p.configFile, err = os.CreateTemp("", "config") require.NoError(t, err) defer os.Remove(p.configFile.Name()) @@ -269,7 +269,7 @@ func (p *queryLogTest) run(t *testing.T) { wg.Add(1) defer wg.Wait() go func() { - slurp, _ := ioutil.ReadAll(stderr) + slurp, _ := io.ReadAll(stderr) t.Log(string(slurp)) wg.Done() }() @@ -333,7 +333,7 @@ func (p *queryLogTest) run(t *testing.T) { return } // Move the file, Prometheus should still write to the old file. - newFile, err := ioutil.TempFile("", "newLoc") + newFile, err := os.CreateTemp("", "newLoc") require.NoError(t, err) require.NoError(t, newFile.Close()) defer os.Remove(newFile.Name()) diff --git a/cmd/promtool/archive.go b/cmd/promtool/archive.go index cca148cb4d..6edb741acd 100644 --- a/cmd/promtool/archive.go +++ b/cmd/promtool/archive.go @@ -16,9 +16,8 @@ package main import ( "archive/tar" "compress/gzip" + "fmt" "os" - - "github.com/pkg/errors" ) const filePerm = 0o666 @@ -32,7 +31,7 @@ type tarGzFileWriter struct { func newTarGzFileWriter(archiveName string) (*tarGzFileWriter, error) { file, err := os.Create(archiveName) if err != nil { - return nil, errors.Wrapf(err, "error creating archive %q", archiveName) + return nil, fmt.Errorf("error creating archive %q: %w", archiveName, err) } gzw := gzip.NewWriter(file) tw := tar.NewWriter(gzw) diff --git a/cmd/promtool/backfill.go b/cmd/promtool/backfill.go index d1c8f96337..3c23d2c037 100644 --- a/cmd/promtool/backfill.go +++ b/cmd/promtool/backfill.go @@ -15,12 +15,13 @@ package main import ( "context" + "errors" + "fmt" "io" "math" "time" "github.com/go-kit/log" - "github.com/pkg/errors" "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/model/textparse" @@ -33,11 +34,11 @@ func getMinAndMaxTimestamps(p textparse.Parser) (int64, int64, error) { for { entry, err := p.Next() - if err == io.EOF { + if errors.Is(err, io.EOF) { break } if err != nil { - return 0, 0, errors.Wrap(err, "next") + return 0, 0, fmt.Errorf("next: %w", err) } if entry != textparse.EntrySeries { @@ -46,7 +47,7 @@ func getMinAndMaxTimestamps(p textparse.Parser) (int64, int64, error) { _, ts, _ := p.Series() if ts == nil { - return 0, 0, errors.Errorf("expected timestamp for series got none") + return 0, 0, fmt.Errorf("expected timestamp for series got none") } if *ts > maxt { @@ -118,7 +119,7 @@ func createBlocks(input []byte, mint, maxt, maxBlockDuration int64, maxSamplesIn // original interval later. w, err := tsdb.NewBlockWriter(log.NewNopLogger(), outputDir, 2*blockDuration) if err != nil { - return errors.Wrap(err, "block writer") + return fmt.Errorf("block writer: %w", err) } defer func() { err = tsdb_errors.NewMulti(err, w.Close()).Err() @@ -130,11 +131,11 @@ func createBlocks(input []byte, mint, maxt, maxBlockDuration int64, maxSamplesIn samplesCount := 0 for { e, err := p.Next() - if err == io.EOF { + if errors.Is(err, io.EOF) { break } if err != nil { - return errors.Wrap(err, "parse") + return fmt.Errorf("parse: %w", err) } if e != textparse.EntrySeries { continue @@ -144,7 +145,7 @@ func createBlocks(input []byte, mint, maxt, maxBlockDuration int64, maxSamplesIn if ts == nil { l := labels.Labels{} p.Metric(&l) - return errors.Errorf("expected timestamp for series %v, got none", l) + return fmt.Errorf("expected timestamp for series %v, got none", l) } if *ts < t { continue @@ -160,7 +161,7 @@ func createBlocks(input []byte, mint, maxt, maxBlockDuration int64, maxSamplesIn p.Metric(&l) if _, err := app.Append(0, l, *ts, v); err != nil { - return errors.Wrap(err, "add sample") + return fmt.Errorf("add sample: %w", err) } samplesCount++ @@ -172,7 +173,7 @@ func createBlocks(input []byte, mint, maxt, maxBlockDuration int64, maxSamplesIn // Therefore the old appender is committed and a new one is created. // This prevents keeping too many samples lined up in an appender and thus in RAM. if err := app.Commit(); err != nil { - return errors.Wrap(err, "commit") + return fmt.Errorf("commit: %w", err) } app = w.Appender(ctx) @@ -180,18 +181,18 @@ func createBlocks(input []byte, mint, maxt, maxBlockDuration int64, maxSamplesIn } if err := app.Commit(); err != nil { - return errors.Wrap(err, "commit") + return fmt.Errorf("commit: %w", err) } block, err := w.Flush(ctx) - switch err { - case nil: + switch { + case err == nil: if quiet { break } blocks, err := db.Blocks() if err != nil { - return errors.Wrap(err, "get blocks") + return fmt.Errorf("get blocks: %w", err) } for _, b := range blocks { if b.Meta().ULID == block { @@ -200,15 +201,15 @@ func createBlocks(input []byte, mint, maxt, maxBlockDuration int64, maxSamplesIn break } } - case tsdb.ErrNoSeriesAppended: + case errors.Is(err, tsdb.ErrNoSeriesAppended): default: - return errors.Wrap(err, "flush") + return fmt.Errorf("flush: %w", err) } return nil }() if err != nil { - return errors.Wrap(err, "process blocks") + return fmt.Errorf("process blocks: %w", err) } } return nil @@ -218,7 +219,10 @@ func backfill(maxSamplesInAppender int, input []byte, outputDir string, humanRea p := textparse.NewOpenMetricsParser(input) maxt, mint, err := getMinAndMaxTimestamps(p) if err != nil { - return errors.Wrap(err, "getting min and max timestamp") + return fmt.Errorf("getting min and max timestamp: %w", err) } - return errors.Wrap(createBlocks(input, mint, maxt, int64(maxBlockDuration/time.Millisecond), maxSamplesInAppender, outputDir, humanReadable, quiet), "block creation") + if err = createBlocks(input, mint, maxt, int64(maxBlockDuration/time.Millisecond), maxSamplesInAppender, outputDir, humanReadable, quiet); err != nil { + return fmt.Errorf("block creation: %w", err) + } + return nil } diff --git a/cmd/promtool/debug.go b/cmd/promtool/debug.go index 23d613bb06..6383aaface 100644 --- a/cmd/promtool/debug.go +++ b/cmd/promtool/debug.go @@ -15,10 +15,8 @@ package main import ( "fmt" - "io/ioutil" + "io" "net/http" - - "github.com/pkg/errors" ) type debugWriterConfig struct { @@ -30,7 +28,7 @@ type debugWriterConfig struct { func debugWrite(cfg debugWriterConfig) error { archiver, err := newTarGzFileWriter(cfg.tarballName) if err != nil { - return errors.Wrap(err, "error creating a new archiver") + return fmt.Errorf("error creating a new archiver: %w", err) } for _, endPointGroup := range cfg.endPointGroups { @@ -39,28 +37,28 @@ func debugWrite(cfg debugWriterConfig) error { fmt.Println("collecting:", url) res, err := http.Get(url) if err != nil { - return errors.Wrap(err, "error executing HTTP request") + return fmt.Errorf("error executing HTTP request: %w", err) } - body, err := ioutil.ReadAll(res.Body) + body, err := io.ReadAll(res.Body) res.Body.Close() if err != nil { - return errors.Wrap(err, "error reading the response body") + return fmt.Errorf("error reading the response body: %w", err) } if endPointGroup.postProcess != nil { body, err = endPointGroup.postProcess(body) if err != nil { - return errors.Wrap(err, "error post-processing HTTP response body") + return fmt.Errorf("error post-processing HTTP response body: %w", err) } } if err := archiver.write(filename, body); err != nil { - return errors.Wrap(err, "error writing into the archive") + return fmt.Errorf("error writing into the archive: %w", err) } } } if err := archiver.close(); err != nil { - return errors.Wrap(err, "error closing archive writer") + return fmt.Errorf("error closing archive writer: %w", err) } fmt.Printf("Compiling debug information complete, all files written in %q.\n", cfg.tarballName) diff --git a/cmd/promtool/main.go b/cmd/promtool/main.go index bf85786aec..ad802e4824 100644 --- a/cmd/promtool/main.go +++ b/cmd/promtool/main.go @@ -17,9 +17,9 @@ import ( "bytes" "context" "encoding/json" + "errors" "fmt" "io" - "io/ioutil" "math" "net/http" "net/url" @@ -33,7 +33,6 @@ import ( "github.com/go-kit/log" "github.com/google/pprof/profile" - "github.com/pkg/errors" "github.com/prometheus/client_golang/api" v1 "github.com/prometheus/client_golang/api/prometheus/v1" "github.com/prometheus/client_golang/prometheus/promhttp" @@ -96,6 +95,9 @@ func main() { "lint", "Linting checks to apply to the rules specified in the config. Available options are: "+strings.Join(lintOptions, ", ")+". Use --lint=none to disable linting", ).Default(lintOptionDuplicateRules).String() + checkConfigLintFatal := checkConfigCmd.Flag( + "lint-fatal", + "Make lint errors exit with exit code 3.").Default("false").Bool() checkWebConfigCmd := checkCmd.Command("web-config", "Check if the web config files are valid or not.") webConfigFiles := checkWebConfigCmd.Arg( @@ -112,6 +114,9 @@ func main() { "lint", "Linting checks to apply. Available options are: "+strings.Join(lintOptions, ", ")+". Use --lint=none to disable linting", ).Default(lintOptionDuplicateRules).String() + checkRulesLintFatal := checkRulesCmd.Flag( + "lint-fatal", + "Make lint errors exit with exit code 3.").Default("false").Bool() checkMetricsCmd := checkCmd.Command("metrics", checkMetricsUsage) checkMetricsExtended := checkCmd.Flag("extended", "Print extended information related to the cardinality of the metrics.").Bool() @@ -152,6 +157,7 @@ func main() { queryLabelsName := queryLabelsCmd.Arg("name", "Label name to provide label values for.").Required().String() queryLabelsBegin := queryLabelsCmd.Flag("start", "Start time (RFC3339 or Unix timestamp).").String() queryLabelsEnd := queryLabelsCmd.Flag("end", "End time (RFC3339 or Unix timestamp).").String() + queryLabelsMatch := queryLabelsCmd.Flag("match", "Series selector. Can be specified multiple times.").Strings() testCmd := app.Command("test", "Unit testing.") testRulesCmd := testCmd.Command("rules", "Unit tests for rules.") @@ -236,13 +242,13 @@ func main() { os.Exit(CheckSD(*sdConfigFile, *sdJobName, *sdTimeout)) case checkConfigCmd.FullCommand(): - os.Exit(CheckConfig(*agentMode, *checkConfigSyntaxOnly, newLintConfig(*checkConfigLint), *configFiles...)) + os.Exit(CheckConfig(*agentMode, *checkConfigSyntaxOnly, newLintConfig(*checkConfigLint, *checkConfigLintFatal), *configFiles...)) case checkWebConfigCmd.FullCommand(): os.Exit(CheckWebConfig(*webConfigFiles...)) case checkRulesCmd.FullCommand(): - os.Exit(CheckRules(newLintConfig(*checkRulesLint), *ruleFiles...)) + os.Exit(CheckRules(newLintConfig(*checkRulesLint, *checkRulesLintFatal), *ruleFiles...)) case checkMetricsCmd.FullCommand(): os.Exit(CheckMetrics(*checkMetricsExtended)) @@ -266,7 +272,7 @@ func main() { os.Exit(debugAll(*debugAllServer)) case queryLabelsCmd.FullCommand(): - os.Exit(QueryLabels(*queryLabelsServer, *queryLabelsName, *queryLabelsBegin, *queryLabelsEnd, p)) + os.Exit(QueryLabels(*queryLabelsServer, *queryLabelsMatch, *queryLabelsName, *queryLabelsBegin, *queryLabelsEnd, p)) case testRulesCmd.FullCommand(): os.Exit(RulesUnitTest( @@ -303,11 +309,14 @@ var lintError = fmt.Errorf("lint error") type lintConfig struct { all bool duplicateRules bool + fatal bool } -func newLintConfig(stringVal string) lintConfig { +func newLintConfig(stringVal string, fatal bool) lintConfig { items := strings.Split(stringVal, ",") - ls := lintConfig{} + ls := lintConfig{ + fatal: fatal, + } for _, setting := range items { switch setting { case lintOptionAll: @@ -329,7 +338,7 @@ func (ls lintConfig) lintDuplicateRules() bool { // CheckConfig validates configuration files. func CheckConfig(agentMode, checkSyntaxOnly bool, lintSettings lintConfig, files ...string) int { failed := false - hasLintErrors := false + hasErrors := false for _, f := range files { ruleFiles, err := checkConfig(agentMode, f, checkSyntaxOnly) @@ -352,7 +361,7 @@ func CheckConfig(agentMode, checkSyntaxOnly bool, lintSettings lintConfig, files } failed = true for _, err := range errs { - hasLintErrors = hasLintErrors || errors.Is(err, lintError) + hasErrors = hasErrors || !errors.Is(err, lintError) } } else { fmt.Printf(" SUCCESS: %d rules found\n", n) @@ -360,12 +369,12 @@ func CheckConfig(agentMode, checkSyntaxOnly bool, lintSettings lintConfig, files fmt.Println() } } - if failed && hasLintErrors { - return lintErrExitCode - } - if failed { + if failed && hasErrors { return failureExitCode } + if failed && lintSettings.fatal { + return lintErrExitCode + } return successExitCode } @@ -414,10 +423,10 @@ func checkConfig(agentMode bool, filename string, checkSyntaxOnly bool) ([]strin // If an explicit file was given, error if it is not accessible. if !strings.Contains(rf, "*") { if len(rfs) == 0 { - return nil, errors.Errorf("%q does not point to an existing file", rf) + return nil, fmt.Errorf("%q does not point to an existing file", rf) } if err := checkFileExists(rfs[0]); err != nil { - return nil, errors.Wrapf(err, "error checking rule file %q", rfs[0]) + return nil, fmt.Errorf("error checking rule file %q: %w", rfs[0], err) } } ruleFiles = append(ruleFiles, rfs...) @@ -427,7 +436,7 @@ func checkConfig(agentMode bool, filename string, checkSyntaxOnly bool) ([]strin for _, scfg := range cfg.ScrapeConfigs { if !checkSyntaxOnly && scfg.HTTPClientConfig.Authorization != nil { if err := checkFileExists(scfg.HTTPClientConfig.Authorization.CredentialsFile); err != nil { - return nil, errors.Wrapf(err, "error checking authorization credentials or bearer token file %q", scfg.HTTPClientConfig.Authorization.CredentialsFile) + return nil, fmt.Errorf("error checking authorization credentials or bearer token file %q: %w", scfg.HTTPClientConfig.Authorization.CredentialsFile, err) } } @@ -455,7 +464,7 @@ func checkConfig(agentMode bool, filename string, checkSyntaxOnly bool) ([]strin var targetGroups []*targetgroup.Group targetGroups, err = checkSDFile(f) if err != nil { - return nil, errors.Errorf("checking SD file %q: %v", file, err) + return nil, fmt.Errorf("checking SD file %q: %w", file, err) } if err := checkTargetGroupsForScrapeConfig(targetGroups, scfg); err != nil { return nil, err @@ -491,7 +500,7 @@ func checkConfig(agentMode bool, filename string, checkSyntaxOnly bool) ([]strin var targetGroups []*targetgroup.Group targetGroups, err = checkSDFile(f) if err != nil { - return nil, errors.Errorf("checking SD file %q: %v", file, err) + return nil, fmt.Errorf("checking SD file %q: %w", file, err) } if err := checkTargetGroupsForAlertmanager(targetGroups, amcfg); err != nil { @@ -514,10 +523,10 @@ func checkConfig(agentMode bool, filename string, checkSyntaxOnly bool) ([]strin func checkTLSConfig(tlsConfig config_util.TLSConfig, checkSyntaxOnly bool) error { if len(tlsConfig.CertFile) > 0 && len(tlsConfig.KeyFile) == 0 { - return errors.Errorf("client cert file %q specified without client key file", tlsConfig.CertFile) + return fmt.Errorf("client cert file %q specified without client key file", tlsConfig.CertFile) } if len(tlsConfig.KeyFile) > 0 && len(tlsConfig.CertFile) == 0 { - return errors.Errorf("client key file %q specified without client cert file", tlsConfig.KeyFile) + return fmt.Errorf("client key file %q specified without client cert file", tlsConfig.KeyFile) } if checkSyntaxOnly { @@ -525,10 +534,10 @@ func checkTLSConfig(tlsConfig config_util.TLSConfig, checkSyntaxOnly bool) error } if err := checkFileExists(tlsConfig.CertFile); err != nil { - return errors.Wrapf(err, "error checking client cert file %q", tlsConfig.CertFile) + return fmt.Errorf("error checking client cert file %q: %w", tlsConfig.CertFile, err) } if err := checkFileExists(tlsConfig.KeyFile); err != nil { - return errors.Wrapf(err, "error checking client key file %q", tlsConfig.KeyFile) + return fmt.Errorf("error checking client key file %q: %w", tlsConfig.KeyFile, err) } return nil @@ -541,7 +550,7 @@ func checkSDFile(filename string) ([]*targetgroup.Group, error) { } defer fd.Close() - content, err := ioutil.ReadAll(fd) + content, err := io.ReadAll(fd) if err != nil { return nil, err } @@ -558,12 +567,12 @@ func checkSDFile(filename string) ([]*targetgroup.Group, error) { return nil, err } default: - return nil, errors.Errorf("invalid file extension: %q", ext) + return nil, fmt.Errorf("invalid file extension: %q", ext) } for i, tg := range targetGroups { if tg == nil { - return nil, errors.Errorf("nil target group item found (index %d)", i) + return nil, fmt.Errorf("nil target group item found (index %d)", i) } } @@ -573,7 +582,7 @@ func checkSDFile(filename string) ([]*targetgroup.Group, error) { // CheckRules validates rule files. func CheckRules(ls lintConfig, files ...string) int { failed := false - hasLintErrors := false + hasErrors := false for _, f := range files { if n, errs := checkRules(f, ls); errs != nil { @@ -583,19 +592,19 @@ func CheckRules(ls lintConfig, files ...string) int { } failed = true for _, err := range errs { - hasLintErrors = hasLintErrors || errors.Is(err, lintError) + hasErrors = hasErrors || !errors.Is(err, lintError) } } else { fmt.Printf(" SUCCESS: %d rules found\n", n) } fmt.Println() } - if failed && hasLintErrors { - return lintErrExitCode - } - if failed { + if failed && hasErrors { return failureExitCode } + if failed && ls.fatal { + return lintErrExitCode + } return successExitCode } @@ -930,7 +939,7 @@ func QuerySeries(url *url.URL, matchers []string, start, end string, p printer) } // QueryLabels queries for label values against a Prometheus server. -func QueryLabels(url *url.URL, name, start, end string, p printer) int { +func QueryLabels(url *url.URL, matchers []string, name, start, end string, p printer) int { if url.Scheme == "" { url.Scheme = "http" } @@ -954,7 +963,7 @@ func QueryLabels(url *url.URL, name, start, end string, p printer) int { // Run query against client. api := v1.NewAPI(c) ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - val, warn, err := api.LabelValues(ctx, name, []string{}, stime, etime) + val, warn, err := api.LabelValues(ctx, name, matchers, stime, etime) cancel() for _, v := range warn { @@ -992,14 +1001,14 @@ func parseStartTimeAndEndTime(start, end string) (time.Time, time.Time, error) { if start != "" { stime, err = parseTime(start) if err != nil { - return stime, etime, errors.Wrap(err, "error parsing start time") + return stime, etime, fmt.Errorf("error parsing start time: %w", err) } } if end != "" { etime, err = parseTime(end) if err != nil { - return stime, etime, errors.Wrap(err, "error parsing end time") + return stime, etime, fmt.Errorf("error parsing end time: %w", err) } } return stime, etime, nil @@ -1013,7 +1022,7 @@ func parseTime(s string) (time.Time, error) { if t, err := time.Parse(time.RFC3339Nano, s); err == nil { return t, nil } - return time.Time{}, errors.Errorf("cannot parse %q to a valid timestamp", s) + return time.Time{}, fmt.Errorf("cannot parse %q to a valid timestamp", s) } type endpointsGroup struct { @@ -1039,7 +1048,7 @@ var ( } var buf bytes.Buffer if err := p.WriteUncompressed(&buf); err != nil { - return nil, errors.Wrap(err, "writing the profile to the buffer") + return nil, fmt.Errorf("writing the profile to the buffer: %w", err) } return buf.Bytes(), nil @@ -1149,13 +1158,13 @@ func importRules(url *url.URL, start, end, outputDir string, evalInterval, maxBl } else { etime, err = parseTime(end) if err != nil { - return fmt.Errorf("error parsing end time: %v", err) + return fmt.Errorf("error parsing end time: %w", err) } } stime, err = parseTime(start) if err != nil { - return fmt.Errorf("error parsing start time: %v", err) + return fmt.Errorf("error parsing start time: %w", err) } if !stime.Before(etime) { @@ -1173,14 +1182,14 @@ func importRules(url *url.URL, start, end, outputDir string, evalInterval, maxBl Address: url.String(), }) if err != nil { - return fmt.Errorf("new api client error: %v", err) + return fmt.Errorf("new api client error: %w", err) } ruleImporter := newRuleImporter(log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr)), cfg, v1.NewAPI(client)) errs := ruleImporter.loadGroups(ctx, files) for _, err := range errs { if err != nil { - return fmt.Errorf("rule importer parse error: %v", err) + return fmt.Errorf("rule importer parse error: %w", err) } } diff --git a/cmd/promtool/rules.go b/cmd/promtool/rules.go index 760f928330..20d9fde9a5 100644 --- a/cmd/promtool/rules.go +++ b/cmd/promtool/rules.go @@ -20,7 +20,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/pkg/errors" v1 "github.com/prometheus/client_golang/api/prometheus/v1" "github.com/prometheus/common/model" @@ -122,7 +121,7 @@ func (importer *ruleImporter) importRule(ctx context.Context, ruleExpr, ruleName }, ) if err != nil { - return errors.Wrap(err, "query range") + return fmt.Errorf("query range: %w", err) } if warnings != nil { level.Warn(importer.logger).Log("msg", "Range query returned warnings.", "warnings", warnings) @@ -136,7 +135,7 @@ func (importer *ruleImporter) importRule(ctx context.Context, ruleExpr, ruleName // original interval later. w, err := tsdb.NewBlockWriter(log.NewNopLogger(), importer.config.outputDir, 2*blockDuration) if err != nil { - return errors.Wrap(err, "new block writer") + return fmt.Errorf("new block writer: %w", err) } var closed bool defer func() { @@ -167,7 +166,7 @@ func (importer *ruleImporter) importRule(ctx context.Context, ruleExpr, ruleName for _, value := range sample.Values { if err := app.add(ctx, lb.Labels(), timestamp.FromTime(value.Timestamp.Time()), float64(value.Value)); err != nil { - return errors.Wrap(err, "add") + return fmt.Errorf("add: %w", err) } } } @@ -176,7 +175,7 @@ func (importer *ruleImporter) importRule(ctx context.Context, ruleExpr, ruleName } if err := app.flushAndCommit(ctx); err != nil { - return errors.Wrap(err, "flush and commit") + return fmt.Errorf("flush and commit: %w", err) } err = tsdb_errors.NewMulti(err, w.Close()).Err() closed = true @@ -204,7 +203,7 @@ type multipleAppender struct { func (m *multipleAppender) add(ctx context.Context, l labels.Labels, t int64, v float64) error { if _, err := m.appender.Append(0, l, t, v); err != nil { - return errors.Wrap(err, "multiappender append") + return fmt.Errorf("multiappender append: %w", err) } m.currentSampleCount++ if m.currentSampleCount >= m.maxSamplesInMemory { @@ -218,7 +217,7 @@ func (m *multipleAppender) commit(ctx context.Context) error { return nil } if err := m.appender.Commit(); err != nil { - return errors.Wrap(err, "multiappender commit") + return fmt.Errorf("multiappender commit: %w", err) } m.appender = m.writer.Appender(ctx) m.currentSampleCount = 0 @@ -230,7 +229,7 @@ func (m *multipleAppender) flushAndCommit(ctx context.Context) error { return err } if _, err := m.writer.Flush(ctx); err != nil { - return errors.Wrap(err, "multiappender flush") + return fmt.Errorf("multiappender flush: %w", err) } return nil } diff --git a/cmd/promtool/rules_test.go b/cmd/promtool/rules_test.go index decda0fe38..aa66d08ded 100644 --- a/cmd/promtool/rules_test.go +++ b/cmd/promtool/rules_test.go @@ -15,8 +15,8 @@ package main import ( "context" - "io/ioutil" "math" + "os" "path/filepath" "testing" "time" @@ -188,7 +188,7 @@ func createSingleRuleTestFiles(path string) error { labels: testlabel11: testlabelvalue11 ` - return ioutil.WriteFile(path, []byte(recordingRules), 0o777) + return os.WriteFile(path, []byte(recordingRules), 0o777) } func createMultiRuleTestFiles(path string) error { @@ -208,7 +208,7 @@ func createMultiRuleTestFiles(path string) error { labels: testlabel11: testlabelvalue13 ` - return ioutil.WriteFile(path, []byte(recordingRules), 0o777) + return os.WriteFile(path, []byte(recordingRules), 0o777) } // TestBackfillLabels confirms that the labels in the rule file override the labels from the metrics @@ -236,7 +236,7 @@ func TestBackfillLabels(t *testing.T) { labels: name1: value-from-rule ` - require.NoError(t, ioutil.WriteFile(path, []byte(recordingRules), 0o777)) + require.NoError(t, os.WriteFile(path, []byte(recordingRules), 0o777)) errs := ruleImporter.loadGroups(ctx, []string{path}) for _, err := range errs { require.NoError(t, err) diff --git a/cmd/promtool/tsdb.go b/cmd/promtool/tsdb.go index 565751f72c..7707a99043 100644 --- a/cmd/promtool/tsdb.go +++ b/cmd/promtool/tsdb.go @@ -35,7 +35,6 @@ import ( "github.com/alecthomas/units" "github.com/go-kit/log" - "github.com/pkg/errors" "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/tsdb" @@ -236,29 +235,29 @@ func (b *writeBenchmark) startProfiling() error { // Start CPU profiling. b.cpuprof, err = os.Create(filepath.Join(b.outPath, "cpu.prof")) if err != nil { - return fmt.Errorf("bench: could not create cpu profile: %v", err) + return fmt.Errorf("bench: could not create cpu profile: %w", err) } if err := pprof.StartCPUProfile(b.cpuprof); err != nil { - return fmt.Errorf("bench: could not start CPU profile: %v", err) + return fmt.Errorf("bench: could not start CPU profile: %w", err) } // Start memory profiling. b.memprof, err = os.Create(filepath.Join(b.outPath, "mem.prof")) if err != nil { - return fmt.Errorf("bench: could not create memory profile: %v", err) + return fmt.Errorf("bench: could not create memory profile: %w", err) } runtime.MemProfileRate = 64 * 1024 // Start fatal profiling. b.blockprof, err = os.Create(filepath.Join(b.outPath, "block.prof")) if err != nil { - return fmt.Errorf("bench: could not create block profile: %v", err) + return fmt.Errorf("bench: could not create block profile: %w", err) } runtime.SetBlockProfileRate(20) b.mtxprof, err = os.Create(filepath.Join(b.outPath, "mutex.prof")) if err != nil { - return fmt.Errorf("bench: could not create mutex profile: %v", err) + return fmt.Errorf("bench: could not create mutex profile: %w", err) } runtime.SetMutexProfileFraction(20) return nil @@ -272,14 +271,14 @@ func (b *writeBenchmark) stopProfiling() error { } if b.memprof != nil { if err := pprof.Lookup("heap").WriteTo(b.memprof, 0); err != nil { - return fmt.Errorf("error writing mem profile: %v", err) + return fmt.Errorf("error writing mem profile: %w", err) } b.memprof.Close() b.memprof = nil } if b.blockprof != nil { if err := pprof.Lookup("block").WriteTo(b.blockprof, 0); err != nil { - return fmt.Errorf("error writing block profile: %v", err) + return fmt.Errorf("error writing block profile: %w", err) } b.blockprof.Close() b.blockprof = nil @@ -287,7 +286,7 @@ func (b *writeBenchmark) stopProfiling() error { } if b.mtxprof != nil { if err := pprof.Lookup("mutex").WriteTo(b.mtxprof, 0); err != nil { - return fmt.Errorf("error writing mutex profile: %v", err) + return fmt.Errorf("error writing mutex profile: %w", err) } b.mtxprof.Close() b.mtxprof = nil @@ -680,7 +679,7 @@ func backfillOpenMetrics(path, outputDir string, humanReadable, quiet bool, maxB defer inputFile.Close() if err := os.MkdirAll(outputDir, 0o777); err != nil { - return checkErr(errors.Wrap(err, "create output dir")) + return checkErr(fmt.Errorf("create output dir: %w", err)) } return checkErr(backfill(5000, inputFile.Bytes(), outputDir, humanReadable, quiet, maxBlockDuration)) diff --git a/cmd/promtool/unittest.go b/cmd/promtool/unittest.go index 57b6103b0b..f03906089c 100644 --- a/cmd/promtool/unittest.go +++ b/cmd/promtool/unittest.go @@ -15,8 +15,8 @@ package main import ( "context" + "errors" "fmt" - "io/ioutil" "os" "path/filepath" "reflect" @@ -26,7 +26,6 @@ import ( "time" "github.com/go-kit/log" - "github.com/pkg/errors" "github.com/prometheus/common/model" yaml "gopkg.in/yaml.v2" @@ -64,7 +63,7 @@ func RulesUnitTest(queryOpts promql.LazyLoaderOpts, files ...string) int { func ruleUnitTest(filename string, queryOpts promql.LazyLoaderOpts) []error { fmt.Println("Unit Testing: ", filename) - b, err := ioutil.ReadFile(filename) + b, err := os.ReadFile(filename) if err != nil { return []error{err} } @@ -88,7 +87,7 @@ func ruleUnitTest(filename string, queryOpts promql.LazyLoaderOpts) []error { groupOrderMap := make(map[string]int) for i, gn := range unitTestInp.GroupEvalOrder { if _, ok := groupOrderMap[gn]; ok { - return []error{errors.Errorf("group name repeated in evaluation order: %s", gn)} + return []error{fmt.Errorf("group name repeated in evaluation order: %s", gn)} } groupOrderMap[gn] = i } @@ -196,7 +195,7 @@ func (tg *testGroup) test(evalInterval time.Duration, groupOrderMap map[string]i if tg.TestGroupName != "" { testGroupLog = fmt.Sprintf(" (in TestGroup %s)", tg.TestGroupName) } - return []error{errors.Errorf("an item under alert_rule_test misses required attribute alertname at eval_time %v%s", alert.EvalTime, testGroupLog)} + return []error{fmt.Errorf("an item under alert_rule_test misses required attribute alertname at eval_time %v%s", alert.EvalTime, testGroupLog)} } alertEvalTimesMap[alert.EvalTime] = struct{}{} @@ -241,7 +240,7 @@ func (tg *testGroup) test(evalInterval time.Duration, groupOrderMap map[string]i g.Eval(suite.Context(), ts) for _, r := range g.Rules() { if r.LastError() != nil { - evalErrs = append(evalErrs, errors.Errorf(" rule: %s, time: %s, err: %v", + evalErrs = append(evalErrs, fmt.Errorf(" rule: %s, time: %s, err: %v", r.Name(), ts.Sub(time.Unix(0, 0).UTC()), r.LastError())) } } @@ -324,7 +323,7 @@ func (tg *testGroup) test(evalInterval time.Duration, groupOrderMap map[string]i } expString := indentLines(expAlerts.String(), " ") gotString := indentLines(gotAlerts.String(), " ") - errs = append(errs, errors.Errorf("%s alertname: %s, time: %s, \n exp:%v, \n got:%v", + errs = append(errs, fmt.Errorf("%s alertname: %s, time: %s, \n exp:%v, \n got:%v", testName, testcase.Alertname, testcase.EvalTime.String(), expString, gotString)) } } @@ -339,7 +338,7 @@ Outer: got, err := query(suite.Context(), testCase.Expr, mint.Add(time.Duration(testCase.EvalTime)), suite.QueryEngine(), suite.Queryable()) if err != nil { - errs = append(errs, errors.Errorf(" expr: %q, time: %s, err: %s", testCase.Expr, + errs = append(errs, fmt.Errorf(" expr: %q, time: %s, err: %s", testCase.Expr, testCase.EvalTime.String(), err.Error())) continue } @@ -356,9 +355,9 @@ Outer: for _, s := range testCase.ExpSamples { lb, err := parser.ParseMetric(s.Labels) if err != nil { - err = errors.Wrapf(err, "labels %q", s.Labels) - errs = append(errs, errors.Errorf(" expr: %q, time: %s, err: %s", testCase.Expr, - testCase.EvalTime.String(), err.Error())) + err = fmt.Errorf("labels %q: %w", s.Labels, err) + errs = append(errs, fmt.Errorf(" expr: %q, time: %s, err: %w", testCase.Expr, + testCase.EvalTime.String(), err)) continue Outer } expSamples = append(expSamples, parsedSample{ @@ -374,7 +373,7 @@ Outer: return labels.Compare(gotSamples[i].Labels, gotSamples[j].Labels) <= 0 }) if !reflect.DeepEqual(expSamples, gotSamples) { - errs = append(errs, errors.Errorf(" expr: %q, time: %s,\n exp: %v\n got: %v", testCase.Expr, + errs = append(errs, fmt.Errorf(" expr: %q, time: %s,\n exp: %v\n got: %v", testCase.Expr, testCase.EvalTime.String(), parsedSamplesString(expSamples), parsedSamplesString(gotSamples))) } } diff --git a/config/config.go b/config/config.go index 2c5fc447a1..ce17803f97 100644 --- a/config/config.go +++ b/config/config.go @@ -14,8 +14,8 @@ package config import ( + "errors" "fmt" - "io/ioutil" "net/url" "os" "path/filepath" @@ -26,7 +26,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" "github.com/grafana/regexp" - "github.com/pkg/errors" "github.com/prometheus/common/config" "github.com/prometheus/common/model" "github.com/prometheus/common/sigv4" @@ -103,13 +102,13 @@ func Load(s string, expandExternalLabels bool, logger log.Logger) (*Config, erro // LoadFile parses the given YAML file into a Config. func LoadFile(filename string, agentMode, expandExternalLabels bool, logger log.Logger) (*Config, error) { - content, err := ioutil.ReadFile(filename) + content, err := os.ReadFile(filename) if err != nil { return nil, err } cfg, err := Load(string(content), expandExternalLabels, logger) if err != nil { - return nil, errors.Wrapf(err, "parsing YAML file %s", filename) + return nil, fmt.Errorf("parsing YAML file %s: %w", filename, err) } if agentMode { @@ -277,7 +276,7 @@ func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error { for _, rf := range c.RuleFiles { if !patRulePath.MatchString(rf) { - return errors.Errorf("invalid rule file path %q", rf) + return fmt.Errorf("invalid rule file path %q", rf) } } // Do global overrides and validate unique names. @@ -292,7 +291,7 @@ func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error { scfg.ScrapeInterval = c.GlobalConfig.ScrapeInterval } if scfg.ScrapeTimeout > scfg.ScrapeInterval { - return errors.Errorf("scrape timeout greater than scrape interval for scrape config with job name %q", scfg.JobName) + return fmt.Errorf("scrape timeout greater than scrape interval for scrape config with job name %q", scfg.JobName) } if scfg.ScrapeTimeout == 0 { if c.GlobalConfig.ScrapeTimeout > scfg.ScrapeInterval { @@ -303,7 +302,7 @@ func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error { } if _, ok := jobNames[scfg.JobName]; ok { - return errors.Errorf("found multiple scrape configs with job name %q", scfg.JobName) + return fmt.Errorf("found multiple scrape configs with job name %q", scfg.JobName) } jobNames[scfg.JobName] = struct{}{} } @@ -314,7 +313,7 @@ func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error { } // Skip empty names, we fill their name with their config hash in remote write code. if _, ok := rwNames[rwcfg.Name]; ok && rwcfg.Name != "" { - return errors.Errorf("found multiple remote write configs with job name %q", rwcfg.Name) + return fmt.Errorf("found multiple remote write configs with job name %q", rwcfg.Name) } rwNames[rwcfg.Name] = struct{}{} } @@ -325,7 +324,7 @@ func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error { } // Skip empty names, we fill their name with their config hash in remote read code. if _, ok := rrNames[rrcfg.Name]; ok && rrcfg.Name != "" { - return errors.Errorf("found multiple remote read configs with job name %q", rrcfg.Name) + return fmt.Errorf("found multiple remote read configs with job name %q", rrcfg.Name) } rrNames[rrcfg.Name] = struct{}{} } @@ -364,10 +363,10 @@ func (c *GlobalConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { for _, l := range gc.ExternalLabels { if !model.LabelName(l.Name).IsValid() { - return errors.Errorf("%q is not a valid label name", l.Name) + return fmt.Errorf("%q is not a valid label name", l.Name) } if !model.LabelValue(l.Value).IsValid() { - return errors.Errorf("%q is not a valid label value", l.Value) + return fmt.Errorf("%q is not a valid label value", l.Value) } } @@ -742,7 +741,7 @@ func checkStaticTargets(configs discovery.Configs) error { func CheckTargetAddress(address model.LabelValue) error { // For now check for a URL, we may want to expand this later. if strings.Contains(string(address), "/") { - return errors.Errorf("%q is not a valid hostname", address) + return fmt.Errorf("%q is not a valid hostname", address) } return nil } @@ -811,7 +810,7 @@ func validateHeadersForTracing(headers map[string]string) error { return errors.New("custom authorization header configuration is not yet supported") } if _, ok := reservedHeaders[strings.ToLower(header)]; ok { - return errors.Errorf("%s is a reserved header. It must not be changed", header) + return fmt.Errorf("%s is a reserved header. It must not be changed", header) } } return nil @@ -823,7 +822,7 @@ func validateHeaders(headers map[string]string) error { return errors.New("authorization header must be changed via the basic_auth, authorization, oauth2, or sigv4 parameter") } if _, ok := reservedHeaders[strings.ToLower(header)]; ok { - return errors.Errorf("%s is a reserved header. It must not be changed", header) + return fmt.Errorf("%s is a reserved header. It must not be changed", header) } } return nil diff --git a/config/config_test.go b/config/config_test.go index 822185dbad..dc8ab742ba 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -14,8 +14,8 @@ package config import ( + "crypto/tls" "encoding/json" - "io/ioutil" "net/url" "os" "path/filepath" @@ -40,6 +40,7 @@ import ( "github.com/prometheus/prometheus/discovery/file" "github.com/prometheus/prometheus/discovery/hetzner" "github.com/prometheus/prometheus/discovery/http" + "github.com/prometheus/prometheus/discovery/ionos" "github.com/prometheus/prometheus/discovery/kubernetes" "github.com/prometheus/prometheus/discovery/linode" "github.com/prometheus/prometheus/discovery/marathon" @@ -50,6 +51,7 @@ import ( "github.com/prometheus/prometheus/discovery/targetgroup" "github.com/prometheus/prometheus/discovery/triton" "github.com/prometheus/prometheus/discovery/uyuni" + "github.com/prometheus/prometheus/discovery/vultr" "github.com/prometheus/prometheus/discovery/xds" "github.com/prometheus/prometheus/discovery/zookeeper" "github.com/prometheus/prometheus/model/labels" @@ -179,6 +181,9 @@ var expectedConf = &Config{ }, FollowRedirects: true, EnableHTTP2: true, + TLSConfig: config.TLSConfig{ + MinVersion: config.TLSVersion(tls.VersionTLS10), + }, }, ServiceDiscoveryConfigs: discovery.Configs{ @@ -855,6 +860,17 @@ var expectedConf = &Config{ Scheme: DefaultScrapeConfig.Scheme, HTTPClientConfig: config.DefaultHTTPClientConfig, + RelabelConfigs: []*relabel.Config{ + { + Action: relabel.Uppercase, + Regex: relabel.DefaultRelabelConfig.Regex, + Replacement: relabel.DefaultRelabelConfig.Replacement, + Separator: relabel.DefaultRelabelConfig.Separator, + SourceLabels: model.LabelNames{"instance"}, + TargetLabel: "instance", + }, + }, + ServiceDiscoveryConfigs: discovery.Configs{ &hetzner.SDConfig{ HTTPClientConfig: config.HTTPClientConfig{ @@ -973,11 +989,61 @@ var expectedConf = &Config{ Scheme: DefaultScrapeConfig.Scheme, ServiceDiscoveryConfigs: discovery.Configs{ &uyuni.SDConfig{ - Server: "https://localhost:1234", - Username: "gopher", - Password: "hole", - Entitlement: "monitoring_entitled", - Separator: ",", + Server: "https://localhost:1234", + Username: "gopher", + Password: "hole", + Entitlement: "monitoring_entitled", + Separator: ",", + RefreshInterval: model.Duration(60 * time.Second), + HTTPClientConfig: config.DefaultHTTPClientConfig, + }, + }, + }, + { + JobName: "ionos", + HonorTimestamps: true, + ScrapeInterval: model.Duration(15 * time.Second), + ScrapeTimeout: DefaultGlobalConfig.ScrapeTimeout, + + MetricsPath: DefaultScrapeConfig.MetricsPath, + Scheme: DefaultScrapeConfig.Scheme, + HTTPClientConfig: config.DefaultHTTPClientConfig, + + ServiceDiscoveryConfigs: discovery.Configs{ + &ionos.SDConfig{ + DatacenterID: "8feda53f-15f0-447f-badf-ebe32dad2fc0", + HTTPClientConfig: config.HTTPClientConfig{ + Authorization: &config.Authorization{Type: "Bearer", Credentials: "abcdef"}, + FollowRedirects: true, + EnableHTTP2: true, + }, + Port: 80, + RefreshInterval: model.Duration(60 * time.Second), + }, + }, + }, + { + JobName: "vultr", + + HonorTimestamps: true, + ScrapeInterval: model.Duration(15 * time.Second), + ScrapeTimeout: DefaultGlobalConfig.ScrapeTimeout, + + MetricsPath: DefaultScrapeConfig.MetricsPath, + Scheme: DefaultScrapeConfig.Scheme, + HTTPClientConfig: config.DefaultHTTPClientConfig, + + ServiceDiscoveryConfigs: discovery.Configs{ + &vultr.SDConfig{ + HTTPClientConfig: config.HTTPClientConfig{ + Authorization: &config.Authorization{ + Type: "Bearer", + Credentials: "abcdef", + }, + FollowRedirects: true, + EnableHTTP2: true, + }, + Port: 80, RefreshInterval: model.Duration(60 * time.Second), }, }, @@ -1079,7 +1145,7 @@ func TestElideSecrets(t *testing.T) { yamlConfig := string(config) matches := secretRe.FindAllStringIndex(yamlConfig, -1) - require.Equal(t, 16, len(matches), "wrong number of secret matches found") + require.Equal(t, 18, len(matches), "wrong number of secret matches found") require.NotContains(t, yamlConfig, "mysecret", "yaml marshal reveals authentication credentials.") } @@ -1194,6 +1260,30 @@ var expectedErrors = []struct { filename: "labelmap.bad.yml", errMsg: "\"l-$1\" is invalid 'replacement' for labelmap action", }, + { + filename: "lowercase.bad.yml", + errMsg: "relabel configuration for lowercase action requires 'target_label' value", + }, + { + filename: "lowercase2.bad.yml", + errMsg: "\"42lab\" is invalid 'target_label' for lowercase action", + }, + { + filename: "lowercase3.bad.yml", + errMsg: "'replacement' can not be set for lowercase action", + }, + { + filename: "uppercase.bad.yml", + errMsg: "relabel configuration for uppercase action requires 'target_label' value", + }, + { + filename: "uppercase2.bad.yml", + errMsg: "\"42lab\" is invalid 'target_label' for uppercase action", + }, + { + filename: "uppercase3.bad.yml", + errMsg: "'replacement' can not be set for uppercase action", + }, { filename: "rules.bad.yml", errMsg: "invalid rule file path", @@ -1494,6 +1584,10 @@ var expectedErrors = []struct { filename: "uyuni_no_server.bad.yml", errMsg: "Uyuni SD configuration requires server host", }, + { + filename: "ionos_datacenter.bad.yml", + errMsg: "datacenter id can't be empty", + }, } func TestBadConfigs(t *testing.T) { @@ -1506,7 +1600,7 @@ func TestBadConfigs(t *testing.T) { } func TestBadStaticConfigsJSON(t *testing.T) { - content, err := ioutil.ReadFile("testdata/static_config.bad.json") + content, err := os.ReadFile("testdata/static_config.bad.json") require.NoError(t, err) var tg targetgroup.Group err = json.Unmarshal(content, &tg) @@ -1514,7 +1608,7 @@ func TestBadStaticConfigsJSON(t *testing.T) { } func TestBadStaticConfigsYML(t *testing.T) { - content, err := ioutil.ReadFile("testdata/static_config.bad.yml") + content, err := os.ReadFile("testdata/static_config.bad.yml") require.NoError(t, err) var tg targetgroup.Group err = yaml.UnmarshalStrict(content, &tg) diff --git a/config/testdata/conf.good.yml b/config/testdata/conf.good.yml index 33e9639d61..e217a82ead 100644 --- a/config/testdata/conf.good.yml +++ b/config/testdata/conf.good.yml @@ -91,6 +91,9 @@ scrape_configs: authorization: credentials_file: valid_token_file + tls_config: + min_version: TLS10 + - job_name: service-x basic_auth: @@ -325,6 +328,10 @@ scrape_configs: key_file: valid_key_file - job_name: hetzner + relabel_configs: + - action: uppercase + source_labels: [instance] + target_label: instance hetzner_sd_configs: - role: hcloud authorization: @@ -360,6 +367,17 @@ scrape_configs: username: gopher password: hole + - job_name: ionos + ionos_sd_configs: + - datacenter_id: 8feda53f-15f0-447f-badf-ebe32dad2fc0 + authorization: + credentials: abcdef + + - job_name: vultr + vultr_sd_configs: + - authorization: + credentials: abcdef + alerting: alertmanagers: - scheme: https diff --git a/config/testdata/ionos_datacenter.bad.yml b/config/testdata/ionos_datacenter.bad.yml new file mode 100644 index 0000000000..e0158cf0b6 --- /dev/null +++ b/config/testdata/ionos_datacenter.bad.yml @@ -0,0 +1,3 @@ +scrape_configs: + - ionos_sd_configs: + - datacenter_id: "" diff --git a/config/testdata/lowercase.bad.yml b/config/testdata/lowercase.bad.yml new file mode 100644 index 0000000000..9bc9583341 --- /dev/null +++ b/config/testdata/lowercase.bad.yml @@ -0,0 +1,5 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - action: lowercase + source_labels: [__name__] diff --git a/config/testdata/lowercase2.bad.yml b/config/testdata/lowercase2.bad.yml new file mode 100644 index 0000000000..bde8862c66 --- /dev/null +++ b/config/testdata/lowercase2.bad.yml @@ -0,0 +1,6 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - action: lowercase + source_labels: [__name__] + target_label: 42lab diff --git a/config/testdata/lowercase3.bad.yml b/config/testdata/lowercase3.bad.yml new file mode 100644 index 0000000000..6a19f31f3f --- /dev/null +++ b/config/testdata/lowercase3.bad.yml @@ -0,0 +1,7 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - action: lowercase + source_labels: [__name__] + target_label: __name__ + replacement: bar diff --git a/config/testdata/uppercase.bad.yml b/config/testdata/uppercase.bad.yml new file mode 100644 index 0000000000..582692b5c7 --- /dev/null +++ b/config/testdata/uppercase.bad.yml @@ -0,0 +1,5 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - action: uppercase + source_labels: [__name__] diff --git a/config/testdata/uppercase2.bad.yml b/config/testdata/uppercase2.bad.yml new file mode 100644 index 0000000000..330b9aceb6 --- /dev/null +++ b/config/testdata/uppercase2.bad.yml @@ -0,0 +1,6 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - action: uppercase + source_labels: [__name__] + target_label: 42lab diff --git a/config/testdata/uppercase3.bad.yml b/config/testdata/uppercase3.bad.yml new file mode 100644 index 0000000000..9a7b17f40a --- /dev/null +++ b/config/testdata/uppercase3.bad.yml @@ -0,0 +1,7 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - action: uppercase + source_labels: [__name__] + target_label: __name__ + replacement: bar diff --git a/discovery/README.md b/discovery/README.md index 8854981a04..19b579b399 100644 --- a/discovery/README.md +++ b/discovery/README.md @@ -131,7 +131,7 @@ the Prometheus server will be able to see them. ### The SD interface -A Service Discovery (SD) mechanism has to discover targets and provide them to Prometheus. We expect similar targets to be grouped together, in the form of a [target group](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/discovery/targetgroup#Group). The SD mechanism sends the targets down to prometheus as list of target groups. +A Service Discovery (SD) mechanism has to discover targets and provide them to Prometheus. We expect similar targets to be grouped together, in the form of a [target group](https://pkg.go.dev/github.com/prometheus/prometheus/discovery/targetgroup#Group). The SD mechanism sends the targets down to prometheus as list of target groups. An SD mechanism has to implement the `Discoverer` Interface: ```go diff --git a/discovery/aws/ec2.go b/discovery/aws/ec2.go index 8984035e24..9ae964c834 100644 --- a/discovery/aws/ec2.go +++ b/discovery/aws/ec2.go @@ -15,6 +15,7 @@ package aws import ( "context" + "errors" "fmt" "net" "strings" @@ -29,7 +30,6 @@ import ( "github.com/aws/aws-sdk-go/service/ec2" "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/pkg/errors" "github.com/prometheus/common/config" "github.com/prometheus/common/model" @@ -179,7 +179,7 @@ func (d *EC2Discovery) ec2Client(ctx context.Context) (*ec2.EC2, error) { Profile: d.cfg.Profile, }) if err != nil { - return nil, errors.Wrap(err, "could not create aws session") + return nil, fmt.Errorf("could not create aws session: %w", err) } if d.cfg.RoleARN != "" { @@ -328,10 +328,11 @@ func (d *EC2Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error } return true }); err != nil { - if awsErr, ok := err.(awserr.Error); ok && (awsErr.Code() == "AuthFailure" || awsErr.Code() == "UnauthorizedOperation") { + var awsErr awserr.Error + if errors.As(err, &awsErr) && (awsErr.Code() == "AuthFailure" || awsErr.Code() == "UnauthorizedOperation") { d.ec2 = nil } - return nil, errors.Wrap(err, "could not describe instances") + return nil, fmt.Errorf("could not describe instances: %w", err) } return []*targetgroup.Group{tg}, nil } diff --git a/discovery/aws/lightsail.go b/discovery/aws/lightsail.go index e5165776f6..7f89312b33 100644 --- a/discovery/aws/lightsail.go +++ b/discovery/aws/lightsail.go @@ -15,6 +15,7 @@ package aws import ( "context" + "errors" "fmt" "net" "strings" @@ -28,7 +29,6 @@ import ( "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/lightsail" "github.com/go-kit/log" - "github.com/pkg/errors" "github.com/prometheus/common/config" "github.com/prometheus/common/model" @@ -152,7 +152,7 @@ func (d *LightsailDiscovery) lightsailClient() (*lightsail.Lightsail, error) { Profile: d.cfg.Profile, }) if err != nil { - return nil, errors.Wrap(err, "could not create aws session") + return nil, fmt.Errorf("could not create aws session: %w", err) } if d.cfg.RoleARN != "" { @@ -179,10 +179,11 @@ func (d *LightsailDiscovery) refresh(ctx context.Context) ([]*targetgroup.Group, output, err := lightsailClient.GetInstancesWithContext(ctx, input) if err != nil { - if awsErr, ok := err.(awserr.Error); ok && (awsErr.Code() == "AuthFailure" || awsErr.Code() == "UnauthorizedOperation") { + var awsErr awserr.Error + if errors.As(err, &awsErr) && (awsErr.Code() == "AuthFailure" || awsErr.Code() == "UnauthorizedOperation") { d.lightsail = nil } - return nil, errors.Wrap(err, "could not get instances") + return nil, fmt.Errorf("could not get instances: %w", err) } for _, inst := range output.Instances { diff --git a/discovery/azure/azure.go b/discovery/azure/azure.go index e7ab63a21e..44576c79b9 100644 --- a/discovery/azure/azure.go +++ b/discovery/azure/azure.go @@ -15,6 +15,7 @@ package azure import ( "context" + "errors" "fmt" "net" "net/http" @@ -29,7 +30,6 @@ import ( "github.com/Azure/go-autorest/autorest/azure" "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" config_util "github.com/prometheus/common/config" "github.com/prometheus/common/model" @@ -109,7 +109,7 @@ func (c *SDConfig) NewDiscoverer(opts discovery.DiscovererOptions) (discovery.Di func validateAuthParam(param, name string) error { if len(param) == 0 { - return errors.Errorf("azure SD configuration requires a %s", name) + return fmt.Errorf("azure SD configuration requires a %s", name) } return nil } @@ -140,7 +140,7 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { } if c.AuthenticationMethod != authMethodOAuth && c.AuthenticationMethod != authMethodManagedIdentity { - return errors.Errorf("unknown authentication_type %q. Supported types are %q or %q", c.AuthenticationMethod, authMethodOAuth, authMethodManagedIdentity) + return fmt.Errorf("unknown authentication_type %q. Supported types are %q or %q", c.AuthenticationMethod, authMethodOAuth, authMethodManagedIdentity) } return nil @@ -271,7 +271,7 @@ func newAzureResourceFromID(id string, logger log.Logger) (azureResource, error) // /subscriptions/SUBSCRIPTION_ID/resourceGroups/RESOURCE_GROUP/providers/PROVIDER/TYPE/NAME/TYPE/NAME s := strings.Split(id, "/") if len(s) != 9 && len(s) != 11 { - err := errors.Errorf("invalid ID '%s'. Refusing to create azureResource", id) + err := fmt.Errorf("invalid ID '%s'. Refusing to create azureResource", id) level.Error(logger).Log("err", err) return azureResource{}, err } @@ -288,13 +288,13 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) { client, err := createAzureClient(*d.cfg) if err != nil { failuresCount.Inc() - return nil, errors.Wrap(err, "could not create Azure client") + return nil, fmt.Errorf("could not create Azure client: %w", err) } machines, err := client.getVMs(ctx, d.cfg.ResourceGroup) if err != nil { failuresCount.Inc() - return nil, errors.Wrap(err, "could not get virtual machines") + return nil, fmt.Errorf("could not get virtual machines: %w", err) } level.Debug(d.logger).Log("msg", "Found virtual machines during Azure discovery.", "count", len(machines)) @@ -303,14 +303,14 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) { scaleSets, err := client.getScaleSets(ctx, d.cfg.ResourceGroup) if err != nil { failuresCount.Inc() - return nil, errors.Wrap(err, "could not get virtual machine scale sets") + return nil, fmt.Errorf("could not get virtual machine scale sets: %w", err) } for _, scaleSet := range scaleSets { scaleSetVms, err := client.getScaleSetVMs(ctx, scaleSet) if err != nil { failuresCount.Inc() - return nil, errors.Wrap(err, "could not get virtual machine scale set vms") + return nil, fmt.Errorf("could not get virtual machine scale set vms: %w", err) } machines = append(machines, scaleSetVms...) } @@ -396,7 +396,7 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) { } // If we made it here, we don't have a private IP which should be impossible. // Return an empty target and error to ensure an all or nothing situation. - err = errors.Errorf("unable to find a private IP for VM %s", vm.Name) + err = fmt.Errorf("unable to find a private IP for VM %s", vm.Name) ch <- target{labelSet: nil, err: err} return } @@ -412,7 +412,7 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) { for tgt := range ch { if tgt.err != nil { failuresCount.Inc() - return nil, errors.Wrap(tgt.err, "unable to complete Azure service discovery") + return nil, fmt.Errorf("unable to complete Azure service discovery: %w", tgt.err) } if tgt.labelSet != nil { tg.Targets = append(tg.Targets, tgt.labelSet) @@ -432,7 +432,7 @@ func (client *azureClient) getVMs(ctx context.Context, resourceGroup string) ([] result, err = client.vm.List(ctx, resourceGroup) } if err != nil { - return nil, errors.Wrap(err, "could not list virtual machines") + return nil, fmt.Errorf("could not list virtual machines: %w", err) } for result.NotDone() { for _, vm := range result.Values() { @@ -440,7 +440,7 @@ func (client *azureClient) getVMs(ctx context.Context, resourceGroup string) ([] } err = result.NextWithContext(ctx) if err != nil { - return nil, errors.Wrap(err, "could not list virtual machines") + return nil, fmt.Errorf("could not list virtual machines: %w", err) } } @@ -461,14 +461,14 @@ func (client *azureClient) getScaleSets(ctx context.Context, resourceGroup strin var rtn compute.VirtualMachineScaleSetListWithLinkResultPage rtn, err = client.vmss.ListAll(ctx) if err != nil { - return nil, errors.Wrap(err, "could not list virtual machine scale sets") + return nil, fmt.Errorf("could not list virtual machine scale sets: %w", err) } result = &rtn } else { var rtn compute.VirtualMachineScaleSetListResultPage rtn, err = client.vmss.List(ctx, resourceGroup) if err != nil { - return nil, errors.Wrap(err, "could not list virtual machine scale sets") + return nil, fmt.Errorf("could not list virtual machine scale sets: %w", err) } result = &rtn } @@ -477,7 +477,7 @@ func (client *azureClient) getScaleSets(ctx context.Context, resourceGroup strin scaleSets = append(scaleSets, result.Values()...) err = result.NextWithContext(ctx) if err != nil { - return nil, errors.Wrap(err, "could not list virtual machine scale sets") + return nil, fmt.Errorf("could not list virtual machine scale sets: %w", err) } } @@ -489,12 +489,12 @@ func (client *azureClient) getScaleSetVMs(ctx context.Context, scaleSet compute. // TODO do we really need to fetch the resourcegroup this way? r, err := newAzureResourceFromID(*scaleSet.ID, nil) if err != nil { - return nil, errors.Wrap(err, "could not parse scale set ID") + return nil, fmt.Errorf("could not parse scale set ID: %w", err) } result, err := client.vmssvm.List(ctx, r.ResourceGroup, *(scaleSet.Name), "", "", "") if err != nil { - return nil, errors.Wrap(err, "could not list virtual machine scale set vms") + return nil, fmt.Errorf("could not list virtual machine scale set vms: %w", err) } for result.NotDone() { for _, vm := range result.Values() { @@ -502,7 +502,7 @@ func (client *azureClient) getScaleSetVMs(ctx context.Context, scaleSet compute. } err = result.NextWithContext(ctx) if err != nil { - return nil, errors.Wrap(err, "could not list virtual machine scale set vms") + return nil, fmt.Errorf("could not list virtual machine scale set vms: %w", err) } } diff --git a/discovery/consul/consul.go b/discovery/consul/consul.go index d07db78675..8d0a1fea48 100644 --- a/discovery/consul/consul.go +++ b/discovery/consul/consul.go @@ -15,6 +15,7 @@ package consul import ( "context" + "errors" "fmt" "net" "strconv" @@ -24,7 +25,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" consul "github.com/hashicorp/consul/api" - "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/config" "github.com/prometheus/common/model" @@ -291,7 +291,7 @@ func (d *Discovery) getDatacenter() error { dc, ok := info["Config"]["Datacenter"].(string) if !ok { - err := errors.Errorf("invalid value '%v' for Config.Datacenter", info["Config"]["Datacenter"]) + err := fmt.Errorf("invalid value '%v' for Config.Datacenter", info["Config"]["Datacenter"]) level.Error(d.logger).Log("msg", "Error retrieving datacenter name", "err", err) return err } diff --git a/discovery/dns/dns.go b/discovery/dns/dns.go index 6b9860d629..a2294d9307 100644 --- a/discovery/dns/dns.go +++ b/discovery/dns/dns.go @@ -15,6 +15,7 @@ package dns import ( "context" + "errors" "fmt" "net" "strings" @@ -24,7 +25,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" "github.com/miekg/dns" - "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/model" @@ -105,7 +105,7 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { return errors.New("a port is required in DNS-SD configs for all record types except SRV") } default: - return errors.Errorf("invalid DNS-SD records type %s", c.Type) + return fmt.Errorf("invalid DNS-SD records type %s", c.Type) } return nil } @@ -163,7 +163,7 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) { wg.Add(len(d.names)) for _, name := range d.names { go func(n string) { - if err := d.refreshOne(ctx, n, ch); err != nil && err != context.Canceled { + if err := d.refreshOne(ctx, n, ch); err != nil && !errors.Is(err, context.Canceled) { level.Error(d.logger).Log("msg", "Error refreshing DNS targets", "err", err) } wg.Done() @@ -265,7 +265,7 @@ func (d *Discovery) refreshOne(ctx context.Context, name string, ch chan<- *targ func lookupWithSearchPath(name string, qtype uint16, logger log.Logger) (*dns.Msg, error) { conf, err := dns.ClientConfigFromFile(resolvConf) if err != nil { - return nil, errors.Wrap(err, "could not load resolv.conf") + return nil, fmt.Errorf("could not load resolv.conf: %w", err) } allResponsesValid := true @@ -291,7 +291,7 @@ func lookupWithSearchPath(name string, qtype uint16, logger log.Logger) (*dns.Ms return &dns.Msg{}, nil } // Outcome 3: boned. - return nil, errors.Errorf("could not resolve %q: all servers responded with errors to at least one search domain", name) + return nil, fmt.Errorf("could not resolve %q: all servers responded with errors to at least one search domain", name) } // lookupFromAnyServer uses all configured servers to try and resolve a specific @@ -327,7 +327,7 @@ func lookupFromAnyServer(name string, qtype uint16, conf *dns.ClientConfig, logg } } - return nil, errors.Errorf("could not resolve %s: no servers returned a viable answer", name) + return nil, fmt.Errorf("could not resolve %s: no servers returned a viable answer", name) } // askServerForName makes a request to a specific DNS server for a specific diff --git a/discovery/eureka/client.go b/discovery/eureka/client.go index 65c5b67bfe..a833415a53 100644 --- a/discovery/eureka/client.go +++ b/discovery/eureka/client.go @@ -18,10 +18,8 @@ import ( "encoding/xml" "fmt" "io" - "io/ioutil" "net/http" - "github.com/pkg/errors" "github.com/prometheus/common/version" ) @@ -95,18 +93,18 @@ func fetchApps(ctx context.Context, server string, client *http.Client) (*Applic return nil, err } defer func() { - io.Copy(ioutil.Discard, resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() }() if resp.StatusCode/100 != 2 { - return nil, errors.Errorf("non 2xx status '%d' response during eureka service discovery", resp.StatusCode) + return nil, fmt.Errorf("non 2xx status '%d' response during eureka service discovery", resp.StatusCode) } var apps Applications err = xml.NewDecoder(resp.Body).Decode(&apps) if err != nil { - return nil, errors.Wrapf(err, "%q", url) + return nil, fmt.Errorf("%q: %w", url, err) } return &apps, nil } diff --git a/discovery/eureka/eureka.go b/discovery/eureka/eureka.go index 110a5d8622..5d9d8d552d 100644 --- a/discovery/eureka/eureka.go +++ b/discovery/eureka/eureka.go @@ -15,6 +15,7 @@ package eureka import ( "context" + "errors" "net" "net/http" "net/url" @@ -22,7 +23,6 @@ import ( "time" "github.com/go-kit/log" - "github.com/pkg/errors" "github.com/prometheus/common/config" "github.com/prometheus/common/model" diff --git a/discovery/file/file.go b/discovery/file/file.go index 6d645e90d4..8fa1d97437 100644 --- a/discovery/file/file.go +++ b/discovery/file/file.go @@ -16,8 +16,9 @@ package file import ( "context" "encoding/json" + "errors" "fmt" - "io/ioutil" + "io" "os" "path/filepath" "strings" @@ -28,7 +29,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" "github.com/grafana/regexp" - "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/config" "github.com/prometheus/common/model" @@ -99,7 +99,7 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { } for _, name := range c.Files { if !patFileSDName.MatchString(name) { - return errors.Errorf("path name %q is not valid for file discovery", name) + return fmt.Errorf("path name %q is not valid for file discovery", name) } } return nil @@ -376,7 +376,7 @@ func (d *Discovery) readFile(filename string) ([]*targetgroup.Group, error) { } defer fd.Close() - content, err := ioutil.ReadAll(fd) + content, err := io.ReadAll(fd) if err != nil { return nil, err } @@ -398,7 +398,7 @@ func (d *Discovery) readFile(filename string) ([]*targetgroup.Group, error) { return nil, err } default: - panic(errors.Errorf("discovery.File.readFile: unhandled file extension %q", ext)) + panic(fmt.Errorf("discovery.File.readFile: unhandled file extension %q", ext)) } for i, tg := range targetGroups { diff --git a/discovery/file/file_test.go b/discovery/file/file_test.go index 6c4e022d25..e3b59b4743 100644 --- a/discovery/file/file_test.go +++ b/discovery/file/file_test.go @@ -17,7 +17,6 @@ import ( "context" "encoding/json" "io" - "io/ioutil" "os" "path/filepath" "sort" @@ -73,7 +72,7 @@ func (t *testRunner) copyFile(src string) string { func (t *testRunner) copyFileTo(src, name string) string { t.Helper() - newf, err := ioutil.TempFile(t.dir, "") + newf, err := os.CreateTemp(t.dir, "") require.NoError(t, err) f, err := os.Open(src) @@ -95,7 +94,7 @@ func (t *testRunner) copyFileTo(src, name string) string { func (t *testRunner) writeString(file, data string) { t.Helper() - newf, err := ioutil.TempFile(t.dir, "") + newf, err := os.CreateTemp(t.dir, "") require.NoError(t, err) _, err = newf.WriteString(data) diff --git a/discovery/gce/gce.go b/discovery/gce/gce.go index e17c60f71d..887188e2db 100644 --- a/discovery/gce/gce.go +++ b/discovery/gce/gce.go @@ -15,6 +15,7 @@ package gce import ( "context" + "errors" "fmt" "net/http" "strconv" @@ -22,7 +23,6 @@ import ( "time" "github.com/go-kit/log" - "github.com/pkg/errors" "github.com/prometheus/common/model" "golang.org/x/oauth2/google" compute "google.golang.org/api/compute/v1" @@ -132,11 +132,11 @@ func NewDiscovery(conf SDConfig, logger log.Logger) (*Discovery, error) { var err error d.client, err = google.DefaultClient(context.Background(), compute.ComputeReadonlyScope) if err != nil { - return nil, errors.Wrap(err, "error setting up communication with GCE service") + return nil, fmt.Errorf("error setting up communication with GCE service: %w", err) } d.svc, err = compute.NewService(context.Background(), option.WithHTTPClient(d.client)) if err != nil { - return nil, errors.Wrap(err, "error setting up communication with GCE service") + return nil, fmt.Errorf("error setting up communication with GCE service: %w", err) } d.isvc = compute.NewInstancesService(d.svc) @@ -221,7 +221,7 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) { return nil }) if err != nil { - return nil, errors.Wrap(err, "error retrieving refresh targets from gce") + return nil, fmt.Errorf("error retrieving refresh targets from gce: %w", err) } return []*targetgroup.Group{tg}, nil } diff --git a/discovery/hetzner/hetzner.go b/discovery/hetzner/hetzner.go index b7c7578e2a..084319d959 100644 --- a/discovery/hetzner/hetzner.go +++ b/discovery/hetzner/hetzner.go @@ -15,11 +15,12 @@ package hetzner import ( "context" + "errors" + "fmt" "time" "github.com/go-kit/log" "github.com/hetznercloud/hcloud-go/hcloud" - "github.com/pkg/errors" "github.com/prometheus/common/config" "github.com/prometheus/common/model" @@ -95,7 +96,7 @@ func (c *role) UnmarshalYAML(unmarshal func(interface{}) error) error { case hetznerRoleRobot, hetznerRoleHcloud: return nil default: - return errors.Errorf("unknown role %q", *c) + return fmt.Errorf("unknown role %q", *c) } } @@ -114,6 +115,11 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { return c.HTTPClientConfig.Validate() } +// SetDirectory joins any relative file paths with dir. +func (c *SDConfig) SetDirectory(dir string) { + c.HTTPClientConfig.SetDirectory(dir) +} + // Discovery periodically performs Hetzner requests. It implements // the Discoverer interface. type Discovery struct { diff --git a/discovery/hetzner/robot.go b/discovery/hetzner/robot.go index d0f3e4d948..4b7abaf77f 100644 --- a/discovery/hetzner/robot.go +++ b/discovery/hetzner/robot.go @@ -18,7 +18,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net" "net/http" "strconv" @@ -26,7 +25,6 @@ import ( "time" "github.com/go-kit/log" - "github.com/pkg/errors" "github.com/prometheus/common/config" "github.com/prometheus/common/model" "github.com/prometheus/common/version" @@ -85,15 +83,15 @@ func (d *robotDiscovery) refresh(ctx context.Context) ([]*targetgroup.Group, err } defer func() { - io.Copy(ioutil.Discard, resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() }() if resp.StatusCode/100 != 2 { - return nil, errors.Errorf("non 2xx status '%d' response during hetzner service discovery with role robot", resp.StatusCode) + return nil, fmt.Errorf("non 2xx status '%d' response during hetzner service discovery with role robot", resp.StatusCode) } - b, err := ioutil.ReadAll(resp.Body) + b, err := io.ReadAll(resp.Body) if err != nil { return nil, err } diff --git a/discovery/http/http.go b/discovery/http/http.go index 09a100c6b2..b091461837 100644 --- a/discovery/http/http.go +++ b/discovery/http/http.go @@ -16,9 +16,9 @@ package http import ( "context" "encoding/json" + "errors" "fmt" "io" - "io/ioutil" "net/http" "net/url" "strconv" @@ -27,7 +27,6 @@ import ( "github.com/go-kit/log" "github.com/grafana/regexp" - "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/config" "github.com/prometheus/common/model" @@ -157,21 +156,21 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) { return nil, err } defer func() { - io.Copy(ioutil.Discard, resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() }() if resp.StatusCode != http.StatusOK { failuresCount.Inc() - return nil, errors.Errorf("server returned HTTP status %s", resp.Status) + return nil, fmt.Errorf("server returned HTTP status %s", resp.Status) } if !matchContentType.MatchString(strings.TrimSpace(resp.Header.Get("Content-Type"))) { failuresCount.Inc() - return nil, errors.Errorf("unsupported content type %q", resp.Header.Get("Content-Type")) + return nil, fmt.Errorf("unsupported content type %q", resp.Header.Get("Content-Type")) } - b, err := ioutil.ReadAll(resp.Body) + b, err := io.ReadAll(resp.Body) if err != nil { failuresCount.Inc() return nil, err diff --git a/discovery/install/install.go b/discovery/install/install.go index e16b348f6b..d8a5a82cb4 100644 --- a/discovery/install/install.go +++ b/discovery/install/install.go @@ -26,6 +26,7 @@ import ( _ "github.com/prometheus/prometheus/discovery/gce" // register gce _ "github.com/prometheus/prometheus/discovery/hetzner" // register hetzner _ "github.com/prometheus/prometheus/discovery/http" // register http + _ "github.com/prometheus/prometheus/discovery/ionos" // register ionos _ "github.com/prometheus/prometheus/discovery/kubernetes" // register kubernetes _ "github.com/prometheus/prometheus/discovery/linode" // register linode _ "github.com/prometheus/prometheus/discovery/marathon" // register marathon @@ -35,6 +36,7 @@ import ( _ "github.com/prometheus/prometheus/discovery/scaleway" // register scaleway _ "github.com/prometheus/prometheus/discovery/triton" // register triton _ "github.com/prometheus/prometheus/discovery/uyuni" // register uyuni + _ "github.com/prometheus/prometheus/discovery/vultr" // register vultr _ "github.com/prometheus/prometheus/discovery/xds" // register xds _ "github.com/prometheus/prometheus/discovery/zookeeper" // register zookeeper ) diff --git a/discovery/ionos/ionos.go b/discovery/ionos/ionos.go new file mode 100644 index 0000000000..a13a000585 --- /dev/null +++ b/discovery/ionos/ionos.go @@ -0,0 +1,111 @@ +// Copyright 2022 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ionos + +import ( + "time" + + "github.com/go-kit/log" + "github.com/pkg/errors" + "github.com/prometheus/common/config" + "github.com/prometheus/common/model" + + "github.com/prometheus/prometheus/discovery" + "github.com/prometheus/prometheus/discovery/refresh" +) + +const ( + // metaLabelPrefix is the meta prefix used for all meta labels in this + // discovery. + metaLabelPrefix = model.MetaLabelPrefix + "ionos_" + metaLabelSeparator = "," +) + +func init() { + discovery.RegisterConfig(&SDConfig{}) +} + +// Discovery periodically performs IONOS Cloud target discovery. It implements +// the Discoverer interface. +type Discovery struct{} + +// NewDiscovery returns a new refresh.Discovery for IONOS Cloud. +func NewDiscovery(conf *SDConfig, logger log.Logger) (*refresh.Discovery, error) { + if conf.ionosEndpoint == "" { + conf.ionosEndpoint = "https://api.ionos.com" + } + + d, err := newServerDiscovery(conf, logger) + if err != nil { + return nil, err + } + + return refresh.NewDiscovery( + logger, + "ionos", + time.Duration(conf.RefreshInterval), + d.refresh, + ), nil +} + +// DefaultSDConfig is the default IONOS Cloud service discovery configuration. +var DefaultSDConfig = SDConfig{ + HTTPClientConfig: config.DefaultHTTPClientConfig, + RefreshInterval: model.Duration(60 * time.Second), + Port: 80, +} + +// SDConfig configuration to use for IONOS Cloud Discovery. +type SDConfig struct { + // DatacenterID: IONOS Cloud data center ID used to discover targets. + DatacenterID string `yaml:"datacenter_id"` + + HTTPClientConfig config.HTTPClientConfig `yaml:",inline"` + + RefreshInterval model.Duration `yaml:"refresh_interval"` + Port int `yaml:"port"` + + ionosEndpoint string // For tests only. +} + +// Name returns the name of the IONOS Cloud service discovery. +func (c SDConfig) Name() string { + return "ionos" +} + +// NewDiscoverer returns a new discovery.Discoverer for IONOS Cloud. +func (c SDConfig) NewDiscoverer(options discovery.DiscovererOptions) (discovery.Discoverer, error) { + return NewDiscovery(&c, options.Logger) +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { + *c = DefaultSDConfig + type plain SDConfig + err := unmarshal((*plain)(c)) + if err != nil { + return err + } + + if c.DatacenterID == "" { + return errors.New("datacenter id can't be empty") + } + + return c.HTTPClientConfig.Validate() +} + +// SetDirectory joins any relative file paths with dir. +func (c *SDConfig) SetDirectory(dir string) { + c.HTTPClientConfig.SetDirectory(dir) +} diff --git a/discovery/ionos/server.go b/discovery/ionos/server.go new file mode 100644 index 0000000000..8ac3639705 --- /dev/null +++ b/discovery/ionos/server.go @@ -0,0 +1,166 @@ +// Copyright 2022 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ionos + +import ( + "context" + "fmt" + "net" + "net/http" + "strconv" + "strings" + "time" + + "github.com/go-kit/log" + ionoscloud "github.com/ionos-cloud/sdk-go/v6" + "github.com/prometheus/common/config" + "github.com/prometheus/common/model" + "github.com/prometheus/common/version" + + "github.com/prometheus/prometheus/discovery/refresh" + "github.com/prometheus/prometheus/discovery/targetgroup" + "github.com/prometheus/prometheus/util/strutil" +) + +const ( + serverLabelPrefix = metaLabelPrefix + "server_" + + serverAvailabilityZoneLabel = serverLabelPrefix + "availability_zone" + serverBootCDROMIDLabel = serverLabelPrefix + "boot_cdrom_id" + serverBootImageIDLabel = serverLabelPrefix + "boot_image_id" + serverBootVolumeIDLabel = serverLabelPrefix + "boot_volume_id" + serverCPUFamilyLabel = serverLabelPrefix + "cpu_family" + serverIDLabel = serverLabelPrefix + "id" + serverIPLabel = serverLabelPrefix + "ip" + serverLifecycleLabel = serverLabelPrefix + "lifecycle" + serverNameLabel = serverLabelPrefix + "name" + serverNICIPLabelPrefix = serverLabelPrefix + "nic_ip_" + serverServersIDLabel = serverLabelPrefix + "servers_id" + serverStateLabel = serverLabelPrefix + "state" + serverTypeLabel = serverLabelPrefix + "type" + + nicDefaultName = "unnamed" +) + +type serverDiscovery struct { + *refresh.Discovery + client *ionoscloud.APIClient + port int + datacenterID string +} + +func newServerDiscovery(conf *SDConfig, logger log.Logger) (*serverDiscovery, error) { + d := &serverDiscovery{ + port: conf.Port, + datacenterID: conf.DatacenterID, + } + + rt, err := config.NewRoundTripperFromConfig(conf.HTTPClientConfig, "ionos_sd") + if err != nil { + return nil, err + } + + // Username, password and token are set via http client config. + cfg := ionoscloud.NewConfiguration("", "", "", conf.ionosEndpoint) + cfg.HTTPClient = &http.Client{ + Transport: rt, + Timeout: time.Duration(conf.RefreshInterval), + } + cfg.UserAgent = fmt.Sprintf("Prometheus/%s", version.Version) + + d.client = ionoscloud.NewAPIClient(cfg) + + return d, nil +} + +func (d *serverDiscovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) { + api := d.client.ServersApi + + servers, _, err := api.DatacentersServersGet(ctx, d.datacenterID). + Depth(3). + Execute() + if err != nil { + return nil, err + } + + var targets []model.LabelSet + for _, server := range *servers.Items { + var ips []string + ipsByNICName := make(map[string][]string) + + if server.Entities != nil && server.Entities.Nics != nil { + for _, nic := range *server.Entities.Nics.Items { + nicName := nicDefaultName + if name := nic.Properties.Name; name != nil { + nicName = *name + } + + nicIPs := *nic.Properties.Ips + ips = append(nicIPs, ips...) + ipsByNICName[nicName] = append(nicIPs, ipsByNICName[nicName]...) + } + } + + // If a server has no IP addresses, it's being dropped from the targets. + if len(ips) == 0 { + continue + } + + addr := net.JoinHostPort(ips[0], strconv.FormatUint(uint64(d.port), 10)) + labels := model.LabelSet{ + model.AddressLabel: model.LabelValue(addr), + serverAvailabilityZoneLabel: model.LabelValue(*server.Properties.AvailabilityZone), + serverCPUFamilyLabel: model.LabelValue(*server.Properties.CpuFamily), + serverServersIDLabel: model.LabelValue(*servers.Id), + serverIDLabel: model.LabelValue(*server.Id), + serverIPLabel: model.LabelValue(join(ips, metaLabelSeparator)), + serverLifecycleLabel: model.LabelValue(*server.Metadata.State), + serverNameLabel: model.LabelValue(*server.Properties.Name), + serverStateLabel: model.LabelValue(*server.Properties.VmState), + serverTypeLabel: model.LabelValue(*server.Properties.Type), + } + + for nicName, nicIPs := range ipsByNICName { + name := serverNICIPLabelPrefix + strutil.SanitizeLabelName(nicName) + labels[model.LabelName(name)] = model.LabelValue(join(nicIPs, metaLabelSeparator)) + } + + if server.Properties.BootCdrom != nil { + labels[serverBootCDROMIDLabel] = model.LabelValue(*server.Properties.BootCdrom.Id) + } + + if server.Properties.BootVolume != nil { + labels[serverBootVolumeIDLabel] = model.LabelValue(*server.Properties.BootVolume.Id) + } + + if server.Entities != nil && server.Entities.Volumes != nil { + volumes := *server.Entities.Volumes.Items + if len(volumes) > 0 { + image := volumes[0].Properties.Image + if image != nil { + labels[serverBootImageIDLabel] = model.LabelValue(*image) + } + } + } + + targets = append(targets, labels) + } + + return []*targetgroup.Group{{Source: "ionos", Targets: targets}}, nil +} + +// join returns strings.Join with additional separators at beginning and end. +func join(elems []string, sep string) string { + return sep + strings.Join(elems, sep) + sep +} diff --git a/discovery/ionos/server_test.go b/discovery/ionos/server_test.go new file mode 100644 index 0000000000..92f2a96f9d --- /dev/null +++ b/discovery/ionos/server_test.go @@ -0,0 +1,115 @@ +// Copyright 2022 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ionos + +import ( + "context" + "fmt" + "net/http" + "net/http/httptest" + "os" + "testing" + + ionoscloud "github.com/ionos-cloud/sdk-go/v6" + "github.com/prometheus/common/config" + "github.com/prometheus/common/model" + "github.com/stretchr/testify/require" +) + +var ( + ionosTestBearerToken = config.Secret("jwt") + ionosTestDatacenterID = "8feda53f-15f0-447f-badf-ebe32dad2fc0" +) + +func TestIONOSServerRefresh(t *testing.T) { + mock := httptest.NewServer(http.HandlerFunc(mockIONOSServers)) + defer mock.Close() + + cfg := DefaultSDConfig + cfg.DatacenterID = ionosTestDatacenterID + cfg.HTTPClientConfig.BearerToken = ionosTestBearerToken + cfg.ionosEndpoint = mock.URL + + d, err := newServerDiscovery(&cfg, nil) + require.NoError(t, err) + + ctx := context.Background() + tgs, err := d.refresh(ctx) + require.NoError(t, err) + + require.Equal(t, 1, len(tgs)) + + tg := tgs[0] + require.NotNil(t, tg) + require.NotNil(t, tg.Targets) + require.Equal(t, 2, len(tg.Targets)) + + for i, lbls := range []model.LabelSet{ + { + "__address__": "85.215.243.177:80", + "__meta_ionos_server_availability_zone": "ZONE_2", + "__meta_ionos_server_boot_cdrom_id": "0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "__meta_ionos_server_cpu_family": "INTEL_SKYLAKE", + "__meta_ionos_server_id": "b501942c-4e08-43e6-8ec1-00e59c64e0e4", + "__meta_ionos_server_ip": ",85.215.243.177,185.56.150.9,85.215.238.118,", + "__meta_ionos_server_nic_ip_metrics": ",85.215.243.177,", + "__meta_ionos_server_nic_ip_unnamed": ",185.56.150.9,85.215.238.118,", + "__meta_ionos_server_lifecycle": "AVAILABLE", + "__meta_ionos_server_name": "prometheus-2", + "__meta_ionos_server_servers_id": "8feda53f-15f0-447f-badf-ebe32dad2fc0/servers", + "__meta_ionos_server_state": "RUNNING", + "__meta_ionos_server_type": "ENTERPRISE", + }, + { + "__address__": "85.215.248.84:80", + "__meta_ionos_server_availability_zone": "ZONE_1", + "__meta_ionos_server_boot_cdrom_id": "0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "__meta_ionos_server_cpu_family": "INTEL_SKYLAKE", + "__meta_ionos_server_id": "523415e6-ff8c-4dc0-86d3-09c256039b30", + "__meta_ionos_server_ip": ",85.215.248.84,", + "__meta_ionos_server_nic_ip_unnamed": ",85.215.248.84,", + "__meta_ionos_server_lifecycle": "AVAILABLE", + "__meta_ionos_server_name": "prometheus-1", + "__meta_ionos_server_servers_id": "8feda53f-15f0-447f-badf-ebe32dad2fc0/servers", + "__meta_ionos_server_state": "RUNNING", + "__meta_ionos_server_type": "ENTERPRISE", + }, + } { + t.Run(fmt.Sprintf("item %d", i), func(t *testing.T) { + require.Equal(t, lbls, tg.Targets[i]) + }) + } +} + +func mockIONOSServers(w http.ResponseWriter, r *http.Request) { + if r.Header.Get("Authorization") != fmt.Sprintf("Bearer %s", ionosTestBearerToken) { + http.Error(w, "bad token", http.StatusUnauthorized) + return + } + if r.URL.Path != fmt.Sprintf("%s/datacenters/%s/servers", ionoscloud.DefaultIonosBasePath, ionosTestDatacenterID) { + http.Error(w, fmt.Sprintf("bad url: %s", r.URL.Path), http.StatusNotFound) + return + } + w.Header().Set("Content-Type", "application/json") + server, err := os.ReadFile("testdata/servers.json") + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + _, err = w.Write(server) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } +} diff --git a/discovery/ionos/testdata/servers.json b/discovery/ionos/testdata/servers.json new file mode 100644 index 0000000000..2af80bfa16 --- /dev/null +++ b/discovery/ionos/testdata/servers.json @@ -0,0 +1,615 @@ +{ + "id": "8feda53f-15f0-447f-badf-ebe32dad2fc0/servers", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers", + "items": [ + { + "id": "d6bf44ee-f7e8-4e19-8716-96fdd18cc697", + "type": "server", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/d6bf44ee-f7e8-4e19-8716-96fdd18cc697", + "metadata": { + "etag": "3bd2cf1f190fdba8502ba8c0cc79433e", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "prometheus-3", + "cores": 2, + "ram": 4096, + "availabilityZone": "AUTO", + "vmState": "RUNNING", + "bootCdrom": { + "id": "0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "type": "image", + "href": "https://api.ionos.com/cloudapi/v6/images/0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "metadata": { + "etag": "ca643281fd2a5b68002bc00ac0ecd920", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "debian-10.0.0-amd64-netinst.iso", + "description": null, + "location": "de/txl", + "size": 0.33, + "cpuHotPlug": true, + "cpuHotUnplug": false, + "ramHotPlug": true, + "ramHotUnplug": false, + "nicHotPlug": true, + "nicHotUnplug": true, + "discVirtioHotPlug": true, + "discVirtioHotUnplug": true, + "discScsiHotPlug": false, + "discScsiHotUnplug": false, + "licenceType": "LINUX", + "imageType": "CDROM", + "imageAliases": [ + "debian:latest_iso", + "debian:10_iso" + ], + "cloudInit": "NONE", + "public": true + } + }, + "bootVolume": null, + "cpuFamily": "INTEL_SKYLAKE", + "type": "ENTERPRISE" + }, + "entities": { + "cdroms": { + "id": "d6bf44ee-f7e8-4e19-8716-96fdd18cc697/cdroms", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/d6bf44ee-f7e8-4e19-8716-96fdd18cc697/cdroms", + "items": [ + { + "id": "0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "type": "image", + "href": "https://api.ionos.com/cloudapi/v6/images/0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "metadata": { + "etag": "ca643281fd2a5b68002bc00ac0ecd920", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "debian-10.0.0-amd64-netinst.iso", + "description": null, + "location": "de/txl", + "size": 0.33, + "cpuHotPlug": true, + "cpuHotUnplug": false, + "ramHotPlug": true, + "ramHotUnplug": false, + "nicHotPlug": true, + "nicHotUnplug": true, + "discVirtioHotPlug": true, + "discVirtioHotUnplug": true, + "discScsiHotPlug": false, + "discScsiHotUnplug": false, + "licenceType": "LINUX", + "imageType": "CDROM", + "imageAliases": [ + "debian:10_iso", + "debian:latest_iso" + ], + "cloudInit": "NONE", + "public": true + } + } + ] + }, + "volumes": { + "id": "d6bf44ee-f7e8-4e19-8716-96fdd18cc697/volumes", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/d6bf44ee-f7e8-4e19-8716-96fdd18cc697/volumes", + "items": [] + }, + "nics": { + "id": "d6bf44ee-f7e8-4e19-8716-96fdd18cc697/nics", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/d6bf44ee-f7e8-4e19-8716-96fdd18cc697/nics", + "items": [] + } + } + }, + { + "id": "b501942c-4e08-43e6-8ec1-00e59c64e0e4", + "type": "server", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4", + "metadata": { + "etag": "fe405a5f2e041d506086ee0c2159b678", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "prometheus-2", + "cores": 1, + "ram": 1024, + "availabilityZone": "ZONE_2", + "vmState": "RUNNING", + "bootCdrom": { + "id": "0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "type": "image", + "href": "https://api.ionos.com/cloudapi/v6/images/0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "metadata": { + "etag": "ca643281fd2a5b68002bc00ac0ecd920", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "debian-10.0.0-amd64-netinst.iso", + "description": null, + "location": "de/txl", + "size": 0.33, + "cpuHotPlug": true, + "cpuHotUnplug": false, + "ramHotPlug": true, + "ramHotUnplug": false, + "nicHotPlug": true, + "nicHotUnplug": true, + "discVirtioHotPlug": true, + "discVirtioHotUnplug": true, + "discScsiHotPlug": false, + "discScsiHotUnplug": false, + "licenceType": "LINUX", + "imageType": "CDROM", + "imageAliases": [ + "debian:latest_iso", + "debian:10_iso" + ], + "cloudInit": "NONE", + "public": true + } + }, + "bootVolume": null, + "cpuFamily": "INTEL_SKYLAKE", + "type": "ENTERPRISE" + }, + "entities": { + "cdroms": { + "id": "b501942c-4e08-43e6-8ec1-00e59c64e0e4/cdroms", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/cdroms", + "items": [ + { + "id": "0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "type": "image", + "href": "https://api.ionos.com/cloudapi/v6/images/0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "metadata": { + "etag": "ca643281fd2a5b68002bc00ac0ecd920", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "debian-10.0.0-amd64-netinst.iso", + "description": null, + "location": "de/txl", + "size": 0.33, + "cpuHotPlug": true, + "cpuHotUnplug": false, + "ramHotPlug": true, + "ramHotUnplug": false, + "nicHotPlug": true, + "nicHotUnplug": true, + "discVirtioHotPlug": true, + "discVirtioHotUnplug": true, + "discScsiHotPlug": false, + "discScsiHotUnplug": false, + "licenceType": "LINUX", + "imageType": "CDROM", + "imageAliases": [ + "debian:10_iso", + "debian:latest_iso" + ], + "cloudInit": "NONE", + "public": true + } + } + ] + }, + "volumes": { + "id": "b501942c-4e08-43e6-8ec1-00e59c64e0e4/volumes", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/volumes", + "items": [ + { + "id": "97a58f00-e2a5-4ebb-8b9a-f694837b0548", + "type": "volume", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/volumes/97a58f00-e2a5-4ebb-8b9a-f694837b0548", + "metadata": { + "etag": "27491713a77c5453c6ae7d0f98a1beec", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "prometheus-data-1", + "type": "HDD", + "size": 10, + "availabilityZone": "AUTO", + "image": null, + "imagePassword": null, + "sshKeys": null, + "bus": "VIRTIO", + "licenceType": "UNKNOWN", + "cpuHotPlug": false, + "ramHotPlug": false, + "nicHotPlug": false, + "nicHotUnplug": false, + "discVirtioHotPlug": false, + "discVirtioHotUnplug": false, + "deviceNumber": 1, + "userData": null, + "pciSlot": 6, + "bootServer": "b501942c-4e08-43e6-8ec1-00e59c64e0e4" + } + } + ] + }, + "nics": { + "id": "b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics", + "items": [ + { + "id": "206e9a88-097c-4c87-8544-1f5fe0b6b0f1", + "type": "nic", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics/206e9a88-097c-4c87-8544-1f5fe0b6b0f1", + "metadata": { + "etag": "be2b6fff29e7e09c1a4a5ca150876eaa", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": null, + "mac": "02:01:4b:1c:cf:57", + "ips": [ + "85.215.238.118" + ], + "dhcp": true, + "lan": 1, + "firewallActive": false, + "firewallType": "INGRESS", + "deviceNumber": 1, + "pciSlot": 5 + }, + "entities": { + "firewallrules": { + "id": "206e9a88-097c-4c87-8544-1f5fe0b6b0f1/firewallrules", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics/206e9a88-097c-4c87-8544-1f5fe0b6b0f1/firewallrules" + }, + "flowlogs": { + "id": "206e9a88-097c-4c87-8544-1f5fe0b6b0f1/flowlogs", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics/206e9a88-097c-4c87-8544-1f5fe0b6b0f1/flowlogs" + } + } + }, + { + "id": "8a568a32-da62-437d-8b73-f580d1a1588f", + "type": "nic", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics/8a568a32-da62-437d-8b73-f580d1a1588f", + "metadata": { + "etag": "2dca0340a0610b1dfdb2e66f6aae3ed3", + "createdDate": "2022-05-05T13:12:31Z", + "createdBy": "felix.ehrenpfort@codecentric.cloud", + "createdByUserId": "cfcb4526-fbe0-461e-9149-ffb00a83fbec", + "lastModifiedDate": "2022-05-05T13:12:31Z", + "lastModifiedBy": "felix.ehrenpfort@codecentric.cloud", + "lastModifiedByUserId": "cfcb4526-fbe0-461e-9149-ffb00a83fbec", + "state": "AVAILABLE" + }, + "properties": { + "name": null, + "mac": "02:01:56:f6:47:a8", + "ips": [ + "185.56.150.9" + ], + "dhcp": true, + "lan": 1, + "firewallActive": false, + "firewallType": "INGRESS", + "deviceNumber": 3, + "pciSlot": 8 + }, + "entities": { + "firewallrules": { + "id": "8a568a32-da62-437d-8b73-f580d1a1588f/firewallrules", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics/8a568a32-da62-437d-8b73-f580d1a1588f/firewallrules" + }, + "flowlogs": { + "id": "8a568a32-da62-437d-8b73-f580d1a1588f/flowlogs", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics/8a568a32-da62-437d-8b73-f580d1a1588f/flowlogs" + } + } + }, + { + "id": "17ecc866-4a08-4ada-858f-7b726a5f5070", + "type": "nic", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics/17ecc866-4a08-4ada-858f-7b726a5f5070", + "metadata": { + "etag": "f6a82276c6fdb460811d3789e54e0054", + "createdDate": "2022-05-05T11:45:36Z", + "createdBy": "felix.ehrenpfort@codecentric.cloud", + "createdByUserId": "cfcb4526-fbe0-461e-9149-ffb00a83fbec", + "lastModifiedDate": "2022-05-05T11:45:36Z", + "lastModifiedBy": "felix.ehrenpfort@codecentric.cloud", + "lastModifiedByUserId": "cfcb4526-fbe0-461e-9149-ffb00a83fbec", + "state": "AVAILABLE" + }, + "properties": { + "name": "metrics", + "mac": "02:01:93:80:fa:a4", + "ips": [ + "85.215.243.177" + ], + "dhcp": true, + "lan": 1, + "firewallActive": false, + "firewallType": "INGRESS", + "deviceNumber": 2, + "pciSlot": 7 + }, + "entities": { + "firewallrules": { + "id": "17ecc866-4a08-4ada-858f-7b726a5f5070/firewallrules", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics/17ecc866-4a08-4ada-858f-7b726a5f5070/firewallrules" + }, + "flowlogs": { + "id": "17ecc866-4a08-4ada-858f-7b726a5f5070/flowlogs", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics/17ecc866-4a08-4ada-858f-7b726a5f5070/flowlogs" + } + } + } + ] + } + } + }, + { + "id": "523415e6-ff8c-4dc0-86d3-09c256039b30", + "type": "server", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/523415e6-ff8c-4dc0-86d3-09c256039b30", + "metadata": { + "etag": "fe405a5f2e041d506086ee0c2159b678", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "prometheus-1", + "cores": 1, + "ram": 1024, + "availabilityZone": "ZONE_1", + "vmState": "RUNNING", + "bootCdrom": { + "id": "0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "type": "image", + "href": "https://api.ionos.com/cloudapi/v6/images/0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "metadata": { + "etag": "ca643281fd2a5b68002bc00ac0ecd920", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "debian-10.0.0-amd64-netinst.iso", + "description": null, + "location": "de/txl", + "size": 0.33, + "cpuHotPlug": true, + "cpuHotUnplug": false, + "ramHotPlug": true, + "ramHotUnplug": false, + "nicHotPlug": true, + "nicHotUnplug": true, + "discVirtioHotPlug": true, + "discVirtioHotUnplug": true, + "discScsiHotPlug": false, + "discScsiHotUnplug": false, + "licenceType": "LINUX", + "imageType": "CDROM", + "imageAliases": [ + "debian:latest_iso", + "debian:10_iso" + ], + "cloudInit": "NONE", + "public": true + } + }, + "bootVolume": null, + "cpuFamily": "INTEL_SKYLAKE", + "type": "ENTERPRISE" + }, + "entities": { + "cdroms": { + "id": "523415e6-ff8c-4dc0-86d3-09c256039b30/cdroms", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/523415e6-ff8c-4dc0-86d3-09c256039b30/cdroms", + "items": [ + { + "id": "0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "type": "image", + "href": "https://api.ionos.com/cloudapi/v6/images/0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "metadata": { + "etag": "ca643281fd2a5b68002bc00ac0ecd920", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "debian-10.0.0-amd64-netinst.iso", + "description": null, + "location": "de/txl", + "size": 0.33, + "cpuHotPlug": true, + "cpuHotUnplug": false, + "ramHotPlug": true, + "ramHotUnplug": false, + "nicHotPlug": true, + "nicHotUnplug": true, + "discVirtioHotPlug": true, + "discVirtioHotUnplug": true, + "discScsiHotPlug": false, + "discScsiHotUnplug": false, + "licenceType": "LINUX", + "imageType": "CDROM", + "imageAliases": [ + "debian:10_iso", + "debian:latest_iso" + ], + "cloudInit": "NONE", + "public": true + } + } + ] + }, + "volumes": { + "id": "523415e6-ff8c-4dc0-86d3-09c256039b30/volumes", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/523415e6-ff8c-4dc0-86d3-09c256039b30/volumes", + "items": [ + { + "id": "5dc21326-7e33-4dc7-84ac-63b02aad4624", + "type": "volume", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/volumes/5dc21326-7e33-4dc7-84ac-63b02aad4624", + "metadata": { + "etag": "27491713a77c5453c6ae7d0f98a1beec", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "prometheus-data-2", + "type": "HDD", + "size": 10, + "availabilityZone": "AUTO", + "image": null, + "imagePassword": null, + "sshKeys": null, + "bus": "VIRTIO", + "licenceType": "UNKNOWN", + "cpuHotPlug": false, + "ramHotPlug": false, + "nicHotPlug": false, + "nicHotUnplug": false, + "discVirtioHotPlug": false, + "discVirtioHotUnplug": false, + "deviceNumber": 1, + "userData": null, + "pciSlot": 6, + "bootServer": "523415e6-ff8c-4dc0-86d3-09c256039b30" + } + } + ] + }, + "nics": { + "id": "523415e6-ff8c-4dc0-86d3-09c256039b30/nics", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/523415e6-ff8c-4dc0-86d3-09c256039b30/nics", + "items": [ + { + "id": "684033a2-317f-4977-8a01-68263d59336c", + "type": "nic", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/523415e6-ff8c-4dc0-86d3-09c256039b30/nics/684033a2-317f-4977-8a01-68263d59336c", + "metadata": { + "etag": "fe405a5f2e041d506086ee0c2159b678", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": null, + "mac": "02:01:17:12:27:1b", + "ips": [ + "85.215.248.84" + ], + "dhcp": true, + "lan": 1, + "firewallActive": false, + "firewallType": "INGRESS", + "deviceNumber": 1, + "pciSlot": 5 + }, + "entities": { + "firewallrules": { + "id": "684033a2-317f-4977-8a01-68263d59336c/firewallrules", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/523415e6-ff8c-4dc0-86d3-09c256039b30/nics/684033a2-317f-4977-8a01-68263d59336c/firewallrules" + }, + "flowlogs": { + "id": "684033a2-317f-4977-8a01-68263d59336c/flowlogs", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/523415e6-ff8c-4dc0-86d3-09c256039b30/nics/684033a2-317f-4977-8a01-68263d59336c/flowlogs" + } + } + } + ] + } + } + } + ] +} diff --git a/discovery/kubernetes/endpoints.go b/discovery/kubernetes/endpoints.go index 510b33f448..14615a09c7 100644 --- a/discovery/kubernetes/endpoints.go +++ b/discovery/kubernetes/endpoints.go @@ -15,12 +15,13 @@ package kubernetes import ( "context" + "errors" + "fmt" "net" "strconv" "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/pkg/errors" "github.com/prometheus/common/model" apiv1 "k8s.io/api/core/v1" "k8s.io/client-go/tools/cache" @@ -135,7 +136,7 @@ func (e *Endpoints) Run(ctx context.Context, ch chan<- []*targetgroup.Group) { defer e.queue.ShutDown() if !cache.WaitForCacheSync(ctx.Done(), e.endpointsInf.HasSynced, e.serviceInf.HasSynced, e.podInf.HasSynced) { - if ctx.Err() != context.Canceled { + if !errors.Is(ctx.Err(), context.Canceled) { level.Error(e.logger).Log("msg", "endpoints informer unable to sync cache") } return @@ -188,7 +189,7 @@ func convertToEndpoints(o interface{}) (*apiv1.Endpoints, error) { return endpoints, nil } - return nil, errors.Errorf("received unexpected object: %v", o) + return nil, fmt.Errorf("received unexpected object: %v", o) } func endpointsSource(ep *apiv1.Endpoints) string { diff --git a/discovery/kubernetes/endpointslice.go b/discovery/kubernetes/endpointslice.go index e0ff30546e..31bc14dd77 100644 --- a/discovery/kubernetes/endpointslice.go +++ b/discovery/kubernetes/endpointslice.go @@ -15,12 +15,12 @@ package kubernetes import ( "context" + "fmt" "net" "strconv" "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/pkg/errors" "github.com/prometheus/common/model" apiv1 "k8s.io/api/core/v1" v1 "k8s.io/api/discovery/v1" @@ -193,7 +193,7 @@ func (e *EndpointSlice) getEndpointSliceAdaptor(o interface{}) (endpointSliceAda case *v1beta1.EndpointSlice: return newEndpointSliceAdaptorFromV1beta1(endpointSlice), nil default: - return nil, errors.Errorf("received unexpected object: %v", o) + return nil, fmt.Errorf("received unexpected object: %v", o) } } diff --git a/discovery/kubernetes/endpointslice_test.go b/discovery/kubernetes/endpointslice_test.go index 0065bdd06b..16148d2a0f 100644 --- a/discovery/kubernetes/endpointslice_test.go +++ b/discovery/kubernetes/endpointslice_test.go @@ -644,10 +644,16 @@ func TestEndpointSliceDiscoveryWithServiceUpdate(t *testing.T) { Targets: []model.LabelSet{ { "__address__": "1.2.3.4:9000", - "__meta_kubernetes_endpointslice_endpoint_hostname": "testendpoint1", - "__meta_kubernetes_endpointslice_port": "9000", - "__meta_kubernetes_endpointslice_port_name": "testport", - "__meta_kubernetes_endpointslice_port_protocol": "TCP", + "__meta_kubernetes_endpointslice_address_target_kind": "", + "__meta_kubernetes_endpointslice_address_target_name": "", + "__meta_kubernetes_endpointslice_endpoint_conditions_ready": "true", + "__meta_kubernetes_endpointslice_endpoint_hostname": "testendpoint1", + "__meta_kubernetes_endpointslice_endpoint_topology_present_topology": "true", + "__meta_kubernetes_endpointslice_endpoint_topology_topology": "value", + "__meta_kubernetes_endpointslice_port": "9000", + "__meta_kubernetes_endpointslice_port_app_protocol": "http", + "__meta_kubernetes_endpointslice_port_name": "testport", + "__meta_kubernetes_endpointslice_port_protocol": "TCP", }, { "__address__": "2.3.4.5:9000", @@ -655,6 +661,7 @@ func TestEndpointSliceDiscoveryWithServiceUpdate(t *testing.T) { "__meta_kubernetes_endpointslice_port": "9000", "__meta_kubernetes_endpointslice_port_name": "testport", "__meta_kubernetes_endpointslice_port_protocol": "TCP", + "__meta_kubernetes_endpointslice_port_app_protocol": "http", }, { "__address__": "3.4.5.6:9000", @@ -662,6 +669,7 @@ func TestEndpointSliceDiscoveryWithServiceUpdate(t *testing.T) { "__meta_kubernetes_endpointslice_port": "9000", "__meta_kubernetes_endpointslice_port_name": "testport", "__meta_kubernetes_endpointslice_port_protocol": "TCP", + "__meta_kubernetes_endpointslice_port_app_protocol": "http", }, }, Labels: model.LabelSet{ @@ -755,10 +763,16 @@ func TestEndpointSliceDiscoveryNamespaces(t *testing.T) { Targets: []model.LabelSet{ { "__address__": "1.2.3.4:9000", - "__meta_kubernetes_endpointslice_endpoint_hostname": "testendpoint1", - "__meta_kubernetes_endpointslice_port": "9000", - "__meta_kubernetes_endpointslice_port_name": "testport", - "__meta_kubernetes_endpointslice_port_protocol": "TCP", + "__meta_kubernetes_endpointslice_address_target_kind": "", + "__meta_kubernetes_endpointslice_address_target_name": "", + "__meta_kubernetes_endpointslice_endpoint_conditions_ready": "true", + "__meta_kubernetes_endpointslice_endpoint_hostname": "testendpoint1", + "__meta_kubernetes_endpointslice_endpoint_topology_present_topology": "true", + "__meta_kubernetes_endpointslice_endpoint_topology_topology": "value", + "__meta_kubernetes_endpointslice_port": "9000", + "__meta_kubernetes_endpointslice_port_app_protocol": "http", + "__meta_kubernetes_endpointslice_port_name": "testport", + "__meta_kubernetes_endpointslice_port_protocol": "TCP", }, { "__address__": "2.3.4.5:9000", @@ -766,6 +780,7 @@ func TestEndpointSliceDiscoveryNamespaces(t *testing.T) { "__meta_kubernetes_endpointslice_port": "9000", "__meta_kubernetes_endpointslice_port_name": "testport", "__meta_kubernetes_endpointslice_port_protocol": "TCP", + "__meta_kubernetes_endpointslice_port_app_protocol": "http", }, { "__address__": "3.4.5.6:9000", @@ -773,6 +788,7 @@ func TestEndpointSliceDiscoveryNamespaces(t *testing.T) { "__meta_kubernetes_endpointslice_port": "9000", "__meta_kubernetes_endpointslice_port_name": "testport", "__meta_kubernetes_endpointslice_port_protocol": "TCP", + "__meta_kubernetes_endpointslice_port_app_protocol": "http", }, }, Labels: model.LabelSet{ @@ -871,10 +887,16 @@ func TestEndpointSliceDiscoveryOwnNamespace(t *testing.T) { Targets: []model.LabelSet{ { "__address__": "1.2.3.4:9000", - "__meta_kubernetes_endpointslice_endpoint_hostname": "testendpoint1", - "__meta_kubernetes_endpointslice_port": "9000", - "__meta_kubernetes_endpointslice_port_name": "testport", - "__meta_kubernetes_endpointslice_port_protocol": "TCP", + "__meta_kubernetes_endpointslice_address_target_kind": "", + "__meta_kubernetes_endpointslice_address_target_name": "", + "__meta_kubernetes_endpointslice_endpoint_conditions_ready": "true", + "__meta_kubernetes_endpointslice_endpoint_hostname": "testendpoint1", + "__meta_kubernetes_endpointslice_endpoint_topology_present_topology": "true", + "__meta_kubernetes_endpointslice_endpoint_topology_topology": "value", + "__meta_kubernetes_endpointslice_port": "9000", + "__meta_kubernetes_endpointslice_port_app_protocol": "http", + "__meta_kubernetes_endpointslice_port_name": "testport", + "__meta_kubernetes_endpointslice_port_protocol": "TCP", }, { "__address__": "2.3.4.5:9000", @@ -882,6 +904,7 @@ func TestEndpointSliceDiscoveryOwnNamespace(t *testing.T) { "__meta_kubernetes_endpointslice_port": "9000", "__meta_kubernetes_endpointslice_port_name": "testport", "__meta_kubernetes_endpointslice_port_protocol": "TCP", + "__meta_kubernetes_endpointslice_port_app_protocol": "http", }, { "__address__": "3.4.5.6:9000", @@ -889,6 +912,7 @@ func TestEndpointSliceDiscoveryOwnNamespace(t *testing.T) { "__meta_kubernetes_endpointslice_port": "9000", "__meta_kubernetes_endpointslice_port_name": "testport", "__meta_kubernetes_endpointslice_port_protocol": "TCP", + "__meta_kubernetes_endpointslice_port_app_protocol": "http", }, }, Labels: model.LabelSet{ diff --git a/discovery/kubernetes/ingress.go b/discovery/kubernetes/ingress.go index 070785f29f..de6d2a0b4d 100644 --- a/discovery/kubernetes/ingress.go +++ b/discovery/kubernetes/ingress.go @@ -15,11 +15,12 @@ package kubernetes import ( "context" + "errors" + "fmt" "strings" "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/pkg/errors" "github.com/prometheus/common/model" v1 "k8s.io/api/networking/v1" "k8s.io/api/networking/v1beta1" @@ -78,7 +79,7 @@ func (i *Ingress) Run(ctx context.Context, ch chan<- []*targetgroup.Group) { defer i.queue.ShutDown() if !cache.WaitForCacheSync(ctx.Done(), i.informer.HasSynced) { - if ctx.Err() != context.Canceled { + if !errors.Is(ctx.Err(), context.Canceled) { level.Error(i.logger).Log("msg", "ingress informer unable to sync cache") } return @@ -123,7 +124,7 @@ func (i *Ingress) process(ctx context.Context, ch chan<- []*targetgroup.Group) b ia = newIngressAdaptorFromV1beta1(ingress) default: level.Error(i.logger).Log("msg", "converting to Ingress object failed", "err", - errors.Errorf("received unexpected object: %v", o)) + fmt.Errorf("received unexpected object: %v", o)) return true } send(ctx, ch, i.buildIngress(ia)) diff --git a/discovery/kubernetes/kubernetes.go b/discovery/kubernetes/kubernetes.go index 4fa561b6eb..3f417c49b3 100644 --- a/discovery/kubernetes/kubernetes.go +++ b/discovery/kubernetes/kubernetes.go @@ -15,8 +15,9 @@ package kubernetes import ( "context" + "errors" "fmt" - "io/ioutil" + "os" "reflect" "strings" "sync" @@ -24,7 +25,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/config" "github.com/prometheus/common/model" @@ -114,7 +114,7 @@ func (c *Role) UnmarshalYAML(unmarshal func(interface{}) error) error { case RoleNode, RolePod, RoleService, RoleEndpoint, RoleEndpointSlice, RoleIngress: return nil default: - return errors.Errorf("unknown Kubernetes SD role %q", *c) + return fmt.Errorf("unknown Kubernetes SD role %q", *c) } } @@ -178,7 +178,7 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { return err } if c.Role == "" { - return errors.Errorf("role missing (one of: pod, service, endpoints, endpointslice, node, ingress)") + return fmt.Errorf("role missing (one of: pod, service, endpoints, endpointslice, node, ingress)") } err = c.HTTPClientConfig.Validate() if err != nil { @@ -186,20 +186,20 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { } if c.APIServer.URL != nil && c.KubeConfig != "" { // Api-server and kubeconfig_file are mutually exclusive - return errors.Errorf("cannot use 'kubeconfig_file' and 'api_server' simultaneously") + return fmt.Errorf("cannot use 'kubeconfig_file' and 'api_server' simultaneously") } if c.KubeConfig != "" && !reflect.DeepEqual(c.HTTPClientConfig, config.DefaultHTTPClientConfig) { // Kubeconfig_file and custom http config are mutually exclusive - return errors.Errorf("cannot use a custom HTTP client configuration together with 'kubeconfig_file'") + return fmt.Errorf("cannot use a custom HTTP client configuration together with 'kubeconfig_file'") } if c.APIServer.URL == nil && !reflect.DeepEqual(c.HTTPClientConfig, config.DefaultHTTPClientConfig) { - return errors.Errorf("to use custom HTTP client configuration please provide the 'api_server' URL explicitly") + return fmt.Errorf("to use custom HTTP client configuration please provide the 'api_server' URL explicitly") } if c.APIServer.URL != nil && c.NamespaceDiscovery.IncludeOwnNamespace { - return errors.Errorf("cannot use 'api_server' and 'namespaces.own_namespace' simultaneously") + return fmt.Errorf("cannot use 'api_server' and 'namespaces.own_namespace' simultaneously") } if c.KubeConfig != "" && c.NamespaceDiscovery.IncludeOwnNamespace { - return errors.Errorf("cannot use 'kubeconfig_file' and 'namespaces.own_namespace' simultaneously") + return fmt.Errorf("cannot use 'kubeconfig_file' and 'namespaces.own_namespace' simultaneously") } foundSelectorRoles := make(map[Role]struct{}) @@ -214,12 +214,12 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { for _, selector := range c.Selectors { if _, ok := foundSelectorRoles[selector.Role]; ok { - return errors.Errorf("duplicated selector role: %s", selector.Role) + return fmt.Errorf("duplicated selector role: %s", selector.Role) } foundSelectorRoles[selector.Role] = struct{}{} if _, ok := allowedSelectors[c.Role]; !ok { - return errors.Errorf("invalid role: %q, expecting one of: pod, service, endpoints, endpointslice, node or ingress", c.Role) + return fmt.Errorf("invalid role: %q, expecting one of: pod, service, endpoints, endpointslice, node or ingress", c.Role) } var allowed bool for _, role := range allowedSelectors[c.Role] { @@ -230,7 +230,7 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { } if !allowed { - return errors.Errorf("%s role supports only %s selectors", c.Role, strings.Join(allowedSelectors[c.Role], ", ")) + return fmt.Errorf("%s role supports only %s selectors", c.Role, strings.Join(allowedSelectors[c.Role], ", ")) } _, err := fields.ParseSelector(selector.Field) @@ -312,7 +312,7 @@ func New(l log.Logger, conf *SDConfig) (*Discovery, error) { } if conf.NamespaceDiscovery.IncludeOwnNamespace { - ownNamespaceContents, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/namespace") + ownNamespaceContents, err := os.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/namespace") if err != nil { return nil, fmt.Errorf("could not determine the pod's namespace: %w", err) } diff --git a/discovery/kubernetes/kubernetes_test.go b/discovery/kubernetes/kubernetes_test.go index 3e41c6b584..d0ed4c6ca1 100644 --- a/discovery/kubernetes/kubernetes_test.go +++ b/discovery/kubernetes/kubernetes_test.go @@ -16,11 +16,11 @@ package kubernetes import ( "context" "encoding/json" + "errors" "testing" "time" "github.com/go-kit/log" - "github.com/pkg/errors" "github.com/stretchr/testify/require" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/version" @@ -163,11 +163,11 @@ Loop: func requireTargetGroups(t *testing.T, expected, res map[string]*targetgroup.Group) { t.Helper() - b1, err := json.Marshal(expected) + b1, err := marshalTargetGroups(expected) if err != nil { panic(err) } - b2, err := json.Marshal(res) + b2, err := marshalTargetGroups(res) if err != nil { panic(err) } @@ -175,6 +175,22 @@ func requireTargetGroups(t *testing.T, expected, res map[string]*targetgroup.Gro require.Equal(t, string(b1), string(b2)) } +// marshalTargetGroups serializes a set of target groups to JSON, ignoring the +// custom MarshalJSON function defined on the targetgroup.Group struct. +// marshalTargetGroups can be used for making exact comparisons between target groups +// as it will serialize all target labels. +func marshalTargetGroups(tgs map[string]*targetgroup.Group) ([]byte, error) { + type targetGroupAlias targetgroup.Group + + aliases := make(map[string]*targetGroupAlias, len(tgs)) + for k, v := range tgs { + tg := targetGroupAlias(*v) + aliases[k] = &tg + } + + return json.Marshal(aliases) +} + type hasSynced interface { // hasSynced returns true if all informers synced. // This is only used in testing to determine when discoverer synced to diff --git a/discovery/kubernetes/node.go b/discovery/kubernetes/node.go index 13ead15523..ebb6bbced7 100644 --- a/discovery/kubernetes/node.go +++ b/discovery/kubernetes/node.go @@ -15,12 +15,13 @@ package kubernetes import ( "context" + "errors" + "fmt" "net" "strconv" "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/pkg/errors" "github.com/prometheus/common/model" apiv1 "k8s.io/api/core/v1" "k8s.io/client-go/tools/cache" @@ -85,7 +86,7 @@ func (n *Node) Run(ctx context.Context, ch chan<- []*targetgroup.Group) { defer n.queue.ShutDown() if !cache.WaitForCacheSync(ctx.Done(), n.informer.HasSynced) { - if ctx.Err() != context.Canceled { + if !errors.Is(ctx.Err(), context.Canceled) { level.Error(n.logger).Log("msg", "node informer unable to sync cache") } return @@ -136,7 +137,7 @@ func convertToNode(o interface{}) (*apiv1.Node, error) { return node, nil } - return nil, errors.Errorf("received unexpected object: %v", o) + return nil, fmt.Errorf("received unexpected object: %v", o) } func nodeSource(n *apiv1.Node) string { diff --git a/discovery/kubernetes/pod.go b/discovery/kubernetes/pod.go index d118b4761f..10ec4512a2 100644 --- a/discovery/kubernetes/pod.go +++ b/discovery/kubernetes/pod.go @@ -15,13 +15,14 @@ package kubernetes import ( "context" + "errors" + "fmt" "net" "strconv" "strings" "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/pkg/errors" "github.com/prometheus/common/model" apiv1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -118,7 +119,7 @@ func (p *Pod) Run(ctx context.Context, ch chan<- []*targetgroup.Group) { } if !cache.WaitForCacheSync(ctx.Done(), cacheSyncs...) { - if ctx.Err() != context.Canceled { + if !errors.Is(ctx.Err(), context.Canceled) { level.Error(p.logger).Log("msg", "pod informer unable to sync cache") } return @@ -169,7 +170,7 @@ func convertToPod(o interface{}) (*apiv1.Pod, error) { return pod, nil } - return nil, errors.Errorf("received unexpected object: %v", o) + return nil, fmt.Errorf("received unexpected object: %v", o) } const ( diff --git a/discovery/kubernetes/service.go b/discovery/kubernetes/service.go index 1075345404..4b3c4de510 100644 --- a/discovery/kubernetes/service.go +++ b/discovery/kubernetes/service.go @@ -15,12 +15,13 @@ package kubernetes import ( "context" + "errors" + "fmt" "net" "strconv" "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/pkg/errors" "github.com/prometheus/common/model" apiv1 "k8s.io/api/core/v1" "k8s.io/client-go/tools/cache" @@ -81,7 +82,7 @@ func (s *Service) Run(ctx context.Context, ch chan<- []*targetgroup.Group) { defer s.queue.ShutDown() if !cache.WaitForCacheSync(ctx.Done(), s.informer.HasSynced) { - if ctx.Err() != context.Canceled { + if !errors.Is(ctx.Err(), context.Canceled) { level.Error(s.logger).Log("msg", "service informer unable to sync cache") } return @@ -131,7 +132,7 @@ func convertToService(o interface{}) (*apiv1.Service, error) { if ok { return service, nil } - return nil, errors.Errorf("received unexpected object: %v", o) + return nil, fmt.Errorf("received unexpected object: %v", o) } func serviceSource(s *apiv1.Service) string { diff --git a/discovery/legacymanager/registry.go b/discovery/legacymanager/registry.go index fb01e16488..687f093829 100644 --- a/discovery/legacymanager/registry.go +++ b/discovery/legacymanager/registry.go @@ -14,6 +14,7 @@ package legacymanager import ( + "errors" "fmt" "reflect" "sort" @@ -248,7 +249,8 @@ func writeConfigs(structVal reflect.Value, configs discovery.Configs) error { } func replaceYAMLTypeError(err error, oldTyp, newTyp reflect.Type) error { - if e, ok := err.(*yaml.TypeError); ok { + var e *yaml.TypeError + if errors.As(err, &e) { oldStr := oldTyp.String() newStr := newTyp.String() for i, s := range e.Errors { diff --git a/discovery/linode/linode.go b/discovery/linode/linode.go index a673b44c68..0fd0a2c370 100644 --- a/discovery/linode/linode.go +++ b/discovery/linode/linode.go @@ -25,6 +25,7 @@ import ( "github.com/go-kit/log" "github.com/linode/linodego" + "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/config" "github.com/prometheus/common/model" "github.com/prometheus/common/version" @@ -65,15 +66,24 @@ const ( ) // DefaultSDConfig is the default Linode SD configuration. -var DefaultSDConfig = SDConfig{ - TagSeparator: ",", - Port: 80, - RefreshInterval: model.Duration(60 * time.Second), - HTTPClientConfig: config.DefaultHTTPClientConfig, -} +var ( + DefaultSDConfig = SDConfig{ + TagSeparator: ",", + Port: 80, + RefreshInterval: model.Duration(60 * time.Second), + HTTPClientConfig: config.DefaultHTTPClientConfig, + } + + failuresCount = prometheus.NewCounter( + prometheus.CounterOpts{ + Name: "prometheus_sd_linode_failures_total", + Help: "Number of Linode service discovery refresh failures.", + }) +) func init() { discovery.RegisterConfig(&SDConfig{}) + prometheus.MustRegister(failuresCount) } // SDConfig is the configuration for Linode based service discovery. @@ -211,12 +221,14 @@ func (d *Discovery) refreshData(ctx context.Context) ([]*targetgroup.Group, erro // Gather all linode instances. instances, err := d.client.ListInstances(ctx, &linodego.ListOptions{PageSize: 500}) if err != nil { + failuresCount.Inc() return nil, err } // Gather detailed IP address info for all IPs on all linode instances. detailedIPs, err := d.client.ListIPAddresses(ctx, &linodego.ListOptions{PageSize: 500}) if err != nil { + failuresCount.Inc() return nil, err } diff --git a/discovery/marathon/marathon.go b/discovery/marathon/marathon.go index 5688efedd5..079f93ad0b 100644 --- a/discovery/marathon/marathon.go +++ b/discovery/marathon/marathon.go @@ -16,18 +16,18 @@ package marathon import ( "context" "encoding/json" + "errors" "fmt" "io" - "io/ioutil" "math/rand" "net" "net/http" + "os" "strconv" "strings" "time" "github.com/go-kit/log" - "github.com/pkg/errors" "github.com/prometheus/common/config" "github.com/prometheus/common/model" @@ -186,17 +186,17 @@ type authTokenFileRoundTripper struct { // newAuthTokenFileRoundTripper adds the auth token read from the file to a request. func newAuthTokenFileRoundTripper(tokenFile string, rt http.RoundTripper) (http.RoundTripper, error) { // fail-fast if we can't read the file. - _, err := ioutil.ReadFile(tokenFile) + _, err := os.ReadFile(tokenFile) if err != nil { - return nil, errors.Wrapf(err, "unable to read auth token file %s", tokenFile) + return nil, fmt.Errorf("unable to read auth token file %s: %w", tokenFile, err) } return &authTokenFileRoundTripper{tokenFile, rt}, nil } func (rt *authTokenFileRoundTripper) RoundTrip(request *http.Request) (*http.Response, error) { - b, err := ioutil.ReadFile(rt.authTokenFile) + b, err := os.ReadFile(rt.authTokenFile) if err != nil { - return nil, errors.Wrapf(err, "unable to read auth token file %s", rt.authTokenFile) + return nil, fmt.Errorf("unable to read auth token file %s: %w", rt.authTokenFile, err) } authToken := strings.TrimSpace(string(b)) @@ -331,15 +331,15 @@ func fetchApps(ctx context.Context, client *http.Client, url string) (*appList, return nil, err } defer func() { - io.Copy(ioutil.Discard, resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() }() if (resp.StatusCode < 200) || (resp.StatusCode >= 300) { - return nil, errors.Errorf("non 2xx status '%v' response during marathon service discovery", resp.StatusCode) + return nil, fmt.Errorf("non 2xx status '%v' response during marathon service discovery", resp.StatusCode) } - b, err := ioutil.ReadAll(resp.Body) + b, err := io.ReadAll(resp.Body) if err != nil { return nil, err } @@ -347,7 +347,7 @@ func fetchApps(ctx context.Context, client *http.Client, url string) (*appList, var apps appList err = json.Unmarshal(b, &apps) if err != nil { - return nil, errors.Wrapf(err, "%q", url) + return nil, fmt.Errorf("%q: %w", url, err) } return &apps, nil } diff --git a/discovery/marathon/marathon_test.go b/discovery/marathon/marathon_test.go index 4310ed847c..415456c7ac 100644 --- a/discovery/marathon/marathon_test.go +++ b/discovery/marathon/marathon_test.go @@ -54,7 +54,7 @@ func TestMarathonSDHandleError(t *testing.T) { } ) tgs, err := testUpdateServices(client) - if err != errTesting { + if !errors.Is(err, errTesting) { t.Fatalf("Expected error: %s", err) } if len(tgs) != 0 { diff --git a/discovery/moby/mock_test.go b/discovery/moby/mock_test.go index 3006ca5c28..f6511ed26f 100644 --- a/discovery/moby/mock_test.go +++ b/discovery/moby/mock_test.go @@ -16,9 +16,9 @@ package moby import ( "crypto/sha1" "encoding/base64" - "io/ioutil" "net/http" "net/http/httptest" + "os" "path/filepath" "strings" "testing" @@ -63,7 +63,7 @@ func (m *SDMock) Setup() { // HandleNodesList mocks nodes list. func (m *SDMock) SetupHandlers() { headers := make(map[string]string) - rawHeaders, err := ioutil.ReadFile(filepath.Join("testdata", m.directory, "headers.yml")) + rawHeaders, err := os.ReadFile(filepath.Join("testdata", m.directory, "headers.yml")) require.NoError(m.t, err) yaml.Unmarshal(rawHeaders, &headers) @@ -102,13 +102,13 @@ func (m *SDMock) SetupHandlers() { f += "__" + base64.URLEncoding.EncodeToString(h.Sum(nil))[:10] } } - if response, err := ioutil.ReadFile(filepath.Join("testdata", m.directory, f+".json")); err == nil { + if response, err := os.ReadFile(filepath.Join("testdata", m.directory, f+".json")); err == nil { w.Header().Add("content-type", "application/json") w.WriteHeader(http.StatusOK) w.Write(response) return } - if response, err := ioutil.ReadFile(filepath.Join("testdata", m.directory, f)); err == nil { + if response, err := os.ReadFile(filepath.Join("testdata", m.directory, f)); err == nil { w.WriteHeader(http.StatusOK) w.Write(response) return diff --git a/discovery/openstack/hypervisor.go b/discovery/openstack/hypervisor.go index 94d47d3604..16964cfb62 100644 --- a/discovery/openstack/hypervisor.go +++ b/discovery/openstack/hypervisor.go @@ -23,7 +23,6 @@ import ( "github.com/gophercloud/gophercloud/openstack" "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/hypervisors" "github.com/gophercloud/gophercloud/pagination" - "github.com/pkg/errors" "github.com/prometheus/common/model" "github.com/prometheus/prometheus/discovery/targetgroup" @@ -62,14 +61,14 @@ func (h *HypervisorDiscovery) refresh(ctx context.Context) ([]*targetgroup.Group h.provider.Context = ctx err := openstack.Authenticate(h.provider, *h.authOpts) if err != nil { - return nil, errors.Wrap(err, "could not authenticate to OpenStack") + return nil, fmt.Errorf("could not authenticate to OpenStack: %w", err) } client, err := openstack.NewComputeV2(h.provider, gophercloud.EndpointOpts{ Region: h.region, Availability: h.availability, }) if err != nil { - return nil, errors.Wrap(err, "could not create OpenStack compute session") + return nil, fmt.Errorf("could not create OpenStack compute session: %w", err) } tg := &targetgroup.Group{ @@ -81,7 +80,7 @@ func (h *HypervisorDiscovery) refresh(ctx context.Context) ([]*targetgroup.Group err = pagerHypervisors.EachPage(func(page pagination.Page) (bool, error) { hypervisorList, err := hypervisors.ExtractHypervisors(page) if err != nil { - return false, errors.Wrap(err, "could not extract hypervisors") + return false, fmt.Errorf("could not extract hypervisors: %w", err) } for _, hypervisor := range hypervisorList { labels := model.LabelSet{} diff --git a/discovery/openstack/instance.go b/discovery/openstack/instance.go index b4e67825a4..2f7e99a071 100644 --- a/discovery/openstack/instance.go +++ b/discovery/openstack/instance.go @@ -25,7 +25,6 @@ import ( "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/floatingips" "github.com/gophercloud/gophercloud/openstack/compute/v2/servers" "github.com/gophercloud/gophercloud/pagination" - "github.com/pkg/errors" "github.com/prometheus/common/model" "github.com/prometheus/prometheus/discovery/targetgroup" @@ -79,14 +78,14 @@ func (i *InstanceDiscovery) refresh(ctx context.Context) ([]*targetgroup.Group, i.provider.Context = ctx err := openstack.Authenticate(i.provider, *i.authOpts) if err != nil { - return nil, errors.Wrap(err, "could not authenticate to OpenStack") + return nil, fmt.Errorf("could not authenticate to OpenStack: %w", err) } client, err := openstack.NewComputeV2(i.provider, gophercloud.EndpointOpts{ Region: i.region, Availability: i.availability, }) if err != nil { - return nil, errors.Wrap(err, "could not create OpenStack compute session") + return nil, fmt.Errorf("could not create OpenStack compute session: %w", err) } // OpenStack API reference @@ -97,7 +96,7 @@ func (i *InstanceDiscovery) refresh(ctx context.Context) ([]*targetgroup.Group, err = pagerFIP.EachPage(func(page pagination.Page) (bool, error) { result, err := floatingips.ExtractFloatingIPs(page) if err != nil { - return false, errors.Wrap(err, "could not extract floatingips") + return false, fmt.Errorf("could not extract floatingips: %w", err) } for _, ip := range result { // Skip not associated ips @@ -124,11 +123,11 @@ func (i *InstanceDiscovery) refresh(ctx context.Context) ([]*targetgroup.Group, } err = pager.EachPage(func(page pagination.Page) (bool, error) { if ctx.Err() != nil { - return false, errors.Wrap(ctx.Err(), "could not extract instances") + return false, fmt.Errorf("could not extract instances: %w", ctx.Err()) } instanceList, err := servers.ExtractServers(page) if err != nil { - return false, errors.Wrap(err, "could not extract instances") + return false, fmt.Errorf("could not extract instances: %w", err) } for _, s := range instanceList { diff --git a/discovery/openstack/openstack.go b/discovery/openstack/openstack.go index 932a4f5c2f..2505542abe 100644 --- a/discovery/openstack/openstack.go +++ b/discovery/openstack/openstack.go @@ -15,6 +15,7 @@ package openstack import ( "context" + "errors" "fmt" "net/http" "time" @@ -23,7 +24,6 @@ import ( "github.com/gophercloud/gophercloud" "github.com/gophercloud/gophercloud/openstack" conntrack "github.com/mwitkow/go-conntrack" - "github.com/pkg/errors" "github.com/prometheus/common/config" "github.com/prometheus/common/model" @@ -100,7 +100,7 @@ func (c *Role) UnmarshalYAML(unmarshal func(interface{}) error) error { case OpenStackRoleHypervisor, OpenStackRoleInstance: return nil default: - return errors.Errorf("unknown OpenStack SD role %q", *c) + return fmt.Errorf("unknown OpenStack SD role %q", *c) } } diff --git a/discovery/puppetdb/fixtures/vhosts.json b/discovery/puppetdb/fixtures/vhosts.json index 5ea7b05a2c..0a9db872ef 100644 --- a/discovery/puppetdb/fixtures/vhosts.json +++ b/discovery/puppetdb/fixtures/vhosts.json @@ -26,6 +26,17 @@ "alias": "/cgi-bin", "path": "/var/www/cgi-bin" } + ], + "port": 22, + "pi": 3.141592653589793, + "buckets": [ + 0, + 2, + 5 + ], + "coordinates": [ + 60.13464726551357, + -2.0513768021728893 ] }, "resource": "49af83866dc5a1518968b68e58a25319107afe11", diff --git a/discovery/puppetdb/puppetdb.go b/discovery/puppetdb/puppetdb.go index c2fbba0231..62449168e0 100644 --- a/discovery/puppetdb/puppetdb.go +++ b/discovery/puppetdb/puppetdb.go @@ -19,7 +19,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net" "net/http" "net/url" @@ -30,7 +29,6 @@ import ( "github.com/go-kit/log" "github.com/grafana/regexp" - "github.com/pkg/errors" "github.com/prometheus/common/config" "github.com/prometheus/common/model" "github.com/prometheus/common/version" @@ -187,19 +185,19 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) { return nil, err } defer func() { - io.Copy(ioutil.Discard, resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() }() if resp.StatusCode != http.StatusOK { - return nil, errors.Errorf("server returned HTTP status %s", resp.Status) + return nil, fmt.Errorf("server returned HTTP status %s", resp.Status) } if ct := resp.Header.Get("Content-Type"); !matchContentType.MatchString(ct) { - return nil, errors.Errorf("unsupported content type %s", resp.Header.Get("Content-Type")) + return nil, fmt.Errorf("unsupported content type %s", resp.Header.Get("Content-Type")) } - b, err := ioutil.ReadAll(resp.Body) + b, err := io.ReadAll(resp.Body) if err != nil { return nil, err } diff --git a/discovery/puppetdb/puppetdb_test.go b/discovery/puppetdb/puppetdb_test.go index 25340bea77..4913035ca1 100644 --- a/discovery/puppetdb/puppetdb_test.go +++ b/discovery/puppetdb/puppetdb_test.go @@ -137,10 +137,14 @@ func TestPuppetDBRefreshWithParameters(t *testing.T) { model.LabelName("__meta_puppetdb_file"): model.LabelValue("/etc/puppetlabs/code/environments/prod/modules/upstream/apache/manifests/init.pp"), model.LabelName("__meta_puppetdb_parameter_access_log"): model.LabelValue("true"), model.LabelName("__meta_puppetdb_parameter_access_log_file"): model.LabelValue("ssl_access_log"), + model.LabelName("__meta_puppetdb_parameter_buckets"): model.LabelValue("0,2,5"), + model.LabelName("__meta_puppetdb_parameter_coordinates"): model.LabelValue("60.13464726551357,-2.0513768021728893"), model.LabelName("__meta_puppetdb_parameter_docroot"): model.LabelValue("/var/www/html"), model.LabelName("__meta_puppetdb_parameter_ensure"): model.LabelValue("absent"), model.LabelName("__meta_puppetdb_parameter_labels_alias"): model.LabelValue("edinburgh"), model.LabelName("__meta_puppetdb_parameter_options"): model.LabelValue("Indexes,FollowSymLinks,MultiViews"), + model.LabelName("__meta_puppetdb_parameter_pi"): model.LabelValue("3.141592653589793"), + model.LabelName("__meta_puppetdb_parameter_port"): model.LabelValue("22"), model.LabelName("__meta_puppetdb_resource"): model.LabelValue("49af83866dc5a1518968b68e58a25319107afe11"), model.LabelName("__meta_puppetdb_tags"): model.LabelValue(",roles::hypervisor,apache,apache::vhost,class,default-ssl,profile_hypervisor,vhost,profile_apache,hypervisor,__node_regexp__edinburgh,roles,node,"), model.LabelName("__meta_puppetdb_title"): model.LabelValue("default-ssl"), diff --git a/discovery/puppetdb/resources.go b/discovery/puppetdb/resources.go index 27792b6460..d6387fe1b8 100644 --- a/discovery/puppetdb/resources.go +++ b/discovery/puppetdb/resources.go @@ -46,6 +46,10 @@ func (p *Parameters) toLabels() model.LabelSet { labelValue = value case bool: labelValue = strconv.FormatBool(value) + case int64: + labelValue = strconv.FormatInt(value, 10) + case float64: + labelValue = strconv.FormatFloat(value, 'g', -1, 64) case []string: labelValue = separator + strings.Join(value, separator) + separator case []interface{}: @@ -59,6 +63,10 @@ func (p *Parameters) toLabels() model.LabelSet { values[i] = value case bool: values[i] = strconv.FormatBool(value) + case int64: + values[i] = strconv.FormatInt(value, 10) + case float64: + values[i] = strconv.FormatFloat(value, 'g', -1, 64) case []string: values[i] = separator + strings.Join(value, separator) + separator } diff --git a/discovery/refresh/refresh.go b/discovery/refresh/refresh.go index 1b42a70c58..043b2f7ba8 100644 --- a/discovery/refresh/refresh.go +++ b/discovery/refresh/refresh.go @@ -15,6 +15,7 @@ package refresh import ( "context" + "errors" "time" "github.com/go-kit/log" @@ -75,7 +76,7 @@ func (d *Discovery) Run(ctx context.Context, ch chan<- []*targetgroup.Group) { // Get an initial set right away. tgs, err := d.refresh(ctx) if err != nil { - if ctx.Err() != context.Canceled { + if !errors.Is(ctx.Err(), context.Canceled) { level.Error(d.logger).Log("msg", "Unable to refresh target groups", "err", err.Error()) } } else { @@ -94,7 +95,7 @@ func (d *Discovery) Run(ctx context.Context, ch chan<- []*targetgroup.Group) { case <-ticker.C: tgs, err := d.refresh(ctx) if err != nil { - if ctx.Err() != context.Canceled { + if !errors.Is(ctx.Err(), context.Canceled) { level.Error(d.logger).Log("msg", "Unable to refresh target groups", "err", err.Error()) } continue diff --git a/discovery/registry.go b/discovery/registry.go index 2ebb36cb29..8274628c23 100644 --- a/discovery/registry.go +++ b/discovery/registry.go @@ -14,6 +14,7 @@ package discovery import ( + "errors" "fmt" "reflect" "sort" @@ -247,7 +248,8 @@ func writeConfigs(structVal reflect.Value, configs Configs) error { } func replaceYAMLTypeError(err error, oldTyp, newTyp reflect.Type) error { - if e, ok := err.(*yaml.TypeError); ok { + var e *yaml.TypeError + if errors.As(err, &e) { oldStr := oldTyp.String() newStr := newTyp.String() for i, s := range e.Errors { diff --git a/discovery/scaleway/instance_test.go b/discovery/scaleway/instance_test.go index f1778d9909..e7a32dd924 100644 --- a/discovery/scaleway/instance_test.go +++ b/discovery/scaleway/instance_test.go @@ -16,9 +16,9 @@ package scaleway import ( "context" "fmt" - "io/ioutil" "net/http" "net/http/httptest" + "os" "testing" "github.com/prometheus/common/model" @@ -127,7 +127,7 @@ func mockScalewayInstance(w http.ResponseWriter, r *http.Request) { return } w.Header().Set("Content-Type", "application/json") - instance, err := ioutil.ReadFile("testdata/instance.json") + instance, err := os.ReadFile("testdata/instance.json") if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return diff --git a/discovery/scaleway/scaleway.go b/discovery/scaleway/scaleway.go index ed3d7f3917..90091b3172 100644 --- a/discovery/scaleway/scaleway.go +++ b/discovery/scaleway/scaleway.go @@ -15,13 +15,14 @@ package scaleway import ( "context" - "io/ioutil" + "errors" + "fmt" "net/http" + "os" "strings" "time" "github.com/go-kit/log" - "github.com/pkg/errors" "github.com/prometheus/common/config" "github.com/prometheus/common/model" "github.com/scaleway/scaleway-sdk-go/scw" @@ -61,7 +62,7 @@ func (c *role) UnmarshalYAML(unmarshal func(interface{}) error) error { case roleInstance, roleBaremetal: return nil default: - return errors.Errorf("unknown role %q", *c) + return fmt.Errorf("unknown role %q", *c) } } @@ -226,17 +227,17 @@ type authTokenFileRoundTripper struct { // newAuthTokenFileRoundTripper adds the auth token read from the file to a request. func newAuthTokenFileRoundTripper(tokenFile string, rt http.RoundTripper) (http.RoundTripper, error) { // fail-fast if we can't read the file. - _, err := ioutil.ReadFile(tokenFile) + _, err := os.ReadFile(tokenFile) if err != nil { - return nil, errors.Wrapf(err, "unable to read auth token file %s", tokenFile) + return nil, fmt.Errorf("unable to read auth token file %s: %w", tokenFile, err) } return &authTokenFileRoundTripper{tokenFile, rt}, nil } func (rt *authTokenFileRoundTripper) RoundTrip(request *http.Request) (*http.Response, error) { - b, err := ioutil.ReadFile(rt.authTokenFile) + b, err := os.ReadFile(rt.authTokenFile) if err != nil { - return nil, errors.Wrapf(err, "unable to read auth token file %s", rt.authTokenFile) + return nil, fmt.Errorf("unable to read auth token file %s: %w", rt.authTokenFile, err) } authToken := strings.TrimSpace(string(b)) diff --git a/discovery/triton/triton.go b/discovery/triton/triton.go index 66efd9bbc1..54c67b121f 100644 --- a/discovery/triton/triton.go +++ b/discovery/triton/triton.go @@ -16,9 +16,9 @@ package triton import ( "context" "encoding/json" + "errors" "fmt" "io" - "io/ioutil" "net/http" "net/url" "strings" @@ -26,7 +26,6 @@ import ( "github.com/go-kit/log" conntrack "github.com/mwitkow/go-conntrack" - "github.com/pkg/errors" "github.com/prometheus/common/config" "github.com/prometheus/common/model" @@ -203,17 +202,17 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) { req = req.WithContext(ctx) resp, err := d.client.Do(req) if err != nil { - return nil, errors.Wrap(err, "an error occurred when requesting targets from the discovery endpoint") + return nil, fmt.Errorf("an error occurred when requesting targets from the discovery endpoint: %w", err) } defer func() { - io.Copy(ioutil.Discard, resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() }() - data, err := ioutil.ReadAll(resp.Body) + data, err := io.ReadAll(resp.Body) if err != nil { - return nil, errors.Wrap(err, "an error occurred when reading the response body") + return nil, fmt.Errorf("an error occurred when reading the response body: %w", err) } // The JSON response body is different so it needs to be processed/mapped separately. @@ -235,7 +234,7 @@ func (d *Discovery) processContainerResponse(data []byte, endpoint string) ([]*t dr := DiscoveryResponse{} err := json.Unmarshal(data, &dr) if err != nil { - return nil, errors.Wrap(err, "an error occurred unmarshaling the discovery response json") + return nil, fmt.Errorf("an error occurred unmarshaling the discovery response json: %w", err) } for _, container := range dr.Containers { @@ -268,7 +267,7 @@ func (d *Discovery) processComputeNodeResponse(data []byte, endpoint string) ([] dr := ComputeNodeDiscoveryResponse{} err := json.Unmarshal(data, &dr) if err != nil { - return nil, errors.Wrap(err, "an error occurred unmarshaling the compute node discovery response json") + return nil, fmt.Errorf("an error occurred unmarshaling the compute node discovery response json: %w", err) } for _, cn := range dr.ComputeNodes { diff --git a/discovery/uyuni/uyuni.go b/discovery/uyuni/uyuni.go index b60ef2a4d1..e37acbf98a 100644 --- a/discovery/uyuni/uyuni.go +++ b/discovery/uyuni/uyuni.go @@ -15,6 +15,7 @@ package uyuni import ( "context" + "errors" "fmt" "net/http" "net/url" @@ -24,7 +25,6 @@ import ( "github.com/go-kit/log" "github.com/kolo/xmlrpc" - "github.com/pkg/errors" "github.com/prometheus/common/config" "github.com/prometheus/common/model" @@ -52,9 +52,10 @@ const ( // DefaultSDConfig is the default Uyuni SD configuration. var DefaultSDConfig = SDConfig{ - Entitlement: "monitoring_entitled", - Separator: ",", - RefreshInterval: model.Duration(1 * time.Minute), + Entitlement: "monitoring_entitled", + Separator: ",", + RefreshInterval: model.Duration(1 * time.Minute), + HTTPClientConfig: config.DefaultHTTPClientConfig, } func init() { @@ -117,6 +118,11 @@ func (c *SDConfig) NewDiscoverer(opts discovery.DiscovererOptions) (discovery.Di return NewDiscovery(c, opts.Logger) } +// SetDirectory joins any relative file paths with dir. +func (c *SDConfig) SetDirectory(dir string) { + c.HTTPClientConfig.SetDirectory(dir) +} + // UnmarshalYAML implements the yaml.Unmarshaler interface. func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { *c = DefaultSDConfig @@ -131,7 +137,7 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { _, err = url.Parse(c.Server) if err != nil { - return errors.Wrap(err, "Uyuni Server URL is not valid") + return fmt.Errorf("Uyuni Server URL is not valid: %w", err) } if c.Username == "" { @@ -276,7 +282,7 @@ func (d *Discovery) getTargetsForSystems( systemGroupIDsBySystemID, err := getSystemGroupsInfoOfMonitoredClients(rpcClient, d.token, entitlement) if err != nil { - return nil, errors.Wrap(err, "unable to get the managed system groups information of monitored clients") + return nil, fmt.Errorf("unable to get the managed system groups information of monitored clients: %w", err) } systemIDs := make([]int, 0, len(systemGroupIDsBySystemID)) @@ -286,12 +292,12 @@ func (d *Discovery) getTargetsForSystems( endpointInfos, err := getEndpointInfoForSystems(rpcClient, d.token, systemIDs) if err != nil { - return nil, errors.Wrap(err, "unable to get endpoints information") + return nil, fmt.Errorf("unable to get endpoints information: %w", err) } networkInfoBySystemID, err := getNetworkInformationForSystems(rpcClient, d.token, systemIDs) if err != nil { - return nil, errors.Wrap(err, "unable to get the systems network information") + return nil, fmt.Errorf("unable to get the systems network information: %w", err) } for _, endpoint := range endpointInfos { @@ -317,7 +323,7 @@ func (d *Discovery) refresh(_ context.Context) ([]*targetgroup.Group, error) { // Uyuni API takes duration in seconds. d.token, err = login(rpcClient, d.username, d.password, int(tokenDuration.Seconds())) if err != nil { - return nil, errors.Wrap(err, "unable to login to Uyuni API") + return nil, fmt.Errorf("unable to login to Uyuni API: %w", err) } // Login again at half the token lifetime. d.tokenExpiration = time.Now().Add(tokenDuration / 2) diff --git a/discovery/vultr/mock_test.go b/discovery/vultr/mock_test.go new file mode 100644 index 0000000000..417866fcef --- /dev/null +++ b/discovery/vultr/mock_test.go @@ -0,0 +1,170 @@ +// Copyright 2022 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vultr + +import ( + "fmt" + "net/http" + "net/http/httptest" + "testing" +) + +// SDMock is the interface for the Vultr mock +type SDMock struct { + t *testing.T + Server *httptest.Server + Mux *http.ServeMux +} + +// NewSDMock returns a new Vultr mock server. +func NewSDMock(t *testing.T) *SDMock { + return &SDMock{ + t: t, + } +} + +// Endpoint returns the URI to the mock server. +func (m *SDMock) Endpoint() string { + return m.Server.URL + "/" +} + +// Setup creates the mock server. +func (m *SDMock) Setup() { + m.Mux = http.NewServeMux() + m.Server = httptest.NewServer(m.Mux) +} + +// ShutdownServer shuts down the mock server. +func (m *SDMock) ShutdownServer() { + m.Server.Close() +} + +const APIKey = "ABCBTDG35OTGH2UKCC3S6CNMDUPCN3ZWSGFQ" + +// HandleInstanceList mocks vultr instances list. +func (m *SDMock) HandleInstanceList() { + m.Mux.HandleFunc("/v2/instances", func(w http.ResponseWriter, r *http.Request) { + if r.Header.Get("Authorization") != fmt.Sprintf("Bearer %s", APIKey) { + w.WriteHeader(http.StatusForbidden) + return + } + + w.Header().Add("content-type", "application/json; charset=utf-8") + w.WriteHeader(http.StatusOK) + + fmt.Fprint(w, ` +{ + "instances": [ + { + "id": "dbdbd38c-9884-4c92-95fe-899e50dee717", + "os": "Marketplace", + "ram": 4096, + "disk": 128, + "main_ip": "149.28.234.27", + "vcpu_count": 2, + "region": "ewr", + "plan": "vhf-2c-4gb", + "date_created": "2022-03-10T02:25:30+00:00", + "status": "active", + "allowed_bandwidth": 3000, + "netmask_v4": "255.255.254.0", + "gateway_v4": "149.28.234.1", + "power_status": "running", + "server_status": "ok", + "v6_network": "", + "v6_main_ip": "", + "v6_network_size": 0, + "label": "np-2-eae38a19b0f3", + "internal_ip": "10.1.96.5", + "kvm": "https://my.vultr.com/subs/vps/novnc/api.php?data=djJ8Q2k2NlVpNUlZNE5kM3NZMWdBNzFKUkVadDBDU3ItTEJ8-yNWBdMn1AWPqX-EnpTVbA1qBeP0txBZbahSOh3UtHIL2p0fZKEdFJwFNjWtvBKC9BGvJkoJdWBoo7hF-6RzavdUKPD3KIU5xD_T6keV8X-PPukPgXMuSUaAqurAuJvwAWXcTcodBjaIH961xgbvfkFyqVl0ZgHf3ErZQE-EmpZ0Jc3uF1DO2McJ4UL8KUvHLwa-ZDUZ_AtWJjQWsjNkxjvOiA", + "hostname": "np-2-eae38a19b0f3", + "os_id": 426, + "app_id": 0, + "image_id": "vke-worker", + "firewall_group_id": "", + "features": ["backups"], + "tags": ["tag1", "tag2", "tag3"] + }, + { + "id": "fccb117c-62f7-4b17-995d-a8e56dd30b33", + "os": "Marketplace", + "ram": 4096, + "disk": 128, + "main_ip": "45.63.1.222", + "vcpu_count": 2, + "region": "ewr", + "plan": "vhf-2c-4gb", + "date_created": "2022-03-10T02:25:32+00:00", + "status": "active", + "allowed_bandwidth": 3000, + "netmask_v4": "255.255.254.0", + "gateway_v4": "45.63.0.1", + "power_status": "running", + "server_status": "ok", + "v6_network": "", + "v6_main_ip": "", + "v6_network_size": 0, + "label": "np-2-fd0714b5fe42", + "internal_ip": "10.1.96.6", + "kvm": "https://my.vultr.com/subs/vps/novnc/api.php?data=djJ8R0tzbmI0VWVfSDR6VE51Q0FGUTBCamwyTFNzZDNkVTF8Zwm93t6L2BLTYSNmM0g0Ppf43r71aIbqLiJCx6_1NuCugUqIKz8POshH91vi6XXDorpb3hYTk8RrJWQbaFMak7XbbfMObzsrFxKAQUVGfbjTBIHCKftxNIXeQOp1fEIDa3p-vkfSxEpx6ZX8nChGYYSVuOjS1twV6oI_IKtHXKdFJiVFz0Unay_K3HuXW_H2wrYSjmAChloR-eA1jSmBXLccJQ", + "hostname": "np-2-fd0714b5fe42", + "os_id": 426, + "app_id": 0, + "image_id": "vke-worker", + "firewall_group_id": "", + "features": [], + "tags": [] + }, + { + "id": "c4e58767-f61b-4c5e-9bce-43761cc04868", + "os": "Marketplace", + "ram": 4096, + "disk": 128, + "main_ip": "149.28.237.151", + "vcpu_count": 2, + "region": "ewr", + "plan": "vhf-2c-4gb", + "date_created": "2022-03-10T02:25:33+00:00", + "status": "active", + "allowed_bandwidth": 3000, + "netmask_v4": "255.255.254.0", + "gateway_v4": "149.28.236.1", + "power_status": "running", + "server_status": "ok", + "v6_network": "", + "v6_main_ip": "", + "v6_network_size": 0, + "label": "np-2-d04e7829fa43", + "internal_ip": "10.1.96.7", + "kvm": "https://my.vultr.com/subs/vps/novnc/api.php?data=djJ8NFEzbFZmV2hOUWNrc2R4bndnckhFQTJ3ME1yWmxVeW98P-p-KeyNtP73wzVvuWZSOrV5PvQDiBmYyB3cp99btIy5nczmvX8DOGSChbEldk3idKNdFLQMIieWnpR5xU5K-dMYlL6n6oYv2u-rh8zxS6-8hQsSbL2OsoywNPoLpQ3xPkT9Rb-yPrZX4fDLbt8yPVKDHqHO0GB-TxVPemueovfkkUZMXSraAXgHtl1YgK2uLMQf1WBFVzgwnQ7MYcfMGGYFQw", + "hostname": "np-2-d04e7829fa43", + "os_id": 426, + "app_id": 0, + "image_id": "vke-worker", + "firewall_group_id": "", + "features": [], + "tags": [] + } + ], + "meta": { + "total": 3, + "links": { + "next": "", + "prev": "" + } + } +} +`) + }) +} diff --git a/discovery/vultr/vultr.go b/discovery/vultr/vultr.go new file mode 100644 index 0000000000..2f489e7d45 --- /dev/null +++ b/discovery/vultr/vultr.go @@ -0,0 +1,212 @@ +// Copyright 2022 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vultr + +import ( + "context" + "fmt" + "net" + "net/http" + "strconv" + "strings" + "time" + + "github.com/go-kit/log" + "github.com/prometheus/common/config" + "github.com/prometheus/common/model" + "github.com/prometheus/common/version" + "github.com/vultr/govultr/v2" + + "github.com/prometheus/prometheus/discovery" + "github.com/prometheus/prometheus/discovery/refresh" + "github.com/prometheus/prometheus/discovery/targetgroup" +) + +const ( + vultrInstanceLabel = model.MetaLabelPrefix + "vultr_instance_" + vultrInstanceLabelID = vultrInstanceLabel + "id" + vultrInstanceLabelLabel = vultrInstanceLabel + "label" + vultrInstanceLabelOS = vultrInstanceLabel + "os" + vultrInstanceLabelOSID = vultrInstanceLabel + "os_id" + vultrInstanceLabelRegion = vultrInstanceLabel + "region" + vultrInstanceLabelPlan = vultrInstanceLabel + "plan" + vultrInstanceLabelMainIP = vultrInstanceLabel + "main_ip" + vultrInstanceLabelMainIPV6 = vultrInstanceLabel + "main_ipv6" + vultrInstanceLabelInternalIP = vultrInstanceLabel + "internal_ip" + vultrInstanceLabelFeatures = vultrInstanceLabel + "features" + vultrInstanceLabelTags = vultrInstanceLabel + "tags" + vultrInstanceLabelHostname = vultrInstanceLabel + "hostname" + vultrInstanceLabelServerStatus = vultrInstanceLabel + "server_status" + vultrInstanceLabelVCPU = vultrInstanceLabel + "vcpu_count" + vultrInstanceLabelMemory = vultrInstanceLabel + "ram_mb" + vultrInstanceLabelBandwidth = vultrInstanceLabel + "allowed_bandwidth_gb" + vultrInstanceLabelDisk = vultrInstanceLabel + "disk_gb" + separator = "," +) + +// DefaultSDConfig is the default Vultr SD configuration. +var DefaultSDConfig = SDConfig{ + Port: 80, + RefreshInterval: model.Duration(60 * time.Second), + HTTPClientConfig: config.DefaultHTTPClientConfig, +} + +func init() { + discovery.RegisterConfig(&SDConfig{}) +} + +type SDConfig struct { + HTTPClientConfig config.HTTPClientConfig `yaml:",inline"` + + RefreshInterval model.Duration `yaml:"refresh_interval"` + Port int `yaml:"port"` +} + +// Name returns the name of the Config. +func (*SDConfig) Name() string { return "vultr" } + +// NewDiscoverer returns a Discoverer for the Config. +func (c *SDConfig) NewDiscoverer(opts discovery.DiscovererOptions) (discovery.Discoverer, error) { + return NewDiscovery(c, opts.Logger) +} + +// SetDirectory joins any relative file paths with dir. +func (c *SDConfig) SetDirectory(dir string) { + c.HTTPClientConfig.SetDirectory(dir) +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { + *c = DefaultSDConfig + type plain SDConfig + if err := unmarshal((*plain)(c)); err != nil { + return err + } + + return c.HTTPClientConfig.Validate() +} + +// Discovery periodically performs Vultr requests. It implements +// the Discoverer interface. +type Discovery struct { + *refresh.Discovery + client *govultr.Client + port int +} + +// NewDiscovery returns a new Discovery which periodically refreshes its targets. +func NewDiscovery(conf *SDConfig, logger log.Logger) (*Discovery, error) { + d := &Discovery{ + port: conf.Port, + } + + rt, err := config.NewRoundTripperFromConfig(conf.HTTPClientConfig, "vultr_sd") + if err != nil { + return nil, err + } + + d.client = govultr.NewClient(&http.Client{ + Transport: rt, + Timeout: time.Duration(conf.RefreshInterval), + }) + + d.client.SetUserAgent(fmt.Sprintf("Prometheus/%s", version.Version)) + + if err != nil { + return nil, fmt.Errorf("error setting up vultr agent: %w", err) + } + + d.Discovery = refresh.NewDiscovery( + logger, + "vultr", + time.Duration(conf.RefreshInterval), + d.refresh, + ) + return d, nil +} + +func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) { + tg := &targetgroup.Group{ + Source: "Vultr", + } + + instances, err := d.listInstances(ctx) + if err != nil { + return nil, err + } + + for _, instance := range instances { + labels := model.LabelSet{ + vultrInstanceLabelID: model.LabelValue(instance.ID), + vultrInstanceLabelLabel: model.LabelValue(instance.Label), + vultrInstanceLabelOS: model.LabelValue(instance.Os), + vultrInstanceLabelOSID: model.LabelValue(strconv.Itoa(instance.OsID)), + vultrInstanceLabelRegion: model.LabelValue(instance.Region), + vultrInstanceLabelPlan: model.LabelValue(instance.Plan), + vultrInstanceLabelVCPU: model.LabelValue(strconv.Itoa(instance.VCPUCount)), + vultrInstanceLabelMemory: model.LabelValue(strconv.Itoa(instance.RAM)), + vultrInstanceLabelBandwidth: model.LabelValue(strconv.Itoa(instance.AllowedBandwidth)), + vultrInstanceLabelDisk: model.LabelValue(strconv.Itoa(instance.Disk)), + vultrInstanceLabelMainIP: model.LabelValue(instance.MainIP), + vultrInstanceLabelMainIPV6: model.LabelValue(instance.V6MainIP), + vultrInstanceLabelInternalIP: model.LabelValue(instance.InternalIP), + vultrInstanceLabelHostname: model.LabelValue(instance.Hostname), + vultrInstanceLabelServerStatus: model.LabelValue(instance.ServerStatus), + } + + addr := net.JoinHostPort(instance.MainIP, strconv.FormatUint(uint64(d.port), 10)) + labels[model.AddressLabel] = model.LabelValue(addr) + + // We surround the separated list with the separator as well. This way regular expressions + // in relabeling rules don't have to consider feature positions. + if len(instance.Features) > 0 { + features := separator + strings.Join(instance.Features, separator) + separator + labels[vultrInstanceLabelFeatures] = model.LabelValue(features) + } + + if len(instance.Tags) > 0 { + tags := separator + strings.Join(instance.Tags, separator) + separator + labels[vultrInstanceLabelTags] = model.LabelValue(tags) + } + + tg.Targets = append(tg.Targets, labels) + } + + return []*targetgroup.Group{tg}, nil +} + +func (d *Discovery) listInstances(ctx context.Context) ([]govultr.Instance, error) { + var instances []govultr.Instance + + listOptions := &govultr.ListOptions{ + PerPage: 100, + } + + for { + pagedInstances, meta, err := d.client.Instance.List(ctx, listOptions) + if err != nil { + return nil, err + } + instances = append(instances, pagedInstances...) + + if meta.Links.Next == "" { + break + } else { + listOptions.Cursor = meta.Links.Next + continue + } + } + + return instances, nil +} diff --git a/discovery/vultr/vultr_test.go b/discovery/vultr/vultr_test.go new file mode 100644 index 0000000000..b729541531 --- /dev/null +++ b/discovery/vultr/vultr_test.go @@ -0,0 +1,128 @@ +// Copyright 2022 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vultr + +import ( + "context" + "fmt" + "net/url" + "testing" + + "github.com/go-kit/log" + "github.com/prometheus/common/model" + "github.com/stretchr/testify/require" +) + +type VultrSDTestSuite struct { + Mock *SDMock +} + +func (s *VultrSDTestSuite) TearDownSuite() { + s.Mock.ShutdownServer() +} + +func (s *VultrSDTestSuite) SetupTest(t *testing.T) { + s.Mock = NewSDMock(t) + s.Mock.Setup() + + s.Mock.HandleInstanceList() +} + +func TestVultrSDRefresh(t *testing.T) { + sdMock := &VultrSDTestSuite{} + sdMock.SetupTest(t) + t.Cleanup(sdMock.TearDownSuite) + + cfg := DefaultSDConfig + cfg.HTTPClientConfig.BearerToken = APIKey + d, err := NewDiscovery(&cfg, log.NewNopLogger()) + require.NoError(t, err) + endpoint, err := url.Parse(sdMock.Mock.Endpoint()) + require.NoError(t, err) + d.client.BaseURL = endpoint + + ctx := context.Background() + tgs, err := d.refresh(ctx) + require.NoError(t, err) + + require.Equal(t, 1, len(tgs)) + + tg := tgs[0] + require.NotNil(t, tg) + require.NotNil(t, tg.Targets) + require.Equal(t, 3, len(tg.Targets)) + + for i, k := range []model.LabelSet{ + { + "__address__": model.LabelValue("149.28.234.27:80"), + "__meta_vultr_instance_id": model.LabelValue("dbdbd38c-9884-4c92-95fe-899e50dee717"), + "__meta_vultr_instance_label": model.LabelValue("np-2-eae38a19b0f3"), + "__meta_vultr_instance_os": model.LabelValue("Marketplace"), + "__meta_vultr_instance_os_id": model.LabelValue("426"), + "__meta_vultr_instance_region": model.LabelValue("ewr"), + "__meta_vultr_instance_plan": model.LabelValue("vhf-2c-4gb"), + "__meta_vultr_instance_main_ip": model.LabelValue("149.28.234.27"), + "__meta_vultr_instance_internal_ip": model.LabelValue("10.1.96.5"), + "__meta_vultr_instance_main_ipv6": model.LabelValue(""), + "__meta_vultr_instance_features": model.LabelValue(",backups,"), + "__meta_vultr_instance_tags": model.LabelValue(",tag1,tag2,tag3,"), + "__meta_vultr_instance_hostname": model.LabelValue("np-2-eae38a19b0f3"), + "__meta_vultr_instance_server_status": model.LabelValue("ok"), + "__meta_vultr_instance_vcpu_count": model.LabelValue("2"), + "__meta_vultr_instance_ram_mb": model.LabelValue("4096"), + "__meta_vultr_instance_disk_gb": model.LabelValue("128"), + "__meta_vultr_instance_allowed_bandwidth_gb": model.LabelValue("3000"), + }, + { + "__address__": model.LabelValue("45.63.1.222:80"), + "__meta_vultr_instance_id": model.LabelValue("fccb117c-62f7-4b17-995d-a8e56dd30b33"), + "__meta_vultr_instance_label": model.LabelValue("np-2-fd0714b5fe42"), + "__meta_vultr_instance_os": model.LabelValue("Marketplace"), + "__meta_vultr_instance_os_id": model.LabelValue("426"), + "__meta_vultr_instance_region": model.LabelValue("ewr"), + "__meta_vultr_instance_plan": model.LabelValue("vhf-2c-4gb"), + "__meta_vultr_instance_main_ip": model.LabelValue("45.63.1.222"), + "__meta_vultr_instance_internal_ip": model.LabelValue("10.1.96.6"), + "__meta_vultr_instance_main_ipv6": model.LabelValue(""), + "__meta_vultr_instance_hostname": model.LabelValue("np-2-fd0714b5fe42"), + "__meta_vultr_instance_server_status": model.LabelValue("ok"), + "__meta_vultr_instance_vcpu_count": model.LabelValue("2"), + "__meta_vultr_instance_ram_mb": model.LabelValue("4096"), + "__meta_vultr_instance_disk_gb": model.LabelValue("128"), + "__meta_vultr_instance_allowed_bandwidth_gb": model.LabelValue("3000"), + }, + { + "__address__": model.LabelValue("149.28.237.151:80"), + "__meta_vultr_instance_id": model.LabelValue("c4e58767-f61b-4c5e-9bce-43761cc04868"), + "__meta_vultr_instance_label": model.LabelValue("np-2-d04e7829fa43"), + "__meta_vultr_instance_os": model.LabelValue("Marketplace"), + "__meta_vultr_instance_os_id": model.LabelValue("426"), + "__meta_vultr_instance_region": model.LabelValue("ewr"), + "__meta_vultr_instance_plan": model.LabelValue("vhf-2c-4gb"), + "__meta_vultr_instance_main_ip": model.LabelValue("149.28.237.151"), + "__meta_vultr_instance_internal_ip": model.LabelValue("10.1.96.7"), + "__meta_vultr_instance_main_ipv6": model.LabelValue(""), + "__meta_vultr_instance_hostname": model.LabelValue("np-2-d04e7829fa43"), + "__meta_vultr_instance_server_status": model.LabelValue("ok"), + "__meta_vultr_instance_vcpu_count": model.LabelValue("2"), + "__meta_vultr_instance_ram_mb": model.LabelValue("4096"), + "__meta_vultr_instance_disk_gb": model.LabelValue("128"), + "__meta_vultr_instance_allowed_bandwidth_gb": model.LabelValue("3000"), + }, + } { + t.Run(fmt.Sprintf("item %d", i), func(t *testing.T) { + require.Equal(t, k, tg.Targets[i]) + }) + } +} diff --git a/discovery/xds/client.go b/discovery/xds/client.go index 05d1ca40cd..9844c6d7ed 100644 --- a/discovery/xds/client.go +++ b/discovery/xds/client.go @@ -19,7 +19,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "net/http" "net/url" "path" @@ -195,7 +194,7 @@ func (rc *HTTPResourceClient) Fetch(ctx context.Context) (*v3.DiscoveryResponse, return nil, err } defer func() { - io.Copy(ioutil.Discard, resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() }() @@ -208,7 +207,7 @@ func (rc *HTTPResourceClient) Fetch(ctx context.Context) (*v3.DiscoveryResponse, return nil, fmt.Errorf("non 200 status '%d' response during xDS fetch", resp.StatusCode) } - respBody, err := ioutil.ReadAll(resp.Body) + respBody, err := io.ReadAll(resp.Body) if err != nil { return nil, err } diff --git a/discovery/xds/kuma.go b/discovery/xds/kuma.go index 03816e7627..bc88ba5540 100644 --- a/discovery/xds/kuma.go +++ b/discovery/xds/kuma.go @@ -20,7 +20,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/config" "github.com/prometheus/common/model" @@ -92,7 +91,7 @@ func (c *KumaSDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { } if len(c.Server) == 0 { - return errors.Errorf("kuma SD server must not be empty: %s", c.Server) + return fmt.Errorf("kuma SD server must not be empty: %s", c.Server) } parsedURL, err := url.Parse(c.Server) if err != nil { @@ -100,7 +99,7 @@ func (c *KumaSDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { } if len(parsedURL.Scheme) == 0 || len(parsedURL.Host) == 0 { - return errors.Errorf("kuma SD server must not be empty and have a scheme: %s", c.Server) + return fmt.Errorf("kuma SD server must not be empty and have a scheme: %s", c.Server) } return c.HTTPClientConfig.Validate() @@ -159,7 +158,7 @@ func convertKumaUserLabels(labels map[string]string) model.LabelSet { // kumaMadsV1ResourceParser is an xds.resourceParser. func kumaMadsV1ResourceParser(resources []*anypb.Any, typeURL string) ([]model.LabelSet, error) { if typeURL != KumaMadsV1ResourceTypeURL { - return nil, errors.Errorf("received invalid typeURL for Kuma MADS v1 Resource: %s", typeURL) + return nil, fmt.Errorf("received invalid typeURL for Kuma MADS v1 Resource: %s", typeURL) } var targets []model.LabelSet diff --git a/discovery/xds/kuma_test.go b/discovery/xds/kuma_test.go index 008d63a371..1db0a0831d 100644 --- a/discovery/xds/kuma_test.go +++ b/discovery/xds/kuma_test.go @@ -15,12 +15,12 @@ package xds import ( "context" + "errors" "fmt" "testing" "time" v3 "github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3" - "github.com/pkg/errors" "github.com/prometheus/common/model" "github.com/stretchr/testify/require" "google.golang.org/protobuf/proto" diff --git a/discovery/xds/xds_test.go b/discovery/xds/xds_test.go index c0cdd3e7b4..b6c141e283 100644 --- a/discovery/xds/xds_test.go +++ b/discovery/xds/xds_test.go @@ -16,7 +16,6 @@ package xds import ( "context" "io" - "io/ioutil" "net/http" "net/http/httptest" "testing" @@ -60,9 +59,9 @@ func createTestHTTPServer(t *testing.T, responder discoveryResponder) *httptest. require.Equal(t, "application/json", r.Header.Get("Content-Type")) require.Equal(t, "application/json", r.Header.Get("Accept")) - body, err := ioutil.ReadAll(r.Body) + body, err := io.ReadAll(r.Body) defer func() { - _, _ = io.Copy(ioutil.Discard, r.Body) + _, _ = io.Copy(io.Discard, r.Body) _ = r.Body.Close() }() require.NotEmpty(t, body) diff --git a/discovery/zookeeper/zookeeper.go b/discovery/zookeeper/zookeeper.go index 528bdf073d..308d63a5fc 100644 --- a/discovery/zookeeper/zookeeper.go +++ b/discovery/zookeeper/zookeeper.go @@ -16,6 +16,7 @@ package zookeeper import ( "context" "encoding/json" + "errors" "fmt" "net" "strconv" @@ -24,7 +25,6 @@ import ( "github.com/go-kit/log" "github.com/go-zookeeper/zk" - "github.com/pkg/errors" "github.com/prometheus/common/model" "github.com/prometheus/prometheus/discovery" @@ -80,7 +80,7 @@ func (c *ServersetSDConfig) UnmarshalYAML(unmarshal func(interface{}) error) err } for _, path := range c.Paths { if !strings.HasPrefix(path, "/") { - return errors.Errorf("serverset SD config paths must begin with '/': %s", path) + return fmt.Errorf("serverset SD config paths must begin with '/': %s", path) } } return nil @@ -117,7 +117,7 @@ func (c *NerveSDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { } for _, path := range c.Paths { if !strings.HasPrefix(path, "/") { - return errors.Errorf("nerve SD config paths must begin with '/': %s", path) + return fmt.Errorf("nerve SD config paths must begin with '/': %s", path) } } return nil @@ -263,7 +263,7 @@ func parseServersetMember(data []byte, path string) (model.LabelSet, error) { member := serversetMember{} if err := json.Unmarshal(data, &member); err != nil { - return nil, errors.Wrapf(err, "error unmarshaling serverset member %q", path) + return nil, fmt.Errorf("error unmarshaling serverset member %q: %w", path, err) } labels := model.LabelSet{} @@ -305,7 +305,7 @@ func parseNerveMember(data []byte, path string) (model.LabelSet, error) { member := nerveMember{} err := json.Unmarshal(data, &member) if err != nil { - return nil, errors.Wrapf(err, "error unmarshaling nerve member %q", path) + return nil, fmt.Errorf("error unmarshaling nerve member %q: %w", path, err) } labels := model.LabelSet{} diff --git a/docs/configuration/configuration.md b/docs/configuration/configuration.md index 08349e2417..b1d5915822 100644 --- a/docs/configuration/configuration.md +++ b/docs/configuration/configuration.md @@ -99,7 +99,7 @@ remote_read: # Storage related settings that are runtime reloadable. storage: - [ - ... ] + [ exemplars: ] # Configures exporting traces. tracing: @@ -256,6 +256,11 @@ hetzner_sd_configs: http_sd_configs: [ - ... ] + +# List of IONOS service discovery configurations. +ionos_sd_configs: + [ - ... ] + # List of Kubernetes service discovery configurations. kubernetes_sd_configs: [ - ... ] @@ -369,6 +374,12 @@ A `tls_config` allows configuring TLS connections. # Disable validation of the server certificate. [ insecure_skip_verify: ] + +# Minimum acceptable TLS version. Accepted values: TLS10 (TLS 1.0), TLS11 (TLS +# 1.1), TLS12 (TLS 1.2), TLS13 (TLS 1.3). +# If unset, Prometheus will use Go default minimum version, which is TLS 1.2. +# See MinVersion in https://pkg.go.dev/crypto/tls#Config. +[ min_version: ] ``` ### `` @@ -1533,6 +1544,86 @@ tls_config: [ ] ``` +### `` + +IONOS SD configurations allows retrieving scrape targets from +[IONOS Cloud](https://cloud.ionos.com/) API. This service discovery uses the +first NICs IP address by default, but that can be changed with relabeling. The +following meta labels are available on all targets during +[relabeling](#relabel_config): + +* `__meta_ionos_server_availability_zone`: the availability zone of the server +* `__meta_ionos_server_boot_cdrom_id`: the ID of the CD-ROM the server is booted + from +* `__meta_ionos_server_boot_image_id`: the ID of the boot image or snapshot the + server is booted from +* `__meta_ionos_server_boot_volume_id`: the ID of the boot volume +* `__meta_ionos_server_cpu_family`: the CPU family of the server + to +* `__meta_ionos_server_id`: the ID of the server +* `__meta_ionos_server_ip`: comma separated list of all IPs assigned to the + server +* `__meta_ionos_server_lifecycle`: the lifecycle state of the server resource +* `__meta_ionos_server_name`: the name of the server +* `__meta_ionos_server_nic_ip_`: comma separated list of IPs, grouped + by the name of each NIC attached to the server +* `__meta_ionos_server_servers_id`: the ID of the servers the server belongs to +* `__meta_ionos_server_state`: the execution state of the server +* `__meta_ionos_server_type`: the type of the server + +```yaml +# The unique ID of the data center. +datacenter_id: + +# Authentication information used to authenticate to the API server. +# Note that `basic_auth` and `authorization` options are +# mutually exclusive. +# password and password_file are mutually exclusive. + +# Optional HTTP basic authentication information, required when using IONOS +# Cloud username and password as authentication method. +basic_auth: + [ username: ] + [ password: ] + [ password_file: ] + +# Optional `Authorization` header configuration, required when using IONOS +# Cloud token as authentication method. +authorization: + # Sets the authentication type. + [ type: | default: Bearer ] + # Sets the credentials. It is mutually exclusive with + # `credentials_file`. + [ credentials: ] + # Sets the credentials to the credentials read from the configured file. + # It is mutually exclusive with `credentials`. + [ credentials_file: ] + +# Optional OAuth 2.0 configuration. +# Cannot be used at the same time as basic_auth or authorization. +oauth2: + [ ] + +# Optional proxy URL. +[ proxy_url: ] + +# Configure whether HTTP requests follow HTTP 3xx redirects. +[ follow_redirects: | default = true ] + +# Whether to enable HTTP2. +[ enable_http2: | default: true ] + +# TLS configuration. +tls_config: + [ ] + +# The port to scrape metrics from. +[ port: | default = 80 ] + +# The time after which the servers are refreshed. +[ refresh_interval: | default = 60s ] +``` + ### `` Kubernetes SD configurations allow retrieving scrape targets from @@ -2447,6 +2538,83 @@ tls_config: See [the Prometheus uyuni-sd configuration file](/documentation/examples/prometheus-uyuni.yml) for a practical example on how to set up Uyuni Prometheus configuration. +### `` + +Vultr SD configurations allow retrieving scrape targets from [Vultr](https://www.vultr.com/). + +This service discovery uses the main IPv4 address by default, which that be +changed with relabelling, as demonstrated in [the Prometheus vultr-sd +configuration file](/documentation/examples/prometheus-vultr.yml). + +The following meta labels are available on targets during [relabeling](#relabel_config): + +* `__meta_vultr_instance_id` : A unique ID for the vultr Instance. +* `__meta_vultr_instance_label` : The user-supplied label for this instance. +* `__meta_vultr_instance_os` : The Operating System name. +* `__meta_vultr_instance_os_id` : The Operating System id used by this instance. +* `__meta_vultr_instance_region` : The Region id where the Instance is located. +* `__meta_vultr_instance_plan` : A unique ID for the Plan. +* `__meta_vultr_instance_main_ip` : The main IPv4 address. +* `__meta_vultr_instance_internal_ip` : The private IP address. +* `__meta_vultr_instance_main_ipv6` : The main IPv6 address. +* `__meta_vultr_instance_features` : List of features that are available to the instance. +* `__meta_vultr_instance_tags` : List of tags associated with the instance. +* `__meta_vultr_instance_hostname` : The hostname for this instance. +* `__meta_vultr_instance_server_status` : The server health status. +* `__meta_vultr_instance_vcpu_count` : Number of vCPUs. +* `__meta_vultr_instance_ram_mb` : The amount of RAM in MB. +* `__meta_vultr_instance_disk_gb` : The size of the disk in GB. +* `__meta_vultr_instance_allowed_bandwidth_gb` : Monthly bandwidth quota in GB. + +```yaml +# Authentication information used to authenticate to the API server. +# Note that `basic_auth` and `authorization` options are +# mutually exclusive. +# password and password_file are mutually exclusive. + +# Optional HTTP basic authentication information, not currently supported by Vultr. +basic_auth: + [ username: ] + [ password: ] + [ password_file: ] + +# Optional `Authorization` header configuration. +authorization: + # Sets the authentication type. + [ type: | default: Bearer ] + # Sets the credentials. It is mutually exclusive with + # `credentials_file`. + [ credentials: ] + # Sets the credentials to the credentials read from the configured file. + # It is mutually exclusive with `credentials`. + [ credentials_file: ] + +# Optional OAuth 2.0 configuration. +# Cannot be used at the same time as basic_auth or authorization. +oauth2: + [ ] + +# Optional proxy URL. +[ proxy_url: ] + +# Configure whether HTTP requests follow HTTP 3xx redirects. +[ follow_redirects: | default = true ] + +# Whether to enable HTTP2. +[ enable_http2: | default: true ] + +# TLS configuration. +tls_config: + [ ] + +# The port to scrape metrics from. +[ port: | default = 80 ] + +# The time after which the instances are refreshed. +[ refresh_interval: | default = 60s ] +``` + + ### `` A `static_config` allows specifying a list of targets and a common label set @@ -2530,6 +2698,8 @@ anchored on both ends. To un-anchor the regex, use `.*.*`. `target_label` to `replacement`, with match group references (`${1}`, `${2}`, ...) in `replacement` substituted by their value. If `regex` does not match, no replacement takes place. +* `lowercase`: Maps the concatenated `source_labels` to their lower case. +* `uppercase`: Maps the concatenated `source_labels` to their upper case. * `keep`: Drop targets for which `regex` does not match the concatenated `source_labels`. * `drop`: Drop targets for which `regex` matches the concatenated `source_labels`. * `hashmod`: Set `target_label` to the `modulus` of a hash of the concatenated `source_labels`. @@ -2672,6 +2842,10 @@ hetzner_sd_configs: http_sd_configs: [ - ... ] + # List of IONOS service discovery configurations. +ionos_sd_configs: + [ - ... ] + # List of Kubernetes service discovery configurations. kubernetes_sd_configs: [ - ... ] @@ -2716,6 +2890,10 @@ triton_sd_configs: uyuni_sd_configs: [ - ... ] +# List of Vultr service discovery configurations. +vultr_sd_configs: + [ - ... ] + # List of labeled statically configured Alertmanagers. static_configs: [ - ... ] diff --git a/docs/configuration/template_reference.md b/docs/configuration/template_reference.md index 34557ecd83..5c96ee597b 100644 --- a/docs/configuration/template_reference.md +++ b/docs/configuration/template_reference.md @@ -76,6 +76,7 @@ versions. | graphLink | expr | string | Returns path to graph view in the [expression browser](https://prometheus.io/docs/visualization/browser/) for the expression. | | tableLink | expr | string | Returns path to tabular ("Table") view in the [expression browser](https://prometheus.io/docs/visualization/browser/) for the expression. | | parseDuration | string | float | Parses a duration string such as "1h" into the number of seconds it represents. | +| stripDomain | string | string | Removes the domain part of a FQDN. Leaves port untouched. | ### Others diff --git a/docs/querying/examples.md b/docs/querying/examples.md index 28fa49fe94..a4fd373bf5 100644 --- a/docs/querying/examples.md +++ b/docs/querying/examples.md @@ -17,8 +17,8 @@ Return all time series with the metric `http_requests_total` and the given http_requests_total{job="apiserver", handler="/api/comments"} -Return a whole range of time (in this case 5 minutes) for the same vector, -making it a range vector: +Return a whole range of time (in this case 5 minutes up to the query time) +for the same vector, making it a [range vector](../basics/#range-vector-selectors): http_requests_total{job="apiserver", handler="/api/comments"}[5m] diff --git a/docs/querying/functions.md b/docs/querying/functions.md index 1de8bb2aa9..d4236f0b86 100644 --- a/docs/querying/functions.md +++ b/docs/querying/functions.md @@ -103,6 +103,12 @@ for each of the given times in UTC. Returned values are from 1 to 31. each of the given times in UTC. Returned values are from 0 to 6, where 0 means Sunday etc. +## `day_of_year()` + +`day_of_year(v=vector(time()) instant-vector)` returns the day of the year for +each of the given times in UTC. Returned values are from 1 to 365 for non-leap years, +and 1 to 366 in leap years. + ## `days_in_month()` `days_in_month(v=vector(time()) instant-vector)` returns number of days in the @@ -405,8 +411,6 @@ expression is to be evaluated. `timestamp(v instant-vector)` returns the timestamp of each of the samples of the given vector as the number of seconds since January 1, 1970 UTC. -*This function was added in Prometheus 2.0* - ## `vector()` `vector(s scalar)` returns the scalar `s` as a vector with no labels. diff --git a/documentation/examples/Makefile b/documentation/examples/Makefile new file mode 100644 index 0000000000..4085155f80 --- /dev/null +++ b/documentation/examples/Makefile @@ -0,0 +1,20 @@ +# Copyright 2022 The Prometheus Authors +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +.PHONY: all +all: check-examples-syntax + +.PHONY: check-examples-syntax +check-examples-syntax: prometheus-*.yml + @echo ">> check example configurations syntax" + @set -e; for file in $^; do ../../promtool check config --syntax-only $$file; done diff --git a/documentation/examples/custom-sd/adapter-usage/main.go b/documentation/examples/custom-sd/adapter-usage/main.go index 80a8f1b5ed..a3136f08e8 100644 --- a/documentation/examples/custom-sd/adapter-usage/main.go +++ b/documentation/examples/custom-sd/adapter-usage/main.go @@ -18,7 +18,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net" "net/http" "os" @@ -101,11 +100,11 @@ func (d *discovery) parseServiceNodes(resp *http.Response, name string) (*target } defer func() { - io.Copy(ioutil.Discard, resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() }() - b, err := ioutil.ReadAll(resp.Body) + b, err := io.ReadAll(resp.Body) if err != nil { return nil, err } @@ -168,8 +167,8 @@ func (d *discovery) Run(ctx context.Context, ch chan<- []*targetgroup.Group) { continue } - b, err := ioutil.ReadAll(resp.Body) - io.Copy(ioutil.Discard, resp.Body) + b, err := io.ReadAll(resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() if err != nil { level.Error(d.logger).Log("msg", "Error reading services list", "err", err) diff --git a/documentation/examples/custom-sd/adapter/adapter.go b/documentation/examples/custom-sd/adapter/adapter.go index abaad7dc70..57c32ce492 100644 --- a/documentation/examples/custom-sd/adapter/adapter.go +++ b/documentation/examples/custom-sd/adapter/adapter.go @@ -18,7 +18,6 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" "os" "path/filepath" "reflect" @@ -117,7 +116,7 @@ func (a *Adapter) writeOutput() error { b, _ := json.MarshalIndent(arr, "", " ") dir, _ := filepath.Split(a.output) - tmpfile, err := ioutil.TempFile(dir, "sd-adapter") + tmpfile, err := os.CreateTemp(dir, "sd-adapter") if err != nil { return err } @@ -156,6 +155,7 @@ func (a *Adapter) runCustomSD(ctx context.Context) { // Run starts a Discovery Manager and the custom service discovery implementation. func (a *Adapter) Run() { + //nolint:errcheck go a.manager.Run() a.manager.StartCustomProvider(a.ctx, a.name, a.disc) go a.runCustomSD(a.ctx) diff --git a/documentation/examples/custom-sd/adapter/adapter_test.go b/documentation/examples/custom-sd/adapter/adapter_test.go index e1223537c0..eaf34c6673 100644 --- a/documentation/examples/custom-sd/adapter/adapter_test.go +++ b/documentation/examples/custom-sd/adapter/adapter_test.go @@ -15,7 +15,6 @@ package adapter import ( "context" - "io/ioutil" "os" "testing" @@ -223,7 +222,7 @@ func TestGenerateTargetGroups(t *testing.T) { // TestWriteOutput checks the adapter can write a file to disk. func TestWriteOutput(t *testing.T) { ctx := context.Background() - tmpfile, err := ioutil.TempFile("", "sd_adapter_test") + tmpfile, err := os.CreateTemp("", "sd_adapter_test") require.NoError(t, err) defer os.Remove(tmpfile.Name()) tmpfile.Close() diff --git a/documentation/examples/prometheus-hetzner.yml b/documentation/examples/prometheus-hetzner.yml index ccc1ffc287..1638efab69 100644 --- a/documentation/examples/prometheus-hetzner.yml +++ b/documentation/examples/prometheus-hetzner.yml @@ -13,7 +13,7 @@ scrape_configs: hetzner_sd_configs: - authorization: credentials: "" - platform: "hcloud" + role: "hcloud" relabel_configs: # Use the public IPv4 and port 9100 to scrape the target. - source_labels: [__meta_hetzner_public_ipv4] @@ -26,7 +26,7 @@ scrape_configs: hetzner_sd_configs: - authorization: credentials: "" - platform: "hcloud" + role: "hcloud" relabel_configs: # Use the private IPv4 within the Hetzner Cloud Network and port 9100 to scrape the target. - source_labels: [__meta_hetzner_hcloud_private_ipv4_mynet] @@ -40,7 +40,7 @@ scrape_configs: - basic_auth: username: "" password: "" - platform: "robot" + role: "robot" relabel_configs: # Use the public IPv4 and port 9100 to scrape the target. - source_labels: [__meta_hetzner_public_ipv4] diff --git a/documentation/examples/prometheus-ionos.yml b/documentation/examples/prometheus-ionos.yml new file mode 100644 index 0000000000..45e148091c --- /dev/null +++ b/documentation/examples/prometheus-ionos.yml @@ -0,0 +1,30 @@ +# A example scrape configuration for running Prometheus with IONOS Cloud. +scrape_configs: + - job_name: "node" + ionos_sd_configs: + - basic_auth: + # Replace with your username. + username: username + # Replace with your password. + password: password + # You can find your data center unique ID here: https://dcd.ionos.com/latest/ + datacenter_id: 11111111-1111-1111-1111-111111111111 + port: 9100 + relabel_configs: + # Only scrape servers that are available via API. + - source_labels: [__meta_ionos_server_lifecycle] + action: keep + regex: "AVAILABLE" + + # Only scrape servers that are in a running state. + - source_labels: [__meta_ionos_server_state] + action: keep + regex: "RUNNING" + + # Replace instance label with server name. + - source_labels: [__meta_ionos_server_name] + target_label: instance + + # Add server availability zone as label. + - source_labels: [__meta_ionos_availability_zone] + target_label: ionos_zone diff --git a/documentation/examples/prometheus-linode.yml b/documentation/examples/prometheus-linode.yml index a19b2c3a85..993b6a5c12 100644 --- a/documentation/examples/prometheus-linode.yml +++ b/documentation/examples/prometheus-linode.yml @@ -11,7 +11,7 @@ scrape_configs: - job_name: "node" linode_sd_configs: - authorization: - credentials: "" + credentials: "" relabel_configs: # Only scrape targets that have a tag 'monitoring'. - source_labels: [__meta_linode_tags] diff --git a/documentation/examples/prometheus-vultr.yml b/documentation/examples/prometheus-vultr.yml new file mode 100644 index 0000000000..1b2e8ff8c8 --- /dev/null +++ b/documentation/examples/prometheus-vultr.yml @@ -0,0 +1,24 @@ +# An example scrape configuration for running Prometheus with +# Vultr. + +scrape_configs: + # Make Prometheus scrape itself for metrics. + - job_name: "prometheus" + static_configs: + - targets: ["localhost:9090"] + + # Discover Node Exporter instances to scrape. + - job_name: "node" + vultr_sd_configs: + - authorization: + credentials: "" + relabel_configs: + # Only scrape targets that have a tag 'monitoring'. + - source_labels: [__meta_vultr_instance_tags] + regex: ".*,monitoring,.*" + action: keep + + # Use the public IPv6 address and port 9100 to scrape the target. + - source_labels: [__meta_vultr_instance_main_ipv6] + target_label: __address__ + replacement: "[$1]:9100" diff --git a/documentation/examples/remote_storage/go.mod b/documentation/examples/remote_storage/go.mod index f73948111a..10b33e51f2 100644 --- a/documentation/examples/remote_storage/go.mod +++ b/documentation/examples/remote_storage/go.mod @@ -3,15 +3,14 @@ module github.com/prometheus/prometheus/documentation/examples/remote_storage go 1.17 require ( - github.com/go-kit/log v0.2.0 + github.com/go-kit/log v0.2.1 github.com/gogo/protobuf v1.3.2 github.com/golang/snappy v0.0.4 github.com/influxdata/influxdb v1.9.5 - github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.12.1 - github.com/prometheus/common v0.32.1 + github.com/prometheus/client_golang v1.12.2 + github.com/prometheus/common v0.34.0 github.com/prometheus/prometheus v1.8.2-0.20220202104425-d819219dd438 - github.com/stretchr/testify v1.7.0 + github.com/stretchr/testify v1.7.2 gopkg.in/alecthomas/kingpin.v2 v2.2.6 ) @@ -30,6 +29,7 @@ require ( github.com/jpillora/backoff v1.0.0 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common/sigv4 v0.1.0 // indirect @@ -41,13 +41,13 @@ require ( go.opentelemetry.io/otel/trace v1.2.0 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/goleak v1.1.12 // indirect - golang.org/x/net v0.0.0-20220105145211-5b0dc2dfae98 // indirect - golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect + golang.org/x/net v0.0.0-20220225172249-27dd8689420f // indirect + golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 // indirect golang.org/x/text v0.3.7 // indirect golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.27.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/documentation/examples/remote_storage/go.sum b/documentation/examples/remote_storage/go.sum index eb2c31ccf2..bedf519ed0 100644 --- a/documentation/examples/remote_storage/go.sum +++ b/documentation/examples/remote_storage/go.sum @@ -458,8 +458,9 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +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= @@ -1104,8 +1105,9 @@ github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3O github.com/prometheus/client_golang v1.5.1/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.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -1126,8 +1128,9 @@ github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB8 github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.34.0 h1:RBmGO9d/FVjqHT0yUGQwBJhkwKV+wPCn7KGpvfab0uE= +github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= github.com/prometheus/exporter-toolkit v0.6.1/go.mod h1:ZUBIj498ePooX9t/2xtDjeQYwvRpiPP2lh5u4iblj2g= @@ -1228,8 +1231,9 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -1502,8 +1506,10 @@ golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220105145211-5b0dc2dfae98 h1:+6WJMRLHlD7X7frgp7TUZ36RnQzSf9wVVTNakEp+nqY= golang.org/x/net v0.0.0-20220105145211-5b0dc2dfae98/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1519,8 +1525,9 @@ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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= @@ -1653,8 +1660,9 @@ golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8 golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1975,8 +1983,9 @@ 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= gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= diff --git a/documentation/examples/remote_storage/remote_storage_adapter/influxdb/client.go b/documentation/examples/remote_storage/remote_storage_adapter/influxdb/client.go index f0ee58c5a2..fffbc9c2ae 100644 --- a/documentation/examples/remote_storage/remote_storage_adapter/influxdb/client.go +++ b/documentation/examples/remote_storage/remote_storage_adapter/influxdb/client.go @@ -15,6 +15,7 @@ package influxdb import ( "encoding/json" + "errors" "fmt" "math" "os" @@ -23,7 +24,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" influx "github.com/influxdata/influxdb/client/v2" - "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/model" @@ -174,7 +174,7 @@ func (c *Client) buildCommand(q *prompb.Query) (string, error) { case prompb.LabelMatcher_NRE: matchers = append(matchers, fmt.Sprintf("%q !~ /^%s$/", m.Name, escapeSlashes(m.Value))) default: - return "", errors.Errorf("unknown match type %v", m.Type) + return "", fmt.Errorf("unknown match type %v", m.Type) } } matchers = append(matchers, fmt.Sprintf("time >= %vms", q.StartTimestampMs)) @@ -253,27 +253,27 @@ func valuesToSamples(values [][]interface{}) ([]prompb.Sample, error) { samples := make([]prompb.Sample, 0, len(values)) for _, v := range values { if len(v) != 2 { - return nil, errors.Errorf("bad sample tuple length, expected [, ], got %v", v) + return nil, fmt.Errorf("bad sample tuple length, expected [, ], got %v", v) } jsonTimestamp, ok := v[0].(json.Number) if !ok { - return nil, errors.Errorf("bad timestamp: %v", v[0]) + return nil, fmt.Errorf("bad timestamp: %v", v[0]) } jsonValue, ok := v[1].(json.Number) if !ok { - return nil, errors.Errorf("bad sample value: %v", v[1]) + return nil, fmt.Errorf("bad sample value: %v", v[1]) } timestamp, err := jsonTimestamp.Int64() if err != nil { - return nil, errors.Wrap(err, "unable to convert sample timestamp to int64") + return nil, fmt.Errorf("unable to convert sample timestamp to int64: %w", err) } value, err := jsonValue.Float64() if err != nil { - return nil, errors.Wrap(err, "unable to convert sample value to float64") + return nil, fmt.Errorf("unable to convert sample value to float64: %w", err) } samples = append(samples, prompb.Sample{ diff --git a/documentation/examples/remote_storage/remote_storage_adapter/influxdb/client_test.go b/documentation/examples/remote_storage/remote_storage_adapter/influxdb/client_test.go index b657abddea..cb56514e4b 100644 --- a/documentation/examples/remote_storage/remote_storage_adapter/influxdb/client_test.go +++ b/documentation/examples/remote_storage/remote_storage_adapter/influxdb/client_test.go @@ -14,7 +14,7 @@ package influxdb import ( - "io/ioutil" + "io" "math" "net/http" "net/http/httptest" @@ -76,7 +76,7 @@ testmetric,test_label=test_label_value2 value=5.1234 123456789123 func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "POST", r.Method, "Unexpected method.") require.Equal(t, "/write", r.URL.Path, "Unexpected path.") - b, err := ioutil.ReadAll(r.Body) + b, err := io.ReadAll(r.Body) require.NoError(t, err, "Error reading body.") require.Equal(t, expectedBody, string(b), "Unexpected request body.") }, diff --git a/documentation/examples/remote_storage/remote_storage_adapter/main.go b/documentation/examples/remote_storage/remote_storage_adapter/main.go index 6a993a6098..eac2ec409c 100644 --- a/documentation/examples/remote_storage/remote_storage_adapter/main.go +++ b/documentation/examples/remote_storage/remote_storage_adapter/main.go @@ -16,7 +16,7 @@ package main import ( "fmt" - "io/ioutil" + "io" "net/http" _ "net/http/pprof" "net/url" @@ -30,7 +30,6 @@ import ( "github.com/gogo/protobuf/proto" "github.com/golang/snappy" influx "github.com/influxdata/influxdb/client/v2" - "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/common/model" @@ -148,7 +147,7 @@ func parseFlags() *config { _, err := a.Parse(os.Args[1:]) if err != nil { - fmt.Fprintln(os.Stderr, errors.Wrapf(err, "Error parsing commandline arguments")) + fmt.Fprintln(os.Stderr, fmt.Errorf("Error parsing commandline arguments: %w", err)) a.Usage(os.Args[1:]) os.Exit(2) } @@ -234,7 +233,7 @@ func serve(logger log.Logger, addr string, writers []writer, readers []reader) e }) http.HandleFunc("/read", func(w http.ResponseWriter, r *http.Request) { - compressed, err := ioutil.ReadAll(r.Body) + compressed, err := io.ReadAll(r.Body) if err != nil { level.Error(logger).Log("msg", "Read error", "err", err.Error()) http.Error(w, err.Error(), http.StatusInternalServerError) diff --git a/documentation/examples/remote_storage/remote_storage_adapter/opentsdb/client.go b/documentation/examples/remote_storage/remote_storage_adapter/opentsdb/client.go index d90ce48095..0fa7c5a4b7 100644 --- a/documentation/examples/remote_storage/remote_storage_adapter/opentsdb/client.go +++ b/documentation/examples/remote_storage/remote_storage_adapter/opentsdb/client.go @@ -17,8 +17,8 @@ import ( "bytes" "context" "encoding/json" + "fmt" "io" - "io/ioutil" "math" "net/http" "net/url" @@ -26,7 +26,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/pkg/errors" "github.com/prometheus/common/model" ) @@ -116,7 +115,7 @@ func (c *Client) Write(samples model.Samples) error { return err } defer func() { - io.Copy(ioutil.Discard, resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() }() @@ -128,7 +127,7 @@ func (c *Client) Write(samples model.Samples) error { // API returns status code 400 on error, encoding error details in the // response content in JSON. - buf, err = ioutil.ReadAll(resp.Body) + buf, err = io.ReadAll(resp.Body) if err != nil { return err } @@ -137,7 +136,7 @@ func (c *Client) Write(samples model.Samples) error { if err := json.Unmarshal(buf, &r); err != nil { return err } - return errors.Errorf("failed to write %d samples to OpenTSDB, %d succeeded", r["failed"], r["success"]) + return fmt.Errorf("failed to write %d samples to OpenTSDB, %d succeeded", r["failed"], r["success"]) } // Name identifies the client as an OpenTSDB client. diff --git a/documentation/examples/remote_storage/remote_storage_adapter/opentsdb/tagvalue.go b/documentation/examples/remote_storage/remote_storage_adapter/opentsdb/tagvalue.go index f5c2009ba0..d96f9017af 100644 --- a/documentation/examples/remote_storage/remote_storage_adapter/opentsdb/tagvalue.go +++ b/documentation/examples/remote_storage/remote_storage_adapter/opentsdb/tagvalue.go @@ -17,7 +17,6 @@ import ( "bytes" "fmt" - "github.com/pkg/errors" "github.com/prometheus/common/model" ) @@ -98,13 +97,13 @@ func (tv *TagValue) UnmarshalJSON(json []byte) error { for i, b := range json { if i == 0 { if b != '"' { - return errors.Errorf("expected '\"', got %q", b) + return fmt.Errorf("expected '\"', got %q", b) } continue } if i == len(json)-1 { if b != '"' { - return errors.Errorf("expected '\"', got %q", b) + return fmt.Errorf("expected '\"', got %q", b) } break } @@ -130,7 +129,7 @@ func (tv *TagValue) UnmarshalJSON(json []byte) error { parsedByte = (b - 55) << 4 escapeLevel = 2 default: - return errors.Errorf( + return fmt.Errorf( "illegal escape sequence at byte %d (%c)", i, b, ) @@ -142,7 +141,7 @@ func (tv *TagValue) UnmarshalJSON(json []byte) error { case b >= 'A' && b <= 'F': // A-F parsedByte += b - 55 default: - return errors.Errorf( + return fmt.Errorf( "illegal escape sequence at byte %d (%c)", i, b, ) diff --git a/go.mod b/go.mod index 9fecc16ad5..867873aadc 100644 --- a/go.mod +++ b/go.mod @@ -1,88 +1,186 @@ module github.com/prometheus/prometheus -go 1.16 +go 1.17 require ( - github.com/Azure/azure-sdk-for-go v63.0.0+incompatible - github.com/Azure/go-autorest/autorest v0.11.25 - github.com/Azure/go-autorest/autorest/adal v0.9.18 - github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect - github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect + github.com/Azure/azure-sdk-for-go v65.0.0+incompatible + github.com/Azure/go-autorest/autorest v0.11.27 + github.com/Azure/go-autorest/autorest/adal v0.9.20 github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 - github.com/armon/go-metrics v0.3.3 // indirect - github.com/aws/aws-sdk-go v1.43.31 + github.com/aws/aws-sdk-go v1.44.29 github.com/cespare/xxhash/v2 v2.1.2 - github.com/containerd/containerd v1.6.1 // indirect github.com/dennwc/varint v1.0.0 github.com/dgryski/go-sip13 v0.0.0-20200911182023-62edffca9245 - github.com/digitalocean/godo v1.78.0 - github.com/docker/docker v20.10.14+incompatible + github.com/digitalocean/godo v1.80.0 + github.com/docker/docker v20.10.16+incompatible github.com/edsrzf/mmap-go v1.1.0 - github.com/envoyproxy/go-control-plane v0.10.1 + github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1 github.com/envoyproxy/protoc-gen-validate v0.6.7 - github.com/fsnotify/fsnotify v1.5.1 - github.com/go-kit/log v0.2.0 + github.com/fsnotify/fsnotify v1.5.4 + github.com/go-kit/log v0.2.1 github.com/go-logfmt/logfmt v0.5.1 github.com/go-openapi/strfmt v0.21.2 github.com/go-zookeeper/zk v1.0.2 github.com/gogo/protobuf v1.3.2 github.com/golang/snappy v0.0.4 - github.com/google/pprof v0.0.0-20220318212150-b2ab0324ddda - github.com/gophercloud/gophercloud v0.24.0 + github.com/google/pprof v0.0.0-20220520215854-d04f2422c8a1 + github.com/gophercloud/gophercloud v0.25.0 github.com/grafana/regexp v0.0.0-20220304095617-2e8d9baf4ac2 github.com/grpc-ecosystem/grpc-gateway v1.16.0 - github.com/hashicorp/consul/api v1.12.0 - github.com/hashicorp/go-hclog v0.12.2 // indirect - github.com/hashicorp/go-immutable-radix v1.2.0 // indirect - github.com/hetznercloud/hcloud-go v1.33.1 + github.com/hashicorp/consul/api v1.13.0 + github.com/hetznercloud/hcloud-go v1.33.2 + github.com/ionos-cloud/sdk-go/v6 v6.0.5851 github.com/json-iterator/go v1.1.12 github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b - github.com/linode/linodego v1.4.0 - github.com/miekg/dns v1.1.48 - github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect + github.com/linode/linodego v1.6.0 + github.com/miekg/dns v1.1.49 github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f github.com/oklog/run v1.1.0 github.com/oklog/ulid v1.3.1 - github.com/opencontainers/image-spec v1.0.2 // indirect github.com/pkg/errors v0.9.1 github.com/prometheus/alertmanager v0.24.0 - github.com/prometheus/client_golang v1.12.1 + github.com/prometheus/client_golang v1.12.2 github.com/prometheus/client_model v0.2.0 - github.com/prometheus/common v0.33.0 + github.com/prometheus/common v0.34.0 github.com/prometheus/common/assets v0.1.0 github.com/prometheus/common/sigv4 v0.1.0 github.com/prometheus/exporter-toolkit v0.7.1 github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9 github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 github.com/stretchr/testify v1.7.1 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.31.0 - go.opentelemetry.io/otel v1.6.1 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.1 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.6.1 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.6.1 - go.opentelemetry.io/otel/sdk v1.6.1 - go.opentelemetry.io/otel/trace v1.6.1 + github.com/vultr/govultr/v2 v2.17.1 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0 + go.opentelemetry.io/otel v1.7.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 + go.opentelemetry.io/otel/sdk v1.7.0 + go.opentelemetry.io/otel/trace v1.7.0 go.uber.org/atomic v1.9.0 go.uber.org/automaxprocs v1.5.1 go.uber.org/goleak v1.1.12 - golang.org/x/net v0.0.0-20220325170049-de3da57026de - golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886 + golang.org/x/net v0.0.0-20220607020251-c690dde0001d + golang.org/x/oauth2 v0.0.0-20220524215830-622c5d57e401 + golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f + golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 golang.org/x/tools v0.1.10 - google.golang.org/api v0.74.0 - google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb - google.golang.org/grpc v1.45.0 + google.golang.org/api v0.83.0 + google.golang.org/genproto v0.0.0-20220602131408-e326c6e8e9c8 + google.golang.org/grpc v1.47.0 google.golang.org/protobuf v1.28.0 gopkg.in/alecthomas/kingpin.v2 v2.2.6 gopkg.in/yaml.v2 v2.4.0 - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b - k8s.io/api v0.23.5 - k8s.io/apimachinery v0.23.5 - k8s.io/client-go v0.23.5 + gopkg.in/yaml.v3 v3.0.1 + k8s.io/api v0.24.1 + k8s.io/apimachinery v0.24.1 + k8s.io/client-go v0.24.0 k8s.io/klog v1.0.0 - k8s.io/klog/v2 v2.40.1 + k8s.io/klog/v2 v2.60.1 +) + +require ( + cloud.google.com/go/compute v1.6.1 // indirect + github.com/Azure/go-autorest v14.2.0+incompatible // indirect + github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect + github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect + github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect + github.com/Azure/go-autorest/logger v0.2.1 // indirect + github.com/Azure/go-autorest/tracing v0.6.0 // indirect + github.com/Microsoft/go-winio v0.5.1 // indirect + github.com/PuerkitoBio/purell v1.1.1 // indirect + github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect + github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect + github.com/armon/go-metrics v0.3.3 // indirect + github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cenkalti/backoff/v4 v4.1.3 // indirect + github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/docker/distribution v2.7.1+incompatible // indirect + github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-units v0.4.0 // indirect + github.com/emicklei/go-restful v2.9.5+incompatible // indirect + github.com/evanphx/json-patch v4.12.0+incompatible // indirect + github.com/fatih/color v1.13.0 // indirect + github.com/felixge/httpsnoop v1.0.3 // indirect + github.com/ghodss/yaml v1.0.0 // indirect + github.com/go-kit/kit v0.10.0 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-openapi/analysis v0.21.2 // indirect + github.com/go-openapi/errors v0.20.2 // indirect + github.com/go-openapi/jsonpointer v0.19.5 // indirect + github.com/go-openapi/jsonreference v0.19.6 // indirect + github.com/go-openapi/loads v0.21.1 // indirect + github.com/go-openapi/spec v0.20.4 // indirect + github.com/go-openapi/swag v0.21.1 // indirect + github.com/go-openapi/validate v0.21.0 // indirect + github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48 // indirect + github.com/go-stack/stack v1.8.1 // indirect + github.com/golang-jwt/jwt/v4 v4.2.0 // indirect + github.com/golang/glog v1.0.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/google/gnostic v0.5.7-v3refs // indirect + github.com/google/go-cmp v0.5.8 // indirect + github.com/google/go-querystring v1.1.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/uuid v1.2.0 // indirect + github.com/googleapis/gax-go/v2 v2.4.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.10.2 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-hclog v0.12.2 // indirect + github.com/hashicorp/go-immutable-radix v1.2.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-retryablehttp v0.7.1 // indirect + github.com/hashicorp/go-rootcerts v1.0.2 // indirect + github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/hashicorp/serf v0.9.6 // indirect + github.com/imdario/mergo v0.3.12 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/jpillora/backoff v1.0.0 // indirect + github.com/julienschmidt/httprouter v1.3.0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-colorable v0.1.12 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/mapstructure v1.4.3 // indirect + github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/morikuni/aec v1.0.0 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/onsi/ginkgo v1.16.4 // indirect + github.com/onsi/gomega v1.15.0 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.0.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/prometheus/procfs v0.7.3 // indirect + github.com/sirupsen/logrus v1.8.1 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/stretchr/objx v0.2.0 // indirect + go.mongodb.org/mongo-driver v1.8.3 // indirect + go.opencensus.io v0.23.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 // indirect + go.opentelemetry.io/otel/metric v0.30.0 // indirect + go.opentelemetry.io/proto/otlp v0.16.0 // indirect + golang.org/x/crypto v0.0.0-20220214200702-86341886e292 // indirect + golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect + golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect + golang.org/x/text v0.3.7 // indirect + golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df // indirect + google.golang.org/appengine v1.6.7 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gotest.tools/v3 v3.0.3 // indirect + k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 // indirect + k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect + sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect ) replace ( @@ -98,95 +196,3 @@ exclude ( github.com/grpc-ecosystem/grpc-gateway v1.14.7 google.golang.org/api v0.30.0 ) - -// Exclude pre-go-mod kubernetes tags, as they are older -// than v0.x releases but are picked when we update the dependencies. -exclude ( - k8s.io/client-go v1.4.0 - k8s.io/client-go v1.4.0+incompatible - k8s.io/client-go v1.5.0 - k8s.io/client-go v1.5.0+incompatible - k8s.io/client-go v1.5.1 - k8s.io/client-go v1.5.1+incompatible - k8s.io/client-go v10.0.0+incompatible - k8s.io/client-go v11.0.0+incompatible - k8s.io/client-go v2.0.0+incompatible - k8s.io/client-go v2.0.0-alpha.1+incompatible - k8s.io/client-go v3.0.0+incompatible - k8s.io/client-go v3.0.0-beta.0+incompatible - k8s.io/client-go v4.0.0+incompatible - k8s.io/client-go v4.0.0-beta.0+incompatible - k8s.io/client-go v5.0.0+incompatible - k8s.io/client-go v5.0.1+incompatible - k8s.io/client-go v6.0.0+incompatible - k8s.io/client-go v7.0.0+incompatible - k8s.io/client-go v8.0.0+incompatible - k8s.io/client-go v9.0.0+incompatible - k8s.io/client-go v9.0.0-invalid+incompatible -) - -retract ( - v2.5.0+incompatible - v2.5.0-rc.2+incompatible - v2.5.0-rc.1+incompatible - v2.5.0-rc.0+incompatible - v2.4.3+incompatible - v2.4.2+incompatible - v2.4.1+incompatible - v2.4.0+incompatible - v2.4.0-rc.0+incompatible - v2.3.2+incompatible - v2.3.1+incompatible - v2.3.0+incompatible - v2.2.1+incompatible - v2.2.0+incompatible - v2.2.0-rc.1+incompatible - v2.2.0-rc.0+incompatible - v2.1.0+incompatible - v2.0.0+incompatible - v2.0.0-rc.3+incompatible - v2.0.0-rc.2+incompatible - v2.0.0-rc.1+incompatible - v2.0.0-rc.0+incompatible - v2.0.0-beta.5+incompatible - v2.0.0-beta.4+incompatible - v2.0.0-beta.3+incompatible - v2.0.0-beta.2+incompatible - v2.0.0-beta.1+incompatible - v2.0.0-beta.0+incompatible - v2.0.0-alpha.3+incompatible - v2.0.0-alpha.2+incompatible - v2.0.0-alpha.1+incompatible - v2.0.0-alpha.0+incompatible - v1.8.2 - v1.8.1 - v1.8.0 - v1.7.2 - v1.7.1 - v1.7.0 - v1.6.3 - v1.6.2 - v1.6.1 - v1.6.0 - v1.5.3 - v1.5.2 - v1.5.1 - v1.5.0 - v1.4.1 - v1.4.0 - v1.3.1 - v1.3.0 - v1.3.0-beta.0 - v1.2.3 - v1.2.2 - v1.2.1 - v1.2.0 - v1.1.3 - v1.1.2 - v1.1.1 - v1.1.0 - v1.0.2 - v1.0.1 - v1.0.0 - v1.0.0-rc.0 -) diff --git a/go.sum b/go.sum index 2e3f5a14ee..45d50e7861 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,3 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -37,11 +35,12 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0 h1:b1zWmYuuHz7gO9kDcM/EpHGr06UgsYNRpNJzI2kFiLM= cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1 h1:2sMmt8prCn7DPaG4Pmh0N3Inmc8cT8ae5k1M6VJ9Wqc= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -52,29 +51,21 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v63.0.0+incompatible h1:whPsa+jCHQSo5wGMPNLw4bz8q9Co2+vnXHzXGctoTaQ= -github.com/Azure/azure-sdk-for-go v63.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/azure-sdk-for-go v65.0.0+incompatible h1:HzKLt3kIwMm4KeJYTdx9EbjRYTySD/t8i1Ee/W5EGXw= +github.com/Azure/azure-sdk-for-go v65.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.25 h1:yp+V8DGur2aIUE87ebP8twPLz6k68jtJTlg61mEoByA= -github.com/Azure/go-autorest/autorest v0.11.25/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest v0.11.27 h1:F3R3q42aWytozkV8ihzcgMO4OA4cuqr3bNlsEuF6//A= +github.com/Azure/go-autorest/autorest v0.11.27/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U= github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.18 h1:kLnPsRjzZZUF3K5REu/Kc+qMQrvuza2bwSnNdhmzLfQ= github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= +github.com/Azure/go-autorest/autorest/adal v0.9.20 h1:gJ3E98kMpFB1MFqQCvA1yFab8vthOeD4VlFRQULxahg= +github.com/Azure/go-autorest/autorest/adal v0.9.20/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= @@ -82,7 +73,6 @@ github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+X github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= @@ -91,39 +81,14 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= -github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= -github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= -github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= -github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim v0.8.20/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= -github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= -github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= @@ -136,76 +101,51 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= -github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.3.3 h1:a9F4rlj7EWWrbj7BYw8J8+x+ZZkJeqzNyRk8hdPF+ro= github.com/armon/go-metrics v0.3.3/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= 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/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.43.11/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0= -github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go v1.44.29 h1:53YWlelsMiYmGxuTRpAq7Xp+pE+0esAVqNFiNyekU+A= +github.com/aws/aws-sdk-go v1.44.29/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 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/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo= github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= -github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= -github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= +github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= 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/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= @@ -221,173 +161,36 @@ github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1 h1:zH8ljVhhq7yC0MIeUL/IviMtY8hx2mK8cN9wEYb8ggw= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= -github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= -github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= -github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= -github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= -github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= -github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= -github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= -github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= -github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= -github.com/containerd/containerd v1.6.1 h1:oa2uY0/0G+JX4X7hpGCYvkp9FjUancz56kSNnb1sG3o= -github.com/containerd/containerd v1.6.1/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= -github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= -github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= -github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= -github.com/containerd/go-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= -github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= -github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= -github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= -github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= -github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= -github.com/containerd/imgcrypt v1.1.3/go.mod h1:/TPA1GIDXMzbj01yd8pIbQiLdQxed5ue1wb8bP7PQu4= -github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= -github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= -github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= -github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= -github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= -github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y= -github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= -github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE= -github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= -github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= -github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= -github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/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/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dgryski/go-sip13 v0.0.0-20200911182023-62edffca9245 h1:9cOfvEwjQxdwKuNDTQSaMKNRvwKwgZG+U4HrjeRKHso= github.com/dgryski/go-sip13 v0.0.0-20200911182023-62edffca9245/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/digitalocean/godo v1.78.0 h1:hKMfHXChSMjZFMSev+m5R4/2rxZ3HPdhlpeA2pJI72M= -github.com/digitalocean/godo v1.78.0/go.mod h1:GBmu8MkjZmNARE7IXRPmkbbnocNN8+uBm0xbEVw2LCs= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/digitalocean/godo v1.80.0 h1:ZULJ/fWDM97YtO7Fa+K6hzJLd7+smCu4N+0n+B/xtj4= +github.com/digitalocean/godo v1.80.0/go.mod h1:BPCqvwbjbGqxuUnIKB4EvS/AX7IDnNmt5fwvIkWo+ew= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= -github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.14+incompatible h1:+T9/PRYWNDo5SZl5qS1r9Mo/0Q8AwxKKPtu9S1yxM0w= -github.com/docker/docker v20.10.14+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= +github.com/docker/docker v20.10.16+incompatible h1:2Db6ZR/+FUR3hqPMwnogOPHFn405crbpxvWzKovETOQ= +github.com/docker/docker v20.10.16+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= @@ -396,6 +199,7 @@ github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -406,13 +210,11 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.1 h1:cgDRLG7bs59Zd+apAWuzLQL95obVYAymNJek76W3mgw= -github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1 h1:xvqufLtNVwAhN8NMyWklVgxnWohi+wtMGQMhtxexlm0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.7 h1:qcZcULcd/abmQg6dwigimCNEyi4gg31M/xaciQlDml8= github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -420,49 +222,39 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= +github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= 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.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +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.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-openapi/analysis v0.21.2 h1:hXFrOYFHUAMQdu6zwAiKKJHJQ8kqZs1ux/ru1P1wLJU= @@ -471,13 +263,9 @@ github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpX github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/errors v0.20.2 h1:dxy7PGTqEh94zj2E3h1cUmQQWiM1+aeCROfAr02EmK8= github.com/go-openapi/errors v0.20.2/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= @@ -485,16 +273,12 @@ github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/a github.com/go-openapi/loads v0.21.1 h1:Wb3nVZpdEzDTcly8S4HMkey6fjARRzb7iEaySimlDW0= github.com/go-openapi/loads v0.21.1/go.mod h1:/DtAMXXneXFjbQMGEtbamCZb+4x7eGwkvZCvBmwUG+g= github.com/go-openapi/runtime v0.23.1/go.mod h1:AKurw9fNre+h3ELZfk6ILsfvPN+bvvlaU/M9q/r9hpk= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M= github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg= github.com/go-openapi/strfmt v0.21.1/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= github.com/go-openapi/strfmt v0.21.2 h1:5NDNgadiX1Vhemth/TH4gCGopWSTdDjxl60H3B7f+os= github.com/go-openapi/strfmt v0.21.2/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= @@ -540,22 +324,11 @@ github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGt github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= github.com/goccy/go-yaml v1.9.5/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3KfscvA= -github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= -github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= @@ -565,7 +338,6 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -607,6 +379,8 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= +github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 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= @@ -619,11 +393,11 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ 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.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= @@ -646,8 +420,8 @@ github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20220318212150-b2ab0324ddda h1:KdHPvlgeNEDs8rae032MqFG8LVwcSEivcCjNdVOXRmg= -github.com/google/pprof v0.0.0-20220318212150-b2ab0324ddda/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= +github.com/google/pprof v0.0.0-20220520215854-d04f2422c8a1 h1:K4bn56FHdjFCfjSo3wWaD6rJL8r9yvmmncJNMhdkKrw= +github.com/google/pprof v0.0.0-20220520215854-d04f2422c8a1/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -658,53 +432,43 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0 h1:s7jOdKSaksJVOxE0Y/S32otcfiP+UQ0cL8/GTKaONwE= github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= -github.com/gophercloud/gophercloud v0.24.0 h1:jDsIMGJ1KZpAjYfQgGI2coNQj5Q83oPzuiGJRFWgMzw= -github.com/gophercloud/gophercloud v0.24.0/go.mod h1:Q8fZtyi5zZxPS/j9aj3sSxtvj41AdQMDwyo1myduD5c= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0 h1:dS9eYAjhrE2RjmzYw2XAPvcXfmcQLtFEQWn0CR82awk= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/gophercloud/gophercloud v0.25.0 h1:C3Oae7y0fUVQGSsBrb3zliAjdX+riCSEh4lNMejFNI4= +github.com/gophercloud/gophercloud v0.25.0/go.mod h1:Q8fZtyi5zZxPS/j9aj3sSxtvj41AdQMDwyo1myduD5c= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grafana/regexp v0.0.0-20220304095617-2e8d9baf4ac2 h1:uirlL/j72L93RhV4+mkWhjv0cov2I0MIgPOG9rMDr1k= github.com/grafana/regexp v0.0.0-20220304095617-2e8d9baf4ac2/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.10.2 h1:ERKrevVTnCw3Wu4I3mtR15QU3gtWy86cBo6De0jEohg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.10.2/go.mod h1:chrfS3YoLAlKTRE5cFWvCbt8uGAjshktT4PveTUpsFQ= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/api v1.12.0 h1:k3y1FYv6nuKyNTqj6w9gXOx5r5CfLj/k/euUeBXj1OY= -github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/api v1.13.0 h1:2hnLQ0GjQvw7f3O61jMO8gbasZviZTrt9R8WzgiirHc= +github.com/hashicorp/consul/api v1.13.0/go.mod h1:ZlVrynguJKcYr54zGaDbaL3fOvKC9m72FhPvA8T35KQ= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.8.0 h1:OJtKBtEjboEZvG6AOUdh4Z1Zbyu0WcxQ0qatRrZHTVU= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= 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.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= github.com/hashicorp/go-cleanhttp v0.5.1/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 v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.12.2 h1:F1fdYblUEsxKiailtkhCCG2g4bipEgaHiDc8vffNpD4= github.com/hashicorp/go-hclog v0.12.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= @@ -713,12 +477,13 @@ github.com/hashicorp/go-immutable-radix v1.2.0 h1:l6UW37iCXwZkZoAbEYnptSHVE/cQ5b github.com/hashicorp/go-immutable-radix v1.2.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= 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.1 h1:sUiuQAnLlbvmExtFQs72iFW/HXeUn8Z1aJLQ4LJJbTQ= +github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= @@ -735,7 +500,6 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= @@ -746,37 +510,29 @@ github.com/hashicorp/memberlist v0.3.1/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOn github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.6 h1:uuEX1kLR6aoda1TBttmJQKDLZE1Ob7KN0NPdE7EtCDc= github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/hetznercloud/hcloud-go v1.33.1 h1:W1HdO2bRLTKU4WsyqAasDSpt54fYO4WNckWYfH5AuCQ= -github.com/hetznercloud/hcloud-go v1.33.1/go.mod h1:XX/TQub3ge0yWR2yHWmnDVIrB+MQbda1pHxkUmDlUME= +github.com/hetznercloud/hcloud-go v1.33.2 h1:ptWKVYLW7YtjXzsqTFKFxwpVo3iM9UMkVPBYQE4teLU= +github.com/hetznercloud/hcloud-go v1.33.2/go.mod h1:XX/TQub3ge0yWR2yHWmnDVIrB+MQbda1pHxkUmDlUME= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= +github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= +github.com/ionos-cloud/sdk-go/v6 v6.0.5851 h1:Xjdta3uR5SDLXXl0oahgVIJ+AQNFCyOCuAwxPAXFUCM= +github.com/ionos-cloud/sdk-go/v6 v6.0.5851/go.mod h1:UE3V/2DjnqD5doOqtjYqzJRMpI1RiwrvuuSEPX1pdnk= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= 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/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= 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= @@ -798,11 +554,8 @@ github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8 github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= 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.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b h1:iNjcivnc6lhbvJA3LD622NPrUponluJrBWPIwGG/3Bg= github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= @@ -816,7 +569,6 @@ github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= @@ -824,23 +576,17 @@ github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+ github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linode/linodego v1.4.0 h1:jayhYLQOWxvr9fchCuB+OWTL+LP3OUPgdr/bc4YLdls= -github.com/linode/linodego v1.4.0/go.mod h1:PVsRxSlOiJyvG4/scTszpmZDTdgS+to3X6eS8pRrWI8= -github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= +github.com/linode/linodego v1.6.0 h1:y3KgXttj0v6V3HyGtsvdkTl0gIzaAAOdrDXCIwGeh2g= +github.com/linode/linodego v1.6.0/go.mod h1:9lmhBsOupR6ke7D9Ioj1bq/ny9pfgFkCLiX7ubq0r08= github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= -github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= 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= @@ -857,20 +603,14 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= 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.48 h1:Ucfr7IIVyMBz4lRE8qmGUuZ4Wt3/ZGu9hmcMT3Uu4tQ= -github.com/miekg/dns v1.1.48/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= +github.com/miekg/dns v1.1.49 h1:qe0mQU3Z/XpFeE+AEBo2rqaS1IPBJ3anmqZ4XiZJVG8= +github.com/miekg/dns v1.1.49/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -887,17 +627,7 @@ github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -911,8 +641,8 @@ github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3P github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +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= @@ -925,7 +655,6 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= @@ -937,61 +666,24 @@ github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DV github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/onsi/gomega v1.15.0 h1:WjP/FQ/sk43MRmnEcT+MlDw2TFvkrXlprrPST/IudjU= github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= 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.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= -github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= -github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -1006,16 +698,12 @@ github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FI github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/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= @@ -1025,24 +713,20 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/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/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= 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.24.0 h1:HBWR3lk4uy3ys+naDZthDdV7yEsxpaNeZuUS+hJgrOw= github.com/prometheus/alertmanager v0.24.0/go.mod h1:r6fy/D7FRuZh5YbnX6J3MBY0eI4Pb5yPYS7/bPSXXqI= -github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= 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.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1050,42 +734,30 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= 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.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.33.0 h1:rHgav/0a6+uYgGdNt3jwz8FNSesO/Hsang3O0T9A5SE= -github.com/prometheus/common v0.33.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= +github.com/prometheus/common v0.34.0 h1:RBmGO9d/FVjqHT0yUGQwBJhkwKV+wPCn7KGpvfab0uE= +github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= github.com/prometheus/common/assets v0.1.0 h1:8WlWPDRjbfff4FWCBjaUF0NEIgDD2Mv2anoKfwG+Ums= github.com/prometheus/common/assets v0.1.0/go.mod h1:D17UVUE12bHbim7HzwUvtqm6gwBEaDQ0F+hIGbFbccI= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= github.com/prometheus/exporter-toolkit v0.7.1 h1:c6RXaK8xBVercEeUQ4tRNL8UGWzDHfvj9dseo1FcK1Y= github.com/prometheus/exporter-toolkit v0.7.1/go.mod h1:ZUBIj498ePooX9t/2xtDjeQYwvRpiPP2lh5u4iblj2g= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= 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.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= @@ -1096,18 +768,11 @@ github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9 h1:0roa6gXKgyta64uqh52AQG3wzZXH21unn+ltzQSXML0= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= -github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= 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/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= @@ -1116,8 +781,6 @@ github.com/simonpasquier/klog-gokit v0.3.0 h1:TkFK21cbwDRS+CiystjqbAiq5ubJcVTk9h github.com/simonpasquier/klog-gokit v0.3.0/go.mod h1:+SUlDQNrhVtGt2FieaqNftzzk8P72zpWlACateWxA9k= github.com/simonpasquier/klog-gokit/v3 v3.0.0 h1:J0QrVhAULISHWN05PeXX/xMqJBjnpl2fAuO8uHdQGsA= github.com/simonpasquier/klog-gokit/v3 v3.0.0/go.mod h1:+WRhGy707Lp2Q4r727m9Oc7FxazOHgW76FIyCr23nus= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= @@ -1127,42 +790,27 @@ github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 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/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 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.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 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= @@ -1171,42 +819,19 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/vultr/govultr/v2 v2.17.1 h1:UBmotwA0mkGtyJMakUF9jhLH/W3mN5wfGRn543i/BCA= +github.com/vultr/govultr/v2 v2.17.1/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1214,27 +839,12 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= go.mongodb.org/mongo-driver v1.8.3 h1:TDKlTkGDKm9kkJVUOAXDK5/fkqKHJVwYQSpoRfB43R4= go.mongodb.org/mongo-driver v1.8.3/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -1245,95 +855,60 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.31.0 h1:woM+Mb4d0A+Dxa3rYPenSN5ZeS9qHUvE8rlObiLRXTY= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.31.0/go.mod h1:PFmBsWbldL1kiWZk9+0LBZz2brhByaGsvp6pRICMlPE= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= -go.opentelemetry.io/otel v1.6.0/go.mod h1:bfJD2DZVw0LBxghOTlgnlI0CV3hLDu9XF/QKOUXMTQQ= -go.opentelemetry.io/otel v1.6.1 h1:6r1YrcTenBvYa1x491d0GGpTVBsNECmrc/K6b+zDeis= -go.opentelemetry.io/otel v1.6.1/go.mod h1:blzUabWHkX6LJewxvadmzafgh/wnvBSDBdOuwkAtrWQ= -go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.6.1 h1:T1FtMXHM2YPIUrYxSbTIAYDCvUZVpNdl7hDMDnp09cE= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.6.1/go.mod h1:NEu79Xo32iVb+0gVNV8PMd7GoWqnyDXRlj04yFjqz40= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.1 h1:EvIC2jmn1+24OABwtw2Lng5yxy5eYJ8nf461UaHXTms= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.1/go.mod h1:YJ/JbY5ag/tSQFXzH3mtDmHqzF3aFn3DI/aB1n7pt4w= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.6.1 h1:G45R6KdPgxe9UaZJMF4VUnsYgZpOHCSgl7FiOEV6570= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.6.1/go.mod h1:UJJXJj0rltNIemDMwkOJyggsvyMG9QHfJeFH0HS5JjM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.6.1 h1:EKGJlVkPK5IDR0WOE8eUTKLI4j+JlbboqsoSpttSktY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.6.1/go.mod h1:DAKwdo06hFLc0U88O10x4xnb5sc7dDRDqRuiN+io8JE= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/metric v0.28.0 h1:o5YNh+jxACMODoAo1bI7OES0RUW4jAMae0Vgs2etWAQ= -go.opentelemetry.io/otel/metric v0.28.0/go.mod h1:TrzsfQAmQaB1PDcdhBauLMk7nyyg9hm+GoQq/ekE9Iw= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= -go.opentelemetry.io/otel/sdk v1.6.1 h1:ZmcNyMhcuAYIb/Nr6QhBPTMopMTbov/47wHt1gibkoY= -go.opentelemetry.io/otel/sdk v1.6.1/go.mod h1:IVYrddmFZ+eJqu2k38qD3WezFR2pymCzm8tdxyh3R4E= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= -go.opentelemetry.io/otel/trace v1.6.0/go.mod h1:qs7BrU5cZ8dXQHBGxHMOxwME/27YH2qEp4/+tZLLwJE= -go.opentelemetry.io/otel/trace v1.6.1 h1:f8c93l5tboBYZna1nWk0W9DYyMzJXDWdZcJZ0Kb400U= -go.opentelemetry.io/otel/trace v1.6.1/go.mod h1:RkFRM1m0puWIq10oxImnGEduNBzxiN7TXluRBtE+5j0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0 h1:mac9BKRqwaX6zxHPDe3pvmWpwuuIM0vuXv2juCnQevE= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0/go.mod h1:5eCOqeGphOyz6TsY3ZDNjE33SM/TFAK3RGuCL2naTgY= +go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM= +go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 h1:7Yxsak1q4XrJ5y7XBnNwqWx9amMZvoidCctv62XOQ6Y= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0/go.mod h1:M1hVZHNxcbkAlcvrOMlpQ4YOO3Awf+4N2dxkZL3xm04= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0 h1:cMDtmgJ5FpRvqx9x2Aq+Mm0O6K/zcUkH73SFz20TuBw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0/go.mod h1:ceUgdyfNv4h4gLxHR0WNfDiiVmZFodZhZSbOLhpxqXE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 h1:MFAyzUPrTwLOwCi+cltN0ZVyy4phU41lwH+lyMyQTS4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0/go.mod h1:E+/KKhwOSw8yoPxSSuUHG6vKppkvhN+S1Jc7Nib3k3o= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 h1:pLP0MH4MAqeTEV0g/4flxw9O8Is48uAIauAnjznbW50= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0/go.mod h1:aFXT9Ng2seM9eizF+LfKiyPBGy8xIZKwhusC1gIu3hA= +go.opentelemetry.io/otel/metric v0.30.0 h1:Hs8eQZ8aQgs0U49diZoaS6Uaxw3+bBE3lcMUKBFIk3c= +go.opentelemetry.io/otel/metric v0.30.0/go.mod h1:/ShZ7+TS4dHzDFmfi1kSXMhMVubNoP0oIaBp70J6UXU= +go.opentelemetry.io/otel/sdk v1.7.0 h1:4OmStpcKVOfvDOgCt7UriAPtKolwIhxpnSNI/yK+1B0= +go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU= +go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o= +go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= -go.opentelemetry.io/proto/otlp v0.12.1 h1:kfx2sboxOGFvGJcH2C408CiVo2wVHC2av2XHNqj4vEg= -go.opentelemetry.io/proto/otlp v0.12.1/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.16.0 h1:WHzDWdXUvbc5bG2ObdrGfaNpQz7ft7QN9HHmJlbiB1E= +go.opentelemetry.io/proto/otlp v0.16.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/automaxprocs v1.5.1 h1:e1YG66Lrk73dn4qhg8WFSvhF0JuFQF0ERIp4rpuV8Qk= go.uber.org/automaxprocs v1.5.1/go.mod h1:BF4eumQw0P9GtnuxxovUd06vwm1o18oMzFtK66vU6XU= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/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-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 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-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 h1:0es+/5331RGQPcXlMfP+WrnIIS6dNnNRe0WB02W0F4M= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1377,7 +952,6 @@ golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/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-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1389,17 +963,14 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/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-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/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-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1413,15 +984,11 @@ golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= @@ -1430,19 +997,18 @@ golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de h1:pZB1TWnKi+o4bENlbzAgLrEbY4RMYmUIRobMcSmfeYc= golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d h1:4SFsTMi4UahlKoloni7L4eYzhFRifURQLw+yv0QDCx8= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1460,8 +1026,10 @@ golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a h1:qfl7ob3DIEs3Ml9oLuPwY2N04gymzAW04WsUQHIClgM= golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220524215830-622c5d57e401 h1:zwrSfklXn0gxyLRX/aR+q6cgHbV/ItVyzbPlbA+dkAw= +golang.org/x/oauth2 v0.0.0-20220524215830-622c5d57e401/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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= @@ -1473,8 +1041,9 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/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 h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f h1:Ax0t5p6N38Ga0dThY21weqDEyz2oklo4IvDkpigvkD8= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1492,43 +1061,29 @@ golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/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-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1539,22 +1094,11 @@ golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1564,13 +1108,10 @@ golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1579,18 +1120,11 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/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-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/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-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1598,12 +1132,14 @@ golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886 h1:eJv7u3ksNXoLbGSKuv2s/SIO4tJVxc/A+MTpzxDgz/Q= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1620,17 +1156,12 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 h1:M73Iuj3xbbb9Uk1DYhzydthsj6oOd6l9bpuFcNoUvTs= golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1645,19 +1176,15 @@ golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1681,12 +1208,10 @@ golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -1706,9 +1231,10 @@ golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -1742,8 +1268,11 @@ google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tD google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0 h1:ExR2D+5TYIrMphWgs5JCgwRhEDlPDXXrLwHHMgPHTXE= google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.83.0 h1:pMvST+6v+46Gabac4zlJlalxZjCeRcepwg2EdBU+nCc= +google.golang.org/api v0.83.0/go.mod h1:CNywQoj/AfhTw26ZWAa6LwOv+6WFxHmeLPZq2uncLZk= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1753,13 +1282,11 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= @@ -1769,7 +1296,6 @@ google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -1778,19 +1304,16 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -1825,9 +1348,16 @@ google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2 google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb h1:0m9wktIpOxGw+SSKmydXWB3Z3GTfcPP6+q75HCQa6HI= google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220602131408-e326c6e8e9c8 h1:qRu95HZ148xXw+XeZ3dvqe85PxH4X8+jIo0iRPKcEnM= +google.golang.org/genproto v0.0.0-20220602131408-e326c6e8e9c8/go.mod h1:yKyY4AMRwFiC8yMMNaMi+RkCnjZJt9LoWuvhXjMs+To= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1837,14 +1367,12 @@ google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= @@ -1861,10 +1389,12 @@ google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= 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= @@ -1881,11 +1411,9 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= 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-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/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-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1895,15 +1423,9 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= 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.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/telebot.v3 v3.0.0/go.mod h1:7rExV8/0mDDNu9epSrDm/8j22KLaActH1Tbee6YjzWg= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= @@ -1921,10 +1443,9 @@ 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= gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= @@ -1936,71 +1457,30 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= -k8s.io/api v0.23.5 h1:zno3LUiMubxD/V1Zw3ijyKO3wxrhbUF1Ck+VjBvfaoA= -k8s.io/api v0.23.5/go.mod h1:Na4XuKng8PXJ2JsploYYrivXrINeTaycCGcYgF91Xm8= -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= -k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= -k8s.io/apimachinery v0.23.5 h1:Va7dwhp8wgkUPWsEXk6XglXWU4IKYLKNlv8VkX7SDM0= -k8s.io/apimachinery v0.23.5/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= -k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= -k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= -k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= -k8s.io/client-go v0.23.5 h1:zUXHmEuqx0RY4+CsnkOn5l0GU+skkRXKGJrhmE2SLd8= -k8s.io/client-go v0.23.5/go.mod h1:flkeinTO1CirYgzMPRWxUCnV0G4Fbu2vLhYCObnt/r4= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= -k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= -k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= -k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= -k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= -k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/cri-api v0.23.1/go.mod h1:REJE3PSU0h/LOV1APBrupxrEJqnoxZC8KWzkBUHwrK4= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= +k8s.io/api v0.24.1 h1:BjCMRDcyEYz03joa3K1+rbshwh1Ay6oB53+iUx2H8UY= +k8s.io/api v0.24.1/go.mod h1:JhoOvNiLXKTPQ60zh2g0ewpA+bnEYf5q44Flhquh4vQ= +k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= +k8s.io/apimachinery v0.24.1 h1:ShD4aDxTQKN5zNf8K1RQ2u98ELLdIW7jEnlO9uAMX/I= +k8s.io/apimachinery v0.24.1/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= +k8s.io/client-go v0.24.0 h1:lbE4aB1gTHvYFSwm6eD3OF14NhFDKCejlnsGYlSJe5U= +k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 h1:E3J9oCLlaobFUqsjG9DfKbP2BmgwBL2p7pn0A3dG9W4= -k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 h1:Gii5eqf+GmIEwGNKQYQClCayuJCe2/4fZUvF7VG99sU= +k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20211116205334-6203023598ed h1:ck1fRPWPJWsMd8ZRFsWc6mh/zHp5fZ/shhbrgPUxDAE= -k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s= -sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= +sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/model/labels/labels.go b/model/labels/labels.go index f1226c0b0c..27423d19c2 100644 --- a/model/labels/labels.go +++ b/model/labels/labels.go @@ -119,7 +119,7 @@ func (ls *Labels) UnmarshalYAML(unmarshal func(interface{}) error) error { func (ls Labels) MatchLabels(on bool, names ...string) Labels { matchedLabels := Labels{} - nameSet := map[string]struct{}{} + nameSet := make(map[string]struct{}, len(names)) for _, n := range names { nameSet[n] = struct{}{} } @@ -202,11 +202,11 @@ func (ls Labels) HashWithoutLabels(b []byte, names ...string) (uint64, []byte) { return xxhash.Sum64(b), b } -// WithLabels returns a new labels.Labels from ls that only contains labels matching names. +// BytesWithLabels is just as Bytes(), but only for labels matching names. // 'names' have to be sorted in ascending order. -func (ls Labels) WithLabels(names ...string) Labels { - ret := make([]Label, 0, len(ls)) - +func (ls Labels) BytesWithLabels(buf []byte, names ...string) []byte { + b := bytes.NewBuffer(buf[:0]) + b.WriteByte(labelSep) i, j := 0, 0 for i < len(ls) && j < len(names) { if names[j] < ls[i].Name { @@ -214,30 +214,40 @@ func (ls Labels) WithLabels(names ...string) Labels { } else if ls[i].Name < names[j] { i++ } else { - ret = append(ret, ls[i]) + if b.Len() > 1 { + b.WriteByte(seps[0]) + } + b.WriteString(ls[i].Name) + b.WriteByte(seps[0]) + b.WriteString(ls[i].Value) i++ j++ } } - return ret + return b.Bytes() } -// WithoutLabels returns a new labels.Labels from ls that contains labels not matching names. +// BytesWithoutLabels is just as Bytes(), but only for labels not matching names. // 'names' have to be sorted in ascending order. -func (ls Labels) WithoutLabels(names ...string) Labels { - ret := make([]Label, 0, len(ls)) - +func (ls Labels) BytesWithoutLabels(buf []byte, names ...string) []byte { + b := bytes.NewBuffer(buf[:0]) + b.WriteByte(labelSep) j := 0 for i := range ls { for j < len(names) && names[j] < ls[i].Name { j++ } - if ls[i].Name == MetricName || (j < len(names) && ls[i].Name == names[j]) { + if j < len(names) && ls[i].Name == names[j] { continue } - ret = append(ret, ls[i]) + if b.Len() > 1 { + b.WriteByte(seps[0]) + } + b.WriteString(ls[i].Name) + b.WriteByte(seps[0]) + b.WriteString(ls[i].Value) } - return ret + return b.Bytes() } // Copy returns a copy of the labels. @@ -349,7 +359,7 @@ func FromStrings(ss ...string) Labels { if len(ss)%2 != 0 { panic("invalid number of strings") } - var res Labels + res := make(Labels, 0, len(ss)/2) for i := 0; i < len(ss); i += 2 { res = append(res, Label{Name: ss[i], Value: ss[i+1]}) } @@ -426,6 +436,20 @@ func (b *Builder) Del(ns ...string) *Builder { return b } +// Keep removes all labels from the base except those with the given names. +func (b *Builder) Keep(ns ...string) *Builder { +Outer: + for _, l := range b.base { + for _, n := range ns { + if l.Name == n { + continue Outer + } + } + b.del = append(b.del, l.Name) + } + return b +} + // Set the name/value pair as a label. func (b *Builder) Set(n, v string) *Builder { if v == "" { @@ -467,8 +491,9 @@ Outer: } res = append(res, l) } - res = append(res, b.add...) - sort.Sort(res) - + if len(b.add) > 0 { // Base is already in order, so we only need to sort if we add to it. + res = append(res, b.add...) + sort.Sort(res) + } return res } diff --git a/model/labels/labels_test.go b/model/labels/labels_test.go index da4d80b58e..5d5fdd4755 100644 --- a/model/labels/labels_test.go +++ b/model/labels/labels_test.go @@ -624,81 +624,94 @@ func TestLabels_Map(t *testing.T) { require.Equal(t, map[string]string{"aaa": "111", "bbb": "222"}, Labels{{"aaa", "111"}, {"bbb", "222"}}.Map()) } -func TestLabels_WithLabels(t *testing.T) { - require.Equal(t, Labels{{"aaa", "111"}, {"bbb", "222"}}, Labels{{"aaa", "111"}, {"bbb", "222"}, {"ccc", "333"}}.WithLabels("aaa", "bbb")) +func TestLabels_BytesWithLabels(t *testing.T) { + require.Equal(t, Labels{{"aaa", "111"}, {"bbb", "222"}}.Bytes(nil), Labels{{"aaa", "111"}, {"bbb", "222"}, {"ccc", "333"}}.BytesWithLabels(nil, "aaa", "bbb")) + require.Equal(t, Labels{}.Bytes(nil), Labels{{"aaa", "111"}, {"bbb", "222"}, {"ccc", "333"}}.BytesWithLabels(nil)) } -func TestLabels_WithoutLabels(t *testing.T) { - require.Equal(t, Labels{{"aaa", "111"}}, Labels{{"aaa", "111"}, {"bbb", "222"}, {"ccc", "333"}}.WithoutLabels("bbb", "ccc")) - require.Equal(t, Labels{{"aaa", "111"}}, Labels{{"aaa", "111"}, {"bbb", "222"}, {MetricName, "333"}}.WithoutLabels("bbb")) +func TestLabels_BytesWithoutLabels(t *testing.T) { + require.Equal(t, Labels{{"aaa", "111"}}.Bytes(nil), Labels{{"aaa", "111"}, {"bbb", "222"}, {"ccc", "333"}}.BytesWithoutLabels(nil, "bbb", "ccc")) + require.Equal(t, Labels{{"aaa", "111"}}.Bytes(nil), Labels{{MetricName, "333"}, {"aaa", "111"}, {"bbb", "222"}}.BytesWithoutLabels(nil, MetricName, "bbb")) } -func TestBulider_NewBulider(t *testing.T) { - require.Equal( - t, - &Builder{ - base: Labels{{"aaa", "111"}}, - del: []string{}, - add: []Label{}, +func TestBuilder(t *testing.T) { + for i, tcase := range []struct { + base Labels + del []string + keep []string + set []Label + want Labels + }{ + { + base: FromStrings("aaa", "111"), + want: FromStrings("aaa", "111"), }, - NewBuilder(Labels{{"aaa", "111"}}), - ) -} - -func TestBuilder_Del(t *testing.T) { - require.Equal( - t, - &Builder{ - del: []string{"bbb"}, - add: []Label{{"aaa", "111"}, {"ccc", "333"}}, - }, - (&Builder{ - del: []string{}, - add: []Label{{"aaa", "111"}, {"bbb", "222"}, {"ccc", "333"}}, - }).Del("bbb"), - ) -} - -func TestBuilder_Set(t *testing.T) { - require.Equal( - t, - &Builder{ - base: Labels{{"aaa", "111"}}, - del: []string{}, - add: []Label{{"bbb", "222"}}, - }, - (&Builder{ - base: Labels{{"aaa", "111"}}, - del: []string{}, - add: []Label{}, - }).Set("bbb", "222"), - ) - - require.Equal( - t, - &Builder{ - base: Labels{{"aaa", "111"}}, - del: []string{}, - add: []Label{{"bbb", "333"}}, - }, - (&Builder{ - base: Labels{{"aaa", "111"}}, - del: []string{}, - add: []Label{{"bbb", "222"}}, - }).Set("bbb", "333"), - ) -} - -func TestBuilder_Labels(t *testing.T) { - require.Equal( - t, - Labels{{"aaa", "111"}, {"ccc", "333"}, {"ddd", "444"}}, - (&Builder{ - base: Labels{{"aaa", "111"}, {"bbb", "222"}, {"ccc", "333"}}, + { + base: FromStrings("aaa", "111", "bbb", "222", "ccc", "333"), del: []string{"bbb"}, - add: []Label{{"ddd", "444"}}, - }).Labels(), - ) + want: FromStrings("aaa", "111", "ccc", "333"), + }, + { + base: nil, + set: []Label{{"aaa", "111"}, {"bbb", "222"}, {"ccc", "333"}}, + del: []string{"bbb"}, + want: FromStrings("aaa", "111", "ccc", "333"), + }, + { + base: FromStrings("aaa", "111"), + set: []Label{{"bbb", "222"}}, + want: FromStrings("aaa", "111", "bbb", "222"), + }, + { + base: FromStrings("aaa", "111"), + set: []Label{{"bbb", "222"}, {"bbb", "333"}}, + want: FromStrings("aaa", "111", "bbb", "333"), + }, + { + base: FromStrings("aaa", "111", "bbb", "222", "ccc", "333"), + del: []string{"bbb"}, + set: []Label{{"ddd", "444"}}, + want: FromStrings("aaa", "111", "ccc", "333", "ddd", "444"), + }, + { // Blank value is interpreted as delete. + base: FromStrings("aaa", "111", "bbb", "", "ccc", "333"), + want: FromStrings("aaa", "111", "ccc", "333"), + }, + { + base: FromStrings("aaa", "111", "bbb", "222", "ccc", "333"), + set: []Label{{"bbb", ""}}, + want: FromStrings("aaa", "111", "ccc", "333"), + }, + { + base: FromStrings("aaa", "111", "bbb", "222", "ccc", "333"), + keep: []string{"bbb"}, + want: FromStrings("bbb", "222"), + }, + { + base: FromStrings("aaa", "111", "bbb", "222", "ccc", "333"), + keep: []string{"aaa", "ccc"}, + want: FromStrings("aaa", "111", "ccc", "333"), + }, + { + base: FromStrings("aaa", "111", "bbb", "222", "ccc", "333"), + del: []string{"bbb"}, + set: []Label{{"ddd", "444"}}, + keep: []string{"aaa", "ddd"}, + want: FromStrings("aaa", "111", "ddd", "444"), + }, + } { + t.Run(fmt.Sprint(i), func(t *testing.T) { + b := NewBuilder(tcase.base) + for _, lbl := range tcase.set { + b.Set(lbl.Name, lbl.Value) + } + if len(tcase.keep) > 0 { + b.Keep(tcase.keep...) + } + b.Del(tcase.del...) + require.Equal(t, tcase.want, b.Labels()) + }) + } } func TestLabels_Hash(t *testing.T) { diff --git a/model/relabel/relabel.go b/model/relabel/relabel.go index da21ff9182..98a245bba6 100644 --- a/model/relabel/relabel.go +++ b/model/relabel/relabel.go @@ -54,6 +54,10 @@ const ( LabelDrop Action = "labeldrop" // LabelKeep drops any label not matching the regex. LabelKeep Action = "labelkeep" + // Lowercase maps input letters to their lower case. + Lowercase Action = "lowercase" + // Uppercase maps input letters to their upper case. + Uppercase Action = "uppercase" ) // UnmarshalYAML implements the yaml.Unmarshaler interface. @@ -63,7 +67,7 @@ func (a *Action) UnmarshalYAML(unmarshal func(interface{}) error) error { return err } switch act := Action(strings.ToLower(s)); act { - case Replace, Keep, Drop, HashMod, LabelMap, LabelDrop, LabelKeep: + case Replace, Keep, Drop, HashMod, LabelMap, LabelDrop, LabelKeep, Lowercase, Uppercase: *a = act return nil } @@ -106,12 +110,15 @@ func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error { if c.Modulus == 0 && c.Action == HashMod { return errors.Errorf("relabel configuration for hashmod requires non-zero modulus") } - if (c.Action == Replace || c.Action == HashMod) && c.TargetLabel == "" { + if (c.Action == Replace || c.Action == HashMod || c.Action == Lowercase || c.Action == Uppercase) && c.TargetLabel == "" { return errors.Errorf("relabel configuration for %s action requires 'target_label' value", c.Action) } - if c.Action == Replace && !relabelTarget.MatchString(c.TargetLabel) { + if (c.Action == Replace || c.Action == Lowercase || c.Action == Uppercase) && !relabelTarget.MatchString(c.TargetLabel) { return errors.Errorf("%q is invalid 'target_label' for %s action", c.TargetLabel, c.Action) } + if (c.Action == Lowercase || c.Action == Uppercase) && c.Replacement != DefaultRelabelConfig.Replacement { + return errors.Errorf("'replacement' can not be set for %s action", c.Action) + } if c.Action == LabelMap && !relabelTarget.MatchString(c.Replacement) { return errors.Errorf("%q is invalid 'replacement' for %s action", c.Replacement, c.Action) } @@ -228,6 +235,10 @@ func relabel(lset labels.Labels, cfg *Config) labels.Labels { break } lb.Set(string(target), string(res)) + case Lowercase: + lb.Set(cfg.TargetLabel, strings.ToLower(val)) + case Uppercase: + lb.Set(cfg.TargetLabel, strings.ToUpper(val)) case HashMod: mod := sum64(md5.Sum([]byte(val))) % cfg.Modulus lb.Set(cfg.TargetLabel, fmt.Sprintf("%d", mod)) diff --git a/model/relabel/relabel_test.go b/model/relabel/relabel_test.go index 1e50344a08..4ae1f53445 100644 --- a/model/relabel/relabel_test.go +++ b/model/relabel/relabel_test.go @@ -428,6 +428,28 @@ func TestRelabel(t *testing.T) { "a": "foo", }), }, + { + input: labels.FromMap(map[string]string{ + "foo": "bAr123Foo", + }), + relabel: []*Config{ + { + SourceLabels: model.LabelNames{"foo"}, + Action: Uppercase, + TargetLabel: "foo_uppercase", + }, + { + SourceLabels: model.LabelNames{"foo"}, + Action: Lowercase, + TargetLabel: "foo_lowercase", + }, + }, + output: labels.FromMap(map[string]string{ + "foo": "bAr123Foo", + "foo_lowercase": "bar123foo", + "foo_uppercase": "BAR123FOO", + }), + }, } for _, test := range tests { diff --git a/model/rulefmt/rulefmt.go b/model/rulefmt/rulefmt.go index 898a2e39de..cb1bc7706a 100644 --- a/model/rulefmt/rulefmt.go +++ b/model/rulefmt/rulefmt.go @@ -17,7 +17,7 @@ import ( "bytes" "context" "io" - "io/ioutil" + "os" "strings" "time" @@ -306,7 +306,7 @@ func Parse(content []byte) (*RuleGroups, []error) { // ParseFile reads and parses rules from a file. func ParseFile(file string) (*RuleGroups, []error) { - b, err := ioutil.ReadFile(file) + b, err := os.ReadFile(file) if err != nil { return nil, []error{errors.Wrap(err, file)} } diff --git a/model/textparse/promparse_test.go b/model/textparse/promparse_test.go index b9a037de1b..c6762b545d 100644 --- a/model/textparse/promparse_test.go +++ b/model/textparse/promparse_test.go @@ -17,7 +17,6 @@ import ( "bytes" "compress/gzip" "io" - "io/ioutil" "os" "testing" @@ -361,7 +360,7 @@ func BenchmarkParse(b *testing.B) { require.NoError(b, err) defer f.Close() - buf, err := ioutil.ReadAll(f) + buf, err := io.ReadAll(f) require.NoError(b, err) b.Run(parserName+"/no-decode-metric/"+fn, func(b *testing.B) { @@ -501,7 +500,7 @@ func BenchmarkGzip(b *testing.B) { require.NoError(b, err) require.NoError(b, gw.Close()) - gbuf, err := ioutil.ReadAll(&buf) + gbuf, err := io.ReadAll(&buf) require.NoError(b, err) k := b.N / promtestdataSampleCount @@ -516,7 +515,7 @@ func BenchmarkGzip(b *testing.B) { gr, err := gzip.NewReader(bytes.NewReader(gbuf)) require.NoError(b, err) - d, err := ioutil.ReadAll(gr) + d, err := io.ReadAll(gr) require.NoError(b, err) require.NoError(b, gr.Close()) diff --git a/notifier/notifier.go b/notifier/notifier.go index 0fca28c339..88cbbe0aeb 100644 --- a/notifier/notifier.go +++ b/notifier/notifier.go @@ -19,7 +19,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net" "net/http" "net/url" @@ -583,7 +582,7 @@ func (n *Manager) sendOne(ctx context.Context, c *http.Client, url string, b []b return err } defer func() { - io.Copy(ioutil.Discard, resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() }() diff --git a/notifier/notifier_test.go b/notifier/notifier_test.go index 4a2747efd3..e28a2609c9 100644 --- a/notifier/notifier_test.go +++ b/notifier/notifier_test.go @@ -18,7 +18,7 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" + "io" "net/http" "net/http/httptest" "net/url" @@ -126,7 +126,7 @@ func TestHandlerSendAll(t *testing.T) { return } - b, err := ioutil.ReadAll(r.Body) + b, err := io.ReadAll(r.Body) if err != nil { err = errors.Errorf("error reading body: %v", err) w.WriteHeader(http.StatusInternalServerError) @@ -221,7 +221,7 @@ func TestCustomDo(t *testing.T) { h := NewManager(&Options{ Do: func(_ context.Context, client *http.Client, req *http.Request) (*http.Response, error) { received = true - body, err := ioutil.ReadAll(req.Body) + body, err := io.ReadAll(req.Body) require.NoError(t, err) @@ -230,7 +230,7 @@ func TestCustomDo(t *testing.T) { require.Equal(t, testURL, req.URL.String()) return &http.Response{ - Body: ioutil.NopCloser(bytes.NewBuffer(nil)), + Body: io.NopCloser(bytes.NewBuffer(nil)), }, nil }, }, nil) @@ -331,7 +331,7 @@ func TestHandlerQueuing(t *testing.T) { case expected := <-expectedc: var alerts []*Alert - b, err := ioutil.ReadAll(r.Body) + b, err := io.ReadAll(r.Body) if err != nil { panic(err) } diff --git a/plugins.yml b/plugins.yml index 498ec22c6f..ee1809ce42 100644 --- a/plugins.yml +++ b/plugins.yml @@ -6,6 +6,7 @@ - github.com/prometheus/prometheus/discovery/eureka - github.com/prometheus/prometheus/discovery/gce - github.com/prometheus/prometheus/discovery/hetzner +- github.com/prometheus/prometheus/discovery/ionos - github.com/prometheus/prometheus/discovery/kubernetes - github.com/prometheus/prometheus/discovery/linode - github.com/prometheus/prometheus/discovery/marathon diff --git a/plugins/generate.go b/plugins/generate.go index 7054b109b8..32a32d890b 100644 --- a/plugins/generate.go +++ b/plugins/generate.go @@ -18,7 +18,6 @@ package main import ( "fmt" - "io/ioutil" "log" "os" "path" @@ -30,7 +29,7 @@ import ( //go:generate go run generate.go func main() { - data, err := ioutil.ReadFile(filepath.Join("..", "plugins.yml")) + data, err := os.ReadFile(filepath.Join("..", "plugins.yml")) if err != nil { log.Fatal(err) } diff --git a/plugins/plugins.go b/plugins/plugins.go index 2247f805ad..6a7b6e5315 100644 --- a/plugins/plugins.go +++ b/plugins/plugins.go @@ -40,6 +40,9 @@ import ( // Register hetzner plugin. _ "github.com/prometheus/prometheus/discovery/hetzner" + // Register ionos plugin. + _ "github.com/prometheus/prometheus/discovery/ionos" + // Register kubernetes plugin. _ "github.com/prometheus/prometheus/discovery/kubernetes" @@ -67,6 +70,9 @@ import ( // Register uyuni plugin. _ "github.com/prometheus/prometheus/discovery/uyuni" + // Register vultr plugin. + _ "github.com/prometheus/prometheus/discovery/vultr" + // Register xds plugin. _ "github.com/prometheus/prometheus/discovery/xds" diff --git a/promql/engine.go b/promql/engine.go index 8e5fcea95d..3cb1c95683 100644 --- a/promql/engine.go +++ b/promql/engine.go @@ -17,6 +17,7 @@ import ( "bytes" "container/heap" "context" + "errors" "fmt" "math" "reflect" @@ -29,7 +30,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" "github.com/grafana/regexp" - "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/model" "go.opentelemetry.io/otel" @@ -208,10 +208,10 @@ func contextDone(ctx context.Context, env string) error { } func contextErr(err error, env string) error { - switch err { - case context.Canceled: + switch { + case errors.Is(err, context.Canceled): return ErrQueryCanceled(env) - case context.DeadlineExceeded: + case errors.Is(err, context.DeadlineExceeded): return ErrQueryTimeout(env) default: return err @@ -416,7 +416,7 @@ func (ng *Engine) NewRangeQuery(q storage.Queryable, opts *QueryOpts, qs string, return nil, err } if expr.Type() != parser.ValueTypeVector && expr.Type() != parser.ValueTypeScalar { - return nil, errors.Errorf("invalid expression type %q for range query, must be Scalar or instant Vector", parser.DocumentedType(expr.Type())) + return nil, fmt.Errorf("invalid expression type %q for range query, must be Scalar or instant Vector", parser.DocumentedType(expr.Type())) } qry, err := ng.newQuery(q, opts, expr, start, end, interval) if err != nil { @@ -597,7 +597,7 @@ func (ng *Engine) exec(ctx context.Context, q *query) (v parser.Value, ws storag return nil, nil, s(ctx) } - panic(errors.Errorf("promql.Engine.exec: unhandled statement of type %T", q.Statement())) + panic(fmt.Errorf("promql.Engine.exec: unhandled statement of type %T", q.Statement())) } func timeMilliseconds(t time.Time) int64 { @@ -657,7 +657,7 @@ func (ng *Engine) execEvalStmt(ctx context.Context, query *query, s *parser.Eval case String: return result, warnings, nil default: - panic(errors.Errorf("promql.Engine.exec: invalid expression type %q", val.Type())) + panic(fmt.Errorf("promql.Engine.exec: invalid expression type %q", val.Type())) } query.matrix = mat @@ -676,7 +676,7 @@ func (ng *Engine) execEvalStmt(ctx context.Context, query *query, s *parser.Eval case parser.ValueTypeMatrix: return mat, warnings, nil default: - panic(errors.Errorf("promql.Engine.exec: unexpected expression type %q", s.Expr.Type())) + panic(fmt.Errorf("promql.Engine.exec: unexpected expression type %q", s.Expr.Type())) } } @@ -701,7 +701,7 @@ func (ng *Engine) execEvalStmt(ctx context.Context, query *query, s *parser.Eval mat, ok := val.(Matrix) if !ok { - panic(errors.Errorf("promql.Engine.exec: invalid expression type %q", val.Type())) + panic(fmt.Errorf("promql.Engine.exec: invalid expression type %q", val.Type())) } query.matrix = mat @@ -928,7 +928,7 @@ type evaluator struct { // errorf causes a panic with the input formatted into an error. func (ev *evaluator) errorf(format string, args ...interface{}) { - ev.error(errors.Errorf(format, args...)) + ev.error(fmt.Errorf(format, args...)) } // error causes a panic with the given error. @@ -950,7 +950,7 @@ func (ev *evaluator) recover(ws *storage.Warnings, errp *error) { buf = buf[:runtime.Stack(buf, false)] level.Error(ev.logger).Log("msg", "runtime panic in parser", "err", e, "stacktrace", string(buf)) - *errp = errors.Wrap(err, "unexpected error") + *errp = fmt.Errorf("unexpected error: %w", err) case errWithWarnings: *errp = err.err *ws = append(*ws, err.warnings...) @@ -1344,7 +1344,7 @@ func (ev *evaluator) eval(expr parser.Expr) (parser.Value, storage.Warnings) { ws, err := checkAndExpandSeriesSet(ev.ctx, sel) warnings = append(warnings, ws...) if err != nil { - ev.error(errWithWarnings{errors.Wrap(err, "expanding series"), warnings}) + ev.error(errWithWarnings{fmt.Errorf("expanding series: %w", err), warnings}) } mat := make(Matrix, 0, len(selVS.Series)) // Output matrix. offset := durationMilliseconds(selVS.Offset) @@ -1541,7 +1541,7 @@ func (ev *evaluator) eval(expr parser.Expr) (parser.Value, storage.Warnings) { case *parser.VectorSelector: ws, err := checkAndExpandSeriesSet(ev.ctx, e) if err != nil { - ev.error(errWithWarnings{errors.Wrap(err, "expanding series"), ws}) + ev.error(errWithWarnings{fmt.Errorf("expanding series: %w", err), ws}) } mat := make(Matrix, 0, len(e.Series)) it := storage.NewMemoizedEmptyIterator(durationMilliseconds(ev.lookbackDelta)) @@ -1657,11 +1657,11 @@ func (ev *evaluator) eval(expr parser.Expr) (parser.Value, storage.Warnings) { // with changed timestamps. mat, ok := res.(Matrix) if !ok { - panic(errors.Errorf("unexpected result in StepInvariantExpr evaluation: %T", expr)) + panic(fmt.Errorf("unexpected result in StepInvariantExpr evaluation: %T", expr)) } for i := range mat { if len(mat[i].Points) != 1 { - panic(errors.Errorf("unexpected number of samples")) + panic(fmt.Errorf("unexpected number of samples")) } for ts := ev.startTimestamp + ev.interval; ts <= ev.endTimestamp; ts = ts + ev.interval { mat[i].Points = append(mat[i].Points, Point{ @@ -1678,14 +1678,14 @@ func (ev *evaluator) eval(expr parser.Expr) (parser.Value, storage.Warnings) { return res, ws } - panic(errors.Errorf("unhandled expression of type: %T", expr)) + panic(fmt.Errorf("unhandled expression of type: %T", expr)) } // vectorSelector evaluates a *parser.VectorSelector expression. func (ev *evaluator) vectorSelector(node *parser.VectorSelector, ts int64) (Vector, storage.Warnings) { ws, err := checkAndExpandSeriesSet(ev.ctx, node) if err != nil { - ev.error(errWithWarnings{errors.Wrap(err, "expanding series"), ws}) + ev.error(errWithWarnings{fmt.Errorf("expanding series: %w", err), ws}) } vec := make(Vector, 0, len(node.Series)) it := storage.NewMemoizedEmptyIterator(durationMilliseconds(ev.lookbackDelta)) @@ -1769,7 +1769,7 @@ func (ev *evaluator) matrixSelector(node *parser.MatrixSelector) (Matrix, storag ) ws, err := checkAndExpandSeriesSet(ev.ctx, node) if err != nil { - ev.error(errWithWarnings{errors.Wrap(err, "expanding series"), ws}) + ev.error(errWithWarnings{fmt.Errorf("expanding series: %w", err), ws}) } series := vs.Series @@ -2050,14 +2050,16 @@ func (ev *evaluator) VectorBinop(op parser.ItemType, lhs, rhs Vector, matching * } func signatureFunc(on bool, b []byte, names ...string) func(labels.Labels) string { - sort.Strings(names) if on { + sort.Strings(names) return func(lset labels.Labels) string { - return string(lset.WithLabels(names...).Bytes(b)) + return string(lset.BytesWithLabels(b, names...)) } } + names = append([]string{labels.MetricName}, names...) + sort.Strings(names) return func(lset labels.Labels) string { - return string(lset.WithoutLabels(names...).Bytes(b)) + return string(lset.BytesWithoutLabels(b, names...)) } } @@ -2092,15 +2094,7 @@ func resultMetric(lhs, rhs labels.Labels, op parser.ItemType, matching *parser.V if matching.Card == parser.CardOneToOne { if matching.On { - Outer: - for _, l := range lhs { - for _, n := range matching.MatchingLabels { - if l.Name == n { - continue Outer - } - } - enh.lb.Del(l.Name) - } + enh.lb.Keep(matching.MatchingLabels...) } else { enh.lb.Del(matching.MatchingLabels...) } @@ -2187,7 +2181,7 @@ func scalarBinop(op parser.ItemType, lhs, rhs float64) float64 { case parser.ATAN2: return math.Atan2(lhs, rhs) } - panic(errors.Errorf("operator %q not allowed for Scalar operations", op)) + panic(fmt.Errorf("operator %q not allowed for Scalar operations", op)) } // vectorElemBinop evaluates a binary operation between two Vector elements. @@ -2220,7 +2214,7 @@ func vectorElemBinop(op parser.ItemType, lhs, rhs float64) (float64, bool) { case parser.ATAN2: return math.Atan2(lhs, rhs), true } - panic(errors.Errorf("operator %q not allowed for operations between Vectors", op)) + panic(fmt.Errorf("operator %q not allowed for operations between Vectors", op)) } type groupedAggregation struct { @@ -2295,16 +2289,14 @@ func (ev *evaluator) aggregation(op parser.ItemType, grouping []string, without group, ok := result[groupingKey] // Add a new group if it doesn't exist. if !ok { - var m labels.Labels - + lb.Reset(metric) if without { - lb.Reset(metric) lb.Del(grouping...) lb.Del(labels.MetricName) - m = lb.Labels() } else { - m = metric.WithLabels(grouping...) + lb.Keep(grouping...) } + m := lb.Labels() newAgg := &groupedAggregation{ labels: m, value: s.V, @@ -2431,7 +2423,7 @@ func (ev *evaluator) aggregation(op parser.ItemType, grouping []string, without group.heap = append(group.heap, s) default: - panic(errors.Errorf("expected aggregation operator but got %q", op)) + panic(fmt.Errorf("expected aggregation operator but got %q", op)) } } diff --git a/promql/engine_test.go b/promql/engine_test.go index 42a3844fa2..16fdbab1c0 100644 --- a/promql/engine_test.go +++ b/promql/engine_test.go @@ -16,7 +16,7 @@ package promql import ( "context" "errors" - "io/ioutil" + "fmt" "os" "sort" "testing" @@ -42,7 +42,7 @@ func TestMain(m *testing.M) { func TestQueryConcurrency(t *testing.T) { maxConcurrency := 10 - dir, err := ioutil.TempDir("", "test_concurrency") + dir, err := os.MkdirTemp("", "test_concurrency") require.NoError(t, err) defer os.RemoveAll(dir) queryTracker := NewActiveQueryTracker(dir, maxConcurrency, nil) @@ -681,7 +681,6 @@ load 10s Result: Matrix{ Series{ Points: []Point{{V: 1, T: 0}, {V: 1, T: 1000}, {V: 1, T: 2000}}, - Metric: labels.FromStrings(), }, }, Start: time.Unix(0, 0), @@ -718,24 +717,26 @@ load 10s }, } - for _, c := range cases { - var err error - var qry Query - if c.Interval == 0 { - qry, err = test.QueryEngine().NewInstantQuery(test.Queryable(), nil, c.Query, c.Start) - } else { - qry, err = test.QueryEngine().NewRangeQuery(test.Queryable(), nil, c.Query, c.Start, c.End, c.Interval) - } - require.NoError(t, err) + for i, c := range cases { + t.Run(fmt.Sprintf("%d query=%s", i, c.Query), func(t *testing.T) { + var err error + var qry Query + if c.Interval == 0 { + qry, err = test.QueryEngine().NewInstantQuery(test.Queryable(), nil, c.Query, c.Start) + } else { + qry, err = test.QueryEngine().NewRangeQuery(test.Queryable(), nil, c.Query, c.Start, c.End, c.Interval) + } + require.NoError(t, err) - res := qry.Exec(test.Context()) - if c.ShouldError { - require.Error(t, res.Err, "expected error for the query %q", c.Query) - continue - } + res := qry.Exec(test.Context()) + if c.ShouldError { + require.Error(t, res.Err, "expected error for the query %q", c.Query) + return + } - require.NoError(t, res.Err) - require.Equal(t, c.Result, res.Value, "query %q failed", c.Query) + require.NoError(t, res.Err) + require.Equal(t, c.Result, res.Value, "query %q failed", c.Query) + }) } } diff --git a/promql/functions.go b/promql/functions.go index 423c33f663..d133fef051 100644 --- a/promql/functions.go +++ b/promql/functions.go @@ -14,6 +14,7 @@ package promql import ( + "fmt" "math" "sort" "strconv" @@ -21,7 +22,6 @@ import ( "time" "github.com/grafana/regexp" - "github.com/pkg/errors" "github.com/prometheus/common/model" "github.com/prometheus/prometheus/model/labels" @@ -223,10 +223,10 @@ func funcHoltWinters(vals []parser.Value, args parser.Expressions, enh *EvalNode // Sanity check the input. if sf <= 0 || sf >= 1 { - panic(errors.Errorf("invalid smoothing factor. Expected: 0 < sf < 1, got: %f", sf)) + panic(fmt.Errorf("invalid smoothing factor. Expected: 0 < sf < 1, got: %f", sf)) } if tf <= 0 || tf >= 1 { - panic(errors.Errorf("invalid trend factor. Expected: 0 < tf < 1, got: %f", tf)) + panic(fmt.Errorf("invalid trend factor. Expected: 0 < tf < 1, got: %f", tf)) } l := len(samples.Points) @@ -791,7 +791,6 @@ func funcPredictLinear(vals []parser.Value, args parser.Expressions, enh *EvalNo func funcHistogramQuantile(vals []parser.Value, args parser.Expressions, enh *EvalNodeHelper) Vector { q := vals[0].(Vector)[0].V inVec := vals[1].(Vector) - sigf := signatureFunc(false, enh.lblBuf, labels.BucketLabel) if enh.signatureToMetricWithBuckets == nil { enh.signatureToMetricWithBuckets = map[string]*metricWithBuckets{} @@ -809,19 +808,15 @@ func funcHistogramQuantile(vals []parser.Value, args parser.Expressions, enh *Ev // TODO(beorn7): Issue a warning somehow. continue } - l := sigf(el.Metric) - // Add the metric name (which is always removed) to the signature to prevent combining multiple histograms - // with the same label set. See https://github.com/prometheus/prometheus/issues/9910 - l = l + el.Metric.Get(model.MetricNameLabel) - - mb, ok := enh.signatureToMetricWithBuckets[l] + enh.lblBuf = el.Metric.BytesWithoutLabels(enh.lblBuf, labels.BucketLabel) + mb, ok := enh.signatureToMetricWithBuckets[string(enh.lblBuf)] if !ok { el.Metric = labels.NewBuilder(el.Metric). Del(excludedLabels...). Labels() mb = &metricWithBuckets{el.Metric, nil} - enh.signatureToMetricWithBuckets[l] = mb + enh.signatureToMetricWithBuckets[string(enh.lblBuf)] = mb } mb.buckets = append(mb.buckets, bucket{upperBound, el.V}) } @@ -890,10 +885,10 @@ func funcLabelReplace(vals []parser.Value, args parser.Expressions, enh *EvalNod var err error enh.regex, err = regexp.Compile("^(?:" + regexStr + ")$") if err != nil { - panic(errors.Errorf("invalid regular expression in label_replace(): %s", regexStr)) + panic(fmt.Errorf("invalid regular expression in label_replace(): %s", regexStr)) } if !model.LabelNameRE.MatchString(dst) { - panic(errors.Errorf("invalid destination label name in label_replace(): %s", dst)) + panic(fmt.Errorf("invalid destination label name in label_replace(): %s", dst)) } enh.Dmn = make(map[uint64]labels.Labels, len(enh.Out)) } @@ -955,13 +950,13 @@ func funcLabelJoin(vals []parser.Value, args parser.Expressions, enh *EvalNodeHe for i := 3; i < len(args); i++ { src := stringFromArg(args[i]) if !model.LabelName(src).IsValid() { - panic(errors.Errorf("invalid source label name in label_join(): %s", src)) + panic(fmt.Errorf("invalid source label name in label_join(): %s", src)) } srcLabels[i-3] = src } if !model.LabelName(dst).IsValid() { - panic(errors.Errorf("invalid destination label name in label_join(): %s", dst)) + panic(fmt.Errorf("invalid destination label name in label_join(): %s", dst)) } srcVals := make([]string, len(srcLabels)) @@ -1038,6 +1033,13 @@ func funcDayOfWeek(vals []parser.Value, args parser.Expressions, enh *EvalNodeHe }) } +// === day_of_year(v Vector) Scalar === +func funcDayOfYear(vals []parser.Value, args parser.Expressions, enh *EvalNodeHelper) Vector { + return dateWrapper(vals, enh, func(t time.Time) float64 { + return float64(t.YearDay()) + }) +} + // === hour(v Vector) Scalar === func funcHour(vals []parser.Value, args parser.Expressions, enh *EvalNodeHelper) Vector { return dateWrapper(vals, enh, func(t time.Time) float64 { @@ -1089,6 +1091,7 @@ var FunctionCalls = map[string]FunctionCall{ "days_in_month": funcDaysInMonth, "day_of_month": funcDayOfMonth, "day_of_week": funcDayOfWeek, + "day_of_year": funcDayOfYear, "deg": funcDeg, "delta": funcDelta, "deriv": funcDeriv, @@ -1143,7 +1146,7 @@ var FunctionCalls = map[string]FunctionCall{ // that can also change with change in eval time. var AtModifierUnsafeFunctions = map[string]struct{}{ // Step invariant functions. - "days_in_month": {}, "day_of_month": {}, "day_of_week": {}, + "days_in_month": {}, "day_of_month": {}, "day_of_week": {}, "day_of_year": {}, "hour": {}, "minute": {}, "month": {}, "year": {}, "predict_linear": {}, "time": {}, // Uses timestamp of the argument for the result, diff --git a/promql/fuzz.go b/promql/fuzz.go index 6b7c16e2d5..39933378e6 100644 --- a/promql/fuzz.go +++ b/promql/fuzz.go @@ -18,6 +18,7 @@ package promql import ( + "errors" "io" "github.com/prometheus/prometheus/model/textparse" @@ -71,7 +72,7 @@ func fuzzParseMetricWithContentType(in []byte, contentType string) int { break } } - if err == io.EOF { + if errors.Is(err, io.EOF) { err = nil } diff --git a/promql/parser/ast.go b/promql/parser/ast.go index fc144cbbc4..d5a2335abb 100644 --- a/promql/parser/ast.go +++ b/promql/parser/ast.go @@ -15,10 +15,9 @@ package parser import ( "context" + "fmt" "time" - "github.com/pkg/errors" - "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/storage" ) @@ -394,7 +393,7 @@ func Children(node Node) []Node { // nothing to do return []Node{} default: - panic(errors.Errorf("promql.Children: unhandled node type %T", node)) + panic(fmt.Errorf("promql.Children: unhandled node type %T", node)) } } diff --git a/promql/parser/functions.go b/promql/parser/functions.go index c4bc5ddb8d..92afff8b23 100644 --- a/promql/parser/functions.go +++ b/promql/parser/functions.go @@ -132,6 +132,12 @@ var Functions = map[string]*Function{ Variadic: 1, ReturnType: ValueTypeVector, }, + "day_of_year": { + Name: "day_of_year", + ArgTypes: []ValueType{ValueTypeVector}, + Variadic: 1, + ReturnType: ValueTypeVector, + }, "deg": { Name: "deg", ArgTypes: []ValueType{ValueTypeVector}, diff --git a/promql/parser/parse.go b/promql/parser/parse.go index 5b60c5ed51..7a0e48464b 100644 --- a/promql/parser/parse.go +++ b/promql/parser/parse.go @@ -14,6 +14,7 @@ package parser import ( + "errors" "fmt" "math" "os" @@ -23,7 +24,6 @@ import ( "sync" "time" - "github.com/pkg/errors" "github.com/prometheus/common/model" "github.com/prometheus/prometheus/model/labels" @@ -224,7 +224,7 @@ func ParseSeriesDesc(input string) (labels labels.Labels, values []SequenceValue // addParseErrf formats the error and appends it to the list of parsing errors. func (p *parser) addParseErrf(positionRange PositionRange, format string, args ...interface{}) { - p.addParseErr(positionRange, errors.Errorf(format, args...)) + p.addParseErr(positionRange, fmt.Errorf(format, args...)) } // addParseErr appends the provided error to the list of parsing errors. @@ -801,7 +801,7 @@ func MustLabelMatcher(mt labels.MatchType, name, val string) *labels.Matcher { func MustGetFunction(name string) *Function { f, ok := getFunction(name) if !ok { - panic(errors.Errorf("function %q does not exist", name)) + panic(fmt.Errorf("function %q does not exist", name)) } return f } diff --git a/promql/parser/parse_test.go b/promql/parser/parse_test.go index 790064d373..548fb5aa92 100644 --- a/promql/parser/parse_test.go +++ b/promql/parser/parse_test.go @@ -14,13 +14,13 @@ package parser import ( + "errors" "fmt" "math" "strings" "testing" "time" - "github.com/pkg/errors" "github.com/prometheus/common/model" "github.com/stretchr/testify/require" @@ -3570,7 +3570,8 @@ func TestParseExpressions(t *testing.T) { require.Error(t, err) require.Contains(t, err.Error(), test.errMsg, "unexpected error on input '%s', expected '%s', got '%s'", test.input, test.errMsg, err.Error()) - errorList, ok := err.(ParseErrors) + var errorList ParseErrors + ok := errors.As(err, &errorList) require.True(t, ok, "unexpected error type") diff --git a/promql/query_logger_test.go b/promql/query_logger_test.go index 033e012d8c..ad76fb9929 100644 --- a/promql/query_logger_test.go +++ b/promql/query_logger_test.go @@ -15,7 +15,6 @@ package promql import ( "context" - "io/ioutil" "os" "testing" @@ -105,7 +104,7 @@ func TestIndexReuse(t *testing.T) { } func TestMMapFile(t *testing.T) { - file, err := ioutil.TempFile("", "mmapedFile") + file, err := os.CreateTemp("", "mmapedFile") require.NoError(t, err) filename := file.Name() diff --git a/promql/test.go b/promql/test.go index a9408bc4c5..22144fe358 100644 --- a/promql/test.go +++ b/promql/test.go @@ -15,15 +15,15 @@ package promql import ( "context" + "errors" "fmt" - "io/ioutil" "math" + "os" "strconv" "strings" "time" "github.com/grafana/regexp" - "github.com/pkg/errors" "github.com/prometheus/common/model" "github.com/stretchr/testify/require" @@ -78,7 +78,7 @@ func NewTest(t testutil.T, input string) (*Test, error) { } func newTestFromFile(t testutil.T, filename string) (*Test, error) { - content, err := ioutil.ReadFile(filename) + content, err := os.ReadFile(filename) if err != nil { return nil, err } @@ -122,7 +122,7 @@ func (t *Test) ExemplarQueryable() storage.ExemplarQueryable { func raise(line int, format string, v ...interface{}) error { return &parser.ParseErr{ LineOffset: line, - Err: errors.Errorf(format, v...), + Err: fmt.Errorf(format, v...), } } @@ -146,7 +146,8 @@ func parseLoad(lines []string, i int) (int, *loadCmd, error) { } metric, vals, err := parser.ParseSeriesDesc(defLine) if err != nil { - if perr, ok := err.(*parser.ParseErr); ok { + var perr *parser.ParseErr + if errors.As(err, &perr) { perr.LineOffset = i } return i, nil, err @@ -168,7 +169,8 @@ func (t *Test) parseEval(lines []string, i int) (int, *evalCmd, error) { ) _, err := parser.ParseExpr(expr) if err != nil { - if perr, ok := err.(*parser.ParseErr); ok { + var perr *parser.ParseErr + if errors.As(err, &perr) { perr.LineOffset = i posOffset := parser.Pos(strings.Index(lines[i], expr)) perr.PositionRange.Start += posOffset @@ -205,7 +207,8 @@ func (t *Test) parseEval(lines []string, i int) (int, *evalCmd, error) { } metric, vals, err := parser.ParseSeriesDesc(defLine) if err != nil { - if perr, ok := err.(*parser.ParseErr); ok { + var perr *parser.ParseErr + if errors.As(err, &perr) { perr.LineOffset = i } return i, nil, err @@ -388,14 +391,14 @@ func (ev *evalCmd) compareResult(result parser.Value) error { for pos, v := range val { fp := v.Metric.Hash() if _, ok := ev.metrics[fp]; !ok { - return errors.Errorf("unexpected metric %s in result", v.Metric) + return fmt.Errorf("unexpected metric %s in result", v.Metric) } exp := ev.expected[fp] if ev.ordered && exp.pos != pos+1 { - return errors.Errorf("expected metric %s with %v at position %d but was at %d", v.Metric, exp.vals, exp.pos, pos+1) + return fmt.Errorf("expected metric %s with %v at position %d but was at %d", v.Metric, exp.vals, exp.pos, pos+1) } if !almostEqual(exp.vals[0].Value, v.V) { - return errors.Errorf("expected %v for %s but got %v", exp.vals[0].Value, v.Metric, v.V) + return fmt.Errorf("expected %v for %s but got %v", exp.vals[0].Value, v.Metric, v.V) } seen[fp] = true @@ -406,17 +409,17 @@ func (ev *evalCmd) compareResult(result parser.Value) error { for _, ss := range val { fmt.Println(" ", ss.Metric, ss.Point) } - return errors.Errorf("expected metric %s with %v not found", ev.metrics[fp], expVals) + return fmt.Errorf("expected metric %s with %v not found", ev.metrics[fp], expVals) } } case Scalar: if !almostEqual(ev.expected[0].vals[0].Value, val.V) { - return errors.Errorf("expected Scalar %v but got %v", val.V, ev.expected[0].vals[0].Value) + return fmt.Errorf("expected Scalar %v but got %v", val.V, ev.expected[0].vals[0].Value) } default: - panic(errors.Errorf("promql.Test.compareResult: unexpected result type %T", result)) + panic(fmt.Errorf("promql.Test.compareResult: unexpected result type %T", result)) } return nil } @@ -543,14 +546,14 @@ func (t *Test) exec(tc testCommand) error { if cmd.fail { continue } - return errors.Wrapf(res.Err, "error evaluating query %q (line %d)", iq.expr, cmd.line) + return fmt.Errorf("error evaluating query %q (line %d): %w", iq.expr, cmd.line, res.Err) } if res.Err == nil && cmd.fail { - return errors.Errorf("expected error evaluating query %q (line %d) but got none", iq.expr, cmd.line) + return fmt.Errorf("expected error evaluating query %q (line %d) but got none", iq.expr, cmd.line) } err = cmd.compareResult(res.Value) if err != nil { - return errors.Wrapf(err, "error in %s %s", cmd, iq.expr) + return fmt.Errorf("error in %s %s: %w", cmd, iq.expr, err) } // Check query returns same result in range mode, @@ -561,7 +564,7 @@ func (t *Test) exec(tc testCommand) error { } rangeRes := q.Exec(t.context) if rangeRes.Err != nil { - return errors.Wrapf(rangeRes.Err, "error evaluating query %q (line %d) in range mode", iq.expr, cmd.line) + return fmt.Errorf("error evaluating query %q (line %d) in range mode: %w", iq.expr, cmd.line, rangeRes.Err) } defer q.Close() if cmd.ordered { @@ -584,7 +587,7 @@ func (t *Test) exec(tc testCommand) error { err = cmd.compareResult(vec) } if err != nil { - return errors.Wrapf(err, "error in %s %s (line %d) range mode", cmd, iq.expr, cmd.line) + return fmt.Errorf("error in %s %s (line %d) range mode: %w", cmd, iq.expr, cmd.line, err) } } @@ -658,7 +661,7 @@ func parseNumber(s string) (float64, error) { f, err = strconv.ParseFloat(s, 64) } if err != nil { - return 0, errors.Wrap(err, "error parsing number") + return 0, fmt.Errorf("error parsing number: %w", err) } return f, nil } diff --git a/promql/testdata/functions.test b/promql/testdata/functions.test index b216c42c7b..02e6a32190 100644 --- a/promql/testdata/functions.test +++ b/promql/testdata/functions.test @@ -704,6 +704,12 @@ eval instant at 0m day_of_month() eval instant at 0m day_of_month(vector(1136239445)) {} 2 +eval instant at 0m day_of_year() + {} 1 + +eval instant at 0m day_of_year(vector(1136239445)) + {} 2 + # Thursday. eval instant at 0m day_of_week() {} 4 @@ -739,6 +745,14 @@ eval instant at 0m month(vector(1456790399)) + day_of_month(vector(1456790399)) eval instant at 0m month(vector(1456790400)) + day_of_month(vector(1456790400)) / 100 {} 3.01 +# 2016-12-31 13:37:00 366th day in leap year. +eval instant at 0m day_of_year(vector(1483191420)) + {} 366 + +# 2022-12-31 13:37:00 365th day in non-leap year. +eval instant at 0m day_of_year(vector(1672493820)) + {} 365 + # February 1st 2016 in leap year. eval instant at 0m days_in_month(vector(1454284800)) {} 29 diff --git a/promql/value.go b/promql/value.go index 55cdc44d35..5b0bd8fa82 100644 --- a/promql/value.go +++ b/promql/value.go @@ -15,12 +15,11 @@ package promql import ( "encoding/json" + "errors" "fmt" "strconv" "strings" - "github.com/pkg/errors" - "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/promql/parser" "github.com/prometheus/prometheus/storage" diff --git a/rules/alerting.go b/rules/alerting.go index 202780340b..0e78049570 100644 --- a/rules/alerting.go +++ b/rules/alerting.go @@ -16,7 +16,6 @@ package rules import ( "context" "fmt" - html_template "html/template" "net/url" "strings" "sync" @@ -35,7 +34,6 @@ import ( "github.com/prometheus/prometheus/promql/parser" "github.com/prometheus/prometheus/storage" "github.com/prometheus/prometheus/template" - "github.com/prometheus/prometheus/util/strutil" ) const ( @@ -44,8 +42,6 @@ const ( // AlertForStateMetricName is the metric name for 'for' state of alert. alertForStateMetricName = "ALERTS_FOR_STATE" - // AlertNameLabel is the label name indicating the name of an alert. - alertNameLabel = "alertname" // AlertStateLabel is the label name indicating the state of an alert. alertStateLabel = "alertstate" ) @@ -548,37 +544,3 @@ func (r *AlertingRule) String() string { return string(byt) } - -// HTMLSnippet returns an HTML snippet representing this alerting rule. The -// resulting snippet is expected to be presented in a
 element, so that
-// line breaks and other returned whitespace is respected.
-func (r *AlertingRule) HTMLSnippet(pathPrefix string) html_template.HTML {
-	alertMetric := model.Metric{
-		model.MetricNameLabel: alertMetricName,
-		alertNameLabel:        model.LabelValue(r.name),
-	}
-
-	labelsMap := make(map[string]string, len(r.labels))
-	for _, l := range r.labels {
-		labelsMap[l.Name] = html_template.HTMLEscapeString(l.Value)
-	}
-
-	annotationsMap := make(map[string]string, len(r.annotations))
-	for _, l := range r.annotations {
-		annotationsMap[l.Name] = html_template.HTMLEscapeString(l.Value)
-	}
-
-	ar := rulefmt.Rule{
-		Alert:       fmt.Sprintf("%s", pathPrefix+strutil.TableLinkForExpression(alertMetric.String()), r.name),
-		Expr:        fmt.Sprintf("%s", pathPrefix+strutil.TableLinkForExpression(r.vector.String()), html_template.HTMLEscapeString(r.vector.String())),
-		For:         model.Duration(r.holdDuration),
-		Labels:      labelsMap,
-		Annotations: annotationsMap,
-	}
-
-	byt, err := yaml.Marshal(ar)
-	if err != nil {
-		return html_template.HTML(fmt.Sprintf("error marshaling alerting rule: %q", html_template.HTMLEscapeString(err.Error())))
-	}
-	return html_template.HTML(byt)
-}
diff --git a/rules/alerting_test.go b/rules/alerting_test.go
index 888007735c..5ccfaa4971 100644
--- a/rules/alerting_test.go
+++ b/rules/alerting_test.go
@@ -15,7 +15,6 @@ package rules
 
 import (
 	"context"
-	"html/template"
 	"testing"
 	"time"
 
@@ -31,23 +30,6 @@ import (
 	"github.com/prometheus/prometheus/util/teststorage"
 )
 
-func TestAlertingRuleHTMLSnippet(t *testing.T) {
-	expr, err := parser.ParseExpr(`foo{html="BOLD"}`)
-	require.NoError(t, err)
-	rule := NewAlertingRule("testrule", expr, 0, labels.FromStrings("html", "BOLD"), labels.FromStrings("html", "BOLD"), nil, "", false, nil)
-
-	const want = template.HTML(`alert: testrule
-expr: foo{html="<b>BOLD<b>"}
-labels:
-  html: '<b>BOLD</b>'
-annotations:
-  html: '<b>BOLD</b>'
-`)
-
-	got := rule.HTMLSnippet("/test/prefix")
-	require.Equal(t, want, got, "incorrect HTML snippet; want:\n\n|%v|\n\ngot:\n\n|%v|", want, got)
-}
-
 func TestAlertingRuleState(t *testing.T) {
 	tests := []struct {
 		name   string
diff --git a/rules/manager.go b/rules/manager.go
index 1bd1ae1f91..9b17a67dd3 100644
--- a/rules/manager.go
+++ b/rules/manager.go
@@ -15,7 +15,6 @@ package rules
 
 import (
 	"context"
-	html_template "html/template"
 	"math"
 	"net/url"
 	"sort"
@@ -29,6 +28,7 @@ import (
 	"github.com/prometheus/common/model"
 	"go.opentelemetry.io/otel"
 	"go.opentelemetry.io/otel/attribute"
+	"go.opentelemetry.io/otel/codes"
 
 	"github.com/prometheus/prometheus/model/labels"
 	"github.com/prometheus/prometheus/model/rulefmt"
@@ -236,9 +236,6 @@ type Rule interface {
 	// GetEvaluationTimestamp returns last evaluation timestamp.
 	// NOTE: Used dynamically by rules.html template.
 	GetEvaluationTimestamp() time.Time
-	// HTMLSnippet returns a human-readable string representation of the rule,
-	// decorated with HTML elements for use the web frontend.
-	HTMLSnippet(pathPrefix string) html_template.HTML
 }
 
 // Group is a set of rules that have a logical relation.
@@ -640,6 +637,7 @@ func (g *Group) Eval(ctx context.Context, ts time.Time) {
 			if err != nil {
 				rule.SetHealth(HealthBad)
 				rule.SetLastError(err)
+				sp.SetStatus(codes.Error, err.Error())
 				g.metrics.EvalFailures.WithLabelValues(GroupKey(g.File(), g.Name())).Inc()
 
 				// Canceled queries are intentional termination of queries. This normally
@@ -667,6 +665,7 @@ func (g *Group) Eval(ctx context.Context, ts time.Time) {
 				if err := app.Commit(); err != nil {
 					rule.SetHealth(HealthBad)
 					rule.SetLastError(err)
+					sp.SetStatus(codes.Error, err.Error())
 					g.metrics.EvalFailures.WithLabelValues(GroupKey(g.File(), g.Name())).Inc()
 
 					level.Warn(g.logger).Log("name", rule.Name(), "index", i, "msg", "Rule sample appending failed", "err", err)
@@ -679,6 +678,7 @@ func (g *Group) Eval(ctx context.Context, ts time.Time) {
 				if _, err := app.Append(0, s.Metric, s.T, s.V); err != nil {
 					rule.SetHealth(HealthBad)
 					rule.SetLastError(err)
+					sp.SetStatus(codes.Error, err.Error())
 
 					switch errors.Cause(err) {
 					case storage.ErrOutOfOrderSample:
@@ -985,6 +985,7 @@ func NewManager(o *ManagerOptions) *Manager {
 
 // Run starts processing of the rule manager. It is blocking.
 func (m *Manager) Run() {
+	level.Info(m.logger).Log("msg", "Starting rule manager...")
 	m.start()
 	<-m.done
 }
diff --git a/rules/manager_test.go b/rules/manager_test.go
index 119bf0b740..26aa3b2c87 100644
--- a/rules/manager_test.go
+++ b/rules/manager_test.go
@@ -17,7 +17,6 @@ import (
 	"context"
 	"fmt"
 	"io/fs"
-	"io/ioutil"
 	"math"
 	"os"
 	"path"
@@ -767,7 +766,7 @@ func TestUpdate(t *testing.T) {
 	rgs, errs := rulefmt.ParseFile("fixtures/rules.yaml")
 	require.Equal(t, 0, len(errs), "file parsing failures")
 
-	tmpFile, err := ioutil.TempFile("", "rules.test.*.yaml")
+	tmpFile, err := os.CreateTemp("", "rules.test.*.yaml")
 	require.NoError(t, err)
 	defer os.Remove(tmpFile.Name())
 	defer tmpFile.Close()
@@ -834,7 +833,7 @@ func TestUpdateSetsSourceTenants(t *testing.T) {
 	rgs, errs := rulefmt.ParseFile("fixtures/rules_with_source_tenants.yaml")
 	require.Empty(t, errs, "file parsing failures")
 
-	tmpFile, err := ioutil.TempFile("", "rules.test.*.yaml")
+	tmpFile, err := os.CreateTemp("", "rules.test.*.yaml")
 	require.NoError(t, err)
 	defer os.Remove(tmpFile.Name())
 	defer tmpFile.Close()
@@ -882,7 +881,7 @@ func TestGroupEvaluationContextFuncIsCalledWhenSupplied(t *testing.T) {
 	rgs, errs := rulefmt.ParseFile("fixtures/rules_with_source_tenants.yaml")
 	require.Empty(t, errs, "file parsing failures")
 
-	tmpFile, err := ioutil.TempFile("", "rules.test.*.yaml")
+	tmpFile, err := os.CreateTemp("", "rules.test.*.yaml")
 	require.NoError(t, err)
 	defer os.Remove(tmpFile.Name())
 	defer tmpFile.Close()
@@ -1540,7 +1539,7 @@ groups:
 
 	dir := t.TempDir()
 	fname := path.Join(dir, "rules.yaml")
-	err := ioutil.WriteFile(fname, []byte(config), fs.ModePerm)
+	err := os.WriteFile(fname, []byte(config), fs.ModePerm)
 	require.NoError(t, err)
 
 	m := NewManager(&ManagerOptions{
diff --git a/rules/recording.go b/rules/recording.go
index 13074158e2..792c8b45e2 100644
--- a/rules/recording.go
+++ b/rules/recording.go
@@ -16,7 +16,6 @@ package rules
 import (
 	"context"
 	"fmt"
-	"html/template"
 	"net/url"
 	"sync"
 	"time"
@@ -27,7 +26,6 @@ import (
 	"github.com/prometheus/prometheus/model/rulefmt"
 	"github.com/prometheus/prometheus/promql"
 	"github.com/prometheus/prometheus/promql/parser"
-	"github.com/prometheus/prometheus/util/strutil"
 )
 
 // A RecordingRule records its vector expression into new timeseries.
@@ -179,25 +177,3 @@ func (rule *RecordingRule) GetEvaluationTimestamp() time.Time {
 	defer rule.mtx.Unlock()
 	return rule.evaluationTimestamp
 }
-
-// HTMLSnippet returns an HTML snippet representing this rule.
-func (rule *RecordingRule) HTMLSnippet(pathPrefix string) template.HTML {
-	ruleExpr := rule.vector.String()
-	labels := make(map[string]string, len(rule.labels))
-	for _, l := range rule.labels {
-		labels[l.Name] = template.HTMLEscapeString(l.Value)
-	}
-
-	r := rulefmt.Rule{
-		Record: fmt.Sprintf(`%s`, pathPrefix+strutil.TableLinkForExpression(rule.name), rule.name),
-		Expr:   fmt.Sprintf(`%s`, pathPrefix+strutil.TableLinkForExpression(ruleExpr), template.HTMLEscapeString(ruleExpr)),
-		Labels: labels,
-	}
-
-	byt, err := yaml.Marshal(r)
-	if err != nil {
-		return template.HTML(fmt.Sprintf("error marshaling recording rule: %q", template.HTMLEscapeString(err.Error())))
-	}
-
-	return template.HTML(byt)
-}
diff --git a/rules/recording_test.go b/rules/recording_test.go
index 4a10e71971..2d90b77524 100644
--- a/rules/recording_test.go
+++ b/rules/recording_test.go
@@ -15,7 +15,6 @@ package rules
 
 import (
 	"context"
-	"html/template"
 	"testing"
 	"time"
 
@@ -84,21 +83,6 @@ func TestRuleEval(t *testing.T) {
 	}
 }
 
-func TestRecordingRuleHTMLSnippet(t *testing.T) {
-	expr, err := parser.ParseExpr(`foo{html="BOLD"}`)
-	require.NoError(t, err)
-	rule := NewRecordingRule("testrule", expr, labels.FromStrings("html", "BOLD"))
-
-	const want = template.HTML(`record: testrule
-expr: foo{html="<b>BOLD<b>"}
-labels:
-  html: '<b>BOLD</b>'
-`)
-
-	got := rule.HTMLSnippet("/test/prefix")
-	require.Equal(t, want, got, "incorrect HTML snippet; want:\n\n%s\n\ngot:\n\n%s", want, got)
-}
-
 // TestRuleEvalDuplicate tests for duplicate labels in recorded metrics, see #5529.
 func TestRuleEvalDuplicate(t *testing.T) {
 	storage := teststorage.New(t)
diff --git a/scrape/manager.go b/scrape/manager.go
index 0e606b4548..92ecbc31d4 100644
--- a/scrape/manager.go
+++ b/scrape/manager.go
@@ -25,6 +25,7 @@ import (
 	"github.com/pkg/errors"
 	"github.com/prometheus/client_golang/prometheus"
 	config_util "github.com/prometheus/common/config"
+	"github.com/prometheus/common/model"
 
 	"github.com/prometheus/prometheus/config"
 	"github.com/prometheus/prometheus/discovery/targetgroup"
@@ -124,6 +125,11 @@ func NewManager(o *Options, logger log.Logger, app storage.Appendable) *Manager
 // Options are the configuration parameters to the scrape manager.
 type Options struct {
 	ExtraMetrics bool
+	// Option used by downstream scraper users like OpenTelemetry Collector
+	// to help lookup metric metadata. Should be false for Prometheus.
+	PassMetadataInContext bool
+	// Option to increase the interval used by scrape manager to throttle target groups updates.
+	DiscoveryReloadInterval model.Duration
 
 	// Optional HTTP client options to use when scraping.
 	HTTPClientOptions []config_util.HTTPClientOption
@@ -167,7 +173,13 @@ func (m *Manager) Run(tsets <-chan map[string][]*targetgroup.Group) error {
 }
 
 func (m *Manager) reloader() {
-	ticker := time.NewTicker(5 * time.Second)
+	reloadIntervalDuration := m.opts.DiscoveryReloadInterval
+	if reloadIntervalDuration < model.Duration(5*time.Second) {
+		reloadIntervalDuration = model.Duration(5 * time.Second)
+	}
+
+	ticker := time.NewTicker(time.Duration(reloadIntervalDuration))
+
 	defer ticker.Stop()
 
 	for {
@@ -195,7 +207,7 @@ func (m *Manager) reload() {
 				level.Error(m.logger).Log("msg", "error reloading target set", "err", "invalid config id:"+setName)
 				continue
 			}
-			sp, err := newScrapePool(scrapeConfig, m.append, m.jitterSeed, log.With(m.logger, "scrape_pool", setName), m.opts.ExtraMetrics, m.opts.HTTPClientOptions)
+			sp, err := newScrapePool(scrapeConfig, m.append, m.jitterSeed, log.With(m.logger, "scrape_pool", setName), m.opts.ExtraMetrics, m.opts.PassMetadataInContext, m.opts.HTTPClientOptions)
 			if err != nil {
 				level.Error(m.logger).Log("msg", "error creating new scrape pool", "err", err, "scrape_pool", setName)
 				continue
diff --git a/scrape/scrape.go b/scrape/scrape.go
index 4b045faca9..2febb4390a 100644
--- a/scrape/scrape.go
+++ b/scrape/scrape.go
@@ -20,7 +20,6 @@ import (
 	"context"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"math"
 	"net/http"
 	"reflect"
@@ -265,7 +264,7 @@ const maxAheadTime = 10 * time.Minute
 
 type labelsMutator func(labels.Labels) labels.Labels
 
-func newScrapePool(cfg *config.ScrapeConfig, app storage.Appendable, jitterSeed uint64, logger log.Logger, reportExtraMetrics bool, httpOpts []config_util.HTTPClientOption) (*scrapePool, error) {
+func newScrapePool(cfg *config.ScrapeConfig, app storage.Appendable, jitterSeed uint64, logger log.Logger, reportExtraMetrics, passMetadataInContext bool, httpOpts []config_util.HTTPClientOption) (*scrapePool, error) {
 	targetScrapePools.Inc()
 	if logger == nil {
 		logger = log.NewNopLogger()
@@ -316,6 +315,9 @@ func newScrapePool(cfg *config.ScrapeConfig, app storage.Appendable, jitterSeed
 			opts.interval,
 			opts.timeout,
 			reportExtraMetrics,
+			opts.target,
+			cache,
+			passMetadataInContext,
 		)
 	}
 
@@ -773,7 +775,7 @@ func (s *targetScraper) scrape(ctx context.Context, w io.Writer) (string, error)
 		return "", err
 	}
 	defer func() {
-		io.Copy(ioutil.Discard, resp.Body)
+		io.Copy(io.Discard, resp.Body)
 		resp.Body.Close()
 	}()
 
@@ -856,10 +858,11 @@ type scrapeLoop struct {
 	sampleMutator       labelsMutator
 	reportSampleMutator labelsMutator
 
-	parentCtx context.Context
-	ctx       context.Context
-	cancel    func()
-	stopped   chan struct{}
+	parentCtx   context.Context
+	appenderCtx context.Context
+	ctx         context.Context
+	cancel      func()
+	stopped     chan struct{}
 
 	disabledEndOfRunStalenessMarkers bool
 
@@ -1125,6 +1128,9 @@ func newScrapeLoop(ctx context.Context,
 	interval time.Duration,
 	timeout time.Duration,
 	reportExtraMetrics bool,
+	target *Target,
+	metricMetadataStore MetricMetadataStore,
+	passMetadataInContext bool,
 ) *scrapeLoop {
 	if l == nil {
 		l = log.NewNopLogger()
@@ -1135,6 +1141,18 @@ func newScrapeLoop(ctx context.Context,
 	if cache == nil {
 		cache = newScrapeCache()
 	}
+
+	appenderCtx := ctx
+
+	if passMetadataInContext {
+		// Store the cache and target in the context. This is then used by downstream OTel Collector
+		// to lookup the metadata required to process the samples. Not used by Prometheus itself.
+		// TODO(gouthamve) We're using a dedicated context because using the parentCtx caused a memory
+		// leak. We should ideally fix the main leak. See: https://github.com/prometheus/prometheus/pull/10590
+		appenderCtx = ContextWithMetricMetadataStore(appenderCtx, cache)
+		appenderCtx = ContextWithTarget(appenderCtx, target)
+	}
+
 	sl := &scrapeLoop{
 		scraper:             sc,
 		buffers:             buffers,
@@ -1146,6 +1164,7 @@ func newScrapeLoop(ctx context.Context,
 		jitterSeed:          jitterSeed,
 		l:                   l,
 		parentCtx:           ctx,
+		appenderCtx:         appenderCtx,
 		honorTimestamps:     honorTimestamps,
 		sampleLimit:         sampleLimit,
 		labelLimits:         labelLimits,
@@ -1224,7 +1243,7 @@ mainLoop:
 // scrapeAndReport performs a scrape and then appends the result to the storage
 // together with reporting metrics, by using as few appenders as possible.
 // In the happy scenario, a single appender is used.
-// This function uses sl.parentCtx instead of sl.ctx on purpose. A scrape should
+// This function uses sl.appenderCtx instead of sl.ctx on purpose. A scrape should
 // only be cancelled on shutdown, not on reloads.
 func (sl *scrapeLoop) scrapeAndReport(last, appendTime time.Time, errc chan<- error) time.Time {
 	start := time.Now()
@@ -1243,7 +1262,7 @@ func (sl *scrapeLoop) scrapeAndReport(last, appendTime time.Time, errc chan<- er
 	var total, added, seriesAdded, bytes int
 	var err, appErr, scrapeErr error
 
-	app := sl.appender(sl.parentCtx)
+	app := sl.appender(sl.appenderCtx)
 	defer func() {
 		if err != nil {
 			app.Rollback()
@@ -1266,7 +1285,7 @@ func (sl *scrapeLoop) scrapeAndReport(last, appendTime time.Time, errc chan<- er
 		// Add stale markers.
 		if _, _, _, err := sl.append(app, []byte{}, "", appendTime); err != nil {
 			app.Rollback()
-			app = sl.appender(sl.parentCtx)
+			app = sl.appender(sl.appenderCtx)
 			level.Warn(sl.l).Log("msg", "Append failed", "err", err)
 		}
 		if errc != nil {
@@ -1305,13 +1324,13 @@ func (sl *scrapeLoop) scrapeAndReport(last, appendTime time.Time, errc chan<- er
 	total, added, seriesAdded, appErr = sl.append(app, b, contentType, appendTime)
 	if appErr != nil {
 		app.Rollback()
-		app = sl.appender(sl.parentCtx)
+		app = sl.appender(sl.appenderCtx)
 		level.Debug(sl.l).Log("msg", "Append failed", "err", appErr)
 		// The append failed, probably due to a parse error or sample limit.
 		// Call sl.append again with an empty scrape to trigger stale markers.
 		if _, _, _, err := sl.append(app, []byte{}, "", appendTime); err != nil {
 			app.Rollback()
-			app = sl.appender(sl.parentCtx)
+			app = sl.appender(sl.appenderCtx)
 			level.Warn(sl.l).Log("msg", "Append failed", "err", err)
 		}
 	}
@@ -1375,8 +1394,8 @@ func (sl *scrapeLoop) endOfRunStaleness(last time.Time, ticker *time.Ticker, int
 	// Call sl.append again with an empty scrape to trigger stale markers.
 	// If the target has since been recreated and scraped, the
 	// stale markers will be out of order and ignored.
-	// sl.context would have been cancelled, hence using sl.parentCtx.
-	app := sl.appender(sl.parentCtx)
+	// sl.context would have been cancelled, hence using sl.appenderCtx.
+	app := sl.appender(sl.appenderCtx)
 	var err error
 	defer func() {
 		if err != nil {
@@ -1390,7 +1409,7 @@ func (sl *scrapeLoop) endOfRunStaleness(last time.Time, ticker *time.Ticker, int
 	}()
 	if _, _, _, err = sl.append(app, []byte{}, "", staleTime); err != nil {
 		app.Rollback()
-		app = sl.appender(sl.parentCtx)
+		app = sl.appender(sl.appenderCtx)
 		level.Warn(sl.l).Log("msg", "Stale append failed", "err", err)
 	}
 	if err = sl.reportStale(app, staleTime); err != nil {
@@ -1792,3 +1811,31 @@ func reusableCache(r, l *config.ScrapeConfig) bool {
 	}
 	return reflect.DeepEqual(zeroConfig(r), zeroConfig(l))
 }
+
+// CtxKey is a dedicated type for keys of context-embedded values propagated
+// with the scrape context.
+type ctxKey int
+
+// Valid CtxKey values.
+const (
+	ctxKeyMetadata ctxKey = iota + 1
+	ctxKeyTarget
+)
+
+func ContextWithMetricMetadataStore(ctx context.Context, s MetricMetadataStore) context.Context {
+	return context.WithValue(ctx, ctxKeyMetadata, s)
+}
+
+func MetricMetadataStoreFromContext(ctx context.Context) (MetricMetadataStore, bool) {
+	s, ok := ctx.Value(ctxKeyMetadata).(MetricMetadataStore)
+	return s, ok
+}
+
+func ContextWithTarget(ctx context.Context, t *Target) context.Context {
+	return context.WithValue(ctx, ctxKeyTarget, t)
+}
+
+func TargetFromContext(ctx context.Context) (*Target, bool) {
+	t, ok := ctx.Value(ctxKeyTarget).(*Target)
+	return t, ok
+}
diff --git a/scrape/scrape_test.go b/scrape/scrape_test.go
index 80cbf344a4..43200d4400 100644
--- a/scrape/scrape_test.go
+++ b/scrape/scrape_test.go
@@ -19,7 +19,6 @@ import (
 	"context"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"math"
 	"net/http"
 	"net/http/httptest"
@@ -57,7 +56,7 @@ func TestNewScrapePool(t *testing.T) {
 	var (
 		app   = &nopAppendable{}
 		cfg   = &config.ScrapeConfig{}
-		sp, _ = newScrapePool(cfg, app, 0, nil, false, nil)
+		sp, _ = newScrapePool(cfg, app, 0, nil, false, false, nil)
 	)
 
 	if a, ok := sp.appendable.(*nopAppendable); !ok || a != app {
@@ -92,7 +91,7 @@ func TestDroppedTargetsList(t *testing.T) {
 				},
 			},
 		}
-		sp, _                  = newScrapePool(cfg, app, 0, nil, false, nil)
+		sp, _                  = newScrapePool(cfg, app, 0, nil, false, false, nil)
 		expectedLabelSetString = "{__address__=\"127.0.0.1:9090\", __scrape_interval__=\"0s\", __scrape_timeout__=\"0s\", job=\"dropMe\"}"
 		expectedLength         = 1
 	)
@@ -455,7 +454,7 @@ func TestScrapePoolTargetLimit(t *testing.T) {
 func TestScrapePoolAppender(t *testing.T) {
 	cfg := &config.ScrapeConfig{}
 	app := &nopAppendable{}
-	sp, _ := newScrapePool(cfg, app, 0, nil, false, nil)
+	sp, _ := newScrapePool(cfg, app, 0, nil, false, false, nil)
 
 	loop := sp.newLoop(scrapeLoopOptions{
 		target: &Target{},
@@ -497,7 +496,7 @@ func TestScrapePoolRaces(t *testing.T) {
 	newConfig := func() *config.ScrapeConfig {
 		return &config.ScrapeConfig{ScrapeInterval: interval, ScrapeTimeout: timeout}
 	}
-	sp, _ := newScrapePool(newConfig(), &nopAppendable{}, 0, nil, false, nil)
+	sp, _ := newScrapePool(newConfig(), &nopAppendable{}, 0, nil, false, false, nil)
 	tgts := []*targetgroup.Group{
 		{
 			Targets: []model.LabelSet{
@@ -591,6 +590,9 @@ func TestScrapeLoopStopBeforeRun(t *testing.T) {
 		1,
 		0,
 		false,
+		nil,
+		nil,
+		false,
 	)
 
 	// The scrape pool synchronizes on stopping scrape loops. However, new scrape
@@ -660,6 +662,9 @@ func TestScrapeLoopStop(t *testing.T) {
 		10*time.Millisecond,
 		time.Hour,
 		false,
+		nil,
+		nil,
+		false,
 	)
 
 	// Terminate loop after 2 scrapes.
@@ -732,6 +737,9 @@ func TestScrapeLoopRun(t *testing.T) {
 		time.Second,
 		time.Hour,
 		false,
+		nil,
+		nil,
+		false,
 	)
 
 	// The loop must terminate during the initial offset if the context
@@ -784,6 +792,9 @@ func TestScrapeLoopRun(t *testing.T) {
 		time.Second,
 		100*time.Millisecond,
 		false,
+		nil,
+		nil,
+		false,
 	)
 
 	go func() {
@@ -840,6 +851,9 @@ func TestScrapeLoopForcedErr(t *testing.T) {
 		time.Second,
 		time.Hour,
 		false,
+		nil,
+		nil,
+		false,
 	)
 
 	forcedErr := fmt.Errorf("forced err")
@@ -895,6 +909,9 @@ func TestScrapeLoopMetadata(t *testing.T) {
 		0,
 		0,
 		false,
+		nil,
+		nil,
+		false,
 	)
 	defer cancel()
 
@@ -949,6 +966,9 @@ func simpleTestScrapeLoop(t testing.TB) (context.Context, *scrapeLoop) {
 		0,
 		0,
 		false,
+		nil,
+		nil,
+		false,
 	)
 	t.Cleanup(func() { cancel() })
 
@@ -1039,6 +1059,9 @@ func TestScrapeLoopRunCreatesStaleMarkersOnFailedScrape(t *testing.T) {
 		10*time.Millisecond,
 		time.Hour,
 		false,
+		nil,
+		nil,
+		false,
 	)
 	// Succeed once, several failures, then stop.
 	numScrapes := 0
@@ -1098,6 +1121,9 @@ func TestScrapeLoopRunCreatesStaleMarkersOnParseFailure(t *testing.T) {
 		10*time.Millisecond,
 		time.Hour,
 		false,
+		nil,
+		nil,
+		false,
 	)
 
 	// Succeed once, several failures, then stop.
@@ -1161,6 +1187,9 @@ func TestScrapeLoopCache(t *testing.T) {
 		10*time.Millisecond,
 		time.Hour,
 		false,
+		nil,
+		nil,
+		false,
 	)
 
 	numScrapes := 0
@@ -1240,6 +1269,9 @@ func TestScrapeLoopCacheMemoryExhaustionProtection(t *testing.T) {
 		10*time.Millisecond,
 		time.Hour,
 		false,
+		nil,
+		nil,
+		false,
 	)
 
 	numScrapes := 0
@@ -1351,6 +1383,9 @@ func TestScrapeLoopAppend(t *testing.T) {
 			0,
 			0,
 			false,
+			nil,
+			nil,
+			false,
 		)
 
 		now := time.Now()
@@ -1438,7 +1473,7 @@ func TestScrapeLoopAppendForConflictingPrefixedLabels(t *testing.T) {
 					return mutateSampleLabels(l, &Target{labels: labels.FromStrings(tc.targetLabels...)}, false, nil)
 				},
 				nil,
-				func(ctx context.Context) storage.Appender { return app }, nil, 0, true, 0, nil, 0, 0, false,
+				func(ctx context.Context) storage.Appender { return app }, nil, 0, true, 0, nil, 0, 0, false, nil, nil, false,
 			)
 			slApp := sl.appender(context.Background())
 			_, _, _, err := sl.append(slApp, []byte(tc.exposedLabels), "", time.Date(2000, 1, 1, 1, 0, 0, 0, time.UTC))
@@ -1474,6 +1509,9 @@ func TestScrapeLoopAppendCacheEntryButErrNotFound(t *testing.T) {
 		0,
 		0,
 		false,
+		nil,
+		nil,
+		false,
 	)
 
 	fakeRef := storage.SeriesRef(1)
@@ -1529,6 +1567,9 @@ func TestScrapeLoopAppendSampleLimit(t *testing.T) {
 		0,
 		0,
 		false,
+		nil,
+		nil,
+		false,
 	)
 
 	// Get the value of the Counter before performing the append.
@@ -1603,6 +1644,9 @@ func TestScrapeLoop_ChangingMetricString(t *testing.T) {
 		0,
 		0,
 		false,
+		nil,
+		nil,
+		false,
 	)
 
 	now := time.Now()
@@ -1648,6 +1692,9 @@ func TestScrapeLoopAppendStaleness(t *testing.T) {
 		0,
 		0,
 		false,
+		nil,
+		nil,
+		false,
 	)
 
 	now := time.Now()
@@ -1696,6 +1743,9 @@ func TestScrapeLoopAppendNoStalenessIfTimestamp(t *testing.T) {
 		0,
 		0,
 		false,
+		nil,
+		nil,
+		false,
 	)
 
 	now := time.Now()
@@ -1804,6 +1854,9 @@ metric_total{n="2"} 2 # {t="2"} 2.0 20000
 				0,
 				0,
 				false,
+				nil,
+				nil,
+				false,
 			)
 
 			now := time.Now()
@@ -1866,6 +1919,9 @@ func TestScrapeLoopAppendExemplarSeries(t *testing.T) {
 		0,
 		0,
 		false,
+		nil,
+		nil,
+		false,
 	)
 
 	now := time.Now()
@@ -1915,6 +1971,9 @@ func TestScrapeLoopRunReportsTargetDownOnScrapeError(t *testing.T) {
 		10*time.Millisecond,
 		time.Hour,
 		false,
+		nil,
+		nil,
+		false,
 	)
 
 	scraper.scrapeFunc = func(ctx context.Context, w io.Writer) error {
@@ -1948,6 +2007,9 @@ func TestScrapeLoopRunReportsTargetDownOnInvalidUTF8(t *testing.T) {
 		10*time.Millisecond,
 		time.Hour,
 		false,
+		nil,
+		nil,
+		false,
 	)
 
 	scraper.scrapeFunc = func(ctx context.Context, w io.Writer) error {
@@ -1994,6 +2056,9 @@ func TestScrapeLoopAppendGracefullyIfAmendOrOutOfOrderOrOutOfBounds(t *testing.T
 		0,
 		0,
 		false,
+		nil,
+		nil,
+		false,
 	)
 
 	now := time.Unix(1, 0)
@@ -2036,6 +2101,9 @@ func TestScrapeLoopOutOfBoundsTimeError(t *testing.T) {
 		0,
 		0,
 		false,
+		nil,
+		nil,
+		false,
 	)
 
 	now := time.Now().Add(20 * time.Minute)
@@ -2129,7 +2197,7 @@ func TestTargetScrapeScrapeCancel(t *testing.T) {
 	}()
 
 	go func() {
-		_, err := ts.scrape(ctx, ioutil.Discard)
+		_, err := ts.scrape(ctx, io.Discard)
 		if err == nil {
 			errc <- errors.New("Expected error but got nil")
 		} else if ctx.Err() != context.Canceled {
@@ -2173,7 +2241,7 @@ func TestTargetScrapeScrapeNotFound(t *testing.T) {
 		client: http.DefaultClient,
 	}
 
-	_, err = ts.scrape(context.Background(), ioutil.Discard)
+	_, err = ts.scrape(context.Background(), io.Discard)
 	require.Contains(t, err.Error(), "404", "Expected \"404 NotFound\" error but got: %s", err)
 }
 
@@ -2290,6 +2358,9 @@ func TestScrapeLoop_RespectTimestamps(t *testing.T) {
 		0,
 		0,
 		false,
+		nil,
+		nil,
+		false,
 	)
 
 	now := time.Now()
@@ -2328,6 +2399,9 @@ func TestScrapeLoop_DiscardTimestamps(t *testing.T) {
 		0,
 		0,
 		false,
+		nil,
+		nil,
+		false,
 	)
 
 	now := time.Now()
@@ -2365,6 +2439,9 @@ func TestScrapeLoopDiscardDuplicateLabels(t *testing.T) {
 		0,
 		0,
 		false,
+		nil,
+		nil,
+		false,
 	)
 	defer cancel()
 
@@ -2420,6 +2497,9 @@ func TestScrapeLoopDiscardUnnamedMetrics(t *testing.T) {
 		0,
 		0,
 		false,
+		nil,
+		nil,
+		false,
 	)
 	defer cancel()
 
@@ -2512,7 +2592,7 @@ func TestReuseScrapeCache(t *testing.T) {
 			ScrapeInterval: model.Duration(5 * time.Second),
 			MetricsPath:    "/metrics",
 		}
-		sp, _ = newScrapePool(cfg, app, 0, nil, false, nil)
+		sp, _ = newScrapePool(cfg, app, 0, nil, false, false, nil)
 		t1    = &Target{
 			discoveredLabels: labels.Labels{
 				labels.Label{
@@ -2693,6 +2773,9 @@ func TestScrapeAddFast(t *testing.T) {
 		0,
 		0,
 		false,
+		nil,
+		nil,
+		false,
 	)
 	defer cancel()
 
@@ -2722,7 +2805,7 @@ func TestReuseCacheRace(t *testing.T) {
 			ScrapeInterval: model.Duration(5 * time.Second),
 			MetricsPath:    "/metrics",
 		}
-		sp, _ = newScrapePool(cfg, app, 0, nil, false, nil)
+		sp, _ = newScrapePool(cfg, app, 0, nil, false, false, nil)
 		t1    = &Target{
 			discoveredLabels: labels.Labels{
 				labels.Label{
@@ -2781,6 +2864,9 @@ func TestScrapeReportSingleAppender(t *testing.T) {
 		10*time.Millisecond,
 		time.Hour,
 		false,
+		nil,
+		nil,
+		false,
 	)
 
 	numScrapes := 0
@@ -2851,7 +2937,7 @@ func TestScrapeReportLimit(t *testing.T) {
 	}))
 	defer ts.Close()
 
-	sp, err := newScrapePool(cfg, s, 0, nil, false, nil)
+	sp, err := newScrapePool(cfg, s, 0, nil, false, false, nil)
 	require.NoError(t, err)
 	defer sp.stop()
 
@@ -2980,6 +3066,9 @@ func TestScrapeLoopLabelLimit(t *testing.T) {
 			0,
 			0,
 			false,
+			nil,
+			nil,
+			false,
 		)
 
 		slApp := sl.appender(context.Background())
@@ -3018,7 +3107,7 @@ func TestTargetScrapeIntervalAndTimeoutRelabel(t *testing.T) {
 			},
 		},
 	}
-	sp, _ := newScrapePool(config, &nopAppendable{}, 0, nil, false, nil)
+	sp, _ := newScrapePool(config, &nopAppendable{}, 0, nil, false, false, nil)
 	tgts := []*targetgroup.Group{
 		{
 			Targets: []model.LabelSet{{model.AddressLabel: "127.0.0.1:9090"}},
diff --git a/scrape/target_test.go b/scrape/target_test.go
index 0e02dd8f97..f7733a5986 100644
--- a/scrape/target_test.go
+++ b/scrape/target_test.go
@@ -17,10 +17,10 @@ import (
 	"crypto/tls"
 	"crypto/x509"
 	"fmt"
-	"io/ioutil"
 	"net/http"
 	"net/http/httptest"
 	"net/url"
+	"os"
 	"strings"
 	"testing"
 	"time"
@@ -337,7 +337,7 @@ func TestNewHTTPWithBadServerName(t *testing.T) {
 func newTLSConfig(certName string, t *testing.T) *tls.Config {
 	tlsConfig := &tls.Config{}
 	caCertPool := x509.NewCertPool()
-	caCert, err := ioutil.ReadFile(caCertPath)
+	caCert, err := os.ReadFile(caCertPath)
 	if err != nil {
 		t.Fatalf("Couldn't set up TLS server: %v", err)
 	}
diff --git a/scripts/errcheck_excludes.txt b/scripts/errcheck_excludes.txt
index 92974d7a5f..8c77ca148d 100644
--- a/scripts/errcheck_excludes.txt
+++ b/scripts/errcheck_excludes.txt
@@ -1,4 +1,4 @@
-// Don't flag lines such as "io.Copy(ioutil.Discard, resp.Body)".
+// Don't flag lines such as "io.Copy(io.Discard, resp.Body)".
 io.Copy
 // The next two are used in HTTP handlers, any error is handled by the server itself.
 io.WriteString
diff --git a/storage/remote/client.go b/storage/remote/client.go
index 622d5e91a6..7120822d95 100644
--- a/storage/remote/client.go
+++ b/storage/remote/client.go
@@ -19,7 +19,6 @@ import (
 	"context"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"net/http"
 	"strconv"
 	"strings"
@@ -213,7 +212,7 @@ func (c *Client) Store(ctx context.Context, req []byte) error {
 		return RecoverableError{err, defaultBackoff}
 	}
 	defer func() {
-		io.Copy(ioutil.Discard, httpResp.Body)
+		io.Copy(io.Discard, httpResp.Body)
 		httpResp.Body.Close()
 	}()
 
@@ -300,13 +299,13 @@ func (c *Client) Read(ctx context.Context, query *prompb.Query) (*prompb.QueryRe
 		return nil, errors.Wrap(err, "error sending request")
 	}
 	defer func() {
-		io.Copy(ioutil.Discard, httpResp.Body)
+		io.Copy(io.Discard, httpResp.Body)
 		httpResp.Body.Close()
 	}()
 	c.readQueriesDuration.Observe(time.Since(start).Seconds())
 	c.readQueriesTotal.WithLabelValues(strconv.Itoa(httpResp.StatusCode)).Inc()
 
-	compressed, err = ioutil.ReadAll(httpResp.Body)
+	compressed, err = io.ReadAll(httpResp.Body)
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("error reading response. HTTP status code: %s", httpResp.Status))
 	}
diff --git a/storage/remote/codec.go b/storage/remote/codec.go
index fb4d777a34..f56fc6760f 100644
--- a/storage/remote/codec.go
+++ b/storage/remote/codec.go
@@ -16,7 +16,6 @@ package remote
 import (
 	"fmt"
 	"io"
-	"io/ioutil"
 	"net/http"
 	"sort"
 	"strings"
@@ -52,7 +51,7 @@ func (e HTTPError) Status() int {
 
 // DecodeReadRequest reads a remote.Request from a http.Request.
 func DecodeReadRequest(r *http.Request) (*prompb.ReadRequest, error) {
-	compressed, err := ioutil.ReadAll(io.LimitReader(r.Body, decodeReadLimit))
+	compressed, err := io.ReadAll(io.LimitReader(r.Body, decodeReadLimit))
 	if err != nil {
 		return nil, err
 	}
@@ -524,7 +523,7 @@ func metricTypeToMetricTypeProto(t textparse.MetricType) prompb.MetricMetadata_M
 // DecodeWriteRequest from an io.Reader into a prompb.WriteRequest, handling
 // snappy decompression.
 func DecodeWriteRequest(r io.Reader) (*prompb.WriteRequest, error) {
-	compressed, err := ioutil.ReadAll(r)
+	compressed, err := io.ReadAll(r)
 	if err != nil {
 		return nil, err
 	}
diff --git a/storage/remote/queue_manager.go b/storage/remote/queue_manager.go
index 215537e4f0..420a2d11ae 100644
--- a/storage/remote/queue_manager.go
+++ b/storage/remote/queue_manager.go
@@ -374,13 +374,17 @@ type QueueManager struct {
 	highestRecvTimestamp *maxTimestamp
 }
 
-// NewQueueManager builds a new QueueManager.
+// NewQueueManager builds a new QueueManager and starts a new
+// WAL watcher with queue manager as the WriteTo destination.
+// The WAL watcher takes the dir parameter as the base directory
+// for where the WAL shall be located. Note that the full path to
+// the WAL directory will be constructed as /wal.
 func NewQueueManager(
 	metrics *queueManagerMetrics,
 	watcherMetrics *wal.WatcherMetrics,
 	readerMetrics *wal.LiveReaderMetrics,
 	logger log.Logger,
-	walDir string,
+	dir string,
 	samplesIn *ewmaRate,
 	cfg config.QueueConfig,
 	mCfg config.MetadataConfig,
@@ -426,7 +430,7 @@ func NewQueueManager(
 		highestRecvTimestamp: highestRecvTimestamp,
 	}
 
-	t.watcher = wal.NewWatcher(watcherMetrics, readerMetrics, logger, client.Name(), t, walDir, enableExemplarRemoteWrite)
+	t.watcher = wal.NewWatcher(watcherMetrics, readerMetrics, logger, client.Name(), t, dir, enableExemplarRemoteWrite)
 	if t.mcfg.Send {
 		t.metadataWatcher = NewMetadataWatcher(logger, sm, client.Name(), t, t.mcfg.SendInterval, flushDeadline)
 	}
@@ -1116,21 +1120,35 @@ func (q *queue) ReturnForReuse(batch []sampleOrExemplar) {
 // FlushAndShutdown stops the queue and flushes any samples. No appends can be
 // made after this is called.
 func (q *queue) FlushAndShutdown(done <-chan struct{}) {
-	q.batchMtx.Lock()
-	defer q.batchMtx.Unlock()
-
-	if len(q.batch) > 0 {
-		select {
-		case q.batchQueue <- q.batch:
-		case <-done:
-			// The shard has been hard shut down, so no more samples can be
-			// sent. Drop everything left in the queue.
-		}
+	for q.tryEnqueueingBatch(done) {
+		time.Sleep(time.Second)
 	}
 	q.batch = nil
 	close(q.batchQueue)
 }
 
+// tryEnqueueingBatch tries to send a batch if necessary. If sending needs to
+// be retried it will return true.
+func (q *queue) tryEnqueueingBatch(done <-chan struct{}) bool {
+	q.batchMtx.Lock()
+	defer q.batchMtx.Unlock()
+	if len(q.batch) == 0 {
+		return false
+	}
+
+	select {
+	case q.batchQueue <- q.batch:
+		return false
+	case <-done:
+		// The shard has been hard shut down, so no more samples can be sent.
+		// No need to try again as we will drop everything left in the queue.
+		return false
+	default:
+		// The batchQueue is full, so we need to try again later.
+		return true
+	}
+}
+
 func (q *queue) newBatch(capacity int) []sampleOrExemplar {
 	q.poolMtx.Lock()
 	defer q.poolMtx.Unlock()
diff --git a/storage/remote/queue_manager_test.go b/storage/remote/queue_manager_test.go
index 0f8f9f4495..cb5cee9a44 100644
--- a/storage/remote/queue_manager_test.go
+++ b/storage/remote/queue_manager_test.go
@@ -16,7 +16,6 @@ package remote
 import (
 	"context"
 	"fmt"
-	"io/ioutil"
 	"math"
 	"net/url"
 	"os"
@@ -824,7 +823,7 @@ func BenchmarkStartup(b *testing.B) {
 
 	// Find the second largest segment; we will replay up to this.
 	// (Second largest as WALWatcher will start tailing the largest).
-	dirents, err := ioutil.ReadDir(dir)
+	dirents, err := os.ReadDir(dir)
 	require.NoError(b, err)
 
 	var segments []int
@@ -1183,3 +1182,29 @@ func TestQueueManagerMetrics(t *testing.T) {
 	err = client_testutil.GatherAndCompare(reg, strings.NewReader(""))
 	require.NoError(t, err)
 }
+
+func TestQueue_FlushAndShutdownDoesNotDeadlock(t *testing.T) {
+	capacity := 100
+	batchSize := 10
+	queue := newQueue(batchSize, capacity)
+	for i := 0; i < capacity+batchSize; i++ {
+		queue.Append(sampleOrExemplar{})
+	}
+
+	done := make(chan struct{})
+	go queue.FlushAndShutdown(done)
+	go func() {
+		// Give enough time for FlushAndShutdown to acquire the lock. queue.Batch()
+		// should not block forever even if the lock is acquired.
+		time.Sleep(10 * time.Millisecond)
+		queue.Batch()
+		close(done)
+	}()
+	select {
+	case <-done:
+	case <-time.After(2 * time.Second):
+		t.Error("Deadlock in FlushAndShutdown detected")
+		pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
+		t.FailNow()
+	}
+}
diff --git a/storage/remote/read_handler_test.go b/storage/remote/read_handler_test.go
index 86edbe0b97..f3447c9188 100644
--- a/storage/remote/read_handler_test.go
+++ b/storage/remote/read_handler_test.go
@@ -16,7 +16,6 @@ package remote
 import (
 	"bytes"
 	"io"
-	"io/ioutil"
 	"net/http"
 	"net/http/httptest"
 	"testing"
@@ -49,8 +48,8 @@ func TestSampledReadEndpoint(t *testing.T) {
 			GlobalConfig: config.GlobalConfig{
 				ExternalLabels: labels.Labels{
 					// We expect external labels to be added, with the source labels honored.
-					{Name: "baz", Value: "a"},
 					{Name: "b", Value: "c"},
+					{Name: "baz", Value: "a"},
 					{Name: "d", Value: "e"},
 				},
 			},
@@ -84,7 +83,7 @@ func TestSampledReadEndpoint(t *testing.T) {
 	require.Equal(t, "snappy", recorder.Result().Header.Get("Content-Encoding"))
 
 	// Decode the response.
-	compressed, err = ioutil.ReadAll(recorder.Result().Body)
+	compressed, err = io.ReadAll(recorder.Result().Body)
 	require.NoError(t, err)
 
 	uncompressed, err := snappy.Decode(nil, compressed)
diff --git a/storage/remote/read_test.go b/storage/remote/read_test.go
index e2d4e18092..6681b9e970 100644
--- a/storage/remote/read_test.go
+++ b/storage/remote/read_test.go
@@ -141,8 +141,8 @@ func TestExternalLabelsQuerierAddExternalLabels(t *testing.T) {
 		},
 		{
 			el: labels.Labels{
-				{Name: "region", Value: "europe"},
 				{Name: "dc", Value: "berlin-01"},
+				{Name: "region", Value: "europe"},
 			},
 			inMatchers: []*labels.Matcher{
 				labels.MustNewMatcher(labels.MatchEqual, "job", "api-server"),
diff --git a/storage/remote/write.go b/storage/remote/write.go
index bd330fe8b4..a7399ee532 100644
--- a/storage/remote/write.go
+++ b/storage/remote/write.go
@@ -55,7 +55,7 @@ type WriteStorage struct {
 	watcherMetrics    *wal.WatcherMetrics
 	liveReaderMetrics *wal.LiveReaderMetrics
 	externalLabels    labels.Labels
-	walDir            string
+	dir               string
 	queues            map[string]*QueueManager
 	samplesIn         *ewmaRate
 	flushDeadline     time.Duration
@@ -68,7 +68,7 @@ type WriteStorage struct {
 }
 
 // NewWriteStorage creates and runs a WriteStorage.
-func NewWriteStorage(logger log.Logger, reg prometheus.Registerer, walDir string, flushDeadline time.Duration, sm ReadyScrapeManager) *WriteStorage {
+func NewWriteStorage(logger log.Logger, reg prometheus.Registerer, dir string, flushDeadline time.Duration, sm ReadyScrapeManager) *WriteStorage {
 	if logger == nil {
 		logger = log.NewNopLogger()
 	}
@@ -80,7 +80,7 @@ func NewWriteStorage(logger log.Logger, reg prometheus.Registerer, walDir string
 		reg:               reg,
 		flushDeadline:     flushDeadline,
 		samplesIn:         newEWMARate(ewmaWeight, shardUpdateDuration),
-		walDir:            walDir,
+		dir:               dir,
 		interner:          newPool(),
 		scraper:           sm,
 		quit:              make(chan struct{}),
@@ -175,7 +175,7 @@ func (rws *WriteStorage) ApplyConfig(conf *config.Config) error {
 			rws.watcherMetrics,
 			rws.liveReaderMetrics,
 			rws.logger,
-			rws.walDir,
+			rws.dir,
 			rws.samplesIn,
 			rwConf.QueueConfig,
 			rwConf.MetadataConfig,
diff --git a/storage/remote/write_handler_test.go b/storage/remote/write_handler_test.go
index 5eb17d3b87..459910992f 100644
--- a/storage/remote/write_handler_test.go
+++ b/storage/remote/write_handler_test.go
@@ -17,7 +17,7 @@ import (
 	"bytes"
 	"context"
 	"fmt"
-	"io/ioutil"
+	"io"
 	"net/http"
 	"net/http/httptest"
 	"testing"
@@ -128,7 +128,7 @@ func TestCommitErr(t *testing.T) {
 	handler.ServeHTTP(recorder, req)
 
 	resp := recorder.Result()
-	body, err := ioutil.ReadAll(resp.Body)
+	body, err := io.ReadAll(resp.Body)
 	require.NoError(t, err)
 	require.Equal(t, http.StatusInternalServerError, resp.StatusCode)
 	require.Equal(t, "commit error\n", string(body))
diff --git a/template/template.go b/template/template.go
index 6962639986..0b1659ce02 100644
--- a/template/template.go
+++ b/template/template.go
@@ -16,6 +16,7 @@ package template
 import (
 	"bytes"
 	"context"
+	"errors"
 	"fmt"
 	html_template "html/template"
 	"math"
@@ -28,7 +29,6 @@ import (
 	"time"
 
 	"github.com/grafana/regexp"
-	"github.com/pkg/errors"
 	"github.com/prometheus/client_golang/prometheus"
 	"github.com/prometheus/common/model"
 
@@ -196,6 +196,21 @@ func NewTemplateExpander(
 				}
 				return host
 			},
+			"stripDomain": func(hostPort string) string {
+				host, port, err := net.SplitHostPort(hostPort)
+				if err != nil {
+					host = hostPort
+				}
+				ip := net.ParseIP(host)
+				if ip != nil {
+					return hostPort
+				}
+				host = strings.Split(host, ".")[0]
+				if port != "" {
+					return net.JoinHostPort(host, port)
+				}
+				return host
+			},
 			"humanize": func(i interface{}) (string, error) {
 				v, err := convertToFloat(i)
 				if err != nil {
@@ -360,7 +375,7 @@ func (te Expander) Expand() (result string, resultErr error) {
 			var ok bool
 			resultErr, ok = r.(error)
 			if !ok {
-				resultErr = errors.Errorf("panic expanding template %v: %v", te.name, r)
+				resultErr = fmt.Errorf("panic expanding template %v: %v", te.name, r)
 			}
 		}
 		if resultErr != nil {
@@ -374,12 +389,12 @@ func (te Expander) Expand() (result string, resultErr error) {
 	tmpl.Option(te.options...)
 	tmpl, err := tmpl.Parse(te.text)
 	if err != nil {
-		return "", errors.Wrapf(err, "error parsing template %v", te.name)
+		return "", fmt.Errorf("error parsing template %v: %w", te.name, err)
 	}
 	var buffer bytes.Buffer
 	err = tmpl.Execute(&buffer, te.data)
 	if err != nil {
-		return "", errors.Wrapf(err, "error executing template %v", te.name)
+		return "", fmt.Errorf("error executing template %v: %w", te.name, err)
 	}
 	return buffer.String(), nil
 }
@@ -391,7 +406,7 @@ func (te Expander) ExpandHTML(templateFiles []string) (result string, resultErr
 			var ok bool
 			resultErr, ok = r.(error)
 			if !ok {
-				resultErr = errors.Errorf("panic expanding template %s: %v", te.name, r)
+				resultErr = fmt.Errorf("panic expanding template %s: %v", te.name, r)
 			}
 		}
 	}()
@@ -407,18 +422,18 @@ func (te Expander) ExpandHTML(templateFiles []string) (result string, resultErr
 	})
 	tmpl, err := tmpl.Parse(te.text)
 	if err != nil {
-		return "", errors.Wrapf(err, "error parsing template %v", te.name)
+		return "", fmt.Errorf("error parsing template %v: %w", te.name, err)
 	}
 	if len(templateFiles) > 0 {
 		_, err = tmpl.ParseFiles(templateFiles...)
 		if err != nil {
-			return "", errors.Wrapf(err, "error parsing template files for %v", te.name)
+			return "", fmt.Errorf("error parsing template files for %v: %w", te.name, err)
 		}
 	}
 	var buffer bytes.Buffer
 	err = tmpl.Execute(&buffer, te.data)
 	if err != nil {
-		return "", errors.Wrapf(err, "error executing template %v", te.name)
+		return "", fmt.Errorf("error executing template %v: %w", te.name, err)
 	}
 	return buffer.String(), nil
 }
diff --git a/template/template_test.go b/template/template_test.go
index 342a951122..45d1a66e74 100644
--- a/template/template_test.go
+++ b/template/template_test.go
@@ -480,6 +480,41 @@ func TestTemplateExpansion(t *testing.T) {
 			text:   "{{ printf \"%0.2f\" (parseDuration \"1h2m10ms\") }}",
 			output: "3720.01",
 		},
+		{
+			// Simple hostname.
+			text:   "{{ \"foo.example.com\" | stripDomain }}",
+			output: "foo",
+		},
+		{
+			// Hostname with port.
+			text:   "{{ \"foo.example.com:12345\" | stripDomain }}",
+			output: "foo:12345",
+		},
+		{
+			// Simple IPv4 address.
+			text:   "{{ \"192.0.2.1\" | stripDomain }}",
+			output: "192.0.2.1",
+		},
+		{
+			// IPv4 address with port.
+			text:   "{{ \"192.0.2.1:12345\" | stripDomain }}",
+			output: "192.0.2.1:12345",
+		},
+		{
+			// Simple IPv6 address.
+			text:   "{{ \"2001:0DB8::1\" | stripDomain }}",
+			output: "2001:0DB8::1",
+		},
+		{
+			// IPv6 address with port.
+			text:   "{{ \"[2001:0DB8::1]:12345\" | stripDomain }}",
+			output: "[2001:0DB8::1]:12345",
+		},
+		{
+			// Value can't be split into host and port.
+			text:   "{{ \"[2001:0DB8::1]::12345\" | stripDomain }}",
+			output: "[2001:0DB8::1]::12345",
+		},
 	})
 }
 
diff --git a/tracing/tracing.go b/tracing/tracing.go
index f5ec289554..7728dcb1dc 100644
--- a/tracing/tracing.go
+++ b/tracing/tracing.go
@@ -15,12 +15,12 @@ package tracing
 
 import (
 	"context"
+	"fmt"
 	"reflect"
 	"time"
 
 	"github.com/go-kit/log"
 	"github.com/go-kit/log/level"
-	"github.com/pkg/errors"
 	config_util "github.com/prometheus/common/config"
 	"github.com/prometheus/common/version"
 	"go.opentelemetry.io/otel"
@@ -30,7 +30,7 @@ import (
 	"go.opentelemetry.io/otel/propagation"
 	"go.opentelemetry.io/otel/sdk/resource"
 	tracesdk "go.opentelemetry.io/otel/sdk/trace"
-	semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
+	semconv "go.opentelemetry.io/otel/semconv/v1.10.0"
 	"go.opentelemetry.io/otel/trace"
 	"google.golang.org/grpc/credentials"
 
@@ -79,7 +79,7 @@ func (m *Manager) ApplyConfig(cfg *config.Config) error {
 
 	if m.shutdownFunc != nil {
 		if err := m.shutdownFunc(); err != nil {
-			return errors.Wrap(err, "failed to shut down the tracer provider")
+			return fmt.Errorf("failed to shut down the tracer provider: %w", err)
 		}
 	}
 
@@ -94,7 +94,7 @@ func (m *Manager) ApplyConfig(cfg *config.Config) error {
 
 	tp, shutdownFunc, err := buildTracerProvider(context.Background(), cfg.TracingConfig)
 	if err != nil {
-		return errors.Wrap(err, "failed to install a new tracer provider")
+		return fmt.Errorf("failed to install a new tracer provider: %w", err)
 	}
 
 	m.shutdownFunc = shutdownFunc
diff --git a/tsdb/README.md b/tsdb/README.md
index a8dfdc5406..ad9354586c 100644
--- a/tsdb/README.md
+++ b/tsdb/README.md
@@ -1,13 +1,10 @@
 # TSDB 
 
-[![GoPkg](https://pkg.go.dev/badge/github.com/prometheus/prometheus/tsdb.svg)](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb)
+[![GoPkg](https://pkg.go.dev/badge/github.com/prometheus/prometheus/tsdb.svg)](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb)
 
 This directory contains the Prometheus TSDB (Time Series DataBase) library,
 which handles storage and querying of all Prometheus v2 data.
 
-Due to an issue with versioning, the "latest" docs shown on Godoc are outdated.
-Instead you may use [the docs for v2.31.1](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab)
-
 ## Documentation
 
 * [Data format](docs/format/README.md).
diff --git a/tsdb/agent/db_test.go b/tsdb/agent/db_test.go
index a8acb64693..080913a866 100644
--- a/tsdb/agent/db_test.go
+++ b/tsdb/agent/db_test.go
@@ -457,8 +457,8 @@ func labelsForTest(lName string, seriesCount int) []labels.Labels {
 	for i := 0; i < seriesCount; i++ {
 		lset := labels.Labels{
 			{Name: "a", Value: lName},
-			{Name: "job", Value: "prometheus"},
 			{Name: "instance", Value: "localhost" + strconv.Itoa(i)},
+			{Name: "job", Value: "prometheus"},
 		}
 		series = append(series, lset)
 	}
diff --git a/tsdb/block.go b/tsdb/block.go
index b98d35d98e..9b3c91082d 100644
--- a/tsdb/block.go
+++ b/tsdb/block.go
@@ -17,7 +17,6 @@ package tsdb
 import (
 	"encoding/json"
 	"io"
-	"io/ioutil"
 	"os"
 	"path/filepath"
 	"sort"
@@ -41,8 +40,8 @@ import (
 // IndexWriter serializes the index for a block of series data.
 // The methods must be called in the order they are specified in.
 type IndexWriter interface {
-	// AddSymbols registers all string symbols that are encountered in series
-	// and other indices. Symbols must be added in sorted order.
+	// AddSymbol registers a single symbol.
+	// Symbols must be registered in sorted order.
 	AddSymbol(sym string) error
 
 	// AddSeries populates the index writer with a series and its offsets
@@ -212,7 +211,7 @@ const (
 func chunkDir(dir string) string { return filepath.Join(dir, "chunks") }
 
 func readMetaFile(dir string) (*BlockMeta, int64, error) {
-	b, err := ioutil.ReadFile(filepath.Join(dir, metaFilename))
+	b, err := os.ReadFile(filepath.Join(dir, metaFilename))
 	if err != nil {
 		return nil, 0, err
 	}
@@ -662,7 +661,7 @@ func (pb *Block) Snapshot(dir string) error {
 
 	// Hardlink the chunks
 	curChunkDir := chunkDir(pb.dir)
-	files, err := ioutil.ReadDir(curChunkDir)
+	files, err := os.ReadDir(curChunkDir)
 	if err != nil {
 		return errors.Wrap(err, "ReadDir the current chunk dir")
 	}
diff --git a/tsdb/block_test.go b/tsdb/block_test.go
index b068cb8240..10aeebea95 100644
--- a/tsdb/block_test.go
+++ b/tsdb/block_test.go
@@ -203,8 +203,8 @@ func TestLabelValuesWithMatchers(t *testing.T) {
 	var seriesEntries []storage.Series
 	for i := 0; i < 100; i++ {
 		seriesEntries = append(seriesEntries, storage.NewListSeries(labels.Labels{
-			{Name: "unique", Value: fmt.Sprintf("value%d", i)},
 			{Name: "tens", Value: fmt.Sprintf("value%d", i/10)},
+			{Name: "unique", Value: fmt.Sprintf("value%d", i)},
 		}, []tsdbutil.Sample{sample{100, 0}}))
 	}
 
@@ -360,10 +360,12 @@ func BenchmarkLabelValuesWithMatchers(b *testing.B) {
 	var seriesEntries []storage.Series
 	metricCount := 1000000
 	for i := 0; i < metricCount; i++ {
+		// Note these series are not created in sort order: 'value2' sorts after 'value10'.
+		// This makes a big difference to the benchmark timing.
 		seriesEntries = append(seriesEntries, storage.NewListSeries(labels.Labels{
-			{Name: "unique", Value: fmt.Sprintf("value%d", i)},
-			{Name: "tens", Value: fmt.Sprintf("value%d", i/(metricCount/10))},
-			{Name: "ninety", Value: fmt.Sprintf("value%d", i/(metricCount/10)/9)}, // "0" for the first 90%, then "1"
+			{Name: "a_unique", Value: fmt.Sprintf("value%d", i)},
+			{Name: "b_tens", Value: fmt.Sprintf("value%d", i/(metricCount/10))},
+			{Name: "c_ninety", Value: fmt.Sprintf("value%d", i/(metricCount/10)/9)}, // "0" for the first 90%, then "1"
 		}, []tsdbutil.Sample{sample{100, 0}}))
 	}
 
@@ -381,13 +383,13 @@ func BenchmarkLabelValuesWithMatchers(b *testing.B) {
 	require.NoError(b, err)
 	defer func() { require.NoError(b, indexReader.Close()) }()
 
-	matchers := []*labels.Matcher{labels.MustNewMatcher(labels.MatchEqual, "ninety", "value0")}
+	matchers := []*labels.Matcher{labels.MustNewMatcher(labels.MatchEqual, "c_ninety", "value0")}
 
 	b.ResetTimer()
 	b.ReportAllocs()
 
 	for benchIdx := 0; benchIdx < b.N; benchIdx++ {
-		actualValues, err := indexReader.LabelValues("tens", matchers...)
+		actualValues, err := indexReader.LabelValues("b_tens", matchers...)
 		require.NoError(b, err)
 		require.Equal(b, 9, len(actualValues))
 	}
@@ -404,16 +406,16 @@ func TestLabelNamesWithMatchers(t *testing.T) {
 
 		if i%10 == 0 {
 			seriesEntries = append(seriesEntries, storage.NewListSeries(labels.Labels{
-				{Name: "unique", Value: fmt.Sprintf("value%d", i)},
 				{Name: "tens", Value: fmt.Sprintf("value%d", i/10)},
+				{Name: "unique", Value: fmt.Sprintf("value%d", i)},
 			}, []tsdbutil.Sample{sample{100, 0}}))
 		}
 
 		if i%20 == 0 {
 			seriesEntries = append(seriesEntries, storage.NewListSeries(labels.Labels{
-				{Name: "unique", Value: fmt.Sprintf("value%d", i)},
 				{Name: "tens", Value: fmt.Sprintf("value%d", i/10)},
 				{Name: "twenties", Value: fmt.Sprintf("value%d", i/20)},
+				{Name: "unique", Value: fmt.Sprintf("value%d", i)},
 			}, []tsdbutil.Sample{sample{100, 0}}))
 		}
 
diff --git a/tsdb/blockwriter.go b/tsdb/blockwriter.go
index 064cd01c7e..09b355368d 100644
--- a/tsdb/blockwriter.go
+++ b/tsdb/blockwriter.go
@@ -15,7 +15,6 @@ package tsdb
 
 import (
 	"context"
-	"io/ioutil"
 	"math"
 	"os"
 
@@ -64,7 +63,7 @@ func NewBlockWriter(logger log.Logger, dir string, blockSize int64) (*BlockWrite
 
 // initHead creates and initialises a new TSDB head.
 func (w *BlockWriter) initHead() error {
-	chunkDir, err := ioutil.TempDir(os.TempDir(), "head")
+	chunkDir, err := os.MkdirTemp(os.TempDir(), "head")
 	if err != nil {
 		return errors.Wrap(err, "create temp dir")
 	}
diff --git a/tsdb/chunks/chunks.go b/tsdb/chunks/chunks.go
index 2f565fcb17..72cb0311bc 100644
--- a/tsdb/chunks/chunks.go
+++ b/tsdb/chunks/chunks.go
@@ -15,13 +15,11 @@ package chunks
 
 import (
 	"bufio"
-	"bytes"
 	"encoding/binary"
 	"fmt"
 	"hash"
 	"hash/crc32"
 	"io"
-	"io/ioutil"
 	"os"
 	"path/filepath"
 	"strconv"
@@ -167,6 +165,17 @@ func newCRC32() hash.Hash32 {
 	return crc32.New(castagnoliTable)
 }
 
+// Check if the CRC of data matches that stored in sum, computed when the chunk was stored.
+func checkCRC32(data, sum []byte) error {
+	got := crc32.Checksum(data, castagnoliTable)
+	// This combination of shifts is the inverse of digest.Sum() in go/src/hash/crc32.
+	want := uint32(sum[0])<<24 + uint32(sum[1])<<16 + uint32(sum[2])<<8 + uint32(sum[3])
+	if got != want {
+		return errors.Errorf("checksum mismatch expected:%x, actual:%x", want, got)
+	}
+	return nil
+}
+
 // Writer implements the ChunkWriter interface for the standard
 // serialization format.
 type Writer struct {
@@ -548,7 +557,6 @@ func (s *Reader) Size() int64 {
 // Chunk returns a chunk from a given reference.
 func (s *Reader) Chunk(ref ChunkRef) (chunkenc.Chunk, error) {
 	sgmIndex, chkStart := BlockChunkRef(ref).Unpack()
-	chkCRC32 := newCRC32()
 
 	if sgmIndex >= len(s.bs) {
 		return nil, errors.Errorf("segment index %d out of range", sgmIndex)
@@ -577,21 +585,17 @@ func (s *Reader) Chunk(ref ChunkRef) (chunkenc.Chunk, error) {
 	}
 
 	sum := sgmBytes.Range(chkDataEnd, chkEnd)
-	if _, err := chkCRC32.Write(sgmBytes.Range(chkEncStart, chkDataEnd)); err != nil {
+	if err := checkCRC32(sgmBytes.Range(chkEncStart, chkDataEnd), sum); err != nil {
 		return nil, err
 	}
 
-	if act := chkCRC32.Sum(nil); !bytes.Equal(act, sum) {
-		return nil, errors.Errorf("checksum mismatch expected:%x, actual:%x", sum, act)
-	}
-
 	chkData := sgmBytes.Range(chkDataStart, chkDataEnd)
 	chkEnc := sgmBytes.Range(chkEncStart, chkEncStart+ChunkEncodingSize)[0]
 	return s.pool.Get(chunkenc.Encoding(chkEnc), chkData)
 }
 
 func nextSequenceFile(dir string) (string, int, error) {
-	files, err := ioutil.ReadDir(dir)
+	files, err := os.ReadDir(dir)
 	if err != nil {
 		return "", 0, err
 	}
@@ -617,7 +621,7 @@ func segmentFile(baseDir string, index int) string {
 }
 
 func sequenceFiles(dir string) ([]string, error) {
-	files, err := ioutil.ReadDir(dir)
+	files, err := os.ReadDir(dir)
 	if err != nil {
 		return nil, err
 	}
diff --git a/tsdb/chunks/head_chunks.go b/tsdb/chunks/head_chunks.go
index 1bb7e14cbe..79c3caf504 100644
--- a/tsdb/chunks/head_chunks.go
+++ b/tsdb/chunks/head_chunks.go
@@ -19,7 +19,6 @@ import (
 	"encoding/binary"
 	"hash"
 	"io"
-	"io/ioutil"
 	"os"
 	"path/filepath"
 	"sort"
@@ -330,7 +329,7 @@ func (cdm *ChunkDiskMapper) openMMapFiles() (returnErr error) {
 }
 
 func listChunkFiles(dir string) (map[int]string, error) {
-	files, err := ioutil.ReadDir(dir)
+	files, err := os.ReadDir(dir)
 	if err != nil {
 		return nil, err
 	}
@@ -658,7 +657,7 @@ func (cdm *ChunkDiskMapper) Chunk(ref ChunkDiskMapperRef) (chunkenc.Chunk, error
 		return nil, &CorruptionErr{
 			Dir:       cdm.dir.Name(),
 			FileIndex: sgmIndex,
-			Err:       errors.New("head chunk file index %d does not exist on disk"),
+			Err:       errors.Errorf("head chunk file index %d does not exist on disk", sgmIndex),
 		}
 	}
 
diff --git a/tsdb/chunks/head_chunks_test.go b/tsdb/chunks/head_chunks_test.go
index 2e650ab14e..88dae4f98f 100644
--- a/tsdb/chunks/head_chunks_test.go
+++ b/tsdb/chunks/head_chunks_test.go
@@ -15,7 +15,6 @@ package chunks
 
 import (
 	"encoding/binary"
-	"io/ioutil"
 	"math/rand"
 	"os"
 	"strconv"
@@ -124,7 +123,7 @@ func TestChunkDiskMapper_WriteChunk_Chunk_IterateChunks(t *testing.T) {
 	require.Equal(t, 3, len(hrw.mmappedChunkFiles), "expected 3 mmapped files, got %d", len(hrw.mmappedChunkFiles))
 	require.Equal(t, len(hrw.mmappedChunkFiles), len(hrw.closers))
 
-	actualBytes, err := ioutil.ReadFile(firstFileName)
+	actualBytes, err := os.ReadFile(firstFileName)
 	require.NoError(t, err)
 
 	// Check header of the segment file.
@@ -240,7 +239,7 @@ func TestChunkDiskMapper_Truncate(t *testing.T) {
 	verifyFiles := func(remainingFiles []int) {
 		t.Helper()
 
-		files, err := ioutil.ReadDir(hrw.dir.Name())
+		files, err := os.ReadDir(hrw.dir.Name())
 		require.NoError(t, err)
 		require.Equal(t, len(remainingFiles), len(files), "files on disk")
 		require.Equal(t, len(remainingFiles), len(hrw.mmappedChunkFiles), "hrw.mmappedChunkFiles")
@@ -358,7 +357,7 @@ func TestChunkDiskMapper_Truncate_PreservesFileSequence(t *testing.T) {
 	verifyFiles := func(remainingFiles []int) {
 		t.Helper()
 
-		files, err := ioutil.ReadDir(hrw.dir.Name())
+		files, err := os.ReadDir(hrw.dir.Name())
 		require.NoError(t, err)
 		require.Equal(t, len(remainingFiles), len(files), "files on disk")
 		require.Equal(t, len(remainingFiles), len(hrw.mmappedChunkFiles), "hrw.mmappedChunkFiles")
@@ -492,7 +491,7 @@ func TestHeadReadWriter_ReadRepairOnEmptyLastFile(t *testing.T) {
 	}
 
 	// Removed even from disk.
-	files, err := ioutil.ReadDir(dir)
+	files, err := os.ReadDir(dir)
 	require.NoError(t, err)
 	require.Equal(t, 3, len(files))
 	for _, fi := range files {
diff --git a/tsdb/chunks/old_head_chunks_test.go b/tsdb/chunks/old_head_chunks_test.go
index d81ef3df22..834e427e14 100644
--- a/tsdb/chunks/old_head_chunks_test.go
+++ b/tsdb/chunks/old_head_chunks_test.go
@@ -16,7 +16,6 @@ package chunks
 import (
 	"encoding/binary"
 	"errors"
-	"io/ioutil"
 	"math/rand"
 	"os"
 	"strconv"
@@ -108,7 +107,7 @@ func TestOldChunkDiskMapper_WriteChunk_Chunk_IterateChunks(t *testing.T) {
 	require.Equal(t, 3, len(hrw.mmappedChunkFiles), "expected 3 mmapped files, got %d", len(hrw.mmappedChunkFiles))
 	require.Equal(t, len(hrw.mmappedChunkFiles), len(hrw.closers))
 
-	actualBytes, err := ioutil.ReadFile(firstFileName)
+	actualBytes, err := os.ReadFile(firstFileName)
 	require.NoError(t, err)
 
 	// Check header of the segment file.
@@ -224,7 +223,7 @@ func TestOldChunkDiskMapper_Truncate(t *testing.T) {
 	verifyFiles := func(remainingFiles []int) {
 		t.Helper()
 
-		files, err := ioutil.ReadDir(hrw.dir.Name())
+		files, err := os.ReadDir(hrw.dir.Name())
 		require.NoError(t, err)
 		require.Equal(t, len(remainingFiles), len(files), "files on disk")
 		require.Equal(t, len(remainingFiles), len(hrw.mmappedChunkFiles), "hrw.mmappedChunkFiles")
@@ -322,7 +321,7 @@ func TestOldChunkDiskMapper_Truncate_PreservesFileSequence(t *testing.T) {
 	verifyFiles := func(remainingFiles []int) {
 		t.Helper()
 
-		files, err := ioutil.ReadDir(hrw.dir.Name())
+		files, err := os.ReadDir(hrw.dir.Name())
 		require.NoError(t, err)
 		require.Equal(t, len(remainingFiles), len(files), "files on disk")
 		require.Equal(t, len(remainingFiles), len(hrw.mmappedChunkFiles), "hrw.mmappedChunkFiles")
@@ -448,7 +447,7 @@ func TestOldChunkDiskMapper_ReadRepairOnEmptyLastFile(t *testing.T) {
 	}
 
 	// Removed even from disk.
-	files, err := ioutil.ReadDir(dir)
+	files, err := os.ReadDir(dir)
 	require.NoError(t, err)
 	require.Equal(t, 3, len(files))
 	for _, fi := range files {
@@ -459,11 +458,7 @@ func TestOldChunkDiskMapper_ReadRepairOnEmptyLastFile(t *testing.T) {
 }
 
 func testOldChunkDiskMapper(t *testing.T) *OldChunkDiskMapper {
-	tmpdir, err := ioutil.TempDir("", "data")
-	require.NoError(t, err)
-	t.Cleanup(func() {
-		require.NoError(t, os.RemoveAll(tmpdir))
-	})
+	tmpdir := t.TempDir()
 
 	hrw, err := NewOldChunkDiskMapper(tmpdir, chunkenc.NewPool(), DefaultWriteBufferSize)
 	require.NoError(t, err)
diff --git a/tsdb/compact_test.go b/tsdb/compact_test.go
index 3a063c4bdf..e02438d3e5 100644
--- a/tsdb/compact_test.go
+++ b/tsdb/compact_test.go
@@ -17,7 +17,6 @@ import (
 	"context"
 	"crypto/rand"
 	"fmt"
-	"io/ioutil"
 	"math"
 	"os"
 	"path"
@@ -503,7 +502,7 @@ func TestCompaction_CompactWithSplitting(t *testing.T) {
 	shardCounts := []uint64{1, 13}
 
 	for _, series := range seriesCounts {
-		dir, err := ioutil.TempDir("", "compact")
+		dir, err := os.MkdirTemp("", "compact")
 		require.NoError(t, err)
 		defer func() {
 			require.NoError(t, os.RemoveAll(dir))
@@ -623,7 +622,7 @@ func TestCompaction_CompactWithSplitting(t *testing.T) {
 }
 
 func TestCompaction_CompactEmptyBlocks(t *testing.T) {
-	dir, err := ioutil.TempDir("", "compact")
+	dir, err := os.MkdirTemp("", "compact")
 	require.NoError(t, err)
 	defer func() {
 		require.NoError(t, os.RemoveAll(dir))
diff --git a/tsdb/db.go b/tsdb/db.go
index e9e6029888..61c83d2e83 100644
--- a/tsdb/db.go
+++ b/tsdb/db.go
@@ -18,7 +18,7 @@ import (
 	"context"
 	"fmt"
 	"io"
-	"io/ioutil"
+	"io/fs"
 	"math"
 	"os"
 	"path/filepath"
@@ -780,20 +780,20 @@ func open(dir string, l log.Logger, r prometheus.Registerer, opts *Options, rngs
 }
 
 func removeBestEffortTmpDirs(l log.Logger, dir string) error {
-	files, err := ioutil.ReadDir(dir)
+	files, err := os.ReadDir(dir)
 	if os.IsNotExist(err) {
 		return nil
 	}
 	if err != nil {
 		return err
 	}
-	for _, fi := range files {
-		if isTmpDir(fi) {
-			if err := os.RemoveAll(filepath.Join(dir, fi.Name())); err != nil {
-				level.Error(l).Log("msg", "failed to delete tmp block dir", "dir", filepath.Join(dir, fi.Name()), "err", err)
+	for _, f := range files {
+		if isTmpDir(f) {
+			if err := os.RemoveAll(filepath.Join(dir, f.Name())); err != nil {
+				level.Error(l).Log("msg", "failed to delete tmp block dir", "dir", filepath.Join(dir, f.Name()), "err", err)
 				continue
 			}
-			level.Info(l).Log("msg", "Found and deleted tmp block dir", "dir", filepath.Join(dir, fi.Name()))
+			level.Info(l).Log("msg", "Found and deleted tmp block dir", "dir", filepath.Join(dir, f.Name()))
 		}
 	}
 	return nil
@@ -1741,7 +1741,7 @@ func (db *DB) CleanTombstones() (err error) {
 	return nil
 }
 
-func isBlockDir(fi os.FileInfo) bool {
+func isBlockDir(fi fs.DirEntry) bool {
 	if !fi.IsDir() {
 		return false
 	}
@@ -1750,7 +1750,7 @@ func isBlockDir(fi os.FileInfo) bool {
 }
 
 // isTmpDir returns true if the given file-info contains a block ULID or checkpoint prefix and a tmp extension.
-func isTmpDir(fi os.FileInfo) bool {
+func isTmpDir(fi fs.DirEntry) bool {
 	if !fi.IsDir() {
 		return false
 	}
@@ -1769,22 +1769,22 @@ func isTmpDir(fi os.FileInfo) bool {
 }
 
 func blockDirs(dir string) ([]string, error) {
-	files, err := ioutil.ReadDir(dir)
+	files, err := os.ReadDir(dir)
 	if err != nil {
 		return nil, err
 	}
 	var dirs []string
 
-	for _, fi := range files {
-		if isBlockDir(fi) {
-			dirs = append(dirs, filepath.Join(dir, fi.Name()))
+	for _, f := range files {
+		if isBlockDir(f) {
+			dirs = append(dirs, filepath.Join(dir, f.Name()))
 		}
 	}
 	return dirs, nil
 }
 
 func sequenceFiles(dir string) ([]string, error) {
-	files, err := ioutil.ReadDir(dir)
+	files, err := os.ReadDir(dir)
 	if err != nil {
 		return nil, err
 	}
@@ -1800,7 +1800,7 @@ func sequenceFiles(dir string) ([]string, error) {
 }
 
 func nextSequenceFile(dir string) (string, int, error) {
-	files, err := ioutil.ReadDir(dir)
+	files, err := os.ReadDir(dir)
 	if err != nil {
 		return "", 0, err
 	}
diff --git a/tsdb/db_test.go b/tsdb/db_test.go
index ea3ae4d678..ce772acdde 100644
--- a/tsdb/db_test.go
+++ b/tsdb/db_test.go
@@ -20,7 +20,6 @@ import (
 	"flag"
 	"fmt"
 	"hash/crc32"
-	"io/ioutil"
 	"math"
 	"math/rand"
 	"os"
@@ -225,7 +224,7 @@ func TestNoPanicAfterWALCorruption(t *testing.T) {
 	// it is not garbage collected.
 	// The repair deletes all WAL records after the corrupted record and these are read from the mmaped chunk.
 	{
-		walFiles, err := ioutil.ReadDir(path.Join(db.Dir(), "wal"))
+		walFiles, err := os.ReadDir(path.Join(db.Dir(), "wal"))
 		require.NoError(t, err)
 		f, err := os.OpenFile(path.Join(db.Dir(), "wal", walFiles[0].Name()), os.O_RDWR, 0o666)
 		require.NoError(t, err)
@@ -926,12 +925,14 @@ func TestWALSegmentSizeOptions(t *testing.T) {
 	tests := map[int]func(dbdir string, segmentSize int){
 		// Default Wal Size.
 		0: func(dbDir string, segmentSize int) {
-			filesAndDir, err := ioutil.ReadDir(filepath.Join(dbDir, "wal"))
+			filesAndDir, err := os.ReadDir(filepath.Join(dbDir, "wal"))
 			require.NoError(t, err)
 			files := []os.FileInfo{}
 			for _, f := range filesAndDir {
 				if !f.IsDir() {
-					files = append(files, f)
+					fi, err := f.Info()
+					require.NoError(t, err)
+					files = append(files, fi)
 				}
 			}
 			// All the full segment files (all but the last) should match the segment size option.
@@ -943,12 +944,14 @@ func TestWALSegmentSizeOptions(t *testing.T) {
 		},
 		// Custom Wal Size.
 		2 * 32 * 1024: func(dbDir string, segmentSize int) {
-			filesAndDir, err := ioutil.ReadDir(filepath.Join(dbDir, "wal"))
+			filesAndDir, err := os.ReadDir(filepath.Join(dbDir, "wal"))
 			require.NoError(t, err)
 			files := []os.FileInfo{}
 			for _, f := range filesAndDir {
 				if !f.IsDir() {
-					files = append(files, f)
+					fi, err := f.Info()
+					require.NoError(t, err)
+					files = append(files, fi)
 				}
 			}
 			require.Greater(t, len(files), 1, "current WALSegmentSize should result in more than a single WAL file.")
@@ -1278,38 +1281,40 @@ func TestTombstoneCleanRetentionLimitsRace(t *testing.T) {
 	//
 	// That is something tricky to trigger, so let's try several times just to make sure.
 	for i := 0; i < 20; i++ {
-		db := openTestDB(t, opts, nil)
-		totalBlocks := 20
-		dbDir := db.Dir()
-		// Generate some blocks with old mint (near epoch).
-		for j := 0; j < totalBlocks; j++ {
-			blockDir := createBlock(t, dbDir, genSeries(10, 1, int64(j), int64(j)+1))
-			block, err := OpenBlock(nil, blockDir, nil)
-			require.NoError(t, err)
-			// Cover block with tombstones so it can be deleted with CleanTombstones() as well.
-			tomb := tombstones.NewMemTombstones()
-			tomb.AddInterval(0, tombstones.Interval{Mint: int64(j), Maxt: int64(j) + 1})
-			block.tombstones = tomb
+		t.Run(fmt.Sprintf("iteration%d", i), func(t *testing.T) {
+			db := openTestDB(t, opts, nil)
+			totalBlocks := 20
+			dbDir := db.Dir()
+			// Generate some blocks with old mint (near epoch).
+			for j := 0; j < totalBlocks; j++ {
+				blockDir := createBlock(t, dbDir, genSeries(10, 1, int64(j), int64(j)+1))
+				block, err := OpenBlock(nil, blockDir, nil)
+				require.NoError(t, err)
+				// Cover block with tombstones so it can be deleted with CleanTombstones() as well.
+				tomb := tombstones.NewMemTombstones()
+				tomb.AddInterval(0, tombstones.Interval{Mint: int64(j), Maxt: int64(j) + 1})
+				block.tombstones = tomb
 
-			db.blocks = append(db.blocks, block)
-		}
+				db.blocks = append(db.blocks, block)
+			}
 
-		wg.Add(2)
-		// Run reload and CleanTombstones together, with a small time window randomization
-		go func() {
-			defer wg.Done()
-			time.Sleep(time.Duration(rand.Float64() * 100 * float64(time.Millisecond)))
-			require.NoError(t, db.reloadBlocks())
-		}()
-		go func() {
-			defer wg.Done()
-			time.Sleep(time.Duration(rand.Float64() * 100 * float64(time.Millisecond)))
-			require.NoError(t, db.CleanTombstones())
-		}()
+			wg.Add(2)
+			// Run reload and CleanTombstones together, with a small time window randomization
+			go func() {
+				defer wg.Done()
+				time.Sleep(time.Duration(rand.Float64() * 100 * float64(time.Millisecond)))
+				require.NoError(t, db.reloadBlocks())
+			}()
+			go func() {
+				defer wg.Done()
+				time.Sleep(time.Duration(rand.Float64() * 100 * float64(time.Millisecond)))
+				require.NoError(t, db.CleanTombstones())
+			}()
 
-		wg.Wait()
+			wg.Wait()
 
-		require.NoError(t, db.Close())
+			require.NoError(t, db.Close())
+		})
 	}
 }
 
@@ -2706,7 +2711,7 @@ func TestChunkWriter_ReadAfterWrite(t *testing.T) {
 			}
 			require.NoError(t, chunkw.Close())
 
-			files, err := ioutil.ReadDir(tempDir)
+			files, err := os.ReadDir(tempDir)
 			require.NoError(t, err)
 			require.Equal(t, test.expSegmentsCount, len(files), "expected segments count mismatch")
 
@@ -2726,7 +2731,9 @@ func TestChunkWriter_ReadAfterWrite(t *testing.T) {
 			sizeExp += test.expSegmentsCount * chunks.SegmentHeaderSize // The segment header bytes.
 
 			for i, f := range files {
-				size := int(f.Size())
+				fi, err := f.Info()
+				require.NoError(t, err)
+				size := int(fi.Size())
 				// Verify that the segment is the same or smaller than the expected size.
 				require.GreaterOrEqual(t, chunks.SegmentHeaderSize+test.expSegmentSizes[i], size, "Segment:%v should NOT be bigger than:%v actual:%v", i, chunks.SegmentHeaderSize+test.expSegmentSizes[i], size)
 
@@ -2877,7 +2884,7 @@ func TestCompactHead(t *testing.T) {
 }
 
 func deleteNonBlocks(dbDir string) error {
-	dirs, err := ioutil.ReadDir(dbDir)
+	dirs, err := os.ReadDir(dbDir)
 	if err != nil {
 		return err
 	}
@@ -2888,7 +2895,7 @@ func deleteNonBlocks(dbDir string) error {
 			}
 		}
 	}
-	dirs, err = ioutil.ReadDir(dbDir)
+	dirs, err = os.ReadDir(dbDir)
 	if err != nil {
 		return err
 	}
@@ -2995,7 +3002,7 @@ func TestOpen_VariousBlockStates(t *testing.T) {
 	require.Equal(t, len(expectedLoadedDirs), loaded)
 	require.NoError(t, db.Close())
 
-	files, err := ioutil.ReadDir(tmpDir)
+	files, err := os.ReadDir(tmpDir)
 	require.NoError(t, err)
 
 	var ignored int
diff --git a/tsdb/docs/refs.md b/tsdb/docs/refs.md
index b070b5c7a3..058f943da9 100644
--- a/tsdb/docs/refs.md
+++ b/tsdb/docs/refs.md
@@ -84,8 +84,8 @@ The `ChunkRef` types allow retrieving the chunk data as efficiently as possible.
 
 ## Used internally in TSDB
 
-* [`HeadChunkID`](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb/chunks#HeadChunkID) references a chunk of a `memSeries` (either an `mmappedChunk` or `headChunk`).
+* [`HeadChunkID`](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb/chunks#HeadChunkID) references a chunk of a `memSeries` (either an `mmappedChunk` or `headChunk`).
   If a caller has, for whatever reason, an "old" `HeadChunkID` that refers to a chunk that has been compacted into a block, querying the memSeries for it will not return any data.
-* [`ChunkDiskMapperRef`](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb/chunks#ChunkDiskMapperRef) is an 8 Byte integer.
+* [`ChunkDiskMapperRef`](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb/chunks#ChunkDiskMapperRef) is an 8 Byte integer.
   4 Bytes are used to refer to a chunks file number and 4 bytes serve as byte offset (similar to `BlockChunkRef`).  `mmappedChunk` provide this value such that callers can load the mmapped chunk from disk.
 
diff --git a/tsdb/docs/usage.md b/tsdb/docs/usage.md
index 600973089b..e70b248137 100644
--- a/tsdb/docs/usage.md
+++ b/tsdb/docs/usage.md
@@ -3,24 +3,24 @@
 TSDB can be - and is - used by other applications such as [Cortex](https://cortexmetrics.io/) and [Thanos](https://thanos.io/).
 This directory contains documentation for any developers who wish to work on or with TSDB.
 
-For a full example of instantiating a database, adding and querying data, see the [tsdb example in the docs](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb).
+For a full example of instantiating a database, adding and querying data, see the [tsdb example in the docs](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb).
 `tsdb/db_test.go` also demonstrates various specific usages of the TSDB library.
 
 ## Instantiating a database
 
-Callers should use [`tsdb.Open`](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb#Open) to open a TSDB
+Callers should use [`tsdb.Open`](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb#Open) to open a TSDB
 (the directory may be new or pre-existing).
-This returns a [`*tsdb.DB`](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb#DB) which is the actual database.
+This returns a [`*tsdb.DB`](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb#DB) which is the actual database.
 
 A `DB` has the following main components:
 
-* Compactor: a [leveled compactor](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb#LeveledCompactor). Note: it is currently the only compactor implementation. It runs automatically.
-* [`Head`](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb#DB.Head)
-* [Blocks (persistent blocks)](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb#DB.Blocks)
+* Compactor: a [leveled compactor](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb#LeveledCompactor). Note: it is currently the only compactor implementation. It runs automatically.
+* [`Head`](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb#DB.Head)
+* [Blocks (persistent blocks)](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb#DB.Blocks)
 
 The `Head` is responsible for a lot.  Here are its main components:
 
-* [WAL](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb/wal#WAL) (Write Ahead Log).
+* [WAL](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb/wal#WAL) (Write Ahead Log).
 * [`stripeSeries`](https://github.com/prometheus/prometheus/blob/411021ada9ab41095923b8d2df9365b632fd40c3/tsdb/head.go#L1292):
   this holds all the active series by linking to [`memSeries`](https://github.com/prometheus/prometheus/blob/411021ada9ab41095923b8d2df9365b632fd40c3/tsdb/head.go#L1462)
   by an ID (aka "ref") and by labels hash.
@@ -29,8 +29,8 @@ The `Head` is responsible for a lot.  Here are its main components:
 
 ## Adding data
 
-Use [`db.Appender()`](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb#DB.Appender) to obtain an "appender".
-The [golang docs](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/storage#Appender) speak mostly for themselves.
+Use [`db.Appender()`](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb#DB.Appender) to obtain an "appender".
+The [golang docs](https://pkg.go.dev/github.com/prometheus/prometheus/storage#Appender) speak mostly for themselves.
 
 Remember:
 
@@ -43,7 +43,7 @@ Remember:
 Append may reject data due to these conditions:
 
 1) `timestamp < minValidTime` where `minValidTime` is the highest of:
-  * the maxTime of the last block (i.e. the last truncation time of Head) - updated via [`Head.Truncate()`](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb#Head.Truncate) and [`DB.compactHead()`](https://github.com/prometheus/prometheus/blob/411021ada9ab41095923b8d2df9365b632fd40c3/tsdb/db.go#L968)
+  * the maxTime of the last block (i.e. the last truncation time of Head) - updated via [`Head.Truncate()`](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb#Head.Truncate) and [`DB.compactHead()`](https://github.com/prometheus/prometheus/blob/411021ada9ab41095923b8d2df9365b632fd40c3/tsdb/db.go#L968)
   * `tsdb.min-block-duration/2` older than the max time in the Head block. Note that while technically `storage.tsdb.min-block-duration` is configurable, it's a hidden option and changing it is discouraged.  So We can assume this value to be 2h.
 
   Breaching this condition results in "out of bounds" errors.  
@@ -56,8 +56,8 @@ Append may reject data due to these conditions:
 
 ## Querying data
 
-Use [`db.Querier()`](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb#DB.Querier) to obtain a "querier".
-The [golang docs](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/storage#Querier) speak mostly for themselves.
+Use [`db.Querier()`](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb#DB.Querier) to obtain a "querier".
+The [golang docs](https://pkg.go.dev/github.com/prometheus/prometheus/storage#Querier) speak mostly for themselves.
 
 Remember:
 
diff --git a/tsdb/example_test.go b/tsdb/example_test.go
index 1947a48a55..edb0e3c392 100644
--- a/tsdb/example_test.go
+++ b/tsdb/example_test.go
@@ -16,7 +16,6 @@ package tsdb
 import (
 	"context"
 	"fmt"
-	"io/ioutil"
 	"math"
 	"os"
 	"time"
@@ -27,7 +26,7 @@ import (
 func Example() {
 	// Create a random dir to work in.  Open() doesn't require a pre-existing dir, but
 	// we want to make sure not to make a mess where we shouldn't.
-	dir, err := ioutil.TempDir("", "tsdb-test")
+	dir, err := os.MkdirTemp("", "tsdb-test")
 	noErr(err)
 
 	// Open a TSDB for reading and/or writing.
diff --git a/tsdb/exemplar_test.go b/tsdb/exemplar_test.go
index 30c497426f..d04dbd1785 100644
--- a/tsdb/exemplar_test.go
+++ b/tsdb/exemplar_test.go
@@ -330,8 +330,8 @@ func TestSelectExemplar_DuplicateSeries(t *testing.T) {
 	}
 
 	l := labels.Labels{
-		{Name: "service", Value: "asdf"},
 		{Name: "cluster", Value: "us-central1"},
+		{Name: "service", Value: "asdf"},
 	}
 
 	// Lets just assume somehow the PromQL expression generated two separate lists of matchers,
diff --git a/tsdb/fileutil/fileutil.go b/tsdb/fileutil/fileutil.go
index 8ab8ce3dd1..5e479f48b9 100644
--- a/tsdb/fileutil/fileutil.go
+++ b/tsdb/fileutil/fileutil.go
@@ -18,7 +18,6 @@
 package fileutil
 
 import (
-	"io/ioutil"
 	"os"
 	"path/filepath"
 	"strings"
@@ -60,12 +59,12 @@ func CopyDirs(src, dest string) error {
 }
 
 func copyFile(src, dest string) error {
-	data, err := ioutil.ReadFile(src)
+	data, err := os.ReadFile(src)
 	if err != nil {
 		return err
 	}
 
-	err = ioutil.WriteFile(dest, data, 0o666)
+	err = os.WriteFile(dest, data, 0o666)
 	if err != nil {
 		return err
 	}
diff --git a/tsdb/fileutil/flock_js.go b/tsdb/fileutil/flock_js.go
new file mode 100644
index 0000000000..c1876d4bb7
--- /dev/null
+++ b/tsdb/fileutil/flock_js.go
@@ -0,0 +1,34 @@
+// Copyright 2022 The Prometheus Authors
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//go:build js
+// +build js
+
+package fileutil
+
+import "errors"
+
+type unixLock struct {
+}
+
+func (l *unixLock) Release() error {
+	return errors.New("unsupported")
+}
+
+func (l *unixLock) set(lock bool) error {
+	return errors.New("unsupported")
+}
+
+func newLock(fileName string) (Releaser, error) {
+	return nil, errors.New("unsupported")
+}
diff --git a/web/ui/assets_generate.go b/tsdb/fileutil/mmap_js.go
similarity index 55%
rename from web/ui/assets_generate.go
rename to tsdb/fileutil/mmap_js.go
index 47f1a43c0a..0c666e8bf5 100644
--- a/web/ui/assets_generate.go
+++ b/tsdb/fileutil/mmap_js.go
@@ -1,4 +1,4 @@
-// Copyright 2018 The Prometheus Authors
+// Copyright 2022 The Prometheus Authors
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
@@ -11,29 +11,20 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-//go:build ignore
-// +build ignore
+//go:build js
+// +build js
 
-package main
+package fileutil
 
 import (
-	"log"
-	"time"
-
-	"github.com/shurcooL/vfsgen"
-
-	"github.com/prometheus/prometheus/util/modtimevfs"
-	"github.com/prometheus/prometheus/web/ui"
+	"errors"
+	"os"
 )
 
-func main() {
-	fs := modtimevfs.New(ui.Assets, time.Unix(1, 0))
-	err := vfsgen.Generate(fs, vfsgen.Options{
-		PackageName:  "ui",
-		BuildTags:    "builtinassets",
-		VariableName: "Assets",
-	})
-	if err != nil {
-		log.Fatalln(err)
-	}
+func mmap(f *os.File, length int) ([]byte, error) {
+	return nil, errors.New("unsupported")
+}
+
+func munmap(b []byte) (err error) {
+	return errors.New("unsupported")
 }
diff --git a/tsdb/fileutil/mmap_unix.go b/tsdb/fileutil/mmap_unix.go
index 9365c62f74..1fd7f48ff5 100644
--- a/tsdb/fileutil/mmap_unix.go
+++ b/tsdb/fileutil/mmap_unix.go
@@ -11,8 +11,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-//go:build !windows && !plan9
-// +build !windows,!plan9
+//go:build !windows && !plan9 && !js
+// +build !windows,!plan9,!js
 
 package fileutil
 
diff --git a/tsdb/head_test.go b/tsdb/head_test.go
index 63f63195da..7c321793e1 100644
--- a/tsdb/head_test.go
+++ b/tsdb/head_test.go
@@ -17,7 +17,6 @@ import (
 	"context"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"math"
 	"math/rand"
 	"os"
@@ -1685,7 +1684,7 @@ func TestHeadReadWriterRepair(t *testing.T) {
 		// Verify that there are 6 segment files.
 		// It should only be 6 because the last call to .CutNewFile() won't
 		// take effect without another chunk being written.
-		files, err := ioutil.ReadDir(mmappedChunksDir(dir))
+		files, err := os.ReadDir(mmappedChunksDir(dir))
 		require.NoError(t, err)
 
 		// With the new chunk disk mapper we only expect 6 files, because the last call to "CutNewFile()" won't
@@ -1718,7 +1717,7 @@ func TestHeadReadWriterRepair(t *testing.T) {
 	// Verify that there are 3 segment files after the repair.
 	// The segments from the corrupt segment should be removed.
 	{
-		files, err := ioutil.ReadDir(mmappedChunksDir(dir))
+		files, err := os.ReadDir(mmappedChunksDir(dir))
 		require.NoError(t, err)
 		require.Equal(t, 3, len(files))
 	}
@@ -2242,8 +2241,8 @@ func TestHeadLabelValuesWithMatchers(t *testing.T) {
 	app := head.Appender(context.Background())
 	for i := 0; i < 100; i++ {
 		_, err := app.Append(0, labels.Labels{
-			{Name: "unique", Value: fmt.Sprintf("value%d", i)},
 			{Name: "tens", Value: fmt.Sprintf("value%d", i/10)},
+			{Name: "unique", Value: fmt.Sprintf("value%d", i)},
 		}, 100, 0)
 		require.NoError(t, err)
 	}
@@ -2309,17 +2308,17 @@ func TestHeadLabelNamesWithMatchers(t *testing.T) {
 
 		if i%10 == 0 {
 			_, err := app.Append(0, labels.Labels{
-				{Name: "unique", Value: fmt.Sprintf("value%d", i)},
 				{Name: "tens", Value: fmt.Sprintf("value%d", i/10)},
+				{Name: "unique", Value: fmt.Sprintf("value%d", i)},
 			}, 100, 0)
 			require.NoError(t, err)
 		}
 
 		if i%20 == 0 {
 			_, err := app.Append(0, labels.Labels{
-				{Name: "unique", Value: fmt.Sprintf("value%d", i)},
 				{Name: "tens", Value: fmt.Sprintf("value%d", i/10)},
 				{Name: "twenties", Value: fmt.Sprintf("value%d", i/20)},
+				{Name: "unique", Value: fmt.Sprintf("value%d", i)},
 			}, 100, 0)
 			require.NoError(t, err)
 		}
@@ -2526,23 +2525,25 @@ func BenchmarkHeadLabelValuesWithMatchers(b *testing.B) {
 
 	metricCount := 1000000
 	for i := 0; i < metricCount; i++ {
+		// Note these series are not created in sort order: 'value2' sorts after 'value10'.
+		// This makes a big difference to the benchmark timing.
 		_, err := app.Append(0, labels.Labels{
-			{Name: "unique", Value: fmt.Sprintf("value%d", i)},
-			{Name: "tens", Value: fmt.Sprintf("value%d", i/(metricCount/10))},
-			{Name: "ninety", Value: fmt.Sprintf("value%d", i/(metricCount/10)/9)}, // "0" for the first 90%, then "1"
+			{Name: "a_unique", Value: fmt.Sprintf("value%d", i)},
+			{Name: "b_tens", Value: fmt.Sprintf("value%d", i/(metricCount/10))},
+			{Name: "c_ninety", Value: fmt.Sprintf("value%d", i/(metricCount/10)/9)}, // "0" for the first 90%, then "1"
 		}, 100, 0)
 		require.NoError(b, err)
 	}
 	require.NoError(b, app.Commit())
 
 	headIdxReader := head.indexRange(0, 200)
-	matchers := []*labels.Matcher{labels.MustNewMatcher(labels.MatchEqual, "ninety", "value0")}
+	matchers := []*labels.Matcher{labels.MustNewMatcher(labels.MatchEqual, "c_ninety", "value0")}
 
 	b.ResetTimer()
 	b.ReportAllocs()
 
 	for benchIdx := 0; benchIdx < b.N; benchIdx++ {
-		actualValues, err := headIdxReader.LabelValues("tens", matchers...)
+		actualValues, err := headIdxReader.LabelValues("b_tens", matchers...)
 		require.NoError(b, err)
 		require.Equal(b, 9, len(actualValues))
 	}
@@ -3043,7 +3044,7 @@ func TestChunkSnapshot(t *testing.T) {
 		closeHeadAndCheckSnapshot()
 
 		// Verify that there is only 1 snapshot.
-		files, err := ioutil.ReadDir(head.opts.ChunkDirRoot)
+		files, err := os.ReadDir(head.opts.ChunkDirRoot)
 		require.NoError(t, err)
 		snapshots := 0
 		for i := len(files) - 1; i >= 0; i-- {
@@ -3106,7 +3107,7 @@ func TestSnapshotError(t *testing.T) {
 	// Corrupt the snapshot.
 	snapDir, _, _, err := LastChunkSnapshot(head.opts.ChunkDirRoot)
 	require.NoError(t, err)
-	files, err := ioutil.ReadDir(snapDir)
+	files, err := os.ReadDir(snapDir)
 	require.NoError(t, err)
 	f, err := os.OpenFile(path.Join(snapDir, files[0].Name()), os.O_RDWR, 0)
 	require.NoError(t, err)
@@ -3171,7 +3172,7 @@ func TestChunkSnapshotReplayBug(t *testing.T) {
 	cpdir := filepath.Join(dir, snapshotName)
 	require.NoError(t, os.MkdirAll(cpdir, 0o777))
 
-	err = ioutil.WriteFile(filepath.Join(cpdir, "00000000"), []byte{1, 5, 3, 5, 6, 7, 4, 2, 2}, 0o777)
+	err = os.WriteFile(filepath.Join(cpdir, "00000000"), []byte{1, 5, 3, 5, 6, 7, 4, 2, 2}, 0o777)
 	require.NoError(t, err)
 
 	opts := DefaultHeadOptions()
@@ -3418,7 +3419,7 @@ func TestReplayAfterMmapReplayError(t *testing.T) {
 		}
 	}
 
-	files, err := ioutil.ReadDir(filepath.Join(dir, "chunks_head"))
+	files, err := os.ReadDir(filepath.Join(dir, "chunks_head"))
 	require.Equal(t, 5, len(files))
 
 	// Corrupt a m-map file.
@@ -3432,7 +3433,7 @@ func TestReplayAfterMmapReplayError(t *testing.T) {
 	openHead()
 
 	// There should be less m-map files due to corruption.
-	files, err = ioutil.ReadDir(filepath.Join(dir, "chunks_head"))
+	files, err = os.ReadDir(filepath.Join(dir, "chunks_head"))
 	require.Equal(t, 2, len(files))
 
 	// Querying should not panic.
diff --git a/tsdb/head_wal.go b/tsdb/head_wal.go
index 907217ebf3..97afdf53aa 100644
--- a/tsdb/head_wal.go
+++ b/tsdb/head_wal.go
@@ -15,7 +15,6 @@ package tsdb
 
 import (
 	"fmt"
-	"io/ioutil"
 	"math"
 	"os"
 	"path/filepath"
@@ -760,7 +759,7 @@ type ChunkSnapshotStats struct {
 // LastChunkSnapshot returns the directory name and index of the most recent chunk snapshot.
 // If dir does not contain any chunk snapshots, ErrNotFound is returned.
 func LastChunkSnapshot(dir string) (string, int, int, error) {
-	files, err := ioutil.ReadDir(dir)
+	files, err := os.ReadDir(dir)
 	if err != nil {
 		return "", 0, 0, err
 	}
@@ -805,7 +804,7 @@ func LastChunkSnapshot(dir string) (string, int, int, error) {
 
 // DeleteChunkSnapshots deletes all chunk snapshots in a directory below a given index.
 func DeleteChunkSnapshots(dir string, maxIndex, maxOffset int) error {
-	files, err := ioutil.ReadDir(dir)
+	files, err := os.ReadDir(dir)
 	if err != nil {
 		return err
 	}
diff --git a/tsdb/index/index.go b/tsdb/index/index.go
index 8427a95447..725f2d3a20 100644
--- a/tsdb/index/index.go
+++ b/tsdb/index/index.go
@@ -22,7 +22,6 @@ import (
 	"hash"
 	"hash/crc32"
 	"io"
-	"io/ioutil"
 	"math"
 	"os"
 	"path/filepath"
@@ -528,7 +527,7 @@ func (w *Writer) finishSymbols() error {
 	symbolTableSize := w.f.pos - w.toc.Symbols - 4
 	// The symbol table's  part is 4 bytes. So the total symbol table size must be less than or equal to 2^32-1
 	if symbolTableSize > math.MaxUint32 {
-		return errors.Errorf("symbol table size exceeds 4 bytes: %d", symbolTableSize)
+		return errors.Errorf("symbol table size exceeds %d bytes: %d", uint32(math.MaxUint32), symbolTableSize)
 	}
 
 	// Write out the length and symbol count.
@@ -1117,12 +1116,12 @@ func (b realByteSlice) Sub(start, end int) ByteSlice {
 // NewReader returns a new index reader on the given byte slice. It automatically
 // handles different format versions.
 func NewReader(b ByteSlice) (*Reader, error) {
-	return newReader(b, ioutil.NopCloser(nil), nil)
+	return newReader(b, io.NopCloser(nil), nil)
 }
 
 // NewReaderWithCache is like NewReader but allows to pass a cache provider.
 func NewReaderWithCache(b ByteSlice, cacheProvider ReaderCacheProvider) (*Reader, error) {
-	return newReader(b, ioutil.NopCloser(nil), cacheProvider)
+	return newReader(b, io.NopCloser(nil), cacheProvider)
 }
 
 // NewFileReader returns a new index reader against the given index file.
diff --git a/tsdb/index/index_test.go b/tsdb/index/index_test.go
index c7ec704252..44a0a1614c 100644
--- a/tsdb/index/index_test.go
+++ b/tsdb/index/index_test.go
@@ -17,7 +17,6 @@ import (
 	"context"
 	"fmt"
 	"hash/crc32"
-	"io/ioutil"
 	"math/rand"
 	"os"
 	"path/filepath"
@@ -546,7 +545,7 @@ func TestNewFileReaderErrorNoOpenFiles(t *testing.T) {
 	dir := testutil.NewTemporaryDirectory("block", t)
 
 	idxName := filepath.Join(dir.Path(), "index")
-	err := ioutil.WriteFile(idxName, []byte("corrupted contents"), 0o666)
+	err := os.WriteFile(idxName, []byte("corrupted contents"), 0o666)
 	require.NoError(t, err)
 
 	_, err = NewFileReader(idxName)
@@ -609,7 +608,7 @@ func BenchmarkReader_ShardedPostings(b *testing.B) {
 		numShards = 16
 	)
 
-	dir, err := ioutil.TempDir("", "benchmark_reader_sharded_postings")
+	dir, err := os.MkdirTemp("", "benchmark_reader_sharded_postings")
 	require.NoError(b, err)
 	defer func() {
 		require.NoError(b, os.RemoveAll(dir))
diff --git a/tsdb/repair.go b/tsdb/repair.go
index 8d60cb3817..0c2e08791c 100644
--- a/tsdb/repair.go
+++ b/tsdb/repair.go
@@ -16,7 +16,6 @@ package tsdb
 import (
 	"encoding/json"
 	"io"
-	"io/ioutil"
 	"os"
 	"path/filepath"
 
@@ -115,7 +114,7 @@ func repairBadIndexVersion(logger log.Logger, dir string) error {
 }
 
 func readBogusMetaFile(dir string) (*BlockMeta, error) {
-	b, err := ioutil.ReadFile(filepath.Join(dir, metaFilename))
+	b, err := os.ReadFile(filepath.Join(dir, metaFilename))
 	if err != nil {
 		return nil, err
 	}
diff --git a/tsdb/tombstones/tombstones.go b/tsdb/tombstones/tombstones.go
index 621e104714..f7e2a2a1e7 100644
--- a/tsdb/tombstones/tombstones.go
+++ b/tsdb/tombstones/tombstones.go
@@ -18,7 +18,6 @@ import (
 	"fmt"
 	"hash"
 	"hash/crc32"
-	"io/ioutil"
 	"os"
 	"path/filepath"
 	"sort"
@@ -190,7 +189,7 @@ type Stone struct {
 }
 
 func ReadTombstones(dir string) (Reader, int64, error) {
-	b, err := ioutil.ReadFile(filepath.Join(dir, TombstonesFilename))
+	b, err := os.ReadFile(filepath.Join(dir, TombstonesFilename))
 	if os.IsNotExist(err) {
 		return NewMemTombstones(), 0, nil
 	} else if err != nil {
diff --git a/tsdb/tsdbutil/dir_locker_testutil.go b/tsdb/tsdbutil/dir_locker_testutil.go
index cbb21e254f..a4cf5abd68 100644
--- a/tsdb/tsdbutil/dir_locker_testutil.go
+++ b/tsdb/tsdbutil/dir_locker_testutil.go
@@ -15,7 +15,6 @@ package tsdbutil
 
 import (
 	"fmt"
-	"io/ioutil"
 	"os"
 	"testing"
 
@@ -61,7 +60,7 @@ func TestDirLockerUsage(t *testing.T, open func(t *testing.T, data string, creat
 
 	for _, c := range cases {
 		t.Run(fmt.Sprintf("%+v", c), func(t *testing.T) {
-			tmpdir, err := ioutil.TempDir("", "test")
+			tmpdir, err := os.MkdirTemp("", "test")
 			require.NoError(t, err)
 			t.Cleanup(func() {
 				require.NoError(t, os.RemoveAll(tmpdir))
@@ -71,7 +70,7 @@ func TestDirLockerUsage(t *testing.T, open func(t *testing.T, data string, creat
 			if c.fileAlreadyExists {
 				tmpLocker, err := NewDirLocker(tmpdir, "tsdb", log.NewNopLogger(), nil)
 				require.NoError(t, err)
-				err = ioutil.WriteFile(tmpLocker.path, []byte{}, 0o644)
+				err = os.WriteFile(tmpLocker.path, []byte{}, 0o644)
 				require.NoError(t, err)
 			}
 
diff --git a/tsdb/wal/checkpoint.go b/tsdb/wal/checkpoint.go
index 9064beed06..af4bd940c7 100644
--- a/tsdb/wal/checkpoint.go
+++ b/tsdb/wal/checkpoint.go
@@ -17,7 +17,6 @@ package wal
 import (
 	"fmt"
 	"io"
-	"io/ioutil"
 	"math"
 	"os"
 	"path/filepath"
@@ -300,7 +299,7 @@ type checkpointRef struct {
 }
 
 func listCheckpoints(dir string) (refs []checkpointRef, err error) {
-	files, err := ioutil.ReadDir(dir)
+	files, err := os.ReadDir(dir)
 	if err != nil {
 		return nil, err
 	}
diff --git a/tsdb/wal/checkpoint_test.go b/tsdb/wal/checkpoint_test.go
index 3f8ca25e0f..63f3558afa 100644
--- a/tsdb/wal/checkpoint_test.go
+++ b/tsdb/wal/checkpoint_test.go
@@ -16,7 +16,6 @@ package wal
 
 import (
 	"fmt"
-	"io/ioutil"
 	"os"
 	"path/filepath"
 	"strings"
@@ -86,7 +85,7 @@ func TestDeleteCheckpoints(t *testing.T) {
 
 	require.NoError(t, DeleteCheckpoints(dir, 2))
 
-	files, err := ioutil.ReadDir(dir)
+	files, err := os.ReadDir(dir)
 	require.NoError(t, err)
 	fns := []string{}
 	for _, f := range files {
@@ -100,7 +99,7 @@ func TestDeleteCheckpoints(t *testing.T) {
 
 	require.NoError(t, DeleteCheckpoints(dir, 100000000))
 
-	files, err = ioutil.ReadDir(dir)
+	files, err = os.ReadDir(dir)
 	require.NoError(t, err)
 	fns = []string{}
 	for _, f := range files {
@@ -183,7 +182,7 @@ func TestCheckpoint(t *testing.T) {
 			require.NoError(t, DeleteCheckpoints(w.Dir(), 106))
 
 			// Only the new checkpoint should be left.
-			files, err := ioutil.ReadDir(dir)
+			files, err := os.ReadDir(dir)
 			require.NoError(t, err)
 			require.Equal(t, 1, len(files))
 			require.Equal(t, "checkpoint.00000106", files[0].Name())
diff --git a/tsdb/wal/reader_test.go b/tsdb/wal/reader_test.go
index a6516367d7..191e54636b 100644
--- a/tsdb/wal/reader_test.go
+++ b/tsdb/wal/reader_test.go
@@ -20,7 +20,6 @@ import (
 	"fmt"
 	"hash/crc32"
 	"io"
-	"io/ioutil"
 	"math/rand"
 	"os"
 	"path/filepath"
@@ -203,7 +202,7 @@ func TestReader_Live(t *testing.T) {
 
 	for i := range testReaderCases {
 		t.Run(strconv.Itoa(i), func(t *testing.T) {
-			writeFd, err := ioutil.TempFile("", "TestReader_Live")
+			writeFd, err := os.CreateTemp("", "TestReader_Live")
 			require.NoError(t, err)
 			defer os.Remove(writeFd.Name())
 
diff --git a/tsdb/wal/wal.go b/tsdb/wal/wal.go
index 3bc2894d32..ace6a99566 100644
--- a/tsdb/wal/wal.go
+++ b/tsdb/wal/wal.go
@@ -20,7 +20,6 @@ import (
 	"fmt"
 	"hash/crc32"
 	"io"
-	"io/ioutil"
 	"os"
 	"path/filepath"
 	"sort"
@@ -802,7 +801,7 @@ type segmentRef struct {
 }
 
 func listSegments(dir string) (refs []segmentRef, err error) {
-	files, err := ioutil.ReadDir(dir)
+	files, err := os.ReadDir(dir)
 	if err != nil {
 		return nil, err
 	}
diff --git a/tsdb/wal/watcher.go b/tsdb/wal/watcher.go
index cdd20626a8..7b026b4ea8 100644
--- a/tsdb/wal/watcher.go
+++ b/tsdb/wal/watcher.go
@@ -16,7 +16,6 @@ package wal
 import (
 	"fmt"
 	"io"
-	"io/ioutil"
 	"math"
 	"os"
 	"path"
@@ -145,7 +144,7 @@ func NewWatcherMetrics(reg prometheus.Registerer) *WatcherMetrics {
 }
 
 // NewWatcher creates a new WAL watcher for a given WriteTo.
-func NewWatcher(metrics *WatcherMetrics, readerMetrics *LiveReaderMetrics, logger log.Logger, name string, writer WriteTo, walDir string, sendExemplars bool) *Watcher {
+func NewWatcher(metrics *WatcherMetrics, readerMetrics *LiveReaderMetrics, logger log.Logger, name string, writer WriteTo, dir string, sendExemplars bool) *Watcher {
 	if logger == nil {
 		logger = log.NewNopLogger()
 	}
@@ -154,7 +153,7 @@ func NewWatcher(metrics *WatcherMetrics, readerMetrics *LiveReaderMetrics, logge
 		writer:        writer,
 		metrics:       metrics,
 		readerMetrics: readerMetrics,
-		walDir:        path.Join(walDir, "wal"),
+		walDir:        path.Join(dir, "wal"),
 		name:          name,
 		sendExemplars: sendExemplars,
 
@@ -305,7 +304,7 @@ func (w *Watcher) firstAndLast() (int, int, error) {
 // Copied from tsdb/wal/wal.go so we do not have to open a WAL.
 // Plan is to move WAL watcher to TSDB and dedupe these implementations.
 func (w *Watcher) segments(dir string) ([]int, error) {
-	files, err := ioutil.ReadDir(dir)
+	files, err := os.ReadDir(dir)
 	if err != nil {
 		return nil, err
 	}
diff --git a/tsdb/wal_test.go b/tsdb/wal_test.go
index b4ab54d0c0..325e65a92d 100644
--- a/tsdb/wal_test.go
+++ b/tsdb/wal_test.go
@@ -19,7 +19,6 @@ package tsdb
 import (
 	"encoding/binary"
 	"io"
-	"io/ioutil"
 	"math/rand"
 	"os"
 	"path"
@@ -294,7 +293,7 @@ func TestWALRestoreCorrupted_invalidSegment(t *testing.T) {
 	require.NoError(t, err)
 	defer func(wal *SegmentWAL) { require.NoError(t, wal.Close()) }(wal)
 
-	files, err := ioutil.ReadDir(dir)
+	files, err := os.ReadDir(dir)
 	require.NoError(t, err)
 	fns := []string{}
 	for _, f := range files {
diff --git a/util/httputil/compression_test.go b/util/httputil/compression_test.go
index f490f7e301..8512797613 100644
--- a/util/httputil/compression_test.go
+++ b/util/httputil/compression_test.go
@@ -17,7 +17,7 @@ import (
 	"bytes"
 	"compress/gzip"
 	"compress/zlib"
-	"io/ioutil"
+	"io"
 	"net/http"
 	"net/http/httptest"
 	"testing"
@@ -64,7 +64,7 @@ func TestCompressionHandler_PlainText(t *testing.T) {
 	resp, err := client.Get(server.URL + "/foo_endpoint")
 	require.NoError(t, err, "client get failed with unexpected error")
 	defer resp.Body.Close()
-	contents, err := ioutil.ReadAll(resp.Body)
+	contents, err := io.ReadAll(resp.Body)
 	require.NoError(t, err, "unexpected error while creating the response body reader")
 
 	expected := "Hello World!"
diff --git a/util/logging/file_test.go b/util/logging/file_test.go
index 537a2a713b..0e760a4848 100644
--- a/util/logging/file_test.go
+++ b/util/logging/file_test.go
@@ -14,7 +14,6 @@
 package logging
 
 import (
-	"io/ioutil"
 	"os"
 	"strings"
 	"testing"
@@ -24,7 +23,7 @@ import (
 )
 
 func TestJSONFileLogger_basic(t *testing.T) {
-	f, err := ioutil.TempFile("", "logging")
+	f, err := os.CreateTemp("", "logging")
 	require.NoError(t, err)
 	defer func() {
 		require.NoError(t, f.Close())
@@ -53,7 +52,7 @@ func TestJSONFileLogger_basic(t *testing.T) {
 }
 
 func TestJSONFileLogger_parallel(t *testing.T) {
-	f, err := ioutil.TempFile("", "logging")
+	f, err := os.CreateTemp("", "logging")
 	require.NoError(t, err)
 	defer func() {
 		require.NoError(t, f.Close())
diff --git a/util/teststorage/storage.go b/util/teststorage/storage.go
index 9f9cb4ceb7..ff9b33bbdd 100644
--- a/util/teststorage/storage.go
+++ b/util/teststorage/storage.go
@@ -14,7 +14,6 @@
 package teststorage
 
 import (
-	"io/ioutil"
 	"os"
 	"time"
 
@@ -31,7 +30,7 @@ import (
 // New returns a new TestStorage for testing purposes
 // that removes all associated files on closing.
 func New(t testutil.T) *TestStorage {
-	dir, err := ioutil.TempDir("", "test_storage")
+	dir, err := os.MkdirTemp("", "test_storage")
 	require.NoError(t, err, "unexpected error while opening test directory")
 
 	// Tests just load data for a series sequentially. Thus we
diff --git a/util/testutil/directory.go b/util/testutil/directory.go
index 70cf042273..71ed74ba55 100644
--- a/util/testutil/directory.go
+++ b/util/testutil/directory.go
@@ -16,7 +16,6 @@ package testutil
 import (
 	"crypto/sha256"
 	"io"
-	"io/ioutil"
 	"os"
 	"path/filepath"
 	"strconv"
@@ -120,7 +119,7 @@ func NewTemporaryDirectory(name string, t T) (handler TemporaryDirectory) {
 		err       error
 	)
 
-	directory, err = ioutil.TempDir(defaultDirectory, name)
+	directory, err = os.MkdirTemp(defaultDirectory, name)
 	require.NoError(t, err)
 
 	handler = temporaryDirectory{
diff --git a/web/api/v1/api.go b/web/api/v1/api.go
index 2c50297f1d..88bedd46a5 100644
--- a/web/api/v1/api.go
+++ b/web/api/v1/api.go
@@ -1317,8 +1317,8 @@ func (api *API) serveFlags(_ *http.Request) apiFuncResult {
 	return apiFuncResult{api.flagsMap, nil, nil, nil}
 }
 
-// stat holds the information about individual cardinality.
-type stat struct {
+// TSDBStat holds the information about individual cardinality.
+type TSDBStat struct {
 	Name  string `json:"name"`
 	Value uint64 `json:"value"`
 }
@@ -1332,26 +1332,27 @@ type HeadStats struct {
 	MaxTime       int64  `json:"maxTime"`
 }
 
-// tsdbStatus has information of cardinality statistics from postings.
-type tsdbStatus struct {
-	HeadStats                   HeadStats `json:"headStats"`
-	SeriesCountByMetricName     []stat    `json:"seriesCountByMetricName"`
-	LabelValueCountByLabelName  []stat    `json:"labelValueCountByLabelName"`
-	MemoryInBytesByLabelName    []stat    `json:"memoryInBytesByLabelName"`
-	SeriesCountByLabelValuePair []stat    `json:"seriesCountByLabelValuePair"`
+// TSDBStatus has information of cardinality statistics from postings.
+type TSDBStatus struct {
+	HeadStats                   HeadStats  `json:"headStats"`
+	SeriesCountByMetricName     []TSDBStat `json:"seriesCountByMetricName"`
+	LabelValueCountByLabelName  []TSDBStat `json:"labelValueCountByLabelName"`
+	MemoryInBytesByLabelName    []TSDBStat `json:"memoryInBytesByLabelName"`
+	SeriesCountByLabelValuePair []TSDBStat `json:"seriesCountByLabelValuePair"`
 }
 
-func convertStats(stats []index.Stat) []stat {
-	result := make([]stat, 0, len(stats))
+// TSDBStatsFromIndexStats converts a index.Stat slice to a TSDBStat slice.
+func TSDBStatsFromIndexStats(stats []index.Stat) []TSDBStat {
+	result := make([]TSDBStat, 0, len(stats))
 	for _, item := range stats {
-		item := stat{Name: item.Name, Value: item.Count}
+		item := TSDBStat{Name: item.Name, Value: item.Count}
 		result = append(result, item)
 	}
 	return result
 }
 
 func (api *API) serveTSDBStatus(*http.Request) apiFuncResult {
-	s, err := api.db.Stats("__name__")
+	s, err := api.db.Stats(labels.MetricName)
 	if err != nil {
 		return apiFuncResult{nil, &apiError{errorInternal, err}, nil, nil}
 	}
@@ -1369,7 +1370,7 @@ func (api *API) serveTSDBStatus(*http.Request) apiFuncResult {
 			}
 		}
 	}
-	return apiFuncResult{tsdbStatus{
+	return apiFuncResult{TSDBStatus{
 		HeadStats: HeadStats{
 			NumSeries:     s.NumSeries,
 			ChunkCount:    chunkCount,
@@ -1377,10 +1378,10 @@ func (api *API) serveTSDBStatus(*http.Request) apiFuncResult {
 			MaxTime:       s.MaxTime,
 			NumLabelPairs: s.IndexPostingStats.NumLabelPairs,
 		},
-		SeriesCountByMetricName:     convertStats(s.IndexPostingStats.CardinalityMetricsStats),
-		LabelValueCountByLabelName:  convertStats(s.IndexPostingStats.CardinalityLabelStats),
-		MemoryInBytesByLabelName:    convertStats(s.IndexPostingStats.LabelValueStats),
-		SeriesCountByLabelValuePair: convertStats(s.IndexPostingStats.LabelValuePairsStats),
+		SeriesCountByMetricName:     TSDBStatsFromIndexStats(s.IndexPostingStats.CardinalityMetricsStats),
+		LabelValueCountByLabelName:  TSDBStatsFromIndexStats(s.IndexPostingStats.CardinalityLabelStats),
+		MemoryInBytesByLabelName:    TSDBStatsFromIndexStats(s.IndexPostingStats.LabelValueStats),
+		SeriesCountByLabelValuePair: TSDBStatsFromIndexStats(s.IndexPostingStats.LabelValuePairsStats),
 	}, nil, nil, nil}
 }
 
diff --git a/web/api/v1/api_test.go b/web/api/v1/api_test.go
index 55155f8bcf..1c999ba33c 100644
--- a/web/api/v1/api_test.go
+++ b/web/api/v1/api_test.go
@@ -17,7 +17,7 @@ import (
 	"context"
 	"encoding/json"
 	"fmt"
-	"io/ioutil"
+	"io"
 	"math"
 	"net/http"
 	"net/http/httptest"
@@ -2288,7 +2288,7 @@ func (f *fakeDB) CleanTombstones() error                               { return
 func (f *fakeDB) Delete(mint, maxt int64, ms ...*labels.Matcher) error { return f.err }
 func (f *fakeDB) Snapshot(dir string, withHead bool) error             { return f.err }
 func (f *fakeDB) Stats(statsByLabelName string) (_ *tsdb.Stats, retErr error) {
-	dbDir, err := ioutil.TempDir("", "tsdb-api-ready")
+	dbDir, err := os.MkdirTemp("", "tsdb-api-ready")
 	if err != nil {
 		return nil, err
 	}
@@ -2501,7 +2501,7 @@ func TestRespondSuccess(t *testing.T) {
 	if err != nil {
 		t.Fatalf("Error on test request: %s", err)
 	}
-	body, err := ioutil.ReadAll(resp.Body)
+	body, err := io.ReadAll(resp.Body)
 	defer resp.Body.Close()
 	if err != nil {
 		t.Fatalf("Error reading response body: %s", err)
@@ -2537,7 +2537,7 @@ func TestRespondError(t *testing.T) {
 	if err != nil {
 		t.Fatalf("Error on test request: %s", err)
 	}
-	body, err := ioutil.ReadAll(resp.Body)
+	body, err := io.ReadAll(resp.Body)
 	defer resp.Body.Close()
 	if err != nil {
 		t.Fatalf("Error reading response body: %s", err)
@@ -2893,7 +2893,7 @@ func TestRespond(t *testing.T) {
 		if err != nil {
 			t.Fatalf("Error on test request: %s", err)
 		}
-		body, err := ioutil.ReadAll(resp.Body)
+		body, err := io.ReadAll(resp.Body)
 		defer resp.Body.Close()
 		if err != nil {
 			t.Fatalf("Error reading response body: %s", err)
diff --git a/web/federate_test.go b/web/federate_test.go
index 8bdef3fa8e..d79a77f199 100644
--- a/web/federate_test.go
+++ b/web/federate_test.go
@@ -162,7 +162,7 @@ test_metric_without_labels{instance=""} 1001 6000000
 	},
 	"external labels are added if not already present": {
 		params:         "match[]={__name__=~'.%2b'}", // '%2b' is an URL-encoded '+'.
-		externalLabels: labels.Labels{{Name: "zone", Value: "ie"}, {Name: "foo", Value: "baz"}},
+		externalLabels: labels.Labels{{Name: "foo", Value: "baz"}, {Name: "zone", Value: "ie"}},
 		code:           200,
 		body: `# TYPE test_metric1 untyped
 test_metric1{foo="bar",instance="i",zone="ie"} 10000 6000000
diff --git a/web/ui/module/codemirror-promql/package.json b/web/ui/module/codemirror-promql/package.json
index fc9837f9de..9e66f4d759 100644
--- a/web/ui/module/codemirror-promql/package.json
+++ b/web/ui/module/codemirror-promql/package.json
@@ -8,7 +8,7 @@
   "scripts": {
     "build": "npm run build:lib",
     "build:lib": "bash ./build.sh",
-    "test": "NODE_OPTIONS=--experimental-vm-modules jest",
+    "test": "NODE_OPTIONS=--experimental-vm-modules jest --runInBand",
     "lint": "eslint src/ --ext .ts",
     "lint:fix": "eslint --fix src/ --ext .ts"
   },
diff --git a/web/ui/module/codemirror-promql/src/complete/promql.terms.ts b/web/ui/module/codemirror-promql/src/complete/promql.terms.ts
index 5b2da2088e..f793ddbd28 100644
--- a/web/ui/module/codemirror-promql/src/complete/promql.terms.ts
+++ b/web/ui/module/codemirror-promql/src/complete/promql.terms.ts
@@ -177,6 +177,12 @@ export const functionIdentifierTerms = [
     info: 'Return the day of the week for provided timestamps',
     type: 'function',
   },
+  {
+    label: 'day_of_year',
+    detail: 'function',
+    info: 'Return the day of the year for provided timestamps',
+    type: 'function',
+  },
   {
     label: 'deg',
     detail: 'function',
diff --git a/web/ui/module/codemirror-promql/src/promql.ts b/web/ui/module/codemirror-promql/src/promql.ts
index d9b573071a..e20a15c97f 100644
--- a/web/ui/module/codemirror-promql/src/promql.ts
+++ b/web/ui/module/codemirror-promql/src/promql.ts
@@ -35,7 +35,7 @@ export function promQLLanguage(top: LanguageType): LRLanguage {
           StringLiteral: tags.string,
           NumberLiteral: tags.number,
           Duration: tags.number,
-          'Abs Absent AbsentOverTime Acos Acosh Asin Asinh Atan Atanh AvgOverTime Ceil Changes Clamp ClampMax ClampMin Cos Cosh CountOverTime DaysInMonth DayOfMonth DayOfWeek Deg Delta Deriv Exp Floor HistogramQuantile HoltWinters Hour Idelta Increase Irate LabelReplace LabelJoin LastOverTime Ln Log10 Log2 MaxOverTime MinOverTime Minute Month Pi PredictLinear PresentOverTime QuantileOverTime Rad Rate Resets Round Scalar Sgn Sin Sinh Sort SortDesc Sqrt StddevOverTime StdvarOverTime SumOverTime Tan Tanh Time Timestamp Vector Year':
+          'Abs Absent AbsentOverTime Acos Acosh Asin Asinh Atan Atanh AvgOverTime Ceil Changes Clamp ClampMax ClampMin Cos Cosh CountOverTime DaysInMonth DayOfMonth DayOfWeek DayOfYear Deg Delta Deriv Exp Floor HistogramQuantile HoltWinters Hour Idelta Increase Irate LabelReplace LabelJoin LastOverTime Ln Log10 Log2 MaxOverTime MinOverTime Minute Month Pi PredictLinear PresentOverTime QuantileOverTime Rad Rate Resets Round Scalar Sgn Sin Sinh Sort SortDesc Sqrt StddevOverTime StdvarOverTime SumOverTime Tan Tanh Time Timestamp Vector Year':
             tags.function(tags.variableName),
           'Avg Bottomk Count Count_values Group Max Min Quantile Stddev Stdvar Sum Topk': tags.operatorKeyword,
           'By Without Bool On Ignoring GroupLeft GroupRight Offset Start End': tags.modifier,
diff --git a/web/ui/module/codemirror-promql/src/types/function.ts b/web/ui/module/codemirror-promql/src/types/function.ts
index 2c8723f8c8..9f99d359d0 100644
--- a/web/ui/module/codemirror-promql/src/types/function.ts
+++ b/web/ui/module/codemirror-promql/src/types/function.ts
@@ -32,6 +32,7 @@ import {
   CountOverTime,
   DayOfMonth,
   DayOfWeek,
+  DayOfYear,
   DaysInMonth,
   Deg,
   Delta,
@@ -224,6 +225,12 @@ const promqlFunctions: { [key: number]: PromQLFunction } = {
     variadic: 1,
     returnType: ValueType.vector,
   },
+  [DayOfYear]: {
+    name: 'day_of_year',
+    argTypes: [ValueType.vector],
+    variadic: 1,
+    returnType: ValueType.vector,
+  },
   [Deg]: {
     name: 'deg',
     argTypes: [ValueType.vector],
diff --git a/web/ui/module/lezer-promql/src/promql.grammar b/web/ui/module/lezer-promql/src/promql.grammar
index 642d25f109..8efc9a8a16 100644
--- a/web/ui/module/lezer-promql/src/promql.grammar
+++ b/web/ui/module/lezer-promql/src/promql.grammar
@@ -140,6 +140,7 @@ FunctionIdentifier {
   DaysInMonth |
   DayOfMonth |
   DayOfWeek |
+  DayOfYear |
   Deg |
   Delta |
   Deriv |
@@ -378,6 +379,7 @@ NumberLiteral  {
   DaysInMonth { condFn<"days_in_month"> }
   DayOfMonth { condFn<"day_of_month"> }
   DayOfWeek { condFn<"day_of_week"> }
+  DayOfYear { condFn<"day_of_year"> }
   Deg { condFn<"deg"> }
   Delta { condFn<"delta"> }
   Deriv { condFn<"deriv"> }
diff --git a/web/ui/package-lock.json b/web/ui/package-lock.json
index 151912d9e5..a7d6d74e39 100644
--- a/web/ui/package-lock.json
+++ b/web/ui/package-lock.json
@@ -2964,16 +2964,16 @@
       }
     },
     "node_modules/@nexucis/fuzzy": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/@nexucis/fuzzy/-/fuzzy-0.3.0.tgz",
-      "integrity": "sha512-Z1+ADKY0fxdBE28REraWhUCNy+Bp5UmpK3Tc/5wdCDpY+6fXh8l2csMtbPGaqEBsyGLxJz9wUYGCf+CW9unyvQ=="
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/@nexucis/fuzzy/-/fuzzy-0.4.0.tgz",
+      "integrity": "sha512-VZVzETBXJjFzTd5RmKR+X8V5uM9PKM2yyb7v/aygMF+1iAnZwxzQtxbFx358SNP23eid4s85TIREHw50p8Zugg=="
     },
     "node_modules/@nexucis/kvsearch": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/@nexucis/kvsearch/-/kvsearch-0.5.0.tgz",
-      "integrity": "sha512-7TtH+Ug7o7Cjm8HogsXCgq8JNihINE0zZj7JMJXF5PxhF7MhwC9yHe6Gm4+ckt6seOXOFf+g/cZ6hWtVMiR3cQ==",
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/@nexucis/kvsearch/-/kvsearch-0.7.0.tgz",
+      "integrity": "sha512-Zl1u0wUpgpfY1JmHIKyLuqDdN5iTm/wuLXbBbm//Qck/un9ivGYtePpT1/BjG/2XisBsvHb7EldMAuRQaUahtg==",
       "dependencies": {
-        "@nexucis/fuzzy": "^0.3.0"
+        "@nexucis/fuzzy": "^0.4.0"
       }
     },
     "node_modules/@nodelib/fs.scandir": {
@@ -3617,7 +3617,7 @@
       "version": "1.19.2",
       "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
       "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
-      "dev": true,
+      "devOptional": true,
       "dependencies": {
         "@types/connect": "*",
         "@types/node": "*"
@@ -3645,7 +3645,7 @@
       "version": "3.4.35",
       "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
       "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
-      "dev": true,
+      "devOptional": true,
       "dependencies": {
         "@types/node": "*"
       }
@@ -3700,7 +3700,7 @@
       "version": "4.17.13",
       "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
       "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
-      "dev": true,
+      "devOptional": true,
       "dependencies": {
         "@types/body-parser": "*",
         "@types/express-serve-static-core": "^4.17.18",
@@ -3712,7 +3712,7 @@
       "version": "4.17.28",
       "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz",
       "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==",
-      "dev": true,
+      "devOptional": true,
       "dependencies": {
         "@types/node": "*",
         "@types/qs": "*",
@@ -3753,7 +3753,6 @@
       "version": "1.17.8",
       "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz",
       "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==",
-      "dev": true,
       "dependencies": {
         "@types/node": "*"
       }
@@ -3823,13 +3822,12 @@
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
       "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==",
-      "dev": true
+      "devOptional": true
     },
     "node_modules/@types/node": {
       "version": "17.0.23",
       "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz",
-      "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==",
-      "dev": true
+      "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw=="
     },
     "node_modules/@types/parse-json": {
       "version": "4.0.0",
@@ -3859,13 +3857,13 @@
       "version": "6.9.7",
       "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
       "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
-      "dev": true
+      "devOptional": true
     },
     "node_modules/@types/range-parser": {
       "version": "1.2.4",
       "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
       "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==",
-      "dev": true
+      "devOptional": true
     },
     "node_modules/@types/react": {
       "version": "17.0.41",
@@ -3984,7 +3982,7 @@
       "version": "1.13.10",
       "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
       "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
-      "dev": true,
+      "devOptional": true,
       "dependencies": {
         "@types/mime": "^1",
         "@types/node": "*"
@@ -7969,8 +7967,7 @@
     "node_modules/eventemitter3": {
       "version": "4.0.7",
       "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
-      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
-      "dev": true
+      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
     },
     "node_modules/events": {
       "version": "3.3.0",
@@ -8338,7 +8335,6 @@
       "version": "1.14.9",
       "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz",
       "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==",
-      "dev": true,
       "funding": [
         {
           "type": "individual",
@@ -9080,7 +9076,6 @@
       "version": "1.18.1",
       "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
       "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
-      "dev": true,
       "dependencies": {
         "eventemitter3": "^4.0.0",
         "follow-redirects": "^1.0.0",
@@ -9105,10 +9100,9 @@
       }
     },
     "node_modules/http-proxy-middleware": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz",
-      "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==",
-      "dev": true,
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz",
+      "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==",
       "dependencies": {
         "@types/http-proxy": "^1.17.8",
         "http-proxy": "^1.18.1",
@@ -9542,7 +9536,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
       "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
-      "dev": true,
       "engines": {
         "node": ">=10"
       },
@@ -11040,7 +11033,6 @@
       "version": "4.0.4",
       "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
       "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
-      "dev": true,
       "dependencies": {
         "braces": "^3.0.1",
         "picomatch": "^2.2.3"
@@ -14235,8 +14227,7 @@
     "node_modules/requires-port": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
-      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
-      "dev": true
+      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
     },
     "node_modules/resize-observer-polyfill": {
       "version": "1.5.1",
@@ -17340,12 +17331,13 @@
         "@fortawesome/fontawesome-svg-core": "6.1.1",
         "@fortawesome/free-solid-svg-icons": "6.1.1",
         "@fortawesome/react-fontawesome": "0.1.17",
-        "@nexucis/fuzzy": "^0.3.0",
-        "@nexucis/kvsearch": "^0.5.0",
+        "@nexucis/fuzzy": "^0.4.0",
+        "@nexucis/kvsearch": "^0.7.0",
         "bootstrap": "^4.6.1",
         "codemirror-promql": "0.19.0",
         "css.escape": "^1.5.1",
         "downshift": "^6.1.7",
+        "http-proxy-middleware": "^2.0.6",
         "jquery": "^3.5.1",
         "jquery.flot.tooltip": "^0.9.0",
         "moment": "^2.29.2",
@@ -19504,16 +19496,16 @@
       }
     },
     "@nexucis/fuzzy": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/@nexucis/fuzzy/-/fuzzy-0.3.0.tgz",
-      "integrity": "sha512-Z1+ADKY0fxdBE28REraWhUCNy+Bp5UmpK3Tc/5wdCDpY+6fXh8l2csMtbPGaqEBsyGLxJz9wUYGCf+CW9unyvQ=="
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/@nexucis/fuzzy/-/fuzzy-0.4.0.tgz",
+      "integrity": "sha512-VZVzETBXJjFzTd5RmKR+X8V5uM9PKM2yyb7v/aygMF+1iAnZwxzQtxbFx358SNP23eid4s85TIREHw50p8Zugg=="
     },
     "@nexucis/kvsearch": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/@nexucis/kvsearch/-/kvsearch-0.5.0.tgz",
-      "integrity": "sha512-7TtH+Ug7o7Cjm8HogsXCgq8JNihINE0zZj7JMJXF5PxhF7MhwC9yHe6Gm4+ckt6seOXOFf+g/cZ6hWtVMiR3cQ==",
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/@nexucis/kvsearch/-/kvsearch-0.7.0.tgz",
+      "integrity": "sha512-Zl1u0wUpgpfY1JmHIKyLuqDdN5iTm/wuLXbBbm//Qck/un9ivGYtePpT1/BjG/2XisBsvHb7EldMAuRQaUahtg==",
       "requires": {
-        "@nexucis/fuzzy": "^0.3.0"
+        "@nexucis/fuzzy": "^0.4.0"
       }
     },
     "@nodelib/fs.scandir": {
@@ -19941,7 +19933,7 @@
       "version": "1.19.2",
       "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
       "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
-      "dev": true,
+      "devOptional": true,
       "requires": {
         "@types/connect": "*",
         "@types/node": "*"
@@ -19969,7 +19961,7 @@
       "version": "3.4.35",
       "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
       "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
-      "dev": true,
+      "devOptional": true,
       "requires": {
         "@types/node": "*"
       }
@@ -20024,7 +20016,7 @@
       "version": "4.17.13",
       "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
       "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
-      "dev": true,
+      "devOptional": true,
       "requires": {
         "@types/body-parser": "*",
         "@types/express-serve-static-core": "^4.17.18",
@@ -20036,7 +20028,7 @@
       "version": "4.17.28",
       "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz",
       "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==",
-      "dev": true,
+      "devOptional": true,
       "requires": {
         "@types/node": "*",
         "@types/qs": "*",
@@ -20077,7 +20069,6 @@
       "version": "1.17.8",
       "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz",
       "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==",
-      "dev": true,
       "requires": {
         "@types/node": "*"
       }
@@ -20147,13 +20138,12 @@
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
       "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==",
-      "dev": true
+      "devOptional": true
     },
     "@types/node": {
       "version": "17.0.23",
       "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz",
-      "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==",
-      "dev": true
+      "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw=="
     },
     "@types/parse-json": {
       "version": "4.0.0",
@@ -20183,13 +20173,13 @@
       "version": "6.9.7",
       "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
       "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
-      "dev": true
+      "devOptional": true
     },
     "@types/range-parser": {
       "version": "1.2.4",
       "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
       "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==",
-      "dev": true
+      "devOptional": true
     },
     "@types/react": {
       "version": "17.0.41",
@@ -20307,7 +20297,7 @@
       "version": "1.13.10",
       "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
       "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
-      "dev": true,
+      "devOptional": true,
       "requires": {
         "@types/mime": "^1",
         "@types/node": "*"
@@ -23342,8 +23332,7 @@
     "eventemitter3": {
       "version": "4.0.7",
       "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
-      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
-      "dev": true
+      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
     },
     "events": {
       "version": "3.3.0",
@@ -23641,8 +23630,7 @@
     "follow-redirects": {
       "version": "1.14.9",
       "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz",
-      "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==",
-      "dev": true
+      "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w=="
     },
     "fork-ts-checker-webpack-plugin": {
       "version": "6.5.0",
@@ -23963,8 +23951,8 @@
         "@fortawesome/fontawesome-svg-core": "6.1.1",
         "@fortawesome/free-solid-svg-icons": "6.1.1",
         "@fortawesome/react-fontawesome": "0.1.17",
-        "@nexucis/fuzzy": "^0.3.0",
-        "@nexucis/kvsearch": "^0.5.0",
+        "@nexucis/fuzzy": "^0.4.0",
+        "@nexucis/kvsearch": "^0.7.0",
         "@testing-library/react-hooks": "^7.0.1",
         "@types/enzyme": "^3.10.10",
         "@types/flot": "0.0.32",
@@ -23984,6 +23972,7 @@
         "enzyme": "^3.11.0",
         "enzyme-to-json": "^3.6.2",
         "fsevents": "^2.3.2",
+        "http-proxy-middleware": "^2.0.6",
         "jquery": "^3.5.1",
         "jquery.flot.tooltip": "^0.9.0",
         "moment": "^2.29.2",
@@ -24241,7 +24230,6 @@
       "version": "1.18.1",
       "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
       "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
-      "dev": true,
       "requires": {
         "eventemitter3": "^4.0.0",
         "follow-redirects": "^1.0.0",
@@ -24260,10 +24248,9 @@
       }
     },
     "http-proxy-middleware": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz",
-      "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==",
-      "dev": true,
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz",
+      "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==",
       "requires": {
         "@types/http-proxy": "^1.17.8",
         "http-proxy": "^1.18.1",
@@ -24556,8 +24543,7 @@
     "is-plain-obj": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
-      "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
-      "dev": true
+      "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA=="
     },
     "is-plain-object": {
       "version": "5.0.0",
@@ -25736,7 +25722,6 @@
       "version": "4.0.4",
       "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
       "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
-      "dev": true,
       "requires": {
         "braces": "^3.0.1",
         "picomatch": "^2.2.3"
@@ -28005,8 +27990,7 @@
     "requires-port": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
-      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
-      "dev": true
+      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
     },
     "resize-observer-polyfill": {
       "version": "1.5.1",
diff --git a/web/ui/react-app/package.json b/web/ui/react-app/package.json
index 0bbab0ade6..ee2dc8ed77 100644
--- a/web/ui/react-app/package.json
+++ b/web/ui/react-app/package.json
@@ -19,12 +19,13 @@
     "@fortawesome/fontawesome-svg-core": "6.1.1",
     "@fortawesome/free-solid-svg-icons": "6.1.1",
     "@fortawesome/react-fontawesome": "0.1.17",
-    "@nexucis/fuzzy": "^0.3.0",
-    "@nexucis/kvsearch": "^0.5.0",
+    "@nexucis/fuzzy": "^0.4.0",
+    "@nexucis/kvsearch": "^0.7.0",
     "bootstrap": "^4.6.1",
     "codemirror-promql": "0.19.0",
     "css.escape": "^1.5.1",
     "downshift": "^6.1.7",
+    "http-proxy-middleware": "^2.0.6",
     "jquery": "^3.5.1",
     "jquery.flot.tooltip": "^0.9.0",
     "moment": "^2.29.2",
@@ -83,7 +84,6 @@
     "mutationobserver-shim": "^0.3.7",
     "sinon": "^13.0.1"
   },
-  "proxy": "http://localhost:9090",
   "jest": {
     "snapshotSerializers": [
       "enzyme-to-json/serializer"
diff --git a/web/ui/react-app/src/components/SearchBar.tsx b/web/ui/react-app/src/components/SearchBar.tsx
index 761b290684..23aa515ad7 100644
--- a/web/ui/react-app/src/components/SearchBar.tsx
+++ b/web/ui/react-app/src/components/SearchBar.tsx
@@ -1,29 +1,34 @@
-import React, { ChangeEvent, FC } from 'react';
+import React, { ChangeEvent, FC, useEffect } from 'react';
 import { Input, InputGroup, InputGroupAddon, InputGroupText } from 'reactstrap';
 import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
 import { faSearch } from '@fortawesome/free-solid-svg-icons';
 
 export interface SearchBarProps {
-  handleChange: (e: ChangeEvent) => void;
+  handleChange: (e: string) => void;
   placeholder: string;
+  defaultValue: string;
 }
 
-const SearchBar: FC = ({ handleChange, placeholder }) => {
+const SearchBar: FC = ({ handleChange, placeholder, defaultValue }) => {
   let filterTimeout: NodeJS.Timeout;
 
   const handleSearchChange = (e: ChangeEvent) => {
     clearTimeout(filterTimeout);
     filterTimeout = setTimeout(() => {
-      handleChange(e);
+      handleChange(e.target.value);
     }, 300);
   };
 
+  useEffect(() => {
+    handleChange(defaultValue);
+  }, [defaultValue, handleChange]);
+
   return (
     
       
         {}
       
-      
+      
     
   );
 };
diff --git a/web/ui/react-app/src/pages/alerts/AlertContents.tsx b/web/ui/react-app/src/pages/alerts/AlertContents.tsx
index affc39df9d..2837399f7c 100644
--- a/web/ui/react-app/src/pages/alerts/AlertContents.tsx
+++ b/web/ui/react-app/src/pages/alerts/AlertContents.tsx
@@ -1,8 +1,8 @@
-import React, { ChangeEvent, FC, Fragment, useEffect, useState } from 'react';
+import React, { FC, Fragment, useCallback, useEffect, useMemo, useState } from 'react';
 import { Badge, Col, Row } from 'reactstrap';
 import CollapsibleAlertPanel from './CollapsibleAlertPanel';
 import Checkbox from '../../components/Checkbox';
-import { isPresent } from '../../utils';
+import { getQuerySearchFilter, isPresent, setQuerySearchFilter } from '../../utils';
 import { Rule } from '../../types/types';
 import { useLocalStorage } from '../../hooks/useLocalStorage';
 import CustomInfiniteScroll, { InfiniteScrollItemsProps } from '../../components/CustomInfiniteScroll';
@@ -71,7 +71,6 @@ const AlertsContent: FC = ({ groups = [], statsCount }) => {
     inactive: true,
   });
   const [showAnnotations, setShowAnnotations] = useLocalStorage('alerts-annotations-status', { checked: false });
-
   const toggleFilter = (ruleState: RuleState) => () => {
     setFilter({
       ...filter,
@@ -79,26 +78,32 @@ const AlertsContent: FC = ({ groups = [], statsCount }) => {
     });
   };
 
-  const handleSearchChange = (e: ChangeEvent) => {
-    if (e.target.value !== '') {
-      const pattern = e.target.value.trim();
-      const result: RuleGroup[] = [];
-      for (const group of groups) {
-        const ruleFilterList = kvSearchRule.filter(pattern, group.rules);
-        if (ruleFilterList.length > 0) {
-          result.push({
-            file: group.file,
-            name: group.name,
-            interval: group.interval,
-            rules: ruleFilterList.map((value) => value.original),
-          });
+  const handleSearchChange = useCallback(
+    (value: string) => {
+      setQuerySearchFilter(value);
+      if (value !== '') {
+        const pattern = value.trim();
+        const result: RuleGroup[] = [];
+        for (const group of groups) {
+          const ruleFilterList = kvSearchRule.filter(pattern, group.rules);
+          if (ruleFilterList.length > 0) {
+            result.push({
+              file: group.file,
+              name: group.name,
+              interval: group.interval,
+              rules: ruleFilterList.map((value) => value.original),
+            });
+          }
         }
+        setGroupList(result);
+      } else {
+        setGroupList(groups);
       }
-      setGroupList(result);
-    } else {
-      setGroupList(groups);
-    }
-  };
+    },
+    [groups]
+  );
+
+  const defaultValue = useMemo(getQuerySearchFilter, []);
 
   useEffect(() => {
     const result: RuleGroup[] = [];
@@ -131,7 +136,7 @@ const AlertsContent: FC = ({ groups = [], statsCount }) => {
           })}
         
         
-          
+          
         
         
           
       
diff --git a/web/ui/react-app/src/pages/serviceDiscovery/Services.tsx b/web/ui/react-app/src/pages/serviceDiscovery/Services.tsx
index ea7fd9462c..21bf2259b9 100644
--- a/web/ui/react-app/src/pages/serviceDiscovery/Services.tsx
+++ b/web/ui/react-app/src/pages/serviceDiscovery/Services.tsx
@@ -1,10 +1,10 @@
-import React, { ChangeEvent, FC, useEffect, useState } from 'react';
+import React, { FC, useCallback, useEffect, useMemo, useState } from 'react';
 import { useFetch } from '../../hooks/useFetch';
 import { LabelsTable } from './LabelsTable';
 import { DroppedTarget, Labels, Target } from '../targets/target';
 
 import { withStatusIndicator } from '../../components/withStatusIndicator';
-import { mapObjEntries } from '../../utils';
+import { setQuerySearchFilter, mapObjEntries, getQuerySearchFilter } from '../../utils';
 import { usePathPrefix } from '../../contexts/PathPrefixContext';
 import { API_PATH } from '../../constants/constants';
 import { KVSearch } from '@nexucis/kvsearch';
@@ -22,11 +22,16 @@ export interface TargetLabels {
   isDropped: boolean;
 }
 
-const kvSearch = new KVSearch({
+const activeTargetKVSearch = new KVSearch({
   shouldSort: true,
   indexedKeys: ['labels', 'discoveredLabels', ['discoveredLabels', /.*/], ['labels', /.*/]],
 });
 
+const droppedTargetKVSearch = new KVSearch({
+  shouldSort: true,
+  indexedKeys: ['discoveredLabels', ['discoveredLabels', /.*/]],
+});
+
 export const processSummary = (
   activeTargets: Target[],
   droppedTargets: DroppedTarget[]
@@ -91,28 +96,37 @@ export const processTargets = (activeTargets: Target[], droppedTargets: DroppedT
 
 export const ServiceDiscoveryContent: FC = ({ activeTargets, droppedTargets }) => {
   const [activeTargetList, setActiveTargetList] = useState(activeTargets);
+  const [droppedTargetList, setDroppedTargetList] = useState(droppedTargets);
   const [targetList, setTargetList] = useState(processSummary(activeTargets, droppedTargets));
   const [labelList, setLabelList] = useState(processTargets(activeTargets, droppedTargets));
 
-  const handleSearchChange = (e: ChangeEvent) => {
-    if (e.target.value !== '') {
-      const result = kvSearch.filter(e.target.value.trim(), activeTargets);
-      setActiveTargetList(result.map((value) => value.original));
-    } else {
-      setActiveTargetList(activeTargets);
-    }
-  };
+  const handleSearchChange = useCallback(
+    (value: string) => {
+      setQuerySearchFilter(value);
+      if (value !== '') {
+        const activeTargetResult = activeTargetKVSearch.filter(value.trim(), activeTargets);
+        const droppedTargetResult = droppedTargetKVSearch.filter(value.trim(), droppedTargets);
+        setActiveTargetList(activeTargetResult.map((value) => value.original));
+        setDroppedTargetList(droppedTargetResult.map((value) => value.original));
+      } else {
+        setActiveTargetList(activeTargets);
+      }
+    },
+    [activeTargets, droppedTargets]
+  );
+
+  const defaultValue = useMemo(getQuerySearchFilter, []);
 
   useEffect(() => {
-    setTargetList(processSummary(activeTargetList, droppedTargets));
-    setLabelList(processTargets(activeTargetList, droppedTargets));
-  }, [activeTargetList, droppedTargets]);
+    setTargetList(processSummary(activeTargetList, droppedTargetList));
+    setLabelList(processTargets(activeTargetList, droppedTargetList));
+  }, [activeTargetList, droppedTargetList]);
 
   return (
     <>
       

Service Discovery

- +
    {mapObjEntries(targetList, ([k, v]) => ( diff --git a/web/ui/react-app/src/pages/targets/ScrapePoolList.tsx b/web/ui/react-app/src/pages/targets/ScrapePoolList.tsx index d401f772c9..d7078128e8 100644 --- a/web/ui/react-app/src/pages/targets/ScrapePoolList.tsx +++ b/web/ui/react-app/src/pages/targets/ScrapePoolList.tsx @@ -4,7 +4,7 @@ import { useFetch } from '../../hooks/useFetch'; import { API_PATH } from '../../constants/constants'; import { groupTargets, ScrapePool, ScrapePools, Target } from './target'; import { withStatusIndicator } from '../../components/withStatusIndicator'; -import { ChangeEvent, FC, useEffect, useState } from 'react'; +import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { Col, Collapse, Row } from 'reactstrap'; import { ScrapePoolContent } from './ScrapePoolContent'; import Filter, { Expanded, FilterData } from './Filter'; @@ -12,6 +12,7 @@ import { useLocalStorage } from '../../hooks/useLocalStorage'; import styles from './ScrapePoolPanel.module.css'; import { ToggleMoreLess } from '../../components/ToggleMoreLess'; import SearchBar from '../../components/SearchBar'; +import { setQuerySearchFilter, getQuerySearchFilter } from '../../utils/index'; interface ScrapePoolListProps { activeTargets: Target[]; @@ -72,14 +73,20 @@ const ScrapePoolListContent: FC = ({ activeTargets }) => { const [expanded, setExpanded] = useLocalStorage('targets-page-expansion-state', initialExpanded); const { showHealthy, showUnhealthy } = filter; - const handleSearchChange = (e: ChangeEvent) => { - if (e.target.value !== '') { - const result = kvSearch.filter(e.target.value.trim(), activeTargets); - setTargetList(result.map((value) => value.original)); - } else { - setTargetList(activeTargets); - } - }; + const handleSearchChange = useCallback( + (value: string) => { + setQuerySearchFilter(value); + if (value !== '') { + const result = kvSearch.filter(value.trim(), activeTargets); + setTargetList(result.map((value) => value.original)); + } else { + setTargetList(activeTargets); + } + }, + [activeTargets] + ); + + const defaultValue = useMemo(getQuerySearchFilter, []); useEffect(() => { const list = targetList.filter((t) => showHealthy || t.health.toLowerCase() !== 'up'); @@ -93,7 +100,11 @@ const ScrapePoolListContent: FC = ({ activeTargets }) => { - + {Object.keys(poolList) diff --git a/web/ui/react-app/src/setupProxy.js b/web/ui/react-app/src/setupProxy.js new file mode 100644 index 0000000000..f7f54c4a27 --- /dev/null +++ b/web/ui/react-app/src/setupProxy.js @@ -0,0 +1,11 @@ +const { createProxyMiddleware } = require('http-proxy-middleware'); + +module.exports = function(app) { + app.use( + '/api', + createProxyMiddleware({ + target: 'http://localhost:9090', + changeOrigin: true, + }) + ); +}; diff --git a/web/ui/react-app/src/utils/index.ts b/web/ui/react-app/src/utils/index.ts index ca714970f5..5e05c25e16 100644 --- a/web/ui/react-app/src/utils/index.ts +++ b/web/ui/react-app/src/utils/index.ts @@ -243,9 +243,21 @@ export const encodePanelOptionsToQueryString = (panels: PanelMeta[]): string => return `?${panels.map(toQueryString).join('&')}`; }; +export const setQuerySearchFilter = (search: string) => { + window.history.pushState({}, '', `?search=${search}`); +}; + +export const getQuerySearchFilter = (): string => { + const locationSearch = window.location.search; + const params = new URLSearchParams(locationSearch); + const search = params.get('search') || ''; + return search; +}; + export const createExpressionLink = (expr: string): string => { return `../graph?g0.expr=${encodeURIComponent(expr)}&g0.tab=1&g0.stacked=0&g0.show_exemplars=0.g0.range_input=1h.`; }; + export const mapObjEntries = ( o: T, cb: ([k, v]: [string, T[key]], i: number, arr: [string, T[key]][]) => Z diff --git a/web/web.go b/web/web.go index 0574549e5a..43cfc96e7a 100644 --- a/web/web.go +++ b/web/web.go @@ -19,7 +19,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" stdlog "log" "math" "net" @@ -110,6 +109,7 @@ type metrics struct { requestCounter *prometheus.CounterVec requestDuration *prometheus.HistogramVec responseSize *prometheus.HistogramVec + readyStatus prometheus.Gauge } func newMetrics(r prometheus.Registerer) *metrics { @@ -137,10 +137,14 @@ func newMetrics(r prometheus.Registerer) *metrics { }, []string{"handler"}, ), + readyStatus: prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "prometheus_ready", + Help: "Whether Prometheus startup was fully completed and the server is ready for normal operation.", + }), } if r != nil { - r.MustRegister(m.requestCounter, m.requestDuration, m.responseSize) + r.MustRegister(m.requestCounter, m.requestDuration, m.responseSize, m.readyStatus) registerFederationMetrics(r) } return m @@ -254,6 +258,7 @@ type Options struct { RemoteReadBytesInFrame int EnableRemoteWriteReceiver bool IsAgent bool + AppName string Gatherer prometheus.Gatherer Registerer prometheus.Registerer @@ -302,7 +307,7 @@ func New(logger log.Logger, o *Options) *Handler { now: model.Now, } - h.ready.Store(0) + h.SetReady(false) factoryTr := func(_ context.Context) api_v1.TargetRetriever { return h.scrapeManager } factoryAr := func(_ context.Context) api_v1.AlertmanagerRetriever { return h.notifier } @@ -386,7 +391,7 @@ func New(logger log.Logger, o *Options) *Handler { return } defer func() { _ = f.Close() }() - idx, err := ioutil.ReadAll(f) + idx, err := io.ReadAll(f) if err != nil { w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, "Error reading React index.html: %v", err) @@ -464,11 +469,11 @@ func New(logger log.Logger, o *Options) *Handler { router.Get("/-/healthy", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) - fmt.Fprintf(w, "Prometheus is Healthy.\n") + fmt.Fprintf(w, o.AppName+" is Healthy.\n") }) router.Get("/-/ready", readyf(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) - fmt.Fprintf(w, "Prometheus is Ready.\n") + fmt.Fprintf(w, o.AppName+" is Ready.\n") })) return h @@ -504,9 +509,16 @@ func serveDebug(w http.ResponseWriter, req *http.Request) { } } -// Ready sets Handler to be ready. -func (h *Handler) Ready() { - h.ready.Store(1) +// SetReady sets the ready status of our web Handler +func (h *Handler) SetReady(v bool) { + if v { + h.ready.Store(1) + h.metrics.readyStatus.Set(1) + return + } + + h.ready.Store(0) + h.metrics.readyStatus.Set(0) } // Verifies whether the server is ready or not. @@ -615,7 +627,7 @@ func (h *Handler) consoles(w http.ResponseWriter, r *http.Request) { return } defer file.Close() - text, err := ioutil.ReadAll(file) + text, err := io.ReadAll(file) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return diff --git a/web/web_test.go b/web/web_test.go index d5683840d5..102b30a15b 100644 --- a/web/web_test.go +++ b/web/web_test.go @@ -18,7 +18,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net" "net/http" "net/http/httptest" @@ -147,7 +146,7 @@ func TestReadyAndHealthy(t *testing.T) { cleanupTestResponse(t, resp) // Set to ready. - webHandler.Ready() + webHandler.SetReady(true) for _, u := range []string{ baseURL + "/-/healthy", @@ -246,7 +245,7 @@ func TestRoutePrefix(t *testing.T) { cleanupTestResponse(t, resp) // Set to ready. - webHandler.Ready() + webHandler.SetReady(true) resp, err = http.Get(baseURL + opts.RoutePrefix + "/-/healthy") require.NoError(t, err) @@ -293,7 +292,7 @@ func TestDebugHandler(t *testing.T) { }, } handler := New(nil, opts) - handler.Ready() + handler.SetReady(true) w := httptest.NewRecorder() @@ -330,16 +329,28 @@ func TestHTTPMetrics(t *testing.T) { code := getReady() require.Equal(t, http.StatusServiceUnavailable, code) + ready := handler.metrics.readyStatus + require.Equal(t, 0, int(prom_testutil.ToFloat64(ready))) counter := handler.metrics.requestCounter require.Equal(t, 1, int(prom_testutil.ToFloat64(counter.WithLabelValues("/-/ready", strconv.Itoa(http.StatusServiceUnavailable))))) - handler.Ready() + handler.SetReady(true) for range [2]int{} { code = getReady() require.Equal(t, http.StatusOK, code) } + require.Equal(t, 1, int(prom_testutil.ToFloat64(ready))) require.Equal(t, 2, int(prom_testutil.ToFloat64(counter.WithLabelValues("/-/ready", strconv.Itoa(http.StatusOK))))) require.Equal(t, 1, int(prom_testutil.ToFloat64(counter.WithLabelValues("/-/ready", strconv.Itoa(http.StatusServiceUnavailable))))) + + handler.SetReady(false) + for range [2]int{} { + code = getReady() + require.Equal(t, http.StatusServiceUnavailable, code) + } + require.Equal(t, 0, int(prom_testutil.ToFloat64(ready))) + require.Equal(t, 2, int(prom_testutil.ToFloat64(counter.WithLabelValues("/-/ready", strconv.Itoa(http.StatusOK))))) + require.Equal(t, 3, int(prom_testutil.ToFloat64(counter.WithLabelValues("/-/ready", strconv.Itoa(http.StatusServiceUnavailable))))) } func TestShutdownWithStaleConnection(t *testing.T) { @@ -511,7 +522,7 @@ func TestAgentAPIEndPoints(t *testing.T) { opts.Flags = map[string]string{} webHandler := New(nil, opts) - webHandler.Ready() + webHandler.SetReady(true) webHandler.config = &config.Config{} webHandler.notifier = ¬ifier.Manager{} l, err := webHandler.Listener() @@ -578,7 +589,7 @@ func TestAgentAPIEndPoints(t *testing.T) { } func cleanupTestResponse(t *testing.T, resp *http.Response) { - _, err := io.Copy(ioutil.Discard, resp.Body) + _, err := io.Copy(io.Discard, resp.Body) require.NoError(t, err) require.NoError(t, resp.Body.Close()) } @@ -589,7 +600,7 @@ func cleanupSnapshot(t *testing.T, dbDir string, resp *http.Response) { Name string `json:"name"` } `json:"data"` }{} - b, err := ioutil.ReadAll(resp.Body) + b, err := io.ReadAll(resp.Body) require.NoError(t, err) require.NoError(t, json.Unmarshal(b, snapshot)) require.NotZero(t, snapshot.Data.Name, "snapshot directory not returned")