|
34 | 34 | import com.google.api.gax.core.CredentialsProvider; |
35 | 35 | import com.google.api.gax.core.FixedCredentialsProvider; |
36 | 36 | import com.google.api.gax.core.NoCredentialsProvider; |
| 37 | +import com.google.api.gax.rpc.PermissionDeniedException; |
37 | 38 | import com.google.auth.Credentials; |
38 | 39 | import com.google.cloud.monitoring.v3.MetricServiceClient; |
39 | 40 | import com.google.cloud.monitoring.v3.MetricServiceSettings; |
@@ -96,6 +97,9 @@ public final class BigtableCloudMonitoringExporter implements MetricExporter { |
96 | 97 |
|
97 | 98 | private CompletableResultCode lastExportCode; |
98 | 99 |
|
| 100 | + private final AtomicBoolean bigtableExportFailureLogged = new AtomicBoolean(false); |
| 101 | + private final AtomicBoolean applicationExportFailureLogged = new AtomicBoolean(false); |
| 102 | + |
99 | 103 | private static final ImmutableList<String> BIGTABLE_TABLE_METRICS = |
100 | 104 | ImmutableSet.of( |
101 | 105 | OPERATION_LATENCIES_NAME, |
@@ -227,15 +231,24 @@ private CompletableResultCode exportBigtableResourceMetrics(Collection<MetricDat |
227 | 231 | new ApiFutureCallback<Empty>() { |
228 | 232 | @Override |
229 | 233 | 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 | + } |
234 | 244 | bigtableExportCode.fail(); |
235 | 245 | } |
236 | 246 |
|
237 | 247 | @Override |
238 | 248 | 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); |
239 | 252 | bigtableExportCode.succeed(); |
240 | 253 | } |
241 | 254 | }, |
@@ -295,15 +308,24 @@ private CompletableResultCode exportApplicationResourceMetrics( |
295 | 308 | new ApiFutureCallback<Empty>() { |
296 | 309 | @Override |
297 | 310 | 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 | + } |
302 | 321 | exportCode.fail(); |
303 | 322 | } |
304 | 323 |
|
305 | 324 | @Override |
306 | 325 | 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); |
307 | 329 | exportCode.succeed(); |
308 | 330 | } |
309 | 331 | }, |
|
0 commit comments