Skip to content

ui: add delete series page#18390

Merged
juliusv merged 4 commits into
prometheus:mainfrom
vijaygovindaraja:ui/delete-series-page
Mar 30, 2026
Merged

ui: add delete series page#18390
juliusv merged 4 commits into
prometheus:mainfrom
vijaygovindaraja:ui/delete-series-page

Conversation

@vijaygovindaraja
Copy link
Copy Markdown
Contributor

Fixes #17010

Summary

Adds a web UI page for the delete_series and clean_tombstones admin APIs, replacing the need for manual curl commands.

The page provides:

  • A form to input PromQL series selectors (e.g. up{job="prometheus"})
  • Optional start/end time range filters (RFC3339 or Unix timestamp)
  • A "Clean Tombstones" button to reclaim disk space after deletion
  • Warning banner before destructive operations
  • Error/success feedback

The page is accessible from the Status dropdown menu under "Delete series" and follows existing UI patterns (Mantine components, InfoPageCard, InfoPageStack). It only appears in server mode (not agent mode) and requires the admin APIs to be enabled (--web.enable-admin-api).

Test plan

  • Start Prometheus with --web.enable-admin-api
  • Navigate to Status > Delete series
  • Verify the form renders with selector input, time range fields, and buttons
  • Test deleting a series with a valid selector (e.g. up{job="prometheus"})
  • Verify error feedback when admin APIs are disabled
  • Verify error feedback with invalid selectors
  • Test Clean Tombstones button
  • Verify the page does not appear in agent mode
[FEATURE] UI: Add a web interface for deleting time series and cleaning tombstones, accessible from the Status menu.

Adds a web UI page for the delete_series and clean_tombstones admin
APIs, making it easier to manage time series data without using curl
commands directly.

The page provides:
- A form to specify PromQL series selectors for deletion
- Optional start/end time range filters
- A clean tombstones button to reclaim disk space after deletion
- Warning and confirmation feedback

Fixes prometheus#17010

Signed-off-by: Vijay Govindarajan <vijay.govindarajan91@gmail.com>
@vijaygovindaraja vijaygovindaraja requested review from a team and juliusv as code owners March 28, 2026 23:21
Without this, navigating directly to /delete-series under a path
prefix (e.g. /prometheus/delete-series) would fail to detect the
prefix correctly.

Signed-off-by: Vijay Govindarajan <vijay.govindarajan91@gmail.com>
Copy link
Copy Markdown
Member

@juliusv juliusv left a comment

Choose a reason for hiding this comment

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

Thanks! Some comments:

Comment thread web/ui/mantine-ui/src/App.tsx Outdated
Comment thread web/ui/mantine-ui/src/state/settingsSlice.ts Outdated
Comment thread web/ui/mantine-ui/src/pages/DeleteSeriesPage.tsx Outdated
Comment thread web/ui/mantine-ui/src/pages/DeleteSeriesPage.tsx Outdated
Comment thread web/ui/mantine-ui/src/pages/DeleteSeriesPage.tsx Outdated
Comment thread web/ui/mantine-ui/src/pages/DeleteSeriesPage.tsx Outdated
Comment thread web/ui/mantine-ui/src/pages/DeleteSeriesPage.tsx Outdated
Address review feedback from juliusv:

- Move delete series UI into the existing TSDB Status page instead of
  creating a new top-level page, keeping the navigation minimal
- Use Textarea instead of TextInput for multi-line series selectors
- Use DateTimePicker from @mantine/dates for time range inputs
- Separate error/success states for delete vs clean tombstones
  operations, showing alerts in the appropriate card
- Fix warning text to use quoted "Clean Tombstones"
- Remove standalone DeleteSeriesPage.tsx, revert App.tsx routing and
  settingsSlice.ts changes

Signed-off-by: Vijay Govindarajan <vijay.govindarajan91@gmail.com>
@vijaygovindaraja
Copy link
Copy Markdown
Contributor Author

thanks for the detailed review @juliusv — addressed all your comments:

  • moved the delete series UI into the TSDB Status page at the bottom instead of a separate page. removed the routing/nav/settingsSlice changes entirely.
  • switched to Textarea for multi-line series selectors
  • switched to DateTimePicker from @mantine/dates for the time range inputs
  • separated error/success state for delete vs clean tombstones so alerts show in the right card
  • fixed the warning text to use quoted "Clean Tombstones"

re: the useAPIMutation hook — happy to leave that for a follow-up as you suggested, keeping raw fetch for now.

Copy link
Copy Markdown
Member

@juliusv juliusv left a comment

Choose a reason for hiding this comment

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

Thanks, just one note on timezones in the datetime pickers.

Comment thread web/ui/mantine-ui/src/pages/TSDBStatusPage.tsx
Use the same dayjs + useLocalTime pattern from the query page's
TimeInput component so the datetime pickers respect the user's
global "use local time" setting. Adds valueFormat with seconds
precision and stores timestamps as milliseconds internally.

Signed-off-by: Vijay Govindarajan <vijay.govindarajan91@gmail.com>
@vijaygovindaraja
Copy link
Copy Markdown
Contributor Author

vijaygovindaraja commented Mar 30, 2026

thanks @juliusv adopted the timezone handling from TimeInput.tsx:

  • imported dayjs + dayjs/plugin/utc
  • switched state from string | null to number | null (ms timestamps)
  • added valueFormat="YYYY-MM-DD HH:mm:ss" and withSeconds to both pickers
  • using the same useLocalTimedayjs / dayjs.utc pattern from the query page for display and onChange conversion
  • fixed handleDelete to use numeric timestamps directly instead of new Date(string).getTime()

Copy link
Copy Markdown
Member

@juliusv juliusv left a comment

Choose a reason for hiding this comment

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

👍 Thanks! I'll submit the follow-up PR when I get to it :)

