Resumen

  • VectorAI DB ofrece métricas nativas de Prometheus para supervisar la latencia, la memoria, los errores y el estado de los índices.
  • En este tutorial se crea una pila de monitorización de Docker Compose con VectorAI DB, Prometheus y Grafana.
  • Un panel de control de cuatro ventanas muestra la tasa de solicitudes, la latencia p95, los errores de gRPC y la presión de memoria.
  • Ocho reglas de alerta ayudan a los equipos a detectar el modo de recuperación, los fallos en la reconstrucción, la alta latencia y la sobrecarga de recursos.
  • Esta configuración ayuda a los equipos a identificar problemas de rendimiento antes de que afecten a las cargas de trabajo de búsqueda vectorial y RAG en producción.

VectorAI DB ofrece una interfaz nativa /metrics punto final en formato Prometheus/OpenMetrics en el puerto 6573. Este tutorial integra ese punto final en una pila de Docker Compose con Prometheus y Grafana, crea un panel de control de cuatro paneles que puedes importar directamente y configura ocho reglas de alerta según la documentación de monitorización de VectorAI DB. Antes de proceder a la configuración, a continuación te explicamos qué es lo que realmente miden esas métricas.

Qué mide la supervisión de bases de datos de Vector

La supervisión de bases de datos vectoriales consiste en vigilar una serie de indicadores clave para garantizar que la base de datos funcione según lo previsto. Entre estos indicadores se incluyen la latencia de las consultas, el uso de memoria, el uso de la CPU, el estado de los índices y la calidad de recuperación. Cada uno de ellos se corresponde con una métrica específica de tu instancia de VectorAI DB.

La latencia de la consulta es el tiempo que tarda la búsqueda de los k vecinos más cercanos en devolver resultados. Dado que la búsqueda vectorial se basa en la similitud y no en coincidencias exactas, es el primer dato que tiene en cuenta tu SLA. VectorAI DB realiza un seguimiento de este dato a través de actian_vectorai_rest_responses_duration_seconds (p95/p99 por punto final). En situaciones de presión de memoria o durante la reconstrucción de un índice, la latencia puede dispararse muy por encima del nivel de referencia normal, pasando en ocasiones de unos 20 ms a 500 ms.

El actian_vectorai_memory_resident_bytes Esta métrica muestra cuánta memoria RAM consumen los índices de tus vectores. Otra métrica clave es actian_vectorai_process_major_page_faults_total. Un aumento constante en este valor indica que hay presión sobre la memoria y puede ser señal de que el sistema operativo está recuperando páginas del almacenamiento en disco, lo que suele aumentar la latencia de las consultas.

actian_vectorai_process_threads muestra el número de subprocesos durante los cálculos de similitud. Un aumento del número de subprocesos bajo carga refleja la demanda del procesador, y al combinarlo con las métricas de la CPU a nivel del sistema procedentes del exportador de nodos de Prometheus, se obtiene una visión completa de la situación.

El índice de estado te permite conocer lo que ocurre en segundo plano. El actian_vectorai_collection_running_optimizations y actian_vectorai_rebuild_running Las métricas indican cuándo se están llevando a cabo las reconstrucciones. actian_vectorai_rebuild_failed_total registra cualquier fallo, y actian_vectorai_rebuild_duration_seconds muestra cuánto tiempo tardan las reconstrucciones.

VectorAI DB no muestra el «recall» —el porcentaje de vecinos más cercanos correctos devueltos— como métrica en tiempo real. Valídalo fuera de línea con un conjunto de prueba etiquetado y utiliza, en su lugar, la latencia y la tasa de error.

Lo que vas a crear

Poner VectorAI DB en producción implica poder mostrar cómo se comporta el sistema bajo carga, cómo detectar un estado de degradación y cómo recibirías una alerta antes de que se produzca un incidente. La monitorización es especialmente importante para las cargas de trabajo de generación aumentada por recuperación (RAG) que utilizan modelos de lenguaje a gran escala, ya que los picos de latencia o los fallos en los índices pueden degradar la calidad de la respuesta de la IA. Una configuración de monitorización adecuada te avisa de cuándo aumenta la latencia, cuándo se acumula presión en la memoria y cuándo fallan las reconstrucciones de índices, antes de que nada de esto llegue a los usuarios.

