Skip to content

Instantly share code, notes, and snippets.

@msoltysik
Last active October 10, 2024 07:38
Show Gist options
  • Save msoltysik/b6195fc9ebe5ebc585d3a01fc6307921 to your computer and use it in GitHub Desktop.
Save msoltysik/b6195fc9ebe5ebc585d3a01fc6307921 to your computer and use it in GitHub Desktop.
import gc
import logging
import weakref
from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter
from opentelemetry.instrumentation.logging import LoggingInstrumentor
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.metrics._internal.export import PeriodicExportingMetricReader
LoggingInstrumentor().instrument(set_logging_format=True, log_level=logging.DEBUG)
def main():
# setup_otlp_exporter
otlp_exporter = OTLPMetricExporter(endpoint="http://localhost:4318/v1/metrics")
otlp_exporter_weakref = weakref.ref(otlp_exporter)
reader = PeriodicExportingMetricReader(otlp_exporter, export_interval_millis=5000)
reader_weakref = weakref.ref(reader)
provider = MeterProvider(metric_readers=[reader])
provider_weakref = weakref.ref(provider)
# cleanup_metrics
if hasattr(reader, "_collector"):
reader._collector.collect() # Force collection
if hasattr(reader, "shutdown"):
reader.shutdown()
provider.shutdown()
del otlp_exporter
del reader
del provider
gc.collect()
if otlp_exporter_weakref() is not None:
logging.warning("OTLP EXPORTER was not properly garbage collected")
referrers = gc.get_referrers(reader_weakref())
logging.debug(f"Direct referrers to OTLP EXPORTER: {len(referrers)}")
for ref in referrers:
logging.debug(f"OTLP EXPORTER referrer {str(ref)} type: {type(ref)}")
else:
logging.info("OTLP EXPORTER was properly garbage collected")
if reader_weakref() is not None:
logging.warning("READER was not properly garbage collected")
referrers = gc.get_referrers(reader_weakref())
logging.debug(f"Direct referrers to READER: {len(referrers)}")
for ref in referrers:
logging.debug(f"READER referrer {str(ref)} type: {type(ref)}")
else:
logging.info("READER was properly garbage collected")
if provider_weakref() is not None:
logging.warning("PROVIDER was not properly garbage collected")
referrers = gc.get_referrers(reader_weakref())
logging.debug(f"Direct referrers to PROVIDER: {len(referrers)}")
for ref in referrers:
logging.debug(f"PROVIDER referrer {str(ref)} type: {type(ref)}")
else:
logging.info("PROVIDER was properly garbage collected")
if __name__ == "__main__":
main()
2024-10-10 07:37:18,761 WARNING [opentelemetry.sdk.metrics._internal.export] [__init__.py:556] [trace_id=0 span_id=0 resource.service.name= trace_sampled=False] - Can't shutdown multiple times
2024-10-10 07:37:18,766 WARNING [root] [reproduce.py:38] [trace_id=0 span_id=0 resource.service.name= trace_sampled=False] - OTLP EXPORTER was not properly garbage collected
2024-10-10 07:37:18,766 DEBUG [root] [reproduce.py:40] [trace_id=0 span_id=0 resource.service.name= trace_sampled=False] - Direct referrers to OTLP EXPORTER: 4
2024-10-10 07:37:18,766 DEBUG [root] [reproduce.py:42] [trace_id=0 span_id=0 resource.service.name= trace_sampled=False] - OTLP EXPORTER referrer {<opentelemetry.sdk.metrics._internal.export.PeriodicExportingMetricReader object at 0x1063d4d10>} type: <class 'set'>
2024-10-10 07:37:18,766 DEBUG [root] [reproduce.py:42] [trace_id=0 span_id=0 resource.service.name= trace_sampled=False] - OTLP EXPORTER referrer <bound method PeriodicExportingMetricReader._at_fork_reinit of <opentelemetry.sdk.metrics._internal.export.PeriodicExportingMetricReader object at 0x1063d4d10>> type: <class 'method'>
2024-10-10 07:37:18,766 DEBUG [root] [reproduce.py:42] [trace_id=0 span_id=0 resource.service.name= trace_sampled=False] - OTLP EXPORTER referrer {<opentelemetry.sdk.metrics._internal.export.PeriodicExportingMetricReader object at 0x1063d4d10>: <opentelemetry.sdk.metrics._internal.metric_reader_storage.MetricReaderStorage object at 0x1063d5520>} type: <class 'dict'>
2024-10-10 07:37:18,766 DEBUG [root] [reproduce.py:42] [trace_id=0 span_id=0 resource.service.name= trace_sampled=False] - OTLP EXPORTER referrer [<opentelemetry.sdk.metrics._internal.export.PeriodicExportingMetricReader object at 0x1063d4d10>] type: <class 'list'>
2024-10-10 07:37:18,766 WARNING [root] [reproduce.py:47] [trace_id=0 span_id=0 resource.service.name= trace_sampled=False] - READER was not properly garbage collected
2024-10-10 07:37:18,767 DEBUG [root] [reproduce.py:49] [trace_id=0 span_id=0 resource.service.name= trace_sampled=False] - Direct referrers to READER: 4
2024-10-10 07:37:18,767 DEBUG [root] [reproduce.py:51] [trace_id=0 span_id=0 resource.service.name= trace_sampled=False] - READER referrer {<opentelemetry.sdk.metrics._internal.export.PeriodicExportingMetricReader object at 0x1063d4d10>} type: <class 'set'>
2024-10-10 07:37:18,767 DEBUG [root] [reproduce.py:51] [trace_id=0 span_id=0 resource.service.name= trace_sampled=False] - READER referrer <bound method PeriodicExportingMetricReader._at_fork_reinit of <opentelemetry.sdk.metrics._internal.export.PeriodicExportingMetricReader object at 0x1063d4d10>> type: <class 'method'>
2024-10-10 07:37:18,767 DEBUG [root] [reproduce.py:51] [trace_id=0 span_id=0 resource.service.name= trace_sampled=False] - READER referrer {<opentelemetry.sdk.metrics._internal.export.PeriodicExportingMetricReader object at 0x1063d4d10>: <opentelemetry.sdk.metrics._internal.metric_reader_storage.MetricReaderStorage object at 0x1063d5520>} type: <class 'dict'>
2024-10-10 07:37:18,767 DEBUG [root] [reproduce.py:51] [trace_id=0 span_id=0 resource.service.name= trace_sampled=False] - READER referrer [<opentelemetry.sdk.metrics._internal.export.PeriodicExportingMetricReader object at 0x1063d4d10>] type: <class 'list'>
2024-10-10 07:37:18,767 INFO [root] [reproduce.py:62] [trace_id=0 span_id=0 resource.service.name= trace_sampled=False] - PROVIDER was properly garbage collected
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment