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 <[email protected]> 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
