diff options
author | Jorge Hernandez <jh1730@att.com> | 2018-03-25 23:34:27 -0500 |
---|---|---|
committer | Jorge Hernandez <jh1730@att.com> | 2018-03-26 10:08:52 -0500 |
commit | 13e9aa8e0613877c3ce63c878978e9cb31b92c48 (patch) | |
tree | d42f4da2d39deb372da5a9d279d233ab4bbb7c21 | |
parent | 5c205833e4b2e8f6cfe938641cdbceaf680da92b (diff) |
l2 management maturity pdp-d
configurable log location
metric/audit log for transaction metrics conforming to
new field definition.
support metrics/audits records with custom logback filters
so they are not intrusive with developer log testing.
Change-Id: I7a4dcc6790b85539e613ad8705e731e7298ce106
Issue-ID: POLICY-533
Signed-off-by: Jorge Hernandez <jh1730@att.com>
20 files changed, 1921 insertions, 176 deletions
diff --git a/feature-eelf/src/main/feature/config/logback-eelf.xml b/feature-eelf/src/main/feature/config/logback-eelf.xml index d76eb20b..4dafd45d 100644 --- a/feature-eelf/src/main/feature/config/logback-eelf.xml +++ b/feature-eelf/src/main/feature/config/logback-eelf.xml @@ -2,7 +2,7 @@ ============LICENSE_START======================================================= feature-eelf ================================================================================ - Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + Copyright (C) 2017-2018 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. @@ -27,13 +27,13 @@ <property name="networkLogName" value="network" /> <property name="defaultPattern" - value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" /> + value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestID}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" /> <property name="defaultMetricPattern" - value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" /> + value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestID}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" /> <property name="defaultAuditPattern" - value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" /> + value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestID}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" /> <property name="defaultErrorPattern" - value="%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%X{RequestId}|%thread|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{ErrorCategory}|%X{ErrorCode}|%X{ErrorDesciption}|%msg%replace(%xException){'\n',' - '}%nopex%n" /> + value="%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%X{RequestID}|%thread|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{ErrorCategory}|%X{ErrorCode}|%X{ErrorDesciption}|%msg%replace(%xException){'\n',' - '}%nopex%n" /> <property name="networkPattern" value="[%d|%t]%m%n" /> <property name="debugPattern" value="[%date|%level|%logger{0}|%thread] %replace(%msg){'\n', ' '}%n" /> diff --git a/feature-simulators/src/test/java/org/onap/policy/drools/simulators/DMaaPSimulatorTest.java b/feature-simulators/src/test/java/org/onap/policy/drools/simulators/DMaaPSimulatorTest.java index 415c5206..b16804e6 100644 --- a/feature-simulators/src/test/java/org/onap/policy/drools/simulators/DMaaPSimulatorTest.java +++ b/feature-simulators/src/test/java/org/onap/policy/drools/simulators/DMaaPSimulatorTest.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * feature-simulators * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2018 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. @@ -37,7 +37,7 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.onap.policy.drools.http.server.HttpServletServer; -import org.onap.policy.drools.utils.LoggerUtil; +import org.onap.policy.drools.utils.logging.LoggerUtil; import org.onap.policy.drools.utils.NetworkUtil; public class DMaaPSimulatorTest { @@ -361,4 +361,4 @@ public class DMaaPSimulatorTest { this.b = b; } } -}
\ No newline at end of file +} diff --git a/packages/base/src/files/etc/profile.d/env.sh b/packages/base/src/files/etc/profile.d/env.sh index be8e7471..97076606 100644 --- a/packages/base/src/files/etc/profile.d/env.sh +++ b/packages/base/src/files/etc/profile.d/env.sh @@ -2,7 +2,7 @@ # ============LICENSE_START======================================================= # Base Package # ================================================================================ -# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. +# Copyright (C) 2017-2018 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. @@ -19,6 +19,7 @@ ### export POLICY_HOME=${{POLICY_HOME}} +export POLICY_LOGS=${{POLICY_LOGS}} export JAVA_HOME=${{JAVA_HOME}} export ENGINE_MANAGEMENT_USER=${{ENGINE_MANAGEMENT_USER}} export ENGINE_MANAGEMENT_PASSWORD=${{ENGINE_MANAGEMENT_PASSWORD}} diff --git a/packages/docker/src/main/docker/docker-install.sh b/packages/docker/src/main/docker/docker-install.sh index e65329da..2ff6a0b3 100644 --- a/packages/docker/src/main/docker/docker-install.sh +++ b/packages/docker/src/main/docker/docker-install.sh @@ -4,7 +4,7 @@ # ============LICENSE_START======================================================= # Installation Package # ================================================================================ -# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. +# Copyright (C) 2017-2018 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. @@ -390,6 +390,13 @@ function install_base() { exit 1 fi + if [[ -n ${POLICY_LOGS} ]]; then + if ! /bin/mkdir -p "${POLICY_LOGS}" > /dev/null 2>&1; then + echo "error: aborting base installation: cannot create ${POLICY_LOGS}" + exit 1 + fi + fi + BASE_TGZ=$(ls base-*.tar.gz) if [ ! -r ${BASE_TGZ} ]; then echo "error: aborting: base package is not accessible" diff --git a/packages/install/src/files/base.conf b/packages/install/src/files/base.conf index d92abed0..f1a37d0f 100644 --- a/packages/install/src/files/base.conf +++ b/packages/install/src/files/base.conf @@ -2,7 +2,7 @@ # ============LICENSE_START======================================================= # ONAP POLICY # ================================================================================ -# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. +# Copyright (C) 2017-2018 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. @@ -21,6 +21,7 @@ # SYSTEM software configuration POLICY_HOME=/opt/app/policy +POLICY_LOGS=/opt/app/policy/logs JAVA_HOME=/opt/jdk1.8.0_77 M2_HOME=/opt/app/policy/3rdparty/apache-maven-3.3.1 diff --git a/policy-endpoints/src/main/java/org/onap/policy/drools/http/server/internal/JettyJerseyServer.java b/policy-endpoints/src/main/java/org/onap/policy/drools/http/server/internal/JettyJerseyServer.java index f882c927..4f7c151e 100644 --- a/policy-endpoints/src/main/java/org/onap/policy/drools/http/server/internal/JettyJerseyServer.java +++ b/policy-endpoints/src/main/java/org/onap/policy/drools/http/server/internal/JettyJerseyServer.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * policy-endpoints * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2018 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. @@ -129,12 +129,7 @@ public class JettyJerseyServer extends JettyServletServer { String hostname = this.connector.getHost(); if (hostname == null || hostname.isEmpty() || hostname.equals(NetworkUtil.IPv4_WILDCARD_ADDRESS)) { - try { - hostname = InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException e) { - logger.warn("{}: can't resolve connector's hostname: {}", this, hostname, e); - hostname = "localhost"; - } + hostname = NetworkUtil.getHostname(); } swaggerServlet.setInitParameter(SWAGGER_API_BASEPATH, diff --git a/policy-management/src/main/java/org/onap/policy/drools/server/restful/RestManager.java b/policy-management/src/main/java/org/onap/policy/drools/server/restful/RestManager.java index cd1edca5..15c97237 100644 --- a/policy-management/src/main/java/org/onap/policy/drools/server/restful/RestManager.java +++ b/policy-management/src/main/java/org/onap/policy/drools/server/restful/RestManager.java @@ -64,7 +64,7 @@ import org.onap.policy.drools.protocol.configuration.ControllerConfiguration; import org.onap.policy.drools.protocol.configuration.PdpdConfiguration; import org.onap.policy.drools.system.PolicyController; import org.onap.policy.drools.system.PolicyEngine; -import org.onap.policy.drools.utils.LoggerUtil; +import org.onap.policy.drools.utils.logging.LoggerUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/policy-management/src/main/java/org/onap/policy/drools/system/Main.java b/policy-management/src/main/java/org/onap/policy/drools/system/Main.java index 314bbc04..43216000 100644 --- a/policy-management/src/main/java/org/onap/policy/drools/system/Main.java +++ b/policy-management/src/main/java/org/onap/policy/drools/system/Main.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * policy-management * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2018 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. @@ -20,14 +20,14 @@ package org.onap.policy.drools.system; -import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Properties; import org.onap.policy.drools.persistence.SystemPersistence; import org.onap.policy.drools.properties.PolicyProperties; -import org.onap.policy.drools.utils.LoggerUtil; +import org.onap.policy.drools.utils.logging.LoggerUtil; +import org.onap.policy.drools.utils.logging.MDCTransaction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -56,7 +56,6 @@ public class Main { * main * * @param args program arguments - * @throws IOException */ public static void main(String[] args) { @@ -110,16 +109,23 @@ public class Main { /* 2. Start the Engine with the basic services only (no Policy Controllers) */ + MDCTransaction trans = + MDCTransaction.newTransaction(null, null).setServiceName(Main.class.getSimpleName()). + setTargetEntity("engine").setTargetServiceName("start"); try { final boolean success = PolicyEngine.manager.start(); if (!success) { - logger.warn("Main: {} has been partially started", PolicyEngine.manager); + trans.setStatusCode(false).setResponseDescription("partial start").flush(); + logger.warn(LoggerUtil.TRANSACTION_LOG_MARKER, "Main: {} has been partially started", PolicyEngine.manager); + } else { + trans.setStatusCode(true).transaction(); } } catch (final IllegalStateException e) { - logger.warn("Main: cannot start {} (bad state) because of {}", PolicyEngine.manager, - e.getMessage(), e); + trans.setStatusCode(false).setResponseCode(e.getClass().getSimpleName()).setResponseDescription(e.getMessage()).flush(); + logger.warn(LoggerUtil.TRANSACTION_LOG_MARKER, "Main: cannot start {} (bad state) because of {}", PolicyEngine.manager, e.getMessage(), e); } catch (final Exception e) { - logger.warn("Main: cannot start {} because of {}", PolicyEngine.manager, e.getMessage(), e); + trans.setStatusCode(false).setResponseCode(e.getClass().getSimpleName()).setResponseDescription(e.getMessage()).flush(); + logger.warn(LoggerUtil.TRANSACTION_LOG_MARKER, "Main: cannot start {} because of {}", PolicyEngine.manager, e.getMessage(), e); System.exit(1); } @@ -130,14 +136,24 @@ public class Main { final String controllerName = controllerProperties.getProperty(PolicyProperties.PROPERTY_CONTROLLER_NAME); try { + trans = + MDCTransaction.newTransaction(null, null).setServiceName(Main.class.getSimpleName()). + setTargetEntity("controller:" + controllerName).setTargetServiceName("start"); + final PolicyController controller = PolicyEngine.manager.createPolicyController(controllerName, controllerProperties); controller.start(); + + trans.setStatusCode(true). + setResponseDescription(controller.getDrools().getCanonicalSessionNames().toString()). + transaction(); } catch (final Exception e) { - logger.error("Main: cannot instantiate policy-controller {} because of {}", controllerName, - e.getMessage(), e); + trans.setStatusCode(false).setResponseCode(e.getClass().getSimpleName()).setResponseDescription(e.getMessage()).flush(); + logger.error(LoggerUtil.TRANSACTION_LOG_MARKER, "Main: cannot instantiate policy-controller {} because of {}", + controllerName, e.getMessage(), e); } catch (final LinkageError e) { - logger.warn("Main: cannot instantiate policy-controller {} (linkage) because of {}", + trans.setStatusCode(false).setResponseCode(e.getClass().getSimpleName()).setResponseDescription(e.getMessage()).flush(); + logger.warn(LoggerUtil.TRANSACTION_LOG_MARKER, "Main: cannot instantiate policy-controller {} (linkage) because of {}", controllerName, e.getMessage(), e); } } diff --git a/policy-management/src/main/java/org/onap/policy/drools/system/PolicyEngine.java b/policy-management/src/main/java/org/onap/policy/drools/system/PolicyEngine.java index a1fee763..d7275578 100644 --- a/policy-management/src/main/java/org/onap/policy/drools/system/PolicyEngine.java +++ b/policy-management/src/main/java/org/onap/policy/drools/system/PolicyEngine.java @@ -44,6 +44,8 @@ import org.onap.policy.drools.protocol.coders.EventProtocolCoder; import org.onap.policy.drools.protocol.configuration.ControllerConfiguration; import org.onap.policy.drools.protocol.configuration.PdpdConfiguration; import org.onap.policy.drools.server.restful.RestManager; +import org.onap.policy.drools.utils.logging.LoggerUtil; +import org.onap.policy.drools.utils.logging.MDCTransaction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -139,7 +141,6 @@ public interface PolicyEngine extends Startable, Lockable, TopicListener { /** * registers a new Policy Controller with the Policy Engine initialized per properties. * - * @param controller name * @param properties properties to initialize the Policy Controller * @throws IllegalArgumentException when invalid or insufficient properties are provided * @throws IllegalStateException when the engine is in a state where this operation is not @@ -276,7 +277,6 @@ public interface PolicyEngine extends Startable, Lockable, TopicListener { /** * Attempts the dispatching of an "event" object over communication infrastructure "busType" * - * @param eventBus Communication infrastructure identifier * @param topic topic * @param event the event object to send * @@ -292,7 +292,6 @@ public interface PolicyEngine extends Startable, Lockable, TopicListener { /** * Attempts the dispatching of an "event" object over communication infrastructure "busType" * - * @param eventBus Communication infrastructure enum * @param topic topic * @param event the event object to send * @@ -308,7 +307,6 @@ public interface PolicyEngine extends Startable, Lockable, TopicListener { /** * Attempts delivering of an String over communication infrastructure "busType" * - * @param eventBus Communication infrastructure identifier * @param topic topic * @param event the event object to send * @@ -591,12 +589,22 @@ private static final String ENGINE_LOCKED_MSG = "Policy Engine is locked"; final String entity = config.getEntity(); + MDCTransaction mdcTrans = MDCTransaction.newTransaction(config.getRequestID(), "brmsgw"); + if (this.getSources().size() == 1) { + Topic topic = this.getSources().get(0); + mdcTrans.setServiceName(topic.getTopic()).setRemoteHost(topic.getServers().toString()). + setTargetEntity(config.getEntity()); + } + switch (entity) { - case PdpdConfiguration.CONFIG_ENTITY_CONTROLLER: - return controllerConfig(config); + case PdpdConfiguration.CONFIG_ENTITY_CONTROLLER: + boolean success = controllerConfig(config); + mdcTrans.resetSubTransaction().setStatusCode(success).transaction(); + return success; default: final String msg = "Configuration Entity is not supported: " + entity; - logger.warn(msg); + mdcTrans.resetSubTransaction().setStatusCode(false).setResponseDescription(msg).flush(); + logger.warn(LoggerUtil.TRANSACTION_LOG_MARKER_NAME, msg); throw new IllegalArgumentException(msg); } } @@ -613,11 +621,18 @@ private static final String ENGINE_LOCKED_MSG = "Policy Engine is locked"; } for (final ControllerConfiguration configController : configControllers) { + MDCTransaction mdcTrans = + MDCTransaction.newSubTransaction(null).setTargetEntity(configController.getName()). + setTargetServiceName(configController.getOperation()). + setTargetVirtualEntity(configController.getDrools().toString()); try { final PolicyController policyController = this.updatePolicyController(configController); policyControllers.add(policyController); + mdcTrans.setStatusCode(true).transaction(); } catch (final Exception e) { - logger.error("{}: cannot update-policy-controllers because of {}", this, e.getMessage(), e); + mdcTrans.setStatusCode(false).setResponseCode(e.getClass().getName()). + setResponseDescription(e.getMessage()).flush(); + logger.error(LoggerUtil.TRANSACTION_LOG_MARKER_NAME, "{}: cannot update-policy-controllers because of {}", this, e.getMessage(), e); } } @@ -1423,18 +1438,23 @@ private static final String ENGINE_LOCKED_MSG = "Policy Engine is locked"; /* only this one supported for now */ final List<ControllerConfiguration> configControllers = config.getControllers(); if (configControllers == null || configControllers.isEmpty()) { - if (logger.isInfoEnabled()) - logger.info("No controller configuration provided: " + config); + logger.info("No controller configuration provided: {}" + config); return false; } - final List<PolicyController> policyControllers = - this.updatePolicyControllers(config.getControllers()); - if (policyControllers == null || policyControllers.isEmpty()) - return false; - else if (policyControllers.size() == configControllers.size()) - return true; - return false; + final List<PolicyController> policyControllers = this.updatePolicyControllers(config.getControllers()); + + boolean success; + + if (policyControllers == null || policyControllers.isEmpty()) { + success = false; + } else if (policyControllers.size() == configControllers.size()) { + success = true; + } else { + success = false; + } + + return success; } @Override diff --git a/policy-management/src/main/server-gen/bin/policy-management-controller b/policy-management/src/main/server-gen/bin/policy-management-controller index a9f8ce0d..cc6a8c7d 100644 --- a/policy-management/src/main/server-gen/bin/policy-management-controller +++ b/policy-management/src/main/server-gen/bin/policy-management-controller @@ -4,7 +4,7 @@ # ============LICENSE_START======================================================= # ONAP POLICY # ================================================================================ -# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. +# Copyright (C) 2017-2018 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. @@ -42,11 +42,11 @@ function um_start() { RETVAL=0 return fi - mkdir -p $_DIR/logs - if [ -e $_DIR/logs/$PNAME.out.1 ]; then mv $_DIR/logs/$PNAME.out.1 $_DIR/logs/$PNAME.out.2; fi - if [ -e $_DIR/logs/$PNAME.err.1 ]; then mv $_DIR/logs/$PNAME.err.1 $_DIR/logs/$PNAME.err.2; fi - if [ -e $_DIR/logs/$PNAME.out ]; then mv $_DIR/logs/$PNAME.out $_DIR/logs/$PNAME.out.1; fi - if [ -e $_DIR/logs/$PNAME.err ]; then mv $_DIR/logs/$PNAME.err $_DIR/logs/$PNAME.err.1; fi + mkdir -p $_LOGS + if [ -e $_LOGS/$PNAME.out.1 ]; then mv $_LOGS/$PNAME.out.1 $_LOGS/$PNAME.out.2; fi + if [ -e $_LOGS/$PNAME.err.1 ]; then mv $_LOGS/$PNAME.err.1 $_LOGS/$PNAME.err.2; fi + if [ -e $_LOGS/$PNAME.out ]; then mv $_LOGS/$PNAME.out $_LOGS/$PNAME.out.1; fi + if [ -e $_LOGS/$PNAME.err ]; then mv $_LOGS/$PNAME.err $_LOGS/$PNAME.err.1; fi CP=$(ls $_DIR/lib/*.jar | xargs -I X printf ":%s" X) # If 'system.properties' exists, convert it into JVM arguments. @@ -66,7 +66,7 @@ function um_start() { # to subprocesses exec {cfg}>&- fi - nohup $JAVA_HOME/bin/java -Dkie.maven.settings.custom=$_DIR/config/kie_settings.xml -Dlog4j.configuration=file:$_DIR/config/log4j.properties -cp $_DIR/config:$_DIR/lib:$CP "${systemProperties[@]}" "$@" $CLASS > >( while read line; do echo "$(date): ${line}"; done > $_DIR/logs/$PNAME.out) 2> >( while read line; do echo "$(date): ${line}"; done > $_DIR/logs/$PNAME.err) & + nohup $JAVA_HOME/bin/java -Dkie.maven.settings.custom=$_DIR/config/kie_settings.xml -Dlog4j.configuration=file:$_DIR/config/log4j.properties -cp $_DIR/config:$_DIR/lib:$CP "${systemProperties[@]}" "$@" $CLASS > >( while read line; do echo "$(date): ${line}"; done > $_LOGS/$PNAME.out) 2> >( while read line; do echo "$(date): ${line}"; done > $_LOGS/$PNAME.err) & _PID=$! echo $_PID > $_PIDFILE @@ -167,6 +167,12 @@ function update_monitor() { # main _DIR=${POLICY_HOME} +_LOGS=${POLICY_LOGS} + +if [[ -z ${POLICY_LOGS} ]]; then + _LOGS="${POLICY_HOME}"/logs +fi + CONTROLLER=policy-management-controller RETVAL=0 diff --git a/policy-management/src/main/server/config/logback.xml b/policy-management/src/main/server/config/logback.xml index 1801c43a..538fcf80 100644 --- a/policy-management/src/main/server/config/logback.xml +++ b/policy-management/src/main/server/config/logback.xml @@ -2,7 +2,7 @@ ============LICENSE_START======================================================= policy-management ================================================================================ - Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + Copyright (C) 2017-2018 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. @@ -20,30 +20,33 @@ <configuration scan="true" scanPeriod="30 seconds" debug="false"> - <property name="logDir" value="logs" /> + <property name="logDir" value="${POLICY_LOGS}" /> <property name="errorLog" value="error" /> <property name="debugLog" value="debug" /> <property name="networkLog" value="network" /> - <property name="debugPattern" value="[%date|%level|%logger{0}|%thread] %msg%n" /> + <property name="metricLog" value="metric" /> + <property name="transactionLog" value="audit" /> + + <property name="debugPattern" value="[%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%level|%logger{0}|%thread] %msg%n" /> <property name="errorPattern" value="${debugPattern}" /> - <property name="networkPattern" value="[%d|%t]%m%n" /> + <property name="networkPattern" value="[%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%t]%m%n" /> + + <property name="metricPattern" value="%X{RequestID}|%X{InvocationID}|%X{ServiceName}|%X{PartnerName}|%X{BeginTimestamp}|%X{EndTimestamp}|%X{ElapsedTime}|%X{ServiceInstanceID}|%X{VirtualServerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%X{Severity}|%X{TargetEntity}|%X{TargetServiceName}|%X{Server}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{ClientIPAddress}|%X{ProcessKey}|%X{RemoteHost}|%X{AlertSeverity}|%X{TargetVirtualEntity}|%level|%thread| %msg%n"/> + <property name="transactionPattern" value="${metricPattern}" /> <appender name="ErrorOut" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${logDir}/${errorLog}.log</file> - <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> - <fileNamePattern>${logDir}/${errorLog}.%i.log.zip</fileNamePattern> - <minIndex>1</minIndex> - <maxIndex>5</maxIndex> + <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> + <fileNamePattern>${logDir}/${errorLog}.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern> + <maxFileSize>50MB</maxFileSize> + <maxHistory>30</maxHistory> + <totalSizeCap>10GB</totalSizeCap> </rollingPolicy> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>WARN</level> </filter> - <triggeringPolicy - class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> - <maxFileSize>15MB</maxFileSize> - </triggeringPolicy> <encoder> <pattern>${errorPattern}</pattern> </encoder> @@ -55,14 +58,12 @@ <appender name="DebugOut" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${logDir}/${debugLog}.log</file> - <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> - <fileNamePattern>${logDir}/${debugLog}.%i.log.zip</fileNamePattern> - <minIndex>1</minIndex> - <maxIndex>9</maxIndex> + <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> + <fileNamePattern>${logDir}/${debugLog}.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern> + <maxFileSize>50MB</maxFileSize> + <maxHistory>30</maxHistory> + <totalSizeCap>10GB</totalSizeCap> </rollingPolicy> - <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> - <maxFileSize>20MB</maxFileSize> - </triggeringPolicy> <encoder> <pattern>${debugPattern}</pattern> </encoder> @@ -74,14 +75,12 @@ <appender name="NetworkOut" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${logDir}/${networkLog}.log</file> - <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> - <fileNamePattern>${logDir}/${networkLog}.%i.log.zip</fileNamePattern> - <minIndex>1</minIndex> - <maxIndex>9</maxIndex> + <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> + <fileNamePattern>${logDir}/${networkLog}.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern> + <maxFileSize>50MB</maxFileSize> + <maxHistory>30</maxHistory> + <totalSizeCap>10GB</totalSizeCap> </rollingPolicy> - <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> - <maxFileSize>15MB</maxFileSize> - </triggeringPolicy> <encoder> <pattern>${networkPattern}</pattern> </encoder> @@ -91,6 +90,42 @@ <appender-ref ref="NetworkOut" /> </appender> + <appender name="MetricOut" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${logDir}/${metricLog}.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> + <fileNamePattern>${logDir}/${metricLog}.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern> + <maxFileSize>50MB</maxFileSize> + <maxHistory>30</maxHistory> + <totalSizeCap>10GB</totalSizeCap> + </rollingPolicy> + <filter class="org.onap.policy.drools.utils.logging.LoggerMarkerFilter$MetricLoggerMarkerFilter" /> + <encoder> + <pattern>${metricPattern}</pattern> + </encoder> + </appender> + + <appender name="AsyncMetricOut" class="ch.qos.logback.classic.AsyncAppender"> + <appender-ref ref="MetricOut" /> + </appender> + + <appender name="TransactionOut" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${logDir}/${transactionLog}.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> + <fileNamePattern>${logDir}/${transactionLog}.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern> + <maxFileSize>50MB</maxFileSize> + <maxHistory>30</maxHistory> + <totalSizeCap>10GB</totalSizeCap> + </rollingPolicy> + <filter class="org.onap.policy.drools.utils.logging.LoggerMarkerFilter$TransactionLoggerMarkerFilter" /> + <encoder> + <pattern>${transactionPattern}</pattern> + </encoder> + </appender> + + <appender name="AsyncTransactionOut" class="ch.qos.logback.classic.AsyncAppender"> + <appender-ref ref="TransactionOut" /> + </appender> + <logger name="network" level="INFO" additivity="false"> <appender-ref ref="AsyncNetworkOut" /> </logger> @@ -102,6 +137,8 @@ <root level="INFO"> <appender-ref ref="AsyncDebugOut" /> <appender-ref ref="AsyncErrorOut" /> + <appender-ref ref="AsyncMetricOut" /> + <appender-ref ref="AsyncTransactionOut" /> </root> </configuration> diff --git a/policy-utils/src/main/java/org/onap/policy/drools/utils/LoggerUtil.java b/policy-utils/src/main/java/org/onap/policy/drools/utils/LoggerUtil.java deleted file mode 100644 index 681a2b20..00000000 --- a/policy-utils/src/main/java/org/onap/policy/drools/utils/LoggerUtil.java +++ /dev/null @@ -1,58 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP - * ================================================================================ - * Copyright (C) 2017 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.drools.utils; - -import org.slf4j.LoggerFactory; - -import ch.qos.logback.classic.LoggerContext; - -/** - * Loger Utils - */ -public class LoggerUtil { - - /** - * Root logger - */ - public static final String ROOT_LOGGER = "ROOT"; - - private LoggerUtil() { - // Empty constructor - } - - /** - * set the log level of a logger - * - * @param loggerName logger name - * @param loggerLevel logger level - */ - public static String setLevel(String loggerName, String loggerLevel) { - if (!(LoggerFactory.getILoggerFactory() instanceof LoggerContext)) - throw new IllegalStateException("The SLF4J logger factory is not configured for logback"); - - final LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); - final ch.qos.logback.classic.Logger logger = context.getLogger(loggerName); - if (logger == null) - throw new IllegalArgumentException("no logger " + loggerName); - - logger.setLevel(ch.qos.logback.classic.Level.toLevel(loggerLevel)); - return logger.getLevel().toString(); - } -} diff --git a/policy-utils/src/main/java/org/onap/policy/drools/utils/NetworkUtil.java b/policy-utils/src/main/java/org/onap/policy/drools/utils/NetworkUtil.java index 6734226d..229927e5 100644 --- a/policy-utils/src/main/java/org/onap/policy/drools/utils/NetworkUtil.java +++ b/policy-utils/src/main/java/org/onap/policy/drools/utils/NetworkUtil.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2018 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. @@ -22,8 +22,10 @@ package org.onap.policy.drools.utils; import java.io.IOException; import java.net.ConnectException; +import java.net.InetAddress; import java.net.Socket; +import java.net.UnknownHostException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,42 +34,80 @@ import org.slf4j.LoggerFactory; */ public class NetworkUtil { - public static final Logger logger = LoggerFactory.getLogger(NetworkUtil.class.getName()); - - /** - * IPv4 Wildcard IP address - */ - public static final String IPv4_WILDCARD_ADDRESS = "0.0.0.0"; - - private NetworkUtil() { - // Empty constructor - } - - /** - * try to connect to $host:$port $retries times while we are getting connection failures. - * - * @param host host - * @param port port - * @param retries number of attempts - * @return true is port is open, false otherwise - * @throws InterruptedException if execution has been interrupted - */ - public static boolean isTcpPortOpen(String host, int port, int retries, long interval) - throws InterruptedException, IOException { - int retry = 0; - while (retry < retries) { - try (Socket s = new Socket(host, port)) { - logger.debug("{}:{} connected - retries={} interval={}", host, port, retries, interval); - return true; - } catch (final ConnectException e) { - retry++; - logger.trace("{}:{} connected - retries={} interval={}", host, port, retries, interval, e); - Thread.sleep(interval); - } + public static final Logger logger = LoggerFactory.getLogger(NetworkUtil.class.getName()); + + /** + * IPv4 Wildcard IP address + */ + public static final String IPv4_WILDCARD_ADDRESS = "0.0.0.0"; + + private NetworkUtil() { + // Empty constructor + } + + /** + * try to connect to $host:$port $retries times while we are getting connection failures. + * + * @param host host + * @param port port + * @param retries number of attempts + * @return true is port is open, false otherwise + * @throws InterruptedException if execution has been interrupted + */ + public static boolean isTcpPortOpen(String host, int port, int retries, long interval) + throws InterruptedException, IOException { + int retry = 0; + while (retry < retries) { + try (Socket s = new Socket(host, port)) { + logger.debug("{}:{} connected - retries={} interval={}", host, port, retries, interval); + return true; + } catch (final ConnectException e) { + retry++; + logger.trace("{}:{} connected - retries={} interval={}", host, port, retries, interval, e); + Thread.sleep(interval); + } + } + + logger.warn("{}:{} closed = retries={} interval={}", host, port, retries, interval); + return false; + } + + /** + * gets host name + * + * @return host name + */ + public static String getHostname() { + + String hostname = System.getenv("HOSTNAME"); + if (hostname != null && !hostname.isEmpty()) { + return hostname; + } + + try { + return InetAddress.getLocalHost().getHostName(); + } catch (UnknownHostException e) { + logger.warn("cannot resolve local hostname", e); + /* continue */ + } + + return "localhost"; } - logger.warn("{}:{} closed = retries={} interval={}", host, port, retries, interval); - return false; - } + /** + * gets host's IP + * + * @return host IP + */ + public static String getHostIp() { + + try { + return InetAddress.getLocalHost().getHostAddress(); + } catch (UnknownHostException e) { + logger.warn("cannot resolve local hostname", e); + /* continue */ + } + return "127.0.0.1"; + } } diff --git a/policy-utils/src/main/java/org/onap/policy/drools/utils/logging/LoggerMarkerFilter.java b/policy-utils/src/main/java/org/onap/policy/drools/utils/logging/LoggerMarkerFilter.java new file mode 100644 index 00000000..19414d31 --- /dev/null +++ b/policy-utils/src/main/java/org/onap/policy/drools/utils/logging/LoggerMarkerFilter.java @@ -0,0 +1,77 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2017-2018 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.drools.utils.logging; + +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.filter.AbstractMatcherFilter; +import ch.qos.logback.core.spi.FilterReply; +import org.slf4j.Marker; + +/** + * Logger Marker Filters to be used in logback.xml configuration + * to accept/deny metric or transaction (audit) events + */ +public abstract class LoggerMarkerFilter extends AbstractMatcherFilter<ILoggingEvent> { + + protected final Marker marker; + + public LoggerMarkerFilter(Marker marker) { + this.marker = marker; + } + + @Override + public FilterReply decide(ILoggingEvent event) { + + if (this.marker == null || !isStarted()) { + return FilterReply.DENY; + } + + if (event == null || event.getMarker() == null) { + return FilterReply.DENY; + } + + if (event.getMarker().equals(marker)) { + return FilterReply.ACCEPT; + } else { + return FilterReply.DENY; + } + } + + /** + * Metric Logger Marker Filter + */ + public static class MetricLoggerMarkerFilter extends LoggerMarkerFilter { + + public MetricLoggerMarkerFilter() { + super(LoggerUtil.METRIC_LOG_MARKER); + } + + } + + /** + * Transaction Logger Marker Filter + */ + public static class TransactionLoggerMarkerFilter extends LoggerMarkerFilter { + + public TransactionLoggerMarkerFilter() { + super(LoggerUtil.TRANSACTION_LOG_MARKER); + } + } +} diff --git a/policy-utils/src/main/java/org/onap/policy/drools/utils/logging/LoggerUtil.java b/policy-utils/src/main/java/org/onap/policy/drools/utils/logging/LoggerUtil.java new file mode 100644 index 00000000..26b35702 --- /dev/null +++ b/policy-utils/src/main/java/org/onap/policy/drools/utils/logging/LoggerUtil.java @@ -0,0 +1,83 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2017-2018 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.drools.utils.logging; + +import org.slf4j.LoggerFactory; + +import ch.qos.logback.classic.LoggerContext; +import org.slf4j.Marker; +import org.slf4j.MarkerFactory; + +/** + * Loger Utils + */ +public class LoggerUtil { + + /** + * Root logger + */ + public static final String ROOT_LOGGER = "ROOT"; + + /** + * Metric Log Marker Name + */ + public static final String METRIC_LOG_MARKER_NAME = "metric"; + + /** + * Transaction Log Marker Name + */ + public static final String TRANSACTION_LOG_MARKER_NAME = "transaction"; + + /** + * Marks a logging record as a metric + */ + public static final Marker METRIC_LOG_MARKER = MarkerFactory.getMarker(METRIC_LOG_MARKER_NAME); + + /** + * Marks a logging record as an end-to-end transaction + */ + public static final Marker TRANSACTION_LOG_MARKER = MarkerFactory.getMarker(TRANSACTION_LOG_MARKER_NAME); + + + private LoggerUtil() { + // Empty constructor + } + + /** + * set the log level of a logger + * + * @param loggerName logger name + * @param loggerLevel logger level + */ + public static String setLevel(String loggerName, String loggerLevel) { + if (!(LoggerFactory.getILoggerFactory() instanceof LoggerContext)) { + throw new IllegalStateException("The SLF4J logger factory is not configured for logback"); + } + + final LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); + final ch.qos.logback.classic.Logger logger = context.getLogger(loggerName); + if (logger == null) { + throw new IllegalArgumentException("no logger " + loggerName); + } + + logger.setLevel(ch.qos.logback.classic.Level.toLevel(loggerLevel)); + return logger.getLevel().toString(); + } +} diff --git a/policy-utils/src/main/java/org/onap/policy/drools/utils/logging/MDCTransaction.java b/policy-utils/src/main/java/org/onap/policy/drools/utils/logging/MDCTransaction.java new file mode 100644 index 00000000..1a27dde6 --- /dev/null +++ b/policy-utils/src/main/java/org/onap/policy/drools/utils/logging/MDCTransaction.java @@ -0,0 +1,1194 @@ +/*- + * ============LICENSE_START======================================================= + * policy-utils + * ================================================================================ + * Copyright (C) 2018 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. + */ + +package org.onap.policy.drools.utils.logging; + +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.Instant; +import java.util.Date; +import java.util.UUID; +import org.onap.policy.drools.utils.NetworkUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; + +/** + * MDC Transaction Utility Class. + * + * There is an implicit 2-level tree of Transactions in ONAP: transactions + * and subtransactions. + * + * 1. The top level transaction relates to the overarching transaction + * id (ie. RequestId) and should be made available to subtransactions + * for reuse in the ThreadLocal MDC structure. + * + * This is the data to be inherited and common to all subtransactions + * (not a common case but could be modified by subtransactions): + * + * Request ID + * Virtual Server Name + * Partner Name + * Server + * Server IP Address + * Server FQDN + * + * 2. The second level at the leaves is formed by subtransactions and the key + * identifier is the invocation id. + * + * Begin Timestamp + * End Timestamp + * Elapsed Time + * Service Instance ID + * Service Name + * Status Code + * Response Code + * Response Description + * Instance UUID + * Severity + * Target Entity + * Target Service Name + * Server + * Server IP Address + * Server FQDN + * Client IP Address + * Process Key + * Remote Host + * Alert Severity + * Target Virtual Entity + * + * + * The naming convention for the fields must match the naming given at + * + * https://wiki.onap.org/pages/viewpage.action?pageId=20087036 + */ +public interface MDCTransaction { + /* + * The fields must match the naming given at + * https://wiki.onap.org/pages/viewpage.action?pageId=20087036 + */ + + /** + * End to end transaction ID. Subtransactions will inherit this value from the transaction. + */ + String REQUEST_ID = "RequestID"; + + /** + * Invocation ID, ie. SubTransaction ID. + */ + String INVOCATION_ID = "InvocationID"; + + /** + * Service Name. Both transactions and subtransactions will have its own copy. + */ + String SERVICE_NAME = "ServiceName"; + + /** + * Partner Name Subtransactions will inherit this value from the transaction. + */ + String PARTNER_NAME = "PartnerName"; + + /** + * Start Timestamp. Both transactions and subtransactions will have its own copy. + */ + String BEGIN_TIMESTAMP = "BeginTimestamp"; + + /** + * End Timestamp. Both transactions and subtransactions will have its own copy. + */ + String END_TIMESTAMP = "EndTimestamp"; + + /** + * Elapsed Time. Both transactions and subtransactions will have its own copy. + */ + String ELAPSED_TIME = "ElapsedTime"; + + /** + * Elapsed Time. Both transactions and subtransactions will have its own copy. + */ + String SERVICE_INSTANCE_ID = "ServiceInstanceID"; + + /** + * Virtual Server Name. Subtransactions will inherit this value from the transaction. + */ + String VIRTUAL_SERVER_NAME = "VirtualServerName"; + + /** + * Status Code Both transactions and subtransactions will have its own copy. + */ + String STATUS_CODE = "StatusCode"; + + /** + * Response Code Both transactions and subtransactions will have its own copy. + */ + String RESPONSE_CODE = "ResponseCode"; + + /** + * Response Description Both transactions and subtransactions will have its own copy. + */ + String RESPONSE_DESCRIPTION = "ResponseDescription"; + + /** + * Instance UUID Both transactions and subtransactions will have its own copy. + */ + String INSTANCE_UUID = "InstanceUUID"; + + /** + * Severity Both transactions and subtransactions will have its own copy. + */ + String SEVERITY = "Severity"; + + /** + * Target Entity Both transactions and subtransactions will have its own copy. + */ + String TARGET_ENTITY = "TargetEntity"; + + /** + * Target Service Name Both transactions and subtransactions will have its own copy. + */ + String TARGET_SERVICE_NAME = "TargetServiceName"; + + /** + * Server Subtransactions inherit this value. if (this.getSources().size() == 1) + this.getSources().get(0).getTopic(); + */ + String SERVER = "Server"; + + /** + * Server IP Address Subtransactions inherit this value. + */ + String SERVER_IP_ADDRESS = "ServerIpAddress"; + + /** + * Server FQDN Subtransactions inherit this value. + */ + String SERVER_FQDN = "ServerFQDN"; + + /** + * Client IP Address Both transactions and subtransactions will have its own copy. + */ + String CLIENT_IP_ADDRESS = "ClientIPAddress"; + + /** + * Process Key Both transactions and subtransactions will have its own copy. + */ + String PROCESS_KEY = "ProcessKey"; + + /** + * Remote Host Both transactions and subtransactions will have its own copy. + */ + String REMOTE_HOST = "RemoteHost"; + + /** + * Alert Severity Both transactions and subtransactions will have its own copy. + */ + String ALERT_SEVERITY = "AlertSeverity"; + + /** + * Target Virtual Entity Both transactions and subtransactions will have its own copy. + */ + String TARGET_VIRTUAL_ENTITY = "TargetVirtualEntity"; + + /** + * Default Service Name + */ + String DEFAULT_SERVICE_NAME = "PDP-D"; + + /** + * Default Host Name + */ + String DEFAULT_HOSTNAME = NetworkUtil.getHostname(); + + /** + * Default Host IP + */ + String DEFAULT_HOSTIP = NetworkUtil.getHostIp(); + + /** + * Status Code Complete + */ + String STATUS_CODE_COMPLETE = "COMPLETE"; + + /** + * Status Code Error + */ + String STATUS_CODE_FAILURE = "ERROR"; + + /** + * reset subtransaction data + */ + MDCTransaction resetSubTransaction(); + + /** + * resets transaction data + */ + MDCTransaction resetTransaction(); + + /** + * flush to MDC structure + */ + MDCTransaction flush(); + + /** + * convenience method to log a metric. Alternatively caller + * could call flush() and the logging statement directly for + * further granularity. + */ + MDCTransaction metric(); + + /** + * convenience method to log a transaction record. Alternatively caller + * could call flush() and the logging statement directly for + * further granularity. + */ + MDCTransaction transaction(); + + /** + * get invocation id + */ + MDCTransaction setInvocationId(String invocationId); + + /** + * set start time + */ + MDCTransaction setStartTime(Instant startTime); + + /** + * set service name + */ + MDCTransaction setServiceName(String serviceName); + + /** + * set status code + */ + MDCTransaction setStatusCode(String statusCode); + + /** + * set status code + */ + MDCTransaction setStatusCode(boolean success); + + /** + * sets response code + */ + MDCTransaction setResponseCode(String responseCode); + + /** + * sets response description + */ + MDCTransaction setResponseDescription(String responseDescription); + + /** + * sets instance uuid + */ + MDCTransaction setInstanceUUID(String instanceUUID); + + /** + * set severity + */ + MDCTransaction setSeverity(String severity); + + /** + * set target entity + */ + MDCTransaction setTargetEntity(String targetEntity); + + /** + * set target service name + */ + MDCTransaction setTargetServiceName(String targetServiceName); + + /** + * set target virtual entity + */ + MDCTransaction setTargetVirtualEntity(String targetVirtualEntity); + + /** + * set request id + */ + MDCTransaction setRequestId(String requestId); + + /** + * set partner + */ + MDCTransaction setPartner(String partner); + + /** + * set server + */ + MDCTransaction setServer(String server); + + /** + * set server ip address + */ + MDCTransaction setServerIpAddress(String serverIpAddress); + + /** + * set server fqdn + */ + MDCTransaction setServerFqdn(String serverFqdn); + + /** + * set virtual server + */ + MDCTransaction setVirtualServerName(String virtualServerName); + /** + * sets end time + */ + MDCTransaction setEndTime(Instant endTime); + + /** + * sets elapsed time + */ + MDCTransaction setElapsedTime(Long elapsedTime); + + /** + * sets service instance id + */ + MDCTransaction setServiceInstanceId(String serviceInstanceId); + + /** + * sets process key + */ + MDCTransaction setProcessKey(String processKey); + + /** + * sets alert severity + */ + MDCTransaction setAlertSeverity(String alertSeverity); + + /** + * sets client ip address + */ + MDCTransaction setClientIpAddress(String clientIpAddress); + + /** + * sets remote host + */ + MDCTransaction setRemoteHost(String remoteHost); + + /** + * get start time + */ + Instant getStartTime(); + + /** + * get server + */ + String getServer(); + + /** + * get end time + */ + Instant getEndTime(); + + /** + * get elapsed time + */ + Long getElapsedTime(); + + /** + * get remote host + */ + String getRemoteHost(); + + /** + * get client ip address + */ + String getClientIpAddress(); + + /** + * get alert severity + */ + String getAlertSeverity(); + + /** + * get process key + */ + String getProcessKey(); + + /** + * get service instance id + */ + String getServiceInstanceId(); + + /** + * get invocation id + */ + String getInvocationId(); + + /** + * get service name + */ + String getServiceName(); + + /** + * get status code + */ + String getStatusCode(); + + /** + * get response description + */ + String getResponseDescription(); + + /** + * get instance uuid + */ + String getInstanceUUID(); + + /** + * get severity + */ + String getSeverity(); + + /** + * get target entity + */ + String getTargetEntity(); + + /** + * get service name + */ + String getTargetServiceName(); + + /** + * get target virtual entity + */ + String getTargetVirtualEntity(); + + /** + * get response code + */ + String getResponseCode(); + + /** + * get request id + */ + String getRequestId(); + + /** + * get partner + */ + String getPartner(); + + /** + * get server fqdn + */ + String getServerFqdn(); + + /** + * get virtual server name + */ + String getVirtualServerName(); + + /** + * get server ip + */ + String getServerIpAddress(); + + /** + * generate timestamp used for logging + */ + String timestamp(Instant time); + + /** + * create new MDC Transaction + * + * @param requestId transaction Id + * @param partner requesting partner + * + * @return MDC Transaction + */ + static MDCTransaction newTransaction(String requestId, String partner) { + return new MDCTransactionImpl(requestId, partner); + } + + /** + * create new MDC Transaction + */ + static MDCTransaction newTransaction() { + return new MDCTransactionImpl(); + } + + /** + * create new subtransaction + * + * @param invocationId sub-transaction od + * @return MDC Transaction + */ + static MDCTransaction newSubTransaction(String invocationId) { + return new MDCTransactionImpl(invocationId); + } + + /** + * create transaction from an existing one + * + * @param transaction transaction + * @return MDC Transaction + */ + static MDCTransaction fromTransaction(MDCTransaction transaction) { + return new MDCTransactionImpl(transaction); + } + +} + +class MDCTransactionImpl implements MDCTransaction { + + private final static Logger logger = LoggerFactory.getLogger(MDCTransactionImpl.class.getName()); + + /** + * Logging Format for Timestamps + */ + + private static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS+00:00"; + + /* transaction inheritable fields */ + + private String requestId; + private String partner; + + private String invocationId; + private String virtualServerName; + private String server; + private String serverIpAddress; + private String serverFqdn; + + private String serviceName; + + private Instant startTime; + private Instant endTime; + private Long elapsedTime; + + private String serviceInstanceId; + private String instanceUUID; + private String processKey; + + private String statusCode; + private String responseCode; + private String responseDescription; + private String severity; + private String alertSeverity; + + private String targetEntity; + private String targetServiceName; + private String targetVirtualEntity; + private String clientIpAddress; + private String remoteHost; + + /** + * Transaction with no information set + */ + public MDCTransactionImpl() { + MDC.clear(); + } + + /** + * MDC Transaction + * + * @param requestId transaction id + * @param partner transaction origin + */ + public MDCTransactionImpl(String requestId, String partner) { + MDC.clear(); + + this.setRequestId(requestId); + this.setPartner(partner); + + this.setServiceName(DEFAULT_SERVICE_NAME); + this.setServer(DEFAULT_HOSTNAME); + this.setServerIpAddress(DEFAULT_HOSTIP); + this.setServerFqdn(DEFAULT_HOSTNAME); + this.setVirtualServerName(DEFAULT_HOSTNAME); + + this.setStartTime(Instant.now()); + } + + /** + * create subtransaction + * + * @param invocationId subtransaction id + */ + public MDCTransactionImpl(String invocationId) { + this.resetSubTransaction(); + + this.setRequestId(MDC.get(REQUEST_ID)); + this.setPartner(MDC.get(PARTNER_NAME)); + this.setServiceName(MDC.get(SERVICE_NAME)); + this.setServer(MDC.get(SERVER)); + this.setServerIpAddress(MDC.get(SERVER_IP_ADDRESS)); + this.setServerFqdn(MDC.get(SERVER_FQDN)); + this.setVirtualServerName(MDC.get(VIRTUAL_SERVER_NAME)); + + this.setStartTime(Instant.now()); + this.setInvocationId(invocationId); + } + + /** + * copy constructor transaction/subtransaction + * + * @param transaction + */ + public MDCTransactionImpl(MDCTransaction transaction) { + MDC.clear(); + this.setAlertSeverity(transaction.getAlertSeverity()); + this.setClientIpAddress(transaction.getClientIpAddress()); + this.setElapsedTime(transaction.getElapsedTime()); + this.setEndTime(transaction.getEndTime()); + this.setInstanceUUID(transaction.getInstanceUUID()); + this.setInvocationId(transaction.getInvocationId()); + this.setPartner(transaction.getPartner()); + this.setProcessKey(transaction.getProcessKey()); + this.setRemoteHost(transaction.getRemoteHost()); + this.setRequestId(transaction.getRequestId()); + this.setResponseCode(transaction.getResponseCode()); + this.setResponseDescription(transaction.getResponseDescription()); + this.setServer(transaction.getServer()); + this.setServerFqdn(transaction.getServerFqdn()); + this.setServerIpAddress(transaction.getServerIpAddress()); + this.setServiceInstanceId(transaction.getServiceInstanceId()); + this.setServiceName(transaction.getServiceName()); + this.setSeverity(transaction.getSeverity()); + this.setStartTime(transaction.getStartTime()); + this.setStatusCode(transaction.getStatusCode()); + this.setTargetEntity(transaction.getTargetEntity()); + this.setTargetServiceName(transaction.getTargetServiceName()); + this.setTargetVirtualEntity(transaction.getTargetVirtualEntity()); + this.setVirtualServerName(transaction.getVirtualServerName()); + } + + /** + * reset subtransaction portion + * + * @return MDCTransaction + */ + @Override + public MDCTransaction resetSubTransaction() { + MDC.remove(INVOCATION_ID); + MDC.remove(BEGIN_TIMESTAMP); + MDC.remove(END_TIMESTAMP); + MDC.remove(ELAPSED_TIME); + MDC.remove(SERVICE_INSTANCE_ID); + MDC.remove(STATUS_CODE); + MDC.remove(RESPONSE_CODE); + MDC.remove(RESPONSE_DESCRIPTION); + MDC.remove(INSTANCE_UUID); + MDC.remove(TARGET_ENTITY); + MDC.remove(TARGET_SERVICE_NAME); + MDC.remove(PROCESS_KEY); + MDC.remove(CLIENT_IP_ADDRESS); + MDC.remove(REMOTE_HOST); + MDC.remove(ALERT_SEVERITY); + MDC.remove(TARGET_VIRTUAL_ENTITY); + + return this; + } + + @Override + public MDCTransaction resetTransaction() { + MDC.clear(); + return this; + } + + /** + * flush transaction to MDC + */ + @Override + public MDCTransaction flush() { + if (this.requestId != null && !this.requestId.isEmpty()) + MDC.put(REQUEST_ID, this.requestId); + + if (this.invocationId != null && !this.invocationId.isEmpty()) + MDC.put(INVOCATION_ID, this.invocationId); + + if (this.partner != null) + MDC.put(PARTNER_NAME, this.partner); + + if (this.virtualServerName != null) + MDC.put(VIRTUAL_SERVER_NAME, this.virtualServerName); + + if (this.server != null) + MDC.put(SERVER, this.server); + + if (this.serverIpAddress != null) + MDC.put(SERVER_IP_ADDRESS, this.serverIpAddress); + + if (this.serverFqdn != null) + MDC.put(SERVER_FQDN, this.serverFqdn); + + if (this.serviceName != null) + MDC.put(SERVICE_NAME, this.serviceName); + + if (this.startTime != null) + MDC.put(BEGIN_TIMESTAMP, timestamp(this.startTime)); + + if (this.endTime != null) { + MDC.put(END_TIMESTAMP, timestamp(this.endTime)); + } else { + this.setEndTime(null); + MDC.put(END_TIMESTAMP, timestamp(this.endTime)); + } + + if (this.elapsedTime != null) { + MDC.put(ELAPSED_TIME, String.valueOf(this.elapsedTime)); + } else { + if (endTime != null && startTime != null) { + this.elapsedTime = Duration.between(startTime, endTime).toMillis(); + MDC.put(ELAPSED_TIME, String.valueOf(this.elapsedTime)); + } + } + + if (this.serviceInstanceId != null) + MDC.put(SERVICE_INSTANCE_ID, this.serviceInstanceId); + + if (this.instanceUUID != null) + MDC.put(INSTANCE_UUID, this.instanceUUID); + + if (this.processKey != null) + MDC.put(PROCESS_KEY, this.processKey); + + if (this.statusCode != null) + MDC.put(STATUS_CODE, this.statusCode); + + if (this.responseCode != null) + MDC.put(RESPONSE_CODE, this.responseCode); + + if (this.responseDescription != null) + MDC.put(RESPONSE_DESCRIPTION, this.responseDescription); + + if (this.severity != null) + MDC.put(SEVERITY, this.severity); + + if (this.alertSeverity != null) + MDC.put(ALERT_SEVERITY, this.alertSeverity); + + if (this.targetEntity != null) + MDC.put(TARGET_ENTITY, this.targetEntity); + + if (this.targetServiceName != null) + MDC.put(TARGET_SERVICE_NAME, this.targetServiceName); + + if (this.targetVirtualEntity != null) + MDC.put(TARGET_VIRTUAL_ENTITY, this.targetVirtualEntity); + + if (this.clientIpAddress != null) + MDC.put(CLIENT_IP_ADDRESS, this.clientIpAddress); + + if (this.remoteHost != null) + MDC.put(REMOTE_HOST, this.remoteHost); + + return this; + } + + @Override + public MDCTransaction metric() { + this.flush(); + logger.info(LoggerUtil.METRIC_LOG_MARKER, ""); + return this; + } + + @Override + public MDCTransaction transaction() { + this.flush(); + logger.info(LoggerUtil.TRANSACTION_LOG_MARKER, ""); + return this; + } + + @Override + public MDCTransaction setEndTime(Instant endTime) { + if (endTime == null) { + this.endTime = Instant.now(); + } else { + this.endTime = endTime; + } + return this; + } + + @Override + public MDCTransaction setElapsedTime(Long elapsedTime) { + this.elapsedTime = elapsedTime; + return this; + } + + @Override + public MDCTransaction setServiceInstanceId(String serviceInstanceId) { + this.serviceInstanceId = serviceInstanceId; + return this; + } + + @Override + public MDCTransaction setProcessKey(String processKey) { + this.processKey = processKey; + return this; + } + + @Override + public MDCTransaction setAlertSeverity(String alertSeverity) { + this.alertSeverity = alertSeverity; + return this; + } + + @Override + public MDCTransaction setClientIpAddress(String clientIpAddress) { + this.clientIpAddress = clientIpAddress; + return this; + } + + @Override + public MDCTransaction setRemoteHost(String remoteHost) { + this.remoteHost = remoteHost; + return this; + } + + @Override + public Instant getStartTime() { + return this.startTime; + } + + @Override + public String getServer() { + return this.server; + } + + @Override + public Instant getEndTime() { + return this.endTime; + } + + @Override + public Long getElapsedTime() { + return this.elapsedTime; + } + + @Override + public String getRemoteHost() { + return this.remoteHost; + } + + @Override + public String getClientIpAddress() { + return this.clientIpAddress; + } + + @Override + public String getAlertSeverity() { + return this.alertSeverity; + } + + @Override + public String getProcessKey() { + return this.processKey; + } + + @Override + public String getServiceInstanceId() { + return this.serviceInstanceId; + } + + /* transaction and subtransaction fields */ + + @Override + public MDCTransaction setInvocationId(String invocationId) { + if (invocationId == null) { + this.invocationId = UUID.randomUUID().toString(); + } else { + this.invocationId = invocationId; + } + + MDC.put(INVOCATION_ID, this.invocationId); + + return this; + } + + @Override + public MDCTransaction setStartTime(Instant startTime) { + if (startTime == null) { + this.startTime = Instant.now(); + } else { + this.startTime = startTime; + } + + MDC.put(BEGIN_TIMESTAMP, this.timestamp(this.startTime)); + + return this; + } + + @Override + public MDCTransaction setServiceName(String serviceName) { + if (serviceName == null || serviceName.isEmpty()) { + this.serviceName = DEFAULT_SERVICE_NAME; + } else { + this.serviceName = serviceName; + } + + MDC.put(SERVICE_NAME, this.serviceName); + + return this; + } + + @Override + public MDCTransaction setStatusCode(String statusCode) { + this.statusCode = statusCode; + return this; + } + + @Override + public MDCTransaction setStatusCode(boolean success) { + if (success) { + this.statusCode = STATUS_CODE_COMPLETE; + } else { + this.statusCode = STATUS_CODE_FAILURE; + } + return this; + } + + @Override + public MDCTransaction setResponseCode(String responseCode) { + this.responseCode = responseCode; + return this; + } + + @Override + public MDCTransaction setResponseDescription(String responseDescription) { + this.responseDescription = responseDescription; + return this; + } + + @Override + public MDCTransaction setInstanceUUID(String instanceUUID) { + if (instanceUUID == null) { + this.instanceUUID = UUID.randomUUID().toString(); + } else { + this.instanceUUID = instanceUUID; + } + + MDC.put(INSTANCE_UUID, this.instanceUUID); + return this; + } + + @Override + public MDCTransaction setSeverity(String severity) { + this.severity = severity; + return this; + } + + @Override + public MDCTransaction setTargetEntity(String targetEntity) { + this.targetEntity = targetEntity; + return this; + } + + @Override + public MDCTransaction setTargetServiceName(String targetServiceName) { + this.targetServiceName = targetServiceName; + return this; + } + + @Override + public MDCTransaction setTargetVirtualEntity(String targetVirtualEntity) { + this.targetVirtualEntity = targetVirtualEntity; + return this; + } + + @Override + public String getInvocationId() { + return invocationId; + } + + @Override + public String getServiceName() { + return serviceName; + } + + @Override + public String getStatusCode() { + return statusCode; + } + + @Override + public String getResponseDescription() { + return responseDescription; + } + + @Override + public String getInstanceUUID() { + return instanceUUID; + } + + @Override + public String getSeverity() { + return severity; + } + + @Override + public String getTargetEntity() { + return targetEntity; + } + + @Override + public String getTargetServiceName() { + return targetServiceName; + } + + @Override + public String getTargetVirtualEntity() { + return targetVirtualEntity; + } + + @Override + public String getResponseCode() { + return responseCode; + } + + /* inheritable fields by subtransactions via MDC */ + + @Override + public MDCTransaction setRequestId(String requestId) { + if (requestId == null || requestId.isEmpty()) { + this.requestId = UUID.randomUUID().toString(); + } else { + this.requestId = requestId; + } + + MDC.put(REQUEST_ID, this.requestId); + return this; + } + + @Override + public MDCTransaction setPartner(String partner) { + if (partner == null || partner.isEmpty()) { + this.partner = DEFAULT_SERVICE_NAME; + } else { + this.partner = partner; + } + + MDC.put(PARTNER_NAME, this.partner); + return this; + } + + @Override + public MDCTransaction setServer(String server) { + if (server == null || server.isEmpty()) { + this.server = DEFAULT_HOSTNAME; + } else { + this.server = server; + } + + MDC.put(SERVER, this.server); + return this; + } + + @Override + public MDCTransaction setServerIpAddress(String serverIpAddress) { + if (serverIpAddress == null || serverIpAddress.isEmpty()) { + this.serverIpAddress = DEFAULT_HOSTIP; + } else { + this.serverIpAddress = serverIpAddress; + } + + MDC.put(SERVER_IP_ADDRESS, this.serverIpAddress); + return this; + } + + @Override + public MDCTransaction setServerFqdn(String serverFqdn) { + if (serverFqdn == null || serverFqdn.isEmpty()) { + this.serverFqdn = DEFAULT_HOSTNAME; + } else { + this.serverFqdn = serverFqdn; + } + + MDC.put(SERVER_FQDN, this.serverFqdn); + return this; + } + + @Override + public MDCTransaction setVirtualServerName(String virtualServerName) { + if (virtualServerName == null || virtualServerName.isEmpty()) { + this.virtualServerName = DEFAULT_HOSTNAME; + } else { + this.virtualServerName = virtualServerName; + } + + MDC.put(VIRTUAL_SERVER_NAME, this.virtualServerName); + return this; + } + + @Override + public String getRequestId() { + return requestId; + } + + @Override + public String getPartner() { + return partner; + } + + @Override + public String getServerFqdn() { + return serverFqdn; + } + + @Override + public String getVirtualServerName() { + return virtualServerName; + } + + @Override + public String getServerIpAddress() { + return serverIpAddress; + } + + @Override + public String timestamp(Instant time) { + return new SimpleDateFormat(DATE_FORMAT).format(Date.from(time)); + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("MDCTransaction{"); + sb.append("requestId='").append(requestId).append('\''); + sb.append(", partner='").append(partner).append('\''); + sb.append(", invocationId='").append(invocationId).append('\''); + sb.append(", virtualServerName='").append(virtualServerName).append('\''); + sb.append(", server='").append(server).append('\''); + sb.append(", serverIpAddress='").append(serverIpAddress).append('\''); + sb.append(", serverFqdn='").append(serverFqdn).append('\''); + sb.append(", serviceName='").append(serviceName).append('\''); + sb.append(", startTime=").append(startTime); + sb.append(", endTime=").append(endTime); + sb.append(", elapsedTime=").append(elapsedTime); + sb.append(", serviceInstanceId='").append(serviceInstanceId).append('\''); + sb.append(", instanceUUID='").append(instanceUUID).append('\''); + sb.append(", processKey='").append(processKey).append('\''); + sb.append(", statusCode='").append(statusCode).append('\''); + sb.append(", responseCode='").append(responseCode).append('\''); + sb.append(", responseDescription='").append(responseDescription).append('\''); + sb.append(", severity='").append(severity).append('\''); + sb.append(", alertSeverity='").append(alertSeverity).append('\''); + sb.append(", targetEntity='").append(targetEntity).append('\''); + sb.append(", targetServiceName='").append(targetServiceName).append('\''); + sb.append(", targetVirtualEntity='").append(targetVirtualEntity).append('\''); + sb.append(", clientIpAddress='").append(clientIpAddress).append('\''); + sb.append(", remoteHost='").append(remoteHost).append('\''); + sb.append('}'); + return sb.toString(); + } + +} diff --git a/policy-utils/src/test/java/org/onap/policy/drools/utils/NetworkUtilTest.java b/policy-utils/src/test/java/org/onap/policy/drools/utils/NetworkUtilTest.java index c8b7735b..406cdae9 100644 --- a/policy-utils/src/test/java/org/onap/policy/drools/utils/NetworkUtilTest.java +++ b/policy-utils/src/test/java/org/onap/policy/drools/utils/NetworkUtilTest.java @@ -32,6 +32,8 @@ public class NetworkUtilTest { public void test() throws InterruptedException, IOException { assertNotNull(NetworkUtil.IPv4_WILDCARD_ADDRESS); assertFalse(NetworkUtil.isTcpPortOpen("localhost", 8080, 1, 5)); + assertNotNull(NetworkUtil.getHostname()); + assertNotNull(NetworkUtil.getHostIp()); } } diff --git a/policy-utils/src/test/java/org/onap/policy/drools/utils/LoggerUtilTest.java b/policy-utils/src/test/java/org/onap/policy/drools/utils/logging/LoggerUtilTest.java index d942a427..d773b265 100644 --- a/policy-utils/src/test/java/org/onap/policy/drools/utils/LoggerUtilTest.java +++ b/policy-utils/src/test/java/org/onap/policy/drools/utils/logging/LoggerUtilTest.java @@ -17,17 +17,40 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.policy.drools.utils; +package org.onap.policy.drools.utils.logging; import static org.junit.Assert.*; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class LoggerUtilTest { @Test public void test() { - assertNotNull(LoggerUtil.setLevel("foo", "warn")); + + Logger logger = LoggerFactory.getLogger(LoggerUtilTest.class); + + assertTrue(logger.isInfoEnabled()); + + logger.info("line 1"); + logger.info(LoggerUtil.METRIC_LOG_MARKER, "line 1 Metric"); + logger.info(LoggerUtil.TRANSACTION_LOG_MARKER, "line 1 Transaction"); + + LoggerUtil.setLevel(LoggerUtil.ROOT_LOGGER, "warn"); + logger.info("line 2"); + logger.info(LoggerUtil.METRIC_LOG_MARKER, "line 2 Metric"); + logger.info(LoggerUtil.TRANSACTION_LOG_MARKER, "line 2 Transaction"); + + assertFalse(logger.isInfoEnabled()); + + LoggerUtil.setLevel(LoggerUtil.ROOT_LOGGER, "debug"); + logger.debug("line 3"); + logger.debug(LoggerUtil.METRIC_LOG_MARKER, "line 3 Metric"); + logger.debug(LoggerUtil.TRANSACTION_LOG_MARKER, "line 3 Transaction"); + + assertTrue(logger.isDebugEnabled()); } } diff --git a/policy-utils/src/test/java/org/onap/policy/drools/utils/logging/MDCTransactionTest.java b/policy-utils/src/test/java/org/onap/policy/drools/utils/logging/MDCTransactionTest.java new file mode 100644 index 00000000..f6c48daf --- /dev/null +++ b/policy-utils/src/test/java/org/onap/policy/drools/utils/logging/MDCTransactionTest.java @@ -0,0 +1,265 @@ +/*- + * ============LICENSE_START======================================================= + * policy-utils + * ================================================================================ + * Copyright (C) 2018 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. + */ +package org.onap.policy.drools.utils.logging; + +import static org.junit.Assert.*; + +import java.time.Duration; +import java.time.Instant; +import org.junit.Test; +import org.slf4j.MDC; + +public class MDCTransactionTest { + + @Test + public void resetSubTransaction() { + MDCTransaction trans = + MDCTransaction.newTransaction(null, null).resetSubTransaction(); + + assertNotNull(trans.getRequestId()); + assertNotNull(trans.getPartner()); + assertNotNull(trans.getServiceName()); + assertNotNull(trans.getServer()); + assertNotNull(trans.getServerIpAddress()); + assertNotNull(trans.getServerFqdn()); + assertNotNull(trans.getVirtualServerName()); + assertNotNull(trans.getStartTime()); + + assertNullSubTransactionFields(trans); + + assertNotNull(MDC.get(MDCTransaction.REQUEST_ID)); + assertNotNull(MDC.get(MDCTransaction.PARTNER_NAME)); + assertNotNull(MDC.get(MDCTransaction.VIRTUAL_SERVER_NAME)); + assertNotNull(MDC.get(MDCTransaction.SERVER)); + assertNotNull(MDC.get(MDCTransaction.SERVER_IP_ADDRESS)); + assertNotNull(MDC.get(MDCTransaction.SERVER_FQDN)); + assertNotNull(MDC.get(MDCTransaction.SERVICE_NAME)); + + assertNull(MDC.get(MDCTransaction.INVOCATION_ID)); + assertNull(MDC.get(MDCTransaction.BEGIN_TIMESTAMP)); + assertNull(MDC.get(MDCTransaction.END_TIMESTAMP)); + assertNull(MDC.get(MDCTransaction.ELAPSED_TIME)); + assertNull(MDC.get(MDCTransaction.SERVICE_INSTANCE_ID)); + assertNull(MDC.get(MDCTransaction.INSTANCE_UUID)); + assertNull(MDC.get(MDCTransaction.PROCESS_KEY)); + assertNull(MDC.get(MDCTransaction.STATUS_CODE)); + assertNull(MDC.get(MDCTransaction.RESPONSE_CODE)); + assertNull(MDC.get(MDCTransaction.RESPONSE_DESCRIPTION)); + assertNull(MDC.get(MDCTransaction.SEVERITY)); + assertNull(MDC.get(MDCTransaction.ALERT_SEVERITY)); + assertNull(MDC.get(MDCTransaction.TARGET_ENTITY)); + assertNull(MDC.get(MDCTransaction.TARGET_SERVICE_NAME)); + assertNull(MDC.get(MDCTransaction.TARGET_VIRTUAL_ENTITY)); + assertNull(MDC.get(MDCTransaction.CLIENT_IP_ADDRESS)); + assertNull(MDC.get(MDCTransaction.REMOTE_HOST)); + + assertEquals(trans.getRequestId(), MDC.get(MDCTransaction.REQUEST_ID)); + assertEquals(trans.getPartner(), MDC.get(MDCTransaction.PARTNER_NAME)); + assertEquals(trans.getVirtualServerName(), MDC.get(MDCTransaction.VIRTUAL_SERVER_NAME)); + assertEquals(trans.getServer(), MDC.get(MDCTransaction.SERVER)); + assertEquals(trans.getServerIpAddress(), MDC.get(MDCTransaction.SERVER_IP_ADDRESS)); + assertEquals(trans.getServerFqdn(), MDC.get(MDCTransaction.SERVER_FQDN)); + assertEquals(trans.getServiceName(), MDC.get(MDCTransaction.SERVICE_NAME)); + } + + private void assertNullSubTransactionFields(MDCTransaction trans) { + assertNull(trans.getInvocationId()); + assertNullSubTransactionFieldsButInvocationId(trans); + } + + private void assertNullSubTransactionFieldsButInvocationId(MDCTransaction trans) { + assertNull(trans.getEndTime()); + assertNull(trans.getElapsedTime()); + assertNull(trans.getServiceInstanceId()); + assertNull(trans.getStatusCode()); + assertNull(trans.getResponseCode()); + assertNull(trans.getResponseDescription()); + assertNull(trans.getInstanceUUID()); + assertNull(trans.getTargetEntity()); + assertNull(trans.getTargetServiceName()); + assertNull(trans.getProcessKey()); + assertNull(trans.getClientIpAddress()); + assertNull(trans.getRemoteHost()); + assertNull(trans.getAlertSeverity()); + assertNull(trans.getTargetVirtualEntity()); + } + + protected void assertTransactionFields(MDCTransaction trans) { + assertEquals(trans.getRequestId(), MDC.get(MDCTransaction.REQUEST_ID)); + assertEquals(trans.getPartner(), MDC.get(MDCTransaction.PARTNER_NAME)); + assertEquals(trans.getVirtualServerName(), MDC.get(MDCTransaction.VIRTUAL_SERVER_NAME)); + assertEquals(trans.getServer(), MDC.get(MDCTransaction.SERVER)); + assertEquals(trans.getServerIpAddress(), MDC.get(MDCTransaction.SERVER_IP_ADDRESS)); + assertEquals(trans.getServerFqdn(), MDC.get(MDCTransaction.SERVER_FQDN)); + assertEquals(trans.getServiceName(), MDC.get(MDCTransaction.SERVICE_NAME)); + + } + + @Test + public void flush() { + MDCTransaction trans = + MDCTransaction.newTransaction(). + setRequestId(null). + setInvocationId(null). + setPartner(null). + setVirtualServerName(null). + setServer(null). + setServerIpAddress(null). + setServerFqdn(null). + setServiceName(null). + setStartTime(null). + setEndTime(null). + setServiceInstanceId("service-instance-id"). + setInstanceUUID(null). + setProcessKey("process-key"). + setStatusCode("status-code"). + setResponseCode("response-code"). + setResponseDescription("response-description"). + setSeverity("severity"). + setAlertSeverity("alert-severity"). + setTargetEntity("target-entity"). + setTargetServiceName("target-service-name"). + setTargetVirtualEntity("target-virtual-entity"). + setClientIpAddress("client-ip-address"). + setRemoteHost("remote-host"). + flush(); + + assertTransactionFields(trans); + + assertNotNull(MDC.get(MDCTransaction.INVOCATION_ID)); + assertNotNull(MDC.get(MDCTransaction.BEGIN_TIMESTAMP)); + assertNotNull(MDC.get(MDCTransaction.END_TIMESTAMP)); + assertNotNull(MDC.get(MDCTransaction.ELAPSED_TIME)); + assertNotNull(MDC.get(MDCTransaction.SERVICE_INSTANCE_ID)); + assertNotNull(MDC.get(MDCTransaction.INSTANCE_UUID)); + assertNotNull(MDC.get(MDCTransaction.PROCESS_KEY)); + assertNotNull(MDC.get(MDCTransaction.STATUS_CODE)); + assertNotNull(MDC.get(MDCTransaction.RESPONSE_CODE)); + assertNotNull(MDC.get(MDCTransaction.RESPONSE_DESCRIPTION)); + assertNotNull(MDC.get(MDCTransaction.SEVERITY)); + assertNotNull(MDC.get(MDCTransaction.ALERT_SEVERITY)); + assertNotNull(MDC.get(MDCTransaction.TARGET_ENTITY)); + assertNotNull(MDC.get(MDCTransaction.TARGET_SERVICE_NAME)); + assertNotNull(MDC.get(MDCTransaction.TARGET_VIRTUAL_ENTITY)); + assertNotNull(MDC.get(MDCTransaction.CLIENT_IP_ADDRESS)); + assertNotNull(MDC.get(MDCTransaction.REMOTE_HOST)); + + assertEquals(trans.getInvocationId(), MDC.get(MDCTransaction.INVOCATION_ID)); + assertEquals(trans.timestamp(trans.getStartTime()), MDC.get(MDCTransaction.BEGIN_TIMESTAMP)); + assertEquals(trans.timestamp(trans.getEndTime()), MDC.get(MDCTransaction.END_TIMESTAMP)); + assertNotEquals(trans.getElapsedTime(), MDC.get(MDCTransaction.ELAPSED_TIME)); + assertEquals(String.valueOf(Duration.between(trans.getStartTime(), trans.getEndTime()).toMillis()), + MDC.get(MDCTransaction.ELAPSED_TIME)); + assertEquals(trans.getServiceInstanceId(), MDC.get(MDCTransaction.SERVICE_INSTANCE_ID)); + assertEquals(trans.getInstanceUUID(), MDC.get(MDCTransaction.INSTANCE_UUID)); + assertEquals(trans.getProcessKey(),MDC.get(MDCTransaction.PROCESS_KEY)); + assertEquals(trans.getStatusCode(), MDC.get(MDCTransaction.STATUS_CODE)); + assertEquals(trans.getResponseCode(), MDC.get(MDCTransaction.RESPONSE_CODE)); + assertEquals(trans.getResponseDescription(), MDC.get(MDCTransaction.RESPONSE_DESCRIPTION)); + assertEquals(trans.getSeverity(), MDC.get(MDCTransaction.SEVERITY)); + assertEquals(trans.getAlertSeverity(), MDC.get(MDCTransaction.ALERT_SEVERITY)); + assertEquals(trans.getTargetEntity(), MDC.get(MDCTransaction.TARGET_ENTITY)); + assertEquals(trans.getTargetServiceName(), MDC.get(MDCTransaction.TARGET_SERVICE_NAME)); + assertEquals(trans.getTargetVirtualEntity(), MDC.get(MDCTransaction.TARGET_VIRTUAL_ENTITY)); + assertEquals(trans.getClientIpAddress(), MDC.get(MDCTransaction.CLIENT_IP_ADDRESS)); + assertEquals(trans.getRemoteHost(), MDC.get(MDCTransaction.REMOTE_HOST)); + + assertEquals(trans.getServiceInstanceId(),"service-instance-id"); + assertEquals(trans.getProcessKey(),"process-key"); + assertEquals(trans.getStatusCode(),"status-code"); + assertEquals(trans.getResponseCode(),"response-code"); + assertEquals(trans.getResponseDescription(),"response-description"); + assertEquals(trans.getSeverity(),"severity"); + assertEquals(trans.getAlertSeverity(),"alert-severity"); + assertEquals(trans.getTargetEntity(),"target-entity"); + assertEquals(trans.getTargetServiceName(),"target-service-name"); + assertEquals(trans.getTargetVirtualEntity(),"target-virtual-entity"); + assertEquals(trans.getClientIpAddress(),"client-ip-address"); + assertEquals(trans.getRemoteHost(),"remote-host"); + } + + @Test + public void metric() { + MDCTransaction trans = + MDCTransaction.newTransaction(null, null).metric(); + + assertTransactionFields(trans); + } + + @Test + public void transaction() { + MDCTransaction trans = + MDCTransaction.newTransaction(null, null).transaction(); + + assertTransactionFields(trans); + } + + @Test + public void subTransaction() { + MDCTransaction trans = + MDCTransaction.newTransaction(null, "partner"); + + MDCTransaction subTrans = MDCTransaction.newSubTransaction(null); + + assertTransactionFields(trans); + assertTransactionFields(subTrans); + + assertEquals(trans.getRequestId(), trans.getRequestId()); + assertEquals(trans.getPartner(), trans.getPartner()); + assertEquals(trans.getVirtualServerName(), trans.getVirtualServerName()); + assertEquals(trans.getServer(), trans.getServer()); + assertEquals(trans.getServerIpAddress(), trans.getServerIpAddress()); + assertEquals(trans.getServerFqdn(), trans.getServerFqdn()); + assertEquals(trans.getServiceName(), trans.getServiceName()); + + assertNotEquals(trans.getInvocationId(), subTrans.getInvocationId()); + assertNull(trans.getInvocationId()); + assertNotNull(subTrans.getInvocationId()); + + assertNotNull(subTrans.getStartTime()); + assertNullSubTransactionFieldsButInvocationId(trans); + + subTrans.setServiceInstanceId("service-instance-id"). + setInstanceUUID(null). + setProcessKey("process-key"). + setStatusCode("status-code"). + setResponseCode("response-code"). + setResponseDescription("response-description"). + setSeverity("severity"). + setAlertSeverity("alert-severity"). + setTargetEntity("target-entity"). + setTargetServiceName("target-service-name"). + setTargetVirtualEntity("target-virtual-entity"). + setClientIpAddress("client-ip-address"). + setRemoteHost("remote-host"). + setEndTime(Instant.now()); + + subTrans.setStatusCode(false).setResponseCode("400"); + + MDCTransaction subTrans2 = MDCTransaction.fromTransaction(subTrans); + + assertEquals(subTrans.toString(), subTrans2.toString()); + + subTrans.metric(); + subTrans2.setStatusCode("202").setProcessKey("junit").metric(); + + trans.resetSubTransaction().setStatusCode(true).setResponseCode("200").metric(); + } + +}
\ No newline at end of file diff --git a/policy-utils/src/test/resources/logback-test.xml b/policy-utils/src/test/resources/logback-test.xml new file mode 100644 index 00000000..366a5f67 --- /dev/null +++ b/policy-utils/src/test/resources/logback-test.xml @@ -0,0 +1,36 @@ +<!-- + ============LICENSE_START======================================================= + ONAP + ================================================================================ + Copyright (C) 2018 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========================================================= +--> + +<configuration> + + <property name="pattern" value="%X{RequestID}|%X{InvocationID}|%X{ServiceName}|%X{PartnerName}|%X{BeginTimestamp}|%X{EndTimestamp}|%X{ElapsedTime}|%X{ServiceInstanceID}|%X{VirtualServerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%X{Severity}|%X{TargetEntity}|%X{TargetServiceName}|%X{Server}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{ClientIPAddress}|%X{ProcessKey}|%X{RemoteHost}|%X{AlertSeverity}|%X{TargetVirtualEntity}|%level|%logger{0}|%thread| %msg%n"/> + + <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> + <filter class="org.onap.policy.drools.utils.logging.LoggerMarkerFilter$MetricLoggerMarkerFilter" /> + <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> + <Pattern>${pattern}</Pattern> + </encoder> + </appender> + + <root level="INFO"> + <appender-ref ref="STDOUT"/> + </root> + +</configuration> |