60 lines
1.8 KiB
Python
Executable file
60 lines
1.8 KiB
Python
Executable file
#!/bin/python3
|
|
import time
|
|
import sys
|
|
import re
|
|
import os
|
|
import croniter
|
|
import subprocess
|
|
|
|
name = sys.argv[1]
|
|
cron_expr = sys.argv[2]
|
|
cmd = sys.argv[3]
|
|
exporterdir = '/var/lib/prometheus/node-exporter'
|
|
|
|
label_name = name.replace('\\', '\\\\').replace('"', '\\"').replace('\n', '\\n')
|
|
file_name = re.sub('[^a-zA-Z0-9]', '_', name)
|
|
|
|
start_ts = time.time()
|
|
result = subprocess.run(cmd, shell=True)
|
|
end_ts = time.time()
|
|
|
|
next_ts = croniter.croniter(cron_expr).get_next()
|
|
|
|
jobstats = f'''# Generated by monitor-cronjob.py
|
|
|
|
# HELP cron_job_last_run_seconds Unix timestamp of last run
|
|
# TYPE cron_job_last_run_seconds counter
|
|
cron_job_last_run_seconds{{name="{ label_name }"}} { start_ts }
|
|
|
|
# HELP cron_job_exit_code Exit code of last run
|
|
# TYPE cron_job_exit_code gauge
|
|
cron_job_exit_code{{name="{ label_name }"}} { result.returncode }
|
|
|
|
# HELP cron_job_duration_seconds Duration of last run
|
|
# TYPE cron_job_duration_seconds gauge
|
|
cron_job_duration_seconds{{name="{ label_name }"}} { end_ts - start_ts }
|
|
|
|
# HELP cron_job_next_run_seconds Unix timestamp of next run
|
|
# TYPE cron_job_next_run_seconds counter
|
|
cron_job_next_run_seconds{{name="{ label_name }"}} { next_ts }
|
|
'''
|
|
|
|
successstats = f'''# Generated by monitor-cronjob.py
|
|
|
|
# HELP cron_job_last_success_seconds Unix timestamp of last successful run
|
|
# TYPE cron_job_last_success_seconds counter
|
|
cron_job_last_success_seconds{{name="{ label_name }"}} { start_ts }
|
|
'''
|
|
|
|
tmpsuffix = '.%d'%(os.getpid())
|
|
|
|
path = os.path.join(exporterdir, f'cron_job_generic_{ file_name }.prom')
|
|
with open(path + tmpsuffix, 'w') as f:
|
|
f.write(jobstats)
|
|
os.rename(path + tmpsuffix, path)
|
|
|
|
if result.returncode == 0:
|
|
path = os.path.join(exporterdir, f'cron_job_success_{ file_name }.prom')
|
|
with open(path + tmpsuffix, 'w') as f:
|
|
f.write(successstats)
|
|
os.rename(path + tmpsuffix, path)
|