All Projects

Qdrant Exporter.

Prometheus metrics for self-hosted Qdrant — the per-collection, per-shard, and cluster data the native /metrics endpoint never exposes.

Observability / InfraActiveApache 2.0Pythonpull-basedGrafanaDocker Hub · GHCR
1,757
Docker pulls
Docker Hub
1,031
Dashboard installs
grafana.com
6
GitHub stars
GitHub
34
Metrics exposed
3
Metric groups
4
Dashboard rows
1.7–1.17
Qdrant range

Overview

Problem

The native endpoint stops at Go runtime stats

Qdrant's built-in /metrics covers process-level stats and basic request counts. The interesting data — vectors per collection, shard health, optimizer state, search latency by type — lives in the /telemetry and /cluster JSON endpoints, which Prometheus can't scrape directly.

The detailed exporter Qdrant does ship (qdrant-cluster-exporter) is cloud-only. This project closes that gap for anyone running Qdrant on bare metal or plain Docker.

Coverage

34 metrics across three groups

Every metric is prefixed qdrant_exporter_ and grouped by what it answers.

Collections
vectors, points, segments, shard state
Cluster
Raft term, peers, leader, shard transfers
Performance
search latency, indexing ratio, RAM/disk
Configuration

One detail knob that actually matters

Per-collection shard and storage metrics come from GET /telemetry?details_level=N. On Qdrant 1.16+, the legacy details_level=3 style often returns only a collection count with the nested collections array missing — so most qdrant_exporter_* series never appear. The exporter defaults to telemetry_details_level: 3 the correct way; override it via QDRANT_EXPORTER_QDRANT__TELEMETRY_DETAILS_LEVEL if a specific deployment still needs a different value.

Dashboard

Four rows, auto-provisioned

The bundled Grafana dashboard is wired up automatically by the Docker Compose profiles — no manual datasource or JSON import needed for the default setup.

Overview
collections, vectors, points, cluster mode, health tiles
Search Performance
req/s, latency by type, error rate
Storage & Indexing
indexing ratio, RAM/disk, optimizer runs
Cluster
Raft leader, pending ops, shard transfers

How it works

The exporter is pull-based: on every Prometheus scrape it queries Qdrant fresh, reshapes the response into Prometheus series, and hands it off.

Qdrant
/telemetry, /cluster, /collections
Exporter
:9153/metrics, queried per scrape
Prometheus
scrapes every 15s
Grafana
auto-provisioned dashboard

In the terminal

curl :9153/metrics
$ curl -s http://localhost:9153/metrics | head
# HELP qdrant_exporter_collection_vectors_total Total vectors
# TYPE qdrant_exporter_collection_vectors_total gauge
qdrant_exporter_collection_vectors_total{collection="docs"} 128400
# HELP qdrant_exporter_collection_indexed_ratio Indexed vectors / total (0-1)
# TYPE qdrant_exporter_collection_indexed_ratio gauge
qdrant_exporter_collection_indexed_ratio{collection="docs"} 0.98
# HELP qdrant_exporter_cluster_is_leader 1 = this node is the Raft leader
# TYPE qdrant_exporter_cluster_is_leader gauge
qdrant_exporter_cluster_is_leader 1

Install & use

Docker Hub
$ docker run -d --name qdrant-exporter -p 9153:9153 \
$ -e QDRANT_EXPORTER_QDRANT__NODES='[{"url":"http://host.docker.internal:6333"}]' \
$ --add-host host.docker.internal:host-gateway \
$ baselhusam/qdrant-exporter
pip (no Docker)
$ pip install qdrant-exporter
$ qdrant-exporter --config qdrant-exporter.yaml
quick start
$ git clone https://github.com/baselhusam/qdrant_exporter
$ cd qdrant_exporter
$ docker compose --profile fullstack up -d # Qdrant + exporter + Prometheus + Grafana
$ open http://localhost:3000 # Grafana, admin / admin

Built with

Python
exporter core
Prometheus client
metrics exposition
Qdrant HTTP API
telemetry, cluster, collections
Docker
Docker Hub + GHCR images
Grafana
auto-provisioned dashboard
YAML config
env-var overridable