rh-messaging / artemis-prometheus-metrics-plugin

Apache License 2.0
22 stars 20 forks source link

Error in metrics-plugin on Colocated configuration #8

Closed jegutierrezl closed 2 years ago

jegutierrezl commented 2 years ago

Hi, i have a issue with metric plugin in clustered environment, when Cluster try send node configurarion have a NotSerializable Exception:

[org.apache.activemq.artemis.core.server] AMQ222261: Failed to activate a backup: java.security.PrivilegedActionException: java.io.NotSerializableException: io.micrometer.prometheus.PrometheusMeterRegistry
        at java.base/java.security.AccessController.doPrivileged(Native Method) [java.base:]
        at org.apache.activemq.artemis.core.config.impl.ConfigurationImpl.copy(ConfigurationImpl.java:2328) [artemis-server-2.19.0.jar:2.19.0]
        at org.apache.activemq.artemis.core.server.cluster.ha.ColocatedHAManager.activateReplicatedBackup(ColocatedHAManager.java:186) [artemis-server-2.19.0.jar:2.19.0]
        at org.apache.activemq.artemis.core.server.cluster.ha.ColocatedHAManager.activateBackup(ColocatedHAManager.java:99) [artemis-server-2.19.0.jar:2.19.0]
        at org.apache.activemq.artemis.core.server.impl.ColocatedActivation$1.handlePacket(ColocatedActivation.java:127) [artemis-server-2.19.0.jar:2.19.0]
        at org.apache.activemq.artemis.core.server.cluster.ClusterController$ClusterControllerChannelHandler.handlePacket(ClusterController.java:469) [artemis-server-2.19.0.jar:2.19.0]
        at org.apache.activemq.artemis.core.protocol.core.impl.ChannelImpl.handlePacket(ChannelImpl.java:820) [artemis-core-client-2.19.0.jar:2.19.0]
        at org.apache.activemq.artemis.core.protocol.core.impl.RemotingConnectionImpl.doBufferReceived(RemotingConnectionImpl.java:428) [artemis-core-client-2.19.0.jar:2.19.0]
        at org.apache.activemq.artemis.core.protocol.core.impl.RemotingConnectionImpl.bufferReceived(RemotingConnectionImpl.java:396) [artemis-core-client-2.19.0.jar:2.19.0]
        at org.apache.activemq.artemis.core.remoting.server.impl.RemotingServiceImpl$DelegatingBufferHandler.bufferReceived(RemotingServiceImpl.java:688) [artemis-server-2.19.0.jar:2.19.0]
        at org.apache.activemq.artemis.core.remoting.impl.netty.ActiveMQChannelHandler.channelRead(ActiveMQChannelHandler.java:73) [artemis-core-client-2.19.0.jar:2.19.0]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-all-4.1.68.Final.jar:4.1.68.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-all-4.1.68.Final.jar:4.1.68.Final]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) [netty-all-4.1.68.Final.jar:4.1.68.Final]
        at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324) [netty-all-4.1.68.Final.jar:4.1.68.Final]
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296) [netty-all-4.1.68.Final.jar:4.1.68.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-all-4.1.68.Final.jar:4.1.68.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-all-4.1.68.Final.jar:4.1.68.Final]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) [netty-all-4.1.68.Final.jar:4.1.68.Final]
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) [netty-all-4.1.68.Final.jar:4.1.68.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-all-4.1.68.Final.jar:4.1.68.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-all-4.1.68.Final.jar:4.1.68.Final]
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) [netty-all-4.1.68.Final.jar:4.1.68.Final]
        at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:795) [netty-all-4.1.68.Final.jar:4.1.68.Final]
        at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:480) [netty-all-4.1.68.Final.jar:4.1.68.Final]
        at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:378) [netty-all-4.1.68.Final.jar:4.1.68.Final]
        at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986) [netty-all-4.1.68.Final.jar:4.1.68.Final]
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) [netty-all-4.1.68.Final.jar:4.1.68.Final]
        at org.apache.activemq.artemis.utils.ActiveMQThreadFactory$1.run(ActiveMQThreadFactory.java:118) [artemis-commons-2.19.0.jar:2.19.0]
Caused by: java.io.NotSerializableException: io.micrometer.prometheus.PrometheusMeterRegistry
        at java.base/java.io.ObjectOutputStream.writeObject0(Unknown Source) [java.base:]
        at java.base/java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) [java.base:]
        at java.base/java.io.ObjectOutputStream.writeSerialData(Unknown Source) [java.base:]
        at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) [java.base:]
        at java.base/java.io.ObjectOutputStream.writeObject0(Unknown Source) [java.base:]
        at java.base/java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) [java.base:]
        at java.base/java.io.ObjectOutputStream.writeSerialData(Unknown Source) [java.base:]
        at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) [java.base:]
        at java.base/java.io.ObjectOutputStream.writeObject0(Unknown Source) [java.base:]
        at java.base/java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) [java.base:]
        at java.base/java.io.ObjectOutputStream.writeSerialData(Unknown Source) [java.base:]
        at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) [java.base:]
        at java.base/java.io.ObjectOutputStream.writeObject0(Unknown Source) [java.base:]
        at java.base/java.io.ObjectOutputStream.writeObject(Unknown Source) [java.base:]
        at org.apache.activemq.artemis.core.config.impl.ConfigurationImpl$1.run(ConfigurationImpl.java:2333) [artemis-server-2.19.0.jar:2.19.0]
        at org.apache.activemq.artemis.core.config.impl.ConfigurationImpl$1.run(ConfigurationImpl.java:2328) [artemis-server-2.19.0.jar:2.19.0]
brusdev commented 2 years ago

The issue is due to the serialization of ArtemisPrometheusMetricsPlugin during the copy of ConfigurationImpl. The ConfigurationImpl should not serialize the ArtemisPrometheusMetricsPlugin but copy its reference as it is doing for BroadcastGroupConfigurations, see https://github.com/apache/activemq-artemis/blob/2.19.0/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java#L2340

You should create an issue for ActiveMQ Artemis https://issues.apache.org/jira/projects/ARTEMIS/issues