Skip to content

[New Integration] Add Qdrant integration - #22347

Open
lbarrosby wants to merge 2 commits into
elastic:mainfrom
lbarrosby:qdrant-integration
Open

lbarrosby wants to merge 2 commits into
elastic:mainfrom
lbarrosby:qdrant-integration

Conversation

@lbarrosby

Copy link
Copy Markdown

Proposed commit message

Add a Qdrant integration. The metrics data stream scrapes the Prometheus endpoint of the Qdrant REST API with the prometheus/metrics input and maps the metrics defined in Qdrant's src/common/metrics to qdrant.* fields: REST responses by method, endpoint and status, the REST response time histogram and the longest response time, number of collections and vectors, points and vectors per collection, running optimizations, update queue length and deferred points, active and dead replicas, shard transfers, snapshots, resident and allocated memory, distributed mode and recovery mode. Series labels are kept under qdrant.labels.* and a fingerprint of them is the TSDB dimension.

Includes an overview dashboard written as a YAML dashboard. ES|QL panels use TS (Kibana 9.2+); the response time percentiles are a Lens panel because ES|QL does not read histogram fields.

gRPC metrics and the experimental collection_hardware_metric_* counters are left out.

How to test this PR locally

elastic-package check
elastic-package test pipeline
elastic-package test system

Pipeline test input is real metricbeat 9.5.6 output scraped from the /metrics output of Qdrant 1.20 (the same capture the system test serves through the stream mock). Every ES|QL query in the dashboard was run against Elasticsearch 9.5.6 with TSDB data indexed through the package's ingest pipeline. kb-dashboard-lint check reports no issues and kb-dashboard compile output is committed.

Not tested yet: elastic-package test system (I had no Docker available) and rendering the Lens panel in Kibana. sample_event.json comes from the pipeline test.

AI disclosure: written with the help of Claude Code, reviewed and tested by me.

Signed-off-by: Lucas Barros <lucasbarros.kam@gmail.com>
@lbarrosby
lbarrosby requested a review from a team as a code owner November 7, 2026 21:31
Copilot AI balanced review requested due to automatic review settings November 7, 2026 21:31
@elastic-vault-github-plugin-prod

Copy link
Copy Markdown
Contributor

Reviewers

Buildkite doesn't run automatically for external contributions. To start one, a
user who is a member of the elastic GitHub organization or who has write access
to this repository needs to add a comment:

  • /test : will kick off a build in Buildkite.

Commenting /test as an external contributor without write access will not start a
build. In that case, please ask a maintainer to review the pull request and start
the build.

NOTE: https://github.com/elastic/integrations/blob/main/.buildkite/pull-requests.json contains all those details.

Signed-off-by: Lucas Barros <lucasbarros.kam@gmail.com>

Copilot AI left a comment

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.

🟡 Changes recommended

The pipeline drops failed-scrape diagnostics, and the dashboard-wide collection filter removes unlabeled REST, memory, and replica data from their panels.

2 open issues
What changed in this PR

Adds a Qdrant integration to Elastic’s integration catalog, collecting Prometheus metrics for REST traffic, collections, cluster health and memory.

Changes:

  • Configures metric collection, field mappings and time-series storage.
  • Adds an overview dashboard with ES|QL panels and Lens latency percentiles.
  • Includes documentation, pipeline fixtures and a mock service for system testing.
File Description
packages/​qdrant/​manifest.yml Defines package metadata, compatibility and input.
packages/​qdrant/​LICENSE.txt Adds the Elastic License 2.0.
packages/​qdrant/​kibana/​dashboard/​qdrant-overview.json Provides the compiled overview dashboard.
packages/​qdrant/​img/​qdrant-logo.svg Adds the integration logo.
packages/​qdrant/​docs/​README.md Provides generated setup and reference documentation.
packages/​qdrant/​data_stream/​metrics/​sample_event.json Shows a processed REST metrics event.
packages/​qdrant/​data_stream/​metrics/​manifest.yml Defines collection settings and time-series indexing.
packages/​qdrant/​data_stream/​metrics/​fields/​fields.yml Defines Qdrant metrics and labels.
packages/​qdrant/​data_stream/​metrics/​fields/​ecs.yml Declares shared fields and time-series dimensions.
packages/​qdrant/​data_stream/​metrics/​fields/​base-fields.yml Defines dataset identity and timestamp fields.
packages/​qdrant/​data_stream/​metrics/​elasticsearch/​ingest_pipeline/​default.yml Maps metrics, fingerprints labels and drops unmapped events.
packages/​qdrant/​data_stream/​metrics/​agent/​stream/​stream.yml.hbs Configures scraping, authentication and TLS.
packages/​qdrant/​data_stream/​metrics/​_dev/​test/​system/​test-default-config.yml Connects system tests to the mock endpoint.
packages/​qdrant/​data_stream/​metrics/​_dev/​test/​pipeline/​test-qdrant-metrics.json-expected.json Records expected pipeline output.
packages/​qdrant/​data_stream/​metrics/​_dev/​test/​pipeline/​test-qdrant-metrics.json Supplies captured collector events for pipeline tests.
packages/​qdrant/​changelog.yml Records the initial release.
packages/​qdrant/​_dev/​shared/​kibana/​qdrant-overview.yaml Defines dashboard panels and controls in YAML.
packages/​qdrant/​_dev/​deploy/​docker/​files/​config.yml Serves captured Prometheus metrics through a mock endpoint.
packages/​qdrant/​_dev/​deploy/​docker/​docker-compose.yml Configures the mock service container.
packages/​qdrant/​_dev/​build/​docs/​README.md Supplies the documentation source template.
packages/​qdrant/​_dev/​build/​build.yml Pins the ECS build dependency.

Review effort: Balanced

Comment on lines +14 to +17
- type: options
label: Collection
data_view: metrics-*
field: qdrant.labels.id
- drop:
tag: drop_unmapped_events
description: Drop events that carry no metric mapped by this integration.
if: ctx.qdrant == null || ctx.qdrant.keySet().stream().allMatch(k -> k == 'labels' || k == 'labels_fingerprint')
Copilot AI balanced review requested due to automatic review settings November 7, 2026 21:36

Copilot AI left a comment

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.

🔵 Needs a closer look

Scrape-error events are silently dropped, collection filtering hides unrelated dashboard metrics, and missing explicit label mappings can break ES|QL queries on fresh nodes.

2 open issues
1 previously missed issue

In code that hasn't changed since last review

Medium severity Explicitly map dashboard-referenced label fields

packages/​qdrant/​data_stream/​metrics/​fields/​fields.yml:9

The wildcard supplies a dynamic template, not concrete mappings for the labels referenced by the ES|QL panels. On a fresh node with no collections, qdrant.labels.id is never indexed, so the collection and snapshot queries fail with an unknown-column error rather than showing no data. Explicitly map the dashboard-referenced label fields while retaining the wildcard for other labels.

Review effort: Balanced

@qcorporation qcorporation added documentation Improvements or additions to documentation. Applied to PRs that modify *.md files. enhancement New feature or request New Integration Issue or pull request for creating a new integration package. labels Nov 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation. Applied to PRs that modify *.md files. enhancement New feature or request New Integration Issue or pull request for creating a new integration package.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants