This is an automated email from the ASF dual-hosted git repository. liubao pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git
commit 86ab2ec7af8f5b6b40f47c54d922b7e094f377cb Author: yaohaishi <[email protected]> AuthorDate: Thu Jan 25 00:47:07 2018 +0800 [SCB-177] add traceId element in access log --- .../common/rest/AbstractRestInvocation.java | 8 ++ .../common/rest/TestAbstractRestInvocation.java | 11 +++ .../accesslog/element/impl/TraceIdElement.java | 51 ++++++++++ .../parser/impl/DefaultAccessLogPatternParser.java | 12 ++- .../parser/matcher/impl/TraceIdMatcher.java | 35 +++++++ .../accesslog/element/impl/TraceIdElementTest.java | 106 +++++++++++++++++++++ .../impl/DefaultAccessLogPatternParserTest.java | 70 ++++++++------ .../parser/matcher/impl/TraceIdMatcherTest.java | 65 +++++++++++++ 8 files changed, 327 insertions(+), 31 deletions(-) diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java index 36c1739..c8ce3ca 100644 --- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java +++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java @@ -106,6 +106,14 @@ public abstract class AbstractRestInvocation { invocation.setContext(cseContext); } + public String getContext(String key) { + if (null == invocation || null == invocation.getContext()) { + return null; + } + + return invocation.getContext(key); + } + protected void scheduleInvocation() { OperationMeta operationMeta = restOperationMeta.getOperationMeta(); diff --git a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestAbstractRestInvocation.java b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestAbstractRestInvocation.java index 6586403..58d6c2e 100644 --- a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestAbstractRestInvocation.java +++ b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestAbstractRestInvocation.java @@ -217,6 +217,17 @@ public class TestAbstractRestInvocation { } @Test + public void getContext() { + invocation.addContext("key", "test"); + Assert.assertEquals("test", restInvocation.getContext("key")); + } + + @Test + public void getContextNull() { + Assert.assertEquals(null, restInvocation.getContext("key")); + } + + @Test public void invokeFilterHaveResponse(@Mocked HttpServerFilter filter) { Response response = Response.ok(""); new Expectations() { diff --git a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/element/impl/TraceIdElement.java b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/element/impl/TraceIdElement.java new file mode 100644 index 0000000..bfc4b3b --- /dev/null +++ b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/element/impl/TraceIdElement.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl; + +import java.util.Map; + +import org.apache.servicecomb.common.rest.RestProducerInvocation; +import org.apache.servicecomb.transport.rest.vertx.accesslog.AccessLogParam; +import org.apache.servicecomb.transport.rest.vertx.accesslog.element.AccessLogElement; +import org.springframework.util.StringUtils; + +public class TraceIdElement implements AccessLogElement { + + private static final String TRACE_ID_NOT_FOUND = "-"; + + @Override + public String getFormattedElement(AccessLogParam accessLogParam) { + Map<String, Object> data = accessLogParam.getRoutingContext().data(); + if (null == data) { + return TRACE_ID_NOT_FOUND; + } + + RestProducerInvocation restProducerInvocation = (RestProducerInvocation) data + .get("servicecomb-rest-producer-invocation"); + if (null == restProducerInvocation) { + return TRACE_ID_NOT_FOUND; + } + + String traceId = restProducerInvocation.getContext("X-B3-TraceId"); + + if (StringUtils.isEmpty(traceId)) { + return TRACE_ID_NOT_FOUND; + } + return traceId; + } +} diff --git a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/impl/DefaultAccessLogPatternParser.java b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/impl/DefaultAccessLogPatternParser.java index 713d351..5bf5b65 100644 --- a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/impl/DefaultAccessLogPatternParser.java +++ b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/impl/DefaultAccessLogPatternParser.java @@ -42,10 +42,15 @@ import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.matcher.impl import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.matcher.impl.RequestHeaderElementMatcher; import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.matcher.impl.ResponseHeaderElementMatcher; import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.matcher.impl.StatusMatcher; +import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.matcher.impl.TraceIdMatcher; import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.matcher.impl.UriPathIncludeQueryMatcher; import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.matcher.impl.UriPathOnlyMatcher; import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.matcher.impl.VersionOrProtocolMatcher; +/** + * contains all kinds of {@link AccessLogElementMatcher}, + * generate a chain of {@link AccessLogElementExtraction} according to the raw access log pattern. + */ public class DefaultAccessLogPatternParser implements AccessLogPatternParser { private static final List<AccessLogElementMatcher> MATCHER_LIST = Arrays.asList( new RequestHeaderElementMatcher(), @@ -66,7 +71,8 @@ public class DefaultAccessLogPatternParser implements AccessLogPatternParser { new MethodMatcher(), new QueryOnlyMatcher(), new UriPathOnlyMatcher(), - new StatusMatcher()); + new StatusMatcher(), + new TraceIdMatcher()); public static final Comparator<AccessLogElementExtraction> ACCESS_LOG_ELEMENT_EXTRACTION_COMPARATOR = Comparator .comparingInt(AccessLogElementExtraction::getStart); @@ -101,8 +107,8 @@ public class DefaultAccessLogPatternParser implements AccessLogPatternParser { /** * The content not matched in rawPattern will be printed as it is, so should be converted to {@link PlainTextElement} - * @param rawPattern - * @param extractionList + * @param rawPattern access log string pattern + * @param extractionList {@link AccessLogElementExtraction} list indicating the position of each access log element */ private void fillInPlainTextElement(String rawPattern, List<AccessLogElementExtraction> extractionList) { int cursor = 0; diff --git a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/matcher/impl/TraceIdMatcher.java b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/matcher/impl/TraceIdMatcher.java new file mode 100644 index 0000000..d392494 --- /dev/null +++ b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/matcher/impl/TraceIdMatcher.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.servicecomb.transport.rest.vertx.accesslog.parser.matcher.impl; + +import org.apache.servicecomb.transport.rest.vertx.accesslog.element.AccessLogElement; +import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.TraceIdElement; + +public class TraceIdMatcher extends SinglePatternImmutableElementMatcher { + public static final TraceIdElement ELEMENT = new TraceIdElement(); + + @Override + protected String getPlaceholderPattern() { + return "%SCB-traceId"; + } + + @Override + protected AccessLogElement getAccessLogElement() { + return ELEMENT; + } +} diff --git a/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/element/impl/TraceIdElementTest.java b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/element/impl/TraceIdElementTest.java new file mode 100644 index 0000000..86ededf --- /dev/null +++ b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/element/impl/TraceIdElementTest.java @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl; + +import static org.hamcrest.core.Is.is; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.servicecomb.common.rest.RestProducerInvocation; +import org.apache.servicecomb.core.Const; +import org.apache.servicecomb.core.Invocation; +import org.apache.servicecomb.transport.rest.vertx.accesslog.AccessLogParam; +import org.junit.Assert; +import org.junit.Test; +import org.mockito.Mockito; + +import io.vertx.ext.web.RoutingContext; +import mockit.Deencapsulation; + +public class TraceIdElementTest { + private static final TraceIdElement ELEMENT = new TraceIdElement(); + + @Test + public void testGetFormattedElement() { + AccessLogParam param = new AccessLogParam(); + RoutingContext routingContext = Mockito.mock(RoutingContext.class); + Map<String, Object> data = new HashMap<>(); + RestProducerInvocation restProducerInvocation = new RestProducerInvocation(); + Invocation invocation = Mockito.mock(Invocation.class); + String traceIdTest = "traceIdTest"; + + Mockito.when(invocation.getContext(Const.TRACE_ID_NAME)).thenReturn(traceIdTest); + Deencapsulation.setField(restProducerInvocation, "invocation", invocation); + Mockito.when(routingContext.data()).thenReturn(data); + data.put("servicecomb-rest-producer-invocation", restProducerInvocation); + + param.setRoutingContext(routingContext); + + String result = ELEMENT.getFormattedElement(param); + Assert.assertThat(result, is(traceIdTest)); + } + + @Test + public void testGetFormattedElementOnTraceIdNotFound() { + AccessLogParam param = new AccessLogParam(); + RoutingContext routingContext = Mockito.mock(RoutingContext.class); + Map<String, Object> data = new HashMap<>(); + RestProducerInvocation restProducerInvocation = new RestProducerInvocation(); + Invocation invocation = Mockito.mock(Invocation.class); + + Mockito.when(invocation.getContext(Const.TRACE_ID_NAME)).thenReturn(""); + Deencapsulation.setField(restProducerInvocation, "invocation", invocation); + Mockito.when(routingContext.data()).thenReturn(data); + data.put("servicecomb-rest-producer-invocation", restProducerInvocation); + + param.setRoutingContext(routingContext); + + String result = ELEMENT.getFormattedElement(param); + Assert.assertThat(result, is("-")); + + Mockito.when(invocation.getContext(Const.TRACE_ID_NAME)).thenReturn(null); + result = ELEMENT.getFormattedElement(param); + Assert.assertThat(result, is("-")); + } + + @Test + public void testGetFormattedElementOnInvocationContextIsNull() { + AccessLogParam param = new AccessLogParam(); + RoutingContext routingContext = Mockito.mock(RoutingContext.class); + Map<String, Object> data = new HashMap<>(); + + Mockito.when(routingContext.data()).thenReturn(data); + param.setRoutingContext(routingContext); + + String result = ELEMENT.getFormattedElement(param); + Assert.assertThat(result, is("-")); + } + + @Test + public void testGetFormattedElementOnDataIsNull() { + AccessLogParam param = new AccessLogParam(); + RoutingContext routingContext = Mockito.mock(RoutingContext.class); + + param.setRoutingContext(routingContext); + Mockito.when(routingContext.data()).thenReturn(null); + + String result = ELEMENT.getFormattedElement(param); + Assert.assertThat(result, is("-")); + } +} diff --git a/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/impl/DefaultAccessLogPatternParserTest.java b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/impl/DefaultAccessLogPatternParserTest.java index dd2f625..86f9942 100644 --- a/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/impl/DefaultAccessLogPatternParserTest.java +++ b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/impl/DefaultAccessLogPatternParserTest.java @@ -18,11 +18,15 @@ package org.apache.servicecomb.transport.rest.vertx.accesslog.parser.impl; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; +import org.apache.servicecomb.transport.rest.vertx.accesslog.element.AccessLogElement; import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.BytesWrittenElement; import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.CookieElement; import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.DatetimeConfigurableElement; @@ -38,10 +42,12 @@ import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.Remote import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.RequestHeaderElement; import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.ResponseHeaderElement; import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.StatusElement; +import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.TraceIdElement; import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.UriPathIncludeQueryElement; import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.UriPathOnlyElement; import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.VersionOrProtocolElement; import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.AccessLogElementExtraction; +import org.hamcrest.Matchers; import org.junit.Test; import mockit.Deencapsulation; @@ -52,40 +58,48 @@ public class DefaultAccessLogPatternParserTest { + "%{yyyy MM dd HH:mm:ss|GMT+0|en-US}t" + "%{incoming-header}i" + "%{outgoing-header}o" - + "%{cookie}c"; + + "%{cookie}c" + + "%SCB-traceId"; private static DefaultAccessLogPatternParser accessLogPatternParser = new DefaultAccessLogPatternParser(); @Test + @SuppressWarnings(value = "unchecked") public void testParsePattern() { List<AccessLogElementExtraction> result = accessLogPatternParser.parsePattern(ROW_PATTERN); - assertEquals(26, result.size()); - assertEquals(PlainTextElement.class, result.get(0).getAccessLogElement().getClass()); - assertEquals(MethodElement.class, result.get(1).getAccessLogElement().getClass()); - assertEquals(PlainTextElement.class, result.get(2).getAccessLogElement().getClass()); - assertEquals(MethodElement.class, result.get(3).getAccessLogElement().getClass()); - assertEquals(PlainTextElement.class, result.get(4).getAccessLogElement().getClass()); - assertEquals(StatusElement.class, result.get(5).getAccessLogElement().getClass()); - assertEquals(DurationSecondElement.class, result.get(6).getAccessLogElement().getClass()); - assertEquals(DurationMillisecondElement.class, result.get(7).getAccessLogElement().getClass()); - assertEquals(RemoteHostElement.class, result.get(8).getAccessLogElement().getClass()); - assertEquals(LocalHostElement.class, result.get(9).getAccessLogElement().getClass()); - assertEquals(LocalPortElement.class, result.get(10).getAccessLogElement().getClass()); - assertEquals(BytesWrittenElement.class, result.get(11).getAccessLogElement().getClass()); - assertEquals(BytesWrittenElement.class, result.get(12).getAccessLogElement().getClass()); - assertEquals(FirstLineOfRequestElement.class, result.get(13).getAccessLogElement().getClass()); - assertEquals(UriPathOnlyElement.class, result.get(14).getAccessLogElement().getClass()); - assertEquals(QueryOnlyElement.class, result.get(15).getAccessLogElement().getClass()); - assertEquals(UriPathOnlyElement.class, result.get(16).getAccessLogElement().getClass()); - assertEquals(QueryOnlyElement.class, result.get(17).getAccessLogElement().getClass()); - assertEquals(UriPathIncludeQueryElement.class, result.get(18).getAccessLogElement().getClass()); - assertEquals(VersionOrProtocolElement.class, result.get(19).getAccessLogElement().getClass()); - assertEquals(DatetimeConfigurableElement.class, result.get(20).getAccessLogElement().getClass()); - assertEquals(DatetimeConfigurableElement.class, result.get(21).getAccessLogElement().getClass()); - assertEquals(DatetimeConfigurableElement.class, result.get(22).getAccessLogElement().getClass()); - assertEquals(RequestHeaderElement.class, result.get(23).getAccessLogElement().getClass()); - assertEquals(ResponseHeaderElement.class, result.get(24).getAccessLogElement().getClass()); - assertEquals(CookieElement.class, result.get(25).getAccessLogElement().getClass()); + assertEquals(27, result.size()); + + assertThat(result.stream().map(AccessLogElementExtraction::getAccessLogElement) + .filter(Objects::nonNull).map(AccessLogElement::getClass) + .collect(Collectors.toList()), + Matchers.contains( + PlainTextElement.class, + MethodElement.class, + PlainTextElement.class, + MethodElement.class, + PlainTextElement.class, + StatusElement.class, + DurationSecondElement.class, + DurationMillisecondElement.class, + RemoteHostElement.class, + LocalHostElement.class, + LocalPortElement.class, + BytesWrittenElement.class, + BytesWrittenElement.class, + FirstLineOfRequestElement.class, + UriPathOnlyElement.class, + QueryOnlyElement.class, + UriPathOnlyElement.class, + QueryOnlyElement.class, + UriPathIncludeQueryElement.class, + VersionOrProtocolElement.class, + DatetimeConfigurableElement.class, + DatetimeConfigurableElement.class, + DatetimeConfigurableElement.class, + RequestHeaderElement.class, + ResponseHeaderElement.class, + CookieElement.class, + TraceIdElement.class)); } @Test diff --git a/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/matcher/impl/TraceIdMatcherTest.java b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/matcher/impl/TraceIdMatcherTest.java new file mode 100644 index 0000000..6b45cbf --- /dev/null +++ b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/matcher/impl/TraceIdMatcherTest.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.servicecomb.transport.rest.vertx.accesslog.parser.matcher.impl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.List; + +import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.TraceIdElement; +import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.AccessLogElementExtraction; +import org.junit.Test; + +public class TraceIdMatcherTest { + private static final TraceIdMatcher MATCHER = new TraceIdMatcher(); + + private static final String RAW_PATTERN = "%SCB-traceId %h %SCB-traceId %{PATTERN}t %SCB-traceId%SCB-traceId %H %SCB-traceId"; + + @Test + public void testExtractElementPlaceHolder() { + List<AccessLogElementExtraction> extractionList = MATCHER.extractElementPlaceholder(RAW_PATTERN); + + assertEquals(5, extractionList.size()); + assertEquals(0, extractionList.get(0).getStart()); + assertEquals(12, extractionList.get(0).getEnd()); + assertEquals(MATCHER.getAccessLogElement(), extractionList.get(0).getAccessLogElement()); + assertEquals(16, extractionList.get(1).getStart()); + assertEquals(28, extractionList.get(1).getEnd()); + assertEquals(MATCHER.getAccessLogElement(), extractionList.get(1).getAccessLogElement()); + assertEquals(41, extractionList.get(2).getStart()); + assertEquals(53, extractionList.get(2).getEnd()); + assertEquals(MATCHER.getAccessLogElement(), extractionList.get(2).getAccessLogElement()); + assertEquals(53, extractionList.get(3).getStart()); + assertEquals(65, extractionList.get(3).getEnd()); + assertEquals(MATCHER.getAccessLogElement(), extractionList.get(3).getAccessLogElement()); + assertEquals(69, extractionList.get(4).getStart()); + assertEquals(81, extractionList.get(4).getEnd()); + assertEquals(MATCHER.getAccessLogElement(), extractionList.get(4).getAccessLogElement()); + } + + @Test + public void testGetPlaceholderPattern() { + assertEquals("%SCB-traceId", MATCHER.getPlaceholderPattern()); + } + + @Test + public void getAccessLogElement() { + assertTrue(TraceIdElement.class.equals(MATCHER.getAccessLogElement().getClass())); + } +} \ No newline at end of file -- To stop receiving notification emails like this one, please contact [email protected].
