You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2026/05/29 02:33:32 UTC
(skywalking-graalvm-distro) 01/01: Sync upstream to 11.0.0-SNAPSHOT (ad733554b0): admin-server family, DSL/formatExp drift fixes
This is an automated email from the ASF dual-hosted git repository.
wu-sheng pushed a commit to branch sync-11.0.0
in repository https://gitbox.apache.org/repos/asf/skywalking-graalvm-distro.git
commit 62811f0a925aaca1d2c3dd5e9451d729fabbaa3f
Author: Wu Sheng <wu...@foxmail.com>
AuthorDate: Fri May 29 10:33:21 2026 +0800
Sync upstream to 11.0.0-SNAPSHOT (ad733554b0): admin-server family, DSL/formatExp drift fixes
- Move skywalking submodule b272da3 -> ad733554b0 (11.0.0-SNAPSHOT).
- Wire admin-server/status/inspect/ui-management on the admin host (:17128 HTTP,
:17129 gRPC); remove the status-query plugin (status relocated). dsl-debugging and
runtime-rule answer with HTTP 501 via a stub module (no runtime Javassist codegen
in a closed-world native image).
- Fix empty-config dispatch boot throw for InspectModuleConfig/UIManagementModuleConfig
(no-op branches in YamlConfigLoaderUtils + ConfigInitializerGenerator).
- Port the new runtime-rule DSL overloads into the same-FQCN replacements: meter
DSL.parse/FilterExpression (5-arg) and log DSL.of (9-arg).
- Fix formatExp drift: the precompiler and MAL comparison tests now compose expressions
via the real upstream MetricConvert.formatExp (ANTLR injectExpPrefix) instead of a
hand-rolled split-on-dot replica, fixing pre-compiled class lookup for chained exprs.
- Enable iOS / mini-program OTel and Envoy AI Gateway MCP rules; update docs and e2e pins.
Build + 1335 unit tests green.
---
CLAUDE.md | 1 +
benchmark/env | 4 +-
.../server/buildtools/common/AcceptedModules.java | 9 +-
build-tools/config-generator/pom.xml | 21 +++
.../config/ConfigInitializerGenerator.java | 19 +--
build-tools/precompiler/pom.xml | 14 +-
.../skywalking/oap/meter/analyzer/v2/dsl/DSL.java | 11 ++
.../meter/analyzer/v2/dsl/FilterExpression.java | 11 ++
.../server/buildtools/precompiler/Precompiler.java | 28 +---
.../resources/META-INF/module-config-classes.txt | 5 +-
changes/changes.md | 28 ++++
docker/docker-compose.yml | 2 +-
docs/distro-policy.md | 30 ++--
docs/supported-features.md | 12 +-
docs/version-mapping.md | 1 +
.../src/main/assembly/native-distribution.xml | 1 -
oap-graalvm-server/pom.xml | 26 ++-
.../src/main/assembly/distribution.xml | 2 -
.../server/graalvm/GraalVMOAPServerStartUp.java | 31 +++-
.../admin/UnsupportedAdminFeatureHandler.java | 78 +++++++++
.../admin/UnsupportedAdminFeatureModule.java | 43 +++++
.../UnsupportedAdminFeatureModuleProvider.java | 78 +++++++++
.../server/library/util/YamlConfigLoaderUtils.java | 178 +++++++++++++++------
.../src/main/resources/application.yml | 58 ++++++-
.../server/graalvm/lal/LALIosMetrickitTest.java | 45 ++++++
.../oap/server/graalvm/lal/LALMiniprogramTest.java | 45 ++++++
.../graalvm/mal/MALScriptComparisonBase.java | 21 +--
.../graalvm/mal/MiniprogramAlipayLogMalTest.java | 29 ++++
.../graalvm/mal/MiniprogramWechatLogMalTest.java | 29 ++++
.../resources/precompiled-yaml-sha256.properties | 11 ++
.../test/resources/provider-inventory.properties | 13 +-
.../resources/replacement-source-sha256.properties | 17 +-
.../test/resources/rule-file-inventory.properties | 18 ++-
.../skywalking/oap/log/analyzer/v2/dsl/DSL.java | 15 ++
.../skywalking/oap/meter/analyzer/v2/dsl/DSL.java | 11 ++
.../meter/analyzer/v2/dsl/FilterExpression.java | 11 ++
oap-libs-for-graalvm/pom.xml | 1 -
.../oap/server/core/CoreModuleConfig.java | 5 -
.../status-query-for-graalvm/pom.xml | 68 --------
.../oap/query/debug/StatusQueryConfig.java | 43 -----
pom.xml | 23 ++-
skywalking | 2 +-
test/e2e/script/env | 14 +-
43 files changed, 830 insertions(+), 282 deletions(-)
diff --git a/CLAUDE.md b/CLAUDE.md
index b8c5e40..b19f272 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -16,6 +16,7 @@
2. **Build-time class export.** All runtime code generation (OAL/MAL/LAL/Hierarchy via ANTLR4 + Javassist) runs at build time. Export `.class` files into native-image classpath.
3. **Fixed module wiring.** Module/provider selection is hardcoded in this distro — no SPI discovery. See docs/distro-policy.md for the full module table.
4. **JDK 25.** Already compiles and runs.
+5. **Minimal comments.** Comment only what the code can't say for itself — a non-obvious invariant, the *why* behind a non-obvious choice, or cross-cutting context (e.g. "must match upstream X"). Don't restate the code or annotate the obvious. When a same-FQCN replacement diverges from upstream, one line on *why* is enough.
## Technical Notes
- **V2 DSL engines**: All four DSL compilers (OAL, MAL, LAL, Hierarchy) use the same pipeline: ANTLR4 parse → immutable AST → Javassist bytecode. Upstream PR #13723 removed Groovy from all production code. The precompiler runs these v2 engines at build time via `setClassOutputDir()` / `setClassNameHint()`, capturing `.class` files into the output JAR.
diff --git a/benchmark/env b/benchmark/env
index b9bff60..abadece 100644
--- a/benchmark/env
+++ b/benchmark/env
@@ -23,13 +23,13 @@ SW_UI_IMAGE_TAG="latest"
# BanyanDB
##############################################################################
SW_BANYANDB_IMAGE_REPO="ghcr.io/apache/skywalking-banyandb"
-SW_BANYANDB_IMAGE_TAG="e1ba421bd624727760c7a69c84c6fe55878fb526"
+SW_BANYANDB_IMAGE_TAG="84b919efca3fee3d51df9e97a734a9f10ae6f1d2"
##############################################################################
# SkyWalking Helm Chart
##############################################################################
SW_HELM_CHART="oci://ghcr.io/apache/skywalking-helm/skywalking-helm"
-SW_KUBERNETES_COMMIT_SHA="6fe5e6f0d3b7686c6be0457733e825ee68cb9b35"
+SW_KUBERNETES_COMMIT_SHA="da0e267f877b9b8e5f7728ae4ea7dc7723a2a073"
##############################################################################
# Istio
diff --git a/build-tools/build-common/src/main/java/org/apache/skywalking/oap/server/buildtools/common/AcceptedModules.java b/build-tools/build-common/src/main/java/org/apache/skywalking/oap/server/buildtools/common/AcceptedModules.java
index 5c5d03b..fc0cf59 100644
--- a/build-tools/build-common/src/main/java/org/apache/skywalking/oap/server/buildtools/common/AcceptedModules.java
+++ b/build-tools/build-common/src/main/java/org/apache/skywalking/oap/server/buildtools/common/AcceptedModules.java
@@ -88,7 +88,6 @@ public final class AcceptedModules {
new ModuleProviderPair("promql", "default"),
new ModuleProviderPair("logql", "default"),
new ModuleProviderPair("traceQL", "default"),
- new ModuleProviderPair("status-query", "default"),
// Alarm
new ModuleProviderPair("alarm", "default"),
// Exporter
@@ -96,7 +95,13 @@ public final class AcceptedModules {
// Health Checker
new ModuleProviderPair("health-checker", "default"),
// AI Pipeline
- new ModuleProviderPair("ai-pipeline", "default")
+ new ModuleProviderPair("ai-pipeline", "default"),
+ // Admin server family (11.0.0+). runtime-rule + dsl-debugging are intentionally
+ // excluded — they need runtime Javassist codegen, unsupported under native image.
+ new ModuleProviderPair("admin-server", "default"),
+ new ModuleProviderPair("status", "default"),
+ new ModuleProviderPair("inspect", "default"),
+ new ModuleProviderPair("ui-management", "default")
);
/**
diff --git a/build-tools/config-generator/pom.xml b/build-tools/config-generator/pom.xml
index e668b75..139e1bb 100644
--- a/build-tools/config-generator/pom.xml
+++ b/build-tools/config-generator/pom.xml
@@ -49,6 +49,27 @@
<groupId>org.apache.skywalking</groupId>
<artifactId>server-starter</artifactId>
</dependency>
+
+ <!-- Admin server family (11.0.0+) is not pulled transitively by server-starter
+ (SPI-discovered at runtime from the assembled libs dir). The config-generator
+ needs these provider jars on its classpath to scan their ModuleConfig classes.
+ runtime-rule + dsl-debugging are omitted: not wired in this distro. -->
+ <dependency>
+ <groupId>org.apache.skywalking</groupId>
+ <artifactId>admin-server</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.skywalking</groupId>
+ <artifactId>status</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.skywalking</groupId>
+ <artifactId>inspect</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.skywalking</groupId>
+ <artifactId>ui-management</artifactId>
+ </dependency>
</dependencies>
<build>
diff --git a/build-tools/config-generator/src/main/java/org/apache/skywalking/oap/server/buildtools/config/ConfigInitializerGenerator.java b/build-tools/config-generator/src/main/java/org/apache/skywalking/oap/server/buildtools/config/ConfigInitializerGenerator.java
index 7de8e0a..353cd05 100644
--- a/build-tools/config-generator/src/main/java/org/apache/skywalking/oap/server/buildtools/config/ConfigInitializerGenerator.java
+++ b/build-tools/config-generator/src/main/java/org/apache/skywalking/oap/server/buildtools/config/ConfigInitializerGenerator.java
@@ -196,10 +196,7 @@ public class ConfigInitializerGenerator {
// Collect all imports needed for config classes and their field types
TreeMap<String, String> imports = new TreeMap<>();
for (var entry : configClasses.entrySet()) {
- // Skip imports for config classes with no fields (not used in generated code)
- if (entry.getValue().fields.isEmpty()) {
- continue;
- }
+ // Import every config class for the dispatcher instanceof check (incl. empty ones).
String fqcn = entry.getKey();
if (fqcn.contains("$")) {
String enclosing = fqcn.substring(0, fqcn.indexOf('$'));
@@ -313,9 +310,6 @@ public class ConfigInitializerGenerator {
boolean first = true;
for (var entry : configClasses.entrySet()) {
ConfigClassInfo info = entry.getValue();
- if (info.fields.isEmpty()) {
- continue;
- }
String typeRef = javaClassRef(info.configClass);
if (first) {
sb.append(" if (dest instanceof ").append(typeRef).append(") {\n");
@@ -323,8 +317,15 @@ public class ConfigInitializerGenerator {
} else {
sb.append(" } else if (dest instanceof ").append(typeRef).append(") {\n");
}
- sb.append(" copyTo").append(methodSuffix(info))
- .append("((").append(typeRef).append(") dest, src, moduleName, providerName);\n");
+ if (info.fields.isEmpty()) {
+ // Empty config still reaches copyProperties() (its provider returns a non-null
+ // ConfigCreator), so it needs a branch or it hits the "unknown type" throw.
+ sb.append(" // ").append(info.simpleName)
+ .append(" has no configurable fields; nothing to copy.\n");
+ } else {
+ sb.append(" copyTo").append(methodSuffix(info))
+ .append("((").append(typeRef).append(") dest, src, moduleName, providerName);\n");
+ }
}
if (!first) {
sb.append(" } else {\n");
diff --git a/build-tools/precompiler/pom.xml b/build-tools/precompiler/pom.xml
index a31063f..73cfe85 100644
--- a/build-tools/precompiler/pom.xml
+++ b/build-tools/precompiler/pom.xml
@@ -101,7 +101,19 @@
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
- <artifactId>status-query-plugin</artifactId>
+ <artifactId>admin-server</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.skywalking</groupId>
+ <artifactId>status</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.skywalking</groupId>
+ <artifactId>inspect</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.skywalking</groupId>
+ <artifactId>ui-management</artifactId>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
diff --git a/build-tools/precompiler/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/dsl/DSL.java b/build-tools/precompiler/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/dsl/DSL.java
index e42ec7f..a568db8 100644
--- a/build-tools/precompiler/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/dsl/DSL.java
+++ b/build-tools/precompiler/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/dsl/DSL.java
@@ -22,6 +22,7 @@ import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import javassist.ClassPool;
import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.oap.meter.analyzer.v2.compiler.MALClassGenerator;
@@ -79,6 +80,16 @@ public final class DSL {
}
}
+ // Runtime-rule overload (upstream signature). The precompiler only runs the startup path
+ // (pool/targetClassLoader null), so it delegates to the shared-GENERATOR compile.
+ public static Expression parse(final String metricName,
+ final String expression,
+ final String yamlSource,
+ final ClassPool pool,
+ final ClassLoader targetClassLoader) {
+ return parse(metricName, expression, yamlSource);
+ }
+
public static String expressionKey(final String expression, final String metricName) {
try {
final MessageDigest md = MessageDigest.getInstance("SHA-256");
diff --git a/build-tools/precompiler/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/dsl/FilterExpression.java b/build-tools/precompiler/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/dsl/FilterExpression.java
index c022005..e7d2996 100644
--- a/build-tools/precompiler/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/dsl/FilterExpression.java
+++ b/build-tools/precompiler/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/dsl/FilterExpression.java
@@ -22,6 +22,7 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
+import javassist.ClassPool;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.oap.meter.analyzer.v2.compiler.MALClassGenerator;
@@ -85,6 +86,16 @@ public class FilterExpression {
}
}
+ // Runtime-rule overload (upstream signature). The precompiler only runs the startup path
+ // (pool/targetClassLoader null), so it delegates to the shared-generator compile.
+ public FilterExpression(final String literal,
+ final String filterNameHint,
+ final String yamlSource,
+ final ClassPool pool,
+ final ClassLoader targetClassLoader) {
+ this(literal, filterNameHint, yamlSource);
+ }
+
public Map<String, SampleFamily> filter(final Map<String, SampleFamily> sampleFamilies) {
try {
final Map<String, SampleFamily> result = new HashMap<>();
diff --git a/build-tools/precompiler/src/main/java/org/apache/skywalking/oap/server/buildtools/precompiler/Precompiler.java b/build-tools/precompiler/src/main/java/org/apache/skywalking/oap/server/buildtools/precompiler/Precompiler.java
index eef110d..de93ae6 100644
--- a/build-tools/precompiler/src/main/java/org/apache/skywalking/oap/server/buildtools/precompiler/Precompiler.java
+++ b/build-tools/precompiler/src/main/java/org/apache/skywalking/oap/server/buildtools/precompiler/Precompiler.java
@@ -1175,7 +1175,9 @@ public class Precompiler {
for (int i = 0; i < metricsRules.size(); i++) {
MetricsRule mr = metricsRules.get(i);
String metricName = rule.getMetricPrefix() + "_" + mr.getName();
- String fullExp = malFormatExp(
+ // Must use the real formatExp: this text keys COMPILE_MAP at compile time
+ // and is what MetricConvert passes to DSL.parse at runtime — a replica drifts.
+ String fullExp = MetricConvert.formatExp(
rule.getExpPrefix(), rule.getExpSuffix(), mr.getExp());
String exprKey = DSL.expressionKey(fullExp, metricName);
String className = DSL.COMPILE_MAP.get(exprKey);
@@ -1204,30 +1206,6 @@ public class Precompiler {
return totalExpressions;
}
- /**
- * Replicate MetricConvert.formatExp() to compose the full MAL expression
- * from expPrefix, expSuffix, and the per-rule expression.
- */
- private static String malFormatExp(final String expPrefix,
- final String expSuffix,
- final String exp) {
- String ret = exp;
- if (expPrefix != null && !expPrefix.isEmpty()) {
- String before = exp.contains(".") ? exp.substring(0, exp.indexOf('.')) : exp;
- ret = String.format("(%s.%s)", before, expPrefix);
- if (exp.contains(".")) {
- String after = exp.substring(exp.indexOf('.') + 1);
- if (!after.isEmpty()) {
- ret = String.format("(%s.%s)", ret, after);
- }
- }
- }
- if (expSuffix != null && !expSuffix.isEmpty()) {
- ret = String.format("(%s).%s", ret, expSuffix);
- }
- return ret;
- }
-
private static String escapePropertiesValue(String value) {
// Escape backslashes and newlines in property values
return value.replace("\\", "\\\\")
diff --git a/build-tools/precompiler/src/main/resources/META-INF/module-config-classes.txt b/build-tools/precompiler/src/main/resources/META-INF/module-config-classes.txt
index 3e97cbf..0c445a3 100644
--- a/build-tools/precompiler/src/main/resources/META-INF/module-config-classes.txt
+++ b/build-tools/precompiler/src/main/resources/META-INF/module-config-classes.txt
@@ -2,12 +2,15 @@ org.apache.skywalking.oap.analyzer.genai.config.GenAIConfig
org.apache.skywalking.oap.analyzer.genai.config.GenAIConfig$Model
org.apache.skywalking.oap.analyzer.genai.config.GenAIConfig$Provider
org.apache.skywalking.oap.log.analyzer.v2.provider.LogAnalyzerModuleConfig
-org.apache.skywalking.oap.query.debug.StatusQueryConfig
org.apache.skywalking.oap.query.graphql.GraphQLQueryConfig
org.apache.skywalking.oap.query.logql.LogQLConfig
org.apache.skywalking.oap.query.promql.PromQLConfig
org.apache.skywalking.oap.query.traceql.TraceQLConfig
org.apache.skywalking.oap.query.zipkin.ZipkinQueryConfig
+org.apache.skywalking.oap.server.admin.inspect.InspectModuleConfig
+org.apache.skywalking.oap.server.admin.server.module.AdminServerModuleConfig
+org.apache.skywalking.oap.server.admin.status.StatusModuleConfig
+org.apache.skywalking.oap.server.admin.uimanagement.UIManagementModuleConfig
org.apache.skywalking.oap.server.ai.pipeline.AIPipelineConfig
org.apache.skywalking.oap.server.analyzer.agent.kafka.module.KafkaFetcherConfig
org.apache.skywalking.oap.server.analyzer.provider.AnalyzerModuleConfig
diff --git a/changes/changes.md b/changes/changes.md
index 76a387c..c639263 100644
--- a/changes/changes.md
+++ b/changes/changes.md
@@ -1,5 +1,33 @@
# Changes
+## 0.4.0
+
+### Upstream Sync
+
+- Sync SkyWalking submodule to upstream `ad733554b0` (11.0.0-SNAPSHOT).
+- Wire the admin-server family on the admin host (HTTP `:17128`, admin-internal gRPC `:17129`): `admin-server`, `status` (relocated from the 10.x `status-query` plugin — `/status/*`, `/debugging/*`), `inspect` (SWIP-14 metric catalog, `/inspect/*`), and `ui-management` (dashboard-template REST for the Horizon UI, `/ui-management/*`). The `status-query` plugin is removed.
+- Enable iOS (SWIP-11) and mini-program (SWIP-12) OTel metrics rules and Envoy AI Gateway MCP rules; add the mini-program log-MAL rules and the `ai_route_type` searchable log tag.
+- Drop the bundled UI templates: upstream 11.0.0 removed `ui-initialized-templates/` and `UITemplateInitializer`; templates are now managed via `ui-management`.
+
+### GraalVM Native Image Compatibility
+
+- DSL Live Debugger (SWIP-13, `/dsl-debugging/*`) and runtime rule hot-update (`/runtime/*`) are unsupported in the native image — both need runtime Javassist codegen — so a stub module answers those prefixes with HTTP 501.
+- `YamlConfigLoaderUtils` and `ConfigInitializerGenerator` now emit a no-op dispatch branch for empty `ModuleConfig` types (`InspectModuleConfig`, `UIManagementModuleConfig`), so module boot no longer throws on the relocated empty configs.
+- Port the new upstream runtime-rule DSL overloads into the same-FQCN replacements: meter `DSL.parse(..., ClassPool, ClassLoader)`, `FilterExpression(..., ClassPool, ClassLoader)`, and log `DSL.of(..., ClassPool, ClassLoader)`.
+- The precompiler and the MAL comparison tests now compose expressions via the real upstream `MetricConvert.formatExp` (ANTLR `injectExpPrefix`) instead of a hand-rolled replica, fixing pre-compiled class lookup for chained expressions (`.sum` / `.rate` / `.downsampling`).
+
+### Documentation
+
+- Document the admin-server family, the status relocation, and the unsupported DSL-debugging / runtime-rule features (HTTP 501) in `distro-policy.md` and `supported-features.md`; add the `0.4.0` → `ad733554b0` row to `version-mapping.md`.
+
+### Testing
+
+- Add MAL comparison tests for the mini-program log-MAL rules and LAL pre-compilation tests for the iOS MetricKit and mini-program rules; track the new iOS / mini-program / Envoy AI Gateway MCP YAML in the precompiled-YAML staleness baseline.
+
+### E2E Tests
+
+- Bump pinned dependency images for the 11.0.0 sync: BanyanDB `84b919e`, Kubernetes `da0e267`, e2e java-test-service `7754e3e`.
+
## 0.3.0
### Upstream Sync
diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml
index 78c3375..77e5085 100644
--- a/docker/docker-compose.yml
+++ b/docker/docker-compose.yml
@@ -15,7 +15,7 @@
services:
banyandb:
- image: "ghcr.io/apache/skywalking-banyandb:${SW_BANYANDB_COMMIT:-74334e027b7fad414c9773f803163b5c97a9655b}"
+ image: "ghcr.io/apache/skywalking-banyandb:${SW_BANYANDB_COMMIT:-84b919efca3fee3d51df9e97a734a9f10ae6f1d2}"
ports:
- "17912:17912"
- "17913:17913"
diff --git a/docs/distro-policy.md b/docs/distro-policy.md
index ec99d2a..f080e4d 100644
--- a/docs/distro-policy.md
+++ b/docs/distro-policy.md
@@ -18,13 +18,25 @@ Build and package Apache SkyWalking OAP server as a GraalVM native image on JDK
| **Configuration** | ConfigurationModule | Kubernetes |
| **Receivers** | SharingServerModule, TraceModule, JVMModule, MeterReceiverModule, LogModule, RegisterModule, ProfileModule, BrowserModule, EventModule, OtelMetricReceiverModule, MeshReceiverModule, EnvoyMetricReceiverModule, ZipkinReceiverModule, ZabbixReceiverModule, TelegrafReceiverModule, AWSFirehoseReceiverModule, CiliumFetcherModule, EBPFReceiverModule, AsyncProfilerModule, PprofModule, CLRModule, ConfigurationDiscoveryModule, KafkaFetcherModule | default providers |
| **Analyzers** | AnalyzerModule, LogAnalyzerModule, EventAnalyzerModule, GenAIAnalyzerModule | default providers |
-| **Query** | QueryModule (GraphQL), PromQLModule, LogQLModule, TraceQLModule, ZipkinQueryModule, StatusQueryModule | default providers |
+| **Query** | QueryModule (GraphQL), PromQLModule, LogQLModule, TraceQLModule, ZipkinQueryModule | default providers |
+| **Admin** | AdminServerModule, StatusModule, InspectModule, UIManagementModule | default; dsl-debugging + runtime-rule excluded (return 501) |
| **Alarm** | AlarmModule | default |
| **Telemetry** | TelemetryModule | Prometheus |
| **Other** | ExporterModule, HealthCheckerModule, AIPipelineModule | default providers |
**Full feature set.** Work around issues as they arise.
+> **Admin server family (11.0.0+).** `StatusModule` — cluster / alarm-runtime / TTL-config
+> status plus the `/debugging/*` debug-query trace endpoints — was relocated from the 10.x
+> `status-query` query plugin onto the admin-server host (default `:17128`); URIs and payloads
+> are unchanged. `InspectModule` (SWIP-14 metric catalog + entity enumeration, `/inspect/*`)
+> and `UIManagementModule` (dashboard-template REST consumed by the Horizon UI,
+> `/ui-management/*`) are hosted there as well. `DSLDebuggingModule` (SWIP-13 DSL live
+> debugger, `/dsl-debugging/*`) and `RuntimeRuleModule` (MAL/LAL hot-update, `/runtime/*`) are
+> **not supported** in this distro: both need runtime Javassist code generation, which a
+> closed-world native image cannot do. Their endpoints return a friendly HTTP 501 via a stub
+> module provider.
+
---
## Core Strategy
@@ -145,7 +157,6 @@ Each upstream JAR that has replacement classes gets a corresponding `*-for-graal
| `ebpf-receiver-for-graalvm` | `EBPFReceiverModuleConfig` |
| `aws-firehose-receiver-for-graalvm` | `AWSFirehoseReceiverModuleConfig` |
| `cilium-fetcher-for-graalvm` | `CiliumFetcherConfig` |
-| `status-query-for-graalvm` | `StatusQueryConfig` |
| `health-checker-for-graalvm` | `HealthCheckerConfig` |
### No Classpath Ordering Required
@@ -203,11 +214,12 @@ YAML parsing. No reflection involved — safe for GraalVM native image as-is.
| `metadata-service-mapping.yaml` | 1 | `ResourceUtils.read()` | Metadata service mapping |
| `service-apdex-threshold.yml` | 1 | `ApdexThresholdConfig` via `ResourceUtils.read()` | APDEX thresholds |
| `trace-sampling-policy-settings.yml` | 1 | `TraceSamplingPolicyWatcher` via `ResourceUtils.read()` | Trace sampling |
-| `ui-initialized-templates/**` | 131 | `UITemplateInitializer` via `Files.walk()` | UI dashboard JSON templates |
| `cilium-rules/**` | 2 | `CiliumFetcherProvider` via `ResourceUtils.getPathFiles()` | Cilium flow rules |
| `openapi-definitions/**` | 1 | `EndpointNameGrouping` via `ResourceUtils.getPathFiles()` | OpenAPI grouping definitions |
-**Total: 146 files** included in the distro `config/` directory.
+**Total: 15 files** included in the distro `config/` directory. (Upstream 11.0.0 removed the
+bundled `ui-initialized-templates/` + `UITemplateInitializer`; dashboard templates are now managed
+via the `ui-management` REST surface.)
### Pre-compiled at Build Time (NOT in distro)
@@ -219,15 +231,15 @@ packaged in JARs. The YAML source files are not needed at runtime.
|---|---|---|---|
| `oal/*.oal` | 9 | ~620 metrics + ~620 builders + ~45 dispatchers (Javassist) | OAL v2 engine |
| `meter-analyzer-config/*.yaml` | 11 | ~147 `MalExpression` classes (ANTLR4+Javassist) + meter classes | MAL v2 compiler |
-| `otel-rules/**/*.yaml` | 55 | ~1039 `MalExpression` classes + meter classes | MAL v2 compiler |
-| `log-mal-rules/*.yaml` | 2 | ~2 `MalExpression` classes | MAL v2 compiler |
+| `otel-rules/**/*.yaml` | 65 | ~1039 `MalExpression` classes + meter classes | MAL v2 compiler |
+| `log-mal-rules/*.yaml` | 4 | ~4 `MalExpression` classes | MAL v2 compiler |
| `envoy-metrics-rules/*.yaml` | 2 | ~26 `MalExpression` classes + meter classes | MAL v2 compiler |
| `telegraf-rules/*.yaml` | 1 | ~20 `MalExpression` classes + meter classes | MAL v2 compiler |
| `zabbix-rules/*.yaml` | 1 | ~15 `MalExpression` classes + meter classes | MAL v2 compiler |
-| `lal/*.yaml` | 8 | ~10 `LalExpression` classes (ANTLR4+Javassist) | LAL v2 compiler |
+| `lal/*.yaml` | 11 | ~12 `LalExpression` classes (ANTLR4+Javassist) | LAL v2 compiler |
| `hierarchy-definition.yml` | 1 | ~4 `BiFunction` hierarchy rule classes | Hierarchy v2 compiler |
-**Total: 90 files** consumed at build time, producing ~1285 OAL classes, ~1250 MAL expression classes, ~1188 meter classes, ~10 LAL expression classes, and ~4 hierarchy rule classes.
+**Total: 105 files** consumed at build time, producing ~1285 OAL classes, ~1250 MAL expression classes, ~1188 meter classes, ~12 LAL expression classes, and ~4 hierarchy rule classes.
Additionally, the precompiler serializes parsed config POJOs as JSON manifests in
`META-INF/config-data/` (7 JSON files for meter-analyzer-config, otel-rules,
@@ -277,7 +289,7 @@ All four DSL compilers (OAL/MAL/LAL/Hierarchy) use ANTLR4 + Javassist v2 engines
- `reflect-config.json` auto-generated by precompiler from manifests (OAL, MAL, LAL, meter, HTTP handlers, GraphQL types)
- `log4j2-reflect-config.json` for Log4j2 plugin classes; console-only `log4j2.xml` with `SW_LOG_LEVEL` env var
- gRPC/Netty/Protobuf/Armeria via GraalVM reachability metadata repository
-- Auto-scanned reflection metadata: Armeria HTTP handlers (~19), GraphQL resolvers (~32), GraphQL types (~182), config POJOs (8)
+- Auto-scanned reflection metadata: Armeria HTTP handlers (~27, incl. admin-server/status/inspect/ui-management), GraphQL resolvers (~32), GraphQL types (~182), config POJOs (8)
- Native binary: ~203MB, boots to full module init with all HTTP endpoints functional
### Native Distro Packaging
diff --git a/docs/supported-features.md b/docs/supported-features.md
index de1846d..9663baa 100644
--- a/docs/supported-features.md
+++ b/docs/supported-features.md
@@ -64,7 +64,9 @@ All receivers are included:
| **PromQL** | 9090 | Prometheus-compatible query |
| **LogQL** | 3100 | Loki-compatible log query |
| **Zipkin** | 9412 | Zipkin v2 query API (disabled by default) |
-| **Status** | 12800 | Debugging and status queries |
+| **Status** | 17128 | Cluster / alarm / TTL status + `/debugging/*` debug-query trace, on the admin-server host (relocated from the query plugin in 11.0.0) |
+| **Inspect** | 17128 | SWIP-14 metric catalog + entity enumeration (`/inspect/*`), on the admin-server host |
+| **UI Management** | 17128 | Dashboard-template REST (`/ui-management/*`) consumed by the Horizon UI, on the admin-server host |
### Analyzers
@@ -121,6 +123,14 @@ Agent Pod ──(plaintext gRPC)──► Istio Sidecar ══(mTLS)══► Is
This is the recommended approach for Kubernetes deployments and provides stronger security
guarantees than application-level TLS (automatic certificate rotation, policy enforcement).
+### No DSL Live Debugger or Runtime Rule Hot-Update
+
+The admin-server feature modules `DSLDebuggingModule` (SWIP-13 DSL live debugger, `/dsl-debugging/*`)
+and `RuntimeRuleModule` (MAL/LAL hot-update, `/runtime/*`) are **not supported**. Both generate
+Javassist bytecode at runtime, which a closed-world native image cannot do — all DSL rules are
+pre-compiled at build time. These endpoints return **HTTP 501**. Use the upstream JVM distribution
+if you need live DSL debugging or runtime rule updates.
+
## Differences from Upstream SkyWalking
| Aspect | Upstream | This Distro |
diff --git a/docs/version-mapping.md b/docs/version-mapping.md
index cd375a4..26c6824 100644
--- a/docs/version-mapping.md
+++ b/docs/version-mapping.md
@@ -8,6 +8,7 @@ Otherwise, it is shown as `{commit-id}-SNAPSHOT` indicating a development build
<!-- DOC-CHECK: version-mapping-table -->
| Distro Version | Apache SkyWalking Version |
|---|---|
+| 0.4.0-SNAPSHOT (dev) | `ad733554b0`-SNAPSHOT |
| 0.3.0-SNAPSHOT (dev) | 10.4.0 |
| 0.2.1 | `64a1795d8a58`-SNAPSHOT |
| 0.2.0 | `64a1795d8a58`-SNAPSHOT |
diff --git a/oap-graalvm-native/src/main/assembly/native-distribution.xml b/oap-graalvm-native/src/main/assembly/native-distribution.xml
index 3f0262e..e0c47a3 100644
--- a/oap-graalvm-native/src/main/assembly/native-distribution.xml
+++ b/oap-graalvm-native/src/main/assembly/native-distribution.xml
@@ -69,7 +69,6 @@
<includes>
<include>bydb.yml</include>
<include>bydb-topn.yml</include>
- <include>ui-initialized-templates/**</include>
<include>cilium-rules/**</include>
<include>telegraf-rules/**</include>
<include>zabbix-rules/**</include>
diff --git a/oap-graalvm-server/pom.xml b/oap-graalvm-server/pom.xml
index c6db6bf..6b80a60 100644
--- a/oap-graalvm-server/pom.xml
+++ b/oap-graalvm-server/pom.xml
@@ -111,12 +111,6 @@
<version>${skywalking.version}</version>
<scope>provided</scope>
</dependency>
- <dependency>
- <groupId>org.apache.skywalking</groupId>
- <artifactId>status-query-plugin</artifactId>
- <version>${skywalking.version}</version>
- <scope>provided</scope>
- </dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>server-health-checker</artifactId>
@@ -178,11 +172,27 @@
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
- <artifactId>status-query-for-graalvm</artifactId>
+ <artifactId>health-checker-for-graalvm</artifactId>
</dependency>
+
+ <!-- Admin server family (11.0.0+). Used as-is (configs already carry @Setter,
+ no same-FQCN replacement needed). runtime-rule + dsl-debugging are NOT
+ included: their runtime-Javassist codegen can't run under native image. -->
<dependency>
<groupId>org.apache.skywalking</groupId>
- <artifactId>health-checker-for-graalvm</artifactId>
+ <artifactId>admin-server</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.skywalking</groupId>
+ <artifactId>status</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.skywalking</groupId>
+ <artifactId>inspect</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.skywalking</groupId>
+ <artifactId>ui-management</artifactId>
</dependency>
<!-- Core (non-repackaged) -->
diff --git a/oap-graalvm-server/src/main/assembly/distribution.xml b/oap-graalvm-server/src/main/assembly/distribution.xml
index d139705..dcb06a1 100644
--- a/oap-graalvm-server/src/main/assembly/distribution.xml
+++ b/oap-graalvm-server/src/main/assembly/distribution.xml
@@ -83,8 +83,6 @@
<!-- BanyanDB storage config (loaded by BanyanDBConfigLoader) -->
<include>bydb.yml</include>
<include>bydb-topn.yml</include>
- <!-- UI dashboard templates (loaded by UITemplateInitializer) -->
- <include>ui-initialized-templates/**</include>
<!-- Cilium rules (loaded by CiliumFetcherProvider) -->
<include>cilium-rules/**</include>
<!-- OpenAPI endpoint grouping definitions -->
diff --git a/oap-graalvm-server/src/main/java/org/apache/skywalking/oap/server/graalvm/GraalVMOAPServerStartUp.java b/oap-graalvm-server/src/main/java/org/apache/skywalking/oap/server/graalvm/GraalVMOAPServerStartUp.java
index ee6cd72..d0b12b5 100644
--- a/oap-graalvm-server/src/main/java/org/apache/skywalking/oap/server/graalvm/GraalVMOAPServerStartUp.java
+++ b/oap-graalvm-server/src/main/java/org/apache/skywalking/oap/server/graalvm/GraalVMOAPServerStartUp.java
@@ -115,8 +115,18 @@ import org.apache.skywalking.oap.query.logql.LogQLModule;
import org.apache.skywalking.oap.query.logql.LogQLProvider;
import org.apache.skywalking.oap.query.traceql.TraceQLModule;
import org.apache.skywalking.oap.query.traceql.TraceQLProvider;
-import org.apache.skywalking.oap.query.debug.StatusQueryModule;
-import org.apache.skywalking.oap.query.debug.StatusQueryProvider;
+// Admin server family (11.0.0+)
+import org.apache.skywalking.oap.server.admin.server.module.AdminServerModule;
+import org.apache.skywalking.oap.server.admin.server.module.AdminServerModuleProvider;
+import org.apache.skywalking.oap.server.admin.status.StatusModule;
+import org.apache.skywalking.oap.server.admin.status.StatusModuleProvider;
+import org.apache.skywalking.oap.server.admin.inspect.InspectModule;
+import org.apache.skywalking.oap.server.admin.inspect.InspectModuleProvider;
+import org.apache.skywalking.oap.server.admin.uimanagement.UIManagementModule;
+import org.apache.skywalking.oap.server.admin.uimanagement.UIManagementModuleProvider;
+// GraalVM stub for unsupported admin features (runtime-rule / dsl-debugging)
+import org.apache.skywalking.oap.server.graalvm.admin.UnsupportedAdminFeatureModule;
+import org.apache.skywalking.oap.server.graalvm.admin.UnsupportedAdminFeatureModuleProvider;
// Exporter
import org.apache.skywalking.oap.server.exporter.provider.ExporterProvider;
// Health Checker
@@ -260,8 +270,6 @@ public class GraalVMOAPServerStartUp {
if (configuration.has("traceQL")) {
manager.register(new TraceQLModule(), new TraceQLProvider());
}
- manager.register(new StatusQueryModule(), new StatusQueryProvider());
-
// Alarm
manager.register(new AlarmModule(), new AlarmModuleProvider());
@@ -275,5 +283,20 @@ public class GraalVMOAPServerStartUp {
// AI Pipeline
manager.register(new AIPipelineModule(), new AIPipelineProvider());
+
+ // Admin server family (11.0.0+). admin-server hosts the operator REST surface
+ // (default :17128) + admin-internal gRPC bus (:17129). The new Horizon UI loads
+ // dashboard templates via ui-management, so the host must be available.
+ // - status : /status/*, /debugging/* (relocated from status-query-plugin)
+ // - inspect : /inspect/* metric catalog + entity enumeration (SWIP-14)
+ // - ui-management : /ui-management/* dashboard template CRUD (Horizon UI needs this)
+ // runtime-rule + dsl-debugging are NOT wired — they require runtime Javassist
+ // class generation, which is impossible under a closed-world native image. Their
+ // endpoints are served by UnsupportedAdminFeatureModule with a friendly 501.
+ manager.register(new AdminServerModule(), new AdminServerModuleProvider());
+ manager.register(new StatusModule(), new StatusModuleProvider());
+ manager.register(new InspectModule(), new InspectModuleProvider());
+ manager.register(new UIManagementModule(), new UIManagementModuleProvider());
+ manager.register(new UnsupportedAdminFeatureModule(), new UnsupportedAdminFeatureModuleProvider());
}
}
diff --git a/oap-graalvm-server/src/main/java/org/apache/skywalking/oap/server/graalvm/admin/UnsupportedAdminFeatureHandler.java b/oap-graalvm-server/src/main/java/org/apache/skywalking/oap/server/graalvm/admin/UnsupportedAdminFeatureHandler.java
new file mode 100644
index 0000000..2ab57e8
--- /dev/null
+++ b/oap-graalvm-server/src/main/java/org/apache/skywalking/oap/server/graalvm/admin/UnsupportedAdminFeatureHandler.java
@@ -0,0 +1,78 @@
+/*
+ * 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.graalvm.admin;
+
+import com.linecorp.armeria.common.HttpResponse;
+import com.linecorp.armeria.common.HttpStatus;
+import com.linecorp.armeria.common.MediaType;
+import com.linecorp.armeria.server.ServiceRequestContext;
+import com.linecorp.armeria.server.annotation.Delete;
+import com.linecorp.armeria.server.annotation.Get;
+import com.linecorp.armeria.server.annotation.Post;
+import com.linecorp.armeria.server.annotation.Put;
+
+/**
+ * Serves a friendly 501 for the admin features the GraalVM native distro cannot support.
+ *
+ * <p>The DSL live debugger ({@code /dsl-debugging/*}, {@code /runtime/oal/*}) and runtime-rule
+ * hot-update ({@code /runtime/rule/*}, {@code /runtime/mal/*}, {@code /runtime/lal/*}) both
+ * compile MAL / LAL / OAL rules into fresh bytecode with Javassist at runtime. A native image
+ * is built under a closed-world assumption — no runtime class generation — so this distro
+ * pre-compiles all DSL at build time and these on-demand-codegen features are unavailable.
+ *
+ * <p>Routes are registered with Armeria {@code prefix:} patterns so every verb and sub-path
+ * under the two roots resolves here, returning a structured payload the Horizon UI can render
+ * instead of hitting a connection error.
+ */
+public class UnsupportedAdminFeatureHandler {
+
+ private static final String MESSAGE =
+ "This feature requires runtime DSL (MAL/LAL/OAL) compilation, which is not available "
+ + "in the SkyWalking GraalVM native distribution. All DSL rules are pre-compiled at "
+ + "build time; runtime rule hot-update and the DSL live debugger are disabled. Use "
+ + "the standard JVM OAP distribution if you need these features.";
+
+ @Get("prefix:/dsl-debugging")
+ @Post("prefix:/dsl-debugging")
+ @Put("prefix:/dsl-debugging")
+ @Delete("prefix:/dsl-debugging")
+ public HttpResponse dslDebugging(final ServiceRequestContext ctx) {
+ return notImplemented("dsl-debugging", ctx.path());
+ }
+
+ @Get("prefix:/runtime")
+ @Post("prefix:/runtime")
+ @Put("prefix:/runtime")
+ @Delete("prefix:/runtime")
+ public HttpResponse runtimeRule(final ServiceRequestContext ctx) {
+ return notImplemented("runtime-rule", ctx.path());
+ }
+
+ private static HttpResponse notImplemented(final String feature, final String path) {
+ final String body = "{\"status\":501,"
+ + "\"error\":\"feature_not_available_in_graalvm_native\","
+ + "\"feature\":\"" + feature + "\","
+ + "\"path\":\"" + escape(path) + "\","
+ + "\"message\":\"" + MESSAGE + "\"}";
+ return HttpResponse.of(HttpStatus.NOT_IMPLEMENTED, MediaType.JSON_UTF_8, body);
+ }
+
+ private static String escape(final String s) {
+ return s == null ? "" : s.replace("\\", "\\\\").replace("\"", "\\\"");
+ }
+}
diff --git a/oap-graalvm-server/src/main/java/org/apache/skywalking/oap/server/graalvm/admin/UnsupportedAdminFeatureModule.java b/oap-graalvm-server/src/main/java/org/apache/skywalking/oap/server/graalvm/admin/UnsupportedAdminFeatureModule.java
new file mode 100644
index 0000000..63c53c3
--- /dev/null
+++ b/oap-graalvm-server/src/main/java/org/apache/skywalking/oap/server/graalvm/admin/UnsupportedAdminFeatureModule.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.oap.server.graalvm.admin;
+
+import org.apache.skywalking.oap.server.library.module.ModuleDefine;
+
+/**
+ * GraalVM-distro-only module that serves a friendly "not available" response for the
+ * admin features this distro cannot support in a native image: runtime-rule hot-update
+ * and the DSL live debugger. Both rely on runtime Javassist class generation, which is
+ * impossible under the closed-world assumption of a native image.
+ *
+ * <p>Without this module the Horizon UI would hit connection-refused / 404 on the
+ * {@code /dsl-debugging/*} and {@code /runtime/*} endpoints. The stub mounts those routes
+ * on the admin-server HTTP host and returns 501 with an explanatory payload instead.
+ */
+public class UnsupportedAdminFeatureModule extends ModuleDefine {
+ public static final String NAME = "graalvm-unsupported-admin";
+
+ public UnsupportedAdminFeatureModule() {
+ super(NAME);
+ }
+
+ @Override
+ public Class[] services() {
+ return new Class[] {};
+ }
+}
diff --git a/oap-graalvm-server/src/main/java/org/apache/skywalking/oap/server/graalvm/admin/UnsupportedAdminFeatureModuleProvider.java b/oap-graalvm-server/src/main/java/org/apache/skywalking/oap/server/graalvm/admin/UnsupportedAdminFeatureModuleProvider.java
new file mode 100644
index 0000000..1e9c853
--- /dev/null
+++ b/oap-graalvm-server/src/main/java/org/apache/skywalking/oap/server/graalvm/admin/UnsupportedAdminFeatureModuleProvider.java
@@ -0,0 +1,78 @@
+/*
+ * 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.graalvm.admin;
+
+import com.linecorp.armeria.common.HttpMethod;
+import java.util.Arrays;
+import org.apache.skywalking.oap.server.admin.server.module.AdminServerModule;
+import org.apache.skywalking.oap.server.core.server.HTTPHandlerRegister;
+import org.apache.skywalking.oap.server.library.module.ModuleConfig;
+import org.apache.skywalking.oap.server.library.module.ModuleDefine;
+import org.apache.skywalking.oap.server.library.module.ModuleProvider;
+import org.apache.skywalking.oap.server.library.module.ModuleStartException;
+import org.apache.skywalking.oap.server.library.module.ServiceNotProvidedException;
+
+/**
+ * Registers {@link UnsupportedAdminFeatureHandler} on the admin-server HTTP host. The
+ * module carries no configuration ({@link #newConfigCreator()} returns null), so it needs
+ * no {@code application.yml} section and no config-generator entry — it is wired directly
+ * by {@code GraalVMOAPServerStartUp}.
+ */
+public class UnsupportedAdminFeatureModuleProvider extends ModuleProvider {
+
+ @Override
+ public String name() {
+ return "default";
+ }
+
+ @Override
+ public Class<? extends ModuleDefine> module() {
+ return UnsupportedAdminFeatureModule.class;
+ }
+
+ @Override
+ public ConfigCreator<? extends ModuleConfig> newConfigCreator() {
+ return null;
+ }
+
+ @Override
+ public void prepare() throws ServiceNotProvidedException, ModuleStartException {
+ }
+
+ @Override
+ public void start() throws ServiceNotProvidedException, ModuleStartException {
+ final HTTPHandlerRegister adminRegister = getManager().find(AdminServerModule.NAME)
+ .provider()
+ .getService(HTTPHandlerRegister.class);
+ adminRegister.addHandler(
+ new UnsupportedAdminFeatureHandler(),
+ Arrays.asList(HttpMethod.GET, HttpMethod.POST, HttpMethod.PUT, HttpMethod.DELETE)
+ );
+ }
+
+ @Override
+ public void notifyAfterCompleted() throws ServiceNotProvidedException, ModuleStartException {
+ }
+
+ @Override
+ public String[] requiredModules() {
+ return new String[] {
+ AdminServerModule.NAME,
+ };
+ }
+}
diff --git a/oap-graalvm-server/src/main/java/org/apache/skywalking/oap/server/library/util/YamlConfigLoaderUtils.java b/oap-graalvm-server/src/main/java/org/apache/skywalking/oap/server/library/util/YamlConfigLoaderUtils.java
index c6e7ef1..699ca28 100644
--- a/oap-graalvm-server/src/main/java/org/apache/skywalking/oap/server/library/util/YamlConfigLoaderUtils.java
+++ b/oap-graalvm-server/src/main/java/org/apache/skywalking/oap/server/library/util/YamlConfigLoaderUtils.java
@@ -28,12 +28,15 @@ import org.yaml.snakeyaml.Yaml;
import java.util.Set;
import org.apache.skywalking.oap.analyzer.genai.config.GenAIConfig;
import org.apache.skywalking.oap.log.analyzer.v2.provider.LogAnalyzerModuleConfig;
-import org.apache.skywalking.oap.query.debug.StatusQueryConfig;
import org.apache.skywalking.oap.query.graphql.GraphQLQueryConfig;
import org.apache.skywalking.oap.query.logql.LogQLConfig;
import org.apache.skywalking.oap.query.promql.PromQLConfig;
import org.apache.skywalking.oap.query.traceql.TraceQLConfig;
import org.apache.skywalking.oap.query.zipkin.ZipkinQueryConfig;
+import org.apache.skywalking.oap.server.admin.inspect.InspectModuleConfig;
+import org.apache.skywalking.oap.server.admin.server.module.AdminServerModuleConfig;
+import org.apache.skywalking.oap.server.admin.status.StatusModuleConfig;
+import org.apache.skywalking.oap.server.admin.uimanagement.UIManagementModuleConfig;
import org.apache.skywalking.oap.server.ai.pipeline.AIPipelineConfig;
import org.apache.skywalking.oap.server.analyzer.agent.kafka.module.KafkaFetcherConfig;
import org.apache.skywalking.oap.server.analyzer.provider.AnalyzerModuleConfig;
@@ -126,14 +129,12 @@ public class YamlConfigLoaderUtils {
copyToSharingServerConfig((SharingServerConfig) dest, src, moduleName, providerName);
} else if (dest instanceof AnalyzerModuleConfig) {
copyToAnalyzerModuleConfig((AnalyzerModuleConfig) dest, src, moduleName, providerName);
- } else if (dest instanceof ZipkinReceiverConfig) {
- copyToZipkinReceiverConfig((ZipkinReceiverConfig) dest, src, moduleName, providerName);
} else if (dest instanceof GenAIConfig) {
copyToGenAIConfig((GenAIConfig) dest, src, moduleName, providerName);
+ } else if (dest instanceof ZipkinReceiverConfig) {
+ copyToZipkinReceiverConfig((ZipkinReceiverConfig) dest, src, moduleName, providerName);
} else if (dest instanceof ZipkinQueryConfig) {
copyToZipkinQueryConfig((ZipkinQueryConfig) dest, src, moduleName, providerName);
- } else if (dest instanceof StatusQueryConfig) {
- copyToStatusQueryConfig((StatusQueryConfig) dest, src, moduleName, providerName);
} else if (dest instanceof EnvoyMetricReceiverConfig) {
copyToEnvoyMetricReceiverConfig((EnvoyMetricReceiverConfig) dest, src, moduleName, providerName);
} else if (dest instanceof LogAnalyzerModuleConfig) {
@@ -180,6 +181,14 @@ public class YamlConfigLoaderUtils {
copyToExporterSetting((ExporterSetting) dest, src, moduleName, providerName);
} else if (dest instanceof ConfigmapConfigurationSettings) {
copyToConfigmapConfigurationSettings((ConfigmapConfigurationSettings) dest, src, moduleName, providerName);
+ } else if (dest instanceof AdminServerModuleConfig) {
+ copyToAdminServerModuleConfig((AdminServerModuleConfig) dest, src, moduleName, providerName);
+ } else if (dest instanceof StatusModuleConfig) {
+ copyToStatusModuleConfig((StatusModuleConfig) dest, src, moduleName, providerName);
+ } else if (dest instanceof InspectModuleConfig) {
+ // InspectModuleConfig has no configurable fields; nothing to copy.
+ } else if (dest instanceof UIManagementModuleConfig) {
+ // UIManagementModuleConfig has no configurable fields; nothing to copy.
} else if (dest instanceof GenAIConfig.Model) {
copyToModel((GenAIConfig.Model) dest, src, moduleName, providerName);
} else if (dest instanceof GenAIConfig.Provider) {
@@ -385,9 +394,6 @@ public class YamlConfigLoaderUtils {
case "maxHttpUrisNumberPerService":
cfg.setMaxHttpUrisNumberPerService(((Number) value).intValue());
break;
- case "uiMenuRefreshInterval":
- cfg.setUiMenuRefreshInterval(((Number) value).intValue());
- break;
case "serviceCacheRefreshInterval":
cfg.setServiceCacheRefreshInterval(((Number) value).intValue());
break;
@@ -570,6 +576,27 @@ public class YamlConfigLoaderUtils {
}
}
+ @SuppressWarnings("unchecked")
+ private static void copyToGenAIConfig(
+ final GenAIConfig cfg, final Properties src,
+ final String moduleName, final String providerName) {
+ final Enumeration<?> propertyNames = src.propertyNames();
+ while (propertyNames.hasMoreElements()) {
+ final String key = (String) propertyNames.nextElement();
+ final Object value = src.get(key);
+ log.debug("{}.{} config: {} = {}", moduleName, providerName, key, value);
+ switch (key) {
+ case "providers":
+ cfg.setProviders((List) value);
+ break;
+ default:
+ log.warn("{} setting is not supported in {} provider of {} module",
+ key, providerName, moduleName);
+ break;
+ }
+ }
+ }
+
@SuppressWarnings("unchecked")
private static void copyToZipkinReceiverConfig(
final ZipkinReceiverConfig cfg, final Properties src,
@@ -639,27 +666,6 @@ public class YamlConfigLoaderUtils {
}
}
- @SuppressWarnings("unchecked")
- private static void copyToGenAIConfig(
- final GenAIConfig cfg, final Properties src,
- final String moduleName, final String providerName) {
- final Enumeration<?> propertyNames = src.propertyNames();
- while (propertyNames.hasMoreElements()) {
- final String key = (String) propertyNames.nextElement();
- final Object value = src.get(key);
- log.debug("{}.{} config: {} = {}", moduleName, providerName, key, value);
- switch (key) {
- case "providers":
- cfg.setProviders((List) value);
- break;
- default:
- log.warn("{} setting is not supported in {} provider of {} module",
- key, providerName, moduleName);
- break;
- }
- }
- }
-
@SuppressWarnings("unchecked")
private static void copyToZipkinQueryConfig(
final ZipkinQueryConfig cfg, final Properties src,
@@ -711,27 +717,6 @@ public class YamlConfigLoaderUtils {
}
}
- @SuppressWarnings("unchecked")
- private static void copyToStatusQueryConfig(
- final StatusQueryConfig cfg, final Properties src,
- final String moduleName, final String providerName) {
- final Enumeration<?> propertyNames = src.propertyNames();
- while (propertyNames.hasMoreElements()) {
- final String key = (String) propertyNames.nextElement();
- final Object value = src.get(key);
- log.debug("{}.{} config: {} = {}", moduleName, providerName, key, value);
- switch (key) {
- case "keywords4MaskingSecretsOfConfig":
- cfg.setKeywords4MaskingSecretsOfConfig((String) value);
- break;
- default:
- log.warn("{} setting is not supported in {} provider of {} module",
- key, providerName, moduleName);
- break;
- }
- }
- }
-
@SuppressWarnings("unchecked")
private static void copyToEnvoyMetricReceiverConfig(
final EnvoyMetricReceiverConfig cfg, final Properties src,
@@ -1297,9 +1282,6 @@ public class YamlConfigLoaderUtils {
case "maxQueryComplexity":
cfg.setMaxQueryComplexity(((Number) value).intValue());
break;
- case "enableUpdateUITemplate":
- cfg.setEnableUpdateUITemplate((boolean) value);
- break;
case "enableOnDemandPodLog":
cfg.setEnableOnDemandPodLog((boolean) value);
break;
@@ -1608,6 +1590,96 @@ public class YamlConfigLoaderUtils {
}
}
+ @SuppressWarnings("unchecked")
+ private static void copyToAdminServerModuleConfig(
+ final AdminServerModuleConfig cfg, final Properties src,
+ final String moduleName, final String providerName) {
+ final Enumeration<?> propertyNames = src.propertyNames();
+ while (propertyNames.hasMoreElements()) {
+ final String key = (String) propertyNames.nextElement();
+ final Object value = src.get(key);
+ log.debug("{}.{} config: {} = {}", moduleName, providerName, key, value);
+ switch (key) {
+ case "host":
+ cfg.setHost((String) value);
+ break;
+ case "port":
+ cfg.setPort(((Number) value).intValue());
+ break;
+ case "contextPath":
+ cfg.setContextPath((String) value);
+ break;
+ case "idleTimeOut":
+ cfg.setIdleTimeOut(((Number) value).intValue());
+ break;
+ case "acceptQueueSize":
+ cfg.setAcceptQueueSize(((Number) value).intValue());
+ break;
+ case "httpMaxRequestHeaderSize":
+ cfg.setHttpMaxRequestHeaderSize(((Number) value).intValue());
+ break;
+ case "gRPCHost":
+ cfg.setGRPCHost((String) value);
+ break;
+ case "gRPCPort":
+ cfg.setGRPCPort(((Number) value).intValue());
+ break;
+ case "gRPCMaxConcurrentCallsPerConnection":
+ cfg.setGRPCMaxConcurrentCallsPerConnection(((Number) value).intValue());
+ break;
+ case "gRPCMaxMessageSize":
+ cfg.setGRPCMaxMessageSize(((Number) value).intValue());
+ break;
+ case "gRPCThreadPoolSize":
+ cfg.setGRPCThreadPoolSize(((Number) value).intValue());
+ break;
+ case "gRPCThreadPoolQueueSize":
+ cfg.setGRPCThreadPoolQueueSize(((Number) value).intValue());
+ break;
+ case "gRPCSslEnabled":
+ cfg.setGRPCSslEnabled((boolean) value);
+ break;
+ case "gRPCSslKeyPath":
+ cfg.setGRPCSslKeyPath((String) value);
+ break;
+ case "gRPCSslCertChainPath":
+ cfg.setGRPCSslCertChainPath((String) value);
+ break;
+ case "gRPCSslTrustedCAsPath":
+ cfg.setGRPCSslTrustedCAsPath((String) value);
+ break;
+ case "internalCommunicationTimeout":
+ cfg.setInternalCommunicationTimeout(((Number) value).intValue());
+ break;
+ default:
+ log.warn("{} setting is not supported in {} provider of {} module",
+ key, providerName, moduleName);
+ break;
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private static void copyToStatusModuleConfig(
+ final StatusModuleConfig cfg, final Properties src,
+ final String moduleName, final String providerName) {
+ final Enumeration<?> propertyNames = src.propertyNames();
+ while (propertyNames.hasMoreElements()) {
+ final String key = (String) propertyNames.nextElement();
+ final Object value = src.get(key);
+ log.debug("{}.{} config: {} = {}", moduleName, providerName, key, value);
+ switch (key) {
+ case "keywords4MaskingSecretsOfConfig":
+ cfg.setKeywords4MaskingSecretsOfConfig((String) value);
+ break;
+ default:
+ log.warn("{} setting is not supported in {} provider of {} module",
+ key, providerName, moduleName);
+ break;
+ }
+ }
+ }
+
@SuppressWarnings("unchecked")
private static void copyToModel(
final GenAIConfig.Model cfg, final Properties src,
diff --git a/oap-graalvm-server/src/main/resources/application.yml b/oap-graalvm-server/src/main/resources/application.yml
index 83ab460..e94cfd6 100644
--- a/oap-graalvm-server/src/main/resources/application.yml
+++ b/oap-graalvm-server/src/main/resources/application.yml
@@ -68,7 +68,7 @@ core:
instanceNameMaxLength: ${SW_INSTANCE_NAME_MAX_LENGTH:70}
endpointNameMaxLength: ${SW_ENDPOINT_NAME_MAX_LENGTH:150}
searchableTracesTags: ${SW_SEARCHABLE_TAG_KEYS:http.method,http.status_code,rpc.status_code,db.type,db.instance,mq.queue,mq.topic,mq.broker}
- searchableLogsTags: ${SW_SEARCHABLE_LOGS_TAG_KEYS:level,http.status_code}
+ searchableLogsTags: ${SW_SEARCHABLE_LOGS_TAG_KEYS:level,http.status_code,ai_route_type}
searchableAlarmTags: ${SW_SEARCHABLE_ALARM_TAG_KEYS:level}
autocompleteTagKeysQueryMaxSize: ${SW_AUTOCOMPLETE_TAG_KEYS_QUERY_MAX_SIZE:100}
autocompleteTagValuesQueryMaxSize: ${SW_AUTOCOMPLETE_TAG_VALUES_QUERY_MAX_SIZE:100}
@@ -100,8 +100,8 @@ agent-analyzer:
log-analyzer:
selector: ${SW_LOG_ANALYZER:default}
default:
- lalFiles: ${SW_LOG_LAL_FILES:envoy-als,mesh-dp,mysql-slowsql,pgsql-slowsql,redis-slowsql,k8s-service,nginx,envoy-ai-gateway,default}
- malFiles: ${SW_LOG_MAL_FILES:"nginx"}
+ lalFiles: ${SW_LOG_LAL_FILES:envoy-als,mesh-dp,mysql-slowsql,pgsql-slowsql,redis-slowsql,k8s-service,nginx,envoy-ai-gateway,miniprogram,default}
+ malFiles: ${SW_LOG_MAL_FILES:"nginx,miniprogram-wechat,miniprogram-alipay"}
event-analyzer:
selector: ${SW_EVENT_ANALYZER:default}
@@ -227,7 +227,7 @@ receiver-otel:
selector: ${SW_OTEL_RECEIVER:default}
default:
enabledHandlers: ${SW_OTEL_RECEIVER_ENABLED_HANDLERS:"otlp-traces,otlp-metrics,otlp-logs"}
- enabledOtelMetricsRules: ${SW_OTEL_RECEIVER_ENABLED_OTEL_METRICS_RULES:"apisix,nginx/*,k8s/*,istio-controlplane,vm,mysql/*,postgresql/*,oap,aws-eks/*,windows,aws-s3/*,aws-dynamodb/*,aws-gateway/*,redis/*,elasticsearch/*,rabbitmq/*,mongodb/*,kafka/*,pulsar/*,bookkeeper/*,rocketmq/*,clickhouse/*,activemq/*,kong/*,flink/*,banyandb/*,envoy-ai-gateway/*"}
+ enabledOtelMetricsRules: ${SW_OTEL_RECEIVER_ENABLED_OTEL_METRICS_RULES:"apisix,nginx/*,k8s/*,istio-controlplane,vm,mysql/*,postgresql/*,oap,aws-eks/*,windows,aws-s3/*,aws-dynamodb/*,aws-gateway/*,redis/*,elasticsearch/*,rabbitmq/*,mongodb/*,kafka/*,pulsar/*,bookkeeper/*,rocketmq/*,clickhouse/*,activemq/*,kong/*,flink/*,banyandb/*,envoy-ai-gateway/*,ios/*,miniprogram/*"}
receiver-zipkin:
selector: ${SW_RECEIVER_ZIPKIN:-}
@@ -264,7 +264,6 @@ query:
graphql:
enableLogTestTool: ${SW_QUERY_GRAPHQL_ENABLE_LOG_TEST_TOOL:false}
maxQueryComplexity: ${SW_QUERY_MAX_QUERY_COMPLEXITY:3000}
- enableUpdateUITemplate: ${SW_ENABLE_UPDATE_UI_TEMPLATE:false}
enableOnDemandPodLog: ${SW_ENABLE_ON_DEMAND_POD_LOG:false}
query-zipkin:
@@ -359,10 +358,53 @@ health-checker:
default:
checkIntervalSeconds: ${SW_HEALTH_CHECKER_INTERVAL_SECONDS:30}
-status-query:
- selector: ${SW_STATUS_QUERY:default}
+# Admin server family (11.0.0+). admin-server hosts the operator REST surface
+# (default :17128) and the admin-internal gRPC bus (:17129). The Horizon UI loads
+# dashboard templates via ui-management, so the host stays enabled by default.
+# NOTE: runtime-rule and dsl-debugging are NOT available in the GraalVM native
+# distro (they need runtime DSL codegen); their endpoints return a friendly 501.
+admin-server:
+ selector: ${SW_ADMIN_SERVER:default}
+ default:
+ host: ${SW_ADMIN_SERVER_HOST:0.0.0.0}
+ port: ${SW_ADMIN_SERVER_PORT:17128}
+ contextPath: ${SW_ADMIN_SERVER_CONTEXT_PATH:/}
+ idleTimeOut: ${SW_ADMIN_SERVER_IDLE_TIMEOUT:30000}
+ acceptQueueSize: ${SW_ADMIN_SERVER_QUEUE_SIZE:0}
+ httpMaxRequestHeaderSize: ${SW_ADMIN_SERVER_HTTP_MAX_REQUEST_HEADER_SIZE:8192}
+ # Admin-internal gRPC bus. MUST be a private interface reachable between OAP
+ # nodes ONLY; never expose it to operators or to the agent network.
+ gRPCHost: ${SW_ADMIN_SERVER_GRPC_HOST:0.0.0.0}
+ gRPCPort: ${SW_ADMIN_SERVER_GRPC_PORT:17129}
+ gRPCMaxConcurrentCallsPerConnection: ${SW_ADMIN_SERVER_GRPC_MAX_CONCURRENT_CALL:0}
+ gRPCMaxMessageSize: ${SW_ADMIN_SERVER_GRPC_MAX_MSG_SIZE:52428800}
+ gRPCThreadPoolSize: ${SW_ADMIN_SERVER_GRPC_THREAD_POOL_SIZE:0}
+ gRPCSslEnabled: ${SW_ADMIN_SERVER_GRPC_SSL_ENABLED:false}
+ gRPCSslKeyPath: ${SW_ADMIN_SERVER_GRPC_SSL_KEY_PATH:""}
+ gRPCSslCertChainPath: ${SW_ADMIN_SERVER_GRPC_SSL_CERT_CHAIN_PATH:""}
+ gRPCSslTrustedCAsPath: ${SW_ADMIN_SERVER_GRPC_SSL_TRUSTED_CAS_PATH:""}
+ internalCommunicationTimeout: ${SW_ADMIN_SERVER_INTERNAL_COMM_TIMEOUT:5000}
+
+# Status feature module — cluster nodes / alarm runtime status / TTL config / debug
+# query trace endpoints. Mounts onto admin-server (default :17128). Relocated from
+# the 10.x status-query-plugin; URI and payload formats are unchanged.
+status:
+ selector: ${SW_STATUS:default}
+ default:
+ keywords4MaskingSecretsOfConfig: ${SW_DEBUGGING_QUERY_KEYWORDS_FOR_MASKING_SECRETS:user,password,trustStorePass,keyStorePass,token,accessKey,secretKey,authentication}
+
+# Inspect API (SWIP-14) — admin-only metric catalog + per-metric entity enumeration.
+# Routes under /inspect/*. Mounts onto admin-server.
+inspect:
+ selector: ${SW_INSPECT:default}
+ default:
+
+# UI Management REST surface — add / change / disable / list dashboard templates.
+# Mounts onto admin-server. The Horizon UI (apache/skywalking-horizon-ui) loads
+# dashboards through these endpoints.
+ui-management:
+ selector: ${SW_UI_MANAGEMENT:default}
default:
- keywords4MaskingSecretsOfConfig: ${SW_DEBUGGING_QUERY_KEYWORDS_FOR_MASKING_SECRETS:user,password,token,accessKey,secretKey,authentication}
configuration-discovery:
selector: ${SW_CONFIGURATION_DISCOVERY:default}
diff --git a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/lal/LALIosMetrickitTest.java b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/lal/LALIosMetrickitTest.java
new file mode 100644
index 0000000..785d33a
--- /dev/null
+++ b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/lal/LALIosMetrickitTest.java
@@ -0,0 +1,45 @@
+/*
+ * 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.graalvm.lal;
+
+import java.util.List;
+import org.apache.skywalking.oap.log.analyzer.v2.dsl.LalExpression;
+import org.apache.skywalking.oap.log.analyzer.v2.provider.LALConfig;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class LALIosMetrickitTest extends LALScriptComparisonBase {
+ private static List<LALConfig> RULES;
+
+ @BeforeAll
+ static void loadRules() throws Exception {
+ RULES = loadLALRules("ios-metrickit.yaml");
+ }
+
+ @Test
+ void allRulesPrecompiled() {
+ assertTrue(RULES.size() >= 1, "ios-metrickit.yaml should have at least 1 rule");
+ for (final LALConfig rule : RULES) {
+ final LalExpression expr = loadPrecompiled(rule.getName());
+ assertNotNull(expr, "Pre-compiled class for rule '" + rule.getName() + "' should load");
+ }
+ }
+}
diff --git a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/lal/LALMiniprogramTest.java b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/lal/LALMiniprogramTest.java
new file mode 100644
index 0000000..c4b979e
--- /dev/null
+++ b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/lal/LALMiniprogramTest.java
@@ -0,0 +1,45 @@
+/*
+ * 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.graalvm.lal;
+
+import java.util.List;
+import org.apache.skywalking.oap.log.analyzer.v2.dsl.LalExpression;
+import org.apache.skywalking.oap.log.analyzer.v2.provider.LALConfig;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class LALMiniprogramTest extends LALScriptComparisonBase {
+ private static List<LALConfig> RULES;
+
+ @BeforeAll
+ static void loadRules() throws Exception {
+ RULES = loadLALRules("miniprogram.yaml");
+ }
+
+ @Test
+ void allRulesPrecompiled() {
+ assertTrue(RULES.size() >= 1, "miniprogram.yaml should have at least 1 rule");
+ for (final LALConfig rule : RULES) {
+ final LalExpression expr = loadPrecompiled(rule.getName());
+ assertNotNull(expr, "Pre-compiled class for rule '" + rule.getName() + "' should load");
+ }
+ }
+}
diff --git a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MALScriptComparisonBase.java b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MALScriptComparisonBase.java
index 88b189d..101819e 100644
--- a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MALScriptComparisonBase.java
+++ b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MALScriptComparisonBase.java
@@ -17,7 +17,6 @@
package org.apache.skywalking.oap.server.graalvm.mal;
-import com.google.common.base.Strings;
import com.google.common.collect.ImmutableMap;
import java.io.BufferedReader;
import java.io.InputStream;
@@ -33,7 +32,7 @@ import java.util.Properties;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Stream;
-import org.apache.commons.lang3.StringUtils;
+import org.apache.skywalking.oap.meter.analyzer.v2.MetricConvert;
import org.apache.skywalking.oap.meter.analyzer.v2.compiler.MALClassGenerator;
import org.apache.skywalking.oap.meter.analyzer.v2.dsl.Expression;
import org.apache.skywalking.oap.meter.analyzer.v2.dsl.ExpressionMetadata;
@@ -430,25 +429,15 @@ abstract class MALScriptComparisonBase {
}
// ---------------------------------------------------------------
- // Expression composition (replicates MetricConvert.formatExp)
+ // Expression composition — delegates to the real upstream MetricConvert.formatExp
// ---------------------------------------------------------------
static String formatExp(final String expPrefix,
final String expSuffix,
final String exp) {
- String ret = exp;
- if (!Strings.isNullOrEmpty(expPrefix)) {
- ret = String.format("(%s.%s)",
- StringUtils.substringBefore(exp, "."), expPrefix);
- final String after = StringUtils.substringAfter(exp, ".");
- if (!Strings.isNullOrEmpty(after)) {
- ret = String.format("(%s.%s)", ret, after);
- }
- }
- if (!Strings.isNullOrEmpty(expSuffix)) {
- ret = String.format("(%s).%s", ret, expSuffix);
- }
- return ret;
+ // Use the real formatExp so the composed text matches the precompiler's manifest key;
+ // a hand-rolled replica drifts when upstream changes expPrefix injection.
+ return MetricConvert.formatExp(expPrefix, expSuffix, exp);
}
// ---------------------------------------------------------------
diff --git a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MiniprogramAlipayLogMalTest.java b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MiniprogramAlipayLogMalTest.java
new file mode 100644
index 0000000..ce408c2
--- /dev/null
+++ b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MiniprogramAlipayLogMalTest.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.oap.server.graalvm.mal;
+
+import java.util.stream.Stream;
+import org.junit.jupiter.api.DynamicTest;
+import org.junit.jupiter.api.TestFactory;
+
+class MiniprogramAlipayLogMalTest extends MALScriptComparisonBase {
+ @TestFactory
+ Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
+ return generateComparisonTests("log-mal-rules/miniprogram-alipay.yaml");
+ }
+}
diff --git a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MiniprogramWechatLogMalTest.java b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MiniprogramWechatLogMalTest.java
new file mode 100644
index 0000000..7f6c83d
--- /dev/null
+++ b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MiniprogramWechatLogMalTest.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.oap.server.graalvm.mal;
+
+import java.util.stream.Stream;
+import org.junit.jupiter.api.DynamicTest;
+import org.junit.jupiter.api.TestFactory;
+
+class MiniprogramWechatLogMalTest extends MALScriptComparisonBase {
+ @TestFactory
+ Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
+ return generateComparisonTests("log-mal-rules/miniprogram-wechat.yaml");
+ }
+}
diff --git a/oap-graalvm-server/src/test/resources/precompiled-yaml-sha256.properties b/oap-graalvm-server/src/test/resources/precompiled-yaml-sha256.properties
index d36eae5..991763d 100644
--- a/oap-graalvm-server/src/test/resources/precompiled-yaml-sha256.properties
+++ b/oap-graalvm-server/src/test/resources/precompiled-yaml-sha256.properties
@@ -91,6 +91,15 @@ otel-rules/rocketmq/rocketmq-cluster.yaml=4cfbc1642552f70e7e99df4f4ce0c8054f9bf8
otel-rules/rocketmq/rocketmq-topic.yaml=2fe609352303233b966b3daa2b5c8321b3fb58d8bc074fc3cf9e45c56f1ab30d
otel-rules/vm.yaml=06e9b724ff12ac3ce6ddda23714e615c613efa79c58595aa75fa154562fb6850
otel-rules/windows.yaml=67eb82015020a4fb81f3f47d8b646757c14bc09848682b6449df00dcc58d9805
+# 11.0.0 sync: iOS (SWIP-11), mini-program (SWIP-12), Envoy AI Gateway MCP rules
+otel-rules/envoy-ai-gateway/gateway-mcp-service.yaml=a6b699b0145c7ab440451f34c69567fd6bed2afdaa6ede6ed9c01ec57dcc64ee
+otel-rules/envoy-ai-gateway/gateway-mcp-instance.yaml=7ca59ddf7d15bb2e0b7a853b6f0bf9890ee3835168dcbfb1c7f356e3b86db7a8
+otel-rules/ios/ios-metrickit.yaml=1fdc876eb82233f59a89fc21fac8ac181e00313e7b89b46b81bd7350d0b5d4de
+otel-rules/ios/ios-metrickit-instance.yaml=0ef42276beb614bcdd72c8e018207892d7878b160f847a99c965d124f4adedb4
+otel-rules/miniprogram/alipay-mini-program.yaml=31234fef0307efd627a3ab6992f880537bc1374e6a8fdc260f877a927a0e9063
+otel-rules/miniprogram/alipay-mini-program-instance.yaml=c09a1843c53b22fbefb6d8be8e05c1a29f1693c7d070c2b61655e0e113ebb5c4
+otel-rules/miniprogram/wechat-mini-program.yaml=8cd31c38b85fb08dc0ace3b7accf81dcb56a292a3f14883e0edad92d20fa4119
+otel-rules/miniprogram/wechat-mini-program-instance.yaml=273eba56e332f5bbf9ee9c868e9c89c311e3eb90ab4f20c44a65d0c2d4147c1e
# envoy-metrics-rules/
envoy-metrics-rules/envoy.yaml=724fd1bf14a6157b68c5b40499d9ede505c7fceec30146ba5a1822b7cb5e5c1f
@@ -105,3 +114,5 @@ zabbix-rules/agent.yaml=8f66cd64781491734db494c0fc55d7433ea2cc282d0af2cade3b4e7e
# log-mal-rules/
log-mal-rules/nginx.yaml=1fcda877ee3e3fb0991e2270e50abf04d44298d316ffd84159022b96056480d1
log-mal-rules/placeholder.yaml=b8c5f42252d41838031a9ceb389a7b6afc855077871707bdbb45a936924af982
+log-mal-rules/miniprogram-wechat.yaml=aa8dc5cc3cfe7b33444e9cc37bc60fcc78906dd7bf4033ef79e246c4267ff6d2
+log-mal-rules/miniprogram-alipay.yaml=1762445e3e9793ec6e5ae23fd9a6a6aa94833e0bf607f7b702f27ec8d18c60c9
diff --git a/oap-graalvm-server/src/test/resources/provider-inventory.properties b/oap-graalvm-server/src/test/resources/provider-inventory.properties
index 021218e..3a813d5 100644
--- a/oap-graalvm-server/src/test/resources/provider-inventory.properties
+++ b/oap-graalvm-server/src/test/resources/provider-inventory.properties
@@ -91,7 +91,6 @@ provider.org.apache.skywalking.oap.query.graphql.GraphQLQueryProvider = ACCEPTED
provider.org.apache.skywalking.oap.query.zipkin.ZipkinQueryProvider = ACCEPTED
provider.org.apache.skywalking.oap.query.promql.PromQLProvider = ACCEPTED
provider.org.apache.skywalking.oap.query.logql.LogQLProvider = ACCEPTED
-provider.org.apache.skywalking.oap.query.debug.StatusQueryProvider = ACCEPTED
provider.org.apache.skywalking.oap.query.traceql.TraceQLProvider = NOT_ACCEPTED
# --- Alarm ---
@@ -106,5 +105,17 @@ provider.org.apache.skywalking.oap.server.health.checker.provider.HealthCheckerP
# --- AI Pipeline ---
provider.org.apache.skywalking.oap.server.ai.pipeline.AIPipelineProvider = ACCEPTED
+# --- Admin server family (11.0.0+) ---
+# admin-server hosts the operator REST surface; status/inspect/ui-management mount onto it.
+provider.org.apache.skywalking.oap.server.admin.server.module.AdminServerModuleProvider = ACCEPTED
+provider.org.apache.skywalking.oap.server.admin.status.StatusModuleProvider = ACCEPTED
+provider.org.apache.skywalking.oap.server.admin.inspect.InspectModuleProvider = ACCEPTED
+provider.org.apache.skywalking.oap.server.admin.uimanagement.UIManagementModuleProvider = ACCEPTED
+# dsl-debugging and runtime-rule require runtime Javassist codegen, impossible under a
+# closed-world native image. Excluded; their endpoints return a friendly 501 via
+# UnsupportedAdminFeatureModule (graalvm.admin package).
+provider.org.apache.skywalking.oap.server.admin.dsl.debugging.module.DSLDebuggingModuleProvider = NOT_ACCEPTED
+provider.org.apache.skywalking.oap.server.receiver.runtimerule.module.RuntimeRuleModuleProvider = NOT_ACCEPTED
+
# --- Tools (not production) ---
provider.org.apache.skywalking.module.DataGeneratorModuleProvider = NOT_ACCEPTED
diff --git a/oap-graalvm-server/src/test/resources/replacement-source-sha256.properties b/oap-graalvm-server/src/test/resources/replacement-source-sha256.properties
index 8229f9b..b1754aa 100644
--- a/oap-graalvm-server/src/test/resources/replacement-source-sha256.properties
+++ b/oap-graalvm-server/src/test/resources/replacement-source-sha256.properties
@@ -24,15 +24,15 @@
# --- server-core-for-graalvm ---
# OAL manifest loader (replaces Javassist runtime generation)
-skywalking/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/oal/rt/OALEngineLoaderService.java = 32c4554a851e4faa93f87a8278e3d869139cb4188edf8026d7556ea7b9bce93c
+skywalking/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/oal/rt/OALEngineLoaderService.java = c830ad448549431dd4906009658784f992b28ff98cc9cfaf1521273cf29adf91
# Annotation manifest loader (replaces Guava ClassPath scan)
skywalking/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/annotation/AnnotationScan.java = 06fc9cbedca66ad0d79ef1bd08bcb58113e6cfabb629098815c649b9f56ec9a5
# Dispatcher manifest loader (replaces Guava ClassPath scan)
skywalking/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/SourceReceiverImpl.java = 3f0ad755a6d02666ad468c9d8c65fcc02d490507b59dfb6235fe2a5b9a070a20
# MeterFunction manifest loader (replaces Guava ClassPath scan + Javassist)
-skywalking/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/MeterSystem.java = fea99b625841e20e0fc5c13f43dd19ce8939ceac546a4bbc805592bca5e3961d
+skywalking/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/MeterSystem.java = e4a61193aa3d8369315d862f335c5842f5b28cdcdce4dbf732dc624529627ade
# Added @Setter at class level
-skywalking/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleConfig.java = f17b294a952670c00ef0b26059cc7fdf458ced0861c5c00210594ba4953edf30
+skywalking/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleConfig.java = 1e8a06f04c035619fa601022a04fa1c052f47ed6849bf4aad1e5e88fe26851fb
# Java-backed closures instead of GroovyShell
skywalking/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/HierarchyDefinitionService.java = 66df4f116946217750f99a595cec4fed32aabe944dd63541f9d51970d34d7389
skywalking/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/hierarchy/HierarchyService.java = a5b899e9a47c1ddff8551264a3ff22b083c35a57698701632a590489bf488739
@@ -41,19 +41,19 @@ skywalking/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server
# --- meter-analyzer-for-graalvm ---
# MAL DSL v2: loads pre-compiled MalExpression from per-file manifests
-skywalking/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/dsl/DSL.java = 6b79a24876fbbdc8e8e85b0581351d7bcccc85e664337fe8ce55b5f093bdaa67
+skywalking/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/dsl/DSL.java = df9f0b817b81d3b63b362b80ffee80830efcd31f006c2845bb14ac19aecb5b01
# MAL filter v2: loads pre-compiled MalFilter from v2 manifest
-skywalking/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/dsl/FilterExpression.java = 0cb851af2f34ab6de9b688e20780048992763e528c65a3e8b6b571dd8f63e1f0
+skywalking/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/dsl/FilterExpression.java = bdbee1d0fe02071337f692d168cb4b5be4e7f58e67bbfa548cb3429581ca0d90
# Config loader: load from JSON manifests instead of filesystem YAML
-skywalking/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/prometheus/rule/Rules.java = 4ec7f1352d62f6c939440dff97b86fe6c326761be9aa9bbafa50718b6b760a86
+skywalking/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/prometheus/rule/Rules.java = beb2d23294602a279ca7253404436d256facd9541233fe0dc9edcb3501a986dd
# --- log-analyzer-for-graalvm ---
# LAL DSL v2: loads pre-compiled LalExpression from v2 manifest
-skywalking/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/dsl/DSL.java = 1542d8d2e3ace50eb83298da39904e13b13e1b7cb10d31da3f654ba5edf365a7
+skywalking/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/dsl/DSL.java = 3d6e4172055d3e7eaa8bc18eb5ad6b702938bd16985832fd02c89cea69b6a2fa
# Added @Setter at class level
skywalking/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/provider/LogAnalyzerModuleConfig.java = 91335e7fbfb452a3522d01c3c1498d954028842c038b7d77233547c36586d0de
# Config loader: load from JSON manifests instead of filesystem YAML
-skywalking/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/provider/LALConfigs.java = 2f3a31186a2eb7da6b49f764ad1322a50f70e926375acc17ac3205ba954e8dd8
+skywalking/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/provider/LALConfigs.java = ab2612676e5ab826f30efe7d140e9405ccbf4d7e377c5bd9088ea840f635a0a0
# --- agent-analyzer-for-graalvm ---
# Added @Setter at class level
@@ -81,5 +81,4 @@ skywalking/oap-server/server-receiver-plugin/otel-receiver-plugin/src/main/java/
skywalking/oap-server/server-receiver-plugin/skywalking-ebpf-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/ebpf/provider/EBPFReceiverModuleConfig.java = 2318e388dab8205280b25d92c1ec4271caf2ba2966c1791a309c800935afaf34
skywalking/oap-server/server-receiver-plugin/aws-firehose-receiver/src/main/java/org/apache/skywalking/oap/server/receiver/aws/firehose/AWSFirehoseReceiverModuleConfig.java = aef19babbeece9dbd90131e23699768c0f336b354dff75a7bd7b7b2fb8add592
skywalking/oap-server/server-fetcher-plugin/cilium-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/fetcher/cilium/CiliumFetcherConfig.java = f1872663b062cb6832cdc1abdcf1030175e98ecc363c5208cd045058da53bc53
-skywalking/oap-server/server-query-plugin/status-query-plugin/src/main/java/org/apache/skywalking/oap/query/debug/StatusQueryConfig.java = 1aa61fd4b7704481f2f4c9c36947e8388e546625aefd2fd3defc65282af9dce7
skywalking/oap-server/server-health-checker/src/main/java/org/apache/skywalking/oap/server/health/checker/provider/HealthCheckerConfig.java = 76ddf18b1b59584e3ff406545c03e6772a25d2bea316248b72f38ba2c8f61f15
diff --git a/oap-graalvm-server/src/test/resources/rule-file-inventory.properties b/oap-graalvm-server/src/test/resources/rule-file-inventory.properties
index 97fb84e..4d37403 100644
--- a/oap-graalvm-server/src/test/resources/rule-file-inventory.properties
+++ b/oap-graalvm-server/src/test/resources/rule-file-inventory.properties
@@ -46,7 +46,7 @@ meter-analyzer-config/satellite.yaml = ACCEPTED
meter-analyzer-config/spring-micrometer.yaml = ACCEPTED
meter-analyzer-config/threadpool.yaml = ACCEPTED
-# --- otel-rules (49 files) ---
+# --- otel-rules (57 files) ---
otel-rules/activemq/activemq-broker.yaml = ACCEPTED
otel-rules/activemq/activemq-cluster.yaml = ACCEPTED
otel-rules/activemq/activemq-destination.yaml = ACCEPTED
@@ -102,12 +102,22 @@ otel-rules/rocketmq/rocketmq-cluster.yaml = ACCEPTED
otel-rules/rocketmq/rocketmq-topic.yaml = ACCEPTED
otel-rules/envoy-ai-gateway/gateway-instance.yaml = ACCEPTED
otel-rules/envoy-ai-gateway/gateway-service.yaml = ACCEPTED
+otel-rules/envoy-ai-gateway/gateway-mcp-instance.yaml = ACCEPTED
+otel-rules/envoy-ai-gateway/gateway-mcp-service.yaml = ACCEPTED
+otel-rules/ios/ios-metrickit.yaml = ACCEPTED
+otel-rules/ios/ios-metrickit-instance.yaml = ACCEPTED
+otel-rules/miniprogram/alipay-mini-program.yaml = ACCEPTED
+otel-rules/miniprogram/alipay-mini-program-instance.yaml = ACCEPTED
+otel-rules/miniprogram/wechat-mini-program.yaml = ACCEPTED
+otel-rules/miniprogram/wechat-mini-program-instance.yaml = ACCEPTED
otel-rules/vm.yaml = ACCEPTED
otel-rules/windows.yaml = ACCEPTED
-# --- log-mal-rules (2 files) ---
+# --- log-mal-rules (4 files) ---
log-mal-rules/nginx.yaml = ACCEPTED
log-mal-rules/placeholder.yaml = ACCEPTED
+log-mal-rules/miniprogram-wechat.yaml = ACCEPTED
+log-mal-rules/miniprogram-alipay.yaml = ACCEPTED
# --- envoy-metrics-rules (2 files) ---
envoy-metrics-rules/envoy.yaml = ACCEPTED
@@ -119,12 +129,14 @@ telegraf-rules/vm.yaml = ACCEPTED
# --- zabbix-rules (1 file) ---
zabbix-rules/agent.yaml = ACCEPTED
-# --- LAL (9 files) ---
+# --- LAL (11 files) ---
lal/default.yaml = ACCEPTED
lal/envoy-ai-gateway.yaml = ACCEPTED
lal/envoy-als.yaml = ACCEPTED
+lal/ios-metrickit.yaml = ACCEPTED
lal/k8s-service.yaml = ACCEPTED
lal/mesh-dp.yaml = ACCEPTED
+lal/miniprogram.yaml = ACCEPTED
lal/mysql-slowsql.yaml = ACCEPTED
lal/nginx.yaml = ACCEPTED
lal/pgsql-slowsql.yaml = ACCEPTED
diff --git a/oap-libs-for-graalvm/log-analyzer-for-graalvm/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/dsl/DSL.java b/oap-libs-for-graalvm/log-analyzer-for-graalvm/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/dsl/DSL.java
index 56714ba..a6639c3 100644
--- a/oap-libs-for-graalvm/log-analyzer-for-graalvm/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/dsl/DSL.java
+++ b/oap-libs-for-graalvm/log-analyzer-for-graalvm/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/dsl/DSL.java
@@ -25,6 +25,7 @@ import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
+import javassist.ClassPool;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -73,6 +74,20 @@ public class DSL {
return of(moduleManager, config, dsl, inputType, outputType, ruleName, null);
}
+ // Runtime-rule overload (upstream signature). We load the pre-compiled LalExpression by rule
+ // name, so pool/targetClassLoader are ignored; runtime-rule hot-update is unsupported (501).
+ public static DSL of(final ModuleManager moduleManager,
+ final LogAnalyzerModuleConfig config,
+ final String dsl,
+ final Class<?> inputType,
+ final Class<?> outputType,
+ final String ruleName,
+ final String yamlSource,
+ final ClassPool pool,
+ final ClassLoader targetClassLoader) throws ModuleStartException {
+ return of(moduleManager, config, dsl, inputType, outputType, ruleName, yamlSource);
+ }
+
public static DSL of(final ModuleManager moduleManager,
final LogAnalyzerModuleConfig config,
final String dsl,
diff --git a/oap-libs-for-graalvm/meter-analyzer-for-graalvm/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/dsl/DSL.java b/oap-libs-for-graalvm/meter-analyzer-for-graalvm/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/dsl/DSL.java
index 4421acb..0f38ede 100644
--- a/oap-libs-for-graalvm/meter-analyzer-for-graalvm/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/dsl/DSL.java
+++ b/oap-libs-for-graalvm/meter-analyzer-for-graalvm/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/dsl/DSL.java
@@ -26,6 +26,7 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicInteger;
+import javassist.ClassPool;
import lombok.extern.slf4j.Slf4j;
/**
@@ -88,6 +89,16 @@ public final class DSL {
}
}
+ // Runtime-rule overload (upstream signature). We load the pre-compiled class by expression
+ // text, so pool/targetClassLoader are ignored; runtime-rule hot-update is unsupported (501).
+ public static Expression parse(final String metricName,
+ final String expression,
+ final String yamlSource,
+ final ClassPool pool,
+ final ClassLoader targetClassLoader) {
+ return parse(metricName, expression, yamlSource);
+ }
+
/**
* Look up a pre-compiled filter class by its literal expression text.
* Called by {@link FilterExpression} to load filter classes from the
diff --git a/oap-libs-for-graalvm/meter-analyzer-for-graalvm/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/dsl/FilterExpression.java b/oap-libs-for-graalvm/meter-analyzer-for-graalvm/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/dsl/FilterExpression.java
index c449ec4..bc4a5a0 100644
--- a/oap-libs-for-graalvm/meter-analyzer-for-graalvm/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/dsl/FilterExpression.java
+++ b/oap-libs-for-graalvm/meter-analyzer-for-graalvm/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/dsl/FilterExpression.java
@@ -21,6 +21,7 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;
+import javassist.ClassPool;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
@@ -73,6 +74,16 @@ public class FilterExpression {
}
}
+ // Runtime-rule overload (upstream signature). We load the pre-compiled filter by literal,
+ // so pool/targetClassLoader are ignored; runtime-rule hot-update is unsupported (501).
+ public FilterExpression(final String literal,
+ final String filterNameHint,
+ final String yamlSource,
+ final ClassPool pool,
+ final ClassLoader targetClassLoader) {
+ this(literal, filterNameHint, yamlSource);
+ }
+
public Map<String, SampleFamily> filter(final Map<String, SampleFamily> sampleFamilies) {
try {
final Map<String, SampleFamily> result = new HashMap<>();
diff --git a/oap-libs-for-graalvm/pom.xml b/oap-libs-for-graalvm/pom.xml
index b81b187..6d9a6e7 100644
--- a/oap-libs-for-graalvm/pom.xml
+++ b/oap-libs-for-graalvm/pom.xml
@@ -45,7 +45,6 @@
<module>ebpf-receiver-for-graalvm</module>
<module>aws-firehose-receiver-for-graalvm</module>
<module>cilium-fetcher-for-graalvm</module>
- <module>status-query-for-graalvm</module>
<module>health-checker-for-graalvm</module>
<module>server-starter-for-graalvm</module>
</modules>
diff --git a/oap-libs-for-graalvm/server-core-for-graalvm/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleConfig.java b/oap-libs-for-graalvm/server-core-for-graalvm/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleConfig.java
index 18cb990..68c7b63 100644
--- a/oap-libs-for-graalvm/server-core-for-graalvm/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleConfig.java
+++ b/oap-libs-for-graalvm/server-core-for-graalvm/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleConfig.java
@@ -225,11 +225,6 @@ public class CoreModuleConfig extends ModuleConfig {
*/
private int maxHttpUrisNumberPerService = 3000;
- /**
- * The UI menu should activate fetch interval, default 20s
- */
- private int uiMenuRefreshInterval = 20;
-
/**
* The service cache refresh interval, default 10s
*/
diff --git a/oap-libs-for-graalvm/status-query-for-graalvm/pom.xml b/oap-libs-for-graalvm/status-query-for-graalvm/pom.xml
deleted file mode 100644
index c40a831..0000000
--- a/oap-libs-for-graalvm/status-query-for-graalvm/pom.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?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>
-
- <parent>
- <groupId>org.apache.skywalking</groupId>
- <artifactId>oap-libs-for-graalvm</artifactId>
- <version>0.4.0-SNAPSHOT</version>
- </parent>
-
- <artifactId>status-query-for-graalvm</artifactId>
- <name>Status Query for GraalVM</name>
- <description>Repackaged status-query-plugin with GraalVM-compatible config</description>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.skywalking</groupId>
- <artifactId>status-query-plugin</artifactId>
- </dependency>
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-shade-plugin</artifactId>
- <configuration>
- <artifactSet>
- <includes>
- <include>org.apache.skywalking:status-query-plugin</include>
- </includes>
- </artifactSet>
- <filters>
- <filter>
- <artifact>org.apache.skywalking:status-query-plugin</artifact>
- <excludes>
- <exclude>org/apache/skywalking/oap/query/debug/StatusQueryConfig.class</exclude>
- </excludes>
- </filter>
- </filters>
- </configuration>
- </plugin>
- </plugins>
- </build>
-</project>
diff --git a/oap-libs-for-graalvm/status-query-for-graalvm/src/main/java/org/apache/skywalking/oap/query/debug/StatusQueryConfig.java b/oap-libs-for-graalvm/status-query-for-graalvm/src/main/java/org/apache/skywalking/oap/query/debug/StatusQueryConfig.java
deleted file mode 100644
index 6b5a2c6..0000000
--- a/oap-libs-for-graalvm/status-query-for-graalvm/src/main/java/org/apache/skywalking/oap/query/debug/StatusQueryConfig.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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.query.debug;
-
-import lombok.Getter;
-import lombok.Setter;
-import org.apache.skywalking.oap.server.library.module.ModuleConfig;
-
-/**
- * GraalVM replacement for upstream StatusQueryConfig.
- * Original: skywalking/oap-server/server-query-plugin/status-query-plugin/src/main/java/.../debug/StatusQueryConfig.java
- * Repackaged into status-query-for-graalvm via maven-shade-plugin (replaces original .class in shaded JAR).
- *
- * Change: Added @Setter at class level. Upstream only has @Getter.
- * Why: Enables YamlConfigLoaderUtils to set config fields via Lombok setters instead of
- * reflection (Field.setAccessible + field.set), which requires reflect-config.json in GraalVM native image.
- */
-@Getter
-@Setter
-public class StatusQueryConfig extends ModuleConfig {
- /**
- * Include the list of keywords to filter configurations including secrets. Separate keywords by a comma.
- *
- * @since 9.7.0
- */
- private String keywords4MaskingSecretsOfConfig = "user,password,token,accessKey,secretKey,authentication";
-}
diff --git a/pom.xml b/pom.xml
index 8f16361..433df03 100644
--- a/pom.xml
+++ b/pom.xml
@@ -34,7 +34,7 @@
<maven.compiler.release>25</maven.compiler.release>
<!-- Injected by Makefile from skywalking submodule's <revision> property.
Do not hardcode — always build via `make`. -->
- <skywalking.version>10.4.0</skywalking.version>
+ <skywalking.version>11.0.0-SNAPSHOT</skywalking.version>
<graalvm.version>25.0.0</graalvm.version>
<graalvm.buildtools.version>0.10.4</graalvm.buildtools.version>
<lombok.version>1.18.40</lombok.version>
@@ -315,9 +315,28 @@
<artifactId>zipkin-query-plugin</artifactId>
<version>${skywalking.version}</version>
</dependency>
+ <!-- Admin server family (11.0.0+): admin-host + native-safe feature modules.
+ status (relocated from status-query-plugin), inspect, ui-management.
+ runtime-rule + dsl-debugging are intentionally NOT wired (runtime Javassist
+ codegen is impossible under native image); their endpoints are stubbed. -->
<dependency>
<groupId>org.apache.skywalking</groupId>
- <artifactId>status-query-plugin</artifactId>
+ <artifactId>admin-server</artifactId>
+ <version>${skywalking.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.skywalking</groupId>
+ <artifactId>status</artifactId>
+ <version>${skywalking.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.skywalking</groupId>
+ <artifactId>inspect</artifactId>
+ <version>${skywalking.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.skywalking</groupId>
+ <artifactId>ui-management</artifactId>
<version>${skywalking.version}</version>
</dependency>
diff --git a/skywalking b/skywalking
index b272da3..ad73355 160000
--- a/skywalking
+++ b/skywalking
@@ -1 +1 @@
-Subproject commit b272da3cc196c2455bf86e911c427d302f68b950
+Subproject commit ad733554b0273d6165eff7bae4150df83d49ebe8
diff --git a/test/e2e/script/env b/test/e2e/script/env
index 5bfde37..69b17ba 100644
--- a/test/e2e/script/env
+++ b/test/e2e/script/env
@@ -16,16 +16,18 @@
# Pre-built images from ghcr.io/apache/skywalking and ghcr.io/apache/skywalking-java.
# Update when syncing the skywalking submodule.
SW_AGENT_JAVA_COMMIT=ac0df43d7140e726eba9e5e5b1b75cf364c71dff
-SW_BANYANDB_COMMIT=d0f41f9ad139c917c1398c2e62a9f7034214495f
+SW_BANYANDB_COMMIT=84b919efca3fee3d51df9e97a734a9f10ae6f1d2
SW_CTL_COMMIT=9a1beab08413ce415a00a8547a238a14691c5655
-SW_KUBERNETES_COMMIT_SHA=6fe5e6f0d3b7686c6be0457733e825ee68cb9b35
+SW_KUBERNETES_COMMIT_SHA=da0e267f877b9b8e5f7728ae4ea7dc7723a2a073
-# Last upstream commit with ghcr.io images published (commit before release prep).
-# Release tags publish to Docker Hub, not ghcr.io, so we use the prior CI commit.
+# UI image pin for the istio-als e2e test (ghcr.io/apache/skywalking/ui:<sha>).
+# NOT bumped to the synced submodule commit ad733554b0: 11.0.0 dropped the bundled UI,
+# so ghcr.io/apache/skywalking/ui is no longer published at recent commits. Kept at the
+# last commit whose UI image exists. The pins below track the sync.
SW_UPSTREAM_COMMIT=f79451d3de23edb15277f5b6e315dc6779e73e1f
-# Last upstream commit that touched test/e2e-v2/java-test-service/
-SW_E2E_SERVICE_COMMIT=f79451d3de23edb15277f5b6e315dc6779e73e1f
+# Last upstream commit that touched test/e2e-v2/java-test-service/ (image must be published)
+SW_E2E_SERVICE_COMMIT=7754e3ec3646f8fe965507b0d7618cc34c95742e
# OTEL collector version for infrastructure monitoring tests
OTEL_COLLECTOR_VERSION=0.102.1