From 0258442c39183fdd7e4812054d095cafdcab420d Mon Sep 17 00:00:00 2001 From: vempo Date: Wed, 25 Apr 2018 15:28:48 +0300 Subject: Expose tracing context via log context service Tracing context must be available to application code when the application makes outbound calls. Change-Id: Ica8e1f9d8e0bd6d37688a01a64c1fbedc126801c Issue-ID: SDC-1264 Signed-off-by: vempo --- .../openecomp/sdc/logging/slf4j/MDCDelegate.java | 21 +++++++++ .../sdc/logging/slf4j/RequestContextProvider.java | 13 +++++- .../logging/slf4j/SLF4JLoggingServiceProvider.java | 7 ++- .../sdc/logging/slf4j/LoggingContextTest.java | 30 +++++++++++- .../logging/slf4j/RequestContextProviderTest.java | 53 ++++++++++++++++++---- 5 files changed, 113 insertions(+), 11 deletions(-) (limited to 'openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core') diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/MDCDelegate.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/MDCDelegate.java index 8d719a2da8..026d3fa99b 100644 --- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/MDCDelegate.java +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/MDCDelegate.java @@ -49,6 +49,27 @@ class MDCDelegate { return copy; } + /** + * Reads all context fields from MDC. + */ + static Map get() { + return get(ContextField.values()); + } + + /** + * Reads selected fields from MDC. + */ + static Map get(ContextField... fields) { + + Map values = new EnumMap<>(ContextField.class); + + for (ContextField key : fields) { + values.put(key, MDC.get(key.asKey())); + } + + return values; + } + /** * Entirely replaces the logging MDC context with the content of the argument. Logging keys that are not present in * the input map will be cleared from MDC. diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/RequestContextProvider.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/RequestContextProvider.java index d79771c1c5..40684cc132 100644 --- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/RequestContextProvider.java +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/RequestContextProvider.java @@ -30,10 +30,21 @@ class RequestContextProvider implements ContextProvider { private final ContextData data; - RequestContextProvider(ContextData contextData) { + private RequestContextProvider(ContextData contextData) { this.data = contextData; } + static RequestContextProvider from(ContextData contextData) { + return new RequestContextProvider(contextData); + } + + static ContextData to(Map values) { + return ContextData.builder() + .requestId(values.get(ContextField.REQUEST_ID)) + .serviceName(values.get(ContextField.SERVICE_NAME)) + .partnerName(values.get(ContextField.PARTNER_NAME)).build(); + } + @Override public Map values() { diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggingServiceProvider.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggingServiceProvider.java index 1a5d6facc2..9d4d507ac5 100644 --- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggingServiceProvider.java +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggingServiceProvider.java @@ -45,7 +45,12 @@ public class SLF4JLoggingServiceProvider implements LoggingServiceProvider { @Override public void put(ContextData contextData) { Objects.requireNonNull(contextData, "Context data cannot be null"); - MDCDelegate.put(new RequestContextProvider(contextData), new GlobalContextProvider()); + MDCDelegate.put(RequestContextProvider.from(contextData), new GlobalContextProvider()); + } + + @Override + public ContextData get() { + return RequestContextProvider.to(MDCDelegate.get()); } @Override diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/slf4j/LoggingContextTest.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/slf4j/LoggingContextTest.java index 47386d4cf3..c2cef88899 100644 --- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/slf4j/LoggingContextTest.java +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/slf4j/LoggingContextTest.java @@ -42,7 +42,7 @@ public class LoggingContextTest { @Test public void returnMdcWrapperWhenToRunnableCalled() { - assertEquals(LoggingContext.copyToRunnable(() -> {}).getClass(), MDCRunnableWrapper.class); + assertEquals(LoggingContext.copyToRunnable(() -> { }).getClass(), MDCRunnableWrapper.class); } @Test(expectedExceptions = NullPointerException.class) @@ -140,4 +140,32 @@ public class LoggingContextTest { LoggingContext.put(context); assertNotNull(MDC.get(ContextField.INSTANCE_ID.asKey())); } + + @Test + public void contextReturnsServiceNameWhenPut() { + + String random = UUID.randomUUID().toString(); + ContextData context = ContextData.builder().serviceName(random).build(); + LoggingContext.put(context); + assertEquals(context, LoggingContext.get()); + } + + @Test + public void contextReturnsRequestIdWhenPut() { + + String random = UUID.randomUUID().toString(); + ContextData context = ContextData.builder().requestId(random).build(); + LoggingContext.put(context); + assertEquals(context, LoggingContext.get()); + } + + @Test + public void contextReturnsPartnerNameWhenPut() { + + String random = UUID.randomUUID().toString(); + ContextData context = ContextData.builder().partnerName(random).build(); + LoggingContext.put(context); + assertEquals(context, LoggingContext.get()); + } + } diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/slf4j/RequestContextProviderTest.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/slf4j/RequestContextProviderTest.java index fa7926acef..a2d36ef085 100644 --- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/slf4j/RequestContextProviderTest.java +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/slf4j/RequestContextProviderTest.java @@ -17,8 +17,10 @@ package org.openecomp.sdc.logging.slf4j; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNull; import static org.testng.Assert.assertTrue; +import java.util.HashMap; import org.openecomp.sdc.logging.api.ContextData; import org.testng.annotations.Test; @@ -31,32 +33,67 @@ import org.testng.annotations.Test; public class RequestContextProviderTest { @Test - public void valuesEmptyWhenInputEmpty() { - RequestContextProvider provider = new RequestContextProvider(ContextData.builder().build()); + public void valuesEmptyWhenInputDataEmpty() { + RequestContextProvider provider = RequestContextProvider.from(ContextData.builder().build()); assertTrue(provider.values().isEmpty()); } @Test - public void serviceNameReturnedWhenSupplied() { + public void serviceNameReturnedWhenSuppliedInData() { final String service = "supplied-service-name"; RequestContextProvider provider = - new RequestContextProvider(ContextData.builder().serviceName(service).build()); + RequestContextProvider.from(ContextData.builder().serviceName(service).build()); assertEquals(provider.values().get(ContextField.SERVICE_NAME), service); } @Test - public void partnerNameReturnedWhenSupplied() { + public void partnerNameReturnedWhenSuppliedInData() { final String partner = "supplied-partner-name"; RequestContextProvider provider = - new RequestContextProvider(ContextData.builder().partnerName(partner).build()); + RequestContextProvider.from(ContextData.builder().partnerName(partner).build()); assertEquals(provider.values().get(ContextField.PARTNER_NAME), partner); } @Test - public void requestIdReturnedWhenSupplied() { + public void requestIdReturnedWhenSuppliedInData() { final String request = "supplied-request-id"; RequestContextProvider provider = - new RequestContextProvider(ContextData.builder().requestId(request).build()); + RequestContextProvider.from(ContextData.builder().requestId(request).build()); assertEquals(provider.values().get(ContextField.REQUEST_ID), request); } + + @Test + public void dataEmptyWhenValuesEmpty() { + ContextData data = RequestContextProvider.to(new HashMap<>()); + assertNull(data.getPartnerName()); + assertNull(data.getRequestId()); + assertNull(data.getServiceName()); + } + + @Test + public void serviceNameInDataWhenSuppliedInValues() { + final String service = "values-service-name"; + HashMap values = new HashMap<>(); + values.put(ContextField.SERVICE_NAME, service); + ContextData data = RequestContextProvider.to(values); + assertEquals(data.getServiceName(), service); + } + + @Test + public void partnerNameInDataWhenSuppliedInValues() { + final String partner = "values-partner-name"; + HashMap values = new HashMap<>(); + values.put(ContextField.PARTNER_NAME, partner); + ContextData data = RequestContextProvider.to(values); + assertEquals(data.getPartnerName(), partner); + } + + @Test + public void requestIdInDataWhenSuppliedInValues() { + final String request = "values-request-id"; + HashMap values = new HashMap<>(); + values.put(ContextField.REQUEST_ID, request); + ContextData data = RequestContextProvider.to(values); + assertEquals(data.getRequestId(), request); + } } -- cgit 1.2.3-korg