VectorAI DB ofrece un /metrics punto final en el puerto 6573 en formato Prometheus/OpenMetrics, por lo que no necesitas exportadores ni agentes adicionales para la aplicación metrics. El exportador de nodos opcional de Prometheus recoge datos sobre la CPU y la memoria a nivel de host si necesitas una visibilidad de todo el sistema que vaya más allá de lo que ofrece directamente VectorAI DB.

En este tutorial, conectarás ese punto final a una pila de Docker Compose con VectorAI DB, Prometheus y Grafana. Crearás un panel de control de cuatro paneles que podrás importar de inmediato y configurarás ocho reglas de alerta siguiendo la documentación de monitorización de VectorAI DB.

Al final, tendrás un panel de control y unas reglas de alerta configuradas que se ejecutarán en tu propia instancia.

Qué datos revela el punto final de métricas sobre el rendimiento de las bases de datos vectoriales

VectorAI DB ofrece sus métricas en GET /metrics en el puerto de la API REST (por defecto, el 6573) en formato Prometheus/OpenMetrics. Este punto final no requiere autenticación, por lo que, si lo expones a una red pública, debes protegerlo con un cortafuegos o un proxy inverso y controles de acceso.

Todas las métricas comienzan con el actian_vectorai_ prefijo. En la tabla siguiente se enumeran las principales métricas en seis categorías, indicando su tipo y lo que revelan sobre el estado del sistema y el uso de los recursos.

Métrico (sin prefijo) Tipo Qué te indica
información_de_la_app Calibre Identidad y versión de la aplicación
app_status_modo_recuperación Calibre 1 si el motor está en modo de recuperación; 0 en caso contrario
total_colecciones Calibre Número total de colecciones, en memoria y en disco
total_puntos_de_recogida Calibre Recuento total de puntos en todas las colecciones
vectores_de_recopilación Calibre Número de vectores por espacio vectorial dado
optimizaciones_en_curso_de_la_recopilación Calibre 1 si una colección está en proceso de reconstrucción, 0 si está inactiva
rebuild_running Calibre 1 si se está llevando a cabo una reconstrucción de una colección
rebuild_failed_total Contador Recuento acumulado de reconstrucciones fallidas o canceladas
duración_de_la_reconstrucción_en_segundos Histograma Tiempo necesario para completar la reconstrucción de un índice
rest_responses_total Contador Respuestas REST por punto final, método y estado
rest_responses_fail_total Contador Respuestas REST que devolvieron un código de estado 5xx
rest_responses_duration_seconds Histograma Latencia de las solicitudes REST por punto final y método
grpc_responses_total Contador Respuestas de gRPC por método y estado
grpc_responses_fail_total Contador Respuestas de gRPC con un estado de error
grpc_responses_duration_seconds Histograma Latencia de las llamadas gRPC por método
bytes_residentes_en_memoria Calibre Memoria RAM consumida por el proceso (RSS)
hilos_de_proceso Calibre Recuento de comentarios en directo
process_open_fds Calibre Número de descriptores de archivo abiertos
total_de_fallos_de_página_graves_del_proceso Contador Faltas de página importantes desde el inicio del proceso
uso_del_disco_en_bytes Calibre Espacio en disco ocupado por la ruta de datos del proceso

Configurar la pila

Requisitos previos

Antes de empezar, instala lo siguiente:

    • Docker y Docker Compose
    • Python 3.10 o superior
    • VectorAI DB (regístrate en la edición para la comunidad)
    • SDK de Python de Actian-VectorAI-Client: pip install actian-vectorai-client

Asegúrate de que tu ordenador tenga al menos 8 GB de RAM (se recomiendan 16 GB) y 10 GB de espacio en disco.

