-
Notifications
You must be signed in to change notification settings - Fork 2
/
elasticsearch_clusterhealth.py
118 lines (95 loc) · 3.08 KB
/
elasticsearch_clusterhealth.py
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#!/usr/bin/python
#
# == Synopsis
#
# Script to get cluster data from elasticsearch
# through the ES API.
#
# Because I work with multiple scripts to push data
# into Carbon, I insert the data into a separate
# Carbon database (elasticsearch.cluster)
#
# === Workflow
# This script grabs JSON from your elasticsearch
# cluster (_cluster/health), transforms data into
# valid Carbon metrics and delivers it into carbon
#
# Carbon only needs three things:
# <metric> <value> <timestamp>
#
# So what we do is grab the elasticsearch
# key as the metric, grab the elasticsearch value
# as the value and make up our own timestamp. Well,
# actually, that's done through time()
#
# Author : D. Schutterop
# Email : daniel@schutterop.nl
# Version : v0.1
#
# === HowTo
#
# Please replace the value of elaHost with the hostname
# or IP address of one of your ElasticSearch hosts
# (or DNS RR, load balanced addresses or whatever)
#
# Replace the value of grpHost (and port) of the Carbon
# server and, if you want, change the grpDatabase to
# something that makes sense to you.
#
# Fire the script and see the data appear in Graphite
# (Creation of the database files may take some time...
#
#
import json,requests,time,socket,os,sys
runInterval = 15
elaHost = 'elasticsearch.localdomain'
elaPort = 9200
grpHost = 'graphite.localdomain'
grpPort = 2003
grpDatabase = 'elasticsearch.cluster'
#Suppress SSL warnings generated when contacting Foreman
requests.packages.urllib3.disable_warnings()
def elaGetData(elaHost,elaPort):
elaUrl = "http://%s:%s/_cluster/health" % (elaHost,elaPort)
elaHeaders = {'Content-type': 'application/json'}
elaRequest = requests.get(elaUrl, verify=False, headers=elaHeaders)
return json.loads(elaRequest.text)
def grpPutMessage(grpMetricKey,grpMetricValue):
metricPrepend = grpDatabase
metricAppend = grpMetricKey
metricKey = "%s.%s" % (metricPrepend,grpMetricKey)
metricTime = int(time.time())
metricValue = grpMetricValue
return "%s %s %s" % (metricKey,metricValue,metricTime)
def run(runInterval):
while True:
grpSocket = socket.socket()
grpSocket.connect((grpHost,grpPort))
elaData = elaGetData(elaHost,elaPort)
elaData['cluster_status'] = elaData.pop('status')
message = ' '
for listItem in elaData:
elaData['cluster_name'] = 0
if listItem == 'timed_out':
if elaData['timed_out'] == True:
elaData['timed_out'] = 1
else:
elaData['timed_out'] = 0
if listItem == 'cluster_status':
if elaData[listItem] == 'green':
elaData[listItem] = 0
if elaData[listItem] == 'yellow':
elaData[listItem] = 1
if elaData[listItem] == 'red':
elaData[listItem] = 2
message = "\n %s %s" % (grpPutMessage(listItem,elaData[listItem]),message)
message = "%s \n" % (message)
grpSocket.sendall(message)
grpSocket.close()
time.sleep(runInterval)
if __name__ == "__main__":
procPid = os.fork()
if procPid != 0:
sys.exit(0)
print ("Running %s every %s seconds in the background." % (__file__,runInterval))
run(runInterval)