diff --git a/commons/ihe/hl7v2/pom.xml b/commons/ihe/hl7v2/pom.xml index 336d374d64..04acfaf68b 100644 --- a/commons/ihe/hl7v2/pom.xml +++ b/commons/ihe/hl7v2/pom.xml @@ -58,10 +58,15 @@ true - io.zipkin.brave - brave + io.micrometer + micrometer-tracing true + + io.micrometer + micrometer-tracing-bridge-brave + test + io.netty netty-handler diff --git a/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Handler.groovy b/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Handler.groovy index 513d4e84f4..944b655b24 100644 --- a/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Handler.groovy +++ b/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Handler.groovy @@ -16,8 +16,8 @@ package org.openehealth.ipf.commons.ihe.hl7v2.tracing -import brave.SpanCustomizer import ca.uhn.hl7v2.model.Message +import io.micrometer.tracing.SpanCustomizer /** * @author Christian Ohr diff --git a/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Hl7MessageGetter.groovy b/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Hl7MessageGetter.groovy index 6e288591c6..9ed53146b8 100644 --- a/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Hl7MessageGetter.groovy +++ b/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Hl7MessageGetter.groovy @@ -16,8 +16,9 @@ package org.openehealth.ipf.commons.ihe.hl7v2.tracing -import brave.propagation.Propagation + import ca.uhn.hl7v2.model.AbstractMessage +import io.micrometer.tracing.propagation.Propagator import org.slf4j.Logger import org.slf4j.LoggerFactory @@ -26,7 +27,7 @@ import org.slf4j.LoggerFactory * * @author Christian Ohr */ -class Hl7MessageGetter implements Propagation.Getter { +class Hl7MessageGetter implements Propagator.Getter { private static final Logger LOG = LoggerFactory.getLogger(Hl7MessageGetter) private final String segmentName diff --git a/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Hl7MessageSetter.groovy b/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Hl7MessageSetter.groovy index 644d924403..ae7ada6bcf 100644 --- a/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Hl7MessageSetter.groovy +++ b/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Hl7MessageSetter.groovy @@ -16,9 +16,10 @@ package org.openehealth.ipf.commons.ihe.hl7v2.tracing -import brave.propagation.Propagation + import ca.uhn.hl7v2.model.Composite import ca.uhn.hl7v2.model.Message +import io.micrometer.tracing.propagation.Propagator import org.openehealth.ipf.modules.hl7.dsl.Repeatable import org.slf4j.Logger import org.slf4j.LoggerFactory @@ -28,7 +29,7 @@ import org.slf4j.LoggerFactory * * @author Christian Ohr */ -class Hl7MessageSetter implements Propagation.Setter { +class Hl7MessageSetter implements Propagator.Setter { private static final Logger LOG = LoggerFactory.getLogger(Hl7MessageSetter) @@ -43,12 +44,13 @@ class Hl7MessageSetter implements Propagation.Setter { } @Override - void put(Message msg, String key, String value) { + void set(Message msg, String key, String value) { if (msg && key) { def qip = Composite.QIP(msg) //, [segmentFieldName: key, values: value ?: '']) qip[1] = key qip[2] = value ?: '' - def varies = nextRepetition(msg.get(segmentName)[1]) + def seg = msg.get(segmentName) + def varies = nextRepetition(seg[1]) varies.data = qip if (LOG.isDebugEnabled()) { diff --git a/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/MessageTracer.groovy b/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/MessageTracer.groovy index 92b639790c..6dd15c762e 100644 --- a/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/MessageTracer.groovy +++ b/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/MessageTracer.groovy @@ -16,15 +16,12 @@ package org.openehealth.ipf.commons.ihe.hl7v2.tracing -import brave.Span -import brave.Tracer -import brave.Tracing -import brave.propagation.Propagation import ca.uhn.hl7v2.HL7Exception import ca.uhn.hl7v2.model.AbstractMessage import ca.uhn.hl7v2.model.Message -import org.slf4j.Logger -import org.slf4j.LoggerFactory +import io.micrometer.tracing.Span +import io.micrometer.tracing.Tracer +import io.micrometer.tracing.propagation.Propagator /** * Helper class that injects and extracts tracing information from HL7 messages @@ -34,66 +31,55 @@ import org.slf4j.LoggerFactory */ class MessageTracer { - private static final Logger LOG = LoggerFactory.getLogger(MessageTracer.class) - private static final String HL7_SENDING_APPLICATION = "MSH-3" private static final String HL7_SENDING_FACILITY = "MSH-4" private static final String HL7_MESSAGE_TYPE = "MSH-9-1" private static final String HL7_TRIGGER_EVENT = "MSH-9-2" private static final String HL7_PROCESSING_ID = "MSH-11" - private final Tracing tracing + private final Tracer tracer private final boolean removeSegment private final String segmentName - private final Propagation.Setter setter - private final Propagation.Getter getter + private final Propagator propagator; + private final Propagator.Setter setter + private final Propagator.Getter getter /** - * @param tracing Tracing instance + * @param tracer Tracer instance, e.g. BraveTracer + * @param propagator Propagator instance, e.g. BravePropagator * @param segmentName name of the segment with the propagated tracing information (default: ZTR) * @param removeSegment whether the segment with the propagated tracing information is removed (default: true) */ - MessageTracer(Tracing tracing, String segmentName = 'ZTR', boolean removeSegment = true) { - this.tracing = tracing + MessageTracer(Tracer tracer, Propagator propagator, String segmentName = 'ZTR', boolean removeSegment = true) { + this.tracer = tracer this.removeSegment = removeSegment this.segmentName = segmentName this.setter = new Hl7MessageSetter(segmentName) this.getter = new Hl7MessageGetter(segmentName) + this.propagator = propagator; } void sendMessage(Message msg, String name, Handler sender) { - Tracer tracer = tracing.tracer() - Span span = startSpan(tracer.nextSpan(), Span.Kind.CLIENT, name, msg) + def span = startSpan(tracer.spanBuilder(), Span.Kind.CLIENT, name, msg) msg.addNonstandardSegment(segmentName) - tracing.propagation() - .injector(setter) - .inject(span.context(), msg) - Tracer.SpanInScope ws = tracer.withSpanInScope(span) - try { + try (def ws = this.tracer.withSpan(span)) { + propagator.inject(span.context(), msg, setter) sender.accept(msg, span) } catch (Throwable t) { span.error(t) throw t } finally { - ws?.close() - span?.finish() + span.end() } } void receiveMessage(Message msg, String name, Handler receiver) { - Tracer tracer = tracing.tracer() - Span span = startSpan(tracer.nextSpan( - tracing.propagation() - .extractor(getter) - .extract(msg)), - Span.Kind.SERVER, name, msg) - Tracer.SpanInScope ws = tracer.withSpanInScope(span) - try { + def span = startSpan(propagator.extract(msg, getter), Span.Kind.SERVER, name, msg) + try (def ws = tracer.withSpan(span)) { if (removeSegment && msg instanceof AbstractMessage) { try { msg.removeRepetition(segmentName, 0) } catch (HL7Exception ignored) { - // TODO LOG something? } } receiver.accept(msg, span) @@ -101,21 +87,20 @@ class MessageTracer { span.error(t) throw t } finally { - ws?.close() - span?.finish() + span.end() } } - private static Span startSpan(Span span, Span.Kind kind, String name, Message msg) { - span.kind(kind) - .name(name) - .tag(HL7_SENDING_APPLICATION, msg.MSH[3]?.value ?: '') - .tag(HL7_SENDING_FACILITY, msg.MSH[4]?.value ?: '') - .tag(HL7_MESSAGE_TYPE, msg.MSH[9][1]?.value ?: '') - .tag(HL7_TRIGGER_EVENT, msg.MSH[9][2]?.value ?: '') - .tag(HL7_PROCESSING_ID, msg.MSH[11]?.value ?: '') - // ExtraFieldPropagation.set(span.context(), 'messageId', msg.MSH[11]?.value ?: '') - span.start() + private static Span startSpan(Span.Builder spanBuilder, Span.Kind kind, String name, Message msg) { + spanBuilder + .name(name) + .kind(kind) + .tag(HL7_SENDING_APPLICATION, msg.MSH[3]?.value ?: '') + .tag(HL7_SENDING_FACILITY, msg.MSH[4]?.value ?: '') + .tag(HL7_MESSAGE_TYPE, msg.MSH[9][1]?.value ?: '') + .tag(HL7_TRIGGER_EVENT, msg.MSH[9][2]?.value ?: '') + .tag(HL7_PROCESSING_ID, msg.MSH[11]?.value ?: '') + .start() } } diff --git a/commons/ihe/hl7v2/src/test/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Hl7MessageSetterGetterTest.groovy b/commons/ihe/hl7v2/src/test/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Hl7MessageSetterGetterTest.groovy index 860545afea..1c42f76376 100644 --- a/commons/ihe/hl7v2/src/test/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Hl7MessageSetterGetterTest.groovy +++ b/commons/ihe/hl7v2/src/test/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Hl7MessageSetterGetterTest.groovy @@ -36,9 +36,9 @@ class Hl7MessageSetterGetterTest { Message r01 = MessageUtils.makeMessage(CONTEXT, 'ORU', 'R01','2.5') r01.addNonstandardSegment('ZTR') Hl7MessageSetter setter = new Hl7MessageSetter() - setter.put(r01, 'key1', 'value1') - setter.put(r01, 'key2', 'value2') - setter.put(r01, 'key3', 'value~with^reserved|characters') + setter.set(r01, 'key1', 'value1') + setter.set(r01, 'key2', 'value2') + setter.set(r01, 'key3', 'value~with^reserved|characters') assertNotNull(r01.get('ZTR')) diff --git a/commons/ihe/hl7v2/src/test/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/MessageTracerTest.groovy b/commons/ihe/hl7v2/src/test/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/MessageTracerTest.groovy index a12fdcf9b8..7a48a3872c 100644 --- a/commons/ihe/hl7v2/src/test/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/MessageTracerTest.groovy +++ b/commons/ihe/hl7v2/src/test/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/MessageTracerTest.groovy @@ -16,20 +16,24 @@ package org.openehealth.ipf.commons.ihe.hl7v2.tracing -import brave.SpanCustomizer +import brave.Span import brave.Tracing +import brave.context.slf4j.MDCScopeDecorator +import brave.handler.MutableSpan +import brave.handler.SpanHandler +import brave.propagation.ThreadLocalCurrentTraceContext +import brave.propagation.TraceContext import ca.uhn.hl7v2.HapiContext import ca.uhn.hl7v2.model.Message +import io.micrometer.tracing.SpanCustomizer +import io.micrometer.tracing.brave.bridge.BraveCurrentTraceContext +import io.micrometer.tracing.brave.bridge.BravePropagator +import io.micrometer.tracing.brave.bridge.BraveTracer import org.junit.jupiter.api.Test import org.openehealth.ipf.commons.ihe.hl7v2.definitions.HapiContextFactory import org.openehealth.ipf.modules.hl7.message.MessageUtils -import zipkin2.Span -import zipkin2.reporter.Reporter -import static org.junit.jupiter.api.Assertions.assertEquals -import static org.junit.jupiter.api.Assertions.assertNotEquals -import static org.junit.jupiter.api.Assertions.assertFalse -import static org.junit.jupiter.api.Assertions.assertTrue +import static org.junit.jupiter.api.Assertions.* /** * @author Christian Ohr @@ -41,12 +45,24 @@ class MessageTracerTest { @Test void traceMessage() { MockReporter reporter = new MockReporter() - Tracing tracing = Tracing.newBuilder() + + // Brave setup + def braveCurrentTraceContext = ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(MDCScopeDecorator.get()) // Example of Brave's automatic MDC setup + .build(); + def tracing = Tracing.newBuilder() .localServiceName('MessageTracerTest') - .spanReporter(reporter) + .addSpanHandler(reporter) .build() - MessageTracer messageTracer = new MessageTracer(tracing) - Message sending = MessageUtils.makeMessage(CONTEXT, 'ORU', 'R01', '2.5') + def braveTracer = tracing.tracer(); + + // Micrometer Brave Bridge + def propagator = new BravePropagator(tracing) + def bridgeContext = new BraveCurrentTraceContext(braveCurrentTraceContext); + def tracer = new BraveTracer(braveTracer, bridgeContext); + + def messageTracer = new MessageTracer(tracer, propagator) + def sending = MessageUtils.makeMessage(CONTEXT, 'ORU', 'R01', '2.5') messageTracer.sendMessage(sending, "producer", new Handler() { @Override @@ -62,29 +78,30 @@ class MessageTracerTest { }) // Check a few things - List spans = reporter.getSpans() + def spans = reporter.getSpans() assertEquals(2, spans.size()) - Span clientSpan = reporter.spans.find { span -> span.kind() == Span.Kind.CLIENT} - Span serverSpan = reporter.spans.find { span -> span.kind() == Span.Kind.SERVER} + def clientSpan = reporter.spans.find { span -> span.kind() == Span.Kind.CLIENT} + def serverSpan = reporter.spans.find { span -> span.kind() == Span.Kind.SERVER} assertFalse(clientSpan.tags().isEmpty()) - assertEquals(clientSpan.tags(), serverSpan.tags()) + assertEquals(new HashMap<>(clientSpan.tags()), new HashMap<>(serverSpan.tags())) assertNotEquals(clientSpan.id(), serverSpan.id()) assertEquals(clientSpan.id(), serverSpan.parentId()) - assertTrue(clientSpan.durationAsLong() > serverSpan.durationAsLong()) } - private static final class MockReporter implements Reporter { + class MockReporter extends SpanHandler { - private List spans = new ArrayList<>() + private List spans = new ArrayList<>(); @Override - void report(zipkin2.Span span) { - spans.add(span) + boolean end(TraceContext context, MutableSpan span, Cause cause) { + spans.add(span); + return super.end(context, span, cause) } - List getSpans() { + List getSpans() { return spans } } + } diff --git a/dependencies/pom.xml b/dependencies/pom.xml index 754d2b4cf4..9ac3e8e8de 100644 --- a/dependencies/pom.xml +++ b/dependencies/pom.xml @@ -10,30 +10,29 @@ 1.6 1.78 - 5.18.1 4.4.3 3.19.0 4.0.4 2.16.1 1.26.1 - 1.3.200-v20130910-1609 - 3.6.200-v20130402-1505 - 4.0.21 + 1.3.200-v20130910-1609 + 3.6.200-v20130402-1505 + 4.0.22 2.5.1 7.2.1 3.0.2 3.0.0 5.3.1 1.2.0.201212201425 - - 2.16.2 + 2.17.1 4.0.5 3.0.0 2.0.6.1 - 1.9.20 - 1.9.24 - 3.0.5 + 1.9.20 + 1.9.24 + 3.0.5 + 1.3.2 1.7.0 9.37.3 7.1.2 @@ -43,7 +42,7 @@ 3.3.1 2.3 25.0 - 6.6.2 + 7.0.0 4.0.2 @@ -56,6 +55,13 @@ + + io.micrometer + micrometer-tracing-bom + ${micrometer-version} + import + pom + com.fasterxml.jackson jackson-bom @@ -324,31 +330,6 @@ - - io.zipkin.brave - brave - ${brave-version} - - - io.zipkin.brave - brave-spring-beans - ${brave-version} - - - io.zipkin.brave - brave-context-slf4j - ${brave-version} - - - io.zipkin.brave - brave-instrumentation-httpclient - ${brave-version} - - - io.zipkin.brave - brave-instrumentation-servlet - ${brave-version} - com.github.mizosoft.methanol methanol @@ -366,7 +347,7 @@ org.apache.cxf - cxf-integration-tracing-brave + cxf-integration-tracing-micrometer ${cxf.version} @@ -413,7 +394,7 @@ org.eclipse.equinox app - ${equinox-app.version} + ${equinox-app-version} org.eclipse.equinox @@ -424,7 +405,7 @@ org.eclipse.equinox common - ${equinox-common.version} + ${equinox-common-version} org.openehealth.ipf.oht.mdht diff --git a/modules/hl7-kotlin/pom.xml b/modules/hl7-kotlin/pom.xml index 20910bbc8c..50b1686649 100644 --- a/modules/hl7-kotlin/pom.xml +++ b/modules/hl7-kotlin/pom.xml @@ -58,7 +58,7 @@ io.github.microutils kotlin-logging-jvm - ${kotlin.logging.version} + ${kotlin-logging-version} org.jetbrains.kotlin @@ -132,7 +132,7 @@ org.jetbrains.kotlin kotlin-maven-plugin - ${kotlin.version} + ${kotlin-version} compile @@ -164,7 +164,7 @@ org.jetbrains.dokka dokka-maven-plugin - ${kotlin.dokka.version} + ${kotlin-dokka-version} package diff --git a/platform-camel/ihe/hl7v2/pom.xml b/platform-camel/ihe/hl7v2/pom.xml index 0ed8a798f7..83c8c54b1f 100644 --- a/platform-camel/ihe/hl7v2/pom.xml +++ b/platform-camel/ihe/hl7v2/pom.xml @@ -45,8 +45,8 @@ - io.zipkin.brave - brave + io.micrometer + micrometer-tracing-bridge-brave true diff --git a/platform-camel/ihe/mllp/pom.xml b/platform-camel/ihe/mllp/pom.xml index 1366bccee2..88328ac374 100644 --- a/platform-camel/ihe/mllp/pom.xml +++ b/platform-camel/ihe/mllp/pom.xml @@ -117,8 +117,13 @@ test - io.zipkin.brave - brave + io.micrometer + micrometer-tracing + test + + + io.micrometer + micrometer-tracing-bridge-brave test diff --git a/platform-camel/ihe/mllp/src/test/groovy/org/openehealth/ipf/platform/camel/ihe/mllp/iti8/BraveTracerFactoryBean.java b/platform-camel/ihe/mllp/src/test/groovy/org/openehealth/ipf/platform/camel/ihe/mllp/iti8/BraveTracerFactoryBean.java new file mode 100644 index 0000000000..a9e7ec9560 --- /dev/null +++ b/platform-camel/ihe/mllp/src/test/groovy/org/openehealth/ipf/platform/camel/ihe/mllp/iti8/BraveTracerFactoryBean.java @@ -0,0 +1,31 @@ +package org.openehealth.ipf.platform.camel.ihe.mllp.iti8; + +import brave.Tracing; +import brave.context.slf4j.MDCScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; +import io.micrometer.tracing.brave.bridge.BraveCurrentTraceContext; +import io.micrometer.tracing.brave.bridge.BraveTracer; +import org.springframework.beans.factory.FactoryBean; + +public class BraveTracerFactoryBean implements FactoryBean { + + private final Tracing tracing; + + public BraveTracerFactoryBean(Tracing tracing) { + this.tracing = tracing; + } + + @Override + public BraveTracer getObject() throws Exception { + var braveCurrentTraceContext = ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(MDCScopeDecorator.get()) // Example of Brave's automatic MDC setup + .build(); + var bridgeContext = new BraveCurrentTraceContext(braveCurrentTraceContext); + return new BraveTracer(tracing.tracer(), bridgeContext); + } + + @Override + public Class getObjectType() { + return BraveTracer.class; + } +} diff --git a/platform-camel/ihe/mllp/src/test/groovy/org/openehealth/ipf/platform/camel/ihe/mllp/iti8/MockReporter.groovy b/platform-camel/ihe/mllp/src/test/groovy/org/openehealth/ipf/platform/camel/ihe/mllp/iti8/MockReporter.groovy index 6c8aa8ba65..cac054fa17 100644 --- a/platform-camel/ihe/mllp/src/test/groovy/org/openehealth/ipf/platform/camel/ihe/mllp/iti8/MockReporter.groovy +++ b/platform-camel/ihe/mllp/src/test/groovy/org/openehealth/ipf/platform/camel/ihe/mllp/iti8/MockReporter.groovy @@ -16,21 +16,20 @@ package org.openehealth.ipf.platform.camel.ihe.mllp.iti8 -import zipkin2.reporter.Reporter +import brave.handler.MutableSpan +import brave.handler.SpanHandler +import brave.propagation.TraceContext /** * @author Christian Ohr */ -class MockReporter implements Reporter { +class MockReporter extends SpanHandler { - private List spans = new ArrayList<>(); + List spans = new ArrayList<>(); @Override - void report(zipkin2.Span span) { + boolean end(TraceContext context, MutableSpan span, Cause cause) { spans.add(span); - } - - List getSpans() { - return spans + return super.end(context, span, cause) } } \ No newline at end of file diff --git a/platform-camel/ihe/mllp/src/test/groovy/org/openehealth/ipf/platform/camel/ihe/mllp/iti8/TestIti8.groovy b/platform-camel/ihe/mllp/src/test/groovy/org/openehealth/ipf/platform/camel/ihe/mllp/iti8/TestIti8.groovy index 33e993d47e..45459f51d8 100644 --- a/platform-camel/ihe/mllp/src/test/groovy/org/openehealth/ipf/platform/camel/ihe/mllp/iti8/TestIti8.groovy +++ b/platform-camel/ihe/mllp/src/test/groovy/org/openehealth/ipf/platform/camel/ihe/mllp/iti8/TestIti8.groovy @@ -15,6 +15,7 @@ */ package org.openehealth.ipf.platform.camel.ihe.mllp.iti8 +import brave.Span import ca.uhn.hl7v2.HL7Exception import ca.uhn.hl7v2.parser.PipeParser import org.apache.camel.Exchange @@ -28,7 +29,6 @@ import org.openehealth.ipf.commons.ihe.core.payload.PayloadLoggerBase import org.openehealth.ipf.platform.camel.ihe.mllp.core.AbstractMllpTest import org.springframework.beans.factory.annotation.Autowired import org.springframework.test.context.ContextConfiguration -import zipkin2.Span import static org.junit.jupiter.api.Assertions.* @@ -52,7 +52,7 @@ class TestIti8 extends AbstractMllpTest { static void tearDownAfterClass() { System.clearProperty(PayloadLoggerBase.PROPERTY_DISABLED) } - + /** * Happy case, audit either enabled or disabled. * Expected result: ACK response, two or zero audit items. @@ -61,37 +61,38 @@ class TestIti8 extends AbstractMllpTest { void testHappyCaseAndAudit1() { doTestHappyCaseAndAudit("xds-iti8://localhost:18082?timeout=${TIMEOUT}&interceptorFactories=#clientInLogger,#clientOutLogger", 2) } + @Test void testHappyCaseAndAudit2() { doTestHappyCaseAndAudit("pix-iti8://localhost:18082?audit=true&timeout=${TIMEOUT}&interceptorFactories=#clientInLogger,#clientOutLogger", 2) } + @Test void testHappyCaseAndAudit3() { doTestHappyCaseAndAudit("xds-iti8://localhost:18081?audit=false&timeout=${TIMEOUT}&interceptorFactories=#clientInLogger,#clientOutLogger", 0) } + @Test void testHappyCaseAndTrace() { doTestHappyCaseAndAudit("pix-iti8://localhost:18083?interceptorFactories=#producerTracingInterceptor,#clientInLogger,#clientOutLogger&timeout=${TIMEOUT}", 2) assertEquals(2, reporter.spans.size()) - Span clientSpan = reporter.spans.find { span -> span.kind() == Span.Kind.CLIENT} - Span serverSpan = reporter.spans.find { span -> span.kind() == Span.Kind.SERVER} + def clientSpan = reporter.spans.find { span -> span.kind() == Span.Kind.CLIENT } + def serverSpan = reporter.spans.find { span -> span.kind() == Span.Kind.SERVER } assertFalse(clientSpan.tags().isEmpty()) - assertEquals(clientSpan.tags(), serverSpan.tags()) + assertEquals(new HashMap<>(clientSpan.tags()), new HashMap<>(serverSpan.tags())) assertNotEquals(clientSpan.id(), serverSpan.id()) assertEquals(clientSpan.id(), serverSpan.parentId()) - assertTrue(clientSpan.durationAsLong() > serverSpan.durationAsLong()) - } - + def doTestHappyCaseAndAudit(String endpointUri, int expectedAuditItemsCount) { final String body = getMessageString('ADT^A01', '2.3.1') def msg = send(endpointUri, body) assertACK(msg) assertAuditEvents { it.messages.size() == expectedAuditItemsCount } } - + /** * Inacceptable messages (wrong message type, wrong trigger event, wrong version), * on consumer side, audit enabled. @@ -105,43 +106,47 @@ class TestIti8 extends AbstractMllpTest { void testInacceptanceOnConsumer1() { doTestInacceptanceOnConsumer('MDM^T01', '2.3.1') } + @Test void testInacceptanceOnConsumer2() { doTestInacceptanceOnConsumer('ADT^A02', '2.3.1') } + @Test void testInacceptanceOnConsumer3() { doTestInacceptanceOnConsumer('ADT^A01', '2.5') } + @Test void testInacceptanceOnConsumer4() { doTestInacceptanceOnConsumer('ADT^A01', '3.1415926') } + @Test void testInacceptanceOnConsumer5() { doTestInacceptanceOnConsumer('ADT^A01^ADT_A02', '2.3.1') } - + def doTestInacceptanceOnConsumer(String msh9, String msh12) { def endpointUri = 'pix-iti8://localhost:18084' def endpoint = camelContext.getEndpoint(endpointUri) def consumer = endpoint.createConsumer( - [process : { Exchange e -> /* nop */ }] as Processor - ) + [process: { Exchange e -> /* nop */ }] as Processor + ) def processor = consumer.processor - + def body = getMessageString(msh9, msh12) def exchange = new DefaultExchange(camelContext) exchange.in.body = body - + processor.process(exchange) def response = exchange.message.body def msg = new PipeParser().parse(response) assertNAK(msg) assertAuditEvents { it.messages.empty } } - - + + /** * Inacceptable messages (wrong message type, wrong trigger event, wrong version), * on producer side, audit enabled. @@ -151,41 +156,44 @@ class TestIti8 extends AbstractMllpTest { void testInacceptanceOnProducer1() { doTestInacceptanceOnProducer('MDM^T01', '2.3.1') } + @Test void testInacceptanceOnProducer2() { doTestInacceptanceOnProducer('ADT^A02', '2.3.1') } + @Test void testInacceptanceOnProducer3() { doTestInacceptanceOnProducer('ADT^A01', '2.4') } + @Test void testInacceptanceOnProducer4() { doTestInacceptanceOnProducer('ADT^A01', '3.1415926') } + @Test void testInacceptanceOnProducer5() { doTestInacceptanceOnProducer('ADT^A01^ADT_A02', '2.3.1') } - + def doTestInacceptanceOnProducer(String msh9, String msh12) { def endpointUri = "xds-iti8://localhost:18084?timeout=${TIMEOUT}&interceptorFactories=#clientInLogger,#clientOutLogger" def body = getMessageString(msh9, msh12) def failed = true - + try { send(endpointUri, body) } catch (Exception e) { def cause = e.getCause() - if((e instanceof HL7Exception) || (cause instanceof HL7Exception)) - { + if ((e instanceof HL7Exception) || (cause instanceof HL7Exception)) { failed = false } } assertFalse(failed) assertAuditEvents { it.messages.empty } } - + /** * Tests how the exceptions in tte route are handled. @@ -202,14 +210,14 @@ class TestIti8 extends AbstractMllpTest { String isoMessage = this.getClass().classLoader.getResource('./iti8/iti8-a40-iso-8859-1.hl7')?.getText('iso-8859-1') doTestException("pix-iti8://localhost:18089?timeout=${TIMEOUT}", isoMessage, "java.nio.charset.MalformedInputException") } - + def doTestException(String endpointUri, String body, String wantedOutputContent) { def msg = send(endpointUri, body) assertNAK(msg) assertTrue(msg.toString().contains(wantedOutputContent)) } - - + + /** * Checks whether alternative HL7 codec factories can be used. */ diff --git a/platform-camel/ihe/mllp/src/test/resources/iti8/iti-8.xml b/platform-camel/ihe/mllp/src/test/resources/iti8/iti-8.xml index 7cc1b830da..4a154dd8c8 100644 --- a/platform-camel/ihe/mllp/src/test/resources/iti8/iti-8.xml +++ b/platform-camel/ihe/mllp/src/test/resources/iti8/iti-8.xml @@ -33,21 +33,30 @@ http://camel.apache.org/schema/spring/camel-spring.xsd - + - + - + + + + + + + + + + diff --git a/pom.xml b/pom.xml index 5dd53e3ead..953ce132f5 100644 --- a/pom.xml +++ b/pom.xml @@ -54,12 +54,13 @@ 3.12.1 - 5.2.0 + 6.0.0 + 5.3.0 33.0.0-jre - 1.18.32 + 1.18.34 5.15.0 0.6 - 10.1.25 + 10.1.26 4.25 @@ -212,7 +213,24 @@ test - + + io.zipkin.brave + brave + ${brave-version} + test + + + io.zipkin.brave + brave-spring-beans + ${brave-version} + test + + + io.zipkin.brave + brave-context-slf4j + ${brave-version} + test + net.java.quickcheck quickcheck