mirror of
https://github.com/prometheus/statsd_exporter.git
synced 2024-09-29 14:11:54 +00:00
Compare commits
172 commits
Author | SHA1 | Date | |
---|---|---|---|
|
eccf511051 | ||
|
658dadba2f | ||
|
77d911b7fe | ||
|
c7a3f16195 | ||
|
c818915ae3 | ||
|
32f8087bcc | ||
|
2d0de3fba8 | ||
|
cfb74254cb | ||
|
b967f755be | ||
|
1221aed101 | ||
|
4cef1c0d49 | ||
|
58c8a24608 | ||
|
da51813af4 | ||
|
4fcebbde52 | ||
|
90547ea496 | ||
|
3d4d6a9d5c | ||
|
c5aee286ee | ||
|
2b2623218f | ||
|
060a3a8870 | ||
|
8aec6fdf63 | ||
|
96609f9679 | ||
|
468af47dfb | ||
|
da94065b43 | ||
|
ba68944bec | ||
|
7b4f7310ae | ||
|
921ad0771f | ||
|
dcb9cc9446 | ||
|
905f00863b | ||
|
58769c7b4d | ||
|
9c4dfce4e0 | ||
|
29c77f407c | ||
|
233d74d0f7 | ||
|
3f985fa9ac | ||
|
479379a908 | ||
|
6e02dfcaae | ||
|
2c4ffa9620 | ||
|
ac0ef06e65 | ||
|
337849188c | ||
|
4b21c8e662 | ||
|
91ccdb962a | ||
|
d93cb36b75 | ||
|
6483ce0ffe | ||
|
d5473a0f96 | ||
|
b9ee6639ce | ||
|
80810d614e | ||
|
cae614397a | ||
|
e729f64ef3 | ||
|
adeacdd760 | ||
|
a19a729111 | ||
|
4c268bcdf7 | ||
|
8ec3225483 | ||
|
7d28d2145f | ||
|
48b0038897 | ||
|
abc3a1f95c | ||
|
4a0e88e27b | ||
|
7188ed4292 | ||
|
c48fa1bfa7 | ||
|
5d3e63295a | ||
|
8fdc626bfc | ||
|
8adea73c00 | ||
|
a853c2b0b2 | ||
|
2c7fd1edd4 | ||
|
1e89c26ad6 | ||
|
413f482751 | ||
|
f9d238dbdd | ||
|
ef104085db | ||
|
0750ae0346 | ||
|
51cc8e4659 | ||
|
a9b63f9e5f | ||
|
736b8b676b | ||
|
5b8dfc866d | ||
|
3c4f1af3ff | ||
|
4392beadc3 | ||
|
22381d60c5 | ||
|
56fe4f51cd | ||
|
3855b3e8c9 | ||
|
3ea12e444f | ||
|
fb1a02cf4a | ||
|
8373cb382e | ||
|
3d8cac0b30 | ||
|
2337d38124 | ||
|
12d14bb1d8 | ||
|
04ed8c69a9 | ||
|
c246633aec | ||
|
8e326ef3f3 | ||
|
b98a84c3f6 | ||
|
5a947bd1a3 | ||
|
ee8b05b646 | ||
|
3dcff5fed5 | ||
|
aaaf26c074 | ||
|
b0c6d983e1 | ||
|
ccb3eb6277 | ||
|
03255bf218 | ||
|
871e2d8df1 | ||
|
5123a1caa6 | ||
|
3f8b98f180 | ||
|
886c18f947 | ||
|
c76a152291 | ||
|
69bc83fc47 | ||
|
b1094b9061 | ||
|
8ffcdb3d5e | ||
|
029cd6bca5 | ||
|
e91ce201d5 | ||
|
ddf7e0d31d | ||
|
80e119a781 | ||
|
191b07124c | ||
|
f73cc98fd7 | ||
|
7f5125abdd | ||
|
61f201130e | ||
|
2813a69578 | ||
|
2a8dab9248 | ||
|
5daeef52d8 | ||
|
c87a7ac5eb | ||
|
d747c05579 | ||
|
08c4bccb64 | ||
|
a0f4bcff5c | ||
|
fdc8b5f852 | ||
|
c3752cf30f | ||
|
a5b0ed182c | ||
|
972cb24750 | ||
|
24e2fc9980 | ||
|
aa341da7c4 | ||
|
fb5d639dbf | ||
|
14d18d8e70 | ||
|
bbba726e66 | ||
|
f0e9a8e2f8 | ||
|
0bdeac2162 | ||
|
9a980af22f | ||
|
052676c42d | ||
|
21a1763baf | ||
|
832c5a5316 | ||
|
e22a86f5f9 | ||
|
d73608eb14 | ||
|
9303da56a3 | ||
|
2caee689db | ||
|
07cf2fa0b1 | ||
|
f6b2a21fbd | ||
|
c2447be23b | ||
|
b8ace4ae2c | ||
|
fea420de84 | ||
|
9c6e245521 | ||
|
f6ab38f75e | ||
|
559fc9c1af | ||
|
507b0a20dd | ||
|
f77011fd34 | ||
|
fbfa209c87 | ||
|
fc1d834d59 | ||
|
81884eb3d8 | ||
|
f231009802 | ||
|
dbdf4d9349 | ||
|
c74db12eaf | ||
|
fd4ea19c21 | ||
|
1bcb9d1a97 | ||
|
a92aa4556e | ||
|
00d82daaf2 | ||
|
65e7877ab3 | ||
|
aecad1a2fa | ||
|
5d28e6d898 | ||
|
edaa33860e | ||
|
89e7668d8d | ||
|
da06fabcb6 | ||
|
83cec219c8 | ||
|
31b05ef232 | ||
|
c41fa101f5 | ||
|
7afa060ce4 | ||
|
30c3e31574 | ||
|
e85098da3f | ||
|
d0585ec62b | ||
|
af84364004 | ||
|
1e801bc499 | ||
|
b43a60e9c8 | ||
|
bc43c5606d |
28 changed files with 2684 additions and 682 deletions
|
@ -1,11 +1,11 @@
|
||||||
version: 2.1
|
version: 2.1
|
||||||
orbs:
|
orbs:
|
||||||
prometheus: prometheus/prometheus@0.16.0
|
prometheus: prometheus/prometheus@0.17.1
|
||||||
executors:
|
executors:
|
||||||
# Whenever the Go version is updated here, .promu.yml should also be updated.
|
# Whenever the Go version is updated here, .promu.yml should also be updated.
|
||||||
golang:
|
golang:
|
||||||
docker:
|
docker:
|
||||||
- image: cimg/go:1.18
|
- image: cimg/go:1.22
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
executor: golang
|
executor: golang
|
||||||
|
|
57
.github/workflows/container_description.yml
vendored
Normal file
57
.github/workflows/container_description.yml
vendored
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
---
|
||||||
|
name: Push README to Docker Hub
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- "README.md"
|
||||||
|
- "README-containers.md"
|
||||||
|
- ".github/workflows/container_description.yml"
|
||||||
|
branches: [ main, master ]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
PushDockerHubReadme:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
name: Push README to Docker Hub
|
||||||
|
if: github.repository_owner == 'prometheus' || github.repository_owner == 'prometheus-community' # Don't run this workflow on forks.
|
||||||
|
steps:
|
||||||
|
- name: git checkout
|
||||||
|
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6
|
||||||
|
- name: Set docker hub repo name
|
||||||
|
run: echo "DOCKER_REPO_NAME=$(make docker-repo-name)" >> $GITHUB_ENV
|
||||||
|
- name: Push README to Dockerhub
|
||||||
|
uses: christian-korneck/update-container-description-action@d36005551adeaba9698d8d67a296bd16fa91f8e8 # v1
|
||||||
|
env:
|
||||||
|
DOCKER_USER: ${{ secrets.DOCKER_HUB_LOGIN }}
|
||||||
|
DOCKER_PASS: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
||||||
|
with:
|
||||||
|
destination_container_repo: ${{ env.DOCKER_REPO_NAME }}
|
||||||
|
provider: dockerhub
|
||||||
|
short_description: ${{ env.DOCKER_REPO_NAME }}
|
||||||
|
# Empty string results in README-containers.md being pushed if it
|
||||||
|
# exists. Otherwise, README.md is pushed.
|
||||||
|
readme_file: ''
|
||||||
|
|
||||||
|
PushQuayIoReadme:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
name: Push README to quay.io
|
||||||
|
if: github.repository_owner == 'prometheus' || github.repository_owner == 'prometheus-community' # Don't run this workflow on forks.
|
||||||
|
steps:
|
||||||
|
- name: git checkout
|
||||||
|
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6
|
||||||
|
- name: Set quay.io org name
|
||||||
|
run: echo "DOCKER_REPO=$(echo quay.io/${GITHUB_REPOSITORY_OWNER} | tr -d '-')" >> $GITHUB_ENV
|
||||||
|
- name: Set quay.io repo name
|
||||||
|
run: echo "DOCKER_REPO_NAME=$(make docker-repo-name)" >> $GITHUB_ENV
|
||||||
|
- name: Push README to quay.io
|
||||||
|
uses: christian-korneck/update-container-description-action@d36005551adeaba9698d8d67a296bd16fa91f8e8 # v1
|
||||||
|
env:
|
||||||
|
DOCKER_APIKEY: ${{ secrets.QUAY_IO_API_TOKEN }}
|
||||||
|
with:
|
||||||
|
destination_container_repo: ${{ env.DOCKER_REPO_NAME }}
|
||||||
|
provider: quay
|
||||||
|
# Empty string results in README-containers.md being pushed if it
|
||||||
|
# exists. Otherwise, README.md is pushed.
|
||||||
|
readme_file: ''
|
21
.github/workflows/golangci-lint.yml
vendored
21
.github/workflows/golangci-lint.yml
vendored
|
@ -1,3 +1,5 @@
|
||||||
|
---
|
||||||
|
# This action is synced from https://github.com/prometheus/prometheus
|
||||||
name: golangci-lint
|
name: golangci-lint
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
|
@ -10,21 +12,28 @@ on:
|
||||||
- ".golangci.yml"
|
- ".golangci.yml"
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
|
permissions: # added using https://github.com/step-security/secure-repo
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
golangci:
|
golangci:
|
||||||
|
permissions:
|
||||||
|
contents: read # for actions/checkout to fetch code
|
||||||
|
pull-requests: read # for golangci/golangci-lint-action to fetch pull requests
|
||||||
name: lint
|
name: lint
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
|
||||||
- name: install Go
|
- name: Install Go
|
||||||
uses: actions/setup-go@v2
|
uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
|
||||||
with:
|
with:
|
||||||
go-version: 1.18.x
|
go-version: 1.22.x
|
||||||
- name: Install snmp_exporter/generator dependencies
|
- name: Install snmp_exporter/generator dependencies
|
||||||
run: sudo apt-get update && sudo apt-get -y install libsnmp-dev
|
run: sudo apt-get update && sudo apt-get -y install libsnmp-dev
|
||||||
if: github.repository == 'prometheus/snmp_exporter'
|
if: github.repository == 'prometheus/snmp_exporter'
|
||||||
- name: Lint
|
- name: Lint
|
||||||
uses: golangci/golangci-lint-action@v3.2.0
|
uses: golangci/golangci-lint-action@aaa42aa0628b4ae2578232a66b541047968fac86 # v6.1.0
|
||||||
with:
|
with:
|
||||||
version: v1.45.2
|
args: --verbose
|
||||||
|
version: v1.60.1
|
||||||
|
|
|
@ -5,20 +5,19 @@ linters:
|
||||||
disable:
|
disable:
|
||||||
- errcheck
|
- errcheck
|
||||||
enable:
|
enable:
|
||||||
- deadcode
|
|
||||||
- goimports
|
- goimports
|
||||||
- gosimple
|
- gosimple
|
||||||
- govet
|
- govet
|
||||||
- ineffassign
|
- ineffassign
|
||||||
- nakedret
|
- nakedret
|
||||||
- staticcheck
|
- staticcheck
|
||||||
- structcheck
|
|
||||||
- unused
|
- unused
|
||||||
- varcheck
|
|
||||||
- whitespace
|
- whitespace
|
||||||
linters-settings:
|
linters-settings:
|
||||||
govet:
|
govet:
|
||||||
check-shadowing: true
|
enable-all: true
|
||||||
|
disable:
|
||||||
|
- fieldalignment
|
||||||
issues:
|
issues:
|
||||||
exclude-use-default: false
|
exclude-use-default: false
|
||||||
exclude:
|
exclude:
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
go:
|
go:
|
||||||
# Whenever the Go version is updated here, .circle/config.yml should also
|
# Whenever the Go version is updated here, .circle/config.yml should also
|
||||||
# be updated.
|
# be updated.
|
||||||
version: 1.18
|
version: 1.22
|
||||||
repository:
|
repository:
|
||||||
path: github.com/prometheus/statsd_exporter
|
path: github.com/prometheus/statsd_exporter
|
||||||
build:
|
build:
|
||||||
flags: -a -tags 'netgo static_build'
|
|
||||||
ldflags: |
|
ldflags: |
|
||||||
-X github.com/prometheus/common/version.Version={{.Version}}
|
-X github.com/prometheus/common/version.Version={{.Version}}
|
||||||
-X github.com/prometheus/common/version.Revision={{.Revision}}
|
-X github.com/prometheus/common/version.Revision={{.Revision}}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
---
|
---
|
||||||
extends: default
|
extends: default
|
||||||
|
ignore: |
|
||||||
|
ui/react-app/node_modules
|
||||||
|
|
||||||
rules:
|
rules:
|
||||||
braces:
|
braces:
|
||||||
|
@ -20,9 +22,4 @@ rules:
|
||||||
config/testdata/section_key_dup.bad.yml
|
config/testdata/section_key_dup.bad.yml
|
||||||
line-length: disable
|
line-length: disable
|
||||||
truthy:
|
truthy:
|
||||||
ignore: |
|
check-keys: false
|
||||||
.github/workflows/codeql-analysis.yml
|
|
||||||
.github/workflows/funcbench.yml
|
|
||||||
.github/workflows/fuzzing.yml
|
|
||||||
.github/workflows/prombench.yml
|
|
||||||
.github/workflows/golangci-lint.yml
|
|
||||||
|
|
61
CHANGELOG.md
61
CHANGELOG.md
|
@ -1,3 +1,64 @@
|
||||||
|
## 0.27.1 / 2024-08-18
|
||||||
|
|
||||||
|
* [FEATURE] Support [dogstatsd extended aggregation](https://github.com/DataDog/datadog-go/blob/master/README.md#extended-aggregation) ([#558](https://github.com/prometheus/statsd_exporter/pull/558))
|
||||||
|
* [SECURITY] Update dependencies
|
||||||
|
|
||||||
|
Thank you [@GrgDev](https://github.com/GrgDev) for the contribution!
|
||||||
|
|
||||||
|
## 0.26.1 / 2024-03-22
|
||||||
|
|
||||||
|
* [SECURITY] Update dependencies, including `google.golang.org/protobuf` for CVE-2024-24786
|
||||||
|
|
||||||
|
This is a maintenance release.
|
||||||
|
|
||||||
|
## 0.26.0 / 2023-12-06
|
||||||
|
|
||||||
|
* [CHANGE] Update dependencies: prometheus/common, client model, and Go 1.21
|
||||||
|
* [FEATURE] Add option to honor original labels from event tags over labels specified in mapping configuration ([#521](https://github.com/prometheus/statsd_exporter/pull/521))
|
||||||
|
|
||||||
|
Thank you @rabenhorst for the `honor_labels` contribution!
|
||||||
|
|
||||||
|
## 0.25.0 / 2023-10-23
|
||||||
|
|
||||||
|
* [CHANGE] Update `client_golang` ([#508](https://github.com/prometheus/statsd_exporter/pull/508), [#513](https://github.com/prometheus/statsd_exporter/pull/513))
|
||||||
|
* [ENHANCEMENT] Process UDP packets asynchronously ([#511](https://github.com/prometheus/statsd_exporter/pull/511))
|
||||||
|
* [BUGFIX] Debug-log incoming lines in cleartext ([#510](https://github.com/prometheus/statsd_exporter/pull/510))
|
||||||
|
* [SECURITY] Update `golang.org/x/net` ([#516](https://github.com/prometheus/statsd_exporter/pull/516))
|
||||||
|
|
||||||
|
This release is less likely to drop UDP packets under very high traffic.
|
||||||
|
Additionally, when it does, it now attempts to record that this happened in the metric `statsd_exporter_udp_packet_drops_total`, where previously this could only be detected from operating system metrics.
|
||||||
|
If you are already monitoring for OS-level UDP packet drops, you _must_ also monitor this metric.
|
||||||
|
The exporter will pull packets from the UDP socket queue much more quickly and queue them internally before processing.
|
||||||
|
Existing monitoring for packet drops will no longer be sufficient to detect dropped events, but attribution to the exporter is easier with this new metric.
|
||||||
|
|
||||||
|
Many thanks to @sumeshpremraj and @kullanici0606 for their contributions, and @pedro-stanaka for helping with the async UDP processing!
|
||||||
|
|
||||||
|
## 0.24.0 / 2023-06-02
|
||||||
|
|
||||||
|
* [FEATURE] Improve the landing page experience ([#504](https://github.com/prometheus/statsd_exporter/pull/504))
|
||||||
|
* [FEATURE] Support scaling parameter in mapping ([#499](https://github.com/prometheus/statsd_exporter/pull/499))
|
||||||
|
|
||||||
|
## 0.23.3 / 2023-06-02
|
||||||
|
|
||||||
|
* [SECURITY] Maintenance release, updating dependencies
|
||||||
|
* [ENHANCEMENT][library] Allow instantiating configuration without going through YAML ([#491](https://github.com/prometheus/statsd_exporter/pull/491))
|
||||||
|
|
||||||
|
Version 0.23.2 was mistagged and thus skipped.
|
||||||
|
|
||||||
|
## 0.23.1 / 2023-03-08
|
||||||
|
|
||||||
|
* [SECURITY] Update all dependencies ([#489](https://github.com/prometheus/statsd_exporter/pull/489))
|
||||||
|
|
||||||
|
## 0.23.0 / 2022-12-07
|
||||||
|
|
||||||
|
* [CHANGE] Print help and version to standard out ([#469](https://github.com/prometheus/statsd_exporter/pull/469))
|
||||||
|
* [FEATURE] Support experimental native histograms ([#474](https://github.com/prometheus/statsd_exporter/pull/474))
|
||||||
|
|
||||||
|
## 0.22.8 / 2022-09-13
|
||||||
|
|
||||||
|
* [BUGFIX] Prevent poisoning with gauge/distribution naming collision ([#461](https://github.com/prometheus/statsd_exporter/pull/461))
|
||||||
|
* [CHANGE] Update `client_golang` dependency ([#463](https://github.com/prometheus/statsd_exporter/pull/463))
|
||||||
|
|
||||||
## 0.22.7 / 2022-07-08
|
## 0.22.7 / 2022-07-08
|
||||||
|
|
||||||
* [CHANGE] Build with Go 1.18 ([#450](https://github.com/prometheus/statsd_exporter/pull/450))
|
* [CHANGE] Build with Go 1.18 ([#450](https://github.com/prometheus/statsd_exporter/pull/450))
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
* Matthias Rampke <mr@soundcloud.com>
|
* Matthias Rampke <matthias@prometheus.io>
|
||||||
|
|
|
@ -49,25 +49,28 @@ endif
|
||||||
GOTEST := $(GO) test
|
GOTEST := $(GO) test
|
||||||
GOTEST_DIR :=
|
GOTEST_DIR :=
|
||||||
ifneq ($(CIRCLE_JOB),)
|
ifneq ($(CIRCLE_JOB),)
|
||||||
ifneq ($(shell which gotestsum),)
|
ifneq ($(shell command -v gotestsum 2> /dev/null),)
|
||||||
GOTEST_DIR := test-results
|
GOTEST_DIR := test-results
|
||||||
GOTEST := gotestsum --junitfile $(GOTEST_DIR)/unit-tests.xml --
|
GOTEST := gotestsum --junitfile $(GOTEST_DIR)/unit-tests.xml --
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
PROMU_VERSION ?= 0.13.0
|
PROMU_VERSION ?= 0.17.0
|
||||||
PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz
|
PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz
|
||||||
|
|
||||||
|
SKIP_GOLANGCI_LINT :=
|
||||||
GOLANGCI_LINT :=
|
GOLANGCI_LINT :=
|
||||||
GOLANGCI_LINT_OPTS ?=
|
GOLANGCI_LINT_OPTS ?=
|
||||||
GOLANGCI_LINT_VERSION ?= v1.45.2
|
GOLANGCI_LINT_VERSION ?= v1.60.1
|
||||||
# golangci-lint only supports linux, darwin and windows platforms on i386/amd64.
|
# golangci-lint only supports linux, darwin and windows platforms on i386/amd64/arm64.
|
||||||
# windows isn't included here because of the path separator being different.
|
# windows isn't included here because of the path separator being different.
|
||||||
ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin))
|
ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin))
|
||||||
ifeq ($(GOHOSTARCH),$(filter $(GOHOSTARCH),amd64 i386))
|
ifeq ($(GOHOSTARCH),$(filter $(GOHOSTARCH),amd64 i386 arm64))
|
||||||
# If we're in CI and there is an Actions file, that means the linter
|
# If we're in CI and there is an Actions file, that means the linter
|
||||||
# is being run in Actions, so we don't need to run it here.
|
# is being run in Actions, so we don't need to run it here.
|
||||||
ifeq (,$(CIRCLE_JOB))
|
ifneq (,$(SKIP_GOLANGCI_LINT))
|
||||||
|
GOLANGCI_LINT :=
|
||||||
|
else ifeq (,$(CIRCLE_JOB))
|
||||||
GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint
|
GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint
|
||||||
else ifeq (,$(wildcard .github/workflows/golangci-lint.yml))
|
else ifeq (,$(wildcard .github/workflows/golangci-lint.yml))
|
||||||
GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint
|
GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint
|
||||||
|
@ -88,6 +91,8 @@ BUILD_DOCKER_ARCHS = $(addprefix common-docker-,$(DOCKER_ARCHS))
|
||||||
PUBLISH_DOCKER_ARCHS = $(addprefix common-docker-publish-,$(DOCKER_ARCHS))
|
PUBLISH_DOCKER_ARCHS = $(addprefix common-docker-publish-,$(DOCKER_ARCHS))
|
||||||
TAG_DOCKER_ARCHS = $(addprefix common-docker-tag-latest-,$(DOCKER_ARCHS))
|
TAG_DOCKER_ARCHS = $(addprefix common-docker-tag-latest-,$(DOCKER_ARCHS))
|
||||||
|
|
||||||
|
SANITIZED_DOCKER_IMAGE_TAG := $(subst +,-,$(DOCKER_IMAGE_TAG))
|
||||||
|
|
||||||
ifeq ($(GOHOSTARCH),amd64)
|
ifeq ($(GOHOSTARCH),amd64)
|
||||||
ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux freebsd darwin windows))
|
ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux freebsd darwin windows))
|
||||||
# Only supported on amd64
|
# Only supported on amd64
|
||||||
|
@ -164,16 +169,20 @@ common-vet:
|
||||||
common-lint: $(GOLANGCI_LINT)
|
common-lint: $(GOLANGCI_LINT)
|
||||||
ifdef GOLANGCI_LINT
|
ifdef GOLANGCI_LINT
|
||||||
@echo ">> running golangci-lint"
|
@echo ">> running golangci-lint"
|
||||||
# 'go list' needs to be executed before staticcheck to prepopulate the modules cache.
|
|
||||||
# Otherwise staticcheck might fail randomly for some reason not yet explained.
|
|
||||||
$(GO) list -e -compiled -test=true -export=false -deps=true -find=false -tags= -- ./... > /dev/null
|
|
||||||
$(GOLANGCI_LINT) run $(GOLANGCI_LINT_OPTS) $(pkgs)
|
$(GOLANGCI_LINT) run $(GOLANGCI_LINT_OPTS) $(pkgs)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
.PHONY: common-lint-fix
|
||||||
|
common-lint-fix: $(GOLANGCI_LINT)
|
||||||
|
ifdef GOLANGCI_LINT
|
||||||
|
@echo ">> running golangci-lint fix"
|
||||||
|
$(GOLANGCI_LINT) run --fix $(GOLANGCI_LINT_OPTS) $(pkgs)
|
||||||
|
endif
|
||||||
|
|
||||||
.PHONY: common-yamllint
|
.PHONY: common-yamllint
|
||||||
common-yamllint:
|
common-yamllint:
|
||||||
@echo ">> running yamllint on all YAML files in the repository"
|
@echo ">> running yamllint on all YAML files in the repository"
|
||||||
ifeq (, $(shell which yamllint))
|
ifeq (, $(shell command -v yamllint 2> /dev/null))
|
||||||
@echo "yamllint not installed so skipping"
|
@echo "yamllint not installed so skipping"
|
||||||
else
|
else
|
||||||
yamllint .
|
yamllint .
|
||||||
|
@ -199,10 +208,14 @@ common-tarball: promu
|
||||||
@echo ">> building release tarball"
|
@echo ">> building release tarball"
|
||||||
$(PROMU) tarball --prefix $(PREFIX) $(BIN_DIR)
|
$(PROMU) tarball --prefix $(PREFIX) $(BIN_DIR)
|
||||||
|
|
||||||
|
.PHONY: common-docker-repo-name
|
||||||
|
common-docker-repo-name:
|
||||||
|
@echo "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)"
|
||||||
|
|
||||||
.PHONY: common-docker $(BUILD_DOCKER_ARCHS)
|
.PHONY: common-docker $(BUILD_DOCKER_ARCHS)
|
||||||
common-docker: $(BUILD_DOCKER_ARCHS)
|
common-docker: $(BUILD_DOCKER_ARCHS)
|
||||||
$(BUILD_DOCKER_ARCHS): common-docker-%:
|
$(BUILD_DOCKER_ARCHS): common-docker-%:
|
||||||
docker build -t "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" \
|
docker build -t "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)" \
|
||||||
-f $(DOCKERFILE_PATH) \
|
-f $(DOCKERFILE_PATH) \
|
||||||
--build-arg ARCH="$*" \
|
--build-arg ARCH="$*" \
|
||||||
--build-arg OS="linux" \
|
--build-arg OS="linux" \
|
||||||
|
@ -211,19 +224,19 @@ $(BUILD_DOCKER_ARCHS): common-docker-%:
|
||||||
.PHONY: common-docker-publish $(PUBLISH_DOCKER_ARCHS)
|
.PHONY: common-docker-publish $(PUBLISH_DOCKER_ARCHS)
|
||||||
common-docker-publish: $(PUBLISH_DOCKER_ARCHS)
|
common-docker-publish: $(PUBLISH_DOCKER_ARCHS)
|
||||||
$(PUBLISH_DOCKER_ARCHS): common-docker-publish-%:
|
$(PUBLISH_DOCKER_ARCHS): common-docker-publish-%:
|
||||||
docker push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)"
|
docker push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)"
|
||||||
|
|
||||||
DOCKER_MAJOR_VERSION_TAG = $(firstword $(subst ., ,$(shell cat VERSION)))
|
DOCKER_MAJOR_VERSION_TAG = $(firstword $(subst ., ,$(shell cat VERSION)))
|
||||||
.PHONY: common-docker-tag-latest $(TAG_DOCKER_ARCHS)
|
.PHONY: common-docker-tag-latest $(TAG_DOCKER_ARCHS)
|
||||||
common-docker-tag-latest: $(TAG_DOCKER_ARCHS)
|
common-docker-tag-latest: $(TAG_DOCKER_ARCHS)
|
||||||
$(TAG_DOCKER_ARCHS): common-docker-tag-latest-%:
|
$(TAG_DOCKER_ARCHS): common-docker-tag-latest-%:
|
||||||
docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:latest"
|
docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:latest"
|
||||||
docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:v$(DOCKER_MAJOR_VERSION_TAG)"
|
docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:v$(DOCKER_MAJOR_VERSION_TAG)"
|
||||||
|
|
||||||
.PHONY: common-docker-manifest
|
.PHONY: common-docker-manifest
|
||||||
common-docker-manifest:
|
common-docker-manifest:
|
||||||
DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)" $(foreach ARCH,$(DOCKER_ARCHS),$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$(ARCH):$(DOCKER_IMAGE_TAG))
|
DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)" $(foreach ARCH,$(DOCKER_ARCHS),$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$(ARCH):$(SANITIZED_DOCKER_IMAGE_TAG))
|
||||||
DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)"
|
DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)"
|
||||||
|
|
||||||
.PHONY: promu
|
.PHONY: promu
|
||||||
promu: $(PROMU)
|
promu: $(PROMU)
|
||||||
|
|
109
README.md
109
README.md
|
@ -79,8 +79,9 @@ in the DogStatsD documentation for the concept description and
|
||||||
[Datagram Format](https://docs.datadoghq.com/developers/dogstatsd/datagram_shell/).
|
[Datagram Format](https://docs.datadoghq.com/developers/dogstatsd/datagram_shell/).
|
||||||
If you encounter problems, note that this tagging style is incompatible with
|
If you encounter problems, note that this tagging style is incompatible with
|
||||||
the original `statsd` implementation.
|
the original `statsd` implementation.
|
||||||
|
The exporter also supports [DogStatD extended aggregations](https://github.com/prometheus/statsd_exporter/pull/558) in combination with DogStatsD tags, but not other tagging styles.
|
||||||
|
|
||||||
For [SignalFX dimension](https://docs.signalfx.com/en/latest/integrations/agent/monitors/collectd-statsd.html#adding-dimensions-to-statsd-metrics), add the tags to the metric name in square brackets, as so:
|
For [SignalFX dimension](https://github.com/signalfx/signalfx-agent/blob/main/docs/monitors/collectd-statsd.md#adding-dimensions-to-statsd-metrics), add the tags to the metric name in square brackets, as so:
|
||||||
|
|
||||||
```
|
```
|
||||||
metric.name[tagName=val,tag2Name=val2]:0|c
|
metric.name[tagName=val,tag2Name=val2]:0|c
|
||||||
|
@ -97,6 +98,9 @@ The exporter parses all tagging formats by default, but individual tagging forma
|
||||||
--no-statsd.parse-signalfx-tags
|
--no-statsd.parse-signalfx-tags
|
||||||
```
|
```
|
||||||
|
|
||||||
|
By default, labels explicitly specified in configuration take precedence over labels from tags.
|
||||||
|
To set the label from the statsd event tag, use [`honor_labels`](#honor-labels).
|
||||||
|
|
||||||
## Building and Running
|
## Building and Running
|
||||||
|
|
||||||
NOTE: Version 0.7.0 switched to the [kingpin](https://github.com/alecthomas/kingpin) flags library. With this change, flag behaviour is POSIX-ish:
|
NOTE: Version 0.7.0 switched to the [kingpin](https://github.com/alecthomas/kingpin) flags library. With this change, flag behaviour is POSIX-ish:
|
||||||
|
@ -105,71 +109,7 @@ NOTE: Version 0.7.0 switched to the [kingpin](https://github.com/alecthomas/king
|
||||||
* boolean long flags are disabled by prefixing with no (`--flag-name` is true, `--no-flag-name` is false)
|
* boolean long flags are disabled by prefixing with no (`--flag-name` is true, `--no-flag-name` is false)
|
||||||
* multiple short flags can be combined (but there currently is only one)
|
* multiple short flags can be combined (but there currently is only one)
|
||||||
* flag processing stops at the first `--`
|
* flag processing stops at the first `--`
|
||||||
|
* see `--help` for a full list of flags
|
||||||
```
|
|
||||||
usage: statsd_exporter [<flags>]
|
|
||||||
|
|
||||||
Flags:
|
|
||||||
-h, --help Show context-sensitive help (also try
|
|
||||||
--help-long and --help-man).
|
|
||||||
--web.listen-address=":9102"
|
|
||||||
The address on which to expose the web interface
|
|
||||||
and generated Prometheus metrics.
|
|
||||||
--web.enable-lifecycle Enable shutdown and reload via HTTP request.
|
|
||||||
--web.telemetry-path="/metrics"
|
|
||||||
Path under which to expose metrics.
|
|
||||||
--statsd.listen-udp=":9125"
|
|
||||||
The UDP address on which to receive statsd
|
|
||||||
metric lines. "" disables it.
|
|
||||||
--statsd.listen-tcp=":9125"
|
|
||||||
The TCP address on which to receive statsd
|
|
||||||
metric lines. "" disables it.
|
|
||||||
--statsd.listen-unixgram=""
|
|
||||||
The Unixgram socket path to receive statsd
|
|
||||||
metric lines in datagram. "" disables it.
|
|
||||||
--statsd.unixsocket-mode="755"
|
|
||||||
The permission mode of the unix socket.
|
|
||||||
--statsd.mapping-config=STATSD.MAPPING-CONFIG
|
|
||||||
Metric mapping configuration file name.
|
|
||||||
--statsd.read-buffer=STATSD.READ-BUFFER
|
|
||||||
Size (in bytes) of the operating system's
|
|
||||||
transmit read buffer associated with the UDP or
|
|
||||||
Unixgram connection. Please make sure the kernel
|
|
||||||
parameters net.core.rmem_max is set to a value
|
|
||||||
greater than the value specified.
|
|
||||||
--statsd.cache-size=1000 Maximum size of your metric mapping cache.
|
|
||||||
Relies on least recently used replacement policy
|
|
||||||
if max size is reached.
|
|
||||||
--statsd.cache-type=lru Metric mapping cache type. Valid options are
|
|
||||||
"lru" and "random"
|
|
||||||
--statsd.event-queue-size=10000
|
|
||||||
Size of internal queue for processing events
|
|
||||||
--statsd.event-flush-threshold=1000
|
|
||||||
Number of events to hold in queue before
|
|
||||||
flushing
|
|
||||||
--statsd.event-flush-interval=200ms
|
|
||||||
Maximum time between event queue flushes.
|
|
||||||
--debug.dump-fsm="" The path to dump internal FSM generated for
|
|
||||||
glob matching as Dot file.
|
|
||||||
--check-config Check configuration and exit.
|
|
||||||
--statsd.parse-dogstatsd-tags
|
|
||||||
Parse DogStatsd style tags. Enabled by default.
|
|
||||||
--statsd.parse-influxdb-tags
|
|
||||||
Parse InfluxDB style tags. Enabled by default.
|
|
||||||
--statsd.parse-librato-tags
|
|
||||||
Parse Librato style tags. Enabled by default.
|
|
||||||
--statsd.parse-signalfx-tags
|
|
||||||
Parse SignalFX style tags. Enabled by default.
|
|
||||||
--statsd.relay.address=STATSD.RELAY.ADDRESS
|
|
||||||
The UDP relay target address (host:port)
|
|
||||||
--statsd.relay.packet-length=1400
|
|
||||||
Maximum relay output packet length to avoid fragmentation
|
|
||||||
--log.level=info Only log messages with the given severity or
|
|
||||||
above. One of: [debug, info, warn, error]
|
|
||||||
--log.format=logfmt Output format of log messages. One of: [logfmt,
|
|
||||||
json]
|
|
||||||
--version Show application version.
|
|
||||||
```
|
|
||||||
|
|
||||||
## Lifecycle API
|
## Lifecycle API
|
||||||
|
|
||||||
|
@ -296,7 +236,6 @@ mappings:
|
||||||
name: "${2}_total"
|
name: "${2}_total"
|
||||||
labels:
|
labels:
|
||||||
provider: "$1"
|
provider: "$1"
|
||||||
mappings:
|
|
||||||
- match: "(.*)\\.(.*)--(.*)\\.status\.(.*)\\.count"
|
- match: "(.*)\\.(.*)--(.*)\\.status\.(.*)\\.count"
|
||||||
match_type: regex
|
match_type: regex
|
||||||
name: "request_total"
|
name: "request_total"
|
||||||
|
@ -355,6 +294,13 @@ mappings:
|
||||||
code: "$1"
|
code: "$1"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Honor labels
|
||||||
|
|
||||||
|
By default, labels specified in the mapping configuration take precedence over tags in the statsd event.
|
||||||
|
|
||||||
|
To set the label value to the original tag value, if present, specify `honor_labels: true` in the mapping configuration.
|
||||||
|
In this case, the label specified in the mapping acts as a default.
|
||||||
|
|
||||||
### StatsD timers and distributions
|
### StatsD timers and distributions
|
||||||
|
|
||||||
By default, statsd timers and distributions (collectively "observers") are
|
By default, statsd timers and distributions (collectively "observers") are
|
||||||
|
@ -403,6 +349,8 @@ mappings:
|
||||||
observer_type: histogram
|
observer_type: histogram
|
||||||
histogram_options:
|
histogram_options:
|
||||||
buckets: [ 0.01, 0.025, 0.05, 0.1 ]
|
buckets: [ 0.01, 0.025, 0.05, 0.1 ]
|
||||||
|
native_histogram_bucket_factor: 1.1
|
||||||
|
native_histogram_max_buckets: 256
|
||||||
name: "my_timer"
|
name: "my_timer"
|
||||||
labels:
|
labels:
|
||||||
provider: "$2"
|
provider: "$2"
|
||||||
|
@ -416,6 +364,11 @@ values](https://godoc.org/github.com/prometheus/client_golang/prometheus#pkg-var
|
||||||
are used for the histogram buckets:
|
are used for the histogram buckets:
|
||||||
`[.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10]`.
|
`[.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10]`.
|
||||||
`+Inf` is added automatically.
|
`+Inf` is added automatically.
|
||||||
|
If your Prometheus server is enabled to scrape native histograms (v2.40.0+),
|
||||||
|
then you can set the `native_histogram_bucket_factor` to configure precision of the
|
||||||
|
buckets in the sparse histogram. More about this in the original [client_golang docs](https://github.com/prometheus/client_golang/blob/449b46435075e6e069e05af920fe028b941033cf/prometheus/histogram.go#L399-L430).
|
||||||
|
Also, a configuration of the maximum number of buckets can be set with `native_histogram_max_buckets`, this
|
||||||
|
avoids the histograms to grow too large in memory. More about this in the original [client_golang docs](https://github.com/prometheus/client_golang/blob/449b46435075e6e069e05af920fe028b941033cf/prometheus/histogram.go#L443-L467).
|
||||||
|
|
||||||
`observer_type` is only used when the statsd metric type is a timer, histogram, or distribution.
|
`observer_type` is only used when the statsd metric type is a timer, histogram, or distribution.
|
||||||
`buckets` is only used when the statsd metric type is one of these, and the `observer_type` is set to `histogram`.
|
`buckets` is only used when the statsd metric type is one of these, and the `observer_type` is set to `histogram`.
|
||||||
|
@ -470,6 +423,8 @@ defaults:
|
||||||
observer_type: histogram
|
observer_type: histogram
|
||||||
histogram_options:
|
histogram_options:
|
||||||
buckets: [.005, .01, .025, .05, .1, .25, .5, 1, 2.5 ]
|
buckets: [.005, .01, .025, .05, .1, .25, .5, 1, 2.5 ]
|
||||||
|
native_histogram_bucket_factor: 1.1
|
||||||
|
native_histogram_max_buckets: 256
|
||||||
summary_options:
|
summary_options:
|
||||||
quantiles:
|
quantiles:
|
||||||
- quantile: 0.99
|
- quantile: 0.99
|
||||||
|
@ -549,7 +504,7 @@ Possible values for `match_metric_type` are `gauge`, `counter` and `observer`.
|
||||||
|
|
||||||
There is a cache used to improve the performance of the metric mapping, that can greatly improvement performance.
|
There is a cache used to improve the performance of the metric mapping, that can greatly improvement performance.
|
||||||
The cache has a default maximum of 1000 unique statsd metric names -> prometheus metrics mappings that it can store.
|
The cache has a default maximum of 1000 unique statsd metric names -> prometheus metrics mappings that it can store.
|
||||||
This maximum can be adjust using the `statsd.cache-size` flag.
|
This maximum can be adjusted using the `statsd.cache-size` flag.
|
||||||
|
|
||||||
If the maximum is reached, entries are by default rotated using the [least recently used replacement policy](https://en.wikipedia.org/wiki/Cache_replacement_policies#Least_recently_used_(LRU)). This strategy is optimal when memory is constrained as only the most recent entries are retained.
|
If the maximum is reached, entries are by default rotated using the [least recently used replacement policy](https://en.wikipedia.org/wiki/Cache_replacement_policies#Least_recently_used_(LRU)). This strategy is optimal when memory is constrained as only the most recent entries are retained.
|
||||||
|
|
||||||
|
@ -569,6 +524,23 @@ metrics that do not expire.
|
||||||
expire a metric only by changing the mapping configuration. At least one
|
expire a metric only by changing the mapping configuration. At least one
|
||||||
sample must be received for updated mappings to take effect.
|
sample must be received for updated mappings to take effect.
|
||||||
|
|
||||||
|
### Unit conversions
|
||||||
|
|
||||||
|
The `scale` parameter can be used to define unit conversions for metric values. The value is a floating point number to scale metric values by. This can be useful for converting non-base units (e.g. milliseconds, kilobytes) to base units (e.g. seconds, bytes) as recommended in [prometheus best practices](https://prometheus.io/docs/practices/naming/).
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
mappings:
|
||||||
|
- match: foo.latency_ms
|
||||||
|
name: foo_latency_seconds
|
||||||
|
scale: 0.001
|
||||||
|
- match: bar.processed_kb
|
||||||
|
name: bar_processed_bytes
|
||||||
|
scale: 1024
|
||||||
|
- match: baz.latency_us
|
||||||
|
name: baz_latency_seconds
|
||||||
|
scale: 1e-6
|
||||||
|
```
|
||||||
|
|
||||||
### Event flushing configuration
|
### Event flushing configuration
|
||||||
|
|
||||||
Internally `statsd_exporter` runs a goroutine for each network listener (UDP, TCP & Unix Socket). These each receive and parse metrics received into an event. For performance purposes, these events are queued internally and flushed to the main exporter goroutine periodically in batches. The size of this queue and the flush criteria can be tuned with the `--statsd.event-queue-size`, `--statsd.event-flush-threshold` and `--statsd.event-flush-interval`. However, the defaults should perform well even for very high traffic environments.
|
Internally `statsd_exporter` runs a goroutine for each network listener (UDP, TCP & Unix Socket). These each receive and parse metrics received into an event. For performance purposes, these events are queued internally and flushed to the main exporter goroutine periodically in batches. The size of this queue and the flush criteria can be tuned with the `--statsd.event-queue-size`, `--statsd.event-flush-threshold` and `--statsd.event-flush-interval`. However, the defaults should perform well even for very high traffic environments.
|
||||||
|
@ -598,7 +570,6 @@ Semantic versioning of the exporter is based on the impact on users of the expor
|
||||||
|
|
||||||
We encourage re-use of these packages and welcome [issues](https://github.com/prometheus/statsd_exporter/issues?q=is%3Aopen+is%3Aissue+label%3Alibrary) related to their usability as a library.
|
We encourage re-use of these packages and welcome [issues](https://github.com/prometheus/statsd_exporter/issues?q=is%3Aopen+is%3Aissue+label%3Alibrary) related to their usability as a library.
|
||||||
|
|
||||||
[travis]: https://travis-ci.org/prometheus/statsd_exporter
|
|
||||||
[circleci]: https://circleci.com/gh/prometheus/statsd_exporter
|
[circleci]: https://circleci.com/gh/prometheus/statsd_exporter
|
||||||
[quay]: https://quay.io/repository/prometheus/statsd-exporter
|
[quay]: https://quay.io/repository/prometheus/statsd-exporter
|
||||||
[hub]: https://hub.docker.com/r/prom/statsd-exporter/
|
[hub]: https://hub.docker.com/r/prom/statsd-exporter/
|
||||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
||||||
0.22.7
|
0.27.1
|
||||||
|
|
|
@ -81,6 +81,58 @@ func TestHandlePacket(t *testing.T) {
|
||||||
GLabels: map[string]string{},
|
GLabels: map[string]string{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
}, {
|
||||||
|
name: "gauge increment",
|
||||||
|
in: "foo:+10|g",
|
||||||
|
out: event.Events{
|
||||||
|
&event.GaugeEvent{
|
||||||
|
GMetricName: "foo",
|
||||||
|
GValue: 10,
|
||||||
|
GRelative: true,
|
||||||
|
GLabels: map[string]string{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
name: "gauge set negative",
|
||||||
|
in: "foo:0|g\nfoo:-1|g",
|
||||||
|
out: event.Events{
|
||||||
|
&event.GaugeEvent{
|
||||||
|
GMetricName: "foo",
|
||||||
|
GValue: 0,
|
||||||
|
GRelative: false,
|
||||||
|
GLabels: map[string]string{},
|
||||||
|
},
|
||||||
|
&event.GaugeEvent{
|
||||||
|
GMetricName: "foo",
|
||||||
|
GValue: -1,
|
||||||
|
GRelative: true,
|
||||||
|
GLabels: map[string]string{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
// Test the sequence given here https://github.com/statsd/statsd/blob/master/docs/metric_types.md#gauges
|
||||||
|
name: "gauge up and down",
|
||||||
|
in: "gaugor:333|g\ngaugor:-10|g\ngaugor:+4|g",
|
||||||
|
out: event.Events{
|
||||||
|
&event.GaugeEvent{
|
||||||
|
GMetricName: "gaugor",
|
||||||
|
GValue: 333,
|
||||||
|
GRelative: false,
|
||||||
|
GLabels: map[string]string{},
|
||||||
|
},
|
||||||
|
&event.GaugeEvent{
|
||||||
|
GMetricName: "gaugor",
|
||||||
|
GValue: -10,
|
||||||
|
GRelative: true,
|
||||||
|
GLabels: map[string]string{},
|
||||||
|
},
|
||||||
|
&event.GaugeEvent{
|
||||||
|
GMetricName: "gaugor",
|
||||||
|
GValue: 4,
|
||||||
|
GRelative: true,
|
||||||
|
GLabels: map[string]string{},
|
||||||
|
},
|
||||||
|
},
|
||||||
}, {
|
}, {
|
||||||
name: "simple timer",
|
name: "simple timer",
|
||||||
in: "foo:200|ms",
|
in: "foo:200|ms",
|
||||||
|
@ -543,6 +595,7 @@ func TestHandlePacket(t *testing.T) {
|
||||||
Logger: log.NewNopLogger(),
|
Logger: log.NewNopLogger(),
|
||||||
LineParser: parser,
|
LineParser: parser,
|
||||||
UDPPackets: udpPackets,
|
UDPPackets: udpPackets,
|
||||||
|
UDPPacketDrops: udpPacketDrops,
|
||||||
LinesReceived: linesReceived,
|
LinesReceived: linesReceived,
|
||||||
EventsFlushed: eventsFlushed,
|
EventsFlushed: eventsFlushed,
|
||||||
SampleErrors: *sampleErrors,
|
SampleErrors: *sampleErrors,
|
||||||
|
|
|
@ -65,6 +65,7 @@ func benchmarkUDPListener(times int, b *testing.B) {
|
||||||
|
|
||||||
// there are more events than input lines, need bigger buffer
|
// there are more events than input lines, need bigger buffer
|
||||||
events := make(chan event.Events, len(bytesInput)*times*2)
|
events := make(chan event.Events, len(bytesInput)*times*2)
|
||||||
|
udpChan := make(chan []byte, len(bytesInput)*times*2)
|
||||||
|
|
||||||
l := listener.StatsDUDPListener{
|
l := listener.StatsDUDPListener{
|
||||||
EventHandler: &event.UnbufferedEventHandler{C: events},
|
EventHandler: &event.UnbufferedEventHandler{C: events},
|
||||||
|
@ -74,6 +75,7 @@ func benchmarkUDPListener(times int, b *testing.B) {
|
||||||
LinesReceived: linesReceived,
|
LinesReceived: linesReceived,
|
||||||
SamplesReceived: samplesReceived,
|
SamplesReceived: samplesReceived,
|
||||||
TagsReceived: tagsReceived,
|
TagsReceived: tagsReceived,
|
||||||
|
UdpPacketQueue: udpChan,
|
||||||
}
|
}
|
||||||
|
|
||||||
// resume benchmark timer
|
// resume benchmark timer
|
||||||
|
|
37
go.mod
37
go.mod
|
@ -1,27 +1,36 @@
|
||||||
module github.com/prometheus/statsd_exporter
|
module github.com/prometheus/statsd_exporter
|
||||||
|
|
||||||
go 1.17
|
go 1.21
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/alecthomas/kingpin/v2 v2.4.0
|
||||||
github.com/go-kit/log v0.2.1
|
github.com/go-kit/log v0.2.1
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da
|
||||||
github.com/prometheus/client_golang v1.12.2
|
github.com/prometheus/client_golang v1.20.3
|
||||||
github.com/prometheus/client_model v0.2.0
|
github.com/prometheus/client_model v0.6.1
|
||||||
github.com/prometheus/common v0.35.0
|
github.com/prometheus/common v0.57.0
|
||||||
|
github.com/prometheus/exporter-toolkit v0.11.0
|
||||||
github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807
|
github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6
|
|
||||||
gopkg.in/yaml.v2 v2.4.0
|
gopkg.in/yaml.v2 v2.4.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
|
github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 // indirect
|
||||||
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect
|
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||||
github.com/go-logfmt/logfmt v0.5.1 // indirect
|
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
|
||||||
github.com/golang/protobuf v1.5.2 // indirect
|
github.com/go-logfmt/logfmt v0.6.0 // indirect
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
|
github.com/jpillora/backoff v1.0.0 // indirect
|
||||||
github.com/prometheus/procfs v0.7.3 // indirect
|
github.com/klauspost/compress v1.17.9 // indirect
|
||||||
golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d // indirect
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||||
google.golang.org/protobuf v1.28.0 // indirect
|
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect
|
||||||
|
github.com/prometheus/procfs v0.15.1 // indirect
|
||||||
|
github.com/xhit/go-str2duration/v2 v2.1.0 // indirect
|
||||||
|
golang.org/x/crypto v0.26.0 // indirect
|
||||||
|
golang.org/x/net v0.28.0 // indirect
|
||||||
|
golang.org/x/oauth2 v0.22.0 // indirect
|
||||||
|
golang.org/x/sync v0.8.0 // indirect
|
||||||
|
golang.org/x/sys v0.24.0 // indirect
|
||||||
|
golang.org/x/text v0.17.0 // indirect
|
||||||
|
google.golang.org/protobuf v1.34.2 // indirect
|
||||||
)
|
)
|
||||||
|
|
541
go.sum
541
go.sum
|
@ -1,494 +1,85 @@
|
||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY=
|
||||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE=
|
||||||
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 h1:t3eaIm0rUkzbrIewtiFmMK5RXHej2XnoXNhxVsAYUfg=
|
||||||
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
|
github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs=
|
||||||
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
|
|
||||||
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
|
|
||||||
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
|
|
||||||
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
|
|
||||||
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
|
|
||||||
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
|
|
||||||
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
|
|
||||||
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
|
|
||||||
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
|
|
||||||
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
|
|
||||||
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
|
|
||||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
|
||||||
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
|
||||||
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
|
||||||
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
|
|
||||||
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
|
|
||||||
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
|
|
||||||
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/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=
|
|
||||||
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
|
|
||||||
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
|
|
||||||
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
|
|
||||||
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
|
|
||||||
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/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
|
||||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
|
||||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
|
|
||||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
|
||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
|
||||||
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
|
||||||
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
|
|
||||||
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc=
|
|
||||||
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=
|
|
||||||
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 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
|
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
|
||||||
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
|
||||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
|
||||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
|
||||||
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-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/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
|
|
||||||
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 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
|
||||||
github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
|
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.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
|
||||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
|
||||||
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
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-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
|
||||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
|
||||||
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=
|
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
|
||||||
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
|
||||||
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
|
||||||
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
|
||||||
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
|
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
|
||||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
|
||||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
|
||||||
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
|
||||||
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
|
|
||||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
|
||||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
|
||||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
|
||||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
|
||||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
|
||||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
|
||||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
|
||||||
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
|
||||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
|
||||||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
|
||||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
|
||||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
|
||||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
|
||||||
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=
|
|
||||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
|
|
||||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
|
||||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
|
||||||
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
|
||||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
|
||||||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
|
||||||
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
|
||||||
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
|
||||||
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
|
||||||
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
|
||||||
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
|
||||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
|
||||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
|
||||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
|
||||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
|
||||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
|
||||||
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
|
||||||
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
|
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
|
||||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
|
||||||
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
||||||
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
|
||||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
|
||||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
|
||||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
|
||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
|
||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
|
||||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
|
||||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
|
||||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
|
||||||
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/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
github.com/prometheus/client_golang v1.20.3 h1:oPksm4K8B+Vt35tUhw6GbSNSgVlVSBH0qELP/7u83l4=
|
||||||
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
github.com/prometheus/client_golang v1.20.3/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
|
||||||
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
|
||||||
github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
|
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
|
||||||
github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
|
github.com/prometheus/common v0.57.0 h1:Ro/rKjwdq9mZn1K5QPctzh+MA4Lp0BuYk5ZZEVhoNcY=
|
||||||
github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34=
|
github.com/prometheus/common v0.57.0/go.mod h1:7uRPFSUTbfZWsJ7MHY56sqt7hLQu3bxXHDnNhl8E9qI=
|
||||||
github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
|
github.com/prometheus/exporter-toolkit v0.11.0 h1:yNTsuZ0aNCNFQ3aFTD2uhPOvr4iD7fdBvKPAEGkNf+g=
|
||||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
github.com/prometheus/exporter-toolkit v0.11.0/go.mod h1:BVnENhnNecpwoTLiABx7mrPB/OLRIgN74qlQbV+FK1Q=
|
||||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
|
||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
|
||||||
github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
|
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
|
||||||
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
|
||||||
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
|
||||||
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.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
|
|
||||||
github.com/prometheus/common v0.35.0 h1:Eyr+Pw2VymWejHqCugNaQXkAi6KayVNxaHeu6khmFBE=
|
|
||||||
github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
|
|
||||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
|
||||||
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
|
||||||
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
|
||||||
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
|
||||||
github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
|
|
||||||
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
|
||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
|
||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
|
||||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
|
||||||
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
|
||||||
github.com/stretchr/objx v0.1.0/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.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
|
||||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||||
|
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||||
|
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
||||||
|
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807 h1:LUsDduamlucuNnWcaTbXQ6aLILFcLXADpOzeEH3U+OI=
|
github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807 h1:LUsDduamlucuNnWcaTbXQ6aLILFcLXADpOzeEH3U+OI=
|
||||||
github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc=
|
github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc=
|
||||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc=
|
||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU=
|
||||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
|
||||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
|
||||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
|
||||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
|
||||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA=
|
||||||
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
|
||||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
|
||||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
|
||||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
|
||||||
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
|
|
||||||
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
|
|
||||||
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
|
||||||
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
|
||||||
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
|
||||||
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
|
||||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
|
||||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
|
||||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
|
||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
|
||||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
|
||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
|
||||||
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
|
||||||
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
|
||||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
|
||||||
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
|
||||||
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
|
||||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
|
||||||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
|
||||||
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
|
||||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
|
||||||
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
|
|
||||||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
|
||||||
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
|
||||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|
||||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|
||||||
golang.org/x/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-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
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-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-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-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=
|
|
||||||
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
|
||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
|
||||||
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
|
||||||
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
|
||||||
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
|
||||||
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
|
||||||
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/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-20210525063256-abc453219eb5/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/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=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
|
||||||
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=
|
|
||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
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=
|
|
||||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-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-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/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-20200122134326-e047566fdf82/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-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=
|
|
||||||
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/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-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d h1:/m5NbqQelATgoSPVC2Z23sR4kVNokFwDDyWh/3rGY+I=
|
|
||||||
golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
|
||||||
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=
|
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
|
||||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|
||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|
||||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
|
||||||
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/tools v0.0.0-20180917221912-90fa682c2a6e/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=
|
|
||||||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
|
||||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
|
||||||
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
|
||||||
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
|
||||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
|
||||||
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/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-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
|
||||||
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/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-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=
|
|
||||||
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
|
||||||
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
|
||||||
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
|
||||||
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
|
||||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
|
||||||
golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
|
||||||
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
|
||||||
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
|
||||||
golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
|
||||||
golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
|
||||||
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
|
|
||||||
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
|
|
||||||
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
|
|
||||||
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/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-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
|
||||||
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
|
||||||
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
|
||||||
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
|
||||||
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.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
|
||||||
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
|
||||||
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
|
||||||
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
|
||||||
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
|
||||||
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
|
||||||
google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
|
||||||
google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
|
||||||
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
|
||||||
google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
|
||||||
google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
|
||||||
google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
|
||||||
google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
|
|
||||||
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
|
|
||||||
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
|
|
||||||
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
|
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
|
||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
|
||||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
|
||||||
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
|
||||||
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
|
||||||
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
|
||||||
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-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
|
||||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
|
||||||
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
|
|
||||||
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
|
||||||
google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
|
||||||
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-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=
|
|
||||||
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
|
||||||
google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
|
||||||
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-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-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-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
|
|
||||||
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
|
||||||
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
|
||||||
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
|
||||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
|
||||||
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
|
||||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
|
||||||
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/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
|
||||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
|
||||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
|
||||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
|
||||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
|
||||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
|
||||||
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
|
||||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
|
||||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
|
||||||
google.golang.org/protobuf v1.26.0/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/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 v0.0.0-20161208181325-20d25e280405/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-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
|
||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
|
||||||
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=
|
|
||||||
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=
|
|
||||||
|
|
46
main.go
46
main.go
|
@ -24,14 +24,16 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
|
"github.com/alecthomas/kingpin/v2"
|
||||||
"github.com/go-kit/log"
|
"github.com/go-kit/log"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
versioncollector "github.com/prometheus/client_golang/prometheus/collectors/version"
|
||||||
"github.com/prometheus/client_golang/prometheus/promauto"
|
"github.com/prometheus/client_golang/prometheus/promauto"
|
||||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||||
"github.com/prometheus/common/promlog"
|
"github.com/prometheus/common/promlog"
|
||||||
"github.com/prometheus/common/promlog/flag"
|
"github.com/prometheus/common/promlog/flag"
|
||||||
"github.com/prometheus/common/version"
|
"github.com/prometheus/common/version"
|
||||||
"gopkg.in/alecthomas/kingpin.v2"
|
"github.com/prometheus/exporter-toolkit/web"
|
||||||
|
|
||||||
"github.com/prometheus/statsd_exporter/pkg/address"
|
"github.com/prometheus/statsd_exporter/pkg/address"
|
||||||
"github.com/prometheus/statsd_exporter/pkg/event"
|
"github.com/prometheus/statsd_exporter/pkg/event"
|
||||||
|
@ -70,6 +72,12 @@ var (
|
||||||
Help: "The total number of StatsD packets received over UDP.",
|
Help: "The total number of StatsD packets received over UDP.",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
udpPacketDrops = promauto.NewCounter(
|
||||||
|
prometheus.CounterOpts{
|
||||||
|
Name: "statsd_exporter_udp_packet_drops_total",
|
||||||
|
Help: "The total number of dropped StatsD packets which received over UDP.",
|
||||||
|
},
|
||||||
|
)
|
||||||
tcpConnections = promauto.NewCounter(
|
tcpConnections = promauto.NewCounter(
|
||||||
prometheus.CounterOpts{
|
prometheus.CounterOpts{
|
||||||
Name: "statsd_exporter_tcp_connections_total",
|
Name: "statsd_exporter_tcp_connections_total",
|
||||||
|
@ -260,11 +268,13 @@ func main() {
|
||||||
signalFXTagsEnabled = kingpin.Flag("statsd.parse-signalfx-tags", "Parse SignalFX style tags. Enabled by default.").Default("true").Bool()
|
signalFXTagsEnabled = kingpin.Flag("statsd.parse-signalfx-tags", "Parse SignalFX style tags. Enabled by default.").Default("true").Bool()
|
||||||
relayAddr = kingpin.Flag("statsd.relay.address", "The UDP relay target address (host:port)").String()
|
relayAddr = kingpin.Flag("statsd.relay.address", "The UDP relay target address (host:port)").String()
|
||||||
relayPacketLen = kingpin.Flag("statsd.relay.packet-length", "Maximum relay output packet length to avoid fragmentation").Default("1400").Uint()
|
relayPacketLen = kingpin.Flag("statsd.relay.packet-length", "Maximum relay output packet length to avoid fragmentation").Default("1400").Uint()
|
||||||
|
udpPacketQueueSize = kingpin.Flag("statsd.udp-packet-queue-size", "Size of internal queue for processing UDP packets.").Default("10000").Int()
|
||||||
)
|
)
|
||||||
|
|
||||||
promlogConfig := &promlog.Config{}
|
promlogConfig := &promlog.Config{}
|
||||||
flag.AddFlags(kingpin.CommandLine, promlogConfig)
|
flag.AddFlags(kingpin.CommandLine, promlogConfig)
|
||||||
kingpin.Version(version.Print("statsd_exporter"))
|
kingpin.Version(version.Print("statsd_exporter"))
|
||||||
|
kingpin.CommandLine.UsageWriter(os.Stdout)
|
||||||
kingpin.HelpFlag.Short('h')
|
kingpin.HelpFlag.Short('h')
|
||||||
kingpin.Parse()
|
kingpin.Parse()
|
||||||
logger := promlog.New(promlogConfig)
|
logger := promlog.New(promlogConfig)
|
||||||
|
@ -272,7 +282,7 @@ func main() {
|
||||||
level.Error(logger).Log("msg", "failed to set log level", "error", err)
|
level.Error(logger).Log("msg", "failed to set log level", "error", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
prometheus.MustRegister(version.NewCollector("statsd_exporter"))
|
prometheus.MustRegister(versioncollector.NewCollector("statsd_exporter"))
|
||||||
|
|
||||||
parser := line.NewParser()
|
parser := line.NewParser()
|
||||||
if *dogstatsdTagsEnabled {
|
if *dogstatsdTagsEnabled {
|
||||||
|
@ -366,12 +376,15 @@ func main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
udpPacketQueue := make(chan []byte, *udpPacketQueueSize)
|
||||||
|
|
||||||
ul := &listener.StatsDUDPListener{
|
ul := &listener.StatsDUDPListener{
|
||||||
Conn: uconn,
|
Conn: uconn,
|
||||||
EventHandler: eventQueue,
|
EventHandler: eventQueue,
|
||||||
Logger: logger,
|
Logger: logger,
|
||||||
LineParser: parser,
|
LineParser: parser,
|
||||||
UDPPackets: udpPackets,
|
UDPPackets: udpPackets,
|
||||||
|
UDPPacketDrops: udpPacketDrops,
|
||||||
LinesReceived: linesReceived,
|
LinesReceived: linesReceived,
|
||||||
EventsFlushed: eventsFlushed,
|
EventsFlushed: eventsFlushed,
|
||||||
Relay: relayTarget,
|
Relay: relayTarget,
|
||||||
|
@ -379,6 +392,7 @@ func main() {
|
||||||
SamplesReceived: samplesReceived,
|
SamplesReceived: samplesReceived,
|
||||||
TagErrors: tagErrors,
|
TagErrors: tagErrors,
|
||||||
TagsReceived: tagsReceived,
|
TagsReceived: tagsReceived,
|
||||||
|
UdpPacketQueue: udpPacketQueue,
|
||||||
}
|
}
|
||||||
|
|
||||||
go ul.Listen()
|
go ul.Listen()
|
||||||
|
@ -479,15 +493,25 @@ func main() {
|
||||||
|
|
||||||
mux := http.DefaultServeMux
|
mux := http.DefaultServeMux
|
||||||
mux.Handle(*metricsEndpoint, promhttp.Handler())
|
mux.Handle(*metricsEndpoint, promhttp.Handler())
|
||||||
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
if *metricsEndpoint != "/" && *metricsEndpoint != "" {
|
||||||
w.Write([]byte(`<html>
|
landingConfig := web.LandingConfig{
|
||||||
<head><title>StatsD Exporter</title></head>
|
Name: "StatsD Exporter",
|
||||||
<body>
|
Description: "Prometheus Exporter for converting StatsD to Prometheus metrics",
|
||||||
<h1>StatsD Exporter</h1>
|
Version: version.Info(),
|
||||||
<p><a href="` + *metricsEndpoint + `">Metrics</a></p>
|
Links: []web.LandingLinks{
|
||||||
</body>
|
{
|
||||||
</html>`))
|
Address: *metricsEndpoint,
|
||||||
})
|
Text: "Metrics",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
landingPage, err := web.NewLandingPage(landingConfig)
|
||||||
|
if err != nil {
|
||||||
|
level.Error(logger).Log("err", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
mux.Handle("/", landingPage)
|
||||||
|
}
|
||||||
|
|
||||||
quitChan := make(chan struct{}, 1)
|
quitChan := make(chan struct{}, 1)
|
||||||
|
|
||||||
|
|
|
@ -105,6 +105,10 @@ func (b *Exporter) handleEvent(thisEvent event.Event) {
|
||||||
}
|
}
|
||||||
metricName = mapper.EscapeMetricName(mapping.Name)
|
metricName = mapper.EscapeMetricName(mapping.Name)
|
||||||
for label, value := range labels {
|
for label, value := range labels {
|
||||||
|
if _, ok := prometheusLabels[label]; mapping.HonorLabels && ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
prometheusLabels[label] = value
|
prometheusLabels[label] = value
|
||||||
}
|
}
|
||||||
b.EventsActions.WithLabelValues(string(mapping.Action)).Inc()
|
b.EventsActions.WithLabelValues(string(mapping.Action)).Inc()
|
||||||
|
@ -113,19 +117,24 @@ func (b *Exporter) handleEvent(thisEvent event.Event) {
|
||||||
metricName = mapper.EscapeMetricName(thisEvent.MetricName())
|
metricName = mapper.EscapeMetricName(thisEvent.MetricName())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
eventValue := thisEvent.Value()
|
||||||
|
if mapping.Scale.Set {
|
||||||
|
eventValue *= mapping.Scale.Val
|
||||||
|
}
|
||||||
|
|
||||||
switch ev := thisEvent.(type) {
|
switch ev := thisEvent.(type) {
|
||||||
case *event.CounterEvent:
|
case *event.CounterEvent:
|
||||||
// We don't accept negative values for counters. Incrementing the counter with a negative number
|
// We don't accept negative values for counters. Incrementing the counter with a negative number
|
||||||
// will cause the exporter to panic. Instead we will warn and continue to the next event.
|
// will cause the exporter to panic. Instead we will warn and continue to the next event.
|
||||||
if thisEvent.Value() < 0.0 {
|
if eventValue < 0.0 {
|
||||||
level.Debug(b.Logger).Log("msg", "counter must be non-negative value", "metric", metricName, "event_value", thisEvent.Value())
|
level.Debug(b.Logger).Log("msg", "counter must be non-negative value", "metric", metricName, "event_value", eventValue)
|
||||||
b.ErrorEventStats.WithLabelValues("illegal_negative_counter").Inc()
|
b.ErrorEventStats.WithLabelValues("illegal_negative_counter").Inc()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
counter, err := b.Registry.GetCounter(metricName, prometheusLabels, help, mapping, b.MetricsCount)
|
counter, err := b.Registry.GetCounter(metricName, prometheusLabels, help, mapping, b.MetricsCount)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
counter.Add(thisEvent.Value())
|
counter.Add(eventValue)
|
||||||
b.EventStats.WithLabelValues("counter").Inc()
|
b.EventStats.WithLabelValues("counter").Inc()
|
||||||
} else {
|
} else {
|
||||||
level.Debug(b.Logger).Log("msg", regErrF, "metric", metricName, "error", err)
|
level.Debug(b.Logger).Log("msg", regErrF, "metric", metricName, "error", err)
|
||||||
|
@ -137,9 +146,9 @@ func (b *Exporter) handleEvent(thisEvent event.Event) {
|
||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if ev.GRelative {
|
if ev.GRelative {
|
||||||
gauge.Add(thisEvent.Value())
|
gauge.Add(eventValue)
|
||||||
} else {
|
} else {
|
||||||
gauge.Set(thisEvent.Value())
|
gauge.Set(eventValue)
|
||||||
}
|
}
|
||||||
b.EventStats.WithLabelValues("gauge").Inc()
|
b.EventStats.WithLabelValues("gauge").Inc()
|
||||||
} else {
|
} else {
|
||||||
|
@ -160,7 +169,7 @@ func (b *Exporter) handleEvent(thisEvent event.Event) {
|
||||||
case mapper.ObserverTypeHistogram:
|
case mapper.ObserverTypeHistogram:
|
||||||
histogram, err := b.Registry.GetHistogram(metricName, prometheusLabels, help, mapping, b.MetricsCount)
|
histogram, err := b.Registry.GetHistogram(metricName, prometheusLabels, help, mapping, b.MetricsCount)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
histogram.Observe(thisEvent.Value())
|
histogram.Observe(eventValue)
|
||||||
b.EventStats.WithLabelValues("observer").Inc()
|
b.EventStats.WithLabelValues("observer").Inc()
|
||||||
} else {
|
} else {
|
||||||
level.Debug(b.Logger).Log("msg", regErrF, "metric", metricName, "error", err)
|
level.Debug(b.Logger).Log("msg", regErrF, "metric", metricName, "error", err)
|
||||||
|
@ -170,7 +179,7 @@ func (b *Exporter) handleEvent(thisEvent event.Event) {
|
||||||
case mapper.ObserverTypeDefault, mapper.ObserverTypeSummary:
|
case mapper.ObserverTypeDefault, mapper.ObserverTypeSummary:
|
||||||
summary, err := b.Registry.GetSummary(metricName, prometheusLabels, help, mapping, b.MetricsCount)
|
summary, err := b.Registry.GetSummary(metricName, prometheusLabels, help, mapping, b.MetricsCount)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
summary.Observe(thisEvent.Value())
|
summary.Observe(eventValue)
|
||||||
b.EventStats.WithLabelValues("observer").Inc()
|
b.EventStats.WithLabelValues("observer").Inc()
|
||||||
} else {
|
} else {
|
||||||
level.Debug(b.Logger).Log("msg", regErrF, "metric", metricName, "error", err)
|
level.Debug(b.Logger).Log("msg", regErrF, "metric", metricName, "error", err)
|
||||||
|
|
|
@ -56,6 +56,12 @@ var (
|
||||||
Help: "The total number of StatsD packets received over UDP.",
|
Help: "The total number of StatsD packets received over UDP.",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
udpPacketDrops = prometheus.NewCounter(
|
||||||
|
prometheus.CounterOpts{
|
||||||
|
Name: "statsd_exporter_udp_packet_drops_total",
|
||||||
|
Help: "The total number of dropped StatsD packets which received over UDP.",
|
||||||
|
},
|
||||||
|
)
|
||||||
tcpConnections = prometheus.NewCounter(
|
tcpConnections = prometheus.NewCounter(
|
||||||
prometheus.CounterOpts{
|
prometheus.CounterOpts{
|
||||||
Name: "statsd_exporter_tcp_connections_total",
|
Name: "statsd_exporter_tcp_connections_total",
|
||||||
|
@ -271,7 +277,7 @@ mappings:
|
||||||
// TestLabelParsing verifies that labels getting parsed out of metric
|
// TestLabelParsing verifies that labels getting parsed out of metric
|
||||||
// names are being properly created.
|
// names are being properly created.
|
||||||
func TestLabelParsing(t *testing.T) {
|
func TestLabelParsing(t *testing.T) {
|
||||||
codes := [2]string{"200", "300"}
|
codes := [3]string{"200", "300", "400"}
|
||||||
|
|
||||||
events := make(chan event.Events)
|
events := make(chan event.Events)
|
||||||
go func() {
|
go func() {
|
||||||
|
@ -286,6 +292,11 @@ func TestLabelParsing(t *testing.T) {
|
||||||
CValue: 1,
|
CValue: 1,
|
||||||
CLabels: make(map[string]string),
|
CLabels: make(map[string]string),
|
||||||
},
|
},
|
||||||
|
&event.CounterEvent{
|
||||||
|
CMetricName: "counter.test.400",
|
||||||
|
CValue: 1,
|
||||||
|
CLabels: map[string]string{"code": "should be overwritten"},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
events <- c
|
events <- c
|
||||||
close(events)
|
close(events)
|
||||||
|
@ -323,6 +334,51 @@ mappings:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestHonorLabels(t *testing.T) {
|
||||||
|
metricName := "some_counter"
|
||||||
|
events := make(chan event.Events)
|
||||||
|
go func() {
|
||||||
|
c := event.Events{
|
||||||
|
&event.CounterEvent{
|
||||||
|
CMetricName: metricName,
|
||||||
|
CValue: 1,
|
||||||
|
CLabels: map[string]string{"some_label": "bar"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
events <- c
|
||||||
|
close(events)
|
||||||
|
}()
|
||||||
|
|
||||||
|
config := `
|
||||||
|
mappings:
|
||||||
|
- match: .*
|
||||||
|
match_type: regex
|
||||||
|
name: $0
|
||||||
|
labels:
|
||||||
|
some_label: foo
|
||||||
|
honor_labels: true
|
||||||
|
`
|
||||||
|
testMapper := &mapper.MetricMapper{
|
||||||
|
Logger: log.NewNopLogger(),
|
||||||
|
}
|
||||||
|
err := testMapper.InitFromYAMLString(config)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Config load error: %s %s", config, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
ex := NewExporter(prometheus.DefaultRegisterer, testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
|
||||||
|
ex.Listen(events)
|
||||||
|
|
||||||
|
metrics, err := prometheus.DefaultGatherer.Gather()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Cannot gather from DefaultGatherer: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if getFloat64(metrics, metricName, map[string]string{"some_label": "bar"}) == nil {
|
||||||
|
t.Fatalf("Could not find metrics for %s with label set", metricName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TestConflictingMetrics validates that the exporter will not register metrics
|
// TestConflictingMetrics validates that the exporter will not register metrics
|
||||||
// of different types that have overlapping names.
|
// of different types that have overlapping names.
|
||||||
func TestConflictingMetrics(t *testing.T) {
|
func TestConflictingMetrics(t *testing.T) {
|
||||||
|
@ -401,6 +457,76 @@ func TestConflictingMetrics(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "histogram vs counter with count suffix",
|
||||||
|
expected: []float64{2},
|
||||||
|
in: event.Events{
|
||||||
|
&event.ObserverEvent{
|
||||||
|
OMetricName: "histogram_test1",
|
||||||
|
OValue: 2,
|
||||||
|
},
|
||||||
|
&event.CounterEvent{
|
||||||
|
CMetricName: "histogram_test1_count",
|
||||||
|
CValue: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "histogram vs counter with sum suffix",
|
||||||
|
expected: []float64{2},
|
||||||
|
in: event.Events{
|
||||||
|
&event.ObserverEvent{
|
||||||
|
OMetricName: "histogram_test1",
|
||||||
|
OValue: 2,
|
||||||
|
},
|
||||||
|
&event.CounterEvent{
|
||||||
|
CMetricName: "histogram_test1_sum",
|
||||||
|
CValue: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "histogram vs counter with bucket suffix",
|
||||||
|
expected: []float64{2},
|
||||||
|
in: event.Events{
|
||||||
|
&event.ObserverEvent{
|
||||||
|
OMetricName: "histogram_test1",
|
||||||
|
OValue: 2,
|
||||||
|
},
|
||||||
|
&event.CounterEvent{
|
||||||
|
CMetricName: "histogram_test1_bucket",
|
||||||
|
CValue: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "histogram vs gauge with sum suffix",
|
||||||
|
expected: []float64{2},
|
||||||
|
in: event.Events{
|
||||||
|
&event.ObserverEvent{
|
||||||
|
OMetricName: "histogram_test1",
|
||||||
|
OValue: 2,
|
||||||
|
},
|
||||||
|
&event.GaugeEvent{
|
||||||
|
GMetricName: "histogram_test1_sum",
|
||||||
|
GValue: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "histogram vs gauge with count suffix",
|
||||||
|
expected: []float64{2},
|
||||||
|
in: event.Events{
|
||||||
|
&event.ObserverEvent{
|
||||||
|
OMetricName: "histogram_test1",
|
||||||
|
OValue: 2,
|
||||||
|
},
|
||||||
|
&event.GaugeEvent{
|
||||||
|
GMetricName: "histogram_test1_count",
|
||||||
|
GValue: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "counter vs histogram",
|
name: "counter vs histogram",
|
||||||
expected: []float64{1},
|
expected: []float64{1},
|
||||||
|
@ -520,10 +646,11 @@ mappings:
|
||||||
events <- s.in
|
events <- s.in
|
||||||
close(events)
|
close(events)
|
||||||
}()
|
}()
|
||||||
ex := NewExporter(prometheus.DefaultRegisterer, testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
|
reg := prometheus.NewRegistry()
|
||||||
|
ex := NewExporter(reg, testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
|
||||||
ex.Listen(events)
|
ex.Listen(events)
|
||||||
|
|
||||||
metrics, err := prometheus.DefaultGatherer.Gather()
|
metrics, err := reg.Gather()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Cannot gather from DefaultGatherer: %v", err)
|
t.Fatalf("Cannot gather from DefaultGatherer: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -612,6 +739,7 @@ func TestInvalidUtf8InDatadogTagValue(t *testing.T) {
|
||||||
Logger: log.NewNopLogger(),
|
Logger: log.NewNopLogger(),
|
||||||
LineParser: parser,
|
LineParser: parser,
|
||||||
UDPPackets: udpPackets,
|
UDPPackets: udpPackets,
|
||||||
|
UDPPacketDrops: udpPacketDrops,
|
||||||
LinesReceived: linesReceived,
|
LinesReceived: linesReceived,
|
||||||
EventsFlushed: eventsFlushed,
|
EventsFlushed: eventsFlushed,
|
||||||
SampleErrors: *sampleErrors,
|
SampleErrors: *sampleErrors,
|
||||||
|
@ -774,6 +902,115 @@ func TestCounterIncrement(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test case from https://github.com/statsd/statsd/blob/master/docs/metric_types.md#gauges
|
||||||
|
func TestGaugeIncrementDecrement(t *testing.T) {
|
||||||
|
// Start exporter with a synchronous channel
|
||||||
|
events := make(chan event.Events)
|
||||||
|
go func() {
|
||||||
|
testMapper := mapper.MetricMapper{}
|
||||||
|
ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
|
||||||
|
ex.Listen(events)
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Synchronously send a statsd event to wait for handleEvent execution.
|
||||||
|
// Then close events channel to stop a listener.
|
||||||
|
name := "gaugor"
|
||||||
|
c := event.Events{
|
||||||
|
&event.GaugeEvent{
|
||||||
|
GMetricName: "gaugor",
|
||||||
|
GValue: 333,
|
||||||
|
GRelative: false,
|
||||||
|
GLabels: map[string]string{},
|
||||||
|
},
|
||||||
|
&event.GaugeEvent{
|
||||||
|
GMetricName: "gaugor",
|
||||||
|
GValue: -10,
|
||||||
|
GRelative: true,
|
||||||
|
GLabels: map[string]string{},
|
||||||
|
},
|
||||||
|
&event.GaugeEvent{
|
||||||
|
GMetricName: "gaugor",
|
||||||
|
GValue: 4,
|
||||||
|
GRelative: true,
|
||||||
|
GLabels: map[string]string{},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
events <- c
|
||||||
|
// Push empty event so that we block until the first event is consumed.
|
||||||
|
events <- event.Events{}
|
||||||
|
close(events)
|
||||||
|
|
||||||
|
// Check histogram value
|
||||||
|
metrics, err := prometheus.DefaultGatherer.Gather()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Cannot gather from DefaultGatherer: %v", err)
|
||||||
|
}
|
||||||
|
value := getFloat64(metrics, name, nil)
|
||||||
|
if value == nil {
|
||||||
|
t.Fatal("gauge value should not be nil")
|
||||||
|
}
|
||||||
|
if *value != 327 {
|
||||||
|
t.Fatalf("gauge wasn't incremented and decremented properly")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestScaledMapping(t *testing.T) {
|
||||||
|
events := make(chan event.Events)
|
||||||
|
testMapper := mapper.MetricMapper{}
|
||||||
|
config := `mappings:
|
||||||
|
- match: foo.processed_kilobytes
|
||||||
|
name: processed_bytes
|
||||||
|
scale: 1024
|
||||||
|
labels:
|
||||||
|
service: foo`
|
||||||
|
err := testMapper.InitFromYAMLString(config)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Config load error: %s %s", config, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start exporter with a synchronous channel
|
||||||
|
go func() {
|
||||||
|
ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
|
||||||
|
ex.Listen(events)
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Synchronously send a statsd event to wait for handleEvent execution.
|
||||||
|
// Then close events channel to stop a listener.
|
||||||
|
statsdName := "foo.processed_kilobytes"
|
||||||
|
statsdLabels := map[string]string{}
|
||||||
|
promName := "processed_bytes"
|
||||||
|
promLabels := map[string]string{"service": "foo"}
|
||||||
|
c := event.Events{
|
||||||
|
&event.CounterEvent{
|
||||||
|
CMetricName: statsdName,
|
||||||
|
CValue: 100,
|
||||||
|
CLabels: statsdLabels,
|
||||||
|
},
|
||||||
|
&event.CounterEvent{
|
||||||
|
CMetricName: statsdName,
|
||||||
|
CValue: 200,
|
||||||
|
CLabels: statsdLabels,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
events <- c
|
||||||
|
// Push empty event so that we block until the first event is consumed.
|
||||||
|
events <- event.Events{}
|
||||||
|
close(events)
|
||||||
|
|
||||||
|
// Check counter value
|
||||||
|
metrics, err := prometheus.DefaultGatherer.Gather()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Cannot gather from DefaultGatherer: %v", err)
|
||||||
|
}
|
||||||
|
value := getFloat64(metrics, promName, promLabels)
|
||||||
|
if value == nil {
|
||||||
|
t.Fatal("Counter value should not be nil")
|
||||||
|
}
|
||||||
|
if *value != 300*1024 {
|
||||||
|
t.Fatalf("Counter wasn't incremented properly")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type statsDPacketHandler interface {
|
type statsDPacketHandler interface {
|
||||||
HandlePacket(packet []byte)
|
HandlePacket(packet []byte)
|
||||||
SetEventHandler(eh event.EventHandler)
|
SetEventHandler(eh event.EventHandler)
|
||||||
|
|
|
@ -217,18 +217,44 @@ func (p *Parser) LineToEvents(line string, sampleErrors prometheus.CounterVec, s
|
||||||
|
|
||||||
labels := map[string]string{}
|
labels := map[string]string{}
|
||||||
metric := p.parseNameAndTags(elements[0], labels, tagErrors, logger)
|
metric := p.parseNameAndTags(elements[0], labels, tagErrors, logger)
|
||||||
|
usingDogStatsDTags := strings.Contains(elements[1], "|#")
|
||||||
var samples []string
|
if usingDogStatsDTags && len(labels) > 0 {
|
||||||
if strings.Contains(elements[1], "|#") {
|
|
||||||
// using DogStatsD tags
|
// using DogStatsD tags
|
||||||
|
|
||||||
// don't allow mixed tagging styles
|
// don't allow mixed tagging styles
|
||||||
if len(labels) > 0 {
|
|
||||||
sampleErrors.WithLabelValues("mixed_tagging_styles").Inc()
|
sampleErrors.WithLabelValues("mixed_tagging_styles").Inc()
|
||||||
level.Debug(logger).Log("msg", "Bad line (multiple tagging styles) from StatsD", "line", line)
|
level.Debug(logger).Log("msg", "Bad line (multiple tagging styles) from StatsD", "line", line)
|
||||||
return events
|
return events
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var samples []string
|
||||||
|
lineParts := strings.SplitN(elements[1], "|", 3)
|
||||||
|
if strings.Contains(lineParts[0], ":") {
|
||||||
|
// handle DogStatsD extended aggregation
|
||||||
|
isValidAggType := false
|
||||||
|
switch lineParts[1] {
|
||||||
|
case
|
||||||
|
"ms", // timer
|
||||||
|
"h", // histogram
|
||||||
|
"d": // distribution
|
||||||
|
isValidAggType = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if isValidAggType {
|
||||||
|
aggValues := strings.Split(lineParts[0], ":")
|
||||||
|
aggLines := make([]string, len(aggValues))
|
||||||
|
_, aggLineSuffix, _ := strings.Cut(elements[1], "|")
|
||||||
|
|
||||||
|
for i, aggValue := range aggValues {
|
||||||
|
aggLines[i] = strings.Join([]string{aggValue, aggLineSuffix}, "|")
|
||||||
|
}
|
||||||
|
samples = aggLines
|
||||||
|
} else {
|
||||||
|
sampleErrors.WithLabelValues("invalid_extended_aggregate_type").Inc()
|
||||||
|
level.Debug(logger).Log("msg", "Bad line (invalid extended aggregate type) from StatsD", "line", line)
|
||||||
|
return events
|
||||||
|
}
|
||||||
|
} else if usingDogStatsDTags {
|
||||||
// disable multi-metrics
|
// disable multi-metrics
|
||||||
samples = elements[1:]
|
samples = elements[1:]
|
||||||
} else {
|
} else {
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -38,6 +38,7 @@ type StatsDUDPListener struct {
|
||||||
Logger log.Logger
|
Logger log.Logger
|
||||||
LineParser Parser
|
LineParser Parser
|
||||||
UDPPackets prometheus.Counter
|
UDPPackets prometheus.Counter
|
||||||
|
UDPPacketDrops prometheus.Counter
|
||||||
LinesReceived prometheus.Counter
|
LinesReceived prometheus.Counter
|
||||||
EventsFlushed prometheus.Counter
|
EventsFlushed prometheus.Counter
|
||||||
Relay *relay.Relay
|
Relay *relay.Relay
|
||||||
|
@ -45,6 +46,7 @@ type StatsDUDPListener struct {
|
||||||
SamplesReceived prometheus.Counter
|
SamplesReceived prometheus.Counter
|
||||||
TagErrors prometheus.Counter
|
TagErrors prometheus.Counter
|
||||||
TagsReceived prometheus.Counter
|
TagsReceived prometheus.Counter
|
||||||
|
UdpPacketQueue chan []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *StatsDUDPListener) SetEventHandler(eh event.EventHandler) {
|
func (l *StatsDUDPListener) SetEventHandler(eh event.EventHandler) {
|
||||||
|
@ -53,6 +55,7 @@ func (l *StatsDUDPListener) SetEventHandler(eh event.EventHandler) {
|
||||||
|
|
||||||
func (l *StatsDUDPListener) Listen() {
|
func (l *StatsDUDPListener) Listen() {
|
||||||
buf := make([]byte, 65535)
|
buf := make([]byte, 65535)
|
||||||
|
go l.ProcessUdpPacketQueue()
|
||||||
for {
|
for {
|
||||||
n, _, err := l.Conn.ReadFromUDP(buf)
|
n, _, err := l.Conn.ReadFromUDP(buf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -64,12 +67,31 @@ func (l *StatsDUDPListener) Listen() {
|
||||||
level.Error(l.Logger).Log("error", err)
|
level.Error(l.Logger).Log("error", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
l.HandlePacket(buf[0:n])
|
|
||||||
|
l.EnqueueUdpPacket(buf, n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *StatsDUDPListener) EnqueueUdpPacket(packet []byte, n int) {
|
||||||
|
l.UDPPackets.Inc()
|
||||||
|
packetCopy := make([]byte, n)
|
||||||
|
copy(packetCopy, packet)
|
||||||
|
select {
|
||||||
|
case l.UdpPacketQueue <- packetCopy:
|
||||||
|
// do nothing
|
||||||
|
default:
|
||||||
|
l.UDPPacketDrops.Inc()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *StatsDUDPListener) ProcessUdpPacketQueue() {
|
||||||
|
for {
|
||||||
|
packet := <-l.UdpPacketQueue
|
||||||
|
l.HandlePacket(packet)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *StatsDUDPListener) HandlePacket(packet []byte) {
|
func (l *StatsDUDPListener) HandlePacket(packet []byte) {
|
||||||
l.UDPPackets.Inc()
|
|
||||||
lines := strings.Split(string(packet), "\n")
|
lines := strings.Split(string(packet), "\n")
|
||||||
for _, line := range lines {
|
for _, line := range lines {
|
||||||
level.Debug(l.Logger).Log("msg", "Incoming line", "proto", "udp", "line", line)
|
level.Debug(l.Logger).Log("msg", "Incoming line", "proto", "udp", "line", line)
|
||||||
|
@ -133,7 +155,7 @@ func (l *StatsDTCPListener) HandleConn(c *net.TCPConn) {
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
level.Debug(l.Logger).Log("msg", "Incoming line", "proto", "tcp", "line", line)
|
level.Debug(l.Logger).Log("msg", "Incoming line", "proto", "tcp", "line", string(line))
|
||||||
if isPrefix {
|
if isPrefix {
|
||||||
l.TCPLineTooLong.Inc()
|
l.TCPLineTooLong.Inc()
|
||||||
level.Debug(l.Logger).Log("msg", "Read failed: line too long", "addr", c.RemoteAddr())
|
level.Debug(l.Logger).Log("msg", "Read failed: line too long", "addr", c.RemoteAddr())
|
||||||
|
|
|
@ -35,7 +35,7 @@ func (f *FSM) DumpFSM(w io.Writer) {
|
||||||
if idx == 0 {
|
if idx == 0 {
|
||||||
// color for metric types
|
// color for metric types
|
||||||
w.Write([]byte(fmt.Sprintf("%d [color=\"#D6B656\",fillcolor=\"#FFF2CC\"];\n", len(states)-1)))
|
w.Write([]byte(fmt.Sprintf("%d [color=\"#D6B656\",fillcolor=\"#FFF2CC\"];\n", len(states)-1)))
|
||||||
} else if transition.transitions == nil || len(transition.transitions) == 0 {
|
} else if len(transition.transitions) == 0 {
|
||||||
// color for end state
|
// color for end state
|
||||||
w.Write([]byte(fmt.Sprintf("%d [color=\"#82B366\",fillcolor=\"#D5E8D4\"];\n", len(states)-1)))
|
w.Write([]byte(fmt.Sprintf("%d [color=\"#82B366\",fillcolor=\"#D5E8D4\"];\n", len(states)-1)))
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@ package mapper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"os"
|
||||||
"regexp"
|
"regexp"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
@ -43,7 +43,7 @@ var (
|
||||||
|
|
||||||
type MetricMapper struct {
|
type MetricMapper struct {
|
||||||
Registerer prometheus.Registerer
|
Registerer prometheus.Registerer
|
||||||
Defaults mapperConfigDefaults `yaml:"defaults"`
|
Defaults MapperConfigDefaults `yaml:"defaults"`
|
||||||
Mappings []MetricMapping `yaml:"mappings"`
|
Mappings []MetricMapping `yaml:"mappings"`
|
||||||
FSM *fsm.FSM
|
FSM *fsm.FSM
|
||||||
doFSM bool
|
doFSM bool
|
||||||
|
@ -57,7 +57,7 @@ type MetricMapper struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type SummaryOptions struct {
|
type SummaryOptions struct {
|
||||||
Quantiles []metricObjective `yaml:"quantiles"`
|
Quantiles []MetricObjective `yaml:"quantiles"`
|
||||||
MaxAge time.Duration `yaml:"max_age"`
|
MaxAge time.Duration `yaml:"max_age"`
|
||||||
AgeBuckets uint32 `yaml:"age_buckets"`
|
AgeBuckets uint32 `yaml:"age_buckets"`
|
||||||
BufCap uint32 `yaml:"buf_cap"`
|
BufCap uint32 `yaml:"buf_cap"`
|
||||||
|
@ -65,14 +65,16 @@ type SummaryOptions struct {
|
||||||
|
|
||||||
type HistogramOptions struct {
|
type HistogramOptions struct {
|
||||||
Buckets []float64 `yaml:"buckets"`
|
Buckets []float64 `yaml:"buckets"`
|
||||||
|
NativeHistogramBucketFactor float64 `yaml:"native_histogram_bucket_factor"`
|
||||||
|
NativeHistogramMaxBuckets uint32 `yaml:"native_histogram_max_buckets"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type metricObjective struct {
|
type MetricObjective struct {
|
||||||
Quantile float64 `yaml:"quantile"`
|
Quantile float64 `yaml:"quantile"`
|
||||||
Error float64 `yaml:"error"`
|
Error float64 `yaml:"error"`
|
||||||
}
|
}
|
||||||
|
|
||||||
var defaultQuantiles = []metricObjective{
|
var defaultQuantiles = []MetricObjective{
|
||||||
{Quantile: 0.5, Error: 0.05},
|
{Quantile: 0.5, Error: 0.05},
|
||||||
{Quantile: 0.9, Error: 0.01},
|
{Quantile: 0.9, Error: 0.01},
|
||||||
{Quantile: 0.99, Error: 0.001},
|
{Quantile: 0.99, Error: 0.001},
|
||||||
|
@ -88,6 +90,12 @@ func (m *MetricMapper) InitFromYAMLString(fileContents string) error {
|
||||||
if len(n.Defaults.HistogramOptions.Buckets) == 0 {
|
if len(n.Defaults.HistogramOptions.Buckets) == 0 {
|
||||||
n.Defaults.HistogramOptions.Buckets = prometheus.DefBuckets
|
n.Defaults.HistogramOptions.Buckets = prometheus.DefBuckets
|
||||||
}
|
}
|
||||||
|
if n.Defaults.HistogramOptions.NativeHistogramBucketFactor == 0 {
|
||||||
|
n.Defaults.HistogramOptions.NativeHistogramBucketFactor = 1.1
|
||||||
|
}
|
||||||
|
if n.Defaults.HistogramOptions.NativeHistogramMaxBuckets <= 0 {
|
||||||
|
n.Defaults.HistogramOptions.NativeHistogramMaxBuckets = 256
|
||||||
|
}
|
||||||
|
|
||||||
if len(n.Defaults.SummaryOptions.Quantiles) == 0 {
|
if len(n.Defaults.SummaryOptions.Quantiles) == 0 {
|
||||||
n.Defaults.SummaryOptions.Quantiles = defaultQuantiles
|
n.Defaults.SummaryOptions.Quantiles = defaultQuantiles
|
||||||
|
@ -193,10 +201,10 @@ func (m *MetricMapper) InitFromYAMLString(fileContents string) error {
|
||||||
if currentMapping.HistogramOptions == nil {
|
if currentMapping.HistogramOptions == nil {
|
||||||
currentMapping.HistogramOptions = &HistogramOptions{}
|
currentMapping.HistogramOptions = &HistogramOptions{}
|
||||||
}
|
}
|
||||||
if currentMapping.LegacyBuckets != nil && len(currentMapping.LegacyBuckets) != 0 {
|
if len(currentMapping.LegacyBuckets) != 0 {
|
||||||
currentMapping.HistogramOptions.Buckets = currentMapping.LegacyBuckets
|
currentMapping.HistogramOptions.Buckets = currentMapping.LegacyBuckets
|
||||||
}
|
}
|
||||||
if currentMapping.HistogramOptions.Buckets == nil || len(currentMapping.HistogramOptions.Buckets) == 0 {
|
if len(currentMapping.HistogramOptions.Buckets) == 0 {
|
||||||
currentMapping.HistogramOptions.Buckets = n.Defaults.HistogramOptions.Buckets
|
currentMapping.HistogramOptions.Buckets = n.Defaults.HistogramOptions.Buckets
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -208,10 +216,10 @@ func (m *MetricMapper) InitFromYAMLString(fileContents string) error {
|
||||||
if currentMapping.SummaryOptions == nil {
|
if currentMapping.SummaryOptions == nil {
|
||||||
currentMapping.SummaryOptions = &SummaryOptions{}
|
currentMapping.SummaryOptions = &SummaryOptions{}
|
||||||
}
|
}
|
||||||
if currentMapping.LegacyQuantiles != nil && len(currentMapping.LegacyQuantiles) != 0 {
|
if len(currentMapping.LegacyQuantiles) != 0 {
|
||||||
currentMapping.SummaryOptions.Quantiles = currentMapping.LegacyQuantiles
|
currentMapping.SummaryOptions.Quantiles = currentMapping.LegacyQuantiles
|
||||||
}
|
}
|
||||||
if currentMapping.SummaryOptions.Quantiles == nil || len(currentMapping.SummaryOptions.Quantiles) == 0 {
|
if len(currentMapping.SummaryOptions.Quantiles) == 0 {
|
||||||
currentMapping.SummaryOptions.Quantiles = n.Defaults.SummaryOptions.Quantiles
|
currentMapping.SummaryOptions.Quantiles = n.Defaults.SummaryOptions.Quantiles
|
||||||
}
|
}
|
||||||
if currentMapping.SummaryOptions.MaxAge == 0 {
|
if currentMapping.SummaryOptions.MaxAge == 0 {
|
||||||
|
@ -233,6 +241,10 @@ func (m *MetricMapper) InitFromYAMLString(fileContents string) error {
|
||||||
m.mutex.Lock()
|
m.mutex.Lock()
|
||||||
defer m.mutex.Unlock()
|
defer m.mutex.Unlock()
|
||||||
|
|
||||||
|
if m.Logger == nil {
|
||||||
|
m.Logger = log.NewNopLogger()
|
||||||
|
}
|
||||||
|
|
||||||
m.Defaults = n.Defaults
|
m.Defaults = n.Defaults
|
||||||
m.Mappings = n.Mappings
|
m.Mappings = n.Mappings
|
||||||
|
|
||||||
|
@ -259,15 +271,11 @@ func (m *MetricMapper) InitFromYAMLString(fileContents string) error {
|
||||||
m.MappingsCount.Set(float64(len(n.Mappings)))
|
m.MappingsCount.Set(float64(len(n.Mappings)))
|
||||||
}
|
}
|
||||||
|
|
||||||
if m.Logger == nil {
|
|
||||||
m.Logger = log.NewNopLogger()
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MetricMapper) InitFromFile(fileName string) error {
|
func (m *MetricMapper) InitFromFile(fileName string) error {
|
||||||
mappingStr, err := ioutil.ReadFile(fileName)
|
mappingStr, err := os.ReadFile(fileName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@ package mapper
|
||||||
|
|
||||||
import "time"
|
import "time"
|
||||||
|
|
||||||
type mapperConfigDefaults struct {
|
type MapperConfigDefaults struct {
|
||||||
ObserverType ObserverType `yaml:"observer_type"`
|
ObserverType ObserverType `yaml:"observer_type"`
|
||||||
MatchType MatchType `yaml:"match_type"`
|
MatchType MatchType `yaml:"match_type"`
|
||||||
GlobDisableOrdering bool `yaml:"glob_disable_ordering"`
|
GlobDisableOrdering bool `yaml:"glob_disable_ordering"`
|
||||||
|
@ -29,7 +29,7 @@ type mapperConfigDefaultsAlias struct {
|
||||||
ObserverType ObserverType `yaml:"observer_type"`
|
ObserverType ObserverType `yaml:"observer_type"`
|
||||||
TimerType ObserverType `yaml:"timer_type,omitempty"` // DEPRECATED - field only present to preserve backwards compatibility in configs
|
TimerType ObserverType `yaml:"timer_type,omitempty"` // DEPRECATED - field only present to preserve backwards compatibility in configs
|
||||||
Buckets []float64 `yaml:"buckets"` // DEPRECATED - field only present to preserve backwards compatibility in configs
|
Buckets []float64 `yaml:"buckets"` // DEPRECATED - field only present to preserve backwards compatibility in configs
|
||||||
Quantiles []metricObjective `yaml:"quantiles"` // DEPRECATED - field only present to preserve backwards compatibility in configs
|
Quantiles []MetricObjective `yaml:"quantiles"` // DEPRECATED - field only present to preserve backwards compatibility in configs
|
||||||
MatchType MatchType `yaml:"match_type"`
|
MatchType MatchType `yaml:"match_type"`
|
||||||
GlobDisableOrdering bool `yaml:"glob_disable_ordering"`
|
GlobDisableOrdering bool `yaml:"glob_disable_ordering"`
|
||||||
Ttl time.Duration `yaml:"ttl"`
|
Ttl time.Duration `yaml:"ttl"`
|
||||||
|
@ -39,7 +39,7 @@ type mapperConfigDefaultsAlias struct {
|
||||||
|
|
||||||
// UnmarshalYAML is a custom unmarshal function to allow use of deprecated config keys
|
// UnmarshalYAML is a custom unmarshal function to allow use of deprecated config keys
|
||||||
// observer_type will override timer_type
|
// observer_type will override timer_type
|
||||||
func (d *mapperConfigDefaults) UnmarshalYAML(unmarshal func(interface{}) error) error {
|
func (d *MapperConfigDefaults) UnmarshalYAML(unmarshal func(interface{}) error) error {
|
||||||
var tmp mapperConfigDefaultsAlias
|
var tmp mapperConfigDefaultsAlias
|
||||||
if err := unmarshal(&tmp); err != nil {
|
if err := unmarshal(&tmp); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -27,7 +27,7 @@ type mappings []struct {
|
||||||
statsdMetric string
|
statsdMetric string
|
||||||
name string
|
name string
|
||||||
labels map[string]string
|
labels map[string]string
|
||||||
quantiles []metricObjective
|
quantiles []MetricObjective
|
||||||
notPresent bool
|
notPresent bool
|
||||||
ttl time.Duration
|
ttl time.Duration
|
||||||
metricType MetricType
|
metricType MetricType
|
||||||
|
@ -35,6 +35,7 @@ type mappings []struct {
|
||||||
ageBuckets uint32
|
ageBuckets uint32
|
||||||
bufCap uint32
|
bufCap uint32
|
||||||
buckets []float64
|
buckets []float64
|
||||||
|
scale MaybeFloat64
|
||||||
}
|
}
|
||||||
|
|
||||||
func newTestMapperWithCache(cacheType string, size int) *MetricMapper {
|
func newTestMapperWithCache(cacheType string, size int) *MetricMapper {
|
||||||
|
@ -570,7 +571,7 @@ mappings:
|
||||||
statsdMetric: "test.*.*",
|
statsdMetric: "test.*.*",
|
||||||
name: "foo",
|
name: "foo",
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
quantiles: []metricObjective{
|
quantiles: []MetricObjective{
|
||||||
{Quantile: 0.42, Error: 0.04},
|
{Quantile: 0.42, Error: 0.04},
|
||||||
{Quantile: 0.7, Error: 0.002},
|
{Quantile: 0.7, Error: 0.002},
|
||||||
},
|
},
|
||||||
|
@ -597,7 +598,7 @@ mappings:
|
||||||
statsdMetric: "test.*.*",
|
statsdMetric: "test.*.*",
|
||||||
name: "foo",
|
name: "foo",
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
quantiles: []metricObjective{
|
quantiles: []MetricObjective{
|
||||||
{Quantile: 0.42, Error: 0.04},
|
{Quantile: 0.42, Error: 0.04},
|
||||||
{Quantile: 0.7, Error: 0.002},
|
{Quantile: 0.7, Error: 0.002},
|
||||||
},
|
},
|
||||||
|
@ -618,7 +619,7 @@ mappings:
|
||||||
statsdMetric: "test1.*.*",
|
statsdMetric: "test1.*.*",
|
||||||
name: "foo",
|
name: "foo",
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
quantiles: []metricObjective{
|
quantiles: []MetricObjective{
|
||||||
{Quantile: 0.5, Error: 0.05},
|
{Quantile: 0.5, Error: 0.05},
|
||||||
{Quantile: 0.9, Error: 0.01},
|
{Quantile: 0.9, Error: 0.01},
|
||||||
{Quantile: 0.99, Error: 0.001},
|
{Quantile: 0.99, Error: 0.001},
|
||||||
|
@ -640,7 +641,7 @@ mappings:
|
||||||
statsdMetric: "test1.*.*",
|
statsdMetric: "test1.*.*",
|
||||||
name: "foo",
|
name: "foo",
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
quantiles: []metricObjective{
|
quantiles: []MetricObjective{
|
||||||
{Quantile: 0.5, Error: 0.05},
|
{Quantile: 0.5, Error: 0.05},
|
||||||
{Quantile: 0.9, Error: 0.01},
|
{Quantile: 0.9, Error: 0.01},
|
||||||
{Quantile: 0.99, Error: 0.001},
|
{Quantile: 0.99, Error: 0.001},
|
||||||
|
@ -690,7 +691,7 @@ mappings:
|
||||||
statsdMetric: "test.*.*",
|
statsdMetric: "test.*.*",
|
||||||
name: "foo",
|
name: "foo",
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
quantiles: []metricObjective{
|
quantiles: []MetricObjective{
|
||||||
{Quantile: 0.42, Error: 0.04},
|
{Quantile: 0.42, Error: 0.04},
|
||||||
{Quantile: 0.7, Error: 0.002},
|
{Quantile: 0.7, Error: 0.002},
|
||||||
},
|
},
|
||||||
|
@ -720,7 +721,7 @@ mappings:
|
||||||
statsdMetric: "test.*.*",
|
statsdMetric: "test.*.*",
|
||||||
name: "foo",
|
name: "foo",
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
quantiles: []metricObjective{
|
quantiles: []MetricObjective{
|
||||||
{Quantile: 0.42, Error: 0.04},
|
{Quantile: 0.42, Error: 0.04},
|
||||||
{Quantile: 0.7, Error: 0.002},
|
{Quantile: 0.7, Error: 0.002},
|
||||||
},
|
},
|
||||||
|
@ -754,7 +755,7 @@ mappings:
|
||||||
statsdMetric: "test.*.*",
|
statsdMetric: "test.*.*",
|
||||||
name: "foo",
|
name: "foo",
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
quantiles: []metricObjective{
|
quantiles: []MetricObjective{
|
||||||
{Quantile: 0.42, Error: 0.04},
|
{Quantile: 0.42, Error: 0.04},
|
||||||
{Quantile: 0.7, Error: 0.002},
|
{Quantile: 0.7, Error: 0.002},
|
||||||
},
|
},
|
||||||
|
@ -819,7 +820,7 @@ mappings:
|
||||||
statsdMetric: "test.*.*",
|
statsdMetric: "test.*.*",
|
||||||
name: "foo",
|
name: "foo",
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
quantiles: []metricObjective{
|
quantiles: []MetricObjective{
|
||||||
{Quantile: 0.42, Error: 0.04},
|
{Quantile: 0.42, Error: 0.04},
|
||||||
{Quantile: 0.7, Error: 0.002},
|
{Quantile: 0.7, Error: 0.002},
|
||||||
},
|
},
|
||||||
|
@ -862,7 +863,7 @@ mappings:
|
||||||
statsdMetric: "test.*.*",
|
statsdMetric: "test.*.*",
|
||||||
name: "foo",
|
name: "foo",
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
quantiles: []metricObjective{
|
quantiles: []MetricObjective{
|
||||||
{Quantile: 0.42, Error: 0.04},
|
{Quantile: 0.42, Error: 0.04},
|
||||||
{Quantile: 0.7, Error: 0.002},
|
{Quantile: 0.7, Error: 0.002},
|
||||||
},
|
},
|
||||||
|
@ -909,7 +910,7 @@ mappings:
|
||||||
statsdMetric: "test.*.*",
|
statsdMetric: "test.*.*",
|
||||||
name: "foo",
|
name: "foo",
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
quantiles: []metricObjective{
|
quantiles: []MetricObjective{
|
||||||
{Quantile: 0.42, Error: 0.04},
|
{Quantile: 0.42, Error: 0.04},
|
||||||
{Quantile: 0.7, Error: 0.002},
|
{Quantile: 0.7, Error: 0.002},
|
||||||
},
|
},
|
||||||
|
@ -921,7 +922,7 @@ mappings:
|
||||||
statsdMetric: "test_default.*.*",
|
statsdMetric: "test_default.*.*",
|
||||||
name: "foo_default",
|
name: "foo_default",
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
quantiles: []metricObjective{
|
quantiles: []MetricObjective{
|
||||||
{Quantile: 0.9, Error: 0.1},
|
{Quantile: 0.9, Error: 0.1},
|
||||||
{Quantile: 0.99, Error: 0.01},
|
{Quantile: 0.99, Error: 0.01},
|
||||||
},
|
},
|
||||||
|
@ -965,7 +966,7 @@ mappings:
|
||||||
statsdMetric: "test.*.*",
|
statsdMetric: "test.*.*",
|
||||||
name: "foo",
|
name: "foo",
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
quantiles: []metricObjective{
|
quantiles: []MetricObjective{
|
||||||
{Quantile: 0.42, Error: 0.04},
|
{Quantile: 0.42, Error: 0.04},
|
||||||
{Quantile: 0.7, Error: 0.002},
|
{Quantile: 0.7, Error: 0.002},
|
||||||
},
|
},
|
||||||
|
@ -977,7 +978,7 @@ mappings:
|
||||||
statsdMetric: "test_default.*.*",
|
statsdMetric: "test_default.*.*",
|
||||||
name: "foo_default",
|
name: "foo_default",
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
quantiles: []metricObjective{
|
quantiles: []MetricObjective{
|
||||||
{Quantile: 0.9, Error: 0.1},
|
{Quantile: 0.9, Error: 0.1},
|
||||||
{Quantile: 0.99, Error: 0.01},
|
{Quantile: 0.99, Error: 0.01},
|
||||||
},
|
},
|
||||||
|
@ -1017,7 +1018,7 @@ mappings:
|
||||||
statsdMetric: "test.*.*",
|
statsdMetric: "test.*.*",
|
||||||
name: "foo",
|
name: "foo",
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
quantiles: []metricObjective{
|
quantiles: []MetricObjective{
|
||||||
{Quantile: 0.9, Error: 0.1},
|
{Quantile: 0.9, Error: 0.1},
|
||||||
{Quantile: 0.99, Error: 0.01},
|
{Quantile: 0.99, Error: 0.01},
|
||||||
},
|
},
|
||||||
|
@ -1029,7 +1030,7 @@ mappings:
|
||||||
statsdMetric: "test_default.*.*",
|
statsdMetric: "test_default.*.*",
|
||||||
name: "foo_default",
|
name: "foo_default",
|
||||||
labels: map[string]string{},
|
labels: map[string]string{},
|
||||||
quantiles: []metricObjective{
|
quantiles: []MetricObjective{
|
||||||
{Quantile: 0.9, Error: 0.1},
|
{Quantile: 0.9, Error: 0.1},
|
||||||
{Quantile: 0.99, Error: 0.01},
|
{Quantile: 0.99, Error: 0.01},
|
||||||
},
|
},
|
||||||
|
@ -1480,6 +1481,54 @@ mappings:
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
testName: "Config with 'scale' field",
|
||||||
|
config: `mappings:
|
||||||
|
- match: grpc_server.*.*.latency_ms
|
||||||
|
name: grpc_server_handling_seconds
|
||||||
|
scale: 0.001
|
||||||
|
labels:
|
||||||
|
grpc_service: "$1"
|
||||||
|
grpc_method: "$2"`,
|
||||||
|
mappings: mappings{
|
||||||
|
{
|
||||||
|
statsdMetric: "test.a",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
statsdMetric: "grpc_server.Foo.Bar.latency_ms",
|
||||||
|
name: "grpc_server_handling_seconds",
|
||||||
|
scale: MaybeFloat64{Val: 0.001, Set: true},
|
||||||
|
labels: map[string]string{
|
||||||
|
"grpc_service": "Foo",
|
||||||
|
"grpc_method": "Bar",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
testName: "Config with 'scale' using scientific notation",
|
||||||
|
config: `mappings:
|
||||||
|
- match: grpc_server.*.*.latency_us
|
||||||
|
name: grpc_server_handling_seconds
|
||||||
|
scale: 1e-6
|
||||||
|
labels:
|
||||||
|
grpc_service: "$1"
|
||||||
|
grpc_method: "$2"`,
|
||||||
|
mappings: mappings{
|
||||||
|
{
|
||||||
|
statsdMetric: "test.a",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
statsdMetric: "grpc_server.Foo.Bar.latency_us",
|
||||||
|
name: "grpc_server_handling_seconds",
|
||||||
|
scale: MaybeFloat64{Val: 1e-6, Set: true},
|
||||||
|
labels: map[string]string{
|
||||||
|
"grpc_service": "Foo",
|
||||||
|
"grpc_method": "Bar",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
mapper := MetricMapper{}
|
mapper := MetricMapper{}
|
||||||
|
@ -1561,6 +1610,9 @@ mappings:
|
||||||
if mapping.bufCap != 0 && mapping.bufCap != m.SummaryOptions.BufCap {
|
if mapping.bufCap != 0 && mapping.bufCap != m.SummaryOptions.BufCap {
|
||||||
t.Fatalf("%d.%q: Expected max age %v, got %v", i, metric, mapping.bufCap, m.SummaryOptions.BufCap)
|
t.Fatalf("%d.%q: Expected max age %v, got %v", i, metric, mapping.bufCap, m.SummaryOptions.BufCap)
|
||||||
}
|
}
|
||||||
|
if present && mapping.scale != m.Scale {
|
||||||
|
t.Fatalf("%d.%q: Expected scale %v, got %v", i, metric, mapping.scale, m.Scale)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,12 +28,13 @@ type MetricMapping struct {
|
||||||
nameFormatter *fsm.TemplateFormatter
|
nameFormatter *fsm.TemplateFormatter
|
||||||
regex *regexp.Regexp
|
regex *regexp.Regexp
|
||||||
Labels prometheus.Labels `yaml:"labels"`
|
Labels prometheus.Labels `yaml:"labels"`
|
||||||
|
HonorLabels bool `yaml:"honor_labels"`
|
||||||
labelKeys []string
|
labelKeys []string
|
||||||
labelFormatters []*fsm.TemplateFormatter
|
labelFormatters []*fsm.TemplateFormatter
|
||||||
ObserverType ObserverType `yaml:"observer_type"`
|
ObserverType ObserverType `yaml:"observer_type"`
|
||||||
TimerType ObserverType `yaml:"timer_type,omitempty"` // DEPRECATED - field only present to preserve backwards compatibility in configs. Always empty
|
TimerType ObserverType `yaml:"timer_type,omitempty"` // DEPRECATED - field only present to preserve backwards compatibility in configs. Always empty
|
||||||
LegacyBuckets []float64 `yaml:"buckets"`
|
LegacyBuckets []float64 `yaml:"buckets"`
|
||||||
LegacyQuantiles []metricObjective `yaml:"quantiles"`
|
LegacyQuantiles []MetricObjective `yaml:"quantiles"`
|
||||||
MatchType MatchType `yaml:"match_type"`
|
MatchType MatchType `yaml:"match_type"`
|
||||||
HelpText string `yaml:"help"`
|
HelpText string `yaml:"help"`
|
||||||
Action ActionType `yaml:"action"`
|
Action ActionType `yaml:"action"`
|
||||||
|
@ -41,6 +42,7 @@ type MetricMapping struct {
|
||||||
Ttl time.Duration `yaml:"ttl"`
|
Ttl time.Duration `yaml:"ttl"`
|
||||||
SummaryOptions *SummaryOptions `yaml:"summary_options"`
|
SummaryOptions *SummaryOptions `yaml:"summary_options"`
|
||||||
HistogramOptions *HistogramOptions `yaml:"histogram_options"`
|
HistogramOptions *HistogramOptions `yaml:"histogram_options"`
|
||||||
|
Scale MaybeFloat64 `yaml:"scale"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalYAML is a custom unmarshal function to allow use of deprecated config keys
|
// UnmarshalYAML is a custom unmarshal function to allow use of deprecated config keys
|
||||||
|
@ -56,6 +58,7 @@ func (m *MetricMapping) UnmarshalYAML(unmarshal func(interface{}) error) error {
|
||||||
m.Match = tmp.Match
|
m.Match = tmp.Match
|
||||||
m.Name = tmp.Name
|
m.Name = tmp.Name
|
||||||
m.Labels = tmp.Labels
|
m.Labels = tmp.Labels
|
||||||
|
m.HonorLabels = tmp.HonorLabels
|
||||||
m.ObserverType = tmp.ObserverType
|
m.ObserverType = tmp.ObserverType
|
||||||
m.LegacyBuckets = tmp.LegacyBuckets
|
m.LegacyBuckets = tmp.LegacyBuckets
|
||||||
m.LegacyQuantiles = tmp.LegacyQuantiles
|
m.LegacyQuantiles = tmp.LegacyQuantiles
|
||||||
|
@ -66,6 +69,7 @@ func (m *MetricMapping) UnmarshalYAML(unmarshal func(interface{}) error) error {
|
||||||
m.Ttl = tmp.Ttl
|
m.Ttl = tmp.Ttl
|
||||||
m.SummaryOptions = tmp.SummaryOptions
|
m.SummaryOptions = tmp.SummaryOptions
|
||||||
m.HistogramOptions = tmp.HistogramOptions
|
m.HistogramOptions = tmp.HistogramOptions
|
||||||
|
m.Scale = tmp.Scale
|
||||||
|
|
||||||
// Use deprecated TimerType if necessary
|
// Use deprecated TimerType if necessary
|
||||||
if tmp.ObserverType == "" {
|
if tmp.ObserverType == "" {
|
||||||
|
@ -74,3 +78,25 @@ func (m *MetricMapping) UnmarshalYAML(unmarshal func(interface{}) error) error {
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type MaybeFloat64 struct {
|
||||||
|
Set bool
|
||||||
|
Val float64
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MaybeFloat64) MarshalYAML() (interface{}, error) {
|
||||||
|
if m.Set {
|
||||||
|
return m.Val, nil
|
||||||
|
}
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MaybeFloat64) UnmarshalYAML(unmarshal func(interface{}) error) error {
|
||||||
|
var tmp float64
|
||||||
|
if err := unmarshal(&tmp); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
m.Val = tmp
|
||||||
|
m.Set = true
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ import (
|
||||||
"hash"
|
"hash"
|
||||||
"hash/fnv"
|
"hash/fnv"
|
||||||
"sort"
|
"sort"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
@ -165,6 +166,11 @@ func (r *Registry) GetCounter(metricName string, labels prometheus.Labels, help
|
||||||
return nil, fmt.Errorf("metric with name %s is already registered", metricName)
|
return nil, fmt.Errorf("metric with name %s is already registered", metricName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err := r.checkHistogramNameCollision(metricName)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
var counterVec *prometheus.CounterVec
|
var counterVec *prometheus.CounterVec
|
||||||
if vh == nil {
|
if vh == nil {
|
||||||
metricsCount.WithLabelValues("counter").Inc()
|
metricsCount.WithLabelValues("counter").Inc()
|
||||||
|
@ -181,7 +187,6 @@ func (r *Registry) GetCounter(metricName string, labels prometheus.Labels, help
|
||||||
}
|
}
|
||||||
|
|
||||||
var counter prometheus.Counter
|
var counter prometheus.Counter
|
||||||
var err error
|
|
||||||
if counter, err = counterVec.GetMetricWith(labels); err != nil {
|
if counter, err = counterVec.GetMetricWith(labels); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -190,6 +195,18 @@ func (r *Registry) GetCounter(metricName string, labels prometheus.Labels, help
|
||||||
return counter, nil
|
return counter, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *Registry) checkHistogramNameCollision(metricName string) error {
|
||||||
|
histogramSuffixes := []string{"_bucket", "_count", "_sum"}
|
||||||
|
for _, suffix := range histogramSuffixes {
|
||||||
|
if strings.HasSuffix(metricName, suffix) {
|
||||||
|
if r.MetricConflicts(strings.TrimSuffix(metricName, suffix), metrics.CounterMetricType) {
|
||||||
|
return fmt.Errorf("metric with name %s is already registered", metricName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (r *Registry) GetGauge(metricName string, labels prometheus.Labels, help string, mapping *mapper.MetricMapping, metricsCount *prometheus.GaugeVec) (prometheus.Gauge, error) {
|
func (r *Registry) GetGauge(metricName string, labels prometheus.Labels, help string, mapping *mapper.MetricMapping, metricsCount *prometheus.GaugeVec) (prometheus.Gauge, error) {
|
||||||
hash, labelNames := r.HashLabels(labels)
|
hash, labelNames := r.HashLabels(labels)
|
||||||
vh, mh := r.Get(metricName, hash, metrics.GaugeMetricType)
|
vh, mh := r.Get(metricName, hash, metrics.GaugeMetricType)
|
||||||
|
@ -201,6 +218,11 @@ func (r *Registry) GetGauge(metricName string, labels prometheus.Labels, help st
|
||||||
return nil, fmt.Errorf("metrics.Metric with name %s is already registered", metricName)
|
return nil, fmt.Errorf("metrics.Metric with name %s is already registered", metricName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err := r.checkHistogramNameCollision(metricName)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("metrics.Metric with name %s is already registered", metricName)
|
||||||
|
}
|
||||||
|
|
||||||
var gaugeVec *prometheus.GaugeVec
|
var gaugeVec *prometheus.GaugeVec
|
||||||
if vh == nil {
|
if vh == nil {
|
||||||
metricsCount.WithLabelValues("gauge").Inc()
|
metricsCount.WithLabelValues("gauge").Inc()
|
||||||
|
@ -217,7 +239,6 @@ func (r *Registry) GetGauge(metricName string, labels prometheus.Labels, help st
|
||||||
}
|
}
|
||||||
|
|
||||||
var gauge prometheus.Gauge
|
var gauge prometheus.Gauge
|
||||||
var err error
|
|
||||||
if gauge, err = gaugeVec.GetMetricWith(labels); err != nil {
|
if gauge, err = gaugeVec.GetMetricWith(labels); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -253,10 +274,22 @@ func (r *Registry) GetHistogram(metricName string, labels prometheus.Labels, hel
|
||||||
if mapping.HistogramOptions != nil && len(mapping.HistogramOptions.Buckets) > 0 {
|
if mapping.HistogramOptions != nil && len(mapping.HistogramOptions.Buckets) > 0 {
|
||||||
buckets = mapping.HistogramOptions.Buckets
|
buckets = mapping.HistogramOptions.Buckets
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bucketFactor := r.Mapper.Defaults.HistogramOptions.NativeHistogramBucketFactor
|
||||||
|
if mapping.HistogramOptions != nil && mapping.HistogramOptions.NativeHistogramBucketFactor > 0 {
|
||||||
|
bucketFactor = mapping.HistogramOptions.NativeHistogramBucketFactor
|
||||||
|
}
|
||||||
|
|
||||||
|
maxBuckets := r.Mapper.Defaults.HistogramOptions.NativeHistogramMaxBuckets
|
||||||
|
if mapping.HistogramOptions != nil && mapping.HistogramOptions.NativeHistogramMaxBuckets > 0 {
|
||||||
|
maxBuckets = mapping.HistogramOptions.NativeHistogramMaxBuckets
|
||||||
|
}
|
||||||
histogramVec = prometheus.NewHistogramVec(prometheus.HistogramOpts{
|
histogramVec = prometheus.NewHistogramVec(prometheus.HistogramOpts{
|
||||||
Name: metricName,
|
Name: metricName,
|
||||||
Help: help,
|
Help: help,
|
||||||
Buckets: buckets,
|
Buckets: buckets,
|
||||||
|
NativeHistogramBucketFactor: bucketFactor,
|
||||||
|
NativeHistogramMaxBucketNumber: maxBuckets,
|
||||||
}, labelNames)
|
}, labelNames)
|
||||||
|
|
||||||
if err := r.Registerer.Register(uncheckedCollector{histogramVec}); err != nil {
|
if err := r.Registerer.Register(uncheckedCollector{histogramVec}); err != nil {
|
||||||
|
|
|
@ -127,7 +127,7 @@ func (r *Relay) relayOutput() {
|
||||||
buffer.Reset()
|
buffer.Reset()
|
||||||
buffer.Write(b)
|
buffer.Write(b)
|
||||||
} else {
|
} else {
|
||||||
level.Debug(r.logger).Log("msg", "Adding line to buffer", "line", b)
|
level.Debug(r.logger).Log("msg", "Adding line to buffer", "line", string(b))
|
||||||
buffer.Write(b)
|
buffer.Write(b)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -140,7 +140,7 @@ func (r *Relay) sendPacket(buf []byte) error {
|
||||||
level.Debug(r.logger).Log("msg", "Empty buffer, nothing to send")
|
level.Debug(r.logger).Log("msg", "Empty buffer, nothing to send")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
level.Debug(r.logger).Log("msg", "Sending packet", "length", len(buf), "data", buf)
|
level.Debug(r.logger).Log("msg", "Sending packet", "length", len(buf), "data", string(buf))
|
||||||
_, err := r.conn.WriteToUDP(buf, r.addr)
|
_, err := r.conn.WriteToUDP(buf, r.addr)
|
||||||
r.packetsTotal.Inc()
|
r.packetsTotal.Inc()
|
||||||
return err
|
return err
|
||||||
|
@ -158,7 +158,7 @@ func (r *Relay) RelayLine(l string) {
|
||||||
r.longLinesTotal.Inc()
|
r.longLinesTotal.Inc()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
level.Debug(r.logger).Log("msg", "Relaying line", "line", l)
|
level.Debug(r.logger).Log("msg", "Relaying line", "line", string(l))
|
||||||
if !strings.HasSuffix(l, "\n") {
|
if !strings.HasSuffix(l, "\n") {
|
||||||
l = l + "\n"
|
l = l + "\n"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue