Skip to content

Commit 4d92e1c

Browse files
authored
chore: better error message when metric publish failed (#2214)
Also reduces logging when there are continuous failures (like permission denied). Thank you for opening a Pull Request! Before submitting your PR, there are a few things you can do to make sure it goes smoothly: - [ ] Make sure to open an issue as a [bug/issue](https://togithub.com/googleapis/java-bigtable/issues/new/choose) before writing your code! That way we can discuss the change, evaluate designs, and agree on the general idea - [ ] Ensure the tests and linter pass - [ ] Code coverage does not decrease (if any source code was changed) - [ ] Appropriate docs were updated (if necessary) - [ ] Rollback plan is reviewed and LGTMed - [ ] All new data plane features have a completed end to end testing plan Fixes #<issue_number_goes_here> ☕️ If you write sample code, please follow the [samples format]( https://togithub.com/GoogleCloudPlatform/java-docs-samples/blob/main/SAMPLE_FORMAT.md).
1 parent 38043ba commit 4d92e1c

File tree

2 files changed

+31
-9
lines changed

2 files changed

+31
-9
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ If you are using Maven with [BOM][libraries-bom], add this to your pom.xml file:
1919
<dependency>
2020
<groupId>com.google.cloud</groupId>
2121
<artifactId>libraries-bom</artifactId>
22-
<version>26.37.0</version>
22+
<version>26.25.0</version>
2323
<type>pom</type>
2424
<scope>import</scope>
2525
</dependency>

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableCloudMonitoringExporter.java

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.google.api.gax.core.CredentialsProvider;
3535
import com.google.api.gax.core.FixedCredentialsProvider;
3636
import com.google.api.gax.core.NoCredentialsProvider;
37+
import com.google.api.gax.rpc.PermissionDeniedException;
3738
import com.google.auth.Credentials;
3839
import com.google.cloud.monitoring.v3.MetricServiceClient;
3940
import com.google.cloud.monitoring.v3.MetricServiceSettings;
@@ -96,6 +97,9 @@ public final class BigtableCloudMonitoringExporter implements MetricExporter {
9697

9798
private CompletableResultCode lastExportCode;
9899

100+
private final AtomicBoolean bigtableExportFailureLogged = new AtomicBoolean(false);
101+
private final AtomicBoolean applicationExportFailureLogged = new AtomicBoolean(false);
102+
99103
private static final ImmutableList<String> BIGTABLE_TABLE_METRICS =
100104
ImmutableSet.of(
101105
OPERATION_LATENCIES_NAME,
@@ -227,15 +231,24 @@ private CompletableResultCode exportBigtableResourceMetrics(Collection<MetricDat
227231
new ApiFutureCallback<Empty>() {
228232
@Override
229233
public void onFailure(Throwable throwable) {
230-
logger.log(
231-
Level.WARNING,
232-
"createServiceTimeSeries request failed for bigtable metrics. ",
233-
throwable);
234+
if (bigtableExportFailureLogged.compareAndSet(false, true)) {
235+
String msg = "createServiceTimeSeries request failed for bigtable metrics.";
236+
if (throwable instanceof PermissionDeniedException) {
237+
msg +=
238+
String.format(
239+
" Need monitoring metric writer permission on project=%s. Follow https://cloud.google.com/bigtable/docs/client-side-metrics-setup to set up permissions.",
240+
projectName.getProject());
241+
}
242+
logger.log(Level.WARNING, msg, throwable);
243+
}
234244
bigtableExportCode.fail();
235245
}
236246

237247
@Override
238248
public void onSuccess(Empty empty) {
249+
// When an export succeeded reset the export failure flag to false so if there's a
250+
// transient failure it'll be logged.
251+
bigtableExportFailureLogged.set(false);
239252
bigtableExportCode.succeed();
240253
}
241254
},
@@ -295,15 +308,24 @@ private CompletableResultCode exportApplicationResourceMetrics(
295308
new ApiFutureCallback<Empty>() {
296309
@Override
297310
public void onFailure(Throwable throwable) {
298-
logger.log(
299-
Level.WARNING,
300-
"createServiceTimeSeries request failed for per connection error metrics.",
301-
throwable);
311+
if (applicationExportFailureLogged.compareAndSet(false, true)) {
312+
String msg = "createServiceTimeSeries request failed for bigtable metrics.";
313+
if (throwable instanceof PermissionDeniedException) {
314+
msg +=
315+
String.format(
316+
" Need monitoring metric writer permission on project=%s. Follow https://cloud.google.com/bigtable/docs/client-side-metrics-setup to set up permissions.",
317+
projectName.getProject());
318+
}
319+
logger.log(Level.WARNING, msg, throwable);
320+
}
302321
exportCode.fail();
303322
}
304323

305324
@Override
306325
public void onSuccess(Empty empty) {
326+
// When an export succeeded reset the export failure flag to false so if there's a
327+
// transient failure it'll be logged.
328+
applicationExportFailureLogged.set(false);
307329
exportCode.succeed();
308330
}
309331
},

0 commit comments

Comments
 (0)