From 81225afc9a7979e9e64b45d0311e40441b6dfdd1 Mon Sep 17 00:00:00 2001 From: Jan Hicken Date: Fri, 14 Jan 2022 00:02:20 +0100 Subject: [PATCH] fix: Shutdown Stackdriver MetricServiceClient properly (#2091) Using the default configuration of StackdriverStatsConfiguration, a MetricServiceClient is initialized by the StackdriverStatsExporter. This client was never closed, this will be done now when the .unregister() method is called on the exporter. If a custom MetricServiceStub is given by the user, it will *not* be closed as the user should be in charge of it. --- CHANGELOG.md | 2 ++ .../stackdriver/StackdriverStatsExporter.java | 19 +++++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) 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; + } } } }