You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Sync SkyWalking submodule to the upstream v11.1.0 release tag (d34eff29ba), via 476afadecd, 456199a1f8, 5484b9693e, f4d38fdc21 and 763d149d46.
Sync SkyWalking submodule to upstream master 476afadecd (11.1.0-SNAPSHOT), 13 commits past the v11.0.0 tag.
Wire the two new analyzer modules: ai-evaluation (SWIP-16 LLM-as-judge over sampled GenAI spans; disabled by default, configured through the new config/ai-evaluation.yml) and ai-agent-conversation (AI agent conversations landed by the AI Sessionizer; on by default because the GraphQL query module requires it, turned off with its none provider).
Adopt every rule file upstream added or changed: lal/ai-agent.yaml (ConversationFile output builder), meter-analyzer-config/gen-ai-model.yaml (judge scores), otel-rules/ai-agent/runtime-{instance,service}.yaml, otel-rules/banyandb/banyandb-trace-sampling.yaml, and the AI-evaluation counters in otel-rules/oap.yaml — all enabled with the upstream defaults.
Mirror the new application.yml sections and defaults, and pick up upstream's BanyanDB credential / trust-CA hot reload (secretsManagementFile), the recordsAIAgent BanyanDB group, the Zipkin cold-stage query, and the ports opening once boot completes (ModuleProvider#notifyBootCompleted, which the fixed module manager reaches through BootstrapFlow).
Sync SkyWalking submodule to upstream master 456199a1f8 (11.1.0-SNAPSHOT), 47 commits past 476afadecd.
Sync SkyWalking submodule to upstream master 5484b9693e (11.1.0-SNAPSHOT), 3 commits past 456199a1f8: the shipped TAL rule counts a CONSUMER receive span that has a parent, the .NET Kafka instrumentation's only record of a message, as the consumer's request (a root CONSUMER receive and any CLIENT receive are still dropped), the OpenTelemetry Trace practices page is split into otlp-trace-practices/, and the CA-rotation e2e case is rewritten.
Sync SkyWalking submodule to upstream master f4d38fdc21 (11.1.0-SNAPSHOT), 1 commit past 5484b9693e: server clusters (apache/skywalking#14183). server-clusters.yml, and its dynamic configuration item core.default.serverClusters, name a message broker, database or cache that clients reach at several addresses as one service. The native trace analysis renames such peers (recompiled, the distro replaces none of the listeners), and on the OTLP path the new TAL function findServerClusterName(address[, kind]) does, which the shipped otlp-general and otlp-slow-sql rules call. The shipped otlp-general rule also reads messaging.system.name before messaging.system, reads aws_sqs / aws_sns as aws.sqs / aws.sns, and drops a CLIENT settle span as it drops a CLIENT receive.
Sync SkyWalking submodule to upstream master 763d149d46 (11.1.0-SNAPSHOT), 2 commits past f4d38fdc21, tests and docs only: the BanyanDB rotation e2e hardening the distro's cases mirror (apache/skywalking#14184), and README / CONTRIBUTING wording (apache/skywalking#14185).
Sync SkyWalking submodule to the v11.1.0 tag (d34eff29ba), 6 commits past 763d149d46: HTTP alarm hook delivery self-observability (alarm_http_delivery_total, alarm_http_delivery_status_total and alarm_http_delivery_latency_seconds on telemetry.prometheus; the alarm module now requires the telemetry module, which the distro always wires), with three new otel-rules/oap.yaml rules adopted and enabled as upstream; the TraceQL All wildcard on status and kind; and the dependency bumps that clear CVE alerts on the shipped jars (jackson 2.18.12, guava 33.7.2-jre, micrometer 1.16.8, log4j 2.25.5, freemarker 2.3.35, netty 4.2.19.Final, lz4-java 1.11.4, snappy-java 1.1.10.12). The distro pins none of these itself, so the native image ships the upstream versions, and the binary LICENSE comes from upstream's refreshed dist-material.
TAL (Trace Analysis Language) on the native image. Wire upstream's new trace-analyzer module (on by default, SW_TRACE_ANALYZER=- removes it) and pre-compile its rules like LAL: the precompiler compiles tal/otlp-general.yaml (otlp-general, otlp-slow-sql) with TALClassGenerator, generates the 28 otlp_* meter classes through the build-time MeterSystem, and writes tal-v2-rules.txt (class, input type and metric declarations per tal/<file>.yaml:<line>) plus config-data/tal.json. The new trace-analyzer-for-graalvm module replaces TalDSL (loads the pre-compiled class, then claims and creates its metrics, limitLabels included) and TALConfigs (JSON instead of tal/*.yaml); upstream's SpanFilterListener, pairing and receiver path run unchanged.
Adopt every rule file upstream added or changed: otel-rules/ai-agent/mcp_endpoint.yaml, OpenTelemetry-native host and process monitoring (otel-rules/process-hostmetrics-{linux,windows}.yaml, reworked vm.yaml / windows.yaml), the Kafka, RabbitMQ, PostgreSQL, MySQL, Kong, APISIX, Zabbix and AI agent rule fixes, and oal/mesh.oal — all enabled with the upstream defaults.
Mirror the new application.yml options: native OTLP trace storage (otlpTraceStorage: otlp is the new default; zipkin keeps the converted path), OTLP service grouping, searchable tags, head sampling and rate cap, the TraceQL /otlp datasource, the Kubernetes metadata read settings, the alarm hooks' httpTimeout, and the renamed ai-agent-conversation read windows plus hide.
TAL rules are user-editable, so the pre-compilation is generic: every tal/*.yaml is compiled, whatever it declares (any metric function, labeled metrics with their labelLimit, percentile buckets / ranks, inline layerDefinitions used across files, alias or class-name input and output types), the SPI providers and builders are discovered rather than listed, any file name works as upstream takes it (two files sharing a stem fail the build), and the runtime loads only the class compiled from exactly the inputs it is given (coordinates, name, DSL text, input and output type, metric prefix: flow-style YAML can put two rules on one line). Files are installed in upstream's order, which decides which rule runs first on a span.
The pre-compiled LAL and TAL rule manifests are written with Properties escapes in UTF-8 and read the same way, so a rule or file name with non-ASCII characters, backslashes or leading spaces loads as written.
GraalVM Native Image Compatibility
Embed every query-protocol/*.graphqls schema with one glob instead of a per-file list; upstream's new gen-ai-evaluation-record and ai-agent-conversation schemas were missing and the native OAP died at boot.
The precompiler's Armeria scan collects @Decorator targets (the AI agent conversation view's CompressResponse): Armeria instantiates them reflectively, and without the metadata the native OAP died at boot with "cannot inject the dependency".
Register the admin-server family's Jackson response POJOs (org.apache.skywalking.oap.server.admin.*.response.*) for reflection: /inspect/* answered HTTP 400 (No serializer found for class ...MetricsResponse) in the native image since the 11.0.0 sync.
Register the protobuf descriptor closure of the OTLP/HTTP JSON receivers' Export{Logs,Metrics,Trace}ServiceRequest and of LogData (parsed by ProtoBufJsonUtils): OTLP/HTTP JSON requests failed natively with Generated message class ... missing method getResourceLogsList.
Register the ConversationFile LAL output builder for reflection, regenerate the config loaders (AIEvaluationConfig, AIAgentConversationConfig, BanyanDBStorageConfig$RecordsAIAgent), and package ai-evaluation.yml in both distributions.
Port upstream's MeterSystem#limitLabels into both MeterSystem replacements, the five Kubernetes metadata settings into CoreModuleConfig, and the OTLP storage / grouping / sampling settings and helpers into OtelMetricReceiverConfig; regenerate the config loaders (TraceAnalyzerModuleConfig, the new AlarmModuleConfig, BanyanDBStorageConfig$OtlpTrace, TraceQL and AI agent conversation fields).
Retire the HttpAlarmCallback replacement: upstream now injects the HttpClient through the constructor, so the static field the replacement worked around is gone, and the old replacement would have broken the new hook constructors.
Register for reflection the TAL expression and meter classes, TALConfigs / TALConfig / LayerDefinition, every input type, input provider and output builder the TAL rules resolve through, and PairingFact (TAL pairing halves cross OAP nodes as stream data and are rebuilt with newInstance()) and SpanMetadata, both of which a rule's toJson() hands to Gson, together with the protobuf runtime classes Gson walks when a rule passes it the span itself; a native probe rule calling toJson(meta) and toJson(span) returns the same JSON as the JVM OAP.
Register the protobuf descriptor closure of ExportTraceServiceResponse (now JSON-printed by the OTLP/HTTP trace receiver) and Tempo's TraceByIDResponse (JSON-printed by the TraceQL /otlp trace-by-id route).
Register the status module's Debugging*Rsp DTOs (trace, OTLP, Zipkin, log, MQE, topology): /debugging/* serializes them to YAML through Jackson, and none were covered — a pre-existing gap since the 11.0.0 relocation, plus the new OTLP debug-trace endpoints.
Bundle ios-analyzer: the distro never shipped it, so the iOS HTTP and MetricKit span listeners (SWIP-11, since 11.0.0) did not run and an iOS app's service_cpm, endpoint and instance traffic stayed empty; the iOS MAL and LAL rules worked, which hid the gap. Every other upstream server-starter dependency the distro leaves out is excluded by policy (other cluster, configuration and storage plugins, runtime-rule).
Reflection metadata for three JSON paths no e2e case reached: the admin /status/cluster/nodes answer (core Address, HTTP 500 without it), the /status/alarm/* answers (the core.alarm.provider.status classes Gson prints and parses, {} without them) and the AWS Firehose receiver's request and answer (FirehoseReq, RequestData, FirehoseRes; every post answered 400 without them).
Package server-clusters.yml (empty, as upstream ships it) in both distributions and embed it as a native-image resource beside gateways.yml; ServerClusterConfig parses it with SnakeYAML's SafeConstructor into plain maps and lists, so it needs no reflection metadata.
Register the UI template REST bodies (DashboardSetting, DashboardConfiguration, TemplateChangeStatus) for reflection: they lost their metadata when upstream removed ui-configuration.graphqls in 11.0.0, so on 0.4.0 POST / PUT /ui-management/templates failed natively (MissingReflectionRegistrationError on the DashboardSetting constructor).
Documentation
Document the new modules in distro-policy.md and configuration.md (new ai-evaluation / ai-agent-conversation sections; refreshed lalFiles, malFiles and meterAnalyzerActiveFiles defaults), refresh the build-time counts, list server-clusters.yml among the config/ files in distro-policy.md, move the version-mapping.md dev row to 0.5.0-SNAPSHOT and add 0.4.0 → 11.0.0, and record the native-image pitfalls in the sync skill.
Document TAL in distro-policy.md, internals/dsl-immigration.md and CLAUDE.md (five DSLs; TAL rules are not live-debuggable because upstream emits no TAL probes), the new trace-analyzer and traceQL sections and refreshed receiver-otel, core, alarm and ai-agent-conversation tables in configuration.md, and refresh the build-time counts.
Correct the TLS docs: supported-features.md and the FAQ still called gRPC TLS unsupported, which 0.3.0 fixed with the JDK-provider DynamicSslContext. They now list what the native image serves: agent gRPC TLS, receiver gRPC TLS and mTLS, REST HTTPS, OAP-to-BanyanDB TLS.
Testing
OapTest feeds the alarm_http_delivery_* families of the three new otel-rules/oap.yaml rules.
Add MAL comparison tests for the AI agent runtime, BanyanDB trace-sampling and gen-ai-model rules and a LAL pre-compilation test for ai-agent.yaml; OapTest feeds the new ai_evaluation_* families; the provider / rule inventories and the precompiled-YAML staleness baseline track the new files.
TALRecordedTraceComparisonTest runs the shipped TAL rules over upstream's recorded OpenTelemetry Demo trace, plus calls the recording lacks (a slow MySQL call, a Kafka message sent and consumed, an aws_sqs send, a RabbitMQ settle and a Redis call to a node list) with server clusters listing the MySQL, Kafka and Redis addresses, through a fresh TALClassGenerator compile and through the pre-compiled classes loaded by the replacement TalDSL, cold and warm alias cache, and requires identical metric values, traffic rows, alias rows and slow-statement records, and that every cluster is named on the way; TALPrecompiledRuleTest checks the config-data coordinates and that the replacement creates exactly the metrics a fresh compile declares.
MAL comparison tests for mcp_endpoint and both process-hostmetrics files; ImmigrationScopeTest also scans tal/; the provider / rule inventories, the replacement-source and precompiled-YAML baselines track the new and changed files; TraceQLProvider is marked ACCEPTED in the provider inventory, matching the startup wiring and AcceptedModules.
TALPrecompileTest (precompiler) compiles operator-style TAL fixtures through the distro's pass and checks the manifests and the build failures; TALDocScriptsTest extracts the scripts of upstream's tal.md and practice pages (otlp-trace-practices/gateway-{overview,canary,nginx}.md, database-and-cache.md, message-queue.md), splices or substitutes each practice into a copy of the shipped rule where the page says, compiles them and the shipped rule through the same pass and runs the classes the manifest names (address-named peers, gateway peer attribute, both canary setups, nginx as a one-span proxy by name and by tag, server clusters renamed only for the system their kinds list, on a ServerClusterConfig holding the pages' own clusters: YAML); TalDSLManifestTest pins the reader side. The server TAL tests iterate every file under tal/ and dispatch spans by layer as upstream does. Precompiler test classes run in JVMs of their own, since the build-time MeterSystem and Javassist pool are JVM-wide.
E2E Tests
New cases: ai-agent (AI Sessionizer files over OTLP logs, the asz.view document equal to the Sessionizer's own, list / filter / raw-file / metrics checks), banyandb-trace-sampling (a plugin-capable BanyanDB running the sampler chain), and banyandb-auth-rotation / banyandb-ca-rotation (credential and trust-CA hot reload, then the shared storage suite).
virtual-genai follows upstream's split: the mock LLM and the Spring AI service run from the published e2e-mock-llm-server / e2e-spring-ai-service images, and the case also asserts the LLM-as-judge evaluation records and metrics.
Bump SW_CTL_COMMIT to 1b6837da (ai-agent commands) and SW_E2E_SERVICE_COMMIT to 51e72735; add SW_AI_SESSIONIZER_COMMIT.
New cases: otlp-traces-native (native OTLP span storage, the TraceQL /otlp datasource and upstream's TAL assertions: services, topology, metrics, slow statements), otlp-virtual-genai, otlp-virtual-genai-native, zipkin-virtual-genai and mixed-virtual-genai (GenAI spans from every trace source), ios, miniprogram-wechat, miniprogram-alipay, vm-otel-hostmetrics (OpenTelemetry-native host and process monitoring) and ui-management.
otlp-traces keeps the Zipkin path (SW_OTEL_TRACE_STORAGE: zipkin, upstream's new default stores spans natively); ai-agent adds upstream's provider-body, MCP and withheld-content checks with a second, hide-configured OAP; virtual-genai asserts the evaluation storage; kafka-monitoring and event follow upstream's setup changes.
Bump SW_CTL_COMMIT to 30aaacd0, SW_AI_SESSIONIZER_COMMIT to aa67971d and SW_E2E_SERVICE_COMMIT to f115aa7c; add OTEL_COLLECTOR_CONTRIB_VERSION.
New kind case otlp-traces-cluster: two native OAP replicas on the Kubernetes coordinator, every call's CLIENT and SERVER halves sent to different replicas, so each caller-scoped alias the topology shows was learned from a PairingFact that crossed to the trace's owner, in both directions.
alarm also asserts the admin /status/alarm/* answers, and aws-s3 posts to the AWS Firehose receiver, which no case reached: the AWS cases send their metrics over gRPC.
New cases server-clusters (two Java-agent Kafka producers reporting the broker by different ;-joined lists, and the consumer's broker, drawn as one service) and server-clusters-otlp (an OpenTelemetry Python confluent-kafka producer and consumer reaching the broker by two names meet at one OTLP_VIRTUAL_MQ broker through the pre-compiled rule), reading upstream's server-clusters/{native,otlp} configuration and expected files.
banyandb-ca-rotation rotates the way an operator does (the OAP trusts the old and the new CA, BanyanDB reloads a certificate the new CA signed, the OAP trusts the new CA only) once the topology shows the consumer's calls, before the storage suite, and rotates to an unrelated CA last; each step writes its file once, the OAP's trust file renamed into place. It used to start with the unrelated CA, and when the writes that failed included a network address alias's first write, the alias stayed out of storage until its next refresh five minutes later and the topology assertions timed out (2 of 3 CI runs of the 456199a1f8 sync). Same change as upstream's case (apache/skywalking#14181), whose certificates and expected files it reads.
banyandb-auth-rotation waits for the topology to show the consumer's calls to the provider before it rotates the credentials, as banyandb-ca-rotation does. The incomplete credentials it applies fail the writes in that window, and when they included a network address alias's first write, the topology assertions timed out the same way (main run 41187204680, PR #37's first run).
alarm exposes the telemetry port, so upstream's case checks the alarm_http_* series after the webhook deliveries; so11y mounts upstream's so11y alarm-settings.yml (a rule firing on every service with traffic, delivered to the provider's webhook) and asserts the three meter_oap_instance_alarm_http_delivery_* metrics. Bump SW_E2E_SERVICE_COMMIT to 208cf572 (the test services' CVE bumps).
banyandb-auth-rotation and banyandb-ca-rotation also prove that writes go through after the rotation: their topology assertions use the default range, the last 30 minutes, which rows written before the rotation satisfy too, so each case now keeps the time its last rotation took effect and asserts the provider topology drawn only from the minutes after it.
CI
Pin every job to ubuntu-24.04 (and ubuntu-24.04-arm) as upstream does since #14166: ubuntu-latest is rolling to Ubuntu 26.04 during 2026-10-19 – 2026-11-19, so jobs could land on either image.
Repin the third-party actions to the newest SHAs on the ASF allow-list (graalvm/setup-graalvm v1.6.8, docker/setup-buildx-action v4.4.1, docker/login-action v4.7.0, docker/build-push-action v7.4.0, softprops/action-gh-release v3), move apache/skywalking-infra-e2e to upstream's pin, 68bbdec (Compose v2 log collection) and then 56ac8be (kind loads image archives per platform with Docker's containerd image store), and the GitHub actions to their current majors (checkout v7, cache v6, upload-artifact v7, download-artifact v8, setup-java v6).
A manual run with a commit input now checks that commit out in every job; the license check, Build & Test and the e2e jobs checked out the branch head, so they could test other sources than the native image they ran.