-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcheck_rippled_daemon.py
executable file
·132 lines (113 loc) · 5.22 KB
/
check_rippled_daemon.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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/usr/bin/python2.7
import json
import time, datetime
import socket
import glob
from websocket import create_connection
import rippled
import monitoring2_7
apiKey = "XXXXXXXXXX"
core_dir = "/data/rippled/cores"
SLEEP = 20
hostname = socket.gethostname()
host_type = rippled.ServerType.lookup(hostname)
if not host_type:
print("Could not determine state from hostname: %s") % hostname
exit(2)
host_type.proposers_needed -= 1
key = "rippled.%s.%s.status" % (host_type.name,hostname)
OLD = {}
NEW = {}
while True:
try:
d = rippled.ServerInfo('localhost').get()
except:
d = None
NEW['msg'] = "Rippled is not running"
NEW['code'] = 2
if d is not None:
NEW['build_version'] = d.build_version
NEW['ledger_s'] = d.ledgers['min']
NEW['ledger_e'] = d.ledgers['max']
NEW['proposers'] = d.proposers
NEW['server_state'] = d.server_state.name
NEW['ledger_gaps'] = d.ledgers['gaps']
NEW['core_count'] = len(glob.glob('%s/core.*' % core_dir))
if NEW['server_state'] != host_type.state_needed:
NEW['msg'] = "Wrong state for host type: %s (needed %s)" % (NEW['server_state'],host_type.state_needed)
NEW['code'] = 2
elif 'ledger_e' in OLD and NEW['ledger_e'] <= OLD['ledger_e']:
NEW['msg'] = "Ledger sample 2 not greater than 1: %s %s" % (OLD['ledger_e'],NEW['ledger_e'])
NEW['code'] = 1
elif NEW['proposers'] < host_type.proposers_needed:
NEW['msg'] = "Do not have enough proposers: %s (needed %s)" % (NEW['proposers'],host_type.proposers_needed)
NEW['code'] = 1
elif 'ledger_e' in OLD:
NEW['ledger_rate'] = float(int(NEW['ledger_e'])-int(OLD['ledger_e']))*60/10
NEW['msg'] = "Version: %s Ledgers: %s (%s/min) Proposers: %s Gaps: %i Coredumps: %i State: %s" % (NEW['build_version'],NEW['ledger_e'],NEW['ledger_rate'],NEW['proposers'],NEW['ledger_gaps'],NEW['core_count'],NEW['server_state'])
NEW['code'] = 0
else:
# there is no OLD, this is probably the first iteration
NEW['code'] = -1
if NEW['code'] >= 0:
n = monitoring2_7.Nagios(apiKey)
n.add(key,NEW['msg'],NEW['code'])
n.send()
if d is not None:
g = monitoring2_7.Graphite()
g.set_prefix("rippled.%s.server_info" % g.get('hostname'))
g.add("ledgers_min",d.ledgers['min'])
g.add("ledgers_max",d.ledgers['max'])
g.add("fetch_pack",d.fetch_pack)
g.add("io_latency_ms",d.io_latency_ms)
g.add("last_close.converge_time_s",d.converge_time_s)
g.add("last_close.proposers",d.proposers)
g.add("peers",d.peers)
g.add("validation_quorum",d.validation_quorum)
g.add("load.threads",d.threads)
g.add("server_state",d.server_state.value)
g.add("state.%s" % NEW['server_state'], 1)
g.add("age",d.age)
g.add("validated_age",d.validated_age)
g.add("load_factor",d.load_factor)
g.add("reserve_base_xrp",d.reserve_base_xrp)
g.add("reserve_inc_xrp",d.reserve_inc_xrp)
g.add("validated_seq",d.validated_seq)
if d.base_fee_xrp is None:
d.base_fee_xrp = -1
g.add("base_fee_xrp",format(d.base_fee_xrp,'f'))
for job in d.jobs:
job_name = job['name']
g.add("jobs.%s.avg_time" % job_name, job['avg_time'])
g.add("jobs.%s.in_progress" % job_name, job['in_progress'])
g.add("jobs.%s.peak_time" % job_name, job['peak_time'])
g.add("jobs.%s.per_second" % job_name, job['per_second'])
g.add("jobs.%s.waiting" % job_name, job['waiting'])
g.set_prefix("rippled.%s" % g.get('hostname'))
g.add("coredumps.count",NEW['core_count'])
# fee-related stuff
if host_type.name == 'validator':
f = rippled.Rippled('localhost').get('min_cluster_fee')
g.set_prefix("rippled.%s.fee" % g.get('hostname'))
g.add('cost_of_ref_txn',f['cost_of_ref_txn'])
g.add('load_base',f['load_base'])
g.add('effective_min_fee',f['effective_min_fee'])
g.add('min_load_value',f['min_load_value'])
g.set_prefix("rippled.%s" % g.get('hostname'))
g.add("check_rippled.status_code",NEW['code'])
# nodestore activity
getCounts = rippled.Rippled('localhost').get('get_counts', ({'min_count': 0}) )
g.set_prefix('rippled.%s.get_counts' % g.get('hostname'))
if 'node_reads_hit' in getCounts:
g.add('node_reads_hit', getCounts['node_reads_hit'])
if 'node_reads_total' in getCounts:
g.add('node_reads_total', getCounts['node_reads_total'])
if 'node_writes' in getCounts:
g.add('node_writes', getCounts['node_writes'])
g.send('54.91.39.21')
logstamp = '[' + str(datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')) + '] '
print(logstamp+NEW['msg'])
#exit(code)
time.sleep(SLEEP)
OLD = NEW
NEW = {}