|
50 | 50 | from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter |
51 | 51 | from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter as OTLPHttpOTLPMetricExporter |
52 | 52 | from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter |
| 53 | +from opentelemetry.metrics import get_meter_provider |
53 | 54 | from opentelemetry.processor.baggage import BaggageSpanProcessor |
54 | 55 | from opentelemetry.sdk.environment_variables import OTEL_TRACES_SAMPLER, OTEL_TRACES_SAMPLER_ARG |
55 | 56 | from opentelemetry.sdk.metrics._internal.export import PeriodicExportingMetricReader |
@@ -87,6 +88,20 @@ def setUpClass(cls): |
87 | 88 | aws_otel_configurator.configure() |
88 | 89 | cls.tracer_provider: TracerProvider = get_tracer_provider() |
89 | 90 |
|
| 91 | + @classmethod |
| 92 | + def tearDownClass(cls): |
| 93 | + # Explicitly shut down meter provider to avoid I/O errors on Python 3.9 with gevent |
| 94 | + # This ensures ConsoleMetricExporter is properly closed before Python cleanup |
| 95 | + try: |
| 96 | + meter_provider = get_meter_provider() |
| 97 | + if hasattr(meter_provider, "force_flush"): |
| 98 | + meter_provider.force_flush() |
| 99 | + if hasattr(meter_provider, "shutdown"): |
| 100 | + meter_provider.shutdown() |
| 101 | + except Exception: |
| 102 | + # Ignore any errors during cleanup |
| 103 | + pass |
| 104 | + |
90 | 105 | def tearDown(self): |
91 | 106 | os.environ.pop("OTEL_AWS_APPLICATION_SIGNALS_ENABLED", None) |
92 | 107 | os.environ.pop("OTEL_AWS_APPLICATION_SIGNALS_RUNTIME_ENABLED", None) |
|
0 commit comments