In diesem Beitrag will ich ein Check_MK Agent Plugin erstellen, welches Daten aus einer Datenbank aus liest und in Check_MK als Service mit Statistik integriert.
1. Installation
1.1. Java installieren
sudo apt-get install openjdk-8-jre
1.2. SQL-Workbench installieren
SQL-Workbench von der Seite laden.
wget http://www.sql-workbench.net/Workbench-Build119.zip
Die ZIP-Datei entpacken.
unzip Workbench-Build119.zip
2. Einrichtung
2.1. SQL-Workbench Profile
Starten Sie SQL-Workbench im Grafikmodus und legen ein Connection Profile an, mit dem Sie eine Verbindung zur Datenbank auf bauen können.
./Workbench-Build119/sqlworkbench.sh
2.2. Verzeichnisse anlegen
mkdir -p ./check-db-plugin/{lib,logs,result}/
Die Bibliothek in das Projektverzeichnis kopieren.
cp ./Workbench-Build119/sqlworkbench.jar ./check-db-plugin/lib/
2.3. Script erstellen
Dieses Script starte SQL-Workbench im Command-Modus und transformiert die Datenbankabfrage in eine OUT-Datei. Als „ProfileName“ verwenden Sie den Namen, welche Sie unter Punk 2.1. erstellt haben.
vim ./check-db-plugin/start.sh
chmod +x vim ./check-db-plugin/start.sh
#!/bin/sh
DIR=/home/user/check-db-plugin/
JAVA_HOME=/usr/lib/jvm/default-java/
JAR=lib/sqlworkbench.jar
CONFIG=/home/user/.sqlworkbench
SCRIPT=count.sql
LOG=logs/check.log
cd $DIR
$JAVA_HOME/bin/java \
-jar $JAR \
-profile='ProfileName' \
-command='WBInclude count.sql;' \
-configDir=$CONFIG \
-logfile=$LOG \
-readOnly \
-displayResult=false; \
# -script=$SCRIPT |
#!/bin/sh
DIR=/home/user/check-db-plugin/
JAVA_HOME=/usr/lib/jvm/default-java/
JAR=lib/sqlworkbench.jar
CONFIG=/home/user/.sqlworkbench
SCRIPT=count.sql
LOG=logs/check.log
cd $DIR
$JAVA_HOME/bin/java \
-jar $JAR \
-profile='ProfileName' \
-command='WBInclude count.sql;' \
-configDir=$CONFIG \
-logfile=$LOG \
-readOnly \
-displayResult=false; \
# -script=$SCRIPT
In der Datei „count.sql“ erstellen Sie die Abfrage für die Datenbank und die anschließende XSLT Transformation.
vim ./check-db-plugin/count.sql
WbConnect ProfileName;
WbExport -type=xml -file='result/table.xml' -stylesheet='count.xslt' -xsltOutput='result/table.out';
SELECT count(*) as SUM, 50 as WARNING, 100 as CRITICAL FROM table WHERE status = 'closed'; |
WbConnect ProfileName;
WbExport -type=xml -file='result/table.xml' -stylesheet='count.xslt' -xsltOutput='result/table.out';
SELECT count(*) as SUM, 50 as WARNING, 100 as CRITICAL FROM table WHERE status = 'closed';
Die XSLT Transformation wandelt das Ergebnis der Datenbank in eine einfache Textausgabe um.
vim ./check-db-plugin/count.xslt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| <?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output
encoding="iso-8859-15"
method="text"
indent="no"
standalone="no"
omit-xml-declaration="no"
doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"
/>
<xsl:variable name="newline"><xsl:text> </xsl:text></xsl:variable>
<xsl:variable name="tab"><xsl:text>	</xsl:text></xsl:variable>
<xsl:template match="/">
<!-- Write the data rows -->
<xsl:for-each select="/wb-export/data/row-data">
<xsl:for-each select="column-data">
<xsl:value-of select="."/>
<xsl:if test="position() < last()"><xsl:value-of select="$tab"/>
</xsl:if>
</xsl:for-each>
<xsl:value-of select="$newline"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet> |
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output
encoding="iso-8859-15"
method="text"
indent="no"
standalone="no"
omit-xml-declaration="no"
doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"
/>
<xsl:variable name="newline"><xsl:text> </xsl:text></xsl:variable>
<xsl:variable name="tab"><xsl:text>	</xsl:text></xsl:variable>
<xsl:template match="/">
<!-- Write the data rows -->
<xsl:for-each select="/wb-export/data/row-data">
<xsl:for-each select="column-data">
<xsl:value-of select="."/>
<xsl:if test="position() < last()"><xsl:value-of select="$tab"/>
</xsl:if>
</xsl:for-each>
<xsl:value-of select="$newline"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
3. Check_MK Agent
3.1. Verzeichnis erstellen
Der Check soll nur alle 120 Sekunden asynchron ausgeführt werden, deshalb wird ein Verzeichnis 120 angelegt.
sudo mkdir -p /usr/lib/check_mk_agent/local/120/
3.2. Check erstellen
Der Check liest im Verzeichnis die Dateien mit der Endung /home/user/check-db-plugin/result/*.out aus und stellt das Ergebnis im Check_MK agent bereit.
sudo vim /usr/lib/check_mk_agent/local/120/check-db-plugin.sh
sudo chmod +x /usr/lib/check_mk_agent/local/120/check-db-plugin.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
| #!/bin/sh
# Plugin Return Codes
# = 0 OK
# = 1 Warning
# = 2 Critical
# = 3 Unknown
#
DIR=/home/user/check-db-plugin/
FILTER=result/*.out
NAME="SQL-counter"
# Start SQL-Workbench into batch mode
$DIR/start.sh > /dev/null
for file in $DIR/$FILTER; do
filename=$(basename "$file")
date=$(date -r "$file" +"%Y-%m-%d %H:%M:%S")
count=$(cut -f1 ${file})
limit_warning=$(cut -f2 ${file})
limit_critical=$(cut -f3 ${file})
if [ -z $count ] ; then
status=3
statustext="UNKNOWN"
elif [ $count -gt $limit_critical ] ; then
status=2
statustext="CRITICAL"
elif [ $count -gt $limit_warning ] ; then
status=1
statustext="WARNING"
else
status=0
statustext="OK"
fi
if [ $count -eq $limit_warning ] && [ $count -eq $limit_critical ] ; then
unset limit_warning
unset limit_critical
fi
echo "${status:-1} ${NAME}_${filename} count=${count};$limit_warning;$limit_critical; Check(${statustext}): ${count} - ${date}"
done
exit $status |
#!/bin/sh
# Plugin Return Codes
# = 0 OK
# = 1 Warning
# = 2 Critical
# = 3 Unknown
#
DIR=/home/user/check-db-plugin/
FILTER=result/*.out
NAME="SQL-counter"
# Start SQL-Workbench into batch mode
$DIR/start.sh > /dev/null
for file in $DIR/$FILTER; do
filename=$(basename "$file")
date=$(date -r "$file" +"%Y-%m-%d %H:%M:%S")
count=$(cut -f1 ${file})
limit_warning=$(cut -f2 ${file})
limit_critical=$(cut -f3 ${file})
if [ -z $count ] ; then
status=3
statustext="UNKNOWN"
elif [ $count -gt $limit_critical ] ; then
status=2
statustext="CRITICAL"
elif [ $count -gt $limit_warning ] ; then
status=1
statustext="WARNING"
else
status=0
statustext="OK"
fi
if [ $count -eq $limit_warning ] && [ $count -eq $limit_critical ] ; then
unset limit_warning
unset limit_critical
fi
echo "${status:-1} ${NAME}_${filename} count=${count};$limit_warning;$limit_critical; Check(${statustext}): ${count} - ${date}"
done
exit $status
Quelle: Check_MK
Download: SQL-Workbench Handbuch: Install, Scripting, Export