This is an automated email from the ASF dual-hosted git repository.
wusheng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-java.git
The following commit(s) were added to refs/heads/main by this push:
new 4f9c2d8527 Adds Micrometer Observation instrumentation (#401)
4f9c2d8527 is described below
commit 4f9c2d85277ff6298c8edb8dcea06d9d88424453
Author: Marcin Grzejszczak <[email protected]>
AuthorDate: Tue Dec 6 11:51:12 2022 +0100
Adds Micrometer Observation instrumentation (#401)
---
.github/workflows/plugins-jdk17-test.0.yaml | 2 +
CHANGES.md | 1 +
.../apm-toolkit-micrometer-1.10/pom.xml | 65 ++++++++
...ywalkingContextSnapshotThreadLocalAccessor.java | 55 +++++++
.../SkywalkingDefaultTracingHandler.java | 59 ++++++++
.../observation/SkywalkingMeterHandler.java | 29 ++++
.../SkywalkingReceiverTracingHandler.java | 60 ++++++++
.../SkywalkingSenderTracingHandler.java | 60 ++++++++
.../io.micrometer.context.ThreadLocalAccessor | 17 +++
.../observation/SkywalkingMeterHandlerTests.java | 47 ++++++
apm-application-toolkit/pom.xml | 1 +
.../network/trace/component/ComponentsDefine.java | 2 +
.../apm-toolkit-micrometer-activation}/pom.xml | 41 +++--
...tManagerThreadLocalAccessorInstrumentation.java | 76 ++++++++++
...textSnapshotThreadLocalAccessorInterceptor.java | 67 +++++++++
...ometerDefaultTracingHandlerInstrumentation.java | 80 ++++++++++
...MicrometerDefaultTracingHandlerInterceptor.java | 86 +++++++++++
...meterReceiverTracingHandlerInstrumentation.java | 77 ++++++++++
...icrometerReceiverTracingHandlerInterceptor.java | 92 ++++++++++++
...rometerSenderTracingHandlerInstrumentation.java | 77 ++++++++++
.../MicrometerSenderTracingHandlerInterceptor.java | 93 ++++++++++++
.../toolkit/activation/micrometer/SpanHelper.java | 50 +++++++
.../activation/micrometer/TaggingHelper.java | 50 +++++++
.../src/main/resources/skywalking-plugin.def | 20 +++
.../micrometer/AbstractTracingSpanHelper.java | 47 ++++++
.../ContextManagerExtendOverrideService.java | 26 ++++
...SnapshotThreadLocalAccessorInterceptorTest.java | 147 ++++++++++++++++++
...ometerDefaultTracingHandlerInterceptorTest.java | 166 +++++++++++++++++++++
...meterReceiverTracingHandlerInterceptorTest.java | 138 +++++++++++++++++
...rometerSenderTracingHandlerInterceptorTest.java | 137 +++++++++++++++++
.../activation/micrometer/PluginBootService.java | 43 ++++++
...ache.skywalking.apm.agent.core.boot.BootService | 20 +++
apm-sniffer/apm-toolkit-activation/pom.xml | 1 +
.../Application-toolkit-micrometer-1.10.md | 32 ++++
.../java-agent/Application-toolkit-micrometer.md | 2 +
.../setup/service-agent/java-agent/Plugin-list.md | 1 +
.../service-agent/java-agent/advanced-features.md | 2 +-
docs/menu.yml | 4 +-
pom.xml | 1 +
test/plugin/agent-test-tools/pom.xml | 2 +-
.../tomcat-container/src/main/docker/run.sh | 2 +-
test/plugin/run.sh | 2 +-
.../resttemplate-6.x-scenario/bin/startup.sh | 23 +++
.../config/expectedData.yaml | 83 +++++++++++
.../resttemplate-6.x-scenario/configuration.yml | 18 +++
.../scenarios/resttemplate-6.x-scenario/pom.xml | 111 ++++++++++++++
.../src/main/assembly/assembly.xml | 41 +++++
.../testcase/resttemplate/BackController.java | 40 +++++
.../testcase/resttemplate/FrontController.java | 54 +++++++
.../resttemplate/ObservationConfiguration.java | 87 +++++++++++
.../resttemplate/ResttemplateConfiguration.java | 36 +++++
.../testcase/resttemplate/ServerConfiguration.java | 42 ++++++
.../resttemplate/SkywalkingApplication.java | 33 ++++
.../src/main/resources/application.yml | 21 +++
.../src/main/resources/log4j2.xml | 31 ++++
.../resttemplate-6.x-scenario/support-version.list | 17 +++
56 files changed, 2597 insertions(+), 20 deletions(-)
diff --git a/.github/workflows/plugins-jdk17-test.0.yaml
b/.github/workflows/plugins-jdk17-test.0.yaml
index 45edcbac48..d496c158ab 100644
--- a/.github/workflows/plugins-jdk17-test.0.yaml
+++ b/.github/workflows/plugins-jdk17-test.0.yaml
@@ -59,6 +59,8 @@ jobs:
matrix:
case:
- jdk17-with-gson-scenario
+# TODO: We can't test it just yet, because it requires a Skywalking
release
+# - resttemplate-6.x-scenario
steps:
- uses: actions/checkout@v2
with:
diff --git a/CHANGES.md b/CHANGES.md
index ab70ca9621..2d624fa5ef 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -16,6 +16,7 @@ Release Notes.
* Report the agent version to OAP as an instance attribute
* Polish jedis-4.x-plugin to change command to lowercase, which is consistent
with jedis-2.x-3.x-plugin
* Add
micronauthttpclient,micronauthttpserver,memcached,ehcache,guavacache,jedis,redisson
plugin config properties to agent.config
+* Add [Micrometer
Observation](https://github.com/micrometer-metrics/micrometer/) support
* Add tags `mq.message.keys` and `mq.message.tags` for RocketMQ producer span
#### Documentation
diff --git a/apm-application-toolkit/apm-toolkit-micrometer-1.10/pom.xml
b/apm-application-toolkit/apm-toolkit-micrometer-1.10/pom.xml
new file mode 100644
index 0000000000..2fea532c5c
--- /dev/null
+++ b/apm-application-toolkit/apm-toolkit-micrometer-1.10/pom.xml
@@ -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.
+ ~
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>apm-application-toolkit</artifactId>
+ <groupId>org.apache.skywalking</groupId>
+ <version>8.14.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <artifactId>apm-toolkit-micrometer-1.10</artifactId>
+ <packaging>jar</packaging>
+
+ <url>http://maven.apache.org</url>
+
+ <properties>
+ <micrometer-core.version>1.10.2</micrometer-core.version>
+ <context-propagation.version>1.0.0</context-propagation.version>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.skywalking</groupId>
+ <artifactId>apm-toolkit-micrometer-registry</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>io.micrometer</groupId>
+ <artifactId>micrometer-observation</artifactId>
+ <version>${micrometer-core.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>io.micrometer</groupId>
+ <artifactId>micrometer-core</artifactId>
+ <version>${micrometer-core.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>io.micrometer</groupId>
+ <artifactId>context-propagation</artifactId>
+ <version>${context-propagation.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>io.micrometer</groupId>
+ <artifactId>micrometer-test</artifactId>
+ <version>${micrometer-core.version}</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
diff --git
a/apm-application-toolkit/apm-toolkit-micrometer-1.10/src/main/java/org/apache/skywalking/apm/toolkit/micrometer/observation/SkywalkingContextSnapshotThreadLocalAccessor.java
b/apm-application-toolkit/apm-toolkit-micrometer-1.10/src/main/java/org/apache/skywalking/apm/toolkit/micrometer/observation/SkywalkingContextSnapshotThreadLocalAccessor.java
new file mode 100644
index 0000000000..0de5923eb4
--- /dev/null
+++
b/apm-application-toolkit/apm-toolkit-micrometer-1.10/src/main/java/org/apache/skywalking/apm/toolkit/micrometer/observation/SkywalkingContextSnapshotThreadLocalAccessor.java
@@ -0,0 +1,55 @@
+/*
+ * 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.skywalking.apm.toolkit.micrometer.observation;
+
+import io.micrometer.context.ThreadLocalAccessor;
+
+/**
+ * A {@link ThreadLocalAccessor} to put and restore current {@code
ContextSnapshot} from APM agent.
+ */
+public class SkywalkingContextSnapshotThreadLocalAccessor implements
ThreadLocalAccessor<Object> {
+
+ /**
+ * Key under which ContextSnapshot is being registered.
+ */
+ public static final String KEY = "skywalking.contextsnapshot";
+
+ @Override
+ public Object key() {
+ return KEY;
+ }
+
+ // Type will be ContextSnapshot
+ @Override
+ public Object getValue() {
+ return null;
+ }
+
+ // Object to set will be ContextSnapshot
+ @Override
+ public void setValue(Object value) {
+
+ }
+
+ @Override
+ public void reset() {
+
+ }
+
+}
diff --git
a/apm-application-toolkit/apm-toolkit-micrometer-1.10/src/main/java/org/apache/skywalking/apm/toolkit/micrometer/observation/SkywalkingDefaultTracingHandler.java
b/apm-application-toolkit/apm-toolkit-micrometer-1.10/src/main/java/org/apache/skywalking/apm/toolkit/micrometer/observation/SkywalkingDefaultTracingHandler.java
new file mode 100644
index 0000000000..ccf9662c7f
--- /dev/null
+++
b/apm-application-toolkit/apm-toolkit-micrometer-1.10/src/main/java/org/apache/skywalking/apm/toolkit/micrometer/observation/SkywalkingDefaultTracingHandler.java
@@ -0,0 +1,59 @@
+/*
+ * 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.skywalking.apm.toolkit.micrometer.observation;
+
+import io.micrometer.observation.Observation;
+import io.micrometer.observation.ObservationHandler;
+
+public class SkywalkingDefaultTracingHandler implements
ObservationHandler<Observation.Context> {
+ @Override
+ public boolean supportsContext(final Observation.Context context) {
+ return true;
+ }
+
+ @Override
+ public void onStart(final Observation.Context context) {
+
+ }
+
+ @Override
+ public void onError(final Observation.Context context) {
+
+ }
+
+ @Override
+ public void onEvent(final Observation.Event event, final
Observation.Context context) {
+
+ }
+
+ @Override
+ public void onScopeOpened(final Observation.Context context) {
+
+ }
+
+ @Override
+ public void onScopeClosed(final Observation.Context context) {
+
+ }
+
+ @Override
+ public void onStop(final Observation.Context context) {
+
+ }
+}
diff --git
a/apm-application-toolkit/apm-toolkit-micrometer-1.10/src/main/java/org/apache/skywalking/apm/toolkit/micrometer/observation/SkywalkingMeterHandler.java
b/apm-application-toolkit/apm-toolkit-micrometer-1.10/src/main/java/org/apache/skywalking/apm/toolkit/micrometer/observation/SkywalkingMeterHandler.java
new file mode 100644
index 0000000000..066a181708
--- /dev/null
+++
b/apm-application-toolkit/apm-toolkit-micrometer-1.10/src/main/java/org/apache/skywalking/apm/toolkit/micrometer/observation/SkywalkingMeterHandler.java
@@ -0,0 +1,29 @@
+/*
+ * 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.skywalking.apm.toolkit.micrometer.observation;
+
+import
io.micrometer.core.instrument.observation.DefaultMeterObservationHandler;
+import org.apache.skywalking.apm.meter.micrometer.SkywalkingMeterRegistry;
+
+public class SkywalkingMeterHandler extends DefaultMeterObservationHandler {
+
+ public SkywalkingMeterHandler(SkywalkingMeterRegistry meterRegistry) {
+ super(meterRegistry);
+ }
+}
diff --git
a/apm-application-toolkit/apm-toolkit-micrometer-1.10/src/main/java/org/apache/skywalking/apm/toolkit/micrometer/observation/SkywalkingReceiverTracingHandler.java
b/apm-application-toolkit/apm-toolkit-micrometer-1.10/src/main/java/org/apache/skywalking/apm/toolkit/micrometer/observation/SkywalkingReceiverTracingHandler.java
new file mode 100644
index 0000000000..fe32c88940
--- /dev/null
+++
b/apm-application-toolkit/apm-toolkit-micrometer-1.10/src/main/java/org/apache/skywalking/apm/toolkit/micrometer/observation/SkywalkingReceiverTracingHandler.java
@@ -0,0 +1,60 @@
+/*
+ * 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.skywalking.apm.toolkit.micrometer.observation;
+
+import io.micrometer.observation.Observation;
+import io.micrometer.observation.ObservationHandler;
+import io.micrometer.observation.transport.ReceiverContext;
+
+public class SkywalkingReceiverTracingHandler implements
ObservationHandler<ReceiverContext<?>> {
+ @Override
+ public boolean supportsContext(final Observation.Context context) {
+ return context instanceof ReceiverContext;
+ }
+
+ @Override
+ public void onStart(final ReceiverContext<?> context) {
+
+ }
+
+ @Override
+ public void onError(final ReceiverContext<?> context) {
+
+ }
+
+ @Override
+ public void onEvent(final Observation.Event event, final
ReceiverContext<?> context) {
+
+ }
+
+ @Override
+ public void onScopeOpened(final ReceiverContext<?> context) {
+
+ }
+
+ @Override
+ public void onScopeClosed(final ReceiverContext<?> context) {
+
+ }
+
+ @Override
+ public void onStop(final ReceiverContext<?> context) {
+
+ }
+}
diff --git
a/apm-application-toolkit/apm-toolkit-micrometer-1.10/src/main/java/org/apache/skywalking/apm/toolkit/micrometer/observation/SkywalkingSenderTracingHandler.java
b/apm-application-toolkit/apm-toolkit-micrometer-1.10/src/main/java/org/apache/skywalking/apm/toolkit/micrometer/observation/SkywalkingSenderTracingHandler.java
new file mode 100644
index 0000000000..c16e8debed
--- /dev/null
+++
b/apm-application-toolkit/apm-toolkit-micrometer-1.10/src/main/java/org/apache/skywalking/apm/toolkit/micrometer/observation/SkywalkingSenderTracingHandler.java
@@ -0,0 +1,60 @@
+/*
+ * 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.skywalking.apm.toolkit.micrometer.observation;
+
+import io.micrometer.observation.Observation;
+import io.micrometer.observation.ObservationHandler;
+import io.micrometer.observation.transport.SenderContext;
+
+public class SkywalkingSenderTracingHandler implements
ObservationHandler<SenderContext<?>> {
+ @Override
+ public boolean supportsContext(final Observation.Context context) {
+ return context instanceof SenderContext;
+ }
+
+ @Override
+ public void onStart(final SenderContext<?> context) {
+
+ }
+
+ @Override
+ public void onError(final SenderContext<?> context) {
+
+ }
+
+ @Override
+ public void onEvent(final Observation.Event event, final SenderContext<?>
context) {
+
+ }
+
+ @Override
+ public void onScopeOpened(final SenderContext<?> context) {
+
+ }
+
+ @Override
+ public void onScopeClosed(final SenderContext<?> context) {
+
+ }
+
+ @Override
+ public void onStop(final SenderContext<?> context) {
+
+ }
+}
diff --git
a/apm-application-toolkit/apm-toolkit-micrometer-1.10/src/main/resources/META-INF/services/io.micrometer.context.ThreadLocalAccessor
b/apm-application-toolkit/apm-toolkit-micrometer-1.10/src/main/resources/META-INF/services/io.micrometer.context.ThreadLocalAccessor
new file mode 100644
index 0000000000..94b4d89dd0
--- /dev/null
+++
b/apm-application-toolkit/apm-toolkit-micrometer-1.10/src/main/resources/META-INF/services/io.micrometer.context.ThreadLocalAccessor
@@ -0,0 +1,17 @@
+# 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.
+
+org.apache.skywalking.apm.toolkit.micrometer.observation.SkywalkingContextSnapshotThreadLocalAccessor
diff --git
a/apm-application-toolkit/apm-toolkit-micrometer-1.10/src/test/java/org/apache/skywalking/apm/toolkit/micrometer/observation/SkywalkingMeterHandlerTests.java
b/apm-application-toolkit/apm-toolkit-micrometer-1.10/src/test/java/org/apache/skywalking/apm/toolkit/micrometer/observation/SkywalkingMeterHandlerTests.java
new file mode 100644
index 0000000000..df8115a3de
--- /dev/null
+++
b/apm-application-toolkit/apm-toolkit-micrometer-1.10/src/test/java/org/apache/skywalking/apm/toolkit/micrometer/observation/SkywalkingMeterHandlerTests.java
@@ -0,0 +1,47 @@
+/*
+ * 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.skywalking.apm.toolkit.micrometer.observation;
+
+import io.micrometer.core.tck.MeterRegistryAssert;
+import io.micrometer.observation.Observation;
+import io.micrometer.observation.tck.TestObservationRegistry;
+import org.apache.skywalking.apm.meter.micrometer.SkywalkingMeterRegistry;
+import org.junit.Test;
+
+public class SkywalkingMeterHandlerTests {
+ SkywalkingMeterRegistry meterRegistry = new SkywalkingMeterRegistry();
+
+ SkywalkingMeterHandler handler = new SkywalkingMeterHandler(meterRegistry);
+
+ TestObservationRegistry observationRegistry =
TestObservationRegistry.create();
+
+ @Test
+ public void testCreateTimer() {
+ observationRegistry.observationConfig().observationHandler(handler);
+
+ Observation.createNotStarted("foo", observationRegistry)
+ .observe(() -> {
+
+ });
+
+ MeterRegistryAssert.assertThat(meterRegistry)
+ .hasMeterWithName("foo")
+ .hasMeterWithName("foo.active");
+ }
+}
diff --git a/apm-application-toolkit/pom.xml b/apm-application-toolkit/pom.xml
index 19314a30b9..8d2baea6d0 100644
--- a/apm-application-toolkit/pom.xml
+++ b/apm-application-toolkit/pom.xml
@@ -34,6 +34,7 @@
<module>apm-toolkit-trace</module>
<module>apm-toolkit-meter</module>
<module>apm-toolkit-micrometer-registry</module>
+ <module>apm-toolkit-micrometer-1.10</module>
<module>apm-toolkit-kafka</module>
<module>apm-toolkit-webflux</module>
</modules>
diff --git
a/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java
b/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java
index f8a578466f..283d642c34 100755
---
a/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java
+++
b/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java
@@ -231,4 +231,6 @@ public class ComponentsDefine {
public static final OfficialComponent IMPALA_JDBC_DRIVER = new
OfficialComponent(133, "Impala-jdbc-driver");
+ public static final OfficialComponent MICROMETER = new
OfficialComponent(141, "Micrometer");
+
}
diff --git a/apm-application-toolkit/pom.xml
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/pom.xml
similarity index 53%
copy from apm-application-toolkit/pom.xml
copy to
apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/pom.xml
index 19314a30b9..6b850e7748 100644
--- a/apm-application-toolkit/pom.xml
+++
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/pom.xml
@@ -16,25 +16,36 @@
~
-->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
- <artifactId>java-agent</artifactId>
+ <artifactId>apm-toolkit-activation</artifactId>
<groupId>org.apache.skywalking</groupId>
<version>8.14.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
- <artifactId>apm-application-toolkit</artifactId>
- <packaging>pom</packaging>
- <modules>
- <module>apm-toolkit-log4j-1.x</module>
- <module>apm-toolkit-log4j-2.x</module>
- <module>apm-toolkit-logback-1.x</module>
- <module>apm-toolkit-opentracing</module>
- <module>apm-toolkit-trace</module>
- <module>apm-toolkit-meter</module>
- <module>apm-toolkit-micrometer-registry</module>
- <module>apm-toolkit-kafka</module>
- <module>apm-toolkit-webflux</module>
- </modules>
+ <artifactId>apm-toolkit-micrometer-activation</artifactId>
+ <packaging>jar</packaging>
+
+ <name>apm-toolkit-micrometer-activation</name>
+ <url>http://maven.apache.org</url>
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <micrometer.version>1.10.2</micrometer.version>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.skywalking</groupId>
+ <artifactId>apm-toolkit-micrometer-1.10</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>io.micrometer</groupId>
+ <artifactId>micrometer-core</artifactId>
+ <version>${micrometer.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
</project>
diff --git
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerContextManagerThreadLocalAccessorInstrumentation.java
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerContextManagerThreadLocalAccessorInstrumentation.java
new file mode 100644
index 0000000000..25157cca8d
--- /dev/null
+++
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerContextManagerThreadLocalAccessorInstrumentation.java
@@ -0,0 +1,76 @@
+/*
+ * 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.skywalking.apm.toolkit.activation.micrometer;
+
+import net.bytebuddy.description.method.MethodDescription;
+import net.bytebuddy.matcher.ElementMatcher;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
+import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch;
+import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch;
+
+import static net.bytebuddy.matcher.ElementMatchers.named;
+
+public class MicrometerContextManagerThreadLocalAccessorInstrumentation
extends ClassInstanceMethodsEnhancePluginDefine {
+
+ public static final String ENHANCE_CLASS =
"org.apache.skywalking.apm.toolkit.micrometer.observation.SkywalkingContextSnapshotThreadLocalAccessor";
+
+ public static final String INTERCEPT_GET_VALUE_POINT_METHOD = "getValue";
+
+ public static final String INTERCEPT_SET_VALUE_POINT_METHOD = "setValue";
+
+ public static final String INTERCEPT_RESET_POINT_METHOD = "reset";
+ public static final String INTERCEPT_CLASS =
"org.apache.skywalking.apm.toolkit.activation.micrometer.MicrometerContextSnapshotThreadLocalAccessorInterceptor";
+
+ @Override
+ protected ClassMatch enhanceClass() {
+ return NameMatch.byName(ENHANCE_CLASS);
+ }
+
+ @Override
+ public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
+ return new ConstructorInterceptPoint[0];
+ }
+
+ @Override
+ public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints()
{
+ return new InstanceMethodsInterceptPoint[] {
+ new InstanceMethodsInterceptPoint() {
+ @Override
+ public ElementMatcher<MethodDescription> getMethodsMatcher() {
+ return named(INTERCEPT_GET_VALUE_POINT_METHOD)
+ .or(named(INTERCEPT_SET_VALUE_POINT_METHOD))
+ .or(named(INTERCEPT_RESET_POINT_METHOD));
+ }
+
+ @Override
+ public String getMethodsInterceptor() {
+ return INTERCEPT_CLASS;
+ }
+
+ @Override
+ public boolean isOverrideArgs() {
+ return false;
+ }
+ }
+ };
+ }
+
+}
diff --git
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerContextSnapshotThreadLocalAccessorInterceptor.java
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerContextSnapshotThreadLocalAccessorInterceptor.java
new file mode 100644
index 0000000000..8ea6e33db8
--- /dev/null
+++
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerContextSnapshotThreadLocalAccessorInterceptor.java
@@ -0,0 +1,67 @@
+/*
+ * 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.skywalking.apm.toolkit.activation.micrometer;
+
+import java.lang.reflect.Method;
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+import org.apache.skywalking.apm.agent.core.context.ContextSnapshot;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+import
org.apache.skywalking.apm.toolkit.micrometer.observation.SkywalkingContextSnapshotThreadLocalAccessor;
+import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
+
+/**
+ * {@link MicrometerContextSnapshotThreadLocalAccessorInterceptor} define how
to enhance classes
+ * {@link SkywalkingContextSnapshotThreadLocalAccessor}.
+ */
+public class MicrometerContextSnapshotThreadLocalAccessorInterceptor
implements InstanceMethodsAroundInterceptor {
+
+ @Override
+ public void beforeMethod(EnhancedInstance objInst, Method method, Object[]
allArguments, Class<?>[] argumentsTypes,
+ MethodInterceptResult result) throws Throwable {
+
+ }
+
+ @Override
+ public Object afterMethod(EnhancedInstance objInst, Method method,
Object[] allArguments, Class<?>[] argumentsTypes,
+ Object ret) throws Throwable {
+ String methodName = method.getName();
+ if ("getValue".equals(methodName)) {
+ return ContextManager.capture();
+ } else if ("setValue".equals(methodName)) {
+ ContextSnapshot context = (ContextSnapshot) allArguments[0];
+ AbstractSpan span = ContextManager.createLocalSpan("Thread");
+ span.setComponent(ComponentsDefine.MICROMETER);
+ ContextManager.continued(context);
+ } else if ("reset".equals(methodName)) {
+ if (ContextManager.isActive()) {
+ ContextManager.stopSpan();
+ }
+ }
+ return ret;
+ }
+
+ @Override
+ public void handleMethodException(EnhancedInstance objInst, Method method,
Object[] allArguments,
+ Class<?>[] argumentsTypes, Throwable t) {
+ }
+
+}
diff --git
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerDefaultTracingHandlerInstrumentation.java
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerDefaultTracingHandlerInstrumentation.java
new file mode 100644
index 0000000000..2e32418eed
--- /dev/null
+++
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerDefaultTracingHandlerInstrumentation.java
@@ -0,0 +1,80 @@
+/*
+ * 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.skywalking.apm.toolkit.activation.micrometer;
+
+import net.bytebuddy.description.method.MethodDescription;
+import net.bytebuddy.matcher.ElementMatcher;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
+import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch;
+import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch;
+
+import static net.bytebuddy.matcher.ElementMatchers.named;
+
+public class MicrometerDefaultTracingHandlerInstrumentation extends
ClassInstanceMethodsEnhancePluginDefine {
+
+ public static final String ENHANCE_CLASS =
"org.apache.skywalking.apm.toolkit.micrometer.observation.SkywalkingDefaultTracingHandler";
+
+ public static final String INTERCEPT_START_POINT_METHOD = "onStart";
+
+ public static final String INTERCEPT_STOP_POINT_METHOD = "onStop";
+
+ public static final String INTERCEPT_ERROR_POINT_METHOD = "onError";
+
+ public static final String INTERCEPT_EVENT_POINT_METHOD = "onEvent";
+
+ public static final String INTERCEPT_CLASS =
"org.apache.skywalking.apm.toolkit.activation.micrometer.MicrometerDefaultTracingHandlerInterceptor";
+
+ @Override
+ protected ClassMatch enhanceClass() {
+ return NameMatch.byName(ENHANCE_CLASS);
+ }
+
+ @Override
+ public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
+ return new ConstructorInterceptPoint[0];
+ }
+
+ @Override
+ public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints()
{
+ return new InstanceMethodsInterceptPoint[] {
+ new InstanceMethodsInterceptPoint() {
+ @Override
+ public ElementMatcher<MethodDescription> getMethodsMatcher() {
+ return named(INTERCEPT_START_POINT_METHOD)
+ .or(named(INTERCEPT_STOP_POINT_METHOD))
+ .or(named(INTERCEPT_ERROR_POINT_METHOD))
+ .or(named(INTERCEPT_EVENT_POINT_METHOD));
+ }
+
+ @Override
+ public String getMethodsInterceptor() {
+ return INTERCEPT_CLASS;
+ }
+
+ @Override
+ public boolean isOverrideArgs() {
+ return false;
+ }
+ }
+ };
+ }
+
+}
diff --git
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerDefaultTracingHandlerInterceptor.java
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerDefaultTracingHandlerInterceptor.java
new file mode 100644
index 0000000000..006c8002e4
--- /dev/null
+++
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerDefaultTracingHandlerInterceptor.java
@@ -0,0 +1,86 @@
+/*
+ * 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.skywalking.apm.toolkit.activation.micrometer;
+
+import io.micrometer.observation.Observation;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+import org.apache.skywalking.apm.agent.core.context.tag.Tags;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
+import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+import
org.apache.skywalking.apm.toolkit.micrometer.observation.SkywalkingDefaultTracingHandler;
+import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
+import org.apache.skywalking.apm.util.StringUtil;
+
+/**
+ * {@link MicrometerDefaultTracingHandlerInterceptor} define how to enhance
classes
+ * {@link SkywalkingDefaultTracingHandler}.
+ */
+public class MicrometerDefaultTracingHandlerInterceptor implements
InstanceMethodsAroundInterceptor {
+
+ @Override
+ public void beforeMethod(EnhancedInstance objInst, Method method, Object[]
allArguments, Class<?>[] argumentsTypes,
+ MethodInterceptResult result) throws Throwable {
+ String methodName = method.getName();
+ if ("onStart".equals(methodName)) {
+ Observation.Context context = (Observation.Context)
allArguments[0];
+ AbstractSpan span =
ContextManager.createLocalSpan(context.getName());
+ span.setComponent(ComponentsDefine.MICROMETER);
+ // tags
+ } else if ("onStop".equals(methodName)) {
+ Observation.Context context = (Observation.Context)
allArguments[0];
+ SpanLayer spanLayer =
TaggingHelper.toLayer(context.getAllKeyValues());
+ AbstractSpan abstractSpan = ContextManager.activeSpan();
+ abstractSpan
+ .setOperationName(StringUtil.isBlank(
+ context.getContextualName()) ? context.getName() :
context.getContextualName());
+ context.getAllKeyValues()
+ .forEach(keyValue ->
abstractSpan.tag(Tags.ofKey(keyValue.getKey()), keyValue.getValue()));
+ if (spanLayer != null) {
+ abstractSpan.setLayer(spanLayer);
+ }
+ ContextManager.stopSpan();
+ } else if ("onError".equals(methodName)) {
+ Observation.Context context = (Observation.Context)
allArguments[0];
+ ContextManager.activeSpan().log(context.getError());
+ } else if ("onEvent".equals(methodName)) {
+ Observation.Event event = (Observation.Event) allArguments[0];
+ Map<String, String> map = new HashMap<>();
+ map.put("event", event.getContextualName() != null ?
event.getContextualName() : event.getName());
+ ContextManager.activeSpan().log(System.currentTimeMillis(), map);
+ }
+ }
+
+ @Override
+ public Object afterMethod(EnhancedInstance objInst, Method method,
Object[] allArguments, Class<?>[] argumentsTypes,
+ Object ret) throws Throwable {
+ return ret;
+ }
+
+ @Override
+ public void handleMethodException(EnhancedInstance objInst, Method method,
Object[] allArguments,
+ Class<?>[] argumentsTypes, Throwable t) {
+ }
+
+}
diff --git
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerReceiverTracingHandlerInstrumentation.java
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerReceiverTracingHandlerInstrumentation.java
new file mode 100644
index 0000000000..573356e160
--- /dev/null
+++
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerReceiverTracingHandlerInstrumentation.java
@@ -0,0 +1,77 @@
+/*
+ * 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.skywalking.apm.toolkit.activation.micrometer;
+
+import net.bytebuddy.description.method.MethodDescription;
+import net.bytebuddy.matcher.ElementMatcher;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
+import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch;
+import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch;
+
+import static net.bytebuddy.matcher.ElementMatchers.named;
+
+public class MicrometerReceiverTracingHandlerInstrumentation extends
ClassInstanceMethodsEnhancePluginDefine {
+
+ public static final String ENHANCE_CLASS =
"org.apache.skywalking.apm.toolkit.micrometer.observation.SkywalkingReceiverTracingHandler";
+
+ public static final String INTERCEPT_START_POINT_METHOD = "onStart";
+
+ public static final String INTERCEPT_ERROR_POINT_METHOD = "onError";
+
+ public static final String INTERCEPT_STOP_POINT_METHOD = "onStop";
+
+ public static final String INTERCEPT_CLASS =
"org.apache.skywalking.apm.toolkit.activation.micrometer.MicrometerReceiverTracingHandlerInterceptor";
+
+ @Override
+ protected ClassMatch enhanceClass() {
+ return NameMatch.byName(ENHANCE_CLASS);
+ }
+
+ @Override
+ public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
+ return new ConstructorInterceptPoint[0];
+ }
+
+ @Override
+ public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints()
{
+ return new InstanceMethodsInterceptPoint[] {
+ new InstanceMethodsInterceptPoint() {
+ @Override
+ public ElementMatcher<MethodDescription> getMethodsMatcher() {
+ return named(INTERCEPT_START_POINT_METHOD)
+ .or(named(INTERCEPT_STOP_POINT_METHOD))
+ .or(named(INTERCEPT_ERROR_POINT_METHOD));
+ }
+
+ @Override
+ public String getMethodsInterceptor() {
+ return INTERCEPT_CLASS;
+ }
+
+ @Override
+ public boolean isOverrideArgs() {
+ return false;
+ }
+ }
+ };
+ }
+
+}
diff --git
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerReceiverTracingHandlerInterceptor.java
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerReceiverTracingHandlerInterceptor.java
new file mode 100644
index 0000000000..4f9ebafebd
--- /dev/null
+++
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerReceiverTracingHandlerInterceptor.java
@@ -0,0 +1,92 @@
+/*
+ * 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.skywalking.apm.toolkit.activation.micrometer;
+
+import io.micrometer.observation.Observation;
+import io.micrometer.observation.transport.ReceiverContext;
+import java.lang.reflect.Method;
+import org.apache.skywalking.apm.agent.core.context.CarrierItem;
+import org.apache.skywalking.apm.agent.core.context.ContextCarrier;
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+import org.apache.skywalking.apm.agent.core.context.tag.Tags;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
+import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
+import
org.apache.skywalking.apm.toolkit.micrometer.observation.SkywalkingReceiverTracingHandler;
+import org.apache.skywalking.apm.util.StringUtil;
+
+/**
+ * {@link MicrometerReceiverTracingHandlerInterceptor} define how to enhance
classes
+ * {@link SkywalkingReceiverTracingHandler}.
+ */
+public class MicrometerReceiverTracingHandlerInterceptor implements
InstanceMethodsAroundInterceptor {
+
+ @Override
+ public void beforeMethod(EnhancedInstance objInst, Method method, Object[]
allArguments, Class<?>[] argumentsTypes,
+ MethodInterceptResult result) throws Throwable {
+ String methodName = method.getName();
+ if ("onStart".equals(methodName)) {
+ ReceiverContext<Object> context = (ReceiverContext<Object>)
allArguments[0];
+ final ContextCarrier contextCarrier = new ContextCarrier();
+ CarrierItem next = contextCarrier.items();
+ while (next.hasNext()) {
+ next = next.next();
+
next.setHeadValue(context.getGetter().get(context.getCarrier(),
next.getHeadKey()));
+ }
+ AbstractSpan span =
ContextManager.createEntrySpan(getOperationName(context), contextCarrier);
+ span.setComponent(ComponentsDefine.MICROMETER);
+
+ } else if ("onStop".equals(methodName)) {
+ ReceiverContext<Object> context = (ReceiverContext<Object>)
allArguments[0];
+ SpanLayer spanLayer =
TaggingHelper.toLayer(context.getAllKeyValues());
+ AbstractSpan abstractSpan = ContextManager.activeSpan();
+ abstractSpan
+
.setPeer(SpanHelper.tryToGetPeer(context.getRemoteServiceAddress(),
context.getAllKeyValues()))
+ .setOperationName(getOperationName(context));
+ context.getAllKeyValues()
+ .forEach(keyValue ->
abstractSpan.tag(Tags.ofKey(keyValue.getKey()), keyValue.getValue()));
+ if (spanLayer != null) {
+ abstractSpan.setLayer(spanLayer);
+ }
+ ContextManager.stopSpan();
+ } else if ("onError".equals(methodName)) {
+ Observation.Context context = (Observation.Context)
allArguments[0];
+ ContextManager.activeSpan().log(context.getError());
+ }
+ }
+
+ private static String getOperationName(final ReceiverContext<Object>
context) {
+ return StringUtil.isBlank(
+ context.getContextualName()) ? context.getName() :
context.getContextualName();
+ }
+
+ @Override
+ public Object afterMethod(EnhancedInstance objInst, Method method,
Object[] allArguments, Class<?>[] argumentsTypes,
+ Object ret) throws Throwable {
+ return ret;
+ }
+
+ @Override
+ public void handleMethodException(EnhancedInstance objInst, Method method,
Object[] allArguments,
+ Class<?>[] argumentsTypes, Throwable t) {
+ }
+}
diff --git
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerSenderTracingHandlerInstrumentation.java
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerSenderTracingHandlerInstrumentation.java
new file mode 100644
index 0000000000..d528f1e2b7
--- /dev/null
+++
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerSenderTracingHandlerInstrumentation.java
@@ -0,0 +1,77 @@
+/*
+ * 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.skywalking.apm.toolkit.activation.micrometer;
+
+import net.bytebuddy.description.method.MethodDescription;
+import net.bytebuddy.matcher.ElementMatcher;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
+import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch;
+import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch;
+
+import static net.bytebuddy.matcher.ElementMatchers.named;
+
+public class MicrometerSenderTracingHandlerInstrumentation extends
ClassInstanceMethodsEnhancePluginDefine {
+
+ public static final String ENHANCE_CLASS =
"org.apache.skywalking.apm.toolkit.micrometer.observation.SkywalkingSenderTracingHandler";
+
+ public static final String INTERCEPT_START_POINT_METHOD = "onStart";
+
+ public static final String INTERCEPT_ERROR_POINT_METHOD = "onError";
+
+ public static final String INTERCEPT_STOP_POINT_METHOD = "onStop";
+
+ public static final String INTERCEPT_CLASS =
"org.apache.skywalking.apm.toolkit.activation.micrometer.MicrometerSenderTracingHandlerInterceptor";
+
+ @Override
+ protected ClassMatch enhanceClass() {
+ return NameMatch.byName(ENHANCE_CLASS);
+ }
+
+ @Override
+ public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
+ return new ConstructorInterceptPoint[0];
+ }
+
+ @Override
+ public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints()
{
+ return new InstanceMethodsInterceptPoint[] {
+ new InstanceMethodsInterceptPoint() {
+ @Override
+ public ElementMatcher<MethodDescription> getMethodsMatcher() {
+ return named(INTERCEPT_START_POINT_METHOD)
+ .or(named(INTERCEPT_STOP_POINT_METHOD))
+ .or(named(INTERCEPT_ERROR_POINT_METHOD));
+ }
+
+ @Override
+ public String getMethodsInterceptor() {
+ return INTERCEPT_CLASS;
+ }
+
+ @Override
+ public boolean isOverrideArgs() {
+ return false;
+ }
+ }
+ };
+ }
+
+}
diff --git
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerSenderTracingHandlerInterceptor.java
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerSenderTracingHandlerInterceptor.java
new file mode 100644
index 0000000000..1aeee1eeea
--- /dev/null
+++
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerSenderTracingHandlerInterceptor.java
@@ -0,0 +1,93 @@
+/*
+ * 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.skywalking.apm.toolkit.activation.micrometer;
+
+import io.micrometer.observation.Observation;
+import io.micrometer.observation.transport.SenderContext;
+import java.lang.reflect.Method;
+import org.apache.skywalking.apm.agent.core.context.CarrierItem;
+import org.apache.skywalking.apm.agent.core.context.ContextCarrier;
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+import org.apache.skywalking.apm.agent.core.context.tag.Tags;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
+import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
+import
org.apache.skywalking.apm.toolkit.micrometer.observation.SkywalkingSenderTracingHandler;
+import org.apache.skywalking.apm.util.StringUtil;
+
+/**
+ * {@link MicrometerSenderTracingHandlerInterceptor} define how to enhance
classes
+ * {@link SkywalkingSenderTracingHandler}.
+ */
+public class MicrometerSenderTracingHandlerInterceptor implements
InstanceMethodsAroundInterceptor {
+
+ @Override
+ public void beforeMethod(EnhancedInstance objInst, Method method, Object[]
allArguments, Class<?>[] argumentsTypes,
+ MethodInterceptResult result) throws Throwable {
+ String methodName = method.getName();
+ if ("onStart".equals(methodName)) {
+ SenderContext<Object> context = (SenderContext<Object>)
allArguments[0];
+ final ContextCarrier contextCarrier = new ContextCarrier();
+ AbstractSpan span = ContextManager.createExitSpan(
+ getOperationName(context), contextCarrier,
SpanHelper.tryToGetPeer(context.getRemoteServiceAddress(),
context.getAllKeyValues()));
+ CarrierItem next = contextCarrier.items();
+ while (next.hasNext()) {
+ next = next.next();
+ context.getSetter().set(context.getCarrier(),
next.getHeadKey(), next.getHeadValue());
+ }
+ span.setComponent(ComponentsDefine.MICROMETER);
+ } else if ("onStop".equals(methodName)) {
+ SenderContext<Object> context = (SenderContext<Object>)
allArguments[0];
+ SpanLayer spanLayer =
TaggingHelper.toLayer(context.getAllKeyValues());
+ AbstractSpan abstractSpan = ContextManager.activeSpan();
+ abstractSpan
+
.setPeer(SpanHelper.tryToGetPeer(context.getRemoteServiceAddress(),
context.getAllKeyValues()))
+ .setOperationName(getOperationName(context));
+ context.getAllKeyValues()
+ .forEach(keyValue ->
abstractSpan.tag(Tags.ofKey(keyValue.getKey()), keyValue.getValue()));
+ if (spanLayer != null) {
+ abstractSpan.setLayer(spanLayer);
+ }
+ ContextManager.stopSpan();
+ } else if ("onError".equals(methodName)) {
+ Observation.Context context = (Observation.Context)
allArguments[0];
+ ContextManager.activeSpan().log(context.getError());
+ }
+ }
+
+ private static String getOperationName(final SenderContext<Object>
context) {
+ return StringUtil.isBlank(
+ context.getContextualName()) ? context.getName() :
context.getContextualName();
+ }
+
+ @Override
+ public Object afterMethod(EnhancedInstance objInst, Method method,
Object[] allArguments, Class<?>[] argumentsTypes,
+ Object ret) throws Throwable {
+ return ret;
+ }
+
+ @Override
+ public void handleMethodException(EnhancedInstance objInst, Method method,
Object[] allArguments,
+ Class<?>[] argumentsTypes, Throwable t) {
+ }
+
+}
diff --git
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/SpanHelper.java
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/SpanHelper.java
new file mode 100644
index 0000000000..f98fe3d82a
--- /dev/null
+++
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/SpanHelper.java
@@ -0,0 +1,50 @@
+/*
+ * 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.skywalking.apm.toolkit.activation.micrometer;
+
+import io.micrometer.common.KeyValue;
+import io.micrometer.common.KeyValues;
+import java.net.URI;
+
+class SpanHelper {
+
+ static String tryToGetPeer(String remoteAddress, KeyValues allKeyValues) {
+ if (remoteAddress != null) {
+ return remoteAddress;
+ }
+ String result = allKeyValues
+ .stream()
+ .filter(keyValue -> "http.url".equalsIgnoreCase(
+ keyValue.getKey()) ||
"uri".equalsIgnoreCase(keyValue.getKey())
+ || keyValue.getKey().contains("uri") ||
keyValue.getKey().contains("url")
+ )
+ .findFirst()
+ .map(KeyValue::getValue)
+ .orElse("unknown");
+ try {
+ URI uri = URI.create(result);
+ if (uri.getHost() == null) {
+ return null;
+ }
+ return uri.getHost() + ":" + uri.getPort();
+ } catch (Exception ex) {
+ return null;
+ }
+ }
+}
diff --git
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/TaggingHelper.java
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/TaggingHelper.java
new file mode 100644
index 0000000000..306be5201d
--- /dev/null
+++
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/micrometer/TaggingHelper.java
@@ -0,0 +1,50 @@
+/*
+ * 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.skywalking.apm.toolkit.activation.micrometer;
+
+import io.micrometer.common.KeyValue;
+import io.micrometer.common.KeyValues;
+import java.util.Locale;
+import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
+
+class TaggingHelper {
+
+ private static final String DB_TAG_PREFIX = "jdbc";
+
+ private static final String HTTP_TAG_PREFIX = "http";
+
+ private static final String RPC_TAG_PREFIX = "rpc";
+
+ private static final String MESSAGING_TAG_PREFIX = "messaging";
+
+ static SpanLayer toLayer(KeyValues keyValues) {
+ for (KeyValue keyValue : keyValues) {
+ if
(keyValue.getKey().toLowerCase(Locale.ROOT).startsWith(DB_TAG_PREFIX)) {
+ return SpanLayer.DB;
+ } else if
(keyValue.getKey().toLowerCase(Locale.ROOT).startsWith(HTTP_TAG_PREFIX)) {
+ return SpanLayer.HTTP;
+ } else if
(keyValue.getKey().toLowerCase(Locale.ROOT).startsWith(RPC_TAG_PREFIX)) {
+ return SpanLayer.RPC_FRAMEWORK;
+ } else if
(keyValue.getKey().toLowerCase(Locale.ROOT).startsWith(MESSAGING_TAG_PREFIX)) {
+ return SpanLayer.MQ;
+ }
+ }
+ return null;
+ }
+}
diff --git
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/resources/skywalking-plugin.def
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/resources/skywalking-plugin.def
new file mode 100644
index 0000000000..4554becc22
--- /dev/null
+++
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/main/resources/skywalking-plugin.def
@@ -0,0 +1,20 @@
+# 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.
+
+micrometer-1.10.x=org.apache.skywalking.apm.toolkit.activation.micrometer.MicrometerContextManagerThreadLocalAccessorInstrumentation
+micrometer-1.10.x=org.apache.skywalking.apm.toolkit.activation.micrometer.MicrometerDefaultTracingHandlerInstrumentation
+micrometer-1.10.x=org.apache.skywalking.apm.toolkit.activation.micrometer.MicrometerSenderTracingHandlerInstrumentation
+micrometer-1.10.x=org.apache.skywalking.apm.toolkit.activation.micrometer.MicrometerReceiverTracingHandlerInstrumentation
diff --git
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/micrometer/AbstractTracingSpanHelper.java
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/micrometer/AbstractTracingSpanHelper.java
new file mode 100644
index 0000000000..8e87305e74
--- /dev/null
+++
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/micrometer/AbstractTracingSpanHelper.java
@@ -0,0 +1,47 @@
+/*
+ * 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.skywalking.apm.toolkit.activation.micrometer;
+
+import java.util.Collections;
+import java.util.List;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
+import org.apache.skywalking.apm.agent.core.context.trace.LogDataEntity;
+import org.apache.skywalking.apm.agent.test.helper.FieldGetter;
+
+// TODO: Make a commonly used utility class out of this?
+public class AbstractTracingSpanHelper {
+
+ public static List<LogDataEntity> getParentFieldLogs(AbstractTracingSpan
tracingSpan) {
+ try {
+ return FieldGetter.getParentFieldValue(tracingSpan, "logs");
+ } catch (Exception e) {
+ }
+
+ return Collections.emptyList();
+ }
+
+ public static List<LogDataEntity>
get2LevelParentFieldLogs(AbstractTracingSpan tracingSpan) {
+ try {
+ return FieldGetter.get2LevelParentFieldValue(tracingSpan, "logs");
+ } catch (Exception e) {
+ }
+
+ return Collections.emptyList();
+ }
+}
diff --git
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/micrometer/ContextManagerExtendOverrideService.java
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/micrometer/ContextManagerExtendOverrideService.java
new file mode 100644
index 0000000000..ee08457247
--- /dev/null
+++
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/micrometer/ContextManagerExtendOverrideService.java
@@ -0,0 +1,26 @@
+/*
+ * 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.skywalking.apm.toolkit.activation.micrometer;
+
+import org.apache.skywalking.apm.agent.core.boot.OverrideImplementor;
+import
org.apache.skywalking.apm.agent.core.context.ContextManagerExtendService;
+
+@OverrideImplementor(ContextManagerExtendService.class)
+public class ContextManagerExtendOverrideService extends
ContextManagerExtendService {
+}
diff --git
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerContextSnapshotThreadLocalAccessorInterceptorTest.java
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerContextSnapshotThreadLocalAccessorInterceptorTest.java
new file mode 100644
index 0000000000..3e3f66c844
--- /dev/null
+++
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerContextSnapshotThreadLocalAccessorInterceptorTest.java
@@ -0,0 +1,147 @@
+/*
+ * 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.skywalking.apm.toolkit.activation.micrometer;
+
+import java.lang.reflect.Method;
+import java.util.List;
+import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
+import org.apache.skywalking.apm.agent.core.conf.Config;
+import org.apache.skywalking.apm.agent.core.context.ContextManager;
+import
org.apache.skywalking.apm.agent.core.context.ContextManagerExtendService;
+import org.apache.skywalking.apm.agent.core.context.ContextSnapshot;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
+import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+import org.apache.skywalking.apm.agent.test.helper.SegmentHelper;
+import org.apache.skywalking.apm.agent.test.tools.AgentServiceRule;
+import org.apache.skywalking.apm.agent.test.tools.SegmentStorage;
+import org.apache.skywalking.apm.agent.test.tools.SegmentStoragePoint;
+import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner;
+import
org.apache.skywalking.apm.toolkit.micrometer.observation.SkywalkingContextSnapshotThreadLocalAccessor;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.junit.Assert.assertThat;
+
+@RunWith(TracingSegmentRunner.class)
+public class MicrometerContextSnapshotThreadLocalAccessorInterceptorTest {
+
+ private final Class[] argumentTypes = new Class[] {Object.class};
+ private final Method get =
SkywalkingContextSnapshotThreadLocalAccessor.class.getMethod("getValue");
+ private final Method set =
SkywalkingContextSnapshotThreadLocalAccessor.class.getMethod("setValue",
Object.class);
+ private final Method reset =
SkywalkingContextSnapshotThreadLocalAccessor.class.getMethod("reset");
+ @Rule
+ public AgentServiceRule agentServiceRule = new AgentServiceRule();
+ @SegmentStoragePoint
+ private SegmentStorage segmentStorage;
+ @Mock
+ private EnhancedInstance enhancedInstance;
+ @Mock
+ private MethodInterceptResult result;
+ private MicrometerContextSnapshotThreadLocalAccessorInterceptor
interceptor;
+ private ContextSnapshot context;
+ private Object[] consumerArguments;
+ private AbstractSpan testSpan;
+
+ public MicrometerContextSnapshotThreadLocalAccessorInterceptorTest()
throws NoSuchMethodException {
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ interceptor = new
MicrometerContextSnapshotThreadLocalAccessorInterceptor();
+
+ Config.Agent.SERVICE_NAME =
"MicrometerContextSnapshotThreadLocalAccessorTestCases-APP";
+
+ testSpan = ContextManager.createLocalSpan("test from
threadlocalaccessor test");
+ context = ContextManager.capture();
+ consumerArguments = new Object[] {context};
+ }
+
+ @After
+ public void clear() {
+ assertThat(ContextManager.isActive(), is(false));
+ }
+
+ @AfterClass
+ public static void clearAfterAll() {
+ // test from threadlocalaccessor test x 2 TODO: I have no idea what is
going on
+ ContextManager.stopSpan();
+ ContextManager.stopSpan();
+ assertThat(ContextManager.isActive(), is(false));
+ }
+
+ @Test
+ public void testServiceFromPlugin() {
+ PluginBootService service = ServiceManager.INSTANCE.findService(
+ PluginBootService.class);
+
+ Assert.assertNotNull(service);
+ }
+
+ @Test
+ public void testServiceOverrideFromPlugin() {
+ ContextManagerExtendService service =
ServiceManager.INSTANCE.findService(ContextManagerExtendService.class);
+
+ Assert.assertTrue(service instanceof
ContextManagerExtendOverrideService);
+ }
+
+ @Test
+ public void testGetSetReset() throws Throwable {
+ ContextSnapshot contextSnapshot = (ContextSnapshot)
interceptor.afterMethod(
+ enhancedInstance, get, new Object[0], new Class[0], result);
+
+ ContextSnapshot currentCapturedContext = ContextManager.capture();
+ assertThat(currentCapturedContext, not(equalTo(contextSnapshot)));
+ assertThat(currentCapturedContext.getTraceId(),
equalTo(contextSnapshot.getTraceId()));
+
+ ContextManager.stopSpan();
+
+ interceptor.afterMethod(
+ enhancedInstance, set, consumerArguments, argumentTypes, result);
+
+ ContextManager.stopSpan();
+
+ assertThat(segmentStorage.getTraceSegments().size(), is(2));
+ TraceSegment parent = segmentStorage.getTraceSegments().get(0);
+ List<AbstractTracingSpan> spans = SegmentHelper.getSpans(parent);
+ assertThat(spans.size(), is(1));
+ String operationName = spans.get(0).getOperationName();
+ assertThat(operationName, is("test from threadlocalaccessor test"));
+
+ TraceSegment continuedParent =
segmentStorage.getTraceSegments().get(1);
+ assertThat(continuedParent.getRef().getParentEndpoint(),
is(operationName));
+
+ interceptor.afterMethod(
+ enhancedInstance, reset, new Object[0], new Class[0], result);
+
+ assertThat(ContextManager.isActive(), is(false));
+ }
+
+}
diff --git
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerDefaultTracingHandlerInterceptorTest.java
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerDefaultTracingHandlerInterceptorTest.java
new file mode 100644
index 0000000000..9fc3f6bf58
--- /dev/null
+++
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerDefaultTracingHandlerInterceptorTest.java
@@ -0,0 +1,166 @@
+/*
+ * 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.skywalking.apm.toolkit.activation.micrometer;
+
+import io.micrometer.observation.Observation;
+import io.micrometer.observation.ObservationHandler;
+import java.lang.reflect.Method;
+import java.util.List;
+import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
+import org.apache.skywalking.apm.agent.core.conf.Config;
+import
org.apache.skywalking.apm.agent.core.context.ContextManagerExtendService;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
+import org.apache.skywalking.apm.agent.core.context.trace.LogDataEntity;
+import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
+import org.apache.skywalking.apm.agent.core.context.util.KeyValuePair;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+import org.apache.skywalking.apm.agent.test.helper.SegmentHelper;
+import org.apache.skywalking.apm.agent.test.tools.AgentServiceRule;
+import org.apache.skywalking.apm.agent.test.tools.SegmentStorage;
+import org.apache.skywalking.apm.agent.test.tools.SegmentStoragePoint;
+import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+@RunWith(TracingSegmentRunner.class)
+public class MicrometerDefaultTracingHandlerInterceptorTest {
+
+ private final Observation.Context context = new Observation.Context();
+ private final Observation.Event event = new Observation.Event() {
+ @Override
+ public String getContextualName() {
+ return "eventContextualName";
+ }
+
+ @Override
+ public String getName() {
+ return "eventName";
+ }
+ };
+ private final Object[] consumerArguments = new Object[] {context};
+ private final Object[] eventArguments = new Object[] {
+ event,
+ context
+ };
+ private final Class[] argumentTypes = new Class[]
{Observation.Context.class};
+ private final Class[] eventArgumentTypes = new Class[] {
+ Observation.Event.class,
+ Observation.Context.class
+ };
+ private final Method onStart =
ObservationHandler.class.getMethod("onStart", Observation.Context.class);
+ private final Method onStop = ObservationHandler.class.getMethod("onStop",
Observation.Context.class);
+ private final Method onError =
ObservationHandler.class.getMethod("onError", Observation.Context.class);
+ private final Method onEvent = ObservationHandler.class.getMethod(
+ "onEvent", Observation.Event.class, Observation.Context.class);
+ @Rule
+ public AgentServiceRule agentServiceRule = new AgentServiceRule();
+ @SegmentStoragePoint
+ private SegmentStorage segmentStorage;
+ @Mock
+ private EnhancedInstance enhancedInstance;
+ @Mock
+ private MethodInterceptResult result;
+ private MicrometerDefaultTracingHandlerInterceptor interceptor;
+
+ public MicrometerDefaultTracingHandlerInterceptorTest() throws
NoSuchMethodException {
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ context.setName("name");
+ context.setContextualName("contextualName");
+
+ interceptor = new MicrometerDefaultTracingHandlerInterceptor();
+
+ Config.Agent.SERVICE_NAME = "MicrometerTestCases-APP";
+ }
+
+ @Test
+ public void testServiceFromPlugin() {
+ PluginBootService service = ServiceManager.INSTANCE.findService(
+ PluginBootService.class);
+
+ Assert.assertNotNull(service);
+ }
+
+ @Test
+ public void testServiceOverrideFromPlugin() {
+ ContextManagerExtendService service =
ServiceManager.INSTANCE.findService(ContextManagerExtendService.class);
+
+ Assert.assertTrue(service instanceof
ContextManagerExtendOverrideService);
+ }
+
+ @Test
+ public void testDefaultStartEventStop() throws Throwable {
+ interceptor.beforeMethod(
+ enhancedInstance, onStart, consumerArguments, argumentTypes,
result);
+ interceptor.beforeMethod(
+ enhancedInstance, onEvent, eventArguments, eventArgumentTypes,
result);
+ interceptor.beforeMethod(
+ enhancedInstance, onStop, consumerArguments, argumentTypes,
result);
+
+ AbstractTracingSpan abstractTracingSpan = onlySpan();
+ assertThat(abstractTracingSpan.getOperationName(),
equalTo("contextualName"));
+ List<LogDataEntity> logs =
AbstractTracingSpanHelper.getParentFieldLogs(abstractTracingSpan);
+ assertThat(logs.size(), is(1));
+ LogDataEntity logDataEntity = logs.get(0);
+ assertThat(logDataEntity.getLogs().size(), is(1));
+ KeyValuePair keyValuePair = logDataEntity.getLogs().get(0);
+ assertThat(keyValuePair.getKey(), equalTo("event"));
+ assertThat(keyValuePair.getValue(), equalTo("eventContextualName"));
+ }
+
+ @Test
+ public void testDefaultStartExceptionStop() throws Throwable {
+ interceptor.beforeMethod(
+ enhancedInstance, onStart, consumerArguments, argumentTypes,
result);
+ context.setError(new RuntimeException("BOOM"));
+ interceptor.beforeMethod(
+ enhancedInstance, onError, consumerArguments, argumentTypes,
result);
+ interceptor.beforeMethod(
+ enhancedInstance, onStop, consumerArguments, argumentTypes,
result);
+
+ AbstractTracingSpan abstractTracingSpan = onlySpan();
+ assertThat(abstractTracingSpan.getOperationName(),
equalTo("contextualName"));
+ List<LogDataEntity> logs =
AbstractTracingSpanHelper.getParentFieldLogs(abstractTracingSpan);
+ assertThat(logs.size(), is(1));
+ assertThat(logs.get(0).getLogs().size(), is(4)); // 4 events represent
an exception
+ KeyValuePair errorLog = logs.get(0).getLogs().get(0);
+ assertThat(errorLog.getKey(), equalTo("event"));
+ assertThat(errorLog.getValue(), equalTo("error"));
+ }
+
+ private AbstractTracingSpan onlySpan() {
+ assertThat(segmentStorage.getTraceSegments().size(), is(1));
+ TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0);
+ List<AbstractTracingSpan> spans = SegmentHelper.getSpans(traceSegment);
+ assertThat(spans.size(), is(1));
+ AbstractTracingSpan abstractTracingSpan = spans.get(0);
+ return abstractTracingSpan;
+ }
+}
diff --git
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerReceiverTracingHandlerInterceptorTest.java
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerReceiverTracingHandlerInterceptorTest.java
new file mode 100644
index 0000000000..440e632f8d
--- /dev/null
+++
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerReceiverTracingHandlerInterceptorTest.java
@@ -0,0 +1,138 @@
+/*
+ * 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.skywalking.apm.toolkit.activation.micrometer;
+
+import io.micrometer.observation.Observation;
+import io.micrometer.observation.ObservationHandler;
+import io.micrometer.observation.transport.ReceiverContext;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
+import org.apache.skywalking.apm.agent.core.conf.Config;
+import
org.apache.skywalking.apm.agent.core.context.ContextManagerExtendService;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
+import org.apache.skywalking.apm.agent.core.context.trace.LogDataEntity;
+import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
+import org.apache.skywalking.apm.agent.core.context.util.KeyValuePair;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+import org.apache.skywalking.apm.agent.test.helper.SegmentHelper;
+import org.apache.skywalking.apm.agent.test.tools.AgentServiceRule;
+import org.apache.skywalking.apm.agent.test.tools.SegmentStorage;
+import org.apache.skywalking.apm.agent.test.tools.SegmentStoragePoint;
+import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+@RunWith(TracingSegmentRunner.class)
+public class MicrometerReceiverTracingHandlerInterceptorTest {
+
+ private final ReceiverContext<Map<String, String>> context = new
ReceiverContext<>(
+ (carrier, key) -> carrier.get(key));
+ private final Object[] consumerArguments = new Object[] {context};
+ private final Class[] argumentTypes = new Class[] {ReceiverContext.class};
+ private final Method onStart =
ObservationHandler.class.getMethod("onStart", Observation.Context.class);
+ private final Method onStop = ObservationHandler.class.getMethod("onStop",
Observation.Context.class);
+ private final Method onError =
ObservationHandler.class.getMethod("onError", Observation.Context.class);
+ @Rule
+ public AgentServiceRule agentServiceRule = new AgentServiceRule();
+ @SegmentStoragePoint
+ private SegmentStorage segmentStorage;
+ @Mock
+ private EnhancedInstance enhancedInstance;
+ @Mock
+ private MethodInterceptResult result;
+ private MicrometerReceiverTracingHandlerInterceptor interceptor;
+
+ public MicrometerReceiverTracingHandlerInterceptorTest() throws
NoSuchMethodException {
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ context.setName("name");
+ context.setContextualName("contextualName");
+ Map<String, String> map = new HashMap<>();
+ map.put(
+ "sw8",
+
"1-Njc3OTM1ZDM4ZTFiNDAwMzk3NDU4MjI2OTM4YWU3MmIuMS4xNjY5NjM5MDI1ODE1MDAwMQ==-Njc3OTM1ZDM4ZTFiNDAwMzk3NDU4MjI2OTM4YWU3MmIuMS4xNjY5NjM5MDI1ODE1MDAwMA==-0-TWljcm9tZXRlclJlY2VpdmVyVGVzdENhc2VzLUFQUA==-YWU5YWZkM2YxMDg0NGYzMzg1MGZlOGQwYzRkNzYwYTdAMTAuMTUuMTguMTE1-Y29udGV4dHVhbE5hbWU=-aHR0cDovL2xvY2FsaG9zdDo4MDgw"
+ );
+ map.put("sw8-correlation", "");
+ map.put("sw8-x", "0- ");
+ context.setCarrier(map);
+
+ interceptor = new MicrometerReceiverTracingHandlerInterceptor();
+
+ Config.Agent.SERVICE_NAME = "MicrometerReceiverTestCases-APP";
+ }
+
+ @Test
+ public void testServiceFromPlugin() {
+ PluginBootService service = ServiceManager.INSTANCE.findService(
+ PluginBootService.class);
+
+ Assert.assertNotNull(service);
+ }
+
+ @Test
+ public void testServiceOverrideFromPlugin() {
+ ContextManagerExtendService service =
ServiceManager.INSTANCE.findService(ContextManagerExtendService.class);
+
+ Assert.assertTrue(service instanceof
ContextManagerExtendOverrideService);
+ }
+
+ @Test
+ public void testDefaultStartExceptionStop() throws Throwable {
+ interceptor.beforeMethod(
+ enhancedInstance, onStart, consumerArguments, argumentTypes,
result);
+ context.setError(new RuntimeException("BOOM"));
+ interceptor.beforeMethod(
+ enhancedInstance, onError, consumerArguments, argumentTypes,
result);
+ interceptor.beforeMethod(
+ enhancedInstance, onStop, consumerArguments, argumentTypes,
result);
+
+ AbstractTracingSpan abstractTracingSpan = onlySpan();
+ assertThat(abstractTracingSpan.getOperationName(),
equalTo("contextualName"));
+ assertThat(abstractTracingSpan.isEntry(), is(true));
+ List<LogDataEntity> logs =
AbstractTracingSpanHelper.get2LevelParentFieldLogs(abstractTracingSpan);
+ assertThat(logs.size(), is(1));
+ assertThat(logs.get(0).getLogs().size(), is(4)); // 4 events represent
an exception
+ KeyValuePair errorLog = logs.get(0).getLogs().get(0);
+ assertThat(errorLog.getKey(), equalTo("event"));
+ assertThat(errorLog.getValue(), equalTo("error"));
+ }
+
+ private AbstractTracingSpan onlySpan() {
+ assertThat(segmentStorage.getTraceSegments().size(), is(1));
+ TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0);
+ List<AbstractTracingSpan> spans = SegmentHelper.getSpans(traceSegment);
+ assertThat(spans.size(), is(1));
+ AbstractTracingSpan abstractTracingSpan = spans.get(0);
+ return abstractTracingSpan;
+ }
+}
diff --git
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerSenderTracingHandlerInterceptorTest.java
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerSenderTracingHandlerInterceptorTest.java
new file mode 100644
index 0000000000..7acfed95b9
--- /dev/null
+++
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/micrometer/MicrometerSenderTracingHandlerInterceptorTest.java
@@ -0,0 +1,137 @@
+/*
+ * 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.skywalking.apm.toolkit.activation.micrometer;
+
+import io.micrometer.observation.Observation;
+import io.micrometer.observation.ObservationHandler;
+import io.micrometer.observation.transport.ReceiverContext;
+import io.micrometer.observation.transport.SenderContext;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
+import org.apache.skywalking.apm.agent.core.conf.Config;
+import
org.apache.skywalking.apm.agent.core.context.ContextManagerExtendService;
+import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
+import org.apache.skywalking.apm.agent.core.context.trace.LogDataEntity;
+import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
+import org.apache.skywalking.apm.agent.core.context.util.KeyValuePair;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+import org.apache.skywalking.apm.agent.test.helper.SegmentHelper;
+import org.apache.skywalking.apm.agent.test.tools.AgentServiceRule;
+import org.apache.skywalking.apm.agent.test.tools.SegmentStorage;
+import org.apache.skywalking.apm.agent.test.tools.SegmentStoragePoint;
+import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner;
+import org.hamcrest.CoreMatchers;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+@RunWith(TracingSegmentRunner.class)
+public class MicrometerSenderTracingHandlerInterceptorTest {
+
+ private final SenderContext<Map<String, String>> context = new
SenderContext<>(
+ (carrier, key, value) -> carrier.put(key, value));
+ private final Map<String, String> carrier = new HashMap<>();
+ private final Object[] consumerArguments = new Object[] {context};
+ private final Class[] argumentTypes = new Class[] {ReceiverContext.class};
+ private final Method onStart =
ObservationHandler.class.getMethod("onStart", Observation.Context.class);
+ private final Method onStop = ObservationHandler.class.getMethod("onStop",
Observation.Context.class);
+ private final Method onError =
ObservationHandler.class.getMethod("onError", Observation.Context.class);
+ @Rule
+ public AgentServiceRule agentServiceRule = new AgentServiceRule();
+ @SegmentStoragePoint
+ private SegmentStorage segmentStorage;
+ @Mock
+ private EnhancedInstance enhancedInstance;
+ @Mock
+ private MethodInterceptResult result;
+ private MicrometerSenderTracingHandlerInterceptor interceptor;
+
+ public MicrometerSenderTracingHandlerInterceptorTest() throws
NoSuchMethodException {
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ context.setName("name");
+ context.setContextualName("contextualName");
+ context.setCarrier(carrier);
+ context.setRemoteServiceAddress("http://localhost:8080");
+
+ interceptor = new MicrometerSenderTracingHandlerInterceptor();
+
+ Config.Agent.SERVICE_NAME = "MicrometerSenderTestCases-APP";
+ }
+
+ @Test
+ public void testServiceFromPlugin() {
+ PluginBootService service = ServiceManager.INSTANCE.findService(
+ PluginBootService.class);
+
+ Assert.assertNotNull(service);
+ }
+
+ @Test
+ public void testServiceOverrideFromPlugin() {
+ ContextManagerExtendService service =
ServiceManager.INSTANCE.findService(ContextManagerExtendService.class);
+
+ Assert.assertTrue(service instanceof
ContextManagerExtendOverrideService);
+ }
+
+ @Test
+ public void testDefaultStartExceptionStop() throws Throwable {
+ interceptor.beforeMethod(
+ enhancedInstance, onStart, consumerArguments, argumentTypes,
result);
+ context.setError(new RuntimeException("BOOM"));
+ interceptor.beforeMethod(
+ enhancedInstance, onError, consumerArguments, argumentTypes,
result);
+ interceptor.beforeMethod(
+ enhancedInstance, onStop, consumerArguments, argumentTypes,
result);
+
+ AbstractTracingSpan abstractTracingSpan = onlySpan();
+ assertThat(abstractTracingSpan.getOperationName(),
equalTo("contextualName"));
+ assertThat(abstractTracingSpan.isExit(), is(true));
+ List<LogDataEntity> logs =
AbstractTracingSpanHelper.get2LevelParentFieldLogs(abstractTracingSpan);
+ assertThat(logs.size(), is(1));
+ assertThat(logs.get(0).getLogs().size(), is(4)); // 4 events represent
an exception
+ KeyValuePair errorLog = logs.get(0).getLogs().get(0);
+ assertThat(errorLog.getKey(), equalTo("event"));
+ assertThat(errorLog.getValue(), equalTo("error"));
+ assertThat(
+ carrier.keySet(), CoreMatchers.hasItems("sw8", "sw8-correlation",
"sw8-x")); // headers got instrumented
+ }
+
+ private AbstractTracingSpan onlySpan() {
+ assertThat(segmentStorage.getTraceSegments().size(), is(1));
+ TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0);
+ List<AbstractTracingSpan> spans = SegmentHelper.getSpans(traceSegment);
+ assertThat(spans.size(), is(1));
+ AbstractTracingSpan abstractTracingSpan = spans.get(0);
+ return abstractTracingSpan;
+ }
+}
diff --git
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/micrometer/PluginBootService.java
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/micrometer/PluginBootService.java
new file mode 100644
index 0000000000..48d8a4bbb4
--- /dev/null
+++
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/java/org/apache/skywalking/apm/toolkit/activation/micrometer/PluginBootService.java
@@ -0,0 +1,43 @@
+/*
+ * 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.skywalking.apm.toolkit.activation.micrometer;
+
+import org.apache.skywalking.apm.agent.core.boot.BootService;
+
+public class PluginBootService implements BootService {
+ @Override
+ public void prepare() throws Throwable {
+
+ }
+
+ @Override
+ public void boot() throws Throwable {
+
+ }
+
+ @Override
+ public void onComplete() throws Throwable {
+
+ }
+
+ @Override
+ public void shutdown() throws Throwable {
+
+ }
+}
diff --git
a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/resources/META-INF/services/org.apache.skywalking.apm.agent.core.boot.BootService
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/resources/META-INF/services/org.apache.skywalking.apm.agent.core.boot.BootService
new file mode 100644
index 0000000000..65298a217f
--- /dev/null
+++
b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/src/test/resources/META-INF/services/org.apache.skywalking.apm.agent.core.boot.BootService
@@ -0,0 +1,20 @@
+#
+# 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.
+#
+#
+
+org.apache.skywalking.apm.toolkit.activation.micrometer.PluginBootService
+org.apache.skywalking.apm.toolkit.activation.micrometer.ContextManagerExtendOverrideService
diff --git a/apm-sniffer/apm-toolkit-activation/pom.xml
b/apm-sniffer/apm-toolkit-activation/pom.xml
index ee30825677..d89eb12f78 100644
--- a/apm-sniffer/apm-toolkit-activation/pom.xml
+++ b/apm-sniffer/apm-toolkit-activation/pom.xml
@@ -33,6 +33,7 @@
<module>apm-toolkit-opentracing-activation</module>
<module>apm-toolkit-trace-activation</module>
<module>apm-toolkit-meter-activation</module>
+ <module>apm-toolkit-micrometer-activation</module>
<module>apm-toolkit-webflux-activation</module>
<module>apm-toolkit-logging-common</module>
</modules>
diff --git
a/docs/en/setup/service-agent/java-agent/Application-toolkit-micrometer-1.10.md
b/docs/en/setup/service-agent/java-agent/Application-toolkit-micrometer-1.10.md
new file mode 100644
index 0000000000..840cbb5db9
--- /dev/null
+++
b/docs/en/setup/service-agent/java-agent/Application-toolkit-micrometer-1.10.md
@@ -0,0 +1,32 @@
+# Observations
+
+* Dependency the toolkit, such as using maven or gradle
+```xml
+ <dependency>
+ <groupId>org.apache.skywalking</groupId>
+ <artifactId>apm-toolkit-micrometer-1.10</artifactId>
+ <version>${skywalking.version}</version>
+ </dependency>
+```
+
+* To use the Micrometer Observation Registry with Skywalking, you need to add
handlers to the registry. Skywalking comes
+with dedicated `SkywalkingMeterHandler` (for metrics) and
`SkywalkingSenderTracingHandler`, `SkywalkingReceiverTracingHandler`
+`SkywalkingDefaultTracingHandler` (for traces).
+
+```java
+// Here we create the Observation Registry with attached handlers
+ObservationRegistry registry = ObservationRegistry.create();
+// Here we add a meter handler
+registry.observationConfig()
+ .observationHandler(new
ObservationHandler.FirstMatchingCompositeObservationHandler(
+ new SkywalkingMeterHandler(new SkywalkingMeterRegistry())
+);
+// Here we add tracing handlers
+registry.observationConfig()
+ .observationHandler(new
ObservationHandler.FirstMatchingCompositeObservationHandler(
+ new SkywalkingSenderTracingHandler(), new
SkywalkingReceiverTracingHandler(),
+ new SkywalkingDefaultTracingHandler()
+ ));
+```
+
+With such setup metrics and traces will be created for any Micrometer
Observation based instrumentations.
diff --git
a/docs/en/setup/service-agent/java-agent/Application-toolkit-micrometer.md
b/docs/en/setup/service-agent/java-agent/Application-toolkit-micrometer.md
index 63e49cafaf..06de225d6a 100644
--- a/docs/en/setup/service-agent/java-agent/Application-toolkit-micrometer.md
+++ b/docs/en/setup/service-agent/java-agent/Application-toolkit-micrometer.md
@@ -1,3 +1,5 @@
+# Metrics
+
* Dependency the toolkit, such as using maven or gradle
```xml
<dependency>
diff --git a/docs/en/setup/service-agent/java-agent/Plugin-list.md
b/docs/en/setup/service-agent/java-agent/Plugin-list.md
index 748cd380cc..9d5ff07a43 100644
--- a/docs/en/setup/service-agent/java-agent/Plugin-list.md
+++ b/docs/en/setup/service-agent/java-agent/Plugin-list.md
@@ -56,6 +56,7 @@
- lettuce-5.x
- light4j
- mariadb-2.x
+- micrometer-1.10.x
- memcache-2.x
- mongodb-2.x
- mongodb-3.x
diff --git a/docs/en/setup/service-agent/java-agent/advanced-features.md
b/docs/en/setup/service-agent/java-agent/advanced-features.md
index 518bf51163..96302df680 100644
--- a/docs/en/setup/service-agent/java-agent/advanced-features.md
+++ b/docs/en/setup/service-agent/java-agent/advanced-features.md
@@ -7,7 +7,7 @@
* If you want your codes to interact with SkyWalking agent, including
`getting trace id`, `setting tags`, `propagating custom data` etc.. Try
[SkyWalking manual APIs](Application-toolkit-trace.md).
* If you require customized metrics, try [SkyWalking Meter System
Toolkit](Application-toolkit-meter.md).
* If you want to continue traces across thread manually, use [across
thread solution APIs](Application-toolkit-trace-cross-thread.md).
- * If you want to forward MicroMeter/Spring Sleuth metrics to Meter System,
use [SkyWalking MicroMeter Register](Application-toolkit-micrometer.md).
+ * If you want to forward Micrometer metrics / observations, use
[SkyWalking Micrometer Register](Application-toolkit-micrometer.md).
* If you want to use OpenTracing Java APIs, try [SkyWalking OpenTracing
compatible tracer](Opentracing.md). More details you could find at
http://opentracing.io
* If you want to tolerate some exceptions, read [tolerate custom exception
doc](How-to-tolerate-exceptions.md).
* If you want to print trace context(e.g. traceId) in your logs, or
collect logs, choose the log frameworks,
[log4j](Application-toolkit-log4j-1.x.md),
[log4j2](Application-toolkit-log4j-2.x.md),
[logback](Application-toolkit-logback-1.x.md).
diff --git a/docs/menu.yml b/docs/menu.yml
index 13ca93a3b5..3ee510f3a7 100644
--- a/docs/menu.yml
+++ b/docs/menu.yml
@@ -44,8 +44,10 @@ catalog:
path:
"/en/setup/service-agent/java-agent/application-toolkit-meter"
- name: "Across Thread Solution"
path:
"/en/setup/service-agent/java-agent/application-toolkit-trace-cross-thread"
- - name: "MicroMeter Registry"
+ - name: "Micrometer Registry"
path:
"/en/setup/service-agent/java-agent/application-toolkit-micrometer"
+ - name: "Micrometer 1.10 Observation"
+ path:
"/en/setup/service-agent/java-agent/application-toolkit-micrometer-1.10"
- name: "Webflux Tracing Assistant APIs"
path:
"/en/setup/service-agent/java-agent/application-toolkit-webflux"
- name: "Kafka Tracing Assistant APIs"
diff --git a/pom.xml b/pom.xml
index c58790f429..1e64fc68c9 100755
--- a/pom.xml
+++ b/pom.xml
@@ -391,6 +391,7 @@
<sourceDirectories>
<sourceDirectory>${project.build.sourceDirectory}</sourceDirectory>
<sourceDirectory>${project.build.testSourceDirectory}</sourceDirectory>
+<sourceDirectory>scenarios/resttemplate-6.x-scenario</sourceDirectory>
</sourceDirectories>
<resourceIncludes>
**/*.properties,
diff --git a/test/plugin/agent-test-tools/pom.xml
b/test/plugin/agent-test-tools/pom.xml
index 7238da230c..374263e7f4 100644
--- a/test/plugin/agent-test-tools/pom.xml
+++ b/test/plugin/agent-test-tools/pom.xml
@@ -35,7 +35,7 @@
<packaging>pom</packaging>
<properties>
-
<agent-test-tools.version>1c0bef2dd1d828e07889302bea980b24900b0db5</agent-test-tools.version>
+
<agent-test-tools.version>cf62c1b733fe2861229201a67b9cc0075ac3e236</agent-test-tools.version>
<agent-test-tools.workingDirectory>${project.basedir}/target/agent-test-tools</agent-test-tools.workingDirectory>
<agent-test-tools.repos>https://github.com/apache/skywalking-agent-test-tool.git</agent-test-tools.repos>
</properties>
diff --git a/test/plugin/containers/tomcat-container/src/main/docker/run.sh
b/test/plugin/containers/tomcat-container/src/main/docker/run.sh
index 9219055478..7ec99dc966 100644
--- a/test/plugin/containers/tomcat-container/src/main/docker/run.sh
+++ b/test/plugin/containers/tomcat-container/src/main/docker/run.sh
@@ -57,7 +57,7 @@ export LOGS_HOME=${SCENARIO_HOME}/logs # share to catalina.sh
# Speed up launch tomcat
rm /usr/local/tomcat/webapps/* -rf # remove needn't app
-sed -i
"s%securerandom.source=file:/dev/random%securerandom.source=file:/dev/urandom%g"
$JAVA_HOME/jre/lib/security/java.security
+sed -i
"s%securerandom.source=file:/dev/random%securerandom.source=file:/dev/urandom%g"
$JAVA_HOME/jre/lib/security/java.security || echo "Failed to speed up tomcat
launch - will continue"
# To deploy testcase
cp ${SCENARIO_HOME}/*.war /usr/local/tomcat/webapps/
diff --git a/test/plugin/run.sh b/test/plugin/run.sh
index 3d3e164839..25dc8da643 100755
--- a/test/plugin/run.sh
+++ b/test/plugin/run.sh
@@ -33,7 +33,7 @@ num_of_testcases=
container_image_version="1.0.0"
base_image_java="eclipse-temurin:8-jdk"
base_image_tomcat="tomcat:8.5-jdk8-openjdk"
-jacoco_version="${JACOCO_VERSION:-0.8.6}"
+jacoco_version="${JACOCO_VERSION:-0.8.8}"
os="$(uname)"
diff --git a/test/plugin/scenarios/resttemplate-6.x-scenario/bin/startup.sh
b/test/plugin/scenarios/resttemplate-6.x-scenario/bin/startup.sh
new file mode 100644
index 0000000000..197feca45a
--- /dev/null
+++ b/test/plugin/scenarios/resttemplate-6.x-scenario/bin/startup.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+#
+# 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.
+
+home="$(cd "$(dirname $0)"; pwd)"
+
+export
SW_EXCLUDE_PLUGINS=spring-mvc-annotation,spring-mvc-annotation-3.x,spring-mvc-annotation-4.x,spring-mvc-annotation-5.x,spring-resttemplate-4.x,tomcat-7.x/8.x,tomcat-10.x
+
+java -jar ${agent_opts} ${home}/../libs/resttemplate-6.x-scenario.jar &
diff --git
a/test/plugin/scenarios/resttemplate-6.x-scenario/config/expectedData.yaml
b/test/plugin/scenarios/resttemplate-6.x-scenario/config/expectedData.yaml
new file mode 100644
index 0000000000..3f43202211
--- /dev/null
+++ b/test/plugin/scenarios/resttemplate-6.x-scenario/config/expectedData.yaml
@@ -0,0 +1,83 @@
+# 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.
+segmentItems:
+ - serviceName: resttemplate-6.x-scenario
+ segmentSize: ge 2
+ segments:
+ - segmentId: not null
+ spans:
+ - operationName: http get /resttemplate/syncback
+ parentSpanId: -1
+ spanId: 0
+ spanLayer: Http
+ startTime: nq 0
+ endTime: nq 0
+ componentId: 141
+ isError: false
+ spanType: Entry
+ peer: ''
+ tags:
+ - {key: exception, value: none}
+ - {key: http.url, value:
'/resttemplate-6.x-scenario/resttemplate/syncback'}
+ - {key: method, value: GET}
+ - {key: outcome, value: SUCCESS}
+ - {key: status, value: '200'}
+ - {key: uri, value: '/resttemplate/syncback'}
+ refs:
+ - {parentEndpoint: http.server.requests,
+ networkAddress: 'localhost:8080', refType: CrossProcess,
parentSpanId: 1,
+ parentTraceSegmentId: not null, parentServiceInstance: not
null, parentService: resttemplate-6.x-scenario,
+ traceId: not null}
+ skipAnalysis: 'false'
+ - segmentId: not null
+ spans:
+ - operationName: http get
+ parentSpanId: 0
+ spanId: 1
+ spanLayer: Http
+ startTime: nq 0
+ endTime: nq 0
+ componentId: 141
+ isError: false
+ spanType: Exit
+ peer: localhost:8080
+ tags:
+ - {key: client.name, value: 'localhost'}
+ - {key: exception, value: none}
+ - {key: http.url, value:
'http://localhost:8080/resttemplate-6.x-scenario/resttemplate/syncback'}
+ - {key: method, value: GET}
+ - {key: outcome, value: SUCCESS}
+ - {key: status, value: '200'}
+ - {key: uri, value:
'http://localhost:8080/resttemplate-6.x-scenario/resttemplate/syncback'}
+ skipAnalysis: 'false'
+ - operationName: http get /resttemplate/case/resttemplate
+ parentSpanId: -1
+ spanId: 0
+ spanLayer: Http
+ startTime: nq 0
+ endTime: nq 0
+ componentId: 141
+ isError: false
+ spanType: Entry
+ peer: ''
+ tags:
+ - {key: exception, value: none}
+ - {key: http.url, value:
'/resttemplate-6.x-scenario/resttemplate/case/resttemplate'}
+ - {key: method, value: GET}
+ - {key: outcome, value: SUCCESS}
+ - {key: status, value: '200'}
+ - {key: uri, value: '/resttemplate/case/resttemplate'}
+ skipAnalysis: 'false'
diff --git a/test/plugin/scenarios/resttemplate-6.x-scenario/configuration.yml
b/test/plugin/scenarios/resttemplate-6.x-scenario/configuration.yml
new file mode 100644
index 0000000000..6c36262563
--- /dev/null
+++ b/test/plugin/scenarios/resttemplate-6.x-scenario/configuration.yml
@@ -0,0 +1,18 @@
+# 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.
+type: jvm
+entryService:
http://localhost:8080/resttemplate-6.x-scenario/resttemplate/case/resttemplate
+healthCheck:
http://localhost:8080/resttemplate-6.x-scenario/resttemplate/case/healthcheck
+startScript: ./bin/startup.sh
diff --git a/test/plugin/scenarios/resttemplate-6.x-scenario/pom.xml
b/test/plugin/scenarios/resttemplate-6.x-scenario/pom.xml
new file mode 100644
index 0000000000..93eeeb38f6
--- /dev/null
+++ b/test/plugin/scenarios/resttemplate-6.x-scenario/pom.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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.
+ ~
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.apache.skywalking</groupId>
+ <artifactId>resttemplate-6.x-scenario</artifactId>
+ <version>6.5.0</version>
+ <packaging>jar</packaging>
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+ <compiler.version>17</compiler.version>
+ <test.framework.version>6.0.2</test.framework.version>
+ <docker.image.version>${test.framework.version}</docker.image.version>
+ <spring-boot.version>3.0.0</spring-boot.version>
+
+ <!--
+ Please manually set the SkyWalking version here to build in the IDE
+ (if you build from command line, just use ./mvnw -Dsw.version=x.y.z),
+ but make sure not to check it into the code base / git
+ -->
+ <sw.version>
+ </sw.version>
+ </properties>
+
+ <name>skywalking-resttemplate-6.x-scenario</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ <version>${spring-boot.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.skywalking</groupId>
+ <artifactId>apm-toolkit-micrometer-1.10</artifactId>
+ <version>${sw.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-webmvc</artifactId>
+ <version>${test.framework.version}</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <finalName>resttemplate-6.x-scenario</finalName>
+ <plugins>
+ <plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ <version>${spring-boot.version}</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>repackage</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.6.0</version>
+ <configuration>
+ <source>${compiler.version}</source>
+ <target>${compiler.version}</target>
+ <encoding>${project.build.sourceEncoding}</encoding>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>assemble</id>
+ <phase>package</phase>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ <configuration>
+ <descriptors>
+
<descriptor>src/main/assembly/assembly.xml</descriptor>
+ </descriptors>
+ <outputDirectory>./target/</outputDirectory>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git
a/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/assembly/assembly.xml
b/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/assembly/assembly.xml
new file mode 100644
index 0000000000..0f6f7a5529
--- /dev/null
+++
b/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/assembly/assembly.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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.
+ ~
+ -->
+<assembly
+
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2
http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+ <formats>
+ <format>zip</format>
+ </formats>
+
+ <fileSets>
+ <fileSet>
+ <directory>./bin</directory>
+ <fileMode>0775</fileMode>
+ </fileSet>
+ </fileSets>
+
+ <files>
+ <file>
+ <source>./target/resttemplate-6.x-scenario.jar</source>
+ <outputDirectory>./libs</outputDirectory>
+ <fileMode>0775</fileMode>
+ </file>
+ </files>
+</assembly>
diff --git
a/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/java/org/apache/skywalking/testcase/resttemplate/BackController.java
b/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/java/org/apache/skywalking/testcase/resttemplate/BackController.java
new file mode 100644
index 0000000000..963c7f389f
--- /dev/null
+++
b/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/java/org/apache/skywalking/testcase/resttemplate/BackController.java
@@ -0,0 +1,40 @@
+/*
+ * 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.skywalking.testcase.resttemplate;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.http.HttpHeaders;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/resttemplate")
+public class BackController {
+ private static final Logger LOGGER =
LogManager.getLogger(BackController.class);
+
+ @GetMapping("/syncback")
+ public String syncBack(@RequestHeader HttpHeaders httpHeaders) {
+ LOGGER.info("Got following headers " + httpHeaders);
+ return "Hello back";
+ }
+
+}
diff --git
a/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/java/org/apache/skywalking/testcase/resttemplate/FrontController.java
b/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/java/org/apache/skywalking/testcase/resttemplate/FrontController.java
new file mode 100644
index 0000000000..eb46b9aa7c
--- /dev/null
+++
b/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/java/org/apache/skywalking/testcase/resttemplate/FrontController.java
@@ -0,0 +1,54 @@
+/*
+ * 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.skywalking.testcase.resttemplate;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.RestTemplate;
+
+@RestController
+@RequestMapping("/resttemplate/case")
+public class FrontController {
+
+ @Value("${server.port:8080}")
+ int port;
+
+ @Autowired
+ private RestTemplate restTemplate;
+
+ @GetMapping(value = "/healthcheck")
+ public String healthcheck() {
+ return "Success";
+ }
+
+ @GetMapping("/resttemplate")
+ public String front() {
+ syncRequest("http://localhost:" + port +
"/resttemplate-6.x-scenario/resttemplate/syncback");
+ return "Success";
+ }
+
+ private String syncRequest(String url) {
+ restTemplate.getForObject(url, String.class);
+
+ return "Success";
+ }
+}
diff --git
a/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/java/org/apache/skywalking/testcase/resttemplate/ObservationConfiguration.java
b/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/java/org/apache/skywalking/testcase/resttemplate/ObservationConfiguration.java
new file mode 100644
index 0000000000..e171c41204
--- /dev/null
+++
b/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/java/org/apache/skywalking/testcase/resttemplate/ObservationConfiguration.java
@@ -0,0 +1,87 @@
+/*
+ * 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.skywalking.testcase.resttemplate;
+
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.observation.MeterObservationHandler;
+import io.micrometer.observation.ObservationHandler;
+import io.micrometer.observation.ObservationRegistry;
+import jakarta.annotation.PreDestroy;
+import java.util.List;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.skywalking.apm.meter.micrometer.SkywalkingMeterRegistry;
+import
org.apache.skywalking.apm.toolkit.micrometer.observation.SkywalkingDefaultTracingHandler;
+import
org.apache.skywalking.apm.toolkit.micrometer.observation.SkywalkingMeterHandler;
+import
org.apache.skywalking.apm.toolkit.micrometer.observation.SkywalkingReceiverTracingHandler;
+import
org.apache.skywalking.apm.toolkit.micrometer.observation.SkywalkingSenderTracingHandler;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration(proxyBeanMethods = false)
+class ObservationConfiguration {
+ private static final Logger LOGGER =
LogManager.getLogger(ObservationConfiguration.class);
+
+ @Bean
+ ObservationRegistry observationRegistry(List<MeterObservationHandler<?>>
handlers) {
+ ObservationRegistry registry = ObservationRegistry.create();
+ registry.observationConfig()
+ .observationHandler(new
ObservationHandler.FirstMatchingCompositeObservationHandler(handlers));
+ registry.observationConfig()
+ .observationHandler(new
ObservationHandler.FirstMatchingCompositeObservationHandler(
+ new SkywalkingSenderTracingHandler(), new
SkywalkingReceiverTracingHandler(),
+ new SkywalkingDefaultTracingHandler()
+ ));
+ return registry;
+ }
+
+ @Bean
+ SkywalkingMeterRegistry meterRegistry() {
+ return new SkywalkingMeterRegistry();
+ }
+
+ @Bean
+ MeterObservationHandler<?> meterObservationHandler(SkywalkingMeterRegistry
skywalkingMeterRegistry) {
+ return new SkywalkingMeterHandler(skywalkingMeterRegistry);
+ }
+
+ @Bean
+ MetricsDumper metricsDumper(MeterRegistry meterRegistry) {
+ return new MetricsDumper(meterRegistry);
+ }
+
+ static class MetricsDumper {
+ private final MeterRegistry meterRegistry;
+
+ MetricsDumper(MeterRegistry meterRegistry) {
+ this.meterRegistry = meterRegistry;
+ }
+
+ @PreDestroy
+ void dumpMetrics() {
+ LOGGER.info("==== METRICS ====");
+ this.meterRegistry.getMeters()
+ .forEach(meter -> LOGGER.info(
+ " - Metric type \t[" +
meter.getId().getType() + "],\tname [" + meter.getId()
+
.getName() + "],\ttags " + meter.getId()
+
.getTags() +
",\tmeasurements " + meter.measure()));
+ LOGGER.info("=================");
+ }
+ }
+}
diff --git
a/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/java/org/apache/skywalking/testcase/resttemplate/ResttemplateConfiguration.java
b/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/java/org/apache/skywalking/testcase/resttemplate/ResttemplateConfiguration.java
new file mode 100644
index 0000000000..136929f9e9
--- /dev/null
+++
b/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/java/org/apache/skywalking/testcase/resttemplate/ResttemplateConfiguration.java
@@ -0,0 +1,36 @@
+/*
+ * 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.skywalking.testcase.resttemplate;
+
+import io.micrometer.observation.ObservationRegistry;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class ResttemplateConfiguration {
+
+ @Bean
+ public RestTemplate restTemplate(ObservationRegistry observationRegistry) {
+ RestTemplate restTemplate = new RestTemplate();
+ restTemplate.setObservationRegistry(observationRegistry);
+ return restTemplate;
+ }
+
+}
diff --git
a/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/java/org/apache/skywalking/testcase/resttemplate/ServerConfiguration.java
b/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/java/org/apache/skywalking/testcase/resttemplate/ServerConfiguration.java
new file mode 100644
index 0000000000..a73bad9565
--- /dev/null
+++
b/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/java/org/apache/skywalking/testcase/resttemplate/ServerConfiguration.java
@@ -0,0 +1,42 @@
+/*
+ * 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.skywalking.testcase.resttemplate;
+
+import io.micrometer.observation.ObservationRegistry;
+import jakarta.servlet.DispatcherType;
+import java.util.Arrays;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.Ordered;
+import org.springframework.web.filter.ServerHttpObservationFilter;
+
+@Configuration
+public class ServerConfiguration {
+
+ @Bean
+ FilterRegistrationBean testServerHttpObservationFilter(ObservationRegistry
observationRegistry) {
+ FilterRegistrationBean registration = new FilterRegistrationBean(
+ new ServerHttpObservationFilter(observationRegistry));
+ registration.setOrder(Ordered.HIGHEST_PRECEDENCE + 1);
+ registration.setDispatcherTypes(DispatcherType.REQUEST,
DispatcherType.ASYNC);
+ registration.setUrlPatterns(Arrays.asList("/resttemplate/syncback",
"/resttemplate/case/resttemplate"));
+ return registration;
+ }
+}
diff --git
a/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/java/org/apache/skywalking/testcase/resttemplate/SkywalkingApplication.java
b/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/java/org/apache/skywalking/testcase/resttemplate/SkywalkingApplication.java
new file mode 100644
index 0000000000..3c5584891b
--- /dev/null
+++
b/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/java/org/apache/skywalking/testcase/resttemplate/SkywalkingApplication.java
@@ -0,0 +1,33 @@
+/*
+ * 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.skywalking.testcase.resttemplate;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SkywalkingApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SkywalkingApplication.class, args);
+ }
+
+}
+
+
diff --git
a/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/resources/application.yml
b/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/resources/application.yml
new file mode 100644
index 0000000000..dde3d2be03
--- /dev/null
+++
b/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/resources/application.yml
@@ -0,0 +1,21 @@
+# 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.
+
+server:
+ port: 8080
+ servlet:
+ context-path: /resttemplate-6.x-scenario
+
diff --git
a/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/resources/log4j2.xml
b/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/resources/log4j2.xml
new file mode 100644
index 0000000000..985bd03bf3
--- /dev/null
+++
b/test/plugin/scenarios/resttemplate-6.x-scenario/src/main/resources/log4j2.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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.
+ ~
+ -->
+
+<Configuration status="WARN">
+ <Appenders>
+ <Console name="Console" target="SYSTEM_ERR">
+ <PatternLayout charset="UTF-8" pattern="[%d{yyyy-MM-dd
HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
+ </Console>
+ </Appenders>
+ <Loggers>
+ <Root level="WARN">
+ <AppenderRef ref="Console"/>
+ </Root>
+ </Loggers>
+</Configuration>
\ No newline at end of file
diff --git
a/test/plugin/scenarios/resttemplate-6.x-scenario/support-version.list
b/test/plugin/scenarios/resttemplate-6.x-scenario/support-version.list
new file mode 100644
index 0000000000..ed0abbe6d7
--- /dev/null
+++ b/test/plugin/scenarios/resttemplate-6.x-scenario/support-version.list
@@ -0,0 +1,17 @@
+# 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.
+
+6.0.2