Si utilizas Windows, ejecuta todos los comandos en WSL2. Para configurar WSL2, ejecuta wsl --install en PowerShell, utiliza el terminal de Ubuntu para este tutorial.

Estructura del proyecto

Crea un directorio para el proyecto y una estructura de carpetas:

mkdir -p vectorai-observability/{prometheus,grafana,scripts}
cd vectorai-observability

touch docker-compose.yml prometheus/prometheus.yml prometheus/alert_rules.yml scripts/load_test.py

El directorio de tu proyecto debería tener este aspecto:

vectorai-observability/

├── docker-compose.yml

├── prometheus/

│   ├── prometheus.yml

│   └── alert_rules.yml

├── grafana/

└── scripts/

    └── load_test.py

Tu pila de observabilidad se ejecutará como tres servicios de Docker Compose: VectorAI DB (REST/métricas en el puerto 6573, gRPC en el puerto 6574 y la interfaz de usuario local en el puerto 6575), Prometheus (puerto 9090) y Grafana (puerto 3000).

services:
  vectorai:
    image: actian/vectorai:latest
    platform: linux/amd64
    container_name: vectorai
    ports:
      - "6573:6573"
      - "6574:6574"
      - "6575:6575"
    volumes:
      - ./local_data:/var/lib/actian-vectorai
    environment:
      - ACTIAN_VECTORAI_ACCEPT_EULA=YES
    restart: unless-stopped

  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - ./prometheus/alert_rules.yml:/etc/prometheus/alert_rules.yml
    command:
      - "--config.file=/etc/prometheus/prometheus.yml"
    restart: unless-stopped
    depends_on:
      - vectorai

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
    restart: unless-stopped
    depends_on:
      - prometheus

volumes:
  grafana_data:

Añade esto a prometheus/prometheus.yml. En las implementaciones de Docker Compose, Prometheus identifica VectorAI DB por el nombre del servicio. Si estás ejecutando VectorAI DB como un contenedor independiente fuera de la red de Compose, utiliza host.docker.internal:6573 en su lugar, como destino de la extracción:

global:
  scrape_interval: 15s

rule_files:
  - "alert_rules.yml"

scrape_configs:
  - job_name: "vectorai"
    scrape_interval: 15s
    static_configs:
      - targets: ["vectorai:6573"]

docker compose up -d

Ir a localhost:9090/targets. El vectorai El trabajo debería mostrar 1/1 UP con una duración de la lectura inferior a 20 ms. Si muestra DOWN, comprueba que el puerto 6573 esté abierto y que ningún cortafuegos esté bloqueando la conexión.

Etiquetas Vectorai

Ir a localhost:3000 e inicia sesión con tus credenciales de administrador. A continuación, ve a «Conexiones», selecciona «Fuentes de datos», haz clic en «Añadir nueva fuente de datos», selecciona «Prometheus» y configura la URL en http://prometheus:9090, configúralo como predeterminado y guarda los cambios.

Fuentes de datos de Grafana

Crear el panel de control de la base de datos Vector

El panel de control supervisa cuatro indicadores clave: la tasa de solicitudes, la latencia p95, la tasa de errores y la presión de memoria. La supervisión de estos indicadores te ayuda a optimizar el rendimiento de la indexación y la búsqueda. Añade las siguientes consultas PromQL al archivo grafana/dashboard.json a medida que creas cada panel en Grafana.

Panel 1: Frecuencia de solicitudes REST por punto de conexión

Este panel muestra el rendimiento de las consultas por punto final a lo largo del tiempo. Crea un panel de series temporales con esta consulta PromQL:

sum by (endpoint) (rate(actian_vectorai_rest_responses_total[5m]))

Establece el formato de la leyenda en {{endpoint}}. Muestra el rendimiento de cada punto final, lo que te permite identificar qué rutas están generando carga y detectar patrones de consultas antes de que afecten al rendimiento.

Panel 2: Latencia de REST p95 por punto final

Esta es la señal de latencia principal para la supervisión del SLA. Métricas de histograma de Prometheus actian_vectorai_rest_responses_duration_seconds exponer automáticamente _bucket serie, que es lo que histogram_quantile para realizar consultas. Crea un panel de series temporales:

