Include backup paths in the exported metrics. Resolves #17

This commit is contained in:
ngosang 2023-07-30 01:02:04 +02:00
parent 2f4bab16ef
commit 8697539748
2 changed files with 15 additions and 7 deletions

View file

@ -123,7 +123,8 @@ is `Flase` (only log error, such as network error with Cloud backends).
reasons. Default is `False` (perform `restic check`). reasons. Default is `False` (perform `restic check`).
- `NO_STATS`: (Optional) Do not collect per backup statistics for performance - `NO_STATS`: (Optional) Do not collect per backup statistics for performance
reasons. Default is `False` (collect per backup statistics). reasons. Default is `False` (collect per backup statistics).
- `NO_LOCKS`: (Optional) Do not collect the number of locks. Default is `False` (collect number of locks). - `NO_LOCKS`: (Optional) Do not collect the number of locks. Default is `False` (collect the number of locks).
- `INCLUDE_PATHS`: (Optional) Include snapshot paths for each backup. The paths are separated by commas. Default is `False` (not collect the paths).
### Configuration for Rclone ### Configuration for Rclone
@ -163,17 +164,17 @@ restic_locks_total 1.0
restic_snapshots_total 100.0 restic_snapshots_total 100.0
# HELP restic_backup_timestamp Timestamp of the last backup # HELP restic_backup_timestamp Timestamp of the last backup
# TYPE restic_backup_timestamp gauge # TYPE restic_backup_timestamp gauge
restic_backup_timestamp{client_hostname="product.example.com",client_username="root",snapshot_hash="20795072cba0953bcdbe52e9cf9d75e5726042f5bbf2584bb2999372398ee835",snapshot_tag="mysql"} 1.666273638e+09 restic_backup_timestamp{client_hostname="product.example.com",client_username="root",snapshot_hash="20795072cba0953bcdbe52e9cf9d75e5726042f5bbf2584bb2999372398ee835",snapshot_tag="mysql",snapshot_paths="/mysql/data,/mysql/config"} 1.666273638e+09
# HELP restic_backup_files_total Number of files in the backup # HELP restic_backup_files_total Number of files in the backup
# TYPE restic_backup_files_total counter # TYPE restic_backup_files_total counter
restic_backup_files_total{client_hostname="product.example.com",client_username="root",snapshot_hash="20795072cba0953bcdbe52e9cf9d75e5726042f5bbf2584bb2999372398ee835",snapshot_tag="mysql"} 8.0 restic_backup_files_total{client_hostname="product.example.com",client_username="root",snapshot_hash="20795072cba0953bcdbe52e9cf9d75e5726042f5bbf2584bb2999372398ee835",snapshot_tag="mysql",snapshot_paths="/mysql/data,/mysql/config"} 8.0
# HELP restic_backup_size_total Total size of backup in bytes # HELP restic_backup_size_total Total size of backup in bytes
# TYPE restic_backup_size_total counter # TYPE restic_backup_size_total counter
restic_backup_size_total{client_hostname="product.example.com",client_username="root",snapshot_hash="20795072cba0953bcdbe52e9cf9d75e5726042f5bbf2584bb2999372398ee835",snapshot_tag="mysql"} 4.3309562e+07 restic_backup_size_total{client_hostname="product.example.com",client_username="root",snapshot_hash="20795072cba0953bcdbe52e9cf9d75e5726042f5bbf2584bb2999372398ee835",snapshot_tag="mysql",snapshot_paths="/mysql/data,/mysql/config"} 4.3309562e+07
# HELP restic_backup_snapshots_total Total number of snapshots # HELP restic_backup_snapshots_total Total number of snapshots
# TYPE restic_backup_snapshots_total counter # TYPE restic_backup_snapshots_total counter
restic_backup_snapshots_total{client_hostname="product.example.com",client_username="root",snapshot_hash="20795072cba0953bcdbe52e9cf9d75e5726042f5bbf2584bb2999372398ee835",snapshot_tag="mysql"} 1.0 restic_backup_snapshots_total{client_hostname="product.example.com",client_username="root",snapshot_hash="20795072cba0953bcdbe52e9cf9d75e5726042f5bbf2584bb2999372398ee835",snapshot_tag="mysql",snapshot_paths="/mysql/data,/mysql/config"} 1.0
# HELP restic_scrape_duration_seconds Ammount of time each scrape takes # HELP restic_scrape_duration_seconds Amount of time each scrape takes
# TYPE restic_scrape_duration_seconds gauge # TYPE restic_scrape_duration_seconds gauge
restic_scrape_duration_seconds 166.9411084651947 restic_scrape_duration_seconds 166.9411084651947
``` ```

