Skip to content

Commit 75a46ad

Browse files
committed
add validation prometheus metrics
1 parent 8180af5 commit 75a46ad

File tree

3 files changed

+48
-15
lines changed

3 files changed

+48
-15
lines changed

modules/prometheus.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ def to_format(self, value):
3030
'collated_master_err': Metric('validator_blocks_collated_master_err', 'Number of masterchain blocks failed to collate', 'gauge'),
3131
'collated_shard_ok': Metric('validator_blocks_collated_shard_ok', 'Number of shardchain blocks successfully collated', 'gauge'),
3232
'collated_shard_err': Metric('validator_blocks_collated_shard_err', 'Number of shardchain blocks failed to collate', 'gauge'),
33+
'validated_master_ok': Metric('validator_blocks_validated_master_ok', 'Number of masterchain blocks successfully validated', 'gauge'),
34+
'validated_master_err': Metric('validator_blocks_validated_master_err', 'Number of masterchain blocks failed to validate', 'gauge'),
35+
'validated_shard_ok': Metric('validator_blocks_validated_shard_ok', 'Number of shardchain blocks successfully validated', 'gauge'),
36+
'validated_shard_err': Metric('validator_blocks_validated_shard_err', 'Number of shardchain blocks failed to validate', 'gauge'),
37+
'validator_groups_master': Metric('validator_active_groups_master', 'Number of masterchain validation groups validator participates in', 'gauge'),
38+
'validator_groups_shard': Metric('validator_active_groups_shard', 'Number of shardchain validation groups validator participates in', 'gauge'),
3339
'ls_queries_ok': Metric('validator_ls_queries_ok', 'Number of Liteserver successful queries', 'gauge'),
3440
'ls_queries_err': Metric('validator_ls_queries_err', 'Number of Liteserver failed queries', 'gauge'),
3541
}
@@ -59,6 +65,9 @@ def get_validator_status_metrics(self, result: list):
5965
result.append(METRICS['celldb_gc_state'].to_format(status.gcmasterchainblock - status.last_deleted_mc_state))
6066
else:
6167
result.append(METRICS['celldb_gc_state'].to_format(-1))
68+
if status.validator_groups_master is not None:
69+
result.append(METRICS['validator_groups_master'].to_format(status.validator_groups_master))
70+
result.append(METRICS['validator_groups_shard'].to_format(status.validator_groups_shard))
6271
result.append(METRICS['vc_up'].to_format(int(is_working)))
6372

6473
def get_validator_validation_metrics(self, result: list):
@@ -81,6 +90,16 @@ def get_node_stats_metrics(self, result: list):
8190
return
8291
result.append(METRICS['ls_queries_ok'].to_format(stats['ls_queries']['ok']))
8392
result.append(METRICS['ls_queries_err'].to_format(stats['ls_queries']['error']))
93+
if stats and 'collated' in stats:
94+
result.append(METRICS['collated_master_ok'].to_format(stats['collated']['master']['ok']))
95+
result.append(METRICS['collated_master_err'].to_format(stats['collated']['master']['error']))
96+
result.append(METRICS['collated_shard_ok'].to_format(stats['collated']['shard']['ok']))
97+
result.append(METRICS['collated_shard_err'].to_format(stats['collated']['shard']['error']))
98+
if stats and 'validated' in stats:
99+
result.append(METRICS['validated_master_ok'].to_format(stats['validated']['master']['ok']))
100+
result.append(METRICS['validated_master_err'].to_format(stats['validated']['master']['error']))
101+
result.append(METRICS['validated_shard_ok'].to_format(stats['validated']['shard']['ok']))
102+
result.append(METRICS['validated_shard_err'].to_format(stats['validated']['shard']['error']))
84103

85104
def push_metrics(self):
86105
if not self.ton.using_prometheus():

mytoncore/functions.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,9 @@ def get_ok_error(value: str):
323323
data['ls_queries']['error'] = int(k.split(':')[1])
324324
statistics = local.db.get("statistics", dict())
325325

326+
if time.time() - int(status.start_time) <= 60: # was node restart <60 sec ago, resetting node statistics
327+
statistics['node'] = []
328+
326329
# statistics['node'] = [stats_from_election_id, stats_from_prev_min, stats_now]
327330

328331
election_id = ton.GetConfig34()['startWorkTime']

mytoncore/mytoncore.py

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -807,6 +807,10 @@ def GetValidatorStatus(self, no_cache=False):
807807
status.last_deleted_mc_state = int(parse(result, "last_deleted_mc_state", '\n'))
808808
status.stateserializerenabled = parse(result, "stateserializerenabled", '\n') == "true"
809809
self.local.try_function(self.parse_stats_from_vc, args=[result, status])
810+
if 'active_validator_groups' in status:
811+
groups = status.active_validator_groups.split() # master:1 shard:2
812+
status.validator_groups_master = int(groups[0].split(':')[1])
813+
status.validator_groups_shard = int(groups[1].split(':')[1])
810814
except Exception as ex:
811815
self.local.add_log(f"GetValidatorStatus warning: {ex}", "warning")
812816
status.is_working = False
@@ -3043,27 +3047,34 @@ def get_node_statistics(self):
30433047
:return: stats for collated/validated blocks since round beggining and stats for ls queries for the last minute
30443048
"""
30453049
stats = self.local.db.get('statistics', {}).get('node')
3046-
result = {}
3050+
result = {
3051+
'collated': {
3052+
'ok': 0,
3053+
'error': 0,
3054+
},
3055+
'validated': {
3056+
'ok': 0,
3057+
'error': 0,
3058+
}
3059+
}
30473060
if stats is not None and len(stats) == 3 and stats[0] is not None:
3048-
collated_ok = 0
3049-
collated_error = 0
3050-
validated_ok = 0
3051-
validated_error = 0
30523061
for k in ['master', 'shard']:
3053-
collated_ok += stats[2]['collated_blocks'][k]['ok'] - stats[0]['collated_blocks'][k]['ok']
3054-
collated_error += stats[2]['collated_blocks'][k]['error'] - stats[0]['collated_blocks'][k]['error']
3055-
validated_ok += stats[2]['validated_blocks'][k]['ok'] - stats[0]['validated_blocks'][k]['ok']
3056-
validated_error += stats[2]['validated_blocks'][k]['error'] - stats[0]['validated_blocks'][k]['error']
3057-
result = {
3058-
'collated': {
3062+
collated_ok = stats[2]['collated_blocks'][k]['ok'] - stats[0]['collated_blocks'][k]['ok']
3063+
collated_error = stats[2]['collated_blocks'][k]['error'] - stats[0]['collated_blocks'][k]['error']
3064+
validated_ok = stats[2]['validated_blocks'][k]['ok'] - stats[0]['validated_blocks'][k]['ok']
3065+
validated_error = stats[2]['validated_blocks'][k]['error'] - stats[0]['validated_blocks'][k]['error']
3066+
result['collated'][k] = {
30593067
'ok': collated_ok,
30603068
'error': collated_error,
3061-
},
3062-
'validated': {
3069+
}
3070+
result['validated'][k] = {
30633071
'ok': validated_ok,
30643072
'error': validated_error,
3065-
},
3066-
}
3073+
}
3074+
result['collated']['ok'] += collated_ok
3075+
result['collated']['error'] += collated_error
3076+
result['validated']['ok'] += validated_ok
3077+
result['validated']['error'] += validated_error
30673078
if stats is not None and len(stats) >= 2:
30683079
result['ls_queries'] = {
30693080
'ok': stats[-1]['ls_queries']['ok'] - stats[-2]['ls_queries']['ok'],

0 commit comments

Comments
 (0)