Kapacitor se puede utilizar para realizar el mismo trabajo que las consultas continuas en InfluxDB. Hoy vamos a explorar las razones para usar una sobre la otra y los conceptos básicos del uso de Kapacitor para cargas de trabajo de tipo CQ.

Un ejemplo

Primero, tomemos un CQ simple y lo reescribamos como un Kapacitor TICKscript.

Aquí hay un CQ que calcula la media del cpu.usage_idle cada 5 minutos y lo almacena en la nueva medida mean_cpu_idle.

CREATE CONTINUOUS QUERY cpu_idle_mean ON telegraf BEGIN SELECT mean("usage_idle") as usage_idle INTO mean_cpu_idle FROM cpu GROUP BY time(5m),* END

Para hacer lo mismo con Kapacitor, aquí hay un TICKscript de transmisión.

stream
    |from()
        .database('telegraf')
        .measurement('cpu')
        .groupBy(*)
    |window()
        .period(5m)
        .every(5m)
        .align()
    |mean('usage_idle')
        .as('usage_idle')
    |influxDBOut()
        .database('telegraf')
        .retentionPolicy('autogen')
        .measurement('mean_cpu_idle')
        .precision('s')

Lo mismo también se puede hacer como una tarea por lotes en Kapacitor.

batch
    |query('SELECT mean(usage_idle) as usage_idle FROM "telegraf"."autogen".cpu')
        .period(5m)
        .every(5m)
        .groupBy(*)
    |influxDBOut()
        .database('telegraf')
        .retentionPolicy('autogen')
        .measurement('mean_cpu_idle')
        .precision('s')

Los tres métodos producirán los mismos resultados.

Preguntas

En este punto, hay algunas preguntas que debemos responder:

  1. ¿Cuándo deberíamos usar Kapacitor en lugar de CQ?
  2. ¿Cuándo deberíamos usar tareas de transmisión en lugar de tareas por lotes en Kapacitor?

¿Cuándo deberíamos usar Kapacitor en lugar de CQ?

Hay algunas razones para usar Kapacitor en lugar de CQ.

  • Está realizando una cantidad significativa de CQ y desea aislar la carga de trabajo. Al utilizar Kapacitor para realizar las agregaciones, el perfil de rendimiento de InfluxDB puede permanecer más estable y aislado del de Kapacitor.
  • Debe hacer más que solo realizar una consulta, por ejemplo, tal vez solo desee almacenar solo los valores atípicos de una agregación en lugar de todos ellos. Kapacitor puede hacer mucho más con los datos que los CQ, por lo que tiene más flexibilidad para transformar sus datos.

Hay algunos casos de uso en los que el uso de CQ casi siempre tiene sentido.

  • Realización de muestreo reducido para políticas de retención. Esto es para lo que los CQ están diseñados y funcionan bien. No es necesario agregar otra pieza móvil (es decir, Kapacitor) a su infraestructura si no la necesita. Mantenlo simple.
  • Solo tiene un puñado de CQ, nuevamente, manténgalo simple, no agregue más partes móviles a su configuración a menos que lo necesite.

¿Cuándo deberíamos usar tareas de transmisión en lugar de tareas por lotes en Kapacitor?

Básicamente, la respuesta se reduce a dos cosas, la RAM disponible y el período de tiempo que se está utilizando.

Una tarea de transmisión tendrá que mantener todos los datos en la RAM durante el período especificado. Si este período es demasiado largo para la RAM disponible, primero deberá almacenar los datos en InfluxDB y luego consultar mediante una tarea por lotes.

Una tarea de flujo tiene una pequeña ventaja en el sentido de que, dado que observa el flujo de datos, entiende el tiempo por las marcas de tiempo de los datos. Como tal, no hay condiciones de carrera para saber si un punto determinado se convertirá en una ventana o no. Si está utilizando una tarea por lotes, aún es posible que un punto llegue tarde y se pierda en una ventana.

Otro ejemplo

Cree una consulta continua para analizar las políticas de retención.

CREATE CONTINUOUS QUERY cpu_idle_median ON telegraf BEGIN SELECT median("usage_idle") as usage_idle INTO "telegraf"."sampled_5m"."median_cpu_idle" FROM "telegraf"."autogen"."cpu" GROUP BY time(5m),* END

La secuencia TICKscript:

stream
    |from()
        .database('telegraf')
        .retentionPolicy('autogen')
        .measurement('cpu')
        .groupBy(*)
    |window()
        .period(5m)
        .every(5m)
        .align()
    |median('usage_idle')
        .as('usage_idle')
    |influxDBOut()
        .database('telegraf')
        .retentionPolicy('sampled_5m')
        .measurement('median_cpu_idle')
        .precision('s')

Y el TICKscript del lote:

batch
    |query('SELECT median(usage_idle) as usage_idle FROM "telegraf"."autogen"."cpu"')
        .period(5m)
        .every(5m)
        .groupBy(*)
    |influxDBOut()
        .database('telegraf')
        .retentionPolicy('sampled_5m')
        .measurement('median_cpu_idle')
        .precision('s')

Resumen

Kapacitor es una herramienta poderosa, si necesita más potencia, úsela. Si no, siga usando CQ hasta que lo haga. Para obtener más información y ayuda para escribir TICKscripts desde consultas de InfluxQL, eche un vistazo a estos docs en el nodo InfluxQL en Kapacitor. Todas las funciones disponibles en el lenguaje de consulta de InfluxDB están disponibles en Kapacitor, por lo que puede convertir cualquier consulta en un TICKscript de Kapacitor.