Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/en/changes/changes.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
* Add iOS/iPadOS app monitoring via OpenTelemetry Swift SDK (SWIP-11). Includes the `IOS` layer, `IOSHTTPSpanListener` for outbound HTTP client metrics (supports OTel Swift `.old`/`.stable`/`.httpDup` semantic-convention modes via stable-then-legacy attribute fallback), `IOSMetricKitSpanListener` for 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: auto` mode dropping logs after extractor set the layer. Codegen now propagates `layer "..."` assignments to `LogMetadata.layer` so `FilterSpec.doSink()` sees the script-decided layer.
* Fix MetricKit histogram percentile metrics being reported at 1000× their true value — the listener now marks its `SampleFamily` with `defaultHistogramBucketUnit(MILLISECONDS)` so MAL's default SECONDS→MS rescale of `le` labels is not applied.
* Fix: remove `VirtualServiceAnalysisListener`'s dependency on `GenAIAnalyzerModule` if it is disabled.

#### UI
* Add mobile menu icon and i18n labels for the iOS layer.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

package org.apache.skywalking.oap.server.analyzer.provider.trace.parser.listener;

import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;

import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -82,22 +82,25 @@ public Factory(ModuleManager moduleManager) {
this.namingControl = moduleManager.find(CoreModule.NAME)
.provider()
.getService(NamingControl.class);
this.genAIMeterAnalyzerService = moduleManager.find(GenAIAnalyzerModule.NAME)
.provider()
.getService(IGenAIMeterAnalyzerService.class);
if (moduleManager.has(GenAIAnalyzerModule.NAME)) {
this.genAIMeterAnalyzerService = moduleManager.find(GenAIAnalyzerModule.NAME)
.provider()
.getService(IGenAIMeterAnalyzerService.class);
} else {
this.genAIMeterAnalyzerService = null;
}
}

@Override
public AnalysisListener create(ModuleManager moduleManager, AnalyzerModuleConfig config) {
return new VirtualServiceAnalysisListener(
sourceReceiver,
Arrays.asList(
new VirtualCacheProcessor(namingControl, config),
new VirtualDatabaseProcessor(namingControl, config),
new VirtualMQProcessor(namingControl),
new VirtualGenAIProcessor(genAIMeterAnalyzerService)
)
);
List<VirtualServiceProcessor> processors = new ArrayList<>();
processors.add(new VirtualCacheProcessor(namingControl, config));
processors.add(new VirtualDatabaseProcessor(namingControl, config));
processors.add(new VirtualMQProcessor(namingControl));
if (genAIMeterAnalyzerService != null) {
processors.add(new VirtualGenAIProcessor(genAIMeterAnalyzerService));
}
return new VirtualServiceAnalysisListener(sourceReceiver, processors);
}
}

Expand Down
Loading