This is an automated email from the ASF dual-hosted git repository. sanpwc pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push: new 339c677008 IGNITE-21124 Add ability to log long message processing (#2979) 339c677008 is described below commit 339c677008939dcb4f86e0b5aff4139c5b3fd4a2 Author: Alexander Lapin <lapin1...@gmail.com> AuthorDate: Wed Dec 20 12:26:39 2023 +0200 IGNITE-21124 Add ability to log long message processing (#2979) --- .../ignite/network/AbstractMessagingService.java | 6 +- .../network/TrackableNetworkMessageHandler.java | 65 ++++++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/modules/network-api/src/main/java/org/apache/ignite/network/AbstractMessagingService.java b/modules/network-api/src/main/java/org/apache/ignite/network/AbstractMessagingService.java index 5d2e9abf06..e1822c8d2b 100644 --- a/modules/network-api/src/main/java/org/apache/ignite/network/AbstractMessagingService.java +++ b/modules/network-api/src/main/java/org/apache/ignite/network/AbstractMessagingService.java @@ -55,9 +55,11 @@ public abstract class AbstractMessagingService implements MessagingService { /** {@inheritDoc} */ @Override public void addMessageHandler(Class<?> messageGroup, NetworkMessageHandler handler) { + NetworkMessageHandler trackableHandler = new TrackableNetworkMessageHandler(handler); + handlersByGroupType.getAndUpdate(getMessageGroupType(messageGroup), oldHandler -> { if (oldHandler == null) { - return new Handler(messageGroup, List.of(handler)); + return new Handler(messageGroup, List.of(trackableHandler)); } if (oldHandler.messageGroup != messageGroup) { @@ -71,7 +73,7 @@ public abstract class AbstractMessagingService implements MessagingService { var handlers = new ArrayList<NetworkMessageHandler>(oldHandler.handlers.size() + 1); handlers.addAll(oldHandler.handlers); - handlers.add(handler); + handlers.add(trackableHandler); return new Handler(messageGroup, handlers); }); diff --git a/modules/network-api/src/main/java/org/apache/ignite/network/TrackableNetworkMessageHandler.java b/modules/network-api/src/main/java/org/apache/ignite/network/TrackableNetworkMessageHandler.java new file mode 100644 index 0000000000..07dbdaae84 --- /dev/null +++ b/modules/network-api/src/main/java/org/apache/ignite/network/TrackableNetworkMessageHandler.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.network; + +import static org.apache.ignite.internal.tostring.IgniteToStringBuilder.includeSensitive; + +import java.util.concurrent.TimeUnit; +import org.apache.ignite.internal.logger.IgniteLogger; +import org.apache.ignite.internal.logger.Loggers; +import org.jetbrains.annotations.Nullable; + +/** + * Trackable message handler that will log long-running messages. + */ +public class TrackableNetworkMessageHandler implements NetworkMessageHandler { + private static final IgniteLogger LOG = Loggers.forClass(TrackableNetworkMessageHandler.class); + + /** + * If message handling takes more time, than this constant, we will log warning message with some information. + */ + private static final int MESSAGING_PROCESSING_LOG_THRESHOLD_MILLIS = 5; + + private final NetworkMessageHandler targetHandler; + + TrackableNetworkMessageHandler(NetworkMessageHandler targetHandler) { + this.targetHandler = targetHandler; + } + + @Override + public void onReceived(NetworkMessage message, String senderConsistentId, @Nullable Long correlationId) { + long startTimeNanos = System.nanoTime(); + + targetHandler.onReceived(message, senderConsistentId, correlationId); + + maybeLogLongProcessing(message, startTimeNanos); + } + + private static void maybeLogLongProcessing(NetworkMessage message, long startTimeNanos) { + long durationMillis = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTimeNanos); + + if (durationMillis > MESSAGING_PROCESSING_LOG_THRESHOLD_MILLIS) { + LOG.warn( + "Message handling has been too long [duration={}ms, message=[{}]]", + durationMillis, + // Message may include sensitive data, however it seems useful to print full message content while testing. + includeSensitive() ? message : message.getClass() + ); + } + } +}