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/
chmod +x /usr/local/bin/docker-compose
Clonamos el repositorio de Mattermost-Docker:
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:
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 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:
chown -R 2000:2000 ./volumes/app/mattermost/
Desplegamos los CTs de Mattermost:
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:
Por defecto Mattermost no permite subir plugins, asà que modificamos la configuración y reiniciamos el CT:
"PluginSettings": {
"Enable": true,
"EnableUploads": true,
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:
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:
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:
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
Lo editamos para que no sobreescriva el anterior:
"id": "com.cpanato.alertmanager2",
"name": "AlertManager2",
Volvemos a generar el comprimido:
Lo importamos tal como hemos hecho anteriormente, ahora vemos un segundo plugin:
Reconfiguramos alertmanager:
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:
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_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: