11.0.0
Project
- New
queryAlarmsGraphQL query — entity / layer / rule filters for alarms. Adds a comprehensive alarm query API alongside the legacygetAlarm. The newqueryAlarms(condition: AlarmQueryCondition!): Alarmsaccepts a single input type bundling every filter the alarm record stores:entities: [Entity!](reuses the MQEEntityshape — pin to specific services / instances / endpoints / processes or their relations, matched against alarmid0ORid1);layer: String(filter by the alarmed entity’s layer — single match, since alarm rows persist one layer);ruleNames: [String!](filter by which alarm rule fired); pluskeyword,tags,duration,paging. LegacygetAlarmis marked@deprecatedbut still routes to the same DAO — no client breakage. Backend additions: a newlayercolumn onAlarmRecordpopulated at alarm-mint time viaMetadataQueryService.getService(serviceId).getLayers(); the existingid0/id1columns flipped fromstorageOnly = trueto indexed so the entity filter pushes down to storage.IAlarmQueryDAO.queryAlarms(condition, limit, from)is a new abstract method — 3rd-party storage backends fail at compile if they miss the override (SWIP-14 pattern). All three bundled backends implement it: BanyanDB / Elasticsearch / JDBC. Operator semantics: (1) Relation entities are exact-match. Passing{scope: ServiceRelation, serviceName: A, destServiceName: B}matches only the alarm whereid0=serviceId(A) AND id1=serviceId(B), not any alarm that touches A or B on either side. Wider “anything involving A” queries should pass the individual non-relation entity instead ({scope: Service, serviceName: A}— which expands toid0=A OR id1=A). (2) Single layer per alarm row. The persisted column stores ONE layer (the first entry of the entity’s resolved layer list — source-first for relations). A service in[GENERAL, K8S_SERVICE]whose metadata resolves toGENERALfirst is filed underGENERAL; queryinglayer: "K8S_SERVICE"will miss it. Operator migration note: existing pre-upgrade alarm rows continue to be filterable by the legacygetAlarmfields; the new entity / layer / rule filters inqueryAlarmsapply only to alarms written after the upgrade (existing storage indices don’t transitionindex: false→truein place; new daily-rolled indices pick up the indexed columns). Schema additions are non-blocking — bootstrap silently skips column-attribute changes on existing indices. - 🚨 Breaking change:
apm-webappand theskywalking-booster-uisubmodule are removed. This OAP distribution no longer ships a bundled web UI. The legacy Armeria reverse proxy inapm-webapp/(the binary that powered theskywalking/uiDocker image) and theskywalking-uigit submodule (which trackedapache/skywalking-booster-ui) are both deleted along with thedocker.uiMaven target, theskywalking/uiDocker image build, theapm-dist/webapp packaging, and every CI workflow path that built or pushed the UI image. The official UI is now Horizon UI, a SkyWalking sub-project that releases independently of the OAP backend on its own schedule, with released container images on Docker Hub atapache/skywalking-ui(tagslatest/horizon-<version>; per-commit development images live onghcr.io/apache/skywalking-horizon-ui). There is no 1:1 mapping between OAP versions and Horizon UI versions — operators pin the UI image tag in their deployment and upgrade the two on separate cadences. Horizon UI consumes the OAP’s public GraphQL/REST surface (default12800) and the admin host (default17128). The on-disk dashboard seed files inoap-server/server-starter/src/main/resources/ui-initialized-templates/are deleted;UITemplateInitializer/UIMenuInitializerare removed fromCoreModuleProvider.notifyAfterCompleted(), and Horizon UI ships its own dashboard library and its own sidebar menu. UI templates are now created and updated through the new/ui-management/templates/*REST surface on admin-server (see below). All UI-related GraphQL mutations and queries (UIConfigurationManagement:addTemplate,changeTemplate,disableTemplate,getAllTemplates,getDashboardConfiguration,getMenuItems) are retired from the public GraphQL schema, along with theSW_ENABLE_UPDATE_UI_TEMPLATEflag. The OAP backend also no longer stores or serves the sidebar menu —UIMenuManagementService,UIMenuManagementDAO,UIMenu,MenuItem, and the storage impls are all removed; Horizon UI owns the menu client-side and useslistServices(layer:...)for dynamic “layer has services” gating. Upgrade path: replaceskywalking/ui:<tag>with the Horizon UI imageapache/skywalking-ui:latest(or ahorizon-<version>tag — pick a version per Horizon UI’s OAP-compatibility notes, OAP11.0+is supported) in your deployment, expose port17128from the OAP container, and migrate any scripts that called the legacy GraphQL UI mutations to the REST endpoints under UI Management API. All status / debug endpoints (/status/*,/debugging/*) also move to admin-only — the public REST dual-bind for status is retired in the same release. - New
ui-managementadmin module — REST surface for dashboard templates. Hosts five operations on admin-server (port17128):GET /ui-management/templates,GET /ui-management/templates/{id},POST /ui-management/templates,PUT /ui-management/templates,POST /ui-management/templates/{id}/disable. Forwards to the existingUITemplateManagementService(no storage DAO changes). Enabled by default (SW_UI_MANAGEMENT=default, on a default-on admin host). Replaces the retired GraphQLUIConfigurationManagementtemplate resolver. The sidebar menu is intentionally NOT served — see the breaking-change entry above. Operator reference: UI Management API. - All admin feature modules default-on.
admin-server,status,inspect,ui-management,dsl-debugging, andreceiver-runtime-ruleall default to enabled. Operators who don’t want a particular feature set itsSW_*env var to empty. This closes a usability gap from 10.4.0 where the runtime-rule / dsl-debugging surfaces required explicit opt-in even though the admin host was already on. - Status API moved to admin-host. Status / debug routes (
/status/*,/debugging/*) now register on the admin-server REST host (default17128); they no longer mirror oncore.restPort(default12800). Aligns status with every other admin feature module (inspect, dsl-debugging, runtime-rule, ui-management). Horizon UI consumes status from the admin host. URIs and payloads are unchanged; only the host moved. One exception:/status/config/ttlis also bound on the public REST host (12800) so ecosystem tools that discover TTL bounds via REST before issuing /graphql don’t need to learn the admin port. - New
admin-servermodule — shared host for admin / on-demand write APIs. Runs on two ports: an HTTP REST surface (default17128) for operator-facing endpoints, and an admin-internal gRPC bus (default17129) for peer-to-peer cluster RPCs (runtime-rule Suspend / Resume / Forward; DSL debug install / collect / stop / stopByClientId). The admin-internal bus is a dedicated transport separate from the public agent / cluster gRPC port (core.gRPCPort, default11800) so privileged admin RPCs stay out of the agent network’s blast radius — operators bindgRPCHostto a private peer-to-peer interface only. Both the runtime-rule plugin and the new DSL Debug API (below) mount onto this shared host. Enabled by default so the status feature module is reachable out of the box; the host binds to0.0.0.0:17128and has no built-in authentication and must be gateway-protected with IP allow-lists, never exposed to the public internet (see the Admin API security notice). SetSW_ADMIN_SERVER=(empty) to disable entirely. The runtime-rule config block loses itsrestHost/restPort/restContextPath/restIdleTimeOut/restAcceptQueueSize/httpMaxRequestHeaderSizekeys (and the matchingSW_RECEIVER_RUNTIME_RULE_REST_*env vars); host-level knobs move under the newadmin-serverblock (SW_ADMIN_SERVER_HOST/SW_ADMIN_SERVER_PORT/SW_ADMIN_SERVER_GRPC_HOST/SW_ADMIN_SERVER_GRPC_PORT/SW_ADMIN_SERVER_INTERNAL_COMM_TIMEOUTetc.). - Runtime rule hot-update for MAL and LAL. Operators can now ship metric (MAL) and log
(LAL) rule changes without restarting OAP. A push to a new admin endpoint persists the rule
to the configured storage backend, and every node in the cluster converges to the new
content within ~30 seconds. Common workflows:
addOrUpdate— create or replace a rule. Body is the raw YAML you would normally ship with OAP’s static rule files. Returns 200 once the rule is applied locally and persisted; peers pick it up on their next periodic scan (≤ 30 s).inactivate— soft-pause a rule. The OAP stops emitting metrics for that rule but the backend measure (and its history) is preserved, so a lateraddOrUpdateto the same(catalog, name)is lossless. The “off” intent is durable across reboots; bundled rules on disk are not auto-resurrected when aninactivateremoves the runtime override. This is the safe way to take a rule offline.delete— removes anINACTIVErow (active rules return409 requires_inactivate_first). For runtime-only rules with no bundled YAML on disk, the row is dropped; the backend measure (if any) is left in place as an inert artefact, matching bundled-rule deletion semantics (removing a YAML fromotel-rules/on disk doesn’t drop its measure either). For rules that have a bundled YAML twin, plaindeletereturns409 requires_revert_to_bundled— letting bundled silently take over the(catalog, name)is a meaningful state change that requires an explicit operator decision. Re-issue with?mode=revertToBundledto fall back to bundled: that path runs the schema-change pipeline (rehydrates the runtime DSL locally, then applies the bundled YAML through the standard apply pipeline so the runtime→bundled delta drops runtime-only metrics, registers bundled-only metrics, and reuses bundled-shared metrics at matching shape) before removing the row. Returns400 no_bundled_twinwhen?mode=revertToBundledis used without a bundled YAML on disk.get/bundled/list/dump— read-side endpoints for fetching a single rule’s YAML (withETagsupport;?source=bundledreads the on-disk bundled YAML even when a runtime override is in place), listing the bundled-vs-runtime overlay per catalog, inspecting cluster-wide rule state as a JSON envelope ({generatedAt, loaderStats, rules}— each row carriesstatus/localState/loaderKind/bundled/bundledContentHashso a UI can render override badges without a second roundtrip), and exporting all rules as a tar.gz for backup / DR. Hot-updates survive OAP restart: at boot OAP merges bundled rule files with persisted runtime rules, so the cluster never silently regresses to the bundled defaults. All admin writes for a runtime-rule cluster serialize on a single “main” OAP (deterministic sorted-first peer, no leader election) — non-main nodes that receive an HTTP write transparently forward it to the main over the admin-internal gRPC bus, so an L7 load balancer in front of the admin port can route any operator request to any OAP. Cluster convergence on the periodic refresh tick is configurable viareceiver-runtime-rule.refreshRulesPeriod(default30s). The endpoint is disabled by default and listens on port17128(HTTP) when enabled. It has no built-in authentication — operators must gateway-protect it with IP allow-lists and never expose it to the public internet. Routes mount on the newadmin-serverHTTP host, which is on by default; enable the runtime-rule feature withSW_RECEIVER_RUNTIME_RULE=default.
- Live debugger for MAL / LAL / OAL — implements SWIP-13 Live Debugger for MAL / LAL / OAL.
Sample-based runtime debugger that captures per-stage inputs/outputs as the three DSLs
process live ingest. Idle-path cost is one volatile-bool read per probe call site that
JIT eliminates after warm-up; active sessions fan out to every cluster peer over the
admin-internal gRPC bus so each peer captures its own slice. The fan-out is LB-safe:
any node can serve any verb (POST mints
sessionIdon the receiving node, broadcasts install to peers, returns404 rule_not_foundonly when no node owns the rule), so an L7 load balancer in front of the admin port routes operator requests freely. Mounts on the sharedadmin-serverhost (/dsl-debugging/*for session control plane,/runtime/oal/*for the OAL rule picker). Disabled by default; enable withSW_DSL_DEBUGGING=default(admin-server itself is on by default).injectionEnabledis a boot-time codegen switch defaulting totrue— once the module is enabled, probes fire and sessions record samples; setfalseonly if the REST surface is wanted but no codegen-side probe overhead is acceptable. Per-session limits enforce hard caps (recordCap≤ 10000,retentionMillis≤ 1 hour) — out-of-range requests return400 invalid_limits. LAL sessions accept a per-sessiongranularity=block|statementflag — block mode captures the parser/extractor/sink stages; statement mode additionally records onelineentry per individual extractor statement, carrying the source-line number and verbatim DSL text so the UI can highlight which statement fired. MAL captures render the file-level filter’s surviving SampleFamily map ({"families": N, "items": [...]}), so multi-metric expressions show cross-family filter narrowing in the captured payload. Capture payloads include raw log bodies and parsed maps — treat the admin port as authenticated infrastructure per the Admin API security notice. Per-DSL operator references: MAL, OAL, LAL. - BanyanDB schema mismatches are now visible at boot, not silent. If BanyanDB already
holds a resource whose shape doesn’t match what the current rule declares (e.g., a rule
was edited on disk while OAP was offline), OAP now skips that resource, logs an ERROR
with the declared-vs-backend diff, and continues booting — previously the mismatch was
silently accepted and samples for the affected resource were quietly dropped. To
re-shape a mismatched metric, push the desired YAML through
POST /runtime/rule/addOrUpdate. - Bump infra-e2e to testcontainers-go v0.42.0 (apache/skywalking-infra-e2e#146), which uses Docker Compose v2 plugin natively and removes docker-compose v1 dependency.
- Remove deprecated
versionfield from all docker-compose files for Compose v2 compatibility. - Best-effort schema-cutover fence for BanyanDB. After firing a schema install or drop
OAP now waits up to a bounded window (default 2s) for every BanyanDB data node to apply
the change before resuming dispatch — the typical case gets a clean cutover where
samples after
200 OKuse the new shape. On laggard timeout, OAP logs a warning and proceeds anyway so a single slow node doesn’t wedge the apply. - Bump dependencies: gRPC
1.70.0→1.80.0, protobuf-java3.25.5→4.33.1, Netty4.2.10.Final→4.2.12.Final, Netty-tcnative2.0.75→2.0.77, pgv (protoc-gen-validate)1.2.1→1.3.0. Driven by the new BanyanDB schema-consistency RPCs whose generated validation code requires theprotobuf-java 4.xruntime. - Inspect API on admin-server. Two new admin-only HTTP endpoints for
browsing the live metric catalog and the entities currently emitting
values for a given metric.
GET /inspect/metricslists every registered metric with its type / scope / catalog / value-column name / supported downsamplings (pure metadata, no I/O).GET /inspect/entitiesruns the storage backend’s entity scan for a metric over a time range + step (capped at 300 rows) and returns each entity decoded into an MQE-ready payload — the response includes amqeEntityblock the operator pastes verbatim into the public GraphQLexecExpressionmutation, plus the source service’s layer(s) (multi-layer services emit one row per layer). Restricted toREGULAR_VALUE/LABELED_VALUEmetrics and to non-Process scopes;HEATMAP/SAMPLED_RECORD/Process/ProcessRelationreturn 400. AddsIMetricsQueryDAO.listEntityIdsInRangeas an abstract method on the interface — any 3rd party storage backend must explicitly override or the build fails. Enabled by default (bothSW_INSPECTandSW_ADMIN_SERVERare on by default); setSW_INSPECT=empty to disable. Operator reference: Inspect API. - Status feature module relocation, finalized. The legacy
status-query-pluginwas replaced by a newstatusfeature module underserver-admin/; the route set (/status/cluster/nodes,/status/alarm/*,/status/config/ttl,/debugging/config/dump,/debugging/query/*) keeps URIs and payloads unchanged. The selector renames from the QUERY-plugin form (SW_QUERY=…,status-query-plugin) to a top-levelSW_STATUS=default(on by default); customapplication.ymloverrides referencingstatus-queryneed to repoint tostatus. Routes are admin-host only — see the “Status API is admin-host only” entry above for the public REST retirement.
OAP Server
- Runtime MAL/LAL hot-update rules can declare
layerDefinitions:to introduce new layers. Ordinals are operator-pinned in the100_000+tier; the layer is refcount-tracked and unregistered when the last declaring rule is removed. See runtime-rule-hot-update.md#dynamic-layers for the conflict rules and limitations. - Fix: remove the redundant tags from the
envoy-ai-gateway.yamlLAL configuration. - Add Zipkin Virtual GenAI e2e test. Use
zipkin_jsonexporter to avoid protobuf dependency conflict betweenopentelemetry-exporter-zipkin-proto-http(protobuf~=3.12) andopentelemetry-proto(protobuf>=5.0). - Fix missing
taskIdfilter and incorrectINclause parameter binding inJDBCJFRDataQueryDAOandJDBCPprofDataQueryDAO. - Remove deprecated
GroupBy.field_namefrom BanyanDBMeasureQueryrequest building (Phase 1 of staged removal across repos). - Push
taskIdfilter down to the storage layer inIAsyncProfilerTaskLogQueryDAO, removing in-memory filtering fromAsyncProfilerQueryService. - Fix missing parentheses around OR conditions in
JDBCZipkinQueryDAO.getTraces(), which caused the table filter to be bypassed for all but the first trace ID. Replaced with a properINclause. - Fix missing
andkeyword inJDBCEBPFProfilingTaskDAO.getTaskRecord()SQL query, which caused a syntax error on every invocation. - Fix storage layer bugs in profiling DAOs and add unit test coverage for JDBC query DAOs.
Bug fixes: duplicate
TABLE_COLUMNcondition inJDBCMetadataQueryDAO.findEndpoint(), wrong merged table check inJFRDataQueryEsDAO(used incorrect INDEX_NAME due to copy-paste), and missingisMergedTablecheck inProfileTaskQueryEsDAO.getById(). Test additions: add unit tests for 21 JDBC query DAOs verifying SQL/WHERE clause construction. - Optimize
TraceQueryService.sortSpansfrom O(N^2) to O(N) by pre-indexing spans bysegmentSpanId, so trace detail queries scale linearly with span count. - Support MCP (Model Context Protocol) observability for Envoy AI Gateway: MCP metrics (request CPM/latency, method breakdown, backend breakdown, initialization latency, capabilities), MCP access log sampling (errors only),
ai_route_typesearchable log tag, and MCP dashboard tabs. - Add weighted handler support to
BatchQueueadaptive partitioning. MAL metrics use weight 0.05 at L1 (vs 1.0 for OAL), reducing partition count and memory overhead when many MAL metric types are registered. - Fix missing
taskIdfilter in pprof task log query and its JDBC/BanyanDB/Elasticsearch implementations. - Fix duplicate calls in
EndpointTopologyBuilder— calls were not deduplicated unlikeServiceTopologyBuilder, causing duplicate entries when storage returns multiple records for the same relation. - Use
containsOnceandnoDuplicatesfor topology dependency e2e expected files to enforce no-duplicate verification. - Bump infra-e2e to
ef073adto includenoDuplicatespipe function support. - PromQL: support querying Zipkin metadata (service name, remote service name, span name).
- TraceQL: support more tags and variables in Grafana for querying.
- LAL: add
sourceAttribute()function for non-persistent OTLP resource attribute access in LAL scripts. - LAL: add
layer: automode for dynamic layer assignment whenservice.layeris absent. - Add two-phase
SpanListenerSPI mechanism for extensible trace span processing. Refactor GenAI from hardcodedSpanForward.processGenAILogic()toGenAISpanListener. - Add OTLP/HTTP receiver support for traces, logs, and metrics (
/v1/traces,/v1/logs,/v1/metrics). Supports bothapplication/x-protobufandapplication/jsoncontent types. - Fix: TTL query add metadata TTL.
- Fix: PersistentWorker used wrong TTL for metrics cache if the storage is BanyanDB.
- Add iOS/iPadOS app monitoring via OpenTelemetry Swift SDK (SWIP-11). Includes the
IOSlayer,IOSHTTPSpanListenerfor outbound HTTP client metrics (supports OTel Swift.old/.stable/.httpDupsemantic-convention modes via stable-then-legacy attribute fallback),IOSMetricKitSpanListenerfor daily MetricKit metrics (exit counts split by foreground/background, app-launch / hang-time percentile histograms with finite 30 s overflow ceiling), LAL rules for crash/hang diagnostics, Mobile menu, and iOS dashboards. - Fix LAL
layer: automode dropping logs after extractor set the layer. Codegen now propagateslayer "..."assignments toLogMetadata.layersoFilterSpec.doSink()sees the script-decided layer. - Fix MetricKit histogram percentile metrics being reported at 1000× their true value — the listener now marks its
SampleFamilywithdefaultHistogramBucketUnit(MILLISECONDS)so MAL’s default SECONDS→MS rescale oflelabels is not applied. - Add WeChat and Alipay Mini Program monitoring via the SkyAPM mini-program-monitor SDK (SWIP-12). Two new layers (
WECHAT_MINI_PROGRAM,ALIPAY_MINI_PROGRAM); two new JavaScript componentIds (WeChat-MiniProgram: 10002,AliPay-MiniProgram: 10003). Service / instance / endpoint entities are produced by MAL + LAL, not trace analysis — mini-programs are client-side (exit-only) soRPCAnalysisListenerstays unchanged (same pattern as browser and iOS). MAL rules per platform × scope underotel-rules/miniprogram/with explicit.service(...)/.endpoint(...)chains (emptyexpSuffixso endpoint-scope rules aren’t overridden), histogram percentile via.histogram("le", TimeUnit.MILLISECONDS)to keep ms bucket bounds intact, and request-cpm derived from the histogram_countfamily. LALlayer: autorule produces both layers viaminiprogram.platformdispatch and emits error-count samples consumed by per-platform log-MAL rules. Per-layer menu entries and service / instance / endpoint dashboards with Trace and Log sub-tabs. - Fix: remove
VirtualServiceAnalysisListener’s dependency onGenAIAnalyzerModuleif it is disabled. - MAL: register
TimeUnitinMALCodegenHelper.ENUM_FQCNso rule YAML can write.histogram("le", TimeUnit.MILLISECONDS)for SDKs that emit histogram bucket bounds in ms (defaultSECONDSunit applies a ×1000 rescale that would otherwise inflate storedlelabels 1000×). - Fix: potential unexpected current directory inclusion in Docker OAP classpath.
- MAL: add
safeDiv(divisor)onSampleFamilythat yields0when the divisor is0instead ofInfinity/NaN. Replace/withsafeDiv(...)in Envoy AI Gateway latency-average rules sosum / count * 1000no longer produces dropped or out-of-range samples when a counter is zero in a window. - Fix:
envoy-ai-gatewaymetrics rules, make the metrics value return0when the divisor is0. - Custom
Layers can be declared without modifying the OAP source — via an operator-managedlayer-extensions.yml, inlinelayerDefinitions:block in a MAL or LAL rule file, or a plugin extension. UI dashboard templates for new layers are auto-discovered from theui-initialized-templates/directory. Recommended ordinal range for external layers is>= 1000; conflicting names or ordinals are reported at boot. - LAL: support full arithmetic (
+,-,*,/) on numeric operands and fix the original bug where(tag("x") as Integer) + (tag("y") as Integer)was treated as string concatenation — expressions likeinput_tokens + output_tokens < 10000produced the concatenated string"2589115"rather than the integer sum2704, so token-threshold conditions never triggeredabort {}. Operand types are now inferred from explicit casts (as Integer/as Long/as Float/as Double), typed proto fields, or numeric literal shape (withL/F/Dsuffix support, e.g.1000L). The compiler honours JLS-style binary numeric promotion and emits Java arithmetic in the declared primitive type —(x as Integer) + (y as Integer)compiles toint + int(not widened tolong).+with any String operand falls back to string concatenation;-/*//against non-numeric operands produces a compile-time error. Theas Doubleandas Floatcasts are accepted intypeCastclauses, including indefdeclarations. Numeric comparisons honour declared casts on both sides (no more universalh.toLong()wrapper). - Fix:
avgHistogramPercentile/sumHistogramPercentilemeter functions reported the smallest finite bucket boundary (e.g.10for OTelgen_ai_server_request_durationwhoseleis rewritten from0.01s→10ms) for every rank when no samples were observed in any bucket. The percentile loop’scount >= roofcheck matched on the first sorted bucket because both sides were0.calculate()now short-circuits to0for every rank when the windowed total is0. - Fix: MAL
expPrefixnow applies to every metric source inexp, not just the leading one. Previously the prefix was spliced after the first., so secondary metrics inside arguments (e.g. the divisor ina.sum(['s']).safeDiv(b.sum(['s']))) silently skipped the prefix — a rule like envoy-ai-gateway’srequest_latency_avg(sum / count) would tag-rewrite only the dividend. The injection is now AST-aware: every bare-IDENTIFIER metric source is wrapped, while downsampling-type constants (SUM,AVG,LATEST,SUM_PER_MIN,MAX,MIN) are skipped. - Add
@Stream(allowBootReshape = true)opt-in for additive boot-time reshape of BanyanDB streams / measures. Code-defined stream classes (e.g.AlarmRecord) can now annotate their schema as eligible for in-place additive update at OAP boot — a new@Columnis appended to the live tag-family / fields viaclient.updateinstead of being silently rejected withSKIPPED_SHAPE_MISMATCH(which previously forced operators to drop the measure / stream and lose historical rows). Additive includes both new tags / fields and relocating an existing tag between families when a@Column’sstorageOnlyflag flips (e.g.id1moving fromstorage-only→searchablewhen it becomes indexed). The opt-in is per-stream and gated by anisPurelyAdditiveshape diff: tag type changes, tag drops, kind flips (tag↔field), entity / interval / sharding-key changes, and field re-typing still skip withSKIPPED_SHAPE_MISMATCH, so identity-breaking edits remain explicit operator actions. Only the init / standalone OAP performs the reshape; non-init peers continue through the existing poll-and-wait loop so a single node drives DDL. When acheck*recordsSKIPPED_SHAPE_MISMATCHthe dependentIndexRule/IndexRuleBindingreconciliation is also skipped — preventing the previous gap where the binding silently updated to a tag list that diverged from the live tag-family layout.AlarmRecordis opted in. Default remainsfalsefor all other models — boot-time reshape stays off unless the annotation is explicitly set. Operator caveat: BanyanDB does not physically migrate existing rows when a tag’s family changes; pre-existing data stays in its original on-disk location while new writes go to the declared family — expect a backfill window for queries that route through new IndexRules on relocated tags. - Mask keywords
trustStorePass,keyStorePassby default.
UI
- Add mobile menu icon and i18n labels for the iOS layer.
- Fix metric label rendering in multi-expression dashboard widgets.
- Add i18n menu labels for WeChat Mini Program and Alipay Mini Program (en / zh / es) — sub-menus rendered as raw keys until this bump.
- Support trace V1 view in trace single page.
Documentation
- Update LAL documentation with
sourceAttribute()function andlayer: automode. - Add iOS app monitoring setup documentation.
- Add WeChat / Alipay Mini Program monitoring setup documentation, plus a client-side-monitoring section in the security guide covering public-internet ingress (OTLP +
/v3/segments) for mobile / browser / mini-program SDKs. - Improve downsampling documentation
All issues and pull requests are here