From 82659ab5b6bc4adea94ab5bf89517c33a9a085d6 Mon Sep 17 00:00:00 2001 From: hagen1778 Date: Fri, 18 Mar 2022 19:07:51 +0000 Subject: [PATCH 01/16] docs: add update note to v1.75.0 release note Signed-off-by: hagen1778 --- docs/CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 83abc12a8..125c85613 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -19,6 +19,11 @@ The following tip changes can be tested by building VictoriaMetrics components f Released at 18-03-2022 +**Update notes:** release contains breaking change to vmalert's API introduced in [ee396b5](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/2320/commits/ee396b5750d0bcb98233d624f88fa6cf92a8253b). +It replaces the `api/v1/groups` API handler with `api/v1/rules` handler in order to become compatible +with [alerts generator specification](https://github.com/prometheus/compliance/blob/main/alert_generator/specification.md). +See other changes introduced to vmalert [here](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/2320). + * FEATURE: [VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html): add support for mTLS communications between cluster components. See [these docs](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection) and [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/550). * FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): add ability to use OAuth2 for `-datasource.url`, `-notifier.url` and `-remoteRead.url`. See the corresponding command-line flags containing `oauth2` in their names [here](https://docs.victoriametrics.com/vmalert.html#flags). * FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): add ability to use Bearer Token for `-notifier.url` via `-notifier.bearerToken` and `-notifier.bearerTokenFile` command-line flags. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1824). From a1e17e91f867da133900859b14a924211d9dd223 Mon Sep 17 00:00:00 2001 From: Dmytro Kozlov Date: Mon, 21 Mar 2022 10:13:28 +0200 Subject: [PATCH 02/16] issue-2323: Fixed Incorrect Content-Type header 'text/plain' for root path (#2343) https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2323 --- app/victoria-metrics/main.go | 1 + 1 file changed, 1 insertion(+) diff --git a/app/victoria-metrics/main.go b/app/victoria-metrics/main.go index 8511f1f5d..6cdd4d957 100644 --- a/app/victoria-metrics/main.go +++ b/app/victoria-metrics/main.go @@ -86,6 +86,7 @@ func requestHandler(w http.ResponseWriter, r *http.Request) bool { if r.Method != "GET" { return false } + w.Header().Add("Content-Type", "text/html; charset=utf-8") fmt.Fprintf(w, "

Single-node VictoriaMetrics


") fmt.Fprintf(w, "See docs at https://docs.victoriametrics.com/
") fmt.Fprintf(w, "Useful endpoints:
") From 5ab6c350ecd5be792b9d03a1338544b94ddffcc9 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Mon, 21 Mar 2022 15:34:49 +0200 Subject: [PATCH 03/16] docs/CHANGELOG.md: document a1e17e91f867da133900859b14a924211d9dd223 --- app/vmagent/main.go | 1 + docs/CHANGELOG.md | 1 + 2 files changed, 2 insertions(+) diff --git a/app/vmagent/main.go b/app/vmagent/main.go index 6190d9ed9..384de4c11 100644 --- a/app/vmagent/main.go +++ b/app/vmagent/main.go @@ -154,6 +154,7 @@ func requestHandler(w http.ResponseWriter, r *http.Request) bool { if r.Method != "GET" { return false } + w.Header().Add("Content-Type", "text/html; charset=utf-8") fmt.Fprintf(w, "

vmagent

") fmt.Fprintf(w, "See docs at https://docs.victoriametrics.com/vmagent.html
") fmt.Fprintf(w, "Useful endpoints:
") diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 125c85613..3499d2b3e 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -14,6 +14,7 @@ The following tip changes can be tested by building VictoriaMetrics components f ## tip +* BUGFIX: return `Content-Type: text/html` response header when requesting `/` HTTP path at VictoriaMetrics components. Previously `text/plain` response header was returned, which could lead to broken page formatting. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2323). ## [v1.75.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.75.0) From f367ff086c337d81ca047056bd0df82b8fe022d3 Mon Sep 17 00:00:00 2001 From: Roman Khavronenko Date: Mon, 21 Mar 2022 13:40:50 +0000 Subject: [PATCH 04/16] docs: update release notes (#2349) Warn about memory issue introduced in releases 1.73 - 1.74 --- docs/CHANGELOG.md | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 3499d2b3e..e40a4bf9e 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -45,6 +45,8 @@ See other changes introduced to vmalert [here](https://github.com/VictoriaMetric Released at 03-03-2022 +**Update notes:** In this release VictoriaMetrics may use some extra memory due to issues [#2242](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2242) and [#2007](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2007). These issues were addressed in [v1.75.0](#v1750), so we recommend updating straight to it. + * FEATURE: add support for conditional relabeling via `if` filter. The `if` filter can contain arbitrary [series selector](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors). For example, the following rule drops targets matching `foo{bar="baz"}` series selector: ```yml @@ -75,6 +77,8 @@ This rule is equivalent to less clear traditional one: Released at 22-02-2022 +**Update notes:** In this release VictoriaMetrics may use some extra memory due to issues [#2242](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2242) and [#2007](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2007). These issues were addressed in [v1.75.0](#v1750), so we recommend updating straight to it. + * FEATURE: allow overriding default limits for the following in-memory caches, which usually occupy the most memory: * `storage/tsid` - the cache speeds up lookups of internal metric ids by `metric_name{labels...}` during data ingestion. The size for this cache can be tuned with `-storage.cacheSizeStorageTSID` command-line flag. * `indexdb/dataBlocks` - the cache speeds up data lookups in `<-storageDataPath>/indexdb` files. The size for this cache can be tuned with `-storage.cacheSizeIndexDBDataBlocks` command-line flag. @@ -95,16 +99,7 @@ Released at 22-02-2022 Released at 14-02-2022 -**Update notes:** changes introduced in [#1401](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1401) -are heavily related to the TSID cache, which is mostly utilized during the ingestion. The fix implies the cache -internal structure change which would cause the cache reset on startup. After the update, users need to expect higher -CPU and memory usage during the ingestion while the cache is being populated. Normally, we expect this process to take -less than hour. - -We recommend updating in "off-peak" time when load on the VictoriaMetrics is on its minimum. We also recommend -skipping [v1.73.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.73.0) in favour of -[v1.73.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.73.1) which contains the fix for reducing -the memory usage after the update. +**Update notes:** In this release VictoriaMetrics may use some extra memory described in issues [#2242](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2242) and [#2007](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2007). These issues were addressed in [v1.75.0](#v1750), so we recommend updating straight to it. * FEATURE: publish VictoriaMetrics binaries for MacOS amd64 and MacOS arm64 (aka MacBook M1) at [releases page](https://github.com/VictoriaMetrics/VictoriaMetrics/releases). See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1896) and [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1851). * FEATURE: reduce CPU and disk IO usage during `indexdb` rotation once per `-retentionPeriod`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1401). @@ -190,7 +185,7 @@ Released at 20-12-2021 **Update notes:** deduplication logic was slightly changed on the release, which may cause extra [background merges](https://medium.com/@valyala/how-victoriametrics-makes-instant-snapshots-for-multi-terabyte-time-series-data-e1f3fb0e0282) -for already existing data parts. This process is intentionally limited by one CPU core, but still can result +for already existing data parts for installations with `-dedup.minScrapeInterval` flag value greater than 0. This process is intentionally limited by one CPU core, but still can result into increase of CPU usage until merges are finished. We recommend updating in "off-peak" time when load on the VictoriaMetrics is on its minimum. From c8c6f5b15e616833fe0386f00ea7bd5c5e16ad5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Mar 2022 15:42:14 +0200 Subject: [PATCH 05/16] build(deps): bump @types/react-dom in /app/vmui/packages/vmui (#2347) Bumps [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom) from 17.0.13 to 17.0.14. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom) --- updated-dependencies: - dependency-name: "@types/react-dom" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- app/vmui/packages/vmui/package-lock.json | 14 +++++++------- app/vmui/packages/vmui/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/vmui/packages/vmui/package-lock.json b/app/vmui/packages/vmui/package-lock.json index 7a431a033..6de787038 100644 --- a/app/vmui/packages/vmui/package-lock.json +++ b/app/vmui/packages/vmui/package-lock.json @@ -24,7 +24,7 @@ "@types/node": "^17.0.21", "@types/qs": "^6.9.7", "@types/react": "^17.0.40", - "@types/react-dom": "^17.0.11", + "@types/react-dom": "^17.0.14", "@types/react-measure": "^2.0.8", "dayjs": "^1.11.0", "lodash.debounce": "^4.0.8", @@ -4606,9 +4606,9 @@ } }, "node_modules/@types/react-dom": { - "version": "17.0.13", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.13.tgz", - "integrity": "sha512-wEP+B8hzvy6ORDv1QBhcQia4j6ea4SFIBttHYpXKPFZRviBvknq0FRh3VrIxeXUmsPkwuXVZrVGG7KUVONmXCQ==", + "version": "17.0.14", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.14.tgz", + "integrity": "sha512-H03xwEP1oXmSfl3iobtmQ/2dHF5aBHr8aUMwyGZya6OW45G+xtdzmq6HkncefiBt5JU8DVyaWl/nWZbjZCnzAQ==", "dependencies": { "@types/react": "*" } @@ -22944,9 +22944,9 @@ } }, "@types/react-dom": { - "version": "17.0.13", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.13.tgz", - "integrity": "sha512-wEP+B8hzvy6ORDv1QBhcQia4j6ea4SFIBttHYpXKPFZRviBvknq0FRh3VrIxeXUmsPkwuXVZrVGG7KUVONmXCQ==", + "version": "17.0.14", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.14.tgz", + "integrity": "sha512-H03xwEP1oXmSfl3iobtmQ/2dHF5aBHr8aUMwyGZya6OW45G+xtdzmq6HkncefiBt5JU8DVyaWl/nWZbjZCnzAQ==", "requires": { "@types/react": "*" } diff --git a/app/vmui/packages/vmui/package.json b/app/vmui/packages/vmui/package.json index af4234b27..0bc28264d 100644 --- a/app/vmui/packages/vmui/package.json +++ b/app/vmui/packages/vmui/package.json @@ -20,7 +20,7 @@ "@types/node": "^17.0.21", "@types/qs": "^6.9.7", "@types/react": "^17.0.40", - "@types/react-dom": "^17.0.11", + "@types/react-dom": "^17.0.14", "@types/react-measure": "^2.0.8", "dayjs": "^1.11.0", "lodash.debounce": "^4.0.8", From f36e8debc73d06d9f94f796a781807b896919a74 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Mar 2022 15:44:54 +0200 Subject: [PATCH 06/16] build(deps): bump @types/react in /app/vmui/packages/vmui (#2346) Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 17.0.40 to 17.0.41. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react) --- updated-dependencies: - dependency-name: "@types/react" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- app/vmui/packages/vmui/package-lock.json | 14 +++++++------- app/vmui/packages/vmui/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/vmui/packages/vmui/package-lock.json b/app/vmui/packages/vmui/package-lock.json index 6de787038..a2664808b 100644 --- a/app/vmui/packages/vmui/package-lock.json +++ b/app/vmui/packages/vmui/package-lock.json @@ -23,7 +23,7 @@ "@types/lodash.throttle": "^4.1.6", "@types/node": "^17.0.21", "@types/qs": "^6.9.7", - "@types/react": "^17.0.40", + "@types/react": "^17.0.41", "@types/react-dom": "^17.0.14", "@types/react-measure": "^2.0.8", "dayjs": "^1.11.0", @@ -4596,9 +4596,9 @@ "peer": true }, "node_modules/@types/react": { - "version": "17.0.40", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.40.tgz", - "integrity": "sha512-UrXhD/JyLH+W70nNSufXqMZNuUD2cXHu6UjCllC6pmOQgBX4SGXOH8fjRka0O0Ee0HrFxapDD8Bwn81Kmiz6jQ==", + "version": "17.0.41", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.41.tgz", + "integrity": "sha512-chYZ9ogWUodyC7VUTRBfblysKLjnohhFY9bGLwvnUFFy48+vB9DikmB3lW0qTFmBcKSzmdglcvkHK71IioOlDA==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -22934,9 +22934,9 @@ "peer": true }, "@types/react": { - "version": "17.0.40", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.40.tgz", - "integrity": "sha512-UrXhD/JyLH+W70nNSufXqMZNuUD2cXHu6UjCllC6pmOQgBX4SGXOH8fjRka0O0Ee0HrFxapDD8Bwn81Kmiz6jQ==", + "version": "17.0.41", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.41.tgz", + "integrity": "sha512-chYZ9ogWUodyC7VUTRBfblysKLjnohhFY9bGLwvnUFFy48+vB9DikmB3lW0qTFmBcKSzmdglcvkHK71IioOlDA==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", diff --git a/app/vmui/packages/vmui/package.json b/app/vmui/packages/vmui/package.json index 0bc28264d..d2ddb69ac 100644 --- a/app/vmui/packages/vmui/package.json +++ b/app/vmui/packages/vmui/package.json @@ -19,7 +19,7 @@ "@types/lodash.throttle": "^4.1.6", "@types/node": "^17.0.21", "@types/qs": "^6.9.7", - "@types/react": "^17.0.40", + "@types/react": "^17.0.41", "@types/react-dom": "^17.0.14", "@types/react-measure": "^2.0.8", "dayjs": "^1.11.0", From e1311409db589089b6a2bbeeee4736ea4b60d256 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Mon, 21 Mar 2022 17:02:12 +0200 Subject: [PATCH 07/16] vendor: `make vendor-update` --- go.mod | 8 +- go.sum | 19 ++- .../aws/aws-sdk-go/aws/endpoints/defaults.go | 17 +++ .../github.com/aws/aws-sdk-go/aws/version.go | 2 +- .../eventstream/eventstreamapi/transport.go | 2 +- .../aws-sdk-go/private/protocol/rest/build.go | 19 +++ .../aws/aws-sdk-go/service/s3/api.go | 20 +-- .../googleapis/gax-go/v2/apierror/apierror.go | 2 +- vendor/github.com/googleapis/gax-go/v2/gax.go | 2 +- .../googleapis/gax-go/v2/proto_json_stream.go | 126 ++++++++++++++++++ vendor/golang.org/x/sys/unix/syscall_aix.go | 12 +- vendor/golang.org/x/sys/unix/syscall_bsd.go | 24 +--- vendor/golang.org/x/sys/unix/syscall_linux.go | 26 +--- .../golang.org/x/sys/unix/syscall_solaris.go | 24 +--- vendor/golang.org/x/sys/unix/syscall_unix.go | 27 ++++ .../golang.org/x/sys/unix/zsyscall_linux.go | 10 ++ .../golang.org/x/sys/unix/ztypes_linux_386.go | 7 + .../x/sys/unix/ztypes_linux_amd64.go | 8 ++ .../golang.org/x/sys/unix/ztypes_linux_arm.go | 7 + .../x/sys/unix/ztypes_linux_arm64.go | 8 ++ .../x/sys/unix/ztypes_linux_mips.go | 7 + .../x/sys/unix/ztypes_linux_mips64.go | 8 ++ .../x/sys/unix/ztypes_linux_mips64le.go | 8 ++ .../x/sys/unix/ztypes_linux_mipsle.go | 7 + .../golang.org/x/sys/unix/ztypes_linux_ppc.go | 7 + .../x/sys/unix/ztypes_linux_ppc64.go | 8 ++ .../x/sys/unix/ztypes_linux_ppc64le.go | 8 ++ .../x/sys/unix/ztypes_linux_riscv64.go | 8 ++ .../x/sys/unix/ztypes_linux_s390x.go | 8 ++ .../x/sys/unix/ztypes_linux_sparc64.go | 8 ++ .../x/sys/windows/syscall_windows.go | 7 +- vendor/modules.txt | 10 +- 32 files changed, 357 insertions(+), 107 deletions(-) create mode 100644 vendor/github.com/googleapis/gax-go/v2/proto_json_stream.go diff --git a/go.mod b/go.mod index 96a3e99b6..aede7c2eb 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/VictoriaMetrics/fasthttp v1.1.0 github.com/VictoriaMetrics/metrics v1.18.1 github.com/VictoriaMetrics/metricsql v0.40.0 - github.com/aws/aws-sdk-go v1.43.19 + github.com/aws/aws-sdk-go v1.43.21 github.com/cespare/xxhash/v2 v2.1.2 github.com/cheggaaa/pb/v3 v3.0.8 github.com/golang/snappy v0.0.4 @@ -26,7 +26,7 @@ require ( github.com/valyala/quicktemplate v1.7.0 golang.org/x/net v0.0.0-20220225172249-27dd8689420f golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a - golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86 + golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8 google.golang.org/api v0.73.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -45,7 +45,7 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/google/go-cmp v0.5.7 // indirect - github.com/googleapis/gax-go/v2 v2.1.1 // indirect + github.com/googleapis/gax-go/v2 v2.2.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/mattn/go-colorable v0.1.12 // indirect github.com/mattn/go-isatty v0.0.14 // indirect @@ -68,7 +68,7 @@ require ( golang.org/x/text v0.3.7 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106 // indirect + google.golang.org/genproto v0.0.0-20220317150908-0efb43f6373e // indirect google.golang.org/grpc v1.45.0 // indirect google.golang.org/protobuf v1.27.1 // indirect gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect diff --git a/go.sum b/go.sum index 8a7dae71b..4a2dd68b3 100644 --- a/go.sum +++ b/go.sum @@ -165,8 +165,8 @@ github.com/aws/aws-sdk-go v1.30.12/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZve github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= github.com/aws/aws-sdk-go v1.35.31/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= -github.com/aws/aws-sdk-go v1.43.19 h1:n7YAreaCpcstusW7F0+XiocZxh7rwmcAPO4HTEPJ6mE= -github.com/aws/aws-sdk-go v1.43.19/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go v1.43.21 h1:E4S2eX3d2gKJyI/ISrcIrSwXwqjIvCK85gtBMt4sAPE= +github.com/aws/aws-sdk-go v1.43.21/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= @@ -525,8 +525,9 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ 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/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1 h1:dp3bWCh+PPO1zjRRiCSczJav13sBvG4UhNyVTa1KqdU= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0 h1:s7jOdKSaksJVOxE0Y/S32otcfiP+UQ0cL8/GTKaONwE= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.4.0/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= @@ -1196,6 +1197,7 @@ golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a h1:qfl7ob3DIEs3Ml9oLuPwY2N04gymzAW04WsUQHIClgM= golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1312,9 +1314,10 @@ golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86 h1:A9i04dxx7Cribqbs8jf3FQLogkL/CV2YN7hj9KWJCkc= -golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8 h1:OH54vjqzRWmbJ62fjuhxy7AxFFgoHN0/DPc/UrL8cAs= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1469,6 +1472,7 @@ google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oY google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= google.golang.org/api v0.73.0 h1:O9bThUh35K1rvUrQwTUQ1eqLC/IYyzUpWavYIO2EXvo= google.golang.org/api v0.73.0/go.mod h1:lbd/q6BRFJbdpV6OUCXstVeiI5mL/d3/WifG7iNKnjI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= @@ -1560,9 +1564,10 @@ google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2 google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106 h1:ErU+UA6wxadoU8nWrsy5MZUVBs75K17zUCsUCIfrXCE= -google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220317150908-0efb43f6373e h1:fNKDNuUyC4WH+inqDMpfXDdfvwfYILbsX+oskGZ8hxg= +google.golang.org/genproto v0.0.0-20220317150908-0efb43f6373e/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go index 9cc03dbf9..f70c832b1 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go @@ -3052,6 +3052,20 @@ var awsPartition = partition{ }, }, }, + "billingconductor": service{ + PartitionEndpoint: "aws-global", + IsRegionalized: boxedFalse, + Endpoints: serviceEndpoints{ + endpointKey{ + Region: "aws-global", + }: endpoint{ + Hostname: "billingconductor.us-east-1.amazonaws.com", + CredentialScope: credentialScope{ + Region: "us-east-1", + }, + }, + }, + }, "braket": service{ Endpoints: serviceEndpoints{ endpointKey{ @@ -22008,6 +22022,9 @@ var awsPartition = partition{ endpointKey{ Region: "ap-southeast-2", }: endpoint{}, + endpointKey{ + Region: "ap-southeast-3", + }: endpoint{}, endpointKey{ Region: "ca-central-1", }: endpoint{}, diff --git a/vendor/github.com/aws/aws-sdk-go/aws/version.go b/vendor/github.com/aws/aws-sdk-go/aws/version.go index 140a282eb..94781da77 100644 --- a/vendor/github.com/aws/aws-sdk-go/aws/version.go +++ b/vendor/github.com/aws/aws-sdk-go/aws/version.go @@ -5,4 +5,4 @@ package aws const SDKName = "aws-sdk-go" // SDKVersion is the version of this SDK -const SDKVersion = "1.43.19" +const SDKVersion = "1.43.21" diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/eventstream/eventstreamapi/transport.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/eventstream/eventstreamapi/transport.go index e3f7d22bd..4bf2b27b2 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/eventstream/eventstreamapi/transport.go +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/eventstream/eventstreamapi/transport.go @@ -5,6 +5,6 @@ package eventstreamapi import "github.com/aws/aws-sdk-go/aws/request" -// This is a no-op for Go 1.18 and above. +// ApplyHTTPTransportFixes is a no-op for Go 1.18 and above. func ApplyHTTPTransportFixes(r *request.Request) { } diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/build.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/build.go index 5f13d4acb..63f66af2c 100644 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/build.go +++ b/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/build.go @@ -276,6 +276,25 @@ func convertType(v reflect.Value, tag reflect.StructTag) (str string, err error) value = base64.StdEncoding.EncodeToString([]byte(value)) } str = value + case []*string: + if tag.Get("location") != "header" || tag.Get("enum") == "" { + return "", fmt.Errorf("%T is only supported with location header and enum shapes", value) + } + buff := &bytes.Buffer{} + for i, sv := range value { + if sv == nil || len(*sv) == 0 { + continue + } + if i != 0 { + buff.WriteRune(',') + } + item := *sv + if strings.Index(item, `,`) != -1 || strings.Index(item, `"`) != -1 { + item = strconv.Quote(item) + } + buff.WriteString(item) + } + str = string(buff.Bytes()) case []byte: str = base64.StdEncoding.EncodeToString(value) case bool: diff --git a/vendor/github.com/aws/aws-sdk-go/service/s3/api.go b/vendor/github.com/aws/aws-sdk-go/service/s3/api.go index 49fc95456..2ecfb9416 100644 --- a/vendor/github.com/aws/aws-sdk-go/service/s3/api.go +++ b/vendor/github.com/aws/aws-sdk-go/service/s3/api.go @@ -12633,7 +12633,7 @@ type CloudFunctionConfiguration struct { Event *string `deprecated:"true" type:"string" enum:"Event"` // Bucket events for which to send notifications. - Events []*string `locationName:"Event" type:"list" flattened:"true"` + Events []*string `locationName:"Event" type:"list" flattened:"true" enum:"Event"` // An optional unique identifier for configurations in a notification configuration. // If you don't provide one, Amazon S3 will assign an ID. @@ -21627,7 +21627,7 @@ type GetObjectAttributesInput struct { // in the response. Fields that you do not specify are not returned. // // ObjectAttributes is a required field - ObjectAttributes []*string `location:"header" locationName:"x-amz-object-attributes" type:"list" required:"true"` + ObjectAttributes []*string `location:"header" locationName:"x-amz-object-attributes" type:"list" required:"true" enum:"ObjectAttributes"` // Specifies the part after which listing should begin. Only parts with higher // part numbers will be listed. @@ -25167,7 +25167,7 @@ type InventoryConfiguration struct { IsEnabled *bool `type:"boolean" required:"true"` // Contains the optional fields that are included in the inventory results. - OptionalFields []*string `locationNameList:"Field" type:"list"` + OptionalFields []*string `locationNameList:"Field" type:"list" enum:"InventoryOptionalField"` // Specifies the schedule for generating inventory results. // @@ -25694,7 +25694,7 @@ type LambdaFunctionConfiguration struct { // in the Amazon S3 User Guide. // // Events is a required field - Events []*string `locationName:"Event" type:"list" flattened:"true" required:"true"` + Events []*string `locationName:"Event" type:"list" flattened:"true" required:"true" enum:"Event"` // Specifies object key name filtering rules. For information about key name // filtering, see Configuring Event Notifications (https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html) @@ -29643,7 +29643,7 @@ type Object struct { _ struct{} `type:"structure"` // The algorithm that was used to create a checksum of the object. - ChecksumAlgorithm []*string `type:"list" flattened:"true"` + ChecksumAlgorithm []*string `type:"list" flattened:"true" enum:"ChecksumAlgorithm"` // The entity tag is a hash of the object. The ETag reflects changes only to // the contents of an object, not its metadata. The ETag may or may not be an @@ -30060,7 +30060,7 @@ type ObjectVersion struct { _ struct{} `type:"structure"` // The algorithm that was used to create a checksum of the object. - ChecksumAlgorithm []*string `type:"list" flattened:"true"` + ChecksumAlgorithm []*string `type:"list" flattened:"true" enum:"ChecksumAlgorithm"` // The entity tag is an MD5 hash of that version of the object. ETag *string `type:"string"` @@ -36025,7 +36025,7 @@ type QueueConfiguration struct { // A collection of bucket events for which to send notifications // // Events is a required field - Events []*string `locationName:"Event" type:"list" flattened:"true" required:"true"` + Events []*string `locationName:"Event" type:"list" flattened:"true" required:"true" enum:"Event"` // Specifies object key name filtering rules. For information about key name // filtering, see Configuring Event Notifications (https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html) @@ -36114,7 +36114,7 @@ type QueueConfigurationDeprecated struct { Event *string `deprecated:"true" type:"string" enum:"Event"` // A collection of bucket events for which to send notifications. - Events []*string `locationName:"Event" type:"list" flattened:"true"` + Events []*string `locationName:"Event" type:"list" flattened:"true" enum:"Event"` // An optional unique identifier for configurations in a notification configuration. // If you don't provide one, Amazon S3 will assign an ID. @@ -39062,7 +39062,7 @@ type TopicConfiguration struct { // in the Amazon S3 User Guide. // // Events is a required field - Events []*string `locationName:"Event" type:"list" flattened:"true" required:"true"` + Events []*string `locationName:"Event" type:"list" flattened:"true" required:"true" enum:"Event"` // Specifies object key name filtering rules. For information about key name // filtering, see Configuring Event Notifications (https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html) @@ -39152,7 +39152,7 @@ type TopicConfigurationDeprecated struct { Event *string `deprecated:"true" type:"string" enum:"Event"` // A collection of events related to objects - Events []*string `locationName:"Event" type:"list" flattened:"true"` + Events []*string `locationName:"Event" type:"list" flattened:"true" enum:"Event"` // An optional unique identifier for configurations in a notification configuration. // If you don't provide one, Amazon S3 will assign an ID. diff --git a/vendor/github.com/googleapis/gax-go/v2/apierror/apierror.go b/vendor/github.com/googleapis/gax-go/v2/apierror/apierror.go index 869379da9..e33316d88 100644 --- a/vendor/github.com/googleapis/gax-go/v2/apierror/apierror.go +++ b/vendor/github.com/googleapis/gax-go/v2/apierror/apierror.go @@ -28,7 +28,7 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Package apierror implements a wrapper error for parsing error details from -// API calls. Currently, only errors representing a gRPC status are supported. +// API calls. Both HTTP & gRPC status errors are supported. package apierror import ( diff --git a/vendor/github.com/googleapis/gax-go/v2/gax.go b/vendor/github.com/googleapis/gax-go/v2/gax.go index f634b4372..28ea5fe20 100644 --- a/vendor/github.com/googleapis/gax-go/v2/gax.go +++ b/vendor/github.com/googleapis/gax-go/v2/gax.go @@ -36,4 +36,4 @@ package gax // Version specifies the gax-go version being used. -const Version = "2.1.1" +const Version = "2.2.0" diff --git a/vendor/github.com/googleapis/gax-go/v2/proto_json_stream.go b/vendor/github.com/googleapis/gax-go/v2/proto_json_stream.go new file mode 100644 index 000000000..cc4486eb9 --- /dev/null +++ b/vendor/github.com/googleapis/gax-go/v2/proto_json_stream.go @@ -0,0 +1,126 @@ +// Copyright 2022, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package gax + +import ( + "encoding/json" + "errors" + "io" + + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/reflect/protoreflect" +) + +var ( + arrayOpen = json.Delim('[') + arrayClose = json.Delim(']') + errBadOpening = errors.New("unexpected opening token, expected '['") +) + +// ProtoJSONStream represents a wrapper for consuming a stream of protobuf +// messages encoded using protobuf-JSON format. More information on this format +// can be found at https://developers.google.com/protocol-buffers/docs/proto3#json. +// The stream must appear as a comma-delimited, JSON array of obbjects with +// opening and closing square braces. +// +// This is for internal use only. +type ProtoJSONStream struct { + first, closed bool + reader io.ReadCloser + stream *json.Decoder + typ protoreflect.MessageType +} + +// NewProtoJSONStreamReader accepts a stream of bytes via an io.ReadCloser that are +// protobuf-JSON encoded protobuf messages of the given type. The ProtoJSONStream +// must be closed when done. +// +// This is for internal use only. +func NewProtoJSONStreamReader(rc io.ReadCloser, typ protoreflect.MessageType) *ProtoJSONStream { + return &ProtoJSONStream{ + first: true, + reader: rc, + stream: json.NewDecoder(rc), + typ: typ, + } +} + +// Recv decodes the next protobuf message in the stream or returns io.EOF if +// the stream is done. It is not safe to call Recv on the same stream from +// different goroutines, just like it is not safe to do so with a single gRPC +// stream. Type-cast the protobuf message returned to the type provided at +// ProtoJSONStream creation. +// Calls to Recv after calling Close will produce io.EOF. +func (s *ProtoJSONStream) Recv() (proto.Message, error) { + if s.closed { + return nil, io.EOF + } + if s.first { + s.first = false + + // Consume the opening '[' so Decode gets one object at a time. + if t, err := s.stream.Token(); err != nil { + return nil, err + } else if t != arrayOpen { + return nil, errBadOpening + } + } + + // Capture the next block of data for the item (a JSON object) in the stream. + var raw json.RawMessage + if err := s.stream.Decode(&raw); err != nil { + e := err + // To avoid checking the first token of each stream, just attempt to + // Decode the next blob and if that fails, double check if it is just + // the closing token ']'. If it is the closing, return io.EOF. If it + // isn't, return the original error. + if t, _ := s.stream.Token(); t == arrayClose { + e = io.EOF + } + return nil, e + } + + // Initialize a new instance of the protobuf message to unmarshal the + // raw data into. + m := s.typ.New().Interface() + err := protojson.Unmarshal(raw, m) + + return m, err +} + +// Close closes the stream so that resources are cleaned up. +func (s *ProtoJSONStream) Close() error { + // Dereference the *json.Decoder so that the memory is gc'd. + s.stream = nil + s.closed = true + + return s.reader.Close() +} diff --git a/vendor/golang.org/x/sys/unix/syscall_aix.go b/vendor/golang.org/x/sys/unix/syscall_aix.go index f9a5863fd..f2a114fc2 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix.go @@ -215,18 +215,12 @@ func Accept(fd int) (nfd int, sa Sockaddr, err error) { return } -func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { +func recvmsgRaw(fd int, p, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { // Recvmsg not implemented on AIX - sa := new(SockaddrUnix) - return -1, -1, -1, sa, ENOSYS + return -1, -1, -1, ENOSYS } -func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { - _, err = SendmsgN(fd, p, oob, to, flags) - return -} - -func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { +func sendmsgN(fd int, p, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { // SendmsgN not implemented on AIX return -1, ENOSYS } diff --git a/vendor/golang.org/x/sys/unix/syscall_bsd.go b/vendor/golang.org/x/sys/unix/syscall_bsd.go index 0ce452326..a801b1b1b 100644 --- a/vendor/golang.org/x/sys/unix/syscall_bsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -325,10 +325,9 @@ func GetsockoptString(fd, level, opt int) (string, error) { //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) -func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { +func recvmsgRaw(fd int, p, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { var msg Msghdr - var rsa RawSockaddrAny - msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Name = (*byte)(unsafe.Pointer(rsa)) msg.Namelen = uint32(SizeofSockaddrAny) var iov Iovec if len(p) > 0 { @@ -352,29 +351,12 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from } oobn = int(msg.Controllen) recvflags = int(msg.Flags) - // source address is only specified if the socket is unconnected - if rsa.Addr.Family != AF_UNSPEC { - from, err = anyToSockaddr(fd, &rsa) - } return } //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) -func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { - _, err = SendmsgN(fd, p, oob, to, flags) - return -} - -func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { - var ptr unsafe.Pointer - var salen _Socklen - if to != nil { - ptr, salen, err = to.sockaddr() - if err != nil { - return 0, err - } - } +func sendmsgN(fd int, p, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { var msg Msghdr msg.Name = (*byte)(unsafe.Pointer(ptr)) msg.Namelen = uint32(salen) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index 5f28f8fde..2a6affedd 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -1497,10 +1497,9 @@ func KeyctlRestrictKeyring(ringid int, keyType string, restriction string) error //sys keyctlRestrictKeyringByType(cmd int, arg2 int, keyType string, restriction string) (err error) = SYS_KEYCTL //sys keyctlRestrictKeyring(cmd int, arg2 int) (err error) = SYS_KEYCTL -func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { +func recvmsgRaw(fd int, p, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { var msg Msghdr - var rsa RawSockaddrAny - msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Name = (*byte)(unsafe.Pointer(rsa)) msg.Namelen = uint32(SizeofSockaddrAny) var iov Iovec if len(p) > 0 { @@ -1531,28 +1530,10 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from } oobn = int(msg.Controllen) recvflags = int(msg.Flags) - // source address is only specified if the socket is unconnected - if rsa.Addr.Family != AF_UNSPEC { - from, err = anyToSockaddr(fd, &rsa) - } return } -func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { - _, err = SendmsgN(fd, p, oob, to, flags) - return -} - -func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { - var ptr unsafe.Pointer - var salen _Socklen - if to != nil { - var err error - ptr, salen, err = to.sockaddr() - if err != nil { - return 0, err - } - } +func sendmsgN(fd int, p, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { var msg Msghdr msg.Name = (*byte)(ptr) msg.Namelen = uint32(salen) @@ -2316,6 +2297,7 @@ type RemoteIovec struct { //sys PidfdOpen(pid int, flags int) (fd int, err error) = SYS_PIDFD_OPEN //sys PidfdGetfd(pidfd int, targetfd int, flags int) (fd int, err error) = SYS_PIDFD_GETFD +//sys PidfdSendSignal(pidfd int, sig Signal, info *Siginfo, flags int) (err error) = SYS_PIDFD_SEND_SIGNAL //sys shmat(id int, addr uintptr, flag int) (ret uintptr, err error) //sys shmctl(id int, cmd int, buf *SysvShmDesc) (result int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go index ee4a288a5..8c4e80060 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -451,10 +451,9 @@ func Accept(fd int) (nfd int, sa Sockaddr, err error) { //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_recvmsg -func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { +func recvmsgRaw(fd int, p, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { var msg Msghdr - var rsa RawSockaddrAny - msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Name = (*byte)(unsafe.Pointer(rsa)) msg.Namelen = uint32(SizeofSockaddrAny) var iov Iovec if len(p) > 0 { @@ -476,29 +475,12 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from return } oobn = int(msg.Accrightslen) - // source address is only specified if the socket is unconnected - if rsa.Addr.Family != AF_UNSPEC { - from, err = anyToSockaddr(fd, &rsa) - } - return -} - -func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { - _, err = SendmsgN(fd, p, oob, to, flags) return } //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_sendmsg -func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { - var ptr unsafe.Pointer - var salen _Socklen - if to != nil { - ptr, salen, err = to.sockaddr() - if err != nil { - return 0, err - } - } +func sendmsgN(fd int, p, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { var msg Msghdr msg.Name = (*byte)(unsafe.Pointer(ptr)) msg.Namelen = uint32(salen) diff --git a/vendor/golang.org/x/sys/unix/syscall_unix.go b/vendor/golang.org/x/sys/unix/syscall_unix.go index 9f130c920..70508afc1 100644 --- a/vendor/golang.org/x/sys/unix/syscall_unix.go +++ b/vendor/golang.org/x/sys/unix/syscall_unix.go @@ -337,6 +337,33 @@ func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) { return } +func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + var rsa RawSockaddrAny + n, oobn, recvflags, err = recvmsgRaw(fd, p, oob, flags, &rsa) + // source address is only specified if the socket is unconnected + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(fd, &rsa) + } + return +} + +func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { + _, err = SendmsgN(fd, p, oob, to, flags) + return +} + +func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { + var ptr unsafe.Pointer + var salen _Socklen + if to != nil { + ptr, salen, err = to.sockaddr() + if err != nil { + return 0, err + } + } + return sendmsgN(fd, p, oob, ptr, salen, flags) +} + func Send(s int, buf []byte, flags int) (err error) { return sendto(s, buf, flags, nil, 0) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux.go b/vendor/golang.org/x/sys/unix/zsyscall_linux.go index 30fa4055e..e5299395a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux.go @@ -1992,6 +1992,16 @@ func PidfdGetfd(pidfd int, targetfd int, flags int) (fd int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func PidfdSendSignal(pidfd int, sig Signal, info *Siginfo, flags int) (err error) { + _, _, e1 := Syscall6(SYS_PIDFD_SEND_SIGNAL, uintptr(pidfd), uintptr(sig), uintptr(unsafe.Pointer(info)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func shmat(id int, addr uintptr, flag int) (ret uintptr, err error) { r0, _, e1 := Syscall(SYS_SHMAT, uintptr(id), uintptr(addr), uintptr(flag)) ret = uintptr(r0) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index bea254945..531aefab7 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -250,6 +250,13 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ [116]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index b8c8f2894..727f664bb 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -265,6 +265,14 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index 4db443016..639141b1e 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -241,6 +241,13 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ [116]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index 3ebcad8a8..6cb03b1d9 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -244,6 +244,14 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index 3eb33e48a..4a1555455 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -246,6 +246,13 @@ type Sigset_t struct { const _C__NSIG = 0x80 +type Siginfo struct { + Signo int32 + Code int32 + Errno int32 + _ [116]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index 79a944672..e1084926f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -247,6 +247,14 @@ type Sigset_t struct { const _C__NSIG = 0x80 +type Siginfo struct { + Signo int32 + Code int32 + Errno int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index 8f4b107ca..8904ac84e 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -247,6 +247,14 @@ type Sigset_t struct { const _C__NSIG = 0x80 +type Siginfo struct { + Signo int32 + Code int32 + Errno int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index e4eb21798..a1a28cc7d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -246,6 +246,13 @@ type Sigset_t struct { const _C__NSIG = 0x80 +type Siginfo struct { + Signo int32 + Code int32 + Errno int32 + _ [116]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go index d5b21f0f7..abdc53452 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go @@ -253,6 +253,13 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ [116]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 5188d142b..f4afbbe00 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -254,6 +254,14 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index de4dd4c73..ea0b8406d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -254,6 +254,14 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index dccbf9b06..85d0a0d50 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -272,6 +272,14 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index c426c3576..81dd9c22c 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -267,6 +267,14 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index 765edc13f..6991b00b5 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -249,6 +249,14 @@ type Sigset_t struct { const _C__NSIG = 0x41 +type Siginfo struct { + Signo int32 + Errno int32 + Code int32 + _ int32 + _ [112]byte +} + type Termios struct { Iflag uint32 Oflag uint32 diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index 98b7e4b40..ce3075c45 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -10,6 +10,7 @@ import ( errorspkg "errors" "fmt" "runtime" + "strings" "sync" "syscall" "time" @@ -86,10 +87,8 @@ func StringToUTF16(s string) []uint16 { // s, with a terminating NUL added. If s contains a NUL byte at any // location, it returns (nil, syscall.EINVAL). func UTF16FromString(s string) ([]uint16, error) { - for i := 0; i < len(s); i++ { - if s[i] == 0 { - return nil, syscall.EINVAL - } + if strings.IndexByte(s, 0) != -1 { + return nil, syscall.EINVAL } return utf16.Encode([]rune(s + "\x00")), nil } diff --git a/vendor/modules.txt b/vendor/modules.txt index d9dc5ec82..b877f98ab 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -34,7 +34,7 @@ github.com/VictoriaMetrics/metricsql/binaryop # github.com/VividCortex/ewma v1.2.0 ## explicit; go 1.12 github.com/VividCortex/ewma -# github.com/aws/aws-sdk-go v1.43.19 +# github.com/aws/aws-sdk-go v1.43.21 ## explicit; go 1.11 github.com/aws/aws-sdk-go/aws github.com/aws/aws-sdk-go/aws/arn @@ -134,8 +134,8 @@ github.com/google/go-cmp/cmp/internal/diff github.com/google/go-cmp/cmp/internal/flags github.com/google/go-cmp/cmp/internal/function github.com/google/go-cmp/cmp/internal/value -# github.com/googleapis/gax-go/v2 v2.1.1 -## explicit; go 1.11 +# github.com/googleapis/gax-go/v2 v2.2.0 +## explicit; go 1.15 github.com/googleapis/gax-go/v2 github.com/googleapis/gax-go/v2/apierror github.com/googleapis/gax-go/v2/apierror/internal/proto @@ -290,7 +290,7 @@ golang.org/x/oauth2/jwt # golang.org/x/sync v0.0.0-20210220032951-036812b2e83c ## explicit golang.org/x/sync/errgroup -# golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86 +# golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8 ## explicit; go 1.17 golang.org/x/sys/internal/unsafeheader golang.org/x/sys/unix @@ -338,7 +338,7 @@ google.golang.org/appengine/internal/socket google.golang.org/appengine/internal/urlfetch google.golang.org/appengine/socket google.golang.org/appengine/urlfetch -# google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106 +# google.golang.org/genproto v0.0.0-20220317150908-0efb43f6373e ## explicit; go 1.15 google.golang.org/genproto/googleapis/api/annotations google.golang.org/genproto/googleapis/iam/v1 From a8de1ab00069bfbb69e67ec142a84c4fa541fbfd Mon Sep 17 00:00:00 2001 From: Arash Hatami Date: Tue, 22 Mar 2022 16:10:55 +0430 Subject: [PATCH 08/16] A good change for MD files (#2353) * Lint YAML * Remove extra comment * Fix command problem * Format MD files * Format & fix problem of MD files for docs * Another fix for MD files --- CODE_OF_CONDUCT.md | 4 +- CODE_OF_CONDUCT_RU.md | 12 +- README.md | 459 ++++++-------- deployment/docker/README.md | 7 +- deployment/docker/docker-compose.yml | 34 +- .../digitialocean/one-click-droplet/README.md | 9 +- docs/Articles.md | 4 - docs/BestPractices.md | 8 +- docs/CHANGELOG.md | 336 +++++----- docs/CaseStudies.md | 169 +++-- docs/Cluster-VictoriaMetrics.md | 582 +++++++++--------- docs/FAQ.md | 177 +++--- docs/MetricsQL.md | 87 ++- docs/PerTenantStatistic.md | 34 +- docs/Quick-Start.md | 1 + docs/README.md | 459 ++++++-------- docs/Release-Guide.md | 41 +- docs/Single-server-VictoriaMetrics.md | 459 ++++++-------- docs/url-examples.md | 60 +- docs/vmagent.md | 400 ++++++------ docs/vmalert.md | 390 ++++++------ docs/vmauth.md | 80 +-- docs/vmbackup.md | 128 ++-- docs/vmbackupmanager.md | 11 +- docs/vmctl.md | 180 +++--- docs/vmgateway.md | 39 +- docs/vmrestore.md | 100 ++- ports/OpenBSD/README.md | 6 +- snap/local/README.md | 19 +- 29 files changed, 2004 insertions(+), 2291 deletions(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 9ba36fcc0..33bd9f982 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -68,9 +68,9 @@ members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html +available at [homepage]: https://www.contributor-covenant.org For answers to common questions about this code of conduct, see -https://www.contributor-covenant.org/faq + diff --git a/CODE_OF_CONDUCT_RU.md b/CODE_OF_CONDUCT_RU.md index 26a5ecf4c..312f2011d 100644 --- a/CODE_OF_CONDUCT_RU.md +++ b/CODE_OF_CONDUCT_RU.md @@ -79,7 +79,7 @@ **Последствия**: Предупреждение о последствиях в случае продолжающегося неуместного поведения. На определенное время не допускается взаимодействие с людьми, вовлеченными в инцидент, -включая незапрошенное взаимодействие +включая незапрошенное взаимодействие с теми, кто обеспечивает соблюдение Кодекса. Это включает в себя избегание взаимодействия в публичных пространствах, а так же во внешних каналах, таких как социальные сети. Нарушение этих правил влечет за собой временный или вечный бан. @@ -89,10 +89,10 @@ **Общественное влияние**: Серьёзное нарушение стандартов сообщества, включая продолжительное неуместное поведение. -**Последствия**: Временный запрет (бан) на любое взаимодействие +**Последствия**: Временный запрет (бан) на любое взаимодействие или публичное общение с сообществом на определенный период времени. На этот период не допускается публичное или личное взаимодействие с людьми, -вовлеченными в инцидент, включая незапрошенное взаимодействие +вовлеченными в инцидент, включая незапрошенное взаимодействие с теми, кто обеспечивает соблюдение Кодекса. Нарушение этих правил влечет за собой вечный бан. @@ -108,7 +108,7 @@ Данный Кодекс Поведения основан на [Кодекс Поведения участника][homepage], версии 2.0, доступной по адресу -https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. +. Принципы Воздействия в Сообществе были вдохновлены [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity). @@ -116,5 +116,5 @@ enforcement ladder](https://github.com/mozilla/diversity). [homepage]: https://www.contributor-covenant.org Ответы на общие вопросы о данном кодексе поведения ищите на странице FAQ: -https://www.contributor-covenant.org/faq. Переводы доступны по адресу -https://www.contributor-covenant.org/translations. +. Переводы доступны по адресу +. diff --git a/README.md b/README.md index 6d950b239..136070a37 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,6 @@ Cluster version of VictoriaMetrics is available [here](https://docs.victoriametr [Contact us](mailto:info@victoriametrics.com) if you need enterprise support for VictoriaMetrics. See [features available in enterprise package](https://victoriametrics.com/products/enterprise/). Enterprise binaries can be downloaded and evaluated for free from [the releases page](https://github.com/VictoriaMetrics/VictoriaMetrics/releases). - ## Prominent features VictoriaMetrics has the following prominent features: @@ -61,7 +60,6 @@ VictoriaMetrics has the following prominent features: See also [various Articles about VictoriaMetrics](https://docs.victoriametrics.com/Articles.html). - ## Case studies and talks Case studies: @@ -92,7 +90,6 @@ Case studies: See also [articles and slides about VictoriaMetrics from our users](https://docs.victoriametrics.com/Articles.html#third-party-articles-and-slides-about-victoriametrics) - ## Operation ## How to start VictoriaMetrics @@ -112,7 +109,6 @@ VictoriaMetrics accepts [Prometheus querying API requests](#prometheus-querying- It is recommended setting up [monitoring](#monitoring) for VictoriaMetrics. - ### Environment variables Each flag value can be set via environment variables according to these rules: @@ -122,10 +118,8 @@ Each flag value can be set via environment variables according to these rules: * For repeating flags an alternative syntax can be used by joining the different values into one using `,` char as separator (for example `-storageNode -storageNode ` will translate to `storageNode=,`). * Environment var prefix can be set via `-envflag.prefix` flag. For instance, if `-envflag.prefix=VM_`, then env vars must be prepended with `VM_`. - ### Configuration with snap package - Snap package for VictoriaMetrics is available [here](https://snapcraft.io/victoriametrics). Command-line flags for Snap package can be set with following command: @@ -137,7 +131,6 @@ snap restart victoriametrics Do not change value for `-storageDataPath` flag, because snap package has limited access to host filesystem. - Changing scrape configuration is possible with text editor: ```text @@ -146,7 +139,6 @@ vi $SNAP_DATA/var/snap/victoriametrics/current/etc/victoriametrics-scrape-config After changes were made, trigger config re-read with the command `curl 127.0.0.1:8248/-/reload`. - ## Prometheus setup Add the following lines to Prometheus config file (it is usually located at `/etc/prometheus/prometheus.yml`) in order to send data to VictoriaMetrics: @@ -200,7 +192,6 @@ It is recommended upgrading Prometheus to [v2.12.0](https://github.com/prometheu Take a look also at [vmagent](https://docs.victoriametrics.com/vmagent.html) and [vmalert](https://docs.victoriametrics.com/vmalert.html), which can be used as faster and less resource-hungry alternative to Prometheus. - ## Grafana setup Create [Prometheus datasource](http://docs.grafana.org/features/datasources/prometheus/) in Grafana with the following url: @@ -213,7 +204,6 @@ Substitute `` with the hostname or IP address of VictoriaM Then build graphs and dashboards for the created datasource using [PromQL](https://prometheus.io/docs/prometheus/latest/querying/basics/) or [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html). - ## How to upgrade VictoriaMetrics It is safe upgrading VictoriaMetrics to new versions unless [release notes](https://github.com/VictoriaMetrics/VictoriaMetrics/releases) say otherwise. It is safe skipping multiple versions during the upgrade unless [release notes](https://github.com/VictoriaMetrics/VictoriaMetrics/releases) say otherwise. It is recommended performing regular upgrades to the latest version, since it may contain important bug fixes, performance optimizations or new features. @@ -228,7 +218,6 @@ The following steps must be performed during the upgrade / downgrade procedure: Prometheus doesn't drop data during VictoriaMetrics restart. See [this article](https://grafana.com/blog/2019/03/25/whats-new-in-prometheus-2.8-wal-based-remote-write/) for details. The same applies also to [vmagent](https://docs.victoriametrics.com/vmagent.html). - ## How to apply new config to VictoriaMetrics VictoriaMetrics is configured via command-line flags, so it must be restarted when new command-line flags should be applied: @@ -239,7 +228,6 @@ VictoriaMetrics is configured via command-line flags, so it must be restarted wh Prometheus doesn't drop data during VictoriaMetrics restart. See [this article](https://grafana.com/blog/2019/03/25/whats-new-in-prometheus-2.8-wal-based-remote-write/) for details. The same applies alos to [vmagent](https://docs.victoriametrics.com/vmagent.html). - ## How to scrape Prometheus exporters such as [node-exporter](https://github.com/prometheus/node_exporter) VictoriaMetrics can be used as drop-in replacement for Prometheus for scraping targets configured in `prometheus.yml` config file according to [the specification](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#configuration-file). Just set `-promscrape.config` command-line flag to the path to `prometheus.yml` config - and VictoriaMetrics should start scraping the configured targets. Currently the following [scrape_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config) types are supported: @@ -258,7 +246,6 @@ VictoriaMetrics can be used as drop-in replacement for Prometheus for scraping t * [digitalocean_sd_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#digitalocean_sd_config) * [http_sd_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#http_sd_config) - File a [feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues) if you need support for other `*_sd_config` types. The file pointed by `-promscrape.config` may contain `%{ENV_VAR}` placeholders, which are substituted by the corresponding `ENV_VAR` environment variable values. @@ -267,7 +254,6 @@ VictoriaMetrics also supports [importing data in Prometheus exposition format](# See also [vmagent](https://docs.victoriametrics.com/vmagent.html), which can be used as drop-in replacement for Prometheus. - ## How to send data from DataDog agent VictoriaMetrics accepts data from [DataDog agent](https://docs.datadoghq.com/agent/) or [DogStatsD]() via ["submit metrics" API](https://docs.datadoghq.com/api/latest/metrics/#submit-metrics) at `/datadog/api/v1/series` path. @@ -315,7 +301,6 @@ This command should return the following output if everything is OK: Extra labels may be added to all the written time series by passing `extra_label=name=value` query args. For example, `/datadog/api/v1/series?extra_label=foo=bar` would add `{foo="bar"}` label to all the ingested metrics. - ## How to send data from InfluxDB-compatible agents such as [Telegraf](https://www.influxdata.com/time-series-platform/telegraf/) Use `http://:8428` url instead of InfluxDB url in agents' configs. @@ -503,7 +488,6 @@ The `/api/v1/export` endpoint should return the following response: Extra labels may be added to all the imported time series by passing `extra_label=name=value` query args. For example, `/api/put?extra_label=foo=bar` would add `{foo="bar"}` label to all the ingested metrics. - ## Prometheus querying API usage VictoriaMetrics supports the following handlers from [Prometheus querying API](https://prometheus.io/docs/prometheus/latest/querying/api/): @@ -519,7 +503,6 @@ VictoriaMetrics supports the following handlers from [Prometheus querying API](h These handlers can be queried from Prometheus-compatible clients such as Grafana or curl. All the Prometheus querying API handlers can be prepended with `/prometheus` prefix. For example, both `/prometheus/api/v1/query` and `/api/v1/query` should work. - ### Prometheus querying API enhancements VictoriaMetrics accepts optional `extra_label==` query arg, which can be used for enforcing additional label filters for queries. For example, @@ -552,7 +535,6 @@ Additionally VictoriaMetrics provides the following handlers: For example, request to `/api/v1/status/top_queries?topN=5&maxLifetime=30s` would return up to 5 queries per list, which were executed during the last 30 seconds. VictoriaMetrics tracks the last `-search.queryStats.lastQueriesCount` queries with durations at least `-search.queryStats.minQueryDuration`. - ## Graphite API usage VictoriaMetrics supports the following Graphite APIs, which are needed for [Graphite datasource in Grafana](https://grafana.com/docs/grafana/latest/datasources/graphite/): @@ -569,7 +551,6 @@ VictoriaMetrics accepts optional query args: `extra_label==:8428/api/v1/export?match[]=`, @@ -815,7 +788,6 @@ Exported data can be imported via POST'ing it to [/api/v1/import](#how-to-import The [deduplication](#deduplication) is applied to the data exported via `/api/v1/export` by default. The deduplication isn't applied if `reduce_mem_usage=1` query arg is passed to the request. - ### How to export CSV data Send a request to `http://:8428/api/v1/export/csv?format=&match=`, @@ -841,7 +813,6 @@ The exported CSV data can be imported to VictoriaMetrics via [/api/v1/import/csv The [deduplication](#deduplication) is applied for the data exported in CSV by default. It is possible to export raw data without de-duplication by passing `reduce_mem_usage=1` query arg to `/api/v1/export/csv`. - ### How to export data in native format Send a request to `http://:8428/api/v1/export/native?match[]=`, @@ -866,7 +837,6 @@ can fail to be imported into VictoriaMetrics release Y. The [deduplication](#deduplication) isn't applied for the data exported in native format. It is expected that the de-duplication is performed during data import. - ## How to import time series data Time series data can be imported into VictoriaMetrics via any supported ingestion protocol: @@ -884,7 +854,6 @@ Time series data can be imported into VictoriaMetrics via any supported ingestio * `/api/v1/import/csv` for importing arbitrary CSV data. See [these docs](#how-to-import-csv-data) for details. * `/api/v1/import/prometheus` for importing data in Prometheus exposition format. See [these docs](#how-to-import-data-in-prometheus-exposition-format) for details. - ### How to import data in JSON line format Example for importing data obtained via [/api/v1/export](#how-to-export-data-in-json-line-format): @@ -914,7 +883,6 @@ Note that it could be required to flush response cache after importing historica VictoriaMetrics parses input JSON lines one-by-one. It loads the whole JSON line in memory, then parses it and then saves the parsed samples into persistent storage. This means that VictoriaMetrics can occupy big amounts of RAM when importing too long JSON lines. The solution is to split too long JSON lines into smaller lines. It is OK if samples for a single time series are split among multiple JSON lines. - ### How to import data in native format The specification of VictoriaMetrics' native format may yet change and is not formally documented yet. So currently we do not recommend that external clients attempt to pack their own metrics in native format file. @@ -934,7 +902,6 @@ For example, `/api/v1/import/native?extra_label=foo=bar` would add `"foo":"bar"` Note that it could be required to flush response cache after importing historical data. See [these docs](#backfilling) for detail. - ### How to import CSV data Arbitrary CSV data can be imported via `/api/v1/import/csv`. The CSV data is imported according to the provided `format` query arg. @@ -975,6 +942,7 @@ curl -G 'http://localhost:8428/api/v1/export' -d 'match[]={ticker!=""}' ``` The following response should be returned: + ```bash {"metric":{"__name__":"bid","market":"NASDAQ","ticker":"MSFT"},"values":[1.67],"timestamps":[1583865146520]} {"metric":{"__name__":"bid","market":"NYSE","ticker":"GOOG"},"values":[4.56],"timestamps":[1583865146495]} @@ -987,7 +955,6 @@ For example, `/api/v1/import/csv?extra_label=foo=bar` would add `"foo":"bar"` la Note that it could be required to flush response cache after importing historical data. See [these docs](#backfilling) for detail. - ### How to import data in Prometheus exposition format VictoriaMetrics accepts data in [Prometheus exposition format](https://github.com/prometheus/docs/blob/master/content/docs/instrumenting/exposition_formats.md#text-based-format) @@ -1029,8 +996,6 @@ Note that it could be required to flush response cache after importing historica VictoriaMetrics also may scrape Prometheus targets - see [these docs](#how-to-scrape-prometheus-exporters-such-as-node-exporter). - - ## Relabeling VictoriaMetrics supports Prometheus-compatible relabeling for all the ingested metrics if `-relabelConfig` command-line flag points @@ -1039,6 +1004,7 @@ The `-relabelConfig` also can point to http or https url. For example, `-relabel See [this article with relabeling tips and tricks](https://valyala.medium.com/how-to-use-relabeling-in-prometheus-and-victoriametrics-8b90fc22c4b2). Example contents for `-relabelConfig` file: + ```yml # Add {cluster="dev"} label. - target_label: cluster @@ -1052,7 +1018,6 @@ Example contents for `-relabelConfig` file: See [these docs](https://docs.victoriametrics.com/vmagent.html#relabeling) for more details about relabeling in VictoriaMetrics. - ## Federation VictoriaMetrics exports [Prometheus-compatible federation data](https://prometheus.io/docs/prometheus/latest/federation/) @@ -1064,7 +1029,6 @@ on the interval `[now - max_lookback ... now]` is scraped for each time series. For instance, `/federate?match[]=up&max_lookback=1h` would return last points on the `[now - 1h ... now]` interval. This may be useful for time series federation with scrape intervals exceeding `5m`. - ## Capacity planning VictoriaMetrics uses lower amounts of CPU, RAM and storage space on production workloads compared to competing solutions (Prometheus, Thanos, Cortex, TimescaleDB, InfluxDB, QuestDB, M3DB) according to [our case studies](https://docs.victoriametrics.com/CaseStudies.html). @@ -1087,7 +1051,6 @@ It is recommended leaving the following amounts of spare resources: * 50% of spare CPU for reducing the probability of slowdowns during temporary spikes in workload. * At least 30% of free storage space at the directory pointed by `-storageDataPath` command-line flag. See also `-storage.minFreeDiskSpaceBytes` command-line flag description [here](#list-of-command-line-flags). - ## High availability * Install multiple VictoriaMetrics instances in distinct datacenters (availability zones). @@ -1128,7 +1091,6 @@ to write data to `victoriametrics-addr-1`, while each `r2` should write data to Another option is to write data simultaneously from Prometheus HA pair to a pair of VictoriaMetrics instances with the enabled de-duplication. See [this section](#deduplication) for details. - ## Deduplication VictoriaMetrics de-duplicates data points if `-dedup.minScrapeInterval` command-line flag is set to positive duration. For example, `-dedup.minScrapeInterval=60s` would de-duplicate data points on the same time series if they fall within the same discrete 60s bucket. The earliest data point will be kept. In the case of equal timestamps, an arbitrary data point will be kept. See [this comment](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2112#issuecomment-1032587618) for more details on how downsampling works. @@ -1141,34 +1103,34 @@ The de-duplication reduces disk space usage if multiple identically configured [ write data to the same VictoriaMetrics instance. These vmagent or Prometheus instances must have identical `external_labels` section in their configs, so they write data to the same time series. - ## Storage -VictoriaMetrics stores time series data in [MergeTree](https://en.wikipedia.org/wiki/Log-structured_merge-tree)-like +VictoriaMetrics stores time series data in [MergeTree](https://en.wikipedia.org/wiki/Log-structured_merge-tree)-like data structures. On insert, VictoriaMetrics accumulates up to 1s of data and dumps it on disk to -`<-storageDataPath>/data/small/YYYY_MM/` subdirectory forming a `part` with the following +`<-storageDataPath>/data/small/YYYY_MM/` subdirectory forming a `part` with the following name pattern: `rowsCount_blocksCount_minTimestamp_maxTimestamp`. Each part consists of two "columns": values and timestamps. These are sorted and compressed raw time series values. Additionally, part contains index files for searching for specific series in the values and timestamps files. -`Parts` are periodically merged into the bigger parts. The resulting `part` is constructed -under `<-storageDataPath>/data/{small,big}/YYYY_MM/tmp` subdirectory. When the resulting `part` is complete, it is atomically moved from the `tmp` -to its own subdirectory, while the source parts are atomically removed. The end result is that the source +`Parts` are periodically merged into the bigger parts. The resulting `part` is constructed +under `<-storageDataPath>/data/{small,big}/YYYY_MM/tmp` subdirectory. When the resulting `part` is complete, it is atomically moved from the `tmp` +to its own subdirectory, while the source parts are atomically removed. The end result is that the source parts are substituted by a single resulting bigger `part` in the `<-storageDataPath>/data/{small,big}/YYYY_MM/` directory. -Information about merging process is available in [single-node VictoriaMetrics](https://grafana.com/dashboards/10229) -and [clustered VictoriaMetrics](https://grafana.com/grafana/dashboards/11176) Grafana dashboards. +Information about merging process is available in [single-node VictoriaMetrics](https://grafana.com/dashboards/10229) +and [clustered VictoriaMetrics](https://grafana.com/grafana/dashboards/11176) Grafana dashboards. See more details in [monitoring docs](#monitoring). -The `merge` process is usually named "compaction", because the resulting `part` size is usually smaller than +The `merge` process is usually named "compaction", because the resulting `part` size is usually smaller than the sum of the source `parts`. There are following benefits of doing the merge process: + * it improves query performance, since lower number of `parts` are inspected with each query; -* it reduces the number of data files, since each `part`contains fixed number of files; +* it reduces the number of data files, since each `part`contains fixed number of files; * better compression rate for the resulting part. -Newly added `parts` either appear in the storage or fail to appear. -Storage never contains partially created parts. The same applies to merge process — `parts` are either fully -merged into a new `part` or fail to merge. There are no partially merged `parts` in MergeTree. -`Part` contents in MergeTree never change. Parts are immutable. They may be only deleted after the merge +Newly added `parts` either appear in the storage or fail to appear. +Storage never contains partially created parts. The same applies to merge process — `parts` are either fully +merged into a new `part` or fail to merge. There are no partially merged `parts` in MergeTree. +`Part` contents in MergeTree never change. Parts are immutable. They may be only deleted after the merge to a bigger `part` or when the `part` contents goes outside the configured `-retentionPeriod`. See [this article](https://valyala.medium.com/how-victoriametrics-makes-instant-snapshots-for-multi-terabyte-time-series-data-e1f3fb0e0282) for more details. @@ -1182,7 +1144,7 @@ Retention is configured with the `-retentionPeriod` command-line flag, which tak Data is split in per-month partitions inside `<-storageDataPath>/data/{small,big}` folders. Data partitions outside the configured retention are deleted on the first day of the new month. Each partition consists of one or more data parts with the following name pattern `rowsCount_blocksCount_minTimestamp_maxTimestamp`. -Data parts outside of the configured retention are eventually deleted during +Data parts outside of the configured retention are eventually deleted during [background merge](https://medium.com/@valyala/how-victoriametrics-makes-instant-snapshots-for-multi-terabyte-time-series-data-e1f3fb0e0282). The maximum disk space usage for a given `-retentionPeriod` is going to be (`-retentionPeriod` + 1) months. @@ -1209,7 +1171,6 @@ so it could route requests from particular user to VictoriaMetrics with the desi The same scheme could be implemented for multiple tenants in [VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html). See [these docs](https://docs.victoriametrics.com/guides/guide-vmcluster-multiple-retention-setup.html) for multi-retention setup details. - ## Downsampling [VictoriaMetrics Enterprise](https://victoriametrics.com/products/enterprise/) supports multi-level downsampling with `-downsampling.period` command-line flag. For example: @@ -1222,12 +1183,10 @@ Downsampling is applied independently per each time series. It can reduce disk s The downsampling can be evaluated for free by downloading and using enterprise binaries from [the releases page](https://github.com/VictoriaMetrics/VictoriaMetrics/releases). - ## Multi-tenancy Single-node VictoriaMetrics doesn't support multi-tenancy. Use [cluster version](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#multitenancy) instead. - ## Scalability and cluster version Though single-node VictoriaMetrics cannot scale to multiple nodes, it is optimized for resource usage - storage size / bandwidth / IOPS, RAM, CPU. @@ -1238,7 +1197,6 @@ So try single-node VictoriaMetrics at first and then [switch to cluster version] horizontally scalable long-term remote storage for really large Prometheus deployments. [Contact us](mailto:info@victoriametrics.com) for enterprise support. - ## Alerting It is recommended using [vmalert](https://docs.victoriametrics.com/vmalert.html) for alerting. @@ -1249,7 +1207,6 @@ Additionally, alerting can be set up with the following tools: * With Promxy - see [the corresponding docs](https://github.com/jacksontj/promxy/blob/master/README.md#how-do-i-use-alertingrecording-rules-in-promxy). * With Grafana - see [the corresponding docs](https://grafana.com/docs/alerting/rules/). - ## Security Do not forget protecting sensitive endpoints in VictoriaMetrics when exposing it to untrusted networks such as the internet. @@ -1263,6 +1220,7 @@ Consider setting the following command-line flags: * `-forceMergeAuthKey` for protecting `/internal/force_merge` endpoint. See [force merge docs](#forced-merge). * `-search.resetCacheAuthKey` for protecting `/internal/resetRollupResultCache` endpoint. See [backfilling](#backfilling) for more details. * `-configAuthKey` for protecting `/config` endpoint, since it may contain sensitive information such as passwords. + - `-pprofAuthKey` for protecting `/debug/pprof/*` endpoints, which can be used for [profiling](#profiling). Explicitly set internal network interface for TCP and UDP ports for data ingestion with Graphite and OpenTSDB formats. @@ -1271,7 +1229,6 @@ For example, substitute `-graphiteListenAddr=:2003` with `-graphiteListenAddr=/cache` directory during graceful shutdown (e.g. when VictoriaMetrics is stopped by sending `SIGINT` signal). The caches are read on the next VictoriaMetrics startup. Sometimes it is needed to remove such caches on the next startup. This can be performed by placing `reset_cache_on_startup` file inside the `<-storageDataPath>/cache` directory before the restart of VictoriaMetrics. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1447) for details. - ## Cache tuning VictoriaMetrics uses various in-memory caches for faster data ingestion and query performance. The following metrics for each type of cache are exported at [`/metrics` page](#monitoring): -- `vm_cache_size_bytes` - the actual cache size -- `vm_cache_size_max_bytes` - cache size limit -- `vm_cache_requests_total` - the number of requests to the cache -- `vm_cache_misses_total` - the number of cache misses -- `vm_cache_entries` - the number of entries in the cache +* `vm_cache_size_bytes` - the actual cache size +* `vm_cache_size_max_bytes` - cache size limit +* `vm_cache_requests_total` - the number of requests to the cache +* `vm_cache_misses_total` - the number of cache misses +* `vm_cache_entries` - the number of entries in the cache Both Grafana dashboards for [single-node VictoriaMetrics](https://grafana.com/dashboards/10229) and [clustered VictoriaMetrics](https://grafana.com/grafana/dashboards/11176) @@ -1452,28 +1405,28 @@ practical scenarios and workloads. Change the defaults only if you understand th To override the default values see command-line flags with `-storage.cacheSize` prefix. See the full description of flags [here](#list-of-command-line-flags). - ## Data migration ### From VictoriaMetrics -The simplest way to migrate data from one single-node (source) to another (destination), or from one vmstorage node +The simplest way to migrate data from one single-node (source) to another (destination), or from one vmstorage node to another do the following: + 1. Stop the VictoriaMetrics (source) with `kill -INT`; -2. Copy (via [rsync](https://en.wikipedia.org/wiki/Rsync) or any other tool) the entire folder specified +2. Copy (via [rsync](https://en.wikipedia.org/wiki/Rsync) or any other tool) the entire folder specified via `-storageDataPath` from the source node to the empty folder at the destination node. -3. Once copy is done, stop the VictoriaMetrics (destination) with `kill -INT` and verify that +3. Once copy is done, stop the VictoriaMetrics (destination) with `kill -INT` and verify that its `-storageDataPath` points to the copied folder from p.2; 4. Start the VictoriaMetrics (destination). The copied data should be now available. Things to consider when copying data: + 1. Data formats between single-node and vmstorage node aren't compatible and can't be copied. 2. Copying data folder means complete replacement of the previous data on destination VictoriaMetrics. For more complex scenarios like single-to-cluster, cluster-to-single, re-sharding or migrating only a fraction of data - see [vmctl. Migrating data from VictoriaMetrics](https://docs.victoriametrics.com/vmctl.html#migrating-data-from-victoriametrics). - ### From other systems Use [vmctl](https://docs.victoriametrics.com/vmctl.html) for data migration. It supports the following data migration types: @@ -1485,7 +1438,6 @@ Use [vmctl](https://docs.victoriametrics.com/vmctl.html) for data migration. It See [vmctl docs](https://docs.victoriametrics.com/vmctl.html) for more details. - ## Backfilling VictoriaMetrics accepts historical data in arbitrary order of time via [any supported ingestion method](#how-to-import-time-series-data). @@ -1503,7 +1455,6 @@ Yet another solution is to increase `-search.cacheTimestampOffset` flag value in for data with timestamps close to the current time. Single-node VictoriaMetrics automatically resets response cache when samples with timestamps older than `now - search.cacheTimestampOffset` are ingested to it. - ## Data updates VictoriaMetrics doesn't support updating already existing sample values to new ones. It stores all the ingested data points @@ -1511,7 +1462,6 @@ for the same time series with identical timestamps. While it is possible substit [removal of old time series](#how-to-delete-time-series) and then [writing new time series](#backfilling), this approach should be used only for one-off updates. It shouldn't be used for frequent updates because of non-zero overhead related to data removal. - ## Replication Single-node VictoriaMetrics doesn't support application-level replication. Use cluster version instead. @@ -1521,7 +1471,6 @@ Storage-level replication may be offloaded to durable persistent storage such as See also [high availability docs](#high-availability) and [backup docs](#backups). - ## Backups VictoriaMetrics supports backups via [vmbackup](https://docs.victoriametrics.com/vmbackup.html) @@ -1529,19 +1478,17 @@ and [vmrestore](https://docs.victoriametrics.com/vmrestore.html) tools. We also provide [vmbackupmanager](https://docs.victoriametrics.com/vmbackupmanager.html) tool for enterprise subscribers. Enterprise binaries can be downloaded and evaluated for free from [the releases page](https://github.com/VictoriaMetrics/VictoriaMetrics/releases). - ## Benchmarks -Note, that vendors (including VictoriaMetrics) are often biased when doing such tests. E.g. they try highlighting -the best parts of their product, while highlighting the worst parts of competing products. -So we encourage users and all independent third parties to conduct their becnhmarks for various products +Note, that vendors (including VictoriaMetrics) are often biased when doing such tests. E.g. they try highlighting +the best parts of their product, while highlighting the worst parts of competing products. +So we encourage users and all independent third parties to conduct their becnhmarks for various products they are evaluating in production and publish the results. As a reference, please see [benchmarks](https://docs.victoriametrics.com/Articles.html#benchmarks) conducted by -VictoriaMetrics team. Please also see the [helm chart](https://github.com/VictoriaMetrics/benchmark) +VictoriaMetrics team. Please also see the [helm chart](https://github.com/VictoriaMetrics/benchmark) for running ingestion benchmarks based on node_exporter metrics. - ## Profiling VictoriaMetrics provides handlers for collecting the following [Go profiles](https://blog.golang.org/profiling-go-programs): @@ -1570,7 +1517,6 @@ The command for collecting CPU profile waits for 30 seconds before returning. The collected profiles may be analyzed with [go tool pprof](https://github.com/google/pprof). - ## Integrations * [Helm charts for single-node and cluster versions of VictoriaMetrics](https://github.com/VictoriaMetrics/helm-charts). @@ -1584,7 +1530,6 @@ The collected profiles may be analyzed with [go tool pprof](https://github.com/g * [Snap package for VictoriaMetrics](https://snapcraft.io/victoriametrics). * [vmalert-cli](https://github.com/aorfanos/vmalert-cli) - a CLI application for managing [vmalert](https://docs.victoriametrics.com/vmalert.html). - ## Third-party contributions * [Unofficial yum repository](https://copr.fedorainfracloud.org/coprs/antonpatsev/VictoriaMetrics/) ([source code](https://github.com/patsevanton/victoriametrics-rpm)) @@ -1592,12 +1537,10 @@ The collected profiles may be analyzed with [go tool pprof](https://github.com/g * [Prometheus -> VictoriaMetrics exporter #2](https://github.com/AnchorFree/tsdb-remote-write) * [Prometheus Oauth proxy](https://gitlab.com/optima_public/prometheus_oauth_proxy) - see [this article](https://medium.com/@richard.holly/powerful-saas-solution-for-detection-metrics-c67b9208d362) for details. - ## Contacts Contact us with any questions regarding VictoriaMetrics at [info@victoriametrics.com](mailto:info@victoriametrics.com). - ## Community and contributions Feel free asking any questions regarding VictoriaMetrics: @@ -1631,7 +1574,6 @@ Adhering `KISS` principle simplifies the resulting code and architecture, so it Report bugs and propose new features [here](https://github.com/VictoriaMetrics/VictoriaMetrics/issues). - ## VictoriaMetrics Logo [Zip](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/VM_logo.zip) contains three folders with different image orientations (main color and inverted version). @@ -1661,315 +1603,314 @@ Files included in each folder: * Do not change spacing, alignment, or relative locations of the design elements. * Do not change the proportions of any of the design elements or the design itself. You may resize as needed but must retain all proportions. - ## List of command-line flags Pass `-help` to VictoriaMetrics in order to see the list of supported command-line flags with their description: ``` -bigMergeConcurrency int - The maximum number of CPU cores to use for big merges. Default value is used if set to 0 + The maximum number of CPU cores to use for big merges. Default value is used if set to 0 -configAuthKey string - Authorization key for accessing /config page. It must be passed via authKey query arg + Authorization key for accessing /config page. It must be passed via authKey query arg -csvTrimTimestamp duration - Trim timestamps when importing csv data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) + Trim timestamps when importing csv data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) -datadog.maxInsertRequestSize size - The maximum size in bytes of a single DataDog POST request to /api/v1/series - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 67108864) + The maximum size in bytes of a single DataDog POST request to /api/v1/series + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 67108864) -dedup.minScrapeInterval duration - Leave only the first sample in every time series per each discrete interval equal to -dedup.minScrapeInterval > 0. See https://docs.victoriametrics.com/#deduplication and https://docs.victoriametrics.com/#downsampling + Leave only the first sample in every time series per each discrete interval equal to -dedup.minScrapeInterval > 0. See https://docs.victoriametrics.com/#deduplication and https://docs.victoriametrics.com/#downsampling -deleteAuthKey string - authKey for metrics' deletion via /api/v1/admin/tsdb/delete_series and /tags/delSeries + authKey for metrics' deletion via /api/v1/admin/tsdb/delete_series and /tags/delSeries -denyQueriesOutsideRetention - Whether to deny queries outside of the configured -retentionPeriod. When set, then /api/v1/query_range would return '503 Service Unavailable' error for queries with 'from' value outside -retentionPeriod. This may be useful when multiple data sources with distinct retentions are hidden behind query-tee + Whether to deny queries outside of the configured -retentionPeriod. When set, then /api/v1/query_range would return '503 Service Unavailable' error for queries with 'from' value outside -retentionPeriod. This may be useful when multiple data sources with distinct retentions are hidden behind query-tee -downsampling.period array - Comma-separated downsampling periods in the format 'offset:period'. For example, '30d:10m' instructs to leave a single sample per 10 minutes for samples older than 30 days. See https://docs.victoriametrics.com/#downsampling for details - Supports an array of values separated by comma or specified via multiple flags. + Comma-separated downsampling periods in the format 'offset:period'. For example, '30d:10m' instructs to leave a single sample per 10 minutes for samples older than 30 days. See https://docs.victoriametrics.com/#downsampling for details + Supports an array of values separated by comma or specified via multiple flags. -dryRun - Whether to check only -promscrape.config and then exit. Unknown config entries aren't allowed in -promscrape.config by default. This can be changed with -promscrape.config.strictParse=false command-line flag + Whether to check only -promscrape.config and then exit. Unknown config entries aren't allowed in -promscrape.config by default. This can be changed with -promscrape.config.strictParse=false command-line flag -enableTCP6 - Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used + Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used -envflag.enable - Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details + Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details -envflag.prefix string - Prefix for environment variables if -envflag.enable is set + Prefix for environment variables if -envflag.enable is set -eula - By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf + By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf -finalMergeDelay duration - The delay before starting final merge for per-month partition after no new data is ingested into it. Final merge may require additional disk IO and CPU resources. Final merge may increase query speed and reduce disk space usage in some cases. Zero value disables final merge + The delay before starting final merge for per-month partition after no new data is ingested into it. Final merge may require additional disk IO and CPU resources. Final merge may increase query speed and reduce disk space usage in some cases. Zero value disables final merge -forceFlushAuthKey string - authKey, which must be passed in query string to /internal/force_flush pages + authKey, which must be passed in query string to /internal/force_flush pages -forceMergeAuthKey string - authKey, which must be passed in query string to /internal/force_merge pages + authKey, which must be passed in query string to /internal/force_merge pages -fs.disableMmap - Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() + Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() -graphiteListenAddr string - TCP and UDP address to listen for Graphite plaintext data. Usually :2003 must be set. Doesn't work if empty + TCP and UDP address to listen for Graphite plaintext data. Usually :2003 must be set. Doesn't work if empty -graphiteTrimTimestamp duration - Trim timestamps for Graphite data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) + Trim timestamps for Graphite data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) -http.connTimeout duration - Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) + Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) -http.disableResponseCompression - Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth + Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth -http.idleConnTimeout duration - Timeout for incoming idle http connections (default 1m0s) + Timeout for incoming idle http connections (default 1m0s) -http.maxGracefulShutdownDuration duration - The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) + The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) -http.pathPrefix string - An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus + An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus -http.shutdownDelay duration - Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers + Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers -httpAuth.password string - Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty + Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty -httpAuth.username string - Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password + Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password -httpListenAddr string - TCP address to listen for http connections (default ":8428") + TCP address to listen for http connections (default ":8428") -import.maxLineLen size - The maximum length in bytes of a single line accepted by /api/v1/import; the line length can be limited with 'max_rows_per_line' query arg passed to /api/v1/export - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 104857600) + The maximum length in bytes of a single line accepted by /api/v1/import; the line length can be limited with 'max_rows_per_line' query arg passed to /api/v1/export + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 104857600) -influx.databaseNames array - Comma-separated list of database names to return from /query and /influx/query API. This can be needed for accepting data from Telegraf plugins such as https://github.com/fangli/fluent-plugin-influxdb - Supports an array of values separated by comma or specified via multiple flags. + Comma-separated list of database names to return from /query and /influx/query API. This can be needed for accepting data from Telegraf plugins such as https://github.com/fangli/fluent-plugin-influxdb + Supports an array of values separated by comma or specified via multiple flags. -influx.maxLineSize size - The maximum size in bytes for a single InfluxDB line during parsing - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 262144) + The maximum size in bytes for a single InfluxDB line during parsing + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 262144) -influxDBLabel string - Default label for the DB name sent over '?db={db_name}' query parameter (default "db") + Default label for the DB name sent over '?db={db_name}' query parameter (default "db") -influxListenAddr string - TCP and UDP address to listen for InfluxDB line protocol data. Usually :8189 must be set. Doesn't work if empty. This flag isn't needed when ingesting data over HTTP - just send it to http://:8428/write + TCP and UDP address to listen for InfluxDB line protocol data. Usually :8189 must be set. Doesn't work if empty. This flag isn't needed when ingesting data over HTTP - just send it to http://:8428/write -influxMeasurementFieldSeparator string - Separator for '{measurement}{separator}{field_name}' metric name when inserted via InfluxDB line protocol (default "_") + Separator for '{measurement}{separator}{field_name}' metric name when inserted via InfluxDB line protocol (default "_") -influxSkipMeasurement - Uses '{field_name}' as a metric name while ignoring '{measurement}' and '-influxMeasurementFieldSeparator' + Uses '{field_name}' as a metric name while ignoring '{measurement}' and '-influxMeasurementFieldSeparator' -influxSkipSingleField - Uses '{measurement}' instead of '{measurement}{separator}{field_name}' for metic name if InfluxDB line contains only a single field + Uses '{measurement}' instead of '{measurement}{separator}{field_name}' for metic name if InfluxDB line contains only a single field -influxTrimTimestamp duration - Trim timestamps for InfluxDB line protocol data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) + Trim timestamps for InfluxDB line protocol data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) -insert.maxQueueDuration duration - The maximum duration for waiting in the queue for insert requests due to -maxConcurrentInserts (default 1m0s) + The maximum duration for waiting in the queue for insert requests due to -maxConcurrentInserts (default 1m0s) -logNewSeries - Whether to log new series. This option is for debug purposes only. It can lead to performance issues when big number of new series are ingested into VictoriaMetrics + Whether to log new series. This option is for debug purposes only. It can lead to performance issues when big number of new series are ingested into VictoriaMetrics -loggerDisableTimestamps - Whether to disable writing timestamps in logs + Whether to disable writing timestamps in logs -loggerErrorsPerSecondLimit int - Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit + Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit -loggerFormat string - Format for logs. Possible values: default, json (default "default") + Format for logs. Possible values: default, json (default "default") -loggerLevel string - Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") + Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") -loggerOutput string - Output for the logs. Supported values: stderr, stdout (default "stderr") + Output for the logs. Supported values: stderr, stdout (default "stderr") -loggerTimezone string - Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") + Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") -loggerWarnsPerSecondLimit int - Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit + Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit -maxConcurrentInserts int - The maximum number of concurrent inserts. Default value should work for most cases, since it minimizes the overhead for concurrent inserts. This option is tigthly coupled with -insert.maxQueueDuration (default 16) + The maximum number of concurrent inserts. Default value should work for most cases, since it minimizes the overhead for concurrent inserts. This option is tigthly coupled with -insert.maxQueueDuration (default 16) -maxInsertRequestSize size - The maximum size in bytes of a single Prometheus remote_write API request - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) + The maximum size in bytes of a single Prometheus remote_write API request + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) -maxLabelValueLen int - The maximum length of label values in the accepted time series. Longer label values are truncated. In this case the vm_too_long_label_values_total metric at /metrics page is incremented (default 16384) + The maximum length of label values in the accepted time series. Longer label values are truncated. In this case the vm_too_long_label_values_total metric at /metrics page is incremented (default 16384) -maxLabelsPerTimeseries int - The maximum number of labels accepted per time series. Superfluous labels are dropped. In this case the vm_metrics_with_dropped_labels_total metric at /metrics page is incremented (default 30) + The maximum number of labels accepted per time series. Superfluous labels are dropped. In this case the vm_metrics_with_dropped_labels_total metric at /metrics page is incremented (default 30) -memory.allowedBytes size - Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -memory.allowedPercent float - Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) + Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) -metricsAuthKey string - Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings -opentsdbHTTPListenAddr string - TCP address to listen for OpentTSDB HTTP put requests. Usually :4242 must be set. Doesn't work if empty + TCP address to listen for OpentTSDB HTTP put requests. Usually :4242 must be set. Doesn't work if empty -opentsdbListenAddr string - TCP and UDP address to listen for OpentTSDB metrics. Telnet put messages and HTTP /api/put messages are simultaneously served on TCP port. Usually :4242 must be set. Doesn't work if empty + TCP and UDP address to listen for OpentTSDB metrics. Telnet put messages and HTTP /api/put messages are simultaneously served on TCP port. Usually :4242 must be set. Doesn't work if empty -opentsdbTrimTimestamp duration - Trim timestamps for OpenTSDB 'telnet put' data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) + Trim timestamps for OpenTSDB 'telnet put' data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) -opentsdbhttp.maxInsertRequestSize size - The maximum size of OpenTSDB HTTP put request - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) + The maximum size of OpenTSDB HTTP put request + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) -opentsdbhttpTrimTimestamp duration - Trim timestamps for OpenTSDB HTTP data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) + Trim timestamps for OpenTSDB HTTP data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) -pprofAuthKey string - Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings -precisionBits int - The number of precision bits to store per each value. Lower precision bits improves data compression at the cost of precision loss (default 64) + The number of precision bits to store per each value. Lower precision bits improves data compression at the cost of precision loss (default 64) -promscrape.cluster.memberNum int - The number of number in the cluster of scrapers. It must be an unique value in the range 0 ... promscrape.cluster.membersCount-1 across scrapers in the cluster + The number of number in the cluster of scrapers. It must be an unique value in the range 0 ... promscrape.cluster.membersCount-1 across scrapers in the cluster -promscrape.cluster.membersCount int - The number of members in a cluster of scrapers. Each member must have an unique -promscrape.cluster.memberNum in the range 0 ... promscrape.cluster.membersCount-1 . Each member then scrapes roughly 1/N of all the targets. By default cluster scraping is disabled, i.e. a single scraper scrapes all the targets + The number of members in a cluster of scrapers. Each member must have an unique -promscrape.cluster.memberNum in the range 0 ... promscrape.cluster.membersCount-1 . Each member then scrapes roughly 1/N of all the targets. By default cluster scraping is disabled, i.e. a single scraper scrapes all the targets -promscrape.cluster.replicationFactor int - The number of members in the cluster, which scrape the same targets. If the replication factor is greater than 2, then the deduplication must be enabled at remote storage side. See https://docs.victoriametrics.com/#deduplication (default 1) + The number of members in the cluster, which scrape the same targets. If the replication factor is greater than 2, then the deduplication must be enabled at remote storage side. See https://docs.victoriametrics.com/#deduplication (default 1) -promscrape.config string - Optional path to Prometheus config file with 'scrape_configs' section containing targets to scrape. The path can point to local file and to http url. See https://docs.victoriametrics.com/#how-to-scrape-prometheus-exporters-such-as-node-exporter for details + Optional path to Prometheus config file with 'scrape_configs' section containing targets to scrape. The path can point to local file and to http url. See https://docs.victoriametrics.com/#how-to-scrape-prometheus-exporters-such-as-node-exporter for details -promscrape.config.dryRun - Checks -promscrape.config file for errors and unsupported fields and then exits. Returns non-zero exit code on parsing errors and emits these errors to stderr. See also -promscrape.config.strictParse command-line flag. Pass -loggerLevel=ERROR if you don't need to see info messages in the output. + Checks -promscrape.config file for errors and unsupported fields and then exits. Returns non-zero exit code on parsing errors and emits these errors to stderr. See also -promscrape.config.strictParse command-line flag. Pass -loggerLevel=ERROR if you don't need to see info messages in the output. -promscrape.config.strictParse - Whether to deny unsupported fields in -promscrape.config . Set to false in order to silently skip unsupported fields (default true) + Whether to deny unsupported fields in -promscrape.config . Set to false in order to silently skip unsupported fields (default true) -promscrape.configCheckInterval duration - Interval for checking for changes in '-promscrape.config' file. By default the checking is disabled. Send SIGHUP signal in order to force config check for changes + Interval for checking for changes in '-promscrape.config' file. By default the checking is disabled. Send SIGHUP signal in order to force config check for changes -promscrape.consul.waitTime duration - Wait time used by Consul service discovery. Default value is used if not set + Wait time used by Consul service discovery. Default value is used if not set -promscrape.consulSDCheckInterval duration - Interval for checking for changes in Consul. This works only if consul_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#consul_sd_config for details (default 30s) + Interval for checking for changes in Consul. This works only if consul_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#consul_sd_config for details (default 30s) -promscrape.digitaloceanSDCheckInterval duration - Interval for checking for changes in digital ocean. This works only if digitalocean_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#digitalocean_sd_config for details (default 1m0s) + Interval for checking for changes in digital ocean. This works only if digitalocean_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#digitalocean_sd_config for details (default 1m0s) -promscrape.disableCompression - Whether to disable sending 'Accept-Encoding: gzip' request headers to all the scrape targets. This may reduce CPU usage on scrape targets at the cost of higher network bandwidth utilization. It is possible to set 'disable_compression: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control + Whether to disable sending 'Accept-Encoding: gzip' request headers to all the scrape targets. This may reduce CPU usage on scrape targets at the cost of higher network bandwidth utilization. It is possible to set 'disable_compression: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control -promscrape.disableKeepAlive - Whether to disable HTTP keep-alive connections when scraping all the targets. This may be useful when targets has no support for HTTP keep-alive connection. It is possible to set 'disable_keepalive: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control. Note that disabling HTTP keep-alive may increase load on both vmagent and scrape targets + Whether to disable HTTP keep-alive connections when scraping all the targets. This may be useful when targets has no support for HTTP keep-alive connection. It is possible to set 'disable_keepalive: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control. Note that disabling HTTP keep-alive may increase load on both vmagent and scrape targets -promscrape.discovery.concurrency int - The maximum number of concurrent requests to Prometheus autodiscovery API (Consul, Kubernetes, etc.) (default 100) + The maximum number of concurrent requests to Prometheus autodiscovery API (Consul, Kubernetes, etc.) (default 100) -promscrape.discovery.concurrentWaitTime duration - The maximum duration for waiting to perform API requests if more than -promscrape.discovery.concurrency requests are simultaneously performed (default 1m0s) + The maximum duration for waiting to perform API requests if more than -promscrape.discovery.concurrency requests are simultaneously performed (default 1m0s) -promscrape.dnsSDCheckInterval duration - Interval for checking for changes in dns. This works only if dns_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dns_sd_config for details (default 30s) + Interval for checking for changes in dns. This works only if dns_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dns_sd_config for details (default 30s) -promscrape.dockerSDCheckInterval duration - Interval for checking for changes in docker. This works only if docker_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#docker_sd_config for details (default 30s) + Interval for checking for changes in docker. This works only if docker_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#docker_sd_config for details (default 30s) -promscrape.dockerswarmSDCheckInterval duration - Interval for checking for changes in dockerswarm. This works only if dockerswarm_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dockerswarm_sd_config for details (default 30s) + Interval for checking for changes in dockerswarm. This works only if dockerswarm_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dockerswarm_sd_config for details (default 30s) -promscrape.dropOriginalLabels - Whether to drop original labels for scrape targets at /targets and /api/v1/targets pages. This may be needed for reducing memory usage when original labels for big number of scrape targets occupy big amounts of memory. Note that this reduces debuggability for improper per-target relabeling configs + Whether to drop original labels for scrape targets at /targets and /api/v1/targets pages. This may be needed for reducing memory usage when original labels for big number of scrape targets occupy big amounts of memory. Note that this reduces debuggability for improper per-target relabeling configs -promscrape.ec2SDCheckInterval duration - Interval for checking for changes in ec2. This works only if ec2_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config for details (default 1m0s) + Interval for checking for changes in ec2. This works only if ec2_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config for details (default 1m0s) -promscrape.eurekaSDCheckInterval duration - Interval for checking for changes in eureka. This works only if eureka_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#eureka_sd_config for details (default 30s) + Interval for checking for changes in eureka. This works only if eureka_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#eureka_sd_config for details (default 30s) -promscrape.fileSDCheckInterval duration - Interval for checking for changes in 'file_sd_config'. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#file_sd_config for details (default 5m0s) + Interval for checking for changes in 'file_sd_config'. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#file_sd_config for details (default 5m0s) -promscrape.gceSDCheckInterval duration - Interval for checking for changes in gce. This works only if gce_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#gce_sd_config for details (default 1m0s) + Interval for checking for changes in gce. This works only if gce_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#gce_sd_config for details (default 1m0s) -promscrape.httpSDCheckInterval duration - Interval for checking for changes in http endpoint service discovery. This works only if http_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#http_sd_config for details (default 1m0s) + Interval for checking for changes in http endpoint service discovery. This works only if http_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#http_sd_config for details (default 1m0s) -promscrape.kubernetes.apiServerTimeout duration - How frequently to reload the full state from Kuberntes API server (default 30m0s) + How frequently to reload the full state from Kuberntes API server (default 30m0s) -promscrape.kubernetesSDCheckInterval duration - Interval for checking for changes in Kubernetes API server. This works only if kubernetes_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config for details (default 30s) + Interval for checking for changes in Kubernetes API server. This works only if kubernetes_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config for details (default 30s) -promscrape.maxDroppedTargets int - The maximum number of droppedTargets to show at /api/v1/targets page. Increase this value if your setup drops more scrape targets during relabeling and you need investigating labels for all the dropped targets. Note that the increased number of tracked dropped targets may result in increased memory usage (default 1000) + The maximum number of droppedTargets to show at /api/v1/targets page. Increase this value if your setup drops more scrape targets during relabeling and you need investigating labels for all the dropped targets. Note that the increased number of tracked dropped targets may result in increased memory usage (default 1000) -promscrape.maxResponseHeadersSize size - The maximum size of http response headers from Prometheus scrape targets - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 4096) + The maximum size of http response headers from Prometheus scrape targets + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 4096) -promscrape.maxScrapeSize size - The maximum size of scrape response in bytes to process from Prometheus targets. Bigger responses are rejected - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 16777216) + The maximum size of scrape response in bytes to process from Prometheus targets. Bigger responses are rejected + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 16777216) -promscrape.minResponseSizeForStreamParse size - The minimum target response size for automatic switching to stream parsing mode, which can reduce memory usage. See https://docs.victoriametrics.com/vmagent.html#stream-parsing-mode - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 1000000) + The minimum target response size for automatic switching to stream parsing mode, which can reduce memory usage. See https://docs.victoriametrics.com/vmagent.html#stream-parsing-mode + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 1000000) -promscrape.noStaleMarkers - Whether to disable sending Prometheus stale markers for metrics when scrape target disappears. This option may reduce memory usage if stale markers aren't needed for your setup. This option also disables populating the scrape_series_added metric. See https://prometheus.io/docs/concepts/jobs_instances/#automatically-generated-labels-and-time-series + Whether to disable sending Prometheus stale markers for metrics when scrape target disappears. This option may reduce memory usage if stale markers aren't needed for your setup. This option also disables populating the scrape_series_added metric. See https://prometheus.io/docs/concepts/jobs_instances/#automatically-generated-labels-and-time-series -promscrape.openstackSDCheckInterval duration - Interval for checking for changes in openstack API server. This works only if openstack_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#openstack_sd_config for details (default 30s) + Interval for checking for changes in openstack API server. This works only if openstack_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#openstack_sd_config for details (default 30s) -promscrape.seriesLimitPerTarget int - Optional limit on the number of unique time series a single scrape target can expose. See https://docs.victoriametrics.com/vmagent.html#cardinality-limiter for more info + Optional limit on the number of unique time series a single scrape target can expose. See https://docs.victoriametrics.com/vmagent.html#cardinality-limiter for more info -promscrape.streamParse - Whether to enable stream parsing for metrics obtained from scrape targets. This may be useful for reducing memory usage when millions of metrics are exposed per each scrape target. It is posible to set 'stream_parse: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control + Whether to enable stream parsing for metrics obtained from scrape targets. This may be useful for reducing memory usage when millions of metrics are exposed per each scrape target. It is posible to set 'stream_parse: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control -promscrape.suppressDuplicateScrapeTargetErrors - Whether to suppress 'duplicate scrape target' errors; see https://docs.victoriametrics.com/vmagent.html#troubleshooting for details + Whether to suppress 'duplicate scrape target' errors; see https://docs.victoriametrics.com/vmagent.html#troubleshooting for details -promscrape.suppressScrapeErrors - Whether to suppress scrape errors logging. The last error for each target is always available at '/targets' page even if scrape errors logging is suppressed + Whether to suppress scrape errors logging. The last error for each target is always available at '/targets' page even if scrape errors logging is suppressed -relabelConfig string - Optional path to a file with relabeling rules, which are applied to all the ingested metrics. The path can point either to local file or to http url. See https://docs.victoriametrics.com/#relabeling for details. The config is reloaded on SIGHUP signal + Optional path to a file with relabeling rules, which are applied to all the ingested metrics. The path can point either to local file or to http url. See https://docs.victoriametrics.com/#relabeling for details. The config is reloaded on SIGHUP signal -relabelDebug - Whether to log metrics before and after relabeling with -relabelConfig. If the -relabelDebug is enabled, then the metrics aren't sent to storage. This is useful for debugging the relabeling configs + Whether to log metrics before and after relabeling with -relabelConfig. If the -relabelDebug is enabled, then the metrics aren't sent to storage. This is useful for debugging the relabeling configs -retentionPeriod value - Data with timestamps outside the retentionPeriod is automatically deleted - The following optional suffixes are supported: h (hour), d (day), w (week), y (year). If suffix isn't set, then the duration is counted in months (default 1) + Data with timestamps outside the retentionPeriod is automatically deleted + The following optional suffixes are supported: h (hour), d (day), w (week), y (year). If suffix isn't set, then the duration is counted in months (default 1) -search.cacheTimestampOffset duration - The maximum duration since the current time for response data, which is always queried from the original raw data, without using the response cache. Increase this value if you see gaps in responses due to time synchronization issues between VictoriaMetrics and data sources. See also -search.disableAutoCacheReset (default 5m0s) + The maximum duration since the current time for response data, which is always queried from the original raw data, without using the response cache. Increase this value if you see gaps in responses due to time synchronization issues between VictoriaMetrics and data sources. See also -search.disableAutoCacheReset (default 5m0s) -search.disableAutoCacheReset - Whether to disable automatic response cache reset if a sample with timestamp outside -search.cacheTimestampOffset is inserted into VictoriaMetrics + Whether to disable automatic response cache reset if a sample with timestamp outside -search.cacheTimestampOffset is inserted into VictoriaMetrics -search.disableCache - Whether to disable response caching. This may be useful during data backfilling + Whether to disable response caching. This may be useful during data backfilling -search.graphiteMaxPointsPerSeries int - The maximum number of points per series Graphite render API can return (default 1000000) + The maximum number of points per series Graphite render API can return (default 1000000) -search.graphiteStorageStep duration - The interval between datapoints stored in the database. It is used at Graphite Render API handler for normalizing the interval between datapoints in case it isn't normalized. It can be overriden by sending 'storage_step' query arg to /render API or by sending the desired interval via 'Storage-Step' http header during querying /render API (default 10s) + The interval between datapoints stored in the database. It is used at Graphite Render API handler for normalizing the interval between datapoints in case it isn't normalized. It can be overriden by sending 'storage_step' query arg to /render API or by sending the desired interval via 'Storage-Step' http header during querying /render API (default 10s) -search.latencyOffset duration - The time when data points become visible in query results after the collection. Too small value can result in incomplete last points for query results (default 30s) + The time when data points become visible in query results after the collection. Too small value can result in incomplete last points for query results (default 30s) -search.logSlowQueryDuration duration - Log queries with execution time exceeding this value. Zero disables slow query logging (default 5s) + Log queries with execution time exceeding this value. Zero disables slow query logging (default 5s) -search.maxConcurrentRequests int - The maximum number of concurrent search requests. It shouldn't be high, since a single request can saturate all the CPU cores. See also -search.maxQueueDuration (default 8) + The maximum number of concurrent search requests. It shouldn't be high, since a single request can saturate all the CPU cores. See also -search.maxQueueDuration (default 8) -search.maxExportDuration duration - The maximum duration for /api/v1/export call (default 720h0m0s) + The maximum duration for /api/v1/export call (default 720h0m0s) -search.maxLookback duration - Synonym to -search.lookback-delta from Prometheus. The value is dynamically detected from interval between time series datapoints if not set. It can be overridden on per-query basis via max_lookback arg. See also '-search.maxStalenessInterval' flag, which has the same meaining due to historical reasons + Synonym to -search.lookback-delta from Prometheus. The value is dynamically detected from interval between time series datapoints if not set. It can be overridden on per-query basis via max_lookback arg. See also '-search.maxStalenessInterval' flag, which has the same meaining due to historical reasons -search.maxPointsPerTimeseries int - The maximum points per a single timeseries returned from /api/v1/query_range. This option doesn't limit the number of scanned raw samples in the database. The main purpose of this option is to limit the number of per-series points returned to graphing UI such as Grafana. There is no sense in setting this limit to values bigger than the horizontal resolution of the graph (default 30000) + The maximum points per a single timeseries returned from /api/v1/query_range. This option doesn't limit the number of scanned raw samples in the database. The main purpose of this option is to limit the number of per-series points returned to graphing UI such as Grafana. There is no sense in setting this limit to values bigger than the horizontal resolution of the graph (default 30000) -search.maxQueryDuration duration - The maximum duration for query execution (default 30s) + The maximum duration for query execution (default 30s) -search.maxQueryLen size - The maximum search query length in bytes - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 16384) + The maximum search query length in bytes + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 16384) -search.maxQueueDuration duration - The maximum time the request waits for execution when -search.maxConcurrentRequests limit is reached; see also -search.maxQueryDuration (default 10s) + The maximum time the request waits for execution when -search.maxConcurrentRequests limit is reached; see also -search.maxQueryDuration (default 10s) -search.maxSamplesPerQuery int - The maximum number of raw samples a single query can process across all time series. This protects from heavy queries, which select unexpectedly high number of raw samples. See also -search.maxSamplesPerSeries (default 1000000000) + The maximum number of raw samples a single query can process across all time series. This protects from heavy queries, which select unexpectedly high number of raw samples. See also -search.maxSamplesPerSeries (default 1000000000) -search.maxSamplesPerSeries int - The maximum number of raw samples a single query can scan per each time series. This option allows limiting memory usage (default 30000000) + The maximum number of raw samples a single query can scan per each time series. This option allows limiting memory usage (default 30000000) -search.maxStalenessInterval duration - The maximum interval for staleness calculations. By default it is automatically calculated from the median interval between samples. This flag could be useful for tuning Prometheus data model closer to Influx-style data model. See https://prometheus.io/docs/prometheus/latest/querying/basics/#staleness for details. See also '-search.maxLookback' flag, which has the same meaning due to historical reasons + The maximum interval for staleness calculations. By default it is automatically calculated from the median interval between samples. This flag could be useful for tuning Prometheus data model closer to Influx-style data model. See https://prometheus.io/docs/prometheus/latest/querying/basics/#staleness for details. See also '-search.maxLookback' flag, which has the same meaning due to historical reasons -search.maxStatusRequestDuration duration - The maximum duration for /api/v1/status/* requests (default 5m0s) + The maximum duration for /api/v1/status/* requests (default 5m0s) -search.maxStepForPointsAdjustment duration - The maximum step when /api/v1/query_range handler adjusts points with timestamps closer than -search.latencyOffset to the current time. The adjustment is needed because such points may contain incomplete data (default 1m0s) + The maximum step when /api/v1/query_range handler adjusts points with timestamps closer than -search.latencyOffset to the current time. The adjustment is needed because such points may contain incomplete data (default 1m0s) -search.maxTagKeys int - The maximum number of tag keys returned from /api/v1/labels (default 100000) + The maximum number of tag keys returned from /api/v1/labels (default 100000) -search.maxTagValueSuffixesPerSearch int - The maximum number of tag value suffixes returned from /metrics/find (default 100000) + The maximum number of tag value suffixes returned from /metrics/find (default 100000) -search.maxTagValues int - The maximum number of tag values returned from /api/v1/label//values (default 100000) + The maximum number of tag values returned from /api/v1/label//values (default 100000) -search.maxUniqueTimeseries int - The maximum number of unique time series each search can scan. This option allows limiting memory usage (default 300000) + The maximum number of unique time series each search can scan. This option allows limiting memory usage (default 300000) -search.minStalenessInterval duration - The minimum interval for staleness calculations. This flag could be useful for removing gaps on graphs generated from time series with irregular intervals between samples. See also '-search.maxStalenessInterval' + The minimum interval for staleness calculations. This flag could be useful for removing gaps on graphs generated from time series with irregular intervals between samples. See also '-search.maxStalenessInterval' -search.noStaleMarkers - Set this flag to true if the database doesn't contain Prometheus stale markers, so there is no need in spending additional CPU time on its handling. Staleness markers may exist only in data obtained from Prometheus scrape targets + Set this flag to true if the database doesn't contain Prometheus stale markers, so there is no need in spending additional CPU time on its handling. Staleness markers may exist only in data obtained from Prometheus scrape targets -search.queryStats.lastQueriesCount int - Query stats for /api/v1/status/top_queries is tracked on this number of last queries. Zero value disables query stats tracking (default 20000) + Query stats for /api/v1/status/top_queries is tracked on this number of last queries. Zero value disables query stats tracking (default 20000) -search.queryStats.minQueryDuration duration - The minimum duration for queries to track in query stats at /api/v1/status/top_queries. Queries with lower duration are ignored in query stats (default 1ms) + The minimum duration for queries to track in query stats at /api/v1/status/top_queries. Queries with lower duration are ignored in query stats (default 1ms) -search.resetCacheAuthKey string - Optional authKey for resetting rollup cache via /internal/resetRollupResultCache call + Optional authKey for resetting rollup cache via /internal/resetRollupResultCache call -search.treatDotsAsIsInRegexps - Whether to treat dots as is in regexp label filters used in queries. For example, foo{bar=~"a.b.c"} will be automatically converted to foo{bar=~"a\\.b\\.c"}, i.e. all the dots in regexp filters will be automatically escaped in order to match only dot char instead of matching any char. Dots in ".+", ".*" and ".{n}" regexps aren't escaped. This option is DEPRECATED in favor of {__graphite__="a.*.c"} syntax for selecting metrics matching the given Graphite metrics filter + Whether to treat dots as is in regexp label filters used in queries. For example, foo{bar=~"a.b.c"} will be automatically converted to foo{bar=~"a\\.b\\.c"}, i.e. all the dots in regexp filters will be automatically escaped in order to match only dot char instead of matching any char. Dots in ".+", ".*" and ".{n}" regexps aren't escaped. This option is DEPRECATED in favor of {__graphite__="a.*.c"} syntax for selecting metrics matching the given Graphite metrics filter -selfScrapeInstance string - Value for 'instance' label, which is added to self-scraped metrics (default "self") + Value for 'instance' label, which is added to self-scraped metrics (default "self") -selfScrapeInterval duration - Interval for self-scraping own metrics at /metrics page + Interval for self-scraping own metrics at /metrics page -selfScrapeJob string - Value for 'job' label, which is added to self-scraped metrics (default "victoria-metrics") + Value for 'job' label, which is added to self-scraped metrics (default "victoria-metrics") -smallMergeConcurrency int - The maximum number of CPU cores to use for small merges. Default value is used if set to 0 + The maximum number of CPU cores to use for small merges. Default value is used if set to 0 -snapshotAuthKey string - authKey, which must be passed in query string to /snapshot* pages + authKey, which must be passed in query string to /snapshot* pages -sortLabels - Whether to sort labels for incoming samples before writing them to storage. This may be needed for reducing memory usage at storage when the order of labels in incoming samples is random. For example, if m{k1="v1",k2="v2"} may be sent as m{k2="v2",k1="v1"}. Enabled sorting for labels can slow down ingestion performance a bit + Whether to sort labels for incoming samples before writing them to storage. This may be needed for reducing memory usage at storage when the order of labels in incoming samples is random. For example, if m{k1="v1",k2="v2"} may be sent as m{k2="v2",k1="v1"}. Enabled sorting for labels can slow down ingestion performance a bit -storage.cacheSizeIndexDBDataBlocks size - Overrides max size for indexdb/dataBlocks cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Overrides max size for indexdb/dataBlocks cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -storage.cacheSizeIndexDBIndexBlocks size - Overrides max size for indexdb/indexBlocks cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Overrides max size for indexdb/indexBlocks cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -storage.cacheSizeStorageTSID size - Overrides max size for storage/tsid cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Overrides max size for storage/tsid cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -storage.maxDailySeries int - The maximum number of unique series can be added to the storage during the last 24 hours. Excess series are logged and dropped. This can be useful for limiting series churn rate. See also -storage.maxHourlySeries + The maximum number of unique series can be added to the storage during the last 24 hours. Excess series are logged and dropped. This can be useful for limiting series churn rate. See also -storage.maxHourlySeries -storage.maxHourlySeries int - The maximum number of unique series can be added to the storage during the last hour. Excess series are logged and dropped. This can be useful for limiting series cardinality. See also -storage.maxDailySeries + The maximum number of unique series can be added to the storage during the last hour. Excess series are logged and dropped. This can be useful for limiting series cardinality. See also -storage.maxDailySeries -storage.minFreeDiskSpaceBytes size - The minimum free disk space at -storageDataPath after which the storage stops accepting new data - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 10000000) + The minimum free disk space at -storageDataPath after which the storage stops accepting new data + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 10000000) -storageDataPath string - Path to storage data (default "victoria-metrics-data") + Path to storage data (default "victoria-metrics-data") -tls - Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set + Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set -tlsCertFile string - Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated -tlsKeyFile string - Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated -version - Show VictoriaMetrics version + Show VictoriaMetrics version ``` diff --git a/deployment/docker/README.md b/deployment/docker/README.md index d18f97771..8090f2a9d 100644 --- a/deployment/docker/README.md +++ b/deployment/docker/README.md @@ -9,6 +9,7 @@ For clustered version check [docker compose in cluster branch](https://github.co ## VictoriaMetrics VictoriaMetrics will be accessible on the following ports: + * `--graphiteListenAddr=:2003` * `--opentsdbListenAddr=:4242` * `--httpListenAddr=:8428` @@ -23,7 +24,7 @@ configuration `prometheus.yml` with listed targets for scraping. ## vmalert -vmalert evaluates alerting rules (`alerts.yml`) to track VictoriaMetrics +vmalert evaluates alerting rules (`alerts.yml`) to track VictoriaMetrics health state. It is connected with AlertManager for firing alerts, and with VictoriaMetrics for executing queries and storing alert's state. @@ -40,11 +41,13 @@ All notifications are blackholed according to `alertmanager.yml` config. To access service open following [link](http://localhost:3000). -Default creds: +Default credential: + * login - `admin` * password - `admin` Grafana is provisioned by default with following entities: + * VictoriaMetrics datasource * Prometheus datasource * VictoriaMetrics overview dashboard diff --git a/deployment/docker/docker-compose.yml b/deployment/docker/docker-compose.yml index b441b44f6..0889aece6 100644 --- a/deployment/docker/docker-compose.yml +++ b/deployment/docker/docker-compose.yml @@ -1,4 +1,4 @@ -version: '3.5' +version: "3.5" services: vmagent: container_name: vmagent @@ -11,8 +11,8 @@ services: - vmagentdata:/vmagentdata - ./prometheus.yml:/etc/prometheus/prometheus.yml command: - - '--promscrape.config=/etc/prometheus/prometheus.yml' - - '--remoteWrite.url=http://victoriametrics:8428/api/v1/write' + - "--promscrape.config=/etc/prometheus/prometheus.yml" + - "--remoteWrite.url=http://victoriametrics:8428/api/v1/write" networks: - vm_net restart: always @@ -29,11 +29,11 @@ services: volumes: - vmdata:/storage command: - - '--storageDataPath=/storage' - - '--graphiteListenAddr=:2003' - - '--opentsdbListenAddr=:4242' - - '--httpListenAddr=:8428' - - '--influxListenAddr=:8089' + - "--storageDataPath=/storage" + - "--graphiteListenAddr=:2003" + - "--opentsdbListenAddr=:4242" + - "--httpListenAddr=:8428" + - "--influxListenAddr=:8089" networks: - vm_net restart: always @@ -64,24 +64,24 @@ services: volumes: - ./alerts.yml:/etc/alerts/alerts.yml command: - - '--datasource.url=http://victoriametrics:8428/' - - '--remoteRead.url=http://victoriametrics:8428/' - - '--remoteWrite.url=http://victoriametrics:8428/' - - '--notifier.url=http://alertmanager:9093/' - - '--rule=/etc/alerts/*.yml' + - "--datasource.url=http://victoriametrics:8428/" + - "--remoteRead.url=http://victoriametrics:8428/" + - "--remoteWrite.url=http://victoriametrics:8428/" + - "--notifier.url=http://alertmanager:9093/" + - "--rule=/etc/alerts/*.yml" # display source of alerts in grafana - - '-external.url=http://127.0.0.1:3000' #grafana outside container - - '--external.alert.source=explore?orgId=1&left=["now-1h","now","VictoriaMetrics",{"expr":"{{$$expr|quotesEscape|crlfEscape|queryEscape}}"},{"mode":"Metrics"},{"ui":[true,true,true,"none"]}]' ## when copypaste the line be aware of '$$' for escaping in '$expr' networks: + - "--external.url=http://127.0.0.1:3000" #grafana outside container + - '--external.alert.source=explore?orgId=1&left=["now-1h","now","VictoriaMetrics",{"expr":"{{$$expr|quotesEscape|crlfEscape|queryEscape}}"},{"mode":"Metrics"},{"ui":[true,true,true,"none"]}]' ## when copypaste the line be aware of '$$' for escaping in '$expr' networks: - vm_net restart: always alertmanager: container_name: alertmanager - image: prom/alertmanager + image: prom/alertmanager volumes: - ./alertmanager.yml:/config/alertmanager.yml command: - - '--config.file=/config/alertmanager.yml' + - "--config.file=/config/alertmanager.yml" ports: - 9093:9093 networks: diff --git a/deployment/marketplace/digitialocean/one-click-droplet/README.md b/deployment/marketplace/digitialocean/one-click-droplet/README.md index 5d5ebbd37..2a6126474 100644 --- a/deployment/marketplace/digitialocean/one-click-droplet/README.md +++ b/deployment/marketplace/digitialocean/one-click-droplet/README.md @@ -4,9 +4,9 @@ VictoriaMetrics is a fast and scalable open source time series database and moni ## Description -VictoriaMetrics is a free [open source time series database](https://en.wikipedia.org/wiki/Time_series_database) (TSDB) and monitoring solution, designed to collect, store and process real-time metrics. +VictoriaMetrics is a free [open source time series database](https://en.wikipedia.org/wiki/Time_series_database) (TSDB) and monitoring solution, designed to collect, store and process real-time metrics. -It supports the [Prometheus](https://en.wikipedia.org/wiki/Prometheus_(software)) pull model and various push protocols ([Graphite](https://en.wikipedia.org/wiki/Graphite_(software)), [InfluxDB](https://en.wikipedia.org/wiki/InfluxDB), OpenTSDB) for data ingestion. It is optimized for storage with high-latency IO, low IOPS and time series with [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate). +It supports the [Prometheus](https://en.wikipedia.org/wiki/Prometheus_(software)) pull model and various push protocols ([Graphite](https://en.wikipedia.org/wiki/Graphite_(software)), [InfluxDB](https://en.wikipedia.org/wiki/InfluxDB), OpenTSDB) for data ingestion. It is optimized for storage with high-latency IO, low IOPS and time series with [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate). For reading the data and evaluating alerting rules, VictoriaMetrics supports the PromQL, [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html) and Graphite query languages. VictoriaMetrics Single is fully autonomous and can be used as a long-term storage for time series. @@ -16,7 +16,7 @@ For reading the data and evaluating alerting rules, VictoriaMetrics supports the ### Config -VictoriaMetrics configuration is located at `/etc/victoriametrics/single/scrape.yml` on the droplet. +VictoriaMetrics configuration is located at `/etc/victoriametrics/single/scrape.yml` on the droplet. This One Click app uses 8428, 2003, 4242 and 8089 ports to accept metrics from different protocols. It's recommended to disable ports for protocols which are not needed. [Ubuntu firewall](https://help.ubuntu.com/community/UFW) can be used to easily disable access for specific ports. ### Scraping metrics @@ -26,6 +26,7 @@ VictoriaMetrics supports metrics scraping in the same way as Prometheus does. Ch ### Sending metrics Besides scraping, VictoriaMetrics accepts write requests for various ingestion protocols. This One Click app supports the following protocols: + - [Datadog](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-send-data-from-datadog-agent), [Influx (telegraph)](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-send-data-from-influxdb-compatible-agents-such-as-telegraf), [JSON](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-import-data-in-json-line-format), [CSV](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-import-csv-data), [Prometheus](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-import-data-in-prometheus-exposition-format) on port :8428 - [Graphite (statsd)](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-send-data-from-graphite-compatible-agents-such-as-statsd) on port :2003 tcp/udp - [OpenTSDB](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-send-data-from-opentsdb-compatible-agents) on port :4242 @@ -51,4 +52,4 @@ Once the Droplet is created, you can use DigitalOcean's web console to start a s ```bash ssh root@your_droplet_public_ipv4 -``` \ No newline at end of file +``` diff --git a/docs/Articles.md b/docs/Articles.md index 9da4188f4..5eb94a845 100644 --- a/docs/Articles.md +++ b/docs/Articles.md @@ -59,7 +59,6 @@ See also [case studies](https://docs.victoriametrics.com/CaseStudies.html). * [VictoriaMetrics — creating the best remote storage for Prometheus](https://faun.pub/victoriametrics-creating-the-best-remote-storage-for-prometheus-5d92d66787ac) * [Anomaly Detection in VictoriaMetrics](https://victoriametrics.medium.com/anomaly-detection-in-victoriametrics-9528538786a7) - ### Benchmarks * [When size matters — benchmarking VictoriaMetrics vs Timescale and InfluxDB](https://valyala.medium.com/when-size-matters-benchmarking-victoriametrics-vs-timescale-and-influxdb-6035811952d4) @@ -71,7 +70,6 @@ See also [case studies](https://docs.victoriametrics.com/CaseStudies.html). * [Prometheus vs VictoriaMetrics benchmark on node-exporter metrics](https://valyala.medium.com/prometheus-vs-victoriametrics-benchmark-on-node-exporter-metrics-4ca29c75590f) * [Promscale vs VictoriaMetrics: resource usage on production workload](https://valyala.medium.com/promscale-vs-victoriametrics-resource-usage-on-production-workload-91c8e3786c03) - ### Technical articles * [How VictoriaMetrics makes instant snapshots for multi-terabyte time series data](https://medium.com/@valyala/how-victoriametrics-makes-instant-snapshots-for-multi-terabyte-time-series-data-e1f3fb0e0282) @@ -84,7 +82,6 @@ See also [case studies](https://docs.victoriametrics.com/CaseStudies.html). * [Why irate from Prometheus doesn't capture spikes](https://valyala.medium.com/why-irate-from-prometheus-doesnt-capture-spikes-45f9896d7832) * [VictoriaMetrics: PromQL compliance](https://medium.com/@romanhavronenko/victoriametrics-promql-compliance-d4318203f51e) - ### Tutorials, guides and how-to articles * [PromQL tutorial for beginners and humans](https://valyala.medium.com/promql-tutorial-for-beginners-9ab455142085) @@ -97,7 +94,6 @@ See also [case studies](https://docs.victoriametrics.com/CaseStudies.html). * [How to monitor Go applications with VictoriaMetrics](https://victoriametrics.medium.com/how-to-monitor-go-applications-with-victoriametrics-c04703110870) * [Prometheus storage: tech terms for humans](https://valyala.medium.com/prometheus-storage-technical-terms-for-humans-4ab4de6c3d48) - ### Other articles * [How ClickHouse inspired us to build a high performance time series database](https://www.youtube.com/watch?v=p9qjb_yoBro). See also [slides](https://docs.google.com/presentation/d/1SdFrwsyR-HMXfbzrY8xfDZH_Dg6E7E5NJ84tQozMn3w/edit?usp=sharing). diff --git a/docs/BestPractices.md b/docs/BestPractices.md index be47c5275..46deb5b2f 100644 --- a/docs/BestPractices.md +++ b/docs/BestPractices.md @@ -4,25 +4,22 @@ sort: 19 # VictoriaMetrics best practices - ## Install Recommendation It is recommended running the latest available release of VictoriaMetrics from [this page](https://github.com/VictoriaMetrics/VictoriaMetrics/releases), since it contains all the bugfixes and enhancements. There is no need to tune VictoriaMetrics because it uses reasonable defaults for command-line flags. These flags are automatically adjusted for the available CPU and RAM resources. There is no need in Operating System tuning because VictoriaMetrics is optimized for default OS settings. The only option is to increase the limit on the [number of open files in the OS](https://medium.com/@muhammadtriwibowo/set-permanently-ulimit-n-open-files-in-ubuntu-4d61064429a), so VictoriaMetrics could accept more incoming connections and could keep open more data files. - ## Filesystem The recommended filesystem for VictoriaMetrics is [ext4](https://en.wikipedia.org/wiki/Ext4). If you plan to store more than 1TB of data on ext4 partition or plan to extend it to more than 16TB, then the following options are recommended to pass to mkfs.ext4: -``` +```sh mkfs.ext4 ... -O 64bit,huge_file,extent -T huge ``` VictoriaMetrics should work OK with other filesystems, including network filesystems such as [NFS](https://en.wikipedia.org/wiki/Network_File_System), [Amazon EFS](https://aws.amazon.com/efs/) and [Google Filestore](https://cloud.google.com/filestore). - ## Operation System VictoriaMetrics is production-ready for the following operating systems: @@ -35,7 +32,6 @@ Some VictoriaMetrics components ([vmagent](https://docs.victoriametrics.com/vmag VictoriaMetrics can run also on MacOS for testing and development purposes. - ## Upgrade procedure It is safe to upgrade VictoriaMetrics to new versions unless the [release notes](https://github.com/VictoriaMetrics/VictoriaMetrics/releases) say otherwise. It is safe to skip multiple versions during the upgrade unless release notes say otherwise. It is recommended to perform regular upgrades to the latest version, since it may contain important bug fixes, performance optimizations or new features. @@ -48,12 +44,10 @@ The following steps must be performed during the upgrade / downgrade procedure: * Wait until the process stops. This can take a few seconds. * Start the upgraded VictoriaMetrics. - ## Backup Recommendations VictoriaMetrics supports backups via [vmbackup](https://docs.victoriametrics.com/vmbackup.html) and [vmrestore](https://docs.victoriametrics.com/vmrestore.html) tools. There is also [vmbackupmanager](https://docs.victoriametrics.com/vmbackupmanager.html), which simplifies backup automation. - ## Technical Support and Services There are the following channels for providing technical support for VictoriaMetrics: diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index e40a4bf9e..228310d0f 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -5,6 +5,7 @@ sort: 15 # CHANGELOG The following tip changes can be tested by building VictoriaMetrics components from the latest commits according to the following docs: + * [How to build single-node VictoriaMetrics](https://docs.victoriametrics.com/#how-to-build-from-sources) * [How to build cluster version of VictoriaMetrics](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#building-from-sources) * [How to build vmagent](https://docs.victoriametrics.com/vmagent.html#how-to-build-from-sources) @@ -40,7 +41,6 @@ See other changes introduced to vmalert [here](https://github.com/VictoriaMetric * BUGFIX: reduce the interval for checking for free disk space from 30 seconds to 1 second. This should reduce the probability of `no space left on device` panics when `-storage.minFreeDiskSpaceBytes` is set to too low values. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2305). * BUGFIX: [vmagent](https://docs.victoriametrics.com/vmagent.html): prevent from panic at vmagent when importing a time series with big number of samples. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2335). Thanks to @bleedfish for discovering and fixing the issue. - ## [v1.74.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.74.0) Released at 03-03-2022 @@ -72,7 +72,6 @@ This rule is equivalent to less clear traditional one: * BUGFIX: properly handle [series selector](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors) containing a filter for multiple metric names plus a negative filter. For example, `{__name__=~"foo|bar",job!="baz"}` . Previously VictoriaMetrics could return series with `foo` or `bar` names and with `job="baz"`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2238). * BUGFIX: [vmgateway](https://docs.victoriametrics.com/vmgateway.html): properly parse JWT tokens if they are encoded with [URL-safe base64 encoding](https://datatracker.ietf.org/doc/html/rfc4648#section-5). - ## [v1.73.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.73.1) Released at 22-02-2022 @@ -94,7 +93,6 @@ Released at 22-02-2022 * BUGFIX: update default value for `-promscrape.fileSDCheckInterval`, so it matches default duration used by Prometheus for checking for updates in `file_sd_configs`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2187). Thanks to @corporate-gadfly for the fix. * BUGFIX: [VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html): do not return partial responses from `vmselect` if at least a single `vmstorage` node was reachable and returned an app-level error. Such errors are usually related to cluster mis-configuration, so they must be returned to the caller instead of being masked by [partial responses](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#cluster-availability). Partial responses can be returned only if some of `vmstorage` nodes are unreachable during the query. This may help the following issues: [one](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1941), [two](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/678). - ## [v1.73.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.73.0) Released at 14-02-2022 @@ -136,7 +134,6 @@ Released at 14-02-2022 * BUGFIX: vmagent: properly display `zone` contents for `gce_sd_configs` section at `http://vmagent:8429/config` page. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2179). Thanks to @artifactori for the bugfix. * BUGFIX: vmagent: properly handle `all_tenants: true` config option at `openstack_sd_config`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2182). - ## [v1.72.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.72.0) Released at 18-01-2022 @@ -178,12 +175,11 @@ Released at 18-01-2022 * BUGFIX: [vmui](https://docs.victoriametrics.com/#vmui): fix incorrect calculations for graph limits on y axis. This could result in incorrect graph rendering in some cases. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2037). * BUGFIX: [vmui](https://docs.victoriametrics.com/#vmui): fix handling for multi-line queries. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2039). - ## [v1.71.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.71.0) Released at 20-12-2021 -**Update notes:** deduplication logic was slightly changed on the release, which may cause extra +**Update notes:** deduplication logic was slightly changed on the release, which may cause extra [background merges](https://medium.com/@valyala/how-victoriametrics-makes-instant-snapshots-for-multi-terabyte-time-series-data-e1f3fb0e0282) for already existing data parts for installations with `-dedup.minScrapeInterval` flag value greater than 0. This process is intentionally limited by one CPU core, but still can result into increase of CPU usage until merges are finished. @@ -212,7 +208,6 @@ We recommend updating in "off-peak" time when load on the VictoriaMetrics is on * BUGFIX: de-duplicate data exported via [/api/v1/export/csv](https://docs.victoriametrics.com/#how-to-export-csv-data) by default if [deduplication](https://docs.victoriametrics.com/#deduplication) is enabled. The de-duplication can be disabled by passing `reduce_mem_usage=1` query arg to `/api/v1/export/csv`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1837). * BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): properly store [historical data](https://docs.victoriametrics.com/vmalert.html#rules-backfilling) to old Prometheus versions. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1943). - ## [v1.70.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.70.0) Released at 02-12-2021 @@ -242,7 +237,6 @@ Released at 02-12-2021 * BUGFIX: [vmui](https://docs.victoriametrics.com/#vmui): do not store the last query across vmui page reloads. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1694). * BUGFIX: [vmui](https://docs.victoriametrics.com/#vmui): fix `Cannot read properties of undefined` error at table view. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1797). - ## [v1.69.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.69.0) Released at 08-11-2021 @@ -265,7 +259,6 @@ Released at 08-11-2021 * BUGFIX: vmagent: properly display `proxy_url` config option at `http://vmagent:8429/config` page. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1755). * BUGFIX: fix tests for Apple M1. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1653). - ## [v1.68.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.68.0) Released at 22-10-2021 @@ -294,7 +287,6 @@ Released at 22-10-2021 * BUGFIX: vmagent: group scrape targets by the original job names at `http://vmagent:8429/targets` page like Prometheus does. Previously they were grouped by the job name after relabeling, which may result in unexpected empty target groups. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1707). * BUGFIX: [vmctl](https://docs.victoriametrics.com/vmctl.html): fix importing boolean fields from InfluxDB line protocol. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1709). - ## [v1.67.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.67.0) Released at 08-10-2021 @@ -312,7 +304,6 @@ Released at 08-10-2021 * BUGFIX: return proper values (zeroes) from [stddev_over_time](https://docs.victoriametrics.com/MetricsQL.html#stddev_over_time) and [stdvar_over_time](https://docs.victoriametrics.com/MetricsQL.html#stdvar_over_time) functions when the lookbehind window in square brackets contains only a single sample. Previously the sample value was incorrectly returned in this case. * BUGFIX: vminsert: fix uneven distribution of time series among storage nodes in [multi-level cluster setup](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#multi-level-cluster-setup). See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1672). - ## [v1.66.2](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.66.2) Released at 23-09-2021 @@ -322,7 +313,6 @@ Released at 23-09-2021 * BUGFIX: vmalert: properly reload rule groups if only the `interval` config option is changed. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1641). * BUGFIX: properly handle `{__name__=~"prefix(suffix1|suffix2)",other_label="..."}` queries. They may return unexpected empty responses since v1.66.0. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1644). - ## [v1.66.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.66.1) Released at 22-09-2021 @@ -332,7 +322,6 @@ Released at 22-09-2021 * BUGFIX: vmselect: fix accessing [Graphite APIs](https://docs.victoriametrics.com/#graphite-api-usage). The access has been broken in v1.66.0, because `/graphite/*` path prefix accidentally clashed with `/graph*` path prefix used for VictoriaMetrics UI (aka `vmui`). * BUGFIX: fix parsing `regex: ` in relabeling rules (for example, `regex: true` or `regex: 123`). The bug has been introduced in v1.66.0. - ## [v1.66.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.66.0) Released at 20-09-2021 @@ -370,7 +359,6 @@ Released at 20-09-2021 * BUGFIX: fix non-repeatable results from `quantile_over_time()` function when the number of input samples exceeds 1000. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1612). * BUGFIX: vmagent: fix EC2 zone discovery when `filters` are specified in [ec2_sc_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config). See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1626). - ## [v1.65.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.65.0) Released at 01-09-2021 @@ -395,7 +383,6 @@ Released at 01-09-2021 * BUGFIX: [vmbackupmanager](https://docs.victoriametrics.com/vmbackupmanager.html): fix timeout error when snapshot takes longer than 10 seconds. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1571). * BUGFIX: properly parse OpenTSDB `put` messages with multiple spaces between message elements. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1574). Thanks to @envzhu for the fix. - ## [v1.64.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.64.1) Released at 19-08-2021 @@ -410,7 +397,6 @@ Released at 19-08-2021 * BUGFIX: upgrade base Docker image from Alpine 3.14.0 to Alpine 3.14.1 . This fixes potential security issues - see [Alpine 3.14.1 release notes](https://www.alpinelinux.org/posts/Alpine-3.14.1-released.html). * BUGFIX: disable overriding the lookbehind window `[d]` at `last_over_time(m[d])` if `d` is smaller than the interval between samples, since users don't expect implicit overriding of explicitly set `[d]` in `last_over_time(m[d])`. - ## [v1.64.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.64.0) Released at 15-08-2021 @@ -437,7 +423,6 @@ Released at 15-08-2021 * BUGFIX: vmui: fix layout when the query selects more than 27 time series. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1497). * BUGFIX: vmagent: restore highlighting in red for DOWN targets at `/targets` page. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1461). - ## [v1.63.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.63.0) Released at 15-07-2021 @@ -459,7 +444,6 @@ Released at 15-07-2021 * BUGFIX: vmalert: accept Prometheus-like durations in `interval` config option inside `group` section. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1444). * BUGFIX: properly update `vm_merge_need_free_disk_space` metric at `/metrics` page when there is no enough free disk space for performing optimal merges. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1373). - ## [v1.62.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.62.0) Released at 25-06-2021 @@ -483,7 +467,6 @@ Released at 25-06-2021 * BUGFIX: vmselect: return the last timestamp for the max / min value from `tmax_over_time(m[d])` and `tmin_over_time(m[d])` [MetricsQL functions](https://docs.victoriametrics.com/MetricsQL.html) as most users expect. See also [this issue](https://github.com/prometheus/prometheus/issues/8966). * BUGFIX: vmselect: return the expected value for `increase_pure()` [MetricsQL function](https://docs.victoriametrics.com/MetricsQL.html) after a gap in a time series. Previously incorrect too big value could be returned after the gap from `increase_pure()`. - ## [v1.61.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.61.1) Released at 11-06-2021 @@ -491,7 +474,6 @@ Released at 11-06-2021 * BUGFIX: vmalert: fix recording rules, which were broken in v1.61.0. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1369). * BUGFIX: reset the on-disk cache for mapping from the full metric name to an internal metric id (e.g. `metric_name{labels} -> internal_metric_id`) after deleting metrics via [delete API](https://docs.victoriametrics.com/#how-to-delete-time-series). This should prevent from possible inconsistent state after unclean shutdown. This [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1347). - ## [v1.61.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.61.0) Released at 09-06-2021 @@ -510,7 +492,6 @@ Released at 09-06-2021 * BUGFIX: vmauth: do not panic on aborted http requests. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1353). * BUGFIX: properly generate `target` property for `*Series(foo.*.bar)` responses returned from [Graphite Render API](https://docs.victoriametrics.com/#graphite-render-api-usage). Previously the `target` contained the expanded list of series for `foo.*.bar`, e.g. `sumSeries(foo.a.bar,foo.b.bar,...foo.z.bar)`. Now VictoriaMetrics returns `sumSeries(foo.*.bar)` as a target in the same way as Graphite does. - ## [v1.60.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.60.0) Released at 24-05-2021 @@ -547,7 +528,6 @@ Released at 24-05-2021 * BUGFIX: vmalert: properly import default rules from OpenShift. See [this issue](https://github.com/VictoriaMetrics/operator/issues/243). * BUGFIX: reduce the probability of `the removal queue is full` panic when highly loaded VictoriaMetrics stores data on NFS. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1313). - ## [v1.59.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.59.0) Released at 01-05-2021 @@ -565,7 +545,6 @@ Thanks to @johnseekins! * BUGFIX: vmagent: eliminate possible data race when obtaining value for the metric `vm_persistentqueue_bytes_pending`. The data race could result in incorrect value for this metric. * BUGFIX: vmstorage: remove empty directories on startup. Such directories can be left after unclean shutdown on NFS storage. Previously such directories could lead to crashloop until manually removed. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1142). - ## [v1.58.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.58.0) Released at 08-04-2021 @@ -593,7 +572,6 @@ Released at 08-04-2021 * BUGFIX: vmagent: properly discover `role: endpoints` and `role: endpointslices` targets in `kubernetes_sd_config`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1182). * BUGFIX: properly generate filename for `*.tar.gz` archive inside `_checksums.txt` file posted at [releases page](https://github.com/VictoriaMetrics/VictoriaMetrics/releases). See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1171). - ## [v1.57.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.57.1) Released at 30-03-2021 @@ -604,7 +582,6 @@ Released at 30-03-2021 * BUGFIX: vmselect: remove `-search.storageTimeout` command-line flag, since it has the same meaning as `-search.maxQueryDuration`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/711#issuecomment-808884995). * BUGFIX: vminsert: return back `type` label to per-tenant metric `vm_tenant_inserted_rows_total`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/932). - ## [v1.57.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.57.0) Released at 29-03-2021 @@ -624,20 +601,19 @@ Released at 29-03-2021 * BUGFIX: prevent from infinite loop on `{__graphite__="..."}` filters when a metric name contains `*`, `{` or `[` chars. * BUGFIX: prevent from infinite loop in `/metrics/find` and `/metrics/expand` [Graphite Metrics API handlers](https://docs.victoriametrics.com/#graphite-metrics-api-usage) when they match metric names or labels with `*`, `{` or `[` chars. -* BUGFIX: do not merge duplicate time series during requests to `/api/v1/query`. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1141 -* BUGFIX: vmagent: properly handle `too old resource version` error messages from Kubernetes watch API. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1150 -* BUGFIX: vmagent: do not retry sending data blocks if remote storage returns `400 Bad Request` error. The number of dropped blocks due to such errors can be monitored with `vmagent_remotewrite_packets_dropped_total` metrics. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1149 +* BUGFIX: do not merge duplicate time series during requests to `/api/v1/query`. See +* BUGFIX: vmagent: properly handle `too old resource version` error messages from Kubernetes watch API. See +* BUGFIX: vmagent: do not retry sending data blocks if remote storage returns `400 Bad Request` error. The number of dropped blocks due to such errors can be monitored with `vmagent_remotewrite_packets_dropped_total` metrics. See * BUGFIX: properly calculate `summarize` and `*Series` functions in [Graphite Render API](https://docs.victoriametrics.com/#graphite-render-api-usage). - ## [v1.56.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.56.0) Released at 17-03-2021 * FEATURE: add the following functions to [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html): - - `histogram_avg(buckets)` - returns the average value for the given buckets. - - `histogram_stdvar(buckets)` - returns standard variance for the given buckets. - - `histogram_stddev(buckets)` - returns standard deviation for the given buckets. + * `histogram_avg(buckets)` - returns the average value for the given buckets. + * `histogram_stdvar(buckets)` - returns standard variance for the given buckets. + * `histogram_stddev(buckets)` - returns standard deviation for the given buckets. * FEATURE: export `vm_available_memory_bytes` and `vm_available_cpu_cores` metrics, which show the number of available RAM and available CPU cores for VictoriaMetrics apps. * FEATURE: export `vm_index_search_duration_seconds` histogram, which can be used for troubleshooting time series search performance. * FEATURE: vmagent: add ability to replicate scrape targets among `vmagent` instances in the cluster with `-promscrape.cluster.replicationFactor` command-line flag. See [these docs](https://docs.victoriametrics.com/vmagent.html#scraping-big-number-of-targets). @@ -651,23 +627,21 @@ Released at 17-03-2021 * FEATURE: listen for IPv6 UDP if `-enableTCP6` command-line flag is passed to VictoriaMetrics. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1131). * BUGFIX: vmagent: prevent from high CPU usage bug during failing scrapes with small `scrape_timeout` (less than a few seconds). -* BUGFIX: vmagent: reduce memory usage when Kubernetes service discovery is used in big number of distinct scrape config jobs by sharing Kubernetes object cache. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1113 +* BUGFIX: vmagent: reduce memory usage when Kubernetes service discovery is used in big number of distinct scrape config jobs by sharing Kubernetes object cache. See * BUGFIX: vmagent: apply `sample_limit` only after `metric_relabel_configs` are applied as Prometheus does. Previously the `sample_limit` was applied before metrics relabeling. -* BUGFIX: vmagent: properly apply `tls_config`, `basic_auth` and `bearer_token` to proxy connections if `proxy_url` option is set. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1116 -* BUGFIX: vmagent: properly scrape targets via https proxy specified in `proxy_url` if `insecure_skip_verify` flag isn't set in `tls_config` section. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1116 +* BUGFIX: vmagent: properly apply `tls_config`, `basic_auth` and `bearer_token` to proxy connections if `proxy_url` option is set. See +* BUGFIX: vmagent: properly scrape targets via https proxy specified in `proxy_url` if `insecure_skip_verify` flag isn't set in `tls_config` section. See * BUGFUX: avoid `duplicate time series` error if `prometheus_buckets()` covers a time range with distinct set of buckets. -* BUGFIX: prevent exponent overflow when processing extremely small values close to zero such as `2.964393875E-314`. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1114 +* BUGFIX: prevent exponent overflow when processing extremely small values close to zero such as `2.964393875E-314`. See * BUGFIX: do not include datapoints with a timestamp `t-d` when returning results from `/api/v1/query?query=m[d]&time=t` as Prometheus does. * BUGFIX: do not crash if a query contains `histogram_over_time()` function name with uppercase chars. For example, `Histogram_Over_Time(m[5m])`. - ## [v1.55.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.55.1) Released at 03-03-2021 -* BUGFIX: vmagent: fix a panic in Kubernetes service discovery when a target is filtered out with relabeling. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1107 -* BUGFIX: vmagent: fix Kubernetes service discovery for `role: ingress`. See https://github.com/VictoriaMetrics/VictoriaMetrics/pull/1110 - +* BUGFIX: vmagent: fix a panic in Kubernetes service discovery when a target is filtered out with relabeling. See +* BUGFIX: vmagent: fix Kubernetes service discovery for `role: ingress`. See ## [v1.55.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.55.0) @@ -693,26 +667,24 @@ Released at 02-03-2021 * FEATURE: vmalert: properly process query params in `-datasource.url` and `-remoteRead.url` command-line flags. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1087) for details. * BUGFIX: vmagent: properly apply `-remoteWrite.rateLimit` when `-remoteWrite.queues` is greater than 1. Previously there was a data race, which could prevent from proper rate limiting. -* BUGFIX: vmagent: properly perform graceful shutdown on `SIGINT` and `SIGTERM` signals. The graceful shutdown has been broken in `v1.54.0`. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1065 +* BUGFIX: vmagent: properly perform graceful shutdown on `SIGINT` and `SIGTERM` signals. The graceful shutdown has been broken in `v1.54.0`. See * BUGFIX: reduce the probability of `duplicate time series` errors when querying Kubernetes metrics. * BUGFIX: properly calculate `histogram_quantile()` over time series with only a single non-zero bucket with `{le="+Inf"}`. Previously `NaN` was returned, now the value for the last bucket before `{le="+Inf"}` is returned like Prometheus does. -* BUGFIX: vmselect: do not cache partial query results on timeout when receiving data from `vmstorage` nodes. See https://github.com/VictoriaMetrics/VictoriaMetrics/pull/1085 +* BUGFIX: vmselect: do not cache partial query results on timeout when receiving data from `vmstorage` nodes. See * BUGFIX: properly handle `stale NFS file handle` error. -* BUGFIX: properly cache query results when `extra_label` query arg is used. Previously the cached results could clash for different `extra_label` values. See https://github.com/VictoriaMetrics/VictoriaMetrics/pull/1095 -* BUGFIX: fix `http: superfluous response.WriteHeader call` issue. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1078 -* BUGFIX: fix arm64 builds due to the issue in `github.com/golang/snappy`. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1074 -* BUGFIX: fix `index out of range [1024819115206086200] with length 27` panic, which could occur when `1e-9` value is passed to VictoriaMetrics histogram. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1096 -* BUGFIX: fix parsing for Graphite line with empty tags such as `foo; 123 456`. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1100 +* BUGFIX: properly cache query results when `extra_label` query arg is used. Previously the cached results could clash for different `extra_label` values. See +* BUGFIX: fix `http: superfluous response.WriteHeader call` issue. See +* BUGFIX: fix arm64 builds due to the issue in `github.com/golang/snappy`. See +* BUGFIX: fix `index out of range [1024819115206086200] with length 27` panic, which could occur when `1e-9` value is passed to VictoriaMetrics histogram. See +* BUGFIX: fix parsing for Graphite line with empty tags such as `foo; 123 456`. See * BUGFIX: unescape only `\\`, `\n` and `\"` in label names when parsing Prometheus text exposition format as Prometheus does. Previously other escape sequences could be improperly unescaped. - ## [v1.54.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.54.1) Released at 18-02-2021 * BUGFIX: properly handle queries containing a filter on metric name plus any number of negative filters and zero non-negative filters. For example, `node_cpu_seconds_total{mode!="idle"}`. The bug was introduced in [v1.54.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.54.0). - ## [v1.54.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.54.0) Released at 18-02-2021 @@ -721,20 +693,19 @@ Released at 18-02-2021 * FEATURE: reduce execution times for `q1 q2` queries by executing `q1` and `q2` in parallel. * FEATURE: switch from Go1.15 to [Go1.16](https://golang.org/doc/go1.16) for building prod binaries. * FEATURE: single-node VictoriaMetrics now accepts requests to handlers with `/prometheus` and `/graphite` prefixes such as `/prometheus/api/v1/query`. This improves compatibility with [handlers from VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format). -* FEATURE: expose `process_open_fds` and `process_max_fds` metrics. These metrics can be used for alerting when `process_open_fds` reaches `process_max_fds`. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/402 and https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1037 +* FEATURE: expose `process_open_fds` and `process_max_fds` metrics. These metrics can be used for alerting when `process_open_fds` reaches `process_max_fds`. See and * FEATURE: vmalert: add `-datasource.appendTypePrefix` command-line option for querying both Prometheus and Graphite datasource in cluster version of VictoriaMetrics. See [these docs](https://docs.victoriametrics.com/vmalert.html#graphite) for details. -* FEATURE: vmauth: add ability to route requests from a single user to multiple destinations depending on the requested paths. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1064 +* FEATURE: vmauth: add ability to route requests from a single user to multiple destinations depending on the requested paths. See * FEATURE: remove dependency on external programs such as `cat`, `grep` and `cut` when detecting cpu and memory limits inside Docker or LXC container. * FEATURE: vmagent: add `__meta_kubernetes_endpoints_label_*`, `__meta_kubernetes_endpoints_labelpresent_*`, `__meta_kubernetes_endpoints_annotation_*` and `__meta_kubernetes_endpoints_annotationpresent_*` labels for `role: endpoints` in Kubernetes service discovery. These labels where added in Prometheus 2.25. * FEATURE: reduce the minimum supported retention period for inverted index (aka `indexdb`) from one month to one day. This should reduce disk space usage for `<-storageDataPath>/indexdb` folder if `-retentionPeriod` is set to values smaller than one month. -* FEATURE: vmselect: export per-tenant metrics `vm_vmselect_http_requests_total` and `vm_vmselect_http_requests_duration_ms_total` . Other per-tenant metrics are available as a part of [enterprise package](https://victoriametrics.com/products/enterprise/). See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/932 for details. +* FEATURE: vmselect: export per-tenant metrics `vm_vmselect_http_requests_total` and `vm_vmselect_http_requests_duration_ms_total` . Other per-tenant metrics are available as a part of [enterprise package](https://victoriametrics.com/products/enterprise/). See for details. * BUGFIX: properly convert regexp tag filters containing escaped dots to non-regexp tag filters. For example, `{foo=~"bar\.baz"}` should be converted to `{foo="bar.baz"}`. Previously it was incorrectly converted to `{foo="bar\.baz"}`, which could result in missing time series for this tag filter. -* BUGFIX: do not spam error logs when discovering Docker Swarm targets without dedicated IP. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1028 . +* BUGFIX: do not spam error logs when discovering Docker Swarm targets without dedicated IP. See . * BUGFIX: properly embed timezone data into VictoriaMetrics apps. This should fix `-loggerTimezone` usage inside Docker containers. * BUGFIX: properly build Docker images for non-amd64 architectures (arm, arm64, ppc64le, 386) on [Docker hub](https://hub.docker.com/u/victoriametrics/). Previously these images were incorrectly based on amd64 base image, so they didn't work. -* BUGFIX: vmagent: return back unsent block to the queue during graceful shutdown. Previously this block could be dropped if remote storage is unavailable during vmagent shutdown. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1065 . - +* BUGFIX: vmagent: return back unsent block to the queue during graceful shutdown. Previously this block could be dropped if remote storage is unavailable during vmagent shutdown. See . ## [v1.53.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.53.1) @@ -742,7 +713,6 @@ Released at 03-02-2021 * BUGFIX: vmselect: fix the bug peventing from proper searching by Graphite filter with wildcards such as `{__graphite__="foo.*.bar"}`. - ## [v1.53.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.53.0) Released at 03-02-2021 @@ -752,24 +722,23 @@ Released at 03-02-2021 * FEATURE: added `-search.maxStepForPointsAdjustment` command-line flag, which can be used for disabling adjustment for points returned by `/api/v1/query_range` handler if such points have timestamps closer than `-search.latencyOffset` to the current time. Such points may contain incomplete data, so they are substituted by the previous values for `step` query args smaller than one minute by default. * FEATURE: vmselect: added ability to use Graphite-compatible filters in MetricsQL via `{__graphite__="foo.*.bar"}` syntax. This expression is equivalent to `{__name__=~"foo[.][^.]*[.]bar"}`, but it works faster and it is easier to use when migrating from Graphite to VictoriaMetrics. This feature deprecates the usage of `-search.treatDotsAsIsInRegexps` command-line flag. * FEATURE: vmselect: added ability to set additional label filters, which must be applied during queries. Such label filters can be set via optional `extra_label` query arg, which is accepted by [querying API](https://docs.victoriametrics.com/#prometheus-querying-api-usage) handlers. For example, the request to `/api/v1/query_range?extra_label=tenant_id=123&query=` adds `{tenant_id="123"}` label filter to the given ``. It is expected that the `extra_label` query arg is automatically set by auth proxy sitting -in front of VictoriaMetrics. [Contact us](mailto:sales@victoriametrics.com) if you need assistance with such a proxy. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1021 . -* FEATURE: vmalert: added `-datasource.queryStep` command-line flag for passing optional `step` query arg to `/api/v1/query` endpoint. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1025 +in front of VictoriaMetrics. [Contact us](mailto:sales@victoriametrics.com) if you need assistance with such a proxy. See . +* FEATURE: vmalert: added `-datasource.queryStep` command-line flag for passing optional `step` query arg to `/api/v1/query` endpoint. See * FEATURE: vmalert: added ability to query Graphite datasource when evaluating alerting and recording rules. See [these docs](https://docs.victoriametrics.com/vmalert.html#graphite) for details. * FEATURE: vmagent: added `-remoteWrite.roundDigits` command-line option for rounding metric values to the given number of decimal digits after the point before sending the metric to the corresponding `-remoteWrite.url`. This option can be used for improving data compression on the remote storage, because values with lower number of decimal digits can be compressed better than values with bigger number of decimal digits. -* FEATURE: vmagent: added `-remoteWrite.rateLimit` command-line flag for limiting data transfer rate to `-remoteWrite.url`. This may be useful when big amounts of buffered data is sent after temporarily unavailability of the remote storage. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1035 +* FEATURE: vmagent: added `-remoteWrite.rateLimit` command-line flag for limiting data transfer rate to `-remoteWrite.url`. This may be useful when big amounts of buffered data is sent after temporarily unavailability of the remote storage. See * FEATURE: vmagent: export the following additional metrics, which may be useful during troubleshooting: - - `vm_promscrape_scrapes_failed_per_url_total` - - `vm_promscrape_scrapes_skipped_by_sample_limit_per_url_total` - - `vm_promscrape_discovery_requests_total` - - `vm_promscrape_discovery_retries_total` - - `vm_promscrape_scrape_retries_total` - - `vm_promscrape_service_discovery_duration_seconds` + * `vm_promscrape_scrapes_failed_per_url_total` + * `vm_promscrape_scrapes_skipped_by_sample_limit_per_url_total` + * `vm_promscrape_discovery_requests_total` + * `vm_promscrape_discovery_retries_total` + * `vm_promscrape_scrape_retries_total` + * `vm_promscrape_service_discovery_duration_seconds` * FEATURE: vmselect: initial implementation for [Graphite Render API](https://docs.victoriametrics.com/#graphite-render-api-usage). * BUGFIX: vmagent: reduce HTTP reconnection rate for scrape targets. Previously vmagent could errorneusly close HTTP keep-alive connections more frequently than needed. * BUGFIX: vmagent: retry scrape and service discovery requests when the remote server closes HTTP keep-alive connection. Previously `disable_keepalive: true` option could be used under `scrape_configs` section when working with such servers. - ## [v1.52.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.52.0) Released at 13-01-2021 @@ -777,34 +746,32 @@ Released at 13-01-2021 * FEATURE: provide a sample list of alerting rules for VictoriaMetrics components. It is available [here](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/deployment/docker/alerts.yml). * FEATURE: disable final merge for data for the previous month at the beginning of new month, since it may result in high disk IO and CPU usage. Final merge can be enabled by setting `-finalMergeDelay` command-line flag to positive duration. * FEATURE: add `tfirst_over_time(m[d])` and `tlast_over_time(m[d])` functions to [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html) for returning timestamps for the first and the last data point in `m` over `d` duration. -* FEATURE: add ability to pass multiple labels to `sort_by_label()` and `sort_by_label_desc()` functions. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/992 . +* FEATURE: add ability to pass multiple labels to `sort_by_label()` and `sort_by_label_desc()` functions. See . * FEATURE: enforce at least TLS v1.2 when accepting HTTPS requests if `-tls`, `-tlsCertFile` and `-tlsKeyFile` command-line flags are set, because older TLS protocols such as v1.0 and v1.1 have been deprecated due to security vulnerabilities. * FEATURE: support `extra_label` query arg for all HTTP-based [data ingestion protocols](https://docs.victoriametrics.com/#how-to-import-time-series-data). This query arg can be used for specifying extra labels which should be added for the ingested data. -* FEATURE: vmbackup: increase backup chunk size from 128MB to 1GB. This should reduce the number of Object storage API calls during backups by 8x. This may also reduce costs, since object storage API calls usually have non-zero costs. See https://aws.amazon.com/s3/pricing/ and https://cloud.google.com/storage/pricing#operations-pricing . +* FEATURE: vmbackup: increase backup chunk size from 128MB to 1GB. This should reduce the number of Object storage API calls during backups by 8x. This may also reduce costs, since object storage API calls usually have non-zero costs. See and . -* BUGFIX: properly parse escaped unicode chars in MetricsQL metric names, label names and function names. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/990 +* BUGFIX: properly parse escaped unicode chars in MetricsQL metric names, label names and function names. See * BUGFIX: override user-provided labels with labels set in `extra_label` query args during data ingestion over HTTP-based protocols. -* BUGFIX: vmagent: prevent from `dialing to the given TCP address time out` error when scraping big number of unavailable targets. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/987 +* BUGFIX: vmagent: prevent from `dialing to the given TCP address time out` error when scraping big number of unavailable targets. See * BUGFIX: vmagent: properly show scrape duration on `/targets` page. Previously it was incorrectly shown as 0.000s. -* BUGFIX: vmagent: properly log errors when `-promscrape.streamParse` command-line flag is set. See https://github.com/VictoriaMetrics/VictoriaMetrics/pull/1009 -* BUGFIX: vmagent: properly suppress errors when both `-promscrape.suppressScrapeErrors` and `-promscrape.streamParse` command-line flags are set. See https://github.com/VictoriaMetrics/VictoriaMetrics/pull/1009 . -* BUGFIX: vmalert: return non-empty result in template func `query` stub to pass validation. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/989 . -* BUGFIX: upgrade base image for Docker packages from Alpine 3.12.1 to Alpine 3.12.3 in order to fix potential security issues. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1010 - +* BUGFIX: vmagent: properly log errors when `-promscrape.streamParse` command-line flag is set. See +* BUGFIX: vmagent: properly suppress errors when both `-promscrape.suppressScrapeErrors` and `-promscrape.streamParse` command-line flags are set. See . +* BUGFIX: vmalert: return non-empty result in template func `query` stub to pass validation. See . +* BUGFIX: upgrade base image for Docker packages from Alpine 3.12.1 to Alpine 3.12.3 in order to fix potential security issues. See ## [v1.51.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.51.0) Released at 27-12-2020 -* FEATURE: add `/api/v1/status/top_queries` handler, which returns the most frequently executed queries and queries that took the most time for execution. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/907 -* FEATURE: vmagent: add support for `proxy_url` config option in Prometheus scrape configs. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/503 +* FEATURE: add `/api/v1/status/top_queries` handler, which returns the most frequently executed queries and queries that took the most time for execution. See +* FEATURE: vmagent: add support for `proxy_url` config option in Prometheus scrape configs. See * FEATURE: remove parts with stale data as soon as they go outside the configured `-retentionPeriod`. Previously such parts may remain active for long periods of time. This should help reducing disk usage for `-retentionPeriod` smaller than one month. * FEATURE: vmalert: allow setting multiple values for `-notifier.tlsInsecureSkipVerify` command-line flag per each `-notifier.url`. -* BUGFIX: vmalert: properly escape multiline queries when passing them to Grafana. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/890 -* BUGFIX: vmagent: set missing `__meta_kubernetes_service_*` labels in `kubernetes_sd_config` for `endpoints` and `endpointslices` roles. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/982 -* BUGFIX: do not adjust `offset` value provided in MetricsQL query. Previously it could be modified in order to improve response cache hit ratio. This is unneeded, since cache hit ratio should remain good because the query time range should be already aligned to multiple of `step` values. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/976 - +* BUGFIX: vmalert: properly escape multiline queries when passing them to Grafana. See +* BUGFIX: vmagent: set missing `__meta_kubernetes_service_*` labels in `kubernetes_sd_config` for `endpoints` and `endpointslices` roles. See +* BUGFIX: do not adjust `offset` value provided in MetricsQL query. Previously it could be modified in order to improve response cache hit ratio. This is unneeded, since cache hit ratio should remain good because the query time range should be already aligned to multiple of `step` values. See ## [v1.50.2](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.50.2) @@ -812,10 +779,9 @@ Released at 19-12-2020 * FEATURE: do not publish duplicate Docker images with `-cluster` tag suffix for [vmagent](https://docs.victoriametrics.com/vmagent.html), [vmalert](https://docs.victoriametrics.com/vmalert.html), [vmauth](https://docs.victoriametrics.com/vmauth.html), [vmbackup](https://docs.victoriametrics.com/vmbackup.html) and [vmrestore](https://docs.victoriametrics.com/vmrestore.html), since they are identical to images without `-cluster` tag suffix. -* BUGFIX: vmalert: properly populate template variables. This has been broken in v1.50.0. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/974 +* BUGFIX: vmalert: properly populate template variables. This has been broken in v1.50.0. See * BUGFIX: properly parse negative combined duration in MetricsQL such as `-1h3m4s`. It must be parsed as `-(1h + 3m + 4s)`. Prevsiously it was parsed as `-1h + 3m + 4s`. -* BUGFIX: properly parse lines in [Prometheus exposition format](https://github.com/prometheus/docs/blob/master/content/docs/instrumenting/exposition_formats.md) and in [OpenMetrics format](https://github.com/OpenObservability/OpenMetrics/blob/master/specification/OpenMetrics.md) with whitespace after the timestamp. For example, `foo 123 456 ## some comment here`. See https://github.com/VictoriaMetrics/VictoriaMetrics/pull/970 - +* BUGFIX: properly parse lines in [Prometheus exposition format](https://github.com/prometheus/docs/blob/master/content/docs/instrumenting/exposition_formats.md) and in [OpenMetrics format](https://github.com/OpenObservability/OpenMetrics/blob/master/specification/OpenMetrics.md) with whitespace after the timestamp. For example, `foo 123 456 ## some comment here`. See ## [v1.50.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.50.1) @@ -825,13 +791,12 @@ Released at 15-12-2020 * BUGFIX: vmagent: properly delete unregistered scrape targets from `/targets` and `/api/v1/targets` pages. They weren't deleted due to the bug in `v1.50.0`. - ## [v1.50.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.50.0) Released at 15-12-2020 * FEATURE: automatically reset response cache when samples with timestamps older than `now - search.cacheTimestampOffset` are ingested to VictoriaMetrics. This makes unnecessary disabling response cache during data backfilling or resetting it after backfilling is complete as described [in these docs](https://docs.victoriametrics.com/#backfilling). This feature applies only to single-node VictoriaMetrics. It doesn't apply to cluster version of VictoriaMetrics because `vminsert` nodes don't know about `vmselect` nodes where the response cache must be reset. -* FEATURE: vmalert: add `query`, `first` and `value` functions to alert templates. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/539 +* FEATURE: vmalert: add `query`, `first` and `value` functions to alert templates. See * FEATURE: vmagent: return user-friendly HTML page when requesting `/targets` page from web browser. The page is returned in the old plaintext format when requesting via curl or similar tool. * FEATURE: allow multiple whitespace chars between measurements, fields and timestamp when parsing InfluxDB line protocol. Though [InfluxDB line protocol](https://docs.influxdata.com/influxdb/v1.8/write_protocols/line_protocol_tutorial/) denies multiple whitespace chars between these entities, @@ -841,25 +806,24 @@ Released at 15-12-2020 per each service discovery type. * FEATURE: vmagent: allow setting per-`-remoteWrite.url` command-line flags for `-remoteWrite.sendTimeout` and `-remoteWrite.tlsInsecureSkipVerify`. -* BUGFIX: properly handle `*` and `[...]` inside curly braces in query passed to Graphite Metrics API. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/952 +* BUGFIX: properly handle `*` and `[...]` inside curly braces in query passed to Graphite Metrics API. See * BUGFIX: vmagent: fix memory leak when big number of targets is discovered via service discovery. -* BUGFIX: vmagent: properly pass `datacenter` filter to Consul API server. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/574#issuecomment-740454170 -* BUGFIX: properly handle CPU limits set on the host system or host container. The bugfix may result in lower memory usage on systems with CPU limits. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/946 -* BUGFIX: prevent from duplicate `name` tag returned from `/tags/autoComplete/tags` handler. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/942 -* BUGFIX: do not enable strict parsing for `-promscrape.config` if `-promscrape.config.dryRun` comand-line flag is set. Strict parsing can be enabled with `-promscrape.config.strictParse` command-line flag. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/944 -* BUGFIX: vminsert: properly update `vm_rpc_rerouted_rows_processed_total` metric. Previously it wasn't updated. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/955 -* BUGFIX: vmagent: properly recover when opening incorrectly stored persistent queue. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/964 -* BUGFIX: vmagent: properly handle scrape errors when stream parsing is enabled with `-promscrape.streamParse` command-line flag or with `stream_parse: true` per-target config option. Previously such errors weren't reported at `/targets` page. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/967 -* BUGFIX: assume the previous value is 0 when calculating `increase()` for the first point on the graph if its value doesn't exceed 100 and the delta between two first points equals to 0. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/962 - +* BUGFIX: vmagent: properly pass `datacenter` filter to Consul API server. See +* BUGFIX: properly handle CPU limits set on the host system or host container. The bugfix may result in lower memory usage on systems with CPU limits. See +* BUGFIX: prevent from duplicate `name` tag returned from `/tags/autoComplete/tags` handler. See +* BUGFIX: do not enable strict parsing for `-promscrape.config` if `-promscrape.config.dryRun` comand-line flag is set. Strict parsing can be enabled with `-promscrape.config.strictParse` command-line flag. See +* BUGFIX: vminsert: properly update `vm_rpc_rerouted_rows_processed_total` metric. Previously it wasn't updated. See +* BUGFIX: vmagent: properly recover when opening incorrectly stored persistent queue. See +* BUGFIX: vmagent: properly handle scrape errors when stream parsing is enabled with `-promscrape.streamParse` command-line flag or with `stream_parse: true` per-target config option. Previously such errors weren't reported at `/targets` page. See +* BUGFIX: assume the previous value is 0 when calculating `increase()` for the first point on the graph if its value doesn't exceed 100 and the delta between two first points equals to 0. See ## [v1.49.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.49.0) Released at 05-12-2020 -* FEATURE: optimize Consul service discovery speed when discovering big number of services. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/574 +* FEATURE: optimize Consul service discovery speed when discovering big number of services. See * FEATURE: add `label_uppercase(q, label1, ... labelN)` and `label_lowercase(q, label1, ... labelN)` function to [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html) - for uppercasing and lowercasing values for the given labels. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/936 + for uppercasing and lowercasing values for the given labels. See * FEATURE: add `count_eq_over_time(m[d], N)` and `count_ne_over_time(m[d], N)` for counting the number of samples for `m` over `d` that (equal / not equal) to `N`. * FEATURE: do not print usage info for all the command-line flags when incorrect command-line flag is passed. Previously it could be hard reading the error message about incorrect command-line flag because of too big usage info for all the flags. @@ -874,55 +838,55 @@ Released at 05-12-2020 * BUGFIX: return `nan` for `minute(m)` query when `m` equals to `nan` like Prometheus does. This applies to all the time-related functions such as `day_of_month`, `day_of_week`, `days_in_month`, `hour`, `month` and `year`. - ## [v1.48.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.48.0) Released at 26-11-2020 * FEATURE: added [Snap package for single-node VictoriaMetrics](https://snapcraft.io/victoriametrics). This simplifies installation under Ubuntu to a single command: + ```bash snap install victoriametrics ``` + * FEATURE: vmselect: add `-replicationFactor` command-line flag for reducing query duration when replication is enabled and a part of vmstorage nodes - are temporarily slow and/or temporarily unavailable. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/711 + are temporarily slow and/or temporarily unavailable. See * FEATURE: vminsert: export `vm_rpc_vmstorage_is_reachable` metric, which can be used for monitoring reachability of vmstorage nodes from vminsert nodes. -* FEATURE: vmagent: add [Netflix Eureka](https://github.com/Netflix/eureka) service discovery (aka [eureka_sd_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#eureka_sd_config)). See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/851 -* FEATURE: add `filters` option to `dockerswarm_sd_config` like Prometheus did in v2.23.0 - see https://github.com/prometheus/prometheus/pull/8074 +* FEATURE: vmagent: add [Netflix Eureka](https://github.com/Netflix/eureka) service discovery (aka [eureka_sd_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#eureka_sd_config)). See +* FEATURE: add `filters` option to `dockerswarm_sd_config` like Prometheus did in v2.23.0 - see * FEATURE: expose `__meta_ec2_ipv6_addresses` label for `ec2_sd_config` like Prometheus will do in the next release. -* FEATURE: add `-loggerWarnsPerSecondLimit` command-line flag for rate limiting of WARN messages in logs. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/905 +* FEATURE: add `-loggerWarnsPerSecondLimit` command-line flag for rate limiting of WARN messages in logs. See * FEATURE: apply `loggerErrorsPerSecondLimit` and `-loggerWarnsPerSecondLimit` rate limit per caller. I.e. log messages are suppressed if the same caller logs the same message - at the rate exceeding the given limit. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/905#issuecomment-729395855 + at the rate exceeding the given limit. See * FEATURE: add remoteAddr to slow query log in order to simplify identifying the client that sends slow queries to VictoriaMetrics. Slow query logging is controlled with `-search.logSlowQueryDuration` command-line flag. -* FEATURE: add `/tags/delSeries` handler from Graphite Tags API. See https://docs.victoriametrics.com/#graphite-tags-api-usage +* FEATURE: add `/tags/delSeries` handler from Graphite Tags API. See * FEATURE: log metric name plus all its labels when the metric timestamp is out of the configured retention. This should simplify detecting the source of metrics with unexpected timestamps. * FEATURE: add `-dryRun` command-line flag to single-node VictoriaMetrics in order to check config file pointed by `-promscrape.config`. * BUGFIX: properly parse Prometheus metrics with [exemplars](https://github.com/OpenObservability/OpenMetrics/blob/master/OpenMetrics.md#exemplars-1) such as `foo 123 ## {bar="baz"} 1`. * BUGFIX: properly parse "infinity" values in [OpenMetrics format](https://github.com/OpenObservability/OpenMetrics/blob/master/OpenMetrics.md#abnf). - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/924 - + See ## [v1.47.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.47.0) Released at 16-11-2020 * FEATURE: vmselect: return the original error from `vmstorage` node in query response if `-search.denyPartialResponse` is set. - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/891 + See * FEATURE: vmselect: add `"isPartial":{true|false}` field in JSON output for `/api/v1/*` functions from [Prometheus querying API](https://prometheus.io/docs/prometheus/latest/querying/api/). `"isPartial":true` is set if the response contains partial data because of a part of `vmstorage` nodes were unavailable during query processing. * FEATURE: improve performance for `/api/v1/series`, `/api/v1/labels` and `/api/v1/label//values` on time ranges exceeding one day. * FEATURE: vmagent: reduce memory usage when service discovery detects big number of scrape targets and the set of discovered targets changes over time. - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/825 + See * FEATURE: vmagent: add `-promscrape.dropOriginalLabels` command-line option, which can be used for reducing memory usage when scraping big number of targets. - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/825#issuecomment-724308361 for details. -* FEATURE: vmalert: explicitly set extra labels to alert entities. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/870 + See for details. +* FEATURE: vmalert: explicitly set extra labels to alert entities. See * FEATURE: add `-search.treatDotsAsIsInRegexps` command-line flag, which can be used for automatic escaping of dots in regexp label filters used in queries. For example, if `-search.treatDotsAsIsInRegexps` is set, then the query `foo{bar=~"aaa.bb.cc|dd.eee"}` is automatically converted to `foo{bar=~"aaa\\.bb\\.cc|dd\\.eee"}`. This may be useful for querying Graphite data. * FEATURE: consistently return text-based HTTP responses such as `plain/text` and `application/json` with `charset=utf-8`. - See https://github.com/VictoriaMetrics/VictoriaMetrics/pull/897 + See * FEATURE: update Go builder from v1.15.4 to v1.15.5. This should fix [these issues in Go](https://github.com/golang/go/issues?q=milestone%3AGo1.15.5+label%3ACherryPickApproved). * FEATURE: added `/internal/force_flush` http handler for flushing recently ingested data from in-memory buffers to persistent storage. See [troubleshooting docs](https://docs.victoriametrics.com/#troubleshooting) for more details. @@ -930,10 +894,9 @@ Released at 16-11-2020 See [these docs](https://docs.victoriametrics.com/#graphite-tags-api-usage) for details. * BUGFIX: do not return data points in the end of the selected time range for time series ending in the middle of the selected time range. - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/887 and https://github.com/VictoriaMetrics/VictoriaMetrics/issues/845 -* BUGFIX: remove spikes at the end of time series gaps for `increase()` or `delta()` functions. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/894 -* BUGFIX: vminsert: properly return HTTP 503 status code when all the vmstorage nodes are unavailable. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/896 - + See and +* BUGFIX: remove spikes at the end of time series gaps for `increase()` or `delta()` functions. See +* BUGFIX: vminsert: properly return HTTP 503 status code when all the vmstorage nodes are unavailable. See ## [v1.46.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.46.0) @@ -943,73 +906,73 @@ Released at 07-11-2020 * FEATURE: reduce memory usage when query touches big number of time series. * FEATURE: vmagent: reduce memory usage when `kubernetes_sd_config` discovers big number of scrape targets (e.g. hundreds of thousands) and the majority of these targets (99%) are dropped during relabeling. Previously labels for all the dropped targets were displayed at `/api/v1/targets` page. Now only up to `-promscrape.maxDroppedTargets` such - targets are displayed. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/878 for details. + targets are displayed. See for details. * FEATURE: vmagent: reduce memory usage when scraping big number of targets with big number of temporary labels starting with `__`. - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/825 + See * FEATURE: vmagent: add `/ready` HTTP endpoint, which returns 200 OK status code when all the service discovery has been initialized. - This may be useful during rolling upgrades. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/875 + This may be useful during rolling upgrades. See * BUGFIX: vmagent: eliminate data race when `-promscrape.streamParse` command-line is set. Previously this mode could result in scraped metrics with garbage labels. - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/825#issuecomment-723198247 for details. + See for details. * BUGFIX: properly calculate `topk_*` and `bottomk_*` functions from [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html) for time series with gaps. - See https://github.com/VictoriaMetrics/VictoriaMetrics/pull/883 - + See ## [v1.45.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.45.0) Released at 02-11-2020 * FEATURE: allow setting `-retentionPeriod` smaller than one month. I.e. `-retentionPeriod=3d`, `-retentionPeriod=2w`, etc. is supported now. - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/173 -* FEATURE: optimize more cases according to https://utcc.utoronto.ca/~cks/space/blog/sysadmin/PrometheusLabelNonOptimization . Now the following cases are optimized too: + See +* FEATURE: optimize more cases according to . Now the following cases are optimized too: * `rollup_func(foo{filters}[d]) op bar` -> `rollup_func(foo{filters}[d]) op bar{filters}` * `transform_func(foo{filters}) op bar` -> `transform_func(foo{filters}) op bar{filters}` * `num_or_scalar op foo{filters} op bar` -> `num_or_scalar op foo{filters} op bar{filters}` * FEATURE: improve time series search for queries with multiple label filters. I.e. `foo{label1="value", label2=~"regexp"}`. - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/781 + See * FEATURE: vmagent: add `stream parse` mode. This mode allows reducing memory usage when individual scrape targets expose tens of millions of metrics. For example, during scraping Prometheus in [federation](https://prometheus.io/docs/prometheus/latest/federation/) mode. See `-promscrape.streamParse` command-line option and `stream_parse: true` config option for `scrape_config` section in `-promscrape.config`. - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/825 and [troubleshooting docs for vmagent](https://docs.victoriametrics.com/vmagent.html#troubleshooting). + See and [troubleshooting docs for vmagent](https://docs.victoriametrics.com/vmagent.html#troubleshooting). * FEATURE: vmalert: add `-dryRun` command-line option for validating the provided config files without the need to start `vmalert` service. * FEATURE: accept optional third argument of string type at `topk_*` and `bottomk_*` functions. This is label name for additional time series to return with the sum of time series outside top/bottom K. See [MetricsQL docs](https://docs.victoriametrics.com/MetricsQL.html) for more details. * FEATURE: vmagent: expose `/api/v1/targets` page according to [the corresponding Prometheus API](https://prometheus.io/docs/prometheus/latest/querying/api/#targets). - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/643 + See * BUGFIX: vmagent: properly handle OpenStack endpoint ending with `v3.0` such as `https://ostack.example.com:5000/v3.0` - in the same way as Prometheus does. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/728#issuecomment-709914803 -* BUGFIX: drop trailing data points for time series with a single raw sample. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/748 -* BUGFIX: do not drop trailing data points for instant queries to `/api/v1/query`. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/845 -* BUGFIX: vmbackup: fix panic when `-origin` isn't specified. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/856 + in the same way as Prometheus does. See +* BUGFIX: drop trailing data points for time series with a single raw sample. See +* BUGFIX: do not drop trailing data points for instant queries to `/api/v1/query`. See +* BUGFIX: vmbackup: fix panic when `-origin` isn't specified. See * BUGFIX: vmalert: skip automatically added labels on alerts restore. Label `alertgroup` was introduced in [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/611) and automatically added to generated time series. By mistake, this new label wasn't correctly purged on restore event and affected alert's ID uniqueness. - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/870 -* BUGFIX: vmagent: fix panic at scrape error body formating. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/864 -* BUGFIX: vmagent: add leading missing slash to metrics path like Prometheus does. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/835 + See +* BUGFIX: vmagent: fix panic at scrape error body formating. See +* BUGFIX: vmagent: add leading missing slash to metrics path like Prometheus does. See * BUGFIX: vmagent: drop packet if remote storage returns 4xx status code. This make the behaviour consistent with Prometheus. - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/873 -* BUGFIX: vmagent: properly handle 301 redirects. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/869 - + See +* BUGFIX: vmagent: properly handle 301 redirects. See ## [v1.44.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.44.0) Released at 13-10-2020 -* FEATURE: automatically add missing label filters to binary operands as described at https://utcc.utoronto.ca/~cks/space/blog/sysadmin/PrometheusLabelNonOptimization . +* FEATURE: automatically add missing label filters to binary operands as described at . This should improve performance for queries with missing label filters in binary operands. For example, the following query should work faster now, because it shouldn't fetch and discard time series for `node_filesystem_files_free` metric without matching labels for the left side of the expression: + ``` node_filesystem_files{ host="$host", mountpoint="/" } - node_filesystem_files_free ``` + * FEATURE: vmagent: add Docker Swarm service discovery (aka [dockerswarm_sd_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dockerswarm_sd_config)). - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/656 + See * FEATURE: add ability to export data in CSV format. See [these docs](https://docs.victoriametrics.com/#how-to-export-csv-data) for details. * FEATURE: vmagent: add `-promscrape.suppressDuplicateScrapeTargetErrors` command-line flag for suppressing `duplicate scrape target` errors. - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/651 and https://docs.victoriametrics.com/vmagent.html#troubleshooting . + See and . * FEATURE: vmagent: show original labels before relabeling is applied on `duplicate scrape target` errors. This should simplify debugging for incorrect relabeling. - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/651 + See * FEATURE: vmagent: `/targets` page now accepts optional `show_original_labels=1` query arg for displaying original labels for each target before relabeling is applied. - This should simplify debugging for target relabeling configs. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/651 + This should simplify debugging for target relabeling configs. See * FEATURE: add `-finalMergeDelay` command-line flag for configuring the delay before final merge for per-month partitions. The final merge is started after no new data is ingested into per-month partition during `-finalMergeDelay`. * FEATURE: add `vm_rows_added_to_storage_total` metric, which shows the total number of rows added to storage since app start. @@ -1018,41 +981,40 @@ Released at 13-10-2020 than `sum(rate(vm_rows_inserted_total))` if [replication](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#replication-and-data-safety) is enabled. * FEATURE: keep metric name after applying [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html) functions, which don't change time series meaning. The list of such functions: - * `keep_last_value` - * `keep_next_value` - * `interpolate` - * `running_min` - * `running_max` - * `running_avg` - * `range_min` - * `range_max` - * `range_avg` - * `range_first` - * `range_last` - * `range_quantile` - * `smooth_exponential` - * `ceil` - * `floor` - * `round` - * `clamp_min` - * `clamp_max` - * `max_over_time` - * `min_over_time` - * `avg_over_time` - * `quantile_over_time` - * `mode_over_time` - * `geomean_over_time` - * `holt_winters` - * `predict_linear` - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/674 + * `keep_last_value` + * `keep_next_value` + * `interpolate` + * `running_min` + * `running_max` + * `running_avg` + * `range_min` + * `range_max` + * `range_avg` + * `range_first` + * `range_last` + * `range_quantile` + * `smooth_exponential` + * `ceil` + * `floor` + * `round` + * `clamp_min` + * `clamp_max` + * `max_over_time` + * `min_over_time` + * `avg_over_time` + * `quantile_over_time` + * `mode_over_time` + * `geomean_over_time` + * `holt_winters` + * `predict_linear` + See * BUGFIX: properly handle stale time series after K8S deployment. Previously such time series could be double-counted. - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/748 + See * BUGFIX: return a single time series at max from `absent()` function like Prometheus does. -* BUGFIX: vmalert: accept days, weeks and years in `for: ` part of config like Prometheus does. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/817 +* BUGFIX: vmalert: accept days, weeks and years in `for:` part of config like Prometheus does. See * BUGFIX: fix `mode_over_time(m[d])` calculations. Previously the function could return incorrect results. - ## [v1.43.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.43.0) Released at 06-10-2020 @@ -1060,20 +1022,19 @@ Released at 06-10-2020 * FEATURE: reduce CPU usage for repeated queries over sliding time window when no new time series are added to the database. Typical use cases: repeated evaluation of alerting rules in [vmalert](https://docs.victoriametrics.com/vmalert.html) or dashboard auto-refresh in Grafana. * FEATURE: vmagent: add OpenStack service discovery aka [openstack_sd_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#openstack_sd_config). - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/728 . + See . * FEATURE: vmalert: make `-maxIdleConnections` configurable for datasource HTTP client. This option can be used for minimizing connection churn. - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/795 . + See . * FEATURE: add `-influx.maxLineSize` command-line flag for configuring the maximum size for a single InfluxDB line during parsing. - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/807 + See * BUGFIX: properly handle `inf` values during [background merge of LSM parts](https://medium.com/@valyala/how-victoriametrics-makes-instant-snapshots-for-multi-terabyte-time-series-data-e1f3fb0e0282). - Previously `Inf` values could result in `NaN` values for adjacent samples in time series. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/805 . -* BUGFIX: fill gaps on graphs for `range_*` and `running_*` functions. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/806 . + Previously `Inf` values could result in `NaN` values for adjacent samples in time series. See . +* BUGFIX: fill gaps on graphs for `range_*` and `running_*` functions. See . * BUGFIX: make a copy of label with new name during relabeling with `action: labelmap` in the same way as Prometheus does. - Previously the original label name has been replaced. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/812 . + Previously the original label name has been replaced. See . * BUGFIX: support parsing floating-point timestamp like Graphite Carbon does. Such timestmaps are truncated to seconds. - ## [v1.42.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.42.0) Released at 30-09-2020 @@ -1085,27 +1046,26 @@ Released at 30-09-2020 connections to VictoriaMetrics or [vmagent](https://docs.victoriametrics.com/vmagent.html) in order to achieve the maximum data ingestion speed. * FEATURE: cluster: improve performance for data ingestion path from `vminsert` to `vmstorage` nodes. The maximum data ingestion performance for a single connection between `vminsert` and `vmstorage` node scales with the number of available CPU cores on `vmstorage` side. - This should help with https://github.com/VictoriaMetrics/VictoriaMetrics/issues/791 . + This should help with . * FEATURE: add ability to export / import data in native format via `/api/v1/export/native` and `/api/v1/import/native`. This is the most optimized approach for data migration between VictoriaMetrics instances. Both single-node and cluster instances are supported. - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/787#issuecomment-700632551 . + See . * FEATURE: add `reduce_mem_usage` query option to `/api/v1/export` in order to reduce memory usage during data export / import. See [these docs](https://docs.victoriametrics.com/#how-to-export-data-in-json-line-format) for details. * FEATURE: improve performance for `/api/v1/series` handler when it returns big number of time series. * FEATURE: add `vm_merge_need_free_disk_space` metric, which can be used for estimating the number of deferred background data merges due to the lack of free disk space. - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/686 . -* FEATURE: add OpenBSD support. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/785 . + See . +* FEATURE: add OpenBSD support. See . -* BUGFIX: properly apply `-search.maxStalenessInterval` command-line flag value. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/784 . -* BUGFIX: fix displaying data in Grafana tables. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/720 . +* BUGFIX: properly apply `-search.maxStalenessInterval` command-line flag value. See . +* BUGFIX: fix displaying data in Grafana tables. See . * BUGFIX: do not adjust the number of detected CPU cores found at `/sys/devices/system/cpu/online`. The adjustment was increasing the resulting GOMAXPROC by 1, which looked confusing to users. - See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/685#issuecomment-698595309 . -* BUGFIX: vmagent: do not show `-remoteWrite.url` in initial logs if `-remoteWrite.showURL` isn't set. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/773 . + See . +* BUGFIX: vmagent: do not show `-remoteWrite.url` in initial logs if `-remoteWrite.showURL` isn't set. See . * BUGFIX: properly handle case when [/metrics/find](https://docs.victoriametrics.com/#graphite-metrics-api-usage) finds both a leaf and a node for the given `query=prefix.*`. In this case only the node must be returned with stripped dot in the end of id as carbonapi does. - ## Previous releases See [releases page](https://github.com/VictoriaMetrics/VictoriaMetrics/releases). diff --git a/docs/CaseStudies.md b/docs/CaseStudies.md index 294982002..a047b6e08 100644 --- a/docs/CaseStudies.md +++ b/docs/CaseStudies.md @@ -7,33 +7,33 @@ sort: 11 Below please find public case studies and talks from VictoriaMetrics users. You can also join our [community Slack channel](https://slack.victoriametrics.com/) where you can chat with VictoriaMetrics users to get additional references, reviews and case studies. -* [AbiosGaming](#abiosgaming) -* [adidas](#adidas) -* [Adsterra](#adsterra) -* [ARNES](#arnes) -* [Brandwatch](#brandwatch) -* [CERN](#cern) -* [COLOPL](#colopl) -* [Dreamteam](#dreamteam) -* [Fly.io](#flyio) -* [German Research Center for Artificial Intelligence](#german-research-center-for-artificial-intelligence) -* [Grammarly](#grammarly) -* [Groove X](#groove-x) -* [Idealo.de](#idealode) -* [MHI Vestas Offshore Wind](#mhi-vestas-offshore-wind) -* [Percona](#percona) -* [Razorpay](#razorpay) -* [Sensedia](#sensedia) -* [Smarkets](#smarkets) -* [Synthesio](#synthesio) -* [Wedos.com](#wedoscom) -* [Wix.com](#wixcom) -* [Zerodha](#zerodha) -* [zhihu](#zhihu) +- [Case studies and talks](#case-studies-and-talks) + - [AbiosGaming](#abiosgaming) + - [adidas](#adidas) + - [Adsterra](#adsterra) + - [ARNES](#arnes) + - [Brandwatch](#brandwatch) + - [CERN](#cern) + - [COLOPL](#colopl) + - [Dreamteam](#dreamteam) + - [Fly.io](#flyio) + - [German Research Center for Artificial Intelligence](#german-research-center-for-artificial-intelligence) + - [Grammarly](#grammarly) + - [Groove X](#groove-x) + - [Idealo.de](#idealode) + - [MHI Vestas Offshore Wind](#mhi-vestas-offshore-wind) + - [Percona](#percona) + - [Razorpay](#razorpay) + - [Sensedia](#sensedia) + - [Smarkets](#smarkets) + - [Synthesio](#synthesio) + - [Wedos.com](#wedoscom) + - [Wix.com](#wixcom) + - [Zerodha](#zerodha) + - [zhihu](#zhihu) You can also read [articles about VictoriaMetrics from our users](https://docs.victoriametrics.com/Articles.html#third-party-articles-and-slides-about-victoriametrics). - ## AbiosGaming [AbiosGaming](https://abiosgaming.com/) provides industry leading esports data and technology across the globe. @@ -52,7 +52,6 @@ You can also read [articles about VictoriaMetrics from our users](https://docs.v See [the full article](https://abiosgaming.com/press/high-cardinality-aggregations/). - ## adidas See our [slides](https://promcon.io/2019-munich/slides/remote-write-storage-wars.pdf) and [video](https://youtu.be/OsH6gPdxR4s) @@ -118,7 +117,6 @@ We have 2 single-node instances of VictoriaMetrics. The first instance collects The second instance collects and stores low-resolution metrics (300s scrape interval) for a month. We use Promxy + Alertmanager for global view and alerts evaluation. - ## ARNES [The Academic and Research Network of Slovenia](https://www.arnes.si/en/) (ARNES) is a public institute that provides network services to research, @@ -139,7 +137,7 @@ the same result with far less maintenance overhead and lower hardware requiremen After testing it a few months and with great support from the maintainers on [Slack](https://slack.victoriametrics.com/), we decided to go with it. VM's support for the ingestion of InfluxDB metrics was an additional bonus as our hardware team uses -SNMPCollector to collect metrics from network devices and switching from InfluxDB to VictoriaMetrics required just a simple change in the config file. +SNMPCollector to collect metrics from network devices and switching from InfluxDB to VictoriaMetrics required just a simple change in the config file. Numbers: @@ -169,6 +167,7 @@ The engineering department at Brandwatch has been using InfluxDB to store applic but when End-of-Life of InfluxDB version 1.x was announced we decided to re-evaluate our entire metrics collection and storage stack. The main goals for the new metrics stack were: + - improved performance - lower maintenance - support for native clustering in open source version @@ -180,6 +179,7 @@ that made them unfit for our use case. Prometheus was also considered but it's p to include in the already significant change. Once we found VictoriaMetrics it solved the following problems: + - it is very lightweight and we can now run virtual machines instead of dedicated hardware machines for metrics storage - very short startup time and any possible gaps in data can easily be filled in using Promxy - we could continue using Telegraf as our metrics agent and ship identical metrics to both InfluxDB and VictoriaMetrics during the migration period (migration just about to start) @@ -211,24 +211,23 @@ of the [CMS](https://home.cern/science/experiments/cms) detector system. According to [published talk](https://indico.cern.ch/event/877333/contributions/3696707/attachments/1972189/3281133/CMS_mon_RD_for_opInt.pdf) VictoriaMetrics is used for the following purposes as a part of the "CMS Monitoring cluster": -* As a long-term storage for messages ingested from the [NATS messaging system](https://nats.io/). Ingested messages are pushed directly to VictoriaMetrics via HTTP protocol -* As a long-term storage for Prometheus monitoring system (30 days retention policy. There are plans to increase it up to ½ year) -* As a data source for visualizing metrics in Grafana. +- As a long-term storage for messages ingested from the [NATS messaging system](https://nats.io/). Ingested messages are pushed directly to VictoriaMetrics via HTTP protocol +- As a long-term storage for Prometheus monitoring system (30 days retention policy. There are plans to increase it up to ½ year) +- As a data source for visualizing metrics in Grafana. R&D topic: Evaluate VictoraMetrics vs InfluxDB for large cardinality data. Please also see [The CMS monitoring infrastructure and applications](https://arxiv.org/pdf/2007.03630.pdf) publication from CERN with details about their VictoriaMetrics usage. - ## COLOPL [COLOPL](http://www.colopl.co.jp/en/) is Japanese game development company. It started using VictoriaMetrics after evaulating the following remote storage solutions for Prometheus: -* Cortex -* Thanos -* M3DB -* VictoriaMetrics +- Cortex +- Thanos +- M3DB +- VictoriaMetrics See [slides](https://speakerdeck.com/inletorder/monitoring-platform-with-victoria-metrics) and [video](https://www.youtube.com/watch?v=hUpHIluxw80) from `Large-scale, super-load system monitoring platform built with VictoriaMetrics` talk at [Prometheus Meetup Tokyo #3](https://prometheus.connpass.com/event/157721/). @@ -239,10 +238,10 @@ from `Large-scale, super-load system monitoring platform built with VictoriaMetr Numbers: -* Active time series: from 350K to 725K -* Total number of time series: from 100M to 320M -* Total number of datapoints: from 120 billions to 155 billions -* Retention period: 3 months +- Active time series: from 350K to 725K +- Total number of time series: from 100M to 320M +- Total number of datapoints: from 120 billions to 155 billions +- Retention period: 3 months VictoriaMetrics in production environment runs on 2 M5 EC2 instances in "HA" mode, managed by Terraform and Ansible TF module. 2 Prometheus instances are writing to both VMs, with 2 [Promxy](https://github.com/jacksontj/promxy) replicas @@ -260,7 +259,6 @@ as the load balancer for reads. See [the full post](https://fly.io/blog/measuring-fly/). - ## German Research Center for Artificial Intelligence [German Research Center for Artificial Intelligence](https://en.wikipedia.org/wiki/German_Research_Centre_for_Artificial_Intelligence) (DFKI) is one of the world's largest nonprofit contract research institutes for software technology based on artificial intelligence (AI) methods. DFKI was founded in 1988, and has facilities in the German cities of Kaiserslautern, Saarbrücken, Bremen and Berlin. @@ -296,7 +294,6 @@ Numbers: - CPU usage: 0.1 CPU cores - RAM usage: 2.8 GB - ## Grammarly [Grammarly](https://www.grammarly.com/) provides digital writing assistant that helps 30 million people and 30 thousand teams write more clearly and effectively every day. In building a product that scales across multiple platforms and devices, Grammarly works to empower users whenever and wherever they communicate. @@ -332,7 +329,6 @@ Numbers: - CPU usage: 12 CPU cores - RAM usage: 250 GB - ## Groove X [Groove X](https://groove-x.com/en/) designs and produces robotics solutions. Its mission is to bring out humanity’s full potential through robotics. @@ -373,7 +369,6 @@ Numbers: - Retention: 13 months - Size of all datapoints: 3.5 TB - ## MHI Vestas Offshore Wind The mission of [MHI Vestas Offshore Wind](http://www.mhivestasoffshore.com) is to co-develop offshore wind as an economically viable and sustainable energy resource to benefit future generations. @@ -388,14 +383,12 @@ Numbers with current, limited roll out: - Data size on disk: 800 GiB - Retention period: 3 years - ## Percona [Percona](https://www.percona.com/) is a leader in providing best-of-breed enterprise-class support, consulting, managed services, training and software for MySQL®, MariaDB®, MongoDB®, PostgreSQL® and other open source databases in on-premises and cloud environments. Percona migrated from Prometheus to VictoriaMetrics in the [Percona Monitoring and Management](https://www.percona.com/software/database-tools/percona-monitoring-and-management) product. This allowed [reducing resource usage](https://www.percona.com/blog/2020/12/23/observations-on-better-resource-usage-with-percona-monitoring-and-management-v2-12-0/) and [getting rid of complex firewall setup](https://www.percona.com/blog/2020/12/01/foiled-by-the-firewall-a-tale-of-transition-from-prometheus-to-victoriametrics/), while [improving user experience](https://www.percona.com/blog/2020/02/28/better-prometheus-rate-function-with-victoriametrics/). - ## Razorpay [Razorpay](https://razorpay.com/) aims to revolutionize money management for online businesses by providing clean, developer-friendly APIs and hassle-free integration. @@ -405,18 +398,18 @@ Percona migrated from Prometheus to VictoriaMetrics in the [Percona Monitoring a > We executed a variety of POCs on various solutions and finally arrived at the following technologies: M3DB, Thanos, Cortex and VictoriaMetrics. The clear winner was VictoriaMetrics. > The following are some of the basic observations we derived from Victoria Metrics: -> * Simple components, each horizontally scalable. -> * Clear separation between writes and reads. -> * Runs from default configurations, with no extra frills. -> * Default retention starts with 1 month -> * Storage, ingestion, and reads can be easily scaled. -> * High Compression store ~ 70% more compression. -> * Currently running in production with commodity hardware with a good mix of spot instances. -> * Successfully ran some of the worst Grafana dashboards/queries that have historically failed to run. +> +> - Simple components, each horizontally scalable. +> - Clear separation between writes and reads. +> - Runs from default configurations, with no extra frills. +> - Default retention starts with 1 month +> - Storage, ingestion, and reads can be easily scaled. +> - High Compression store ~ 70% more compression. +> - Currently running in production with commodity hardware with a good mix of spot instances. +> - Successfully ran some of the worst Grafana dashboards/queries that have historically failed to run. See [the full article](https://engineering.razorpay.com/scaling-to-trillions-of-metric-data-points-f569a5b654f2). - ## Sensedia [Sensedia](https://www.sensedia.com) is a leading integration solutions provider with more than 120 enterprise clients across a range of sectors. Its world-class portfolio includes: an API Management Platform, Adaptive Governance, Events Hub, Service Mesh, Cloud Connectors and Strategic Professional Services' teams. @@ -432,6 +425,7 @@ See [the full article](https://engineering.razorpay.com/scaling-to-trillions-of- [Aecio dos Santos Pires](http://aeciopires.com), Cloud Architect, Sensedia. Numbers: + - Cluster mode - Active time series: 700K - Ingestion rate: 70K datapoints per second @@ -441,7 +435,6 @@ Numbers: - Churn rate: 3 million of new time series per day - Query response time (99th percentile): 500ms - ## Smarkets [Smarkets](https://smarkets.com/) simplifies peer-to-peer trading on sporting and political events. @@ -449,15 +442,15 @@ Numbers: > We always wanted our developers to have out-of-the-box monitoring available for any application or service. Before we adopted Kubernetes this was achieved either with Prometheus metrics, or with statsd being sent over to the underlying host and then converted into Prometheus metrics. As we expanded our Kubernetes adoption and started to split clusters, we also wanted developers to be able to expose metrics directly to Prometheus by annotating services. Those metrics were then only available inside the cluster so they couldn’t be scraped globally. > We considered three different solutions to improve our architecture: -> * Prometheus + Cortex -> * Prometheus + Thanos Receive -> * Prometheus + Victoria Metrics +> +> - Prometheus + Cortex +> - Prometheus + Thanos Receive +> - Prometheus + Victoria Metrics > We selected Victoria Metrics. Our new architecture has been very stable since it was put into production. With the previous setup we would have had two or three cardinality explosions in a two-week period, with this new one we have none. See [the full article](https://smarketshq.com/monitoring-kubernetes-clusters-41a4b24c19e3). - ## Synthesio [Synthesio](https://www.synthesio.com/) is the leading social intelligence tool for social media monitoring and analytics. @@ -465,6 +458,7 @@ See [the full article](https://smarketshq.com/monitoring-kubernetes-clusters-41a > We fully migrated from [Metrictank](https://grafana.com/oss/metrictank/) to VictoriaMetrics Numbers: + - Single node - Active time series: 5 millions - Datapoints: 1.25 trillions @@ -480,11 +474,11 @@ Numbers: Numbers: -* The number of acitve time series: 5M. -* Ingestion rate: 170K data points per second. -* Query duration: median is ~2ms, 99th percentile is ~50ms. +- The number of acitve time series: 5M. +- Ingestion rate: 170K data points per second. +- Query duration: median is ~2ms, 99th percentile is ~50ms. -> We like that VictoriaMetrics is simple to configuree and requires zero maintenance. It works right out of the box and once it's set up you can just forget about it. +> We like that VictoriaMetrics is simple to configuree and requires zero maintenance. It works right out of the box and once it's set up you can just forget about it. ## Wix.com @@ -494,24 +488,24 @@ Numbers: Numbers: -* The number of active time series per VictoriaMetrics instance is 50 millions. -* The total number of time series per VictoriaMetrics instance is 5000 million. -* Ingestion rate per VictoriaMetrics instance is 1.1 millions data points per second. -* The total number of datapoints per VictoriaMetrics instance is 8.5 trillion. -* The average churn rate is 150 millions new time series per day. -* The average query rate is ~150 per second (mostly alert queries). -* Query duration: median is ~1ms, 99th percentile is ~1sec. -* Retention period: 3 months. +- The number of active time series per VictoriaMetrics instance is 50 millions. +- The total number of time series per VictoriaMetrics instance is 5000 million. +- Ingestion rate per VictoriaMetrics instance is 1.1 millions data points per second. +- The total number of datapoints per VictoriaMetrics instance is 8.5 trillion. +- The average churn rate is 150 millions new time series per day. +- The average query rate is ~150 per second (mostly alert queries). +- Query duration: median is ~1ms, 99th percentile is ~1sec. +- Retention period: 3 months. > The alternatives that we tested prior to choosing VictoriaMetrics were: Prometheus federated, Cortex, IronDB and Thanos. > The items that were critical to us central tsdb, in order of importance were as follows: -* At least 3 month worth of retention. -* Raw data, no aggregation, no sampling. -* High query speed. -* Clean fail state for HA (multi-node clusters may return partial data resulting in false alerts). -* Enough headroom/scaling capacity for future growth which is planned to be up to 100M active time series. -* Ability to split DB replicas per workload. Alert queries go to one replica and user queries go to another (speed for users, effective cache). +- At least 3 month worth of retention. +- Raw data, no aggregation, no sampling. +- High query speed. +- Clean fail state for HA (multi-node clusters may return partial data resulting in false alerts). +- Enough headroom/scaling capacity for future growth which is planned to be up to 100M active time series. +- Ability to split DB replicas per workload. Alert queries go to one replica and user queries go to another (speed for users, effective cache). > Optimizing for those points and our specific workload, VictoriaMetrics proved to be the best option. As icing on the cake we’ve got [PromQL extensions](https://docs.victoriametrics.com/MetricsQL.html) - `default 0` and `histogram` are my favorite ones. We really like having a lot of tsdb params easily available via config options which makes tsdb easy to tune for each specific use case. We've also found a great community in [Slack channel](https://slack.victoriametrics.com/) and responsive and helpful maintainer support. @@ -521,24 +515,23 @@ Alex Ulstein, Head of Monitoring, Wix.com [Zerodha](https://zerodha.com/) is India's largest stock broker. The monitoring team at Zerodha had the following requirements: -* Multiple K8s clusters to monitor -* Consistent monitoring infra for each cluster across the fleet -* The ability to handle billions of timeseries events at any point of time -* Easy to operate and cost effective +- Multiple K8s clusters to monitor +- Consistent monitoring infra for each cluster across the fleet +- The ability to handle billions of timeseries events at any point of time +- Easy to operate and cost effective Thanos, Cortex and VictoriaMetrics were evaluated as a long-term storage for Prometheus. VictoriaMetrics has been selected for the following reasons: -* Blazingly fast benchmarks for a single node setup. -* Single binary mode. Easy to scale vertically with far fewer operational headaches. -* Considerable [improvements on creating Histograms](https://medium.com/@valyala/improving-histogram-usability-for-prometheus-and-grafana-bc7e5df0e350). -* [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html) gives us the ability to extend PromQL with more aggregation operators. -* The API is compatible with Prometheus and nearly all standard PromQL queries work well out of the box. -* Handles storage well, with periodic compaction which makes it easy to take snapshots. +- Blazingly fast benchmarks for a single node setup. +- Single binary mode. Easy to scale vertically with far fewer operational headaches. +- Considerable [improvements on creating Histograms](https://medium.com/@valyala/improving-histogram-usability-for-prometheus-and-grafana-bc7e5df0e350). +- [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html) gives us the ability to extend PromQL with more aggregation operators. +- The API is compatible with Prometheus and nearly all standard PromQL queries work well out of the box. +- Handles storage well, with periodic compaction which makes it easy to take snapshots. Please see [Monitoring K8S with VictoriaMetrics](https://docs.google.com/presentation/d/1g7yUyVEaAp4tPuRy-MZbPXKqJ1z78_5VKuV841aQfsg/edit) slides, [video](https://youtu.be/ZJQYW-cFOms) and [Infrastructure monitoring with Prometheus at Zerodha](https://zerodha.tech/blog/infra-monitoring-at-zerodha/) blog post for more details. - ## zhihu [zhihu](https://www.zhihu.com) is the largest Chinese question-and-answer website. We use VictoriaMetrics to store and use Graphite metrics. We shared the [promate](https://github.com/zhihu/promate) solution in our [单机 20 亿指标,知乎 Graphite 极致优化!](https://qcon.infoq.cn/2020/shenzhen/presentation/2881)([slides](https://static001.geekbang.org/con/76/pdf/828698018/file/%E5%8D%95%E6%9C%BA%2020%20%E4%BA%BF%E6%8C%87%E6%A0%87%EF%BC%8C%E7%9F%A5%E4%B9%8E%20Graphite%20%E6%9E%81%E8%87%B4%E4%BC%98%E5%8C%96%EF%BC%81-%E7%86%8A%E8%B1%B9.pdf)) talk at [QCon 2020](https://qcon.infoq.cn/2020/shenzhen/). diff --git a/docs/Cluster-VictoriaMetrics.md b/docs/Cluster-VictoriaMetrics.md index ce9446e6f..8122dbedb 100644 --- a/docs/Cluster-VictoriaMetrics.md +++ b/docs/Cluster-VictoriaMetrics.md @@ -16,7 +16,6 @@ Single-node version is easier to configure and operate comparing to cluster vers Join [our Slack](https://slack.victoriametrics.com/) or [contact us](mailto:info@victoriametrics.com) with consulting and support questions. - ## Prominent features - Supports all the features of [single-node version](https://github.com/VictoriaMetrics/VictoriaMetrics). @@ -24,7 +23,6 @@ Join [our Slack](https://slack.victoriametrics.com/) or [contact us](mailto:info - Supports multiple independent namespaces for time series data (aka multi-tenancy). See [these docs for details](#multitenancy). - Supports replication. See [these docs for details](#replication-and-data-safety). - ## Architecture overview VictoriaMetrics cluster consists of the following services: @@ -40,27 +38,25 @@ It increases cluster availability, simplifies cluster maintenance and cluster sc - ## Multitenancy VictoriaMetrics cluster supports multiple isolated tenants (aka namespaces). Tenants are identified by `accountID` or `accountID:projectID`, which are put inside request urls. See [these docs](#url-format) for details. Some facts about tenants in VictoriaMetrics: -* Each `accountID` and `projectID` is identified by an arbitrary 32-bit integer in the range `[0 .. 2^32)`. +- Each `accountID` and `projectID` is identified by an arbitrary 32-bit integer in the range `[0 .. 2^32)`. If `projectID` is missing, then it is automatically assigned to `0`. It is expected that other information about tenants such as auth tokens, tenant names, limits, accounting, etc. is stored in a separate relational database. This database must be managed by a separate service sitting in front of VictoriaMetrics cluster such as [vmauth](https://docs.victoriametrics.com/vmauth.html) or [vmgateway](https://docs.victoriametrics.com/vmgateway.html). [Contact us](mailto:info@victoriametrics.com) if you need assistance with such service. -* Tenants are automatically created when the first data point is written into the given tenant. +- Tenants are automatically created when the first data point is written into the given tenant. -* Data for all the tenants is evenly spread among available `vmstorage` nodes. This guarantees even load among `vmstorage` nodes +- Data for all the tenants is evenly spread among available `vmstorage` nodes. This guarantees even load among `vmstorage` nodes when different tenants have different amounts of data and different query load. -* The database performance and resource usage doesn't depend on the number of tenants. It depends mostly on the total number of active time series in all the tenants. A time series is considered active if it received at least a single sample during the last hour or it has been touched by queries during the last hour. - -* VictoriaMetrics doesn't support querying multiple tenants in a single request. +- The database performance and resource usage doesn't depend on the number of tenants. It depends mostly on the total number of active time series in all the tenants. A time series is considered active if it received at least a single sample during the last hour or it has been touched by queries during the last hour. +- VictoriaMetrics doesn't support querying multiple tenants in a single request. ## Binaries @@ -69,16 +65,14 @@ See archives containing `cluster` word. Docker images for cluster version are available here: -- `vminsert` - https://hub.docker.com/r/victoriametrics/vminsert/tags -- `vmselect` - https://hub.docker.com/r/victoriametrics/vmselect/tags -- `vmstorage` - https://hub.docker.com/r/victoriametrics/vmstorage/tags - +- `vminsert` - +- `vmselect` - +- `vmstorage` - ## Building from sources Source code for cluster version is available at [cluster branch](https://github.com/VictoriaMetrics/VictoriaMetrics/tree/cluster). - ### Production builds There is no need in installing Go on a host system since binaries are built @@ -91,6 +85,7 @@ make vminsert-prod vmselect-prod vmstorage-prod ``` Production binaries are built into statically linked binaries. They are put into `bin` folder with `-prod` suffixes: + ``` $ make vminsert-prod vmselect-prod vmstorage-prod $ ls -1 bin @@ -105,14 +100,13 @@ vmstorage-prod 2. Run `make` from [the repository root](https://github.com/VictoriaMetrics/VictoriaMetrics). It should build `vmstorage`, `vmselect` and `vminsert` binaries and put them into the `bin` folder. - ### Building docker images Run `make package`. It will build the following docker images locally: -* `victoriametrics/vminsert:` -* `victoriametrics/vmselect:` -* `victoriametrics/vmstorage:` +- `victoriametrics/vminsert:` +- `victoriametrics/vmselect:` +- `victoriametrics/vmstorage:` `` is auto-generated image tag, which depends on source code in [the repository](https://github.com/VictoriaMetrics/VictoriaMetrics). The `` may be manually set via `PKG_TAG=foobar make package`. @@ -131,14 +125,15 @@ ROOT_IMAGE=scratch make package A minimal cluster must contain the following nodes: -* a single `vmstorage` node with `-retentionPeriod` and `-storageDataPath` flags -* a single `vminsert` node with `-storageNode=` -* a single `vmselect` node with `-storageNode=` +- a single `vmstorage` node with `-retentionPeriod` and `-storageDataPath` flags +- a single `vminsert` node with `-storageNode=` +- a single `vmselect` node with `-storageNode=` It is recommended to run at least two nodes for each service for high availability purposes. An http load balancer such as [vmauth](https://docs.victoriametrics.com/vmauth.html) or `nginx` must be put in front of `vminsert` and `vmselect` nodes. It must contain the following routing configs according to [the url format](#url-format): + - requests starting with `/insert` must be routed to port `8480` on `vminsert` nodes. - requests starting with `/select` must be routed to port `8481` on `vmselect` nodes. @@ -147,22 +142,19 @@ Ports may be altered by setting `-httpListenAddr` on the corresponding nodes. It is recommended setting up [monitoring](#monitoring) for the cluster. The following tools can simplify cluster setup: -* [An example docker-compose config for VictoriaMetrics cluster](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/cluster/deployment/docker/docker-compose.yml) -* [Helm charts for VictoriaMetrics](https://github.com/VictoriaMetrics/helm-charts) -* [Kubernetes operator for VictoriaMetrics](https://github.com/VictoriaMetrics/operator) - +- [An example docker-compose config for VictoriaMetrics cluster](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/cluster/deployment/docker/docker-compose.yml) +- [Helm charts for VictoriaMetrics](https://github.com/VictoriaMetrics/helm-charts) +- [Kubernetes operator for VictoriaMetrics](https://github.com/VictoriaMetrics/operator) It is possible manualy setting up a toy cluster on a single host. In this case every cluster component - `vminsert`, `vmselect` and `vmstorage` - must have distinct values for `-httpListenAddr` command-line flag. This flag specifies http address for accepting http requests for [monitoring](#monitoring) and [profiling](#profiling). `vmstorage` node must have distinct values for the following additional command-line flags in order to prevent resource usage clash: -* `-storageDataPath` - every `vmstorage` node must have a dedicated data storage. -* `-vminsertAddr` - every `vmstorage` node must listen for a distinct tcp address for accepting data from `vminsert` nodes. -* `-vmselectAddr` - every `vmstorage` node must listen for a distinct tcp address for accepting requests from `vmselect` nodes. - +- `-storageDataPath` - every `vmstorage` node must have a dedicated data storage. +- `-vminsertAddr` - every `vmstorage` node must listen for a distinct tcp address for accepting data from `vminsert` nodes. +- `-vmselectAddr` - every `vmstorage` node must listen for a distinct tcp address for accepting requests from `vmselect` nodes. ## mTLS protection By default `vminsert` and `vmselect` nodes use unencrypted connections to `vmstorage` nodes, since it is assumed that all the cluster components run in a protected environment. [Enterprise version of VictoriaMetrics](https://victoriametrics.com/products/enterprise/) provides optional support for [mTLS connections](https://en.wikipedia.org/wiki/Mutual_authentication#mTLS) between cluster components. Pass `-cluster.tls=true` command-line flag to `vminsert`, `vmselect` and `vmstorage` nodes in order to enable mTLS protection. Additionally, `vminsert` and `vmselect` must be configured with client-side certificates via `-cluster.tlsCertFile`, `-cluster.tlsKeyFile` command-line options. These certificates are verified by `vmstorage` when `vminsert` and `vmselect` dial `vmstorage`. An optional `-cluster.tlsCAFile` command-line flag can be set at `vminsert`, `vmselect` and `vmstorage` for verifying peer certificates issued with custom [certificate authority](https://en.wikipedia.org/wiki/Certificate_authority). - ### Environment variables Each flag values can be set thru environment variables by following these rules: @@ -172,11 +164,11 @@ Each flag values can be set thru environment variables by following these rules: - For repeating flags, an alternative syntax can be used by joining the different values into one using `,` as separator (for example `-storageNode -storageNode ` will translate to `storageNode=,`) - It is possible setting prefix for environment vars with `-envflag.prefix`. For instance, if `-envflag.prefix=VM_`, then env vars must be prepended with `VM_` - ## Monitoring All the cluster components expose various metrics in Prometheus-compatible format at `/metrics` page on the TCP port set in `-httpListenAddr` command-line flag. By default the following TCP ports are used: + - `vminsert` - 8480 - `vmselect` - 8481 - `vmstorage` - 8482 @@ -192,24 +184,22 @@ It is recommended setting up alerts in [vmalert](https://docs.victoriametrics.co `vmstorage` nodes automatically switch to readonly mode when the directory pointed by `-storageDataPath` contains less than `-storage.minFreeDiskSpaceBytes` of free space. `vminsert` nodes stop sending data to such nodes and start re-routing the data to the remaining `vmstorage` nodes. - - ## URL format -* URLs for data ingestion: `http://:8480/insert//`, where: +- URLs for data ingestion: `http://:8480/insert//`, where: - `` is an arbitrary 32-bit integer identifying namespace for data ingestion (aka tenant). It is possible to set it as `accountID:projectID`, where `projectID` is also arbitrary 32-bit integer. If `projectID` isn't set, then it equals to `0`. - `` may have the following values: - - `prometheus` and `prometheus/api/v1/write` - for inserting data with [Prometheus remote write API](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write). - - `datadog/api/v1/series` - for inserting data with [DataDog submit metrics API](https://docs.datadoghq.com/api/latest/metrics/#submit-metrics). See [these docs](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-send-data-from-datadog-agent) for details. - - `influx/write` and `influx/api/v2/write` - for inserting data with [InfluxDB line protocol](https://docs.influxdata.com/influxdb/v1.7/write_protocols/line_protocol_tutorial/). See [these docs](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-send-data-from-influxdb-compatible-agents-such-as-telegraf) for details. - - `opentsdb/api/put` - for accepting [OpenTSDB HTTP /api/put requests](http://opentsdb.net/docs/build/html/api_http/put.html). This handler is disabled by default. It is exposed on a distinct TCP address set via `-opentsdbHTTPListenAddr` command-line flag. See [these docs](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#sending-opentsdb-data-via-http-apiput-requests) for details. - - `prometheus/api/v1/import` - for importing data obtained via `api/v1/export` at `vmselect` (see below). - - `prometheus/api/v1/import/native` - for importing data obtained via `api/v1/export/native` on `vmselect` (see below). - - `prometheus/api/v1/import/csv` - for importing arbitrary CSV data. See [these docs](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-import-csv-data) for details. - - `prometheus/api/v1/import/prometheus` - for importing data in [Prometheus text exposition format](https://github.com/prometheus/docs/blob/master/content/docs/instrumenting/exposition_formats.md#text-based-format) and in [OpenMetrics format](https://github.com/OpenObservability/OpenMetrics/blob/master/specification/OpenMetrics.md). See [these docs](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-import-data-in-prometheus-exposition-format) for details. + - `prometheus` and `prometheus/api/v1/write` - for inserting data with [Prometheus remote write API](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write). + - `datadog/api/v1/series` - for inserting data with [DataDog submit metrics API](https://docs.datadoghq.com/api/latest/metrics/#submit-metrics). See [these docs](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-send-data-from-datadog-agent) for details. + - `influx/write` and `influx/api/v2/write` - for inserting data with [InfluxDB line protocol](https://docs.influxdata.com/influxdb/v1.7/write_protocols/line_protocol_tutorial/). See [these docs](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-send-data-from-influxdb-compatible-agents-such-as-telegraf) for details. + - `opentsdb/api/put` - for accepting [OpenTSDB HTTP /api/put requests](http://opentsdb.net/docs/build/html/api_http/put.html). This handler is disabled by default. It is exposed on a distinct TCP address set via `-opentsdbHTTPListenAddr` command-line flag. See [these docs](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#sending-opentsdb-data-via-http-apiput-requests) for details. + - `prometheus/api/v1/import` - for importing data obtained via `api/v1/export` at `vmselect` (see below). + - `prometheus/api/v1/import/native` - for importing data obtained via `api/v1/export/native` on `vmselect` (see below). + - `prometheus/api/v1/import/csv` - for importing arbitrary CSV data. See [these docs](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-import-csv-data) for details. + - `prometheus/api/v1/import/prometheus` - for importing data in [Prometheus text exposition format](https://github.com/prometheus/docs/blob/master/content/docs/instrumenting/exposition_formats.md#text-based-format) and in [OpenMetrics format](https://github.com/OpenObservability/OpenMetrics/blob/master/specification/OpenMetrics.md). See [these docs](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-import-data-in-prometheus-exposition-format) for details. -* URLs for [Prometheus querying API](https://prometheus.io/docs/prometheus/latest/querying/api/): `http://:8481/select//prometheus/`, where: +- URLs for [Prometheus querying API](https://prometheus.io/docs/prometheus/latest/querying/api/): `http://:8481/select//prometheus/`, where: - `` is an arbitrary number identifying data namespace for the query (aka tenant) - `` may have the following values: - `api/v1/query` - performs [PromQL instant query](https://prometheus.io/docs/prometheus/latest/querying/api/#instant-queries). @@ -227,31 +217,31 @@ It is recommended setting up alerts in [vmalert](https://docs.victoriametrics.co which is returned in the response. - `api/v1/status/top_queries` - for listing the most frequently executed queries and queries taking the most duration. -* URLs for [Graphite Metrics API](https://graphite-api.readthedocs.io/en/latest/api.html#the-metrics-api): `http://:8481/select//graphite/`, where: - - `` is an arbitrary number identifying data namespace for query (aka tenant) - - `` may have the following values: - - `render` - implements Graphite Render API. See [these docs](https://graphite.readthedocs.io/en/stable/render_api.html). This functionality is available in [Enterprise package](https://victoriametrics.com/products/enterprise/). - - `metrics/find` - searches Graphite metrics. See [these docs](https://graphite-api.readthedocs.io/en/latest/api.html#metrics-find). - - `metrics/expand` - expands Graphite metrics. See [these docs](https://graphite-api.readthedocs.io/en/latest/api.html#metrics-expand). - - `metrics/index.json` - returns all the metric names. See [these docs](https://graphite-api.readthedocs.io/en/latest/api.html#metrics-index-json). - - `tags/tagSeries` - registers time series. See [these docs](https://graphite.readthedocs.io/en/stable/tags.html#adding-series-to-the-tagdb). - - `tags/tagMultiSeries` - register multiple time series. See [these docs](https://graphite.readthedocs.io/en/stable/tags.html#adding-series-to-the-tagdb). - - `tags` - returns tag names. See [these docs](https://graphite.readthedocs.io/en/stable/tags.html#exploring-tags). - - `tags/` - returns tag values for the given ``. See [these docs](https://graphite.readthedocs.io/en/stable/tags.html#exploring-tags). - - `tags/findSeries` - returns series matching the given `expr`. See [these docs](https://graphite.readthedocs.io/en/stable/tags.html#exploring-tags). - - `tags/autoComplete/tags` - returns tags matching the given `tagPrefix` and/or `expr`. See [these docs](https://graphite.readthedocs.io/en/stable/tags.html#auto-complete-support). - - `tags/autoComplete/values` - returns tag values matching the given `valuePrefix` and/or `expr`. See [these docs](https://graphite.readthedocs.io/en/stable/tags.html#auto-complete-support). - - `tags/delSeries` - deletes series matching the given `path`. See [these docs](https://graphite.readthedocs.io/en/stable/tags.html#removing-series-from-the-tagdb). +- URLs for [Graphite Metrics API](https://graphite-api.readthedocs.io/en/latest/api.html#the-metrics-api): `http://:8481/select//graphite/`, where: + - `` is an arbitrary number identifying data namespace for query (aka tenant) + - `` may have the following values: + - `render` - implements Graphite Render API. See [these docs](https://graphite.readthedocs.io/en/stable/render_api.html). This functionality is available in [Enterprise package](https://victoriametrics.com/products/enterprise/). + - `metrics/find` - searches Graphite metrics. See [these docs](https://graphite-api.readthedocs.io/en/latest/api.html#metrics-find). + - `metrics/expand` - expands Graphite metrics. See [these docs](https://graphite-api.readthedocs.io/en/latest/api.html#metrics-expand). + - `metrics/index.json` - returns all the metric names. See [these docs](https://graphite-api.readthedocs.io/en/latest/api.html#metrics-index-json). + - `tags/tagSeries` - registers time series. See [these docs](https://graphite.readthedocs.io/en/stable/tags.html#adding-series-to-the-tagdb). + - `tags/tagMultiSeries` - register multiple time series. See [these docs](https://graphite.readthedocs.io/en/stable/tags.html#adding-series-to-the-tagdb). + - `tags` - returns tag names. See [these docs](https://graphite.readthedocs.io/en/stable/tags.html#exploring-tags). + - `tags/` - returns tag values for the given ``. See [these docs](https://graphite.readthedocs.io/en/stable/tags.html#exploring-tags). + - `tags/findSeries` - returns series matching the given `expr`. See [these docs](https://graphite.readthedocs.io/en/stable/tags.html#exploring-tags). + - `tags/autoComplete/tags` - returns tags matching the given `tagPrefix` and/or `expr`. See [these docs](https://graphite.readthedocs.io/en/stable/tags.html#auto-complete-support). + - `tags/autoComplete/values` - returns tag values matching the given `valuePrefix` and/or `expr`. See [these docs](https://graphite.readthedocs.io/en/stable/tags.html#auto-complete-support). + - `tags/delSeries` - deletes series matching the given `path`. See [these docs](https://graphite.readthedocs.io/en/stable/tags.html#removing-series-from-the-tagdb). -* URL with basic Web UI: `http://:8481/select//vmui/`. +- URL with basic Web UI: `http://:8481/select//vmui/`. -* URL for query stats across all tenants: `http://:8481/api/v1/status/top_queries`. It lists with the most frequently executed queries and queries taking the most duration. +- URL for query stats across all tenants: `http://:8481/api/v1/status/top_queries`. It lists with the most frequently executed queries and queries taking the most duration. -* URL for time series deletion: `http://:8481/delete//prometheus/api/v1/admin/tsdb/delete_series?match[]=`. +- URL for time series deletion: `http://:8481/delete//prometheus/api/v1/admin/tsdb/delete_series?match[]=`. Note that the `delete_series` handler should be used only in exceptional cases such as deletion of accidentally ingested incorrect time series. It shouldn't be used on a regular basis, since it carries non-zero overhead. -* `vmstorage` nodes provide the following HTTP endpoints on `8482` port: +- `vmstorage` nodes provide the following HTTP endpoints on `8482` port: - `/internal/force_merge` - initiate [forced compactions](https://docs.victoriametrics.com/#forced-merge) on the given `vmstorage` node. - `/snapshot/create` - create [instant snapshot](https://medium.com/@valyala/how-victoriametrics-makes-instant-snapshots-for-multi-terabyte-time-series-data-e1f3fb0e0282), which can be used for backups in background. Snapshots are created in `/snapshots` folder, where `` is the corresponding @@ -263,17 +253,16 @@ It is recommended setting up alerts in [vmalert](https://docs.victoriametrics.co Snapshots may be created independently on each `vmstorage` node. There is no need in synchronizing snapshots' creation across `vmstorage` nodes. - ## Cluster resizing and scalability Cluster performance and capacity scales with adding new nodes. -* `vminsert` and `vmselect` nodes are stateless and may be added / removed at any time. +- `vminsert` and `vmselect` nodes are stateless and may be added / removed at any time. Do not forget updating the list of these nodes on http load balancer. Adding more `vminsert` nodes scales data ingestion rate. See [this comment](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/175#issuecomment-536925841) about ingestion rate scalability. Adding more `vmselect` nodes scales select queries rate. -* `vmstorage` nodes own the ingested data, so they cannot be removed without data loss. +- `vmstorage` nodes own the ingested data, so they cannot be removed without data loss. Adding more `vmstorage` nodes scales cluster capacity. Steps to add `vmstorage` node: @@ -282,7 +271,6 @@ Steps to add `vmstorage` node: 2. Gradually restart all the `vmselect` nodes with new `-storageNode` arg containing ``. 3. Gradually restart all the `vminsert` nodes with new `-storageNode` arg containing ``. - ## Updating / reconfiguring cluster nodes All the node types - `vminsert`, `vmselect` and `vmstorage` - may be updated via graceful shutdown. @@ -294,11 +282,10 @@ the update process. See [cluster availability](#cluster-availability) section fo See also more advanced [cardinality limiter in vmagent](https://docs.victoriametrics.com/vmagent.html#cardinality-limiter). - ## Cluster availability -* HTTP load balancer must stop routing requests to unavailable `vminsert` and `vmselect` nodes. -* The cluster remains available if at least a single `vmstorage` node exists: +- HTTP load balancer must stop routing requests to unavailable `vminsert` and `vmselect` nodes. +- The cluster remains available if at least a single `vmstorage` node exists: - `vminsert` re-routes incoming data from unavailable `vmstorage` nodes to healthy `vmstorage` nodes - `vmselect` continues serving partial responses if at least a single `vmstorage` node is available. If consistency over availability is preferred, then either pass `-search.denyPartialResponse` command-line flag to `vmselect` or pass `deny_partial_response=1` query arg in requests to `vmselect`. @@ -307,7 +294,6 @@ See also more advanced [cardinality limiter in vmagent](https://docs.victoriamet Data replication can be used for increasing storage durability. See [these docs](#replication-and-data-safety) for details. - ## Capacity planning VictoriaMetrics uses lower amounts of CPU, RAM and storage space on production workloads compared to competing solutions (Prometheus, Thanos, Cortex, TimescaleDB, InfluxDB, QuestDB, M3DB) according to [our case studies](https://docs.victoriametrics.com/CaseStudies.html). @@ -318,19 +304,17 @@ The needed storage space for the given retention (the retention is set via `-ret It is recommended leaving the following amounts of spare resources: -* 50% of free RAM across all the node types for reducing the probability of OOM (out of memory) crashes and slowdowns during temporary spikes in workload. -* 50% of spare CPU across all the node types for reducing the probability of slowdowns during temporary spikes in workload. -* At least 30% of free storage space at the directory pointed by `-storageDataPath` command-line flag at `vmstorage` nodes. See also `-storage.minFreeDiskSpaceBytes` command-line flag [description for vmstorage](#list-of-command-line-flags-for-vmstorage). - +- 50% of free RAM across all the node types for reducing the probability of OOM (out of memory) crashes and slowdowns during temporary spikes in workload. +- 50% of spare CPU across all the node types for reducing the probability of slowdowns during temporary spikes in workload. +- At least 30% of free storage space at the directory pointed by `-storageDataPath` command-line flag at `vmstorage` nodes. See also `-storage.minFreeDiskSpaceBytes` command-line flag [description for vmstorage](#list-of-command-line-flags-for-vmstorage). Some capacity planning tips for VictoriaMetrics cluster: -* The [replication](#replication-and-data-safety) increases the amounts of needed resources for the cluster by up to `N` times where `N` is replication factor. -* Cluster capacity for [active time series](https://docs.victoriametrics.com/FAQ.html#what-is-an-active-time-series) can be increased by adding more `vmstorage` nodes and/or by increasing RAM and CPU resources per each `vmstorage` node. -* Query latency can be reduced by increasing the number of `vmstorage` nodes and/or by increasing RAM and CPU resources per each `vmselect` node. -* The total number of CPU cores needed for all the `vminsert` nodes can be calculated from the ingestion rate: `CPUs = ingestion_rate / 100K`. -* The `-rpc.disableCompression` command-line flag at `vminsert` nodes can increase ingestion capacity at the cost of higher network bandwidth usage between `vminsert` and `vmstorage`. - +- The [replication](#replication-and-data-safety) increases the amounts of needed resources for the cluster by up to `N` times where `N` is replication factor. +- Cluster capacity for [active time series](https://docs.victoriametrics.com/FAQ.html#what-is-an-active-time-series) can be increased by adding more `vmstorage` nodes and/or by increasing RAM and CPU resources per each `vmstorage` node. +- Query latency can be reduced by increasing the number of `vmstorage` nodes and/or by increasing RAM and CPU resources per each `vmselect` node. +- The total number of CPU cores needed for all the `vminsert` nodes can be calculated from the ingestion rate: `CPUs = ingestion_rate / 100K`. +- The `-rpc.disableCompression` command-line flag at `vminsert` nodes can increase ingestion capacity at the cost of higher network bandwidth usage between `vminsert` and `vmstorage`. ## High availability @@ -345,25 +329,21 @@ into all the cluster. Then [promxy](https://github.com/jacksontj/promxy) could b Another solution is to use [multi-level cluster setup](#multi-level-cluster-setup). - ## Multi-level cluster setup `vminsert` nodes can accept data from another `vminsert` nodes starting from [v1.60.0](https://docs.victoriametrics.com/CHANGELOG.html#v1600) if `-clusternativeListenAddr` command-line flag is set. For example, if `vminsert` is started with `-clusternativeListenAddr=:8400` command-line flag, then it can accept data from another `vminsert` nodes at TCP port 8400 in the same way as `vmstorage` nodes do. This allows chaining `vminsert` nodes and building multi-level cluster topologies with flexible configs. For example, the top level of `vminsert` nodes can replicate data among the second level of `vminsert` nodes located in distinct availability zones (AZ), while the second-level `vminsert` nodes can spread the data among `vmstorage` nodes located in the same AZ. Such setup guarantees cluster availability if some AZ becomes unavailable. The data from all the `vmstorage` nodes in all the AZs can be read via `vmselect` nodes, which are configured to query all the `vmstorage` nodes in all the availability zones (e.g. all the `vmstorage` addresses are passed via `-storageNode` command-line flag to `vmselect` nodes). Additionally, `-replicationFactor=k+1` must be passed to `vmselect` nodes, where `k` is the lowest number of `vmstorage` nodes in a single AZ. See [replication docs](#replication-and-data-safety) for more details. Another option is to set up [vmagent](https://docs.victoriametrics.com/vmagent.html) for replicating the data among multiple VictoriaMetrics clusters. See [these docs](https://docs.victoriametrics.com/vmagent.html#multitenancy) for details. - ## Helm Helm chart simplifies managing cluster version of VictoriaMetrics in Kubernetes. It is available in the [helm-charts](https://github.com/VictoriaMetrics/helm-charts) repository. - ## Kubernetes operator [K8s operator](https://github.com/VictoriaMetrics/operator) simplifies managing VictoriaMetrics components in Kubernetes. - ## Replication and data safety By default VictoriaMetrics offloads replication to the underlying storage pointed by `-storageDataPath`. @@ -391,7 +371,6 @@ HDD-based persistent disks should be enough for the majority of use cases. It is recommended using durable replicated persistent volumes in Kubernetes. - ## Backups It is recommended performing periodical backups from [instant snapshots](https://medium.com/@valyala/how-victoriametrics-makes-instant-snapshots-for-multi-terabyte-time-series-data-e1f3fb0e0282) @@ -412,19 +391,17 @@ Restoring from backup: 2. Restore data from backup using [vmrestore](https://docs.victoriametrics.com/vmrestore.html) into `-storageDataPath` directory. 3. Start `vmstorage` node. - ## Downsampling Downsampling is available in [enterprise version of VictoriaMetrics](https://victoriametrics.com/products/enterprise/). It is configured with `-downsampling.period` command-line flag. The same flag value must be passed to both `vmstorage` and `vmselect` nodes. See [these docs](https://docs.victoriametrics.com/#downsampling) for details. - ## Profiling All the cluster components provide the following handlers for [profiling](https://blog.golang.org/profiling-go-programs): -* `http://vminsert:8480/debug/pprof/heap` for memory profile and `http://vminsert:8480/debug/pprof/profile` for CPU profile -* `http://vmselect:8481/debug/pprof/heap` for memory profile and `http://vmselect:8481/debug/pprof/profile` for CPU profile -* `http://vmstorage:8482/debug/pprof/heap` for memory profile and `http://vmstorage:8482/debug/pprof/profile` for CPU profile +- `http://vminsert:8480/debug/pprof/heap` for memory profile and `http://vminsert:8480/debug/pprof/profile` for CPU profile +- `http://vmselect:8481/debug/pprof/heap` for memory profile and `http://vmselect:8481/debug/pprof/profile` for CPU profile +- `http://vmstorage:8482/debug/pprof/heap` for memory profile and `http://vmstorage:8482/debug/pprof/profile` for CPU profile Example command for collecting cpu profile from `vmstorage` (replace `0.0.0.0` with `vmstorage` hostname if needed): @@ -469,18 +446,15 @@ Due to `KISS`, cluster version of VictoriaMetrics has no the following "features - Automatic discovering and addition of new nodes in the cluster, which may mix data between dev and prod clusters :) - Automatic leader election, which may result in split brain disaster on network errors. - ## Reporting bugs Report bugs and propose new features [here](https://github.com/VictoriaMetrics/VictoriaMetrics/issues). - ## List of command-line flags -* [List of command-line flags for vminsert](#list-of-command-line-flags-for-vminsert) -* [List of command-line flags for vmselect](#list-of-command-line-flags-for-vmselect) -* [List of command-line flags for vmstorage](#list-of-command-line-flags-for-vmstorage) - +- [List of command-line flags for vminsert](#list-of-command-line-flags-for-vminsert) +- [List of command-line flags for vmselect](#list-of-command-line-flags-for-vmselect) +- [List of command-line flags for vmstorage](#list-of-command-line-flags-for-vmstorage) ### List of command-line flags for vminsert @@ -488,135 +462,135 @@ Below is the output for `/path/to/vminsert -help`: ``` -cluster.tls - Whether to use TLS for connections to -storageNode. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection + Whether to use TLS for connections to -storageNode. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection -cluster.tlsCAFile string - Path to TLS CA file to use for verifying certificates provided by -storageNode. By default system CA is used. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection + Path to TLS CA file to use for verifying certificates provided by -storageNode. By default system CA is used. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection -cluster.tlsCertFile string - Path to client-side TLS certificate file to use when connecting to -storageNode. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection + Path to client-side TLS certificate file to use when connecting to -storageNode. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection -cluster.tlsKeyFile string - Path to client-side TLS key file to use when connecting to -storageNode. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection + Path to client-side TLS key file to use when connecting to -storageNode. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection -clusternativeListenAddr string - TCP address to listen for data from other vminsert nodes in multi-level cluster setup. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#multi-level-cluster-setup . Usually :8400 must be set. Doesn't work if empty + TCP address to listen for data from other vminsert nodes in multi-level cluster setup. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#multi-level-cluster-setup . Usually :8400 must be set. Doesn't work if empty -csvTrimTimestamp duration - Trim timestamps when importing csv data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) + Trim timestamps when importing csv data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) -datadog.maxInsertRequestSize size - The maximum size in bytes of a single DataDog POST request to /api/v1/series - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 67108864) + The maximum size in bytes of a single DataDog POST request to /api/v1/series + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 67108864) -disableRerouting - Whether to disable re-routing when some of vmstorage nodes accept incoming data at slower speed compared to other storage nodes. Disabled re-routing limits the ingestion rate by the slowest vmstorage node. On the other side, disabled re-routing minimizes the number of active time series in the cluster during rolling restarts and during spikes in series churn rate. See also -dropSamplesOnOverload (default true) + Whether to disable re-routing when some of vmstorage nodes accept incoming data at slower speed compared to other storage nodes. Disabled re-routing limits the ingestion rate by the slowest vmstorage node. On the other side, disabled re-routing minimizes the number of active time series in the cluster during rolling restarts and during spikes in series churn rate. See also -dropSamplesOnOverload (default true) -dropSamplesOnOverload - Whether to drop incoming samples if the destination vmstorage node is overloaded and/or unavailable. This prioritizes cluster availability over consistency, e.g. the cluster continues accepting all the ingested samples, but some of them may be dropped if vmstorage nodes are temporarily unavailable and/or overloaded + Whether to drop incoming samples if the destination vmstorage node is overloaded and/or unavailable. This prioritizes cluster availability over consistency, e.g. the cluster continues accepting all the ingested samples, but some of them may be dropped if vmstorage nodes are temporarily unavailable and/or overloaded -enableTCP6 - Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used + Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used -envflag.enable - Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details + Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details -envflag.prefix string - Prefix for environment variables if -envflag.enable is set + Prefix for environment variables if -envflag.enable is set -eula - By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf + By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf -fs.disableMmap - Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() + Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() -graphiteListenAddr string - TCP and UDP address to listen for Graphite plaintext data. Usually :2003 must be set. Doesn't work if empty + TCP and UDP address to listen for Graphite plaintext data. Usually :2003 must be set. Doesn't work if empty -graphiteTrimTimestamp duration - Trim timestamps for Graphite data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) + Trim timestamps for Graphite data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) -http.connTimeout duration - Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) + Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) -http.disableResponseCompression - Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth + Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth -http.idleConnTimeout duration - Timeout for incoming idle http connections (default 1m0s) + Timeout for incoming idle http connections (default 1m0s) -http.maxGracefulShutdownDuration duration - The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) + The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) -http.pathPrefix string - An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus + An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus -http.shutdownDelay duration - Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers + Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers -httpListenAddr string - Address to listen for http connections (default ":8480") + Address to listen for http connections (default ":8480") -import.maxLineLen size - The maximum length in bytes of a single line accepted by /api/v1/import; the line length can be limited with 'max_rows_per_line' query arg passed to /api/v1/export - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 104857600) + The maximum length in bytes of a single line accepted by /api/v1/import; the line length can be limited with 'max_rows_per_line' query arg passed to /api/v1/export + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 104857600) -influx.databaseNames array - Comma-separated list of database names to return from /query and /influx/query API. This can be needed for accepting data from Telegraf plugins such as https://github.com/fangli/fluent-plugin-influxdb - Supports an array of values separated by comma or specified via multiple flags. + Comma-separated list of database names to return from /query and /influx/query API. This can be needed for accepting data from Telegraf plugins such as https://github.com/fangli/fluent-plugin-influxdb + Supports an array of values separated by comma or specified via multiple flags. -influx.maxLineSize size - The maximum size in bytes for a single InfluxDB line during parsing - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 262144) + The maximum size in bytes for a single InfluxDB line during parsing + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 262144) -influxDBLabel string - Default label for the DB name sent over '?db={db_name}' query parameter (default "db") + Default label for the DB name sent over '?db={db_name}' query parameter (default "db") -influxListenAddr string - TCP and UDP address to listen for InfluxDB line protocol data. Usually :8189 must be set. Doesn't work if empty. This flag isn't needed when ingesting data over HTTP - just send it to http://:8428/write + TCP and UDP address to listen for InfluxDB line protocol data. Usually :8189 must be set. Doesn't work if empty. This flag isn't needed when ingesting data over HTTP - just send it to http://:8428/write -influxMeasurementFieldSeparator string - Separator for '{measurement}{separator}{field_name}' metric name when inserted via InfluxDB line protocol (default "_") + Separator for '{measurement}{separator}{field_name}' metric name when inserted via InfluxDB line protocol (default "_") -influxSkipMeasurement - Uses '{field_name}' as a metric name while ignoring '{measurement}' and '-influxMeasurementFieldSeparator' + Uses '{field_name}' as a metric name while ignoring '{measurement}' and '-influxMeasurementFieldSeparator' -influxSkipSingleField - Uses '{measurement}' instead of '{measurement}{separator}{field_name}' for metic name if InfluxDB line contains only a single field + Uses '{measurement}' instead of '{measurement}{separator}{field_name}' for metic name if InfluxDB line contains only a single field -influxTrimTimestamp duration - Trim timestamps for InfluxDB line protocol data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) + Trim timestamps for InfluxDB line protocol data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) -insert.maxQueueDuration duration - The maximum duration for waiting in the queue for insert requests due to -maxConcurrentInserts (default 1m0s) + The maximum duration for waiting in the queue for insert requests due to -maxConcurrentInserts (default 1m0s) -loggerDisableTimestamps - Whether to disable writing timestamps in logs + Whether to disable writing timestamps in logs -loggerErrorsPerSecondLimit int - Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit + Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit -loggerFormat string - Format for logs. Possible values: default, json (default "default") + Format for logs. Possible values: default, json (default "default") -loggerLevel string - Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") + Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") -loggerOutput string - Output for the logs. Supported values: stderr, stdout (default "stderr") + Output for the logs. Supported values: stderr, stdout (default "stderr") -loggerTimezone string - Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") + Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") -loggerWarnsPerSecondLimit int - Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit + Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit -maxConcurrentInserts int - The maximum number of concurrent inserts. Default value should work for most cases, since it minimizes the overhead for concurrent inserts. This option is tigthly coupled with -insert.maxQueueDuration (default 16) + The maximum number of concurrent inserts. Default value should work for most cases, since it minimizes the overhead for concurrent inserts. This option is tigthly coupled with -insert.maxQueueDuration (default 16) -maxInsertRequestSize size - The maximum size in bytes of a single Prometheus remote_write API request - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) + The maximum size in bytes of a single Prometheus remote_write API request + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) -maxLabelValueLen int - The maximum length of label values in the accepted time series. Longer label values are truncated. In this case the vm_too_long_label_values_total metric at /metrics page is incremented (default 16384) + The maximum length of label values in the accepted time series. Longer label values are truncated. In this case the vm_too_long_label_values_total metric at /metrics page is incremented (default 16384) -maxLabelsPerTimeseries int - The maximum number of labels accepted per time series. Superfluous labels are dropped. In this case the vm_metrics_with_dropped_labels_total metric at /metrics page is incremented (default 30) + The maximum number of labels accepted per time series. Superfluous labels are dropped. In this case the vm_metrics_with_dropped_labels_total metric at /metrics page is incremented (default 30) -memory.allowedBytes size - Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -memory.allowedPercent float - Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) + Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) -opentsdbHTTPListenAddr string - TCP address to listen for OpentTSDB HTTP put requests. Usually :4242 must be set. Doesn't work if empty + TCP address to listen for OpentTSDB HTTP put requests. Usually :4242 must be set. Doesn't work if empty -opentsdbListenAddr string - TCP and UDP address to listen for OpentTSDB metrics. Telnet put messages and HTTP /api/put messages are simultaneously served on TCP port. Usually :4242 must be set. Doesn't work if empty + TCP and UDP address to listen for OpentTSDB metrics. Telnet put messages and HTTP /api/put messages are simultaneously served on TCP port. Usually :4242 must be set. Doesn't work if empty -opentsdbTrimTimestamp duration - Trim timestamps for OpenTSDB 'telnet put' data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) + Trim timestamps for OpenTSDB 'telnet put' data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) -opentsdbhttp.maxInsertRequestSize size - The maximum size of OpenTSDB HTTP put request - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) + The maximum size of OpenTSDB HTTP put request + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) -opentsdbhttpTrimTimestamp duration - Trim timestamps for OpenTSDB HTTP data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) + Trim timestamps for OpenTSDB HTTP data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) -relabelConfig string - Optional path to a file with relabeling rules, which are applied to all the ingested metrics. The path can point either to local file or to http url. See https://docs.victoriametrics.com/#relabeling for details. The config is reloaded on SIGHUP signal + Optional path to a file with relabeling rules, which are applied to all the ingested metrics. The path can point either to local file or to http url. See https://docs.victoriametrics.com/#relabeling for details. The config is reloaded on SIGHUP signal -relabelDebug - Whether to log metrics before and after relabeling with -relabelConfig. If the -relabelDebug is enabled, then the metrics aren't sent to storage. This is useful for debugging the relabeling configs + Whether to log metrics before and after relabeling with -relabelConfig. If the -relabelDebug is enabled, then the metrics aren't sent to storage. This is useful for debugging the relabeling configs -replicationFactor int - Replication factor for the ingested data, i.e. how many copies to make among distinct -storageNode instances. Note that vmselect must run with -dedup.minScrapeInterval=1ms for data de-duplication when replicationFactor is greater than 1. Higher values for -dedup.minScrapeInterval at vmselect is OK (default 1) + Replication factor for the ingested data, i.e. how many copies to make among distinct -storageNode instances. Note that vmselect must run with -dedup.minScrapeInterval=1ms for data de-duplication when replicationFactor is greater than 1. Higher values for -dedup.minScrapeInterval at vmselect is OK (default 1) -rpc.disableCompression - Whether to disable compression of RPC traffic. This reduces CPU usage at the cost of higher network bandwidth usage + Whether to disable compression of RPC traffic. This reduces CPU usage at the cost of higher network bandwidth usage -sortLabels - Whether to sort labels for incoming samples before writing them to storage. This may be needed for reducing memory usage at storage when the order of labels in incoming samples is random. For example, if m{k1="v1",k2="v2"} may be sent as m{k2="v2",k1="v1"}. Enabled sorting for labels can slow down ingestion performance a bit + Whether to sort labels for incoming samples before writing them to storage. This may be needed for reducing memory usage at storage when the order of labels in incoming samples is random. For example, if m{k1="v1",k2="v2"} may be sent as m{k2="v2",k1="v1"}. Enabled sorting for labels can slow down ingestion performance a bit -storageNode array - Comma-separated addresses of vmstorage nodes; usage: -storageNode=vmstorage-host1,...,vmstorage-hostN - Supports an array of values separated by comma or specified via multiple flags. + Comma-separated addresses of vmstorage nodes; usage: -storageNode=vmstorage-host1,...,vmstorage-hostN + Supports an array of values separated by comma or specified via multiple flags. -tls - Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set + Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set -tlsCertFile string - Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated -tlsKeyFile string - Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated -version - Show VictoriaMetrics version + Show VictoriaMetrics version ``` ### List of command-line flags for vmselect @@ -625,132 +599,132 @@ Below is the output for `/path/to/vmselect -help`: ``` -cacheDataPath string - Path to directory for cache files. Cache isn't saved if empty + Path to directory for cache files. Cache isn't saved if empty -cluster.tls - Whether to use TLS for connections to -storageNode. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection + Whether to use TLS for connections to -storageNode. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection -cluster.tlsCAFile string - Path to TLS CA file to use for verifying certificates provided by -storageNode. By default system CA is used. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection + Path to TLS CA file to use for verifying certificates provided by -storageNode. By default system CA is used. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection -cluster.tlsCertFile string - Path to client-side TLS certificate file to use when connecting to -storageNode. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection + Path to client-side TLS certificate file to use when connecting to -storageNode. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection -cluster.tlsKeyFile string - Path to client-side TLS key file to use when connecting to -storageNode. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection + Path to client-side TLS key file to use when connecting to -storageNode. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection -dedup.minScrapeInterval duration - Leave only the first sample in every time series per each discrete interval equal to -dedup.minScrapeInterval > 0. See https://docs.victoriametrics.com/#deduplication for details + Leave only the first sample in every time series per each discrete interval equal to -dedup.minScrapeInterval > 0. See https://docs.victoriametrics.com/#deduplication for details -downsampling.period array - Comma-separated downsampling periods in the format 'offset:period'. For example, '30d:10m' instructs to leave a single sample per 10 minutes for samples older than 30 days. See https://docs.victoriametrics.com/#downsampling for details - Supports an array of values separated by comma or specified via multiple flags. + Comma-separated downsampling periods in the format 'offset:period'. For example, '30d:10m' instructs to leave a single sample per 10 minutes for samples older than 30 days. See https://docs.victoriametrics.com/#downsampling for details + Supports an array of values separated by comma or specified via multiple flags. -enableTCP6 - Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used + Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used -envflag.enable - Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details + Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details -envflag.prefix string - Prefix for environment variables if -envflag.enable is set + Prefix for environment variables if -envflag.enable is set -eula - By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf + By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf -fs.disableMmap - Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() + Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() -graphiteTrimTimestamp duration - Trim timestamps for Graphite data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) + Trim timestamps for Graphite data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) -http.connTimeout duration - Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) + Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) -http.disableResponseCompression - Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth + Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth -http.idleConnTimeout duration - Timeout for incoming idle http connections (default 1m0s) + Timeout for incoming idle http connections (default 1m0s) -http.maxGracefulShutdownDuration duration - The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) + The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) -http.pathPrefix string - An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus + An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus -http.shutdownDelay duration - Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers + Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers -httpListenAddr string - Address to listen for http connections (default ":8481") + Address to listen for http connections (default ":8481") -loggerDisableTimestamps - Whether to disable writing timestamps in logs + Whether to disable writing timestamps in logs -loggerErrorsPerSecondLimit int - Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit + Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit -loggerFormat string - Format for logs. Possible values: default, json (default "default") + Format for logs. Possible values: default, json (default "default") -loggerLevel string - Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") + Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") -loggerOutput string - Output for the logs. Supported values: stderr, stdout (default "stderr") + Output for the logs. Supported values: stderr, stdout (default "stderr") -loggerTimezone string - Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") + Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") -loggerWarnsPerSecondLimit int - Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit + Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit -memory.allowedBytes size - Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -memory.allowedPercent float - Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) + Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) -replicationFactor int - How many copies of every time series is available on vmstorage nodes. See -replicationFactor command-line flag for vminsert nodes (default 1) + How many copies of every time series is available on vmstorage nodes. See -replicationFactor command-line flag for vminsert nodes (default 1) -search.cacheTimestampOffset duration - The maximum duration since the current time for response data, which is always queried from the original raw data, without using the response cache. Increase this value if you see gaps in responses due to time synchronization issues between VictoriaMetrics and data sources (default 5m0s) + The maximum duration since the current time for response data, which is always queried from the original raw data, without using the response cache. Increase this value if you see gaps in responses due to time synchronization issues between VictoriaMetrics and data sources (default 5m0s) -search.denyPartialResponse - Whether to deny partial responses if a part of -storageNode instances fail to perform queries; this trades availability over consistency; see also -search.maxQueryDuration + Whether to deny partial responses if a part of -storageNode instances fail to perform queries; this trades availability over consistency; see also -search.maxQueryDuration -search.disableCache - Whether to disable response caching. This may be useful during data backfilling + Whether to disable response caching. This may be useful during data backfilling -search.graphiteMaxPointsPerSeries int - The maximum number of points per series Graphite render API can return (default 1000000) + The maximum number of points per series Graphite render API can return (default 1000000) -search.graphiteStorageStep duration - The interval between datapoints stored in the database. It is used at Graphite Render API handler for normalizing the interval between datapoints in case it isn't normalized. It can be overriden by sending 'storage_step' query arg to /render API or by sending the desired interval via 'Storage-Step' http header during querying /render API (default 10s) + The interval between datapoints stored in the database. It is used at Graphite Render API handler for normalizing the interval between datapoints in case it isn't normalized. It can be overriden by sending 'storage_step' query arg to /render API or by sending the desired interval via 'Storage-Step' http header during querying /render API (default 10s) -search.latencyOffset duration - The time when data points become visible in query results after the collection. Too small value can result in incomplete last points for query results (default 30s) + The time when data points become visible in query results after the collection. Too small value can result in incomplete last points for query results (default 30s) -search.logSlowQueryDuration duration - Log queries with execution time exceeding this value. Zero disables slow query logging (default 5s) + Log queries with execution time exceeding this value. Zero disables slow query logging (default 5s) -search.maxConcurrentRequests int - The maximum number of concurrent search requests. It shouldn't be high, since a single request can saturate all the CPU cores. See also -search.maxQueueDuration (default 8) + The maximum number of concurrent search requests. It shouldn't be high, since a single request can saturate all the CPU cores. See also -search.maxQueueDuration (default 8) -search.maxExportDuration duration - The maximum duration for /api/v1/export call (default 720h0m0s) + The maximum duration for /api/v1/export call (default 720h0m0s) -search.maxLookback duration - Synonym to -search.lookback-delta from Prometheus. The value is dynamically detected from interval between time series datapoints if not set. It can be overridden on per-query basis via max_lookback arg. See also '-search.maxStalenessInterval' flag, which has the same meaining due to historical reasons + Synonym to -search.lookback-delta from Prometheus. The value is dynamically detected from interval between time series datapoints if not set. It can be overridden on per-query basis via max_lookback arg. See also '-search.maxStalenessInterval' flag, which has the same meaining due to historical reasons -search.maxPointsPerTimeseries int - The maximum points per a single timeseries returned from /api/v1/query_range. This option doesn't limit the number of scanned raw samples in the database. The main purpose of this option is to limit the number of per-series points returned to graphing UI such as Grafana. There is no sense in setting this limit to values bigger than the horizontal resolution of the graph (default 30000) + The maximum points per a single timeseries returned from /api/v1/query_range. This option doesn't limit the number of scanned raw samples in the database. The main purpose of this option is to limit the number of per-series points returned to graphing UI such as Grafana. There is no sense in setting this limit to values bigger than the horizontal resolution of the graph (default 30000) -search.maxQueryDuration duration - The maximum duration for query execution (default 30s) + The maximum duration for query execution (default 30s) -search.maxQueryLen size - The maximum search query length in bytes - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 16384) + The maximum search query length in bytes + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 16384) -search.maxQueueDuration duration - The maximum time the request waits for execution when -search.maxConcurrentRequests limit is reached; see also -search.maxQueryDuration (default 10s) + The maximum time the request waits for execution when -search.maxConcurrentRequests limit is reached; see also -search.maxQueryDuration (default 10s) -search.maxSamplesPerQuery int - The maximum number of raw samples a single query can process across all time series. This protects from heavy queries, which select unexpectedly high number of raw samples. See also -search.maxSamplesPerSeries (default 1000000000) + The maximum number of raw samples a single query can process across all time series. This protects from heavy queries, which select unexpectedly high number of raw samples. See also -search.maxSamplesPerSeries (default 1000000000) -search.maxSamplesPerSeries int - The maximum number of raw samples a single query can scan per each time series. See also -search.maxSamplesPerQuery (default 30000000) + The maximum number of raw samples a single query can scan per each time series. See also -search.maxSamplesPerQuery (default 30000000) -search.maxStalenessInterval duration - The maximum interval for staleness calculations. By default it is automatically calculated from the median interval between samples. This flag could be useful for tuning Prometheus data model closer to Influx-style data model. See https://prometheus.io/docs/prometheus/latest/querying/basics/#staleness for details. See also '-search.maxLookback' flag, which has the same meaning due to historical reasons + The maximum interval for staleness calculations. By default it is automatically calculated from the median interval between samples. This flag could be useful for tuning Prometheus data model closer to Influx-style data model. See https://prometheus.io/docs/prometheus/latest/querying/basics/#staleness for details. See also '-search.maxLookback' flag, which has the same meaning due to historical reasons -search.maxStatusRequestDuration duration - The maximum duration for /api/v1/status/* requests (default 5m0s) + The maximum duration for /api/v1/status/* requests (default 5m0s) -search.maxStepForPointsAdjustment duration - The maximum step when /api/v1/query_range handler adjusts points with timestamps closer than -search.latencyOffset to the current time. The adjustment is needed because such points may contain incomplete data (default 1m0s) + The maximum step when /api/v1/query_range handler adjusts points with timestamps closer than -search.latencyOffset to the current time. The adjustment is needed because such points may contain incomplete data (default 1m0s) -search.minStalenessInterval duration - The minimum interval for staleness calculations. This flag could be useful for removing gaps on graphs generated from time series with irregular intervals between samples. See also '-search.maxStalenessInterval' + The minimum interval for staleness calculations. This flag could be useful for removing gaps on graphs generated from time series with irregular intervals between samples. See also '-search.maxStalenessInterval' -search.noStaleMarkers - Set this flag to true if the database doesn't contain Prometheus stale markers, so there is no need in spending additional CPU time on its handling. Staleness markers may exist only in data obtained from Prometheus scrape targets + Set this flag to true if the database doesn't contain Prometheus stale markers, so there is no need in spending additional CPU time on its handling. Staleness markers may exist only in data obtained from Prometheus scrape targets -search.queryStats.lastQueriesCount int - Query stats for /api/v1/status/top_queries is tracked on this number of last queries. Zero value disables query stats tracking (default 20000) + Query stats for /api/v1/status/top_queries is tracked on this number of last queries. Zero value disables query stats tracking (default 20000) -search.queryStats.minQueryDuration duration - The minimum duration for queries to track in query stats at /api/v1/status/top_queries. Queries with lower duration are ignored in query stats (default 1ms) + The minimum duration for queries to track in query stats at /api/v1/status/top_queries. Queries with lower duration are ignored in query stats (default 1ms) -search.resetCacheAuthKey string - Optional authKey for resetting rollup cache via /internal/resetRollupResultCache call + Optional authKey for resetting rollup cache via /internal/resetRollupResultCache call -search.treatDotsAsIsInRegexps - Whether to treat dots as is in regexp label filters used in queries. For example, foo{bar=~"a.b.c"} will be automatically converted to foo{bar=~"a\\.b\\.c"}, i.e. all the dots in regexp filters will be automatically escaped in order to match only dot char instead of matching any char. Dots in ".+", ".*" and ".{n}" regexps aren't escaped. This option is DEPRECATED in favor of {__graphite__="a.*.c"} syntax for selecting metrics matching the given Graphite metrics filter + Whether to treat dots as is in regexp label filters used in queries. For example, foo{bar=~"a.b.c"} will be automatically converted to foo{bar=~"a\\.b\\.c"}, i.e. all the dots in regexp filters will be automatically escaped in order to match only dot char instead of matching any char. Dots in ".+", ".*" and ".{n}" regexps aren't escaped. This option is DEPRECATED in favor of {__graphite__="a.*.c"} syntax for selecting metrics matching the given Graphite metrics filter -selectNode array - Comma-serparated addresses of vmselect nodes; usage: -selectNode=vmselect-host1,...,vmselect-hostN - Supports an array of values separated by comma or specified via multiple flags. + Comma-serparated addresses of vmselect nodes; usage: -selectNode=vmselect-host1,...,vmselect-hostN + Supports an array of values separated by comma or specified via multiple flags. -storageNode array - Comma-separated addresses of vmstorage nodes; usage: -storageNode=vmstorage-host1,...,vmstorage-hostN - Supports an array of values separated by comma or specified via multiple flags. + Comma-separated addresses of vmstorage nodes; usage: -storageNode=vmstorage-host1,...,vmstorage-hostN + Supports an array of values separated by comma or specified via multiple flags. -tls - Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set + Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set -tlsCertFile string - Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated -tlsKeyFile string - Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated -version - Show VictoriaMetrics version + Show VictoriaMetrics version ``` ### List of command-line flags for vmstorage @@ -759,149 +733,147 @@ Below is the output for `/path/to/vmstorage -help`: ``` -bigMergeConcurrency int - The maximum number of CPU cores to use for big merges. Default value is used if set to 0 + The maximum number of CPU cores to use for big merges. Default value is used if set to 0 -cluster.tls - Whether to use TLS when accepting connections from vminsert and vmselect. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection + Whether to use TLS when accepting connections from vminsert and vmselect. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection -cluster.tlsCAFile string - Path to TLS CA file to use for verifying certificates provided by vminsert and vmselect. By default system CA is used. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection + Path to TLS CA file to use for verifying certificates provided by vminsert and vmselect. By default system CA is used. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection -cluster.tlsCertFile string - Path to server-side TLS certificate file to use when accepting connections from vminsert and vmselect. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection + Path to server-side TLS certificate file to use when accepting connections from vminsert and vmselect. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection -cluster.tlsKeyFile string - Path to server-side TLS key file to use when accepting connections from vminsert and vmselect. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection + Path to server-side TLS key file to use when accepting connections from vminsert and vmselect. See https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#mtls-protection -dedup.minScrapeInterval duration - Leave only the first sample in every time series per each discrete interval equal to -dedup.minScrapeInterval > 0. See https://docs.victoriametrics.com/#deduplication for details + Leave only the first sample in every time series per each discrete interval equal to -dedup.minScrapeInterval > 0. See https://docs.victoriametrics.com/#deduplication for details -denyQueriesOutsideRetention - Whether to deny queries outside of the configured -retentionPeriod. When set, then /api/v1/query_range would return '503 Service Unavailable' error for queries with 'from' value outside -retentionPeriod. This may be useful when multiple data sources with distinct retentions are hidden behind query-tee + Whether to deny queries outside of the configured -retentionPeriod. When set, then /api/v1/query_range would return '503 Service Unavailable' error for queries with 'from' value outside -retentionPeriod. This may be useful when multiple data sources with distinct retentions are hidden behind query-tee -downsampling.period array - Comma-separated downsampling periods in the format 'offset:period'. For example, '30d:10m' instructs to leave a single sample per 10 minutes for samples older than 30 days. See https://docs.victoriametrics.com/#downsampling for details - Supports an array of values separated by comma or specified via multiple flags. + Comma-separated downsampling periods in the format 'offset:period'. For example, '30d:10m' instructs to leave a single sample per 10 minutes for samples older than 30 days. See https://docs.victoriametrics.com/#downsampling for details + Supports an array of values separated by comma or specified via multiple flags. -enableTCP6 - Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used + Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used -envflag.enable - Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details + Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details -envflag.prefix string - Prefix for environment variables if -envflag.enable is set + Prefix for environment variables if -envflag.enable is set -eula - By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf + By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf -finalMergeDelay duration - The delay before starting final merge for per-month partition after no new data is ingested into it. Final merge may require additional disk IO and CPU resources. Final merge may increase query speed and reduce disk space usage in some cases. Zero value disables final merge + The delay before starting final merge for per-month partition after no new data is ingested into it. Final merge may require additional disk IO and CPU resources. Final merge may increase query speed and reduce disk space usage in some cases. Zero value disables final merge -forceFlushAuthKey string - authKey, which must be passed in query string to /internal/force_flush pages + authKey, which must be passed in query string to /internal/force_flush pages -forceMergeAuthKey string - authKey, which must be passed in query string to /internal/force_merge pages + authKey, which must be passed in query string to /internal/force_merge pages -fs.disableMmap - Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() + Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() -http.connTimeout duration - Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) + Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) -http.disableResponseCompression - Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth + Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth -http.idleConnTimeout duration - Timeout for incoming idle http connections (default 1m0s) + Timeout for incoming idle http connections (default 1m0s) -http.maxGracefulShutdownDuration duration - The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) + The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) -http.pathPrefix string - An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus + An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus -http.shutdownDelay duration - Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers + Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers -httpListenAddr string - Address to listen for http connections (default ":8482") + Address to listen for http connections (default ":8482") -logNewSeries - Whether to log new series. This option is for debug purposes only. It can lead to performance issues when big number of new series are ingested into VictoriaMetrics + Whether to log new series. This option is for debug purposes only. It can lead to performance issues when big number of new series are ingested into VictoriaMetrics -loggerDisableTimestamps - Whether to disable writing timestamps in logs + Whether to disable writing timestamps in logs -loggerErrorsPerSecondLimit int - Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit + Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit -loggerFormat string - Format for logs. Possible values: default, json (default "default") + Format for logs. Possible values: default, json (default "default") -loggerLevel string - Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") + Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") -loggerOutput string - Output for the logs. Supported values: stderr, stdout (default "stderr") + Output for the logs. Supported values: stderr, stdout (default "stderr") -loggerTimezone string - Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") + Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") -loggerWarnsPerSecondLimit int - Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit + Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit -memory.allowedBytes size - Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -memory.allowedPercent float - Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) + Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) -precisionBits int - The number of precision bits to store per each value. Lower precision bits improves data compression at the cost of precision loss (default 64) + The number of precision bits to store per each value. Lower precision bits improves data compression at the cost of precision loss (default 64) -retentionPeriod value - Data with timestamps outside the retentionPeriod is automatically deleted - The following optional suffixes are supported: h (hour), d (day), w (week), y (year). If suffix isn't set, then the duration is counted in months (default 1) + Data with timestamps outside the retentionPeriod is automatically deleted + The following optional suffixes are supported: h (hour), d (day), w (week), y (year). If suffix isn't set, then the duration is counted in months (default 1) -rpc.disableCompression - Disable compression of RPC traffic. This reduces CPU usage at the cost of higher network bandwidth usage + Disable compression of RPC traffic. This reduces CPU usage at the cost of higher network bandwidth usage -search.maxTagKeys int - The maximum number of tag keys returned per search (default 100000) + The maximum number of tag keys returned per search (default 100000) -search.maxTagValueSuffixesPerSearch int - The maximum number of tag value suffixes returned from /metrics/find (default 100000) + The maximum number of tag value suffixes returned from /metrics/find (default 100000) -search.maxTagValues int - The maximum number of tag values returned per search (default 100000) + The maximum number of tag values returned per search (default 100000) -search.maxUniqueTimeseries int - The maximum number of unique time series a single query can process. This allows protecting against heavy queries, which select unexpectedly high number of series. See also -search.maxSamplesPerQuery and -search.maxSamplesPerSeries (default 300000) + The maximum number of unique time series a single query can process. This allows protecting against heavy queries, which select unexpectedly high number of series. See also -search.maxSamplesPerQuery and -search.maxSamplesPerSeries (default 300000) -smallMergeConcurrency int - The maximum number of CPU cores to use for small merges. Default value is used if set to 0 + The maximum number of CPU cores to use for small merges. Default value is used if set to 0 -snapshotAuthKey string - authKey, which must be passed in query string to /snapshot* pages + authKey, which must be passed in query string to /snapshot* pages -storage.cacheSizeIndexDBDataBlocks size - Overrides max size for indexdb/dataBlocks cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Overrides max size for indexdb/dataBlocks cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -storage.cacheSizeIndexDBIndexBlocks size - Overrides max size for indexdb/indexBlocks cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Overrides max size for indexdb/indexBlocks cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -storage.cacheSizeStorageTSID size - Overrides max size for storage/tsid cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Overrides max size for storage/tsid cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -storage.maxDailySeries int - The maximum number of unique series can be added to the storage during the last 24 hours. Excess series are logged and dropped. This can be useful for limiting series churn rate. See also -storage.maxHourlySeries + The maximum number of unique series can be added to the storage during the last 24 hours. Excess series are logged and dropped. This can be useful for limiting series churn rate. See also -storage.maxHourlySeries -storage.maxHourlySeries int - The maximum number of unique series can be added to the storage during the last hour. Excess series are logged and dropped. This can be useful for limiting series cardinality. See also -storage.maxDailySeries + The maximum number of unique series can be added to the storage during the last hour. Excess series are logged and dropped. This can be useful for limiting series cardinality. See also -storage.maxDailySeries -storage.minFreeDiskSpaceBytes size - The minimum free disk space at -storageDataPath after which the storage stops accepting new data - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 10000000) + The minimum free disk space at -storageDataPath after which the storage stops accepting new data + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 10000000) -storageDataPath string - Path to storage data (default "vmstorage-data") + Path to storage data (default "vmstorage-data") -tls - Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set + Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set -tlsCertFile string - Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated -tlsKeyFile string - Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated -version - Show VictoriaMetrics version + Show VictoriaMetrics version -vminsertAddr string - TCP address to accept connections from vminsert services (default ":8400") + TCP address to accept connections from vminsert services (default ":8400") -vmselectAddr string - TCP address to accept connections from vmselect services (default ":8401") + TCP address to accept connections from vmselect services (default ":8401") ``` - ## VictoriaMetrics Logo [Zip](VM_logo.zip) contains three folders with different image orientation (main color and inverted version). Files included in each folder: -* 2 JPEG Preview files -* 2 PNG Preview files with transparent background -* 2 EPS Adobe Illustrator EPS10 files - +- 2 JPEG Preview files +- 2 PNG Preview files with transparent background +- 2 EPS Adobe Illustrator EPS10 files ### Logo Usage Guidelines -#### Font used: +#### Font used -* Lato Black -* Lato Regular +- Lato Black +- Lato Regular -#### Color Palette: +#### Color Palette -* HEX [#110f0f](https://www.color-hex.com/color/110f0f) -* HEX [#ffffff](https://www.color-hex.com/color/ffffff) +- HEX [#110f0f](https://www.color-hex.com/color/110f0f) +- HEX [#ffffff](https://www.color-hex.com/color/ffffff) -### We kindly ask: +### We kindly ask - Please don't use any other font instead of suggested. - There should be sufficient clear space around the logo. diff --git a/docs/FAQ.md b/docs/FAQ.md index ee3d0923d..a814f26db 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -8,32 +8,26 @@ sort: 14 To provide the best monitoring solution. - ## Who uses VictoriaMetrics? See [case studies](https://docs.victoriametrics.com/CaseStudies.html). - ## Which features does VictoriaMetrics have? See [these docs](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#prominent-features). - ## Are there performance comparisons with other solutions? Yes. See [these benchmarks](https://docs.victoriametrics.com/Articles.html#benchmarks). - ## How to start using VictoriaMetrics? See [these docs](https://docs.victoriametrics.com/Quick-Start.html). - ## Does VictoriaMetrics support replication? Yes. See [these docs](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#replication-and-data-safety) for details. - ## Can I use VictoriaMetrics instead of Prometheus? Yes in most cases. VictoriaMetrics can substitute Prometheus in the following aspects: @@ -42,43 +36,40 @@ Yes in most cases. VictoriaMetrics can substitute Prometheus in the following as * Prometheus-compatible alerting rules and recording rules can be processed with [vmalert](https://docs.victoriametrics.com/vmalert.html). * Prometheus-compatible querying in Grafana is supported by VictoriaMetrics. See [these docs](https://docs.victoriametrics.com/#grafana-setup). - ## What is the difference between vmagent and Prometheus? While both [vmagent](https://docs.victoriametrics.com/vmagent.html) and Prometheus may scrape Prometheus targets (aka `/metrics` pages) according to the provided Prometheus-compatible [scrape configs](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config) and send data to multiple remote storage systems, vmagent has the following additional features: -- vmagent usually requires lower amounts of CPU, RAM and disk IO compared to Prometheus when scraping an enormous number of targets (more than 1000) +* vmagent usually requires lower amounts of CPU, RAM and disk IO compared to Prometheus when scraping an enormous number of targets (more than 1000) or targets with a great number of exposed metrics. -- vmagent provides independent disk-backed buffers for each configured remote storage (see `-remoteWrite.url`). This means that slow or temporarily unavailable storage +* vmagent provides independent disk-backed buffers for each configured remote storage (see `-remoteWrite.url`). This means that slow or temporarily unavailable storage doesn't prevent it from sending data to healthy storage in parallel. Prometheus uses a single shared buffer for all the configured remote storage systems (see `remote_write->url`) with a hardcoded retention of 2 hours. -- vmagent may accept, relabel and filter data obtained via multiple data ingestion protocols in addition to data scraped from Prometheus targets. +* vmagent may accept, relabel and filter data obtained via multiple data ingestion protocols in addition to data scraped from Prometheus targets. That means it supports both `pull` and `push` protocols for data ingestion. See [these docs](https://docs.victoriametrics.com/vmagent.html#features) for details. -- vmagent may be used in different use cases: - - [IoT and edge monitoring](https://docs.victoriametrics.com/vmagent.html#iot-and-edge-monitoring) - - [Drop-in replacement for Prometheus](https://docs.victoriametrics.com/vmagent.html#drop-in-replacement-for-prometheus) - - [Replication and High Availability](https://docs.victoriametrics.com/vmagent.html#replication-and-high-availability) - - [Relabeling and Filtering](https://docs.victoriametrics.com/vmagent.html#relabeling-and-filtering) - - [Splitting data streams among multiple systems](https://docs.victoriametrics.com/vmagent.html#splitting-data-streams-among-multiple-systems) - - [Prometheus remote_write proxy](https://docs.victoriametrics.com/vmagent.html#prometheus-remote_write-proxy) - +* vmagent may be used in different use cases: + * [IoT and edge monitoring](https://docs.victoriametrics.com/vmagent.html#iot-and-edge-monitoring) + * [Drop-in replacement for Prometheus](https://docs.victoriametrics.com/vmagent.html#drop-in-replacement-for-prometheus) + * [Replication and High Availability](https://docs.victoriametrics.com/vmagent.html#replication-and-high-availability) + * [Relabeling and Filtering](https://docs.victoriametrics.com/vmagent.html#relabeling-and-filtering) + * [Splitting data streams among multiple systems](https://docs.victoriametrics.com/vmagent.html#splitting-data-streams-among-multiple-systems) + * [Prometheus remote_write proxy](https://docs.victoriametrics.com/vmagent.html#prometheus-remote_write-proxy) ## What is the difference between vmagent and Prometheus agent? Both [vmagent](https://docs.victoriametrics.com/vmagent.html) and [Prometheus agent](https://prometheus.io/blog/2021/11/16/agent/) serve the same purpose – to efficently scrape Prometheus-compatible targets at the edge. They have the following differences: -- vmagent usually requires lower amounts of CPU, RAM and disk IO compared to the Prometheus agent. -- Prometheus agent supports only pull-based data collection (e.g. it can scrape Prometheus-compatible targets), while vmagent supports both pull and push data collection – it can accept data via many popular data ingestion protocols such as InfluxDB line protocol, Graphite protocol, OpenTSDB protocol, DataDog protocol, Prometheus protocol, CSV and JSON – see [these docs](https://docs.victoriametrics.com/vmagent.html#features). -- vmagent can easily scale horizontally to multiple instances for scraping a big number of targets – see [these docs](https://docs.victoriametrics.com/vmagent.html#scraping-big-number-of-targets). -- vmagent supports [improved relabeling](https://docs.victoriametrics.com/vmagent.html#relabeling). -- vmagent can limit the number of scraped metrics per target – see [these docs](https://docs.victoriametrics.com/vmagent.html#cardinality-limiter). -- vmagent supports loading scrape configs from multiple files – see [these docs](https://docs.victoriametrics.com/vmagent.html#loading-scrape-configs-from-multiple-files). -- vmagent supports data reading and data writing from/to Kafka – see [these docs](https://docs.victoriametrics.com/vmagent.html#kafka-integration). -- vmagent can read and update scrape configs from http and https URLs, while the Prometheus agent can read them only from the local file system. - +* vmagent usually requires lower amounts of CPU, RAM and disk IO compared to the Prometheus agent. +* Prometheus agent supports only pull-based data collection (e.g. it can scrape Prometheus-compatible targets), while vmagent supports both pull and push data collection – it can accept data via many popular data ingestion protocols such as InfluxDB line protocol, Graphite protocol, OpenTSDB protocol, DataDog protocol, Prometheus protocol, CSV and JSON – see [these docs](https://docs.victoriametrics.com/vmagent.html#features). +* vmagent can easily scale horizontally to multiple instances for scraping a big number of targets – see [these docs](https://docs.victoriametrics.com/vmagent.html#scraping-big-number-of-targets). +* vmagent supports [improved relabeling](https://docs.victoriametrics.com/vmagent.html#relabeling). +* vmagent can limit the number of scraped metrics per target – see [these docs](https://docs.victoriametrics.com/vmagent.html#cardinality-limiter). +* vmagent supports loading scrape configs from multiple files – see [these docs](https://docs.victoriametrics.com/vmagent.html#loading-scrape-configs-from-multiple-files). +* vmagent supports data reading and data writing from/to Kafka – see [these docs](https://docs.victoriametrics.com/vmagent.html#kafka-integration). +* vmagent can read and update scrape configs from http and https URLs, while the Prometheus agent can read them only from the local file system. ## Is it safe to enable [remote write](https://prometheus.io/docs/operating/integrations/#remote-endpoints-and-storage) in Prometheus? @@ -88,133 +79,127 @@ and new data is available for querying via Prometheus as usual. It is recommended using [vmagent](https://docs.victoriametrics.com/vmagent.html) for scraping Prometheus targets and writing data to VictoriaMetrics. - ## How does VictoriaMetrics compare to other remote storage solutions for Prometheus such as [M3 from Uber](https://eng.uber.com/m3/), [Thanos](https://github.com/thanos-io/thanos), [Cortex](https://github.com/cortexproject/cortex), etc.? VictoriaMetrics is simpler, faster, more cost-effective and it provides [MetricsQL query language](MetricsQL) based on PromQL. The simplicity is twofold: -- It is simpler to configure and operate. There is no need for configuring [sidecars](https://github.com/thanos-io/thanos/blob/master/docs/components/sidecar.md), +* It is simpler to configure and operate. There is no need for configuring [sidecars](https://github.com/thanos-io/thanos/blob/master/docs/components/sidecar.md), fighting the [gossip protocol](https://github.com/improbable-eng/thanos/blob/030bc345c12c446962225221795f4973848caab5/docs/proposals/completed/201809_gossip-removal.md) or setting up third-party systems such as [Consul](https://github.com/cortexproject/cortex/issues/157), [Cassandra](https://cortexmetrics.io/docs/chunks-storage/running-chunks-storage-with-cassandra/), [DynamoDB](https://cortexmetrics.io/docs/chunks-storage/aws-tips/) or [Memcached](https://cortexmetrics.io/docs/chunks-storage/caching/). -- VictoriaMetrics has a simpler architecture. This means fewer bugs and more useful features in the long run compared to competing TSDBs. +* VictoriaMetrics has a simpler architecture. This means fewer bugs and more useful features in the long run compared to competing TSDBs. See [comparing Thanos to VictoriaMetrics cluster](https://medium.com/@valyala/comparing-thanos-to-victoriametrics-cluster-b193bea1683) and the [Remote Write Storage Wars](https://promcon.io/2019-munich/talks/remote-write-storage-wars/) talk from [PromCon 2019](https://promcon.io/2019-munich/talks/remote-write-storage-wars/). VictoriaMetrics also [uses less RAM than Thanos components](https://github.com/thanos-io/thanos/issues/448). - ## What is the difference between VictoriaMetrics and [QuestDB](https://questdb.io/)? -- QuestDB needs more than 20x storage space than VictoriaMetrics. This translates to higher storage costs and slower queries over historical data, which must be read from the disk. -- QuestDB is much harder to set up and operate than VictoriaMetrics. Compare [setup instructions for QuestDB](https://questdb.io/docs/get-started/binaries) to [setup instructions for VictoriaMetrics](https://docs.victoriametrics.com/#how-to-start-victoriametrics). -- VictoriaMetrics provides the [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html) query language, which is better suited for typical queries over time series data than the SQL-like query language provided by QuestDB. See [this article](https://valyala.medium.com/promql-tutorial-for-beginners-9ab455142085) for details. -- VictoriaMetrics can be queried via the [Prometheus querying API](https://docs.victoriametrics.com/#prometheus-querying-api-usage) and via [Graphite's API](https://docs.victoriametrics.com/#graphite-api-usage). -- Thanks to PromQL support, VictoriaMetrics [can be used as a drop-in replacement for Prometheus in Grafana](https://docs.victoriametrics.com/#grafana-setup), while QuestDB needs a full rewrite of existing dashboards in Grafana. -- Thanks to Prometheus' remote_write API support, VictoriaMetrics can be used as a long-term storage for Prometheus or for [vmagent](https://docs.victoriametrics.com/vmagent.html), while QuestDB has no integration with Prometheus. -- QuestDB [supports a smaller range of popular data ingestion protocols](https://questdb.io/docs/develop/insert-data) compared to VictoriaMetrics (compare to [the list of supported data ingestion protocols for VictoriaMetrics](https://docs.victoriametrics.com/#how-to-import-time-series-data)). -- [VictoriaMetrics supports backfilling (e.g. storing historical data) out of the box](https://docs.victoriametrics.com/#backfilling), while QuestDB provides [very limited support for backfilling](https://questdb.io/blog/2021/05/10/questdb-release-6-0-tsbs-benchmark#the-problem-with-out-of-order-data). - +* QuestDB needs more than 20x storage space than VictoriaMetrics. This translates to higher storage costs and slower queries over historical data, which must be read from the disk. +* QuestDB is much harder to set up and operate than VictoriaMetrics. Compare [setup instructions for QuestDB](https://questdb.io/docs/get-started/binaries) to [setup instructions for VictoriaMetrics](https://docs.victoriametrics.com/#how-to-start-victoriametrics). +* VictoriaMetrics provides the [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html) query language, which is better suited for typical queries over time series data than the SQL-like query language provided by QuestDB. See [this article](https://valyala.medium.com/promql-tutorial-for-beginners-9ab455142085) for details. +* VictoriaMetrics can be queried via the [Prometheus querying API](https://docs.victoriametrics.com/#prometheus-querying-api-usage) and via [Graphite's API](https://docs.victoriametrics.com/#graphite-api-usage). +* Thanks to PromQL support, VictoriaMetrics [can be used as a drop-in replacement for Prometheus in Grafana](https://docs.victoriametrics.com/#grafana-setup), while QuestDB needs a full rewrite of existing dashboards in Grafana. +* Thanks to Prometheus' remote_write API support, VictoriaMetrics can be used as a long-term storage for Prometheus or for [vmagent](https://docs.victoriametrics.com/vmagent.html), while QuestDB has no integration with Prometheus. +* QuestDB [supports a smaller range of popular data ingestion protocols](https://questdb.io/docs/develop/insert-data) compared to VictoriaMetrics (compare to [the list of supported data ingestion protocols for VictoriaMetrics](https://docs.victoriametrics.com/#how-to-import-time-series-data)). +* [VictoriaMetrics supports backfilling (e.g. storing historical data) out of the box](https://docs.victoriametrics.com/#backfilling), while QuestDB provides [very limited support for backfilling](https://questdb.io/blog/2021/05/10/questdb-release-6-0-tsbs-benchmark#the-problem-with-out-of-order-data). ## What is the difference between VictoriaMetrics and [Cortex](https://github.com/cortexproject/cortex)? VictoriaMetrics is similar to Cortex in the following aspects: -- Both systems accept data from [vmagent](https://docs.victoriametrics.com/vmagent.html) or Prometheus +* Both systems accept data from [vmagent](https://docs.victoriametrics.com/vmagent.html) or Prometheus via the standard [remote_write API](https://prometheus.io/docs/practices/remote_write/), so there is no need for running sidecars unlike in [Thanos](https://github.com/thanos-io/thanos)' case. -- Both systems support multi-tenancy out of the box. See [the corresponding docs for VictoriaMetrics](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#multitenancy). -- Both systems support data replication. See [replication in Cortex](https://github.com/cortexproject/cortex/blob/fe56f1420099aa1bf1ce09316c186e05bddee879/docs/architecture.md#hashing) and [replication in VictoriaMetrics](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#replication-and-data-safety). -- Both systems scale horizontally to multiple nodes. See [these docs](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#cluster-resizing-and-scalability) for details. -- Both systems support alerting and recording rules via the corresponding tools such as [vmalert](https://docs.victoriametrics.com/vmalert.html). -- Both systems can be queried via the [Prometheus querying API](https://prometheus.io/docs/prometheus/latest/querying/api/) and integrate perfectly with Grafana. +* Both systems support multi-tenancy out of the box. See [the corresponding docs for VictoriaMetrics](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#multitenancy). +* Both systems support data replication. See [replication in Cortex](https://github.com/cortexproject/cortex/blob/fe56f1420099aa1bf1ce09316c186e05bddee879/docs/architecture.md#hashing) and [replication in VictoriaMetrics](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#replication-and-data-safety). +* Both systems scale horizontally to multiple nodes. See [these docs](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#cluster-resizing-and-scalability) for details. +* Both systems support alerting and recording rules via the corresponding tools such as [vmalert](https://docs.victoriametrics.com/vmalert.html). +* Both systems can be queried via the [Prometheus querying API](https://prometheus.io/docs/prometheus/latest/querying/api/) and integrate perfectly with Grafana. The main differences between Cortex and VictoriaMetrics: -- Cortex re-uses Prometheus source code, while VictoriaMetrics is written from scratch. -- Cortex heavily relies on third-party services such as Consul, Memcache, DynamoDB, BigTable, Cassandra, etc. +* Cortex re-uses Prometheus source code, while VictoriaMetrics is written from scratch. +* Cortex heavily relies on third-party services such as Consul, Memcache, DynamoDB, BigTable, Cassandra, etc. This may increase operational complexity and reduce system reliability compared to VictoriaMetrics' case, which doesn't use any external services. Compare [Cortex' Architecture](https://github.com/cortexproject/cortex/blob/master/docs/architecture.md) to [VictoriaMetrics' architecture](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#architecture-overview). -- VictoriaMetrics provides [production-ready single-node solution](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html), +* VictoriaMetrics provides [production-ready single-node solution](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html), which is much easier to set up and operate than a Cortex cluster. -- Cortex may lose up to 12 hours of recent data on Ingestor failure – see [the corresponding docs](https://github.com/cortexproject/cortex/blob/fe56f1420099aa1bf1ce09316c186e05bddee879/docs/architecture.md#ingesters-failure-and-data-loss). +* Cortex may lose up to 12 hours of recent data on Ingestor failure – see [the corresponding docs](https://github.com/cortexproject/cortex/blob/fe56f1420099aa1bf1ce09316c186e05bddee879/docs/architecture.md#ingesters-failure-and-data-loss). VictoriaMetrics may lose only a few seconds of recent data, which isn't synced to persistent storage yet. See [this article for details](https://medium.com/@valyala/wal-usage-looks-broken-in-modern-time-series-databases-b62a627ab704). -- Cortex is usually slower and requires more CPU and RAM than VictoriaMetrics. See [this talk from adidas at PromCon 2019](https://promcon.io/2019-munich/talks/remote-write-storage-wars/) and [other case studies](https://docs.victoriametrics.com/CaseStudies.html). -- VictoriaMetrics accepts data in multiple popular data ingestion protocols additionally to Prometheus remote_write protocol – InfluxDB, OpenTSDB, Graphite, CSV, JSON, native binary. +* Cortex is usually slower and requires more CPU and RAM than VictoriaMetrics. See [this talk from adidas at PromCon 2019](https://promcon.io/2019-munich/talks/remote-write-storage-wars/) and [other case studies](https://docs.victoriametrics.com/CaseStudies.html). +* VictoriaMetrics accepts data in multiple popular data ingestion protocols additionally to Prometheus remote_write protocol – InfluxDB, OpenTSDB, Graphite, CSV, JSON, native binary. See [these docs](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-import-time-series-data) for details. -- VictoriaMetrics provides the [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html) query language, while Cortex provides the [PromQL](https://prometheus.io/docs/prometheus/latest/querying/basics/) query language. -- VictoriaMetrics can be queried via [Graphite's API](https://docs.victoriametrics.com/#graphite-api-usage). - +* VictoriaMetrics provides the [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html) query language, while Cortex provides the [PromQL](https://prometheus.io/docs/prometheus/latest/querying/basics/) query language. +* VictoriaMetrics can be queried via [Graphite's API](https://docs.victoriametrics.com/#graphite-api-usage). ## What is the difference between VictoriaMetrics and [Thanos](https://github.com/thanos-io/thanos)? -- Thanos re-uses Prometheus source code, while VictoriaMetrics is written from scratch. -- VictoriaMetrics accepts data via the [standard remote_write API for Prometheus](https://prometheus.io/docs/practices/remote_write/), +* Thanos re-uses Prometheus source code, while VictoriaMetrics is written from scratch. +* VictoriaMetrics accepts data via the [standard remote_write API for Prometheus](https://prometheus.io/docs/practices/remote_write/), while Thanos uses a non-standard [sidecar](https://github.com/thanos-io/thanos/blob/master/docs/components/sidecar.md) which must run alongside each Prometheus instance. -- The Thanos sidecar requires disabling data compaction in Prometheus, which may hurt Prometheus performance and increase RAM usage. See [these docs](https://thanos.io/tip/components/sidecar.md/) for more details. -- Thanos stores data in object storage (Amazon S3 or Google GCS), while VictoriaMetrics stores data in block storage +* The Thanos sidecar requires disabling data compaction in Prometheus, which may hurt Prometheus performance and increase RAM usage. See [these docs](https://thanos.io/tip/components/sidecar.md/) for more details. +* Thanos stores data in object storage (Amazon S3 or Google GCS), while VictoriaMetrics stores data in block storage ([GCP persistent disks](https://cloud.google.com/compute/docs/disks#pdspecs), Amazon EBS or bare metal HDD). While object storage is usually less expensive, block storage provides much lower latencies and higher throughput. VictoriaMetrics works perfectly with HDD-based block storage – there is no need for using more expensive SSD or NVMe disks in most cases. -- Thanos may lose up to 2 hours of recent data, which wasn't uploaded yet to object storage. VictoriaMetrics may lose only a few seconds of recent data, +* Thanos may lose up to 2 hours of recent data, which wasn't uploaded yet to object storage. VictoriaMetrics may lose only a few seconds of recent data, which hasn't been synced to persistent storage yet. See [this article for details](https://medium.com/@valyala/wal-usage-looks-broken-in-modern-time-series-databases-b62a627ab704). -- VictoriaMetrics provides a [production-ready single-node solution](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html), +* VictoriaMetrics provides a [production-ready single-node solution](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html), which is much easier to set up and operate than Thanos components. -- Thanos may be harder to set up and operate compared to VictoriaMetrics, since it has more moving parts, which can be connected with fewer reliable networks. +* Thanos may be harder to set up and operate compared to VictoriaMetrics, since it has more moving parts, which can be connected with fewer reliable networks. See [this article for details](https://medium.com/faun/comparing-thanos-to-victoriametrics-cluster-b193bea1683). -- Thanos is usually slower and requires more CPU and RAM than VictoriaMetrics. See [this talk from adidas at PromCon 2019](https://promcon.io/2019-munich/talks/remote-write-storage-wars/). -- VictoriaMetrics accepts data via multiple popular data ingestion protocols in addition to the Prometheus remote_write protocol – InfluxDB, OpenTSDB, Graphite, CSV, JSON, native binary. +* Thanos is usually slower and requires more CPU and RAM than VictoriaMetrics. See [this talk from adidas at PromCon 2019](https://promcon.io/2019-munich/talks/remote-write-storage-wars/). +* VictoriaMetrics accepts data via multiple popular data ingestion protocols in addition to the Prometheus remote_write protocol – InfluxDB, OpenTSDB, Graphite, CSV, JSON, native binary. See [these docs](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-import-time-series-data) for details. -- VictoriaMetrics provides the [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html) query language, while Thanos provides the [PromQL](https://prometheus.io/docs/prometheus/latest/querying/basics/) query language. -- VictoriaMetrics can be queried via [Graphite's API](https://docs.victoriametrics.com/#graphite-api-usage). - +* VictoriaMetrics provides the [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html) query language, while Thanos provides the [PromQL](https://prometheus.io/docs/prometheus/latest/querying/basics/) query language. +* VictoriaMetrics can be queried via [Graphite's API](https://docs.victoriametrics.com/#graphite-api-usage). ## How does VictoriaMetrics compare to [InfluxDB](https://www.influxdata.com/time-series-platform/influxdb/)? -- VictoriaMetrics requires [10x less RAM](https://medium.com/@valyala/insert-benchmarks-with-inch-influxdb-vs-victoriametrics-e31a41ae2893) and it [works faster](https://medium.com/@valyala/measuring-vertical-scalability-for-time-series-databases-in-google-cloud-92550d78d8ae). -- VictoriaMetrics needs lower amounts of storage space than InfluxDB for production data. -- VictoriaMetrics doesn't support InfluxQL or Flux but provides a better query language – [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html). See [this tutorial](https://medium.com/@valyala/promql-tutorial-for-beginners-9ab455142085) for details. -- VictoriaMetrics accepts data in multiple popular data ingestion protocols in addition to InfluxDB – Prometheus remote_write, OpenTSDB, Graphite, CSV, JSON, native binary. +* VictoriaMetrics requires [10x less RAM](https://medium.com/@valyala/insert-benchmarks-with-inch-influxdb-vs-victoriametrics-e31a41ae2893) and it [works faster](https://medium.com/@valyala/measuring-vertical-scalability-for-time-series-databases-in-google-cloud-92550d78d8ae). +* VictoriaMetrics needs lower amounts of storage space than InfluxDB for production data. +* VictoriaMetrics doesn't support InfluxQL or Flux but provides a better query language – [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html). See [this tutorial](https://medium.com/@valyala/promql-tutorial-for-beginners-9ab455142085) for details. +* VictoriaMetrics accepts data in multiple popular data ingestion protocols in addition to InfluxDB – Prometheus remote_write, OpenTSDB, Graphite, CSV, JSON, native binary. See [these docs](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-import-time-series-data) for details. -- VictoriaMetrics can be queried via [Graphite's API](https://docs.victoriametrics.com/#graphite-api-usage). - +* VictoriaMetrics can be queried via [Graphite's API](https://docs.victoriametrics.com/#graphite-api-usage). ## How does VictoriaMetrics compare to [TimescaleDB](https://www.timescale.com/)? -- TimescaleDB insists on using SQL as a query language. While SQL is more powerful than PromQL, this power is rarely required during typical usages of a TSDB. Real-world queries usually [look clearer and simpler when written in PromQL than in SQL](https://medium.com/@valyala/promql-tutorial-for-beginners-9ab455142085). -- VictoriaMetrics requires [up to 70x less storage space compared to TimescaleDB](https://medium.com/@valyala/when-size-matters-benchmarking-victoriametrics-vs-timescale-and-influxdb-6035811952d4) for storing the same amount of time series data. The gap in storage space usage can be lowered from 70x to 3x if [compression in TimescaleDB is properly configured](https://docs.timescale.com/latest/using-timescaledb/compression) (it isn't an easy task in general :)). -- VictoriaMetrics requires up to 10x less CPU and RAM resources than TimescaleDB for processing production data. See [this article](https://abiosgaming.com/press/high-cardinality-aggregations/) for details. -- TimescaleDB is [harder to set up, configure and operate](https://docs.timescale.com/timescaledb/latest/how-to-guides/install-timescaledb/self-hosted/ubuntu/installation-apt-ubuntu/) than VictoriaMetrics (see [how to run VictoriaMetrics](https://docs.victoriametrics.com/#how-to-start-victoriametrics)). -- VictoriaMetrics accepts data in multiple popular data ingestion protocols – InfluxDB, OpenTSDB, Graphite, CSV – while TimescaleDB supports only SQL inserts. -- VictoriaMetrics can be queried via [Graphite's API](https://docs.victoriametrics.com/#graphite-api-usage). - +* TimescaleDB insists on using SQL as a query language. While SQL is more powerful than PromQL, this power is rarely required during typical usages of a TSDB. Real-world queries usually [look clearer and simpler when written in PromQL than in SQL](https://medium.com/@valyala/promql-tutorial-for-beginners-9ab455142085). +* VictoriaMetrics requires [up to 70x less storage space compared to TimescaleDB](https://medium.com/@valyala/when-size-matters-benchmarking-victoriametrics-vs-timescale-and-influxdb-6035811952d4) for storing the same amount of time series data. The gap in storage space usage can be lowered from 70x to 3x if [compression in TimescaleDB is properly configured](https://docs.timescale.com/latest/using-timescaledb/compression) (it isn't an easy task in general :)). +* VictoriaMetrics requires up to 10x less CPU and RAM resources than TimescaleDB for processing production data. See [this article](https://abiosgaming.com/press/high-cardinality-aggregations/) for details. +* TimescaleDB is [harder to set up, configure and operate](https://docs.timescale.com/timescaledb/latest/how-to-guides/install-timescaledb/self-hosted/ubuntu/installation-apt-ubuntu/) than VictoriaMetrics (see [how to run VictoriaMetrics](https://docs.victoriametrics.com/#how-to-start-victoriametrics)). +* VictoriaMetrics accepts data in multiple popular data ingestion protocols – InfluxDB, OpenTSDB, Graphite, CSV – while TimescaleDB supports only SQL inserts. +* VictoriaMetrics can be queried via [Graphite's API](https://docs.victoriametrics.com/#graphite-api-usage). ## Does VictoriaMetrics use Prometheus technologies like other clustered TSDBs built on top of Prometheus such as [Thanos](https://github.com/thanos-io/thanos) or [Cortex](https://github.com/cortexproject/cortex)? No. VictoriaMetrics core is written in Go from scratch by [fasthttp](https://github.com/valyala/fasthttp)'s [author](https://github.com/valyala). The architecture is [optimized for storing and querying large amounts of time series data with high cardinality](https://medium.com/devopslinks/victoriametrics-creating-the-best-remote-storage-for-prometheus-5d92d66787ac). VictoriaMetrics storage uses [certain ideas from ClickHouse](https://medium.com/@valyala/how-victoriametrics-makes-instant-snapshots-for-multi-terabyte-time-series-data-e1f3fb0e0282). Special thanks to [Alexey Milovidov](https://github.com/alexey-milovidov). - ## What is the pricing for VictoriaMetrics? The following versions are open source and free: + * [Single-node version](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html). * [Cluster version](https://github.com/VictoriaMetrics/VictoriaMetrics/tree/cluster). We provide commercial support for both versions. [Contact us](mailto:info@victoriametrics.com) for the pricing. The following commercial versions of VictoriaMetrics are available: + * [Managed VictoriaMetrics at AWS](https://aws.amazon.com/marketplace/pp/prodview-4tbfq5icmbmyc) (aka managed Prometheus). The following commercial versions of VictoriaMetrics are planned: + * Managed VictoriaMetrics at Google Cloud. * Cloud monitoring solution based on VictoriaMetrics. [Contact us](mailto:info@victoriametrics.com) for more information on our plans. - ## Why doesn't VictoriaMetrics support the [Prometheus remote read API](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#%3Cremote_read%3E)? The remote read API requires transferring all the raw data for all the requested metrics over the given time range. For instance, @@ -225,19 +210,17 @@ Prometheus' remote read API isn't intended for querying foreign data – aka `gl So just query VictoriaMetrics directly via [vmui](https://docs.victoriametrics.com/#vmui), the [Prometheus Querying API](https://docs.victoriametrics.com/#prometheus-querying-api-usage) or via [Prometheus datasource in Grafana](https://docs.victoriametrics.com/#grafana-setup). - ## Does VictoriaMetrics deduplicate data from Prometheus instances scraping the same targets (aka `HA pairs`)? Yes. See [these docs](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#deduplication) for details. - ## Where is the source code of VictoriaMetrics? Source code for the following versions is available in the following places: + * [Single-node version](https://github.com/VictoriaMetrics/VictoriaMetrics) * [Cluster version](https://github.com/VictoriaMetrics/VictoriaMetrics/tree/cluster) - ## Is VictoriaMetrics a good fit for data from IoT sensors and industrial sensors? VictoriaMetrics is able to handle data from hundreds of millions of IoT sensors and industrial sensors. @@ -245,26 +228,22 @@ It supports [high cardinality data](https://medium.com/@valyala/high-cardinality perfectly [scales up on a single node](https://medium.com/@valyala/measuring-vertical-scalability-for-time-series-databases-in-google-cloud-92550d78d8ae) and scales horizontally to multiple nodes. - ## Where can I ask questions about VictoriaMetrics? Questions about VictoriaMetrics can be asked via the following channels: -- [Slack channel](https://slack.victoriametrics.com/) -- [Telegram channel](https://t.me/VictoriaMetrics_en) -- [Google group](https://groups.google.com/forum/#!forum/victorametrics-users) - +* [Slack channel](https://slack.victoriametrics.com/) +* [Telegram channel](https://t.me/VictoriaMetrics_en) +* [Google group](https://groups.google.com/forum/#!forum/victorametrics-users) ## Where can I file bugs and feature requests regarding VictoriaMetrics? File bugs and feature requests [here](https://github.com/VictoriaMetrics/VictoriaMetrics/issues). - ## Where can I find information about multi-tenancy? See [these docs](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#multitenancy). Multitenancy is supported only by the [cluster version](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html) of VictoriaMetrics. - ## How to set a memory limit for VictoriaMetrics components? All the VictoriaMetrics components provide command-line flags to control the size of internal buffers and caches: `-memory.allowedPercent` and `-memory.allowedBytes` (pass `-help` to any VictoriaMetrics component in order to see the description for these flags). These limits don't take into account additional memory, which may be needed for processing incoming queries. Hard limits may be enforced only by the OS via [cgroups](https://en.wikipedia.org/wiki/Cgroups), Docker (see [these docs](https://docs.docker.com/config/containers/resource_constraints)) or Kubernetes (see [these docs](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers)). @@ -276,22 +255,18 @@ Memory usage for VictoriaMetrics components can be tuned according to the follow * [Troubleshooting for vmagent](https://docs.victoriametrics.com/vmagent.html#troubleshooting) * [Troubleshooting for single-node VictoriaMetrics](https://docs.victoriametrics.com/#troubleshooting) - ## How can I run VictoriaMetrics on FreeBSD? VictoriaMetrics is included in FreeBSD ports, so just install it from there. See [this link](https://www.freebsd.org/cgi/ports.cgi?query=victoria&stype=all). - ## Does VictoriaMetrics support the Graphite query language? Yes. See [these docs](https://docs.victoriametrics.com/#graphite-api-usage). - ## What is an active time series? A time series is uniquely identified by its name plus a set of its labels. For example, `temperature{city="NY",country="US"}` and `temperature{city="SF",country="US"}` are two distinct series, since they differ by the `city` label. A time series is considered active if it receives at least a single new sample during the last hour. - ## What is high churn rate? If old time series are constantly substituted by new time series at a high rate, then such a state is called `high churn rate`. High churn rate has the following negative consequences: @@ -309,54 +284,44 @@ The main reason for high churn rate is a metric label with frequently changed va The solution against high churn rate is to identify and eliminate labels with frequently changed values. The [/api/v1/status/tsdb](https://docs.victoriametrics.com/#tsdb-stats) page can help determining these labels. - ## What is high cardinality? High cardinality usually means a high number of [active time series](#what-is-an-active-time-series). High cardinality may lead to high memory usage and/or to a high percentage of [slow inserts](#what-is-a-slow-insert). The source of high cardinality is usually a label with a large number of unique values, which presents a big share of the ingested time series. The solution is to identify and remove the source of high cardinality with the help of [/api/v1/status/tsdb](https://docs.victoriametrics.com/#tsdb-stats). - ## What is a slow insert? VictoriaMetrics maintains in-memory cache for mapping of [active time series](#what-is-an-active-time-series) into internal series ids. The cache size depends on the available memory for VictoriaMetrics in the host system. If the information about all the active time series doesn't fit the cache, then VictoriaMetrics needs to read and unpack the information from disk on every incoming sample for time series missing in the cache. This operation is much slower than the cache lookup, so such an insert is named a `slow insert`. A high percentage of slow inserts on the [official dashboard for VictoriaMetrics](https://docs.victoriametrics.com/#monitoring) indicates a memory shortage for the current number of [active time series](#what-is-an-active-time-series). Such a condition usually leads to a significant slowdown for data ingestion and to significantly increased disk IO and CPU usage. The solution is to add more memory or to reduce the number of [active time series](#what-is-an-active-time-series). The `/api/v1/status/tsdb` page can be helpful for locating the source of high number of active time seriess – see [these docs](https://docs.victoriametrics.com/#tsdb-stats). - ## How to optimize MetricsQL query? See [this article](https://valyala.medium.com/how-to-optimize-promql-and-metricsql-queries-85a1b75bf986). - ## Why isn't MetricsQL 100% compatible with PromQL? [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html) provides better user experience than PromQL. It fixes a few annoying issues in PromQL. This prevents MetricsQL to be 100% compatible with PromQL. See [this article](https://medium.com/@romanhavronenko/victoriametrics-promql-compliance-d4318203f51e) for details. - ## How to migrate data from Prometheus to VictoriaMetrics? Please see [these docs](https://docs.victoriametrics.com/vmctl.html#migrating-data-from-prometheus). - ## How to migrate data from InfluxDB to VictoriaMetrics? Please see [these docs](https://docs.victoriametrics.com/vmctl.html#migrating-data-from-influxdb-1x). - ## How to migrate data from OpenTSDB to VictoriaMetrics? Please see [these docs](https://docs.victoriametrics.com/vmctl.html#migrating-data-from-opentsdb). - ## How to migrate data from Graphite to VictoriaMetrics? Please use the [whisper-to-graphite](https://github.com/bzed/whisper-to-graphite) tool for reading data from Graphite and pushing them to VictoriaMetrics via [Graphite's import API](https://docs.victoriametrics.com/#how-to-send-data-from-graphite-compatible-agents-such-as-statsd). - ## Why do the same metrics have differences in VictoriaMetrics' and Prometheus' dashboards? There could be a slight difference in stored values for time series. Due to different compression algorithms, VM may reduce the precision for float values with more than 12 significant decimal digits. Please see [this article](https://valyala.medium.com/evaluating-performance-and-correctness-victoriametrics-response-e27315627e87). The query engine may behave differently for some functions. Please see [this article](https://medium.com/@romanhavronenko/victoriametrics-promql-compliance-d4318203f51e). - ## If downsampling and deduplication are enabled how will this work? [Deduplication](https://docs.victoriametrics.com/#deduplication) is a special case of zero-offset [downsampling](https://docs.victoriametrics.com/#downsampling). So, if both downsampling and deduplication are enabled, then deduplication is replaced by zero-offset downsampling diff --git a/docs/MetricsQL.md b/docs/MetricsQL.md index 6a1d8f1e9..9eaa373c0 100644 --- a/docs/MetricsQL.md +++ b/docs/MetricsQL.md @@ -13,6 +13,7 @@ However, there are some [intentional differences](https://medium.com/@romanhavro If you are unfamiliar with PromQL, then it is suggested reading [this tutorial for beginners](https://medium.com/@valyala/promql-tutorial-for-beginners-9ab455142085). The following functionality is implemented differently in MetricsQL compared to PromQL. This improves user experience: + * MetricsQL takes into account the previous point before the window in square brackets for range functions such as [rate](#rate) and [increase](#increase). This allows returning the exact results users expect for `increase(metric[$__interval])` queries instead of incomplete results Prometheus returns for such queries. * MetricsQL doesn't extrapolate range function results. This addresses [this issue from Prometheus](https://github.com/prometheus/prometheus/issues/3746). See technical details about VictoriaMetrics and Prometheus calculations for [rate](#rate) and [increase](#increase) [in this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1215#issuecomment-850305711). * MetricsQL returns the expected non-empty responses for [rate](#rate) with `step` values smaller than scrape interval. This addresses [this issue from Grafana](https://github.com/grafana/grafana/issues/11451). See also [this blog post](https://www.percona.com/blog/2020/02/28/better-prometheus-rate-function-with-victoriametrics/). @@ -30,27 +31,26 @@ MetricsQL implements [PromQL](https://medium.com/@valyala/promql-tutorial-for-be This functionality can be evaluated at [an editable Grafana dashboard](https://play-grafana.victoriametrics.com/d/4ome8yJmz/node-exporter-on-victoriametrics-demo) or at your own [VictoriaMetrics instance](https://docs.victoriametrics.com/#how-to-start-victoriametrics). -- Graphite-compatible filters can be passed via `{__graphite__="foo.*.bar"}` syntax. See [these docs](https://docs.victoriametrics.com/#selecting-graphite-metrics). VictoriaMetrics also can be used as Graphite datasource in Grafana. See [these docs](https://docs.victoriametrics.com/#graphite-api-usage) for details. See also [label_graphite_group](#label_graphite_group) function, which can be used for extracting the given groups from Graphite metric name. -- Lookbehind window in square brackets may be omitted. VictoriaMetrics automatically selects the lookbehind window depending on the current step used for building the graph (e.g. `step` query arg passed to [/api/v1/query_range](https://prometheus.io/docs/prometheus/latest/querying/api/#range-queries)). For instance, the following query is valid in VictoriaMetrics: `rate(node_network_receive_bytes_total)`. It is equivalent to `rate(node_network_receive_bytes_total[$__interval])` when used in Grafana. -- [Aggregate functions](#aggregate-functions) accept arbitrary number of args. For example, `avg(q1, q2, q3)` would return the average values for every point across time series returned by `q1`, `q2` and `q3`. -- [@ modifier](https://prometheus.io/docs/prometheus/latest/querying/basics/#modifier) can be put anywhere in the query. For example, `sum(foo) @ end()` calculates `sum(foo)` at the `end` timestamp of the selected time range `[start ... end]`. -- Arbitrary subexpression can be used as [@ modifier](https://prometheus.io/docs/prometheus/latest/querying/basics/#modifier). For example, `foo @ (end() - 1h)` calculates `foo` at the `end - 1 hour` timestamp on the selected time range `[start ... end]`. -- [offset](https://prometheus.io/docs/prometheus/latest/querying/basics/#offset-modifier), lookbehind window in square brackets and `step` value for [subquery](#subqueries) may refer to the current step aka `$__interval` value from Grafana with `[Ni]` syntax. For instance, `rate(metric[10i] offset 5i)` would return per-second rate over a range covering 10 previous steps with the offset of 5 steps. -- [offset](https://prometheus.io/docs/prometheus/latest/querying/basics/#offset-modifier) may be put anywere in the query. For instance, `sum(foo) offset 24h`. -- Lookbehind window in square brackets and [offset](https://prometheus.io/docs/prometheus/latest/querying/basics/#offset-modifier) may be fractional. For instance, `rate(node_network_receive_bytes_total[1.5m] offset 0.5d)`. -- The duration suffix is optional. The duration is in seconds if the suffix is missing. For example, `rate(m[300] offset 1800)` is equivalent to `rate(m[5m]) offset 30m`. -- The duration can be placed anywhere in the query. For example, `sum_over_time(m[1h]) / 1h` is equivalent to `sum_over_time(m[1h]) / 3600`. -- Trailing commas on all the lists are allowed - label filters, function args and with expressions. For instance, the following queries are valid: `m{foo="bar",}`, `f(a, b,)`, `WITH (x=y,) x`. This simplifies maintenance of multi-line queries. -- Metric names and metric labels may contain escaped chars. For instance, `foo\-bar{baz\=aa="b"}` is valid expression. It returns time series with name `foo-bar` containing label `baz=aa` with value `b`. Additionally, `\xXX` escape sequence is supported, where `XX` is hexadecimal representation of escaped char. -- Aggregate functions support optional `limit N` suffix in order to limit the number of output series. For example, `sum(x) by (y) limit 3` limits the number of output time series after the aggregation to 3. All the other time series are dropped. -- [histogram_quantile](#histogram_quantile) accepts optional third arg - `boundsLabel`. In this case it returns `lower` and `upper` bounds for the estimated percentile. See [this issue for details](https://github.com/prometheus/prometheus/issues/5706). -- `default` binary operator. `q1 default q2` fills gaps in `q1` with the corresponding values from `q2`. -- `if` binary operator. `q1 if q2` removes values from `q1` for missing values from `q2`. -- `ifnot` binary operator. `q1 ifnot q2` removes values from `q1` for existing values from `q2`. -- String literals may be concatenated. This is useful with `WITH` templates: `WITH (commonPrefix="long_metric_prefix_") {__name__=commonPrefix+"suffix1"} / {__name__=commonPrefix+"suffix2"}`. -- `WITH` templates. This feature simplifies writing and managing complex queries. Go to [WITH templates playground](https://play.victoriametrics.com/promql/expand-with-exprs) and try it. -- `keep_metric_names` modifier can be applied to all the [rollup functions](#rollup-functions) and [transform functions](#transform-functions). This modifier prevents from dropping metric names in function results. For example, `rate({__name__=~"foo|bar"}[5m]) keep_metric_names` leaves `foo` and `bar` metric names in the resulting time series. - +* Graphite-compatible filters can be passed via `{__graphite__="foo.*.bar"}` syntax. See [these docs](https://docs.victoriametrics.com/#selecting-graphite-metrics). VictoriaMetrics also can be used as Graphite datasource in Grafana. See [these docs](https://docs.victoriametrics.com/#graphite-api-usage) for details. See also [label_graphite_group](#label_graphite_group) function, which can be used for extracting the given groups from Graphite metric name. +* Lookbehind window in square brackets may be omitted. VictoriaMetrics automatically selects the lookbehind window depending on the current step used for building the graph (e.g. `step` query arg passed to [/api/v1/query_range](https://prometheus.io/docs/prometheus/latest/querying/api/#range-queries)). For instance, the following query is valid in VictoriaMetrics: `rate(node_network_receive_bytes_total)`. It is equivalent to `rate(node_network_receive_bytes_total[$__interval])` when used in Grafana. +* [Aggregate functions](#aggregate-functions) accept arbitrary number of args. For example, `avg(q1, q2, q3)` would return the average values for every point across time series returned by `q1`, `q2` and `q3`. +* [@ modifier](https://prometheus.io/docs/prometheus/latest/querying/basics/#modifier) can be put anywhere in the query. For example, `sum(foo) @ end()` calculates `sum(foo)` at the `end` timestamp of the selected time range `[start ... end]`. +* Arbitrary subexpression can be used as [@ modifier](https://prometheus.io/docs/prometheus/latest/querying/basics/#modifier). For example, `foo @ (end() - 1h)` calculates `foo` at the `end - 1 hour` timestamp on the selected time range `[start ... end]`. +* [offset](https://prometheus.io/docs/prometheus/latest/querying/basics/#offset-modifier), lookbehind window in square brackets and `step` value for [subquery](#subqueries) may refer to the current step aka `$__interval` value from Grafana with `[Ni]` syntax. For instance, `rate(metric[10i] offset 5i)` would return per-second rate over a range covering 10 previous steps with the offset of 5 steps. +* [offset](https://prometheus.io/docs/prometheus/latest/querying/basics/#offset-modifier) may be put anywere in the query. For instance, `sum(foo) offset 24h`. +* Lookbehind window in square brackets and [offset](https://prometheus.io/docs/prometheus/latest/querying/basics/#offset-modifier) may be fractional. For instance, `rate(node_network_receive_bytes_total[1.5m] offset 0.5d)`. +* The duration suffix is optional. The duration is in seconds if the suffix is missing. For example, `rate(m[300] offset 1800)` is equivalent to `rate(m[5m]) offset 30m`. +* The duration can be placed anywhere in the query. For example, `sum_over_time(m[1h]) / 1h` is equivalent to `sum_over_time(m[1h]) / 3600`. +* Trailing commas on all the lists are allowed - label filters, function args and with expressions. For instance, the following queries are valid: `m{foo="bar",}`, `f(a, b,)`, `WITH (x=y,) x`. This simplifies maintenance of multi-line queries. +* Metric names and metric labels may contain escaped chars. For instance, `foo\-bar{baz\=aa="b"}` is valid expression. It returns time series with name `foo-bar` containing label `baz=aa` with value `b`. Additionally, `\xXX` escape sequence is supported, where `XX` is hexadecimal representation of escaped char. +* Aggregate functions support optional `limit N` suffix in order to limit the number of output series. For example, `sum(x) by (y) limit 3` limits the number of output time series after the aggregation to 3. All the other time series are dropped. +* [histogram_quantile](#histogram_quantile) accepts optional third arg - `boundsLabel`. In this case it returns `lower` and `upper` bounds for the estimated percentile. See [this issue for details](https://github.com/prometheus/prometheus/issues/5706). +* `default` binary operator. `q1 default q2` fills gaps in `q1` with the corresponding values from `q2`. +* `if` binary operator. `q1 if q2` removes values from `q1` for missing values from `q2`. +* `ifnot` binary operator. `q1 ifnot q2` removes values from `q1` for existing values from `q2`. +* String literals may be concatenated. This is useful with `WITH` templates: `WITH (commonPrefix="long_metric_prefix_") {__name__=commonPrefix+"suffix1"} / {__name__=commonPrefix+"suffix2"}`. +* `WITH` templates. This feature simplifies writing and managing complex queries. Go to [WITH templates playground](https://play.victoriametrics.com/promql/expand-with-exprs) and try it. +* `keep_metric_names` modifier can be applied to all the [rollup functions](#rollup-functions) and [transform functions](#transform-functions). This modifier prevents from dropping metric names in function results. For example, `rate({__name__=~"foo|bar"}[5m]) keep_metric_names` leaves `foo` and `bar` metric names in the resulting time series. ## MetricsQL functions @@ -63,20 +63,19 @@ MetricsQL provides the following functions: * [Label manipulation functions](#label-manipulation-functions) * [Aggregate functions](#aggregate-functions) - ### Rollup functions **Rollup functions** (aka range functions or window functions) calculate rollups over **raw samples** on the given lookbehind window for the [selected time series](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors). For example, `avg_over_time(temperature[24h])` calculates the average temperature over raw samples for the last 24 hours. Additional details: - * If rollup functions are used for building graphs in Grafana, then the rollup is calculated independently per each point on the graph. For example, every point for `avg_over_time(temperature[24h])` graph shows the average temperature for the last 24 hours ending at this point. The interval between points is set as `step` query arg passed by Grafana to [/api/v1/query_range](https://prometheus.io/docs/prometheus/latest/querying/api/#range-queries). - * If the given [series selector](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors) returns multiple time series, then rollups are calculated individually per each returned series. - * If lookbehind window in square brackets is missing, then MetricsQL automatically sets the lookbehind window to the interval between points on the graph (aka `step` query arg at [/api/v1/query_range](https://prometheus.io/docs/prometheus/latest/querying/api/#range-queries), `$__interval` value from Grafana or `1i` duration in MetricsQL). For example, `rate(http_requests_total)` is equivalent to `rate(http_requests_total[$__interval])` in Grafana. It is also equivalent to `rate(http_requests_total[1i])`. - * Every [series selector](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors) in MetricsQL must be wrapped into a rollup function. Otherwise it is automatically wrapped into [default_rollup](#default_rollup). For example, `foo{bar="baz"}` is automatically converted to `default_rollup(foo{bar="baz"}[1i])` before performing the calculations. - * If something other than [series selector](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors) is passed to rollup function, then the inner arg is automatically converted to a [subquery](#subqueries). - * All the rollup functions accept optional `keep_metric_names` modifier. If it is set, then the function keeps metric names in results. For example, `rate({__name__=~"foo|bar}[5m]) keep_metric_names` leaves `foo` and `bar` metric names in results. + +* If rollup functions are used for building graphs in Grafana, then the rollup is calculated independently per each point on the graph. For example, every point for `avg_over_time(temperature[24h])` graph shows the average temperature for the last 24 hours ending at this point. The interval between points is set as `step` query arg passed by Grafana to [/api/v1/query_range](https://prometheus.io/docs/prometheus/latest/querying/api/#range-queries). +* If the given [series selector](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors) returns multiple time series, then rollups are calculated individually per each returned series. +* If lookbehind window in square brackets is missing, then MetricsQL automatically sets the lookbehind window to the interval between points on the graph (aka `step` query arg at [/api/v1/query_range](https://prometheus.io/docs/prometheus/latest/querying/api/#range-queries), `$__interval` value from Grafana or `1i` duration in MetricsQL). For example, `rate(http_requests_total)` is equivalent to `rate(http_requests_total[$__interval])` in Grafana. It is also equivalent to `rate(http_requests_total[1i])`. +* Every [series selector](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors) in MetricsQL must be wrapped into a rollup function. Otherwise it is automatically wrapped into [default_rollup](#default_rollup). For example, `foo{bar="baz"}` is automatically converted to `default_rollup(foo{bar="baz"}[1i])` before performing the calculations. +* If something other than [series selector](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors) is passed to rollup function, then the inner arg is automatically converted to a [subquery](#subqueries). +* All the rollup functions accept optional `keep_metric_names` modifier. If it is set, then the function keeps metric names in results. For example, `rate({__name__=~"foo|bar}[5m]) keep_metric_names` leaves `foo` and `bar` metric names in results. See also [implicit query conversions](#implicit-query-conversions). - #### absent_over_time `absent_over_time(series_selector[d])` returns 1 if the given lookbehind window `d` doesn't contain raw samples. Otherwise it returns an empty result. This function is supported by PromQL. See also [present_over_time](#present_over_time). @@ -361,16 +360,15 @@ See also [implicit query conversions](#implicit-query-conversions). `zscore_over_time(series_selector[d])` calculates returns [z-score](https://en.wikipedia.org/wiki/Standard_score) for raw samples on the given lookbehind window `d`. It is calculated independently per each time series returned from the given [series_selector](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors). Metric names are stripped from the resulting rollups. Add `keep_metric_names` modifier in order to keep metric names. - ### Transform functions **Transform functions** calculate transformations over rollup results. For example, `abs(delta(temperature[24h]))` calculates the absolute value for every point of every time series returned from the rollup `delta(temperature[24h])`. Additional details: - * If transform function is applied directly to a [series selector](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors), then the [default_rollup()](#default_rollup) function is automatically applied before calculating the transformations. For example, `abs(temperature)` is implicitly transformed to `abs(default_rollup(temperature[1i]))`. - * All the transform functions accept optional `keep_metric_names` modifier. If it is set, then the function doesn't drop metric names from the resulting time series. For example, `ln({__name__=~"foo|bar"}) keep_metric_names` leaves `foo` and `bar` metric names in results. + +* If transform function is applied directly to a [series selector](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors), then the [default_rollup()](#default_rollup) function is automatically applied before calculating the transformations. For example, `abs(temperature)` is implicitly transformed to `abs(default_rollup(temperature[1i]))`. +* All the transform functions accept optional `keep_metric_names` modifier. If it is set, then the function doesn't drop metric names from the resulting time series. For example, `ln({__name__=~"foo|bar"}) keep_metric_names` leaves `foo` and `bar` metric names in results. See also [implicit query conversions](#implicit-query-conversions). - #### abs `abs(q)` calculates the absolute value for every point of every time series returned by `q`. This function is supported by PromQL. @@ -547,7 +545,6 @@ See also [implicit query conversions](#implicit-query-conversions). `rad(q)` converts [degrees to Radians](https://en.wikipedia.org/wiki/Radian#Conversions) for every point of every time series returned by `q`. Metric names are stripped from the resulting series. Add `keep_metric_names` modifier in order to keep metric names. This function is supported by PromQL. See also [deg](#deg). - #### prometheus_buckets `prometheus_buckets(buckets)` converts [VictoriaMetrics histogram buckets](https://valyala.medium.com/improving-histogram-usability-for-prometheus-and-grafana-bc7e5df0e350) with `vmrange` labels to Prometheus histogram buckets with `le` labels. This may be useful for building heatmaps in Grafana. See also [histogram_quantile](#histogram_quantile) and [buckets_limit](#buckets_limit). @@ -704,15 +701,14 @@ See also [implicit query conversions](#implicit-query-conversions). `year(q)` returns the year for every point of every time series returned by `q`. It is expected that `q` returns unix timestamps. Metric names are stripped from the resulting series. Add `keep_metric_names` modifier in order to keep metric names. This function is supported by PromQL. - ### Label manipulation functions **Label manipulation functions** perform manipulations with lables on the selected rollup results. Additional details: - * If label manipulation function is applied directly to a [series_selector](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors), then the [default_rollup()](#default_rollup) function is automatically applied before performing the label transformation. For example, `alias(temperature, "foo")` is implicitly transformed to `alias(default_rollup(temperature[1i]), "foo")`. + +* If label manipulation function is applied directly to a [series_selector](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors), then the [default_rollup()](#default_rollup) function is automatically applied before performing the label transformation. For example, `alias(temperature, "foo")` is implicitly transformed to `alias(default_rollup(temperature[1i]), "foo")`. See also [implicit query conversions](#implicit-query-conversions). - #### alias `alias(q, "name")` sets the given `name` to all the time series returned by `q`. For example, `alias(up, "foobar")` would rename `up` series to `foobar` series. @@ -777,24 +773,23 @@ sum by (__name__) ( #### label_uppercase -`label_uppercase(q, "label1", ..., "labelN")` uppercases values for the given `label*` labels in all the time series returned by `q`. +`label_uppercase(q, "label1", ..., "labelN")` uppercases values for the given `label*` labels in all the time series returned by `q`. #### label_value `label_value(q, "label")` returns number values for the given `label` for every time series returned by `q`. For example, if `label_value(foo, "bar")` is applied to `foo{bar="1.234"}`, then it will return a time series `foo{bar="1.234"}` with `1.234` value. - ### Aggregate functions **Aggregate functions** calculate aggregates over groups of rollup results. Additional details: - * By default a single group is used for aggregation. Multiple independent groups can be set up by specifying grouping labels in `by` and `without` modifiers. For example, `count(up) by (job)` would group rollup results by `job` label value and calculate the [count](#count) aggregate function independently per each group, while `count(up) without (instance)` would group rollup results by all the labels except `instance` before calculating [count](#count) aggregate function independently per each group. Multiple labels can be put in `by` and `without` modifiers. - * If the aggregate function is applied directly to a [series_selector](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors), then the [default_rollup()](#default_rollup) function is automatically applied before cacluating the aggregate. For example, `count(up)` is implicitly transformed to `count(default_rollup(up[1i]))`. - * Aggregate functions accept arbitrary number of args. For example, `avg(q1, q2, q3)` would return the average values for every point across time series returned by `q1`, `q2` and `q3`. - * Aggregate functions support optional `limit N` suffix, which can be used for limiting the number of output groups. For example, `sum(x) by (y) limit 3` limits the number of groups for the aggregation to 3. All the other groups are ignored. + +* By default a single group is used for aggregation. Multiple independent groups can be set up by specifying grouping labels in `by` and `without` modifiers. For example, `count(up) by (job)` would group rollup results by `job` label value and calculate the [count](#count) aggregate function independently per each group, while `count(up) without (instance)` would group rollup results by all the labels except `instance` before calculating [count](#count) aggregate function independently per each group. Multiple labels can be put in `by` and `without` modifiers. +* If the aggregate function is applied directly to a [series_selector](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors), then the [default_rollup()](#default_rollup) function is automatically applied before cacluating the aggregate. For example, `count(up)` is implicitly transformed to `count(default_rollup(up[1i]))`. +* Aggregate functions accept arbitrary number of args. For example, `avg(q1, q2, q3)` would return the average values for every point across time series returned by `q1`, `q2` and `q3`. +* Aggregate functions support optional `limit N` suffix, which can be used for limiting the number of output groups. For example, `sum(x) by (y) limit 3` limits the number of groups for the aggregation to 3. All the other groups are ignored. See also [implicit query conversions](#implicit-query-conversions). - #### any `any(q) by (group_labels)` returns a single series per `group_labels` out of time series returned by `q`. See also [group](#group). @@ -821,7 +816,7 @@ See also [implicit query conversions](#implicit-query-conversions). #### bottomk_median -`bottomk_median(k, q, "other_label=other_value")` returns up to `k` time series from `q with the smallest medians. If an optional `other_label=other_value` arg is set, then the sum of the remaining time series is returned with the given label. For example, `bottomk_median(3, sum(process_resident_memory_bytes) by (job), "job=other")` would return up to 3 time series with the smallest medians plus a time series with `{job="other"}` label with the sum of the remaining series if any. See also [topk_median](#topk_median). +`bottomk_median(k, q, "other_label=other_value")` returns up to `k` time series from `q with the smallest medians. If an optional`other_label=other_value` arg is set, then the sum of the remaining time series is returned with the given label. For example, `bottomk_median(3, sum(process_resident_memory_bytes) by (job), "job=other")` would return up to 3 time series with the smallest medians plus a time series with `{job="other"}` label with the sum of the remaining series if any. See also [topk_median](#topk_median). #### bottomk_min @@ -935,7 +930,6 @@ See also [implicit query conversions](#implicit-query-conversions). `zscore(q) by (group_labels)` returns [z-score](https://en.wikipedia.org/wiki/Standard_score) values per each `group_labels` for all the time series returned by `q`. The aggregate is calculated individually per each group of points with the same timestamp. Useful for detecting anomalies in the group of related time series. - ## Subqueries MetricsQL supports and extends PromQL subqueries. See [this article](https://valyala.medium.com/prometheus-subqueries-in-victoriametrics-9b1492b720b3) for details. Any [rollup function](#rollup-functions) for something other than [series selector](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors) form a subquery. Nested rollup functions can be implicit thanks to the [implicit query conversions](#implicit-query-conversions). For example, `delta(sum(m))` is implicitly converted to `delta(sum(default_rollup(m[1i]))[1i:1i])`, so it becomes a subquery, since it contains [default_rollup](#default_rollup) nested into [delta](#delta). @@ -945,7 +939,6 @@ VictoriaMetrics performs subqueries in the following way: * It calculates the inner rollup function using the `step` value from the outer rollup function. For example, for expression `max_over_time(rate(http_requests_total[5m])[1h:30s])` the inner function `rate(http_requests_total[5m])` is calculated with `step=30s`. The resulting data points are aligned by the `step`. * It calculates the outer rollup function over the results of the inner rollup function using the `step` value passed by Grafana to [/api/v1/query_range](https://prometheus.io/docs/prometheus/latest/querying/api/#range-queries). - ## Implicit query conversions VictoriaMetrics performs the following implicit conversions for incoming queries before starting the calculations: diff --git a/docs/PerTenantStatistic.md b/docs/PerTenantStatistic.md index ebc5f4f3c..4cb802695 100644 --- a/docs/PerTenantStatistic.md +++ b/docs/PerTenantStatistic.md @@ -9,30 +9,31 @@ sort: 18 cluster-per-tenant-stat VictoriaMetrics cluster for enterprise provides various metrics and statistics usage per tenant: + - `vminsert` - * `vm_tenant_inserted_rows_total` - total number of inserted rows. Find out which tenant - puts the most of the pressure on the storage. - + - `vm_tenant_inserted_rows_total` - total number of inserted rows. Find out which tenant + puts the most of the pressure on the storage. + - `vmselect` - * `vm_tenant_select_requests_duration_ms_total` - query latency. + - `vm_tenant_select_requests_duration_ms_total` - query latency. Helps to identify tenants with the heaviest queries. - * `vm_tenant_select_requests_total` - total number of requests. + - `vm_tenant_select_requests_total` - total number of requests. Discover which tenant sends the most of the queries and how it changes with time. - `vmstorage` - * `vm_tenant_active_timeseries` - number of active time series. - This metric correlates with memory usage, so can be used to find the most expensive - tenant in terms of memory. - * `vm_tenant_used_tenant_bytes` - disk space usage. Helps to track disk space usage + - `vm_tenant_active_timeseries` - number of active time series. + This metric correlates with memory usage, so can be used to find the most expensive + tenant in terms of memory. + - `vm_tenant_used_tenant_bytes` - disk space usage. Helps to track disk space usage per tenant. - * `vm_tenant_timeseries_created_total` - number of new time series created. Helps to track + - `vm_tenant_timeseries_created_total` - number of new time series created. Helps to track the churn rate per tenant, or identify inefficient usage of the system. -Collect the metrics by any scrape agent you like (`vmagent`, `victoriametrics`, Prometheus, etc) and put into TSDB. +Collect the metrics by any scrape agent you like (`vmagent`, `victoriametrics`, Prometheus, etc) and put into TSDB. It is ok to use existing cluster for storing such metrics, but make sure to use a different tenant for it to avoid collisions. -Or just run a separate TSDB (VM single, Promethes, etc.) to keep the data isolated from the main cluster. +Or just run a separate TSDB (VM single, Promethes, etc.) to keep the data isolated from the main cluster. -Example of the scraping configuration for statistic is the following: +Example of the scraping configuration for statistic is the following: ```yaml scrape_configs: @@ -44,18 +45,17 @@ scrape_configs: ## Visualization -Visualisation of statistics can be done in Grafana using the following +Visualisation of statistics can be done in Grafana using the following [dashboard](https://github.com/VictoriaMetrics/VictoriaMetrics/tree/cluster/dashboards/clusterbytenant.json). - ## Integration with vmgateway -`vmgateway` supports integration with Per Tenant Statistics data for rate limiting purposes. +`vmgateway` supports integration with Per Tenant Statistics data for rate limiting purposes. More information can be found [here](https://docs.victoriametrics.com/vmgateway.html) ## Integration with vmalert -You can generate alerts based on each tenant's resource usage and send notifications +You can generate alerts based on each tenant's resource usage and send notifications to prevent limits exhaustion. Here is an alert example for high churn rate by the tenant: diff --git a/docs/Quick-Start.md b/docs/Quick-Start.md index 0bc2f0c19..c6fc676a0 100644 --- a/docs/Quick-Start.md +++ b/docs/Quick-Start.md @@ -16,5 +16,6 @@ Open `http://localhost:8428` in web browser and read [these docs](https://docs.v VictoriaMetrics is also available in binaries (see [this page](https://github.com/VictoriaMetrics/VictoriaMetrics/releases)) and in source code (see [how to build VictoriaMetrics from sources](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-build-from-sources)). There are also the following versions of VictoriaMetrics available: + * [VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html) - horizontally scalable VictoriaMetrics, which scales to multiple nodes. * [Managed VictoriaMetrics at AWS](https://aws.amazon.com/marketplace/pp/prodview-4tbfq5icmbmyc). diff --git a/docs/README.md b/docs/README.md index 6d950b239..136070a37 100644 --- a/docs/README.md +++ b/docs/README.md @@ -21,7 +21,6 @@ Cluster version of VictoriaMetrics is available [here](https://docs.victoriametr [Contact us](mailto:info@victoriametrics.com) if you need enterprise support for VictoriaMetrics. See [features available in enterprise package](https://victoriametrics.com/products/enterprise/). Enterprise binaries can be downloaded and evaluated for free from [the releases page](https://github.com/VictoriaMetrics/VictoriaMetrics/releases). - ## Prominent features VictoriaMetrics has the following prominent features: @@ -61,7 +60,6 @@ VictoriaMetrics has the following prominent features: See also [various Articles about VictoriaMetrics](https://docs.victoriametrics.com/Articles.html). - ## Case studies and talks Case studies: @@ -92,7 +90,6 @@ Case studies: See also [articles and slides about VictoriaMetrics from our users](https://docs.victoriametrics.com/Articles.html#third-party-articles-and-slides-about-victoriametrics) - ## Operation ## How to start VictoriaMetrics @@ -112,7 +109,6 @@ VictoriaMetrics accepts [Prometheus querying API requests](#prometheus-querying- It is recommended setting up [monitoring](#monitoring) for VictoriaMetrics. - ### Environment variables Each flag value can be set via environment variables according to these rules: @@ -122,10 +118,8 @@ Each flag value can be set via environment variables according to these rules: * For repeating flags an alternative syntax can be used by joining the different values into one using `,` char as separator (for example `-storageNode -storageNode ` will translate to `storageNode=,`). * Environment var prefix can be set via `-envflag.prefix` flag. For instance, if `-envflag.prefix=VM_`, then env vars must be prepended with `VM_`. - ### Configuration with snap package - Snap package for VictoriaMetrics is available [here](https://snapcraft.io/victoriametrics). Command-line flags for Snap package can be set with following command: @@ -137,7 +131,6 @@ snap restart victoriametrics Do not change value for `-storageDataPath` flag, because snap package has limited access to host filesystem. - Changing scrape configuration is possible with text editor: ```text @@ -146,7 +139,6 @@ vi $SNAP_DATA/var/snap/victoriametrics/current/etc/victoriametrics-scrape-config After changes were made, trigger config re-read with the command `curl 127.0.0.1:8248/-/reload`. - ## Prometheus setup Add the following lines to Prometheus config file (it is usually located at `/etc/prometheus/prometheus.yml`) in order to send data to VictoriaMetrics: @@ -200,7 +192,6 @@ It is recommended upgrading Prometheus to [v2.12.0](https://github.com/prometheu Take a look also at [vmagent](https://docs.victoriametrics.com/vmagent.html) and [vmalert](https://docs.victoriametrics.com/vmalert.html), which can be used as faster and less resource-hungry alternative to Prometheus. - ## Grafana setup Create [Prometheus datasource](http://docs.grafana.org/features/datasources/prometheus/) in Grafana with the following url: @@ -213,7 +204,6 @@ Substitute `` with the hostname or IP address of VictoriaM Then build graphs and dashboards for the created datasource using [PromQL](https://prometheus.io/docs/prometheus/latest/querying/basics/) or [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html). - ## How to upgrade VictoriaMetrics It is safe upgrading VictoriaMetrics to new versions unless [release notes](https://github.com/VictoriaMetrics/VictoriaMetrics/releases) say otherwise. It is safe skipping multiple versions during the upgrade unless [release notes](https://github.com/VictoriaMetrics/VictoriaMetrics/releases) say otherwise. It is recommended performing regular upgrades to the latest version, since it may contain important bug fixes, performance optimizations or new features. @@ -228,7 +218,6 @@ The following steps must be performed during the upgrade / downgrade procedure: Prometheus doesn't drop data during VictoriaMetrics restart. See [this article](https://grafana.com/blog/2019/03/25/whats-new-in-prometheus-2.8-wal-based-remote-write/) for details. The same applies also to [vmagent](https://docs.victoriametrics.com/vmagent.html). - ## How to apply new config to VictoriaMetrics VictoriaMetrics is configured via command-line flags, so it must be restarted when new command-line flags should be applied: @@ -239,7 +228,6 @@ VictoriaMetrics is configured via command-line flags, so it must be restarted wh Prometheus doesn't drop data during VictoriaMetrics restart. See [this article](https://grafana.com/blog/2019/03/25/whats-new-in-prometheus-2.8-wal-based-remote-write/) for details. The same applies alos to [vmagent](https://docs.victoriametrics.com/vmagent.html). - ## How to scrape Prometheus exporters such as [node-exporter](https://github.com/prometheus/node_exporter) VictoriaMetrics can be used as drop-in replacement for Prometheus for scraping targets configured in `prometheus.yml` config file according to [the specification](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#configuration-file). Just set `-promscrape.config` command-line flag to the path to `prometheus.yml` config - and VictoriaMetrics should start scraping the configured targets. Currently the following [scrape_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config) types are supported: @@ -258,7 +246,6 @@ VictoriaMetrics can be used as drop-in replacement for Prometheus for scraping t * [digitalocean_sd_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#digitalocean_sd_config) * [http_sd_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#http_sd_config) - File a [feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues) if you need support for other `*_sd_config` types. The file pointed by `-promscrape.config` may contain `%{ENV_VAR}` placeholders, which are substituted by the corresponding `ENV_VAR` environment variable values. @@ -267,7 +254,6 @@ VictoriaMetrics also supports [importing data in Prometheus exposition format](# See also [vmagent](https://docs.victoriametrics.com/vmagent.html), which can be used as drop-in replacement for Prometheus. - ## How to send data from DataDog agent VictoriaMetrics accepts data from [DataDog agent](https://docs.datadoghq.com/agent/) or [DogStatsD]() via ["submit metrics" API](https://docs.datadoghq.com/api/latest/metrics/#submit-metrics) at `/datadog/api/v1/series` path. @@ -315,7 +301,6 @@ This command should return the following output if everything is OK: Extra labels may be added to all the written time series by passing `extra_label=name=value` query args. For example, `/datadog/api/v1/series?extra_label=foo=bar` would add `{foo="bar"}` label to all the ingested metrics. - ## How to send data from InfluxDB-compatible agents such as [Telegraf](https://www.influxdata.com/time-series-platform/telegraf/) Use `http://:8428` url instead of InfluxDB url in agents' configs. @@ -503,7 +488,6 @@ The `/api/v1/export` endpoint should return the following response: Extra labels may be added to all the imported time series by passing `extra_label=name=value` query args. For example, `/api/put?extra_label=foo=bar` would add `{foo="bar"}` label to all the ingested metrics. - ## Prometheus querying API usage VictoriaMetrics supports the following handlers from [Prometheus querying API](https://prometheus.io/docs/prometheus/latest/querying/api/): @@ -519,7 +503,6 @@ VictoriaMetrics supports the following handlers from [Prometheus querying API](h These handlers can be queried from Prometheus-compatible clients such as Grafana or curl. All the Prometheus querying API handlers can be prepended with `/prometheus` prefix. For example, both `/prometheus/api/v1/query` and `/api/v1/query` should work. - ### Prometheus querying API enhancements VictoriaMetrics accepts optional `extra_label==` query arg, which can be used for enforcing additional label filters for queries. For example, @@ -552,7 +535,6 @@ Additionally VictoriaMetrics provides the following handlers: For example, request to `/api/v1/status/top_queries?topN=5&maxLifetime=30s` would return up to 5 queries per list, which were executed during the last 30 seconds. VictoriaMetrics tracks the last `-search.queryStats.lastQueriesCount` queries with durations at least `-search.queryStats.minQueryDuration`. - ## Graphite API usage VictoriaMetrics supports the following Graphite APIs, which are needed for [Graphite datasource in Grafana](https://grafana.com/docs/grafana/latest/datasources/graphite/): @@ -569,7 +551,6 @@ VictoriaMetrics accepts optional query args: `extra_label==:8428/api/v1/export?match[]=`, @@ -815,7 +788,6 @@ Exported data can be imported via POST'ing it to [/api/v1/import](#how-to-import The [deduplication](#deduplication) is applied to the data exported via `/api/v1/export` by default. The deduplication isn't applied if `reduce_mem_usage=1` query arg is passed to the request. - ### How to export CSV data Send a request to `http://:8428/api/v1/export/csv?format=&match=`, @@ -841,7 +813,6 @@ The exported CSV data can be imported to VictoriaMetrics via [/api/v1/import/csv The [deduplication](#deduplication) is applied for the data exported in CSV by default. It is possible to export raw data without de-duplication by passing `reduce_mem_usage=1` query arg to `/api/v1/export/csv`. - ### How to export data in native format Send a request to `http://:8428/api/v1/export/native?match[]=`, @@ -866,7 +837,6 @@ can fail to be imported into VictoriaMetrics release Y. The [deduplication](#deduplication) isn't applied for the data exported in native format. It is expected that the de-duplication is performed during data import. - ## How to import time series data Time series data can be imported into VictoriaMetrics via any supported ingestion protocol: @@ -884,7 +854,6 @@ Time series data can be imported into VictoriaMetrics via any supported ingestio * `/api/v1/import/csv` for importing arbitrary CSV data. See [these docs](#how-to-import-csv-data) for details. * `/api/v1/import/prometheus` for importing data in Prometheus exposition format. See [these docs](#how-to-import-data-in-prometheus-exposition-format) for details. - ### How to import data in JSON line format Example for importing data obtained via [/api/v1/export](#how-to-export-data-in-json-line-format): @@ -914,7 +883,6 @@ Note that it could be required to flush response cache after importing historica VictoriaMetrics parses input JSON lines one-by-one. It loads the whole JSON line in memory, then parses it and then saves the parsed samples into persistent storage. This means that VictoriaMetrics can occupy big amounts of RAM when importing too long JSON lines. The solution is to split too long JSON lines into smaller lines. It is OK if samples for a single time series are split among multiple JSON lines. - ### How to import data in native format The specification of VictoriaMetrics' native format may yet change and is not formally documented yet. So currently we do not recommend that external clients attempt to pack their own metrics in native format file. @@ -934,7 +902,6 @@ For example, `/api/v1/import/native?extra_label=foo=bar` would add `"foo":"bar"` Note that it could be required to flush response cache after importing historical data. See [these docs](#backfilling) for detail. - ### How to import CSV data Arbitrary CSV data can be imported via `/api/v1/import/csv`. The CSV data is imported according to the provided `format` query arg. @@ -975,6 +942,7 @@ curl -G 'http://localhost:8428/api/v1/export' -d 'match[]={ticker!=""}' ``` The following response should be returned: + ```bash {"metric":{"__name__":"bid","market":"NASDAQ","ticker":"MSFT"},"values":[1.67],"timestamps":[1583865146520]} {"metric":{"__name__":"bid","market":"NYSE","ticker":"GOOG"},"values":[4.56],"timestamps":[1583865146495]} @@ -987,7 +955,6 @@ For example, `/api/v1/import/csv?extra_label=foo=bar` would add `"foo":"bar"` la Note that it could be required to flush response cache after importing historical data. See [these docs](#backfilling) for detail. - ### How to import data in Prometheus exposition format VictoriaMetrics accepts data in [Prometheus exposition format](https://github.com/prometheus/docs/blob/master/content/docs/instrumenting/exposition_formats.md#text-based-format) @@ -1029,8 +996,6 @@ Note that it could be required to flush response cache after importing historica VictoriaMetrics also may scrape Prometheus targets - see [these docs](#how-to-scrape-prometheus-exporters-such-as-node-exporter). - - ## Relabeling VictoriaMetrics supports Prometheus-compatible relabeling for all the ingested metrics if `-relabelConfig` command-line flag points @@ -1039,6 +1004,7 @@ The `-relabelConfig` also can point to http or https url. For example, `-relabel See [this article with relabeling tips and tricks](https://valyala.medium.com/how-to-use-relabeling-in-prometheus-and-victoriametrics-8b90fc22c4b2). Example contents for `-relabelConfig` file: + ```yml # Add {cluster="dev"} label. - target_label: cluster @@ -1052,7 +1018,6 @@ Example contents for `-relabelConfig` file: See [these docs](https://docs.victoriametrics.com/vmagent.html#relabeling) for more details about relabeling in VictoriaMetrics. - ## Federation VictoriaMetrics exports [Prometheus-compatible federation data](https://prometheus.io/docs/prometheus/latest/federation/) @@ -1064,7 +1029,6 @@ on the interval `[now - max_lookback ... now]` is scraped for each time series. For instance, `/federate?match[]=up&max_lookback=1h` would return last points on the `[now - 1h ... now]` interval. This may be useful for time series federation with scrape intervals exceeding `5m`. - ## Capacity planning VictoriaMetrics uses lower amounts of CPU, RAM and storage space on production workloads compared to competing solutions (Prometheus, Thanos, Cortex, TimescaleDB, InfluxDB, QuestDB, M3DB) according to [our case studies](https://docs.victoriametrics.com/CaseStudies.html). @@ -1087,7 +1051,6 @@ It is recommended leaving the following amounts of spare resources: * 50% of spare CPU for reducing the probability of slowdowns during temporary spikes in workload. * At least 30% of free storage space at the directory pointed by `-storageDataPath` command-line flag. See also `-storage.minFreeDiskSpaceBytes` command-line flag description [here](#list-of-command-line-flags). - ## High availability * Install multiple VictoriaMetrics instances in distinct datacenters (availability zones). @@ -1128,7 +1091,6 @@ to write data to `victoriametrics-addr-1`, while each `r2` should write data to Another option is to write data simultaneously from Prometheus HA pair to a pair of VictoriaMetrics instances with the enabled de-duplication. See [this section](#deduplication) for details. - ## Deduplication VictoriaMetrics de-duplicates data points if `-dedup.minScrapeInterval` command-line flag is set to positive duration. For example, `-dedup.minScrapeInterval=60s` would de-duplicate data points on the same time series if they fall within the same discrete 60s bucket. The earliest data point will be kept. In the case of equal timestamps, an arbitrary data point will be kept. See [this comment](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2112#issuecomment-1032587618) for more details on how downsampling works. @@ -1141,34 +1103,34 @@ The de-duplication reduces disk space usage if multiple identically configured [ write data to the same VictoriaMetrics instance. These vmagent or Prometheus instances must have identical `external_labels` section in their configs, so they write data to the same time series. - ## Storage -VictoriaMetrics stores time series data in [MergeTree](https://en.wikipedia.org/wiki/Log-structured_merge-tree)-like +VictoriaMetrics stores time series data in [MergeTree](https://en.wikipedia.org/wiki/Log-structured_merge-tree)-like data structures. On insert, VictoriaMetrics accumulates up to 1s of data and dumps it on disk to -`<-storageDataPath>/data/small/YYYY_MM/` subdirectory forming a `part` with the following +`<-storageDataPath>/data/small/YYYY_MM/` subdirectory forming a `part` with the following name pattern: `rowsCount_blocksCount_minTimestamp_maxTimestamp`. Each part consists of two "columns": values and timestamps. These are sorted and compressed raw time series values. Additionally, part contains index files for searching for specific series in the values and timestamps files. -`Parts` are periodically merged into the bigger parts. The resulting `part` is constructed -under `<-storageDataPath>/data/{small,big}/YYYY_MM/tmp` subdirectory. When the resulting `part` is complete, it is atomically moved from the `tmp` -to its own subdirectory, while the source parts are atomically removed. The end result is that the source +`Parts` are periodically merged into the bigger parts. The resulting `part` is constructed +under `<-storageDataPath>/data/{small,big}/YYYY_MM/tmp` subdirectory. When the resulting `part` is complete, it is atomically moved from the `tmp` +to its own subdirectory, while the source parts are atomically removed. The end result is that the source parts are substituted by a single resulting bigger `part` in the `<-storageDataPath>/data/{small,big}/YYYY_MM/` directory. -Information about merging process is available in [single-node VictoriaMetrics](https://grafana.com/dashboards/10229) -and [clustered VictoriaMetrics](https://grafana.com/grafana/dashboards/11176) Grafana dashboards. +Information about merging process is available in [single-node VictoriaMetrics](https://grafana.com/dashboards/10229) +and [clustered VictoriaMetrics](https://grafana.com/grafana/dashboards/11176) Grafana dashboards. See more details in [monitoring docs](#monitoring). -The `merge` process is usually named "compaction", because the resulting `part` size is usually smaller than +The `merge` process is usually named "compaction", because the resulting `part` size is usually smaller than the sum of the source `parts`. There are following benefits of doing the merge process: + * it improves query performance, since lower number of `parts` are inspected with each query; -* it reduces the number of data files, since each `part`contains fixed number of files; +* it reduces the number of data files, since each `part`contains fixed number of files; * better compression rate for the resulting part. -Newly added `parts` either appear in the storage or fail to appear. -Storage never contains partially created parts. The same applies to merge process — `parts` are either fully -merged into a new `part` or fail to merge. There are no partially merged `parts` in MergeTree. -`Part` contents in MergeTree never change. Parts are immutable. They may be only deleted after the merge +Newly added `parts` either appear in the storage or fail to appear. +Storage never contains partially created parts. The same applies to merge process — `parts` are either fully +merged into a new `part` or fail to merge. There are no partially merged `parts` in MergeTree. +`Part` contents in MergeTree never change. Parts are immutable. They may be only deleted after the merge to a bigger `part` or when the `part` contents goes outside the configured `-retentionPeriod`. See [this article](https://valyala.medium.com/how-victoriametrics-makes-instant-snapshots-for-multi-terabyte-time-series-data-e1f3fb0e0282) for more details. @@ -1182,7 +1144,7 @@ Retention is configured with the `-retentionPeriod` command-line flag, which tak Data is split in per-month partitions inside `<-storageDataPath>/data/{small,big}` folders. Data partitions outside the configured retention are deleted on the first day of the new month. Each partition consists of one or more data parts with the following name pattern `rowsCount_blocksCount_minTimestamp_maxTimestamp`. -Data parts outside of the configured retention are eventually deleted during +Data parts outside of the configured retention are eventually deleted during [background merge](https://medium.com/@valyala/how-victoriametrics-makes-instant-snapshots-for-multi-terabyte-time-series-data-e1f3fb0e0282). The maximum disk space usage for a given `-retentionPeriod` is going to be (`-retentionPeriod` + 1) months. @@ -1209,7 +1171,6 @@ so it could route requests from particular user to VictoriaMetrics with the desi The same scheme could be implemented for multiple tenants in [VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html). See [these docs](https://docs.victoriametrics.com/guides/guide-vmcluster-multiple-retention-setup.html) for multi-retention setup details. - ## Downsampling [VictoriaMetrics Enterprise](https://victoriametrics.com/products/enterprise/) supports multi-level downsampling with `-downsampling.period` command-line flag. For example: @@ -1222,12 +1183,10 @@ Downsampling is applied independently per each time series. It can reduce disk s The downsampling can be evaluated for free by downloading and using enterprise binaries from [the releases page](https://github.com/VictoriaMetrics/VictoriaMetrics/releases). - ## Multi-tenancy Single-node VictoriaMetrics doesn't support multi-tenancy. Use [cluster version](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#multitenancy) instead. - ## Scalability and cluster version Though single-node VictoriaMetrics cannot scale to multiple nodes, it is optimized for resource usage - storage size / bandwidth / IOPS, RAM, CPU. @@ -1238,7 +1197,6 @@ So try single-node VictoriaMetrics at first and then [switch to cluster version] horizontally scalable long-term remote storage for really large Prometheus deployments. [Contact us](mailto:info@victoriametrics.com) for enterprise support. - ## Alerting It is recommended using [vmalert](https://docs.victoriametrics.com/vmalert.html) for alerting. @@ -1249,7 +1207,6 @@ Additionally, alerting can be set up with the following tools: * With Promxy - see [the corresponding docs](https://github.com/jacksontj/promxy/blob/master/README.md#how-do-i-use-alertingrecording-rules-in-promxy). * With Grafana - see [the corresponding docs](https://grafana.com/docs/alerting/rules/). - ## Security Do not forget protecting sensitive endpoints in VictoriaMetrics when exposing it to untrusted networks such as the internet. @@ -1263,6 +1220,7 @@ Consider setting the following command-line flags: * `-forceMergeAuthKey` for protecting `/internal/force_merge` endpoint. See [force merge docs](#forced-merge). * `-search.resetCacheAuthKey` for protecting `/internal/resetRollupResultCache` endpoint. See [backfilling](#backfilling) for more details. * `-configAuthKey` for protecting `/config` endpoint, since it may contain sensitive information such as passwords. + - `-pprofAuthKey` for protecting `/debug/pprof/*` endpoints, which can be used for [profiling](#profiling). Explicitly set internal network interface for TCP and UDP ports for data ingestion with Graphite and OpenTSDB formats. @@ -1271,7 +1229,6 @@ For example, substitute `-graphiteListenAddr=:2003` with `-graphiteListenAddr=/cache` directory during graceful shutdown (e.g. when VictoriaMetrics is stopped by sending `SIGINT` signal). The caches are read on the next VictoriaMetrics startup. Sometimes it is needed to remove such caches on the next startup. This can be performed by placing `reset_cache_on_startup` file inside the `<-storageDataPath>/cache` directory before the restart of VictoriaMetrics. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1447) for details. - ## Cache tuning VictoriaMetrics uses various in-memory caches for faster data ingestion and query performance. The following metrics for each type of cache are exported at [`/metrics` page](#monitoring): -- `vm_cache_size_bytes` - the actual cache size -- `vm_cache_size_max_bytes` - cache size limit -- `vm_cache_requests_total` - the number of requests to the cache -- `vm_cache_misses_total` - the number of cache misses -- `vm_cache_entries` - the number of entries in the cache +* `vm_cache_size_bytes` - the actual cache size +* `vm_cache_size_max_bytes` - cache size limit +* `vm_cache_requests_total` - the number of requests to the cache +* `vm_cache_misses_total` - the number of cache misses +* `vm_cache_entries` - the number of entries in the cache Both Grafana dashboards for [single-node VictoriaMetrics](https://grafana.com/dashboards/10229) and [clustered VictoriaMetrics](https://grafana.com/grafana/dashboards/11176) @@ -1452,28 +1405,28 @@ practical scenarios and workloads. Change the defaults only if you understand th To override the default values see command-line flags with `-storage.cacheSize` prefix. See the full description of flags [here](#list-of-command-line-flags). - ## Data migration ### From VictoriaMetrics -The simplest way to migrate data from one single-node (source) to another (destination), or from one vmstorage node +The simplest way to migrate data from one single-node (source) to another (destination), or from one vmstorage node to another do the following: + 1. Stop the VictoriaMetrics (source) with `kill -INT`; -2. Copy (via [rsync](https://en.wikipedia.org/wiki/Rsync) or any other tool) the entire folder specified +2. Copy (via [rsync](https://en.wikipedia.org/wiki/Rsync) or any other tool) the entire folder specified via `-storageDataPath` from the source node to the empty folder at the destination node. -3. Once copy is done, stop the VictoriaMetrics (destination) with `kill -INT` and verify that +3. Once copy is done, stop the VictoriaMetrics (destination) with `kill -INT` and verify that its `-storageDataPath` points to the copied folder from p.2; 4. Start the VictoriaMetrics (destination). The copied data should be now available. Things to consider when copying data: + 1. Data formats between single-node and vmstorage node aren't compatible and can't be copied. 2. Copying data folder means complete replacement of the previous data on destination VictoriaMetrics. For more complex scenarios like single-to-cluster, cluster-to-single, re-sharding or migrating only a fraction of data - see [vmctl. Migrating data from VictoriaMetrics](https://docs.victoriametrics.com/vmctl.html#migrating-data-from-victoriametrics). - ### From other systems Use [vmctl](https://docs.victoriametrics.com/vmctl.html) for data migration. It supports the following data migration types: @@ -1485,7 +1438,6 @@ Use [vmctl](https://docs.victoriametrics.com/vmctl.html) for data migration. It See [vmctl docs](https://docs.victoriametrics.com/vmctl.html) for more details. - ## Backfilling VictoriaMetrics accepts historical data in arbitrary order of time via [any supported ingestion method](#how-to-import-time-series-data). @@ -1503,7 +1455,6 @@ Yet another solution is to increase `-search.cacheTimestampOffset` flag value in for data with timestamps close to the current time. Single-node VictoriaMetrics automatically resets response cache when samples with timestamps older than `now - search.cacheTimestampOffset` are ingested to it. - ## Data updates VictoriaMetrics doesn't support updating already existing sample values to new ones. It stores all the ingested data points @@ -1511,7 +1462,6 @@ for the same time series with identical timestamps. While it is possible substit [removal of old time series](#how-to-delete-time-series) and then [writing new time series](#backfilling), this approach should be used only for one-off updates. It shouldn't be used for frequent updates because of non-zero overhead related to data removal. - ## Replication Single-node VictoriaMetrics doesn't support application-level replication. Use cluster version instead. @@ -1521,7 +1471,6 @@ Storage-level replication may be offloaded to durable persistent storage such as See also [high availability docs](#high-availability) and [backup docs](#backups). - ## Backups VictoriaMetrics supports backups via [vmbackup](https://docs.victoriametrics.com/vmbackup.html) @@ -1529,19 +1478,17 @@ and [vmrestore](https://docs.victoriametrics.com/vmrestore.html) tools. We also provide [vmbackupmanager](https://docs.victoriametrics.com/vmbackupmanager.html) tool for enterprise subscribers. Enterprise binaries can be downloaded and evaluated for free from [the releases page](https://github.com/VictoriaMetrics/VictoriaMetrics/releases). - ## Benchmarks -Note, that vendors (including VictoriaMetrics) are often biased when doing such tests. E.g. they try highlighting -the best parts of their product, while highlighting the worst parts of competing products. -So we encourage users and all independent third parties to conduct their becnhmarks for various products +Note, that vendors (including VictoriaMetrics) are often biased when doing such tests. E.g. they try highlighting +the best parts of their product, while highlighting the worst parts of competing products. +So we encourage users and all independent third parties to conduct their becnhmarks for various products they are evaluating in production and publish the results. As a reference, please see [benchmarks](https://docs.victoriametrics.com/Articles.html#benchmarks) conducted by -VictoriaMetrics team. Please also see the [helm chart](https://github.com/VictoriaMetrics/benchmark) +VictoriaMetrics team. Please also see the [helm chart](https://github.com/VictoriaMetrics/benchmark) for running ingestion benchmarks based on node_exporter metrics. - ## Profiling VictoriaMetrics provides handlers for collecting the following [Go profiles](https://blog.golang.org/profiling-go-programs): @@ -1570,7 +1517,6 @@ The command for collecting CPU profile waits for 30 seconds before returning. The collected profiles may be analyzed with [go tool pprof](https://github.com/google/pprof). - ## Integrations * [Helm charts for single-node and cluster versions of VictoriaMetrics](https://github.com/VictoriaMetrics/helm-charts). @@ -1584,7 +1530,6 @@ The collected profiles may be analyzed with [go tool pprof](https://github.com/g * [Snap package for VictoriaMetrics](https://snapcraft.io/victoriametrics). * [vmalert-cli](https://github.com/aorfanos/vmalert-cli) - a CLI application for managing [vmalert](https://docs.victoriametrics.com/vmalert.html). - ## Third-party contributions * [Unofficial yum repository](https://copr.fedorainfracloud.org/coprs/antonpatsev/VictoriaMetrics/) ([source code](https://github.com/patsevanton/victoriametrics-rpm)) @@ -1592,12 +1537,10 @@ The collected profiles may be analyzed with [go tool pprof](https://github.com/g * [Prometheus -> VictoriaMetrics exporter #2](https://github.com/AnchorFree/tsdb-remote-write) * [Prometheus Oauth proxy](https://gitlab.com/optima_public/prometheus_oauth_proxy) - see [this article](https://medium.com/@richard.holly/powerful-saas-solution-for-detection-metrics-c67b9208d362) for details. - ## Contacts Contact us with any questions regarding VictoriaMetrics at [info@victoriametrics.com](mailto:info@victoriametrics.com). - ## Community and contributions Feel free asking any questions regarding VictoriaMetrics: @@ -1631,7 +1574,6 @@ Adhering `KISS` principle simplifies the resulting code and architecture, so it Report bugs and propose new features [here](https://github.com/VictoriaMetrics/VictoriaMetrics/issues). - ## VictoriaMetrics Logo [Zip](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/VM_logo.zip) contains three folders with different image orientations (main color and inverted version). @@ -1661,315 +1603,314 @@ Files included in each folder: * Do not change spacing, alignment, or relative locations of the design elements. * Do not change the proportions of any of the design elements or the design itself. You may resize as needed but must retain all proportions. - ## List of command-line flags Pass `-help` to VictoriaMetrics in order to see the list of supported command-line flags with their description: ``` -bigMergeConcurrency int - The maximum number of CPU cores to use for big merges. Default value is used if set to 0 + The maximum number of CPU cores to use for big merges. Default value is used if set to 0 -configAuthKey string - Authorization key for accessing /config page. It must be passed via authKey query arg + Authorization key for accessing /config page. It must be passed via authKey query arg -csvTrimTimestamp duration - Trim timestamps when importing csv data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) + Trim timestamps when importing csv data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) -datadog.maxInsertRequestSize size - The maximum size in bytes of a single DataDog POST request to /api/v1/series - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 67108864) + The maximum size in bytes of a single DataDog POST request to /api/v1/series + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 67108864) -dedup.minScrapeInterval duration - Leave only the first sample in every time series per each discrete interval equal to -dedup.minScrapeInterval > 0. See https://docs.victoriametrics.com/#deduplication and https://docs.victoriametrics.com/#downsampling + Leave only the first sample in every time series per each discrete interval equal to -dedup.minScrapeInterval > 0. See https://docs.victoriametrics.com/#deduplication and https://docs.victoriametrics.com/#downsampling -deleteAuthKey string - authKey for metrics' deletion via /api/v1/admin/tsdb/delete_series and /tags/delSeries + authKey for metrics' deletion via /api/v1/admin/tsdb/delete_series and /tags/delSeries -denyQueriesOutsideRetention - Whether to deny queries outside of the configured -retentionPeriod. When set, then /api/v1/query_range would return '503 Service Unavailable' error for queries with 'from' value outside -retentionPeriod. This may be useful when multiple data sources with distinct retentions are hidden behind query-tee + Whether to deny queries outside of the configured -retentionPeriod. When set, then /api/v1/query_range would return '503 Service Unavailable' error for queries with 'from' value outside -retentionPeriod. This may be useful when multiple data sources with distinct retentions are hidden behind query-tee -downsampling.period array - Comma-separated downsampling periods in the format 'offset:period'. For example, '30d:10m' instructs to leave a single sample per 10 minutes for samples older than 30 days. See https://docs.victoriametrics.com/#downsampling for details - Supports an array of values separated by comma or specified via multiple flags. + Comma-separated downsampling periods in the format 'offset:period'. For example, '30d:10m' instructs to leave a single sample per 10 minutes for samples older than 30 days. See https://docs.victoriametrics.com/#downsampling for details + Supports an array of values separated by comma or specified via multiple flags. -dryRun - Whether to check only -promscrape.config and then exit. Unknown config entries aren't allowed in -promscrape.config by default. This can be changed with -promscrape.config.strictParse=false command-line flag + Whether to check only -promscrape.config and then exit. Unknown config entries aren't allowed in -promscrape.config by default. This can be changed with -promscrape.config.strictParse=false command-line flag -enableTCP6 - Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used + Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used -envflag.enable - Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details + Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details -envflag.prefix string - Prefix for environment variables if -envflag.enable is set + Prefix for environment variables if -envflag.enable is set -eula - By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf + By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf -finalMergeDelay duration - The delay before starting final merge for per-month partition after no new data is ingested into it. Final merge may require additional disk IO and CPU resources. Final merge may increase query speed and reduce disk space usage in some cases. Zero value disables final merge + The delay before starting final merge for per-month partition after no new data is ingested into it. Final merge may require additional disk IO and CPU resources. Final merge may increase query speed and reduce disk space usage in some cases. Zero value disables final merge -forceFlushAuthKey string - authKey, which must be passed in query string to /internal/force_flush pages + authKey, which must be passed in query string to /internal/force_flush pages -forceMergeAuthKey string - authKey, which must be passed in query string to /internal/force_merge pages + authKey, which must be passed in query string to /internal/force_merge pages -fs.disableMmap - Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() + Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() -graphiteListenAddr string - TCP and UDP address to listen for Graphite plaintext data. Usually :2003 must be set. Doesn't work if empty + TCP and UDP address to listen for Graphite plaintext data. Usually :2003 must be set. Doesn't work if empty -graphiteTrimTimestamp duration - Trim timestamps for Graphite data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) + Trim timestamps for Graphite data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) -http.connTimeout duration - Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) + Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) -http.disableResponseCompression - Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth + Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth -http.idleConnTimeout duration - Timeout for incoming idle http connections (default 1m0s) + Timeout for incoming idle http connections (default 1m0s) -http.maxGracefulShutdownDuration duration - The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) + The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) -http.pathPrefix string - An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus + An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus -http.shutdownDelay duration - Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers + Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers -httpAuth.password string - Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty + Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty -httpAuth.username string - Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password + Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password -httpListenAddr string - TCP address to listen for http connections (default ":8428") + TCP address to listen for http connections (default ":8428") -import.maxLineLen size - The maximum length in bytes of a single line accepted by /api/v1/import; the line length can be limited with 'max_rows_per_line' query arg passed to /api/v1/export - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 104857600) + The maximum length in bytes of a single line accepted by /api/v1/import; the line length can be limited with 'max_rows_per_line' query arg passed to /api/v1/export + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 104857600) -influx.databaseNames array - Comma-separated list of database names to return from /query and /influx/query API. This can be needed for accepting data from Telegraf plugins such as https://github.com/fangli/fluent-plugin-influxdb - Supports an array of values separated by comma or specified via multiple flags. + Comma-separated list of database names to return from /query and /influx/query API. This can be needed for accepting data from Telegraf plugins such as https://github.com/fangli/fluent-plugin-influxdb + Supports an array of values separated by comma or specified via multiple flags. -influx.maxLineSize size - The maximum size in bytes for a single InfluxDB line during parsing - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 262144) + The maximum size in bytes for a single InfluxDB line during parsing + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 262144) -influxDBLabel string - Default label for the DB name sent over '?db={db_name}' query parameter (default "db") + Default label for the DB name sent over '?db={db_name}' query parameter (default "db") -influxListenAddr string - TCP and UDP address to listen for InfluxDB line protocol data. Usually :8189 must be set. Doesn't work if empty. This flag isn't needed when ingesting data over HTTP - just send it to http://:8428/write + TCP and UDP address to listen for InfluxDB line protocol data. Usually :8189 must be set. Doesn't work if empty. This flag isn't needed when ingesting data over HTTP - just send it to http://:8428/write -influxMeasurementFieldSeparator string - Separator for '{measurement}{separator}{field_name}' metric name when inserted via InfluxDB line protocol (default "_") + Separator for '{measurement}{separator}{field_name}' metric name when inserted via InfluxDB line protocol (default "_") -influxSkipMeasurement - Uses '{field_name}' as a metric name while ignoring '{measurement}' and '-influxMeasurementFieldSeparator' + Uses '{field_name}' as a metric name while ignoring '{measurement}' and '-influxMeasurementFieldSeparator' -influxSkipSingleField - Uses '{measurement}' instead of '{measurement}{separator}{field_name}' for metic name if InfluxDB line contains only a single field + Uses '{measurement}' instead of '{measurement}{separator}{field_name}' for metic name if InfluxDB line contains only a single field -influxTrimTimestamp duration - Trim timestamps for InfluxDB line protocol data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) + Trim timestamps for InfluxDB line protocol data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) -insert.maxQueueDuration duration - The maximum duration for waiting in the queue for insert requests due to -maxConcurrentInserts (default 1m0s) + The maximum duration for waiting in the queue for insert requests due to -maxConcurrentInserts (default 1m0s) -logNewSeries - Whether to log new series. This option is for debug purposes only. It can lead to performance issues when big number of new series are ingested into VictoriaMetrics + Whether to log new series. This option is for debug purposes only. It can lead to performance issues when big number of new series are ingested into VictoriaMetrics -loggerDisableTimestamps - Whether to disable writing timestamps in logs + Whether to disable writing timestamps in logs -loggerErrorsPerSecondLimit int - Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit + Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit -loggerFormat string - Format for logs. Possible values: default, json (default "default") + Format for logs. Possible values: default, json (default "default") -loggerLevel string - Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") + Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") -loggerOutput string - Output for the logs. Supported values: stderr, stdout (default "stderr") + Output for the logs. Supported values: stderr, stdout (default "stderr") -loggerTimezone string - Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") + Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") -loggerWarnsPerSecondLimit int - Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit + Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit -maxConcurrentInserts int - The maximum number of concurrent inserts. Default value should work for most cases, since it minimizes the overhead for concurrent inserts. This option is tigthly coupled with -insert.maxQueueDuration (default 16) + The maximum number of concurrent inserts. Default value should work for most cases, since it minimizes the overhead for concurrent inserts. This option is tigthly coupled with -insert.maxQueueDuration (default 16) -maxInsertRequestSize size - The maximum size in bytes of a single Prometheus remote_write API request - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) + The maximum size in bytes of a single Prometheus remote_write API request + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) -maxLabelValueLen int - The maximum length of label values in the accepted time series. Longer label values are truncated. In this case the vm_too_long_label_values_total metric at /metrics page is incremented (default 16384) + The maximum length of label values in the accepted time series. Longer label values are truncated. In this case the vm_too_long_label_values_total metric at /metrics page is incremented (default 16384) -maxLabelsPerTimeseries int - The maximum number of labels accepted per time series. Superfluous labels are dropped. In this case the vm_metrics_with_dropped_labels_total metric at /metrics page is incremented (default 30) + The maximum number of labels accepted per time series. Superfluous labels are dropped. In this case the vm_metrics_with_dropped_labels_total metric at /metrics page is incremented (default 30) -memory.allowedBytes size - Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -memory.allowedPercent float - Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) + Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) -metricsAuthKey string - Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings -opentsdbHTTPListenAddr string - TCP address to listen for OpentTSDB HTTP put requests. Usually :4242 must be set. Doesn't work if empty + TCP address to listen for OpentTSDB HTTP put requests. Usually :4242 must be set. Doesn't work if empty -opentsdbListenAddr string - TCP and UDP address to listen for OpentTSDB metrics. Telnet put messages and HTTP /api/put messages are simultaneously served on TCP port. Usually :4242 must be set. Doesn't work if empty + TCP and UDP address to listen for OpentTSDB metrics. Telnet put messages and HTTP /api/put messages are simultaneously served on TCP port. Usually :4242 must be set. Doesn't work if empty -opentsdbTrimTimestamp duration - Trim timestamps for OpenTSDB 'telnet put' data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) + Trim timestamps for OpenTSDB 'telnet put' data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) -opentsdbhttp.maxInsertRequestSize size - The maximum size of OpenTSDB HTTP put request - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) + The maximum size of OpenTSDB HTTP put request + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) -opentsdbhttpTrimTimestamp duration - Trim timestamps for OpenTSDB HTTP data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) + Trim timestamps for OpenTSDB HTTP data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) -pprofAuthKey string - Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings -precisionBits int - The number of precision bits to store per each value. Lower precision bits improves data compression at the cost of precision loss (default 64) + The number of precision bits to store per each value. Lower precision bits improves data compression at the cost of precision loss (default 64) -promscrape.cluster.memberNum int - The number of number in the cluster of scrapers. It must be an unique value in the range 0 ... promscrape.cluster.membersCount-1 across scrapers in the cluster + The number of number in the cluster of scrapers. It must be an unique value in the range 0 ... promscrape.cluster.membersCount-1 across scrapers in the cluster -promscrape.cluster.membersCount int - The number of members in a cluster of scrapers. Each member must have an unique -promscrape.cluster.memberNum in the range 0 ... promscrape.cluster.membersCount-1 . Each member then scrapes roughly 1/N of all the targets. By default cluster scraping is disabled, i.e. a single scraper scrapes all the targets + The number of members in a cluster of scrapers. Each member must have an unique -promscrape.cluster.memberNum in the range 0 ... promscrape.cluster.membersCount-1 . Each member then scrapes roughly 1/N of all the targets. By default cluster scraping is disabled, i.e. a single scraper scrapes all the targets -promscrape.cluster.replicationFactor int - The number of members in the cluster, which scrape the same targets. If the replication factor is greater than 2, then the deduplication must be enabled at remote storage side. See https://docs.victoriametrics.com/#deduplication (default 1) + The number of members in the cluster, which scrape the same targets. If the replication factor is greater than 2, then the deduplication must be enabled at remote storage side. See https://docs.victoriametrics.com/#deduplication (default 1) -promscrape.config string - Optional path to Prometheus config file with 'scrape_configs' section containing targets to scrape. The path can point to local file and to http url. See https://docs.victoriametrics.com/#how-to-scrape-prometheus-exporters-such-as-node-exporter for details + Optional path to Prometheus config file with 'scrape_configs' section containing targets to scrape. The path can point to local file and to http url. See https://docs.victoriametrics.com/#how-to-scrape-prometheus-exporters-such-as-node-exporter for details -promscrape.config.dryRun - Checks -promscrape.config file for errors and unsupported fields and then exits. Returns non-zero exit code on parsing errors and emits these errors to stderr. See also -promscrape.config.strictParse command-line flag. Pass -loggerLevel=ERROR if you don't need to see info messages in the output. + Checks -promscrape.config file for errors and unsupported fields and then exits. Returns non-zero exit code on parsing errors and emits these errors to stderr. See also -promscrape.config.strictParse command-line flag. Pass -loggerLevel=ERROR if you don't need to see info messages in the output. -promscrape.config.strictParse - Whether to deny unsupported fields in -promscrape.config . Set to false in order to silently skip unsupported fields (default true) + Whether to deny unsupported fields in -promscrape.config . Set to false in order to silently skip unsupported fields (default true) -promscrape.configCheckInterval duration - Interval for checking for changes in '-promscrape.config' file. By default the checking is disabled. Send SIGHUP signal in order to force config check for changes + Interval for checking for changes in '-promscrape.config' file. By default the checking is disabled. Send SIGHUP signal in order to force config check for changes -promscrape.consul.waitTime duration - Wait time used by Consul service discovery. Default value is used if not set + Wait time used by Consul service discovery. Default value is used if not set -promscrape.consulSDCheckInterval duration - Interval for checking for changes in Consul. This works only if consul_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#consul_sd_config for details (default 30s) + Interval for checking for changes in Consul. This works only if consul_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#consul_sd_config for details (default 30s) -promscrape.digitaloceanSDCheckInterval duration - Interval for checking for changes in digital ocean. This works only if digitalocean_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#digitalocean_sd_config for details (default 1m0s) + Interval for checking for changes in digital ocean. This works only if digitalocean_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#digitalocean_sd_config for details (default 1m0s) -promscrape.disableCompression - Whether to disable sending 'Accept-Encoding: gzip' request headers to all the scrape targets. This may reduce CPU usage on scrape targets at the cost of higher network bandwidth utilization. It is possible to set 'disable_compression: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control + Whether to disable sending 'Accept-Encoding: gzip' request headers to all the scrape targets. This may reduce CPU usage on scrape targets at the cost of higher network bandwidth utilization. It is possible to set 'disable_compression: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control -promscrape.disableKeepAlive - Whether to disable HTTP keep-alive connections when scraping all the targets. This may be useful when targets has no support for HTTP keep-alive connection. It is possible to set 'disable_keepalive: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control. Note that disabling HTTP keep-alive may increase load on both vmagent and scrape targets + Whether to disable HTTP keep-alive connections when scraping all the targets. This may be useful when targets has no support for HTTP keep-alive connection. It is possible to set 'disable_keepalive: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control. Note that disabling HTTP keep-alive may increase load on both vmagent and scrape targets -promscrape.discovery.concurrency int - The maximum number of concurrent requests to Prometheus autodiscovery API (Consul, Kubernetes, etc.) (default 100) + The maximum number of concurrent requests to Prometheus autodiscovery API (Consul, Kubernetes, etc.) (default 100) -promscrape.discovery.concurrentWaitTime duration - The maximum duration for waiting to perform API requests if more than -promscrape.discovery.concurrency requests are simultaneously performed (default 1m0s) + The maximum duration for waiting to perform API requests if more than -promscrape.discovery.concurrency requests are simultaneously performed (default 1m0s) -promscrape.dnsSDCheckInterval duration - Interval for checking for changes in dns. This works only if dns_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dns_sd_config for details (default 30s) + Interval for checking for changes in dns. This works only if dns_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dns_sd_config for details (default 30s) -promscrape.dockerSDCheckInterval duration - Interval for checking for changes in docker. This works only if docker_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#docker_sd_config for details (default 30s) + Interval for checking for changes in docker. This works only if docker_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#docker_sd_config for details (default 30s) -promscrape.dockerswarmSDCheckInterval duration - Interval for checking for changes in dockerswarm. This works only if dockerswarm_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dockerswarm_sd_config for details (default 30s) + Interval for checking for changes in dockerswarm. This works only if dockerswarm_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dockerswarm_sd_config for details (default 30s) -promscrape.dropOriginalLabels - Whether to drop original labels for scrape targets at /targets and /api/v1/targets pages. This may be needed for reducing memory usage when original labels for big number of scrape targets occupy big amounts of memory. Note that this reduces debuggability for improper per-target relabeling configs + Whether to drop original labels for scrape targets at /targets and /api/v1/targets pages. This may be needed for reducing memory usage when original labels for big number of scrape targets occupy big amounts of memory. Note that this reduces debuggability for improper per-target relabeling configs -promscrape.ec2SDCheckInterval duration - Interval for checking for changes in ec2. This works only if ec2_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config for details (default 1m0s) + Interval for checking for changes in ec2. This works only if ec2_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config for details (default 1m0s) -promscrape.eurekaSDCheckInterval duration - Interval for checking for changes in eureka. This works only if eureka_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#eureka_sd_config for details (default 30s) + Interval for checking for changes in eureka. This works only if eureka_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#eureka_sd_config for details (default 30s) -promscrape.fileSDCheckInterval duration - Interval for checking for changes in 'file_sd_config'. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#file_sd_config for details (default 5m0s) + Interval for checking for changes in 'file_sd_config'. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#file_sd_config for details (default 5m0s) -promscrape.gceSDCheckInterval duration - Interval for checking for changes in gce. This works only if gce_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#gce_sd_config for details (default 1m0s) + Interval for checking for changes in gce. This works only if gce_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#gce_sd_config for details (default 1m0s) -promscrape.httpSDCheckInterval duration - Interval for checking for changes in http endpoint service discovery. This works only if http_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#http_sd_config for details (default 1m0s) + Interval for checking for changes in http endpoint service discovery. This works only if http_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#http_sd_config for details (default 1m0s) -promscrape.kubernetes.apiServerTimeout duration - How frequently to reload the full state from Kuberntes API server (default 30m0s) + How frequently to reload the full state from Kuberntes API server (default 30m0s) -promscrape.kubernetesSDCheckInterval duration - Interval for checking for changes in Kubernetes API server. This works only if kubernetes_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config for details (default 30s) + Interval for checking for changes in Kubernetes API server. This works only if kubernetes_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config for details (default 30s) -promscrape.maxDroppedTargets int - The maximum number of droppedTargets to show at /api/v1/targets page. Increase this value if your setup drops more scrape targets during relabeling and you need investigating labels for all the dropped targets. Note that the increased number of tracked dropped targets may result in increased memory usage (default 1000) + The maximum number of droppedTargets to show at /api/v1/targets page. Increase this value if your setup drops more scrape targets during relabeling and you need investigating labels for all the dropped targets. Note that the increased number of tracked dropped targets may result in increased memory usage (default 1000) -promscrape.maxResponseHeadersSize size - The maximum size of http response headers from Prometheus scrape targets - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 4096) + The maximum size of http response headers from Prometheus scrape targets + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 4096) -promscrape.maxScrapeSize size - The maximum size of scrape response in bytes to process from Prometheus targets. Bigger responses are rejected - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 16777216) + The maximum size of scrape response in bytes to process from Prometheus targets. Bigger responses are rejected + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 16777216) -promscrape.minResponseSizeForStreamParse size - The minimum target response size for automatic switching to stream parsing mode, which can reduce memory usage. See https://docs.victoriametrics.com/vmagent.html#stream-parsing-mode - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 1000000) + The minimum target response size for automatic switching to stream parsing mode, which can reduce memory usage. See https://docs.victoriametrics.com/vmagent.html#stream-parsing-mode + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 1000000) -promscrape.noStaleMarkers - Whether to disable sending Prometheus stale markers for metrics when scrape target disappears. This option may reduce memory usage if stale markers aren't needed for your setup. This option also disables populating the scrape_series_added metric. See https://prometheus.io/docs/concepts/jobs_instances/#automatically-generated-labels-and-time-series + Whether to disable sending Prometheus stale markers for metrics when scrape target disappears. This option may reduce memory usage if stale markers aren't needed for your setup. This option also disables populating the scrape_series_added metric. See https://prometheus.io/docs/concepts/jobs_instances/#automatically-generated-labels-and-time-series -promscrape.openstackSDCheckInterval duration - Interval for checking for changes in openstack API server. This works only if openstack_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#openstack_sd_config for details (default 30s) + Interval for checking for changes in openstack API server. This works only if openstack_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#openstack_sd_config for details (default 30s) -promscrape.seriesLimitPerTarget int - Optional limit on the number of unique time series a single scrape target can expose. See https://docs.victoriametrics.com/vmagent.html#cardinality-limiter for more info + Optional limit on the number of unique time series a single scrape target can expose. See https://docs.victoriametrics.com/vmagent.html#cardinality-limiter for more info -promscrape.streamParse - Whether to enable stream parsing for metrics obtained from scrape targets. This may be useful for reducing memory usage when millions of metrics are exposed per each scrape target. It is posible to set 'stream_parse: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control + Whether to enable stream parsing for metrics obtained from scrape targets. This may be useful for reducing memory usage when millions of metrics are exposed per each scrape target. It is posible to set 'stream_parse: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control -promscrape.suppressDuplicateScrapeTargetErrors - Whether to suppress 'duplicate scrape target' errors; see https://docs.victoriametrics.com/vmagent.html#troubleshooting for details + Whether to suppress 'duplicate scrape target' errors; see https://docs.victoriametrics.com/vmagent.html#troubleshooting for details -promscrape.suppressScrapeErrors - Whether to suppress scrape errors logging. The last error for each target is always available at '/targets' page even if scrape errors logging is suppressed + Whether to suppress scrape errors logging. The last error for each target is always available at '/targets' page even if scrape errors logging is suppressed -relabelConfig string - Optional path to a file with relabeling rules, which are applied to all the ingested metrics. The path can point either to local file or to http url. See https://docs.victoriametrics.com/#relabeling for details. The config is reloaded on SIGHUP signal + Optional path to a file with relabeling rules, which are applied to all the ingested metrics. The path can point either to local file or to http url. See https://docs.victoriametrics.com/#relabeling for details. The config is reloaded on SIGHUP signal -relabelDebug - Whether to log metrics before and after relabeling with -relabelConfig. If the -relabelDebug is enabled, then the metrics aren't sent to storage. This is useful for debugging the relabeling configs + Whether to log metrics before and after relabeling with -relabelConfig. If the -relabelDebug is enabled, then the metrics aren't sent to storage. This is useful for debugging the relabeling configs -retentionPeriod value - Data with timestamps outside the retentionPeriod is automatically deleted - The following optional suffixes are supported: h (hour), d (day), w (week), y (year). If suffix isn't set, then the duration is counted in months (default 1) + Data with timestamps outside the retentionPeriod is automatically deleted + The following optional suffixes are supported: h (hour), d (day), w (week), y (year). If suffix isn't set, then the duration is counted in months (default 1) -search.cacheTimestampOffset duration - The maximum duration since the current time for response data, which is always queried from the original raw data, without using the response cache. Increase this value if you see gaps in responses due to time synchronization issues between VictoriaMetrics and data sources. See also -search.disableAutoCacheReset (default 5m0s) + The maximum duration since the current time for response data, which is always queried from the original raw data, without using the response cache. Increase this value if you see gaps in responses due to time synchronization issues between VictoriaMetrics and data sources. See also -search.disableAutoCacheReset (default 5m0s) -search.disableAutoCacheReset - Whether to disable automatic response cache reset if a sample with timestamp outside -search.cacheTimestampOffset is inserted into VictoriaMetrics + Whether to disable automatic response cache reset if a sample with timestamp outside -search.cacheTimestampOffset is inserted into VictoriaMetrics -search.disableCache - Whether to disable response caching. This may be useful during data backfilling + Whether to disable response caching. This may be useful during data backfilling -search.graphiteMaxPointsPerSeries int - The maximum number of points per series Graphite render API can return (default 1000000) + The maximum number of points per series Graphite render API can return (default 1000000) -search.graphiteStorageStep duration - The interval between datapoints stored in the database. It is used at Graphite Render API handler for normalizing the interval between datapoints in case it isn't normalized. It can be overriden by sending 'storage_step' query arg to /render API or by sending the desired interval via 'Storage-Step' http header during querying /render API (default 10s) + The interval between datapoints stored in the database. It is used at Graphite Render API handler for normalizing the interval between datapoints in case it isn't normalized. It can be overriden by sending 'storage_step' query arg to /render API or by sending the desired interval via 'Storage-Step' http header during querying /render API (default 10s) -search.latencyOffset duration - The time when data points become visible in query results after the collection. Too small value can result in incomplete last points for query results (default 30s) + The time when data points become visible in query results after the collection. Too small value can result in incomplete last points for query results (default 30s) -search.logSlowQueryDuration duration - Log queries with execution time exceeding this value. Zero disables slow query logging (default 5s) + Log queries with execution time exceeding this value. Zero disables slow query logging (default 5s) -search.maxConcurrentRequests int - The maximum number of concurrent search requests. It shouldn't be high, since a single request can saturate all the CPU cores. See also -search.maxQueueDuration (default 8) + The maximum number of concurrent search requests. It shouldn't be high, since a single request can saturate all the CPU cores. See also -search.maxQueueDuration (default 8) -search.maxExportDuration duration - The maximum duration for /api/v1/export call (default 720h0m0s) + The maximum duration for /api/v1/export call (default 720h0m0s) -search.maxLookback duration - Synonym to -search.lookback-delta from Prometheus. The value is dynamically detected from interval between time series datapoints if not set. It can be overridden on per-query basis via max_lookback arg. See also '-search.maxStalenessInterval' flag, which has the same meaining due to historical reasons + Synonym to -search.lookback-delta from Prometheus. The value is dynamically detected from interval between time series datapoints if not set. It can be overridden on per-query basis via max_lookback arg. See also '-search.maxStalenessInterval' flag, which has the same meaining due to historical reasons -search.maxPointsPerTimeseries int - The maximum points per a single timeseries returned from /api/v1/query_range. This option doesn't limit the number of scanned raw samples in the database. The main purpose of this option is to limit the number of per-series points returned to graphing UI such as Grafana. There is no sense in setting this limit to values bigger than the horizontal resolution of the graph (default 30000) + The maximum points per a single timeseries returned from /api/v1/query_range. This option doesn't limit the number of scanned raw samples in the database. The main purpose of this option is to limit the number of per-series points returned to graphing UI such as Grafana. There is no sense in setting this limit to values bigger than the horizontal resolution of the graph (default 30000) -search.maxQueryDuration duration - The maximum duration for query execution (default 30s) + The maximum duration for query execution (default 30s) -search.maxQueryLen size - The maximum search query length in bytes - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 16384) + The maximum search query length in bytes + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 16384) -search.maxQueueDuration duration - The maximum time the request waits for execution when -search.maxConcurrentRequests limit is reached; see also -search.maxQueryDuration (default 10s) + The maximum time the request waits for execution when -search.maxConcurrentRequests limit is reached; see also -search.maxQueryDuration (default 10s) -search.maxSamplesPerQuery int - The maximum number of raw samples a single query can process across all time series. This protects from heavy queries, which select unexpectedly high number of raw samples. See also -search.maxSamplesPerSeries (default 1000000000) + The maximum number of raw samples a single query can process across all time series. This protects from heavy queries, which select unexpectedly high number of raw samples. See also -search.maxSamplesPerSeries (default 1000000000) -search.maxSamplesPerSeries int - The maximum number of raw samples a single query can scan per each time series. This option allows limiting memory usage (default 30000000) + The maximum number of raw samples a single query can scan per each time series. This option allows limiting memory usage (default 30000000) -search.maxStalenessInterval duration - The maximum interval for staleness calculations. By default it is automatically calculated from the median interval between samples. This flag could be useful for tuning Prometheus data model closer to Influx-style data model. See https://prometheus.io/docs/prometheus/latest/querying/basics/#staleness for details. See also '-search.maxLookback' flag, which has the same meaning due to historical reasons + The maximum interval for staleness calculations. By default it is automatically calculated from the median interval between samples. This flag could be useful for tuning Prometheus data model closer to Influx-style data model. See https://prometheus.io/docs/prometheus/latest/querying/basics/#staleness for details. See also '-search.maxLookback' flag, which has the same meaning due to historical reasons -search.maxStatusRequestDuration duration - The maximum duration for /api/v1/status/* requests (default 5m0s) + The maximum duration for /api/v1/status/* requests (default 5m0s) -search.maxStepForPointsAdjustment duration - The maximum step when /api/v1/query_range handler adjusts points with timestamps closer than -search.latencyOffset to the current time. The adjustment is needed because such points may contain incomplete data (default 1m0s) + The maximum step when /api/v1/query_range handler adjusts points with timestamps closer than -search.latencyOffset to the current time. The adjustment is needed because such points may contain incomplete data (default 1m0s) -search.maxTagKeys int - The maximum number of tag keys returned from /api/v1/labels (default 100000) + The maximum number of tag keys returned from /api/v1/labels (default 100000) -search.maxTagValueSuffixesPerSearch int - The maximum number of tag value suffixes returned from /metrics/find (default 100000) + The maximum number of tag value suffixes returned from /metrics/find (default 100000) -search.maxTagValues int - The maximum number of tag values returned from /api/v1/label//values (default 100000) + The maximum number of tag values returned from /api/v1/label//values (default 100000) -search.maxUniqueTimeseries int - The maximum number of unique time series each search can scan. This option allows limiting memory usage (default 300000) + The maximum number of unique time series each search can scan. This option allows limiting memory usage (default 300000) -search.minStalenessInterval duration - The minimum interval for staleness calculations. This flag could be useful for removing gaps on graphs generated from time series with irregular intervals between samples. See also '-search.maxStalenessInterval' + The minimum interval for staleness calculations. This flag could be useful for removing gaps on graphs generated from time series with irregular intervals between samples. See also '-search.maxStalenessInterval' -search.noStaleMarkers - Set this flag to true if the database doesn't contain Prometheus stale markers, so there is no need in spending additional CPU time on its handling. Staleness markers may exist only in data obtained from Prometheus scrape targets + Set this flag to true if the database doesn't contain Prometheus stale markers, so there is no need in spending additional CPU time on its handling. Staleness markers may exist only in data obtained from Prometheus scrape targets -search.queryStats.lastQueriesCount int - Query stats for /api/v1/status/top_queries is tracked on this number of last queries. Zero value disables query stats tracking (default 20000) + Query stats for /api/v1/status/top_queries is tracked on this number of last queries. Zero value disables query stats tracking (default 20000) -search.queryStats.minQueryDuration duration - The minimum duration for queries to track in query stats at /api/v1/status/top_queries. Queries with lower duration are ignored in query stats (default 1ms) + The minimum duration for queries to track in query stats at /api/v1/status/top_queries. Queries with lower duration are ignored in query stats (default 1ms) -search.resetCacheAuthKey string - Optional authKey for resetting rollup cache via /internal/resetRollupResultCache call + Optional authKey for resetting rollup cache via /internal/resetRollupResultCache call -search.treatDotsAsIsInRegexps - Whether to treat dots as is in regexp label filters used in queries. For example, foo{bar=~"a.b.c"} will be automatically converted to foo{bar=~"a\\.b\\.c"}, i.e. all the dots in regexp filters will be automatically escaped in order to match only dot char instead of matching any char. Dots in ".+", ".*" and ".{n}" regexps aren't escaped. This option is DEPRECATED in favor of {__graphite__="a.*.c"} syntax for selecting metrics matching the given Graphite metrics filter + Whether to treat dots as is in regexp label filters used in queries. For example, foo{bar=~"a.b.c"} will be automatically converted to foo{bar=~"a\\.b\\.c"}, i.e. all the dots in regexp filters will be automatically escaped in order to match only dot char instead of matching any char. Dots in ".+", ".*" and ".{n}" regexps aren't escaped. This option is DEPRECATED in favor of {__graphite__="a.*.c"} syntax for selecting metrics matching the given Graphite metrics filter -selfScrapeInstance string - Value for 'instance' label, which is added to self-scraped metrics (default "self") + Value for 'instance' label, which is added to self-scraped metrics (default "self") -selfScrapeInterval duration - Interval for self-scraping own metrics at /metrics page + Interval for self-scraping own metrics at /metrics page -selfScrapeJob string - Value for 'job' label, which is added to self-scraped metrics (default "victoria-metrics") + Value for 'job' label, which is added to self-scraped metrics (default "victoria-metrics") -smallMergeConcurrency int - The maximum number of CPU cores to use for small merges. Default value is used if set to 0 + The maximum number of CPU cores to use for small merges. Default value is used if set to 0 -snapshotAuthKey string - authKey, which must be passed in query string to /snapshot* pages + authKey, which must be passed in query string to /snapshot* pages -sortLabels - Whether to sort labels for incoming samples before writing them to storage. This may be needed for reducing memory usage at storage when the order of labels in incoming samples is random. For example, if m{k1="v1",k2="v2"} may be sent as m{k2="v2",k1="v1"}. Enabled sorting for labels can slow down ingestion performance a bit + Whether to sort labels for incoming samples before writing them to storage. This may be needed for reducing memory usage at storage when the order of labels in incoming samples is random. For example, if m{k1="v1",k2="v2"} may be sent as m{k2="v2",k1="v1"}. Enabled sorting for labels can slow down ingestion performance a bit -storage.cacheSizeIndexDBDataBlocks size - Overrides max size for indexdb/dataBlocks cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Overrides max size for indexdb/dataBlocks cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -storage.cacheSizeIndexDBIndexBlocks size - Overrides max size for indexdb/indexBlocks cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Overrides max size for indexdb/indexBlocks cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -storage.cacheSizeStorageTSID size - Overrides max size for storage/tsid cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Overrides max size for storage/tsid cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -storage.maxDailySeries int - The maximum number of unique series can be added to the storage during the last 24 hours. Excess series are logged and dropped. This can be useful for limiting series churn rate. See also -storage.maxHourlySeries + The maximum number of unique series can be added to the storage during the last 24 hours. Excess series are logged and dropped. This can be useful for limiting series churn rate. See also -storage.maxHourlySeries -storage.maxHourlySeries int - The maximum number of unique series can be added to the storage during the last hour. Excess series are logged and dropped. This can be useful for limiting series cardinality. See also -storage.maxDailySeries + The maximum number of unique series can be added to the storage during the last hour. Excess series are logged and dropped. This can be useful for limiting series cardinality. See also -storage.maxDailySeries -storage.minFreeDiskSpaceBytes size - The minimum free disk space at -storageDataPath after which the storage stops accepting new data - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 10000000) + The minimum free disk space at -storageDataPath after which the storage stops accepting new data + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 10000000) -storageDataPath string - Path to storage data (default "victoria-metrics-data") + Path to storage data (default "victoria-metrics-data") -tls - Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set + Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set -tlsCertFile string - Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated -tlsKeyFile string - Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated -version - Show VictoriaMetrics version + Show VictoriaMetrics version ``` diff --git a/docs/Release-Guide.md b/docs/Release-Guide.md index 1b02f357b..8dce6bfe2 100644 --- a/docs/Release-Guide.md +++ b/docs/Release-Guide.md @@ -13,37 +13,38 @@ sort: 17 * `git tag -s v1.xx.y-enterprise` in `enterprise` branch * `git tag -s v1.xx.y-enterprise-cluster` in `enterprise-cluster` branch 2. Run `TAG=v1.xx.y make publish-release`. It will create `*.tar.gz` release archives with the corresponding `_checksums.txt` files inside `bin` directory and publish Docker images for the given `TAG`, `TAG-cluster`, `TAG-enterprise` and `TAG-enterprise-cluster`. -5. Push release tag to https://github.com/VictoriaMetrics/VictoriaMetrics : `git push origin v1.xx.y`. -6. Go to https://github.com/VictoriaMetrics/VictoriaMetrics/releases , create new release from the pushed tag on step 5 and upload `*.tar.gz` archive with the corresponding `_checksums.txt` from step 2. +3. Push release tag to : `git push origin v1.xx.y`. +4. Go to , create new release from the pushed tag on step 5 and upload `*.tar.gz` archive with the corresponding `_checksums.txt` from step 2. -## Building snap package. +## Building snap package - pre-requirements: -- snapcraft binary, can be installed with commands: + pre-requirements: + +* snapcraft binary, can be installed with commands: for MacOS `brew install snapcraft` and [install mutipass](https://discourse.ubuntu.com/t/installing-multipass-on-macos/8329), for Ubuntu - `sudo snap install snapcraft --classic` -- exported snapcraft login to `~/.snap/login.json` with `snapcraft export-login login.json && mkdir -p ~/.snap && mv login.json ~/.snap/` -- already created release at github (it operates `git describe` version, so git tag must be annotated). +* exported snapcraft login to `~/.snap/login.json` with `snapcraft export-login login.json && mkdir -p ~/.snap && mv login.json ~/.snap/` +* already created release at github (it operates `git describe` version, so git tag must be annotated). 0. checkout to the latest git tag for single-node version. 1. execute `make release-snap` - it must build and upload snap package. 2. promote release to current, if needed manually at release page [snapcraft-releases](https://snapcraft.io/victoriametrics/releases) -### Public Announcement +### Public Announcement -- Publish message in Slack at https://victoriametrics.slack.com -- Post at Twitter at https://twitter.com/MetricsVictoria -- Post in Reddit at https://www.reddit.com/r/VictoriaMetrics/ -- Post in Linkedin at https://www.linkedin.com/company/victoriametrics/ -- Publish message in Telegram at https://t.me/VictoriaMetrics_en and https://t.me/VictoriaMetrics_ru1 -- Publish message in google groups at https://groups.google.com/forum/#!forum/victorametrics-users +* Publish message in Slack at +* Post at Twitter at +* Post in Reddit at +* Post in Linkedin at +* Publish message in Telegram at and +* Publish message in google groups at ## Helm Charts The helm chart repository [https://github.com/VictoriaMetrics/helm-charts/](https://github.com/VictoriaMetrics/helm-charts/) +### Bump the version of images -### Bump the version of images. In that case, don't need to bump the helm chart version 1. Need to update [`values.yaml`](https://github.com/VictoriaMetrics/helm-charts/blob/master/charts/victoria-metrics-cluster/values.yaml), bump version for `vmselect`, `vminsert` and `vmstorage` @@ -52,20 +53,20 @@ In that case, don't need to bump the helm chart version 4. Push changes to master. `master` is a source of truth 5. Rebase `master` into `gh-pages` branch 6. Run `make package` which creates or updates zip file with the packed chart -7. Run `make merge`. It creates or updates metadata for charts in index.yaml -8. Push the changes to `gh-pages` branch +7. Run `make merge`. It creates or updates metadata for charts in index.yaml +8. Push the changes to `gh-pages` branch + +### Updating the chart -### Updating the chart. 1. Update chart version in [`Chart.yaml`](https://github.com/VictoriaMetrics/helm-charts/blob/master/charts/victoria-metrics-cluster/Chart.yaml) 2. Update [README.md](https://github.com/VictoriaMetrics/helm-charts/blob/master/charts/victoria-metrics-cluster/README.md) file, reflect changes in the documentation. 3. Repeat the procedure from step _4_ previous section. - ## Wiki pages All changes from `docs` folder and `.md` extension automatically push to Wiki -**_Note_**: no vice versa, direct changes on Wiki will be overitten after any changes in `docs/*.md` +**_Note_**: no vice versa, direct changes on Wiki will be overitten after any changes in `docs/*.md` ## Github pages diff --git a/docs/Single-server-VictoriaMetrics.md b/docs/Single-server-VictoriaMetrics.md index f5dcf968f..b7cea94a0 100644 --- a/docs/Single-server-VictoriaMetrics.md +++ b/docs/Single-server-VictoriaMetrics.md @@ -25,7 +25,6 @@ Cluster version of VictoriaMetrics is available [here](https://docs.victoriametr [Contact us](mailto:info@victoriametrics.com) if you need enterprise support for VictoriaMetrics. See [features available in enterprise package](https://victoriametrics.com/products/enterprise/). Enterprise binaries can be downloaded and evaluated for free from [the releases page](https://github.com/VictoriaMetrics/VictoriaMetrics/releases). - ## Prominent features VictoriaMetrics has the following prominent features: @@ -65,7 +64,6 @@ VictoriaMetrics has the following prominent features: See also [various Articles about VictoriaMetrics](https://docs.victoriametrics.com/Articles.html). - ## Case studies and talks Case studies: @@ -96,7 +94,6 @@ Case studies: See also [articles and slides about VictoriaMetrics from our users](https://docs.victoriametrics.com/Articles.html#third-party-articles-and-slides-about-victoriametrics) - ## Operation ## How to start VictoriaMetrics @@ -116,7 +113,6 @@ VictoriaMetrics accepts [Prometheus querying API requests](#prometheus-querying- It is recommended setting up [monitoring](#monitoring) for VictoriaMetrics. - ### Environment variables Each flag value can be set via environment variables according to these rules: @@ -126,10 +122,8 @@ Each flag value can be set via environment variables according to these rules: * For repeating flags an alternative syntax can be used by joining the different values into one using `,` char as separator (for example `-storageNode -storageNode ` will translate to `storageNode=,`). * Environment var prefix can be set via `-envflag.prefix` flag. For instance, if `-envflag.prefix=VM_`, then env vars must be prepended with `VM_`. - ### Configuration with snap package - Snap package for VictoriaMetrics is available [here](https://snapcraft.io/victoriametrics). Command-line flags for Snap package can be set with following command: @@ -141,7 +135,6 @@ snap restart victoriametrics Do not change value for `-storageDataPath` flag, because snap package has limited access to host filesystem. - Changing scrape configuration is possible with text editor: ```text @@ -150,7 +143,6 @@ vi $SNAP_DATA/var/snap/victoriametrics/current/etc/victoriametrics-scrape-config After changes were made, trigger config re-read with the command `curl 127.0.0.1:8248/-/reload`. - ## Prometheus setup Add the following lines to Prometheus config file (it is usually located at `/etc/prometheus/prometheus.yml`) in order to send data to VictoriaMetrics: @@ -204,7 +196,6 @@ It is recommended upgrading Prometheus to [v2.12.0](https://github.com/prometheu Take a look also at [vmagent](https://docs.victoriametrics.com/vmagent.html) and [vmalert](https://docs.victoriametrics.com/vmalert.html), which can be used as faster and less resource-hungry alternative to Prometheus. - ## Grafana setup Create [Prometheus datasource](http://docs.grafana.org/features/datasources/prometheus/) in Grafana with the following url: @@ -217,7 +208,6 @@ Substitute `` with the hostname or IP address of VictoriaM Then build graphs and dashboards for the created datasource using [PromQL](https://prometheus.io/docs/prometheus/latest/querying/basics/) or [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html). - ## How to upgrade VictoriaMetrics It is safe upgrading VictoriaMetrics to new versions unless [release notes](https://github.com/VictoriaMetrics/VictoriaMetrics/releases) say otherwise. It is safe skipping multiple versions during the upgrade unless [release notes](https://github.com/VictoriaMetrics/VictoriaMetrics/releases) say otherwise. It is recommended performing regular upgrades to the latest version, since it may contain important bug fixes, performance optimizations or new features. @@ -232,7 +222,6 @@ The following steps must be performed during the upgrade / downgrade procedure: Prometheus doesn't drop data during VictoriaMetrics restart. See [this article](https://grafana.com/blog/2019/03/25/whats-new-in-prometheus-2.8-wal-based-remote-write/) for details. The same applies also to [vmagent](https://docs.victoriametrics.com/vmagent.html). - ## How to apply new config to VictoriaMetrics VictoriaMetrics is configured via command-line flags, so it must be restarted when new command-line flags should be applied: @@ -243,7 +232,6 @@ VictoriaMetrics is configured via command-line flags, so it must be restarted wh Prometheus doesn't drop data during VictoriaMetrics restart. See [this article](https://grafana.com/blog/2019/03/25/whats-new-in-prometheus-2.8-wal-based-remote-write/) for details. The same applies alos to [vmagent](https://docs.victoriametrics.com/vmagent.html). - ## How to scrape Prometheus exporters such as [node-exporter](https://github.com/prometheus/node_exporter) VictoriaMetrics can be used as drop-in replacement for Prometheus for scraping targets configured in `prometheus.yml` config file according to [the specification](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#configuration-file). Just set `-promscrape.config` command-line flag to the path to `prometheus.yml` config - and VictoriaMetrics should start scraping the configured targets. Currently the following [scrape_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config) types are supported: @@ -262,7 +250,6 @@ VictoriaMetrics can be used as drop-in replacement for Prometheus for scraping t * [digitalocean_sd_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#digitalocean_sd_config) * [http_sd_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#http_sd_config) - File a [feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues) if you need support for other `*_sd_config` types. The file pointed by `-promscrape.config` may contain `%{ENV_VAR}` placeholders, which are substituted by the corresponding `ENV_VAR` environment variable values. @@ -271,7 +258,6 @@ VictoriaMetrics also supports [importing data in Prometheus exposition format](# See also [vmagent](https://docs.victoriametrics.com/vmagent.html), which can be used as drop-in replacement for Prometheus. - ## How to send data from DataDog agent VictoriaMetrics accepts data from [DataDog agent](https://docs.datadoghq.com/agent/) or [DogStatsD]() via ["submit metrics" API](https://docs.datadoghq.com/api/latest/metrics/#submit-metrics) at `/datadog/api/v1/series` path. @@ -319,7 +305,6 @@ This command should return the following output if everything is OK: Extra labels may be added to all the written time series by passing `extra_label=name=value` query args. For example, `/datadog/api/v1/series?extra_label=foo=bar` would add `{foo="bar"}` label to all the ingested metrics. - ## How to send data from InfluxDB-compatible agents such as [Telegraf](https://www.influxdata.com/time-series-platform/telegraf/) Use `http://:8428` url instead of InfluxDB url in agents' configs. @@ -507,7 +492,6 @@ The `/api/v1/export` endpoint should return the following response: Extra labels may be added to all the imported time series by passing `extra_label=name=value` query args. For example, `/api/put?extra_label=foo=bar` would add `{foo="bar"}` label to all the ingested metrics. - ## Prometheus querying API usage VictoriaMetrics supports the following handlers from [Prometheus querying API](https://prometheus.io/docs/prometheus/latest/querying/api/): @@ -523,7 +507,6 @@ VictoriaMetrics supports the following handlers from [Prometheus querying API](h These handlers can be queried from Prometheus-compatible clients such as Grafana or curl. All the Prometheus querying API handlers can be prepended with `/prometheus` prefix. For example, both `/prometheus/api/v1/query` and `/api/v1/query` should work. - ### Prometheus querying API enhancements VictoriaMetrics accepts optional `extra_label==` query arg, which can be used for enforcing additional label filters for queries. For example, @@ -556,7 +539,6 @@ Additionally VictoriaMetrics provides the following handlers: For example, request to `/api/v1/status/top_queries?topN=5&maxLifetime=30s` would return up to 5 queries per list, which were executed during the last 30 seconds. VictoriaMetrics tracks the last `-search.queryStats.lastQueriesCount` queries with durations at least `-search.queryStats.minQueryDuration`. - ## Graphite API usage VictoriaMetrics supports the following Graphite APIs, which are needed for [Graphite datasource in Grafana](https://grafana.com/docs/grafana/latest/datasources/graphite/): @@ -573,7 +555,6 @@ VictoriaMetrics accepts optional query args: `extra_label==:8428/api/v1/export?match[]=`, @@ -819,7 +792,6 @@ Exported data can be imported via POST'ing it to [/api/v1/import](#how-to-import The [deduplication](#deduplication) is applied to the data exported via `/api/v1/export` by default. The deduplication isn't applied if `reduce_mem_usage=1` query arg is passed to the request. - ### How to export CSV data Send a request to `http://:8428/api/v1/export/csv?format=&match=`, @@ -845,7 +817,6 @@ The exported CSV data can be imported to VictoriaMetrics via [/api/v1/import/csv The [deduplication](#deduplication) is applied for the data exported in CSV by default. It is possible to export raw data without de-duplication by passing `reduce_mem_usage=1` query arg to `/api/v1/export/csv`. - ### How to export data in native format Send a request to `http://:8428/api/v1/export/native?match[]=`, @@ -870,7 +841,6 @@ can fail to be imported into VictoriaMetrics release Y. The [deduplication](#deduplication) isn't applied for the data exported in native format. It is expected that the de-duplication is performed during data import. - ## How to import time series data Time series data can be imported into VictoriaMetrics via any supported ingestion protocol: @@ -888,7 +858,6 @@ Time series data can be imported into VictoriaMetrics via any supported ingestio * `/api/v1/import/csv` for importing arbitrary CSV data. See [these docs](#how-to-import-csv-data) for details. * `/api/v1/import/prometheus` for importing data in Prometheus exposition format. See [these docs](#how-to-import-data-in-prometheus-exposition-format) for details. - ### How to import data in JSON line format Example for importing data obtained via [/api/v1/export](#how-to-export-data-in-json-line-format): @@ -918,7 +887,6 @@ Note that it could be required to flush response cache after importing historica VictoriaMetrics parses input JSON lines one-by-one. It loads the whole JSON line in memory, then parses it and then saves the parsed samples into persistent storage. This means that VictoriaMetrics can occupy big amounts of RAM when importing too long JSON lines. The solution is to split too long JSON lines into smaller lines. It is OK if samples for a single time series are split among multiple JSON lines. - ### How to import data in native format The specification of VictoriaMetrics' native format may yet change and is not formally documented yet. So currently we do not recommend that external clients attempt to pack their own metrics in native format file. @@ -938,7 +906,6 @@ For example, `/api/v1/import/native?extra_label=foo=bar` would add `"foo":"bar"` Note that it could be required to flush response cache after importing historical data. See [these docs](#backfilling) for detail. - ### How to import CSV data Arbitrary CSV data can be imported via `/api/v1/import/csv`. The CSV data is imported according to the provided `format` query arg. @@ -979,6 +946,7 @@ curl -G 'http://localhost:8428/api/v1/export' -d 'match[]={ticker!=""}' ``` The following response should be returned: + ```bash {"metric":{"__name__":"bid","market":"NASDAQ","ticker":"MSFT"},"values":[1.67],"timestamps":[1583865146520]} {"metric":{"__name__":"bid","market":"NYSE","ticker":"GOOG"},"values":[4.56],"timestamps":[1583865146495]} @@ -991,7 +959,6 @@ For example, `/api/v1/import/csv?extra_label=foo=bar` would add `"foo":"bar"` la Note that it could be required to flush response cache after importing historical data. See [these docs](#backfilling) for detail. - ### How to import data in Prometheus exposition format VictoriaMetrics accepts data in [Prometheus exposition format](https://github.com/prometheus/docs/blob/master/content/docs/instrumenting/exposition_formats.md#text-based-format) @@ -1033,8 +1000,6 @@ Note that it could be required to flush response cache after importing historica VictoriaMetrics also may scrape Prometheus targets - see [these docs](#how-to-scrape-prometheus-exporters-such-as-node-exporter). - - ## Relabeling VictoriaMetrics supports Prometheus-compatible relabeling for all the ingested metrics if `-relabelConfig` command-line flag points @@ -1043,6 +1008,7 @@ The `-relabelConfig` also can point to http or https url. For example, `-relabel See [this article with relabeling tips and tricks](https://valyala.medium.com/how-to-use-relabeling-in-prometheus-and-victoriametrics-8b90fc22c4b2). Example contents for `-relabelConfig` file: + ```yml # Add {cluster="dev"} label. - target_label: cluster @@ -1056,7 +1022,6 @@ Example contents for `-relabelConfig` file: See [these docs](https://docs.victoriametrics.com/vmagent.html#relabeling) for more details about relabeling in VictoriaMetrics. - ## Federation VictoriaMetrics exports [Prometheus-compatible federation data](https://prometheus.io/docs/prometheus/latest/federation/) @@ -1068,7 +1033,6 @@ on the interval `[now - max_lookback ... now]` is scraped for each time series. For instance, `/federate?match[]=up&max_lookback=1h` would return last points on the `[now - 1h ... now]` interval. This may be useful for time series federation with scrape intervals exceeding `5m`. - ## Capacity planning VictoriaMetrics uses lower amounts of CPU, RAM and storage space on production workloads compared to competing solutions (Prometheus, Thanos, Cortex, TimescaleDB, InfluxDB, QuestDB, M3DB) according to [our case studies](https://docs.victoriametrics.com/CaseStudies.html). @@ -1091,7 +1055,6 @@ It is recommended leaving the following amounts of spare resources: * 50% of spare CPU for reducing the probability of slowdowns during temporary spikes in workload. * At least 30% of free storage space at the directory pointed by `-storageDataPath` command-line flag. See also `-storage.minFreeDiskSpaceBytes` command-line flag description [here](#list-of-command-line-flags). - ## High availability * Install multiple VictoriaMetrics instances in distinct datacenters (availability zones). @@ -1132,7 +1095,6 @@ to write data to `victoriametrics-addr-1`, while each `r2` should write data to Another option is to write data simultaneously from Prometheus HA pair to a pair of VictoriaMetrics instances with the enabled de-duplication. See [this section](#deduplication) for details. - ## Deduplication VictoriaMetrics de-duplicates data points if `-dedup.minScrapeInterval` command-line flag is set to positive duration. For example, `-dedup.minScrapeInterval=60s` would de-duplicate data points on the same time series if they fall within the same discrete 60s bucket. The earliest data point will be kept. In the case of equal timestamps, an arbitrary data point will be kept. See [this comment](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2112#issuecomment-1032587618) for more details on how downsampling works. @@ -1145,34 +1107,34 @@ The de-duplication reduces disk space usage if multiple identically configured [ write data to the same VictoriaMetrics instance. These vmagent or Prometheus instances must have identical `external_labels` section in their configs, so they write data to the same time series. - ## Storage -VictoriaMetrics stores time series data in [MergeTree](https://en.wikipedia.org/wiki/Log-structured_merge-tree)-like +VictoriaMetrics stores time series data in [MergeTree](https://en.wikipedia.org/wiki/Log-structured_merge-tree)-like data structures. On insert, VictoriaMetrics accumulates up to 1s of data and dumps it on disk to -`<-storageDataPath>/data/small/YYYY_MM/` subdirectory forming a `part` with the following +`<-storageDataPath>/data/small/YYYY_MM/` subdirectory forming a `part` with the following name pattern: `rowsCount_blocksCount_minTimestamp_maxTimestamp`. Each part consists of two "columns": values and timestamps. These are sorted and compressed raw time series values. Additionally, part contains index files for searching for specific series in the values and timestamps files. -`Parts` are periodically merged into the bigger parts. The resulting `part` is constructed -under `<-storageDataPath>/data/{small,big}/YYYY_MM/tmp` subdirectory. When the resulting `part` is complete, it is atomically moved from the `tmp` -to its own subdirectory, while the source parts are atomically removed. The end result is that the source +`Parts` are periodically merged into the bigger parts. The resulting `part` is constructed +under `<-storageDataPath>/data/{small,big}/YYYY_MM/tmp` subdirectory. When the resulting `part` is complete, it is atomically moved from the `tmp` +to its own subdirectory, while the source parts are atomically removed. The end result is that the source parts are substituted by a single resulting bigger `part` in the `<-storageDataPath>/data/{small,big}/YYYY_MM/` directory. -Information about merging process is available in [single-node VictoriaMetrics](https://grafana.com/dashboards/10229) -and [clustered VictoriaMetrics](https://grafana.com/grafana/dashboards/11176) Grafana dashboards. +Information about merging process is available in [single-node VictoriaMetrics](https://grafana.com/dashboards/10229) +and [clustered VictoriaMetrics](https://grafana.com/grafana/dashboards/11176) Grafana dashboards. See more details in [monitoring docs](#monitoring). -The `merge` process is usually named "compaction", because the resulting `part` size is usually smaller than +The `merge` process is usually named "compaction", because the resulting `part` size is usually smaller than the sum of the source `parts`. There are following benefits of doing the merge process: + * it improves query performance, since lower number of `parts` are inspected with each query; -* it reduces the number of data files, since each `part`contains fixed number of files; +* it reduces the number of data files, since each `part`contains fixed number of files; * better compression rate for the resulting part. -Newly added `parts` either appear in the storage or fail to appear. -Storage never contains partially created parts. The same applies to merge process — `parts` are either fully -merged into a new `part` or fail to merge. There are no partially merged `parts` in MergeTree. -`Part` contents in MergeTree never change. Parts are immutable. They may be only deleted after the merge +Newly added `parts` either appear in the storage or fail to appear. +Storage never contains partially created parts. The same applies to merge process — `parts` are either fully +merged into a new `part` or fail to merge. There are no partially merged `parts` in MergeTree. +`Part` contents in MergeTree never change. Parts are immutable. They may be only deleted after the merge to a bigger `part` or when the `part` contents goes outside the configured `-retentionPeriod`. See [this article](https://valyala.medium.com/how-victoriametrics-makes-instant-snapshots-for-multi-terabyte-time-series-data-e1f3fb0e0282) for more details. @@ -1186,7 +1148,7 @@ Retention is configured with the `-retentionPeriod` command-line flag, which tak Data is split in per-month partitions inside `<-storageDataPath>/data/{small,big}` folders. Data partitions outside the configured retention are deleted on the first day of the new month. Each partition consists of one or more data parts with the following name pattern `rowsCount_blocksCount_minTimestamp_maxTimestamp`. -Data parts outside of the configured retention are eventually deleted during +Data parts outside of the configured retention are eventually deleted during [background merge](https://medium.com/@valyala/how-victoriametrics-makes-instant-snapshots-for-multi-terabyte-time-series-data-e1f3fb0e0282). The maximum disk space usage for a given `-retentionPeriod` is going to be (`-retentionPeriod` + 1) months. @@ -1213,7 +1175,6 @@ so it could route requests from particular user to VictoriaMetrics with the desi The same scheme could be implemented for multiple tenants in [VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html). See [these docs](https://docs.victoriametrics.com/guides/guide-vmcluster-multiple-retention-setup.html) for multi-retention setup details. - ## Downsampling [VictoriaMetrics Enterprise](https://victoriametrics.com/products/enterprise/) supports multi-level downsampling with `-downsampling.period` command-line flag. For example: @@ -1226,12 +1187,10 @@ Downsampling is applied independently per each time series. It can reduce disk s The downsampling can be evaluated for free by downloading and using enterprise binaries from [the releases page](https://github.com/VictoriaMetrics/VictoriaMetrics/releases). - ## Multi-tenancy Single-node VictoriaMetrics doesn't support multi-tenancy. Use [cluster version](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#multitenancy) instead. - ## Scalability and cluster version Though single-node VictoriaMetrics cannot scale to multiple nodes, it is optimized for resource usage - storage size / bandwidth / IOPS, RAM, CPU. @@ -1242,7 +1201,6 @@ So try single-node VictoriaMetrics at first and then [switch to cluster version] horizontally scalable long-term remote storage for really large Prometheus deployments. [Contact us](mailto:info@victoriametrics.com) for enterprise support. - ## Alerting It is recommended using [vmalert](https://docs.victoriametrics.com/vmalert.html) for alerting. @@ -1253,7 +1211,6 @@ Additionally, alerting can be set up with the following tools: * With Promxy - see [the corresponding docs](https://github.com/jacksontj/promxy/blob/master/README.md#how-do-i-use-alertingrecording-rules-in-promxy). * With Grafana - see [the corresponding docs](https://grafana.com/docs/alerting/rules/). - ## Security Do not forget protecting sensitive endpoints in VictoriaMetrics when exposing it to untrusted networks such as the internet. @@ -1267,6 +1224,7 @@ Consider setting the following command-line flags: * `-forceMergeAuthKey` for protecting `/internal/force_merge` endpoint. See [force merge docs](#forced-merge). * `-search.resetCacheAuthKey` for protecting `/internal/resetRollupResultCache` endpoint. See [backfilling](#backfilling) for more details. * `-configAuthKey` for protecting `/config` endpoint, since it may contain sensitive information such as passwords. + - `-pprofAuthKey` for protecting `/debug/pprof/*` endpoints, which can be used for [profiling](#profiling). Explicitly set internal network interface for TCP and UDP ports for data ingestion with Graphite and OpenTSDB formats. @@ -1275,7 +1233,6 @@ For example, substitute `-graphiteListenAddr=:2003` with `-graphiteListenAddr=/cache` directory during graceful shutdown (e.g. when VictoriaMetrics is stopped by sending `SIGINT` signal). The caches are read on the next VictoriaMetrics startup. Sometimes it is needed to remove such caches on the next startup. This can be performed by placing `reset_cache_on_startup` file inside the `<-storageDataPath>/cache` directory before the restart of VictoriaMetrics. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1447) for details. - ## Cache tuning VictoriaMetrics uses various in-memory caches for faster data ingestion and query performance. The following metrics for each type of cache are exported at [`/metrics` page](#monitoring): -- `vm_cache_size_bytes` - the actual cache size -- `vm_cache_size_max_bytes` - cache size limit -- `vm_cache_requests_total` - the number of requests to the cache -- `vm_cache_misses_total` - the number of cache misses -- `vm_cache_entries` - the number of entries in the cache +* `vm_cache_size_bytes` - the actual cache size +* `vm_cache_size_max_bytes` - cache size limit +* `vm_cache_requests_total` - the number of requests to the cache +* `vm_cache_misses_total` - the number of cache misses +* `vm_cache_entries` - the number of entries in the cache Both Grafana dashboards for [single-node VictoriaMetrics](https://grafana.com/dashboards/10229) and [clustered VictoriaMetrics](https://grafana.com/grafana/dashboards/11176) @@ -1456,28 +1409,28 @@ practical scenarios and workloads. Change the defaults only if you understand th To override the default values see command-line flags with `-storage.cacheSize` prefix. See the full description of flags [here](#list-of-command-line-flags). - ## Data migration ### From VictoriaMetrics -The simplest way to migrate data from one single-node (source) to another (destination), or from one vmstorage node +The simplest way to migrate data from one single-node (source) to another (destination), or from one vmstorage node to another do the following: + 1. Stop the VictoriaMetrics (source) with `kill -INT`; -2. Copy (via [rsync](https://en.wikipedia.org/wiki/Rsync) or any other tool) the entire folder specified +2. Copy (via [rsync](https://en.wikipedia.org/wiki/Rsync) or any other tool) the entire folder specified via `-storageDataPath` from the source node to the empty folder at the destination node. -3. Once copy is done, stop the VictoriaMetrics (destination) with `kill -INT` and verify that +3. Once copy is done, stop the VictoriaMetrics (destination) with `kill -INT` and verify that its `-storageDataPath` points to the copied folder from p.2; 4. Start the VictoriaMetrics (destination). The copied data should be now available. Things to consider when copying data: + 1. Data formats between single-node and vmstorage node aren't compatible and can't be copied. 2. Copying data folder means complete replacement of the previous data on destination VictoriaMetrics. For more complex scenarios like single-to-cluster, cluster-to-single, re-sharding or migrating only a fraction of data - see [vmctl. Migrating data from VictoriaMetrics](https://docs.victoriametrics.com/vmctl.html#migrating-data-from-victoriametrics). - ### From other systems Use [vmctl](https://docs.victoriametrics.com/vmctl.html) for data migration. It supports the following data migration types: @@ -1489,7 +1442,6 @@ Use [vmctl](https://docs.victoriametrics.com/vmctl.html) for data migration. It See [vmctl docs](https://docs.victoriametrics.com/vmctl.html) for more details. - ## Backfilling VictoriaMetrics accepts historical data in arbitrary order of time via [any supported ingestion method](#how-to-import-time-series-data). @@ -1507,7 +1459,6 @@ Yet another solution is to increase `-search.cacheTimestampOffset` flag value in for data with timestamps close to the current time. Single-node VictoriaMetrics automatically resets response cache when samples with timestamps older than `now - search.cacheTimestampOffset` are ingested to it. - ## Data updates VictoriaMetrics doesn't support updating already existing sample values to new ones. It stores all the ingested data points @@ -1515,7 +1466,6 @@ for the same time series with identical timestamps. While it is possible substit [removal of old time series](#how-to-delete-time-series) and then [writing new time series](#backfilling), this approach should be used only for one-off updates. It shouldn't be used for frequent updates because of non-zero overhead related to data removal. - ## Replication Single-node VictoriaMetrics doesn't support application-level replication. Use cluster version instead. @@ -1525,7 +1475,6 @@ Storage-level replication may be offloaded to durable persistent storage such as See also [high availability docs](#high-availability) and [backup docs](#backups). - ## Backups VictoriaMetrics supports backups via [vmbackup](https://docs.victoriametrics.com/vmbackup.html) @@ -1533,19 +1482,17 @@ and [vmrestore](https://docs.victoriametrics.com/vmrestore.html) tools. We also provide [vmbackupmanager](https://docs.victoriametrics.com/vmbackupmanager.html) tool for enterprise subscribers. Enterprise binaries can be downloaded and evaluated for free from [the releases page](https://github.com/VictoriaMetrics/VictoriaMetrics/releases). - ## Benchmarks -Note, that vendors (including VictoriaMetrics) are often biased when doing such tests. E.g. they try highlighting -the best parts of their product, while highlighting the worst parts of competing products. -So we encourage users and all independent third parties to conduct their becnhmarks for various products +Note, that vendors (including VictoriaMetrics) are often biased when doing such tests. E.g. they try highlighting +the best parts of their product, while highlighting the worst parts of competing products. +So we encourage users and all independent third parties to conduct their becnhmarks for various products they are evaluating in production and publish the results. As a reference, please see [benchmarks](https://docs.victoriametrics.com/Articles.html#benchmarks) conducted by -VictoriaMetrics team. Please also see the [helm chart](https://github.com/VictoriaMetrics/benchmark) +VictoriaMetrics team. Please also see the [helm chart](https://github.com/VictoriaMetrics/benchmark) for running ingestion benchmarks based on node_exporter metrics. - ## Profiling VictoriaMetrics provides handlers for collecting the following [Go profiles](https://blog.golang.org/profiling-go-programs): @@ -1574,7 +1521,6 @@ The command for collecting CPU profile waits for 30 seconds before returning. The collected profiles may be analyzed with [go tool pprof](https://github.com/google/pprof). - ## Integrations * [Helm charts for single-node and cluster versions of VictoriaMetrics](https://github.com/VictoriaMetrics/helm-charts). @@ -1588,7 +1534,6 @@ The collected profiles may be analyzed with [go tool pprof](https://github.com/g * [Snap package for VictoriaMetrics](https://snapcraft.io/victoriametrics). * [vmalert-cli](https://github.com/aorfanos/vmalert-cli) - a CLI application for managing [vmalert](https://docs.victoriametrics.com/vmalert.html). - ## Third-party contributions * [Unofficial yum repository](https://copr.fedorainfracloud.org/coprs/antonpatsev/VictoriaMetrics/) ([source code](https://github.com/patsevanton/victoriametrics-rpm)) @@ -1596,12 +1541,10 @@ The collected profiles may be analyzed with [go tool pprof](https://github.com/g * [Prometheus -> VictoriaMetrics exporter #2](https://github.com/AnchorFree/tsdb-remote-write) * [Prometheus Oauth proxy](https://gitlab.com/optima_public/prometheus_oauth_proxy) - see [this article](https://medium.com/@richard.holly/powerful-saas-solution-for-detection-metrics-c67b9208d362) for details. - ## Contacts Contact us with any questions regarding VictoriaMetrics at [info@victoriametrics.com](mailto:info@victoriametrics.com). - ## Community and contributions Feel free asking any questions regarding VictoriaMetrics: @@ -1635,7 +1578,6 @@ Adhering `KISS` principle simplifies the resulting code and architecture, so it Report bugs and propose new features [here](https://github.com/VictoriaMetrics/VictoriaMetrics/issues). - ## VictoriaMetrics Logo [Zip](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/VM_logo.zip) contains three folders with different image orientations (main color and inverted version). @@ -1665,315 +1607,314 @@ Files included in each folder: * Do not change spacing, alignment, or relative locations of the design elements. * Do not change the proportions of any of the design elements or the design itself. You may resize as needed but must retain all proportions. - ## List of command-line flags Pass `-help` to VictoriaMetrics in order to see the list of supported command-line flags with their description: ``` -bigMergeConcurrency int - The maximum number of CPU cores to use for big merges. Default value is used if set to 0 + The maximum number of CPU cores to use for big merges. Default value is used if set to 0 -configAuthKey string - Authorization key for accessing /config page. It must be passed via authKey query arg + Authorization key for accessing /config page. It must be passed via authKey query arg -csvTrimTimestamp duration - Trim timestamps when importing csv data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) + Trim timestamps when importing csv data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) -datadog.maxInsertRequestSize size - The maximum size in bytes of a single DataDog POST request to /api/v1/series - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 67108864) + The maximum size in bytes of a single DataDog POST request to /api/v1/series + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 67108864) -dedup.minScrapeInterval duration - Leave only the first sample in every time series per each discrete interval equal to -dedup.minScrapeInterval > 0. See https://docs.victoriametrics.com/#deduplication and https://docs.victoriametrics.com/#downsampling + Leave only the first sample in every time series per each discrete interval equal to -dedup.minScrapeInterval > 0. See https://docs.victoriametrics.com/#deduplication and https://docs.victoriametrics.com/#downsampling -deleteAuthKey string - authKey for metrics' deletion via /api/v1/admin/tsdb/delete_series and /tags/delSeries + authKey for metrics' deletion via /api/v1/admin/tsdb/delete_series and /tags/delSeries -denyQueriesOutsideRetention - Whether to deny queries outside of the configured -retentionPeriod. When set, then /api/v1/query_range would return '503 Service Unavailable' error for queries with 'from' value outside -retentionPeriod. This may be useful when multiple data sources with distinct retentions are hidden behind query-tee + Whether to deny queries outside of the configured -retentionPeriod. When set, then /api/v1/query_range would return '503 Service Unavailable' error for queries with 'from' value outside -retentionPeriod. This may be useful when multiple data sources with distinct retentions are hidden behind query-tee -downsampling.period array - Comma-separated downsampling periods in the format 'offset:period'. For example, '30d:10m' instructs to leave a single sample per 10 minutes for samples older than 30 days. See https://docs.victoriametrics.com/#downsampling for details - Supports an array of values separated by comma or specified via multiple flags. + Comma-separated downsampling periods in the format 'offset:period'. For example, '30d:10m' instructs to leave a single sample per 10 minutes for samples older than 30 days. See https://docs.victoriametrics.com/#downsampling for details + Supports an array of values separated by comma or specified via multiple flags. -dryRun - Whether to check only -promscrape.config and then exit. Unknown config entries aren't allowed in -promscrape.config by default. This can be changed with -promscrape.config.strictParse=false command-line flag + Whether to check only -promscrape.config and then exit. Unknown config entries aren't allowed in -promscrape.config by default. This can be changed with -promscrape.config.strictParse=false command-line flag -enableTCP6 - Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used + Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used -envflag.enable - Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details + Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details -envflag.prefix string - Prefix for environment variables if -envflag.enable is set + Prefix for environment variables if -envflag.enable is set -eula - By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf + By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf -finalMergeDelay duration - The delay before starting final merge for per-month partition after no new data is ingested into it. Final merge may require additional disk IO and CPU resources. Final merge may increase query speed and reduce disk space usage in some cases. Zero value disables final merge + The delay before starting final merge for per-month partition after no new data is ingested into it. Final merge may require additional disk IO and CPU resources. Final merge may increase query speed and reduce disk space usage in some cases. Zero value disables final merge -forceFlushAuthKey string - authKey, which must be passed in query string to /internal/force_flush pages + authKey, which must be passed in query string to /internal/force_flush pages -forceMergeAuthKey string - authKey, which must be passed in query string to /internal/force_merge pages + authKey, which must be passed in query string to /internal/force_merge pages -fs.disableMmap - Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() + Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() -graphiteListenAddr string - TCP and UDP address to listen for Graphite plaintext data. Usually :2003 must be set. Doesn't work if empty + TCP and UDP address to listen for Graphite plaintext data. Usually :2003 must be set. Doesn't work if empty -graphiteTrimTimestamp duration - Trim timestamps for Graphite data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) + Trim timestamps for Graphite data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) -http.connTimeout duration - Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) + Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) -http.disableResponseCompression - Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth + Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth -http.idleConnTimeout duration - Timeout for incoming idle http connections (default 1m0s) + Timeout for incoming idle http connections (default 1m0s) -http.maxGracefulShutdownDuration duration - The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) + The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) -http.pathPrefix string - An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus + An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus -http.shutdownDelay duration - Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers + Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers -httpAuth.password string - Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty + Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty -httpAuth.username string - Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password + Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password -httpListenAddr string - TCP address to listen for http connections (default ":8428") + TCP address to listen for http connections (default ":8428") -import.maxLineLen size - The maximum length in bytes of a single line accepted by /api/v1/import; the line length can be limited with 'max_rows_per_line' query arg passed to /api/v1/export - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 104857600) + The maximum length in bytes of a single line accepted by /api/v1/import; the line length can be limited with 'max_rows_per_line' query arg passed to /api/v1/export + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 104857600) -influx.databaseNames array - Comma-separated list of database names to return from /query and /influx/query API. This can be needed for accepting data from Telegraf plugins such as https://github.com/fangli/fluent-plugin-influxdb - Supports an array of values separated by comma or specified via multiple flags. + Comma-separated list of database names to return from /query and /influx/query API. This can be needed for accepting data from Telegraf plugins such as https://github.com/fangli/fluent-plugin-influxdb + Supports an array of values separated by comma or specified via multiple flags. -influx.maxLineSize size - The maximum size in bytes for a single InfluxDB line during parsing - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 262144) + The maximum size in bytes for a single InfluxDB line during parsing + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 262144) -influxDBLabel string - Default label for the DB name sent over '?db={db_name}' query parameter (default "db") + Default label for the DB name sent over '?db={db_name}' query parameter (default "db") -influxListenAddr string - TCP and UDP address to listen for InfluxDB line protocol data. Usually :8189 must be set. Doesn't work if empty. This flag isn't needed when ingesting data over HTTP - just send it to http://:8428/write + TCP and UDP address to listen for InfluxDB line protocol data. Usually :8189 must be set. Doesn't work if empty. This flag isn't needed when ingesting data over HTTP - just send it to http://:8428/write -influxMeasurementFieldSeparator string - Separator for '{measurement}{separator}{field_name}' metric name when inserted via InfluxDB line protocol (default "_") + Separator for '{measurement}{separator}{field_name}' metric name when inserted via InfluxDB line protocol (default "_") -influxSkipMeasurement - Uses '{field_name}' as a metric name while ignoring '{measurement}' and '-influxMeasurementFieldSeparator' + Uses '{field_name}' as a metric name while ignoring '{measurement}' and '-influxMeasurementFieldSeparator' -influxSkipSingleField - Uses '{measurement}' instead of '{measurement}{separator}{field_name}' for metic name if InfluxDB line contains only a single field + Uses '{measurement}' instead of '{measurement}{separator}{field_name}' for metic name if InfluxDB line contains only a single field -influxTrimTimestamp duration - Trim timestamps for InfluxDB line protocol data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) + Trim timestamps for InfluxDB line protocol data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) -insert.maxQueueDuration duration - The maximum duration for waiting in the queue for insert requests due to -maxConcurrentInserts (default 1m0s) + The maximum duration for waiting in the queue for insert requests due to -maxConcurrentInserts (default 1m0s) -logNewSeries - Whether to log new series. This option is for debug purposes only. It can lead to performance issues when big number of new series are ingested into VictoriaMetrics + Whether to log new series. This option is for debug purposes only. It can lead to performance issues when big number of new series are ingested into VictoriaMetrics -loggerDisableTimestamps - Whether to disable writing timestamps in logs + Whether to disable writing timestamps in logs -loggerErrorsPerSecondLimit int - Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit + Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit -loggerFormat string - Format for logs. Possible values: default, json (default "default") + Format for logs. Possible values: default, json (default "default") -loggerLevel string - Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") + Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") -loggerOutput string - Output for the logs. Supported values: stderr, stdout (default "stderr") + Output for the logs. Supported values: stderr, stdout (default "stderr") -loggerTimezone string - Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") + Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") -loggerWarnsPerSecondLimit int - Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit + Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit -maxConcurrentInserts int - The maximum number of concurrent inserts. Default value should work for most cases, since it minimizes the overhead for concurrent inserts. This option is tigthly coupled with -insert.maxQueueDuration (default 16) + The maximum number of concurrent inserts. Default value should work for most cases, since it minimizes the overhead for concurrent inserts. This option is tigthly coupled with -insert.maxQueueDuration (default 16) -maxInsertRequestSize size - The maximum size in bytes of a single Prometheus remote_write API request - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) + The maximum size in bytes of a single Prometheus remote_write API request + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) -maxLabelValueLen int - The maximum length of label values in the accepted time series. Longer label values are truncated. In this case the vm_too_long_label_values_total metric at /metrics page is incremented (default 16384) + The maximum length of label values in the accepted time series. Longer label values are truncated. In this case the vm_too_long_label_values_total metric at /metrics page is incremented (default 16384) -maxLabelsPerTimeseries int - The maximum number of labels accepted per time series. Superfluous labels are dropped. In this case the vm_metrics_with_dropped_labels_total metric at /metrics page is incremented (default 30) + The maximum number of labels accepted per time series. Superfluous labels are dropped. In this case the vm_metrics_with_dropped_labels_total metric at /metrics page is incremented (default 30) -memory.allowedBytes size - Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -memory.allowedPercent float - Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) + Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) -metricsAuthKey string - Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings -opentsdbHTTPListenAddr string - TCP address to listen for OpentTSDB HTTP put requests. Usually :4242 must be set. Doesn't work if empty + TCP address to listen for OpentTSDB HTTP put requests. Usually :4242 must be set. Doesn't work if empty -opentsdbListenAddr string - TCP and UDP address to listen for OpentTSDB metrics. Telnet put messages and HTTP /api/put messages are simultaneously served on TCP port. Usually :4242 must be set. Doesn't work if empty + TCP and UDP address to listen for OpentTSDB metrics. Telnet put messages and HTTP /api/put messages are simultaneously served on TCP port. Usually :4242 must be set. Doesn't work if empty -opentsdbTrimTimestamp duration - Trim timestamps for OpenTSDB 'telnet put' data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) + Trim timestamps for OpenTSDB 'telnet put' data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) -opentsdbhttp.maxInsertRequestSize size - The maximum size of OpenTSDB HTTP put request - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) + The maximum size of OpenTSDB HTTP put request + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) -opentsdbhttpTrimTimestamp duration - Trim timestamps for OpenTSDB HTTP data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) + Trim timestamps for OpenTSDB HTTP data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) -pprofAuthKey string - Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings -precisionBits int - The number of precision bits to store per each value. Lower precision bits improves data compression at the cost of precision loss (default 64) + The number of precision bits to store per each value. Lower precision bits improves data compression at the cost of precision loss (default 64) -promscrape.cluster.memberNum int - The number of number in the cluster of scrapers. It must be an unique value in the range 0 ... promscrape.cluster.membersCount-1 across scrapers in the cluster + The number of number in the cluster of scrapers. It must be an unique value in the range 0 ... promscrape.cluster.membersCount-1 across scrapers in the cluster -promscrape.cluster.membersCount int - The number of members in a cluster of scrapers. Each member must have an unique -promscrape.cluster.memberNum in the range 0 ... promscrape.cluster.membersCount-1 . Each member then scrapes roughly 1/N of all the targets. By default cluster scraping is disabled, i.e. a single scraper scrapes all the targets + The number of members in a cluster of scrapers. Each member must have an unique -promscrape.cluster.memberNum in the range 0 ... promscrape.cluster.membersCount-1 . Each member then scrapes roughly 1/N of all the targets. By default cluster scraping is disabled, i.e. a single scraper scrapes all the targets -promscrape.cluster.replicationFactor int - The number of members in the cluster, which scrape the same targets. If the replication factor is greater than 2, then the deduplication must be enabled at remote storage side. See https://docs.victoriametrics.com/#deduplication (default 1) + The number of members in the cluster, which scrape the same targets. If the replication factor is greater than 2, then the deduplication must be enabled at remote storage side. See https://docs.victoriametrics.com/#deduplication (default 1) -promscrape.config string - Optional path to Prometheus config file with 'scrape_configs' section containing targets to scrape. The path can point to local file and to http url. See https://docs.victoriametrics.com/#how-to-scrape-prometheus-exporters-such-as-node-exporter for details + Optional path to Prometheus config file with 'scrape_configs' section containing targets to scrape. The path can point to local file and to http url. See https://docs.victoriametrics.com/#how-to-scrape-prometheus-exporters-such-as-node-exporter for details -promscrape.config.dryRun - Checks -promscrape.config file for errors and unsupported fields and then exits. Returns non-zero exit code on parsing errors and emits these errors to stderr. See also -promscrape.config.strictParse command-line flag. Pass -loggerLevel=ERROR if you don't need to see info messages in the output. + Checks -promscrape.config file for errors and unsupported fields and then exits. Returns non-zero exit code on parsing errors and emits these errors to stderr. See also -promscrape.config.strictParse command-line flag. Pass -loggerLevel=ERROR if you don't need to see info messages in the output. -promscrape.config.strictParse - Whether to deny unsupported fields in -promscrape.config . Set to false in order to silently skip unsupported fields (default true) + Whether to deny unsupported fields in -promscrape.config . Set to false in order to silently skip unsupported fields (default true) -promscrape.configCheckInterval duration - Interval for checking for changes in '-promscrape.config' file. By default the checking is disabled. Send SIGHUP signal in order to force config check for changes + Interval for checking for changes in '-promscrape.config' file. By default the checking is disabled. Send SIGHUP signal in order to force config check for changes -promscrape.consul.waitTime duration - Wait time used by Consul service discovery. Default value is used if not set + Wait time used by Consul service discovery. Default value is used if not set -promscrape.consulSDCheckInterval duration - Interval for checking for changes in Consul. This works only if consul_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#consul_sd_config for details (default 30s) + Interval for checking for changes in Consul. This works only if consul_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#consul_sd_config for details (default 30s) -promscrape.digitaloceanSDCheckInterval duration - Interval for checking for changes in digital ocean. This works only if digitalocean_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#digitalocean_sd_config for details (default 1m0s) + Interval for checking for changes in digital ocean. This works only if digitalocean_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#digitalocean_sd_config for details (default 1m0s) -promscrape.disableCompression - Whether to disable sending 'Accept-Encoding: gzip' request headers to all the scrape targets. This may reduce CPU usage on scrape targets at the cost of higher network bandwidth utilization. It is possible to set 'disable_compression: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control + Whether to disable sending 'Accept-Encoding: gzip' request headers to all the scrape targets. This may reduce CPU usage on scrape targets at the cost of higher network bandwidth utilization. It is possible to set 'disable_compression: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control -promscrape.disableKeepAlive - Whether to disable HTTP keep-alive connections when scraping all the targets. This may be useful when targets has no support for HTTP keep-alive connection. It is possible to set 'disable_keepalive: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control. Note that disabling HTTP keep-alive may increase load on both vmagent and scrape targets + Whether to disable HTTP keep-alive connections when scraping all the targets. This may be useful when targets has no support for HTTP keep-alive connection. It is possible to set 'disable_keepalive: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control. Note that disabling HTTP keep-alive may increase load on both vmagent and scrape targets -promscrape.discovery.concurrency int - The maximum number of concurrent requests to Prometheus autodiscovery API (Consul, Kubernetes, etc.) (default 100) + The maximum number of concurrent requests to Prometheus autodiscovery API (Consul, Kubernetes, etc.) (default 100) -promscrape.discovery.concurrentWaitTime duration - The maximum duration for waiting to perform API requests if more than -promscrape.discovery.concurrency requests are simultaneously performed (default 1m0s) + The maximum duration for waiting to perform API requests if more than -promscrape.discovery.concurrency requests are simultaneously performed (default 1m0s) -promscrape.dnsSDCheckInterval duration - Interval for checking for changes in dns. This works only if dns_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dns_sd_config for details (default 30s) + Interval for checking for changes in dns. This works only if dns_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dns_sd_config for details (default 30s) -promscrape.dockerSDCheckInterval duration - Interval for checking for changes in docker. This works only if docker_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#docker_sd_config for details (default 30s) + Interval for checking for changes in docker. This works only if docker_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#docker_sd_config for details (default 30s) -promscrape.dockerswarmSDCheckInterval duration - Interval for checking for changes in dockerswarm. This works only if dockerswarm_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dockerswarm_sd_config for details (default 30s) + Interval for checking for changes in dockerswarm. This works only if dockerswarm_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dockerswarm_sd_config for details (default 30s) -promscrape.dropOriginalLabels - Whether to drop original labels for scrape targets at /targets and /api/v1/targets pages. This may be needed for reducing memory usage when original labels for big number of scrape targets occupy big amounts of memory. Note that this reduces debuggability for improper per-target relabeling configs + Whether to drop original labels for scrape targets at /targets and /api/v1/targets pages. This may be needed for reducing memory usage when original labels for big number of scrape targets occupy big amounts of memory. Note that this reduces debuggability for improper per-target relabeling configs -promscrape.ec2SDCheckInterval duration - Interval for checking for changes in ec2. This works only if ec2_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config for details (default 1m0s) + Interval for checking for changes in ec2. This works only if ec2_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config for details (default 1m0s) -promscrape.eurekaSDCheckInterval duration - Interval for checking for changes in eureka. This works only if eureka_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#eureka_sd_config for details (default 30s) + Interval for checking for changes in eureka. This works only if eureka_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#eureka_sd_config for details (default 30s) -promscrape.fileSDCheckInterval duration - Interval for checking for changes in 'file_sd_config'. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#file_sd_config for details (default 5m0s) + Interval for checking for changes in 'file_sd_config'. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#file_sd_config for details (default 5m0s) -promscrape.gceSDCheckInterval duration - Interval for checking for changes in gce. This works only if gce_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#gce_sd_config for details (default 1m0s) + Interval for checking for changes in gce. This works only if gce_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#gce_sd_config for details (default 1m0s) -promscrape.httpSDCheckInterval duration - Interval for checking for changes in http endpoint service discovery. This works only if http_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#http_sd_config for details (default 1m0s) + Interval for checking for changes in http endpoint service discovery. This works only if http_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#http_sd_config for details (default 1m0s) -promscrape.kubernetes.apiServerTimeout duration - How frequently to reload the full state from Kuberntes API server (default 30m0s) + How frequently to reload the full state from Kuberntes API server (default 30m0s) -promscrape.kubernetesSDCheckInterval duration - Interval for checking for changes in Kubernetes API server. This works only if kubernetes_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config for details (default 30s) + Interval for checking for changes in Kubernetes API server. This works only if kubernetes_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config for details (default 30s) -promscrape.maxDroppedTargets int - The maximum number of droppedTargets to show at /api/v1/targets page. Increase this value if your setup drops more scrape targets during relabeling and you need investigating labels for all the dropped targets. Note that the increased number of tracked dropped targets may result in increased memory usage (default 1000) + The maximum number of droppedTargets to show at /api/v1/targets page. Increase this value if your setup drops more scrape targets during relabeling and you need investigating labels for all the dropped targets. Note that the increased number of tracked dropped targets may result in increased memory usage (default 1000) -promscrape.maxResponseHeadersSize size - The maximum size of http response headers from Prometheus scrape targets - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 4096) + The maximum size of http response headers from Prometheus scrape targets + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 4096) -promscrape.maxScrapeSize size - The maximum size of scrape response in bytes to process from Prometheus targets. Bigger responses are rejected - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 16777216) + The maximum size of scrape response in bytes to process from Prometheus targets. Bigger responses are rejected + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 16777216) -promscrape.minResponseSizeForStreamParse size - The minimum target response size for automatic switching to stream parsing mode, which can reduce memory usage. See https://docs.victoriametrics.com/vmagent.html#stream-parsing-mode - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 1000000) + The minimum target response size for automatic switching to stream parsing mode, which can reduce memory usage. See https://docs.victoriametrics.com/vmagent.html#stream-parsing-mode + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 1000000) -promscrape.noStaleMarkers - Whether to disable sending Prometheus stale markers for metrics when scrape target disappears. This option may reduce memory usage if stale markers aren't needed for your setup. This option also disables populating the scrape_series_added metric. See https://prometheus.io/docs/concepts/jobs_instances/#automatically-generated-labels-and-time-series + Whether to disable sending Prometheus stale markers for metrics when scrape target disappears. This option may reduce memory usage if stale markers aren't needed for your setup. This option also disables populating the scrape_series_added metric. See https://prometheus.io/docs/concepts/jobs_instances/#automatically-generated-labels-and-time-series -promscrape.openstackSDCheckInterval duration - Interval for checking for changes in openstack API server. This works only if openstack_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#openstack_sd_config for details (default 30s) + Interval for checking for changes in openstack API server. This works only if openstack_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#openstack_sd_config for details (default 30s) -promscrape.seriesLimitPerTarget int - Optional limit on the number of unique time series a single scrape target can expose. See https://docs.victoriametrics.com/vmagent.html#cardinality-limiter for more info + Optional limit on the number of unique time series a single scrape target can expose. See https://docs.victoriametrics.com/vmagent.html#cardinality-limiter for more info -promscrape.streamParse - Whether to enable stream parsing for metrics obtained from scrape targets. This may be useful for reducing memory usage when millions of metrics are exposed per each scrape target. It is posible to set 'stream_parse: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control + Whether to enable stream parsing for metrics obtained from scrape targets. This may be useful for reducing memory usage when millions of metrics are exposed per each scrape target. It is posible to set 'stream_parse: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control -promscrape.suppressDuplicateScrapeTargetErrors - Whether to suppress 'duplicate scrape target' errors; see https://docs.victoriametrics.com/vmagent.html#troubleshooting for details + Whether to suppress 'duplicate scrape target' errors; see https://docs.victoriametrics.com/vmagent.html#troubleshooting for details -promscrape.suppressScrapeErrors - Whether to suppress scrape errors logging. The last error for each target is always available at '/targets' page even if scrape errors logging is suppressed + Whether to suppress scrape errors logging. The last error for each target is always available at '/targets' page even if scrape errors logging is suppressed -relabelConfig string - Optional path to a file with relabeling rules, which are applied to all the ingested metrics. The path can point either to local file or to http url. See https://docs.victoriametrics.com/#relabeling for details. The config is reloaded on SIGHUP signal + Optional path to a file with relabeling rules, which are applied to all the ingested metrics. The path can point either to local file or to http url. See https://docs.victoriametrics.com/#relabeling for details. The config is reloaded on SIGHUP signal -relabelDebug - Whether to log metrics before and after relabeling with -relabelConfig. If the -relabelDebug is enabled, then the metrics aren't sent to storage. This is useful for debugging the relabeling configs + Whether to log metrics before and after relabeling with -relabelConfig. If the -relabelDebug is enabled, then the metrics aren't sent to storage. This is useful for debugging the relabeling configs -retentionPeriod value - Data with timestamps outside the retentionPeriod is automatically deleted - The following optional suffixes are supported: h (hour), d (day), w (week), y (year). If suffix isn't set, then the duration is counted in months (default 1) + Data with timestamps outside the retentionPeriod is automatically deleted + The following optional suffixes are supported: h (hour), d (day), w (week), y (year). If suffix isn't set, then the duration is counted in months (default 1) -search.cacheTimestampOffset duration - The maximum duration since the current time for response data, which is always queried from the original raw data, without using the response cache. Increase this value if you see gaps in responses due to time synchronization issues between VictoriaMetrics and data sources. See also -search.disableAutoCacheReset (default 5m0s) + The maximum duration since the current time for response data, which is always queried from the original raw data, without using the response cache. Increase this value if you see gaps in responses due to time synchronization issues between VictoriaMetrics and data sources. See also -search.disableAutoCacheReset (default 5m0s) -search.disableAutoCacheReset - Whether to disable automatic response cache reset if a sample with timestamp outside -search.cacheTimestampOffset is inserted into VictoriaMetrics + Whether to disable automatic response cache reset if a sample with timestamp outside -search.cacheTimestampOffset is inserted into VictoriaMetrics -search.disableCache - Whether to disable response caching. This may be useful during data backfilling + Whether to disable response caching. This may be useful during data backfilling -search.graphiteMaxPointsPerSeries int - The maximum number of points per series Graphite render API can return (default 1000000) + The maximum number of points per series Graphite render API can return (default 1000000) -search.graphiteStorageStep duration - The interval between datapoints stored in the database. It is used at Graphite Render API handler for normalizing the interval between datapoints in case it isn't normalized. It can be overriden by sending 'storage_step' query arg to /render API or by sending the desired interval via 'Storage-Step' http header during querying /render API (default 10s) + The interval between datapoints stored in the database. It is used at Graphite Render API handler for normalizing the interval between datapoints in case it isn't normalized. It can be overriden by sending 'storage_step' query arg to /render API or by sending the desired interval via 'Storage-Step' http header during querying /render API (default 10s) -search.latencyOffset duration - The time when data points become visible in query results after the collection. Too small value can result in incomplete last points for query results (default 30s) + The time when data points become visible in query results after the collection. Too small value can result in incomplete last points for query results (default 30s) -search.logSlowQueryDuration duration - Log queries with execution time exceeding this value. Zero disables slow query logging (default 5s) + Log queries with execution time exceeding this value. Zero disables slow query logging (default 5s) -search.maxConcurrentRequests int - The maximum number of concurrent search requests. It shouldn't be high, since a single request can saturate all the CPU cores. See also -search.maxQueueDuration (default 8) + The maximum number of concurrent search requests. It shouldn't be high, since a single request can saturate all the CPU cores. See also -search.maxQueueDuration (default 8) -search.maxExportDuration duration - The maximum duration for /api/v1/export call (default 720h0m0s) + The maximum duration for /api/v1/export call (default 720h0m0s) -search.maxLookback duration - Synonym to -search.lookback-delta from Prometheus. The value is dynamically detected from interval between time series datapoints if not set. It can be overridden on per-query basis via max_lookback arg. See also '-search.maxStalenessInterval' flag, which has the same meaining due to historical reasons + Synonym to -search.lookback-delta from Prometheus. The value is dynamically detected from interval between time series datapoints if not set. It can be overridden on per-query basis via max_lookback arg. See also '-search.maxStalenessInterval' flag, which has the same meaining due to historical reasons -search.maxPointsPerTimeseries int - The maximum points per a single timeseries returned from /api/v1/query_range. This option doesn't limit the number of scanned raw samples in the database. The main purpose of this option is to limit the number of per-series points returned to graphing UI such as Grafana. There is no sense in setting this limit to values bigger than the horizontal resolution of the graph (default 30000) + The maximum points per a single timeseries returned from /api/v1/query_range. This option doesn't limit the number of scanned raw samples in the database. The main purpose of this option is to limit the number of per-series points returned to graphing UI such as Grafana. There is no sense in setting this limit to values bigger than the horizontal resolution of the graph (default 30000) -search.maxQueryDuration duration - The maximum duration for query execution (default 30s) + The maximum duration for query execution (default 30s) -search.maxQueryLen size - The maximum search query length in bytes - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 16384) + The maximum search query length in bytes + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 16384) -search.maxQueueDuration duration - The maximum time the request waits for execution when -search.maxConcurrentRequests limit is reached; see also -search.maxQueryDuration (default 10s) + The maximum time the request waits for execution when -search.maxConcurrentRequests limit is reached; see also -search.maxQueryDuration (default 10s) -search.maxSamplesPerQuery int - The maximum number of raw samples a single query can process across all time series. This protects from heavy queries, which select unexpectedly high number of raw samples. See also -search.maxSamplesPerSeries (default 1000000000) + The maximum number of raw samples a single query can process across all time series. This protects from heavy queries, which select unexpectedly high number of raw samples. See also -search.maxSamplesPerSeries (default 1000000000) -search.maxSamplesPerSeries int - The maximum number of raw samples a single query can scan per each time series. This option allows limiting memory usage (default 30000000) + The maximum number of raw samples a single query can scan per each time series. This option allows limiting memory usage (default 30000000) -search.maxStalenessInterval duration - The maximum interval for staleness calculations. By default it is automatically calculated from the median interval between samples. This flag could be useful for tuning Prometheus data model closer to Influx-style data model. See https://prometheus.io/docs/prometheus/latest/querying/basics/#staleness for details. See also '-search.maxLookback' flag, which has the same meaning due to historical reasons + The maximum interval for staleness calculations. By default it is automatically calculated from the median interval between samples. This flag could be useful for tuning Prometheus data model closer to Influx-style data model. See https://prometheus.io/docs/prometheus/latest/querying/basics/#staleness for details. See also '-search.maxLookback' flag, which has the same meaning due to historical reasons -search.maxStatusRequestDuration duration - The maximum duration for /api/v1/status/* requests (default 5m0s) + The maximum duration for /api/v1/status/* requests (default 5m0s) -search.maxStepForPointsAdjustment duration - The maximum step when /api/v1/query_range handler adjusts points with timestamps closer than -search.latencyOffset to the current time. The adjustment is needed because such points may contain incomplete data (default 1m0s) + The maximum step when /api/v1/query_range handler adjusts points with timestamps closer than -search.latencyOffset to the current time. The adjustment is needed because such points may contain incomplete data (default 1m0s) -search.maxTagKeys int - The maximum number of tag keys returned from /api/v1/labels (default 100000) + The maximum number of tag keys returned from /api/v1/labels (default 100000) -search.maxTagValueSuffixesPerSearch int - The maximum number of tag value suffixes returned from /metrics/find (default 100000) + The maximum number of tag value suffixes returned from /metrics/find (default 100000) -search.maxTagValues int - The maximum number of tag values returned from /api/v1/label//values (default 100000) + The maximum number of tag values returned from /api/v1/label//values (default 100000) -search.maxUniqueTimeseries int - The maximum number of unique time series each search can scan. This option allows limiting memory usage (default 300000) + The maximum number of unique time series each search can scan. This option allows limiting memory usage (default 300000) -search.minStalenessInterval duration - The minimum interval for staleness calculations. This flag could be useful for removing gaps on graphs generated from time series with irregular intervals between samples. See also '-search.maxStalenessInterval' + The minimum interval for staleness calculations. This flag could be useful for removing gaps on graphs generated from time series with irregular intervals between samples. See also '-search.maxStalenessInterval' -search.noStaleMarkers - Set this flag to true if the database doesn't contain Prometheus stale markers, so there is no need in spending additional CPU time on its handling. Staleness markers may exist only in data obtained from Prometheus scrape targets + Set this flag to true if the database doesn't contain Prometheus stale markers, so there is no need in spending additional CPU time on its handling. Staleness markers may exist only in data obtained from Prometheus scrape targets -search.queryStats.lastQueriesCount int - Query stats for /api/v1/status/top_queries is tracked on this number of last queries. Zero value disables query stats tracking (default 20000) + Query stats for /api/v1/status/top_queries is tracked on this number of last queries. Zero value disables query stats tracking (default 20000) -search.queryStats.minQueryDuration duration - The minimum duration for queries to track in query stats at /api/v1/status/top_queries. Queries with lower duration are ignored in query stats (default 1ms) + The minimum duration for queries to track in query stats at /api/v1/status/top_queries. Queries with lower duration are ignored in query stats (default 1ms) -search.resetCacheAuthKey string - Optional authKey for resetting rollup cache via /internal/resetRollupResultCache call + Optional authKey for resetting rollup cache via /internal/resetRollupResultCache call -search.treatDotsAsIsInRegexps - Whether to treat dots as is in regexp label filters used in queries. For example, foo{bar=~"a.b.c"} will be automatically converted to foo{bar=~"a\\.b\\.c"}, i.e. all the dots in regexp filters will be automatically escaped in order to match only dot char instead of matching any char. Dots in ".+", ".*" and ".{n}" regexps aren't escaped. This option is DEPRECATED in favor of {__graphite__="a.*.c"} syntax for selecting metrics matching the given Graphite metrics filter + Whether to treat dots as is in regexp label filters used in queries. For example, foo{bar=~"a.b.c"} will be automatically converted to foo{bar=~"a\\.b\\.c"}, i.e. all the dots in regexp filters will be automatically escaped in order to match only dot char instead of matching any char. Dots in ".+", ".*" and ".{n}" regexps aren't escaped. This option is DEPRECATED in favor of {__graphite__="a.*.c"} syntax for selecting metrics matching the given Graphite metrics filter -selfScrapeInstance string - Value for 'instance' label, which is added to self-scraped metrics (default "self") + Value for 'instance' label, which is added to self-scraped metrics (default "self") -selfScrapeInterval duration - Interval for self-scraping own metrics at /metrics page + Interval for self-scraping own metrics at /metrics page -selfScrapeJob string - Value for 'job' label, which is added to self-scraped metrics (default "victoria-metrics") + Value for 'job' label, which is added to self-scraped metrics (default "victoria-metrics") -smallMergeConcurrency int - The maximum number of CPU cores to use for small merges. Default value is used if set to 0 + The maximum number of CPU cores to use for small merges. Default value is used if set to 0 -snapshotAuthKey string - authKey, which must be passed in query string to /snapshot* pages + authKey, which must be passed in query string to /snapshot* pages -sortLabels - Whether to sort labels for incoming samples before writing them to storage. This may be needed for reducing memory usage at storage when the order of labels in incoming samples is random. For example, if m{k1="v1",k2="v2"} may be sent as m{k2="v2",k1="v1"}. Enabled sorting for labels can slow down ingestion performance a bit + Whether to sort labels for incoming samples before writing them to storage. This may be needed for reducing memory usage at storage when the order of labels in incoming samples is random. For example, if m{k1="v1",k2="v2"} may be sent as m{k2="v2",k1="v1"}. Enabled sorting for labels can slow down ingestion performance a bit -storage.cacheSizeIndexDBDataBlocks size - Overrides max size for indexdb/dataBlocks cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Overrides max size for indexdb/dataBlocks cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -storage.cacheSizeIndexDBIndexBlocks size - Overrides max size for indexdb/indexBlocks cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Overrides max size for indexdb/indexBlocks cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -storage.cacheSizeStorageTSID size - Overrides max size for storage/tsid cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Overrides max size for storage/tsid cache. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#cache-tuning + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -storage.maxDailySeries int - The maximum number of unique series can be added to the storage during the last 24 hours. Excess series are logged and dropped. This can be useful for limiting series churn rate. See also -storage.maxHourlySeries + The maximum number of unique series can be added to the storage during the last 24 hours. Excess series are logged and dropped. This can be useful for limiting series churn rate. See also -storage.maxHourlySeries -storage.maxHourlySeries int - The maximum number of unique series can be added to the storage during the last hour. Excess series are logged and dropped. This can be useful for limiting series cardinality. See also -storage.maxDailySeries + The maximum number of unique series can be added to the storage during the last hour. Excess series are logged and dropped. This can be useful for limiting series cardinality. See also -storage.maxDailySeries -storage.minFreeDiskSpaceBytes size - The minimum free disk space at -storageDataPath after which the storage stops accepting new data - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 10000000) + The minimum free disk space at -storageDataPath after which the storage stops accepting new data + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 10000000) -storageDataPath string - Path to storage data (default "victoria-metrics-data") + Path to storage data (default "victoria-metrics-data") -tls - Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set + Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set -tlsCertFile string - Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated -tlsKeyFile string - Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated -version - Show VictoriaMetrics version + Show VictoriaMetrics version ``` diff --git a/docs/url-examples.md b/docs/url-examples.md index ecdb95b27..6ab0adcdf 100644 --- a/docs/url-examples.md +++ b/docs/url-examples.md @@ -4,11 +4,10 @@ sort: 20 # VictoriaMetrics API examples - ## /api/v1/admin/tsdb/delete_series **Deletes time series from VictoriaMetrics** - + Single:
@@ -28,13 +27,13 @@ curl 'http://:8481/delete/0/prometheus/api/v1/admin/tsdb/delete_series
Additional information: -* [How to delete time series](https://docs.victoriametrics.com/#how-to-delete-time-series) +* [How to delete time series](https://docs.victoriametrics.com/#how-to-delete-time-series) ## /api/v1/export/csv **Exports CSV data from VictoriaMetrics** - + Single:
@@ -43,7 +42,7 @@ curl 'http://:8428/api/v1/export/csv?format=__name__,__val ```
- + Cluster:
@@ -53,11 +52,11 @@ curl -G 'http://:8481/select/0/prometheus/api/v1/export/csv?format=__n
-Additional information: +Additional information: + * [How to export time series](https://docs.victoriametrics.com/#how-to-export-csv-data) * [URL Format](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) - ## /api/v1/export/native **Exports data from VictoriaMetrics in native format** @@ -81,8 +80,8 @@ curl -G 'http://:8481/select/0/prometheus/api/v1/export/native?match=v More information: -* [How to export data in native format](https://docs.victoriametrics.com/#how-to-export-data-in-native-format) +* [How to export data in native format](https://docs.victoriametrics.com/#how-to-export-data-in-native-format) ## /api/v1/import @@ -107,13 +106,13 @@ curl --data-binary "@import.txt" -X POST 'http://:8480/insert/promethe Additional information: + * [How to import time series data](https://docs.victoriametrics.com/#how-to-import-time-series-data) - -## /api/v1/import/csv +## /api/v1/import/csv **Imports CSV data to VictoriaMetrics** - + Single:
@@ -134,15 +133,15 @@ curl -d "GOOG,1.23,4.56,NYSE" 'http://:8480/insert/0/prometheus/api/v1
-Additional information: +Additional information: + * [URL format](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) * [How to import CSV data](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-import-csv-data) - ## /datadog/api/v1/series **Sends data from DataDog agent to VM** - + Single:
@@ -198,8 +197,8 @@ echo '
Additional information: -* [How to send data from datadog agent](https://docs.victoriametrics.com/#how-to-send-data-from-datadog-agent) +* [How to send data from datadog agent](https://docs.victoriametrics.com/#how-to-send-data-from-datadog-agent) ## /graphite/metrics/find @@ -213,7 +212,7 @@ curl -G 'http://localhost:8428/graphite/metrics/find?query=vm_http_request_error ``` - + Cluster:
@@ -222,13 +221,13 @@ curl -G 'http://:8481/select/0/graphite/metrics/find?query=vm_http_req ```
- + Additional information: + * [Metrics find](https://graphite-api.readthedocs.io/en/latest/api.html#metrics-find) * [How to send data from graphite compatible agents such as statsd](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-send-data-from-graphite-compatible-agents-such-as-statsd) * [URL Format](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) - ## /influx/write **Writes data with InfluxDB line protocol to VictoriaMetrics** @@ -241,7 +240,7 @@ curl -d 'measurement,tag1=value1,tag2=value2 field1=123,field2=1.23' -X POST 'ht ``` - + Cluster:
@@ -250,10 +249,10 @@ curl -d 'measurement,tag1=value1,tag2=value2 field1=123,field2=1.23' -X POST 'ht ```
- -Additional information: -* [How to send data from influxdb compatible agents such as telegraf](https://docs.victoriametrics.com/#how-to-send-data-from-influxdb-compatible-agents-such-as-telegraf) +Additional information: + +* [How to send data from influxdb compatible agents such as telegraf](https://docs.victoriametrics.com/#how-to-send-data-from-influxdb-compatible-agents-such-as-telegraf) ## TCP and UDP @@ -270,7 +269,7 @@ echo "put foo.bar.baz `date +%s` 123 tag1=value1 tag2=value2" | nc -N localhost ``` - + Cluster:
@@ -279,9 +278,9 @@ echo "put foo.bar.baz `date +%s` 123 tag1=value1 tag2=value2 VictoriaMetrics_Ac ```
- + Enable HTTP server for OpenTSDB /api/put requests by setting `-opentsdbHTTPListenAddr` command-line flag. - + Single:
@@ -290,7 +289,7 @@ curl -H 'Content-Type: application/json' -d '[{"metric":"foo","value":45.34},{"m ```
- + Cluster:
@@ -300,16 +299,16 @@ curl -H 'Content-Type: application/json' -d '[{"metric":"foo","value":45.34},{"m ```
- + Additional information: + * [Api http put](http://opentsdb.net/docs/build/html/api_http/put.html) * [How to send data from opentsdb compatible agents](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-send-data-from-opentsdb-compatible-agents) - **How to write data with Graphite plaintext protocol to VictoriaMetrics** Enable Graphite receiver in VictoriaMetrics by setting `-graphiteListenAddr` command-line flag. - + Single:
@@ -319,7 +318,7 @@ echo "foo.bar.baz;tag1=value1;tag2=value2 123 `date +%s`" | ```
- + Cluster:
@@ -332,5 +331,6 @@ echo "foo.bar.baz;tag1=value1;tag2=value2;VictoriaMetrics_AccountID=42 123 `date Additional information: `VictoriaMetrics_AccountID=42` - tag that indicated tenant ID. + * [Request handler](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/a3eafd2e7fc75776dfc19d3c68c85589454d9dce/app/vminsert/opentsdb/request_handler.go#L47) * [How to send data from graphite compatible agents such as statsd](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-send-data-from-graphite-compatible-agents-such-as-statsd) diff --git a/docs/vmagent.md b/docs/vmagent.md index 039426a55..163c8e02e 100644 --- a/docs/vmagent.md +++ b/docs/vmagent.md @@ -10,7 +10,6 @@ or any other Prometheus-compatible storage systems that support the `remote_writ vmagent - ## Motivation While VictoriaMetrics provides an efficient solution to store and observe metrics, our users needed something fast @@ -18,7 +17,6 @@ and RAM friendly to scrape metrics from Prometheus-compatible exporters into Vic Also, we found that our user's infrastructure are like snowflakes in that no two are alike. Therefore we decided to add more flexibility to `vmagent` such as the ability to push metrics additionally to pulling them. We did our best and will continue to improve `vmagent`. - ## Features * Can be used as a drop-in replacement for Prometheus for scraping targets such as [node_exporter](https://github.com/prometheus/node_exporter). See [Quick Start](#quick-start) for details. @@ -71,7 +69,6 @@ Then send InfluxDB data to `http://vmagent-host:8429`. See [these docs](https:// Pass `-help` to `vmagent` in order to see [the full list of supported command-line flags with their descriptions](#advanced-usage). - ## Configuration update `vmagent` should be restarted in order to update config options set via command-line args. @@ -79,6 +76,7 @@ Pass `-help` to `vmagent` in order to see [the full list of supported command-li `vmagent` supports multiple approaches for reloading configs from updated config files such as `-promscrape.config`, `-remoteWrite.relabelConfig` and `-remoteWrite.urlRelabelConfig`: * Sending `SUGHUP` signal to `vmagent` process: + ```bash kill -SIGHUP `pidof vmagent` ``` @@ -87,10 +85,8 @@ Pass `-help` to `vmagent` in order to see [the full list of supported command-li There is also `-promscrape.configCheckInterval` command-line option, which can be used for automatic reloading configs from updated `-promscrape.config` file. - ## Use cases - ### IoT and Edge monitoring `vmagent` can run and collect metrics in IoT and industrial networks with unreliable or scheduled connections to their remote storage. @@ -101,28 +97,24 @@ The maximum buffer size can be limited with `-remoteWrite.maxDiskUsagePerURL`. `vmagent` works on various architectures from the IoT world - 32-bit arm, 64-bit arm, ppc64, 386, amd64. See [the corresponding Makefile rules](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/app/vmagent/Makefile) for details. - ### Drop-in replacement for Prometheus If you use Prometheus only for scraping metrics from various targets and forwarding those metrics to remote storage then `vmagent` can replace Prometheus. Typically, `vmagent` requires lower amounts of RAM, CPU and network bandwidth compared with Prometheus. See [these docs](#how-to-collect-metrics-in-prometheus-format) for details. - ### Replication and high availability `vmagent` replicates the collected metrics among multiple remote storage instances configured via `-remoteWrite.url` args. If a single remote storage instance temporarily is out of service, then the collected data remains available in another remote storage instance. `vmagent` buffers the collected data in files at `-remoteWrite.tmpDataPath` until the remote storage becomes available again and then it sends the buffered data to the remote storage in order to prevent data gaps. - ### Relabeling and filtering `vmagent` can add, remove or update labels on the collected data before sending it to the remote storage. Additionally, it can remove unwanted samples via Prometheus-like relabeling before sending the collected data to remote storage. Please see [these docs](#relabeling) for details. - ### Splitting data streams among multiple systems `vmagent` supports splitting the collected data between muliple destinations with the help of `-remoteWrite.urlRelabelConfig`, @@ -130,7 +122,6 @@ which is applied independently for each configured `-remoteWrite.url` destinatio data among long-term remote storage, short-term remote storage and a real-time analytical system [built on top of Kafka](https://github.com/Telefonica/prometheus-kafka-adapter). Note that each destination can receive it's own subset of the collected data due to per-destination relabeling via `-remoteWrite.urlRelabelConfig`. - ### Prometheus remote_write proxy `vmagent` can be used as a proxy for Prometheus data sent via Prometheus `remote_write` protocol. It can accept data via the `remote_write` API @@ -138,7 +129,6 @@ at the`/api/v1/write` endpoint. Then apply relabeling and filtering and proxy it The `vmagent` can be configured to encrypt the incoming `remote_write` requests with `-tls*` command-line flags. Also, Basic Auth can be enabled for the incoming `remote_write` requests with `-httpAuth.*` command-line flags. - ### remote_write for clustered version While `vmagent` can accept data in several supported protocols (OpenTSDB, Influx, Prometheus, Graphite) and scrape data from various targets, writes are always peformed in Promethes remote_write protocol. Therefore for the [clustered version](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html), `-remoteWrite.url` the command-line flag should be configured as `://:8480/insert//prometheus/api/v1/write` according to [these docs](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format). There is also support for multitenant writes. See [these docs](#multitenancy). @@ -147,7 +137,6 @@ While `vmagent` can accept data in several supported protocols (OpenTSDB, Influx By default `vmagent` collects the data without tenant identifiers and routes it to the configured `-remoteWrite.url`. But it can accept multitenant data if `-remoteWrite.multitenantURL` is set. In this case it accepts multitenant data at `http://vmagent:8429/insert//...` in the same way as cluster version of VictoriaMetrics does according to [these docs](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) and routes it to `<-remoteWrite.multitenantURL>/insert//prometheus/api/v1/write`. If multiple `-remoteWrite.multitenantURL` command-line options are set, then `vmagent` replicates the collected data across all the configured urls. This allows using a single `vmagent` instance in front of VictoriaMetrics clusters for processing the data from all the tenants. - ## How to collect metrics in Prometheus format Specify the path to `prometheus.yml` file via `-promscrape.config` command-line flag. `vmagent` takes into account the following @@ -215,7 +204,6 @@ entries to 60s. Run `vmagent -help` in order to see default values for the `-pro The file pointed by `-promscrape.config` may contain `%{ENV_VAR}` placeholders which are substituted by the corresponding `ENV_VAR` environment variable values. - ## Loading scrape configs from multiple files `vmagent` supports loading scrape configs from multiple files specified in the `scrape_config_files` section of `-promscrape.config` file. For example, the following `-promscrape.config` instructs `vmagent` loading scrape configs from all the `*.yml` files under `configs` directory, from `single_scrape_config.yml` local file and from `https://config-server/scrape_config.yml` url: @@ -240,7 +228,6 @@ Every referred file can contain arbitrary number of [supported scrape configs](# `vmagent` dynamically reloads these files on `SIGHUP` signal or on the request to `http://vmagent:8429/-/reload`. - ## Unsupported Prometheus config sections `vmagent` doesn't support the following sections in Prometheus config file passed to `-promscrape.config` command-line flag: @@ -253,7 +240,6 @@ The list of supported service discovery types is available [here](#how-to-collec Additionally `vmagent` doesn't support `refresh_interval` option at service discovery sections. This option is substituted with `-promscrape.*CheckInterval` command-line options, which are specific per each service discovery type. See [the full list of command-line flags for vmagent](#advanced-usage). - ## Adding labels to metrics Labels can be added to metrics by the following mechanisms: @@ -265,7 +251,6 @@ Labels can be added to metrics by the following mechanisms: /path/to/vmagent -remoteWrite.label=datacenter=foobar ... ``` - ## Relabeling VictoriaMetrics components (including `vmagent`) support Prometheus-compatible relabeling. @@ -324,7 +309,6 @@ You can read more about relabeling in the following articles: * [Extracting labels from legacy metric names](https://www.robustperception.io/extracting-labels-from-legacy-metric-names) * [relabel_configs vs metric_relabel_configs](https://www.robustperception.io/relabel_configs-vs-metric_relabel_configs) - ## Prometheus staleness markers `vmagent` sends [Prometheus staleness markers](https://www.robustperception.io/staleness-and-promql) to `-remoteWrite.url` in the following cases: @@ -336,16 +320,15 @@ You can read more about relabeling in the following articles: Prometheus staleness markers' tracking needs additional memory, since it must store the previous response body per each scrape target in order to compare it to the current response body. The memory usage may be reduced by passing `-promscrape.noStaleMarkers` command-line flag to `vmagent`. This disables staleness tracking. This also disables tracking the number of new time series per each scrape with the auto-generated `scrape_series_added` metric. See [these docs](https://prometheus.io/docs/concepts/jobs_instances/#automatically-generated-labels-and-time-series) for details. - ## Stream parsing mode By default `vmagent` reads the full response body from scrape target into memory, then parses it, applies [relabeling](#relabeling) and then pushes the resulting metrics to the configured `-remoteWrite.url`. This mode works good for the majority of cases when the scrape target exposes small number of metrics (e.g. less than 10 thousand). But this mode may take big amounts of memory when the scrape target exposes big number of metrics. In this case it is recommended enabling stream parsing mode. When this mode is enabled, then `vmagent` reads response from scrape target in chunks, then immediately processes every chunk and pushes the processed metrics to remote storage. This allows saving memory when scraping targets that expose millions of metrics. Stream parsing mode is automatically enabled for scrape targets returning response bodies with sizes bigger than the `-promscrape.minResponseSizeForStreamParse` command-line flag value. Additionally, the stream parsing mode can be explicitly enabled in the following places: -- Via `-promscrape.streamParse` command-line flag. In this case all the scrape targets defined in the file pointed by `-promscrape.config` are scraped in stream parsing mode. -- Via `stream_parse: true` option at `scrape_configs` section. In this case all the scrape targets defined in this section are scraped in stream parsing mode. -- Via `__stream_parse__=true` label, which can be set via [relabeling](#relabeling) at `relabel_configs` section. In this case stream parsing mode is enabled for the corresponding scrape targets. Typical use case: to set the label via [Kubernetes annotations](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) for targets exposing big number of metrics. +* Via `-promscrape.streamParse` command-line flag. In this case all the scrape targets defined in the file pointed by `-promscrape.config` are scraped in stream parsing mode. +* Via `stream_parse: true` option at `scrape_configs` section. In this case all the scrape targets defined in this section are scraped in stream parsing mode. +* Via `__stream_parse__=true` label, which can be set via [relabeling](#relabeling) at `relabel_configs` section. In this case stream parsing mode is enabled for the corresponding scrape targets. Typical use case: to set the label via [Kubernetes annotations](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) for targets exposing big number of metrics. Examples: @@ -365,7 +348,6 @@ scrape_configs: Note that `sample_limit` and `series_limit` options cannot be used in stream parsing mode because the parsed data is pushed to remote storage as soon as it is parsed. - ## Scraping big number of targets A single `vmagent` instance can scrape tens of thousands of scrape targets. Sometimes this isn't enough due to limitations on CPU, network, RAM, etc. @@ -393,7 +375,6 @@ start a cluster of three `vmagent` instances, where each target is scraped by tw If each target is scraped by multiple `vmagent` instances, then data deduplication must be enabled at remote storage pointed by `-remoteWrite.url`. See [these docs](https://docs.victoriametrics.com/#deduplication) for details. - ## Scraping targets via a proxy `vmagent` supports scraping targets via http, https and socks5 proxies. Proxy address must be specified in `proxy_url` option. For example, the following scrape config instructs @@ -433,9 +414,9 @@ scrape_configs: By default `vmagent` doesn't limit the number of time series each scrape target can expose. The limit can be enforced in the following places: -- Via `-promscrape.seriesLimitPerTarget` command-line option. This limit is applied individually to all the scrape targets defined in the file pointed by `-promscrape.config`. -- Via `series_limit` config option at `scrape_config` section. This limit is applied individually to all the scrape targets defined in the given `scrape_config`. -- Via `__series_limit__` label, which can be set with [relabeling](#relabeling) at `relabel_configs` section. This limit is applied to the corresponding scrape targets. Typical use case: to set the limit via [Kubernetes annotations](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) for targets, which may expose too high number of time series. +* Via `-promscrape.seriesLimitPerTarget` command-line option. This limit is applied individually to all the scrape targets defined in the file pointed by `-promscrape.config`. +* Via `series_limit` config option at `scrape_config` section. This limit is applied individually to all the scrape targets defined in the given `scrape_config`. +* Via `__series_limit__` label, which can be set with [relabeling](#relabeling) at `relabel_configs` section. This limit is applied to the corresponding scrape targets. Typical use case: to set the limit via [Kubernetes annotations](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) for targets, which may expose too high number of time series. All the scraped metrics are dropped for time series exceeding the given limit. The exceeded limit can be [monitored](#monitoring) via `promscrape_series_limit_rows_dropped_total` metric. @@ -455,7 +436,6 @@ The exceeded limits can be [monitored](#monitoring) with the following metrics: These limits are approximate, so `vmagent` can underflow/overflow the limit by a small percentage (usually less than 1%). - ## Monitoring `vmagent` exports various metrics in Prometheus exposition format at `http://vmagent-host:8429/metrics` page. We recommend setting up regular scraping of this page @@ -474,7 +454,6 @@ This information may be useful for debugging target relabeling. * `http://vmagent-host:8429/ready`. This handler returns http 200 status code when `vmagent` finishes it's initialization for all service_discovery configs. It may be useful to perform `vmagent` rolling update without any scrape loss. - ## Troubleshooting * We recommend you [set up the official Grafana dashboard](#monitoring) in order to monitor the state of `vmagent'. @@ -538,12 +517,14 @@ It may be useful to perform `vmagent` rolling update without any scrape loss. See the available options below if you prefer fixing the root cause of the error: The following relabeling rule may be added to `relabel_configs` section in order to filter out pods with unneeded ports: + ```yml - action: keep_if_equal source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number] ``` The following relabeling rule may be added to `relabel_configs` section in order to filter out init container pods: + ```yml - action: drop source_labels: [__meta_kubernetes_pod_container_init] @@ -559,7 +540,6 @@ It may be useful to perform `vmagent` rolling update without any scrape loss. The enterprise version of vmagent is available for evaluation at [releases](https://github.com/VictoriaMetrics/VictoriaMetrics/releases) page in `vmutils-*-enteprise.tar.gz` archives and in [docker images](https://hub.docker.com/r/victoriametrics/vmagent/tags) with tags containing `enterprise` suffix. - ### Reading metrics from Kafka [Enterprise version](https://victoriametrics.com/products/enterprise/) of `vmagent` can read metrics in various formats from Kafka messages. These formats can be configured with `-kafka.consumer.topic.defaultFormat` or `-kafka.consumer.topic.format` command-line options. The following formats are supported: @@ -595,7 +575,6 @@ topic = "influx" data_format = "influx" ``` - #### Command-line flags for Kafka consumer These command-line flags are available only in [enterprise](https://victoriametrics.com/products/enterprise/) version of `vmagent`, which can be downloaded for evaluation from [releases](https://github.com/VictoriaMetrics/VictoriaMetrics/releases) page (see `vmutils-*-enteprise.tar.gz` archives) and from [docker images](https://hub.docker.com/r/victoriametrics/vmagent/tags) with tags containing `enterprise` suffix. @@ -635,7 +614,6 @@ These command-line flags are available only in [enterprise](https://victoriametr Additional Kafka options can be passed as query params to `-remoteWrite.url`. For instance, `kafka://localhost:9092/?topic=prom-rw&client.id=my-favorite-id` sets `client.id` Kafka option to `my-favorite-id`. The full list of Kafka options is available [here](https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md). - #### Kafka broker authorization and authentication Two types of auth are supported: @@ -652,12 +630,10 @@ Two types of auth are supported: ./bin/vmagent -remoteWrite.url=kafka://localhost:9092/?topic=prom-rw&security.protocol=SSL -remoteWrite.tlsCAFile=/opt/ca.pem -remoteWrite.tlsCertFile=/opt/cert.pem -remoteWrite.tlsKeyFile=/opt/key.pem ``` - ## How to build from sources We recommend using [binary releases](https://github.com/VictoriaMetrics/VictoriaMetrics/releases) - `vmagent` is located in the `vmutils-*` archives . - ### Development build 1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.17. @@ -699,7 +675,6 @@ ARM build may run on Raspberry Pi or on [energy-efficient ARM servers](https://b 2. Run `make vmagent-arm-prod` or `make vmagent-arm64-prod` from the root folder of [the repository](https://github.com/VictoriaMetrics/VictoriaMetrics). It builds `vmagent-arm-prod` or `vmagent-arm64-prod` binary respectively and puts it into the `bin` folder. - ## Profiling `vmagent` provides handlers for collecting the following [Go profiles](https://blog.golang.org/profiling-go-programs): @@ -728,7 +703,6 @@ The command for collecting CPU profile waits for 30 seconds before returning. The collected profiles may be analyzed with [go tool pprof](https://github.com/google/pprof). - ## Advanced usage `vmagent` can be fine-tuned with various command-line flags. Run `./vmagent -help` in order to see the full list of these flags with their desciptions and default values: @@ -741,314 +715,314 @@ vmagent collects metrics data via popular data ingestion protocols and routes th See the docs at https://docs.victoriametrics.com/vmagent.html . -configAuthKey string - Authorization key for accessing /config page. It must be passed via authKey query arg + Authorization key for accessing /config page. It must be passed via authKey query arg -csvTrimTimestamp duration - Trim timestamps when importing csv data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) + Trim timestamps when importing csv data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) -datadog.maxInsertRequestSize size - The maximum size in bytes of a single DataDog POST request to /api/v1/series - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 67108864) + The maximum size in bytes of a single DataDog POST request to /api/v1/series + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 67108864) -dryRun - Whether to check only config files without running vmagent. The following files are checked: -promscrape.config, -remoteWrite.relabelConfig, -remoteWrite.urlRelabelConfig . Unknown config entries aren't allowed in -promscrape.config by default. This can be changed by passing -promscrape.config.strictParse=false command-line flag + Whether to check only config files without running vmagent. The following files are checked: -promscrape.config, -remoteWrite.relabelConfig, -remoteWrite.urlRelabelConfig . Unknown config entries aren't allowed in -promscrape.config by default. This can be changed by passing -promscrape.config.strictParse=false command-line flag -enableTCP6 - Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used + Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used -envflag.enable - Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details + Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details -envflag.prefix string - Prefix for environment variables if -envflag.enable is set + Prefix for environment variables if -envflag.enable is set -eula - By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf + By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf -fs.disableMmap - Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() + Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() -graphiteListenAddr string - TCP and UDP address to listen for Graphite plaintext data. Usually :2003 must be set. Doesn't work if empty + TCP and UDP address to listen for Graphite plaintext data. Usually :2003 must be set. Doesn't work if empty -graphiteTrimTimestamp duration - Trim timestamps for Graphite data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) + Trim timestamps for Graphite data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) -http.connTimeout duration - Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) + Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) -http.disableResponseCompression - Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth + Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth -http.idleConnTimeout duration - Timeout for incoming idle http connections (default 1m0s) + Timeout for incoming idle http connections (default 1m0s) -http.maxGracefulShutdownDuration duration - The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) + The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) -http.pathPrefix string - An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus + An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus -http.shutdownDelay duration - Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers + Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers -httpAuth.password string - Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty + Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty -httpAuth.username string - Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password + Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password -httpListenAddr string - TCP address to listen for http connections. Set this flag to empty value in order to disable listening on any port. This mode may be useful for running multiple vmagent instances on the same server. Note that /targets and /metrics pages aren't available if -httpListenAddr='' (default ":8429") + TCP address to listen for http connections. Set this flag to empty value in order to disable listening on any port. This mode may be useful for running multiple vmagent instances on the same server. Note that /targets and /metrics pages aren't available if -httpListenAddr='' (default ":8429") -import.maxLineLen size - The maximum length in bytes of a single line accepted by /api/v1/import; the line length can be limited with 'max_rows_per_line' query arg passed to /api/v1/export - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 104857600) + The maximum length in bytes of a single line accepted by /api/v1/import; the line length can be limited with 'max_rows_per_line' query arg passed to /api/v1/export + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 104857600) -influx.databaseNames array - Comma-separated list of database names to return from /query and /influx/query API. This can be needed for accepting data from Telegraf plugins such as https://github.com/fangli/fluent-plugin-influxdb - Supports an array of values separated by comma or specified via multiple flags. + Comma-separated list of database names to return from /query and /influx/query API. This can be needed for accepting data from Telegraf plugins such as https://github.com/fangli/fluent-plugin-influxdb + Supports an array of values separated by comma or specified via multiple flags. -influx.maxLineSize size - The maximum size in bytes for a single InfluxDB line during parsing - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 262144) + The maximum size in bytes for a single InfluxDB line during parsing + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 262144) -influxDBLabel string - Default label for the DB name sent over '?db={db_name}' query parameter (default "db") + Default label for the DB name sent over '?db={db_name}' query parameter (default "db") -influxListenAddr string - TCP and UDP address to listen for InfluxDB line protocol data. Usually :8189 must be set. Doesn't work if empty. This flag isn't needed when ingesting data over HTTP - just send it to http://:8429/write + TCP and UDP address to listen for InfluxDB line protocol data. Usually :8189 must be set. Doesn't work if empty. This flag isn't needed when ingesting data over HTTP - just send it to http://:8429/write -influxMeasurementFieldSeparator string - Separator for '{measurement}{separator}{field_name}' metric name when inserted via InfluxDB line protocol (default "_") + Separator for '{measurement}{separator}{field_name}' metric name when inserted via InfluxDB line protocol (default "_") -influxSkipMeasurement - Uses '{field_name}' as a metric name while ignoring '{measurement}' and '-influxMeasurementFieldSeparator' + Uses '{field_name}' as a metric name while ignoring '{measurement}' and '-influxMeasurementFieldSeparator' -influxSkipSingleField - Uses '{measurement}' instead of '{measurement}{separator}{field_name}' for metic name if InfluxDB line contains only a single field + Uses '{measurement}' instead of '{measurement}{separator}{field_name}' for metic name if InfluxDB line contains only a single field -influxTrimTimestamp duration - Trim timestamps for InfluxDB line protocol data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) + Trim timestamps for InfluxDB line protocol data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) -insert.maxQueueDuration duration - The maximum duration for waiting in the queue for insert requests due to -maxConcurrentInserts (default 1m0s) + The maximum duration for waiting in the queue for insert requests due to -maxConcurrentInserts (default 1m0s) -kafka.consumer.topic array - Kafka topic names for data consumption. - Supports an array of values separated by comma or specified via multiple flags. + Kafka topic names for data consumption. + Supports an array of values separated by comma or specified via multiple flags. -kafka.consumer.topic.basicAuth.password array - Optional basic auth password for -kafka.consumer.topic. Must be used in conjunction with any supported auth methods for kafka client, specified by flag -kafka.consumer.topic.options='security.protocol=SASL_SSL;sasl.mechanisms=PLAIN' - Supports an array of values separated by comma or specified via multiple flags. + Optional basic auth password for -kafka.consumer.topic. Must be used in conjunction with any supported auth methods for kafka client, specified by flag -kafka.consumer.topic.options='security.protocol=SASL_SSL;sasl.mechanisms=PLAIN' + Supports an array of values separated by comma or specified via multiple flags. -kafka.consumer.topic.basicAuth.username array - Optional basic auth username for -kafka.consumer.topic. Must be used in conjunction with any supported auth methods for kafka client, specified by flag -kafka.consumer.topic.options='security.protocol=SASL_SSL;sasl.mechanisms=PLAIN' - Supports an array of values separated by comma or specified via multiple flags. + Optional basic auth username for -kafka.consumer.topic. Must be used in conjunction with any supported auth methods for kafka client, specified by flag -kafka.consumer.topic.options='security.protocol=SASL_SSL;sasl.mechanisms=PLAIN' + Supports an array of values separated by comma or specified via multiple flags. -kafka.consumer.topic.brokers array - List of brokers to connect for given topic, e.g. -kafka.consumer.topic.broker=host-1:9092;host-2:9092 - Supports an array of values separated by comma or specified via multiple flags. + List of brokers to connect for given topic, e.g. -kafka.consumer.topic.broker=host-1:9092;host-2:9092 + Supports an array of values separated by comma or specified via multiple flags. -kafka.consumer.topic.defaultFormat string - Expected data format in the topic if -kafka.consumer.topic.format is skipped. (default "promremotewrite") + Expected data format in the topic if -kafka.consumer.topic.format is skipped. (default "promremotewrite") -kafka.consumer.topic.format array - data format for corresponding kafka topic. Valid formats: influx, prometheus, promremotewrite, graphite, jsonline - Supports an array of values separated by comma or specified via multiple flags. + data format for corresponding kafka topic. Valid formats: influx, prometheus, promremotewrite, graphite, jsonline + Supports an array of values separated by comma or specified via multiple flags. -kafka.consumer.topic.groupID array - Defines group.id for topic - Supports an array of values separated by comma or specified via multiple flags. + Defines group.id for topic + Supports an array of values separated by comma or specified via multiple flags. -kafka.consumer.topic.isGzipped array - Enables gzip setting for topic messages payload. Only prometheus, jsonline and influx formats accept gzipped messages. - Supports array of values separated by comma or specified via multiple flags. + Enables gzip setting for topic messages payload. Only prometheus, jsonline and influx formats accept gzipped messages. + Supports array of values separated by comma or specified via multiple flags. -kafka.consumer.topic.options array - Optional key=value;key1=value2 settings for topic consumer. See full configuration options at https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md. - Supports an array of values separated by comma or specified via multiple flags. + Optional key=value;key1=value2 settings for topic consumer. See full configuration options at https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md. + Supports an array of values separated by comma or specified via multiple flags. -loggerDisableTimestamps - Whether to disable writing timestamps in logs + Whether to disable writing timestamps in logs -loggerErrorsPerSecondLimit int - Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit + Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit -loggerFormat string - Format for logs. Possible values: default, json (default "default") + Format for logs. Possible values: default, json (default "default") -loggerLevel string - Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") + Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") -loggerOutput string - Output for the logs. Supported values: stderr, stdout (default "stderr") + Output for the logs. Supported values: stderr, stdout (default "stderr") -loggerTimezone string - Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") + Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") -loggerWarnsPerSecondLimit int - Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit + Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit -maxConcurrentInserts int - The maximum number of concurrent inserts. Default value should work for most cases, since it minimizes the overhead for concurrent inserts. This option is tigthly coupled with -insert.maxQueueDuration (default 16) + The maximum number of concurrent inserts. Default value should work for most cases, since it minimizes the overhead for concurrent inserts. This option is tigthly coupled with -insert.maxQueueDuration (default 16) -maxInsertRequestSize size - The maximum size in bytes of a single Prometheus remote_write API request - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) + The maximum size in bytes of a single Prometheus remote_write API request + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) -memory.allowedBytes size - Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -memory.allowedPercent float - Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) + Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) -metricsAuthKey string - Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings -opentsdbHTTPListenAddr string - TCP address to listen for OpentTSDB HTTP put requests. Usually :4242 must be set. Doesn't work if empty + TCP address to listen for OpentTSDB HTTP put requests. Usually :4242 must be set. Doesn't work if empty -opentsdbListenAddr string - TCP and UDP address to listen for OpentTSDB metrics. Telnet put messages and HTTP /api/put messages are simultaneously served on TCP port. Usually :4242 must be set. Doesn't work if empty + TCP and UDP address to listen for OpentTSDB metrics. Telnet put messages and HTTP /api/put messages are simultaneously served on TCP port. Usually :4242 must be set. Doesn't work if empty -opentsdbTrimTimestamp duration - Trim timestamps for OpenTSDB 'telnet put' data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) + Trim timestamps for OpenTSDB 'telnet put' data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) -opentsdbhttp.maxInsertRequestSize size - The maximum size of OpenTSDB HTTP put request - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) + The maximum size of OpenTSDB HTTP put request + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) -opentsdbhttpTrimTimestamp duration - Trim timestamps for OpenTSDB HTTP data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) + Trim timestamps for OpenTSDB HTTP data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) -pprofAuthKey string - Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings -promscrape.cluster.memberNum int - The number of number in the cluster of scrapers. It must be an unique value in the range 0 ... promscrape.cluster.membersCount-1 across scrapers in the cluster + The number of number in the cluster of scrapers. It must be an unique value in the range 0 ... promscrape.cluster.membersCount-1 across scrapers in the cluster -promscrape.cluster.membersCount int - The number of members in a cluster of scrapers. Each member must have an unique -promscrape.cluster.memberNum in the range 0 ... promscrape.cluster.membersCount-1 . Each member then scrapes roughly 1/N of all the targets. By default cluster scraping is disabled, i.e. a single scraper scrapes all the targets + The number of members in a cluster of scrapers. Each member must have an unique -promscrape.cluster.memberNum in the range 0 ... promscrape.cluster.membersCount-1 . Each member then scrapes roughly 1/N of all the targets. By default cluster scraping is disabled, i.e. a single scraper scrapes all the targets -promscrape.cluster.replicationFactor int - The number of members in the cluster, which scrape the same targets. If the replication factor is greater than 2, then the deduplication must be enabled at remote storage side. See https://docs.victoriametrics.com/#deduplication (default 1) + The number of members in the cluster, which scrape the same targets. If the replication factor is greater than 2, then the deduplication must be enabled at remote storage side. See https://docs.victoriametrics.com/#deduplication (default 1) -promscrape.config string - Optional path to Prometheus config file with 'scrape_configs' section containing targets to scrape. The path can point to local file and to http url. See https://docs.victoriametrics.com/#how-to-scrape-prometheus-exporters-such-as-node-exporter for details + Optional path to Prometheus config file with 'scrape_configs' section containing targets to scrape. The path can point to local file and to http url. See https://docs.victoriametrics.com/#how-to-scrape-prometheus-exporters-such-as-node-exporter for details -promscrape.config.dryRun - Checks -promscrape.config file for errors and unsupported fields and then exits. Returns non-zero exit code on parsing errors and emits these errors to stderr. See also -promscrape.config.strictParse command-line flag. Pass -loggerLevel=ERROR if you don't need to see info messages in the output. + Checks -promscrape.config file for errors and unsupported fields and then exits. Returns non-zero exit code on parsing errors and emits these errors to stderr. See also -promscrape.config.strictParse command-line flag. Pass -loggerLevel=ERROR if you don't need to see info messages in the output. -promscrape.config.strictParse - Whether to deny unsupported fields in -promscrape.config . Set to false in order to silently skip unsupported fields (default true) + Whether to deny unsupported fields in -promscrape.config . Set to false in order to silently skip unsupported fields (default true) -promscrape.configCheckInterval duration - Interval for checking for changes in '-promscrape.config' file. By default the checking is disabled. Send SIGHUP signal in order to force config check for changes + Interval for checking for changes in '-promscrape.config' file. By default the checking is disabled. Send SIGHUP signal in order to force config check for changes -promscrape.consul.waitTime duration - Wait time used by Consul service discovery. Default value is used if not set + Wait time used by Consul service discovery. Default value is used if not set -promscrape.consulSDCheckInterval duration - Interval for checking for changes in Consul. This works only if consul_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#consul_sd_config for details (default 30s) + Interval for checking for changes in Consul. This works only if consul_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#consul_sd_config for details (default 30s) -promscrape.digitaloceanSDCheckInterval duration - Interval for checking for changes in digital ocean. This works only if digitalocean_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#digitalocean_sd_config for details (default 1m0s) + Interval for checking for changes in digital ocean. This works only if digitalocean_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#digitalocean_sd_config for details (default 1m0s) -promscrape.disableCompression - Whether to disable sending 'Accept-Encoding: gzip' request headers to all the scrape targets. This may reduce CPU usage on scrape targets at the cost of higher network bandwidth utilization. It is possible to set 'disable_compression: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control + Whether to disable sending 'Accept-Encoding: gzip' request headers to all the scrape targets. This may reduce CPU usage on scrape targets at the cost of higher network bandwidth utilization. It is possible to set 'disable_compression: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control -promscrape.disableKeepAlive - Whether to disable HTTP keep-alive connections when scraping all the targets. This may be useful when targets has no support for HTTP keep-alive connection. It is possible to set 'disable_keepalive: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control. Note that disabling HTTP keep-alive may increase load on both vmagent and scrape targets + Whether to disable HTTP keep-alive connections when scraping all the targets. This may be useful when targets has no support for HTTP keep-alive connection. It is possible to set 'disable_keepalive: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control. Note that disabling HTTP keep-alive may increase load on both vmagent and scrape targets -promscrape.discovery.concurrency int - The maximum number of concurrent requests to Prometheus autodiscovery API (Consul, Kubernetes, etc.) (default 100) + The maximum number of concurrent requests to Prometheus autodiscovery API (Consul, Kubernetes, etc.) (default 100) -promscrape.discovery.concurrentWaitTime duration - The maximum duration for waiting to perform API requests if more than -promscrape.discovery.concurrency requests are simultaneously performed (default 1m0s) + The maximum duration for waiting to perform API requests if more than -promscrape.discovery.concurrency requests are simultaneously performed (default 1m0s) -promscrape.dnsSDCheckInterval duration - Interval for checking for changes in dns. This works only if dns_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dns_sd_config for details (default 30s) + Interval for checking for changes in dns. This works only if dns_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dns_sd_config for details (default 30s) -promscrape.dockerSDCheckInterval duration - Interval for checking for changes in docker. This works only if docker_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#docker_sd_config for details (default 30s) + Interval for checking for changes in docker. This works only if docker_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#docker_sd_config for details (default 30s) -promscrape.dockerswarmSDCheckInterval duration - Interval for checking for changes in dockerswarm. This works only if dockerswarm_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dockerswarm_sd_config for details (default 30s) + Interval for checking for changes in dockerswarm. This works only if dockerswarm_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dockerswarm_sd_config for details (default 30s) -promscrape.dropOriginalLabels - Whether to drop original labels for scrape targets at /targets and /api/v1/targets pages. This may be needed for reducing memory usage when original labels for big number of scrape targets occupy big amounts of memory. Note that this reduces debuggability for improper per-target relabeling configs + Whether to drop original labels for scrape targets at /targets and /api/v1/targets pages. This may be needed for reducing memory usage when original labels for big number of scrape targets occupy big amounts of memory. Note that this reduces debuggability for improper per-target relabeling configs -promscrape.ec2SDCheckInterval duration - Interval for checking for changes in ec2. This works only if ec2_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config for details (default 1m0s) + Interval for checking for changes in ec2. This works only if ec2_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config for details (default 1m0s) -promscrape.eurekaSDCheckInterval duration - Interval for checking for changes in eureka. This works only if eureka_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#eureka_sd_config for details (default 30s) + Interval for checking for changes in eureka. This works only if eureka_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#eureka_sd_config for details (default 30s) -promscrape.fileSDCheckInterval duration - Interval for checking for changes in 'file_sd_config'. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#file_sd_config for details (default 5m0s) + Interval for checking for changes in 'file_sd_config'. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#file_sd_config for details (default 5m0s) -promscrape.gceSDCheckInterval duration - Interval for checking for changes in gce. This works only if gce_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#gce_sd_config for details (default 1m0s) + Interval for checking for changes in gce. This works only if gce_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#gce_sd_config for details (default 1m0s) -promscrape.httpSDCheckInterval duration - Interval for checking for changes in http endpoint service discovery. This works only if http_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#http_sd_config for details (default 1m0s) + Interval for checking for changes in http endpoint service discovery. This works only if http_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#http_sd_config for details (default 1m0s) -promscrape.kubernetes.apiServerTimeout duration - How frequently to reload the full state from Kuberntes API server (default 30m0s) + How frequently to reload the full state from Kuberntes API server (default 30m0s) -promscrape.kubernetesSDCheckInterval duration - Interval for checking for changes in Kubernetes API server. This works only if kubernetes_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config for details (default 30s) + Interval for checking for changes in Kubernetes API server. This works only if kubernetes_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config for details (default 30s) -promscrape.maxDroppedTargets int - The maximum number of droppedTargets to show at /api/v1/targets page. Increase this value if your setup drops more scrape targets during relabeling and you need investigating labels for all the dropped targets. Note that the increased number of tracked dropped targets may result in increased memory usage (default 1000) + The maximum number of droppedTargets to show at /api/v1/targets page. Increase this value if your setup drops more scrape targets during relabeling and you need investigating labels for all the dropped targets. Note that the increased number of tracked dropped targets may result in increased memory usage (default 1000) -promscrape.maxResponseHeadersSize size - The maximum size of http response headers from Prometheus scrape targets - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 4096) + The maximum size of http response headers from Prometheus scrape targets + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 4096) -promscrape.maxScrapeSize size - The maximum size of scrape response in bytes to process from Prometheus targets. Bigger responses are rejected - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 16777216) + The maximum size of scrape response in bytes to process from Prometheus targets. Bigger responses are rejected + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 16777216) -promscrape.minResponseSizeForStreamParse size - The minimum target response size for automatic switching to stream parsing mode, which can reduce memory usage. See https://docs.victoriametrics.com/vmagent.html#stream-parsing-mode - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 1000000) + The minimum target response size for automatic switching to stream parsing mode, which can reduce memory usage. See https://docs.victoriametrics.com/vmagent.html#stream-parsing-mode + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 1000000) -promscrape.noStaleMarkers - Whether to disable sending Prometheus stale markers for metrics when scrape target disappears. This option may reduce memory usage if stale markers aren't needed for your setup. This option also disables populating the scrape_series_added metric. See https://prometheus.io/docs/concepts/jobs_instances/#automatically-generated-labels-and-time-series + Whether to disable sending Prometheus stale markers for metrics when scrape target disappears. This option may reduce memory usage if stale markers aren't needed for your setup. This option also disables populating the scrape_series_added metric. See https://prometheus.io/docs/concepts/jobs_instances/#automatically-generated-labels-and-time-series -promscrape.openstackSDCheckInterval duration - Interval for checking for changes in openstack API server. This works only if openstack_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#openstack_sd_config for details (default 30s) + Interval for checking for changes in openstack API server. This works only if openstack_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#openstack_sd_config for details (default 30s) -promscrape.seriesLimitPerTarget int - Optional limit on the number of unique time series a single scrape target can expose. See https://docs.victoriametrics.com/vmagent.html#cardinality-limiter for more info + Optional limit on the number of unique time series a single scrape target can expose. See https://docs.victoriametrics.com/vmagent.html#cardinality-limiter for more info -promscrape.streamParse - Whether to enable stream parsing for metrics obtained from scrape targets. This may be useful for reducing memory usage when millions of metrics are exposed per each scrape target. It is posible to set 'stream_parse: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control + Whether to enable stream parsing for metrics obtained from scrape targets. This may be useful for reducing memory usage when millions of metrics are exposed per each scrape target. It is posible to set 'stream_parse: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control -promscrape.suppressDuplicateScrapeTargetErrors - Whether to suppress 'duplicate scrape target' errors; see https://docs.victoriametrics.com/vmagent.html#troubleshooting for details + Whether to suppress 'duplicate scrape target' errors; see https://docs.victoriametrics.com/vmagent.html#troubleshooting for details -promscrape.suppressScrapeErrors - Whether to suppress scrape errors logging. The last error for each target is always available at '/targets' page even if scrape errors logging is suppressed + Whether to suppress scrape errors logging. The last error for each target is always available at '/targets' page even if scrape errors logging is suppressed -remoteWrite.basicAuth.password array - Optional basic auth password to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional basic auth password to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.basicAuth.passwordFile array - Optional path to basic auth password to use for -remoteWrite.url. The file is re-read every second. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional path to basic auth password to use for -remoteWrite.url. The file is re-read every second. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.basicAuth.username array - Optional basic auth username to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional basic auth username to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.bearerToken array - Optional bearer auth token to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional bearer auth token to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.bearerTokenFile array - Optional path to bearer token file to use for -remoteWrite.url. The token is re-read from the file every second. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional path to bearer token file to use for -remoteWrite.url. The token is re-read from the file every second. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.flushInterval duration - Interval for flushing the data to remote storage. This option takes effect only when less than 10K data points per second are pushed to -remoteWrite.url (default 1s) + Interval for flushing the data to remote storage. This option takes effect only when less than 10K data points per second are pushed to -remoteWrite.url (default 1s) -remoteWrite.label array - Optional label in the form 'name=value' to add to all the metrics before sending them to -remoteWrite.url. Pass multiple -remoteWrite.label flags in order to add multiple labels to metrics before sending them to remote storage - Supports an array of values separated by comma or specified via multiple flags. + Optional label in the form 'name=value' to add to all the metrics before sending them to -remoteWrite.url. Pass multiple -remoteWrite.label flags in order to add multiple labels to metrics before sending them to remote storage + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.maxBlockSize size - The maximum block size to send to remote storage. Bigger blocks may improve performance at the cost of the increased memory usage. See also -remoteWrite.maxRowsPerBlock - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 8388608) + The maximum block size to send to remote storage. Bigger blocks may improve performance at the cost of the increased memory usage. See also -remoteWrite.maxRowsPerBlock + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 8388608) -remoteWrite.maxDailySeries int - The maximum number of unique series vmagent can send to remote storage systems during the last 24 hours. Excess series are logged and dropped. This can be useful for limiting series churn rate. See https://docs.victoriametrics.com/vmagent.html#cardinality-limiter + The maximum number of unique series vmagent can send to remote storage systems during the last 24 hours. Excess series are logged and dropped. This can be useful for limiting series churn rate. See https://docs.victoriametrics.com/vmagent.html#cardinality-limiter -remoteWrite.maxDiskUsagePerURL size - The maximum file-based buffer size in bytes at -remoteWrite.tmpDataPath for each -remoteWrite.url. When buffer size reaches the configured maximum, then old data is dropped when adding new data to the buffer. Buffered data is stored in ~500MB chunks, so the minimum practical value for this flag is 500000000. Disk usage is unlimited if the value is set to 0 - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + The maximum file-based buffer size in bytes at -remoteWrite.tmpDataPath for each -remoteWrite.url. When buffer size reaches the configured maximum, then old data is dropped when adding new data to the buffer. Buffered data is stored in ~500MB chunks, so the minimum practical value for this flag is 500000000. Disk usage is unlimited if the value is set to 0 + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -remoteWrite.maxHourlySeries int - The maximum number of unique series vmagent can send to remote storage systems during the last hour. Excess series are logged and dropped. This can be useful for limiting series cardinality. See https://docs.victoriametrics.com/vmagent.html#cardinality-limiter + The maximum number of unique series vmagent can send to remote storage systems during the last hour. Excess series are logged and dropped. This can be useful for limiting series cardinality. See https://docs.victoriametrics.com/vmagent.html#cardinality-limiter -remoteWrite.maxRowsPerBlock int - The maximum number of samples to send in each block to remote storage. Higher number may improve performance at the cost of the increased memory usage. See also -remoteWrite.maxBlockSize (default 10000) + The maximum number of samples to send in each block to remote storage. Higher number may improve performance at the cost of the increased memory usage. See also -remoteWrite.maxBlockSize (default 10000) -remoteWrite.multitenantURL array - Base path for multitenant remote storage URL to write data to. See https://docs.victoriametrics.com/vmagent.html#multitenancy for details. Example url: http://:8480 . Pass multiple -remoteWrite.multitenantURL flags in order to replicate data to multiple remote storage systems. See also -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Base path for multitenant remote storage URL to write data to. See https://docs.victoriametrics.com/vmagent.html#multitenancy for details. Example url: http://:8480 . Pass multiple -remoteWrite.multitenantURL flags in order to replicate data to multiple remote storage systems. See also -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.oauth2.clientID array - Optional OAuth2 clientID to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional OAuth2 clientID to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.oauth2.clientSecret array - Optional OAuth2 clientSecret to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional OAuth2 clientSecret to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.oauth2.clientSecretFile array - Optional OAuth2 clientSecretFile to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional OAuth2 clientSecretFile to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.oauth2.scopes array - Optional OAuth2 scopes to use for -remoteWrite.url. Scopes must be delimited by ';'. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional OAuth2 scopes to use for -remoteWrite.url. Scopes must be delimited by ';'. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.oauth2.tokenUrl array - Optional OAuth2 tokenURL to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional OAuth2 tokenURL to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.proxyURL array - Optional proxy URL for writing data to -remoteWrite.url. Supported proxies: http, https, socks5. Example: -remoteWrite.proxyURL=socks5://proxy:1234 - Supports an array of values separated by comma or specified via multiple flags. + Optional proxy URL for writing data to -remoteWrite.url. Supported proxies: http, https, socks5. Example: -remoteWrite.proxyURL=socks5://proxy:1234 + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.queues int - The number of concurrent queues to each -remoteWrite.url. Set more queues if default number of queues isn't enough for sending high volume of collected data to remote storage. Default value is 2 * numberOfAvailableCPUs (default 8) + The number of concurrent queues to each -remoteWrite.url. Set more queues if default number of queues isn't enough for sending high volume of collected data to remote storage. Default value is 2 * numberOfAvailableCPUs (default 8) -remoteWrite.rateLimit array - Optional rate limit in bytes per second for data sent to -remoteWrite.url. By default the rate limit is disabled. It can be useful for limiting load on remote storage when big amounts of buffered data is sent after temporary unavailability of the remote storage - Supports array of values separated by comma or specified via multiple flags. + Optional rate limit in bytes per second for data sent to -remoteWrite.url. By default the rate limit is disabled. It can be useful for limiting load on remote storage when big amounts of buffered data is sent after temporary unavailability of the remote storage + Supports array of values separated by comma or specified via multiple flags. -remoteWrite.relabelConfig string - Optional path to file with relabel_config entries. The path can point either to local file or to http url. These entries are applied to all the metrics before sending them to -remoteWrite.url. See https://docs.victoriametrics.com/vmagent.html#relabeling for details + Optional path to file with relabel_config entries. The path can point either to local file or to http url. These entries are applied to all the metrics before sending them to -remoteWrite.url. See https://docs.victoriametrics.com/vmagent.html#relabeling for details -remoteWrite.relabelDebug - Whether to log metrics before and after relabeling with -remoteWrite.relabelConfig. If the -remoteWrite.relabelDebug is enabled, then the metrics aren't sent to remote storage. This is useful for debugging the relabeling configs + Whether to log metrics before and after relabeling with -remoteWrite.relabelConfig. If the -remoteWrite.relabelDebug is enabled, then the metrics aren't sent to remote storage. This is useful for debugging the relabeling configs -remoteWrite.roundDigits array - Round metric values to this number of decimal digits after the point before writing them to remote storage. Examples: -remoteWrite.roundDigits=2 would round 1.236 to 1.24, while -remoteWrite.roundDigits=-1 would round 126.78 to 130. By default digits rounding is disabled. Set it to 100 for disabling it for a particular remote storage. This option may be used for improving data compression for the stored metrics - Supports array of values separated by comma or specified via multiple flags. + Round metric values to this number of decimal digits after the point before writing them to remote storage. Examples: -remoteWrite.roundDigits=2 would round 1.236 to 1.24, while -remoteWrite.roundDigits=-1 would round 126.78 to 130. By default digits rounding is disabled. Set it to 100 for disabling it for a particular remote storage. This option may be used for improving data compression for the stored metrics + Supports array of values separated by comma or specified via multiple flags. -remoteWrite.sendTimeout array - Timeout for sending a single block of data to -remoteWrite.url - Supports array of values separated by comma or specified via multiple flags. + Timeout for sending a single block of data to -remoteWrite.url + Supports array of values separated by comma or specified via multiple flags. -remoteWrite.showURL - Whether to show -remoteWrite.url in the exported metrics. It is hidden by default, since it can contain sensitive info such as auth key + Whether to show -remoteWrite.url in the exported metrics. It is hidden by default, since it can contain sensitive info such as auth key -remoteWrite.significantFigures array - The number of significant figures to leave in metric values before writing them to remote storage. See https://en.wikipedia.org/wiki/Significant_figures . Zero value saves all the significant figures. This option may be used for improving data compression for the stored metrics. See also -remoteWrite.roundDigits - Supports array of values separated by comma or specified via multiple flags. + The number of significant figures to leave in metric values before writing them to remote storage. See https://en.wikipedia.org/wiki/Significant_figures . Zero value saves all the significant figures. This option may be used for improving data compression for the stored metrics. See also -remoteWrite.roundDigits + Supports array of values separated by comma or specified via multiple flags. -remoteWrite.tlsCAFile array - Optional path to TLS CA file to use for verifying connections to -remoteWrite.url. By default system CA is used. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional path to TLS CA file to use for verifying connections to -remoteWrite.url. By default system CA is used. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.tlsCertFile array - Optional path to client-side TLS certificate file to use when connecting to -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional path to client-side TLS certificate file to use when connecting to -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.tlsInsecureSkipVerify array - Whether to skip tls verification when connecting to -remoteWrite.url - Supports array of values separated by comma or specified via multiple flags. + Whether to skip tls verification when connecting to -remoteWrite.url + Supports array of values separated by comma or specified via multiple flags. -remoteWrite.tlsKeyFile array - Optional path to client-side TLS certificate key to use when connecting to -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional path to client-side TLS certificate key to use when connecting to -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.tlsServerName array - Optional TLS server name to use for connections to -remoteWrite.url. By default the server name from -remoteWrite.url is used. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional TLS server name to use for connections to -remoteWrite.url. By default the server name from -remoteWrite.url is used. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.tmpDataPath string - Path to directory where temporary data for remote write component is stored. See also -remoteWrite.maxDiskUsagePerURL (default "vmagent-remotewrite-data") + Path to directory where temporary data for remote write component is stored. See also -remoteWrite.maxDiskUsagePerURL (default "vmagent-remotewrite-data") -remoteWrite.url array - Remote storage URL to write data to. It must support Prometheus remote_write API. It is recommended using VictoriaMetrics as remote storage. Example url: http://:8428/api/v1/write . Pass multiple -remoteWrite.url flags in order to replicate data to multiple remote storage systems. See also -remoteWrite.multitenantURL - Supports an array of values separated by comma or specified via multiple flags. + Remote storage URL to write data to. It must support Prometheus remote_write API. It is recommended using VictoriaMetrics as remote storage. Example url: http://:8428/api/v1/write . Pass multiple -remoteWrite.url flags in order to replicate data to multiple remote storage systems. See also -remoteWrite.multitenantURL + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.urlRelabelConfig array - Optional path to relabel config for the corresponding -remoteWrite.url. The path can point either to local file or to http url - Supports an array of values separated by comma or specified via multiple flags. + Optional path to relabel config for the corresponding -remoteWrite.url. The path can point either to local file or to http url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.urlRelabelDebug array - Whether to log metrics before and after relabeling with -remoteWrite.urlRelabelConfig. If the -remoteWrite.urlRelabelDebug is enabled, then the metrics aren't sent to the corresponding -remoteWrite.url. This is useful for debugging the relabeling configs - Supports array of values separated by comma or specified via multiple flags. + Whether to log metrics before and after relabeling with -remoteWrite.urlRelabelConfig. If the -remoteWrite.urlRelabelDebug is enabled, then the metrics aren't sent to the corresponding -remoteWrite.url. This is useful for debugging the relabeling configs + Supports array of values separated by comma or specified via multiple flags. -sortLabels - Whether to sort labels for incoming samples before writing them to all the configured remote storage systems. This may be needed for reducing memory usage at remote storage when the order of labels in incoming samples is random. For example, if m{k1="v1",k2="v2"} may be sent as m{k2="v2",k1="v1"}Enabled sorting for labels can slow down ingestion performance a bit + Whether to sort labels for incoming samples before writing them to all the configured remote storage systems. This may be needed for reducing memory usage at remote storage when the order of labels in incoming samples is random. For example, if m{k1="v1",k2="v2"} may be sent as m{k2="v2",k1="v1"}Enabled sorting for labels can slow down ingestion performance a bit -tls - Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set + Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set -tlsCertFile string - Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated -tlsKeyFile string - Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated -version - Show VictoriaMetrics version + Show VictoriaMetrics version ``` diff --git a/docs/vmalert.md b/docs/vmalert.md index cb04a7f84..0bcd76343 100644 --- a/docs/vmalert.md +++ b/docs/vmalert.md @@ -14,6 +14,7 @@ Vmalert is heavily inspired by [Prometheus](https://prometheus.io/docs/alerting/ implementation and aims to be compatible with its syntax. ## Features + * Integration with [VictoriaMetrics](https://github.com/VictoriaMetrics/VictoriaMetrics) TSDB; * VictoriaMetrics [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html) support and expressions validation; @@ -26,8 +27,9 @@ implementation and aims to be compatible with its syntax. * Lightweight without extra dependencies. ## Limitations + * `vmalert` execute queries against remote datasource which has reliability risks because of the network. -It is recommended to configure alerts thresholds and rules expressions with the understanding that network +It is recommended to configure alerts thresholds and rules expressions with the understanding that network requests may fail; * by default, rules execution is sequential within one group, but persistence of execution results to remote storage is asynchronous. Hence, user shouldn't rely on chaining of recording rules when result of previous @@ -36,25 +38,29 @@ recording rule is reused in the next one; ## QuickStart To build `vmalert` from sources: -``` + +```bash git clone https://github.com/VictoriaMetrics/VictoriaMetrics cd VictoriaMetrics make vmalert ``` + The build binary will be placed in `VictoriaMetrics/bin` folder. To start using `vmalert` you will need the following things: + * list of rules - PromQL/MetricsQL expressions to execute; * datasource address - reachable MetricsQL endpoint to run queries against; * notifier address [optional] - reachable [Alert Manager](https://github.com/prometheus/alertmanager) instance for processing, -aggregating alerts, and sending notifications. Please note, notifier address also supports Consul Service Discovery via +aggregating alerts, and sending notifications. Please note, notifier address also supports Consul Service Discovery via [config file](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/app/vmalert/notifier/config.go). * remote write address [optional] - [remote write](https://prometheus.io/docs/prometheus/latest/storage/#remote-storage-integrations) compatible storage to persist rules and alerts state info; * remote read address [optional] - MetricsQL compatible datasource to restore alerts state from. Then configure `vmalert` accordingly: -``` + +```bash ./bin/vmalert -rule=alert.rules \ # Path to the file with rules configuration. Supports wildcard -datasource.url=http://localhost:8428 \ # PromQL compatible datasource -notifier.url=http://localhost:9093 \ # AlertManager URL (required if alerting rules are used) @@ -81,6 +87,7 @@ and [alerting](https://prometheus.io/docs/prometheus/latest/configuration/alerti similar to Prometheus rules and configured using YAML. Configuration examples may be found in [testdata](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/app/vmalert/config/testdata) folder. Every `rule` belongs to a `group` and every configuration file may contain arbitrary number of groups: + ```yaml groups: [ - ] @@ -89,6 +96,7 @@ groups: ### Groups Each group has the following attributes: + ```yaml # The name of the group. Must be unique within a file. name: @@ -140,6 +148,7 @@ or [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html) expression. Vmal expression and then act according to the Rule type. There are two types of Rules: + * [alerting](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/) - Alerting rules allow defining alert conditions via `expr` field and to send notifications to [Alertmanager](https://github.com/prometheus/alertmanager) if execution result is not empty. @@ -154,6 +163,7 @@ within one group. #### Alerting rules The syntax for alerting rule is the following: + ```yaml # The name of the alert. Must be a valid metric name. alert: @@ -186,6 +196,7 @@ listed [here](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/app #### Recording rules The syntax for recording rules is following: + ```yaml # The name of the time series to output to. Must be a valid metric name. record: @@ -202,11 +213,11 @@ labels: For recording rules to work `-remoteWrite.url` must be specified. - ### Alerts state on restarts `vmalert` has no local storage, so alerts state is stored in the process memory. Hence, after restart of `vmalert` the process alerts state will be lost. To avoid this situation, `vmalert` should be configured via the following flags: + * `-remoteWrite.url` - URL to VictoriaMetrics (Single) or vminsert (Cluster). `vmalert` will persist alerts state into the configured address in the form of time series named `ALERTS` and `ALERTS_FOR_STATE` via remote-write protocol. These are regular time series and maybe queried from VM just as any other time series. @@ -218,7 +229,6 @@ Both flags are required for proper state restoration. Restore process may fail i in configured `-remoteRead.url`, weren't updated in the last `1h` (controlled by `-remoteRead.lookback`) or received state doesn't match current `vmalert` rules configuration. - ### Multitenancy There are the following approaches exist for alerting and recording rules across @@ -263,10 +273,11 @@ tags at [Docker Hub](https://hub.docker.com/r/victoriametrics/vmalert/tags). ### Topology examples -The following sections are showing how `vmalert` may be used and configured -for different scenarios. +The following sections are showing how `vmalert` may be used and configured +for different scenarios. + +Please note, not all flags in examples are required: -Please note, not all flags in examples are required: * `-remoteWrite.url` and `-remoteRead.url` are optional and are needed only if you have recording rules or want to store [alerts state](#alerts-state-on-restarts) on `vmalert` restarts; * `-notifier.url` is optional and is needed only if you have alerting rules. @@ -277,6 +288,7 @@ The simplest configuration where one single-node VM server is used for rules execution, storing recording rules results and alerts state. `vmalert` configuration flags: + ``` ./bin/vmalert -rule=rules.yml \ # Path to the file with rules configuration. Supports wildcard -datasource.url=http://victoriametrics:8428 \ # VM-single addr for executing rules expressions @@ -287,16 +299,16 @@ rules execution, storing recording rules results and alerts state. vmalert single - #### Cluster VictoriaMetrics In [cluster mode](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html) VictoriaMetrics has separate components for writing and reading path: `vminsert` and `vmselect` components respectively. `vmselect` is used for executing rules expressions and `vminsert` is used to persist recording rules results and alerts state. -Cluster mode could have multiple `vminsert` and `vmselect` components. +Cluster mode could have multiple `vminsert` and `vmselect` components. `vmalert` configuration flags: + ``` ./bin/vmalert -rule=rules.yml \ # Path to the file with rules configuration. Supports wildcard -datasource.url=http://vmselect:8481/select/0/prometheus # vmselect addr for executing rules expressions @@ -319,6 +331,7 @@ the same destinations, and send alert notifications to multiple configured Alertmanagers. `vmalert` configuration flags: + ``` ./bin/vmalert -rule=rules.yml \ # Path to the file with rules configuration. Supports wildcard -datasource.url=http://victoriametrics:8428 \ # VM-single addr for executing rules expressions @@ -339,9 +352,8 @@ all `vmalert`s are having the same config. Don't forget to configure [cluster mode](https://prometheus.io/docs/alerting/latest/alertmanager/) for Alertmanagers for better reliability. -This example uses single-node VM server for the sake of simplicity. -Check how to replace it with [cluster VictoriaMetrics](#cluster-victoriametrics) if needed. - +This example uses single-node VM server for the sake of simplicity. +Check how to replace it with [cluster VictoriaMetrics](#cluster-victoriametrics) if needed. #### Downsampling and aggregation via vmalert @@ -353,6 +365,7 @@ recording rules to process raw data from "hot" cluster (by applying additional t or reducing resolution) and push results to "cold" cluster. `vmalert` configuration flags: + ``` ./bin/vmalert -rule=downsampling-rules.yml \ # Path to the file with rules configuration. Supports wildcard -datasource.url=http://raw-cluster-vmselect:8481/select/0/prometheus # vmselect addr for executing recordi ng rules expressions @@ -367,19 +380,18 @@ Flags `-remoteRead.url` and `-notifier.url` are omitted since we assume only rec See also [downsampling docs](https://docs.victoriametrics.com/#downsampling). - ### Web `vmalert` runs a web-server (`-httpListenAddr`) for serving metrics and alerts endpoints: + * `http://` - UI; * `http:///api/v1/groups` - list of all loaded groups and rules; * `http:///api/v1/alerts` - list of all active alerts; -* `http:///api/v1///status" ` - get alert status by ID. +* `http:///api/v1///status"` - get alert status by ID. Used as alert source in AlertManager. * `http:///metrics` - application metrics. * `http:///-/reload` - hot configuration reload. - ## Graphite vmalert sends requests to `<-datasource.url>/render?format=json` during evaluation of alerting and recording rules @@ -399,6 +411,7 @@ data source for backfilling. In `replay` mode vmalert works as a cli-tool and exits immediately after work is done. To run vmalert in `replay` mode: + ``` ./bin/vmalert -rule=path/to/your.rules \ # path to files with rules you usually use with vmalert -datasource.url=http://localhost:8428 \ # PromQL/MetricsQL compatible datasource @@ -408,6 +421,7 @@ To run vmalert in `replay` mode: ``` The output of the command will look like the following: + ``` Replay mode: from: 2021-05-11 07:21:43 +0000 UTC # set by -replay.timeFrom @@ -451,9 +465,11 @@ The result of recording rules `replay` should match with results of normal rules The result of alerting rules `replay` is time series reflecting [alert's state](#alerts-state-on-restarts). To see if `replayed` alert has fired in the past use the following PromQL/MetricsQL expression: + ``` ALERTS{alertname="your_alertname", alertstate="firing"} ``` + Execute the query against storage which was used for `-remoteWrite.url` during the `replay`. ### Additional configuration @@ -477,7 +493,6 @@ See full description for these flags in `./vmalert --help`. * Graphite engine isn't supported yet; * `query` template function is disabled for performance reasons (might be changed in future); - ## Monitoring `vmalert` exports various metrics in Prometheus exposition format at `http://vmalert-host:8880/metrics` page. @@ -488,7 +503,6 @@ Use the official [Grafana dashboard](https://grafana.com/grafana/dashboards/1495 If you have suggestions for improvements or have found a bug - please open an issue on github or add a review to the dashboard. - ## Configuration ### Flags @@ -497,305 +511,308 @@ Pass `-help` to `vmalert` in order to see the full list of supported command-line flags with their descriptions. The shortlist of configuration flags is the following: + ``` -clusterMode - If clusterMode is enabled, then vmalert automatically adds the tenant specified in config groups to -datasource.url, -remoteWrite.url and -remoteRead.url. See https://docs.victoriametrics.com/vmalert.html#multitenancy + If clusterMode is enabled, then vmalert automatically adds the tenant specified in config groups to -datasource.url, -remoteWrite.url and -remoteRead.url. See https://docs.victoriametrics.com/vmalert.html#multitenancy -configCheckInterval duration - Interval for checking for changes in '-rule' or '-notifier.config' files. By default the checking is disabled. Send SIGHUP signal in order to force config check for changes. + Interval for checking for changes in '-rule' or '-notifier.config' files. By default the checking is disabled. Send SIGHUP signal in order to force config check for changes. -datasource.appendTypePrefix - Whether to add type prefix to -datasource.url based on the query type. Set to true if sending different query types to the vmselect URL. + Whether to add type prefix to -datasource.url based on the query type. Set to true if sending different query types to the vmselect URL. -datasource.basicAuth.password string - Optional basic auth password for -datasource.url + Optional basic auth password for -datasource.url -datasource.basicAuth.passwordFile string - Optional path to basic auth password to use for -datasource.url + Optional path to basic auth password to use for -datasource.url -datasource.basicAuth.username string - Optional basic auth username for -datasource.url + Optional basic auth username for -datasource.url -datasource.bearerToken string - Optional bearer auth token to use for -datasource.url. + Optional bearer auth token to use for -datasource.url. -datasource.bearerTokenFile string - Optional path to bearer token file to use for -datasource.url. + Optional path to bearer token file to use for -datasource.url. -datasource.lookback duration - Lookback defines how far into the past to look when evaluating queries. For example, if the datasource.lookback=5m then param "time" with value now()-5m will be added to every query. + Lookback defines how far into the past to look when evaluating queries. For example, if the datasource.lookback=5m then param "time" with value now()-5m will be added to every query. -datasource.maxIdleConnections int - Defines the number of idle (keep-alive connections) to each configured datasource. Consider setting this value equal to the value: groups_total * group.concurrency. Too low a value may result in a high number of sockets in TIME_WAIT state. (default 100) + Defines the number of idle (keep-alive connections) to each configured datasource. Consider setting this value equal to the value: groups_total * group.concurrency. Too low a value may result in a high number of sockets in TIME_WAIT state. (default 100) -datasource.oauth2.clientID string - Optional OAuth2 clientID to use for -datasource.url. + Optional OAuth2 clientID to use for -datasource.url. -datasource.oauth2.clientSecret string - Optional OAuth2 clientSecret to use for -datasource.url. + Optional OAuth2 clientSecret to use for -datasource.url. -datasource.oauth2.clientSecretFile string - Optional OAuth2 clientSecretFile to use for -datasource.url. + Optional OAuth2 clientSecretFile to use for -datasource.url. -datasource.oauth2.scopes string - Optional OAuth2 scopes to use for -datasource.url. Scopes must be delimited by ';' + Optional OAuth2 scopes to use for -datasource.url. Scopes must be delimited by ';' -datasource.oauth2.tokenUrl string - Optional OAuth2 tokenURL to use for -datasource.url. + Optional OAuth2 tokenURL to use for -datasource.url. -datasource.queryStep duration - queryStep defines how far a value can fallback to when evaluating queries. For example, if datasource.queryStep=15s then param "step" with value "15s" will be added to every query.If queryStep isn't specified, rule's evaluationInterval will be used instead. + queryStep defines how far a value can fallback to when evaluating queries. For example, if datasource.queryStep=15s then param "step" with value "15s" will be added to every query.If queryStep isn't specified, rule's evaluationInterval will be used instead. -datasource.queryTimeAlignment - Whether to align "time" parameter with evaluation interval.Alignment supposed to produce deterministic results despite of number of vmalert replicas or time they were started. See more details here https://github.com/VictoriaMetrics/VictoriaMetrics/pull/1257 (default true) + Whether to align "time" parameter with evaluation interval.Alignment supposed to produce deterministic results despite of number of vmalert replicas or time they were started. See more details here https://github.com/VictoriaMetrics/VictoriaMetrics/pull/1257 (default true) -datasource.roundDigits int - Adds "round_digits" GET param to datasource requests. In VM "round_digits" limits the number of digits after the decimal point in response values. + Adds "round_digits" GET param to datasource requests. In VM "round_digits" limits the number of digits after the decimal point in response values. -datasource.tlsCAFile string - Optional path to TLS CA file to use for verifying connections to -datasource.url. By default, system CA is used + Optional path to TLS CA file to use for verifying connections to -datasource.url. By default, system CA is used -datasource.tlsCertFile string - Optional path to client-side TLS certificate file to use when connecting to -datasource.url + Optional path to client-side TLS certificate file to use when connecting to -datasource.url -datasource.tlsInsecureSkipVerify - Whether to skip tls verification when connecting to -datasource.url + Whether to skip tls verification when connecting to -datasource.url -datasource.tlsKeyFile string - Optional path to client-side TLS certificate key to use when connecting to -datasource.url + Optional path to client-side TLS certificate key to use when connecting to -datasource.url -datasource.tlsServerName string - Optional TLS server name to use for connections to -datasource.url. By default, the server name from -datasource.url is used + Optional TLS server name to use for connections to -datasource.url. By default, the server name from -datasource.url is used -datasource.url string - VictoriaMetrics or vmselect url. Required parameter. E.g. http://127.0.0.1:8428 + VictoriaMetrics or vmselect url. Required parameter. E.g. http://127.0.0.1:8428 -defaultTenant.graphite string - Default tenant for Graphite alerting groups. See https://docs.victoriametrics.com/vmalert.html#multitenancy + Default tenant for Graphite alerting groups. See https://docs.victoriametrics.com/vmalert.html#multitenancy -defaultTenant.prometheus string - Default tenant for Prometheus alerting groups. See https://docs.victoriametrics.com/vmalert.html#multitenancy + Default tenant for Prometheus alerting groups. See https://docs.victoriametrics.com/vmalert.html#multitenancy -disableAlertgroupLabel - Whether to disable adding group's Name as label to generated alerts and time series. + Whether to disable adding group's Name as label to generated alerts and time series. -dryRun -rule - Whether to check only config files without running vmalert. The rules file are validated. The -rule flag must be specified. + Whether to check only config files without running vmalert. The rules file are validated. The -rule flag must be specified. -enableTCP6 - Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used + Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used -envflag.enable - Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details + Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details -envflag.prefix string - Prefix for environment variables if -envflag.enable is set + Prefix for environment variables if -envflag.enable is set -eula - By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf + By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf -evaluationInterval duration - How often to evaluate the rules (default 1m0s) + How often to evaluate the rules (default 1m0s) -external.alert.source string - External Alert Source allows to override the Source link for alerts sent to AlertManager for cases where you want to build a custom link to Grafana, Prometheus or any other service. - eg. 'explore?orgId=1&left=[\"now-1h\",\"now\",\"VictoriaMetrics\",{\"expr\": \"{{$expr|quotesEscape|crlfEscape|queryEscape}}\"},{\"mode\":\"Metrics\"},{\"ui\":[true,true,true,\"none\"]}]'.If empty '/api/v1/:groupID/alertID/status' is used + External Alert Source allows to override the Source link for alerts sent to AlertManager for cases where you want to build a custom link to Grafana, Prometheus or any other service. + eg. 'explore?orgId=1&left=[\"now-1h\",\"now\",\"VictoriaMetrics\",{\"expr\": \"{{$expr|quotesEscape|crlfEscape|queryEscape}}\"},{\"mode\":\"Metrics\"},{\"ui\":[true,true,true,\"none\"]}]'.If empty '/api/v1/:groupID/alertID/status' is used -external.label array - Optional label in the form 'Name=value' to add to all generated recording rules and alerts. Pass multiple -label flags in order to add multiple label sets. - Supports an array of values separated by comma or specified via multiple flags. + Optional label in the form 'Name=value' to add to all generated recording rules and alerts. Pass multiple -label flags in order to add multiple label sets. + Supports an array of values separated by comma or specified via multiple flags. -external.url string - External URL is used as alert's source for sent alerts to the notifier + External URL is used as alert's source for sent alerts to the notifier -fs.disableMmap - Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() + Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() -http.connTimeout duration - Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) + Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) -http.disableResponseCompression - Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth + Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth -http.idleConnTimeout duration - Timeout for incoming idle http connections (default 1m0s) + Timeout for incoming idle http connections (default 1m0s) -http.maxGracefulShutdownDuration duration - The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) + The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) -http.pathPrefix string - An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus + An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus -http.shutdownDelay duration - Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers + Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers -httpAuth.password string - Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty + Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty -httpAuth.username string - Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password + Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password -httpListenAddr string - Address to listen for http connections (default ":8880") + Address to listen for http connections (default ":8880") -loggerDisableTimestamps - Whether to disable writing timestamps in logs + Whether to disable writing timestamps in logs -loggerErrorsPerSecondLimit int - Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit + Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit -loggerFormat string - Format for logs. Possible values: default, json (default "default") + Format for logs. Possible values: default, json (default "default") -loggerLevel string - Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") + Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") -loggerOutput string - Output for the logs. Supported values: stderr, stdout (default "stderr") + Output for the logs. Supported values: stderr, stdout (default "stderr") -loggerTimezone string - Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") + Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") -loggerWarnsPerSecondLimit int - Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit + Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit -memory.allowedBytes size - Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -memory.allowedPercent float - Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) + Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) -metricsAuthKey string - Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings -notifier.basicAuth.password array - Optional basic auth password for -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional basic auth password for -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.basicAuth.passwordFile array - Optional path to basic auth password file for -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional path to basic auth password file for -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.basicAuth.username array - Optional basic auth username for -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional basic auth username for -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.bearerToken array - Optional bearer token for -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional bearer token for -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.bearerTokenFile array - Optional path to bearer token file for -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional path to bearer token file for -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.config string - Path to configuration file for notifiers + Path to configuration file for notifiers -notifier.oauth2.clientID array - Optional OAuth2 clientID to use for -notifier.url. If multiple args are set, then they are applied independently for the corresponding -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional OAuth2 clientID to use for -notifier.url. If multiple args are set, then they are applied independently for the corresponding -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.oauth2.clientSecret array - Optional OAuth2 clientSecret to use for -notifier.url. If multiple args are set, then they are applied independently for the corresponding -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional OAuth2 clientSecret to use for -notifier.url. If multiple args are set, then they are applied independently for the corresponding -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.oauth2.clientSecretFile array - Optional OAuth2 clientSecretFile to use for -notifier.url. If multiple args are set, then they are applied independently for the corresponding -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional OAuth2 clientSecretFile to use for -notifier.url. If multiple args are set, then they are applied independently for the corresponding -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.oauth2.scopes array - Optional OAuth2 scopes to use for -notifier.url. Scopes must be delimited by ';'. If multiple args are set, then they are applied independently for the corresponding -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional OAuth2 scopes to use for -notifier.url. Scopes must be delimited by ';'. If multiple args are set, then they are applied independently for the corresponding -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.oauth2.tokenUrl array - Optional OAuth2 tokenURL to use for -notifier.url. If multiple args are set, then they are applied independently for the corresponding -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional OAuth2 tokenURL to use for -notifier.url. If multiple args are set, then they are applied independently for the corresponding -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.suppressDuplicateTargetErrors - Whether to suppress 'duplicate target' errors during discovery + Whether to suppress 'duplicate target' errors during discovery -notifier.tlsCAFile array - Optional path to TLS CA file to use for verifying connections to -notifier.url. By default system CA is used - Supports an array of values separated by comma or specified via multiple flags. + Optional path to TLS CA file to use for verifying connections to -notifier.url. By default system CA is used + Supports an array of values separated by comma or specified via multiple flags. -notifier.tlsCertFile array - Optional path to client-side TLS certificate file to use when connecting to -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional path to client-side TLS certificate file to use when connecting to -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.tlsInsecureSkipVerify array - Whether to skip tls verification when connecting to -notifier.url - Supports array of values separated by comma or specified via multiple flags. + Whether to skip tls verification when connecting to -notifier.url + Supports array of values separated by comma or specified via multiple flags. -notifier.tlsKeyFile array - Optional path to client-side TLS certificate key to use when connecting to -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional path to client-side TLS certificate key to use when connecting to -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.tlsServerName array - Optional TLS server name to use for connections to -notifier.url. By default the server name from -notifier.url is used - Supports an array of values separated by comma or specified via multiple flags. + Optional TLS server name to use for connections to -notifier.url. By default the server name from -notifier.url is used + Supports an array of values separated by comma or specified via multiple flags. -notifier.url array - Prometheus alertmanager URL, e.g. http://127.0.0.1:9093 - Supports an array of values separated by comma or specified via multiple flags. + Prometheus alertmanager URL, e.g. http://127.0.0.1:9093 + Supports an array of values separated by comma or specified via multiple flags. -pprofAuthKey string - Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings -promscrape.consul.waitTime duration - Wait time used by Consul service discovery. Default value is used if not set + Wait time used by Consul service discovery. Default value is used if not set -promscrape.consulSDCheckInterval duration - Interval for checking for changes in Consul. This works only if consul_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#consul_sd_config for details (default 30s) + Interval for checking for changes in Consul. This works only if consul_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#consul_sd_config for details (default 30s) -promscrape.discovery.concurrency int - The maximum number of concurrent requests to Prometheus autodiscovery API (Consul, Kubernetes, etc.) (default 100) + The maximum number of concurrent requests to Prometheus autodiscovery API (Consul, Kubernetes, etc.) (default 100) -promscrape.discovery.concurrentWaitTime duration - The maximum duration for waiting to perform API requests if more than -promscrape.discovery.concurrency requests are simultaneously performed (default 1m0s) + The maximum duration for waiting to perform API requests if more than -promscrape.discovery.concurrency requests are simultaneously performed (default 1m0s) -remoteRead.basicAuth.password string - Optional basic auth password for -remoteRead.url + Optional basic auth password for -remoteRead.url -remoteRead.basicAuth.passwordFile string - Optional path to basic auth password to use for -remoteRead.url + Optional path to basic auth password to use for -remoteRead.url -remoteRead.basicAuth.username string - Optional basic auth username for -remoteRead.url + Optional basic auth username for -remoteRead.url -remoteRead.bearerToken string - Optional bearer auth token to use for -remoteRead.url. + Optional bearer auth token to use for -remoteRead.url. -remoteRead.bearerTokenFile string - Optional path to bearer token file to use for -remoteRead.url. + Optional path to bearer token file to use for -remoteRead.url. -remoteRead.disablePathAppend - Whether to disable automatic appending of '/api/v1/query' path to the configured -remoteRead.url. + Whether to disable automatic appending of '/api/v1/query' path to the configured -remoteRead.url. -remoteRead.ignoreRestoreErrors - Whether to ignore errors from remote storage when restoring alerts state on startup. (default true) + Whether to ignore errors from remote storage when restoring alerts state on startup. (default true) -remoteRead.lookback duration - Lookback defines how far to look into past for alerts timeseries. For example, if lookback=1h then range from now() to now()-1h will be scanned. (default 1h0m0s) + Lookback defines how far to look into past for alerts timeseries. For example, if lookback=1h then range from now() to now()-1h will be scanned. (default 1h0m0s) -remoteRead.oauth2.clientID string - Optional OAuth2 clientID to use for -remoteRead.url. + Optional OAuth2 clientID to use for -remoteRead.url. -remoteRead.oauth2.clientSecret string - Optional OAuth2 clientSecret to use for -remoteRead.url. + Optional OAuth2 clientSecret to use for -remoteRead.url. -remoteRead.oauth2.clientSecretFile string - Optional OAuth2 clientSecretFile to use for -remoteRead.url. + Optional OAuth2 clientSecretFile to use for -remoteRead.url. -remoteRead.oauth2.scopes string - Optional OAuth2 scopes to use for -remoteRead.url. Scopes must be delimited by ';'. + Optional OAuth2 scopes to use for -remoteRead.url. Scopes must be delimited by ';'. -remoteRead.oauth2.tokenUrl string - Optional OAuth2 tokenURL to use for -remoteRead.url. + Optional OAuth2 tokenURL to use for -remoteRead.url. -remoteRead.tlsCAFile string - Optional path to TLS CA file to use for verifying connections to -remoteRead.url. By default system CA is used + Optional path to TLS CA file to use for verifying connections to -remoteRead.url. By default system CA is used -remoteRead.tlsCertFile string - Optional path to client-side TLS certificate file to use when connecting to -remoteRead.url + Optional path to client-side TLS certificate file to use when connecting to -remoteRead.url -remoteRead.tlsInsecureSkipVerify - Whether to skip tls verification when connecting to -remoteRead.url + Whether to skip tls verification when connecting to -remoteRead.url -remoteRead.tlsKeyFile string - Optional path to client-side TLS certificate key to use when connecting to -remoteRead.url + Optional path to client-side TLS certificate key to use when connecting to -remoteRead.url -remoteRead.tlsServerName string - Optional TLS server name to use for connections to -remoteRead.url. By default the server name from -remoteRead.url is used + Optional TLS server name to use for connections to -remoteRead.url. By default the server name from -remoteRead.url is used -remoteRead.url vmalert - Optional URL to VictoriaMetrics or vmselect that will be used to restore alerts state. This configuration makes sense only if vmalert was configured with `remoteWrite.url` before and has been successfully persisted its state. E.g. http://127.0.0.1:8428. See also -remoteRead.disablePathAppend + Optional URL to VictoriaMetrics or vmselect that will be used to restore alerts state. This configuration makes sense only if vmalert was configured with `remoteWrite.url` before and has been successfully persisted its state. E.g. http://127.0.0.1:8428. See also -remoteRead.disablePathAppend -remoteWrite.basicAuth.password string - Optional basic auth password for -remoteWrite.url + Optional basic auth password for -remoteWrite.url -remoteWrite.basicAuth.passwordFile string - Optional path to basic auth password to use for -remoteWrite.url + Optional path to basic auth password to use for -remoteWrite.url -remoteWrite.basicAuth.username string - Optional basic auth username for -remoteWrite.url + Optional basic auth username for -remoteWrite.url -remoteWrite.bearerToken string - Optional bearer auth token to use for -remoteWrite.url. + Optional bearer auth token to use for -remoteWrite.url. -remoteWrite.bearerTokenFile string - Optional path to bearer token file to use for -remoteWrite.url. + Optional path to bearer token file to use for -remoteWrite.url. -remoteWrite.concurrency int - Defines number of writers for concurrent writing into remote querier (default 1) + Defines number of writers for concurrent writing into remote querier (default 1) -remoteWrite.disablePathAppend - Whether to disable automatic appending of '/api/v1/write' path to the configured -remoteWrite.url. + Whether to disable automatic appending of '/api/v1/write' path to the configured -remoteWrite.url. -remoteWrite.flushInterval duration - Defines interval of flushes to remote write endpoint (default 5s) + Defines interval of flushes to remote write endpoint (default 5s) -remoteWrite.maxBatchSize int - Defines defines max number of timeseries to be flushed at once (default 1000) + Defines defines max number of timeseries to be flushed at once (default 1000) -remoteWrite.maxQueueSize int - Defines the max number of pending datapoints to remote write endpoint (default 100000) + Defines the max number of pending datapoints to remote write endpoint (default 100000) -remoteWrite.oauth2.clientID string - Optional OAuth2 clientID to use for -remoteWrite.url. + Optional OAuth2 clientID to use for -remoteWrite.url. -remoteWrite.oauth2.clientSecret string - Optional OAuth2 clientSecret to use for -remoteWrite.url. + Optional OAuth2 clientSecret to use for -remoteWrite.url. -remoteWrite.oauth2.clientSecretFile string - Optional OAuth2 clientSecretFile to use for -remoteWrite.url. + Optional OAuth2 clientSecretFile to use for -remoteWrite.url. -remoteWrite.oauth2.scopes string - Optional OAuth2 scopes to use for -notifier.url. Scopes must be delimited by ';'. + Optional OAuth2 scopes to use for -notifier.url. Scopes must be delimited by ';'. -remoteWrite.oauth2.tokenUrl string - Optional OAuth2 tokenURL to use for -notifier.url. + Optional OAuth2 tokenURL to use for -notifier.url. -remoteWrite.tlsCAFile string - Optional path to TLS CA file to use for verifying connections to -remoteWrite.url. By default system CA is used + Optional path to TLS CA file to use for verifying connections to -remoteWrite.url. By default system CA is used -remoteWrite.tlsCertFile string - Optional path to client-side TLS certificate file to use when connecting to -remoteWrite.url + Optional path to client-side TLS certificate file to use when connecting to -remoteWrite.url -remoteWrite.tlsInsecureSkipVerify - Whether to skip tls verification when connecting to -remoteWrite.url + Whether to skip tls verification when connecting to -remoteWrite.url -remoteWrite.tlsKeyFile string - Optional path to client-side TLS certificate key to use when connecting to -remoteWrite.url + Optional path to client-side TLS certificate key to use when connecting to -remoteWrite.url -remoteWrite.tlsServerName string - Optional TLS server name to use for connections to -remoteWrite.url. By default the server name from -remoteWrite.url is used + Optional TLS server name to use for connections to -remoteWrite.url. By default the server name from -remoteWrite.url is used -remoteWrite.url string - Optional URL to VictoriaMetrics or vminsert where to persist alerts state and recording rules results in form of timeseries. For example, if -remoteWrite.url=http://127.0.0.1:8428 is specified, then the alerts state will be written to http://127.0.0.1:8428/api/v1/write . See also -remoteWrite.disablePathAppend + Optional URL to VictoriaMetrics or vminsert where to persist alerts state and recording rules results in form of timeseries. For example, if -remoteWrite.url=http://127.0.0.1:8428 is specified, then the alerts state will be written to http://127.0.0.1:8428/api/v1/write . See also -remoteWrite.disablePathAppend -replay.maxDatapointsPerQuery int - Max number of data points expected in one request. The higher the value, the less requests will be made during replay. (default 1000) + Max number of data points expected in one request. The higher the value, the less requests will be made during replay. (default 1000) -replay.ruleRetryAttempts int - Defines how many retries to make before giving up on rule if request for it returns an error. (default 5) + Defines how many retries to make before giving up on rule if request for it returns an error. (default 5) -replay.rulesDelay duration - Delay between rules evaluation within the group. Could be important if there are chained rules inside of the groupand processing need to wait for previous rule results to be persisted by remote storage before evaluating the next rule.Keep it equal or bigger than -remoteWrite.flushInterval. (default 1s) + Delay between rules evaluation within the group. Could be important if there are chained rules inside of the groupand processing need to wait for previous rule results to be persisted by remote storage before evaluating the next rule.Keep it equal or bigger than -remoteWrite.flushInterval. (default 1s) -replay.timeFrom string - The time filter in RFC3339 format to select time series with timestamp equal or higher than provided value. E.g. '2020-01-01T20:07:00Z' + The time filter in RFC3339 format to select time series with timestamp equal or higher than provided value. E.g. '2020-01-01T20:07:00Z' -replay.timeTo string - The time filter in RFC3339 format to select timeseries with timestamp equal or lower than provided value. E.g. '2020-01-01T20:07:00Z' + The time filter in RFC3339 format to select timeseries with timestamp equal or lower than provided value. E.g. '2020-01-01T20:07:00Z' -rule array - Path to the file with alert rules. - Supports patterns. Flag can be specified multiple times. - Examples: - -rule="/path/to/file". Path to a single file with alerting rules - -rule="dir/*.yaml" -rule="/*.yaml". Relative path to all .yaml files in "dir" folder, - absolute path to all .yaml files in root. - Rule files may contain %{ENV_VAR} placeholders, which are substituted by the corresponding env vars. - Supports an array of values separated by comma or specified via multiple flags. + Path to the file with alert rules. + Supports patterns. Flag can be specified multiple times. + Examples: + -rule="/path/to/file". Path to a single file with alerting rules + -rule="dir/*.yaml" -rule="/*.yaml". Relative path to all .yaml files in "dir" folder, + absolute path to all .yaml files in root. + Rule files may contain %{ENV_VAR} placeholders, which are substituted by the corresponding env vars. + Supports an array of values separated by comma or specified via multiple flags. -rule.configCheckInterval duration - Interval for checking for changes in '-rule' files. By default the checking is disabled. Send SIGHUP signal in order to force config check for changes. DEPRECATED - see '-configCheckInterval' instead + Interval for checking for changes in '-rule' files. By default the checking is disabled. Send SIGHUP signal in order to force config check for changes. DEPRECATED - see '-configCheckInterval' instead -rule.maxResolveDuration duration - Limits the maximum duration for automatic alert expiration, which is by default equal to 3 evaluation intervals of the parent group. + Limits the maximum duration for automatic alert expiration, which is by default equal to 3 evaluation intervals of the parent group. -rule.resendDelay duration - Minimum amount of time to wait before resending an alert to notifier + Minimum amount of time to wait before resending an alert to notifier -rule.validateExpressions - Whether to validate rules expressions via MetricsQL engine (default true) + Whether to validate rules expressions via MetricsQL engine (default true) -rule.validateTemplates - Whether to validate annotation and label templates (default true) + Whether to validate annotation and label templates (default true) -tls - Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set + Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set -tlsCertFile string - Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated -tlsKeyFile string - Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated -version - Show VictoriaMetrics version + Show VictoriaMetrics version ``` ### Hot config reload + `vmalert` supports "hot" config reload via the following methods: + * send SIGHUP signal to `vmalert` process; * send GET request to `/-/reload` endpoint; * configure `-configCheckInterval` flag for periodic reload @@ -808,6 +825,7 @@ just add them in address: `-datasource.url=http://localhost:8428?nocache=1`. To set additional URL params for specific [group of rules](#Groups) modify the `params` group: + ```yaml groups: - name: TestGroup @@ -815,6 +833,7 @@ groups: denyPartialResponse: ["true"] extra_label: ["env=dev"] ``` + Please note, `params` are used only for executing rules expressions (requests to `datasource.url`). If there would be a conflict between URL params set in `datasource.url` flag and params in group definition the latter will have higher priority. @@ -822,15 +841,17 @@ the latter will have higher priority. ### Notifier configuration file Notifier also supports configuration via file specified with flag `notifier.config`: + ``` ./bin/vmalert -rule=app/vmalert/config/testdata/rules.good.rules \ - -datasource.url=http://localhost:8428 \ - -notifier.config=app/vmalert/notifier/testdata/consul.good.yaml + -datasource.url=http://localhost:8428 \ + -notifier.config=app/vmalert/notifier/testdata/consul.good.yaml ``` -The configuration file allows to configure static notifiers or discover notifiers via +The configuration file allows to configure static notifiers or discover notifiers via [Consul](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#consul_sd_config). For example: + ``` static_configs: - targets: @@ -847,6 +868,7 @@ The list of configured or discovered Notifiers can be explored via [UI](#Web). The configuration file [specification](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/app/vmalert/notifier/config.go) is the following: + ``` # Per-target Notifier timeout when pushing alerts. [ timeout: | default = 10s ] @@ -901,7 +923,6 @@ relabel_configs: The configuration file can be [hot-reloaded](#hot-config-reload). - ## Contributing `vmalert` is mostly designed and built by VictoriaMetrics community. @@ -912,8 +933,8 @@ software. Please keep simplicity as the main priority. It is recommended using [binary releases](https://github.com/VictoriaMetrics/VictoriaMetrics/releases) -- `vmalert` is located in `vmutils-*` archives there. +* `vmalert` is located in `vmutils-*` archives there. ### Development build @@ -927,7 +948,6 @@ It is recommended using 2. Run `make vmalert-prod` from the root folder of [the repository](https://github.com/VictoriaMetrics/VictoriaMetrics). It builds `vmalert-prod` binary and puts it into the `bin` folder. - ### ARM build ARM build may run on Raspberry Pi or on [energy-efficient ARM servers](https://blog.cloudflare.com/arm-takes-wing/). diff --git a/docs/vmauth.md b/docs/vmauth.md index e2c8ba182..74ccb7011 100644 --- a/docs/vmauth.md +++ b/docs/vmauth.md @@ -14,7 +14,7 @@ The `-auth.config` can point to either local file or to http url. Just download `vmutils-*` archive from [releases page](https://github.com/VictoriaMetrics/VictoriaMetrics/releases), unpack it and pass the following flag to `vmauth` binary in order to start authorizing and routing requests: -``` +```bash /path/to/vmauth -auth.config=/path/to/auth/config.yml ``` @@ -133,13 +133,13 @@ It is expected that all the backend services protected by `vmauth` are located i Do not transfer Basic Auth headers in plaintext over untrusted networks. Enable https. This can be done by passing the following `-tls*` command-line flags to `vmauth`: -``` +```bash -tls - Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set + Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set -tlsCertFile string - Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs, since RSA certs are slow + Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs, since RSA certs are slow -tlsKeyFile string - Path to file with TLS key. Used only if -tls is set + Path to file with TLS key. Used only if -tls is set ``` Alternatively, [https termination proxy](https://en.wikipedia.org/wiki/TLS_termination_proxy) may be put in front of `vmauth`. @@ -221,7 +221,7 @@ The collected profiles may be analyzed with [go tool pprof](https://github.com/g Pass `-help` command-line arg to `vmauth` in order to see all the configuration options: -``` +```bash ./vmauth -help vmauth authenticates and authorizes incoming requests and proxies them to VictoriaMetrics. @@ -229,70 +229,70 @@ vmauth authenticates and authorizes incoming requests and proxies them to Victor See the docs at https://docs.victoriametrics.com/vmauth.html . -auth.config string - Path to auth config. It can point either to local file or to http url. See https://docs.victoriametrics.com/vmauth.html for details on the format of this auth config + Path to auth config. It can point either to local file or to http url. See https://docs.victoriametrics.com/vmauth.html for details on the format of this auth config -enableTCP6 - Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used + Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used -envflag.enable - Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details + Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details -envflag.prefix string - Prefix for environment variables if -envflag.enable is set + Prefix for environment variables if -envflag.enable is set -eula - By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf + By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf -fs.disableMmap - Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() + Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() -http.connTimeout duration - Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) + Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) -http.disableResponseCompression - Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth + Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth -http.idleConnTimeout duration - Timeout for incoming idle http connections (default 1m0s) + Timeout for incoming idle http connections (default 1m0s) -http.maxGracefulShutdownDuration duration - The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) + The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) -http.pathPrefix string - An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus + An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus -http.shutdownDelay duration - Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers + Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers -httpAuth.password string - Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty + Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty -httpAuth.username string - Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password + Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password -httpListenAddr string - TCP address to listen for http connections (default ":8427") + TCP address to listen for http connections (default ":8427") -logInvalidAuthTokens - Whether to log requests with invalid auth tokens. Such requests are always counted at vmauth_http_request_errors_total{reason="invalid_auth_token"} metric, which is exposed at /metrics page + Whether to log requests with invalid auth tokens. Such requests are always counted at vmauth_http_request_errors_total{reason="invalid_auth_token"} metric, which is exposed at /metrics page -loggerDisableTimestamps - Whether to disable writing timestamps in logs + Whether to disable writing timestamps in logs -loggerErrorsPerSecondLimit int - Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit + Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit -loggerFormat string - Format for logs. Possible values: default, json (default "default") + Format for logs. Possible values: default, json (default "default") -loggerLevel string - Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") + Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") -loggerOutput string - Output for the logs. Supported values: stderr, stdout (default "stderr") + Output for the logs. Supported values: stderr, stdout (default "stderr") -loggerTimezone string - Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") + Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") -loggerWarnsPerSecondLimit int - Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit + Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit -maxIdleConnsPerBackend int - The maximum number of idle connections vmauth can open per each backend host (default 100) + The maximum number of idle connections vmauth can open per each backend host (default 100) -memory.allowedBytes size - Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -memory.allowedPercent float - Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) + Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) -metricsAuthKey string - Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings -pprofAuthKey string - Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings -reloadAuthKey string - Auth key for /-/reload http endpoint. It must be passed as authKey=... + Auth key for /-/reload http endpoint. It must be passed as authKey=... -tls - Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set + Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set -tlsCertFile string - Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated -tlsKeyFile string - Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated -version - Show VictoriaMetrics version + Show VictoriaMetrics version ``` diff --git a/docs/vmbackup.md b/docs/vmbackup.md index de919f2d8..f5e1b1d70 100644 --- a/docs/vmbackup.md +++ b/docs/vmbackup.md @@ -26,14 +26,13 @@ See [this article](https://medium.com/@valyala/speeding-up-backups-for-big-time- See also [vmbackupmanager](https://docs.victoriametrics.com/vmbackupmanager.html) tool built on top of `vmbackup`. This tool simplifies creation of hourly, daily, weekly and monthly backups. - ## Use cases ### Regular backups Regular backup can be performed with the following command: -``` +```bash vmbackup -storageDataPath= -snapshotName= -dst=gs:/// ``` @@ -43,36 +42,33 @@ vmbackup -storageDataPath= -snapshotName=` is an already existing name for [GCS bucket](https://cloud.google.com/storage/docs/creating-buckets). * `` is the destination path where new backup will be placed. - ### Regular backups with server-side copy from existing backup If the destination GCS bucket already contains the previous backup at `-origin` path, then new backup can be sped up with the following command: -``` +```bash vmbackup -storageDataPath= -snapshotName= -dst=gs:/// -origin=gs:/// ``` It saves time and network bandwidth costs by performing server-side copy for the shared data from the `-origin` to `-dst`. - ### Incremental backups Incremental backups are performed if `-dst` points to an already existing backup. In this case only new data is uploaded to remote storage. It saves time and network bandwidth costs when working with big backups: -``` +```bash vmbackup -storageDataPath= -snapshotName= -dst=gs:/// ``` - ### Smart backups Smart backups mean storing full daily backups into `YYYYMMDD` folders and creating incremental hourly backup into `latest` folder: * Run the following command every hour: -``` +```bash vmbackup -snapshotName= -dst=gs:///latest ``` @@ -81,13 +77,12 @@ The command will upload only changed data to `gs:///latest`. * Run the following command once a day: -``` +```bash vmbackup -snapshotName= -dst=gs:/// -origin=gs:///latest ``` Where `` is the snapshot for the last day ``. - This apporach saves network bandwidth costs on hourly backups (since they are incremental) and allows recovering data from either the last hour (`latest` backup) or from any day (`YYYYMMDD` backups). Note that hourly backup shouldn't run when creating daily backup. @@ -95,7 +90,6 @@ Do not forget to remove old snapshots and backups when they are no longer needed See also [vmbackupmanager tool](https://docs.victoriametrics.com/vmbackupmanager.html) for automating smart backups. - ## How does it work? The backup algorithm is the following: @@ -112,16 +106,15 @@ Such splitting minimizes the amounts of data to re-transfer after temporary erro `vmbackup` relies on [instant snapshot](https://medium.com/@valyala/how-victoriametrics-makes-instant-snapshots-for-multi-terabyte-time-series-data-e1f3fb0e0282) properties: -- All the files in the snapshot are immutable. -- Old files are periodically merged into new files. -- Smaller files have higher probability to be merged. -- Consecutive snapshots share many identical files. +* All the files in the snapshot are immutable. +* Old files are periodically merged into new files. +* Smaller files have higher probability to be merged. +* Consecutive snapshots share many identical files. These properties allow performing fast and cheap incremental backups and server-side copying from `-origin` paths. See [this article](https://medium.com/@valyala/speeding-up-backups-for-big-time-series-databases-533c1a927883) for more details. `vmbackup` can work improperly or slowly when these properties are violated. - ## Troubleshooting * If the backup is slow, then try setting higher value for `-concurrency` flag. This will increase the number of concurrent workers that upload data to backup storage. @@ -130,15 +123,14 @@ See [this article](https://medium.com/@valyala/speeding-up-backups-for-big-time- * Backups created from [single-node VictoriaMetrics](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html) cannot be restored at [cluster VictoriaMetrics](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html) and vice versa. - ## Advanced usage - * Obtaining credentials from a file. Add flag `-credsFilePath=/etc/credentials` with the following content: for s3 (aws, minio or other s3 compatible storages): + ```bash [default] aws_access_key_id=theaccesskey @@ -146,6 +138,7 @@ See [this article](https://medium.com/@valyala/speeding-up-backups-for-big-time- ``` for gce cloud storage: + ```json { "type": "service_account", @@ -163,7 +156,8 @@ See [this article](https://medium.com/@valyala/speeding-up-backups-for-big-time- * Usage with s3 custom url endpoint. It is possible to use `vmbackup` with s3 compatible storages like minio, cloudian, etc. You have to add a custom url endpoint via flag: -``` + +```bash # for minio -customS3Endpoint=http://localhost:9000 @@ -173,102 +167,100 @@ See [this article](https://medium.com/@valyala/speeding-up-backups-for-big-time- * Run `vmbackup -help` in order to see all the available options: -``` +```bash -concurrency int - The number of concurrent workers. Higher concurrency may reduce backup duration (default 10) + The number of concurrent workers. Higher concurrency may reduce backup duration (default 10) -configFilePath string - Path to file with S3 configs. Configs are loaded from default location if not set. - See https://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html + Path to file with S3 configs. Configs are loaded from default location if not set. + See https://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html -configProfile string - Profile name for S3 configs. If no set, the value of the environment variable will be loaded (AWS_PROFILE or AWS_DEFAULT_PROFILE), or if both not set, DefaultSharedConfigProfile is used + Profile name for S3 configs. If no set, the value of the environment variable will be loaded (AWS_PROFILE or AWS_DEFAULT_PROFILE), or if both not set, DefaultSharedConfigProfile is used -credsFilePath string - Path to file with GCS or S3 credentials. Credentials are loaded from default locations if not set. - See https://cloud.google.com/iam/docs/creating-managing-service-account-keys and https://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html + Path to file with GCS or S3 credentials. Credentials are loaded from default locations if not set. + See https://cloud.google.com/iam/docs/creating-managing-service-account-keys and https://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html -customS3Endpoint string - Custom S3 endpoint for use with S3-compatible storages (e.g. MinIO). S3 is used if not set + Custom S3 endpoint for use with S3-compatible storages (e.g. MinIO). S3 is used if not set -dst string - Where to put the backup on the remote storage. Example: gs://bucket/path/to/backup/dir, s3://bucket/path/to/backup/dir or fs:///path/to/local/backup/dir - -dst can point to the previous backup. In this case incremental backup is performed, i.e. only changed data is uploaded + Where to put the backup on the remote storage. Example: gs://bucket/path/to/backup/dir, s3://bucket/path/to/backup/dir or fs:///path/to/local/backup/dir + -dst can point to the previous backup. In this case incremental backup is performed, i.e. only changed data is uploaded -enableTCP6 - Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used + Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used -envflag.enable - Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details + Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details -envflag.prefix string - Prefix for environment variables if -envflag.enable is set + Prefix for environment variables if -envflag.enable is set -fs.disableMmap - Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() + Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() -http.connTimeout duration - Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) + Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) -http.disableResponseCompression - Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth + Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth -http.idleConnTimeout duration - Timeout for incoming idle http connections (default 1m0s) + Timeout for incoming idle http connections (default 1m0s) -http.maxGracefulShutdownDuration duration - The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) + The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) -http.pathPrefix string - An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus + An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus -http.shutdownDelay duration - Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers + Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers -httpAuth.password string - Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty + Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty -httpAuth.username string - Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password + Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password -httpListenAddr string - TCP address for exporting metrics at /metrics page (default ":8420") + TCP address for exporting metrics at /metrics page (default ":8420") -loggerDisableTimestamps - Whether to disable writing timestamps in logs + Whether to disable writing timestamps in logs -loggerErrorsPerSecondLimit int - Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit + Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit -loggerFormat string - Format for logs. Possible values: default, json (default "default") + Format for logs. Possible values: default, json (default "default") -loggerLevel string - Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") + Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") -loggerOutput string - Output for the logs. Supported values: stderr, stdout (default "stderr") + Output for the logs. Supported values: stderr, stdout (default "stderr") -loggerTimezone string - Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") + Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") -loggerWarnsPerSecondLimit int - Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit + Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit -maxBytesPerSecond size - The maximum upload speed. There is no limit if it is set to 0 - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + The maximum upload speed. There is no limit if it is set to 0 + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -memory.allowedBytes size - Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -memory.allowedPercent float - Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) + Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) -metricsAuthKey string - Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings -origin string - Optional origin directory on the remote storage with old backup for server-side copying when performing full backup. This speeds up full backups + Optional origin directory on the remote storage with old backup for server-side copying when performing full backup. This speeds up full backups -pprofAuthKey string - Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings -s3ForcePathStyle - Prefixing endpoint with bucket name when set false, true by default. (default true) + Prefixing endpoint with bucket name when set false, true by default. (default true) -snapshot.createURL string - VictoriaMetrics create snapshot url. When this is given a snapshot will automatically be created during backup. Example: http://victoriametrics:8428/snapshot/create . There is no need in setting -snapshotName if -snapshot.createURL is set + VictoriaMetrics create snapshot url. When this is given a snapshot will automatically be created during backup. Example: http://victoriametrics:8428/snapshot/create . There is no need in setting -snapshotName if -snapshot.createURL is set -snapshot.deleteURL string - VictoriaMetrics delete snapshot url. Optional. Will be generated from -snapshot.createURL if not provided. All created snapshots will be automatically deleted. Example: http://victoriametrics:8428/snapshot/delete + VictoriaMetrics delete snapshot url. Optional. Will be generated from -snapshot.createURL if not provided. All created snapshots will be automatically deleted. Example: http://victoriametrics:8428/snapshot/delete -snapshotName string - Name for the snapshot to backup. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-work-with-snapshots. There is no need in setting -snapshotName if -snapshot.createURL is set + Name for the snapshot to backup. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-work-with-snapshots. There is no need in setting -snapshotName if -snapshot.createURL is set -storageDataPath string - Path to VictoriaMetrics data. Must match -storageDataPath from VictoriaMetrics or vmstorage (default "victoria-metrics-data") + Path to VictoriaMetrics data. Must match -storageDataPath from VictoriaMetrics or vmstorage (default "victoria-metrics-data") -tls - Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set + Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set -tlsCertFile string - Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower + Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower -tlsKeyFile string - Path to file with TLS key. Used only if -tls is set + Path to file with TLS key. Used only if -tls is set -version - Show VictoriaMetrics version + Show VictoriaMetrics version ``` - ## How to build from sources It is recommended using [binary releases](https://github.com/VictoriaMetrics/VictoriaMetrics/releases) - see `vmutils-*` archives there. - ### Development build 1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.17. diff --git a/docs/vmbackupmanager.md b/docs/vmbackupmanager.md index da1c159ef..68692a85b 100644 --- a/docs/vmbackupmanager.md +++ b/docs/vmbackupmanager.md @@ -13,11 +13,10 @@ The required flags for running the service are as follows: * -eula - should be true and means that you have the legal right to run a backup manager. That can either be a signed contract or an email with confirmation to run the service in a trial period * -storageDataPath - path to VictoriaMetrics or vmstorage data path to make backup from -* -snapshot.createURL - VictoriaMetrics creates snapshot URL which will automatically be created during backup. Example: http://victoriametrics:8428/snapshot/create +* -snapshot.createURL - VictoriaMetrics creates snapshot URL which will automatically be created during backup. Example: * -dst - backup destination at s3, gcs or local filesystem * -credsFilePath - path to file with GCS or S3 credentials. Credentials are loaded from default locations if not set. See [https://cloud.google.com/iam/docs/creating-managing-service-account-keys](https://cloud.google.com/iam/docs/creating-managing-service-account-keys) and [https://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html](https://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html) - Backup schedule is controlled by the following flags: * -disableHourly - disable hourly run. Default false @@ -27,7 +26,6 @@ Backup schedule is controlled by the following flags: By default, all flags are turned on and Backup Manager backups data every hour for every interval (hourly, daily, weekly and monthly). - The backup manager creates the following directory hierarchy at **-dst**: * /latest/ - contains the latest backup @@ -36,7 +34,6 @@ The backup manager creates the following directory hierarchy at **-dst**: * /weekly/ - contains weekly backups. Each backup is named as *YYYY-WW* * /monthly/ - contains monthly backups. Each backup is named as *YYYY-MM* - To get the full list of supported flags please run the following command: ```console @@ -52,7 +49,6 @@ There are two flags which could help with performance tuning: * -maxBytesPerSecond - the maximum upload speed. There is no limit if it is set to 0 * -concurrency - The number of concurrent workers. Higher concurrency may improve upload speed (default 10) - ## Example of Usage GCS and cluster version. You need to have a credentials file in json format with following structure @@ -100,11 +96,11 @@ info VictoriaMetrics/lib/storage/storage.go:319 deleted snapshot "/vmstora The result on the GCS bucket -- The root folder +* The root folder ![root](vmbackupmanager_root_folder.png) -- The latest folder +* The latest folder ![latest](vmbackupmanager_latest_folder.png) @@ -123,7 +119,6 @@ Let’s assume we have a backup manager collecting daily backups for the past 10 ![daily](vmbackupmanager_rp_daily_1.png) - We enable backup retention policy for backup manager by using following configuration: ```console diff --git a/docs/vmctl.md b/docs/vmctl.md index b1df62e8a..a0e581dbe 100644 --- a/docs/vmctl.md +++ b/docs/vmctl.md @@ -7,18 +7,20 @@ sort: 8 VictoriaMetrics command-line tool Features: + - [x] Prometheus: migrate data from Prometheus to VictoriaMetrics using snapshot API - [x] Thanos: migrate data from Thanos to VictoriaMetrics - [ ] ~~Prometheus: migrate data from Prometheus to VictoriaMetrics by query~~(discarded) - [x] InfluxDB: migrate data from InfluxDB to VictoriaMetrics - [x] OpenTSDB: migrate data from OpenTSDB to VictoriaMetrics -- [ ] Storage Management: data re-balancing between nodes +- [ ] Storage Management: data re-balancing between nodes -vmctl acts as a proxy between data source ([Prometheus](#migrating-data-from-prometheus), +vmctl acts as a proxy between data source ([Prometheus](#migrating-data-from-prometheus), [InfluxDB](#migrating-data-from-influxdb-1x), [VictoriaMetrics](##migrating-data-from-victoriametrics), etc.) -and destination - VictoriaMetrics single or cluster version. To see the full list of supported modes +and destination - VictoriaMetrics single or cluster version. To see the full list of supported modes run the following command: -``` + +```bash ./vmctl --help NAME: vmctl - VictoriaMetrics command-line tool @@ -35,6 +37,7 @@ COMMANDS: Each mode has its own unique set of flags specific (e.g. prefixed with `influx` for influx mode) to the data source and common list of flags for destination (prefixed with `vm` for VictoriaMetrics): + ``` ./vmctl influx --help OPTIONS: @@ -50,10 +53,11 @@ Please note, that vmctl performs initial readiness check for the given address b ``` When doing a migration user needs to specify flags for source (where and how to fetch data) and for -destination (where to migrate data). Every mode has additional details and nuances, please see +destination (where to migrate data). Every mode has additional details and nuances, please see them below in corresponding sections. For the destination flags see the full description by running the following command: + ``` ./vmctl influx --help | grep vm- ``` @@ -63,14 +67,13 @@ has additional sections with description below. Details about tweaking and adjus are explained in [Tuning](#tuning) section. Please note, that if you're going to import data into VictoriaMetrics cluster do not -forget to specify the `--vm-account-id` flag. See more details for cluster version +forget to specify the `--vm-account-id` flag. See more details for cluster version [here](https://github.com/VictoriaMetrics/VictoriaMetrics/tree/cluster). ## Articles -* [How to migrate data from Prometheus](https://medium.com/@romanhavronenko/victoriametrics-how-to-migrate-data-from-prometheus-d44a6728f043) -* [How to migrate data from Prometheus. Filtering and modifying time series](https://medium.com/@romanhavronenko/victoriametrics-how-to-migrate-data-from-prometheus-filtering-and-modifying-time-series-6d40cea4bf21) - +- [How to migrate data from Prometheus](https://medium.com/@romanhavronenko/victoriametrics-how-to-migrate-data-from-prometheus-d44a6728f043) +- [How to migrate data from Prometheus. Filtering and modifying time series](https://medium.com/@romanhavronenko/victoriametrics-how-to-migrate-data-from-prometheus-filtering-and-modifying-time-series-6d40cea4bf21) ## Migrating data from OpenTSDB @@ -83,16 +86,21 @@ See `./vmctl opentsdb --help` for details and full list of flags. OpenTSDB migration works like so: 1. Find metrics based on selected filters (or the default filter set ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']) - * e.g. `curl -Ss "http://opentsdb:4242/api/suggest?type=metrics&q=sys"` + +- e.g. `curl -Ss "http://opentsdb:4242/api/suggest?type=metrics&q=sys"` + 2. Find series associated with each returned metric - * e.g. `curl -Ss "http://opentsdb:4242/api/search/lookup?m=system.load5&limit=1000000"` + +- e.g. `curl -Ss "http://opentsdb:4242/api/search/lookup?m=system.load5&limit=1000000"` + 3. Download data for each series in chunks defined in the CLI switches - * e.g. `-retention=sum-1m-avg:1h:90d` == - * `curl -Ss "http://opentsdb:4242/api/query?start=1h-ago&end=now&m=sum:1m-avg-none:system.load5\{host=host1\}"` - * `curl -Ss "http://opentsdb:4242/api/query?start=2h-ago&end=1h-ago&m=sum:1m-avg-none:system.load5\{host=host1\}"` - * `curl -Ss "http://opentsdb:4242/api/query?start=3h-ago&end=2h-ago&m=sum:1m-avg-none:system.load5\{host=host1\}"` - * ... - * `curl -Ss "http://opentsdb:4242/api/query?start=2160h-ago&end=2159h-ago&m=sum:1m-avg-none:system.load5\{host=host1\}"` + +- e.g. `-retention=sum-1m-avg:1h:90d` == + - `curl -Ss "http://opentsdb:4242/api/query?start=1h-ago&end=now&m=sum:1m-avg-none:system.load5\{host=host1\}"` + - `curl -Ss "http://opentsdb:4242/api/query?start=2h-ago&end=1h-ago&m=sum:1m-avg-none:system.load5\{host=host1\}"` + - `curl -Ss "http://opentsdb:4242/api/query?start=3h-ago&end=2h-ago&m=sum:1m-avg-none:system.load5\{host=host1\}"` + - ... + - `curl -Ss "http://opentsdb:4242/api/query?start=2160h-ago&end=2159h-ago&m=sum:1m-avg-none:system.load5\{host=host1\}"` This means that we must stream data from OpenTSDB to VictoriaMetrics in chunks. This is where concurrency for OpenTSDB comes in. We can query multiple chunks at once, but we shouldn't perform too many chunks at a time to avoid overloading the OpenTSDB cluster. @@ -111,6 +119,7 @@ Found 9 metrics to import. Continue? [Y/n] Starting with a relatively simple retention string (`sum-1m-avg:1h:30d`), let's describe how this is converted into actual queries. There are two essential parts of a retention string: + 1. [aggregation](#aggregation) 2. [windows/time ranges](#windows) @@ -119,8 +128,9 @@ There are two essential parts of a retention string: Retention strings essentially define the two levels of aggregation for our collected series. `sum-1m-avg` would become: -* First order: `sum` -* Second order: `1m-avg-none` + +- First order: `sum` +- Second order: `1m-avg-none` ##### First Order Aggregations @@ -141,6 +151,7 @@ We do not allow for defining the "null value" portion of the rollup window (e.g. #### Windows There are two important windows we define in a retention string: + 1. the "chunk" range of each query 2. The time range we will be querying on with that "chunk" @@ -186,8 +197,8 @@ See `./vmctl influx --help` for details and full list of flags. To use migration tool please specify the InfluxDB address `--influx-addr`, the database `--influx-database` and VictoriaMetrics address `--vm-addr`. Flag `--vm-addr` for single-node VM is usually equal to `--httpListenAddr`, and for cluster version -is equal to `--httpListenAddr` flag of vminsert component. Please note, that vmctl performs initial readiness check for the given address -by checking `/health` endpoint. For cluster version it is additionally required to specify the `--vm-account-id` flag. +is equal to `--httpListenAddr` flag of vminsert component. Please note, that vmctl performs initial readiness check for the given address +by checking `/health` endpoint. For cluster version it is additionally required to specify the `--vm-account-id` flag. See more details for cluster version [here](https://github.com/VictoriaMetrics/VictoriaMetrics/tree/cluster). As soon as required flags are provided and all endpoints are accessible, `vmctl` will start the InfluxDB scheme exploration. @@ -195,8 +206,9 @@ Basically, it just fetches all fields and timeseries from the provided database Then `vmctl` sends fetch requests for each timeseries to InfluxDB one by one and pass results to VM importer. VM importer then accumulates received samples in batches and sends import requests to VM. -The importing process example for local installation of InfluxDB(`http://localhost:8086`) +The importing process example for local installation of InfluxDB(`http://localhost:8086`) and single-node VictoriaMetrics(`http://localhost:8428`): + ``` ./vmctl influx --influx-database benchmark InfluxDB import mode @@ -216,25 +228,27 @@ Found 40000 timeseries to import. Continue? [Y/n] y bytes/s: 5.4 MB; import requests: 40001; 2020/01/18 21:19:00 Total time: 31m48.467044016s -``` +``` ### Data mapping Vmctl maps InfluxDB data the same way as VictoriaMetrics does by using the following rules: -* `influx-database` arg is mapped into `db` label value unless `db` tag exists in the InfluxDB line. -* Field names are mapped to time series names prefixed with {measurement}{separator} value, -where {separator} equals to _ by default. +- `influx-database` arg is mapped into `db` label value unless `db` tag exists in the InfluxDB line. +- Field names are mapped to time series names prefixed with {measurement}{separator} value, +where {separator} equals to _ by default. It can be changed with `--influx-measurement-field-separator` command-line flag. -* Field values are mapped to time series values. -* Tags are mapped to Prometheus labels format as-is. +- Field values are mapped to time series values. +- Tags are mapped to Prometheus labels format as-is. For example, the following InfluxDB line: + ``` foo,tag1=value1,tag2=value2 field1=12,field2=40 ``` is converted into the following Prometheus format data points: + ``` foo_field1{tag1="value1", tag2="value2"} 12 foo_field2{tag1="value1", tag2="value2"} 40 @@ -242,7 +256,7 @@ foo_field2{tag1="value1", tag2="value2"} 40 ### Configuration -The configuration flags should contain self-explanatory descriptions. +The configuration flags should contain self-explanatory descriptions. ### Filtering @@ -250,6 +264,7 @@ The filtering consists of two parts: timeseries and time. The first step of application is to select all available timeseries for given database and retention. User may specify additional filtering condition via `--influx-filter-series` flag. For example: + ``` ./vmctl influx --influx-database benchmark \ --influx-filter-series "on benchmark from cpu where hostname='host_1703'" @@ -260,13 +275,15 @@ InfluxDB import mode 2020/01/26 14:23:29 fetching series: command: "show series on benchmark from cpu where hostname='host_1703'"; database: "benchmark"; retention: "autogen" Found 10 timeseries to import. Continue? [Y/n] ``` + The timeseries select query would be following: `fetching series: command: "show series on benchmark from cpu where hostname='host_1703'"; database: "benchmark"; retention: "autogen"` - + The second step of filtering is a time filter and it applies when fetching the datapoints from Influx. Time filtering may be configured with two flags: -* --influx-filter-time-start -* --influx-filter-time-end + +- --influx-filter-time-start +- --influx-filter-time-end Here's an example of importing timeseries for one day only: `./vmctl influx --influx-database benchmark --influx-filter-series "where hostname='host_1703'" --influx-filter-time-start "2020-01-01T10:07:00Z" --influx-filter-time-end "2020-01-01T15:07:00Z"` @@ -275,36 +292,36 @@ Please see more about time filtering [here](https://docs.influxdata.com/influxdb ## Migrating data from InfluxDB (2.x) Migrating data from InfluxDB v2.x is not supported yet ([#32](https://github.com/VictoriaMetrics/vmctl/issues/32)). -You may find useful a 3rd party solution for this - https://github.com/jonppe/influx_to_victoriametrics. - +You may find useful a 3rd party solution for this - . ## Migrating data from Prometheus `vmctl` supports the `prometheus` mode for migrating data from Prometheus to VictoriaMetrics time-series database. -Migration is based on reading Prometheus snapshot, which is basically a hard-link to Prometheus data files. +Migration is based on reading Prometheus snapshot, which is basically a hard-link to Prometheus data files. See `./vmctl prometheus --help` for details and full list of flags. Also see Prometheus related articles [here](#articles). To use migration tool please specify the file path to Prometheus snapshot `--prom-snapshot` (see how to make a snapshot [here](https://www.robustperception.io/taking-snapshots-of-prometheus-data)) and VictoriaMetrics address `--vm-addr`. Please note, that `vmctl` *do not make a snapshot from Prometheus*, it uses an already prepared snapshot. More about Prometheus snapshots may be found [here](https://www.robustperception.io/taking-snapshots-of-prometheus-data) and [here](https://medium.com/@romanhavronenko/victoriametrics-how-to-migrate-data-from-prometheus-d44a6728f043). Flag `--vm-addr` for single-node VM is usually equal to `--httpListenAddr`, and for cluster version -is equal to `--httpListenAddr` flag of vminsert component. Please note, that vmctl performs initial readiness check for the given address -by checking `/health` endpoint. For cluster version it is additionally required to specify the `--vm-account-id` flag. +is equal to `--httpListenAddr` flag of vminsert component. Please note, that vmctl performs initial readiness check for the given address +by checking `/health` endpoint. For cluster version it is additionally required to specify the `--vm-account-id` flag. See more details for cluster version [here](https://github.com/VictoriaMetrics/VictoriaMetrics/tree/cluster). As soon as required flags are provided and all endpoints are accessible, `vmctl` will start the Prometheus snapshot exploration. Basically, it just fetches all available blocks in provided snapshot and read the metadata. It also does initial filtering by time if flags `--prom-filter-time-start` or `--prom-filter-time-end` were set. The exploration procedure prints some stats from read blocks. Please note that stats are not taking into account timeseries or samples filtering. This will be done during importing process. - + The importing process takes the snapshot blocks revealed from Explore procedure and processes them one by one accumulating timeseries and samples. Please note, that `vmctl` relies on responses from InfluxDB on this stage, -so ensure that Explore queries are executed without errors or limits. Please see this +so ensure that Explore queries are executed without errors or limits. Please see this [issue](https://github.com/VictoriaMetrics/vmctl/issues/30) for details. The data processed in chunks and then sent to VM. -The importing process example for local installation of Prometheus +The importing process example for local installation of Prometheus and single-node VictoriaMetrics(`http://localhost:8428`): + ``` ./vmctl prometheus --prom-snapshot=/path/to/snapshot \ --vm-concurrency=1 \ @@ -331,7 +348,7 @@ Found 14 blocks to import. Continue? [Y/n] y import requests: 323; import requests retries: 0; 2020/02/23 15:50:03 Total time: 51.077451066s -``` +``` ### Data mapping @@ -340,7 +357,7 @@ So no data changes will be applied. ### Configuration -The configuration flags should contain self-explanatory descriptions. +The configuration flags should contain self-explanatory descriptions. ### Filtering @@ -351,6 +368,7 @@ in in RFC3339 format. This filter applied twice: to drop blocks out of range and overlapping time range. Example of applying time filter: + ``` ./vmctl prometheus --prom-snapshot=/path/to/snapshot \ --prom-filter-time-start=2020-02-07T00:07:01Z \ @@ -370,12 +388,13 @@ Please notice, that total amount of blocks in provided snapshot is 14, but only time range. So other 12 blocks were marked as `skipped`. The amount of samples and series is not taken into account, since this is heavy operation and will be done during import process. +Filtering by timeseries is configured with following flags: -Filtering by timeseries is configured with following flags: -* `--prom-filter-label` - the label name, e.g. `__name__` or `instance`; -* `--prom-filter-label-value` - the regular expression to filter the label value. By default matches all `.*` +- `--prom-filter-label` - the label name, e.g. `__name__` or `instance`; +- `--prom-filter-label-value` - the regular expression to filter the label value. By default matches all `.*` For example: + ``` ./vmctl prometheus --prom-snapshot=/path/to/snapshot \ --prom-filter-label="__name__" \ @@ -409,38 +428,44 @@ Found 2 blocks to import. Continue? [Y/n] y Thanos uses the same storage engine as Prometheus and the data layout on-disk should be the same. That means `vmctl` in mode `prometheus` may be used for Thanos historical data migration as well. -These instructions may vary based on the details of your Thanos configuration. -Please read carefully and verify as you go. We assume you're using Thanos Sidecar on your Prometheus pods, +These instructions may vary based on the details of your Thanos configuration. +Please read carefully and verify as you go. We assume you're using Thanos Sidecar on your Prometheus pods, and that you have a separate Thanos Store installation. ### Current data -1. For now, keep your Thanos Sidecar and Thanos-related Prometheus configuration, but add this to also stream +1. For now, keep your Thanos Sidecar and Thanos-related Prometheus configuration, but add this to also stream metrics to VictoriaMetrics: + ``` remote_write: - url: http://victoria-metrics:8428/api/v1/write ``` -2. Make sure VM is running, of course. Now check the logs to make sure that Prometheus is sending and VM is receiving. + +2. Make sure VM is running, of course. Now check the logs to make sure that Prometheus is sending and VM is receiving. In Prometheus, make sure there are no errors. On the VM side, you should see messages like this: + ``` - 2020-04-27T18:38:46.474Z info VictoriaMetrics/lib/storage/partition.go:207 creating a partition "2020_04" with smallPartsPath="/victoria-metrics-data/data/small/2020_04", bigPartsPath="/victoria-metrics-data/data/big/2020_04" - 2020-04-27T18:38:46.506Z info VictoriaMetrics/lib/storage/partition.go:222 partition "2020_04" has been created + 2020-04-27T18:38:46.474Z info VictoriaMetrics/lib/storage/partition.go:207 creating a partition "2020_04" with smallPartsPath="/victoria-metrics-data/data/small/2020_04", bigPartsPath="/victoria-metrics-data/data/big/2020_04" + 2020-04-27T18:38:46.506Z info VictoriaMetrics/lib/storage/partition.go:222 partition "2020_04" has been created ``` + 3. Now just wait. Within two hours, Prometheus should finish its current data file and hand it off to Thanos Store for long term storage. ### Historical data -Let's assume your data is stored on S3 served by minio. You first need to copy that out to a local filesystem, +Let's assume your data is stored on S3 served by minio. You first need to copy that out to a local filesystem, then import it into VM using `vmctl` in `prometheus` mode. + 1. Copy data from minio. 1. Run the `minio/mc` Docker container. 1. `mc config host add minio http://minio:9000 accessKey secretKey`, substituting appropriate values for the last 3 items. 1. `mc cp -r minio/prometheus thanos-data` 1. Import using `vmctl`. 1. Follow the [instructions](#how-to-build) to compile `vmctl` on your machine. - 1. Use [prometheus](#migrating-data-from-prometheus) mode to import data: + 1. Use [prometheus](#migrating-data-from-prometheus) mode to import data: + ``` vmctl prometheus --prom-snapshot thanos-data --vm-addr http://victoria-metrics:8428 ``` @@ -457,8 +482,8 @@ or higher. See `./vmctl vm-native --help` for details and full list of flags. -In this mode `vmctl` acts as a proxy between two VM instances, where time series filtering is done by "source" (`src`) -and processing is done by "destination" (`dst`). Because of that, `vmctl` doesn't actually know how much data will be +In this mode `vmctl` acts as a proxy between two VM instances, where time series filtering is done by "source" (`src`) +and processing is done by "destination" (`dst`). Because of that, `vmctl` doesn't actually know how much data will be processed and can't show the progress bar. It will show the current processing speed and total number of processed bytes: ``` @@ -472,14 +497,15 @@ Initing export pipe from "http://localhost:8528" with filters: Initing import process to "http://localhost:8428": Total: 336.75 KiB ↖ Speed: 454.46 KiB p/s 2020/10/13 17:04:59 Total time: 952.143376ms -``` +``` Importing tips: -1. Migrating all the metrics from one VM to another may collide with existing application metrics -(prefixed with `vm_`) at destination and lead to confusion when using -[official Grafana dashboards](https://grafana.com/orgs/victoriametrics/dashboards). + +1. Migrating all the metrics from one VM to another may collide with existing application metrics +(prefixed with `vm_`) at destination and lead to confusion when using +[official Grafana dashboards](https://grafana.com/orgs/victoriametrics/dashboards). To avoid such situation try to filter out VM process metrics via `--vm-native-filter-match` flag. -2. Migration is a backfilling process, so it is recommended to read +2. Migration is a backfilling process, so it is recommended to read [Backfilling tips](https://github.com/VictoriaMetrics/VictoriaMetrics#backfilling) section. 3. `vmctl` doesn't provide relabeling or other types of labels management in this mode. Instead, use [relabeling in VictoriaMetrics](https://github.com/VictoriaMetrics/vmctl/issues/4#issuecomment-683424375). @@ -495,7 +521,7 @@ timeseries. Please set it wisely to avoid InfluxDB overwhelming. The flag `--influx-chunk-size` controls the max amount of datapoints to return in single chunk from fetch requests. Please see more details [here](https://docs.influxdata.com/influxdb/v1.7/guides/querying_data/#chunking). -The chunk size is used to control InfluxDB memory usage, so it won't OOM on processing large timeseries with +The chunk size is used to control InfluxDB memory usage, so it won't OOM on processing large timeseries with billions of datapoints. ### Prometheus mode @@ -511,17 +537,18 @@ Please note that each import request can load up to a single vCPU core on Victor to allocated CPU resources of your VictoriMetrics installation. The flag `--vm-batch-size` controls max amount of samples collected before sending the import request. -For example, if `--influx-chunk-size=500` and `--vm-batch-size=2000` then importer will process not more -than 4 chunks before sending the request. +For example, if `--influx-chunk-size=500` and `--vm-batch-size=2000` then importer will process not more +than 4 chunks before sending the request. ### Importer stats -After successful import `vmctl` prints some statistics for details. +After successful import `vmctl` prints some statistics for details. The important numbers to watch are following: - - `idle duration` - shows time that importer spent while waiting for data from InfluxDB/Prometheus + +- `idle duration` - shows time that importer spent while waiting for data from InfluxDB/Prometheus to fill up `--vm-batch-size` batch size. Value shows total duration across all workers configured via `--vm-concurrency`. High value may be a sign of too slow InfluxDB/Prometheus fetches or too -high `--vm-concurrency` value. Try to improve it by increasing `---concurrency` value or +high `--vm-concurrency` value. Try to improve it by increasing `---concurrency` value or decreasing `--vm-concurrency` value. - `import requests` - shows how many import requests were issued to VM server. The import request is issued once the batch size(`--vm-batch-size`) is full and ready to be sent. @@ -533,6 +560,7 @@ a sign of network issues or VM being overloaded. See the logs during import for By default `vmctl` waits confirmation from user before starting the import. If this is unwanted behavior and no user interaction required - pass `-s` flag to enable "silence" mode: + ``` -s Whether to run in silent mode. If set to true no confirmation prompts will appear. (default: false) ``` @@ -541,18 +569,18 @@ behavior and no user interaction required - pass `-s` flag to enable "silence" m `vmctl` allows to limit the number of [significant figures](https://en.wikipedia.org/wiki/Significant_figures) before importing. For example, the average value for response size is `102.342305` bytes and it has 9 significant figures. -If you ask a human to pronounce this value then with high probability value will be rounded to first 4 or 5 figures -because the rest aren't really that important to mention. In most cases, such a high precision is too much. -Moreover, such values may be just a result of [floating point arithmetic](https://en.wikipedia.org/wiki/Floating-point_arithmetic), -create a [false precision](https://en.wikipedia.org/wiki/False_precision) and result into bad compression ratio -according to [information theory](https://en.wikipedia.org/wiki/Information_theory). +If you ask a human to pronounce this value then with high probability value will be rounded to first 4 or 5 figures +because the rest aren't really that important to mention. In most cases, such a high precision is too much. +Moreover, such values may be just a result of [floating point arithmetic](https://en.wikipedia.org/wiki/Floating-point_arithmetic), +create a [false precision](https://en.wikipedia.org/wiki/False_precision) and result into bad compression ratio +according to [information theory](https://en.wikipedia.org/wiki/Information_theory). `vmctl` provides the following flags for improving data compression: -* `--vm-round-digits` flag for rounding processed values to the given number of decimal digits after the point. +- `--vm-round-digits` flag for rounding processed values to the given number of decimal digits after the point. For example, `--vm-round-digits=2` would round `1.2345` to `1.23`. By default the rounding is disabled. -* `--vm-significant-figures` flag for limiting the number of significant figures in processed values. It takes no effect if set +- `--vm-significant-figures` flag for limiting the number of significant figures in processed values. It takes no effect if set to 0 (by default), but set `--vm-significant-figures=5` and `102.342305` will be rounded to `102.34`. The most common case for using these flags is to improve data compression for time series storing aggregation @@ -560,7 +588,7 @@ results such as `average`, `rate`, etc. ### Adding extra labels - `vmctl` allows to add extra labels to all imported series. It can be achived with flag `--vm-extra-label label=value`. + `vmctl` allows to add extra labels to all imported series. It can be achived with flag `--vm-extra-label label=value`. If multiple labels needs to be added, set flag for each label, for example, `--vm-extra-label label1=value1 --vm-extra-label label2=value2`. If timeseries already have label, that must be added with `--vm-extra-label` flag, flag has priority and will override label value from timeseries. @@ -569,15 +597,13 @@ results such as `average`, `rate`, etc. Limiting the rate of data transfer could help to reduce pressure on disk or on destination database. The rate limit may be set in bytes-per-second via `--vm-rate-limit` flag. -Please note, you can also use [vmagent](https://docs.victoriametrics.com/vmagent.html) +Please note, you can also use [vmagent](https://docs.victoriametrics.com/vmagent.html) as a proxy between `vmctl` and destination with `-remoteWrite.rateLimit` flag enabled. - ## How to build It is recommended using [binary releases](https://github.com/VictoriaMetrics/VictoriaMetrics/releases) - `vmctl` is located in `vmutils-*` archives there. - ### Development build 1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.17. diff --git a/docs/vmgateway.md b/docs/vmgateway.md index 6ab4ec2ef..a80e96a2c 100644 --- a/docs/vmgateway.md +++ b/docs/vmgateway.md @@ -6,7 +6,6 @@ sort: 9 ***vmgateway is a part of [enterprise package](https://victoriametrics.com/products/enterprise/). It is available for download and evaluation at [releases page](https://github.com/VictoriaMetrics/VictoriaMetrics/releases)*** - vmgateway `vmgateway` is a proxy for the VictoriaMetrics Time Series Database (TSDB). It provides the following features: @@ -20,7 +19,6 @@ sort: 9 `vmgateway` is included in our [enterprise packages](https://victoriametrics.com/products/enterprise/). - ## Access Control vmgateway-ac @@ -28,6 +26,7 @@ sort: 9 `vmgateway` supports jwt based authentication. With jwt payload can be configured to give access to specific tenants and labels as well as to read/write. jwt token must be in following format: + ```json { "exp": 1617304574, @@ -45,13 +44,15 @@ jwt token must be in following format: } } ``` + Where: -- `exp` - required, expire time in unix_timestamp. If the token expires then `vmgateway` rejects the request. -- `vm_access` - required, dict with claim info, minimum form: `{"vm_access": {"tenand_id": {}}` -- `tenant_id` - optional, for cluster mode, routes requests to the corresponding tenant. -- `extra_labels` - optional, key-value pairs for label filters added to the ingested or selected metrics. Multiple filters are added with `and` operation. If defined, `extra_label` from original request removed. -- `extra_filters` - optional, [series selectors](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors) added to the select query requests. Multiple selectors are added with `or` operation. If defined, `extra_filter` from original request removed. -- `mode` - optional, access mode for api - read, write, or full. Supported values: 0 - full (default value), 1 - read, 2 - write. + +* `exp` - required, expire time in unix_timestamp. If the token expires then `vmgateway` rejects the request. +* `vm_access` - required, dict with claim info, minimum form: `{"vm_access": {"tenand_id": {}}` +* `tenant_id` - optional, for cluster mode, routes requests to the corresponding tenant. +* `extra_labels` - optional, key-value pairs for label filters added to the ingested or selected metrics. Multiple filters are added with `and` operation. If defined, `extra_label` from original request removed. +* `extra_filters` - optional, [series selectors](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors) added to the select query requests. Multiple selectors are added with `or` operation. If defined, `extra_filter` from original request removed. +* `mode` - optional, access mode for api - read, write, or full. Supported values: 0 - full (default value), 1 - read, 2 - write. ## QuickStart @@ -70,18 +71,19 @@ Start vmgateway ``` Retrieve data from the database + ```bash curl 'http://localhost:8431/api/v1/series/count' -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ2bV9hY2Nlc3MiOnsidGVuYW50X2lkIjp7fSwicm9sZSI6MX0sImV4cCI6MTkzOTM0NjIxMH0.5WUxEfdcV9hKo4CtQdtuZYOGpGXWwaqM9VuVivMMrVg' ``` A request with an incorrect token or without any token will be rejected: + ```bash curl 'http://localhost:8431/api/v1/series/count' curl 'http://localhost:8431/api/v1/series/count' -H 'Authorization: Bearer incorrect-token' ``` - ## Rate Limiter vmgateway-rl @@ -92,14 +94,16 @@ Limits incoming requests by given, pre-configured limits. It supports read and w The metrics that you want to rate limit must be scraped from the cluster. List of supported limit types: -- `queries` - count of api requests made at tenant to read the api, such as `/api/v1/query`, `/api/v1/series` and others. -- `active_series` - count of current active series at any given tenant. -- `new_series` - count of created series; aka churn rate -- `rows_inserted` - count of inserted rows per tenant. + +* `queries` - count of api requests made at tenant to read the api, such as `/api/v1/query`, `/api/v1/series` and others. +* `active_series` - count of current active series at any given tenant. +* `new_series` - count of created series; aka churn rate +* `rows_inserted` - count of inserted rows per tenant. List of supported time windows: -- `minute` -- `hour` + +* `minute` +* `hour` Limits can be specified per tenant or at a global level if you omit `project_id` and `account_id`. @@ -123,6 +127,7 @@ limits: ## QuickStart cluster version of VictoriaMetrics is required for rate limiting. + ```bash # start datasource for cluster metrics @@ -173,6 +178,7 @@ curl 'http://localhost:8431/api/v1/labels' -H 'Authorization: Bearer eyJhbGciOiJ ## Configuration The shortlist of configuration flags include the following: + ```console -clusterMode enable this for the cluster version @@ -280,12 +286,11 @@ The shortlist of configuration flags include the following: ## TroubleShooting * Access control: - * incorrect `jwt` format, try https://jwt.io/#debugger-io with our tokens + * incorrect `jwt` format, try with our tokens * expired token, check `exp` field. * Rate Limiting: * `scrape_interval` at datasource, reduce it to apply limits faster. - ## Limitations * Access Control: diff --git a/docs/vmrestore.md b/docs/vmrestore.md index d52e53c72..b70a290b7 100644 --- a/docs/vmrestore.md +++ b/docs/vmrestore.md @@ -10,12 +10,11 @@ VictoriaMetrics `v1.29.0` and newer versions must be used for working with the r Restore process can be interrupted at any time. It is automatically resumed from the interruption point when restarting `vmrestore` with the same args. - ## Usage VictoriaMetrics must be stopped during the restore process. -``` +```bash vmrestore -src=gs:/// -storageDataPath= ``` @@ -28,13 +27,11 @@ vmrestore -src=gs:/// -storageDataPath= +snap link: #### develop @@ -11,19 +10,18 @@ Install snapcraft or docker build snap package with command - ```text + ```bash make build-snap ``` It produces snap package with current git version - `victoriametrics_v1.46.0+git1.1bebd021a-dirty_all.snap`. You can install it with command: `snap install victoriametrics_v1.46.0+git1.1bebd021a-dirty_all.snap --dangerous` - -#### usage +#### usage installation and configuration: -```text +```bash # install snap install victoriametrics # logs @@ -35,13 +33,16 @@ snap logs victoriametrics Configuration management: Prometheus scrape config can be edited with your favorite editor, its located at -```text + +```bash vi /var/snap/victoriametrics/current/etc/victoriametrics-scrape-config.yaml ``` + after changes, you can trigger config reread with `curl localhost:8248/-/reload`. Configuration tuning is possible with editing extra_flags: -```text + +```bash echo 'FLAGS="-selfScrapeInterval=10s -search.logSlowQueryDuration=20s"' > /var/snap/victoriametrics/current/extra_flags snap restart victoriametrics ``` From b421a1f57b51e8d27aa0c3c74b0db429e802df86 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Tue, 22 Mar 2022 13:55:40 +0200 Subject: [PATCH 09/16] docs/Cluster-VictoriaMetrics.md: clarify mTLS protection docs --- docs/Cluster-VictoriaMetrics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Cluster-VictoriaMetrics.md b/docs/Cluster-VictoriaMetrics.md index 8122dbedb..581cce9f6 100644 --- a/docs/Cluster-VictoriaMetrics.md +++ b/docs/Cluster-VictoriaMetrics.md @@ -153,7 +153,7 @@ It is possible manualy setting up a toy cluster on a single host. In this case e ## mTLS protection -By default `vminsert` and `vmselect` nodes use unencrypted connections to `vmstorage` nodes, since it is assumed that all the cluster components run in a protected environment. [Enterprise version of VictoriaMetrics](https://victoriametrics.com/products/enterprise/) provides optional support for [mTLS connections](https://en.wikipedia.org/wiki/Mutual_authentication#mTLS) between cluster components. Pass `-cluster.tls=true` command-line flag to `vminsert`, `vmselect` and `vmstorage` nodes in order to enable mTLS protection. Additionally, `vminsert` and `vmselect` must be configured with client-side certificates via `-cluster.tlsCertFile`, `-cluster.tlsKeyFile` command-line options. These certificates are verified by `vmstorage` when `vminsert` and `vmselect` dial `vmstorage`. An optional `-cluster.tlsCAFile` command-line flag can be set at `vminsert`, `vmselect` and `vmstorage` for verifying peer certificates issued with custom [certificate authority](https://en.wikipedia.org/wiki/Certificate_authority). +By default `vminsert` and `vmselect` nodes use unencrypted connections to `vmstorage` nodes, since it is assumed that all the cluster components run in a protected environment. [Enterprise version of VictoriaMetrics](https://victoriametrics.com/products/enterprise/) provides optional support for [mTLS connections](https://en.wikipedia.org/wiki/Mutual_authentication#mTLS) between cluster components. Pass `-cluster.tls=true` command-line flag to `vminsert`, `vmselect` and `vmstorage` nodes in order to enable mTLS protection. Additionally, `vminsert`, `vmselect` and `vmstorage` must be configured with mTLS certificates via `-cluster.tlsCertFile`, `-cluster.tlsKeyFile` command-line options. These certificates are mutually verified when `vminsert` and `vmselect` dial `vmstorage`. An optional `-cluster.tlsCAFile` command-line flag can be set at `vminsert`, `vmselect` and `vmstorage` for verifying peer certificates issued with custom [certificate authority](https://en.wikipedia.org/wiki/Certificate_authority). ### Environment variables From c8f356a6a802a3e382627cba52ba8307920b3349 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Tue, 22 Mar 2022 14:11:18 +0200 Subject: [PATCH 10/16] app: sync Markdown changes from a8de1ab00069bfbb69e67ec142a84c4fa541fbfd --- app/vmagent/README.md | 400 ++++++++++++++++------------------ app/vmalert/README.md | 390 +++++++++++++++++---------------- app/vmauth/README.md | 80 +++---- app/vmbackup/README.md | 128 +++++------ app/vmbackupmanager/README.md | 11 +- app/vmctl/README.md | 180 ++++++++------- app/vmgateway/README.md | 39 ++-- app/vmrestore/README.md | 100 +++++---- 8 files changed, 669 insertions(+), 659 deletions(-) diff --git a/app/vmagent/README.md b/app/vmagent/README.md index 48f1a3d73..ca94f705f 100644 --- a/app/vmagent/README.md +++ b/app/vmagent/README.md @@ -6,7 +6,6 @@ or any other Prometheus-compatible storage systems that support the `remote_writ vmagent - ## Motivation While VictoriaMetrics provides an efficient solution to store and observe metrics, our users needed something fast @@ -14,7 +13,6 @@ and RAM friendly to scrape metrics from Prometheus-compatible exporters into Vic Also, we found that our user's infrastructure are like snowflakes in that no two are alike. Therefore we decided to add more flexibility to `vmagent` such as the ability to push metrics additionally to pulling them. We did our best and will continue to improve `vmagent`. - ## Features * Can be used as a drop-in replacement for Prometheus for scraping targets such as [node_exporter](https://github.com/prometheus/node_exporter). See [Quick Start](#quick-start) for details. @@ -67,7 +65,6 @@ Then send InfluxDB data to `http://vmagent-host:8429`. See [these docs](https:// Pass `-help` to `vmagent` in order to see [the full list of supported command-line flags with their descriptions](#advanced-usage). - ## Configuration update `vmagent` should be restarted in order to update config options set via command-line args. @@ -75,6 +72,7 @@ Pass `-help` to `vmagent` in order to see [the full list of supported command-li `vmagent` supports multiple approaches for reloading configs from updated config files such as `-promscrape.config`, `-remoteWrite.relabelConfig` and `-remoteWrite.urlRelabelConfig`: * Sending `SUGHUP` signal to `vmagent` process: + ```bash kill -SIGHUP `pidof vmagent` ``` @@ -83,10 +81,8 @@ Pass `-help` to `vmagent` in order to see [the full list of supported command-li There is also `-promscrape.configCheckInterval` command-line option, which can be used for automatic reloading configs from updated `-promscrape.config` file. - ## Use cases - ### IoT and Edge monitoring `vmagent` can run and collect metrics in IoT and industrial networks with unreliable or scheduled connections to their remote storage. @@ -97,28 +93,24 @@ The maximum buffer size can be limited with `-remoteWrite.maxDiskUsagePerURL`. `vmagent` works on various architectures from the IoT world - 32-bit arm, 64-bit arm, ppc64, 386, amd64. See [the corresponding Makefile rules](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/app/vmagent/Makefile) for details. - ### Drop-in replacement for Prometheus If you use Prometheus only for scraping metrics from various targets and forwarding those metrics to remote storage then `vmagent` can replace Prometheus. Typically, `vmagent` requires lower amounts of RAM, CPU and network bandwidth compared with Prometheus. See [these docs](#how-to-collect-metrics-in-prometheus-format) for details. - ### Replication and high availability `vmagent` replicates the collected metrics among multiple remote storage instances configured via `-remoteWrite.url` args. If a single remote storage instance temporarily is out of service, then the collected data remains available in another remote storage instance. `vmagent` buffers the collected data in files at `-remoteWrite.tmpDataPath` until the remote storage becomes available again and then it sends the buffered data to the remote storage in order to prevent data gaps. - ### Relabeling and filtering `vmagent` can add, remove or update labels on the collected data before sending it to the remote storage. Additionally, it can remove unwanted samples via Prometheus-like relabeling before sending the collected data to remote storage. Please see [these docs](#relabeling) for details. - ### Splitting data streams among multiple systems `vmagent` supports splitting the collected data between muliple destinations with the help of `-remoteWrite.urlRelabelConfig`, @@ -126,7 +118,6 @@ which is applied independently for each configured `-remoteWrite.url` destinatio data among long-term remote storage, short-term remote storage and a real-time analytical system [built on top of Kafka](https://github.com/Telefonica/prometheus-kafka-adapter). Note that each destination can receive it's own subset of the collected data due to per-destination relabeling via `-remoteWrite.urlRelabelConfig`. - ### Prometheus remote_write proxy `vmagent` can be used as a proxy for Prometheus data sent via Prometheus `remote_write` protocol. It can accept data via the `remote_write` API @@ -134,7 +125,6 @@ at the`/api/v1/write` endpoint. Then apply relabeling and filtering and proxy it The `vmagent` can be configured to encrypt the incoming `remote_write` requests with `-tls*` command-line flags. Also, Basic Auth can be enabled for the incoming `remote_write` requests with `-httpAuth.*` command-line flags. - ### remote_write for clustered version While `vmagent` can accept data in several supported protocols (OpenTSDB, Influx, Prometheus, Graphite) and scrape data from various targets, writes are always peformed in Promethes remote_write protocol. Therefore for the [clustered version](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html), `-remoteWrite.url` the command-line flag should be configured as `://:8480/insert//prometheus/api/v1/write` according to [these docs](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format). There is also support for multitenant writes. See [these docs](#multitenancy). @@ -143,7 +133,6 @@ While `vmagent` can accept data in several supported protocols (OpenTSDB, Influx By default `vmagent` collects the data without tenant identifiers and routes it to the configured `-remoteWrite.url`. But it can accept multitenant data if `-remoteWrite.multitenantURL` is set. In this case it accepts multitenant data at `http://vmagent:8429/insert//...` in the same way as cluster version of VictoriaMetrics does according to [these docs](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) and routes it to `<-remoteWrite.multitenantURL>/insert//prometheus/api/v1/write`. If multiple `-remoteWrite.multitenantURL` command-line options are set, then `vmagent` replicates the collected data across all the configured urls. This allows using a single `vmagent` instance in front of VictoriaMetrics clusters for processing the data from all the tenants. - ## How to collect metrics in Prometheus format Specify the path to `prometheus.yml` file via `-promscrape.config` command-line flag. `vmagent` takes into account the following @@ -211,7 +200,6 @@ entries to 60s. Run `vmagent -help` in order to see default values for the `-pro The file pointed by `-promscrape.config` may contain `%{ENV_VAR}` placeholders which are substituted by the corresponding `ENV_VAR` environment variable values. - ## Loading scrape configs from multiple files `vmagent` supports loading scrape configs from multiple files specified in the `scrape_config_files` section of `-promscrape.config` file. For example, the following `-promscrape.config` instructs `vmagent` loading scrape configs from all the `*.yml` files under `configs` directory, from `single_scrape_config.yml` local file and from `https://config-server/scrape_config.yml` url: @@ -236,7 +224,6 @@ Every referred file can contain arbitrary number of [supported scrape configs](# `vmagent` dynamically reloads these files on `SIGHUP` signal or on the request to `http://vmagent:8429/-/reload`. - ## Unsupported Prometheus config sections `vmagent` doesn't support the following sections in Prometheus config file passed to `-promscrape.config` command-line flag: @@ -249,7 +236,6 @@ The list of supported service discovery types is available [here](#how-to-collec Additionally `vmagent` doesn't support `refresh_interval` option at service discovery sections. This option is substituted with `-promscrape.*CheckInterval` command-line options, which are specific per each service discovery type. See [the full list of command-line flags for vmagent](#advanced-usage). - ## Adding labels to metrics Labels can be added to metrics by the following mechanisms: @@ -261,7 +247,6 @@ Labels can be added to metrics by the following mechanisms: /path/to/vmagent -remoteWrite.label=datacenter=foobar ... ``` - ## Relabeling VictoriaMetrics components (including `vmagent`) support Prometheus-compatible relabeling. @@ -320,7 +305,6 @@ You can read more about relabeling in the following articles: * [Extracting labels from legacy metric names](https://www.robustperception.io/extracting-labels-from-legacy-metric-names) * [relabel_configs vs metric_relabel_configs](https://www.robustperception.io/relabel_configs-vs-metric_relabel_configs) - ## Prometheus staleness markers `vmagent` sends [Prometheus staleness markers](https://www.robustperception.io/staleness-and-promql) to `-remoteWrite.url` in the following cases: @@ -332,16 +316,15 @@ You can read more about relabeling in the following articles: Prometheus staleness markers' tracking needs additional memory, since it must store the previous response body per each scrape target in order to compare it to the current response body. The memory usage may be reduced by passing `-promscrape.noStaleMarkers` command-line flag to `vmagent`. This disables staleness tracking. This also disables tracking the number of new time series per each scrape with the auto-generated `scrape_series_added` metric. See [these docs](https://prometheus.io/docs/concepts/jobs_instances/#automatically-generated-labels-and-time-series) for details. - ## Stream parsing mode By default `vmagent` reads the full response body from scrape target into memory, then parses it, applies [relabeling](#relabeling) and then pushes the resulting metrics to the configured `-remoteWrite.url`. This mode works good for the majority of cases when the scrape target exposes small number of metrics (e.g. less than 10 thousand). But this mode may take big amounts of memory when the scrape target exposes big number of metrics. In this case it is recommended enabling stream parsing mode. When this mode is enabled, then `vmagent` reads response from scrape target in chunks, then immediately processes every chunk and pushes the processed metrics to remote storage. This allows saving memory when scraping targets that expose millions of metrics. Stream parsing mode is automatically enabled for scrape targets returning response bodies with sizes bigger than the `-promscrape.minResponseSizeForStreamParse` command-line flag value. Additionally, the stream parsing mode can be explicitly enabled in the following places: -- Via `-promscrape.streamParse` command-line flag. In this case all the scrape targets defined in the file pointed by `-promscrape.config` are scraped in stream parsing mode. -- Via `stream_parse: true` option at `scrape_configs` section. In this case all the scrape targets defined in this section are scraped in stream parsing mode. -- Via `__stream_parse__=true` label, which can be set via [relabeling](#relabeling) at `relabel_configs` section. In this case stream parsing mode is enabled for the corresponding scrape targets. Typical use case: to set the label via [Kubernetes annotations](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) for targets exposing big number of metrics. +* Via `-promscrape.streamParse` command-line flag. In this case all the scrape targets defined in the file pointed by `-promscrape.config` are scraped in stream parsing mode. +* Via `stream_parse: true` option at `scrape_configs` section. In this case all the scrape targets defined in this section are scraped in stream parsing mode. +* Via `__stream_parse__=true` label, which can be set via [relabeling](#relabeling) at `relabel_configs` section. In this case stream parsing mode is enabled for the corresponding scrape targets. Typical use case: to set the label via [Kubernetes annotations](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) for targets exposing big number of metrics. Examples: @@ -361,7 +344,6 @@ scrape_configs: Note that `sample_limit` and `series_limit` options cannot be used in stream parsing mode because the parsed data is pushed to remote storage as soon as it is parsed. - ## Scraping big number of targets A single `vmagent` instance can scrape tens of thousands of scrape targets. Sometimes this isn't enough due to limitations on CPU, network, RAM, etc. @@ -389,7 +371,6 @@ start a cluster of three `vmagent` instances, where each target is scraped by tw If each target is scraped by multiple `vmagent` instances, then data deduplication must be enabled at remote storage pointed by `-remoteWrite.url`. See [these docs](https://docs.victoriametrics.com/#deduplication) for details. - ## Scraping targets via a proxy `vmagent` supports scraping targets via http, https and socks5 proxies. Proxy address must be specified in `proxy_url` option. For example, the following scrape config instructs @@ -429,9 +410,9 @@ scrape_configs: By default `vmagent` doesn't limit the number of time series each scrape target can expose. The limit can be enforced in the following places: -- Via `-promscrape.seriesLimitPerTarget` command-line option. This limit is applied individually to all the scrape targets defined in the file pointed by `-promscrape.config`. -- Via `series_limit` config option at `scrape_config` section. This limit is applied individually to all the scrape targets defined in the given `scrape_config`. -- Via `__series_limit__` label, which can be set with [relabeling](#relabeling) at `relabel_configs` section. This limit is applied to the corresponding scrape targets. Typical use case: to set the limit via [Kubernetes annotations](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) for targets, which may expose too high number of time series. +* Via `-promscrape.seriesLimitPerTarget` command-line option. This limit is applied individually to all the scrape targets defined in the file pointed by `-promscrape.config`. +* Via `series_limit` config option at `scrape_config` section. This limit is applied individually to all the scrape targets defined in the given `scrape_config`. +* Via `__series_limit__` label, which can be set with [relabeling](#relabeling) at `relabel_configs` section. This limit is applied to the corresponding scrape targets. Typical use case: to set the limit via [Kubernetes annotations](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) for targets, which may expose too high number of time series. All the scraped metrics are dropped for time series exceeding the given limit. The exceeded limit can be [monitored](#monitoring) via `promscrape_series_limit_rows_dropped_total` metric. @@ -451,7 +432,6 @@ The exceeded limits can be [monitored](#monitoring) with the following metrics: These limits are approximate, so `vmagent` can underflow/overflow the limit by a small percentage (usually less than 1%). - ## Monitoring `vmagent` exports various metrics in Prometheus exposition format at `http://vmagent-host:8429/metrics` page. We recommend setting up regular scraping of this page @@ -470,7 +450,6 @@ This information may be useful for debugging target relabeling. * `http://vmagent-host:8429/ready`. This handler returns http 200 status code when `vmagent` finishes it's initialization for all service_discovery configs. It may be useful to perform `vmagent` rolling update without any scrape loss. - ## Troubleshooting * We recommend you [set up the official Grafana dashboard](#monitoring) in order to monitor the state of `vmagent'. @@ -534,12 +513,14 @@ It may be useful to perform `vmagent` rolling update without any scrape loss. See the available options below if you prefer fixing the root cause of the error: The following relabeling rule may be added to `relabel_configs` section in order to filter out pods with unneeded ports: + ```yml - action: keep_if_equal source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number] ``` The following relabeling rule may be added to `relabel_configs` section in order to filter out init container pods: + ```yml - action: drop source_labels: [__meta_kubernetes_pod_container_init] @@ -555,7 +536,6 @@ It may be useful to perform `vmagent` rolling update without any scrape loss. The enterprise version of vmagent is available for evaluation at [releases](https://github.com/VictoriaMetrics/VictoriaMetrics/releases) page in `vmutils-*-enteprise.tar.gz` archives and in [docker images](https://hub.docker.com/r/victoriametrics/vmagent/tags) with tags containing `enterprise` suffix. - ### Reading metrics from Kafka [Enterprise version](https://victoriametrics.com/products/enterprise/) of `vmagent` can read metrics in various formats from Kafka messages. These formats can be configured with `-kafka.consumer.topic.defaultFormat` or `-kafka.consumer.topic.format` command-line options. The following formats are supported: @@ -591,7 +571,6 @@ topic = "influx" data_format = "influx" ``` - #### Command-line flags for Kafka consumer These command-line flags are available only in [enterprise](https://victoriametrics.com/products/enterprise/) version of `vmagent`, which can be downloaded for evaluation from [releases](https://github.com/VictoriaMetrics/VictoriaMetrics/releases) page (see `vmutils-*-enteprise.tar.gz` archives) and from [docker images](https://hub.docker.com/r/victoriametrics/vmagent/tags) with tags containing `enterprise` suffix. @@ -631,7 +610,6 @@ These command-line flags are available only in [enterprise](https://victoriametr Additional Kafka options can be passed as query params to `-remoteWrite.url`. For instance, `kafka://localhost:9092/?topic=prom-rw&client.id=my-favorite-id` sets `client.id` Kafka option to `my-favorite-id`. The full list of Kafka options is available [here](https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md). - #### Kafka broker authorization and authentication Two types of auth are supported: @@ -648,12 +626,10 @@ Two types of auth are supported: ./bin/vmagent -remoteWrite.url=kafka://localhost:9092/?topic=prom-rw&security.protocol=SSL -remoteWrite.tlsCAFile=/opt/ca.pem -remoteWrite.tlsCertFile=/opt/cert.pem -remoteWrite.tlsKeyFile=/opt/key.pem ``` - ## How to build from sources We recommend using [binary releases](https://github.com/VictoriaMetrics/VictoriaMetrics/releases) - `vmagent` is located in the `vmutils-*` archives . - ### Development build 1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.17. @@ -695,7 +671,6 @@ ARM build may run on Raspberry Pi or on [energy-efficient ARM servers](https://b 2. Run `make vmagent-arm-prod` or `make vmagent-arm64-prod` from the root folder of [the repository](https://github.com/VictoriaMetrics/VictoriaMetrics). It builds `vmagent-arm-prod` or `vmagent-arm64-prod` binary respectively and puts it into the `bin` folder. - ## Profiling `vmagent` provides handlers for collecting the following [Go profiles](https://blog.golang.org/profiling-go-programs): @@ -724,7 +699,6 @@ The command for collecting CPU profile waits for 30 seconds before returning. The collected profiles may be analyzed with [go tool pprof](https://github.com/google/pprof). - ## Advanced usage `vmagent` can be fine-tuned with various command-line flags. Run `./vmagent -help` in order to see the full list of these flags with their desciptions and default values: @@ -737,314 +711,314 @@ vmagent collects metrics data via popular data ingestion protocols and routes th See the docs at https://docs.victoriametrics.com/vmagent.html . -configAuthKey string - Authorization key for accessing /config page. It must be passed via authKey query arg + Authorization key for accessing /config page. It must be passed via authKey query arg -csvTrimTimestamp duration - Trim timestamps when importing csv data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) + Trim timestamps when importing csv data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) -datadog.maxInsertRequestSize size - The maximum size in bytes of a single DataDog POST request to /api/v1/series - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 67108864) + The maximum size in bytes of a single DataDog POST request to /api/v1/series + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 67108864) -dryRun - Whether to check only config files without running vmagent. The following files are checked: -promscrape.config, -remoteWrite.relabelConfig, -remoteWrite.urlRelabelConfig . Unknown config entries aren't allowed in -promscrape.config by default. This can be changed by passing -promscrape.config.strictParse=false command-line flag + Whether to check only config files without running vmagent. The following files are checked: -promscrape.config, -remoteWrite.relabelConfig, -remoteWrite.urlRelabelConfig . Unknown config entries aren't allowed in -promscrape.config by default. This can be changed by passing -promscrape.config.strictParse=false command-line flag -enableTCP6 - Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used + Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used -envflag.enable - Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details + Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details -envflag.prefix string - Prefix for environment variables if -envflag.enable is set + Prefix for environment variables if -envflag.enable is set -eula - By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf + By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf -fs.disableMmap - Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() + Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() -graphiteListenAddr string - TCP and UDP address to listen for Graphite plaintext data. Usually :2003 must be set. Doesn't work if empty + TCP and UDP address to listen for Graphite plaintext data. Usually :2003 must be set. Doesn't work if empty -graphiteTrimTimestamp duration - Trim timestamps for Graphite data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) + Trim timestamps for Graphite data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) -http.connTimeout duration - Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) + Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) -http.disableResponseCompression - Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth + Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth -http.idleConnTimeout duration - Timeout for incoming idle http connections (default 1m0s) + Timeout for incoming idle http connections (default 1m0s) -http.maxGracefulShutdownDuration duration - The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) + The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) -http.pathPrefix string - An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus + An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus -http.shutdownDelay duration - Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers + Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers -httpAuth.password string - Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty + Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty -httpAuth.username string - Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password + Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password -httpListenAddr string - TCP address to listen for http connections. Set this flag to empty value in order to disable listening on any port. This mode may be useful for running multiple vmagent instances on the same server. Note that /targets and /metrics pages aren't available if -httpListenAddr='' (default ":8429") + TCP address to listen for http connections. Set this flag to empty value in order to disable listening on any port. This mode may be useful for running multiple vmagent instances on the same server. Note that /targets and /metrics pages aren't available if -httpListenAddr='' (default ":8429") -import.maxLineLen size - The maximum length in bytes of a single line accepted by /api/v1/import; the line length can be limited with 'max_rows_per_line' query arg passed to /api/v1/export - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 104857600) + The maximum length in bytes of a single line accepted by /api/v1/import; the line length can be limited with 'max_rows_per_line' query arg passed to /api/v1/export + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 104857600) -influx.databaseNames array - Comma-separated list of database names to return from /query and /influx/query API. This can be needed for accepting data from Telegraf plugins such as https://github.com/fangli/fluent-plugin-influxdb - Supports an array of values separated by comma or specified via multiple flags. + Comma-separated list of database names to return from /query and /influx/query API. This can be needed for accepting data from Telegraf plugins such as https://github.com/fangli/fluent-plugin-influxdb + Supports an array of values separated by comma or specified via multiple flags. -influx.maxLineSize size - The maximum size in bytes for a single InfluxDB line during parsing - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 262144) + The maximum size in bytes for a single InfluxDB line during parsing + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 262144) -influxDBLabel string - Default label for the DB name sent over '?db={db_name}' query parameter (default "db") + Default label for the DB name sent over '?db={db_name}' query parameter (default "db") -influxListenAddr string - TCP and UDP address to listen for InfluxDB line protocol data. Usually :8189 must be set. Doesn't work if empty. This flag isn't needed when ingesting data over HTTP - just send it to http://:8429/write + TCP and UDP address to listen for InfluxDB line protocol data. Usually :8189 must be set. Doesn't work if empty. This flag isn't needed when ingesting data over HTTP - just send it to http://:8429/write -influxMeasurementFieldSeparator string - Separator for '{measurement}{separator}{field_name}' metric name when inserted via InfluxDB line protocol (default "_") + Separator for '{measurement}{separator}{field_name}' metric name when inserted via InfluxDB line protocol (default "_") -influxSkipMeasurement - Uses '{field_name}' as a metric name while ignoring '{measurement}' and '-influxMeasurementFieldSeparator' + Uses '{field_name}' as a metric name while ignoring '{measurement}' and '-influxMeasurementFieldSeparator' -influxSkipSingleField - Uses '{measurement}' instead of '{measurement}{separator}{field_name}' for metic name if InfluxDB line contains only a single field + Uses '{measurement}' instead of '{measurement}{separator}{field_name}' for metic name if InfluxDB line contains only a single field -influxTrimTimestamp duration - Trim timestamps for InfluxDB line protocol data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) + Trim timestamps for InfluxDB line protocol data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) -insert.maxQueueDuration duration - The maximum duration for waiting in the queue for insert requests due to -maxConcurrentInserts (default 1m0s) + The maximum duration for waiting in the queue for insert requests due to -maxConcurrentInserts (default 1m0s) -kafka.consumer.topic array - Kafka topic names for data consumption. - Supports an array of values separated by comma or specified via multiple flags. + Kafka topic names for data consumption. + Supports an array of values separated by comma or specified via multiple flags. -kafka.consumer.topic.basicAuth.password array - Optional basic auth password for -kafka.consumer.topic. Must be used in conjunction with any supported auth methods for kafka client, specified by flag -kafka.consumer.topic.options='security.protocol=SASL_SSL;sasl.mechanisms=PLAIN' - Supports an array of values separated by comma or specified via multiple flags. + Optional basic auth password for -kafka.consumer.topic. Must be used in conjunction with any supported auth methods for kafka client, specified by flag -kafka.consumer.topic.options='security.protocol=SASL_SSL;sasl.mechanisms=PLAIN' + Supports an array of values separated by comma or specified via multiple flags. -kafka.consumer.topic.basicAuth.username array - Optional basic auth username for -kafka.consumer.topic. Must be used in conjunction with any supported auth methods for kafka client, specified by flag -kafka.consumer.topic.options='security.protocol=SASL_SSL;sasl.mechanisms=PLAIN' - Supports an array of values separated by comma or specified via multiple flags. + Optional basic auth username for -kafka.consumer.topic. Must be used in conjunction with any supported auth methods for kafka client, specified by flag -kafka.consumer.topic.options='security.protocol=SASL_SSL;sasl.mechanisms=PLAIN' + Supports an array of values separated by comma or specified via multiple flags. -kafka.consumer.topic.brokers array - List of brokers to connect for given topic, e.g. -kafka.consumer.topic.broker=host-1:9092;host-2:9092 - Supports an array of values separated by comma or specified via multiple flags. + List of brokers to connect for given topic, e.g. -kafka.consumer.topic.broker=host-1:9092;host-2:9092 + Supports an array of values separated by comma or specified via multiple flags. -kafka.consumer.topic.defaultFormat string - Expected data format in the topic if -kafka.consumer.topic.format is skipped. (default "promremotewrite") + Expected data format in the topic if -kafka.consumer.topic.format is skipped. (default "promremotewrite") -kafka.consumer.topic.format array - data format for corresponding kafka topic. Valid formats: influx, prometheus, promremotewrite, graphite, jsonline - Supports an array of values separated by comma or specified via multiple flags. + data format for corresponding kafka topic. Valid formats: influx, prometheus, promremotewrite, graphite, jsonline + Supports an array of values separated by comma or specified via multiple flags. -kafka.consumer.topic.groupID array - Defines group.id for topic - Supports an array of values separated by comma or specified via multiple flags. + Defines group.id for topic + Supports an array of values separated by comma or specified via multiple flags. -kafka.consumer.topic.isGzipped array - Enables gzip setting for topic messages payload. Only prometheus, jsonline and influx formats accept gzipped messages. - Supports array of values separated by comma or specified via multiple flags. + Enables gzip setting for topic messages payload. Only prometheus, jsonline and influx formats accept gzipped messages. + Supports array of values separated by comma or specified via multiple flags. -kafka.consumer.topic.options array - Optional key=value;key1=value2 settings for topic consumer. See full configuration options at https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md. - Supports an array of values separated by comma or specified via multiple flags. + Optional key=value;key1=value2 settings for topic consumer. See full configuration options at https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md. + Supports an array of values separated by comma or specified via multiple flags. -loggerDisableTimestamps - Whether to disable writing timestamps in logs + Whether to disable writing timestamps in logs -loggerErrorsPerSecondLimit int - Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit + Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit -loggerFormat string - Format for logs. Possible values: default, json (default "default") + Format for logs. Possible values: default, json (default "default") -loggerLevel string - Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") + Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") -loggerOutput string - Output for the logs. Supported values: stderr, stdout (default "stderr") + Output for the logs. Supported values: stderr, stdout (default "stderr") -loggerTimezone string - Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") + Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") -loggerWarnsPerSecondLimit int - Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit + Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit -maxConcurrentInserts int - The maximum number of concurrent inserts. Default value should work for most cases, since it minimizes the overhead for concurrent inserts. This option is tigthly coupled with -insert.maxQueueDuration (default 16) + The maximum number of concurrent inserts. Default value should work for most cases, since it minimizes the overhead for concurrent inserts. This option is tigthly coupled with -insert.maxQueueDuration (default 16) -maxInsertRequestSize size - The maximum size in bytes of a single Prometheus remote_write API request - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) + The maximum size in bytes of a single Prometheus remote_write API request + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) -memory.allowedBytes size - Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -memory.allowedPercent float - Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) + Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) -metricsAuthKey string - Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings -opentsdbHTTPListenAddr string - TCP address to listen for OpentTSDB HTTP put requests. Usually :4242 must be set. Doesn't work if empty + TCP address to listen for OpentTSDB HTTP put requests. Usually :4242 must be set. Doesn't work if empty -opentsdbListenAddr string - TCP and UDP address to listen for OpentTSDB metrics. Telnet put messages and HTTP /api/put messages are simultaneously served on TCP port. Usually :4242 must be set. Doesn't work if empty + TCP and UDP address to listen for OpentTSDB metrics. Telnet put messages and HTTP /api/put messages are simultaneously served on TCP port. Usually :4242 must be set. Doesn't work if empty -opentsdbTrimTimestamp duration - Trim timestamps for OpenTSDB 'telnet put' data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) + Trim timestamps for OpenTSDB 'telnet put' data to this duration. Minimum practical duration is 1s. Higher duration (i.e. 1m) may be used for reducing disk space usage for timestamp data (default 1s) -opentsdbhttp.maxInsertRequestSize size - The maximum size of OpenTSDB HTTP put request - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) + The maximum size of OpenTSDB HTTP put request + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 33554432) -opentsdbhttpTrimTimestamp duration - Trim timestamps for OpenTSDB HTTP data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) + Trim timestamps for OpenTSDB HTTP data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms) -pprofAuthKey string - Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings -promscrape.cluster.memberNum int - The number of number in the cluster of scrapers. It must be an unique value in the range 0 ... promscrape.cluster.membersCount-1 across scrapers in the cluster + The number of number in the cluster of scrapers. It must be an unique value in the range 0 ... promscrape.cluster.membersCount-1 across scrapers in the cluster -promscrape.cluster.membersCount int - The number of members in a cluster of scrapers. Each member must have an unique -promscrape.cluster.memberNum in the range 0 ... promscrape.cluster.membersCount-1 . Each member then scrapes roughly 1/N of all the targets. By default cluster scraping is disabled, i.e. a single scraper scrapes all the targets + The number of members in a cluster of scrapers. Each member must have an unique -promscrape.cluster.memberNum in the range 0 ... promscrape.cluster.membersCount-1 . Each member then scrapes roughly 1/N of all the targets. By default cluster scraping is disabled, i.e. a single scraper scrapes all the targets -promscrape.cluster.replicationFactor int - The number of members in the cluster, which scrape the same targets. If the replication factor is greater than 2, then the deduplication must be enabled at remote storage side. See https://docs.victoriametrics.com/#deduplication (default 1) + The number of members in the cluster, which scrape the same targets. If the replication factor is greater than 2, then the deduplication must be enabled at remote storage side. See https://docs.victoriametrics.com/#deduplication (default 1) -promscrape.config string - Optional path to Prometheus config file with 'scrape_configs' section containing targets to scrape. The path can point to local file and to http url. See https://docs.victoriametrics.com/#how-to-scrape-prometheus-exporters-such-as-node-exporter for details + Optional path to Prometheus config file with 'scrape_configs' section containing targets to scrape. The path can point to local file and to http url. See https://docs.victoriametrics.com/#how-to-scrape-prometheus-exporters-such-as-node-exporter for details -promscrape.config.dryRun - Checks -promscrape.config file for errors and unsupported fields and then exits. Returns non-zero exit code on parsing errors and emits these errors to stderr. See also -promscrape.config.strictParse command-line flag. Pass -loggerLevel=ERROR if you don't need to see info messages in the output. + Checks -promscrape.config file for errors and unsupported fields and then exits. Returns non-zero exit code on parsing errors and emits these errors to stderr. See also -promscrape.config.strictParse command-line flag. Pass -loggerLevel=ERROR if you don't need to see info messages in the output. -promscrape.config.strictParse - Whether to deny unsupported fields in -promscrape.config . Set to false in order to silently skip unsupported fields (default true) + Whether to deny unsupported fields in -promscrape.config . Set to false in order to silently skip unsupported fields (default true) -promscrape.configCheckInterval duration - Interval for checking for changes in '-promscrape.config' file. By default the checking is disabled. Send SIGHUP signal in order to force config check for changes + Interval for checking for changes in '-promscrape.config' file. By default the checking is disabled. Send SIGHUP signal in order to force config check for changes -promscrape.consul.waitTime duration - Wait time used by Consul service discovery. Default value is used if not set + Wait time used by Consul service discovery. Default value is used if not set -promscrape.consulSDCheckInterval duration - Interval for checking for changes in Consul. This works only if consul_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#consul_sd_config for details (default 30s) + Interval for checking for changes in Consul. This works only if consul_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#consul_sd_config for details (default 30s) -promscrape.digitaloceanSDCheckInterval duration - Interval for checking for changes in digital ocean. This works only if digitalocean_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#digitalocean_sd_config for details (default 1m0s) + Interval for checking for changes in digital ocean. This works only if digitalocean_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#digitalocean_sd_config for details (default 1m0s) -promscrape.disableCompression - Whether to disable sending 'Accept-Encoding: gzip' request headers to all the scrape targets. This may reduce CPU usage on scrape targets at the cost of higher network bandwidth utilization. It is possible to set 'disable_compression: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control + Whether to disable sending 'Accept-Encoding: gzip' request headers to all the scrape targets. This may reduce CPU usage on scrape targets at the cost of higher network bandwidth utilization. It is possible to set 'disable_compression: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control -promscrape.disableKeepAlive - Whether to disable HTTP keep-alive connections when scraping all the targets. This may be useful when targets has no support for HTTP keep-alive connection. It is possible to set 'disable_keepalive: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control. Note that disabling HTTP keep-alive may increase load on both vmagent and scrape targets + Whether to disable HTTP keep-alive connections when scraping all the targets. This may be useful when targets has no support for HTTP keep-alive connection. It is possible to set 'disable_keepalive: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control. Note that disabling HTTP keep-alive may increase load on both vmagent and scrape targets -promscrape.discovery.concurrency int - The maximum number of concurrent requests to Prometheus autodiscovery API (Consul, Kubernetes, etc.) (default 100) + The maximum number of concurrent requests to Prometheus autodiscovery API (Consul, Kubernetes, etc.) (default 100) -promscrape.discovery.concurrentWaitTime duration - The maximum duration for waiting to perform API requests if more than -promscrape.discovery.concurrency requests are simultaneously performed (default 1m0s) + The maximum duration for waiting to perform API requests if more than -promscrape.discovery.concurrency requests are simultaneously performed (default 1m0s) -promscrape.dnsSDCheckInterval duration - Interval for checking for changes in dns. This works only if dns_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dns_sd_config for details (default 30s) + Interval for checking for changes in dns. This works only if dns_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dns_sd_config for details (default 30s) -promscrape.dockerSDCheckInterval duration - Interval for checking for changes in docker. This works only if docker_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#docker_sd_config for details (default 30s) + Interval for checking for changes in docker. This works only if docker_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#docker_sd_config for details (default 30s) -promscrape.dockerswarmSDCheckInterval duration - Interval for checking for changes in dockerswarm. This works only if dockerswarm_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dockerswarm_sd_config for details (default 30s) + Interval for checking for changes in dockerswarm. This works only if dockerswarm_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dockerswarm_sd_config for details (default 30s) -promscrape.dropOriginalLabels - Whether to drop original labels for scrape targets at /targets and /api/v1/targets pages. This may be needed for reducing memory usage when original labels for big number of scrape targets occupy big amounts of memory. Note that this reduces debuggability for improper per-target relabeling configs + Whether to drop original labels for scrape targets at /targets and /api/v1/targets pages. This may be needed for reducing memory usage when original labels for big number of scrape targets occupy big amounts of memory. Note that this reduces debuggability for improper per-target relabeling configs -promscrape.ec2SDCheckInterval duration - Interval for checking for changes in ec2. This works only if ec2_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config for details (default 1m0s) + Interval for checking for changes in ec2. This works only if ec2_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config for details (default 1m0s) -promscrape.eurekaSDCheckInterval duration - Interval for checking for changes in eureka. This works only if eureka_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#eureka_sd_config for details (default 30s) + Interval for checking for changes in eureka. This works only if eureka_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#eureka_sd_config for details (default 30s) -promscrape.fileSDCheckInterval duration - Interval for checking for changes in 'file_sd_config'. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#file_sd_config for details (default 5m0s) + Interval for checking for changes in 'file_sd_config'. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#file_sd_config for details (default 5m0s) -promscrape.gceSDCheckInterval duration - Interval for checking for changes in gce. This works only if gce_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#gce_sd_config for details (default 1m0s) + Interval for checking for changes in gce. This works only if gce_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#gce_sd_config for details (default 1m0s) -promscrape.httpSDCheckInterval duration - Interval for checking for changes in http endpoint service discovery. This works only if http_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#http_sd_config for details (default 1m0s) + Interval for checking for changes in http endpoint service discovery. This works only if http_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#http_sd_config for details (default 1m0s) -promscrape.kubernetes.apiServerTimeout duration - How frequently to reload the full state from Kuberntes API server (default 30m0s) + How frequently to reload the full state from Kuberntes API server (default 30m0s) -promscrape.kubernetesSDCheckInterval duration - Interval for checking for changes in Kubernetes API server. This works only if kubernetes_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config for details (default 30s) + Interval for checking for changes in Kubernetes API server. This works only if kubernetes_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config for details (default 30s) -promscrape.maxDroppedTargets int - The maximum number of droppedTargets to show at /api/v1/targets page. Increase this value if your setup drops more scrape targets during relabeling and you need investigating labels for all the dropped targets. Note that the increased number of tracked dropped targets may result in increased memory usage (default 1000) + The maximum number of droppedTargets to show at /api/v1/targets page. Increase this value if your setup drops more scrape targets during relabeling and you need investigating labels for all the dropped targets. Note that the increased number of tracked dropped targets may result in increased memory usage (default 1000) -promscrape.maxResponseHeadersSize size - The maximum size of http response headers from Prometheus scrape targets - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 4096) + The maximum size of http response headers from Prometheus scrape targets + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 4096) -promscrape.maxScrapeSize size - The maximum size of scrape response in bytes to process from Prometheus targets. Bigger responses are rejected - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 16777216) + The maximum size of scrape response in bytes to process from Prometheus targets. Bigger responses are rejected + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 16777216) -promscrape.minResponseSizeForStreamParse size - The minimum target response size for automatic switching to stream parsing mode, which can reduce memory usage. See https://docs.victoriametrics.com/vmagent.html#stream-parsing-mode - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 1000000) + The minimum target response size for automatic switching to stream parsing mode, which can reduce memory usage. See https://docs.victoriametrics.com/vmagent.html#stream-parsing-mode + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 1000000) -promscrape.noStaleMarkers - Whether to disable sending Prometheus stale markers for metrics when scrape target disappears. This option may reduce memory usage if stale markers aren't needed for your setup. This option also disables populating the scrape_series_added metric. See https://prometheus.io/docs/concepts/jobs_instances/#automatically-generated-labels-and-time-series + Whether to disable sending Prometheus stale markers for metrics when scrape target disappears. This option may reduce memory usage if stale markers aren't needed for your setup. This option also disables populating the scrape_series_added metric. See https://prometheus.io/docs/concepts/jobs_instances/#automatically-generated-labels-and-time-series -promscrape.openstackSDCheckInterval duration - Interval for checking for changes in openstack API server. This works only if openstack_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#openstack_sd_config for details (default 30s) + Interval for checking for changes in openstack API server. This works only if openstack_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#openstack_sd_config for details (default 30s) -promscrape.seriesLimitPerTarget int - Optional limit on the number of unique time series a single scrape target can expose. See https://docs.victoriametrics.com/vmagent.html#cardinality-limiter for more info + Optional limit on the number of unique time series a single scrape target can expose. See https://docs.victoriametrics.com/vmagent.html#cardinality-limiter for more info -promscrape.streamParse - Whether to enable stream parsing for metrics obtained from scrape targets. This may be useful for reducing memory usage when millions of metrics are exposed per each scrape target. It is posible to set 'stream_parse: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control + Whether to enable stream parsing for metrics obtained from scrape targets. This may be useful for reducing memory usage when millions of metrics are exposed per each scrape target. It is posible to set 'stream_parse: true' individually per each 'scrape_config' section in '-promscrape.config' for fine grained control -promscrape.suppressDuplicateScrapeTargetErrors - Whether to suppress 'duplicate scrape target' errors; see https://docs.victoriametrics.com/vmagent.html#troubleshooting for details + Whether to suppress 'duplicate scrape target' errors; see https://docs.victoriametrics.com/vmagent.html#troubleshooting for details -promscrape.suppressScrapeErrors - Whether to suppress scrape errors logging. The last error for each target is always available at '/targets' page even if scrape errors logging is suppressed + Whether to suppress scrape errors logging. The last error for each target is always available at '/targets' page even if scrape errors logging is suppressed -remoteWrite.basicAuth.password array - Optional basic auth password to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional basic auth password to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.basicAuth.passwordFile array - Optional path to basic auth password to use for -remoteWrite.url. The file is re-read every second. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional path to basic auth password to use for -remoteWrite.url. The file is re-read every second. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.basicAuth.username array - Optional basic auth username to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional basic auth username to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.bearerToken array - Optional bearer auth token to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional bearer auth token to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.bearerTokenFile array - Optional path to bearer token file to use for -remoteWrite.url. The token is re-read from the file every second. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional path to bearer token file to use for -remoteWrite.url. The token is re-read from the file every second. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.flushInterval duration - Interval for flushing the data to remote storage. This option takes effect only when less than 10K data points per second are pushed to -remoteWrite.url (default 1s) + Interval for flushing the data to remote storage. This option takes effect only when less than 10K data points per second are pushed to -remoteWrite.url (default 1s) -remoteWrite.label array - Optional label in the form 'name=value' to add to all the metrics before sending them to -remoteWrite.url. Pass multiple -remoteWrite.label flags in order to add multiple labels to metrics before sending them to remote storage - Supports an array of values separated by comma or specified via multiple flags. + Optional label in the form 'name=value' to add to all the metrics before sending them to -remoteWrite.url. Pass multiple -remoteWrite.label flags in order to add multiple labels to metrics before sending them to remote storage + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.maxBlockSize size - The maximum block size to send to remote storage. Bigger blocks may improve performance at the cost of the increased memory usage. See also -remoteWrite.maxRowsPerBlock - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 8388608) + The maximum block size to send to remote storage. Bigger blocks may improve performance at the cost of the increased memory usage. See also -remoteWrite.maxRowsPerBlock + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 8388608) -remoteWrite.maxDailySeries int - The maximum number of unique series vmagent can send to remote storage systems during the last 24 hours. Excess series are logged and dropped. This can be useful for limiting series churn rate. See https://docs.victoriametrics.com/vmagent.html#cardinality-limiter + The maximum number of unique series vmagent can send to remote storage systems during the last 24 hours. Excess series are logged and dropped. This can be useful for limiting series churn rate. See https://docs.victoriametrics.com/vmagent.html#cardinality-limiter -remoteWrite.maxDiskUsagePerURL size - The maximum file-based buffer size in bytes at -remoteWrite.tmpDataPath for each -remoteWrite.url. When buffer size reaches the configured maximum, then old data is dropped when adding new data to the buffer. Buffered data is stored in ~500MB chunks, so the minimum practical value for this flag is 500000000. Disk usage is unlimited if the value is set to 0 - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + The maximum file-based buffer size in bytes at -remoteWrite.tmpDataPath for each -remoteWrite.url. When buffer size reaches the configured maximum, then old data is dropped when adding new data to the buffer. Buffered data is stored in ~500MB chunks, so the minimum practical value for this flag is 500000000. Disk usage is unlimited if the value is set to 0 + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -remoteWrite.maxHourlySeries int - The maximum number of unique series vmagent can send to remote storage systems during the last hour. Excess series are logged and dropped. This can be useful for limiting series cardinality. See https://docs.victoriametrics.com/vmagent.html#cardinality-limiter + The maximum number of unique series vmagent can send to remote storage systems during the last hour. Excess series are logged and dropped. This can be useful for limiting series cardinality. See https://docs.victoriametrics.com/vmagent.html#cardinality-limiter -remoteWrite.maxRowsPerBlock int - The maximum number of samples to send in each block to remote storage. Higher number may improve performance at the cost of the increased memory usage. See also -remoteWrite.maxBlockSize (default 10000) + The maximum number of samples to send in each block to remote storage. Higher number may improve performance at the cost of the increased memory usage. See also -remoteWrite.maxBlockSize (default 10000) -remoteWrite.multitenantURL array - Base path for multitenant remote storage URL to write data to. See https://docs.victoriametrics.com/vmagent.html#multitenancy for details. Example url: http://:8480 . Pass multiple -remoteWrite.multitenantURL flags in order to replicate data to multiple remote storage systems. See also -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Base path for multitenant remote storage URL to write data to. See https://docs.victoriametrics.com/vmagent.html#multitenancy for details. Example url: http://:8480 . Pass multiple -remoteWrite.multitenantURL flags in order to replicate data to multiple remote storage systems. See also -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.oauth2.clientID array - Optional OAuth2 clientID to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional OAuth2 clientID to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.oauth2.clientSecret array - Optional OAuth2 clientSecret to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional OAuth2 clientSecret to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.oauth2.clientSecretFile array - Optional OAuth2 clientSecretFile to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional OAuth2 clientSecretFile to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.oauth2.scopes array - Optional OAuth2 scopes to use for -remoteWrite.url. Scopes must be delimited by ';'. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional OAuth2 scopes to use for -remoteWrite.url. Scopes must be delimited by ';'. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.oauth2.tokenUrl array - Optional OAuth2 tokenURL to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional OAuth2 tokenURL to use for -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.proxyURL array - Optional proxy URL for writing data to -remoteWrite.url. Supported proxies: http, https, socks5. Example: -remoteWrite.proxyURL=socks5://proxy:1234 - Supports an array of values separated by comma or specified via multiple flags. + Optional proxy URL for writing data to -remoteWrite.url. Supported proxies: http, https, socks5. Example: -remoteWrite.proxyURL=socks5://proxy:1234 + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.queues int - The number of concurrent queues to each -remoteWrite.url. Set more queues if default number of queues isn't enough for sending high volume of collected data to remote storage. Default value is 2 * numberOfAvailableCPUs (default 8) + The number of concurrent queues to each -remoteWrite.url. Set more queues if default number of queues isn't enough for sending high volume of collected data to remote storage. Default value is 2 * numberOfAvailableCPUs (default 8) -remoteWrite.rateLimit array - Optional rate limit in bytes per second for data sent to -remoteWrite.url. By default the rate limit is disabled. It can be useful for limiting load on remote storage when big amounts of buffered data is sent after temporary unavailability of the remote storage - Supports array of values separated by comma or specified via multiple flags. + Optional rate limit in bytes per second for data sent to -remoteWrite.url. By default the rate limit is disabled. It can be useful for limiting load on remote storage when big amounts of buffered data is sent after temporary unavailability of the remote storage + Supports array of values separated by comma or specified via multiple flags. -remoteWrite.relabelConfig string - Optional path to file with relabel_config entries. The path can point either to local file or to http url. These entries are applied to all the metrics before sending them to -remoteWrite.url. See https://docs.victoriametrics.com/vmagent.html#relabeling for details + Optional path to file with relabel_config entries. The path can point either to local file or to http url. These entries are applied to all the metrics before sending them to -remoteWrite.url. See https://docs.victoriametrics.com/vmagent.html#relabeling for details -remoteWrite.relabelDebug - Whether to log metrics before and after relabeling with -remoteWrite.relabelConfig. If the -remoteWrite.relabelDebug is enabled, then the metrics aren't sent to remote storage. This is useful for debugging the relabeling configs + Whether to log metrics before and after relabeling with -remoteWrite.relabelConfig. If the -remoteWrite.relabelDebug is enabled, then the metrics aren't sent to remote storage. This is useful for debugging the relabeling configs -remoteWrite.roundDigits array - Round metric values to this number of decimal digits after the point before writing them to remote storage. Examples: -remoteWrite.roundDigits=2 would round 1.236 to 1.24, while -remoteWrite.roundDigits=-1 would round 126.78 to 130. By default digits rounding is disabled. Set it to 100 for disabling it for a particular remote storage. This option may be used for improving data compression for the stored metrics - Supports array of values separated by comma or specified via multiple flags. + Round metric values to this number of decimal digits after the point before writing them to remote storage. Examples: -remoteWrite.roundDigits=2 would round 1.236 to 1.24, while -remoteWrite.roundDigits=-1 would round 126.78 to 130. By default digits rounding is disabled. Set it to 100 for disabling it for a particular remote storage. This option may be used for improving data compression for the stored metrics + Supports array of values separated by comma or specified via multiple flags. -remoteWrite.sendTimeout array - Timeout for sending a single block of data to -remoteWrite.url - Supports array of values separated by comma or specified via multiple flags. + Timeout for sending a single block of data to -remoteWrite.url + Supports array of values separated by comma or specified via multiple flags. -remoteWrite.showURL - Whether to show -remoteWrite.url in the exported metrics. It is hidden by default, since it can contain sensitive info such as auth key + Whether to show -remoteWrite.url in the exported metrics. It is hidden by default, since it can contain sensitive info such as auth key -remoteWrite.significantFigures array - The number of significant figures to leave in metric values before writing them to remote storage. See https://en.wikipedia.org/wiki/Significant_figures . Zero value saves all the significant figures. This option may be used for improving data compression for the stored metrics. See also -remoteWrite.roundDigits - Supports array of values separated by comma or specified via multiple flags. + The number of significant figures to leave in metric values before writing them to remote storage. See https://en.wikipedia.org/wiki/Significant_figures . Zero value saves all the significant figures. This option may be used for improving data compression for the stored metrics. See also -remoteWrite.roundDigits + Supports array of values separated by comma or specified via multiple flags. -remoteWrite.tlsCAFile array - Optional path to TLS CA file to use for verifying connections to -remoteWrite.url. By default system CA is used. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional path to TLS CA file to use for verifying connections to -remoteWrite.url. By default system CA is used. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.tlsCertFile array - Optional path to client-side TLS certificate file to use when connecting to -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional path to client-side TLS certificate file to use when connecting to -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.tlsInsecureSkipVerify array - Whether to skip tls verification when connecting to -remoteWrite.url - Supports array of values separated by comma or specified via multiple flags. + Whether to skip tls verification when connecting to -remoteWrite.url + Supports array of values separated by comma or specified via multiple flags. -remoteWrite.tlsKeyFile array - Optional path to client-side TLS certificate key to use when connecting to -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional path to client-side TLS certificate key to use when connecting to -remoteWrite.url. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.tlsServerName array - Optional TLS server name to use for connections to -remoteWrite.url. By default the server name from -remoteWrite.url is used. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url - Supports an array of values separated by comma or specified via multiple flags. + Optional TLS server name to use for connections to -remoteWrite.url. By default the server name from -remoteWrite.url is used. If multiple args are set, then they are applied independently for the corresponding -remoteWrite.url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.tmpDataPath string - Path to directory where temporary data for remote write component is stored. See also -remoteWrite.maxDiskUsagePerURL (default "vmagent-remotewrite-data") + Path to directory where temporary data for remote write component is stored. See also -remoteWrite.maxDiskUsagePerURL (default "vmagent-remotewrite-data") -remoteWrite.url array - Remote storage URL to write data to. It must support Prometheus remote_write API. It is recommended using VictoriaMetrics as remote storage. Example url: http://:8428/api/v1/write . Pass multiple -remoteWrite.url flags in order to replicate data to multiple remote storage systems. See also -remoteWrite.multitenantURL - Supports an array of values separated by comma or specified via multiple flags. + Remote storage URL to write data to. It must support Prometheus remote_write API. It is recommended using VictoriaMetrics as remote storage. Example url: http://:8428/api/v1/write . Pass multiple -remoteWrite.url flags in order to replicate data to multiple remote storage systems. See also -remoteWrite.multitenantURL + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.urlRelabelConfig array - Optional path to relabel config for the corresponding -remoteWrite.url. The path can point either to local file or to http url - Supports an array of values separated by comma or specified via multiple flags. + Optional path to relabel config for the corresponding -remoteWrite.url. The path can point either to local file or to http url + Supports an array of values separated by comma or specified via multiple flags. -remoteWrite.urlRelabelDebug array - Whether to log metrics before and after relabeling with -remoteWrite.urlRelabelConfig. If the -remoteWrite.urlRelabelDebug is enabled, then the metrics aren't sent to the corresponding -remoteWrite.url. This is useful for debugging the relabeling configs - Supports array of values separated by comma or specified via multiple flags. + Whether to log metrics before and after relabeling with -remoteWrite.urlRelabelConfig. If the -remoteWrite.urlRelabelDebug is enabled, then the metrics aren't sent to the corresponding -remoteWrite.url. This is useful for debugging the relabeling configs + Supports array of values separated by comma or specified via multiple flags. -sortLabels - Whether to sort labels for incoming samples before writing them to all the configured remote storage systems. This may be needed for reducing memory usage at remote storage when the order of labels in incoming samples is random. For example, if m{k1="v1",k2="v2"} may be sent as m{k2="v2",k1="v1"}Enabled sorting for labels can slow down ingestion performance a bit + Whether to sort labels for incoming samples before writing them to all the configured remote storage systems. This may be needed for reducing memory usage at remote storage when the order of labels in incoming samples is random. For example, if m{k1="v1",k2="v2"} may be sent as m{k2="v2",k1="v1"}Enabled sorting for labels can slow down ingestion performance a bit -tls - Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set + Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set -tlsCertFile string - Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated -tlsKeyFile string - Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated -version - Show VictoriaMetrics version + Show VictoriaMetrics version ``` diff --git a/app/vmalert/README.md b/app/vmalert/README.md index 61ac2d362..e7c950e79 100644 --- a/app/vmalert/README.md +++ b/app/vmalert/README.md @@ -10,6 +10,7 @@ Vmalert is heavily inspired by [Prometheus](https://prometheus.io/docs/alerting/ implementation and aims to be compatible with its syntax. ## Features + * Integration with [VictoriaMetrics](https://github.com/VictoriaMetrics/VictoriaMetrics) TSDB; * VictoriaMetrics [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html) support and expressions validation; @@ -22,8 +23,9 @@ implementation and aims to be compatible with its syntax. * Lightweight without extra dependencies. ## Limitations + * `vmalert` execute queries against remote datasource which has reliability risks because of the network. -It is recommended to configure alerts thresholds and rules expressions with the understanding that network +It is recommended to configure alerts thresholds and rules expressions with the understanding that network requests may fail; * by default, rules execution is sequential within one group, but persistence of execution results to remote storage is asynchronous. Hence, user shouldn't rely on chaining of recording rules when result of previous @@ -32,25 +34,29 @@ recording rule is reused in the next one; ## QuickStart To build `vmalert` from sources: -``` + +```bash git clone https://github.com/VictoriaMetrics/VictoriaMetrics cd VictoriaMetrics make vmalert ``` + The build binary will be placed in `VictoriaMetrics/bin` folder. To start using `vmalert` you will need the following things: + * list of rules - PromQL/MetricsQL expressions to execute; * datasource address - reachable MetricsQL endpoint to run queries against; * notifier address [optional] - reachable [Alert Manager](https://github.com/prometheus/alertmanager) instance for processing, -aggregating alerts, and sending notifications. Please note, notifier address also supports Consul Service Discovery via +aggregating alerts, and sending notifications. Please note, notifier address also supports Consul Service Discovery via [config file](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/app/vmalert/notifier/config.go). * remote write address [optional] - [remote write](https://prometheus.io/docs/prometheus/latest/storage/#remote-storage-integrations) compatible storage to persist rules and alerts state info; * remote read address [optional] - MetricsQL compatible datasource to restore alerts state from. Then configure `vmalert` accordingly: -``` + +```bash ./bin/vmalert -rule=alert.rules \ # Path to the file with rules configuration. Supports wildcard -datasource.url=http://localhost:8428 \ # PromQL compatible datasource -notifier.url=http://localhost:9093 \ # AlertManager URL (required if alerting rules are used) @@ -77,6 +83,7 @@ and [alerting](https://prometheus.io/docs/prometheus/latest/configuration/alerti similar to Prometheus rules and configured using YAML. Configuration examples may be found in [testdata](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/app/vmalert/config/testdata) folder. Every `rule` belongs to a `group` and every configuration file may contain arbitrary number of groups: + ```yaml groups: [ - ] @@ -85,6 +92,7 @@ groups: ### Groups Each group has the following attributes: + ```yaml # The name of the group. Must be unique within a file. name: @@ -136,6 +144,7 @@ or [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html) expression. Vmal expression and then act according to the Rule type. There are two types of Rules: + * [alerting](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/) - Alerting rules allow defining alert conditions via `expr` field and to send notifications to [Alertmanager](https://github.com/prometheus/alertmanager) if execution result is not empty. @@ -150,6 +159,7 @@ within one group. #### Alerting rules The syntax for alerting rule is the following: + ```yaml # The name of the alert. Must be a valid metric name. alert: @@ -182,6 +192,7 @@ listed [here](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/app #### Recording rules The syntax for recording rules is following: + ```yaml # The name of the time series to output to. Must be a valid metric name. record: @@ -198,11 +209,11 @@ labels: For recording rules to work `-remoteWrite.url` must be specified. - ### Alerts state on restarts `vmalert` has no local storage, so alerts state is stored in the process memory. Hence, after restart of `vmalert` the process alerts state will be lost. To avoid this situation, `vmalert` should be configured via the following flags: + * `-remoteWrite.url` - URL to VictoriaMetrics (Single) or vminsert (Cluster). `vmalert` will persist alerts state into the configured address in the form of time series named `ALERTS` and `ALERTS_FOR_STATE` via remote-write protocol. These are regular time series and maybe queried from VM just as any other time series. @@ -214,7 +225,6 @@ Both flags are required for proper state restoration. Restore process may fail i in configured `-remoteRead.url`, weren't updated in the last `1h` (controlled by `-remoteRead.lookback`) or received state doesn't match current `vmalert` rules configuration. - ### Multitenancy There are the following approaches exist for alerting and recording rules across @@ -259,10 +269,11 @@ tags at [Docker Hub](https://hub.docker.com/r/victoriametrics/vmalert/tags). ### Topology examples -The following sections are showing how `vmalert` may be used and configured -for different scenarios. +The following sections are showing how `vmalert` may be used and configured +for different scenarios. + +Please note, not all flags in examples are required: -Please note, not all flags in examples are required: * `-remoteWrite.url` and `-remoteRead.url` are optional and are needed only if you have recording rules or want to store [alerts state](#alerts-state-on-restarts) on `vmalert` restarts; * `-notifier.url` is optional and is needed only if you have alerting rules. @@ -273,6 +284,7 @@ The simplest configuration where one single-node VM server is used for rules execution, storing recording rules results and alerts state. `vmalert` configuration flags: + ``` ./bin/vmalert -rule=rules.yml \ # Path to the file with rules configuration. Supports wildcard -datasource.url=http://victoriametrics:8428 \ # VM-single addr for executing rules expressions @@ -283,16 +295,16 @@ rules execution, storing recording rules results and alerts state. vmalert single - #### Cluster VictoriaMetrics In [cluster mode](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html) VictoriaMetrics has separate components for writing and reading path: `vminsert` and `vmselect` components respectively. `vmselect` is used for executing rules expressions and `vminsert` is used to persist recording rules results and alerts state. -Cluster mode could have multiple `vminsert` and `vmselect` components. +Cluster mode could have multiple `vminsert` and `vmselect` components. `vmalert` configuration flags: + ``` ./bin/vmalert -rule=rules.yml \ # Path to the file with rules configuration. Supports wildcard -datasource.url=http://vmselect:8481/select/0/prometheus # vmselect addr for executing rules expressions @@ -315,6 +327,7 @@ the same destinations, and send alert notifications to multiple configured Alertmanagers. `vmalert` configuration flags: + ``` ./bin/vmalert -rule=rules.yml \ # Path to the file with rules configuration. Supports wildcard -datasource.url=http://victoriametrics:8428 \ # VM-single addr for executing rules expressions @@ -335,9 +348,8 @@ all `vmalert`s are having the same config. Don't forget to configure [cluster mode](https://prometheus.io/docs/alerting/latest/alertmanager/) for Alertmanagers for better reliability. -This example uses single-node VM server for the sake of simplicity. -Check how to replace it with [cluster VictoriaMetrics](#cluster-victoriametrics) if needed. - +This example uses single-node VM server for the sake of simplicity. +Check how to replace it with [cluster VictoriaMetrics](#cluster-victoriametrics) if needed. #### Downsampling and aggregation via vmalert @@ -349,6 +361,7 @@ recording rules to process raw data from "hot" cluster (by applying additional t or reducing resolution) and push results to "cold" cluster. `vmalert` configuration flags: + ``` ./bin/vmalert -rule=downsampling-rules.yml \ # Path to the file with rules configuration. Supports wildcard -datasource.url=http://raw-cluster-vmselect:8481/select/0/prometheus # vmselect addr for executing recordi ng rules expressions @@ -363,19 +376,18 @@ Flags `-remoteRead.url` and `-notifier.url` are omitted since we assume only rec See also [downsampling docs](https://docs.victoriametrics.com/#downsampling). - ### Web `vmalert` runs a web-server (`-httpListenAddr`) for serving metrics and alerts endpoints: + * `http://` - UI; * `http:///api/v1/groups` - list of all loaded groups and rules; * `http:///api/v1/alerts` - list of all active alerts; -* `http:///api/v1///status" ` - get alert status by ID. +* `http:///api/v1///status"` - get alert status by ID. Used as alert source in AlertManager. * `http:///metrics` - application metrics. * `http:///-/reload` - hot configuration reload. - ## Graphite vmalert sends requests to `<-datasource.url>/render?format=json` during evaluation of alerting and recording rules @@ -395,6 +407,7 @@ data source for backfilling. In `replay` mode vmalert works as a cli-tool and exits immediately after work is done. To run vmalert in `replay` mode: + ``` ./bin/vmalert -rule=path/to/your.rules \ # path to files with rules you usually use with vmalert -datasource.url=http://localhost:8428 \ # PromQL/MetricsQL compatible datasource @@ -404,6 +417,7 @@ To run vmalert in `replay` mode: ``` The output of the command will look like the following: + ``` Replay mode: from: 2021-05-11 07:21:43 +0000 UTC # set by -replay.timeFrom @@ -447,9 +461,11 @@ The result of recording rules `replay` should match with results of normal rules The result of alerting rules `replay` is time series reflecting [alert's state](#alerts-state-on-restarts). To see if `replayed` alert has fired in the past use the following PromQL/MetricsQL expression: + ``` ALERTS{alertname="your_alertname", alertstate="firing"} ``` + Execute the query against storage which was used for `-remoteWrite.url` during the `replay`. ### Additional configuration @@ -473,7 +489,6 @@ See full description for these flags in `./vmalert --help`. * Graphite engine isn't supported yet; * `query` template function is disabled for performance reasons (might be changed in future); - ## Monitoring `vmalert` exports various metrics in Prometheus exposition format at `http://vmalert-host:8880/metrics` page. @@ -484,7 +499,6 @@ Use the official [Grafana dashboard](https://grafana.com/grafana/dashboards/1495 If you have suggestions for improvements or have found a bug - please open an issue on github or add a review to the dashboard. - ## Configuration ### Flags @@ -493,305 +507,308 @@ Pass `-help` to `vmalert` in order to see the full list of supported command-line flags with their descriptions. The shortlist of configuration flags is the following: + ``` -clusterMode - If clusterMode is enabled, then vmalert automatically adds the tenant specified in config groups to -datasource.url, -remoteWrite.url and -remoteRead.url. See https://docs.victoriametrics.com/vmalert.html#multitenancy + If clusterMode is enabled, then vmalert automatically adds the tenant specified in config groups to -datasource.url, -remoteWrite.url and -remoteRead.url. See https://docs.victoriametrics.com/vmalert.html#multitenancy -configCheckInterval duration - Interval for checking for changes in '-rule' or '-notifier.config' files. By default the checking is disabled. Send SIGHUP signal in order to force config check for changes. + Interval for checking for changes in '-rule' or '-notifier.config' files. By default the checking is disabled. Send SIGHUP signal in order to force config check for changes. -datasource.appendTypePrefix - Whether to add type prefix to -datasource.url based on the query type. Set to true if sending different query types to the vmselect URL. + Whether to add type prefix to -datasource.url based on the query type. Set to true if sending different query types to the vmselect URL. -datasource.basicAuth.password string - Optional basic auth password for -datasource.url + Optional basic auth password for -datasource.url -datasource.basicAuth.passwordFile string - Optional path to basic auth password to use for -datasource.url + Optional path to basic auth password to use for -datasource.url -datasource.basicAuth.username string - Optional basic auth username for -datasource.url + Optional basic auth username for -datasource.url -datasource.bearerToken string - Optional bearer auth token to use for -datasource.url. + Optional bearer auth token to use for -datasource.url. -datasource.bearerTokenFile string - Optional path to bearer token file to use for -datasource.url. + Optional path to bearer token file to use for -datasource.url. -datasource.lookback duration - Lookback defines how far into the past to look when evaluating queries. For example, if the datasource.lookback=5m then param "time" with value now()-5m will be added to every query. + Lookback defines how far into the past to look when evaluating queries. For example, if the datasource.lookback=5m then param "time" with value now()-5m will be added to every query. -datasource.maxIdleConnections int - Defines the number of idle (keep-alive connections) to each configured datasource. Consider setting this value equal to the value: groups_total * group.concurrency. Too low a value may result in a high number of sockets in TIME_WAIT state. (default 100) + Defines the number of idle (keep-alive connections) to each configured datasource. Consider setting this value equal to the value: groups_total * group.concurrency. Too low a value may result in a high number of sockets in TIME_WAIT state. (default 100) -datasource.oauth2.clientID string - Optional OAuth2 clientID to use for -datasource.url. + Optional OAuth2 clientID to use for -datasource.url. -datasource.oauth2.clientSecret string - Optional OAuth2 clientSecret to use for -datasource.url. + Optional OAuth2 clientSecret to use for -datasource.url. -datasource.oauth2.clientSecretFile string - Optional OAuth2 clientSecretFile to use for -datasource.url. + Optional OAuth2 clientSecretFile to use for -datasource.url. -datasource.oauth2.scopes string - Optional OAuth2 scopes to use for -datasource.url. Scopes must be delimited by ';' + Optional OAuth2 scopes to use for -datasource.url. Scopes must be delimited by ';' -datasource.oauth2.tokenUrl string - Optional OAuth2 tokenURL to use for -datasource.url. + Optional OAuth2 tokenURL to use for -datasource.url. -datasource.queryStep duration - queryStep defines how far a value can fallback to when evaluating queries. For example, if datasource.queryStep=15s then param "step" with value "15s" will be added to every query.If queryStep isn't specified, rule's evaluationInterval will be used instead. + queryStep defines how far a value can fallback to when evaluating queries. For example, if datasource.queryStep=15s then param "step" with value "15s" will be added to every query.If queryStep isn't specified, rule's evaluationInterval will be used instead. -datasource.queryTimeAlignment - Whether to align "time" parameter with evaluation interval.Alignment supposed to produce deterministic results despite of number of vmalert replicas or time they were started. See more details here https://github.com/VictoriaMetrics/VictoriaMetrics/pull/1257 (default true) + Whether to align "time" parameter with evaluation interval.Alignment supposed to produce deterministic results despite of number of vmalert replicas or time they were started. See more details here https://github.com/VictoriaMetrics/VictoriaMetrics/pull/1257 (default true) -datasource.roundDigits int - Adds "round_digits" GET param to datasource requests. In VM "round_digits" limits the number of digits after the decimal point in response values. + Adds "round_digits" GET param to datasource requests. In VM "round_digits" limits the number of digits after the decimal point in response values. -datasource.tlsCAFile string - Optional path to TLS CA file to use for verifying connections to -datasource.url. By default, system CA is used + Optional path to TLS CA file to use for verifying connections to -datasource.url. By default, system CA is used -datasource.tlsCertFile string - Optional path to client-side TLS certificate file to use when connecting to -datasource.url + Optional path to client-side TLS certificate file to use when connecting to -datasource.url -datasource.tlsInsecureSkipVerify - Whether to skip tls verification when connecting to -datasource.url + Whether to skip tls verification when connecting to -datasource.url -datasource.tlsKeyFile string - Optional path to client-side TLS certificate key to use when connecting to -datasource.url + Optional path to client-side TLS certificate key to use when connecting to -datasource.url -datasource.tlsServerName string - Optional TLS server name to use for connections to -datasource.url. By default, the server name from -datasource.url is used + Optional TLS server name to use for connections to -datasource.url. By default, the server name from -datasource.url is used -datasource.url string - VictoriaMetrics or vmselect url. Required parameter. E.g. http://127.0.0.1:8428 + VictoriaMetrics or vmselect url. Required parameter. E.g. http://127.0.0.1:8428 -defaultTenant.graphite string - Default tenant for Graphite alerting groups. See https://docs.victoriametrics.com/vmalert.html#multitenancy + Default tenant for Graphite alerting groups. See https://docs.victoriametrics.com/vmalert.html#multitenancy -defaultTenant.prometheus string - Default tenant for Prometheus alerting groups. See https://docs.victoriametrics.com/vmalert.html#multitenancy + Default tenant for Prometheus alerting groups. See https://docs.victoriametrics.com/vmalert.html#multitenancy -disableAlertgroupLabel - Whether to disable adding group's Name as label to generated alerts and time series. + Whether to disable adding group's Name as label to generated alerts and time series. -dryRun -rule - Whether to check only config files without running vmalert. The rules file are validated. The -rule flag must be specified. + Whether to check only config files without running vmalert. The rules file are validated. The -rule flag must be specified. -enableTCP6 - Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used + Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used -envflag.enable - Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details + Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details -envflag.prefix string - Prefix for environment variables if -envflag.enable is set + Prefix for environment variables if -envflag.enable is set -eula - By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf + By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf -evaluationInterval duration - How often to evaluate the rules (default 1m0s) + How often to evaluate the rules (default 1m0s) -external.alert.source string - External Alert Source allows to override the Source link for alerts sent to AlertManager for cases where you want to build a custom link to Grafana, Prometheus or any other service. - eg. 'explore?orgId=1&left=[\"now-1h\",\"now\",\"VictoriaMetrics\",{\"expr\": \"{{$expr|quotesEscape|crlfEscape|queryEscape}}\"},{\"mode\":\"Metrics\"},{\"ui\":[true,true,true,\"none\"]}]'.If empty '/api/v1/:groupID/alertID/status' is used + External Alert Source allows to override the Source link for alerts sent to AlertManager for cases where you want to build a custom link to Grafana, Prometheus or any other service. + eg. 'explore?orgId=1&left=[\"now-1h\",\"now\",\"VictoriaMetrics\",{\"expr\": \"{{$expr|quotesEscape|crlfEscape|queryEscape}}\"},{\"mode\":\"Metrics\"},{\"ui\":[true,true,true,\"none\"]}]'.If empty '/api/v1/:groupID/alertID/status' is used -external.label array - Optional label in the form 'Name=value' to add to all generated recording rules and alerts. Pass multiple -label flags in order to add multiple label sets. - Supports an array of values separated by comma or specified via multiple flags. + Optional label in the form 'Name=value' to add to all generated recording rules and alerts. Pass multiple -label flags in order to add multiple label sets. + Supports an array of values separated by comma or specified via multiple flags. -external.url string - External URL is used as alert's source for sent alerts to the notifier + External URL is used as alert's source for sent alerts to the notifier -fs.disableMmap - Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() + Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() -http.connTimeout duration - Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) + Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) -http.disableResponseCompression - Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth + Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth -http.idleConnTimeout duration - Timeout for incoming idle http connections (default 1m0s) + Timeout for incoming idle http connections (default 1m0s) -http.maxGracefulShutdownDuration duration - The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) + The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) -http.pathPrefix string - An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus + An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus -http.shutdownDelay duration - Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers + Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers -httpAuth.password string - Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty + Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty -httpAuth.username string - Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password + Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password -httpListenAddr string - Address to listen for http connections (default ":8880") + Address to listen for http connections (default ":8880") -loggerDisableTimestamps - Whether to disable writing timestamps in logs + Whether to disable writing timestamps in logs -loggerErrorsPerSecondLimit int - Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit + Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit -loggerFormat string - Format for logs. Possible values: default, json (default "default") + Format for logs. Possible values: default, json (default "default") -loggerLevel string - Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") + Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") -loggerOutput string - Output for the logs. Supported values: stderr, stdout (default "stderr") + Output for the logs. Supported values: stderr, stdout (default "stderr") -loggerTimezone string - Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") + Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") -loggerWarnsPerSecondLimit int - Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit + Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit -memory.allowedBytes size - Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -memory.allowedPercent float - Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) + Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) -metricsAuthKey string - Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings -notifier.basicAuth.password array - Optional basic auth password for -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional basic auth password for -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.basicAuth.passwordFile array - Optional path to basic auth password file for -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional path to basic auth password file for -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.basicAuth.username array - Optional basic auth username for -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional basic auth username for -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.bearerToken array - Optional bearer token for -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional bearer token for -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.bearerTokenFile array - Optional path to bearer token file for -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional path to bearer token file for -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.config string - Path to configuration file for notifiers + Path to configuration file for notifiers -notifier.oauth2.clientID array - Optional OAuth2 clientID to use for -notifier.url. If multiple args are set, then they are applied independently for the corresponding -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional OAuth2 clientID to use for -notifier.url. If multiple args are set, then they are applied independently for the corresponding -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.oauth2.clientSecret array - Optional OAuth2 clientSecret to use for -notifier.url. If multiple args are set, then they are applied independently for the corresponding -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional OAuth2 clientSecret to use for -notifier.url. If multiple args are set, then they are applied independently for the corresponding -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.oauth2.clientSecretFile array - Optional OAuth2 clientSecretFile to use for -notifier.url. If multiple args are set, then they are applied independently for the corresponding -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional OAuth2 clientSecretFile to use for -notifier.url. If multiple args are set, then they are applied independently for the corresponding -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.oauth2.scopes array - Optional OAuth2 scopes to use for -notifier.url. Scopes must be delimited by ';'. If multiple args are set, then they are applied independently for the corresponding -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional OAuth2 scopes to use for -notifier.url. Scopes must be delimited by ';'. If multiple args are set, then they are applied independently for the corresponding -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.oauth2.tokenUrl array - Optional OAuth2 tokenURL to use for -notifier.url. If multiple args are set, then they are applied independently for the corresponding -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional OAuth2 tokenURL to use for -notifier.url. If multiple args are set, then they are applied independently for the corresponding -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.suppressDuplicateTargetErrors - Whether to suppress 'duplicate target' errors during discovery + Whether to suppress 'duplicate target' errors during discovery -notifier.tlsCAFile array - Optional path to TLS CA file to use for verifying connections to -notifier.url. By default system CA is used - Supports an array of values separated by comma or specified via multiple flags. + Optional path to TLS CA file to use for verifying connections to -notifier.url. By default system CA is used + Supports an array of values separated by comma or specified via multiple flags. -notifier.tlsCertFile array - Optional path to client-side TLS certificate file to use when connecting to -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional path to client-side TLS certificate file to use when connecting to -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.tlsInsecureSkipVerify array - Whether to skip tls verification when connecting to -notifier.url - Supports array of values separated by comma or specified via multiple flags. + Whether to skip tls verification when connecting to -notifier.url + Supports array of values separated by comma or specified via multiple flags. -notifier.tlsKeyFile array - Optional path to client-side TLS certificate key to use when connecting to -notifier.url - Supports an array of values separated by comma or specified via multiple flags. + Optional path to client-side TLS certificate key to use when connecting to -notifier.url + Supports an array of values separated by comma or specified via multiple flags. -notifier.tlsServerName array - Optional TLS server name to use for connections to -notifier.url. By default the server name from -notifier.url is used - Supports an array of values separated by comma or specified via multiple flags. + Optional TLS server name to use for connections to -notifier.url. By default the server name from -notifier.url is used + Supports an array of values separated by comma or specified via multiple flags. -notifier.url array - Prometheus alertmanager URL, e.g. http://127.0.0.1:9093 - Supports an array of values separated by comma or specified via multiple flags. + Prometheus alertmanager URL, e.g. http://127.0.0.1:9093 + Supports an array of values separated by comma or specified via multiple flags. -pprofAuthKey string - Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings -promscrape.consul.waitTime duration - Wait time used by Consul service discovery. Default value is used if not set + Wait time used by Consul service discovery. Default value is used if not set -promscrape.consulSDCheckInterval duration - Interval for checking for changes in Consul. This works only if consul_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#consul_sd_config for details (default 30s) + Interval for checking for changes in Consul. This works only if consul_sd_configs is configured in '-promscrape.config' file. See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#consul_sd_config for details (default 30s) -promscrape.discovery.concurrency int - The maximum number of concurrent requests to Prometheus autodiscovery API (Consul, Kubernetes, etc.) (default 100) + The maximum number of concurrent requests to Prometheus autodiscovery API (Consul, Kubernetes, etc.) (default 100) -promscrape.discovery.concurrentWaitTime duration - The maximum duration for waiting to perform API requests if more than -promscrape.discovery.concurrency requests are simultaneously performed (default 1m0s) + The maximum duration for waiting to perform API requests if more than -promscrape.discovery.concurrency requests are simultaneously performed (default 1m0s) -remoteRead.basicAuth.password string - Optional basic auth password for -remoteRead.url + Optional basic auth password for -remoteRead.url -remoteRead.basicAuth.passwordFile string - Optional path to basic auth password to use for -remoteRead.url + Optional path to basic auth password to use for -remoteRead.url -remoteRead.basicAuth.username string - Optional basic auth username for -remoteRead.url + Optional basic auth username for -remoteRead.url -remoteRead.bearerToken string - Optional bearer auth token to use for -remoteRead.url. + Optional bearer auth token to use for -remoteRead.url. -remoteRead.bearerTokenFile string - Optional path to bearer token file to use for -remoteRead.url. + Optional path to bearer token file to use for -remoteRead.url. -remoteRead.disablePathAppend - Whether to disable automatic appending of '/api/v1/query' path to the configured -remoteRead.url. + Whether to disable automatic appending of '/api/v1/query' path to the configured -remoteRead.url. -remoteRead.ignoreRestoreErrors - Whether to ignore errors from remote storage when restoring alerts state on startup. (default true) + Whether to ignore errors from remote storage when restoring alerts state on startup. (default true) -remoteRead.lookback duration - Lookback defines how far to look into past for alerts timeseries. For example, if lookback=1h then range from now() to now()-1h will be scanned. (default 1h0m0s) + Lookback defines how far to look into past for alerts timeseries. For example, if lookback=1h then range from now() to now()-1h will be scanned. (default 1h0m0s) -remoteRead.oauth2.clientID string - Optional OAuth2 clientID to use for -remoteRead.url. + Optional OAuth2 clientID to use for -remoteRead.url. -remoteRead.oauth2.clientSecret string - Optional OAuth2 clientSecret to use for -remoteRead.url. + Optional OAuth2 clientSecret to use for -remoteRead.url. -remoteRead.oauth2.clientSecretFile string - Optional OAuth2 clientSecretFile to use for -remoteRead.url. + Optional OAuth2 clientSecretFile to use for -remoteRead.url. -remoteRead.oauth2.scopes string - Optional OAuth2 scopes to use for -remoteRead.url. Scopes must be delimited by ';'. + Optional OAuth2 scopes to use for -remoteRead.url. Scopes must be delimited by ';'. -remoteRead.oauth2.tokenUrl string - Optional OAuth2 tokenURL to use for -remoteRead.url. + Optional OAuth2 tokenURL to use for -remoteRead.url. -remoteRead.tlsCAFile string - Optional path to TLS CA file to use for verifying connections to -remoteRead.url. By default system CA is used + Optional path to TLS CA file to use for verifying connections to -remoteRead.url. By default system CA is used -remoteRead.tlsCertFile string - Optional path to client-side TLS certificate file to use when connecting to -remoteRead.url + Optional path to client-side TLS certificate file to use when connecting to -remoteRead.url -remoteRead.tlsInsecureSkipVerify - Whether to skip tls verification when connecting to -remoteRead.url + Whether to skip tls verification when connecting to -remoteRead.url -remoteRead.tlsKeyFile string - Optional path to client-side TLS certificate key to use when connecting to -remoteRead.url + Optional path to client-side TLS certificate key to use when connecting to -remoteRead.url -remoteRead.tlsServerName string - Optional TLS server name to use for connections to -remoteRead.url. By default the server name from -remoteRead.url is used + Optional TLS server name to use for connections to -remoteRead.url. By default the server name from -remoteRead.url is used -remoteRead.url vmalert - Optional URL to VictoriaMetrics or vmselect that will be used to restore alerts state. This configuration makes sense only if vmalert was configured with `remoteWrite.url` before and has been successfully persisted its state. E.g. http://127.0.0.1:8428. See also -remoteRead.disablePathAppend + Optional URL to VictoriaMetrics or vmselect that will be used to restore alerts state. This configuration makes sense only if vmalert was configured with `remoteWrite.url` before and has been successfully persisted its state. E.g. http://127.0.0.1:8428. See also -remoteRead.disablePathAppend -remoteWrite.basicAuth.password string - Optional basic auth password for -remoteWrite.url + Optional basic auth password for -remoteWrite.url -remoteWrite.basicAuth.passwordFile string - Optional path to basic auth password to use for -remoteWrite.url + Optional path to basic auth password to use for -remoteWrite.url -remoteWrite.basicAuth.username string - Optional basic auth username for -remoteWrite.url + Optional basic auth username for -remoteWrite.url -remoteWrite.bearerToken string - Optional bearer auth token to use for -remoteWrite.url. + Optional bearer auth token to use for -remoteWrite.url. -remoteWrite.bearerTokenFile string - Optional path to bearer token file to use for -remoteWrite.url. + Optional path to bearer token file to use for -remoteWrite.url. -remoteWrite.concurrency int - Defines number of writers for concurrent writing into remote querier (default 1) + Defines number of writers for concurrent writing into remote querier (default 1) -remoteWrite.disablePathAppend - Whether to disable automatic appending of '/api/v1/write' path to the configured -remoteWrite.url. + Whether to disable automatic appending of '/api/v1/write' path to the configured -remoteWrite.url. -remoteWrite.flushInterval duration - Defines interval of flushes to remote write endpoint (default 5s) + Defines interval of flushes to remote write endpoint (default 5s) -remoteWrite.maxBatchSize int - Defines defines max number of timeseries to be flushed at once (default 1000) + Defines defines max number of timeseries to be flushed at once (default 1000) -remoteWrite.maxQueueSize int - Defines the max number of pending datapoints to remote write endpoint (default 100000) + Defines the max number of pending datapoints to remote write endpoint (default 100000) -remoteWrite.oauth2.clientID string - Optional OAuth2 clientID to use for -remoteWrite.url. + Optional OAuth2 clientID to use for -remoteWrite.url. -remoteWrite.oauth2.clientSecret string - Optional OAuth2 clientSecret to use for -remoteWrite.url. + Optional OAuth2 clientSecret to use for -remoteWrite.url. -remoteWrite.oauth2.clientSecretFile string - Optional OAuth2 clientSecretFile to use for -remoteWrite.url. + Optional OAuth2 clientSecretFile to use for -remoteWrite.url. -remoteWrite.oauth2.scopes string - Optional OAuth2 scopes to use for -notifier.url. Scopes must be delimited by ';'. + Optional OAuth2 scopes to use for -notifier.url. Scopes must be delimited by ';'. -remoteWrite.oauth2.tokenUrl string - Optional OAuth2 tokenURL to use for -notifier.url. + Optional OAuth2 tokenURL to use for -notifier.url. -remoteWrite.tlsCAFile string - Optional path to TLS CA file to use for verifying connections to -remoteWrite.url. By default system CA is used + Optional path to TLS CA file to use for verifying connections to -remoteWrite.url. By default system CA is used -remoteWrite.tlsCertFile string - Optional path to client-side TLS certificate file to use when connecting to -remoteWrite.url + Optional path to client-side TLS certificate file to use when connecting to -remoteWrite.url -remoteWrite.tlsInsecureSkipVerify - Whether to skip tls verification when connecting to -remoteWrite.url + Whether to skip tls verification when connecting to -remoteWrite.url -remoteWrite.tlsKeyFile string - Optional path to client-side TLS certificate key to use when connecting to -remoteWrite.url + Optional path to client-side TLS certificate key to use when connecting to -remoteWrite.url -remoteWrite.tlsServerName string - Optional TLS server name to use for connections to -remoteWrite.url. By default the server name from -remoteWrite.url is used + Optional TLS server name to use for connections to -remoteWrite.url. By default the server name from -remoteWrite.url is used -remoteWrite.url string - Optional URL to VictoriaMetrics or vminsert where to persist alerts state and recording rules results in form of timeseries. For example, if -remoteWrite.url=http://127.0.0.1:8428 is specified, then the alerts state will be written to http://127.0.0.1:8428/api/v1/write . See also -remoteWrite.disablePathAppend + Optional URL to VictoriaMetrics or vminsert where to persist alerts state and recording rules results in form of timeseries. For example, if -remoteWrite.url=http://127.0.0.1:8428 is specified, then the alerts state will be written to http://127.0.0.1:8428/api/v1/write . See also -remoteWrite.disablePathAppend -replay.maxDatapointsPerQuery int - Max number of data points expected in one request. The higher the value, the less requests will be made during replay. (default 1000) + Max number of data points expected in one request. The higher the value, the less requests will be made during replay. (default 1000) -replay.ruleRetryAttempts int - Defines how many retries to make before giving up on rule if request for it returns an error. (default 5) + Defines how many retries to make before giving up on rule if request for it returns an error. (default 5) -replay.rulesDelay duration - Delay between rules evaluation within the group. Could be important if there are chained rules inside of the groupand processing need to wait for previous rule results to be persisted by remote storage before evaluating the next rule.Keep it equal or bigger than -remoteWrite.flushInterval. (default 1s) + Delay between rules evaluation within the group. Could be important if there are chained rules inside of the groupand processing need to wait for previous rule results to be persisted by remote storage before evaluating the next rule.Keep it equal or bigger than -remoteWrite.flushInterval. (default 1s) -replay.timeFrom string - The time filter in RFC3339 format to select time series with timestamp equal or higher than provided value. E.g. '2020-01-01T20:07:00Z' + The time filter in RFC3339 format to select time series with timestamp equal or higher than provided value. E.g. '2020-01-01T20:07:00Z' -replay.timeTo string - The time filter in RFC3339 format to select timeseries with timestamp equal or lower than provided value. E.g. '2020-01-01T20:07:00Z' + The time filter in RFC3339 format to select timeseries with timestamp equal or lower than provided value. E.g. '2020-01-01T20:07:00Z' -rule array - Path to the file with alert rules. - Supports patterns. Flag can be specified multiple times. - Examples: - -rule="/path/to/file". Path to a single file with alerting rules - -rule="dir/*.yaml" -rule="/*.yaml". Relative path to all .yaml files in "dir" folder, - absolute path to all .yaml files in root. - Rule files may contain %{ENV_VAR} placeholders, which are substituted by the corresponding env vars. - Supports an array of values separated by comma or specified via multiple flags. + Path to the file with alert rules. + Supports patterns. Flag can be specified multiple times. + Examples: + -rule="/path/to/file". Path to a single file with alerting rules + -rule="dir/*.yaml" -rule="/*.yaml". Relative path to all .yaml files in "dir" folder, + absolute path to all .yaml files in root. + Rule files may contain %{ENV_VAR} placeholders, which are substituted by the corresponding env vars. + Supports an array of values separated by comma or specified via multiple flags. -rule.configCheckInterval duration - Interval for checking for changes in '-rule' files. By default the checking is disabled. Send SIGHUP signal in order to force config check for changes. DEPRECATED - see '-configCheckInterval' instead + Interval for checking for changes in '-rule' files. By default the checking is disabled. Send SIGHUP signal in order to force config check for changes. DEPRECATED - see '-configCheckInterval' instead -rule.maxResolveDuration duration - Limits the maximum duration for automatic alert expiration, which is by default equal to 3 evaluation intervals of the parent group. + Limits the maximum duration for automatic alert expiration, which is by default equal to 3 evaluation intervals of the parent group. -rule.resendDelay duration - Minimum amount of time to wait before resending an alert to notifier + Minimum amount of time to wait before resending an alert to notifier -rule.validateExpressions - Whether to validate rules expressions via MetricsQL engine (default true) + Whether to validate rules expressions via MetricsQL engine (default true) -rule.validateTemplates - Whether to validate annotation and label templates (default true) + Whether to validate annotation and label templates (default true) -tls - Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set + Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set -tlsCertFile string - Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated -tlsKeyFile string - Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated -version - Show VictoriaMetrics version + Show VictoriaMetrics version ``` ### Hot config reload + `vmalert` supports "hot" config reload via the following methods: + * send SIGHUP signal to `vmalert` process; * send GET request to `/-/reload` endpoint; * configure `-configCheckInterval` flag for periodic reload @@ -804,6 +821,7 @@ just add them in address: `-datasource.url=http://localhost:8428?nocache=1`. To set additional URL params for specific [group of rules](#Groups) modify the `params` group: + ```yaml groups: - name: TestGroup @@ -811,6 +829,7 @@ groups: denyPartialResponse: ["true"] extra_label: ["env=dev"] ``` + Please note, `params` are used only for executing rules expressions (requests to `datasource.url`). If there would be a conflict between URL params set in `datasource.url` flag and params in group definition the latter will have higher priority. @@ -818,15 +837,17 @@ the latter will have higher priority. ### Notifier configuration file Notifier also supports configuration via file specified with flag `notifier.config`: + ``` ./bin/vmalert -rule=app/vmalert/config/testdata/rules.good.rules \ - -datasource.url=http://localhost:8428 \ - -notifier.config=app/vmalert/notifier/testdata/consul.good.yaml + -datasource.url=http://localhost:8428 \ + -notifier.config=app/vmalert/notifier/testdata/consul.good.yaml ``` -The configuration file allows to configure static notifiers or discover notifiers via +The configuration file allows to configure static notifiers or discover notifiers via [Consul](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#consul_sd_config). For example: + ``` static_configs: - targets: @@ -843,6 +864,7 @@ The list of configured or discovered Notifiers can be explored via [UI](#Web). The configuration file [specification](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/app/vmalert/notifier/config.go) is the following: + ``` # Per-target Notifier timeout when pushing alerts. [ timeout: | default = 10s ] @@ -897,7 +919,6 @@ relabel_configs: The configuration file can be [hot-reloaded](#hot-config-reload). - ## Contributing `vmalert` is mostly designed and built by VictoriaMetrics community. @@ -908,8 +929,8 @@ software. Please keep simplicity as the main priority. It is recommended using [binary releases](https://github.com/VictoriaMetrics/VictoriaMetrics/releases) -- `vmalert` is located in `vmutils-*` archives there. +* `vmalert` is located in `vmutils-*` archives there. ### Development build @@ -923,7 +944,6 @@ It is recommended using 2. Run `make vmalert-prod` from the root folder of [the repository](https://github.com/VictoriaMetrics/VictoriaMetrics). It builds `vmalert-prod` binary and puts it into the `bin` folder. - ### ARM build ARM build may run on Raspberry Pi or on [energy-efficient ARM servers](https://blog.cloudflare.com/arm-takes-wing/). diff --git a/app/vmauth/README.md b/app/vmauth/README.md index 905bb7c68..861e42ac6 100644 --- a/app/vmauth/README.md +++ b/app/vmauth/README.md @@ -10,7 +10,7 @@ The `-auth.config` can point to either local file or to http url. Just download `vmutils-*` archive from [releases page](https://github.com/VictoriaMetrics/VictoriaMetrics/releases), unpack it and pass the following flag to `vmauth` binary in order to start authorizing and routing requests: -``` +```bash /path/to/vmauth -auth.config=/path/to/auth/config.yml ``` @@ -129,13 +129,13 @@ It is expected that all the backend services protected by `vmauth` are located i Do not transfer Basic Auth headers in plaintext over untrusted networks. Enable https. This can be done by passing the following `-tls*` command-line flags to `vmauth`: -``` +```bash -tls - Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set + Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set -tlsCertFile string - Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs, since RSA certs are slow + Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs, since RSA certs are slow -tlsKeyFile string - Path to file with TLS key. Used only if -tls is set + Path to file with TLS key. Used only if -tls is set ``` Alternatively, [https termination proxy](https://en.wikipedia.org/wiki/TLS_termination_proxy) may be put in front of `vmauth`. @@ -217,7 +217,7 @@ The collected profiles may be analyzed with [go tool pprof](https://github.com/g Pass `-help` command-line arg to `vmauth` in order to see all the configuration options: -``` +```bash ./vmauth -help vmauth authenticates and authorizes incoming requests and proxies them to VictoriaMetrics. @@ -225,70 +225,70 @@ vmauth authenticates and authorizes incoming requests and proxies them to Victor See the docs at https://docs.victoriametrics.com/vmauth.html . -auth.config string - Path to auth config. It can point either to local file or to http url. See https://docs.victoriametrics.com/vmauth.html for details on the format of this auth config + Path to auth config. It can point either to local file or to http url. See https://docs.victoriametrics.com/vmauth.html for details on the format of this auth config -enableTCP6 - Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used + Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used -envflag.enable - Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details + Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details -envflag.prefix string - Prefix for environment variables if -envflag.enable is set + Prefix for environment variables if -envflag.enable is set -eula - By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf + By specifying this flag, you confirm that you have an enterprise license and accept the EULA https://victoriametrics.com/assets/VM_EULA.pdf -fs.disableMmap - Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() + Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() -http.connTimeout duration - Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) + Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) -http.disableResponseCompression - Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth + Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth -http.idleConnTimeout duration - Timeout for incoming idle http connections (default 1m0s) + Timeout for incoming idle http connections (default 1m0s) -http.maxGracefulShutdownDuration duration - The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) + The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) -http.pathPrefix string - An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus + An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus -http.shutdownDelay duration - Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers + Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers -httpAuth.password string - Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty + Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty -httpAuth.username string - Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password + Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password -httpListenAddr string - TCP address to listen for http connections (default ":8427") + TCP address to listen for http connections (default ":8427") -logInvalidAuthTokens - Whether to log requests with invalid auth tokens. Such requests are always counted at vmauth_http_request_errors_total{reason="invalid_auth_token"} metric, which is exposed at /metrics page + Whether to log requests with invalid auth tokens. Such requests are always counted at vmauth_http_request_errors_total{reason="invalid_auth_token"} metric, which is exposed at /metrics page -loggerDisableTimestamps - Whether to disable writing timestamps in logs + Whether to disable writing timestamps in logs -loggerErrorsPerSecondLimit int - Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit + Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit -loggerFormat string - Format for logs. Possible values: default, json (default "default") + Format for logs. Possible values: default, json (default "default") -loggerLevel string - Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") + Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") -loggerOutput string - Output for the logs. Supported values: stderr, stdout (default "stderr") + Output for the logs. Supported values: stderr, stdout (default "stderr") -loggerTimezone string - Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") + Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") -loggerWarnsPerSecondLimit int - Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit + Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit -maxIdleConnsPerBackend int - The maximum number of idle connections vmauth can open per each backend host (default 100) + The maximum number of idle connections vmauth can open per each backend host (default 100) -memory.allowedBytes size - Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -memory.allowedPercent float - Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) + Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) -metricsAuthKey string - Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings -pprofAuthKey string - Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings -reloadAuthKey string - Auth key for /-/reload http endpoint. It must be passed as authKey=... + Auth key for /-/reload http endpoint. It must be passed as authKey=... -tls - Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set + Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set -tlsCertFile string - Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower. The provided certificate file is automatically re-read every second, so it can be dynamically updated -tlsKeyFile string - Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated + Path to file with TLS key. Used only if -tls is set. The provided key file is automatically re-read every second, so it can be dynamically updated -version - Show VictoriaMetrics version + Show VictoriaMetrics version ``` diff --git a/app/vmbackup/README.md b/app/vmbackup/README.md index 363b34e1e..91560c071 100644 --- a/app/vmbackup/README.md +++ b/app/vmbackup/README.md @@ -22,14 +22,13 @@ See [this article](https://medium.com/@valyala/speeding-up-backups-for-big-time- See also [vmbackupmanager](https://docs.victoriametrics.com/vmbackupmanager.html) tool built on top of `vmbackup`. This tool simplifies creation of hourly, daily, weekly and monthly backups. - ## Use cases ### Regular backups Regular backup can be performed with the following command: -``` +```bash vmbackup -storageDataPath= -snapshotName= -dst=gs:/// ``` @@ -39,36 +38,33 @@ vmbackup -storageDataPath= -snapshotName=` is an already existing name for [GCS bucket](https://cloud.google.com/storage/docs/creating-buckets). * `` is the destination path where new backup will be placed. - ### Regular backups with server-side copy from existing backup If the destination GCS bucket already contains the previous backup at `-origin` path, then new backup can be sped up with the following command: -``` +```bash vmbackup -storageDataPath= -snapshotName= -dst=gs:/// -origin=gs:/// ``` It saves time and network bandwidth costs by performing server-side copy for the shared data from the `-origin` to `-dst`. - ### Incremental backups Incremental backups are performed if `-dst` points to an already existing backup. In this case only new data is uploaded to remote storage. It saves time and network bandwidth costs when working with big backups: -``` +```bash vmbackup -storageDataPath= -snapshotName= -dst=gs:/// ``` - ### Smart backups Smart backups mean storing full daily backups into `YYYYMMDD` folders and creating incremental hourly backup into `latest` folder: * Run the following command every hour: -``` +```bash vmbackup -snapshotName= -dst=gs:///latest ``` @@ -77,13 +73,12 @@ The command will upload only changed data to `gs:///latest`. * Run the following command once a day: -``` +```bash vmbackup -snapshotName= -dst=gs:/// -origin=gs:///latest ``` Where `` is the snapshot for the last day ``. - This apporach saves network bandwidth costs on hourly backups (since they are incremental) and allows recovering data from either the last hour (`latest` backup) or from any day (`YYYYMMDD` backups). Note that hourly backup shouldn't run when creating daily backup. @@ -91,7 +86,6 @@ Do not forget to remove old snapshots and backups when they are no longer needed See also [vmbackupmanager tool](https://docs.victoriametrics.com/vmbackupmanager.html) for automating smart backups. - ## How does it work? The backup algorithm is the following: @@ -108,16 +102,15 @@ Such splitting minimizes the amounts of data to re-transfer after temporary erro `vmbackup` relies on [instant snapshot](https://medium.com/@valyala/how-victoriametrics-makes-instant-snapshots-for-multi-terabyte-time-series-data-e1f3fb0e0282) properties: -- All the files in the snapshot are immutable. -- Old files are periodically merged into new files. -- Smaller files have higher probability to be merged. -- Consecutive snapshots share many identical files. +* All the files in the snapshot are immutable. +* Old files are periodically merged into new files. +* Smaller files have higher probability to be merged. +* Consecutive snapshots share many identical files. These properties allow performing fast and cheap incremental backups and server-side copying from `-origin` paths. See [this article](https://medium.com/@valyala/speeding-up-backups-for-big-time-series-databases-533c1a927883) for more details. `vmbackup` can work improperly or slowly when these properties are violated. - ## Troubleshooting * If the backup is slow, then try setting higher value for `-concurrency` flag. This will increase the number of concurrent workers that upload data to backup storage. @@ -126,15 +119,14 @@ See [this article](https://medium.com/@valyala/speeding-up-backups-for-big-time- * Backups created from [single-node VictoriaMetrics](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html) cannot be restored at [cluster VictoriaMetrics](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html) and vice versa. - ## Advanced usage - * Obtaining credentials from a file. Add flag `-credsFilePath=/etc/credentials` with the following content: for s3 (aws, minio or other s3 compatible storages): + ```bash [default] aws_access_key_id=theaccesskey @@ -142,6 +134,7 @@ See [this article](https://medium.com/@valyala/speeding-up-backups-for-big-time- ``` for gce cloud storage: + ```json { "type": "service_account", @@ -159,7 +152,8 @@ See [this article](https://medium.com/@valyala/speeding-up-backups-for-big-time- * Usage with s3 custom url endpoint. It is possible to use `vmbackup` with s3 compatible storages like minio, cloudian, etc. You have to add a custom url endpoint via flag: -``` + +```bash # for minio -customS3Endpoint=http://localhost:9000 @@ -169,102 +163,100 @@ See [this article](https://medium.com/@valyala/speeding-up-backups-for-big-time- * Run `vmbackup -help` in order to see all the available options: -``` +```bash -concurrency int - The number of concurrent workers. Higher concurrency may reduce backup duration (default 10) + The number of concurrent workers. Higher concurrency may reduce backup duration (default 10) -configFilePath string - Path to file with S3 configs. Configs are loaded from default location if not set. - See https://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html + Path to file with S3 configs. Configs are loaded from default location if not set. + See https://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html -configProfile string - Profile name for S3 configs. If no set, the value of the environment variable will be loaded (AWS_PROFILE or AWS_DEFAULT_PROFILE), or if both not set, DefaultSharedConfigProfile is used + Profile name for S3 configs. If no set, the value of the environment variable will be loaded (AWS_PROFILE or AWS_DEFAULT_PROFILE), or if both not set, DefaultSharedConfigProfile is used -credsFilePath string - Path to file with GCS or S3 credentials. Credentials are loaded from default locations if not set. - See https://cloud.google.com/iam/docs/creating-managing-service-account-keys and https://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html + Path to file with GCS or S3 credentials. Credentials are loaded from default locations if not set. + See https://cloud.google.com/iam/docs/creating-managing-service-account-keys and https://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html -customS3Endpoint string - Custom S3 endpoint for use with S3-compatible storages (e.g. MinIO). S3 is used if not set + Custom S3 endpoint for use with S3-compatible storages (e.g. MinIO). S3 is used if not set -dst string - Where to put the backup on the remote storage. Example: gs://bucket/path/to/backup/dir, s3://bucket/path/to/backup/dir or fs:///path/to/local/backup/dir - -dst can point to the previous backup. In this case incremental backup is performed, i.e. only changed data is uploaded + Where to put the backup on the remote storage. Example: gs://bucket/path/to/backup/dir, s3://bucket/path/to/backup/dir or fs:///path/to/local/backup/dir + -dst can point to the previous backup. In this case incremental backup is performed, i.e. only changed data is uploaded -enableTCP6 - Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used + Whether to enable IPv6 for listening and dialing. By default only IPv4 TCP and UDP is used -envflag.enable - Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details + Whether to enable reading flags from environment variables additionally to command line. Command line flag values have priority over values from environment vars. Flags are read only from command line if this flag isn't set. See https://docs.victoriametrics.com/#environment-variables for more details -envflag.prefix string - Prefix for environment variables if -envflag.enable is set + Prefix for environment variables if -envflag.enable is set -fs.disableMmap - Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() + Whether to use pread() instead of mmap() for reading data files. By default mmap() is used for 64-bit arches and pread() is used for 32-bit arches, since they cannot read data files bigger than 2^32 bytes in memory. mmap() is usually faster for reading small data chunks than pread() -http.connTimeout duration - Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) + Incoming http connections are closed after the configured timeout. This may help to spread the incoming load among a cluster of services behind a load balancer. Please note that the real timeout may be bigger by up to 10% as a protection against the thundering herd problem (default 2m0s) -http.disableResponseCompression - Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth + Disable compression of HTTP responses to save CPU resources. By default compression is enabled to save network bandwidth -http.idleConnTimeout duration - Timeout for incoming idle http connections (default 1m0s) + Timeout for incoming idle http connections (default 1m0s) -http.maxGracefulShutdownDuration duration - The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) + The maximum duration for a graceful shutdown of the HTTP server. A highly loaded server may require increased value for a graceful shutdown (default 7s) -http.pathPrefix string - An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus + An optional prefix to add to all the paths handled by http server. For example, if '-http.pathPrefix=/foo/bar' is set, then all the http requests will be handled on '/foo/bar/*' paths. This may be useful for proxied requests. See https://www.robustperception.io/using-external-urls-and-proxies-with-prometheus -http.shutdownDelay duration - Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers + Optional delay before http server shutdown. During this delay, the server returns non-OK responses from /health page, so load balancers can route new requests to other servers -httpAuth.password string - Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty + Password for HTTP Basic Auth. The authentication is disabled if -httpAuth.username is empty -httpAuth.username string - Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password + Username for HTTP Basic Auth. The authentication is disabled if empty. See also -httpAuth.password -httpListenAddr string - TCP address for exporting metrics at /metrics page (default ":8420") + TCP address for exporting metrics at /metrics page (default ":8420") -loggerDisableTimestamps - Whether to disable writing timestamps in logs + Whether to disable writing timestamps in logs -loggerErrorsPerSecondLimit int - Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit + Per-second limit on the number of ERROR messages. If more than the given number of errors are emitted per second, the remaining errors are suppressed. Zero values disable the rate limit -loggerFormat string - Format for logs. Possible values: default, json (default "default") + Format for logs. Possible values: default, json (default "default") -loggerLevel string - Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") + Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC (default "INFO") -loggerOutput string - Output for the logs. Supported values: stderr, stdout (default "stderr") + Output for the logs. Supported values: stderr, stdout (default "stderr") -loggerTimezone string - Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") + Timezone to use for timestamps in logs. Timezone must be a valid IANA Time Zone. For example: America/New_York, Europe/Berlin, Etc/GMT+3 or Local (default "UTC") -loggerWarnsPerSecondLimit int - Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit + Per-second limit on the number of WARN messages. If more than the given number of warns are emitted per second, then the remaining warns are suppressed. Zero values disable the rate limit -maxBytesPerSecond size - The maximum upload speed. There is no limit if it is set to 0 - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + The maximum upload speed. There is no limit if it is set to 0 + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -memory.allowedBytes size - Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage - Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) + Allowed size of system memory VictoriaMetrics caches may occupy. This option overrides -memory.allowedPercent if set to a non-zero value. Too low a value may increase the cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache resulting in higher disk IO usage + Supports the following optional suffixes for size values: KB, MB, GB, KiB, MiB, GiB (default 0) -memory.allowedPercent float - Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) + Allowed percent of system memory VictoriaMetrics caches may occupy. See also -memory.allowedBytes. Too low a value may increase cache miss rate usually resulting in higher CPU and disk IO usage. Too high a value may evict too much data from OS page cache which will result in higher disk IO usage (default 60) -metricsAuthKey string - Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /metrics. It must be passed via authKey query arg. It overrides httpAuth.* settings -origin string - Optional origin directory on the remote storage with old backup for server-side copying when performing full backup. This speeds up full backups + Optional origin directory on the remote storage with old backup for server-side copying when performing full backup. This speeds up full backups -pprofAuthKey string - Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings + Auth key for /debug/pprof. It must be passed via authKey query arg. It overrides httpAuth.* settings -s3ForcePathStyle - Prefixing endpoint with bucket name when set false, true by default. (default true) + Prefixing endpoint with bucket name when set false, true by default. (default true) -snapshot.createURL string - VictoriaMetrics create snapshot url. When this is given a snapshot will automatically be created during backup. Example: http://victoriametrics:8428/snapshot/create . There is no need in setting -snapshotName if -snapshot.createURL is set + VictoriaMetrics create snapshot url. When this is given a snapshot will automatically be created during backup. Example: http://victoriametrics:8428/snapshot/create . There is no need in setting -snapshotName if -snapshot.createURL is set -snapshot.deleteURL string - VictoriaMetrics delete snapshot url. Optional. Will be generated from -snapshot.createURL if not provided. All created snapshots will be automatically deleted. Example: http://victoriametrics:8428/snapshot/delete + VictoriaMetrics delete snapshot url. Optional. Will be generated from -snapshot.createURL if not provided. All created snapshots will be automatically deleted. Example: http://victoriametrics:8428/snapshot/delete -snapshotName string - Name for the snapshot to backup. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-work-with-snapshots. There is no need in setting -snapshotName if -snapshot.createURL is set + Name for the snapshot to backup. See https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-work-with-snapshots. There is no need in setting -snapshotName if -snapshot.createURL is set -storageDataPath string - Path to VictoriaMetrics data. Must match -storageDataPath from VictoriaMetrics or vmstorage (default "victoria-metrics-data") + Path to VictoriaMetrics data. Must match -storageDataPath from VictoriaMetrics or vmstorage (default "victoria-metrics-data") -tls - Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set + Whether to enable TLS (aka HTTPS) for incoming requests. -tlsCertFile and -tlsKeyFile must be set if -tls is set -tlsCertFile string - Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower + Path to file with TLS certificate. Used only if -tls is set. Prefer ECDSA certs instead of RSA certs as RSA certs are slower -tlsKeyFile string - Path to file with TLS key. Used only if -tls is set + Path to file with TLS key. Used only if -tls is set -version - Show VictoriaMetrics version + Show VictoriaMetrics version ``` - ## How to build from sources It is recommended using [binary releases](https://github.com/VictoriaMetrics/VictoriaMetrics/releases) - see `vmutils-*` archives there. - ### Development build 1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.17. diff --git a/app/vmbackupmanager/README.md b/app/vmbackupmanager/README.md index dc056fa9c..94f169a05 100644 --- a/app/vmbackupmanager/README.md +++ b/app/vmbackupmanager/README.md @@ -9,11 +9,10 @@ The required flags for running the service are as follows: * -eula - should be true and means that you have the legal right to run a backup manager. That can either be a signed contract or an email with confirmation to run the service in a trial period * -storageDataPath - path to VictoriaMetrics or vmstorage data path to make backup from -* -snapshot.createURL - VictoriaMetrics creates snapshot URL which will automatically be created during backup. Example: http://victoriametrics:8428/snapshot/create +* -snapshot.createURL - VictoriaMetrics creates snapshot URL which will automatically be created during backup. Example: * -dst - backup destination at s3, gcs or local filesystem * -credsFilePath - path to file with GCS or S3 credentials. Credentials are loaded from default locations if not set. See [https://cloud.google.com/iam/docs/creating-managing-service-account-keys](https://cloud.google.com/iam/docs/creating-managing-service-account-keys) and [https://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html](https://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html) - Backup schedule is controlled by the following flags: * -disableHourly - disable hourly run. Default false @@ -23,7 +22,6 @@ Backup schedule is controlled by the following flags: By default, all flags are turned on and Backup Manager backups data every hour for every interval (hourly, daily, weekly and monthly). - The backup manager creates the following directory hierarchy at **-dst**: * /latest/ - contains the latest backup @@ -32,7 +30,6 @@ The backup manager creates the following directory hierarchy at **-dst**: * /weekly/ - contains weekly backups. Each backup is named as *YYYY-WW* * /monthly/ - contains monthly backups. Each backup is named as *YYYY-MM* - To get the full list of supported flags please run the following command: ```console @@ -48,7 +45,6 @@ There are two flags which could help with performance tuning: * -maxBytesPerSecond - the maximum upload speed. There is no limit if it is set to 0 * -concurrency - The number of concurrent workers. Higher concurrency may improve upload speed (default 10) - ## Example of Usage GCS and cluster version. You need to have a credentials file in json format with following structure @@ -96,11 +92,11 @@ info VictoriaMetrics/lib/storage/storage.go:319 deleted snapshot "/vmstora The result on the GCS bucket -- The root folder +* The root folder ![root](vmbackupmanager_root_folder.png) -- The latest folder +* The latest folder ![latest](vmbackupmanager_latest_folder.png) @@ -119,7 +115,6 @@ Let’s assume we have a backup manager collecting daily backups for the past 10 ![daily](vmbackupmanager_rp_daily_1.png) - We enable backup retention policy for backup manager by using following configuration: ```console diff --git a/app/vmctl/README.md b/app/vmctl/README.md index 30a394d29..800d3f43d 100644 --- a/app/vmctl/README.md +++ b/app/vmctl/README.md @@ -3,18 +3,20 @@ VictoriaMetrics command-line tool Features: + - [x] Prometheus: migrate data from Prometheus to VictoriaMetrics using snapshot API - [x] Thanos: migrate data from Thanos to VictoriaMetrics - [ ] ~~Prometheus: migrate data from Prometheus to VictoriaMetrics by query~~(discarded) - [x] InfluxDB: migrate data from InfluxDB to VictoriaMetrics - [x] OpenTSDB: migrate data from OpenTSDB to VictoriaMetrics -- [ ] Storage Management: data re-balancing between nodes +- [ ] Storage Management: data re-balancing between nodes -vmctl acts as a proxy between data source ([Prometheus](#migrating-data-from-prometheus), +vmctl acts as a proxy between data source ([Prometheus](#migrating-data-from-prometheus), [InfluxDB](#migrating-data-from-influxdb-1x), [VictoriaMetrics](##migrating-data-from-victoriametrics), etc.) -and destination - VictoriaMetrics single or cluster version. To see the full list of supported modes +and destination - VictoriaMetrics single or cluster version. To see the full list of supported modes run the following command: -``` + +```bash ./vmctl --help NAME: vmctl - VictoriaMetrics command-line tool @@ -31,6 +33,7 @@ COMMANDS: Each mode has its own unique set of flags specific (e.g. prefixed with `influx` for influx mode) to the data source and common list of flags for destination (prefixed with `vm` for VictoriaMetrics): + ``` ./vmctl influx --help OPTIONS: @@ -46,10 +49,11 @@ Please note, that vmctl performs initial readiness check for the given address b ``` When doing a migration user needs to specify flags for source (where and how to fetch data) and for -destination (where to migrate data). Every mode has additional details and nuances, please see +destination (where to migrate data). Every mode has additional details and nuances, please see them below in corresponding sections. For the destination flags see the full description by running the following command: + ``` ./vmctl influx --help | grep vm- ``` @@ -59,14 +63,13 @@ has additional sections with description below. Details about tweaking and adjus are explained in [Tuning](#tuning) section. Please note, that if you're going to import data into VictoriaMetrics cluster do not -forget to specify the `--vm-account-id` flag. See more details for cluster version +forget to specify the `--vm-account-id` flag. See more details for cluster version [here](https://github.com/VictoriaMetrics/VictoriaMetrics/tree/cluster). ## Articles -* [How to migrate data from Prometheus](https://medium.com/@romanhavronenko/victoriametrics-how-to-migrate-data-from-prometheus-d44a6728f043) -* [How to migrate data from Prometheus. Filtering and modifying time series](https://medium.com/@romanhavronenko/victoriametrics-how-to-migrate-data-from-prometheus-filtering-and-modifying-time-series-6d40cea4bf21) - +- [How to migrate data from Prometheus](https://medium.com/@romanhavronenko/victoriametrics-how-to-migrate-data-from-prometheus-d44a6728f043) +- [How to migrate data from Prometheus. Filtering and modifying time series](https://medium.com/@romanhavronenko/victoriametrics-how-to-migrate-data-from-prometheus-filtering-and-modifying-time-series-6d40cea4bf21) ## Migrating data from OpenTSDB @@ -79,16 +82,21 @@ See `./vmctl opentsdb --help` for details and full list of flags. OpenTSDB migration works like so: 1. Find metrics based on selected filters (or the default filter set ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']) - * e.g. `curl -Ss "http://opentsdb:4242/api/suggest?type=metrics&q=sys"` + +- e.g. `curl -Ss "http://opentsdb:4242/api/suggest?type=metrics&q=sys"` + 2. Find series associated with each returned metric - * e.g. `curl -Ss "http://opentsdb:4242/api/search/lookup?m=system.load5&limit=1000000"` + +- e.g. `curl -Ss "http://opentsdb:4242/api/search/lookup?m=system.load5&limit=1000000"` + 3. Download data for each series in chunks defined in the CLI switches - * e.g. `-retention=sum-1m-avg:1h:90d` == - * `curl -Ss "http://opentsdb:4242/api/query?start=1h-ago&end=now&m=sum:1m-avg-none:system.load5\{host=host1\}"` - * `curl -Ss "http://opentsdb:4242/api/query?start=2h-ago&end=1h-ago&m=sum:1m-avg-none:system.load5\{host=host1\}"` - * `curl -Ss "http://opentsdb:4242/api/query?start=3h-ago&end=2h-ago&m=sum:1m-avg-none:system.load5\{host=host1\}"` - * ... - * `curl -Ss "http://opentsdb:4242/api/query?start=2160h-ago&end=2159h-ago&m=sum:1m-avg-none:system.load5\{host=host1\}"` + +- e.g. `-retention=sum-1m-avg:1h:90d` == + - `curl -Ss "http://opentsdb:4242/api/query?start=1h-ago&end=now&m=sum:1m-avg-none:system.load5\{host=host1\}"` + - `curl -Ss "http://opentsdb:4242/api/query?start=2h-ago&end=1h-ago&m=sum:1m-avg-none:system.load5\{host=host1\}"` + - `curl -Ss "http://opentsdb:4242/api/query?start=3h-ago&end=2h-ago&m=sum:1m-avg-none:system.load5\{host=host1\}"` + - ... + - `curl -Ss "http://opentsdb:4242/api/query?start=2160h-ago&end=2159h-ago&m=sum:1m-avg-none:system.load5\{host=host1\}"` This means that we must stream data from OpenTSDB to VictoriaMetrics in chunks. This is where concurrency for OpenTSDB comes in. We can query multiple chunks at once, but we shouldn't perform too many chunks at a time to avoid overloading the OpenTSDB cluster. @@ -107,6 +115,7 @@ Found 9 metrics to import. Continue? [Y/n] Starting with a relatively simple retention string (`sum-1m-avg:1h:30d`), let's describe how this is converted into actual queries. There are two essential parts of a retention string: + 1. [aggregation](#aggregation) 2. [windows/time ranges](#windows) @@ -115,8 +124,9 @@ There are two essential parts of a retention string: Retention strings essentially define the two levels of aggregation for our collected series. `sum-1m-avg` would become: -* First order: `sum` -* Second order: `1m-avg-none` + +- First order: `sum` +- Second order: `1m-avg-none` ##### First Order Aggregations @@ -137,6 +147,7 @@ We do not allow for defining the "null value" portion of the rollup window (e.g. #### Windows There are two important windows we define in a retention string: + 1. the "chunk" range of each query 2. The time range we will be querying on with that "chunk" @@ -182,8 +193,8 @@ See `./vmctl influx --help` for details and full list of flags. To use migration tool please specify the InfluxDB address `--influx-addr`, the database `--influx-database` and VictoriaMetrics address `--vm-addr`. Flag `--vm-addr` for single-node VM is usually equal to `--httpListenAddr`, and for cluster version -is equal to `--httpListenAddr` flag of vminsert component. Please note, that vmctl performs initial readiness check for the given address -by checking `/health` endpoint. For cluster version it is additionally required to specify the `--vm-account-id` flag. +is equal to `--httpListenAddr` flag of vminsert component. Please note, that vmctl performs initial readiness check for the given address +by checking `/health` endpoint. For cluster version it is additionally required to specify the `--vm-account-id` flag. See more details for cluster version [here](https://github.com/VictoriaMetrics/VictoriaMetrics/tree/cluster). As soon as required flags are provided and all endpoints are accessible, `vmctl` will start the InfluxDB scheme exploration. @@ -191,8 +202,9 @@ Basically, it just fetches all fields and timeseries from the provided database Then `vmctl` sends fetch requests for each timeseries to InfluxDB one by one and pass results to VM importer. VM importer then accumulates received samples in batches and sends import requests to VM. -The importing process example for local installation of InfluxDB(`http://localhost:8086`) +The importing process example for local installation of InfluxDB(`http://localhost:8086`) and single-node VictoriaMetrics(`http://localhost:8428`): + ``` ./vmctl influx --influx-database benchmark InfluxDB import mode @@ -212,25 +224,27 @@ Found 40000 timeseries to import. Continue? [Y/n] y bytes/s: 5.4 MB; import requests: 40001; 2020/01/18 21:19:00 Total time: 31m48.467044016s -``` +``` ### Data mapping Vmctl maps InfluxDB data the same way as VictoriaMetrics does by using the following rules: -* `influx-database` arg is mapped into `db` label value unless `db` tag exists in the InfluxDB line. -* Field names are mapped to time series names prefixed with {measurement}{separator} value, -where {separator} equals to _ by default. +- `influx-database` arg is mapped into `db` label value unless `db` tag exists in the InfluxDB line. +- Field names are mapped to time series names prefixed with {measurement}{separator} value, +where {separator} equals to _ by default. It can be changed with `--influx-measurement-field-separator` command-line flag. -* Field values are mapped to time series values. -* Tags are mapped to Prometheus labels format as-is. +- Field values are mapped to time series values. +- Tags are mapped to Prometheus labels format as-is. For example, the following InfluxDB line: + ``` foo,tag1=value1,tag2=value2 field1=12,field2=40 ``` is converted into the following Prometheus format data points: + ``` foo_field1{tag1="value1", tag2="value2"} 12 foo_field2{tag1="value1", tag2="value2"} 40 @@ -238,7 +252,7 @@ foo_field2{tag1="value1", tag2="value2"} 40 ### Configuration -The configuration flags should contain self-explanatory descriptions. +The configuration flags should contain self-explanatory descriptions. ### Filtering @@ -246,6 +260,7 @@ The filtering consists of two parts: timeseries and time. The first step of application is to select all available timeseries for given database and retention. User may specify additional filtering condition via `--influx-filter-series` flag. For example: + ``` ./vmctl influx --influx-database benchmark \ --influx-filter-series "on benchmark from cpu where hostname='host_1703'" @@ -256,13 +271,15 @@ InfluxDB import mode 2020/01/26 14:23:29 fetching series: command: "show series on benchmark from cpu where hostname='host_1703'"; database: "benchmark"; retention: "autogen" Found 10 timeseries to import. Continue? [Y/n] ``` + The timeseries select query would be following: `fetching series: command: "show series on benchmark from cpu where hostname='host_1703'"; database: "benchmark"; retention: "autogen"` - + The second step of filtering is a time filter and it applies when fetching the datapoints from Influx. Time filtering may be configured with two flags: -* --influx-filter-time-start -* --influx-filter-time-end + +- --influx-filter-time-start +- --influx-filter-time-end Here's an example of importing timeseries for one day only: `./vmctl influx --influx-database benchmark --influx-filter-series "where hostname='host_1703'" --influx-filter-time-start "2020-01-01T10:07:00Z" --influx-filter-time-end "2020-01-01T15:07:00Z"` @@ -271,36 +288,36 @@ Please see more about time filtering [here](https://docs.influxdata.com/influxdb ## Migrating data from InfluxDB (2.x) Migrating data from InfluxDB v2.x is not supported yet ([#32](https://github.com/VictoriaMetrics/vmctl/issues/32)). -You may find useful a 3rd party solution for this - https://github.com/jonppe/influx_to_victoriametrics. - +You may find useful a 3rd party solution for this - . ## Migrating data from Prometheus `vmctl` supports the `prometheus` mode for migrating data from Prometheus to VictoriaMetrics time-series database. -Migration is based on reading Prometheus snapshot, which is basically a hard-link to Prometheus data files. +Migration is based on reading Prometheus snapshot, which is basically a hard-link to Prometheus data files. See `./vmctl prometheus --help` for details and full list of flags. Also see Prometheus related articles [here](#articles). To use migration tool please specify the file path to Prometheus snapshot `--prom-snapshot` (see how to make a snapshot [here](https://www.robustperception.io/taking-snapshots-of-prometheus-data)) and VictoriaMetrics address `--vm-addr`. Please note, that `vmctl` *do not make a snapshot from Prometheus*, it uses an already prepared snapshot. More about Prometheus snapshots may be found [here](https://www.robustperception.io/taking-snapshots-of-prometheus-data) and [here](https://medium.com/@romanhavronenko/victoriametrics-how-to-migrate-data-from-prometheus-d44a6728f043). Flag `--vm-addr` for single-node VM is usually equal to `--httpListenAddr`, and for cluster version -is equal to `--httpListenAddr` flag of vminsert component. Please note, that vmctl performs initial readiness check for the given address -by checking `/health` endpoint. For cluster version it is additionally required to specify the `--vm-account-id` flag. +is equal to `--httpListenAddr` flag of vminsert component. Please note, that vmctl performs initial readiness check for the given address +by checking `/health` endpoint. For cluster version it is additionally required to specify the `--vm-account-id` flag. See more details for cluster version [here](https://github.com/VictoriaMetrics/VictoriaMetrics/tree/cluster). As soon as required flags are provided and all endpoints are accessible, `vmctl` will start the Prometheus snapshot exploration. Basically, it just fetches all available blocks in provided snapshot and read the metadata. It also does initial filtering by time if flags `--prom-filter-time-start` or `--prom-filter-time-end` were set. The exploration procedure prints some stats from read blocks. Please note that stats are not taking into account timeseries or samples filtering. This will be done during importing process. - + The importing process takes the snapshot blocks revealed from Explore procedure and processes them one by one accumulating timeseries and samples. Please note, that `vmctl` relies on responses from InfluxDB on this stage, -so ensure that Explore queries are executed without errors or limits. Please see this +so ensure that Explore queries are executed without errors or limits. Please see this [issue](https://github.com/VictoriaMetrics/vmctl/issues/30) for details. The data processed in chunks and then sent to VM. -The importing process example for local installation of Prometheus +The importing process example for local installation of Prometheus and single-node VictoriaMetrics(`http://localhost:8428`): + ``` ./vmctl prometheus --prom-snapshot=/path/to/snapshot \ --vm-concurrency=1 \ @@ -327,7 +344,7 @@ Found 14 blocks to import. Continue? [Y/n] y import requests: 323; import requests retries: 0; 2020/02/23 15:50:03 Total time: 51.077451066s -``` +``` ### Data mapping @@ -336,7 +353,7 @@ So no data changes will be applied. ### Configuration -The configuration flags should contain self-explanatory descriptions. +The configuration flags should contain self-explanatory descriptions. ### Filtering @@ -347,6 +364,7 @@ in in RFC3339 format. This filter applied twice: to drop blocks out of range and overlapping time range. Example of applying time filter: + ``` ./vmctl prometheus --prom-snapshot=/path/to/snapshot \ --prom-filter-time-start=2020-02-07T00:07:01Z \ @@ -366,12 +384,13 @@ Please notice, that total amount of blocks in provided snapshot is 14, but only time range. So other 12 blocks were marked as `skipped`. The amount of samples and series is not taken into account, since this is heavy operation and will be done during import process. +Filtering by timeseries is configured with following flags: -Filtering by timeseries is configured with following flags: -* `--prom-filter-label` - the label name, e.g. `__name__` or `instance`; -* `--prom-filter-label-value` - the regular expression to filter the label value. By default matches all `.*` +- `--prom-filter-label` - the label name, e.g. `__name__` or `instance`; +- `--prom-filter-label-value` - the regular expression to filter the label value. By default matches all `.*` For example: + ``` ./vmctl prometheus --prom-snapshot=/path/to/snapshot \ --prom-filter-label="__name__" \ @@ -405,38 +424,44 @@ Found 2 blocks to import. Continue? [Y/n] y Thanos uses the same storage engine as Prometheus and the data layout on-disk should be the same. That means `vmctl` in mode `prometheus` may be used for Thanos historical data migration as well. -These instructions may vary based on the details of your Thanos configuration. -Please read carefully and verify as you go. We assume you're using Thanos Sidecar on your Prometheus pods, +These instructions may vary based on the details of your Thanos configuration. +Please read carefully and verify as you go. We assume you're using Thanos Sidecar on your Prometheus pods, and that you have a separate Thanos Store installation. ### Current data -1. For now, keep your Thanos Sidecar and Thanos-related Prometheus configuration, but add this to also stream +1. For now, keep your Thanos Sidecar and Thanos-related Prometheus configuration, but add this to also stream metrics to VictoriaMetrics: + ``` remote_write: - url: http://victoria-metrics:8428/api/v1/write ``` -2. Make sure VM is running, of course. Now check the logs to make sure that Prometheus is sending and VM is receiving. + +2. Make sure VM is running, of course. Now check the logs to make sure that Prometheus is sending and VM is receiving. In Prometheus, make sure there are no errors. On the VM side, you should see messages like this: + ``` - 2020-04-27T18:38:46.474Z info VictoriaMetrics/lib/storage/partition.go:207 creating a partition "2020_04" with smallPartsPath="/victoria-metrics-data/data/small/2020_04", bigPartsPath="/victoria-metrics-data/data/big/2020_04" - 2020-04-27T18:38:46.506Z info VictoriaMetrics/lib/storage/partition.go:222 partition "2020_04" has been created + 2020-04-27T18:38:46.474Z info VictoriaMetrics/lib/storage/partition.go:207 creating a partition "2020_04" with smallPartsPath="/victoria-metrics-data/data/small/2020_04", bigPartsPath="/victoria-metrics-data/data/big/2020_04" + 2020-04-27T18:38:46.506Z info VictoriaMetrics/lib/storage/partition.go:222 partition "2020_04" has been created ``` + 3. Now just wait. Within two hours, Prometheus should finish its current data file and hand it off to Thanos Store for long term storage. ### Historical data -Let's assume your data is stored on S3 served by minio. You first need to copy that out to a local filesystem, +Let's assume your data is stored on S3 served by minio. You first need to copy that out to a local filesystem, then import it into VM using `vmctl` in `prometheus` mode. + 1. Copy data from minio. 1. Run the `minio/mc` Docker container. 1. `mc config host add minio http://minio:9000 accessKey secretKey`, substituting appropriate values for the last 3 items. 1. `mc cp -r minio/prometheus thanos-data` 1. Import using `vmctl`. 1. Follow the [instructions](#how-to-build) to compile `vmctl` on your machine. - 1. Use [prometheus](#migrating-data-from-prometheus) mode to import data: + 1. Use [prometheus](#migrating-data-from-prometheus) mode to import data: + ``` vmctl prometheus --prom-snapshot thanos-data --vm-addr http://victoria-metrics:8428 ``` @@ -453,8 +478,8 @@ or higher. See `./vmctl vm-native --help` for details and full list of flags. -In this mode `vmctl` acts as a proxy between two VM instances, where time series filtering is done by "source" (`src`) -and processing is done by "destination" (`dst`). Because of that, `vmctl` doesn't actually know how much data will be +In this mode `vmctl` acts as a proxy between two VM instances, where time series filtering is done by "source" (`src`) +and processing is done by "destination" (`dst`). Because of that, `vmctl` doesn't actually know how much data will be processed and can't show the progress bar. It will show the current processing speed and total number of processed bytes: ``` @@ -468,14 +493,15 @@ Initing export pipe from "http://localhost:8528" with filters: Initing import process to "http://localhost:8428": Total: 336.75 KiB ↖ Speed: 454.46 KiB p/s 2020/10/13 17:04:59 Total time: 952.143376ms -``` +``` Importing tips: -1. Migrating all the metrics from one VM to another may collide with existing application metrics -(prefixed with `vm_`) at destination and lead to confusion when using -[official Grafana dashboards](https://grafana.com/orgs/victoriametrics/dashboards). + +1. Migrating all the metrics from one VM to another may collide with existing application metrics +(prefixed with `vm_`) at destination and lead to confusion when using +[official Grafana dashboards](https://grafana.com/orgs/victoriametrics/dashboards). To avoid such situation try to filter out VM process metrics via `--vm-native-filter-match` flag. -2. Migration is a backfilling process, so it is recommended to read +2. Migration is a backfilling process, so it is recommended to read [Backfilling tips](https://github.com/VictoriaMetrics/VictoriaMetrics#backfilling) section. 3. `vmctl` doesn't provide relabeling or other types of labels management in this mode. Instead, use [relabeling in VictoriaMetrics](https://github.com/VictoriaMetrics/vmctl/issues/4#issuecomment-683424375). @@ -491,7 +517,7 @@ timeseries. Please set it wisely to avoid InfluxDB overwhelming. The flag `--influx-chunk-size` controls the max amount of datapoints to return in single chunk from fetch requests. Please see more details [here](https://docs.influxdata.com/influxdb/v1.7/guides/querying_data/#chunking). -The chunk size is used to control InfluxDB memory usage, so it won't OOM on processing large timeseries with +The chunk size is used to control InfluxDB memory usage, so it won't OOM on processing large timeseries with billions of datapoints. ### Prometheus mode @@ -507,17 +533,18 @@ Please note that each import request can load up to a single vCPU core on Victor to allocated CPU resources of your VictoriMetrics installation. The flag `--vm-batch-size` controls max amount of samples collected before sending the import request. -For example, if `--influx-chunk-size=500` and `--vm-batch-size=2000` then importer will process not more -than 4 chunks before sending the request. +For example, if `--influx-chunk-size=500` and `--vm-batch-size=2000` then importer will process not more +than 4 chunks before sending the request. ### Importer stats -After successful import `vmctl` prints some statistics for details. +After successful import `vmctl` prints some statistics for details. The important numbers to watch are following: - - `idle duration` - shows time that importer spent while waiting for data from InfluxDB/Prometheus + +- `idle duration` - shows time that importer spent while waiting for data from InfluxDB/Prometheus to fill up `--vm-batch-size` batch size. Value shows total duration across all workers configured via `--vm-concurrency`. High value may be a sign of too slow InfluxDB/Prometheus fetches or too -high `--vm-concurrency` value. Try to improve it by increasing `---concurrency` value or +high `--vm-concurrency` value. Try to improve it by increasing `---concurrency` value or decreasing `--vm-concurrency` value. - `import requests` - shows how many import requests were issued to VM server. The import request is issued once the batch size(`--vm-batch-size`) is full and ready to be sent. @@ -529,6 +556,7 @@ a sign of network issues or VM being overloaded. See the logs during import for By default `vmctl` waits confirmation from user before starting the import. If this is unwanted behavior and no user interaction required - pass `-s` flag to enable "silence" mode: + ``` -s Whether to run in silent mode. If set to true no confirmation prompts will appear. (default: false) ``` @@ -537,18 +565,18 @@ behavior and no user interaction required - pass `-s` flag to enable "silence" m `vmctl` allows to limit the number of [significant figures](https://en.wikipedia.org/wiki/Significant_figures) before importing. For example, the average value for response size is `102.342305` bytes and it has 9 significant figures. -If you ask a human to pronounce this value then with high probability value will be rounded to first 4 or 5 figures -because the rest aren't really that important to mention. In most cases, such a high precision is too much. -Moreover, such values may be just a result of [floating point arithmetic](https://en.wikipedia.org/wiki/Floating-point_arithmetic), -create a [false precision](https://en.wikipedia.org/wiki/False_precision) and result into bad compression ratio -according to [information theory](https://en.wikipedia.org/wiki/Information_theory). +If you ask a human to pronounce this value then with high probability value will be rounded to first 4 or 5 figures +because the rest aren't really that important to mention. In most cases, such a high precision is too much. +Moreover, such values may be just a result of [floating point arithmetic](https://en.wikipedia.org/wiki/Floating-point_arithmetic), +create a [false precision](https://en.wikipedia.org/wiki/False_precision) and result into bad compression ratio +according to [information theory](https://en.wikipedia.org/wiki/Information_theory). `vmctl` provides the following flags for improving data compression: -* `--vm-round-digits` flag for rounding processed values to the given number of decimal digits after the point. +- `--vm-round-digits` flag for rounding processed values to the given number of decimal digits after the point. For example, `--vm-round-digits=2` would round `1.2345` to `1.23`. By default the rounding is disabled. -* `--vm-significant-figures` flag for limiting the number of significant figures in processed values. It takes no effect if set +- `--vm-significant-figures` flag for limiting the number of significant figures in processed values. It takes no effect if set to 0 (by default), but set `--vm-significant-figures=5` and `102.342305` will be rounded to `102.34`. The most common case for using these flags is to improve data compression for time series storing aggregation @@ -556,7 +584,7 @@ results such as `average`, `rate`, etc. ### Adding extra labels - `vmctl` allows to add extra labels to all imported series. It can be achived with flag `--vm-extra-label label=value`. + `vmctl` allows to add extra labels to all imported series. It can be achived with flag `--vm-extra-label label=value`. If multiple labels needs to be added, set flag for each label, for example, `--vm-extra-label label1=value1 --vm-extra-label label2=value2`. If timeseries already have label, that must be added with `--vm-extra-label` flag, flag has priority and will override label value from timeseries. @@ -565,15 +593,13 @@ results such as `average`, `rate`, etc. Limiting the rate of data transfer could help to reduce pressure on disk or on destination database. The rate limit may be set in bytes-per-second via `--vm-rate-limit` flag. -Please note, you can also use [vmagent](https://docs.victoriametrics.com/vmagent.html) +Please note, you can also use [vmagent](https://docs.victoriametrics.com/vmagent.html) as a proxy between `vmctl` and destination with `-remoteWrite.rateLimit` flag enabled. - ## How to build It is recommended using [binary releases](https://github.com/VictoriaMetrics/VictoriaMetrics/releases) - `vmctl` is located in `vmutils-*` archives there. - ### Development build 1. [Install Go](https://golang.org/doc/install). The minimum supported version is Go 1.17. diff --git a/app/vmgateway/README.md b/app/vmgateway/README.md index 52181bf54..51e71b723 100644 --- a/app/vmgateway/README.md +++ b/app/vmgateway/README.md @@ -2,7 +2,6 @@ ***vmgateway is a part of [enterprise package](https://victoriametrics.com/products/enterprise/). It is available for download and evaluation at [releases page](https://github.com/VictoriaMetrics/VictoriaMetrics/releases)*** - vmgateway `vmgateway` is a proxy for the VictoriaMetrics Time Series Database (TSDB). It provides the following features: @@ -16,7 +15,6 @@ `vmgateway` is included in our [enterprise packages](https://victoriametrics.com/products/enterprise/). - ## Access Control vmgateway-ac @@ -24,6 +22,7 @@ `vmgateway` supports jwt based authentication. With jwt payload can be configured to give access to specific tenants and labels as well as to read/write. jwt token must be in following format: + ```json { "exp": 1617304574, @@ -41,13 +40,15 @@ jwt token must be in following format: } } ``` + Where: -- `exp` - required, expire time in unix_timestamp. If the token expires then `vmgateway` rejects the request. -- `vm_access` - required, dict with claim info, minimum form: `{"vm_access": {"tenand_id": {}}` -- `tenant_id` - optional, for cluster mode, routes requests to the corresponding tenant. -- `extra_labels` - optional, key-value pairs for label filters added to the ingested or selected metrics. Multiple filters are added with `and` operation. If defined, `extra_label` from original request removed. -- `extra_filters` - optional, [series selectors](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors) added to the select query requests. Multiple selectors are added with `or` operation. If defined, `extra_filter` from original request removed. -- `mode` - optional, access mode for api - read, write, or full. Supported values: 0 - full (default value), 1 - read, 2 - write. + +* `exp` - required, expire time in unix_timestamp. If the token expires then `vmgateway` rejects the request. +* `vm_access` - required, dict with claim info, minimum form: `{"vm_access": {"tenand_id": {}}` +* `tenant_id` - optional, for cluster mode, routes requests to the corresponding tenant. +* `extra_labels` - optional, key-value pairs for label filters added to the ingested or selected metrics. Multiple filters are added with `and` operation. If defined, `extra_label` from original request removed. +* `extra_filters` - optional, [series selectors](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors) added to the select query requests. Multiple selectors are added with `or` operation. If defined, `extra_filter` from original request removed. +* `mode` - optional, access mode for api - read, write, or full. Supported values: 0 - full (default value), 1 - read, 2 - write. ## QuickStart @@ -66,18 +67,19 @@ Start vmgateway ``` Retrieve data from the database + ```bash curl 'http://localhost:8431/api/v1/series/count' -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ2bV9hY2Nlc3MiOnsidGVuYW50X2lkIjp7fSwicm9sZSI6MX0sImV4cCI6MTkzOTM0NjIxMH0.5WUxEfdcV9hKo4CtQdtuZYOGpGXWwaqM9VuVivMMrVg' ``` A request with an incorrect token or without any token will be rejected: + ```bash curl 'http://localhost:8431/api/v1/series/count' curl 'http://localhost:8431/api/v1/series/count' -H 'Authorization: Bearer incorrect-token' ``` - ## Rate Limiter vmgateway-rl @@ -88,14 +90,16 @@ Limits incoming requests by given, pre-configured limits. It supports read and w The metrics that you want to rate limit must be scraped from the cluster. List of supported limit types: -- `queries` - count of api requests made at tenant to read the api, such as `/api/v1/query`, `/api/v1/series` and others. -- `active_series` - count of current active series at any given tenant. -- `new_series` - count of created series; aka churn rate -- `rows_inserted` - count of inserted rows per tenant. + +* `queries` - count of api requests made at tenant to read the api, such as `/api/v1/query`, `/api/v1/series` and others. +* `active_series` - count of current active series at any given tenant. +* `new_series` - count of created series; aka churn rate +* `rows_inserted` - count of inserted rows per tenant. List of supported time windows: -- `minute` -- `hour` + +* `minute` +* `hour` Limits can be specified per tenant or at a global level if you omit `project_id` and `account_id`. @@ -119,6 +123,7 @@ limits: ## QuickStart cluster version of VictoriaMetrics is required for rate limiting. + ```bash # start datasource for cluster metrics @@ -169,6 +174,7 @@ curl 'http://localhost:8431/api/v1/labels' -H 'Authorization: Bearer eyJhbGciOiJ ## Configuration The shortlist of configuration flags include the following: + ```console -clusterMode enable this for the cluster version @@ -276,12 +282,11 @@ The shortlist of configuration flags include the following: ## TroubleShooting * Access control: - * incorrect `jwt` format, try https://jwt.io/#debugger-io with our tokens + * incorrect `jwt` format, try with our tokens * expired token, check `exp` field. * Rate Limiting: * `scrape_interval` at datasource, reduce it to apply limits faster. - ## Limitations * Access Control: diff --git a/app/vmrestore/README.md b/app/vmrestore/README.md index d970d4c87..dae554c7b 100644 --- a/app/vmrestore/README.md +++ b/app/vmrestore/README.md @@ -6,12 +6,11 @@ VictoriaMetrics `v1.29.0` and newer versions must be used for working with the r Restore process can be interrupted at any time. It is automatically resumed from the interruption point when restarting `vmrestore` with the same args. - ## Usage VictoriaMetrics must be stopped during the restore process. -``` +```bash vmrestore -src=gs:/// -storageDataPath= ``` @@ -24,13 +23,11 @@ vmrestore -src=gs:/// -storageDataPath= Date: Tue, 22 Mar 2022 15:11:43 +0200 Subject: [PATCH 11/16] Update url-examples.md (#2297) * Update url-examples.md +additional examples * Update * Update url-examples Some changes requested by Roman. * Update url-examples.md * Update url-example * Update url-examples Additional info and marking for /labels part * Update url-example Added example with complex query which needs encoding: How to execute the query similar to - sum(increase(foo{status="bar"}[5m])) by (status) * Update url-samples Co-authored-by: Aliaksandr Valialkin --- docs/url-examples.md | 197 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) diff --git a/docs/url-examples.md b/docs/url-examples.md index 6ab0adcdf..79faebcbc 100644 --- a/docs/url-examples.md +++ b/docs/url-examples.md @@ -138,6 +138,203 @@ Additional information: * [URL format](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format) * [How to import CSV data](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#how-to-import-csv-data) +## /api/v1/labels + +**Get a list of label names** + +Single: +
+ +```bash +curl -G 'http://localhost:8428/prometheus/api/v1/labels' +``` + +
+ +Cluster: +
+ +```bash +curl -G 'http://:8481/select/0/prometheus/api/v1/labels' +``` + +
+ +Additional information: +* [Prometheus querying API usage](https://docs.victoriametrics.com/#prometheus-querying-api-usage) +* [Querying label values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values) + +## /api/v1/label//values + +**Querying label values** + +Single: +
+ +```bash +curl -G 'http://localhost:8428/prometheus/api/v1/label/job/values' +``` + +
+ +Cluster: +
+ +```bash +curl -G 'http://:8481/select/0/prometheus/api/v1/label/job/values' +``` + +
+ +Additional information: +* [Getting label names](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names) + +## /api/v1/query + +**Performs PromQL/MetricsQL instant query** + +Single: +
+ +```bash +curl -G 'http://localhost:8428/prometheus/api/v1/query?query=vm_http_request_errors_total&time=2021-02-22T19:10:30.781Z' +``` + +
+ +Cluster: +
+ +```bash +curl -G 'http://:8481/select/0/prometheus/api/v1/query?query=vm_http_request_errors_total&time=2021-02-22T19:10:30.781Z' +``` + +
+ +Additional information: +* [Prometheus querying API usage](https://docs.victoriametrics.com/#prometheus-querying-api-usage) +* [Instant queries](https://prometheus.io/docs/prometheus/latest/querying/api/#instant-queries) +* [Instant vector selectors](https://prometheus.io/docs/prometheus/latest/querying/basics/#instant-vector-selectors) + +## /api/v1/query_range + +**Performs PromQL/MetricsQL range_query** + +Single: +
+ +```bash +curl -G 'http://localhost:8428/prometheus/api/v1/query_range?query=vm_http_request_errors_total&start=2021-02-22T19:10:30.781Z&step=20m' +``` + +
+ +Cluster: +
+ +```bash +curl -G 'http://:8481/select/0/prometheus/api/v1/query_range?query=vm_http_request_errors_total&start=2021-02-22T19:10:30.781Z&step=20m' +``` + +
+ +
+ +```bash +curl -G 'http://:8481/select/0/prometheus/api/v1/query_range?query=vm_http_request_errors_total&start=-1h&step=10m' +``` + +```bash +curl -G http://:8481/select/0/prometheus/api/v1/query_range --data-urlencode 'query=sum(increase(vm_http_request_errors_total{status=""}[5m])) by (status)' +``` + +
+ +Additional information: +* [Prometheus querying API usage](https://docs.victoriametrics.com/#prometheus-querying-api-usage) +* [Range queries](https://prometheus.io/docs/prometheus/latest/querying/api/#range-queries) +* [Range Vector Selectors](https://prometheus.io/docs/prometheus/latest/querying/basics/#range-vector-selectors) + +## /api/v1/series + +**Finding series by label matchers** + +Single: +
+ +```bash +curl -G 'http://localhost:8428/prometheus/api/v1/series?match[]=vm_http_request_errors_total&start=-1h' +``` + +
+ +Cluster: +
+ +```bash +curl -G 'http://:8481/select/0/prometheus/api/v1/series?match[]=vm_http_request_errors_total&start=-1h' +``` + +
+ +Additional information: +* [Prometheus querying API usage](https://docs.victoriametrics.com/#prometheus-querying-api-usage) +* [Finding series by label matchers](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers) + +## /api/v1/status/tsdb + +**Cardinality statistics** + +Single: +
+ +```bash +curl -G 'http://localhost:8428/prometheus/api/v1/status/tsdb' +``` + +
+ +Cluster: +
+ +```bash +curl -G 'http://:8481/select/0/prometheus/api/v1/status/tsdb' +``` + +
+ +Additional information: +* [Prometheus querying API usage](https://docs.victoriametrics.com/#prometheus-querying-api-usage) +* [TSDB Stats](https://prometheus.io/docs/prometheus/latest/querying/api/#tsdb-stats) + +## /api/v1/targets + +**Checking targets** + +Should be sent to vmagent/VMsingle + +Single: +
+ +```bash +curl -G 'http://:8428/api/v1/targets' +``` + +
+ +cluster: +
+ +```bash +curl -G 'http://:8429/api/v1/targets' +``` + +
+ +Additional information: +* [Prometheus querying API usage](https://docs.victoriametrics.com/#prometheus-querying-api-usage) +* [Targets](https://prometheus.io/docs/prometheus/latest/querying/api/#targets) + ## /datadog/api/v1/series **Sends data from DataDog agent to VM** From 76a477c609f8007a9f76504088b3a0240fff2985 Mon Sep 17 00:00:00 2001 From: Yurii Kravets <30324382+YuriKravetc@users.noreply.github.com> Date: Wed, 23 Mar 2022 19:37:23 +0200 Subject: [PATCH 12/16] Update Single-server-VictoriaMetrics.md (#2357) * Update Single-server-VictoriaMetrics.md Adding /federate link * Apply suggestions from code review Co-authored-by: Aliaksandr Valialkin --- docs/Single-server-VictoriaMetrics.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/Single-server-VictoriaMetrics.md b/docs/Single-server-VictoriaMetrics.md index b7cea94a0..f869ed874 100644 --- a/docs/Single-server-VictoriaMetrics.md +++ b/docs/Single-server-VictoriaMetrics.md @@ -503,6 +503,7 @@ VictoriaMetrics supports the following handlers from [Prometheus querying API](h * [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values) * [/api/v1/status/tsdb](https://prometheus.io/docs/prometheus/latest/querying/api/#tsdb-stats). See [these docs](#tsdb-stats) for details. * [/api/v1/targets](https://prometheus.io/docs/prometheus/latest/querying/api/#targets) - see [these docs](#how-to-scrape-prometheus-exporters-such-as-node-exporter) for more details. +* [/federate](https://prometheus.io/docs/prometheus/latest/federation/) - see [these docs](https://docs.victoriametrics.com/#federation) for more details. These handlers can be queried from Prometheus-compatible clients such as Grafana or curl. All the Prometheus querying API handlers can be prepended with `/prometheus` prefix. For example, both `/prometheus/api/v1/query` and `/api/v1/query` should work. From f8dfc223509f73391023f9843e13a46472b1ee60 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Wed, 23 Mar 2022 19:39:08 +0200 Subject: [PATCH 13/16] docs: a follow-up after 76a477c609f8007a9f76504088b3a0240fff2985 --- README.md | 1 + docs/README.md | 1 + docs/Single-server-VictoriaMetrics.md | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 136070a37..996521017 100644 --- a/README.md +++ b/README.md @@ -499,6 +499,7 @@ VictoriaMetrics supports the following handlers from [Prometheus querying API](h * [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values) * [/api/v1/status/tsdb](https://prometheus.io/docs/prometheus/latest/querying/api/#tsdb-stats). See [these docs](#tsdb-stats) for details. * [/api/v1/targets](https://prometheus.io/docs/prometheus/latest/querying/api/#targets) - see [these docs](#how-to-scrape-prometheus-exporters-such-as-node-exporter) for more details. +* [/federate](https://prometheus.io/docs/prometheus/latest/federation/) - see [these docs](#federation) for more details. These handlers can be queried from Prometheus-compatible clients such as Grafana or curl. All the Prometheus querying API handlers can be prepended with `/prometheus` prefix. For example, both `/prometheus/api/v1/query` and `/api/v1/query` should work. diff --git a/docs/README.md b/docs/README.md index 136070a37..996521017 100644 --- a/docs/README.md +++ b/docs/README.md @@ -499,6 +499,7 @@ VictoriaMetrics supports the following handlers from [Prometheus querying API](h * [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values) * [/api/v1/status/tsdb](https://prometheus.io/docs/prometheus/latest/querying/api/#tsdb-stats). See [these docs](#tsdb-stats) for details. * [/api/v1/targets](https://prometheus.io/docs/prometheus/latest/querying/api/#targets) - see [these docs](#how-to-scrape-prometheus-exporters-such-as-node-exporter) for more details. +* [/federate](https://prometheus.io/docs/prometheus/latest/federation/) - see [these docs](#federation) for more details. These handlers can be queried from Prometheus-compatible clients such as Grafana or curl. All the Prometheus querying API handlers can be prepended with `/prometheus` prefix. For example, both `/prometheus/api/v1/query` and `/api/v1/query` should work. diff --git a/docs/Single-server-VictoriaMetrics.md b/docs/Single-server-VictoriaMetrics.md index f869ed874..e0d6e3a65 100644 --- a/docs/Single-server-VictoriaMetrics.md +++ b/docs/Single-server-VictoriaMetrics.md @@ -503,7 +503,7 @@ VictoriaMetrics supports the following handlers from [Prometheus querying API](h * [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values) * [/api/v1/status/tsdb](https://prometheus.io/docs/prometheus/latest/querying/api/#tsdb-stats). See [these docs](#tsdb-stats) for details. * [/api/v1/targets](https://prometheus.io/docs/prometheus/latest/querying/api/#targets) - see [these docs](#how-to-scrape-prometheus-exporters-such-as-node-exporter) for more details. -* [/federate](https://prometheus.io/docs/prometheus/latest/federation/) - see [these docs](https://docs.victoriametrics.com/#federation) for more details. +* [/federate](https://prometheus.io/docs/prometheus/latest/federation/) - see [these docs](#federation) for more details. These handlers can be queried from Prometheus-compatible clients such as Grafana or curl. All the Prometheus querying API handlers can be prepended with `/prometheus` prefix. For example, both `/prometheus/api/v1/query` and `/api/v1/query` should work. From c46d9be108f3c023ae370d8c56d633eb601eccac Mon Sep 17 00:00:00 2001 From: Yurii Kravets <30324382+YuriKravetc@users.noreply.github.com> Date: Thu, 24 Mar 2022 11:53:28 +0200 Subject: [PATCH 14/16] Update url-examples (#2358) * Update url-examples Add federate example * Update docs/url-examples.md Co-authored-by: Aliaksandr Valialkin --- docs/url-examples.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docs/url-examples.md b/docs/url-examples.md index 79faebcbc..288d51537 100644 --- a/docs/url-examples.md +++ b/docs/url-examples.md @@ -397,6 +397,33 @@ Additional information: * [How to send data from datadog agent](https://docs.victoriametrics.com/#how-to-send-data-from-datadog-agent) +## /federate + +**Returns federated metrics** + +Single: +
+ +```bash +curl -G 'http://localhost:8428/federate?match[]=vm_http_request_errors_total&start=2021-02-22T19:10:30.781Z' +``` + +
+ +Cluster: +
+ +```bash +curl -G 'http://:8481/select/0/prometheus/federate?match[]=vm_http_request_errors_total&start=2021-02-22T19:10:30.781Z' +``` + +
+ +Additional information: + +* [Federation](https://docs.victoriametrics.com/#federation) +* [Prometheus-compatible federation data](https://prometheus.io/docs/prometheus/latest/federation/#configuring-federation) + ## /graphite/metrics/find **Searches Graphite metrics in VictoriaMetrics** From 737716365969026fbedd8beb820a0be7d42eb25b Mon Sep 17 00:00:00 2001 From: Dima Lazerka <58356625+dima-vm@users.noreply.github.com> Date: Thu, 24 Mar 2022 11:56:23 +0200 Subject: [PATCH 15/16] Add vmanomaly docs section (#2356) * Added docs for vmanomaly * Add example images * Stylistic fixes * Move images to root * Update docs/vmanomaly.md * Update docs/vmanomaly.md Co-authored-by: Roman Khavronenko Co-authored-by: Aliaksandr Valialkin Co-authored-by: Roman Khavronenko --- docs/vmanomaly-holtwinters-example.png | Bin 0 -> 111590 bytes docs/vmanomaly-prophet-example.png | Bin 0 -> 108301 bytes docs/vmanomaly.md | 128 +++++++++++++++++++++++++ 3 files changed, 128 insertions(+) create mode 100644 docs/vmanomaly-holtwinters-example.png create mode 100644 docs/vmanomaly-prophet-example.png create mode 100644 docs/vmanomaly.md diff --git a/docs/vmanomaly-holtwinters-example.png b/docs/vmanomaly-holtwinters-example.png new file mode 100644 index 0000000000000000000000000000000000000000..17a4c772127e6d0c093926a64c017fa83fdf2431 GIT binary patch literal 111590 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

};L_scNq(BH0 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 z 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

n)ykT~fWhwX=owyMzyNw*?tW%(qm9J}}6 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 jb1T-bFFwDJC*xqJf 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 z z_<0ab6jZE9i({D3LcBI9=5zT7$9KrolZC^yqKz(I^%}4E&_g&Ve*@B{UJ;h~PjS4~Be3nf#bw+XI!r6`FuHEMWRmDHB;QwH=m^H^YgoSnUW z1e~|jPYrn>cIZ)vu}#lYa}#5w(S)A!FCOg0m-psHm19?G)da`qz_*fMdj~KOW{JJJ z@jo;_Qqt*w&KAGFH_8%L_T9l2m-$-@&byNR_o)52!9|fs)C~umHZn#^n`swiALk~=XDrdSyhZ;Ya5_3uq2m&pV<_?Sn36F|mlMV+|%v^T8B*!-k zx&h1<2UQwC7FOf+AccTZN_lR`_sYN88b>s2|xM}hZlylaW zKe!|3DXLmdur&g!d*k7Pn%cJ%HK9ysTVVYG%V%1Zek>~C(&sKbg)7}c!}3?J1->yo z^V=74#|B!|ue^N`7;KeGNCGMeG!_H&s@3&a9N-rO_Ph1Xz3~+Sx=KXm(5w$#r5sfv zm^b(}23G@VSW=wGRa8V7O8UVUK7|(zFM)(%B0GEC?8-*F%&!DY2@;ipYPVjbm^Y|4 z*Aa*2#~qZpP`zXk@m^y%cD_my<0@nYH9Y+KQC5R*!&HpDmZY+7@#8Mpvs==LKIcBv z^SFh7flY+s-O*cb-=s}H{jVQIy3Mfp&>&R#?tFS3o=yK!KKywKUjmtfQo|d_zFyH) z1CHa&*^vnJl*)V8znp}zW~g`WE(Oor45Hhng2xct9(RS$=<*jZSOjt4#gb*!L%Jt( z8XWpkZKN-<*1 zWU#Ubrdjqup9~%x76hg^|yUg}+2`|NeeUV3bea!*ke>f8=aBlJe(ft-@KbllN;nSKJ ziUh~P`Hf*7i8=YA|jP^?~HD#t7LP1xF-wC7Xy|R6R3m3W{@c)Y6+kP22xdGRde}Vw@ z*cS{{8QGNf6T)PZ`g!CsM##BJD}+!bpbQcXaC^38*q{eND5tP>5rd4?S>~L@&!l+B zIo)5uAJ|XrTUdS#pZqda-yaLJ@)A9_#fx_D-t~=GEF6}V2BrW>9p%Z`YQxsgd-GMF z1p>MRiW&O7`CMbw&HG12Mp;G%w>QRE-5V^pU>Ntc4f6|86A080THRA8tdtGH+et`M{=qE6Qkfcn*{ zMPxHjSK!lKP*A;`A{)ACCG6$t4<0Q&i^|pJxSp}@im1w=`<17s@;6gF@=~%TFf*Wq>P*D5VN2{GjtxvtHXlwL)OD#VK2EZtw*7>w@cwPsTr*K;1S2<+OMHw04 z#W~(YY>!O1N*Aw%OwlXmTu}Y%xn`%lJN0CyW{dC6s0%G{)_zh0;U6#Y&edMOOMJsc ze4US$HFF=}oxI?fx` zP4cU8>L|A@-p#RNa{0bIsfDuh&|y;he<|U-x^@8}C}i}efKZL^e!>SOlXECr>ZN)0 zdvNGwera1t%oJjXy9kVH{al?J{cl33aG{(T>>rLDG2EzEgx5;M>rmaC-p4DWo<+?4 ziUcY_Z(xzBA04f(0I?RiC0BYWWtK(F^XWWbpt+RR5B@LItBBpDKmCt%T{NRr`%es$ zZ@r>6V_*>vOW<);r|+k3pRG;?m(sS(5TkV>@rcKwi_SK?4+et*lioi0%|h|lwvFTs z6!L(cLydr~P9-?tSX2KRxM>9U6&cv8vU)#<)iWspM7(;?#kS!bdy9!u{3l6Th`88G zBHH#0MX|X)r_Y8~b&X;o-rakn-Zn}iuK}zqb-V~8c>y-oB%0fuIY)2wxGuN(URW-<{{~Qz)mH~E-ZQPA`+?9Xc7R5a%0wXLd&r*FX?+E5ql}@_ z=4T@DOEBqpzf4}IZ7|mx_~_nq7QlZnBEORr>j3XvUp``>!2Fc)AnQkqHaW=!#8z+6zE?pt2%yLCo*5iCdpaH4+M`l+QkZ(%F3M z`)3-deq5U8o$bjlf8GOHm^Ta+Ukm2$nD)GzB<^Im3Cs=xSSgkc9}5_qiqC-+B&LS# z!#K^{3(`ZYB0%;)c!8ZNsrrJ=(J_ADUM2}o*|y5L-t~}#b#Fxmwquv^tc^l0%2ZH? z$ERcBDFW+s?SwZ^GIRLCi2&RheDC~Tlc!1N6S+yDqfTB2l&;#)BO@i{F;b_liBfx1 zf0;JFmNvX;GrC$h#oFC<1Av$XuTSKK?#?dr}9$yK7E`0bkv5UzLx5#RHIVTCN1pR=6zXPk=py|buW6KnJ! z&!O)RJJkE?`8j7*J2(oZRy$Rfc=h#l16Jo5r>Zk;FY{hoaNhA{;ptwnp=#t+YWtFz@eG5ZO5+7r%3^Gj&@Fvq{aiq=J)}XPZcc%5Jab8>P6{VZ>Tx zu5NB;7`GGej?TGXumirdz{z)XZ1(p}65x{eSY>;WEdcbLd?v0=BXmwXLPx|Pnqj7< z^qQAW@c!_ccn_~l*UqV5*zr+1hPG^D$Xc9m9vrT)POkArIrs=Nk{!Bd!o^L9`?+7W#dqD*^y~brlj{pA<-+VzAVNehSHaM*IYhFb>2p1UA!Yz${sj=a zsBF&uTCy zo&ykv#lXqgudsY5XA5o{)OY!G+D62LQYGy6XBzL>ZI%XhowqYg312>Jl92gw?1|w? zB#ZZ5=%@ufeWinz)NmI6liZrxoMlQJ0<4dU??Y(NHg9)-tInJ*YXHfId4CNz><=Wi zX59s|4;S|Y!)qnZkw9RB&HuQ{F}c^cz0`vc!H2cMpziDX;R+CW7jOv>VjG=M{Ka4S zv-91MO~ALZ7Y)ZKOF|wAfSO+h9t~_(@qkE2l>qEbwlPPu z;3RDvDZ_%Dqg=Vl^U-a)v~2wkzCe2$5$~R0O?DC~;Dxk!h>XE=%~`Nl1@8If6T+0E zLJ!%6H*y)mUkS<2j&TRfvy_M0Rj$1U-PB{zuFY{7T}85iVZLb;c{5jtAsD8#s}vyX4)v%eB!|Mmv0neMx?&>%v5XthiF<%ZDp7Pl4C`+RIq$T(jE%g|J} zw8%LDdDAmd;06f5jh$q3rtLY@iDztEz*6e1yeIR_Y%*PEqF&J0N;WH56p2|(y@NJ3 z30ST;!$JLdK0pO=UAohOP4x*7yz?iXuL1JJmq^XbyS#qK&ef|Qsw(&w-%m0lW&{DY z0 zjwapp&;^$=hRDp;=e4Jw2rl{viedm!HddtRId`p!>Ny21V3ose1?dqPe{6s*rye*H z8rl?zxb#+b2qaAQIf3Vaf3aEx%lM*{Ng@~z-f5E)s$A_yx?@etbyap>P z3`Xme%Wjoz{=x$<2N}cE)PQEhbiNz4j=K>Qcj~t8Qd3 zSreTU2;rm-_Qw0rg>xpUK+VNV6fTx9ReuK23{zGoHvuOt7iBSsW6cOr%20}M)&a8= zfP1A@{CW!nDM4MFk_WzyCo9;t-}W$SnlAHM38Th&iO~VDp1Ars-#{(iR&xf_j8{>8 zIeO%i0iD9~{iSGy?$f7fqW!$YT1S}yj`4?2r#K#VMQ3Xcys}B!u>LIv72@(}^9pbo zM)WeKg_`Q<;=`396dM~G?<*-af4s}9u#Y&cZExE~^>74fKLb~Z&R)KT2Xb<++1r`f z*tTR4cO8rzAjSY*h%E6xTmb8L+05E>rthM++@L;3Zo?x}k5pZ?{G;Z?qx-?vu~EpG z0hfD9aU!3K!ECk2SMr&9=Sf!u@1Y0a)w?<7c(E^tTzP*IcW3<5S>-GJW_dvjUbR0z z(v@npD;N%ES@+hYfT-+WzFYp3vf+aK&AKKf>7DTUoo)l9N|nfwn8_YA2of2{puZ7* z+@R)Pv16Y%Dg{-WK>Sy7Qs?dR0)|@Xf2Gb|yMLIIIW?vbBuN>Y*m76=c|OkeCUTzd zZ+L*v=f#%Y(&-%YjZ|UM*khVxgWagM z|E7(4ROQTzFe|{vY%_M=;lC_nF6u?UeCLU(o(m7_;EKRW;vP}N5MidnI7WW%3kF84lB_(*Ux&d9 zTxU8IF1uzg6F{swba>NNPTy#uiwZ8U)a99to#uGgMUjD^AR-}4R{Rn-?2Q>N=}=1V zh=_A$PmGCTNT$P^uix)@zO%2w4D>}^zw2$ zOV-PdH{MIhUX&Ws^`zeue&Wk(MQf<7ic-mvk(76+VSK$Kb##Nq^9utFm$&Y!T1*8e z4cLzrc|=aH{Iu?Sd-e5HaiZiq7mO~EX0V#6O1b>2OSltH~{Lf}pDR2lS7M1RWZH$O@uC&e~ z%wc$A!2tXb@u5ZAxI?CY46oGAHtTqPmm4ER(QhQ)g?8`xKo-;5 zXsHoro_O8aXlP1A8e8(xc|o|(C0C;@nSTmk0LJt5*rZ0ZPn^=+@Z}3B43tcBhvd@Y zH&O9MA$v?O)HBsQ#^xfPkm8zs<7|yoCP{3pUmcG+>6~jNNsf>7KOUN30y}r9kvXq7g}La_ z#B}7M9pYx+(cxEUPfGePdHo#~dWZE13E|`QddGv=n6AQS9fvEx10`yVeL4R#4mYy( zO{MT!HV)WQlQ3VOoy{2dMnwl>-{&7(8~}!KJ3GDoIlZC>-1lJs0d_Vqza0mid}=)x zpw;>HLmUB+cHg;wJKxrF|IOR$*w6&QgvtBXGCjWNG3sC~#~0{3()vP#Ud;6NT~A-Nn|xQ)E*=4G+eF87Rz&dyriX|NP;gaom;p? zjD=AyTI?3j;bKw1ULPAjy9Z4?jK!f0ewB$-MowlCkteDjZZf~)o&GSX0}_RPB|F#V z5-asqVi6tC}O6g3*vSLLM45O2GZ_rIS)QJ{SVg|M3~lxbBoy zHEGkNR?PL^Yc=qR4YC$!cf_Bew;P^N=|ZTU^P3#Q(Xgjc6NZ% zAa_`h;WZG|T4}_`|P3JdL*R$nS zdUbXxXG4Mo>g#`*^dVHSpvK>iO)E6AG$9fQ8;Pn23<`q0wzsl3AY4d;xvJOw^u2AgSK zTa>0E2FX2UdetFG$_R}d1pgTq-=@{aheNFg^C{;)&fvD@$zFf^aaeP%+|2nVqZ`WW zwKXc=(1dsNBlSd;q8UKLaSxat25)oSY~9SA89pc_n0@t^8m%LH9bx;M(LoBJTky=o zva{$Gp|y1S2Gx{V`2j!h!qcWdfNrq7(b)3aH-wZ)Jpq69d7d4&)fU_-vq56pzr+=TcH;4R_oVDJxszY;oF2 z1Wkps0Z*yQWf`N}w2R@*ah1M;qSVA{X~};o&`ENC2C@bKfADANMuKWU7K;OpZ4(v$y07PWK3V7)zGTf);=$D|A?|llS&v5bga7(d?eDZ#jjq&hi*fCbu&B&2;AeghiH+-s2E&@SM7$LDvyoJ!(fwL>jF|BbZ5}Qk%jV@ev(qoO17i>M)$%F z834hEP+U2S7+7t?)-s%r{8u|pzjdpxB9o6ju^h=C!4Hn9@QcI0*x!7r1mT5Lm(*!Q zv8Ka{$h0^aHp!>`!@thY*J{SSwe|tU9ujsl!KjKY;R&OC*rn*Nqu{VAb004%IoUlh zo6hbDIUp^w$KRfY=IaUIO62$+MrcgADIogp9lynea55K9IeQ@xM~dd`GIsovEO4z0 zR40R0es_5a8>b&$Z3ZH4|Lj~I_%t(|t?u1F9bFq%-vP5l^>7udMDictq_NCB(j&Sw z!p8I1GzUEad+Qu6Wo!V#g_?)x-^JGrzcLGnXgr3+A)P_XpAwCb1CB{@ERk{K;s zokWls|D+V1*PbIsa` z?CaVT{1s)Q9{GP4FkyxsSkN|U(AdK1?%(d8e4u6!s__|e#B*taE^ zGy^H=cpn(lHa6Br$Mokew?w>w3Djd42BpZaBro_2bDA{VAGojy8ZGGTP5m(YE|9~@ zuEz~84h5O{b|$8Bi6z@F(M=+bP89AkGhB>`qs{1rwx*Xb zoc9yB04&FO!Ho)BGJ>_ApF;odg96-$4^8>fz#|GKJKmV(A`y zJ6G2Vws`h*rFv}@6&|+$X3wjB7ag1e<9V4Xp581*Ap$~W=FXjDzpj%|55!O#Lj?=G zCC1#2sdO-tQ=8yC52!mkO|OlS1*};8&nYoTQJqXwFqLkD0_&F0g_7fA#=YUqSK!6` zCZqRIfP0hSpI0ddb7Q&;^$fvI$G~{@_KaVD-7>!`1<-Et+vy2|ChlttNxkMHn2qy6 zD2tVT>e6>n0KX7)gXum!A@Gu*;knmaEs_I_rH>bn0Vq>zZUnULy6w?P_rlf^WvA`= z>_t0Zio<~8yYr+l5au$*4a#>Opu`)twNLSLh^ISa8Jum@{#ZCUebnj4Sl34q0(j-X ztApk?5rBUDhZEow;!~JSaHzg_c$e5t7Ca2aBVO)?`@LMG= zr4xvXxFq;sJCxNp4UvLK<)XE)eOrQvsKSg349l1Y%cwsaqP-Epbf1NXU!T9x!tM7; z@o!R7Qflq*J%6sy!47tsBLBQcZ72dTe9pnc>O~{R79h#cJgaxr9<1C6=M1=Zu`chU z7Z|+~@mZa#OaE(=0E3&H2lHC+u<*_S$-a`3Ioyx=tt=>{lc)UR;rwI_4Y%NXR9NVp z65x3I_wGUf7%;+axB%{J`1PGdp1RKoQGnzF4RvQy>S9U%POTc#?M0G5|L~NavJl`b z9DVLnLNZ_v)@pFu7uEbL4|P2J?vX@+t>M5YHY0Feh_;#65vgAK?v6B>+zdTOwZu;M z2O8MuG_?2!$%!&DC%hRXD6te8yfu(@?{hAq^$if#cO3*2{<gtquZs$Z>f7l8h&6fx9~a8&C|LL*#e%6{6rX_G$q$RmKVcmeUUQ`6AB+NJp;?u z=7p9k|9on)tA3Y&)_AZ6M78n`5J_JLR?Pg`SAVZqNwj#2e|W~giE-h@MhJnMY^IUy zp#*EA?9dwwFKA%y1XI`_Od-fYWmW@WYTyZ#9O%C;WgCBQpzOTAzHMYpy;(Te`U|$cQ>R${d2z1n?9njtvdStYL@^22wJFn4j98)U^c0Le(;4v<7ygZ zpcaiFo|>#6A|m$bT9{t&AL0b{xOlSo!7iF|r7%GV*OGA8hF%}I6W4c8^xsI`$08zo_U7;41%I}rUH zf2m{vIrqj!u1iwqB3#ZYeqE|k8wHlSMx5;8Kk6F6$MOv8{tN~XOKY_?0+yt3mrJ!f z5;09ayi-(Hf*J;6MIY03N2BzZ>! z2(|`>wxBbdVpIa#%7*bt70)MinbZG@4sHphfBHjm;8Sac=;jp|5CUx_k?5{DUyt?1 z>80S78+A-dKB+}mpgA#mNQvW9JFyn#-*WHoY6Pod9+gxHSao0k*#Q&irekCvcij%}Ab}+6>gu$2?vQ{|M7kqEUlNIy{6%NMz2M_8&fen8P zFZ(-qWJ$`)<6pnz2SLNEt~KNW`|hFsEkf^YHzSLRiVn}fX3`HbO#08x<`X?uH;!@) zYp5fcl$s!QBp=)YqTaphU8?}=Gsu%mIy~z5c(<_YKuKhW1n|jJ%{*)rCBIdJhL*lh zvXtMGp`z#D%bM6sqvWFSf%|jq`}EJB>BPipT8#;*h5aEnh;a}6sf17WrzybB1q|u^ zdb70p*RotN-4{g++z)1D=R>dY;)6Z(EraE)4l(r0c<>UYg}xWEUw6KnIRb`ogb4Qu zXhg3gM*JxR0(bU?Bc1Vyy8wQcT;w70dr>=4;|ywI79I0QmY zq+tzWwsz zQz4p0So`(Up<s{FLOX#b9HNfIY16Zzdy+#uL{yJ-}W20{G1MLymD^iWDL?H;5DQi_K(gXe%|nt zA;3U^lKLAOtNlnM?x!!39i^7`Py&`7i-qc~U4F14AOnr>#QrO!YrW*az^LK{%v zx-lj54Lx3c%itLVX>Eez?a)#&#~%2bx2UBnzPl;+f>+isD?2;NkC28V&#=b8Uf_Dc zpha{kdYt2#iAkBQySZ50)YKEFfv-lJ@Z?N_8tKnwIX%M3*&iv_oI#Y5XhDr<^ki9P%%b_hY7;k30%g$$MA-G(d|EeL_PcQo^EetSgYD`Bc*xm08+_X z!0<5@8B^__rjKzppxsj$*+S@R$> zJt2a|ZMzGnxp;SLonOl!eHe)yjcI;+^+uwAwIl}{TVxEoHvQR7o`>B*HSFe1NE|cG z>Saw7b<=^(A3B?(TiOOm%9gek52n`$k9Jog{Vq~63SGYhKmM+mm|+6EcVYWK131Hn zyDQ7P57z@u}M)8pVlDRodOR`*d=U7h3stb`cC z>jIrK=A(<<>9deKg?v*^P9*^BOCXN*X{hieCH#gx7Z8I-fxw@+X8ZSp&4`;1Vuh=- zvmYkhwMlc`>D4Md|FD#SZ5YasdksW)pyOoluT#v`(F&%npsO`!d^y}aYb3# zBQP;7slp!P#LbA*F zQn7*a;!Sql5(3EL@qywXC`d|APftj;wp3MB6}b?R`w`5fWlu^TG#{!ay6s+tkT>72 zUvDFMDo|0FMfq5@LWY?iIGKNQ%Yk)70G1uzw0Kscl50XPyX>gPAWDS*kIomxkmxK7 z*90!A?B(P+NLh@=>6L;-iSqQLai@U0zic_TA}l)E7c8(-yLKRbJ5bc^aNWrLil)Y_7n8Iy*_#$th7#q=vs zrZi-zq~5k$>Uo;j?TJq8k7QJ+gL@b|wF@s^(GSjsiSMs5ImVl5;Jh}lwY_6izQ_pq zH5skOF1vruR~ZHe{BO7Sa7~}C`-v4T3Nk4rSSar%e*8%APTmLBL@ycwapsW_I(D6+43+aU zd*dFVfQuLOn%|9Aye{HQ0)7sN{SKqzM}I`DP8Rf8!TP8jDFDG5(HPQ=Zc!uatFEr@ zklY=GT(`gqhumH+$ZtYwj$ng@WdnA-Dl(MGvuA&Q8#n>ZN*&fDRNkSlf3G?2BYN5T zKs-=q0-KYi;?ER4x#`z+Rl2%|K2D9Q4=ciT-UiD?G`&>}7L*k96=ayp(Uc~+i6LP+ zrJ3O)^G8+HUXQr1sAT5j}hIH&vZSAB-9bpN)&m560{X&wt#jL@U|nb$qL+ zkfJ3*409yFO9bq{*X-ye)zwK}+1OY^1EQ{_WeoKK$`cY(>w9}i!Or|5L^pnYHQRP+ zwlvTC(xpp|@TeT~1z*kJnQ&jN1Jk_l@LCrS0|RQHNYN4D5kwcmRRW(nk@i4o-bLS2%8G}&J*hxzXC^V{TQsq@t*zZ%oFuVasFS2LHOXdP-BnBw4uG|0cknGO zyMKk0gv8cKrBn6Mlj>)0;X0~qZ@&O6A88vK9yn*6i$>?3gt&GfJ|boACxT=gdS){T z@BMgZU7DcM^LohmcWe_CMUpz*8I#RB&NCBZ=w1sS6}AqBp`l?mxG_R4IXYH4)@QgS zqCY1XYC;~*{$8C`=J8`%taBKWQc^+;)lDy~tb9{bZ=gRYGfS(fUGXfL5rpRpO&uIf z{9hp&R$Wu`)$-G4&unnz-AsG?`XoQAPQocC;JSYsJ`=<{@iQ^z=#Qr{o!2S13sA8K_dWv{@es3R0R_DoA-1e@;Hx}|W0 zy(qqB-1L^~Q8dRly-R5H8b>qLZT@6sfB2XK0|Sp?myOhZDk&jDA@y_p_&5zbccen3 zhv}`d@?+Zr-=!_MOT)s$U&9#%9-5*M3`PL`T$x>AVd1y=#Eb8EA)f^d>sC49#c99C zp{oZ^lD4^#b?N9R01L_J*)uESE+YWni88?Y@#6bKWq2DE{I;fN3cJ0W~ee}p5%5!_>R36`IU2_#( z-5~IFuox*LM)n@!qvm?B$l+)jy6CFL(Rkb;#UH^U zPDRq(AKseV6qCRIq{@Q+@Q{&*q95kWPv9CrJRN-ru6ku;WN?UeNA2inX=`7FPl_C8 z4$E$7PXi7TxHNNge4utbhN=Va;>DHSJ!97BsI{vpnpwn@ltBPB=(>hpH*eb`_y8VT z03lfKENQ?kf#m!_RV|A)H_Y#I?FfVFMS>&7c)BUL<=3w!xH;CL?7Ui~u74h*@QSzptPkpRkzFg=mF3-;=h8Wm$D1T{sJRiw{p&@#9c7n?R zZj_UEY-8cSph(v`{HX|3j zuXwlIB*mYL1j|DB9oOUUD1p0ok$88ob)4?&Xl5tytcl?iXtX!8{ahg^j>hy0YtBw7;pVZjvWm||8ynZ#Vg7({0H}bz~h|myqU{i)hc~=Ih)I1D5bHZ^Mgm+CUH=Fm&9G&I-=4y8OgK8=gZ(X6B-8)71yO za1Olj^Ro$+bAxK*Ykqz$R8+vec?;L5!_Z0*+sg7|IN8A`cc)2T_Y{8NiKV4Lpe+h5k+PB-b^sf?CY|$1<J z1$FH)^pDVM2so}M^@g|^y~VyjhIlyP`<#P5L%{u50E#*k3Zh%ttVYYRgJr$T%LQFG z8p*?2O-G^3yh?!>1Z36}Z#0~kpuDd(WR$;i#c>FlEbG)jWu zGKN`&`P9S&3U<>-g##hPG0sl6Z;#}X3w8XJa}*+gj!^1v1lRfDRUE)->Dx_>aAD0GVra8M@2kKdvDe|>o948_GOOG`-jfLpwCXbAtaY5?4$skyl!6$0Jv zKPc(FR5Rbme?Es|ekWg4Qt~QqIjH8_z~G=!TNDetQQAD*Fr*mcA?bJ8nxngW_bMO) z@Uj6ZG>l1n-sbGKHYS3!ve4ue>~mSaHOh4*oaleHGLF^Rmo*71!w-;c;^d+t62O_( zcXn3dXdiiw{n)cz&X!G`ET)6(O(3d5&4`qZQ7mff(6-SF3J$R!<%B}9hN`)grOpb! z+bV-74^O04Vq|3GH@=pSP_bcdHwy_1Uk5kTeLxM8RWrjNa640dXmUf;W)Xdm5Ut&D zLxD?%IyI3?ZJ{JFq`0Uk3Sdgp%R!Arfa?c_g!Bmoo5F&?#=(iW&yWH*ff^hM#Kj8Q zSE;ELpX4K#eiaxyMa9GbTzoCq_xSiYqokxSqrl%^M^|^TutW4lrnr{_@@soNFx1%y1nO9~>QZ`(C8X zNK5ne_vbLEyq~3+!(Gl!pAsES79s!HcDC&u^-5tTbQIn29F;IIFc>ZeFw@d{LX598 zoYm4je4lL~1v#McNi5X&ZV*gc$s)n2S0?`Y^=pQA^3TssPvYI1pvrmFMA!!asi=Ud^4=V!#$yZ{6Z8&xURrRto)xhq7?1r;@U1b^^RLNNMCu z@B8GTGzlf;1J%qZ1iuh;-e%4_F%z@gg)kd%9!Y8MfQk>W8*x!lQREkee^u}DGdZgS zD&CE>PB*ym067YAb#*lZMsktMo|S4=uXK-->rOG7ot@n_kbK}&Oo7Wkppgd$xB@Hz2C^V0vFPtZn^n79yX)(;^z_9#3T&F$Nzc2}!XL4x zL9&?IlP4*1>EnFSH|JcSrT#TeuuPCWpSTKVh0pAUIi?#qv z8w7Pnew}kwGOP^nzeFSY5EjPF%8G)DiV9REy<6ftUZ)9bAC827`?j1ry2MR}Y(8Xy z1x4|XDwY#P2;XiBr3sY@BKzQ?cFOa@+#G>0X6EK})cMCw0~?38HFNa>U<#qTL)#zC zE+RsOM7DjiN&m(_E9TR?T;04`Rb9U+(rtX;_dMS*E`gVt9QVBoCPn)$0G1zIt{i>_ zT#AmFxn(47Bk?z!pwJxJi{Bw8Lw85Enn0D!wfA&e7jaet!&$4(38T{I5T8 z`(d6jdHjF=yRXrEgJupvuK)g$st|qKC;$B=&ZB1-hW*BJosMxhDEOb8jG}a| Date: Thu, 24 Mar 2022 17:16:24 +0000 Subject: [PATCH 16/16] Update golangci version to latest v1.45.1 (#2360) --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 4aafcb548..d19a5d113 100644 --- a/Makefile +++ b/Makefile @@ -283,7 +283,7 @@ golangci-lint: install-golangci-lint golangci-lint run --exclude '(SA4003|SA1019|SA5011):' -D errcheck -D structcheck --timeout 2m install-golangci-lint: - which golangci-lint || curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(shell go env GOPATH)/bin v1.44.1 + which golangci-lint || curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(shell go env GOPATH)/bin v1.45.1 install-wwhrd: which wwhrd || GO111MODULE=off go get github.com/frapposelli/wwhrd