diff --git a/src/core/metrics.ts b/src/core/metrics.ts index 1bd288c..2a4f0f7 100644 --- a/src/core/metrics.ts +++ b/src/core/metrics.ts @@ -38,6 +38,7 @@ enum METRIC_TYPES { endpoint_response_times_histogram = 'endpoint_response_times_histogram', endpoint_response_status = 'endpoint_response_status', gpa_fetch_duration = 'gpa_fetch_duration', + last_ws_message_received_ts = 'last_ws_message_received_ts', health_status = 'health_status', } @@ -109,6 +110,20 @@ healthStatusGauge.addCallback((obs: ObservableResult) => { obs.observe(healthStatus, {}); }); +let lastWsMsgReceivedTs = 0; +const setLastReceivedWsMsgTs = (ts: number) => { + lastWsMsgReceivedTs = ts; +}; +const lastWsReceivedTsGauge = meter.createObservableGauge( + METRIC_TYPES.last_ws_message_received_ts, + { + description: 'Timestamp of last received websocket message', + } +); +lastWsReceivedTsGauge.addCallback((obs: ObservableResult) => { + obs.observe(lastWsMsgReceivedTs, {}); +}); + const endpointResponseTimeHistogram = meter.createHistogram( METRIC_TYPES.endpoint_response_times_histogram, { @@ -202,4 +217,5 @@ export { gpaFetchDurationHistogram, responseStatusCounter, handleHealthCheck, + setLastReceivedWsMsgTs, }; diff --git a/src/index.ts b/src/index.ts index d8deef8..2937ac6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -28,12 +28,18 @@ import { initialize, isVariant, OrderSubscriber, + UserAccount, + Order, } from '@drift-labs/sdk'; import { logger, setLogLevel } from './utils/logger'; import * as http from 'http'; -import { gpaFetchDurationHistogram, handleHealthCheck } from './core/metrics'; +import { + gpaFetchDurationHistogram, + handleHealthCheck, + setLastReceivedWsMsgTs, +} from './core/metrics'; import { handleResponseTime } from './core/middleware'; import { SubscriberLookup, @@ -252,6 +258,20 @@ const main = async () => { driftClient, subscriptionConfig, }); + orderSubscriber.eventEmitter.on( + 'onUpdate', + ( + _account: UserAccount, + _updatedOrders: Order[], + _pubkey: PublicKey, + _slot: number, + dataType: 'raw' | 'decoded' + ) => { + if (dataType === 'decoded') { + setLastReceivedWsMsgTs(Date.now()); + } + } + ); dlobProvider = getDLOBProviderFromOrderSubscriber(orderSubscriber);