Skip to content

Commit 9ce9a33

Browse files
authored
feat(metrics): add metrics for last event receipt timestamps (#2223)
1 parent 5330c07 commit 9ce9a33

File tree

3 files changed

+33
-0
lines changed

3 files changed

+33
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/* eslint-disable camelcase */
2+
3+
exports.shorthands = undefined;
4+
5+
exports.up = pgm => {
6+
pgm.createIndex('event_observer_requests', [
7+
'event_path',
8+
{ name: 'receive_timestamp', sort: 'DESC' },
9+
]);
10+
};

src/datastore/pg-store.ts

+10
Original file line numberDiff line numberDiff line change
@@ -4675,4 +4675,14 @@ export class PgStore extends BasePgStore {
46754675
tx_total_size: parseInt(result[0].tx_total_size),
46764676
};
46774677
}
4678+
4679+
/// Returns timestamps for the last Stacks node events received by the API Event Server, grouped
4680+
/// by event type.
4681+
async getLastStacksNodeEventTimestamps() {
4682+
return await this.sql<{ event_path: string; receive_timestamp: Date }[]>`
4683+
SELECT DISTINCT ON (event_path) event_path, receive_timestamp
4684+
FROM event_observer_requests
4685+
ORDER BY event_path, receive_timestamp DESC
4686+
`;
4687+
}
46784688
}

src/event-stream/event-server.ts

+13
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,7 @@ function createMessageProcessorQueue(db: PgWriteStore): EventMessageHandler {
639639
let metrics:
640640
| {
641641
eventTimer: prom.Histogram;
642+
lastEventTimestamps: prom.Gauge;
642643
blocksInPreviousBurnBlock: prom.Gauge;
643644
}
644645
| undefined;
@@ -650,6 +651,18 @@ function createMessageProcessorQueue(db: PgWriteStore): EventMessageHandler {
650651
labelNames: ['event'],
651652
buckets: prom.exponentialBuckets(50, 3, 10), // 10 buckets, from 50 ms to 15 minutes
652653
}),
654+
lastEventTimestamps: new prom.Gauge({
655+
name: 'stacks_last_event_timestamps',
656+
help: 'Last Stacks node events received timestamp',
657+
labelNames: ['event'] as const,
658+
async collect() {
659+
const events = await db.getLastStacksNodeEventTimestamps();
660+
this.reset();
661+
for (const event of events) {
662+
this.set({ event: event.event_path }, event.receive_timestamp.getTime());
663+
}
664+
},
665+
}),
653666
blocksInPreviousBurnBlock: new prom.Gauge({
654667
name: 'stacks_blocks_in_previous_burn_block',
655668
help: 'Number of Stacks blocks produced in the previous burn block',

0 commit comments

Comments
 (0)