Skip to content

[APM] Add Service map PoC tests#23

Merged
jennypavlova merged 1 commit into
react-flow-service-mapfrom
react-flow-service-map-test
Jan 20, 2026
Merged

[APM] Add Service map PoC tests#23
jennypavlova merged 1 commit into
react-flow-service-mapfrom
react-flow-service-map-test

Conversation

@jennypavlova
Copy link
Copy Markdown
Owner

Summary

This PR adds tests to the React Flow service map PoC and validates the functionality and the components rendering.

Coverage Comparison: React Flow vs Cytoscape

Metric Cytoscape React Flow Improvement
Component tests 28 89 +218%
Test files 4 6 +50%
E2E tests 1 file (basic) 1 file (user flows) Enhanced
a11y check test 0 1 test covered 🎉

What React Flow Tests Add

  • Custom node components - ServiceNode, DependencyNode with icons, labels, health states
  • Layout engine - Dagre-based positioning with direction toggle (horizontal/vertical)
  • Data transformation - Full coverage of Cytoscape → React Flow conversion
  • Popover integration - Node type detection, content rendering, close behavior

Results

✅ All 89 component tests passing
✅ E2E tests verify real browser rendering
✅ Covers edge cases Cytoscape tests missed (health status, bidirectional edges, empty states)


Component Tests (Jest + React Testing Library)

Located in x-pack/solutions/observability/plugins/apm/public/components/app/service_map/react_flow_service_map/

File Tests Description
react_flow_graph.test.tsx 15 Main graph component: rendering, layout toggle, zoom controls, node/edge display
service_node.test.tsx 10 Service node: labels, agent icons, selection states, health status
dependency_node.test.tsx 9 Dependency node: labels, span icons, selection states
react_flow_popover.test.tsx 12 Popover: visibility, content selection by node type, header display
transform_data.test.ts 14 Data transformation: Cytoscape → React Flow format
apply_layout.test.ts 29 Dagre layout: node positioning, edge routing, direction

Total: 89 tests

Test Utilities

  • test_utils.tsx - Mock data factories, test wrapper with providers, predefined scenarios

E2E Tests (Scout/Playwright)

Located in x-pack/solutions/observability/plugins/apm/test/scout/ui/parallel_tests/sevice_map/

File Description
react_flow_service_map.spec.ts User flows: navigation, node visibility, popover interactions, zoom/layout controls

Tests the /app/apm/react-flow-service-map route with real browser rendering.

How to run

  • Server: node scripts/scout start-server --stateful
  • Test: npx playwright test --config=x-pack/solutions/observability/plugins/apm/test/scout/ui/parallel.playwright.config.ts --project=local --grep="React Flow Service Map"
    • with --ui
    image

@jennypavlova jennypavlova self-assigned this Jan 19, 2026
Copy link
Copy Markdown

@MiriamAparicio MiriamAparicio left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is so much better! Good job

@jennypavlova jennypavlova merged commit 5fa9361 into react-flow-service-map Jan 20, 2026
7 checks passed
jennypavlova pushed a commit that referenced this pull request Apr 29, 2026
## Summary

Closes elastic#254714 