@juliusv juliusv enabled auto-merge March 30, 2026 06:39
@juliusv juliusv merged commit 0545b38 into prometheus:main Mar 30, 2026
35 checks passed
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request May 28, 2026
…➔ v3.12.0) (#730)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [quay.io/prometheus/prometheus](https://github.com/prometheus/prometheus) | minor | `v3.11.3` → `v3.12.0` |

---

### Release Notes

<details>
<summary>prometheus/prometheus (quay.io/prometheus/prometheus)</summary>

### [`v3.12.0`](https://github.com/prometheus/prometheus/releases/tag/v3.12.0): 3.12.0 / 2026-05-28

[Compare Source](prometheus/prometheus@v3.11.3...v3.12.0)

- \[SECURITY] Remote-write: Reject snappy-compressed requests whose declared decoded length exceeds the 32MB. Thanks to [@&#8203;hibrian827](https://github.com/hibrian827) for reporting it. [#&#8203;18642](prometheus/prometheus#18642)
- \[SECURITY] STACKIT SD: Fix secrets being exposed in plaintext via `/-/config` endpoint. Thanks to [@&#8203;August829](https://github.com/August829) and [@&#8203;Phaxma](https://github.com/Phaxma) for reporting. GHSA-39j6-789q-qxvh [#&#8203;18649](prometheus/prometheus#18649)
- \[CHANGE] TSDB/Agent: Adds Start Timestamp field to all WAL Histogram samples in memory; used `st-storage` flag is enabled. [#&#8203;18221](prometheus/prometheus#18221)
- \[FEATURE] API: Add `/api/v1/status/self_metrics` endpoint returning the current state of the Prometheus server's own metrics about itself as JSON. [#&#8203;18411](prometheus/prometheus#18411)
- \[FEATURE] Discovery: Add DigitalOcean Managed Databases service discovery [#&#8203;18287](prometheus/prometheus#18287)
- \[FEATURE] Prometheus: Add support for the aix/ppc64 compilation target [#&#8203;18321](prometheus/prometheus#18321)
- \[FEATURE] Discovery: Add Outscale VM service discovery (`outscale_sd_configs`) for discovering scrape targets from the Outscale Cloud API. [#&#8203;18139](prometheus/prometheus#18139)
- \[FEATURE] PromQL: Emit a warning when `sort`, `sort_by_label` or `sort_by_label_desc` is used within range (matrix) queries, as these functions do not have effect in that context. [#&#8203;18498](prometheus/prometheus#18498)
- \[FEATURE] PromQL: Add `start()`, `end()`, `range()`, and `step()` experimental functions [#&#8203;17877](prometheus/prometheus#17877)
- \[FEATURE] PromQL: Update `resets()` function to consider start timestamp resets. Hidden behind `use-start-timestamps` feature flag. [#&#8203;18627](prometheus/prometheus#18627)
- \[FEATURE] Prometheus: Promote auto-reload-config as stable [#&#8203;18620](prometheus/prometheus#18620)
- \[FEATURE] TSDB/Agent: Add `CheckpointFromInMemorySeries` option to `agent.DB` that enables checkpoint based on in-memory series. [#&#8203;17948](prometheus/prometheus#17948)
- \[FEATURE] UI: Add a web interface for deleting time series and cleaning tombstones, accessible from the Status menu. [#&#8203;18390](prometheus/prometheus#18390)
- \[FEATURE] PromQL: Use start timestamps for `rate()`, `irate(), and `increase()`calculations, behind a feature flag`use-start-timestamps`. Doesn't work together with extended range selectors `anchored`and`smoothed\`. [#&#8203;18344](prometheus/prometheus#18344)
- \[FEATURE] Scrape: Added a feature flag `st-synthesis` which synthesizes unknown STs for scraped cumulative metrics. Useful when Remote Writing 2.0 with delta or Otel-based backends. [#&#8203;18279](prometheus/prometheus#18279)
- \[FEATURE] promqltest: support `@st` annotation in `load` blocks to specify per-sample start timestamps. [#&#8203;18360](prometheus/prometheus#18360)
- \[ENHANCEMENT] API: reject concurrent fgprof profiles. [#&#8203;18651](prometheus/prometheus#18651)
- \[ENHANCEMENT] AWS SD: Add optional `external_id` field to ECS/MSK/RDS/Elasticache. [#&#8203;18579](prometheus/prometheus#18579)
- \[ENHANCEMENT] AWS SD: Add optional `external_id` field. [#&#8203;17171](prometheus/prometheus#17171)
- \[ENHANCEMENT] Discovery: Propagate SD target updates faster by introducing dynamic backoff interval instead of static 5s interval for throttling. [#&#8203;18187](prometheus/prometheus#18187)
- \[ENHANCEMENT] Promtool: Add `--header` flag to `query instant` command, matching existing `query range` behaviour. [#&#8203;18418](prometheus/prometheus#18418)
- \[ENHANCEMENT]: AWS SD: Allows EC2 service discovery to discover IPv6 addresses to communicate with target endpoints. The private IPv4 address remains the default when both IPv4 and IPv6 addresses are present. [#&#8203;16088](prometheus/prometheus#16088)
- \[PERF] TSDB: Make head chunk lookup in range queries constant time instead of quadratic time [#&#8203;18302](prometheus/prometheus#18302)
- \[PERF] TSDB: Skip entire stripes in mmapHeadChunks when no series need mmapping, reducing CPU utilization significantly at production-relevant scales. [#&#8203;18541](prometheus/prometheus#18541)
- \[PERF] TSDB: Skip clean series during periodic head chunk mmap using cached head chunk count [#&#8203;18272](prometheus/prometheus#18272)
- \[PERF] PromQL: Address FloatHistogram.KahanAdd performance regression on Go 1.26. [#&#8203;18568](prometheus/prometheus#18568)
- \[BUGFIX] PromQL: Fix `info()` function incorrectly handling negated `__name__` matchers [#&#8203;17932](prometheus/prometheus#17932)
- \[BUGFIX] API: Return duration expressions in `/parse_ast`. [#&#8203;18624](prometheus/prometheus#18624)
- \[BUGFIX] API: correctly document formats accepted for duration query request parameters (step, timeout and lookback delta) in OpenAPI spec [#&#8203;18305](prometheus/prometheus#18305)
- \[BUGFIX] Scrape: AppenderV2 now tracks staleness even when OOO/duplicate series errors happen similar to AppenderV1 [#&#8203;18567](prometheus/prometheus#18567)
- \[BUGFIX] Config: Validate remote\_write queue\_config fields at load time to prevent runtime panic and silent misconfiguration. [#&#8203;18209](prometheus/prometheus#18209)
- \[BUGFIX] Discovery/Consul: Add `health_filter` for Health API filtering, fixing breakage when using Catalog-only fields like `ServiceTags` in `filter`. [#&#8203;18479](prometheus/prometheus#18479) [#&#8203;18499](prometheus/prometheus#18499)
- \[BUGFIX] OTLP: limit decompressed body size for gzip-encoded OTLP write requests. [#&#8203;18408](prometheus/prometheus#18408)
- \[BUGFIX] PromQL: Fix `smoothed` rate/increase returning zero instead of no result when all data falls strictly after the query range. [#&#8203;18523](prometheus/prometheus#18523)
- \[BUGFIX] PromQL: Fix metric name not being dropped when last\_over\_time or first\_over\_time is applied to subqueries containing name-dropping functions like abs(). [#&#8203;18409](prometheus/prometheus#18409)
- \[BUGFIX] PromQL: Fix missing warning when mixing exponential and custom-bucket histograms in stats queries. [#&#8203;18660](prometheus/prometheus#18660)
- \[BUGFIX] PromQL: Fix parsing of `range()` keyword in duration expressions such as `foo[5m+range()]`. [#&#8203;18623](prometheus/prometheus#18623)
- \[BUGFIX] PromQL: Fix smoothed vector selector returning no results in binary operations when the `@` modifier is used. [#&#8203;18531](prometheus/prometheus#18531)
- \[BUGFIX] PromQL: Reject NaN, infinite, and out-of-range duration expressions instead of silently producing an out-of-range time.Duration. [#&#8203;18639](prometheus/prometheus#18639)
- \[BUGFIX] Scrape: Fix panic when scraping malformed native histograms. [#&#8203;18414](prometheus/prometheus#18414)
- \[BUGFIX] Scrape: fix panic when scraping a target exposing a summary with no quantiles via the protobuf format. [#&#8203;18382](prometheus/prometheus#18382)
- \[BUGFIX] Scrape: fix scrape failure log file occasionally not applied after a configuration reload. [#&#8203;18421](prometheus/prometheus#18421)
- \[BUGFIX] TSDB: Allow retention percentage with new data path. [#&#8203;18628](prometheus/prometheus#18628)
- \[BUGFIX] TSDB: Preserve decimal precision in percentage-based retention [#&#8203;18374](prometheus/prometheus#18374)
- \[BUGFIX] TSDB: fix prometheus\_tsdb\_head\_chunks going negative after WAL replay [#&#8203;18401](prometheus/prometheus#18401)
- \[BUGFIX] TSDB: panic with native histograms during query of overlapping chunks. [#&#8203;18692](prometheus/prometheus#18692)
- \[BUGFIX] Tracing: fix startup failure for insecure OTLP HTTP tracing [#&#8203;18469](prometheus/prometheus#18469)
- \[BUGFIX] UI: Escape label values offered by PromQL autocomplete. [#&#8203;18658](prometheus/prometheus#18658)
- \[BUGFIX] UI: Improve Y-axis tick label precision for graph values over small ranges. [#&#8203;18682](prometheus/prometheus#18682)
- \[BUGFIX] `prometheus_sd_refresh*` and `prometheus_sd_discovered_targets` metrics for specific scrape jobs are deleted when the scrape job is removed. [#&#8203;17614](prometheus/prometheus#17614)
- \[BUGFIX] Remote: fixed validation for received RW2 requests when parsing metadata unit symbols. This fixes a case when request would cause (recovered) handler panic. [#&#8203;18641](prometheus/prometheus#18641)
- \[BUGFIX] TSDB/Agent: fix race in agent appender where concurrent appends for the same label set could produce duplicate in-memory series and duplicate WAL records. [#&#8203;18292](prometheus/prometheus#18292)
- \[BUGFIX] Config: Update `--enable-feature`  flag description and sort feature names. [#&#8203;18487](prometheus/prometheus#18487)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL21pbm9yIl19-->

Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/730
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.

Feature request: Web UI interface for delete_series

2 participants