@@ -38,7 +38,7 @@ const version = require('../../../package.json').version;
3838 * globally via the static `enabled` property, that is set from the SpannerClient.
3939 */
4040export class MetricsTracerFactory {
41- private static _instance : MetricsTracerFactory | null = null ;
41+ private static _instances : Map < string , MetricsTracerFactory > = new Map ( ) ;
4242 private _meterProvider : MeterProvider | null = null ;
4343 private _instrumentAttemptCounter ! : Counter ;
4444 private _instrumentAttemptLatency ! : Histogram ;
@@ -56,7 +56,6 @@ export class MetricsTracerFactory {
5656 private _currentOperationTracers = new Map ( ) ;
5757 private _currentOperationLastUpdatedMs = new Map ( ) ;
5858 private _intervalTracerCleanup : NodeJS . Timeout ;
59- public static _readers : MetricReader [ ] = [ ] ;
6059 public static enabled = true ;
6160
6261 /**
@@ -101,16 +100,19 @@ export class MetricsTracerFactory {
101100 * @param projectId Optional GCP project ID for the factory instantiation. Does nothing for subsequent calls.
102101 * @returns The singleton MetricsTracerFactory instance or null if disabled.
103102 */
104- public static getInstance ( projectId = '' ) : MetricsTracerFactory | null {
103+ public static getInstance ( projectId : string ) : MetricsTracerFactory | null {
105104 if ( ! MetricsTracerFactory . enabled ) {
106105 return null ;
107106 }
108107
109108 // Create a singleton instance, enabling/disabling metrics can only be done on the initial call
110- if ( MetricsTracerFactory . _instance === null ) {
111- MetricsTracerFactory . _instance = new MetricsTracerFactory ( projectId ) ;
109+ if ( ! MetricsTracerFactory . _instances . has ( projectId ) ) {
110+ MetricsTracerFactory . _instances . set (
111+ projectId ,
112+ new MetricsTracerFactory ( projectId ) ,
113+ ) ;
112114 }
113- return MetricsTracerFactory ! . _instance ;
115+ return MetricsTracerFactory . _instances . get ( projectId ) ! ;
114116 }
115117
116118 /**
@@ -128,7 +130,6 @@ export class MetricsTracerFactory {
128130 [ Constants . MONITORED_RES_LABEL_KEY_INSTANCE ] : 'unknown' ,
129131 [ Constants . MONITORED_RES_LABEL_KEY_INSTANCE_CONFIG ] : 'unknown' ,
130132 } ) ;
131- MetricsTracerFactory . _readers = readers ;
132133 this . _meterProvider = new MeterProvider ( {
133134 resource : resource ,
134135 readers : readers ,
@@ -142,10 +143,21 @@ export class MetricsTracerFactory {
142143 /**
143144 * Resets the singleton instance of the MetricsTracerFactory.
144145 */
145- public static async resetInstance ( ) {
146- clearInterval ( MetricsTracerFactory . _instance ?. _intervalTracerCleanup ) ;
147- await MetricsTracerFactory . _instance ?. resetMeterProvider ( ) ;
148- MetricsTracerFactory . _instance = null ;
146+ public static async resetInstance ( projectId ?: string ) {
147+ if ( projectId ) {
148+ const instance = MetricsTracerFactory . _instances . get ( projectId ) ;
149+ if ( instance ) {
150+ clearInterval ( instance . _intervalTracerCleanup ) ;
151+ await instance . resetMeterProvider ( ) ;
152+ MetricsTracerFactory . _instances . delete ( projectId ) ;
153+ }
154+ } else {
155+ for ( const instance of MetricsTracerFactory . _instances . values ( ) ) {
156+ clearInterval ( instance . _intervalTracerCleanup ) ;
157+ await instance . resetMeterProvider ( ) ;
158+ }
159+ MetricsTracerFactory . _instances . clear ( ) ;
160+ }
149161 }
150162
151163 /**
@@ -250,6 +262,7 @@ export class MetricsTracerFactory {
250262 MetricsTracerFactory . enabled ,
251263 database ,
252264 instance ,
265+ this . _projectId ,
253266 method ,
254267 operationRequest ,
255268 ) ;
0 commit comments