@@ -196,12 +196,44 @@ def __exit__(self, exc_type, exc_value, traceback):
196
196
197
197
198
198
@dataclass
199
- class SpanCodeOriginProcessor (SpanProcessor ):
199
+ class SpanCodeOriginProcessorEntry (SpanProcessor ):
200
200
__uploader__ = LogsIntakeUploaderV1
201
201
202
- _instance : t .Optional ["SpanCodeOriginProcessor " ] = None
202
+ _entry_instance : t .Optional ["SpanCodeOriginProcessorEntry " ] = None
203
203
_handler : t .Optional [t .Callable ] = None
204
204
205
+ @classmethod
206
+ def enable (cls ):
207
+ if cls ._entry_instance is not None :
208
+ return
209
+
210
+ cls ._entry_instance = cls ()
211
+
212
+ # Register code origin for span with the snapshot uploader
213
+ cls .__uploader__ .register (UploaderProduct .CODE_ORIGIN_SPAN )
214
+
215
+ # Register the entrypoint wrapping for entry spans
216
+ cls ._handler = handler = partial (wrap_entrypoint , cls .__uploader__ .get_collector ())
217
+ core .on ("service_entrypoint.patch" , handler )
218
+
219
+ @classmethod
220
+ def disable (cls ):
221
+ if cls ._entry_instance is None :
222
+ return
223
+
224
+ # Unregister the entrypoint wrapping for entry spans
225
+ core .reset_listeners ("service_entrypoint.patch" , cls ._handler )
226
+ # Unregister code origin for span with the snapshot uploader
227
+ cls .__uploader__ .unregister (UploaderProduct .CODE_ORIGIN_SPAN )
228
+
229
+ cls ._handler = None
230
+ cls ._entry_instance = None
231
+
232
+
233
+ @dataclass
234
+ class SpanCodeOriginProcessor (SpanCodeOriginProcessorEntry ):
235
+ _instance : t .Optional ["SpanCodeOriginProcessor" ] = None
236
+
205
237
def on_span_start (self , span : Span ) -> None :
206
238
if span .span_type not in EXIT_SPAN_TYPES :
207
239
return
@@ -264,29 +296,21 @@ def enable(cls):
264
296
265
297
instance = cls ._instance = cls ()
266
298
267
- # Register code origin for span with the snapshot uploader
268
- cls .__uploader__ .register (UploaderProduct .CODE_ORIGIN_SPAN )
269
-
270
299
# Register the processor for exit spans
271
300
instance .register ()
272
301
273
- # Register the entrypoint wrapping for entry spans
274
- cls . _handler = handler = partial ( wrap_entrypoint , cls . __uploader__ . get_collector ())
275
- core . on ( "service_entrypoint.patch" , handler )
302
+ # Enable entry spans. This is idempotent so multiple calls are safe if CO is enabled
303
+ # after DI via remote configuration.
304
+ super (). enable ( )
276
305
277
306
@classmethod
278
307
def disable (cls ):
279
308
if cls ._instance is None :
280
309
return
281
310
282
- # Unregister the entrypoint wrapping for entry spans
283
- core .reset_listeners ("service_entrypoint.patch" , cls ._handler )
284
- cls ._handler = None
311
+ # Disable entry spans
312
+ super ().disable ()
285
313
286
314
# Unregister the processor for exit spans
287
315
cls ._instance .unregister ()
288
-
289
- # Unregister code origin for span with the snapshot uploader
290
- cls .__uploader__ .unregister (UploaderProduct .CODE_ORIGIN_SPAN )
291
-
292
316
cls ._instance = None
0 commit comments