/etc/sensu/conf.d/handler_influxdb_noHost.json /etc/sensu/conf.d/db_influxdb.json /etc/sensu/handlers/influxdb-sensu-noHostKey.py
/var/log/sensu/sensu-script-influxdb-handler.log
{ | |
"influxdb": { | |
"host": "192.168.1.1", | |
"port": "8086", | |
"username": "sensu", | |
"password": "password", | |
"database": "sensu" | |
} | |
} |
{ | |
"handlers": { | |
"influxdb_noHostKey": { | |
"type" : "pipe", | |
"mutator" : "removeHostKey", | |
"command" : "/etc/sensu/handlers/influxdb-sensu-noHostKey.py" | |
} | |
} | |
} |
#!/usr/bin/env python | |
''' | |
Skrip cek metrik sensu yang dibuat kebanyakan memiliki output dengan format | |
<hostname>.<key> <value> | |
Skrip handler ini memproses output tersebut untuk dimasukan ke influxdb | |
dengan format nama series: <nama_klien>.<nama_cek>.<key> | |
Isi series tersebut hanya kolom 'value' yang menggambarkan nilai pada key tersebut. | |
Penggunaan skrip ini ditujukan untuk menghindari filter kolom pada saat query di influxdb | |
''' | |
import influxdb | |
import sensu | |
import logging | |
import json | |
import sys | |
from sys import stdin | |
logFileDefault = logging.FileHandler('/var/log/sensu/sensu-script-influxdb-handler-noHostKey.log') | |
logFormat = logging.Formatter('%(asctime)s %(levelname)s %(name)s: %(message)s') | |
logFileDefault.setFormatter(logFormat) | |
logger = logging.getLogger('influxdb-sensu') | |
logger.setLevel(100) #Ubah nilai menjadi logging.DEBUG untuk melihat aktifitas log lebih lengkap | |
logger.addHandler(logFileDefault) | |
logger.debug("Initiation influxDb") | |
settings = sensu.utils.load_settings() | |
db = influxdb.client.InfluxDBClient( | |
host = settings['influxdb']['host'], | |
port = settings['influxdb']['port'], | |
username = settings['influxdb']['username'], | |
password = settings['influxdb']['password'], | |
database = settings['influxdb']['database'] | |
) | |
delKey = '\n' | |
delVal = ' ' | |
logger.debug("Config sensu - %s", settings) | |
dataIn = stdin.read() | |
logger.debug("Input data stream - %s", dataIn) | |
jsonIn = json.loads(dataIn, strict=False) | |
jsonStats = jsonIn['check']['output'] | |
stats = [] | |
for item in jsonStats.split(delKey): | |
splitItem = item.split(delVal) | |
logger.debug('Info Item - %s',item) | |
if (len(splitItem)==2 or len(splitItem)==3) and len(splitItem[0])>0: | |
try: | |
convertVal = int(splitItem[1]) | |
except: | |
try: | |
convertVal = float(splitItem[1]) | |
except: | |
convertVal = splitItem[1] | |
logger.debug('Split Item - %s',splitItem) | |
if type(convertVal)==type(int()) or type(convertVal)==type(float()): | |
point = [convertVal] | |
stats=[(point)] | |
logger.debug('Info Point - %s',point) | |
logger.debug('Info Stats - %s',stats) | |
logger.debug('Result Splitting Stats - %s',stats) | |
jsonOut = [{ | |
"points": stats, | |
"name": 'sensuType1.'+jsonIn['client']['name']+'.'+jsonIn['check']['name']+'.'+splitItem[0], | |
"columns": ["value"] | |
}] | |
try: | |
db.write_points(jsonOut) | |
logger.info('Data JSON out = %s', jsonOut) | |
logger.info('Success send check %s key %s from %s to influxdb %s', jsonIn['check']['name'], splitItem[0], jsonIn['client']['name'], settings['influxdb']['host']) | |
except Exception, err: | |
logger.exception(err) | |
logging.shutdown() | |
sys.exit(0) |