PMM2: Mattermost y AlertManager


En un artículo anterior expliqué como enviar las notificaciones de AlertManager por Telegram pero si somos unos paranoicos(cosa que nunca está de más) sobre si Telegram nos está espiando podemos montarnos un servidor de Mattermost y enviar las notificaciones a este. Podemos encontrar el enlace al plugin en la web de Mattermost.

 

Ya que estamos montando toda la infraestructura de monitorización de PMM2 con Docker, también vamos a montar nuestro servidor Mattermost sobre este, lo primero será instalar DockerCompose.

https://github.com/docker/compose/releases/

wget https://github.com/docker/compose/releases/download/1.26.0-rc4/docker-compose-Linux-x86_64 -O /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

Clonamos el repositorio de Mattermost-Docker:

git clone https://github.com/mattermost/mattermost-docker.git
cd mattermost-docker

Mattermost consta de tres partes, la app db, app y web, pero antes de construir las imágenes definimos nuestra net como external y la utilizamos en la construcción de las apps, en la app web además cambiaremos el puerto para que no entre en conflicto con el de pmm-server:

vi docker-compose.yml
networks:
  pmm-net:
    external: true

  db:
    networks:
      - pmm-net
      
  app:
    networks:
      - pmm-net

  web:
    networks:
      - pmm-net
    ports:
      - "180:80"
      - "1443:443"

Construimos las imágenes:

docker-compose build
docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
mattermost-docker_web        latest              68d72a5edf18        3 minutes ago       21.4MB
mattermost-docker_app        latest              cdc0bf418ca8        3 minutes ago       295MB
mattermost-docker_db         latest              4b411ff22962        4 minutes ago       589MB

Creamos los directorios necesarios para Mattermost:

mkdir -pv ./volumes/app/mattermost/{data,logs,config,plugins,client-plugins}
chown -R 2000:2000 ./volumes/app/mattermost/

Desplegamos los CTs de Mattermost:

docker-compose up -d
docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                    PORTS                                        NAMES
a7453fab24b8        mattermost-docker_db       "/entrypoint.sh post…"   43 minutes ago      Up 43 minutes (healthy)   5432/tcp                                     mattermost-docker_db_1
db5b18e6d358        mattermost-docker_app      "/entrypoint.sh matt…"   43 minutes ago      Up 43 minutes (healthy)   8000/tcp                                     mattermost-docker_app_1
e993144658fb        mattermost-docker_web      "/entrypoint.sh"         43 minutes ago      Up 43 minutes (healthy)   0.0.0.0:180->80/tcp, 0.0.0.0:1443->443/tcp   mattermost-docker_web_1

Accedemos a la interfaz web:

http://mattermost.alfaexploit.com:180/signup_email

Creamos un team:

Ya tenemos nuestro Mattermost corriendo:

Configuramos el tema, perfil de usuario y demás.

Creamos un canal de notificaciones de alertas privado:

Creamos una cuenta de tipo bot con la que el plugin publicará las alertas, accedemos a System Console:

Integrations > Bot Accounts > Enable Bot Account Creation

Guardamos y clickamos sobre el enlace Integrations > Bot Accounts, Add Bot Account:


Para integrar las notificaciones de Alertmanager en Mattermost debemos descargar un plugin:

wget https://github.com/cpanato/mattermost-plugin-alertmanager/releases/download/v0.0.1/com.cpanato.alertmanager-0.0.1.tar.gz

Por defecto Mattermost no permite subir plugins, así que modificamos la configuración y reiniciamos el CT:

vi ./volumes/app/mattermost/config/config.json
    "PluginSettings": {
        "Enable": true,
        "EnableUploads": true,
docker stop mattermost-docker_app_1 && docker start mattermost-docker_app_1

Instalamos el plugin.

System Console > Plugins > Management > Upload Plugin:

Habilitamos y configuramos el plugin:

System Console > Plugins > AlertManager
Team: sysadmins
Channel: alerts
User: alertmanager
Token: GENERATE
AlertManager URL: http://pmm-alertmanager:9093

Configuramos AlertManager para que envíe las notificaciones a Mattermost mediante el webhook:

webhook: https://SITEURL/plugins/com.cpanato.alertmanager/api/webhook?token=TOKEN

Si hemos seguido el artículo anterior la configuración quedará del siguiente modo:

vi prometheusConf/alertmanager.conf
global:

route:

  # Default receiver por defecto: Alertmanager parece ignorar este parámetros, como lo ignora lo definimos mas abajo como un receiver vacío
  receiver: 'default'

  # No agrupes las alertas, de este modo los resolved se ven claros en Telegram
  #group_by: [node_name]

  # Tiempo de espera desde que se recibe por primera vez la alerta de grupo hasta que se envia(solo aplicable si se agrupan alertas)
  #group_wait: 30s

  # Tiempo de espera entre notificaciones de una alarma de grupo previamente recibida(solo aplicable si se agrupan alertas)
  #group_interval: 6m

  # Cada cuanto reenviar las alertas, a esto hay que sumarle el tiempo del alert de Prometheus
  # Si el alert tiene "for: 6m" y repeat_interval 1m -> la alerta se enviará cada 6+1=7m
  repeat_interval: 1m

  # Additional receivers
  routes:

  # Telegram: Solo alarmas criticas
  - match:
      severity: critical
    receiver: 'telegram'
    continue: true

  # Mattermost: Solo alarmas criticas
  - match:
      severity: critical
    receiver: 'mattermost'
    continue: true

  # Asterisk: Solo alarmas criticas
  - match:
      severity: critical
    receiver: 'asterisk-api'
    continue: true

inhibit_rules:
- source_match:
    alertname: 'BrokenNodeExporter'
  target_match_re:
    severity: '.*'
  equal: ['node_name']

receivers:
- name: 'default'

- name: 'telegram'
  webhook_configs:
  - url: http://pmm-telegrambot:9087/alert/CHATID
    send_resolved: true

- name: 'mattermost'
  webhook_configs:
  - url: http://mattermost.alfaexploit.com:180/plugins/com.cpanato.alertmanager/api/webhook?token=RxjZNyWPMo0rIZSTvq4mKe2zL4c9L1QQ
    send_resolved: true
    
- name: 'asterisk-api'
  webhook_configs:
  - url: http://pmm-asterisk.alfaexploit.com:4444/alertSysAdmins
    send_resolved: false

Reiniciamos el CT:

docker stop pmm-alertmanager && docker start pmm-alertmanager

Hacemos saltar alguna alarma y vemos la notificación en Mattermost:

Si queremos enviar notificaciones a diferentes teams/channels primero debemos crearlos, luego editar el plugin para que tenga otro nombre y reimportarlo.

Descomprimimos el plugin:

tar xvzf com.cpanato.alertmanager-0.0.1.tar.gz 
x com.cpanato.alertmanager/
x com.cpanato.alertmanager/plugin.json
x com.cpanato.alertmanager/server/
x com.cpanato.alertmanager/server/dist/
x com.cpanato.alertmanager/server/dist/plugin-darwin-amd64
x com.cpanato.alertmanager/server/dist/plugin-windows-amd64.exe
x com.cpanato.alertmanager/server/dist/plugin-linux-amd64
x com.cpanato.alertmanager/assets/
x com.cpanato.alertmanager/assets/.gitkeep
x com.cpanato.alertmanager/assets/alertmanager-1.png
x com.cpanato.alertmanager/assets/alertmanager-3.png
x com.cpanato.alertmanager/assets/alertmanager-2.png
cp -rp com.cpanato.alertmanager com.cpanato.alertmanager2

Lo editamos para que no sobreescriva el anterior:

vi com.cpanato.alertmanager2/plugin.json
    "id": "com.cpanato.alertmanager2",
    "name": "AlertManager2",

Volvemos a generar el comprimido:

tar czvf com.cpanato.alertmanager2-0.0.1.tar.gz com.cpanato.alertmanager2

Lo importamos tal como hemos hecho anteriormente, ahora vemos un segundo plugin:

Reconfiguramos alertmanager:

vi prometheusConf/alertmanager.conf
global:

route:

  # Default receiver por defecto: Alertmanager parece ignorar este parámetros, como lo ignora lo definimos mas abajo como un receiver vacío
  receiver: 'default'

  # No agrupes las alertas, de este modo los resolved se ven claros en Telegram
  #group_by: [node_name]

  # Tiempo de espera desde que se recibe por primera vez la alerta de grupo hasta que se envia(solo aplicable si se agrupan alertas)
  #group_wait: 30s

  # Tiempo de espera entre notificaciones de una alarma de grupo previamente recibida(solo aplicable si se agrupan alertas)
  #group_interval: 6m

  # Cada cuanto reenviar las alertas, a esto hay que sumarle el tiempo del alert de Prometheus
  # Si el alert tiene "for: 6m" y repeat_interval 1m -> la alerta se enviará cada 6+1=7m
  repeat_interval: 1m

  # Additional receivers
  routes:

  # Telegram: Solo alarmas criticas
  - match:
      severity: critical
    receiver: 'telegram'
    continue: true

  # Mattermost: Solo alarmas criticas
  - match:
      severity: critical
    receiver: 'mattermost'
    continue: true

  # Mattermost2: Solo alarmas criticas
  - match:
      severity: critical
    receiver: 'mattermost2'
    continue: true

  # Asterisk: Solo alarmas criticas
  - match:
      severity: critical
    receiver: 'asterisk-api'
    continue: true

inhibit_rules:
- source_match:
    alertname: 'BrokenNodeExporter'
  target_match_re:
    severity: '.*'
  equal: ['node_name']

receivers:
- name: 'default'

- name: 'telegram'
  webhook_configs:
  - url: http://pmm-telegrambot:9087/alert/-379448070
    send_resolved: true

- name: 'mattermost'
  webhook_configs:
  - url: http://grafanakr0m:180/plugins/com.cpanato.alertmanager/api/webhook?token=RxjZNyWPMo0rIZSTvq4mKe2zL4c9L1QQ
    send_resolved: true

- name: 'mattermost2'
  webhook_configs:
  - url: http://grafanakr0m:180/plugins/com.cpanato.alertmanager2/api/webhook?token=SkgI49ezMRRResXAdQ-wCtFZ9RAMSmzB
    send_resolved: true

- name: 'asterisk-api'
  webhook_configs:
  - url: http://pmm-asterisk.alfaexploit.com:4444/alertSysAdmins
    send_resolved: false

Reiniciamos AlertManager:

docker stop pmm-alertmanager && docker start pmm-alertmanager

Si hacemos saltar alguna alarma la veremos en los dos teams/channels:

También podemos consultar las alertas desde Mattermost:

/alertmanager alerts - to list the existing alerts
/alertmanager silences - to list the existing silences
/alertmanager expire_silence <SILENCE_ID> - to expire the specified silence
/alertmanager status - to list the version and uptime of the Alertmanager instance
/alertmanager help - to get this help

NOTA: El bot tan solo resalta el canal donde envió la alerta, no muestra una lista.


DEBUG

Podemos ver los logs de los CTs con:

docker logs -f mattermost-docker_db_1
docker logs -f mattermost-docker_app_1
docker logs -f mattermost-docker_web_1

Los logs de las apps se encuentran bajo el directorio volumes/app/APP_NAME/logs/ por ejemplo para ver los logs de la app mattermost:

tail -f mattermost-docker/volumes/app/mattermost/logs/mattermost.log 
Si te ha gustado el artículo puedes invitarme a un redbull aquí.
Autor: kr0m -- 02/06/2020 00:12:48