Add initial checkmk plugin

This commit is contained in:
OMD site s6 2022-02-21 21:14:19 +01:00
parent 2a0cef3bda
commit 72dbad096c
4 changed files with 179 additions and 0 deletions

32
README.md Normal file
View File

@ -0,0 +1,32 @@
# Jobwatch
## (C) 2022, Michael Höß, MIT-Licensed
### What is jobwatch
If you just want to execute a simple shell-script via cron every couple of hour,
often only a few lines of code are required.
But if you want to ensure the script really run, in the required interval, completed
without error, you have to add a lot of plumping code.
jobwatch helps to migitate this problem. It wraps the execution of your script, and does
all the rest for you, by providing output, which can be fed to CheckMK then
Agent-Plugin-Mechanism.
jobwatch
- checks for required exit-codes
- searches through the output of your script via regex to classify certain
keywords as WARN or CRIT
- let you define the required run-interval
Simply add a .job-file into /etc/jobwatch.d where you defined all of this,
call you script via jobwatch -j job in the crontab and you are done.
TBD:
- document deployment
- document job-file (see included sample)
- feed logoutput to CheckMK
- redirect script-output to a logfile via Config
-

View File

@ -0,0 +1,125 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import json
from operator import concat
from typing import Any, Dict, Generator, Union
from cmk.base.api.agent_based.checking_classes import IgnoreResults, IgnoreResultsError
from cmk.base.api.agent_based.type_defs import Parameters
from typing import Any, Dict, Generator, Iterable
from cmk.base.api.agent_based.type_defs import Parameters, StringTable
from cmk.base.plugins.agent_based.agent_based_api.v1 import (
register,
HostLabel
)
from cmk.base.plugins.agent_based.agent_based_api.v1 import (
register,
render,
Result, Metric, State,
Service, ServiceLabel,
check_levels,
get_value_store,
)
#
# Section Plugin
#
def parse_jobwatch(string_table: StringTable) -> Dict:
#print("Agent-PARSE", string_table)
js = ""
for ln in string_table:
js += "".join(ln)
data = json.loads(js)
res = {}
for user in data:
uid = user.get("user_id")
if not uid:
continue
entries = {}
for e in user.get("entries", []):
state = e.get("state")
if not state:
continue
job_full_id = state.get("job_id")
if not job_full_id:
continue
ji = state.get("job_inst_id")
if ji:
job_full_id += "_" +ji
entries[job_full_id] = {
"state": state,
"log_entries": state.get("log_entries", [])
}
res[uid] = entries
#print(res)
return res # return a parsed section
register.agent_section(
name="jobwatch",
parse_function=parse_jobwatch,
)
#
# Check Plugin
#
def discover_jobwatch(section: Any) -> Generator[Service, None, None]:
#print("D", section)
for uid, usr_data in section.items():
for job_full_id, job_data in usr_data.items():
state = job_data.get("state")
if not state:
continue
item = uid + "/" + job_full_id
yield Service(item=item)
def check_jobwatch(item: str, section: Any) -> Generator[Union[Result,Metric], None, None]:
uid, job_full_id = item.split("/", 2)
state = section \
.get(uid, {}) \
.get(job_full_id, {}) \
.get("state")
if state:
yield Metric(
name="last_run",
value=state.get("last_run_age_seconds"),
)
yield Result(
state=State(state.get('last_run_age_state', 3)),
summary=f"last run at { state.get('last_run')}, {render.timespan(state.get('last_run_age_seconds'))} ago"
)
yield Result(
state=State(state.get('last_state', 3)),
summary=f"last exitcode { state.get('last_exit_code')}"
)
register.check_plugin(
name="jobwatch",
service_name="Job %s",
check_function=check_jobwatch,
discovery_function=discover_jobwatch,
)

View File

@ -0,0 +1,22 @@
#!/bin/bash
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
cd $SCRIPT_DIR
files=(
"local/lib/check_mk/base/plugins/agent_based/jobwatch_check.py:agent_based"
"local/share/check_mk/web/plugins/metrics/jobwatch_metrics.py:web/plugins/metrics"
)
for f in ${files[*]}; do
s="$(echo $f | cut -d ":" -f 1)"
d="$(echo $f | cut -d ":" -f 2)"
src=$OMD_ROOT/$s
dest=$d
echo "$src -> $dest"
mkdir -p $dest
cp -L $src $dest
done
mkp pack jobwatch

Binary file not shown.