80 lines
2.0 KiB
Plaintext
80 lines
2.0 KiB
Plaintext
|
#!/usr/bin/env python
|
||
|
|
||
|
from prometheus_client import start_http_server, Gauge
|
||
|
from time import sleep
|
||
|
|
||
|
from datetime import datetime
|
||
|
import re
|
||
|
import os
|
||
|
import sys
|
||
|
|
||
|
HTTP_PORT = 9401
|
||
|
BACKUP_DIRECTORY = '/srv/dropzone/'
|
||
|
INTERVAL = 30 * 60 # seconds
|
||
|
|
||
|
DATEREGEX = re.compile("[0-9]{4}-[0-9]{2}-[0-9]{2}")
|
||
|
|
||
|
files_touched_recently = Gauge('veeam_has_touched_files',
|
||
|
'Files have been modified in past 24h',
|
||
|
['name'])
|
||
|
|
||
|
|
||
|
def isNotHidden(dirname):
|
||
|
return dirname[0] != '.'
|
||
|
|
||
|
|
||
|
def hasDate(filename):
|
||
|
return DATEREGEX.search(filename) is not None
|
||
|
|
||
|
|
||
|
def deltaInDays(filename):
|
||
|
filedate = datetime.strptime(DATEREGEX.search(filename).group(),
|
||
|
"%Y-%m-%d")
|
||
|
return (datetime.today() - filedate).days
|
||
|
|
||
|
|
||
|
# Because Prometheus has no binary datatype, we use integers in a Gauge.
|
||
|
# Sorry, dear reader...
|
||
|
def hasRecentFile(deltaList):
|
||
|
if 0 in deltaList or 1 in deltaList:
|
||
|
return 1
|
||
|
else:
|
||
|
return 0
|
||
|
|
||
|
|
||
|
def deltaList(dirname):
|
||
|
return [deltaInDays(f) for f in os.listdir(dirname) if hasDate(f)]
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
if len(sys.argv) == 2:
|
||
|
BACKUP_DIRECTORY = sys.argv[1]
|
||
|
elif len(sys.argv) > 2:
|
||
|
sys.exit("Invalid number of arguments."
|
||
|
"Usage: ./prometheus-borgbackup-exporter [backup-directory]")
|
||
|
|
||
|
# Serve metrics over HTTP.
|
||
|
print("Starting prometheus-veeam-exporter on port",
|
||
|
"{}...".format(HTTP_PORT), end='')
|
||
|
start_http_server(HTTP_PORT)
|
||
|
print(" OK.")
|
||
|
|
||
|
os.chdir(BACKUP_DIRECTORY)
|
||
|
|
||
|
while True:
|
||
|
try:
|
||
|
print(">> Running check...")
|
||
|
|
||
|
result = [(backupjob, hasRecentFile(deltaList(backupjob)))
|
||
|
for backupjob in os.listdir(BACKUP_DIRECTORY)
|
||
|
if isNotHidden(backupjob)]
|
||
|
|
||
|
for job in result:
|
||
|
files_touched_recently.labels(job[0]).set(job[1])
|
||
|
|
||
|
print(" OK.")
|
||
|
except Exception as e:
|
||
|
print("Error! {}".format(e))
|
||
|
|
||
|
sleep(INTERVAL)
|