diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d46e1f312..2edaebd2cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Tolerates exceptions when loading resource detectors via `OTEL_EXPERIMENTAL_RESOURCE_DETECTORS` ([#4373](https://github.com/open-telemetry/opentelemetry-python/pull/4373)) +- Disconnect gRPC client stub when shutting down `OTLPSpanExporter` + ([#4370](https://github.com/open-telemetry/opentelemetry-python/pull/4370)) - opentelemetry-sdk: fix OTLP exporting of Histograms with explicit buckets advisory ([#4434](https://github.com/open-telemetry/opentelemetry-python/pull/4434)) diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/exporter.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/exporter.py index 582d083e86..2e3b99500d 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/exporter.py @@ -243,9 +243,7 @@ def __init__( ) or Compression.NoCompression if insecure: - self._client = self._stub( - insecure_channel(self._endpoint, compression=compression) - ) + self._channel = insecure_channel(self._endpoint, compression=compression) else: credentials = _get_credentials( credentials, @@ -253,11 +251,10 @@ def __init__( OTEL_EXPORTER_OTLP_CLIENT_KEY, OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE, ) - self._client = self._stub( - secure_channel( - self._endpoint, credentials, compression=compression - ) + self._channel = secure_channel( + self._endpoint, credentials, compression=compression ) + self._client = self._stub(self._channel) self._export_lock = threading.Lock() self._shutdown = False @@ -360,6 +357,7 @@ def shutdown(self, timeout_millis: float = 30_000, **kwargs) -> None: # wait for the last export if any self._export_lock.acquire(timeout=timeout_millis / 1e3) self._shutdown = True + self._channel.close() self._export_lock.release() @property