Repository navigation
Closed
Labels
api: loggingIssues related to the Cloud Logging API.Issues related to the Cloud Logging API.
Description
When using the LoggingHandler with logging turned up to FINE, it becomes re-entrant causing either an error or a stack overflow.
This appears due to the fact that classes used to implement LoggingHandler are themselves instrumented with Java Util Logging! Examples I have found are io.netty (first stack trace below)
and HttpURLConnection (second stack trace using a cut/paste of LoggingHandler to com.google.cloud.runtimes.jetty9.LoggingHandler as I'm working on Issue #1329
Nov 10, 2016 5:57:44 PM com.google.cloud.runtimes.jetty9.StackDriverLogging init
INFO: test info
Nov 10, 2016 5:57:45 PM io.netty.util.internal.logging.InternalLoggerFactory newDefaultFactory
FINE: Using java.util.logging as the default logging framework
Exception in thread "main" java.lang.ExceptionInInitializerError
at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:36)
at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:58)
at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:47)
at io.netty.channel.MultithreadEventLoopGroup.<init>(MultithreadEventLoopGroup.java:58)
at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:77)
at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:72)
at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:59)
at io.grpc.netty.Utils$DefaultEventLoopGroupResource.create(Utils.java:187)
at io.grpc.netty.Utils$DefaultEventLoopGroupResource.create(Utils.java:171)
at io.grpc.internal.SharedResourceHolder.getInternal(SharedResourceHolder.java:124)
at io.grpc.internal.SharedResourceHolder.get(SharedResourceHolder.java:94)
at io.grpc.netty.NettyChannelBuilder$NettyTransportFactory.<init>(NettyChannelBuilder.java:311)
at io.grpc.netty.NettyChannelBuilder$NettyTransportFactory.<init>(NettyChannelBuilder.java:280)
at io.grpc.netty.NettyChannelBuilder.buildTransportFactory(NettyChannelBuilder.java:230)
at io.grpc.internal.AbstractManagedChannelImplBuilder.build(AbstractManagedChannelImplBuilder.java:239)
at com.google.api.gax.grpc.ServiceApiSettings$Builder$3.getOrBuildChannel(ServiceApiSettings.java:349)
at com.google.cloud.logging.spi.v2.ConfigServiceV2Api.<init>(ConfigServiceV2Api.java:155)
at com.google.cloud.logging.spi.v2.ConfigServiceV2Api.create(ConfigServiceV2Api.java:145)
at com.google.cloud.logging.spi.DefaultLoggingRpc.<init>(DefaultLoggingRpc.java:140)
at com.google.cloud.logging.LoggingOptions$DefaultLoggingRpcFactory.create(LoggingOptions.java:68)
at com.google.cloud.logging.LoggingOptions$DefaultLoggingRpcFactory.create(LoggingOptions.java:62)
at com.google.cloud.ServiceOptions.getRpc(ServiceOptions.java:491)
at com.google.cloud.logging.LoggingImpl.<init>(LoggingImpl.java:96)
at com.google.cloud.logging.LoggingOptions$DefaultLoggingFactory.create(LoggingOptions.java:43)
at com.google.cloud.logging.LoggingOptions$DefaultLoggingFactory.create(LoggingOptions.java:38)
at com.google.cloud.ServiceOptions.getService(ServiceOptions.java:478)
at com.google.cloud.logging.LoggingHandler.getLogging(LoggingHandler.java:276)
at com.google.cloud.logging.LoggingHandler.write(LoggingHandler.java:351)
at com.google.cloud.logging.LoggingHandler.flush(LoggingHandler.java:357)
at com.google.cloud.logging.LoggingHandler.publish(LoggingHandler.java:292)
at java.util.logging.Logger.log(Logger.java:738)
at io.netty.util.internal.logging.JdkLogger.log(JdkLogger.java:606)
at io.netty.util.internal.logging.JdkLogger.debug(JdkLogger.java:186)
at io.netty.util.internal.logging.InternalLoggerFactory.newDefaultFactory(InternalLoggerFactory.java:62)
at io.netty.util.internal.logging.InternalLoggerFactory.<clinit>(InternalLoggerFactory.java:37)
at io.netty.channel.MultithreadEventLoopGroup.<clinit>(MultithreadEventLoopGroup.java:34)
at io.grpc.netty.Utils$DefaultEventLoopGroupResource.create(Utils.java:187)
at io.grpc.netty.Utils$DefaultEventLoopGroupResource.create(Utils.java:171)
at io.grpc.internal.SharedResourceHolder.getInternal(SharedResourceHolder.java:124)
at io.grpc.internal.SharedResourceHolder.get(SharedResourceHolder.java:94)
at io.grpc.netty.NettyChannelBuilder$NettyTransportFactory.<init>(NettyChannelBuilder.java:311)
at io.grpc.netty.NettyChannelBuilder$NettyTransportFactory.<init>(NettyChannelBuilder.java:280)
at io.grpc.netty.NettyChannelBuilder.buildTransportFactory(NettyChannelBuilder.java:230)
at io.grpc.internal.AbstractManagedChannelImplBuilder.build(AbstractManagedChannelImplBuilder.java:239)
at com.google.api.gax.grpc.ServiceApiSettings$Builder$3.getOrBuildChannel(ServiceApiSettings.java:349)
at com.google.cloud.logging.spi.v2.ConfigServiceV2Api.<init>(ConfigServiceV2Api.java:155)
at com.google.cloud.logging.spi.v2.ConfigServiceV2Api.create(ConfigServiceV2Api.java:145)
at com.google.cloud.logging.spi.DefaultLoggingRpc.<init>(DefaultLoggingRpc.java:140)
at com.google.cloud.logging.LoggingOptions$DefaultLoggingRpcFactory.create(LoggingOptions.java:68)
at com.google.cloud.logging.LoggingOptions$DefaultLoggingRpcFactory.create(LoggingOptions.java:62)
at com.google.cloud.ServiceOptions.getRpc(ServiceOptions.java:491)
at com.google.cloud.logging.LoggingImpl.<init>(LoggingImpl.java:96)
at com.google.cloud.logging.LoggingOptions$DefaultLoggingFactory.create(LoggingOptions.java:43)
at com.google.cloud.logging.LoggingOptions$DefaultLoggingFactory.create(LoggingOptions.java:38)
at com.google.cloud.ServiceOptions.getService(ServiceOptions.java:478)
at com.google.cloud.logging.LoggingHandler.getLogging(LoggingHandler.java:276)
at com.google.cloud.logging.LoggingHandler.write(LoggingHandler.java:351)
at com.google.cloud.logging.LoggingHandler.flush(LoggingHandler.java:357)
at com.google.cloud.logging.LoggingHandler.publish(LoggingHandler.java:292)
at java.util.logging.Logger.log(Logger.java:738)
at java.util.logging.Logger.doLog(Logger.java:765)
at java.util.logging.Logger.log(Logger.java:788)
at java.util.logging.Logger.info(Logger.java:1489)
at com.google.cloud.runtimes.jetty9.StackDriverLogging.init(StackDriverLogging.java:37)
at com.google.cloud.runtimes.jetty9.StackDriverLogging.main(StackDriverLogging.java:47)
Caused by: java.lang.NullPointerException
at io.netty.util.internal.logging.InternalLoggerFactory.getInstance(InternalLoggerFactory.java:97)
at io.netty.util.internal.logging.InternalLoggerFactory.getInstance(InternalLoggerFactory.java:90)
at io.netty.util.concurrent.DefaultPromise.<clinit>(DefaultPromise.java:35)
... 65 more
Exception in thread "main" java.lang.StackOverflowError
at java.security.AccessController.doPrivileged(Native Method)
at sun.security.jca.ProviderConfig.doLoadProvider(ProviderConfig.java:206)
at sun.security.jca.ProviderConfig.getProvider(ProviderConfig.java:187)
at sun.security.jca.ProviderList.getProvider(ProviderList.java:233)
at sun.security.jca.ProviderList$ServiceList.tryGet(ProviderList.java:434)
at sun.security.jca.ProviderList$ServiceList.access$200(ProviderList.java:376)
at sun.security.jca.ProviderList$ServiceList$1.hasNext(ProviderList.java:486)
at java.security.Signature$Delegate.chooseProvider(Signature.java:1094)
at java.security.Signature$Delegate.engineInitSign(Signature.java:1176)
at java.security.Signature.initSign(Signature.java:527)
at com.google.api.client.util.SecurityUtils.sign(SecurityUtils.java:145)
at com.google.api.client.json.webtoken.JsonWebSignature.signUsingRsaSha256(JsonWebSignature.java:637)
at com.google.auth.oauth2.ServiceAccountCredentials.refreshAccessToken(ServiceAccountCredentials.java:208)
at com.google.auth.oauth2.OAuth2Credentials.refresh(OAuth2Credentials.java:97)
at com.google.auth.oauth2.OAuth2Credentials.getRequestMetadata(OAuth2Credentials.java:74)
at io.grpc.auth.ClientAuthInterceptor.getRequestMetadata(ClientAuthInterceptor.java:150)
at io.grpc.auth.ClientAuthInterceptor.access$100(ClientAuthInterceptor.java:64)
at io.grpc.auth.ClientAuthInterceptor$1.checkedStart(ClientAuthInterceptor.java:96)
at io.grpc.ClientInterceptors$CheckedForwardingClientCall.start(ClientInterceptors.java:195)
at io.grpc.ForwardingClientCall.start(ForwardingClientCall.java:47)
at com.google.api.gax.grpc.HeaderInterceptor$1.start(HeaderInterceptor.java:64)
at io.grpc.stub.ClientCalls.startCall(ClientCalls.java:273)
at io.grpc.stub.ClientCalls.asyncUnaryRequestCall(ClientCalls.java:252)
at io.grpc.stub.ClientCalls.futureUnaryCall(ClientCalls.java:189)
at com.google.api.gax.grpc.DirectCallable.futureCall(DirectCallable.java:58)
at com.google.api.gax.grpc.ExceptionTransformingCallable.futureCall(ExceptionTransformingCallable.java:66)
at com.google.api.gax.grpc.RetryingCallable$RetryingResultFuture.issueCall(RetryingCallable.java:222)
at com.google.api.gax.grpc.RetryingCallable.futureCall(RetryingCallable.java:90)
at com.google.api.gax.grpc.UnaryCallable.futureCall(UnaryCallable.java:242)
at com.google.api.gax.grpc.UnaryCallable.futureCall(UnaryCallable.java:253)
at com.google.cloud.logging.spi.DefaultLoggingRpc.write(DefaultLoggingRpc.java:199)
at com.google.cloud.logging.LoggingImpl.writeAsync(LoggingImpl.java:503)
at com.google.cloud.runtimes.jetty9.AsyncLoggingHandler.write(AsyncLoggingHandler.java:101)
at com.google.cloud.runtimes.jetty9.LoggingHandler.flush(LoggingHandler.java:365)
at com.google.cloud.runtimes.jetty9.LoggingHandler.publish(LoggingHandler.java:298)
at java.util.logging.Logger.log(Logger.java:738)
at java.util.logging.Logger.doLog(Logger.java:765)
at java.util.logging.Logger.log(Logger.java:788)
at java.util.logging.LoggingProxyImpl.log(LoggingProxyImpl.java:61)
at sun.util.logging.LoggingSupport.log(LoggingSupport.java:120)
at sun.util.logging.PlatformLogger$JavaLoggerProxy.doLog(PlatformLogger.java:610)
at sun.util.logging.PlatformLogger.fine(PlatformLogger.java:364)
at sun.net.www.protocol.http.HttpURLConnection.writeRequests(HttpURLConnection.java:658)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1293)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1258)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250)
at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:77)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:972)
at com.google.auth.oauth2.ServiceAccountCredentials.refreshAccessToken(ServiceAccountCredentials.java:225)
at com.google.auth.oauth2.OAuth2Credentials.refresh(OAuth2Credentials.java:97)
at com.google.auth.oauth2.OAuth2Credentials.getRequestMetadata(OAuth2Credentials.java:74)
at io.grpc.auth.ClientAuthInterceptor.getRequestMetadata(ClientAuthInterceptor.java:150)
at io.grpc.auth.ClientAuthInterceptor.access$100(ClientAuthInterceptor.java:64)
at io.grpc.auth.ClientAuthInterceptor$1.checkedStart(ClientAuthInterceptor.java:96)
at io.grpc.ClientInterceptors$CheckedForwardingClientCall.start(ClientInterceptors.java:195)
at io.grpc.ForwardingClientCall.start(ForwardingClientCall.java:47)
at com.google.api.gax.grpc.HeaderInterceptor$1.start(HeaderInterceptor.java:64)
at io.grpc.stub.ClientCalls.startCall(ClientCalls.java:273)
at io.grpc.stub.ClientCalls.asyncUnaryRequestCall(ClientCalls.java:252)
at io.grpc.stub.ClientCalls.futureUnaryCall(ClientCalls.java:189)
at com.google.api.gax.grpc.DirectCallable.futureCall(DirectCallable.java:58)
at com.google.api.gax.grpc.ExceptionTransformingCallable.futureCall(ExceptionTransformingCallable.java:66)
...
at com.google.api.gax.grpc.RetryingCallable$RetryingResultFuture.issueCall(RetryingCallable.java:222)
at com.google.api.gax.grpc.RetryingCallable.futureCall(RetryingCallable.java:90)
at com.google.api.gax.grpc.UnaryCallable.futureCall(UnaryCallable.java:242)
at com.google.api.gax.grpc.UnaryCallable.futureCall(UnaryCallable.java:253)
at com.google.cloud.logging.spi.DefaultLoggingRpc.write(DefaultLoggingRpc.java:199)
at com.google.cloud.logging.LoggingImpl.writeAsync(LoggingImpl.java:503)
at com.google.cloud.runtimes.jetty9.AsyncLoggingHandler.write(AsyncLoggingHandler.java:101)
at com.google.cloud.runtimes.jetty9.LoggingHandler.flush(LoggingHandler.java:365)
at com.google.cloud.runtimes.jetty9.LoggingHandler.publish(LoggingHandler.java:298)
at java.util.logging.Logger.log(Logger.java:738)
at java.util.logging.Logger.doLog(Logger.java:765)
at java.util.logging.Logger.log(Logger.java:788)
at java.util.logging.LoggingProxyImpl.log(LoggingProxyImpl.java:61)
at sun.util.logging.LoggingSupport.log(LoggingSupport.java:120)
at sun.util.logging.PlatformLogger$JavaLoggerProxy.doLog(PlatformLogger.java:610)
at sun.util.logging.PlatformLogger.fine(PlatformLogger.java:364)
at sun.net.www.protocol.http.HttpURLConnection.writeRequests(HttpURLConnection.java:658)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1293)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1258)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250)
at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:77)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:972)
at com.google.auth.oauth2.ServiceAccountCredentials.refreshAccessToken(ServiceAccountCredentials.java:225)
at com.google.auth.oauth2.OAuth2Credentials.refresh(OAuth2Credentials.java:97)
at com.google.auth.oauth2.OAuth2Credentials.getRequestMetadata(OAuth2Credentials.java:74)
at io.grpc.auth.ClientAuthInterceptor.getRequestMetadata(ClientAuthInterceptor.java:150)
at io.grpc.auth.ClientAuthInterceptor.access$100(ClientAuthInterceptor.java:64)
at io.grpc.auth.ClientAuthInterceptor$1.checkedStart(ClientAuthInterceptor.java:96)
at io.grpc.ClientInterceptors$CheckedForwardingClientCall.start(ClientInterceptors.java:195)
at io.grpc.ForwardingClientCall.start(ForwardingClientCall.java:47)
at com.google.api.gax.grpc.HeaderInterceptor$1.start(HeaderInterceptor.java:64)
at io.grpc.stub.ClientCalls.startCall(ClientCalls.java:273)
at io.grpc.stub.ClientCalls.asyncUnaryRequestCall(ClientCalls.java:252)
at io.grpc.stub.ClientCalls.futureUnaryCall(ClientCalls.java:189)
at com.google.api.gax.grpc.DirectCallable.futureCall(DirectCallable.java:58)
at com.google.api.gax.grpc.ExceptionTransformingCallable.futureCall(ExceptionTransformingCallable.java:66)
at com.google.api.gax.grpc.RetryingCallable$RetryingResultFuture.issueCall(RetryingCallable.java:222)
at com.google.api.gax.grpc.RetryingCallable.futureCall(RetryingCallable.java:90)
at com.google.api.gax.grpc.UnaryCallable.futureCall(UnaryCallable.java:242)
at com.google.api.gax.grpc.UnaryCallable.futureCall(UnaryCallable.java:253)
at com.google.cloud.logging.spi.DefaultLoggingRpc.write(DefaultLoggingRpc.java:199)
at com.google.cloud.logging.LoggingImpl.writeAsync(LoggingImpl.java:503)
at com.google.cloud.runtimes.jetty9.AsyncLoggingHandler.write(AsyncLoggingHandler.java:101)
at com.google.cloud.runtimes.jetty9.LoggingHandler.flush(LoggingHandler.java:365)
at com.google.cloud.runtimes.jetty9.LoggingHandler.publish(LoggingHandler.java:298)
at java.util.logging.Logger.log(Logger.java:738)
at java.util.logging.Logger.doLog(Logger.java:765)
at java.util.logging.Logger.log(Logger.java:788)
at java.util.logging.LoggingProxyImpl.log(LoggingProxyImpl.java:61)
at sun.util.logging.LoggingSupport.log(LoggingSupport.java:120)
at sun.util.logging.PlatformLogger$JavaLoggerProxy.doLog(PlatformLogger.java:610)
at sun.util.logging.PlatformLogger.fine(PlatformLogger.java:364)
at sun.net.www.protocol.http.HttpURLConnection.writeRequests(HttpURLConnection.java:658)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1293)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1258)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250)
at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:77)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:972)
at com.google.auth.oauth2.ServiceAccountCredentials.refreshAccessToken(ServiceAccountCredentials.java:225)
at com.google.auth.oauth2.OAuth2Credentials.refresh(OAuth2Credentials.java:97)
at com.google.auth.oauth2.OAuth2Credentials.getRequestMetadata(OAuth2Credentials.java:74)
at io.grpc.auth.ClientAuthInterceptor.getRequestMetadata(ClientAuthInterceptor.java:150)
Metadata
Metadata
Assignees
Labels
api: loggingIssues related to the Cloud Logging API.Issues related to the Cloud Logging API.
Activity
mziccard commentedon Nov 10, 2016
How are you registering the logging handler?
We are aware of this and documented this behavior in our javadoc. To overcome this issue you should register the handler either using
logging.propertiesorLoggingHandler.addHandler(Logger, LoggingHandler).gregw commentedon Nov 10, 2016
@mziccard The first of those example did incorrectly use addHandler. When I modify to use the static addHandler, that fixes the NPE in initialization, but I still get a stack overflow when actually logging at FINE.
I setup with a combination of logging.properties:
and then code that creates a LoggingHandler with specific JSON auth file:
This code results in a stack overflow exception, with the following repeated part:
and the console log issue the repeated log:
My second example above is initialized entirely in a logging.properties file, but it uses a cut/paste/extended version of LoggingHandler that does the JSON auth initialization in the constructor and has some extra code in
entryForto add a traceid. I don't think my changes are relevant to this problem, but I created the first example just to see if I could reproduce with the standardLoggingHandlermziccard commentedon Nov 10, 2016
I am not able to reproduce. I tried the following code:
With the following
logging.properties:I have the
GOOGLE_APPLICATION_CREDENTIALSset so my credentials are being loaded from file as in your example. The code works fine, entries are written to Logging and I get the following output:gregw commentedon Nov 10, 2016
@mziccard I switched to your exact version of the code and moved my credentials to GOOGLE_APPLICATION_CREDENTIALS. I still get the infinite recursion?!?!
I also tried passing in null for the options, to allow the internals to get the default instance and I get the same result.
I'm using the 0.5.1 release.
could it be something about my credentials? I can send them to you privately (they are just for a google test project) if you think it worth trying them?
gregw commentedon Nov 10, 2016
@mbrukman I've simplified my test even more. I now just setup logging in logging.properties:
and my test code is just:
which gets the following stack overflow (added in full just in case the top or the bottom has something meaningful to you I just edited to take out most of the repeats]):
gregw commentedon Nov 10, 2016
I modified the code to printout the state of the loggers:
which produced:
So the masking of the loggers looks to have worked as
sun.net.www.protocol.httphas use parent set to false??? I wonder if it is something to do with the LoggingProxyImpl???mziccard commentedon Nov 11, 2016
@gregw great, this is what I was about to suggest you to do. You are right, it seems that the masking is working just fine. In fact, if I run an analogous example I get the same output (set aside class names) and no recursion:
This is really confusing. How are you running the app? Play java? Which version?
gregw commentedon Nov 11, 2016
I'm currently running from within eclipse IDE using java 1.8.0_40. There is definitely something fishy as if I modify the test to do:
The first log line is correctly masked and does not go infinite, but the second one does???
Let me try running from command line....
gregw commentedon Nov 11, 2016
Command line gives me same problem:
gregw commentedon Nov 11, 2016
I upgraded to java 1.8.0_77
Modified test code to be:
and if fails running from command line on the some.random.log:
my complete classpath is:
with my classes in
./jetty9-base-0.1.0-SNAPSHOT.jarmeltsufin commentedon Nov 16, 2016
@gregw I'm unable to reproduce this either. Are you using OpenJDK? Can you create a minimal maven project that reproduces this problem and share it on your GitHub account?
gregw commentedon Nov 16, 2016
I'm using openJDK build 1.8.0_77-b03.
I'll build a mvn project to reproduce shortly.
gregw commentedon Nov 17, 2016
@meltsufin I've created a reproduction in a small project. Because it includes credentials, I have not attached it here but posted it a private channel.
You can build it with:
And run it from the command line with:
The recursive logs appear in n the jetty9-work log console
The output I get is:
gregw commentedon Nov 17, 2016
Note also that I just deployed a LoggingHandler in the gcloud flex environment, with logging only at INFO and observed a similar loop on start up:
Note this is using my copy/paste/modify of
LoggingHandler#1329.29 remaining items
chore(deps): update dependency com.google.cloud:google-cloud-bigquery…
deps: update dependency com.google.cloud:google-cloud-bigquery to v2.…
chore(main): release 3.7.1 (googleapis#1394)
ci: javadoc job (JDK 17) in ci.yaml (#1819) (#1386)
chore(main): release 0.131.15-alpha-SNAPSHOT (#1386)
chore(main): release 2.19.1-SNAPSHOT (#1386)
ci: javadoc job (JDK 17) in ci.yaml (googleapis#1819) (googleapis#1386)
deps: update dependency com.google.cloud:google-cloud-spanner-bom to …
chore(main): release 2.14.0 (googleapis#1387)
deps: update dependency com.google.cloud:sdk-platform-java-config to …
deps: update dependency com.google.cloud:sdk-platform-java-config to …
deps: update dependency com.google.cloud:google-cloud-monitoring-bom …
chore(main): release 2.12.0 (googleapis#1396)