Skip to content

proposal: add info-metric label discovery APIs for info() autocomplete - #85

Open
aknuds1 wants to merge 3 commits into
mainfrom
arve/info-autocomplete
Open

proposal: add info-metric label discovery APIs for info() autocomplete#85
aknuds1 wants to merge 3 commits into
mainfrom
arve/info-autocomplete

Conversation

@aknuds1

@aknuds1 aknuds1 commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Add a proposal for two top-level info-metric label discovery endpoints that support autocomplete for the second argument of the PromQL info() function:

  • GET|POST /api/v1/info_labels searches info data-label names.
  • GET|POST /api/v1/info_label_values searches values for one exact data-label name.

Both endpoints share the same scope: an optional instant-vector expr, repeated full metric_match[] matchers on __name__, and repeated full data_match[] matchers. Expression-derived storage selection follows the same lookback, offset, and @ semantics as an instant info() evaluation.

The proposal reuses the experimental search API storage and NDJSON contracts while keeping these function-specific operations at top-level paths. It specifies a per-endpoint result limit, pre-search bounds on expression-derived matcher construction, strict stream completion, and the dual search-api,promql-experimental-functions feature gate. Composite storage search is fail-closed: if any participating non-noop backend lacks storage.Searcher, setup returns a non-streaming errorType: unavailable response rather than silently omitting that backend.

The contract has been validated in both the Prometheus UI implementation and the Grafana Prometheus datasource integration.

@aknuds1
aknuds1 force-pushed the arve/info-autocomplete branch 6 times, most recently from ab1b9ec to 6bf4a84 Compare June 3, 2026 09:13
Comment thread proposals/0085-info-labels-endpoint.md Outdated
Comment thread proposals/0085-info-labels-endpoint.md Outdated

Constructing the same response with the endpoints that exist today requires either fetching far more than needed or multiple round-trips per autocomplete suggestion.

* **`/api/v1/labels` + per-name `/api/v1/label/{name}/values`** returns *all* labels matching a selector, including labels carried by the base metric, not just data labels on info metrics. Filtering client-side requires downloading the full universe of labels and then making one `/label/{name}/values` call per label of interest (N+1).

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

This works for the existing autocomplete implementations for PromQL, why doesn't it work for the info function?

@aknuds1 aknuds1 Aug 29, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Existing label search API doesn't work for info function autocomplete because it can't derive info series scope. I.e. the info function autocomplete API has to implement info semantics, in order to return data labels matching the expression.

Comment thread proposals/0085-info-labels-endpoint.md Outdated
* The response is NDJSON (`application/x-ndjson`) with the same batch + trailer contract as PROM-74.
* The endpoint is dual-gated: `--enable-feature=search-api` covers the NDJSON + parsing infrastructure it reuses; `--enable-feature=promql-experimental-functions` covers the only consumer (`info()`). Either missing flag returns the standard Prometheus JSON error with `errorType: unavailable` and a flag-specific message.

### `GET|POST /api/v1/info_labels`

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Given that this new endpoint leverages params and NDJSON from the search endpoint, perhaps this should be /api/v1/search/info_labels

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I thought about this. The (subjective) reason for not going that route was that info function autocomplete endpoint is not in the same logical family. I'm open to rethinking this, however.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

After revising the proposal in the meantime, I kept these as top-level info_* endpoints. The reason being that the endpoints (now split into two) are specific to info(). Please let me know if you still think nesting them under /api/v1/search/ would be preferable.

Comment thread proposals/0085-info-labels-endpoint.md Outdated
Comment thread proposals/0085-info-labels-endpoint.md Outdated

### 1. Extend `/api/v1/search/label_names` to optionally return values per name

Would collapse two endpoints into one. Rejected on cohesion grounds: PROM-74 keeps names and values in separate endpoints precisely so that each endpoint's response shape stays simple. The values payload is only useful when the names are scoped to info metrics, so the coupling does not belong on the general search endpoint.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I would not dismiss this option so quickly. Part of the reason for the search results format being objects/maps per record was so that additional data could be augmented with metric names, label names or label values.

The idea of extending the response format is noted https://github.com/prometheus/proposals/blob/main/proposals/0074-new-labels-values-api.md#extensibility-for-mimir-thanos-cortex.

This endpoint could be extended to include a "include_values=true&values_limit=10" and the values collections could be decorated into each label record.

We already have the "only useful in a certain context" problem on the metric_names endpoint. It supports the include_metadata=true to decorate in metric metadata records for each metric name. But this only can decorate metric names where we have metadata. It's acceptable that this part of the response may not be there.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Thanks for the feedback @tcp13equals2, will consider.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

The proposal has been significantly revised in the meantime. Are you suggesting though to use /api/v1/search/label_names for info function autocomplete? I'm ruling that out for the reason that the autocomplete API needs info() specific semantics.

@itsmylife

Copy link
Copy Markdown

I've implemented a PoC in grafana-prometheus-datasource using your PoC in arve/info-autocomplete branch.

From PoC stand point it's working nicely. But we should challenge the return value data type (instead of returning all potential labels/values we might return labels and then values for the selected label. In simple terms I'd like to follow current labels and and label/<label-key>/values style. I think this'll make auto complete easier. It'll also help client to fetch less data.

@aknuds1
aknuds1 force-pushed the arve/info-autocomplete branch 2 times, most recently from 1cb8122 to 8a7dc22 Compare July 17, 2026 12:15
@aknuds1 aknuds1 changed the title WIP: proposal: /api/v1/info_labels endpoint for info() autocomplete WIP: proposal: add info-metric label discovery APIs for info() autocomplete Jul 17, 2026
@aknuds1
aknuds1 force-pushed the arve/info-autocomplete branch from 8a7dc22 to ebb9e87 Compare July 17, 2026 13:54
Signed-off-by: Arve Knudsen <arve.knudsen@gmail.com>
Document the request profiles and client requirements learned from the Grafana info() autocomplete proof of concept. Clarify expression interpolation, response bounds, and terminal NDJSON handling.

Signed-off-by: Arve Knudsen <arve.knudsen@gmail.com>
@aknuds1
aknuds1 force-pushed the arve/info-autocomplete branch 2 times, most recently from 37ac590 to ab6ea6e Compare August 29, 2026 11:07
@aknuds1 aknuds1 changed the title WIP: proposal: add info-metric label discovery APIs for info() autocomplete proposal: add info-metric label discovery APIs for info() autocomplete Aug 29, 2026
@aknuds1
aknuds1 force-pushed the arve/info-autocomplete branch from ab6ea6e to 11a8be7 Compare August 29, 2026 12:24
@aknuds1
aknuds1 marked this pull request as ready for review August 29, 2026 12:50
@aknuds1

aknuds1 commented Aug 29, 2026

Copy link
Copy Markdown
Contributor Author

But we should challenge the return value data type (instead of returning all potential labels/values we might return labels and then values for the selected label.

@itsmylife This dual-endpoint scheme has been implemented. Thanks for the feedback!

@aknuds1
aknuds1 requested review from colega and tcp13equals2 and removed request for colega August 29, 2026 13:27
Signed-off-by: Arve Knudsen <arve.knudsen@gmail.com>
@aknuds1
aknuds1 force-pushed the arve/info-autocomplete branch from 11a8be7 to 477232b Compare August 29, 2026 14:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants