wu-sheng opened a new pull request, #100: URL: https://github.com/apache/skywalking-horizon-ui/pull/100
## Why The AI assistant could read metrics and draw maps, but three gaps limited how far an investigation could go: - **Profiling was a dead end.** It could propose a trace-profiling task, but nothing ever read the result back — the task id was captured and dropped. Profiling is also not one thing: a JVM service wants async-profiler, a Go service pprof, a kernel question eBPF, a network question a process graph. - **Rendered answers drifted from the data behind them.** Embedded views re-queried OAP on reload, so reopening a conversation quietly showed *current* data under an *old* question — and a couple of blocks handed the operator off to a live tab, which drifts by construction. - **The RCA playbooks duplicated per-layer facts in prose** (metric ids, bundled-widget names, entity vocabulary, native-vs-Zipkin trace source). Those live in the layer template and drift from any prose that restates them. ## What **Profiling, end to end.** The assistant picks the profiling flavour that fits the target — trace, async-profiler (JVM), pprof (Go), eBPF on/off-CPU, or network — by reading which types the layer declares and the service's runtime language, so it won't offer pprof for a Java service. It resolves the target instances, and on your approval fires the right create call with that flavour's own units and event/target parameters. Once collected, `analyze_profiling` renders the **flame graph** inline (same component the Profiling tab draws) with the hottest frames called out; a trace profile also shows the **profiled trace's span waterfall beside the flame**, and network profiling renders the **process-conversation graph**. Nothing runs until you approve it, and reading a result requires `profile:read`. **Every rendered answer is a captured snapshot.** Figures, the five maps, traces / Zipkin traces / logs / browser errors, pod logs, the flame and the process graph all freeze their data at read time and replay identically on reload — zero re-query, offline-safe, each stamped "captured <time>" with a replay badge. Trace captures carry their spans so the waterfall opens from frozen data (v1 backends, which have no inline spans, fetch them up front). When there is genuinely nothing to capture — no Rover/eBPF agent, a task that collected nothing — the assistant says so in plain text instead of rendering something misleading. The one remaining live-tab handoff (`show_service_list`) is removed. **Playbooks read the template instead of restating it.** The RCA playbooks keep their method and ordering but now resolve per-layer specifics at runtime through the capability + catalog lookups, and prefer rendering an existing catalog widget over reconstructing one. Also: chat history persists per user in the browser (IndexedDB, with a toggle, usage meter and clear-all), and every skill's tool descriptions moved out of code into editable resource files. ## Validation - `pnpm -r run type-check`, `build-ui`, `build-bff`, `pnpm -r run lint`, `pnpm -r run test:unit` (220 BFF + 143 UI) all green; `license-eye` 0 invalid. - i18n: all 7 non-English catalogs at parity with `en.json`; BFF template `i18n:validate` reports no findings. - Live-validated against the public demo OAP throughout: topology/deployment/instance-map/API-dependency/hierarchy captures with their edge metrics and sparklines, trace capture (30 v2 rows), logs capture (100 rows), a 139-frame trace flame on `agent::songs`, multi-type proposals (async proposed for the Java service, a pprof-on-Java request self-corrected, a 15-minute async request clamped to the 10-minute server cap), and the honest no-Rover fallback for network profiling. - Two paths could not be exercised on the demo and were verified by construction against the OAP schema: the v1 (`queryBasicTraces`) trace-capture path, since the demo runs BanyanDB/v2; and the `profile:read` denial path, which needs a custom role list. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
