Benchmark for Prometheus-compatible systems
210
stars
75
commits
Go
primary language
Sep 10, 2026
updated
Prometheus-benchmark allows testing data ingestion and querying performance for Prometheus-compatible systems on production-like workload.
Prometheus-benchmark provides the following features:
node_exporter metrics - see chart/files/alerts.yaml.remoteStorages section at chart/values.yaml.The following systems can be tested with prometheus-benchmark:
For Prometheus write workload, vmagent scrapes metrics from node_exporter and pushes the scraped metrics to the configured Prometheus-compatible remote storage systems. These systems must support Prometheus remote_write API for measuring data ingestion performance.
For OpenTelemetry write workload, OTel Collector generates load using Host Metrics Receiver and pushes the scraped metrics to the configured Prometheus-compatible remote storage systems. These systems must support OpenTelemetry Protocol for measuring data ingestion performance.
Optionally, these systems may support Prometheus querying API for measuring query performance. The query load is generated by vmalert periodically executing the configured alerting rules.
The helm chart deploys the following components:
vmagent with the following containers:
nodeexporter for 1 second in order to reduce load on it
when scraping big number of targets.nodeexporter metrics via nginx
for targets generated by vmagent-config-updater.otel-collector generates load using the host metrics receiver and writes to storage via OTLP.vmalert with the following containers:
vmsingle - this pod runs a single-node VictoriaMetrics, which collects metrics from vmagent and vmalert pods,
so they could be analyzed during benchmark execution.All components above are optional. It is possible to run only the OpenTelemetry ingestion load and disable all the other components. Or run only Read load and Monitoring components.
It is expected that Helm3 is already installed and configured to communicate with Kubernetes cluster where the prometheus-benchmark should run.
Check out the prometheus-benchmark sources:
git clone https://github.com/VictoriaMetrics/prometheus-benchmark
cd prometheus-benchmark
Then edit the chart/values.yaml with the desired config params. Then optionally edit the chart/files/alerts.yaml with the desired queries to execute at remote storage systems. Then run the following command in order to install the prometheus-benchmark components in Kubernetes and start the benchmark:
make install
Run the following command in order to inspect the metrics collected by the benchmark:
make monitor
After that go to http://localhost:8428/targets in order to see which metrics are collected by the benchmark.
See monitoring docs for details.
After the benchmark is complete, run the following command for removing prometheus-benchmark components from Kubernetes:
make delete
By default the prometheus-benchmark is deployed in vm-benchmark Kubernetes namespace.
The namespace can be overridden via NAMESPACE environment variable.
For example, the following command starts the prometheus-benchmark chart in foobar k8s namespace:
NAMESPACE=foobar make install
See the Makefile for more details on available make commands.
The benchmark collects various metrics from its components. These metrics
are available for querying at http://localhost:8428/vmui after running make monitor command.
The following metrics might be interesting to look at during the benchmark:
sum(rate(vm_promscrape_scraped_samples_sum{job="vmagent"})) by (remote_storage_name)
sum(rate(otelcol_exporter_sent_metric_points{job="otel-collector"})) by (remote_storage_name)
It is recommended also to check the following metrics in order to verify whether the configured remote storage is capable to handle the configured workload:
Prometheus workload:
sum(rate(vmagent_remotewrite_packets_dropped_total{job="vmagent"})) by (remote_storage_name)
OpenTelemetry workload:
sum(rate(otelcol_exporter_send_failed_metric_points{job="otel-collector"})) by (remote_storage_name)
sum(rate(vmagent_remotewrite_retries_count_total{job="vmagent"})) by (remote_storage_name)
writeConcurrency at chart/values.yaml
may help if there is a high network latency between vmagent at prometheus-benchmark
and the remote storage.sum(vm_persistentqueue_bytes_pending{job="vmagent"}) by (remote_storage_name)
max(vmalert_iteration_duration_seconds{quantile="0.99",job="vmalert"}) by (remote_storage_name)
sum(rate(vmalert_execution_errors_total{job="vmalert"})) by (remote_storage_name)
The prometheus-benchmark doesn't collect metrics from the tested remote storage systems.
It is expected that a separate monitoring is set up for whitebox monitoring
of the tested remote storage systems.
Go
67.8%
Makefile
21.7%
Go Template
7.2%
Dockerfile
3.3%
Benchmark for Prometheus-compatible systems
210
stars
75
commits
Go
primary language
Sep 10, 2026
updated
Prometheus-benchmark allows testing data ingestion and querying performance for Prometheus-compatible systems on production-like workload.
Prometheus-benchmark provides the following features:
node_exporter metrics - see chart/files/alerts.yaml.remoteStorages section at chart/values.yaml.The following systems can be tested with prometheus-benchmark:
For Prometheus write workload, vmagent scrapes metrics from node_exporter and pushes the scraped metrics to the configured Prometheus-compatible remote storage systems. These systems must support Prometheus remote_write API for measuring data ingestion performance.
For OpenTelemetry write workload, OTel Collector generates load using Host Metrics Receiver and pushes the scraped metrics to the configured Prometheus-compatible remote storage systems. These systems must support OpenTelemetry Protocol for measuring data ingestion performance.
Optionally, these systems may support Prometheus querying API for measuring query performance. The query load is generated by vmalert periodically executing the configured alerting rules.
The helm chart deploys the following components:
vmagent with the following containers:
nodeexporter for 1 second in order to reduce load on it
when scraping big number of targets.nodeexporter metrics via nginx
for targets generated by vmagent-config-updater.otel-collector generates load using the host metrics receiver and writes to storage via OTLP.vmalert with the following containers:
vmsingle - this pod runs a single-node VictoriaMetrics, which collects metrics from vmagent and vmalert pods,
so they could be analyzed during benchmark execution.All components above are optional. It is possible to run only the OpenTelemetry ingestion load and disable all the other components. Or run only Read load and Monitoring components.
It is expected that Helm3 is already installed and configured to communicate with Kubernetes cluster where the prometheus-benchmark should run.
Check out the prometheus-benchmark sources:
git clone https://github.com/VictoriaMetrics/prometheus-benchmark
cd prometheus-benchmark
Then edit the chart/values.yaml with the desired config params. Then optionally edit the chart/files/alerts.yaml with the desired queries to execute at remote storage systems. Then run the following command in order to install the prometheus-benchmark components in Kubernetes and start the benchmark:
make install
Run the following command in order to inspect the metrics collected by the benchmark:
make monitor
After that go to http://localhost:8428/targets in order to see which metrics are collected by the benchmark.
See monitoring docs for details.
After the benchmark is complete, run the following command for removing prometheus-benchmark components from Kubernetes:
make delete
By default the prometheus-benchmark is deployed in vm-benchmark Kubernetes namespace.
The namespace can be overridden via NAMESPACE environment variable.
For example, the following command starts the prometheus-benchmark chart in foobar k8s namespace:
NAMESPACE=foobar make install
See the Makefile for more details on available make commands.
The benchmark collects various metrics from its components. These metrics
are available for querying at http://localhost:8428/vmui after running make monitor command.
The following metrics might be interesting to look at during the benchmark:
sum(rate(vm_promscrape_scraped_samples_sum{job="vmagent"})) by (remote_storage_name)
sum(rate(otelcol_exporter_sent_metric_points{job="otel-collector"})) by (remote_storage_name)
It is recommended also to check the following metrics in order to verify whether the configured remote storage is capable to handle the configured workload:
Prometheus workload:
sum(rate(vmagent_remotewrite_packets_dropped_total{job="vmagent"})) by (remote_storage_name)
OpenTelemetry workload:
sum(rate(otelcol_exporter_send_failed_metric_points{job="otel-collector"})) by (remote_storage_name)
sum(rate(vmagent_remotewrite_retries_count_total{job="vmagent"})) by (remote_storage_name)
writeConcurrency at chart/values.yaml
may help if there is a high network latency between vmagent at prometheus-benchmark
and the remote storage.sum(vm_persistentqueue_bytes_pending{job="vmagent"}) by (remote_storage_name)
max(vmalert_iteration_duration_seconds{quantile="0.99",job="vmalert"}) by (remote_storage_name)
sum(rate(vmalert_execution_errors_total{job="vmalert"})) by (remote_storage_name)
The prometheus-benchmark doesn't collect metrics from the tested remote storage systems.
It is expected that a separate monitoring is set up for whitebox monitoring
of the tested remote storage systems.
Go
67.8%
Makefile
21.7%
Go Template
7.2%
Dockerfile
3.3%