分享一个很好用的日志告警系统 WatchAlert

3 天前
 Songxwn

💎 WatchAlert 是什么?

🎯 专注可观测性与稳定性,为运维提效降本

WatchAlert 是一款专为云原生环境设计 的轻量级监控告警引擎,聚焦于可观测性( Metrics 、Logs 、Traces )与系统稳定性保障,提供从采集、分析到告警的全链路解决方案 。

🔍 AI 智能加持,让告警更有“洞察力”

通过 AI 技术深度分析 Metrics 、Logs 和 Traces 中的异常信号,精准定位根因,智能生成排查建议与修复方案,显著提升故障响应效率。

注:本教程主要为在 Docker 环境下安装部署 WatchAlert ,用于接入 ElasticSearch 和 VictoriaLogs 作为日志告警。

日志系列文章: https://songxwn.com/tags/syslog/

项目地址:https://github.com/opsre/WatchAlert

官方文档:https://cairry.github.io/docs/

🧩 全面兼容主流可观测技术栈

监控类型 支持的数据源
Metrics Prometheus 、VictoriaMetrics
Logs Loki 、ElasticSearch 、VictoriaLogs 、ClickHouse 、SLS (阿里云日志服务)、TLS (火山云日志服务,开发中)、CLS (腾讯云日志服务,开发中)
Traces Jaeger
Events Kubernetes 事件监控
基础协议监测 HTTP 、ICMP 、TCP 、SSL
告警机器人 飞书、钉钉、企业微信、邮件、自定义 Webhook 、Slack

🔍 核心亮点

🧠 AI 智能分析

🕰️ 完善的值班机制

告警升级机制

📊 Namespace 级告警分类

安装部署

环境准备

Docker 国内安装

PS:安装最新版,使用 compose V2 部署。

https://mirror.nju.edu.cn/mirrorz-help/docker-ce/?mirror=NJU

Docker Hub 国内加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://docker-0.unsee.tech",
    "https://docker-cf.registry.cyou",
    "https://docker.1panel.live"
  ]
}
EOF

systemctl daemon-reload && sudo systemctl restart docker

systemctl enable docker


Git 下载部署文件编排启动容器

PS:如果没 git ,可用 dnf install git apt install git 安装。

cd /opt


git clone https://github.com/opsre/WatchAlert.git

# 国内如果无法通过 Github 下载,可替换为在 Gitee 下载> git clone https://gitee.com/semaik/WatchAlert.git

cd /opt/WatchAlert/deploy/docker-compose

# 进入 docker-compose.yaml 文件所在目录进行部署

sed -i 's|docker.io/||g' docker-compose.yaml 

# 删除 docker.io 字段,确保自动使用加速器。

docker compose up -d

# 拉取镜像并在后台启动

docker compose ps

# 查看启动状态,注意第一次启动需要启动 init-mysql 容器用于初始化数据库,初始化完成后会自动停止。


访问 Web 初始化 admin 密码

浏览器打开 http://你的主机 IP ,第一次访问如下。点击初始化 admin 密码。

输入两次密码后点击提交,然后使用 admin 账号进行登录。

登录后界面如下

部署后删除 init-mysql 容器和升级操作

将 docker-compose.yaml 文件重写如下

vim /opt/WatchAlert/deploy/docker-compose/docker-compose.yaml

PS:删除 init-mysql 容器是为了防止下次启动再次导入数据库,但注意要在成功初始化密码登录 Web 后操作。

services:
  w8t-service:
    container_name: w8t-service
    image: docker.io/cairry/watchalert:latest
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ../../config/config.yaml:/app/config/config.yaml
    restart: always
    privileged: true
    ports:
      - "9001:9001"
    healthcheck:
      test: ["CMD", "wget", "localhost:9001/hello"]
      interval: 5s
      timeout: 2s
      retries: 10
    depends_on:
      - w8t-mysql
      - w8t-redis
    networks:
      - w8t

  w8t-web:
    container_name: w8t-web
    image: docker.io/cairry/watchalert-web:latest
    environment:
      - TZ=Asia/Shanghai
    restart: always
    privileged: true
    ports:
      - "80:80"
    networks:
      - w8t

  w8t-redis:
    container_name: w8t-redis
    image: redis:latest
    ports:
      - "6379:6379"
    command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
    volumes:
      - ./redis:/data
      - ./redis.conf:/usr/local/etc/redis/redis.conf:ro
    environment:
      - TZ=Asia/Shanghai
    restart: always
    networks:
      - w8t

  w8t-mysql:
    container_name: w8t-mysql
    image: mysql:8.0
    ports:
      - "3306:3306"
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=w8t.123
      - MYSQL_DATABASE=watchalert
    restart: always
    networks:
      - w8t
networks:
  w8t:
    driver: bridge

删除 init-mysql 容器

docker compose up -d --remove-orphans 

# 删除多余容器


docker compose ps
NAME          IMAGE                                    COMMAND                   SERVICE       CREATED          STATUS                      PORTS
w8t-mysql     mysql:8.0                                "docker-entrypoint.s…"   w8t-mysql     29 minutes ago   Up 29 minutes               0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060/tcp
w8t-redis     redis:latest                             "docker-entrypoint.s…"   w8t-redis     29 minutes ago   Up 29 minutes               0.0.0.0:6379->6379/tcp, [::]:6379->6379/tcp
w8t-service   docker.io/cairry/watchalert:latest       "/app/w8t"                w8t-service   29 minutes ago   Up 29 minutes (unhealthy)   0.0.0.0:9001->9001/tcp, [::]:9001->9001/tcp
w8t-web       docker.io/cairry/watchalert-web:latest   "/docker-entrypoint.…"   w8t-web       29 minutes ago   Up 29 minutes               0.0.0.0:80->80/tcp, [::]:80->80/tcp

# 查看状态如上

升级到最新版



docker compose pull

docker compose up -d


## 拉取最新版镜像,并更新运行中的容器镜像为最新版。


日志数据源:ELK 部署和 Vlog 部署教程

ELK 系列:https://songxwn.com/categories/linux/ELK/

VictoriaLogs 系列:https://songxwn.com/tags/VictoriaLogs/

Docker Compose 配置文件讲解

用于定义和管理一个名为 WatchAlert 的多容器应用。它包含四个服务:w8t-servicew8t-webw8t-redisw8t-mysql,并使用一个名为 w8t 的自定义网络。下面是详细讲解:


🧩 总体结构说明


🚀 服务详解

1. w8t-service:主后端服务


2. w8t-web:前端 Web 服务


3. w8t-redis:缓存数据库服务


4. w8t-mysql:关系型数据库服务


🌐 网络配置

networks:
  w8t:
    driver: bridge

基础配置流程

创建数据源(可接入 ES 或 Vlogs 等数据源) > 创建通知对象(添加企业微信、钉钉、飞书等机器人) > 创建规则组 > 在规则组选择数据库匹配告警

可参考: https://cairry.github.io/docs/Guide/test.html

运维技术交流群

发送邮件到 ➡️ me@songxwn.com

或者关注 WX 公众号:网工格物

博客(最先更新)

https://songxwn.com/

1110 次点击
所在节点    分享创造
2 条回复
root71370
2 天前
看着不错
bobox
2 天前
有点太重了 我需要轻一点的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1166317

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX