import json
import struct
import socket
import re
from elasticsearch import Elasticsearch
def get_dict_value(res):
for k, v in res.items():
value = v
return value
def get_metric_trapper(hosts):
sending_data = {'request': 'sender data', 'data': []}
es = Elasticsearch(hosts=hosts)
res = es.nodes.stats(node_id='_local')['nodes']
v = get_dict_value(res)
host_name = v['name']
for key_info in monitor_key_info:
key_one = key_info['key_one']
key_two = key_info['key_two']
key_three = key_info['key_three']
sending_data['data'].append({
'host': host_name,
'value': v[key_one][key_two][key_three],
'key': 'es.{}.{}.{}'.format(key_one, key_two, key_three)
})
return sending_data
def send_data(sender_data):
code =
if len(sender_data['data']) == :
code =
return code
mydata = json.dumps(sender_data)
data_length = len(mydata)
data_header = str(struct.pack('q', data_length))
data_to_send = 'ZBXD\1' + str(data_header) + str(mydata)
socket.setdefaulttimeout()
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('zabbix-IP', ))
sock.send(data_to_send)
except Exception as e:
print(e)
code =
return code
response_header = sock.recv()
if not response_header == 'ZBXD\1':
code =
return code
response_data_header = sock.recv()
response_data_header = response_data_header[:]
response_len = struct.unpack('i', response_data_header)[]
response_raw = sock.recv(response_len)
sock.close()
response = json.loads(response_raw)
match = re.match('^.*failed.+?(\d+).*$', response['info'].lower() if 'info' in response else '')
if match is None:
code =
return code
else:
fails = int(match.group())
if fails > :
code =
return code
return code
if __name__ == '__main__':
hosts = 'ip:9200'
monitor_key_info = [
{'key_one': 'jvm', 'key_two': 'mem', 'key_three': 'heap_used_percent'},
{'key_one': 'jvm', 'key_two': 'mem', 'key_three': 'heap_used_in_bytes'},
{'key_one': 'jvm', 'key_two': 'mem', 'key_three': 'heap_max_in_bytes'},
{'key_one': 'indices', 'key_two': 'store', 'key_three': 'size_in_bytes'},
{'key_one': 'indices', 'key_two': 'segments', 'key_three': 'count'},
{'key_one': 'indices', 'key_two': 'search', 'key_three': 'query_time_in_millis'},
{'key_one': 'indices', 'key_two': 'indexing', 'key_three': 'index_time_in_millis'},
{'key_one': 'indices', 'key_two': 'docs', 'key_three': 'count'},
{'key_one': 'indices', 'key_two': 'docs', 'key_three': 'deleted'},
{'key_one': 'os', 'key_two': 'cpu', 'key_three': 'percent'},
]
v = get_metric_trapper(hosts=hosts)
relust = send_data(v)
print(relust)