How to backup and restore Prometheus?

In this post I will show you how to take a backup from a running Prometheus and restore it.

I will assumes that you have a running Prometheus deployed with prometheus-operator in the monitoring namespace.

Enable Admin Api

First we need to enable the Prometheus’s admin api

kubectl -n monitoring patch prometheus prometheus-operator-prometheus \
  --type merge --patch '{"spec":{"enableAdminAPI":true}}'

In tmux or a separate window open a port forward to the admin api.

ubectl -n monitoring port-forward svc/prometheus-operator-prometheus 9090

Backup Prometheus data

Run following command to create a snapshot:

curl -XPOST http://localhost:9090/api/v2/admin/tsdb/snapshot
{"name":"20200731T123913Z-6e661e92759805f5"}

Find the snapshot and copy it to locally. The default folder is /prometheus/snapshots/ but you can find the data folder by finding the --storage.tsdb.path config in your deployment.

kubectl -n monitoring exec -it prometheus-prometheus-operator-prometheus-0 \
  -c prometheus -- /bin/sh -c \
  "ls /prometheus/snapshots/20200731T123913Z-6e661e92759805f5"
01EE25G1ZTKBFBBHFPHNBF99KJ  01EEFF7TE5ENDAGDR5K7ERW3BX
...

kubectl cp -n monitoring \
  prometheus-prometheus-operator-prometheus-0:/prometheus/snapshots/20200731T123913Z-6e661e92759805f5 \
  -c prometheus .

Restore Prometheus data

In a new Prometheus instance delete the data folder and copy the content of the snapshot:

kubectl -n newprom exec -it prometheus -- /bin/sh -c "rm -rf /prometheus/*"

kubectl -n newprom cp ./* prometheus:/prometheus/