diff options
author | Daniel Cruz <dc443y@att.com> | 2019-03-06 10:45:09 -0600 |
---|---|---|
committer | Daniel Cruz <dc443y@att.com> | 2019-03-13 12:11:55 -0500 |
commit | 57a44626324326fc3b29042398d2ccdaec5a7758 (patch) | |
tree | 1b26cdc89743306b337d0a22c7820effd5272d5b /policy-endpoints/src/main | |
parent | 5bee2c177fb15cad0ed3f78d5df999dac62da6a7 (diff) |
Add Network Logging Feature
This is part 1 of introducing the mdc filter feature. Network
logging has to have interception points in order to pre/post
process messages coming in from a network endpoint.
The OrderedService interface and OrderedServiceImpl of the
drools-pdp project have now been migrated to common but is
also left in drools-pdp to mitigate disruption to existing
features. However for features that need to use common's
OrderedServiceImpl and drools-pdp version of OrderedServiceImpl
there will be a conflict with getSequenceNumber(). So a migration
of the other features is suggested.
Network logging is moved to its own util class so that feature
hooks can be invoked any time an event is being logged by a
network logger. This util class will also be accessible to
drools-applications in the case where drools-applications
would like to invoke network logging features for REST events.
Change-Id: I83d7c46e5abb351486f841c3be4d9009f7992476
Issue-ID: POLICY-1499
Signed-off-by: Daniel Cruz <dc443y@att.com>
Diffstat (limited to 'policy-endpoints/src/main')
7 files changed, 236 insertions, 26 deletions
diff --git a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/NoopTopicEndpoint.java b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/NoopTopicEndpoint.java index a2ad4d3d..ef002f52 100644 --- a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/NoopTopicEndpoint.java +++ b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/NoopTopicEndpoint.java @@ -23,7 +23,8 @@ package org.onap.policy.common.endpoints.event.comm.bus; import java.util.List; import org.onap.policy.common.endpoints.event.comm.bus.internal.TopicBase; -import org.onap.policy.common.utils.slf4j.LoggerFactoryWrapper; +import org.onap.policy.common.endpoints.utils.NetLoggerUtil; +import org.onap.policy.common.endpoints.utils.NetLoggerUtil.EventType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,11 +39,6 @@ public abstract class NoopTopicEndpoint extends TopicBase { private static Logger logger = LoggerFactory.getLogger(NoopTopicEndpoint.class); /** - * Network logger. - */ - private static final Logger netLogger = LoggerFactoryWrapper.getNetworkLogger(); - - /** * {@inheritDoc}. */ public NoopTopicEndpoint(List<String> servers, String topic) { @@ -52,10 +48,11 @@ public abstract class NoopTopicEndpoint extends TopicBase { /** * I/O. * + * @param type "IN" or "OUT". * @param message message. - * @return true if sucessful. + * @return true if successful. */ - protected boolean io(String message) { + protected boolean io(EventType type, String message) { if (message == null || message.isEmpty()) { throw new IllegalArgumentException("Message is empty"); @@ -70,8 +67,7 @@ public abstract class NoopTopicEndpoint extends TopicBase { this.recentEvents.add(message); } - netLogger.info("[OUT|{}|{}]{}{}", this.getTopicCommInfrastructure(), this.topic, System.lineSeparator(), - message); + NetLoggerUtil.log(type, this.getTopicCommInfrastructure(), this.topic, message); broadcast(message); } catch (Exception e) { diff --git a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/NoopTopicSink.java b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/NoopTopicSink.java index f6ad433d..d3745940 100644 --- a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/NoopTopicSink.java +++ b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/NoopTopicSink.java @@ -7,9 +7,9 @@ * Licensed 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. @@ -22,6 +22,7 @@ package org.onap.policy.common.endpoints.event.comm.bus; import java.util.List; import org.onap.policy.common.endpoints.event.comm.TopicSink; +import org.onap.policy.common.endpoints.utils.NetLoggerUtil.EventType; /** * No Operation Topic Sink. @@ -45,7 +46,7 @@ public class NoopTopicSink extends NoopTopicEndpoint implements TopicSink { */ @Override public boolean send(String message) { - return super.io(message); + return super.io(EventType.OUT, message); } /** diff --git a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/NoopTopicSource.java b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/NoopTopicSource.java index c3215e04..95ed0fe6 100644 --- a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/NoopTopicSource.java +++ b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/NoopTopicSource.java @@ -22,6 +22,7 @@ package org.onap.policy.common.endpoints.event.comm.bus; import java.util.List; import org.onap.policy.common.endpoints.event.comm.TopicSource; +import org.onap.policy.common.endpoints.utils.NetLoggerUtil.EventType; /** * No Operation Topic Source. @@ -45,7 +46,7 @@ public class NoopTopicSource extends NoopTopicEndpoint implements TopicSource { */ @Override public boolean offer(String event) { - return super.io(event); + return super.io(EventType.IN, event); } /** diff --git a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/InlineBusTopicSink.java b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/InlineBusTopicSink.java index d6ca824e..e94bdffa 100644 --- a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/InlineBusTopicSink.java +++ b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/InlineBusTopicSink.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * policy-endpoints * ================================================================================ - * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved. * Modifications Copyright (C) 2018-2019 Samsung Electronics Co., Ltd. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,7 +24,8 @@ package org.onap.policy.common.endpoints.event.comm.bus.internal; import java.util.UUID; import org.onap.policy.common.endpoints.event.comm.bus.BusTopicSink; -import org.onap.policy.common.utils.slf4j.LoggerFactoryWrapper; +import org.onap.policy.common.endpoints.utils.NetLoggerUtil; +import org.onap.policy.common.endpoints.utils.NetLoggerUtil.EventType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,7 +40,6 @@ public abstract class InlineBusTopicSink extends BusTopicBase implements BusTopi * Loggers. */ private static Logger logger = LoggerFactory.getLogger(InlineBusTopicSink.class); - private static final Logger netLogger = LoggerFactoryWrapper.getNetworkLogger(); /** * The partition key to publish to. @@ -140,8 +140,7 @@ public abstract class InlineBusTopicSink extends BusTopicBase implements BusTopi this.recentEvents.add(message); } - netLogger.info("[OUT|{}|{}]{}{}", this.getTopicCommInfrastructure(), this.topic, System.lineSeparator(), - message); + NetLoggerUtil.log(EventType.OUT, this.getTopicCommInfrastructure(), this.topic, message); publisher.send(this.partitionId, message); broadcast(message); diff --git a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/SingleThreadedBusTopicSource.java b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/SingleThreadedBusTopicSource.java index 83f3760b..98e30e27 100644 --- a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/SingleThreadedBusTopicSource.java +++ b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/SingleThreadedBusTopicSource.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * policy-endpoints * ================================================================================ - * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved. * Modifications Copyright (C) 2018-2019 Samsung Electronics Co., Ltd. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); @@ -28,8 +28,9 @@ import org.onap.policy.common.endpoints.event.comm.FilterableTopicSource; import org.onap.policy.common.endpoints.event.comm.TopicListener; import org.onap.policy.common.endpoints.event.comm.bus.BusTopicSource; import org.onap.policy.common.endpoints.event.comm.bus.internal.BusConsumer.FilterableBusConsumer; +import org.onap.policy.common.endpoints.utils.NetLoggerUtil; +import org.onap.policy.common.endpoints.utils.NetLoggerUtil.EventType; import org.onap.policy.common.utils.network.NetworkUtil; -import org.onap.policy.common.utils.slf4j.LoggerFactoryWrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,7 +46,6 @@ public abstract class SingleThreadedBusTopicSource extends BusTopicBase * that in a single file in a concise format. */ private static Logger logger = LoggerFactory.getLogger(InlineBusTopicSink.class); - private static final Logger netLogger = LoggerFactoryWrapper.getNetworkLogger(); /** * Bus consumer group. @@ -228,8 +228,7 @@ public abstract class SingleThreadedBusTopicSource extends BusTopicBase this.recentEvents.add(event); } - netLogger.info("[IN|{}|{}]{}{}", this.getTopicCommInfrastructure(), this.topic, - System.lineSeparator(), event); + NetLoggerUtil.log(EventType.IN, this.getTopicCommInfrastructure(), this.topic, event); broadcast(event); @@ -255,8 +254,7 @@ public abstract class SingleThreadedBusTopicSource extends BusTopicBase this.recentEvents.add(event); } - netLogger.info("[IN|{}|{}]{}{}", this.getTopicCommInfrastructure(), this.topic, System.lineSeparator(), event); - + NetLoggerUtil.log(EventType.IN, this.getTopicCommInfrastructure(), this.topic, event); return broadcast(event); } diff --git a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/features/NetLoggerFeatureApi.java b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/features/NetLoggerFeatureApi.java new file mode 100644 index 00000000..4e7d4444 --- /dev/null +++ b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/features/NetLoggerFeatureApi.java @@ -0,0 +1,62 @@ +/* + * ============LICENSE_START======================================================= + * policy-endpoints + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed 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. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.common.endpoints.features; + +import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure; +import org.onap.policy.common.endpoints.utils.NetLoggerUtil.EventType; +import org.onap.policy.common.utils.services.OrderedService; +import org.onap.policy.common.utils.services.OrderedServiceImpl; +import org.slf4j.Logger; + +/** + * Logging Feature API. Provides interception points before and after logging a message. + */ +public interface NetLoggerFeatureApi extends OrderedService { + + /** + * Feature providers implementing this interface. + */ + OrderedServiceImpl<NetLoggerFeatureApi> providers = + new OrderedServiceImpl<>(NetLoggerFeatureApi.class); + + /** + * Intercepts a message before it is logged. + * + * @return true if this feature intercepts and takes ownership of the operation + * preventing the invocation of lower priority features. False, otherwise. + */ + default boolean beforeLog(Logger eventLogger, EventType type, CommInfrastructure protocol, String topic, + String message) { + return false; + } + + /** + * Intercepts a message after it is logged. + * + * @return true if this feature intercepts and takes ownership of the operation + * preventing the invocation of lower priority features. False, otherwise. + */ + default boolean afterLog(Logger eventLogger, EventType type, CommInfrastructure protocol, String topic, + String message) { + return false; + } + +} diff --git a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/utils/NetLoggerUtil.java b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/utils/NetLoggerUtil.java new file mode 100644 index 00000000..f82e6a8c --- /dev/null +++ b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/utils/NetLoggerUtil.java @@ -0,0 +1,153 @@ +/* + * ============LICENSE_START======================================================= + * policy-endpoints + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed 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. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.common.endpoints.utils; + +import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure; +import org.onap.policy.common.endpoints.features.NetLoggerFeatureApi; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A network logging utility class that allows drools applications code to access the + * network log (or other specified loggers) and logging features. + * + */ +public class NetLoggerUtil { + + /** + * Loggers. + */ + private static final Logger logger = LoggerFactory.getLogger(NetLoggerUtil.class); + private static final Logger netLogger = LoggerFactory.getLogger("network"); + + /** + * Constant for the system line separator. + */ + public static final String SYSTEM_LS = System.lineSeparator(); + + /** + * Specifies if the message is coming in or going out. + */ + public enum EventType { + IN, OUT + } + + /** + * Get Network Logger. + * + * @return logger instance + */ + public static Logger getNetworkLogger() { + return netLogger; + } + + /** + * Logs a message to the network logger. + * + * @param type can either be IN or OUT + * @param protocol the protocol used to receive/send the message + * @param topic the topic the message came from or null if the type is REST + * @param message message to be logged + */ + public static void log(EventType type, CommInfrastructure protocol, String topic, String message) { + log(netLogger, type, protocol, topic, message); + } + + /** + * Logs a message to the specified logger (i.e. a controller logger). + * + * @param eventLogger the logger that will have the message appended + * @param type can either be IN or OUT + * @param protocol the protocol used to receive/send the message + * @param topic the topic the message came from or null if the type is REST + * @param message message to be logged + */ + public static void log(Logger eventLogger, EventType type, CommInfrastructure protocol, String topic, + String message) { + if (eventLogger == null) { + logger.debug("the logger is null, defaulting to network logger"); + eventLogger = netLogger; + } + + if (featureBeforeLog(eventLogger, type, protocol, topic, message)) { + return; + } + + eventLogger.info("[{}|{}|{}]{}{}", type, protocol, topic, SYSTEM_LS, message); + + featureAfterLog(eventLogger, type, protocol, topic, message); + } + + /** + * Executes features that pre-process a message before it is logged. + * + * @param eventLogger the logger that will have the message appended + * @param type can either be IN or OUT + * @param protocol the protocol used to receive/send the message + * @param topic the topic the message came from or null if the type is REST + * @param message message to be logged + * + * @return true if this feature intercepts and takes ownership of the operation + * preventing the invocation of lower priority features. False, otherwise + */ + private static boolean featureBeforeLog(Logger eventLogger, EventType type, CommInfrastructure protocol, + String topic, String message) { + for (NetLoggerFeatureApi feature : NetLoggerFeatureApi.providers.getList()) { + try { + if (feature.beforeLog(eventLogger, type, protocol, topic, message)) { + return true; + } + } catch (Exception e) { + logger.error("feature {} before-log failure because of {}", feature.getClass().getName(), + e.getMessage(), e); + } + } + return false; + } + + /** + * Executes features that post-process a message after it is logged. + * + * @param eventLogger the logger that will have the message appended + * @param type can either be IN or OUT + * @param protocol the protocol used to receive/send the message + * @param topic the topic the message came from or null if the type is rest + * @param message message to be logged + * + * @return true if this feature intercepts and takes ownership of the operation + * preventing the invocation of lower priority features. False, otherwise + */ + private static boolean featureAfterLog(Logger eventLogger, EventType type, CommInfrastructure protocol, + String topic, String message) { + for (NetLoggerFeatureApi feature : NetLoggerFeatureApi.providers.getList()) { + try { + if (feature.afterLog(eventLogger, type, protocol, topic, message)) { + return true; + } + } catch (Exception e) { + logger.error("feature {} after-log failure because of {}", feature.getClass().getName(), e.getMessage(), + e); + } + } + return false; + } + +} |