mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2025-01-10 15:14:09 +00:00
vmalert: prepare package for external usage
* update README according to changes * add Makefile with basic commands
This commit is contained in:
parent
948f8b6b5f
commit
2eed6c393f
6 changed files with 173 additions and 36 deletions
78
app/vmalert/Makefile
Normal file
78
app/vmalert/Makefile
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
# All these commands must run from repository root.
|
||||||
|
|
||||||
|
vmalert:
|
||||||
|
APP_NAME=vmalert $(MAKE) app-local
|
||||||
|
|
||||||
|
vmalert-race:
|
||||||
|
APP_NAME=vmalert RACE=-race $(MAKE) app-local
|
||||||
|
|
||||||
|
vmalert-prod:
|
||||||
|
APP_NAME=vmalert $(MAKE) app-via-docker
|
||||||
|
|
||||||
|
vmalert-pure-prod:
|
||||||
|
APP_NAME=vmalert $(MAKE) app-via-docker-pure
|
||||||
|
|
||||||
|
vmalert-amd64-prod:
|
||||||
|
APP_NAME=vmalert $(MAKE) app-via-docker-amd64
|
||||||
|
|
||||||
|
vmalert-arm-prod:
|
||||||
|
APP_NAME=vmalert $(MAKE) app-via-docker-arm
|
||||||
|
|
||||||
|
vmalert-arm64-prod:
|
||||||
|
APP_NAME=vmalert $(MAKE) app-via-docker-arm64
|
||||||
|
|
||||||
|
vmalert-ppc64le-prod:
|
||||||
|
APP_NAME=vmalert $(MAKE) app-via-docker-ppc64le
|
||||||
|
|
||||||
|
vmalert-386-prod:
|
||||||
|
APP_NAME=vmalert $(MAKE) app-via-docker-386
|
||||||
|
|
||||||
|
package-vmalert:
|
||||||
|
APP_NAME=vmalert $(MAKE) package-via-docker
|
||||||
|
|
||||||
|
package-vmalert-pure:
|
||||||
|
APP_NAME=vmalert $(MAKE) package-via-docker-pure
|
||||||
|
|
||||||
|
package-vmalert-amd64:
|
||||||
|
APP_NAME=vmalert $(MAKE) package-via-docker-amd64
|
||||||
|
|
||||||
|
package-vmalert-arm:
|
||||||
|
APP_NAME=vmalert $(MAKE) package-via-docker-arm
|
||||||
|
|
||||||
|
package-vmalert-arm64:
|
||||||
|
APP_NAME=vmalert $(MAKE) package-via-docker-arm64
|
||||||
|
|
||||||
|
package-vmalert-ppc64le:
|
||||||
|
APP_NAME=vmalert $(MAKE) package-via-docker-ppc64le
|
||||||
|
|
||||||
|
package-vmalert-386:
|
||||||
|
APP_NAME=vmalert $(MAKE) package-via-docker-386
|
||||||
|
|
||||||
|
publish-vmalert:
|
||||||
|
APP_NAME=vmalert $(MAKE) publish-via-docker
|
||||||
|
|
||||||
|
test-vmalert:
|
||||||
|
go test -race -cover ./app/vmalert
|
||||||
|
|
||||||
|
run-vmalert: vmalert
|
||||||
|
./bin/vmalert -rule=app/vmalert/testdata/rules0-good.rules \
|
||||||
|
-datasource.url=http://localhost:8428 -notifier.url=http://localhost:9093 \
|
||||||
|
-evaluationInterval=3s
|
||||||
|
|
||||||
|
vmalert-amd64:
|
||||||
|
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 GO111MODULE=on go build -mod=vendor -ldflags "$(GO_BUILDINFO)" -o bin/vmalert-amd64 ./app/vmalert
|
||||||
|
|
||||||
|
vmalert-arm:
|
||||||
|
CGO_ENABLED=0 GOOS=linux GOARCH=arm GO111MODULE=on go build -mod=vendor -ldflags "$(GO_BUILDINFO)" -o bin/vmalert-arm ./app/vmalert
|
||||||
|
|
||||||
|
vmalert-arm64:
|
||||||
|
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 GO111MODULE=on go build -mod=vendor -ldflags "$(GO_BUILDINFO)" -o bin/vmalert-arm64 ./app/vmalert
|
||||||
|
|
||||||
|
vmalert-ppc64le:
|
||||||
|
CGO_ENABLED=0 GOOS=linux GOARCH=ppc64le GO111MODULE=on go build -mod=vendor -ldflags "$(GO_BUILDINFO)" -o bin/vmalert-ppc64le ./app/vmalert
|
||||||
|
|
||||||
|
vmalert-386:
|
||||||
|
CGO_ENABLED=0 GOOS=linux GOARCH=386 GO111MODULE=on go build -mod=vendor -ldflags "$(GO_BUILDINFO)" -o bin/vmalert-386 ./app/vmalert
|
||||||
|
|
||||||
|
vmalert-pure:
|
||||||
|
APP_NAME=vmalert $(MAKE) app-local-pure
|
|
@ -1,41 +1,91 @@
|
||||||
## VM Alert
|
## VM Alert
|
||||||
|
|
||||||
#### Abstract
|
`vmalert` executes a list of given MetricsQL expressions (rules) and
|
||||||
The application which accepts the alert rules, executes them on given source, sends(fires) an alert to(in) alert management system
|
sends alerts to [Alert Manager](https://github.com/prometheus/alertmanager).
|
||||||
|
|
||||||
### Components
|
NOTE: `vmalert` is in early alpha and wasn't tested in production systems yet.
|
||||||
|
|
||||||
#### Alert Config Reader
|
### Features:
|
||||||
It accepts yaml config as input parameter in Prometheus format, parses it into Go struct.
|
* Integration with [VictoriaMetrics](https://github.com/VictoriaMetrics/VictoriaMetrics) TSDB;
|
||||||
|
* VictoriaMetrics [MetricsQL](https://github.com/VictoriaMetrics/VictoriaMetrics/wiki/MetricsQL)
|
||||||
|
expressions validation;
|
||||||
|
* Prometheus [alerting rules definition format](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/#defining-alerting-rules)
|
||||||
|
support;
|
||||||
|
* Integration with [Alertmanager](https://github.com/prometheus/alertmanager);
|
||||||
|
* Lightweight without extra dependencies.
|
||||||
|
|
||||||
#### Source Caller
|
### TODO:
|
||||||
Create own watchdog for every alert group (goroutines), which executes alert query on given source and issues an alert if source returns non-empty result.
|
* Persist alerts state as timeseries in TSDB. Currently, alerts state is stored
|
||||||
Source can be any service which supports PromQL (MetricsQL).
|
in process memory only and will be lost on restart;
|
||||||
|
* Configuration hot reload.
|
||||||
|
|
||||||
#### Alert Management System Provider
|
### QuickStart
|
||||||
Send positive alert to alert management system, provides interface for every concrete implementation.
|
|
||||||
Should be ingratiated with Prometheus alertmanager.
|
|
||||||
|
|
||||||
open questions:
|
To build `vmalert` from sources:
|
||||||
- do we really need alert group or can just run every alert in own goroutine?
|
```
|
||||||
|
git clone https://github.com/VictoriaMetrics/VictoriaMetrics
|
||||||
|
cd VictoriaMetrics
|
||||||
|
make vmalert
|
||||||
|
```
|
||||||
|
The build binary will be placed to `VictoriaMetrics/bin` folder.
|
||||||
|
|
||||||
#### Web Server
|
To start using `vmalert` you will need the following things:
|
||||||
Expose metrics
|
* list of alert rules - PromQL/MetricsQL expressions to execute;
|
||||||
|
* datasource address - reachable VictoriaMetrics instance for rules execution;
|
||||||
|
* notifier address - reachable Alertmanager instance for processing,
|
||||||
|
aggregating alerts and sending notifications.
|
||||||
|
|
||||||
open questions:
|
Then configure `vmalert` accordingly:
|
||||||
- should the tool provide API or UI for managing alerting rules? Where to store config updated via the API or UI?
|
```
|
||||||
- should the tool provide “alerting rules validation mode” for validating and debugging alerting rules? This mode is useful when creating and debugging alerting rules.
|
./bin/vmalert -rule=alert.rules \
|
||||||
|
-datasource.url=http://localhost:8428 \
|
||||||
|
-notifier.url=http://localhost:9093
|
||||||
|
```
|
||||||
|
|
||||||
#### Requirements:
|
Example for `.rules` file bay be found [here](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/app/vmalert/testdata/rules0-good.rules)
|
||||||
- Stateless
|
|
||||||
- Avoid external dependencies if possible
|
|
||||||
- Reuse existing code from VictoriaMetrics repo
|
|
||||||
- Makefile rules for common tasks – see Makefiles for other apps in the app/ dir
|
|
||||||
- Every package should be covered by tests
|
|
||||||
- Dockerfile
|
|
||||||
- Graceful shutdown
|
|
||||||
- Helm template
|
|
||||||
- Application uses command line flags for configuration
|
|
||||||
|
|
||||||
|
`vmalert` runs evaluation for every group in a separate goroutine.
|
||||||
|
Rules in group evaluated one-by-one sequentially.
|
||||||
|
|
||||||
<img alt="VM Alert" src="vmalert.png">
|
`vmalert` also runs a web-server (`-httpListenAddr`) for serving metrics and alerts endpoints:
|
||||||
|
* `http://<vmalert-addr>/api/v1/alerts` - list of all active alerts;
|
||||||
|
* `http://<vmalert-addr>/api/v1/<groupName>/<alertID>/status" ` - get alert status by ID.
|
||||||
|
Used as alert source in AlertManager.
|
||||||
|
* `http://<vmalert-addr>/metrics` - application metrics.
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
|
||||||
|
The shortlist of configuration flags is the following:
|
||||||
|
```
|
||||||
|
Usage of vmalert:
|
||||||
|
-datasource.url string
|
||||||
|
Victoria Metrics or VMSelect url. Required parameter. e.g. http://127.0.0.1:8428
|
||||||
|
-datasource.basicAuth.password string
|
||||||
|
Optional basic auth password to use for -datasource.url
|
||||||
|
-datasource.basicAuth.username string
|
||||||
|
Optional basic auth username to use for -datasource.url
|
||||||
|
-evaluationInterval duration
|
||||||
|
How often to evaluate the rules. Default 1m (default 1m0s)
|
||||||
|
-external.url string
|
||||||
|
External URL is used as alert's source for sent alerts to the notifier
|
||||||
|
-notifier.url string
|
||||||
|
Prometheus alertmanager URL. Required parameter. e.g. http://127.0.0.1:9093
|
||||||
|
-rule value
|
||||||
|
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.validateAnnotations
|
||||||
|
Indicates to validate annotation templates (default true)
|
||||||
|
```
|
||||||
|
|
||||||
|
Pass `-help` to `vmalert` in order to see the full list of supported
|
||||||
|
command-line flags with their descriptions.
|
||||||
|
|
||||||
|
### Contributing
|
||||||
|
|
||||||
|
`vmalert` is mostly designed and built by VictoriaMetrics community.
|
||||||
|
Feel free to share your experience and ideas for improving this
|
||||||
|
software. Please keep simplicity as the main priority.
|
|
@ -23,11 +23,12 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
rulePath = flagutil.NewArray("rule", `Path to file with alert rules, accepts patterns.
|
rulePath = flagutil.NewArray("rule", `Path to the file with alert rules.
|
||||||
Flag can be specified multiple time.
|
Supports patterns. Flag can be specified multiple times.
|
||||||
Examples:
|
Examples:
|
||||||
-rule /path/to/file. Path to single file with alerting rules
|
-rule /path/to/file. Path to a single file with alerting rules
|
||||||
-rule dir/*.yaml -rule /*.yaml. Paths to all yaml files in relative dir folder and absolute yaml file in a root.`)
|
-rule dir/*.yaml -rule /*.yaml. Relative path to all .yaml files in "dir" folder,
|
||||||
|
absolute path to all .yaml files in root.`)
|
||||||
validateAlertAnnotations = flag.Bool("rule.validateAnnotations", true, "Indicates to validate annotation templates")
|
validateAlertAnnotations = flag.Bool("rule.validateAnnotations", true, "Indicates to validate annotation templates")
|
||||||
httpListenAddr = flag.String("httpListenAddr", ":8880", "Address to listen for http connections")
|
httpListenAddr = flag.String("httpListenAddr", ":8880", "Address to listen for http connections")
|
||||||
datasourceURL = flag.String("datasource.url", "", "Victoria Metrics or VMSelect url. Required parameter. e.g. http://127.0.0.1:8428")
|
datasourceURL = flag.String("datasource.url", "", "Victoria Metrics or VMSelect url. Required parameter. e.g. http://127.0.0.1:8428")
|
||||||
|
@ -35,7 +36,7 @@ Examples:
|
||||||
basicAuthPassword = flag.String("datasource.basicAuth.password", "", "Optional basic auth password to use for -datasource.url")
|
basicAuthPassword = flag.String("datasource.basicAuth.password", "", "Optional basic auth password to use for -datasource.url")
|
||||||
evaluationInterval = flag.Duration("evaluationInterval", 1*time.Minute, "How often to evaluate the rules. Default 1m")
|
evaluationInterval = flag.Duration("evaluationInterval", 1*time.Minute, "How often to evaluate the rules. Default 1m")
|
||||||
notifierURL = flag.String("notifier.url", "", "Prometheus alertmanager URL. Required parameter. e.g. http://127.0.0.1:9093")
|
notifierURL = flag.String("notifier.url", "", "Prometheus alertmanager URL. Required parameter. e.g. http://127.0.0.1:9093")
|
||||||
externalURL = flag.String("external.url", "", "URL is used to generate sharable alert URL")
|
externalURL = flag.String("external.url", "", "External URL is used as alert's source for sent alerts to the notifier")
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO: hot configuration reload
|
// TODO: hot configuration reload
|
||||||
|
|
|
@ -12,7 +12,6 @@ import (
|
||||||
|
|
||||||
"github.com/VictoriaMetrics/VictoriaMetrics/app/vmalert/datasource"
|
"github.com/VictoriaMetrics/VictoriaMetrics/app/vmalert/datasource"
|
||||||
"github.com/VictoriaMetrics/VictoriaMetrics/app/vmalert/notifier"
|
"github.com/VictoriaMetrics/VictoriaMetrics/app/vmalert/notifier"
|
||||||
"github.com/VictoriaMetrics/VictoriaMetrics/lib/logger"
|
|
||||||
"github.com/VictoriaMetrics/VictoriaMetrics/lib/metricsql"
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/metricsql"
|
||||||
"github.com/VictoriaMetrics/metrics"
|
"github.com/VictoriaMetrics/metrics"
|
||||||
)
|
)
|
||||||
|
@ -137,7 +136,6 @@ func (r *Rule) Send(_ context.Context, ap notifier.Notifier) error {
|
||||||
r.mu.Unlock()
|
r.mu.Unlock()
|
||||||
|
|
||||||
if len(alertsCopy) < 1 {
|
if len(alertsCopy) < 1 {
|
||||||
logger.Infof("no alerts to send")
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
alertsSent.Add(len(alertsCopy))
|
alertsSent.Add(len(alertsCopy))
|
||||||
|
|
10
app/vmalert/testdata/rules0-good.rules
vendored
10
app/vmalert/testdata/rules0-good.rules
vendored
|
@ -10,3 +10,13 @@ groups:
|
||||||
summary: "{{ $value|humanize }}"
|
summary: "{{ $value|humanize }}"
|
||||||
description: "{{$labels}}"
|
description: "{{$labels}}"
|
||||||
|
|
||||||
|
- name: TestGroup
|
||||||
|
rules:
|
||||||
|
- alert: Conns
|
||||||
|
expr: sum(vm_tcplistener_conns) by(instance) > 1
|
||||||
|
annotations:
|
||||||
|
summary: "Too high connection number for {{$labels.instance}}"
|
||||||
|
description: "It is {{ $value }} connections for {{$labels.instance}}"
|
||||||
|
- alert: ExampleAlertAlwaysFiring
|
||||||
|
expr: sum by(job)
|
||||||
|
(up == 1)
|
Binary file not shown.
Before Width: | Height: | Size: 25 KiB |
Loading…
Reference in a new issue