histogram_quantile(0.95, sum by (le, endpoint) (rate(actian_vectorai_rest_responses_duration_seconds_bucket[5m])))

Establece el formato de la leyenda en {{endpoint}}. Si la latencia aumenta mientras que la tasa de solicitudes se mantiene constante, podría indicar una sobrecarga de memoria o una reconstrucción de índices que afecte al rendimiento de las búsquedas.

Panel 3: Índice de errores de gRPC

El SDK de Python se comunica a través de gRPC, por lo que la supervisión de errores se lleva a cabo en la capa de gRPC. Crea un panel de estadísticas con:

sum(rate(actian_vectorai_grpc_responses_fail_total[5m]))
/
(sum(rate(actian_vectorai_grpc_responses_total[5m])) > 0 or vector(1))

La consulta devuelve una fracción comprendida entre 0 y 1. Establece los valores umbral en 0,01 para el verde, 0,05 para el amarillo y cualquier valor superior a 0,05 para el rojo, o configura la unidad de Grafana en percent (0-1) para mostrar los valores en forma de porcentajes de forma automática. El panel pasa de verde a amarillo a medida que los errores se acercan al 5 %, y a rojo una vez que superan ese umbral, lo que permite detectar una consulta de recopilación errónea o un fallo de conectividad antes de que la situación se agrave.

Módulo 4: Presión de memoria

Este panel realiza un seguimiento de dos señales que, en conjunto, indican si el motor está funcionando dentro de los límites seguros de utilización de la memoria. Crea un panel de series temporales con dos consultas:

# RSS: RAM consumed by vector indexes
actian_vectorai_memory_resident_bytes

# Early warning signal for disk paging
rate(actian_vectorai_process_major_page_faults_total[5m])

Establece las etiquetas de la leyenda en RSS y Major Page Faults/s. Si la tasa de fallos aumenta cuando el RSS se acerca a su límite, el motor recurrirá al disco y la latencia aumentará rápidamente.

Una vez que hayas configurado los cuatro paneles, abre la configuración de Dashboard, ve a «Modelo JSON» y copia el contenido. Guárdalo en grafana/dashboard.json. Este archivo también se encuentra en el Repositorio de GitHub, así que puedes clonar el repositorio e importarlo a Grafana de inmediato.

Panel de control de Grafana REST

Configurar reglas de alerta

Añade las siguientes reglas de alerta a prometheus/alert_rules.yml. Prometheus los carga automáticamente al iniciarse a través del rule_files directiva en prometheus.yml.

groups:
  - name: vectorai
    rules:
      - alert: VectorAIHighRESTErrorRate
        expr: >
          sum(rate(actian_vectorai_rest_responses_fail_total[5m]))
          /
          sum(rate(actian_vectorai_rest_responses_total[5m]))
          > 0.05
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "VectorAI DB REST error rate above 5%"
          description: "{{ $value | humanizePercentage }} of REST requests are returning errors."

      - alert: VectorAIHighRESTLatency
        expr: >
          histogram_quantile(0.95, sum by (le) (rate(actian_vectorai_rest_responses_duration_seconds_bucket[5m])))
          > 2
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "VectorAI DB REST p95 latency above 2s"
          description: "REST p95 latency is {{ $value }}s."

      - alert: VectorAIHighGRPCErrorRate
        expr: >
          sum(rate(actian_vectorai_grpc_responses_fail_total[5m]))
          /
          sum(rate(actian_vectorai_grpc_responses_total[5m]))
          > 0.05
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "VectorAI DB gRPC error rate above 5%"
          description: "{{ $value | humanizePercentage }} of gRPC calls are failing."

      - alert: VectorAIRecoveryModeActive
        expr: actian_vectorai_app_status_recovery_mode == 1
        for: 0m
        labels:
          severity: critical
        annotations:
          summary: "VectorAI DB is in recovery mode"
          description: "The engine has entered recovery mode and requires immediate attention."

      - alert: VectorAIHighMemoryUsage
        expr: actian_vectorai_memory_resident_bytes > 0.8 * 8589934592  # Replace with your memory limit in bytes
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "VectorAI DB memory usage above 80%"
          description: "RSS is {{ $value | humanize }}B, exceeding 80% of available memory."

      - alert: VectorAIMajorPageFaultsRising
        expr: rate(actian_vectorai_process_major_page_faults_total[5m]) > 10
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "VectorAI DB major page faults rising"
          description: "Sustained major page faults indicate memory pressure and potential disk paging."

      - alert: VectorAIFileDescriptorExhaustion
        expr: actian_vectorai_process_open_fds > 0.8 * 65536  # Replace with your system fd limit
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "VectorAI DB file descriptors approaching limit"
          description: "Open file descriptors at {{ $value }}, approaching 80% of system limit."

      - alert: VectorAIRebuildFailures
        expr: rate(actian_vectorai_rebuild_failed_total[1h]) > 0
        for: 0m
        labels:
          severity: warning
        annotations:
          summary: "VectorAI DB index rebuild failure detected"
          description: "One or more index rebuilds have failed in the last hour."

