Alertas de métodos de recuperación fallidos
Análisis
Comencemos analizando el problema. Según la descripción de la primera parte, nuestra suposición preliminar es que el tiempo de procesamiento en algunas etapas antes de que la alerta llegue al AlertManager es demasiado largo, lo que hace que la alerta llegue al AlertManager después del tiempo de resolución automática. Comencemos analizando el flujo de alertas en la plataforma para descubrir qué etapa del procesamiento de alertas lleva demasiado tiempo. En primer lugar, la generación de alertas requiere la cooperación de dos aspectos:
Datos métricos
Reglas de alerta
Los datos métricos se ingresan en las reglas de alerta para su cálculo. Si se cumplen las condiciones Se genera una alerta.
La plataforma DMP integra componentes relacionados con Thanos y el suministro y el cálculo de datos están separados. La plataforma DMP integra componentes de Thanos, y el suministro y el cálculo de datos están separados por Prometheus Server, y el cálculo de las reglas de alarma lo maneja Thanos Rule (en lo sucesivo, Ruler). El siguiente diagrama muestra la ubicación del componente Ruler en el clúster:
Parece que para comprender el flujo entre la generación de alertas y AlertManager, es necesario comprender la mecánica general de Ruler. La documentación oficial describe Ruler de la siguiente manera: Puede pensar en Rule como un Prometheus simplificado que no requiere descargas laterales y no realiza raspado ni evaluación PromQL (sin QueryAPI). .
No es difícil para nosotros entender que Ruler agrega una capa basada en Prometheus y proporciona algunas funciones adicionales. Por observación, creemos aproximadamente que Ruler utiliza la biblioteca proporcionada por Prometheus para calcular reglas de alerta y proporcionar algunas funciones adicionales. El siguiente es el proceso de alerta en Ruler:
Haga clic para ingresar una descripción
Haga clic para ingresar una descripción
Haga clic para ingresar una descripción
Haga clic para ingresar una descripción
p >
Primero, cada regla de alerta en el diagrama tiene una cola activa (en lo sucesivo, cola local), que se utiliza para guardar alertas activas bajo la regla de alerta.
En segundo lugar, antes de que la alerta se tome de la cola local y se envíe al AlertManager, se colocará en la cola de reglas de Thanos (en lo sucesivo, la cola de búfer), que tiene dos propiedades: p>
capacidad (el valor predeterminado es 10000): controla el tamaño de la cola del búfer;
maxBatchSize (el valor predeterminado es 100): controla el número máximo de alertas que se pueden enviar al AlertManager en una vez,
Después de comprender el proceso anterior y observar el código fuente de Ruler, descubrimos que antes de que la alerta se coloque en la cola del búfer, se establecerá en la hora de resolución automática predeterminada (hora actual + 3m), lo que afectará la hora de inicio de la resolución automática de alertas.
Después de este tiempo, hay dos etapas que pueden afectar el procesamiento de alertas: 1. Etapa de cola de búfer 2. Fuera de la cola de búfer a la etapa AlertManager (afectada por el retraso de la red) Dado que el entorno de prueba es un entorno LAN y no hay red. Se encuentran problemas relacionados en el medio ambiente. Inicialmente descartamos el impacto de la segunda etapa y nos centraremos en la cola del búfer a continuación. A través del código fuente relevante, encontramos que el proceso de procesamiento de alarmas en la cola del búfer es aproximadamente el siguiente: si hay una alarma en la cola local y la distancia de su última transmisión excede 1 m (valor predeterminado, se puede modificar), la alarma se colocará en la cola del búfer, subirá a las alarmas maxBatchSize y las enviará a AlertManager. En otras palabras, si se genera una gran cantidad de alertas duplicadas durante un período de tiempo, la cola del búfer se enviará con menos frecuencia. Demasiados productores y muy pocos consumidores en la cola harán que se acumulen alarmas en la cola. Por lo tanto, no es difícil adivinar que la causa del problema probablemente sea que la frecuencia de envío de la cola del búfer se vuelve baja y la cantidad de alertas enviadas a la vez es demasiado pequeña, lo que hace que la cola del búfer se acumule. A continuación, verificamos la conjetura anterior a través de dos aspectos: primero, podemos encontrar que la cola ha sido empujada aproximadamente 2000 veces en aproximadamente 20,000 segundos, es decir, un empuje cada 10 segundos en promedio. Combinado con las propiedades especiales de la cola de búfer, una alerta en la cola tarda aproximadamente (capacidad/tamaño de lote máximo) * 10 s = 16 m, y AlertManager ha excedido el tiempo de resolución automática predeterminado (3 m) después de recibir la alerta. En segundo lugar, Ruler proporciona 3 valores de indicador para monitorear el funcionamiento de la cola del búfer:
thanos_alert_queue_alerts_dropped_total
thanos_alert_queue_alerts_pushed_total
thanos_alert_queue_alerts_popped_total
Al observar thanos_alert_queue_alerts_dropped_total El valor de, puede ver el número total de alertas perdidas, puede ver el número total de alertas perdidas, lo que también confirma que la cola del búfer estuvo llena en algún momento.
Resolviendo el problema A través del análisis anterior, básicamente hemos determinado la causa raíz del problema: la acumulación de la cola de búfer incorporada del componente Ruler causó el retraso en el envío de alertas. Para resolver este problema, elegimos ajustar el valor maxBatchSize de la cola. Aquí se explica cómo establecer el valor. Dado que se intenta enviar a la cola del búfer cada vez que se calcula una regla de alerta, queremos estimar el número máximo de alertas para obtener el valor mínimo en el que se puede establecer maxBatchSize. Supongamos que la cantidad de entidades que el sistema empresarial debe monitorear es x1, x2, x3...xn, y la cantidad de reglas de alerta en las entidades es y1, y2, y3..., yn, entonces la cantidad máxima de alertas que se pueden generar al mismo tiempo El número de veces es (x1 * y2 + x2 * y2 + x3 * y3 + ... + xn * yn), y se puede aumentar hasta (y1 + y2 + y3 +. .. + yn) veces. + yn) veces, por lo tanto, para que la cola del buffer no se acumule, maxBatchSize debe satisfacer: maxBatchSize >= (x1 * y2 + x2 * y2 + x3 * y3 + ... + xn * yn) / (y1 + y2 + y3 + ... + yn), suponiendo que x = max(x1,x2,...,xn), el lado derecho de la desigualdad se amplía adecuadamente a x, es decir, en otras palabras, puede establecer maxBatchSize en la mayor cantidad de monitores en el sistema Tipo de entidad; para plataformas DMP, esto suele ser una instancia de MySQL.
Notas
El proceso de cálculo anterior es solo una idea de referencia. Si el valor es demasiado grande, es probable que ejerza presión sobre AlertManager y pierda la función de la cola del búfer. por lo que aún necesitas analizar la situación real. Dado que DMP integra la regla en su propio componente, es fácil modificar este valor.
Si utiliza el componente Ruler como se describe en la documentación oficial, deberá personalizar los archivos fuente.