From e575701f85495235b210b770b90c8edcc5e25a05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=99=9F=20Wu=20Sheng?= Date: Tue, 26 Oct 2021 16:34:24 +0800 Subject: [PATCH] Support JDK 16 and 17. (#8005) --- .github/workflows/e2e.jdk-versions.yaml | 2 +- CHANGES.md | 1 + docs/en/setup/backend/backend-setup.md | 2 +- .../apache/skywalking/oal/rt/OALRuntime.java | 26 +++++++++++++++--- .../DispatcherClassPackageHolder.java | 27 +++++++++++++++++++ .../rt/metrics/MetricClassPackageHolder.java | 27 +++++++++++++++++++ .../MetricBuilderClassPackageHolder.java | 27 +++++++++++++++++++ .../core/analysis/meter/MeterSystem.java | 27 ++++++++++++------- .../dynamic/MeterClassPackageHolder.java | 27 +++++++++++++++++++ .../oap/server/core/oal/rt/OALDefine.java | 23 +++++++++++----- .../server/receiver/envoy/TCPOALDefine.java | 2 +- 11 files changed, 169 insertions(+), 22 deletions(-) create mode 100644 oap-server/oal-rt/src/main/java/org/apache/skywalking/oap/server/core/source/oal/rt/dispatcher/DispatcherClassPackageHolder.java create mode 100644 oap-server/oal-rt/src/main/java/org/apache/skywalking/oap/server/core/source/oal/rt/metrics/MetricClassPackageHolder.java create mode 100644 oap-server/oal-rt/src/main/java/org/apache/skywalking/oap/server/core/source/oal/rt/metrics/builder/MetricBuilderClassPackageHolder.java create mode 100644 oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/dynamic/MeterClassPackageHolder.java diff --git a/.github/workflows/e2e.jdk-versions.yaml b/.github/workflows/e2e.jdk-versions.yaml index b68b6a2842..36db82e755 100644 --- a/.github/workflows/e2e.jdk-versions.yaml +++ b/.github/workflows/e2e.jdk-versions.yaml @@ -33,7 +33,7 @@ jobs: timeout-minutes: 90 strategy: matrix: - jdk: [ 8, 11, 12, 13, 14, 15 ] + jdk: [ 8, 11, 12, 13, 14, 15, 16 ] env: SW_AGENT_JDK_VERSION: ${{ matrix.jdk }} SW_OAP_BASE_IMAGE: adoptopenjdk/openjdk${{ matrix.jdk }}:alpine-jre diff --git a/CHANGES.md b/CHANGES.md index 60bd3e7c83..831aecb0e0 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -24,6 +24,7 @@ Release Notes. - Profile - Kafka: Base, Meter, Log, Profile - Client-JS +* Support JDK 16 and 17. #### OAP Server diff --git a/docs/en/setup/backend/backend-setup.md b/docs/en/setup/backend/backend-setup.md index 543392fdea..b5651de1a7 100755 --- a/docs/en/setup/backend/backend-setup.md +++ b/docs/en/setup/backend/backend-setup.md @@ -15,7 +15,7 @@ SkyWalking's backend distribution package consists of the following parts: ## Requirements and default settings -Requirement: **JDK8 to JDK12 are tested**. Other versions are not tested and may or may not work. +Requirement: **JDK8 to JDK17 are tested**. Other versions are not tested and may or may not work. Before you start, you should know that the main purpose of quickstart is to help you obtain a basic configuration for previews/demo. Performance and long-term running are not our goals. diff --git a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/OALRuntime.java b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/OALRuntime.java index c75e837767..df2c663e6e 100644 --- a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/OALRuntime.java +++ b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/OALRuntime.java @@ -49,6 +49,8 @@ import javassist.bytecode.annotation.IntegerMemberValue; import javassist.bytecode.annotation.StringMemberValue; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.JavaVersion; +import org.apache.commons.lang3.SystemUtils; import org.apache.skywalking.apm.util.StringUtil; import org.apache.skywalking.oal.rt.output.AllDispatcherContext; import org.apache.skywalking.oal.rt.output.DispatcherContext; @@ -65,6 +67,9 @@ import org.apache.skywalking.oap.server.core.analysis.StreamAnnotationListener; import org.apache.skywalking.oap.server.core.oal.rt.OALCompileException; import org.apache.skywalking.oap.server.core.oal.rt.OALDefine; import org.apache.skywalking.oap.server.core.oal.rt.OALEngine; +import org.apache.skywalking.oap.server.core.source.oal.rt.dispatcher.DispatcherClassPackageHolder; +import org.apache.skywalking.oap.server.core.source.oal.rt.metrics.MetricClassPackageHolder; +import org.apache.skywalking.oap.server.core.source.oal.rt.metrics.builder.MetricBuilderClassPackageHolder; import org.apache.skywalking.oap.server.core.storage.StorageBuilderFactory; import org.apache.skywalking.oap.server.core.storage.StorageException; import org.apache.skywalking.oap.server.core.storage.annotation.Column; @@ -295,7 +300,8 @@ public class OALRuntime implements OALEngine { constPool, AnnotationsAttribute.visibleTag); Annotation streamAnnotation = new Annotation(Stream.class.getName(), constPool); streamAnnotation.addMemberValue("name", new StringMemberValue(metricsStmt.getTableName(), constPool)); - streamAnnotation.addMemberValue("scopeId", new IntegerMemberValue(constPool, metricsStmt.getFrom().getSourceScopeId())); + streamAnnotation.addMemberValue( + "scopeId", new IntegerMemberValue(constPool, metricsStmt.getFrom().getSourceScopeId())); streamAnnotation.addMemberValue( "builder", new ClassMemberValue(metricsBuilderClassName(metricsStmt, true), constPool)); streamAnnotation.addMemberValue("processor", new ClassMemberValue(METRICS_STREAM_PROCESSOR, constPool)); @@ -305,7 +311,11 @@ public class OALRuntime implements OALEngine { Class targetClass; try { - targetClass = metricsClass.toClass(currentClassLoader, null); + if (SystemUtils.isJavaVersionAtMost(JavaVersion.JAVA_1_8)) { + targetClass = metricsClass.toClass(currentClassLoader, null); + } else { + targetClass = metricsClass.toClass(MetricClassPackageHolder.class); + } } catch (CannotCompileException e) { log.error("Can't compile/load " + className + ".", e); throw new OALCompileException(e.getMessage(), e); @@ -359,7 +369,11 @@ public class OALRuntime implements OALEngine { } try { - metricsBuilderClass.toClass(currentClassLoader, null); + if (SystemUtils.isJavaVersionAtMost(JavaVersion.JAVA_1_8)) { + metricsBuilderClass.toClass(currentClassLoader, null); + } else { + metricsBuilderClass.toClass(MetricBuilderClassPackageHolder.class); + } } catch (CannotCompileException e) { log.error("Can't compile/load " + className + ".", e); throw new OALCompileException(e.getMessage(), e); @@ -437,7 +451,11 @@ public class OALRuntime implements OALEngine { Class targetClass; try { - targetClass = dispatcherClass.toClass(currentClassLoader, null); + if (SystemUtils.isJavaVersionAtMost(JavaVersion.JAVA_1_8)) { + targetClass = dispatcherClass.toClass(currentClassLoader, null); + } else { + targetClass = dispatcherClass.toClass(DispatcherClassPackageHolder.class); + } } catch (CannotCompileException e) { log.error("Can't compile/load " + className + ".", e); throw new OALCompileException(e.getMessage(), e); diff --git a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oap/server/core/source/oal/rt/dispatcher/DispatcherClassPackageHolder.java b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oap/server/core/source/oal/rt/dispatcher/DispatcherClassPackageHolder.java new file mode 100644 index 0000000000..076cc702dd --- /dev/null +++ b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oap/server/core/source/oal/rt/dispatcher/DispatcherClassPackageHolder.java @@ -0,0 +1,27 @@ +/* + * 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.oap.server.core.source.oal.rt.dispatcher; + +/** + * DispatcherClassPackageHolder holds the package for generated metric classes. + * + * @since 8.9.0 for adopting JDK16+ to avoid `--add-opens java.base/java.lang=ALL-UNNAMED` + */ +public class DispatcherClassPackageHolder { +} diff --git a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oap/server/core/source/oal/rt/metrics/MetricClassPackageHolder.java b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oap/server/core/source/oal/rt/metrics/MetricClassPackageHolder.java new file mode 100644 index 0000000000..c95ff6490f --- /dev/null +++ b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oap/server/core/source/oal/rt/metrics/MetricClassPackageHolder.java @@ -0,0 +1,27 @@ +/* + * 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.oap.server.core.source.oal.rt.metrics; + +/** + * MetricClassPackageHolder holds the package for generated metric classes. + * + * @since 8.9.0 for adopting JDK16+ to avoid `--add-opens java.base/java.lang=ALL-UNNAMED` + */ +public class MetricClassPackageHolder { +} diff --git a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oap/server/core/source/oal/rt/metrics/builder/MetricBuilderClassPackageHolder.java b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oap/server/core/source/oal/rt/metrics/builder/MetricBuilderClassPackageHolder.java new file mode 100644 index 0000000000..ef10c2449a --- /dev/null +++ b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oap/server/core/source/oal/rt/metrics/builder/MetricBuilderClassPackageHolder.java @@ -0,0 +1,27 @@ +/* + * 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.oap.server.core.source.oal.rt.metrics.builder; + +/** + * MetricBuilderClassPackageHolder holds the package for generated metric builder classes. + * + * @since 8.9.0 for adopting JDK16+ to avoid `--add-opens java.base/java.lang=ALL-UNNAMED` + */ +public class MetricBuilderClassPackageHolder { +} diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/MeterSystem.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/MeterSystem.java index 9930155760..5ea1e70e8e 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/MeterSystem.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/MeterSystem.java @@ -36,9 +36,12 @@ import javassist.NotFoundException; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.JavaVersion; +import org.apache.commons.lang3.SystemUtils; import org.apache.skywalking.oap.server.core.UnexpectedException; import org.apache.skywalking.oap.server.core.analysis.StreamDefinition; import org.apache.skywalking.oap.server.core.analysis.TimeBucket; +import org.apache.skywalking.oap.server.core.analysis.meter.dynamic.MeterClassPackageHolder; import org.apache.skywalking.oap.server.core.analysis.meter.function.AcceptableValue; import org.apache.skywalking.oap.server.core.analysis.meter.function.MeterFunction; import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics; @@ -103,8 +106,8 @@ public class MeterSystem implements Service { * @throws UnexpectedException if binary code manipulation fails or stream core failure. */ public synchronized void create(String metricsName, - String functionName, - ScopeType type) throws IllegalArgumentException { + String functionName, + ScopeType type) throws IllegalArgumentException { final Class meterFunction = functionRegister.get(functionName); if (meterFunction == null) { @@ -138,9 +141,9 @@ public class MeterSystem implements Service { * @throws UnexpectedException if binary code manipulation fails or stream core failure. */ public synchronized void create(String metricsName, - String functionName, - ScopeType type, - Class dataType) throws IllegalArgumentException { + String functionName, + ScopeType type, + Class dataType) throws IllegalArgumentException { /** * Create a new meter class dynamically. */ @@ -191,11 +194,13 @@ public class MeterSystem implements Service { */ try { CtClass existingMetric = classPool.get(METER_CLASS_PACKAGE + className); - if (existingMetric.getSuperclass() != parentClass || type != meterPrototypes.get(metricsName).getScopeType()) { - throw new IllegalArgumentException(metricsName + " has been defined, but calculate function or/are scope type is/are different."); + if (existingMetric.getSuperclass() != parentClass || type != meterPrototypes.get(metricsName) + .getScopeType()) { + throw new IllegalArgumentException( + metricsName + " has been defined, but calculate function or/are scope type is/are different."); } log.info("Metric {} is already defined, so skip the metric creation.", metricsName); - return ; + return; } catch (NotFoundException e) { } @@ -230,7 +235,11 @@ public class MeterSystem implements Service { Class targetClass; try { - targetClass = metricsClass.toClass(MeterSystem.class.getClassLoader(), null); + if (SystemUtils.isJavaVersionAtMost(JavaVersion.JAVA_1_8)) { + targetClass = metricsClass.toClass(MeterSystem.class.getClassLoader(), null); + } else { + targetClass = metricsClass.toClass(MeterClassPackageHolder.class); + } AcceptableValue prototype = (AcceptableValue) targetClass.newInstance(); meterPrototypes.put(metricsName, new MeterDefinition(type, prototype, dataType)); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/dynamic/MeterClassPackageHolder.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/dynamic/MeterClassPackageHolder.java new file mode 100644 index 0000000000..7d3b6b5a5a --- /dev/null +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/dynamic/MeterClassPackageHolder.java @@ -0,0 +1,27 @@ +/* + * 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.oap.server.core.analysis.meter.dynamic; + +/** + * MeterClassPackageHolder holds the package for generated meter classes. + * + * @since 8.9.0 for adopting JDK16+ to avoid `--add-opens java.base/java.lang=ALL-UNNAMED` + */ +public class MeterClassPackageHolder { +} diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/oal/rt/OALDefine.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/oal/rt/OALDefine.java index b33cd0717f..128c74faa0 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/oal/rt/OALDefine.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/oal/rt/OALDefine.java @@ -20,6 +20,7 @@ package org.apache.skywalking.oap.server.core.oal.rt; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.ToString; +import org.apache.skywalking.apm.util.StringUtil; import org.apache.skywalking.oap.server.core.Const; import static java.util.Objects.requireNonNull; @@ -32,18 +33,28 @@ import static java.util.Objects.requireNonNull; @EqualsAndHashCode public abstract class OALDefine { protected OALDefine(final String configFile, - final String sourcePackage) { - this(configFile, sourcePackage, sourcePackage); + final String sourcePackage) { + this(configFile, sourcePackage, Const.EMPTY_STRING); } + /** + * Define the booting parameters for OAL engine + * + * @param configFile OAL script file path + * @param sourcePackage the package path of source(s) used in given config OAL script file + * @param catalog of metrics defined through given OAL script file. Be used as prefix of generated dispatcher + * class name. + */ protected OALDefine(final String configFile, final String sourcePackage, - final String dispatcherPackage) { + final String catalog) { this.configFile = requireNonNull(configFile); this.sourcePackage = appendPoint(requireNonNull(sourcePackage)); - this.dynamicMetricsClassPackage = appendPoint(sourcePackage + ".oal.rt.metrics"); - this.dynamicMetricsBuilderClassPackage = appendPoint(sourcePackage + ".oal.rt.metrics.builder"); - this.dynamicDispatcherClassPackage = appendPoint(dispatcherPackage + ".oal.rt.dispatcher"); + this.dynamicMetricsClassPackage = "org.apache.skywalking.oap.server.core.source.oal.rt.metrics."; + this.dynamicMetricsBuilderClassPackage = "org.apache.skywalking.oap.server.core.source.oal.rt.metrics.builder."; + this.dynamicDispatcherClassPackage = StringUtil.isBlank(catalog) ? + "org.apache.skywalking.oap.server.core.source.oal.rt.dispatcher." : + "org.apache.skywalking.oap.server.core.source.oal.rt.dispatcher." + catalog; } private final String configFile; diff --git a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/TCPOALDefine.java b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/TCPOALDefine.java index 93ca89967a..baae1293b0 100644 --- a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/TCPOALDefine.java +++ b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/TCPOALDefine.java @@ -29,7 +29,7 @@ public class TCPOALDefine extends OALDefine { super( "oal/tcp.oal", "org.apache.skywalking.oap.server.core.source", - "org.apache.skywalking.oap.server.core.source.tcp" + "EnvoyTCP" ); } } -- GitLab