diff --git a/CHANGELOG.md b/CHANGELOG.md index d8f908a339..d87ac88589 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ ## Unreleased +- fix: Shutdown `MetricServiceClient` properly on `StackdriverStatsExporter.unregister()` (#2007) + ## 0.28.3 - 2021-01-12 - fix: Return public access to unsafe `ContextUtils` api. Remove bincompat issue from 0.27.1. (#2072) diff --git a/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverStatsExporter.java b/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverStatsExporter.java index d68019a399..cc2d1a9b81 100644 --- a/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverStatsExporter.java +++ b/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverStatsExporter.java @@ -77,6 +77,10 @@ public final class StackdriverStatsExporter { @Nullable private static StackdriverStatsExporter instance = null; + @GuardedBy("monitor") + @Nullable + private static MetricServiceClient metricServiceClient = null; + private static final String EXPORTER_SPAN_NAME = "ExportMetricsToStackdriver"; // See io.grpc.internal.GrpcUtil.USER_AGENT_KEY @@ -392,10 +396,13 @@ private static void createInternal( throws IOException { synchronized (monitor) { checkState(instance == null, "Stackdriver stats exporter is already created."); - MetricServiceClient client = - stub == null - ? createMetricServiceClient(credentials, deadline) - : MetricServiceClient.create(stub); + final MetricServiceClient client; + if (stub == null) { + metricServiceClient = createMetricServiceClient(credentials, deadline); + client = metricServiceClient; + } else { + client = MetricServiceClient.create(stub); + } instance = new StackdriverStatsExporter( projectId, @@ -445,6 +452,10 @@ public static void unregister() { instance.intervalMetricReader.stop(); } instance = null; + if (metricServiceClient != null) { + metricServiceClient.close(); + metricServiceClient = null; + } } } }