New to Kestra?
Use blueprints to kickstart your first workflows.
Audit Qdrant vector collection health, status, and HNSW indexing lag with Kestra. Detect degraded indexes and dispatch automated operational Slack alerts.
In production AI retrieval-augmented generation (RAG) and semantic search architectures, vector databases like Qdrant ingest continuous streams of high-dimensional embeddings. As new vectors arrive, points remain unindexed in memory buffers until Qdrant's background HNSW segment optimizers consolidate them into search graphs. If indexing threads stall, memory constraints arise, or collection status transitions to Yellow or Red, vector queries fall back to exact brute-force scanning, causing severe query latency spikes and RAG timeouts.
This blueprint implements an automated Day 2 Operations sentinel flow that queries Qdrant collection metadata on a recurring schedule. It inspects operational cluster status, compares total points against indexed vector counts to measure unindexed vector lag, evaluates health against warning thresholds, and dispatches real-time Slack notifications when indexing falls behind SLA targets.
schedule (io.kestra.plugin.core.trigger.Schedule) triggers the audit pass every 6 hours (disabled by default for initial setup).probe_collection (io.kestra.plugin.qdrant.CollectionInfo) queries collection metadata over gRPC, extracting operational status, point counts, indexed vector counts, and vector configuration dimensions.evaluate_health (io.kestra.plugin.core.flow.Switch) evaluates whether collection status is degraded (status != 'Green') or whether unindexed points (pointsCount - indexedVectorsCount) exceed max_unindexed_lag.HEALTHY), log_healthy_status records the green state and metrics.DEGRADED), alert_collection_degraded dispatches an operational alert to Slack using io.kestra.plugin.slack.notifications.SlackIncomingWebhook, and log_remediation_guidance logs actionable optimization telemetry.log_audit_completion writes a final audit recap for execution tracking and lineage.errors block alerts Slack immediately if gRPC connectivity or authentication fails.Green, Yellow, Red, Grey).Monitoring vector database indexing health with isolated cron scripts requires managing gRPC client dependencies, credential rotation, error handling, and alerting integrations in custom application code. Kestra provides a declarative workflow engine with native Qdrant gRPC integration, centralized secret management, conditional branching, execution history, and native Slack notifications without maintaining custom monitoring infrastructure.
enterprise-knowledge-base).To run Qdrant locally for development and testing while avoiding host port 8080 conflicts:
docker run -d --name qdrant-dev -p 6333:6333 -p 6334:6334 qdrant/qdrant:latest
If Kestra is running inside a Docker network, connect the Qdrant container to Kestra network:
docker network ls
docker network connect YOUR_KESTRA_NETWORK qdrant-dev
QDRANT_API_KEY: API key or Bearer token for authenticated Qdrant instances (leave blank or placeholder for local dev without auth).SLACK_WEBHOOK: Incoming Webhook URL for Slack alerting.Note for Kestra Open-Source (OSS): Secrets are provided as base64-encoded environment variables formatted as
SECRET_<NAME>on the Kestra server or worker environment.
| Name | Type | Default | Allowed Values | Description |
|---|---|---|---|---|
qdrant_host |
STRING | "localhost" |
Hostname or IP | Qdrant gRPC endpoint host |
qdrant_port |
INT | 6334 |
1-65535 | Qdrant gRPC service port |
collection_name |
STRING | "enterprise-knowledge-base" |
Any valid collection name | Target Qdrant vector collection |
max_unindexed_lag |
INT | 100 |
Positive integer | Max allowable unindexed vector gap |
remediation_mode |
SELECT | "ALERT_ONLY" |
"ALERT_ONLY", "OPTIMIZE_LOG" |
Operational remediation action mode |
dry_run |
SELECT | "true" |
"true", "false" |
Dry run simulation flag |
{{ outputs.probe_collection.status }}: Operational status of the collection (Green, Yellow, Red, Grey).{{ outputs.probe_collection.pointsCount }}: Approximate total number of points stored in the collection.{{ outputs.probe_collection.indexedVectorsCount }}: Approximate number of vectors indexed for HNSW search.{{ outputs.probe_collection.vectorSize }}: Dimension size of vectors configured for this collection.QDRANT_API_KEY and SLACK_WEBHOOK in your Kestra namespace secrets.dry_run: "true" to verify gRPC connectivity and collection metadata extraction.schedule trigger to run automated recurring audits./collections/{name}/index API.DEGRADED branch for critical production RAG outages.io.kestra.plugin.core.flow.Subflow to throttle upstream vector embedding ingestion during re-indexing spikes.indexedVectorsCount naturally lags as background indexing runs. Adjust max_unindexed_lag according to your typical ingestion batch size.