Skip to content

Commit e6734f1

Browse files
committed
feat: added validators balances metrics
1 parent 84140d5 commit e6734f1

File tree

4 files changed

+34
-12
lines changed

4 files changed

+34
-12
lines changed

src/common/prometheus/prometheus.service.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ export class PrometheusService {
3535
labelNames: ENV_KEYS,
3636
});
3737

38+
public validatorsState = this.getOrCreateMetric('Gauge', {
39+
name: METRICS_PREFIX + 'validators_state',
40+
help: 'balances of Lido validators with withdrawable_epoch by frames',
41+
labelNames: ['frame', 'balance'],
42+
});
43+
3844
public clApiRequestDuration = this.getOrCreateMetric('Histogram', {
3945
name: METRICS_PREFIX + 'cl_api_requests_duration_seconds',
4046
help: 'CL API request duration',
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { BigNumber } from '@ethersproject/bignumber';
2+
3+
export function stringifyFrameBalances(frameBalances: Record<string, BigNumber>) {
4+
return JSON.stringify(
5+
Object.keys(frameBalances).reduce((acc, key) => {
6+
return { ...acc, [key]: frameBalances[key].toString() };
7+
}, {}),
8+
);
9+
}

src/jobs/validators/validators.service.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,16 @@ import { ResponseValidatorsData, Validator } from './validators.types';
1616
import { parseGweiToWei } from '../../common/utils/parse-gwei-to-big-number';
1717
import { ValidatorsCacheService } from 'storage/validators/validators-cache.service';
1818
import { CronExpression } from '@nestjs/schedule';
19+
import { PrometheusService } from '../../common/prometheus';
20+
import { stringifyFrameBalances } from '../../common/validators/strigify-frame-balances';
1921

2022
export class ValidatorsService {
2123
static SERVICE_LOG_NAME = 'validators';
2224

2325
constructor(
2426
@Inject(LOGGER_PROVIDER) protected readonly logger: LoggerService,
2527

28+
protected readonly prometheusService: PrometheusService,
2629
protected readonly consensusProviderService: ConsensusProviderService,
2730
protected readonly configService: ConfigService,
2831
protected readonly jobService: JobService,
@@ -78,23 +81,34 @@ export class ValidatorsService {
7881

7982
await unblock();
8083
}
81-
await this.setLidoValidatorsWithdrawableBalances(data);
8284
this.validatorsStorageService.setTotal(totalValidators);
8385
this.validatorsStorageService.setMaxExitEpoch(latestEpoch);
8486
this.validatorsStorageService.setLastUpdate(Math.floor(Date.now() / 1000));
8587

88+
const frameBalances = await this.getLidoValidatorsWithdrawableBalances(data);
89+
this.validatorsStorageService.setFrameBalances(frameBalances);
8690
await this.validatorsCacheService.saveDataToCache();
8791

8892
this.logger.log('End update validators', {
8993
service: ValidatorsService.SERVICE_LOG_NAME,
9094
totalValidators,
9195
latestEpoch,
96+
frameBalances: stringifyFrameBalances(frameBalances),
97+
});
98+
99+
Object.keys(frameBalances).forEach((frame) => {
100+
this.prometheusService.validatorsState
101+
.labels({
102+
frame,
103+
balance: frameBalances[frame],
104+
})
105+
.inc();
92106
});
93107
},
94108
);
95109
}
96110

97-
protected async setLidoValidatorsWithdrawableBalances(validators: Validator[]) {
111+
protected async getLidoValidatorsWithdrawableBalances(validators: Validator[]) {
98112
const keysData = await this.lidoKeys.fetchLidoKeysData();
99113
const lidoValidators = await this.lidoKeys.getLidoValidatorsByKeys(keysData.data, validators);
100114

@@ -111,6 +125,6 @@ export class ValidatorsService {
111125
await unblock();
112126
}
113127

114-
this.validatorsStorageService.setFrameBalances(frameBalances);
128+
return frameBalances;
115129
}
116130
}

src/storage/validators/validators-cache.service.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import * as path from 'path';
44
import { LOGGER_PROVIDER, LoggerService } from '../../common/logger';
55
import { ValidatorsStorageService } from './validators.service';
66
import { BigNumber } from '@ethersproject/bignumber';
7+
import { stringifyFrameBalances } from '../../common/validators/strigify-frame-balances';
78

89
@Injectable()
910
export class ValidatorsCacheService {
@@ -75,7 +76,7 @@ export class ValidatorsCacheService {
7576
this.validatorsStorage.getTotal(),
7677
this.validatorsStorage.getMaxExitEpoch(),
7778
this.validatorsStorage.getLastUpdate(),
78-
this.stringifyFrameBalances(this.validatorsStorage.getFrameBalances()),
79+
stringifyFrameBalances(this.validatorsStorage.getFrameBalances()),
7980
].join(ValidatorsCacheService.CACHE_DATA_DIVIDER);
8081
await writeFile(cacheFileName, data);
8182
this.logger.log(`success save to file ${cacheFileName}`, { service: ValidatorsCacheService.SERVICE_LOG_NAME });
@@ -85,14 +86,6 @@ export class ValidatorsCacheService {
8586
return path.join(ValidatorsCacheService.CACHE_DIR, ValidatorsCacheService.CACHE_FILE_NAME);
8687
};
8788

88-
protected stringifyFrameBalances(frameBalances: Record<string, BigNumber>) {
89-
return JSON.stringify(
90-
Object.keys(frameBalances).reduce((acc, key) => {
91-
return { ...acc, [key]: frameBalances[key].toString() };
92-
}, {}),
93-
);
94-
}
95-
9689
protected parseFrameBalances(frameBalancesStr: string) {
9790
const frameBalances = JSON.parse(frameBalancesStr);
9891
return Object.keys(frameBalances).reduce((acc, key) => {

0 commit comments

Comments
 (0)