View file

@ -16,7 +16,8 @@ from prometheus_client.core import GaugeMetricFamily, CounterMetricFamily, REGIS
class ResticCollector(object): class ResticCollector(object):
def __init__( def __init__(
self, repository, password_file, exit_on_error, disable_check, disable_stats, disable_locks self, repository, password_file, exit_on_error, disable_check,
disable_stats, disable_locks, include_paths
): ):
self.repository = repository self.repository = repository
self.password_file = password_file self.password_file = password_file
@ -24,6 +25,7 @@ class ResticCollector(object):
self.disable_check = disable_check self.disable_check = disable_check
self.disable_stats = disable_stats self.disable_stats = disable_stats
self.disable_locks = disable_locks self.disable_locks = disable_locks
self.include_paths = include_paths
# todo: the stats cache increases over time -> remove old ids # todo: the stats cache increases over time -> remove old ids
# todo: cold start -> the stats cache could be saved in a persistent volume # todo: cold start -> the stats cache could be saved in a persistent volume
# todo: cold start -> the restic cache (/root/.cache/restic) could be # todo: cold start -> the restic cache (/root/.cache/restic) could be
@ -40,6 +42,7 @@ class ResticCollector(object):
"client_username", "client_username",
"snapshot_hash", "snapshot_hash",
"snapshot_tag", "snapshot_tag",
"snapshot_paths",
] ]
check_success = GaugeMetricFamily( check_success = GaugeMetricFamily(
@ -93,6 +96,7 @@ class ResticCollector(object):
client["username"], client["username"],
client["snapshot_hash"], client["snapshot_hash"],
client["snapshot_tag"], client["snapshot_tag"],
client["snapshot_paths"],
] ]
backup_timestamp.add_metric(common_label_values, client["timestamp"]) backup_timestamp.add_metric(common_label_values, client["timestamp"])
@ -177,6 +181,7 @@ class ResticCollector(object):
"username": snap["username"], "username": snap["username"],
"snapshot_hash": snap["hash"], "snapshot_hash": snap["hash"],
"snapshot_tag": snap["tags"][0] if "tags" in snap else "", "snapshot_tag": snap["tags"][0] if "tags" in snap else "",
"snapshot_paths": ",".join(snap["paths"]) if self.include_paths else "",
"timestamp": snap["timestamp"], "timestamp": snap["timestamp"],
"size_total": stats["total_size"], "size_total": stats["total_size"],
"files_total": stats["total_file_count"], "files_total": stats["total_file_count"],
@ -355,6 +360,7 @@ if __name__ == "__main__":
exporter_disable_check = bool(os.environ.get("NO_CHECK", False)) exporter_disable_check = bool(os.environ.get("NO_CHECK", False))
exporter_disable_stats = bool(os.environ.get("NO_STATS", False)) exporter_disable_stats = bool(os.environ.get("NO_STATS", False))
exporter_disable_locks = bool(os.environ.get("NO_LOCKS", False)) exporter_disable_locks = bool(os.environ.get("NO_LOCKS", False))
exporter_include_paths = bool(os.environ.get("INCLUDE_PATHS", False))
try: try:
collector = ResticCollector( collector = ResticCollector(
@ -364,6 +370,7 @@ if __name__ == "__main__":
exporter_disable_check, exporter_disable_check,
exporter_disable_stats, exporter_disable_stats,
exporter_disable_locks, exporter_disable_locks,
exporter_include_paths,
) )
REGISTRY.register(collector) REGISTRY.register(collector)
start_http_server(exporter_port, exporter_address) start_http_server(exporter_port, exporter_address)