- Adds Claude reviewer using [GH Agentic
Workflows](https://github.github.com/gh-aw/introduction/how-they-work/)
- Adds workflow handling of @/claude mentions in comments
- Adds a `code-reviewer` subagent for reuse in workflows.
- Proxies through LiteLLM for Opus 4.7 model

### Testing

https://github.com/elastic/kibana/actions/workflows/reviewer-claude.lock.yml

This branch is directly in `elastic/kibana` rather than my fork and has
been running the workflow for reviews during development with
`pull_request` as the event, rather than the final state of
`pull_request_target` events. You can see comments Claude has posted and
responses to being mentioned. "No issues found" comments have been moved
to a `no-op` instead, the status checks reflect when the agent runs
anyways.

Will need to follow up with a proper `pull_request_target` run after
merge. There are some security settings automatically applied during
compilation that we cannot verify yet. Since we're gated behind the
label, there shouldn't be any issues immediately post merge with the
workflow running unnecessarily.

### Note for Reviewers
- It isn't necessary to review the two `lock` files. They are compiled
and generated files, but must be committed for the workflow to run.
- Open to different model versions, don't have a strong preference
towards Opus 4.7

## Cache and cost analysis

Tested ten Opus 4.7 (`llm-gateway/claude-opus-4-7`) reviewer runs with
`ENABLE_PROMPT_CACHING_1H` enabled. The cache is active, but the data
includes dirty cases: prompt changes, long gaps outside the useful cache
window, regular PR review runs, and comment-reply runs.

| Run | Event | Head | Cost | Turns | Cache read | Cache write | Output
| Effective tokens |
| --- | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: |
| [#15](https://github.com/elastic/kibana/actions/runs/25011054153) |
`pull_request` | `2076d4f` | $1.04 | 14 | 809,672 | 80,897 | 5,169 |
182,559 |
| [#16](https://github.com/elastic/kibana/actions/runs/25011557405) |
`pull_request` | `382357b` | $1.32 | 21 | 1,495,919 | 70,406 | 5,226 |
240,928 |
| [#17](https://github.com/elastic/kibana/actions/runs/25012064350) |
`pull_request` | `e93fe0b` | $1.33 | 23 | 1,378,836 | 50,413 | 13,022 |
240,413 |
| [#18](https://github.com/elastic/kibana/actions/runs/25013588252) |
`pull_request` | `04ded1d` | $1.20 | 24 | 1,453,092 | 39,648 | 8,876 |
220,490 |
| [#19](https://github.com/elastic/kibana/actions/runs/25030187214) |
`pull_request` | `88a2c7e` | $1.41 | 16 | 1,165,558 | 99,949 | 8,171 |
249,210 |
| [#21](https://github.com/elastic/kibana/actions/runs/25030484848) |
`pr_review_comment` | `88a2c7e` | $0.45 | 9 | 512,383 | 19,390 | 3,035 |
82,782 |
| [#23](https://github.com/elastic/kibana/actions/runs/25031202052) |
`pull_request` | `66b198f` | $1.39 | 18 | 1,230,107 | 78,104 | 11,420 |
246,818 |
| [elastic#26](https://github.com/elastic/kibana/actions/runs/25033088024) |
`pull_request` | `d59d8c0` | $1.50 | 22 | 1,428,302 | 90,868 | 8,885 |
269,265 |
| [elastic#27](https://github.com/elastic/kibana/actions/runs/25034181833) |
`pull_request` | `d1052ef` | $1.73 | 24 | 2,016,691 | 81,113 | 8,737 |
317,759 |
| [elastic#28](https://github.com/elastic/kibana/actions/runs/25034226594) |
`pr_review_comment` | `d1052ef` | $1.18 | 23 | 1,453,250 | 36,528 |
7,788 | 213,038 |

| Run | First request cache read | First request cache write | Notes |
| --- | ---: | ---: | --- |
| 15 | 0 | 51,751 | Cold 1-hour cache write. |
| 16 | 35,886 | 15,905 | Stable prefix reused. |
| 17 | 35,886 | 15,907 | Same prefix hit pattern. |
| 18 | 35,886 | 15,911 | Same prefix hit pattern. |
| 19 | 0 | 53,676 | Cold again after long gap + prompt/head changes. |
| 21 | 45,471 | 8,375 | Comment-reply flow reused 19 prefix and wrote a
smaller suffix. |
| 23 | 37,245 | 16,587 | New commit/prompt still reused part of the
1-hour prefix. |
| 26 | 0 | 53,761 | Cold again after another gap + prompt/head changes.
|
| 27 | 37,245 | 16,511 | Warm PR run on a new head/prompt hash. |
| 28 | 45,465 | 8,461 | Comment-reply flow reused 27 prefix, but still
ran long. |

Summary:
- All observed cache creation was 1-hour (`ephemeral_1h_input_tokens`);
no 5-minute writes were observed.
- Average observed cost is about $1.26/run across all ten runs, or about
$1.37 for normal `pull_request` runs excluding comment replies.
- Comment replies are not inherently cheap: run 21 was $0.45 because it
was narrow and 9 turns, while run 28 was $1.18 because it took 23 turns.
- Cold starts appear after long gaps or prompt churn (runs 15, 19, 26);
warm runs still reuse partial prefixes even when the commit/prompt hash
changes.
- Next tuning is comparing 5-minute vs 1-hour caching, testing cheaper
models against review quality, and auditing trace data for unnecessary
output or artifact reads.

---------

Co-authored-by: Tyler Smalley <tyler.smalley@elastic.co>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants