Skip to content

PLT-0000 feat(app): bundle a trace explorer app with the datasource#3

Merged
uptickmetachu merged 6 commits into
mainfrom
plt-0000/quickwit-trace-explorer-app
Jul 17, 2026
Merged

PLT-0000 feat(app): bundle a trace explorer app with the datasource#3
uptickmetachu merged 6 commits into
mainfrom
plt-0000/quickwit-trace-explorer-app

Conversation

@uptickmetachu

Copy link
Copy Markdown
Collaborator

Motivation

Give Quickwit traces a first-class exploration UI inside Grafana instead of ad-hoc Explore queries. The repo becomes a single nested plugin: a Scenes-based app (quickwit-quickwit-app) bundling the existing datasource (quickwit-quickwit-datasource, same ID so current provisioning keeps working).

Changes

  • Span explorer: shared Lucene editor with autocomplete/lint, errors-only / root-spans / slowest pills, duration range, log-scale duration heatmap with drag-to-filter, focusable metric panels, attribute favorites + extra table columns, and a trace peek drawer (waterfall/logs tabs).
  • Trace peek drawer log filtering: the drawer's logs tab reuses the trace viewer's LogsFilter controls — free-text Lucene search plus the span pill, URL-synced (spanId/logq), cleared when switching or closing traces.
  • Breakdown: per-value rate/errors/duration-percentile rows with infinite scroll, value search, configurable percentile lines, add-value-as-filter.
  • Trace viewer: full-height waterfall + trace logs side by side, span-level log filtering, log text search, infinite scroll.
  • Datasource: trace_search server-side sort + "Peek trace"/"Peek logs" data links into the app, LogsSample supplementary query support, theme-aware Lucene editor.
  • Build/dev: @grafana/* 13.0.2 + @grafana/scenes 7, root webpack extension for the nested manifest, nest-backend.sh for the Go binary, dev stack mounts dist and provisions datasources + app defaults.

Test plan

  • npm run build succeeds; app loads at /a/quickwit-quickwit-app/explorer with the provisioned dev stack (docker-compose up).
  • Span explorer: filters, heatmap drag-to-filter, and table sorting drive the traces table; peek drawer opens from the "Peek trace" data link.
  • Peek drawer logs tab: free-text filter narrows log lines; clicking a span's log icon in the waterfall filters to that span; pill clears it; deep-linked peek= URL restores filters.
  • Trace viewer: waterfall + logs stay in sync for a pasted trace ID; span/text log filters work.
  • Existing dashboards using the datasource keep working (unchanged ID).

🤖 Generated with Claude Code

uptickmetachu and others added 3 commits July 16, 2026 16:51
…d plugin

Restructure the repo into a single nested Grafana plugin: the top-level
plugin becomes the app quickwit-quickwit-app, with the datasource nested
at dist/datasources/quickwit keeping its quickwit-quickwit-datasource ID
so existing provisioning keeps working.

App (Grafana Scenes, src/app/):
- Span explorer: Lucene editor (autocomplete/lint, shared with the
  datasource), errors-only / root-spans / slowest pills, duration range,
  log-scale duration heatmap with drag-to-filter (time + duration),
  focusable metric panels, attribute favorites + extra table columns
  (joined from raw spans), trace peek drawer (waterfall/logs tabs)
- Breakdown: per-value rate/errors/duration-percentile rows with
  infinite scroll, value search (debounced), configurable percentile
  lines (default p50/p95/p99), add-value-as-filter
- Trace viewer: full-height waterfall + trace logs side by side,
  span-level log filtering, log text search, infinite scroll
- Datasource picker (Grafana default aware), ctrl/cmd+z zoom-out
  hotkey, everything URL-synced for shareable views

Datasource:
- trace_search: server-side sort setting (duration scans the window via
  sort_by=-span_duration_millis; errors/spans sort summaries before the
  limit) and "Peek trace"/"Peek logs" data links into the app
- LogsSample supplementary query support (Explore "Logs sample" section)
- LuceneQueryEditor follows the active theme instead of hardcoding dark

Build: @grafana/* 13.0.2 + @grafana/scenes 7, root webpack extension for
the nested manifest, nest-backend.sh places the Go binary, dev stack
mounts dist and provisions datasources + app defaults.

PLT-0000

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Reuse the trace viewer's LogsFilter/LogsFilterControls in the peek
drawer's logs tab: free-text Lucene search plus the span pill, URL-synced
(spanId/logq) and cleared when switching or closing traces.

PLT-0000

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@uptickmetachu uptickmetachu added AI_GENERATED Authored with AI assistance ai-pr/minor-tweaks AI-generated with manual tweak commits labels Jul 17, 2026
uptickmetachu and others added 3 commits July 17, 2026 11:07
FilterPill has no title prop; use Tooltip for the hover hint instead.

PLT-0000

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
buildAll failed in CI with "plugin.json is missing: executable" because
the top-level src/plugin.json is now the app manifest. Use the SDK's
before-build callback to read src/datasources/quickwit/plugin.json and
emit the binaries + go_plugin_build_manifest straight into
dist/datasources/quickwit. nest-backend.sh now just migrates artifacts
left at the dist root by older builds.

PLT-0000

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The e2e jobs restore executable permissions on the downloaded artifact;
the binaries now live in dist/datasources/quickwit.

PLT-0000

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@uptickmetachu
uptickmetachu merged commit b6646b9 into main Jul 17, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AI_GENERATED Authored with AI assistance ai-pr/minor-tweaks AI-generated with manual tweak commits

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant