From b5363ffab2c726b9a2d13789825cfc43b2048afb Mon Sep 17 00:00:00 2001 From: Artem Navoiev Date: Fri, 19 Jan 2024 07:00:41 -0800 Subject: [PATCH] Move vmanomaly page to its own section (#5646) * docs: move vmanomaly overview page to its section Signed-off-by: Artem Navoiev * add alias for backward compatibility Signed-off-by: Artem Navoiev * fix links Signed-off-by: Artem Navoiev * change title Signed-off-by: Artem Navoiev --------- Signed-off-by: Artem Navoiev --- docs/anomaly-detection/CHANGELOG.md | 2 +- docs/anomaly-detection/FAQ.md | 8 +- docs/anomaly-detection/Overview.md | 296 ++++++++++++++++++ docs/anomaly-detection/README.md | 9 +- docs/anomaly-detection/components/README.md | 8 +- docs/anomaly-detection/components/models.md | 4 +- docs/anomaly-detection/guides/README.md | 8 +- .../guides/guide-vmanomaly-vmalert.md | 8 +- .../vmanomaly-holtwinters-example.webp | Bin 0 -> 26590 bytes .../vmanomaly-prophet-example.webp | Bin 0 -> 26430 bytes docs/enterprise.md | 2 +- docs/vmanomaly.md | 286 +---------------- 12 files changed, 322 insertions(+), 309 deletions(-) create mode 100644 docs/anomaly-detection/Overview.md create mode 100644 docs/anomaly-detection/vmanomaly-holtwinters-example.webp create mode 100644 docs/anomaly-detection/vmanomaly-prophet-example.webp diff --git a/docs/anomaly-detection/CHANGELOG.md b/docs/anomaly-detection/CHANGELOG.md index 264809ed2..c282e213d 100644 --- a/docs/anomaly-detection/CHANGELOG.md +++ b/docs/anomaly-detection/CHANGELOG.md @@ -20,7 +20,7 @@ The following `tip` changes can be tested by building from the `latest` tag: docker pull us-docker.pkg.dev/victoriametrics-test/public/vmanomaly-trial:latest ``` -Please find [launch instructions here](/vmanomaly.html#run-vmanomaly-docker-container). +Please find [launch instructions here](/anomaly-detection/overview.html#run-vmanomaly-docker-container). # tip diff --git a/docs/anomaly-detection/FAQ.md b/docs/anomaly-detection/FAQ.md index eb64ef4b2..7aca286b6 100644 --- a/docs/anomaly-detection/FAQ.md +++ b/docs/anomaly-detection/FAQ.md @@ -1,12 +1,12 @@ --- -sort: 3 -weight: 3 +sort: 4 +weight: 4 title: FAQ menu: docs: identifier: "vmanomaly-faq" parent: "anomaly-detection" - weight: 3 + weight: 4 aliases: - /anomaly-detection/FAQ.html --- @@ -28,7 +28,7 @@ The decision to set the changepoint at `1.0` is made to ensure consistency acros ## How does vmanomaly work? `vmanomaly` applies built-in (or custom) [anomaly detection algorithms](/anomaly-detection/components/models.html), specified in a config file. Although a single config file supports one model, running multiple instances of `vmanomaly` with different configs is possible and encouraged for parallel processing or better support for your use case (i.e. simpler model for simple metrics, more sophisticated one for metrics with trends and seasonalities). -Please refer to [about](/vmanomaly.html#about) section to find out more. +Please refer to [about](/anomaly-detection/overview.html#about) section to find out more. ## What data does vmanomaly operate on? `vmanomaly` operates on data fetched from VictoriaMetrics, where you can leverage full power of [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html) for data selection, sampling, and processing. Users can also [apply global filters](https://docs.victoriametrics.com/#prometheus-querying-api-enhancements) for more targeted data analysis, enhancing scope limitation and tenant visibility. diff --git a/docs/anomaly-detection/Overview.md b/docs/anomaly-detection/Overview.md new file mode 100644 index 000000000..6016e71d4 --- /dev/null +++ b/docs/anomaly-detection/Overview.md @@ -0,0 +1,296 @@ +--- +title: vmanomaly overview +weight: 4 + +menu: + docs: + parent: 'victoriametrics' + sort: 0 + weight: 0 + +aliases: +- /anomaly-detection.html +--- + + +# vmanomaly overview + +**_vmanomaly_ is a part of [enterprise package](https://docs.victoriametrics.com/enterprise.html). You need to request a [free trial license](https://victoriametrics.com/products/enterprise/trial/) for evaluation.** + +## About + +**VictoriaMetrics Anomaly Detection** (or shortly, `vmanomaly`) is a service that continuously scans VictoriaMetrics time +series and detects unexpected changes within data patterns in real-time. It does so by utilizing +user-configurable machine learning models. + +It periodically queries user-specified metrics, computes an “anomaly score” for them, based on how +well they fit a predicted distribution, taking into account periodical data patterns with trends, +and pushes back the computed “anomaly score” to VictoriaMetrics. Then, users can enable alerting +rules based on the “anomaly score”. + +Compared to classical alerting rules, anomaly detection is more “hands-off” i.e. it allows users to +avoid setting up manual alerting rules set up and catching anomalies that were not expected to happen. +In other words, by setting up alerting rules, a user must know what to look for, ahead of time, +while anomaly detection looks for any deviations from past behavior. + +In addition to that, setting up alerting rules manually has been proven to be tedious and +error-prone, while anomaly detection can be easier to set up, and use the same model for different +metrics. + +## How? + +VictoriaMetrics Anomaly Detection service (**vmanomaly**) allows you to apply several built-in +anomaly detection algorithms. You can also plug in your own detection models, code doesn’t make any +distinction between built-in models or external ones. + +All the service parameters (model, schedule, input-output) are defined in a config file. + +Single config file supports only one model, but it’s totally OK to run multiple **vmanomaly** +processes in parallel, each using its own config. + +## Models + +Currently, vmanomaly ships with a set of built-in models: +> For a detailed overview, see [model section](/anomaly-detection/components/models.html) + +1. [**ZScore**](/anomaly-detection/components/models.html#z-score) + + _(useful for testing)_ + + Simplistic model, that detects outliers as all the points that lie farther than a certain amount + from time-series mean (straight line). Keeps only two model parameters internally: + `mean` and `std` (standard deviation). + +1. [**Prophet**](/anomaly-detection/components/models.html#prophet) + + _(simplest in configuration, recommended for getting started)_ + + Uses Facebook Prophet for forecasting. The _anomaly score_ is computed of how close the actual time + series values follow the forecasted values (_yhat_), and whether it’s within forecasted bounds + (_yhat_lower_, _yhat_upper_). The _anomaly score_ reaches 1.0 if the actual data values + are equal to + _yhat_lower_ or _yhat_upper_. The _anomaly score_ is above 1.0 if the actual data values are + outside + the _yhat_lower_/_yhat_upper_ bounds. + + See [Prophet documentation](https://facebook.github.io/prophet/) + +1. [**Holt-Winters**](/anomaly-detection/components/models.html#holt-winters) + + Very popular forecasting algorithm. See [statsmodels.org documentation]( + https://www.statsmodels.org/stable/generated/statsmodels.tsa.holtwinters.ExponentialSmoothing.html) + for Holt-Winters exponential smoothing. + +1. [**Seasonal-Trend Decomposition**](/anomaly-detection/components/models.html#seasonal-trend-decomposition) + + Extracts three components: season, trend, and residual, that can be plotted individually for + easier debugging. Uses LOESS (locally estimated scatterplot smoothing). + See [statsmodels.org documentation](https://www.statsmodels.org/dev/examples/notebooks/generated/stl_decomposition.html) + for LOESS STD. + +1. [**ARIMA**](/anomaly-detection/components/models.html#arima) + + Commonly used forecasting model. See [statsmodels.org documentation](https://www.statsmodels.org/stable/generated/statsmodels.tsa.arima.model.ARIMA.html) for ARIMA. + +1. [**Rolling Quantile**](/anomaly-detection/components/models.html#rolling-quantile) + + A simple moving window of quantiles. Easy to use, easy to understand, but not as powerful as + other models. + +1. [**Isolation Forest**](/anomaly-detection/components/models.html#isolation-forest-multivariate) + + Detects anomalies using binary trees. It works for both univariate and multivariate data. Be aware of [the curse of dimensionality](https://en.wikipedia.org/wiki/Curse_of_dimensionality) in the case of multivariate data - we advise against using a single model when handling multiple time series *if the number of these series significantly exceeds their average length (# of data points)*. + + The algorithm has a linear time complexity and a low memory requirement, which works well with high-volume data. See [scikit-learn.org documentation](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html) for Isolation Forest. + + +1. [**MAD (Median Absolute Deviation)**](anomaly-detection/components/models.html#mad-median-absolute-deviation) + + A robust method for anomaly detection that is less sensitive to outliers in data compared to standard deviation-based models. It considers a point as an anomaly if the absolute deviation from the median is significantly large. + + +### Examples +For example, here’s how Prophet predictions could look like on a real-data example +(Prophet auto-detected seasonality interval): + +propher-example + +And here’s what Holt-Winters predictions real-world data could look like (seasonality manually +set to 1 week). Notice that it predicts anomalies in +different places than Prophet because the model noticed there are usually spikes on Friday +morning, so it accounted for that: + +holtwinters-example + +## Process +Upon starting, vmanomaly queries the initial range of data, and trains its model (“fit” by convention). + +Then, reads new data from VictoriaMetrics, according to schedule, and invokes its model to compute +“anomaly score” for each data point. The anomaly score ranges from 0 to positive infinity. +Values less than 1.0 are considered “not an anomaly”, values greater or equal than 1.0 are +considered “anomalous”, with greater values corresponding to larger anomaly. +Then, vmanomaly pushes the metric to vminsert (under the user-configured metric name, +optionally preserving labels). + + +## Usage +> Starting from [v1.5.0](/anomaly-detection/CHANGELOG.html#v150), vmanomaly requires a license key to run. You can obtain a trial license key [here](https://victoriametrics.com/products/enterprise/trial/). + +> See [Getting started guide](anomaly-detection/guides/guide-vmanomaly-vmalert.html). + +### Config file +There are 4 required sections in config file: + +* [`scheduler`](/anomaly-detection/components/scheduler.html) - defines how often to run and make inferences, as well as what timerange to use to train the model. +* [`model`](/anomaly-detection/components/models.html) - specific model parameters and configurations, +* [`reader`](/anomaly-detection/components/reader.html) - how to read data and where it is located +* [`writer`](/anomaly-detection/components/writer.html) - where and how to write the generated output. + +[`monitoring`](#monitoring) - defines how to monitor work of *vmanomaly* service. This config section is *optional*. + +> For a detailed description, see [config sections](/anomaly-detection/components) + +#### Config example +Here is an example of config file that will run FB Prophet model, that will be retrained every 2 hours on 14 days of previous data. It will generate inference (including `anomaly_score` metric) every 1 minute. + + +You need to put your datasource urls to use it: + +```yaml +scheduler: + infer_every: "1m" + fit_every: "2h" + fit_window: "14d" + +model: + class: "model.prophet.ProphetModel" + args: + interval_width: 0.98 + +reader: + datasource_url: [YOUR_DATASOURCE_URL] #Example: "http://victoriametrics:8428/" + queries: + cache: "sum(rate(vm_cache_entries))" + +writer: + datasource_url: [YOUR_DATASOURCE_URL] # Example: "http://victoriametrics:8428/" +``` + +### Monitoring + +*vmanomaly* can be monitored by using push or pull approach. +It can push metrics to VictoriaMetrics or expose metrics in Prometheus exposition format. + +> For a detailed description, see [monitoring section](/anomaly-detection/components/monitoring.html) + +#### Push approach + +*vmanomaly* can push metrics to VictoriaMetrics single-node or cluster version. +In order to enable push approach, specify `push` section in config file: + +```yaml +monitoring: + push: + url: [YOUR_DATASOURCE_URL] #Example: "http://victoriametrics:8428/" + extra_labels: + job: "vmanomaly-push" +``` + +#### Pull approach + +*vmanomaly* can export internal metrics in Prometheus exposition format at `/metrics` page. +These metrics can be scraped via [vmagent](https://docs.victoriametrics.com/vmagent.html) or Prometheus. + +In order to enable pull approach, specify `pull` section in config file: + +```yaml +monitoring: + pull: + enable: true + port: 8080 +``` + +This will expose metrics at `http://0.0.0.0:8080/metrics` page. + +### Run vmanomaly Docker Container + +To use *vmanomaly* you need to pull docker image: + +```sh +docker pull victoriametrics/vmanomaly:1.7.2 +``` + +> Note: please check what is latest release in [CHANGELOG](/anomaly-detection/CHANGELOG.html) + +> Note: `us-docker.pkg.dev/victoriametrics-test/public/vmanomaly-trial` is deprecated since [v1.6.0](/anomaly-detection/CHANGELOG.html#v160). Use [DockerHub repo](https://hub.docker.com/r/victoriametrics/vmanomaly/tags) instead + +You can put a tag on it for your convinience: + +```sh +docker image tag victoriametrics/vmanomaly:1.7.2 vmanomaly +``` +Here is an example of how to run *vmanomaly* docker container with [license file](#licensing): + +```sh +docker run -it --net [YOUR_NETWORK] \ + -v [YOUR_LICENSE_FILE_PATH]:/license.txt \ + -v [YOUR_CONFIG_FILE_PATH]:/config.yml \ + vmanomaly /config.yml \ + --license-file=/license.txt +``` + +### Licensing + +The license key can be passed via the following command-line flags: +``` + --license LICENSE See https://victoriametrics.com/products/enterprise/ + for trial license + --license-file LICENSE_FILE + See https://victoriametrics.com/products/enterprise/ + for trial license + --license-verify-offline {true,false} + Force offline verification of license code. License is + verified online by default. This flag runs license + verification offline. +``` + + + +In order to make it easier to monitor the license expiration date, the following metrics are exposed(see +[Monitoring](#monitoring) section for details on how to scrape them): + +``` +# HELP vm_license_expires_at When the license expires as a Unix timestamp in seconds +# TYPE vm_license_expires_at gauge +vm_license_expires_at 1.6963776e+09 +# HELP vm_license_expires_in_seconds Amount of seconds until the license expires +# TYPE vm_license_expires_in_seconds gauge +vm_license_expires_in_seconds 4.886608e+06 +``` + +Example alerts for [vmalert](https://docs.victoriametrics.com/vmalert.html): + +```yaml +groups: + - name: vm-license + # note the `job` label and update accordingly to your setup + rules: + - alert: LicenseExpiresInLessThan30Days + expr: vm_license_expires_in_seconds < 30 * 24 * 3600 + labels: + severity: warning + annotations: + summary: "{{ $labels.job }} instance {{ $labels.instance }} license expires in less than 30 days" + description: "{{ $labels.instance }} of job {{ $labels.job }} license expires in {{ $value | humanizeDuration }}. + Please make sure to update the license before it expires." + + - alert: LicenseExpiresInLessThan7Days + expr: vm_license_expires_in_seconds < 7 * 24 * 3600 + labels: + severity: critical + annotations: + summary: "{{ $labels.job }} instance {{ $labels.instance }} license expires in less than 7 days" + description: "{{ $labels.instance }} of job {{ $labels.job }} license expires in {{ $value | humanizeDuration }}. + Please make sure to update the license before it expires." +``` + diff --git a/docs/anomaly-detection/README.md b/docs/anomaly-detection/README.md index 6c9419d25..86234c7cc 100644 --- a/docs/anomaly-detection/README.md +++ b/docs/anomaly-detection/README.md @@ -2,8 +2,6 @@ # sort: 14 title: VictoriaMetrics Anomaly Detection weight: 0 -disableToc: true - menu: docs: parent: 'victoriametrics' @@ -12,6 +10,7 @@ menu: aliases: - /anomaly-detection.html +- /vmanomaly.html --- # VictoriaMetrics Anomaly Detection @@ -21,15 +20,15 @@ In the dynamic and complex world of system monitoring, VictoriaMetrics Anomaly D ## Practical Guides and Installation Begin your VictoriaMetrics Anomaly Detection journey with ease using our guides and installation instructions: -- **Quick Start**: Find out how `vmanomaly` service operates [here](/vmanomaly.html) +- **Overview**: Find out how `vmanomaly` service operates [here](/anomaly-detection/overview.html) - **Integration**: Integrate anomaly detection into your observability ecosystem. Get started [**here**](/anomaly-detection/guides/guide-vmanomaly-vmalert.html). - **Installation Options**: Select the method that aligns with your technical requirements: - - **Docker Installation**: Suitable for containerized environments. See [Docker guide](/vmanomaly.html#run-vmanomaly-docker-container). + - **Docker Installation**: Suitable for containerized environments. See [Docker guide](/anomaly-detection/overview#run-vmanomaly-docker-container). - **Helm Chart Installation**: Appropriate for those using Kubernetes. See our [Helm charts](https://github.com/VictoriaMetrics/helm-charts/tree/master/charts/victoria-metrics-anomaly). -> Note: starting from [v1.5.0](./CHANGELOG.md#v150) `vmanomaly` requires a [license key](/vmanomaly.html#licensing) to run. You can obtain a trial license key [**here**](https://victoriametrics.com/products/enterprise/trial/index.html). +> Note: starting from [v1.5.0](./CHANGELOG.md#v150) `vmanomaly` requires a [license key](/anomaly-detection/overview#licensing) to run. You can obtain a trial license key [**here**](https://victoriametrics.com/products/enterprise/trial/index.html). ## Key Components Explore the integral components that configure VictoriaMetrics Anomaly Detection: diff --git a/docs/anomaly-detection/components/README.md b/docs/anomaly-detection/components/README.md index ed9f23a58..3b5d36b70 100644 --- a/docs/anomaly-detection/components/README.md +++ b/docs/anomaly-detection/components/README.md @@ -1,12 +1,12 @@ --- -sort: 1 +sort: 2 title: Components -weight: 1 +weight: 2 menu: docs: identifier: "vmanomaly-components" parent: "anomaly-detection" - sort: 1 + sort: 2 aliases: - /anomaly-detection/components/ - /anomaly-detection/components/index.html @@ -14,7 +14,7 @@ aliases: # Components -This chapter describes different components, that correspond to respective sections of a config to launch VictoriaMetrics Anomaly Detection (or simply [`vmanomaly`](/vmanomaly.html)) service: +This chapter describes different components, that correspond to respective sections of a config to launch VictoriaMetrics Anomaly Detection (or simply [`vmanomaly`](/anomaly-detection/overview.html)) service: - [Model(s) section](models.html) - Required - [Reader section](reader.html) - Required diff --git a/docs/anomaly-detection/components/models.md b/docs/anomaly-detection/components/models.md index dfc57ee46..0bde45278 100644 --- a/docs/anomaly-detection/components/models.md +++ b/docs/anomaly-detection/components/models.md @@ -16,7 +16,7 @@ aliases: # Models -This section describes `Model` component of VictoriaMetrics Anomaly Detection (or simply [`vmanomaly`](/vmanomaly.html)) and the guide of how to define a respective section of a config to launch the service. +This section describes `Model` component of VictoriaMetrics Anomaly Detection (or simply [`vmanomaly`](/anomaly-detection/overview.html)) and the guide of how to define a respective section of a config to launch the service. vmanomaly includes various [built-in models](#built-in-models) and you can integrate your custom model with vmanomaly see [custom model](#custom-model-guide) @@ -471,7 +471,7 @@ us-docker.pkg.dev/victoriametrics-test/public/vmanomaly-trial:latest /config.yam -Please find more detailed instructions (license, etc.) [here](/vmanomaly.html#run-vmanomaly-docker-container) +Please find more detailed instructions (license, etc.) [here](/anomaly-detection/overview.html#run-vmanomaly-docker-container) ### Output diff --git a/docs/anomaly-detection/guides/README.md b/docs/anomaly-detection/guides/README.md index fa757d669..5f212e514 100644 --- a/docs/anomaly-detection/guides/README.md +++ b/docs/anomaly-detection/guides/README.md @@ -1,19 +1,19 @@ --- title: Guides -weight: 2 -sort: 2 +weight: 3 +sort: 3 menu: docs: identifier: "anomaly-detection-guides" parent: "anomaly-detection" - weight: 2 + weight: 3 aliases: - /anomaly-detection/guides.html --- # Guides -This section holds guides of how to set up and use VictoriaMetrics Anomaly Detection (or simply [`vmanomaly`](/vmanomaly.html)) service, integrating it with different observability components. +This section holds guides of how to set up and use VictoriaMetrics Anomaly Detection (or simply [`vmanomaly`](/anomaly-detection/overview.html)) service, integrating it with different observability components. Guides: diff --git a/docs/anomaly-detection/guides/guide-vmanomaly-vmalert.md b/docs/anomaly-detection/guides/guide-vmanomaly-vmalert.md index 08690bb41..e52a8147f 100644 --- a/docs/anomaly-detection/guides/guide-vmanomaly-vmalert.md +++ b/docs/anomaly-detection/guides/guide-vmanomaly-vmalert.md @@ -31,7 +31,7 @@ aliases: ## 1. What is vmanomaly? -*VictoriaMetrics Anomaly Detection* ([vmanomaly](https://docs.victoriametrics.com/vmanomaly.html)) is a service that continuously scans time series stored in VictoriaMetrics and detects unexpected changes within data patterns in real-time. It does so by utilizing user-configurable machine learning models. +*VictoriaMetrics Anomaly Detection* ([vmanomaly](https://docs.victoriametrics.com/anomaly-detection/overview.html)) is a service that continuously scans time series stored in VictoriaMetrics and detects unexpected changes within data patterns in real-time. It does so by utilizing user-configurable machine learning models. All the service parameters are defined in a config file. @@ -66,8 +66,8 @@ Compared to classical alerting rules, anomaly detection is more "hands-off" and Practical use case is to put anomaly score generated by vmanomaly into alerting rules with some threshold. **In this tutorial we are going to:** - - Configure docker-compose file with all needed services ([VictoriaMetrics Single-Node](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html), [vmalert](https://docs.victoriametrics.com/vmalert.html), [vmagent](https://docs.victoriametrics.com/vmagent.html), [Grafana](https://grafana.com/), [Node Exporter](https://prometheus.io/docs/guides/node-exporter/) and [vmanomaly](https://docs.victoriametrics.com/vmanomaly.html) ). - - Explore configuration files for [vmanomaly](https://docs.victoriametrics.com/vmanomaly.html) and [vmalert](https://docs.victoriametrics.com/vmalert.html). + - Configure docker-compose file with all needed services ([VictoriaMetrics Single-Node](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html), [vmalert](https://docs.victoriametrics.com/vmalert.html), [vmagent](https://docs.victoriametrics.com/vmagent.html), [Grafana](https://grafana.com/), [Node Exporter](https://prometheus.io/docs/guides/node-exporter/) and [vmanomaly](https://docs.victoriametrics.com/anomaly-detection/overview.html) ). + - Explore configuration files for [vmanomaly](https://docs.victoriametrics.com/anomaly-detection/overview.html) and [vmalert](https://docs.victoriametrics.com/vmalert.html). - Run our own [VictoriaMetrics](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html) database with data scraped from [Node Exporter](https://prometheus.io/docs/guides/node-exporter/). - Explore data for analysis in [Grafana](https://grafana.com/). - Explore `vmanomaly` results. @@ -273,7 +273,7 @@ scrape_configs: ### vmanomaly licencing We are going to use license stored locally in file `vmanomaly_license.txt` with key in it. -You can explore other license options [here](https://docs.victoriametrics.com/vmanomaly.html#licensing) +You can explore other license options [here](https://docs.victoriametrics.com/anomaly-detection/overview#licensing) ### Alertmanager setup diff --git a/docs/anomaly-detection/vmanomaly-holtwinters-example.webp b/docs/anomaly-detection/vmanomaly-holtwinters-example.webp new file mode 100644 index 0000000000000000000000000000000000000000..3da8a9e44f2cd05b1033ef8fc44347f5bac6a4f0 GIT binary patch literal 26590 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 literal 0 HcmV?d00001 diff --git a/docs/anomaly-detection/vmanomaly-prophet-example.webp b/docs/anomaly-detection/vmanomaly-prophet-example.webp new file mode 100644 index 0000000000000000000000000000000000000000..6c9c7870f9c8a4142b2ffd5c57aa678c9b91278b GIT binary patch literal 26430 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 WN7euU0000000000000000000yDyE For a detailed overview, see [model section](/anomaly-detection/components/models.html) - -1. [**ZScore**](/anomaly-detection/components/models.html#z-score) - - _(useful for testing)_ - - Simplistic model, that detects outliers as all the points that lie farther than a certain amount - from time-series mean (straight line). Keeps only two model parameters internally: - `mean` and `std` (standard deviation). - -1. [**Prophet**](/anomaly-detection/components/models.html#prophet) - - _(simplest in configuration, recommended for getting started)_ - - Uses Facebook Prophet for forecasting. The _anomaly score_ is computed of how close the actual time - series values follow the forecasted values (_yhat_), and whether it’s within forecasted bounds - (_yhat_lower_, _yhat_upper_). The _anomaly score_ reaches 1.0 if the actual data values - are equal to - _yhat_lower_ or _yhat_upper_. The _anomaly score_ is above 1.0 if the actual data values are - outside - the _yhat_lower_/_yhat_upper_ bounds. - - See [Prophet documentation](https://facebook.github.io/prophet/) - -1. [**Holt-Winters**](/anomaly-detection/components/models.html#holt-winters) - - Very popular forecasting algorithm. See [statsmodels.org documentation]( - https://www.statsmodels.org/stable/generated/statsmodels.tsa.holtwinters.ExponentialSmoothing.html) - for Holt-Winters exponential smoothing. - -1. [**Seasonal-Trend Decomposition**](/anomaly-detection/components/models.html#seasonal-trend-decomposition) - - Extracts three components: season, trend, and residual, that can be plotted individually for - easier debugging. Uses LOESS (locally estimated scatterplot smoothing). - See [statsmodels.org documentation](https://www.statsmodels.org/dev/examples/notebooks/generated/stl_decomposition.html) - for LOESS STD. - -1. [**ARIMA**](/anomaly-detection/components/models.html#arima) - - Commonly used forecasting model. See [statsmodels.org documentation](https://www.statsmodels.org/stable/generated/statsmodels.tsa.arima.model.ARIMA.html) for ARIMA. - -1. [**Rolling Quantile**](/anomaly-detection/components/models.html#rolling-quantile) - - A simple moving window of quantiles. Easy to use, easy to understand, but not as powerful as - other models. - -1. [**Isolation Forest**](/anomaly-detection/components/models.html#isolation-forest-multivariate) - - Detects anomalies using binary trees. It works for both univariate and multivariate data. Be aware of [the curse of dimensionality](https://en.wikipedia.org/wiki/Curse_of_dimensionality) in the case of multivariate data - we advise against using a single model when handling multiple time series *if the number of these series significantly exceeds their average length (# of data points)*. - - The algorithm has a linear time complexity and a low memory requirement, which works well with high-volume data. See [scikit-learn.org documentation](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html) for Isolation Forest. - - -1. [**MAD (Median Absolute Deviation)**](anomaly-detection/components/models.html#mad-median-absolute-deviation) - - A robust method for anomaly detection that is less sensitive to outliers in data compared to standard deviation-based models. It considers a point as an anomaly if the absolute deviation from the median is significantly large. - - -### Examples -For example, here’s how Prophet predictions could look like on a real-data example -(Prophet auto-detected seasonality interval): - -propher-example - -And here’s what Holt-Winters predictions real-world data could look like (seasonality manually - set to 1 week). Notice that it predicts anomalies in -different places than Prophet because the model noticed there are usually spikes on Friday -morning, so it accounted for that: - -holtwinters-example - -## Process -Upon starting, vmanomaly queries the initial range of data, and trains its model (“fit” by convention). - -Then, reads new data from VictoriaMetrics, according to schedule, and invokes its model to compute -“anomaly score” for each data point. The anomaly score ranges from 0 to positive infinity. -Values less than 1.0 are considered “not an anomaly”, values greater or equal than 1.0 are -considered “anomalous”, with greater values corresponding to larger anomaly. -Then, vmanomaly pushes the metric to vminsert (under the user-configured metric name, -optionally preserving labels). - - -## Usage -> Starting from [v1.5.0](/anomaly-detection/CHANGELOG.html#v150), vmanomaly requires a license key to run. You can obtain a trial license key [here](https://victoriametrics.com/products/enterprise/trial/). - -> See [Getting started guide](anomaly-detection/guides/guide-vmanomaly-vmalert.html). - -### Config file -There are 4 required sections in config file: - -* [`scheduler`](/anomaly-detection/components/scheduler.html) - defines how often to run and make inferences, as well as what timerange to use to train the model. -* [`model`](/anomaly-detection/components/models.html) - specific model parameters and configurations, -* [`reader`](/anomaly-detection/components/reader.html) - how to read data and where it is located -* [`writer`](/anomaly-detection/components/writer.html) - where and how to write the generated output. - -[`monitoring`](#monitoring) - defines how to monitor work of *vmanomaly* service. This config section is *optional*. - -> For a detailed description, see [config sections](/anomaly-detection/components) - -#### Config example -Here is an example of config file that will run FB Prophet model, that will be retrained every 2 hours on 14 days of previous data. It will generate inference (including `anomaly_score` metric) every 1 minute. - - -You need to put your datasource urls to use it: - -```yaml -scheduler: - infer_every: "1m" - fit_every: "2h" - fit_window: "14d" - -model: - class: "model.prophet.ProphetModel" - args: - interval_width: 0.98 - -reader: - datasource_url: [YOUR_DATASOURCE_URL] #Example: "http://victoriametrics:8428/" - queries: - cache: "sum(rate(vm_cache_entries))" - -writer: - datasource_url: [YOUR_DATASOURCE_URL] # Example: "http://victoriametrics:8428/" -``` - -### Monitoring - -*vmanomaly* can be monitored by using push or pull approach. -It can push metrics to VictoriaMetrics or expose metrics in Prometheus exposition format. - -> For a detailed description, see [monitoring section](/anomaly-detection/components/monitoring.html) - -#### Push approach - -*vmanomaly* can push metrics to VictoriaMetrics single-node or cluster version. -In order to enable push approach, specify `push` section in config file: - -```yaml -monitoring: - push: - url: [YOUR_DATASOURCE_URL] #Example: "http://victoriametrics:8428/" - extra_labels: - job: "vmanomaly-push" -``` - -#### Pull approach - -*vmanomaly* can export internal metrics in Prometheus exposition format at `/metrics` page. -These metrics can be scraped via [vmagent](https://docs.victoriametrics.com/vmagent.html) or Prometheus. - -In order to enable pull approach, specify `pull` section in config file: - -```yaml -monitoring: - pull: - enable: true - port: 8080 -``` - -This will expose metrics at `http://0.0.0.0:8080/metrics` page. - -### Run vmanomaly Docker Container - -To use *vmanomaly* you need to pull docker image: - -```sh -docker pull victoriametrics/vmanomaly:1.7.2 -``` - -> Note: please check what is latest release in [CHANGELOG](/anomaly-detection/CHANGELOG.html) - -> Note: `us-docker.pkg.dev/victoriametrics-test/public/vmanomaly-trial` is deprecated since [v1.6.0](/anomaly-detection/CHANGELOG.html#v160). Use [DockerHub repo](https://hub.docker.com/r/victoriametrics/vmanomaly/tags) instead - -You can put a tag on it for your convinience: - -```sh -docker image tag victoriametrics/vmanomaly:1.7.2 vmanomaly -``` -Here is an example of how to run *vmanomaly* docker container with [license file](#licensing): - -```sh -docker run -it --net [YOUR_NETWORK] \ - -v [YOUR_LICENSE_FILE_PATH]:/license.txt \ - -v [YOUR_CONFIG_FILE_PATH]:/config.yml \ - vmanomaly /config.yml \ - --license-file=/license.txt -``` - -### Licensing - -The license key can be passed via the following command-line flags: -``` - --license LICENSE See https://victoriametrics.com/products/enterprise/ - for trial license - --license-file LICENSE_FILE - See https://victoriametrics.com/products/enterprise/ - for trial license - --license-verify-offline {true,false} - Force offline verification of license code. License is - verified online by default. This flag runs license - verification offline. -``` - - - -In order to make it easier to monitor the license expiration date, the following metrics are exposed(see -[Monitoring](#monitoring) section for details on how to scrape them): - -``` -# HELP vm_license_expires_at When the license expires as a Unix timestamp in seconds -# TYPE vm_license_expires_at gauge -vm_license_expires_at 1.6963776e+09 -# HELP vm_license_expires_in_seconds Amount of seconds until the license expires -# TYPE vm_license_expires_in_seconds gauge -vm_license_expires_in_seconds 4.886608e+06 -``` - -Example alerts for [vmalert](https://docs.victoriametrics.com/vmalert.html): - -```yaml -groups: - - name: vm-license - # note the `job` label and update accordingly to your setup - rules: - - alert: LicenseExpiresInLessThan30Days - expr: vm_license_expires_in_seconds < 30 * 24 * 3600 - labels: - severity: warning - annotations: - summary: "{{ $labels.job }} instance {{ $labels.instance }} license expires in less than 30 days" - description: "{{ $labels.instance }} of job {{ $labels.job }} license expires in {{ $value | humanizeDuration }}. - Please make sure to update the license before it expires." - - - alert: LicenseExpiresInLessThan7Days - expr: vm_license_expires_in_seconds < 7 * 24 * 3600 - labels: - severity: critical - annotations: - summary: "{{ $labels.job }} instance {{ $labels.instance }} license expires in less than 7 days" - description: "{{ $labels.instance }} of job {{ $labels.job }} license expires in {{ $value | humanizeDuration }}. - Please make sure to update the license before it expires." -``` +vmanomaly currently has own section. +Please head to [Anomaly Detection section](/anomaly-detection) to find out more.