Skip to content

Commands & Recipes

Installation

Docker (Quick Start — All Components)

# VictoriaMetrics (metrics)
docker run -d --name vm \
  -p 8428:8428 \
  -v vm-data:/storage \
  victoriametrics/victoria-metrics \
  -storageDataPath=/storage -retentionPeriod=12

# VictoriaLogs (logs)
docker run -d --name vl \
  -p 9428:9428 \
  -v vl-data:/vlogs \
  victoriametrics/victoria-logs \
  -storageDataPath=/vlogs -retentionPeriod=30d

# VictoriaTraces (traces)
docker run -d --name vt \
  -p 10428:10428 \
  -p 4317:4317 \
  -v vt-data:/vtraces \
  victoriametrics/victoria-traces \
  -storageDataPath=/vtraces

Docker Compose (Full Stack)

# docker-compose.yaml — Full Victoria stack for development
version: '3.8'
services:
  victoriametrics:
    image: victoriametrics/victoria-metrics:latest
    ports: ["8428:8428"]
    volumes: ["vm-data:/storage"]
    command:
      - "-storageDataPath=/storage"
      - "-retentionPeriod=12"

  victorialogs:
    image: victoriametrics/victoria-logs:latest
    ports: ["9428:9428"]
    volumes: ["vl-data:/vlogs"]
    command:
      - "-storageDataPath=/vlogs"
      - "-retentionPeriod=30d"

  victoriatraces:
    image: victoriametrics/victoria-traces:latest
    ports:
      - "10428:10428"  # HTTP
      - "4317:4317"    # OTLP gRPC
    volumes: ["vt-data:/vtraces"]
    command:
      - "-storageDataPath=/vtraces"

  vmagent:
    image: victoriametrics/vmagent:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    command:
      - "-promscrape.config=/etc/prometheus/prometheus.yml"
      - "-remoteWrite.url=http://victoriametrics:8428/api/v1/write"

  vmauth:
    image: victoriametrics/vmauth:latest
    ports: ["8427:8427"]
    volumes:
      - ./vmauth-config.yml:/etc/vmauth/config.yml
    command:
      - "-auth.config=/etc/vmauth/config.yml"

  vmalert:
    image: victoriametrics/vmalert:latest
    volumes:
      - ./alert-rules.yml:/etc/rules/rules.yml
    command:
      - "-rule=/etc/rules/*.yml"
      - "-datasource.url=http://victoriametrics:8428"
      - "-remoteWrite.url=http://victoriametrics:8428"

  grafana:
    image: grafana/grafana-oss:latest
    ports: ["3000:3000"]
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin

volumes:
  vm-data:
  vl-data:
  vt-data:

Helm (Kubernetes)

helm repo add vm https://victoriametrics.github.io/helm-charts/
helm repo update

# Single-node VictoriaMetrics
helm install vm vm/victoria-metrics-single -n monitoring --create-namespace

# Cluster VictoriaMetrics
helm install vm-cluster vm/victoria-metrics-cluster -n monitoring -f vm-values.yaml

# vmoperator (manages all components via CRDs)
helm install vmoperator vm/victoria-metrics-operator -n monitoring

# vmagent
helm install vmagent vm/victoria-metrics-agent -n monitoring

# vmalert
helm install vmalert vm/victoria-metrics-alert -n monitoring

# VictoriaLogs (single-node)
helm install vl vm/victoria-logs-single -n monitoring

vmagent Recipes

# Start vmagent as drop-in Prometheus replacement
./vmagent \
  -promscrape.config=/path/to/prometheus.yml \
  -remoteWrite.url=http://victoriametrics:8428/api/v1/write

# Add global labels to all scraped metrics
./vmagent \
  -remoteWrite.label=datacenter=us-east-1 \
  -remoteWrite.label=env=production \
  -promscrape.config=prometheus.yml \
  -remoteWrite.url=http://vminsert:8480/insert/0/prometheus/api/v1/write

# Multi-destination remote write (fan-out)
./vmagent \
  -remoteWrite.url=http://vm-primary:8428/api/v1/write \
  -remoteWrite.url=http://vm-secondary:8428/api/v1/write

Data Ingestion Recipes

Fluent Bit → VictoriaLogs

# fluent-bit.conf — Push logs directly to VictoriaLogs
[OUTPUT]
    Name  http
    Match *
    Host  victorialogs
    Port  9428
    URI   /insert/jsonline?_stream_fields=stream&_msg_field=log&_time_field=date
    Format json_lines
    Compress gzip

OpenTelemetry Collector → VictoriaTraces

# otel-collector-config.yaml
exporters:
  otlp/victoriatraces:
    endpoint: "victoriatraces:4317"
    tls:
      insecure: true

  prometheusremotewrite/vm:
    endpoint: "http://victoriametrics:8428/api/v1/write"

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlp/victoriatraces]
    metrics:
      receivers: [otlp, prometheus]
      processors: [batch]
      exporters: [prometheusremotewrite/vm]

Promtail / Loki Push → VictoriaLogs

# promtail-config.yaml — VictoriaLogs accepts Loki push API
clients:
  - url: http://victorialogs:9428/insert/loki/api/v1/push

Direct OTLP → VictoriaTraces

  • HTTP: http://victoriatraces:10428/insert/opentelemetry/v1/traces
  • gRPC: grpc://victoriatraces:4317

vmauth Routing Config

# vmauth-config.yml — Route all signals through one proxy
unauthorized_user:
  url_map:
    # Metrics write
    - src_paths: ["/api/v1/write", "/api/v1/import.*"]
      url_prefix: "http://vminsert:8480/insert/0/prometheus"

    # Metrics read
    - src_paths: ["/api/v1/query.*", "/api/v1/series.*", "/api/v1/labels.*"]
      url_prefix: "http://vmselect:8481/select/0/prometheus"

    # Logs write
    - src_paths: ["/insert/jsonline.*", "/insert/elasticsearch.*", "/loki/api/v1/push"]
      url_prefix: "http://victorialogs:9428"

    # Logs read
    - src_paths: ["/select/logsql/.*"]
      url_prefix: "http://victorialogs:9428"

    # Traces write
    - src_paths: ["/insert/opentelemetry/.*"]
      url_prefix: "http://victoriatraces:10428"

    # Traces read (Jaeger API)
    - src_paths: ["/api/traces.*", "/api/services.*"]
      url_prefix: "http://victoriatraces:10428"

Backup & Restore

# Create instant snapshot (single-node)
curl http://victoriametrics:8428/snapshot/create
# Returns: {"status":"ok","snapshot":"20260410120000-..."}

# Backup snapshot to S3
./vmbackup \
  -storageDataPath=/data/vm \
  -snapshot.createURL=http://localhost:8428/snapshot/create \
  -dst=s3://my-bucket/vm-backups/

# Incremental backup (only new data since last backup)
./vmbackup \
  -storageDataPath=/data/vm \
  -snapshot.createURL=http://localhost:8428/snapshot/create \
  -dst=s3://my-bucket/vm-backups/ \
  -origin=s3://my-bucket/vm-backups/  # previous backup path

# Restore from backup
./vmrestore \
  -src=s3://my-bucket/vm-backups/latest \
  -storageDataPath=/data/vm-restored

Note: For clustered setup, vmbackup must be executed on EVERY vmstorage node.

API Recipes

# Query VictoriaMetrics (PromQL/MetricsQL)
curl -s "http://vm:8428/api/v1/query?query=up" | jq .

# Range query
curl -s "http://vm:8428/api/v1/query_range?query=rate(http_requests_total[5m])&start=-1h&step=60s" | jq .

# Import data via JSON
curl -d '{"metric":{"__name__":"test","job":"api"},"values":[1,2,3],"timestamps":[1617000000000,1617000001000,1617000002000]}' \
  http://vm:8428/api/v1/import

# Query VictoriaLogs (LogsQL)
curl -s "http://vl:9428/select/logsql/query?query=_time:5m+AND+error" | jq .

# Push a test log
curl -X POST "http://vl:9428/insert/jsonline?_stream_fields=app&_msg_field=msg" \
  -d '{"app":"test","msg":"hello from curl","level":"info"}'

# Look up a trace by ID (Jaeger API)
curl -s "http://vt:10428/api/traces/abc123" | jq .

# Check health
curl -s "http://vm:8428/-/healthy" && echo "OK"

Grafana Data Source Config

# Grafana provisioning for Victoria Stack
apiVersion: 1
datasources:
  - name: VictoriaMetrics
    type: prometheus
    url: http://vmauth:8427
    isDefault: true
    jsonData:
      httpMethod: POST

  - name: VictoriaLogs
    type: victoriametrics-logs-datasource
    url: http://vmauth:8427

  - name: VictoriaTraces
    type: jaeger
    url: http://vmauth:8427