Hay dos reglas que utilizan valores específicos del entorno que debes configurar antes de la implementación. VectorAIHighMemoryUsage se activa cuando el RSS supera el 80 % de la memoria disponible, así que sustituye 8589934592 con tu límite de memoria real en bytes. VectorAIFileDescriptorExhaustion se activa cuando los descriptores de archivo abiertos se acercan al 80 % del límite del sistema, así que sustituye 65536 con el resultado de ulimit -n en tu servidor.

VectorAIRecoveryModeActive y VectorAIRebuildFailures uso for: 0m, lo que significa que se activan de inmediato, en lugar de esperar a que se produzca una condición prolongada. Los fallos en el modo de recuperación y en la reconstrucción deben atenderse en el momento en que se producen, no tras un plazo de cinco minutos.

Comprueba que las ocho reglas se hayan cargado correctamente accediendo a localhost:9090/alerts.

Prometheus VectorAI

Validar bajo carga

Ejecuta el script de prueba de carga para generar tráfico de consultas real en tu instancia de VectorAI DB. Añade lo siguiente a scripts/load_test.py:

import random
import time
from concurrent.futures import ThreadPoolExecutor
from actian_vectorai import VectorAIClient, VectorParams, Distance

COLLECTION = "load_test"
DIMENSION = 128
TOTAL_QUERIES = 1000
RPS = 50
DURATION = 60

def random_vector(dim):
    return [random.uniform(-1, 1) for _ in range(dim)]

def run_query(client):
    try:
        client.points.search(
            collection_name=COLLECTION,
            vector=random_vector(DIMENSION),
            limit=10
        )
    except Exception as e:
        print(f"Query error: {e}")

def main():
    with VectorAIClient("localhost:6574") as client:
        try:
            client.collections.create(
                name=COLLECTION,
                vectors_config=VectorParams(size=DIMENSION, distance=Distance.Cosine)
            )
            print(f"Created collection: {COLLECTION}")
        except Exception as e:
            print(f"Collection {COLLECTION} already exists, continuing... ({e})")

        print(f"Running {TOTAL_QUERIES} queries at {RPS} req/s for {DURATION}s...")
        interval = 1.0 / RPS
        start = time.time()
        count = 0

        with ThreadPoolExecutor(max_workers=10) as executor:
            while count < TOTAL_QUERIES and (time.time() - start) < DURATION:
                executor.submit(run_query, client)
                count += 1
                time.sleep(interval)

        elapsed = time.time() - start
        print(f"Done. {count} queries in {elapsed:.1f}s ({count/elapsed:.1f} req/s)")

if __name__ == "__main__":
    main()

A continuación, ejecútalo:

python scripts/load_test.py

