11import * as core from '@powersync/service-core' ;
2+ import {
3+ createCoreAPIMetrics ,
4+ createCoreReplicationMetrics ,
5+ createCoreStorageMetrics ,
6+ initializeCoreAPIMetrics ,
7+ initializeCoreReplicationMetrics ,
8+ initializeCoreStorageMetrics
9+ } from '@powersync/service-core' ;
210
311export enum MetricModes {
412 API = 'api' ,
5- REPLICATION = 'replication'
13+ REPLICATION = 'replication' ,
14+ STORAGE = 'storage'
615}
716
817export type MetricsRegistrationOptions = {
@@ -13,28 +22,38 @@ export type MetricsRegistrationOptions = {
1322export const registerMetrics = async ( options : MetricsRegistrationOptions ) => {
1423 const { service_context, modes } = options ;
1524
16- // This requires an instantiated bucket storage, which is only created when the lifecycle starts
17- service_context . lifeCycleEngine . withLifecycle ( null , {
18- start : async ( ) => {
19- const instanceId = await service_context . storageEngine . activeBucketStorage . getPowerSyncInstanceId ( ) ;
20- await core . metrics . Metrics . initialise ( {
21- powersync_instance_id : instanceId ,
22- disable_telemetry_sharing : service_context . configuration . telemetry . disable_telemetry_sharing ,
23- internal_metrics_endpoint : service_context . configuration . telemetry . internal_service_endpoint
24- } ) ;
25-
26- // TODO remove singleton
27- const instance = core . Metrics . getInstance ( ) ;
28- service_context . register ( core . metrics . Metrics , instance ) ;
29-
30- if ( modes . includes ( MetricModes . API ) ) {
31- instance . configureApiMetrics ( ) ;
32- }
25+ const metricsFactory = core . metrics . createOpenTelemetryMetricsFactory ( service_context ) ;
26+ const metricsEngine = new core . metrics . MetricsEngine ( {
27+ factory : metricsFactory ,
28+ disable_telemetry_sharing : service_context . configuration . telemetry . disable_telemetry_sharing
29+ } ) ;
30+ service_context . register ( core . metrics . MetricsEngine , metricsEngine ) ;
31+
32+ if ( modes . includes ( MetricModes . API ) ) {
33+ createCoreAPIMetrics ( metricsEngine ) ;
34+ initializeCoreAPIMetrics ( metricsEngine ) ;
35+ }
3336
34- if ( modes . includes ( MetricModes . REPLICATION ) ) {
35- instance . configureReplicationMetrics ( service_context . storageEngine . activeBucketStorage ) ;
37+ if ( modes . includes ( MetricModes . REPLICATION ) ) {
38+ createCoreReplicationMetrics ( metricsEngine ) ;
39+ initializeCoreReplicationMetrics ( metricsEngine ) ;
40+ }
41+
42+ if ( modes . includes ( MetricModes . STORAGE ) ) {
43+ createCoreStorageMetrics ( metricsEngine ) ;
44+
45+ // This requires an instantiated bucket storage, which is only created when the lifecycle starts
46+ service_context . storageEngine . registerListener ( {
47+ storageActivated : ( bucketStorage ) => {
48+ initializeCoreStorageMetrics ( metricsEngine , bucketStorage ) ;
3649 }
50+ } ) ;
51+ }
52+
53+ service_context . lifeCycleEngine . withLifecycle ( metricsEngine , {
54+ start : async ( ) => {
55+ await metricsEngine . start ( ) ;
3756 } ,
38- stop : ( ) => service_context . metrics ! . shutdown ( )
57+ stop : ( ) => metricsEngine . shutdown ( )
3958 } ) ;
4059} ;
0 commit comments