El script se conecta a la base de datos de VectorAI a través de gRPC en el puerto 6574, crea una colección de 128 dimensiones y envía 1.000 consultas de vectores aleatorios a un ritmo de 50 solicitudes por segundo durante 60 segundos. A medida que se ejecuta el script, el panel de tasa de solicitudes registra el tráfico, la latencia p95 se estabiliza y la tasa de errores de gRPC se mantiene en cero.

Para que se active el panel de índices de error, realiza una consulta sobre una colección que no exista:

from actian_vectorai import VectorAIClient

with VectorAIClient("localhost:6574") as client:
    try:
        client.points.search(
            collection_name="nonexistent_collection",
            vector=[0.1]*128,
            limit=5
        )
    except Exception as e:
        print(f"Error: {e}")

El panel de índices de error de gRPC se dispara de inmediato. Esta secuencia muestra a tu equipo cómo se comporta el sistema cuando funciona correctamente y cuando surge algún problema.

paneles de Grafana

Tres escenarios de seguimiento

El pico en la tasa de solicitudes que has observado durante la prueba de carga es lo que se conoce como «pico de tráfico» en un motor de recomendación de productos. Cuando ese pico se produce junto con un aumento de la latencia p95, el índice vectorial se ve sometido a presión de memoria. El panel de presión de memoria lo detecta antes de que llegue al usuario.

Los fallos en la reconstrucción de índices en un sistema de recuperación de imágenes médicas reducen silenciosamente la precisión de la recuperación sin generar ningún error. El panel de ratios de errores de gRPC no los detecta, pero actian_vectorai_rebuild_failed_total y el VectorAIRebuildFailures Se activará una alerta. La alerta se activa en el plazo de una hora tras cualquier fallo, y la supervisión actian_vectorai_rebuild_duration_seconds te avisa cuando las reconstrucciones de índices, provocadas por la incorporación de nuevos datos o por actualizaciones de modelos, están tardando más de lo previsto.

El panel de índices de error de gRPC se disparó hasta 0.952 en nuestra prueba, ya que 20 solicitudes fallidas consecutivas, frente a un nivel de referencia bajo de solicitudes exitosas, hicieron que la proporción se acercara a 1. Esa misma señal es la que detecta un proceso de detección de fraudes cuando los fallos de autenticación impiden consultar las transacciones en tiempo real. La comparación de los vectores de transacciones con las firmas de fraude conocidas requiere una latencia de consulta inferior a 100 ms. Cuando ese indicador se pone en rojo, el proceso ya está en riesgo.

Configurar el registro estructurado

Añade lo siguiente a la configuración de tu base de datos VectorAI para habilitar los registros en formato JSON compatibles con Elasticsearch, Loki o Datadog.

registro:
  formato: json
  nivel: info

Configura el nivel de registro en función de tu entorno:

Nivel Caso de uso
error Producción mínima: solo errores
advertir Producción con advertencias
información Valor predeterminado de producción
depuración Únicamente para la resolución de problemas a corto plazo
rastro Solo para desarrollo

El uso de los niveles «debug» o «trace» en el entorno de producción genera un gran volumen de datos de registro y puede afectar al rendimiento de la base de datos. Utiliza estos niveles únicamente para la resolución de problemas a corto plazo y, a continuación, vuelve al nivel «info».

Conclusión

Ahora dispones de una pila de monitorización que muestra cuándo se producen cambios en la latencia de la búsqueda vectorial, la presión de memoria o los errores de gRPC antes de que los usuarios lo noten. Prometheus recopila métricas en tiempo real desde el puerto 6573; tu panel de Grafana, compuesto por cuatro paneles, recoge las señales que realmente importan; y ocho reglas de alerta se activan en el momento en que cualquiera de ellas supera un umbral definido por tu equipo.

Clona el Repositorio de GitHub Para obtener la pila completa: docker-compose.yml, prometheus/prometheus.yml, prometheus/alert_rules.yml, grafana/dashboard.json, y scripts/load_test.py. Importa el archivo JSON del panel a Grafana y ya tendrás la pila lista.

Para obtener más información sobre el punto final de métricas y la configuración de la supervisión, consulta la documentación sobre la supervisión de VectorAI DB.