太卷了,史上最简单的监控系统 catpaw 简介
指标监控的痛点
当下比较流行的监控系统,比如 Prometheus、Nightingale、VictoriaMetrics,都是基于数值型指标的监控系统,这类监控系统的痛点在于:告警的时候只能拿到异常值,以及有限的几个标签,难以拿到更详细的信息。比如 HTTP 探测监控,通常用监控值表示不同的错误:
Success = 0
ConnectionFailed = 1
Timeout = 2
DNSError = 3
AddressError = 4
BodyMismatch = 5
CodeMismatch = 6
告警的时候,比如你收到一个异常值,说访问 http://x.com 异常了,异常值是 3,需要比较资深的人才能知道这个异常是 DNS 解析失败,对于普通研发,就会很懵。当然了,我们可以在告警规则的备注里把这个异常值和错误消息的对应关系写上,但总觉得这样不太优雅。如果我们能在告警的时候,把详细错误信息也一并告诉接收者,那就更好了。比如,我们更希望的是收到类似下面的信息:
本文看完,就可以做到上图的效果了,我们继续。
当然了,也可以用日志系统来做这类监控,比如 ElasticSearch、Loki,然后辅以一个周期性查询的告警引擎就可以了。但是整个架构就复杂了,另外,如果还要考虑告警接收人管理、告警媒介对接管理、告警触达策略、降噪规则、静默规则、抑制规则、排班、认领、升级等等,那就更复杂了,有没有轻量的工具可用?
思路
最轻量的工具,显然是 SaaS 类工具,无需部署、维护,即开即用,快猫星云提供了 FlashDuty,用于聚合接收各个监控系统的告警事件,比如 Prometheus、Zabbix、Nightingale、公有云云监控,提供告警事件的统一纳管、灵活派发、静默、排班认领升级等功能,这里不再赘述。基本上,可以认为 FlashDuty 已经完成了事件后续处理的所有功能。如果我们能有一个工具,可以产出告警事件,然后把告警事件推送到 FlashDuty,那就可以实现非常完备的功能了。而且 FlashDuty 是 SaaS 化的,无需维护,我们只需要搞一个轻量的小工具跑在自己的环境下采集异常事件即可,这个小工具就是 catpaw。
适合的场景
catpaw 不能取代指标监控和日志系统,它只是一个轻量的 check 工具,一些场景举例:
- 探测某个 HTTP 地址,如果不可用,把不可用的原因发出来
- 探测某个 TCP 地址,如果不可用,把不可用的原因发出来
- 探测某个文件,如果文件不存在,或者 MD5 发生变化,发出告警事件
- 探测 ulimit 配置,如果发现不合理,发出告警事件
- 探测目录是否可读可写,如果异常发出告警事件
- 探测是否有目录已写满,如果写满的目录,发出告警事件,把
df -h
的结果一并发出来 - 探测某个进程是否存在,如果不存在,发出告警事件
- 探测 MySQL 慢查询,如果发现慢SQL,发出告警事件,事件中带上SQL
- 探测 MySQL 主从延迟,如果延迟超过阈值,发出告警事件,事件中带上延迟时间以及两个 Thread 的情况
- 接收 SNMP Trap 消息,如果消息中包含某个关键字,发出告警事件
- 检查系统日志,如果出现某个关键字,告警,把日志详情一并发出来
- ....
更多场景不再赘述,其特点基本上可以概括为:
- check 的时候已经可以知道是否正常
- check 的时候大概率可以拿到异常原因或者现场值,把这些信息一并发出来
其实吧,这就是 nagios 的逻辑,只不过 nagios 安装复杂、组件散乱、缺少 FlashDuty 这样的事件后续处理能力。我更想要的是一个轻量的事件采集器,配置 FlashDuty,完美。
catpaw 的安装
catpaw 刚刚开始,目前只提供了 Linux 版本,下载地址:https://download.flashcat.cloud/catpaw-v0.1.1-linux-amd64.tar.gz
下载解压缩,可以看到如下文件:
catpaw-v0.1.1-linux-amd64
├── catpaw
├── conf.d
│ ├── config.toml
│ ├── p.exec
│ │ └── exec.toml
│ └── p.http
│ └── http.toml
└── scripts
├── demo.sh
└── ulimit.sh
5 directories, 6 files
其中:
- catpaw:二进制文件
- conf.d:配置文件目录,下面的 config.toml 是主配置,p.exec 和 p.http 是插件配置,目前只提供了这两个插件,exec 插件可以自定义脚本,提供了无限可能
- scripts:一些示例脚本
主配置
config.toml 的内容:
[global]
# 全局采集频率,如果插件没有配置采集频率,就使用全局的
interval = "30s"
# 全局附加标签,这些标签会附加到所有的事件上
# $hostname $ip 是特殊变量,会被替换为当前主机的 hostname 和 ip
[global.labels]
from_agent = "catpaw"
from_hostname = "$hostname"
from_hostip = "$ip"
# 日志配置,默认是 json 格式的日志,打印到标准输出
# 一般用 systemd 托管,日志写在 /var/log/messages,自动切分
[log]
level = "info"
# format = "json"
# output = "stdout"
# fields = {}
# 事件通知地址,目前只支持 flashduty,当然,你也可以模仿 flashduty 的接口,自己实现一个事件接收服务
[flashduty]
url = "https://api.flashcat.cloud/event/push/alert/standard?integration_key=x"
timeout = "10s"
flashduty.url 需要去 FlashDuty 获取,地址在这里:https://console.flashcat.cloud/,可以免费注册,注册之后,系统会自动引导你创建一个协作空间,然后在协作空间下,添加告警接入专属集成就可以了:
点击刚才创建的自定义集成,我的自定义集成取名为 catpaw,点击之后出现右侧抽屉侧拉板。
FlashDuty 如果使用过程有问题,可以联系我,我会帮助你解决。注册进来默认有两周的全功能免费试用期,试用期过后,如果你觉得不错,可以继续使用(有免费版、标准版、专业版三个版本),如果你觉得不好用,扔一边就好,无需有压力。
插件配置
当前是 v0.1.1 版本,只提供了两个插件,http 插件和 exec 插件,exec 插件可以自定义脚本,所以,提供了无限扩展可能,下面我们分别介绍。
http 插件
http 插件的配置文件是 conf.d/p.http/http.toml,内容如下:
[[instances]]
targets = [
"https://baidu.com",
]
# # Concurrent requests to make per instance
# concurrency = 10
# # gather interval
# interval = "30s"
# # Optional append labels
# labels = { env="production", team="devops" }
## Set http_proxy (catpaw uses the system wide proxy settings if it's is not set)
# http_proxy = "http://localhost:8888"
## Interface to use when dialing an address
# interface = "eth0"
## HTTP Request Method
# method = "GET"
## Set timeout (default 5 seconds)
# timeout = "5s"
## Whether to follow redirects from the server (defaults to false)
# follow_redirects = false
## Optional HTTP Basic Auth Credentials
# basic_auth_user = "username"
# basic_auth_pass = "pa$$word"
## Optional headers
# headers = ["Header-Key-1", "Header-Value-1", "Header-Key-2", "Header-Value-2"]
## Optional HTTP Request Body
# payload = '''
# {'fake':'data'}
# '''
## Optional TLS Config
# use_tls = false
# tls_ca = "/etc/catpaw/ca.pem"
# tls_cert = "/etc/catpaw/cert.pem"
# tls_key = "/etc/catpaw/key.pem"
## Use TLS but skip chain & host verification
# insecure_skip_verify = false
[instances.expect]
## Optional expected response status code.
response_status_code = ["20*", "30*"]
## Optional substring match in body of the response (case sensitive)
response_substring = "html"
## Optional alert when cert will expire in x hours
cert_expire_threshold = "72h"
[instances.alerting]
## Enable alerting or not
enabled = true
## Same functionality as Prometheus keyword 'for'
for_duration = 0
## Minimum interval duration between notifications
repeat_interval = "5m"
## Maximum number of notifications
repeat_number = 3
## Whether notify recovery event
recovery_notification = true
## Choice: Critical, Warning, Info
severity = "Warning"
看起来配置很多,实际非常清晰,我做一个简单讲解。要探测 HTTP 地址,只需要在 targets 里面填写即可,可以填写多个,每个地址用双引号包裹,多个地址用逗号分隔,如下:
[[instances]]
targets = [
"https://baidu.com",
"http://a.cn",
]
比如我们把公司依赖的所有第三方接口都配置在这里,那可能有好几百个,探测的时候最好要控制一下并发度,所以提供了 concurrency 配置,可以控制并发度。interval 是探测频率,如果不配置,就使用全局的探测频率。labels 是附加标签,这些标签会附加到这个 [[instances]]
产生的所有事件上。
下面的 http_proxy、interface、method、timeout、follow_redirects、basic_auth_user、basic_auth_pass、headers、payload、use_tls、tls_ca、tls_cert、tls_key、insecure_skip_verify 这些都是 http 客户端的配置,catpaw 作为一个 http 客户端,向 targets 中的地址发探测请求,需要有一些基本的配置,看起来配置项挺多,都可以维持默认值,不需要修改。
其中,有些公司会使用自签证书,此时需要配置:
use_tls = true
insecure_skip_verify = true
接下来是 [instances.expect]
部分,配置了一些期望,比如期望返回状态码是 20x 或者 30x,期望返回的 body 中包含 html 字符串,期望证书过期时间大于 72 小时,如果不满足期望,就会触发告警。
接下来是 [instances.alerting]
部分,配置了告警的一些参数,比如告警是否启用、告警触发要求的持续时长(类似 Prometheus 的 for 关键字)、告警的级别、告警的重复次数、告警的重复间隔、是否通知恢复等等。
targets 中可以配置一个假地址,比如 http://a.cn
,这样待会启动 catpaw 之后立马就可以看到效果。
exec 插件
exec 插件核心是指定要执行的脚本路径,比如我的一个配置样例:
[[instances]]
commands = [
"/root/works/catpaw/dist/catpaw-v0.1.1-linux-amd64/scripts/*.sh"
]
其他都可以维持默认,exec 插件的 [instances.alerting]
没有指定 severity,因为 exec 插件的脚本是自行控制 severity(通过脚本的 stdout),大家看一下 scripts 目录下的样例脚本就知道了。
比如 ulimit.sh :
#!/bin/sh
if [ "$1" ]; then
threshhold=$1
else
threshhold=2048
fi
count=$(ulimit -n)
status="Ok"
if [ $count -lt $threshhold ]; then
status="Warning"
fi
echo '[
{
"event_status": "'${status}'",
"labels": {
"check": "ulimit check"
},
"title_rule": "$check",
"description": "ulimit -n: '${count}', too low, should be greater than '${threshhold}'"
}
]'
这个脚本的作用是 check 系统的 ulimit 配置,默认 Linux 句柄限制是 1024,生产环境显然是不够用的,所以我们可以通过这个脚本来检查 ulimit 配置,如果低于 2048,就触发告警。
脚本的输出是一个 json 数组,每个元素是一个事件,事件的字段有:
- event_status:事件状态,可选值:Ok、Info、Warning、Critical
- labels:附加标签,这些标签会附加到这个事件上,不同的事件就是通过 labels 来区分的
- title_rule:事件标题,支持模板,模板中的变量是 labels 中的字段(具体可以查阅刚才提到的 FlashDuty 的文档)
- description:事件描述,可以使用 markdown 格式
启动测试
我们只是修改了 config.toml 中的 flashduty.url,exec.toml 中的 scripts 路径,其他都维持不变,启动测试:
./catpaw --configs conf.d
启动之后,可以看到控制台输出了一些信息,产生了 3 条告警事件,推给了 FlashDuty,FlashDuty 也收到了告警,如下图:
这里我点击 HTTP check failed 这个告警,可以看到详情:
描述信息是 markdown 的,可以明显看到是 DNS 的问题(lookup x on x:53: no such host 是典型的 DNS 报错),非常清晰。
测试恢复消息
这里我手工修改 scripts 下的 demo.sh,把 event_status 返回 Ok:
#!/bin/sh
echo '[
{
"event_status": "Ok",
"labels": {
"check": "script demo"
},
"title_rule": "$check",
"description": "this is description, support markdown"
}
]'
稍等一下下,FlashDuty 就会收到恢复消息:
点击告警详情,点开关联事件,可以看到 Ok 的事件:
总结
Catpaw 是一个非常简单的告警工具,它的核心是插件机制,插件机制使得 Catpaw 可以很容易地扩展,比如我想要一个插件,可以检查 MySQL 的连接数,那么我只需要写一个脚本,输出事件 json 数组,然后配置到 exec 插件中,就可以了。
当然,后面我们也会把更多常见的场景直接内置到 catpaw 的二进制中,开箱即用。各位老铁,有好的脚本,欢迎提交到 https://github.com/flashcatcloud/catpaw-scripts,群策群力,争取搞个牛逼的脚本库,我们会把好的脚本合并到 catpaw 的二进制中,方便大家使用,一起来吧!
太卷了,史上最简单的监控系统 catpaw 简介的更多相关文章
- [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例)
[分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例) 踏雁寻花 发表于 2015-8-23 23:31:28 https://www.itsk.com/thread-35 ...
- 史上最简单的SpringCloud教程 | 第十篇: 高可用的服务注册中心(Finchley版本)
转载请标明出处: 原文首发于 https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f10-eureka/ 本文出自方志朋的博客 文章 史上最简单 ...
- 史上最简单,一步集成侧滑(删除)菜单,高仿QQ、IOS。
重要的话 开头说,not for the RecyclerView or ListView, for the Any ViewGroup. 本控件不依赖任何父布局,不是针对 RecyclerView. ...
- 史上最简单的 SpringCloud 教程
史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)史上最简单的Spri ...
- 史上最简单的 SpringCloud 教程 | 终章
https://blog.csdn.net/forezp/article/details/70148833转载请标明出处:http://blog.csdn.net/forezp/article/det ...
- 史上最简单的 GitHub 教程
史上最简单的 GitHub 教程 温馨提示:本系列博文已经同步到 GitHub,如有需要的话,欢迎大家到「github-tutorial」进行Star和Fork操作! 1 简介 GitHub 是一个面 ...
- (转) 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
一.spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选.分布式会话等等.它运 ...
- 史上最简单的 MySQL 教程(十五)「列属性 之 自动增长」
自动增长 自动增长:auto_increment,当对应的字段,不给值,或者是默认值,或者是null的时候,就会自动的被系统触发,系统会从当前字段中取已有的最大值再进行+1操作,得到新的字段值. 自增 ...
- 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现Eureka(Finchley版本)
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f1-eureka/ 本文出自方志朋的博客 一.spring ...
- 《史上最简单的MySQL教程》系列分享专栏
<史上最简单的MySQL教程>系列分享专栏 <史上最简单的MySQL教程>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read ...
随机推荐
- 如何用Netty写一个高性能的分布式服务框架?
简介: Netty 是一个致力于创建高性能网络应用程序的成熟的 IO 框架.相比较与直接使用底层的 Java IO API,不需要先成为网络专家就可以基于 Netty 去构建复杂的网络应用.业界常见的 ...
- 用手机「3D探店」是种什么体验?
简介: 未来场景尽在眼前!阿里云3D全景网站通过云端算法技术自动建模,将线下场景1:1真实还原到线上,让用户足不出户就可以感受到真实的3D空间漫游效果. 在手机里用3D探店打卡是种什么样的体验? 走进 ...
- [GPT] 网页中某些dom内容是通过 js 数据异步渲染的,nodejs 怎么获取网页解析这些数据
要处理使用JavaScript异步渲染内容的网页,您可以在 JavaScript 蜘蛛中使用 Puppeter 或 Playwright 等无头浏览器来获取网页,然后与动态渲染的内容进行交互. 下 ...
- MSIL 静态类在 IL 定义上和非静态类的差别
本文来聊聊 MSIL 的基础知识,给一个 C# 的类标记了 static 之后和标记 static 之前,生成这个类的 IL 代码有什么不同 如以下的代码是一个默认的控制台程序 class Progr ...
- JavaScript字符串String方法介绍及使用示例
实例方法 charAt() charCodeAt() 返回索引位置的字符 'hello'.charAt(0) //h 等价 'hello'.[0] //返回索引位置的字符的Unicode码点 'hel ...
- Postergresql常见操作
Postergresql常见操作 1. 安装部署 略 2. 登录数据库 查看版本 ## 以管理员身份 postgres 登陆,然后通过#psql -U postgres#sudo -i -u post ...
- 实验8 #第8章 Verilog有限状态机设计-3 #Verilog #Quartus #modelsim
3. 状态机A/D采样控制电路 3.1 目标:用状态机控制ADC0809实现数据采集. 3.2 ADC0809简介 (1)ADC0809是8位A/D转换器,片内有8路模拟开关,可控制8个 模拟量中 的 ...
- 一个随时跟新的css库
1.一个选中阴影的样式 .select border: 1px solid #4d92f7; box-shadow: 0px 0px 15px rgba(0,50,122,.15); 2.一个三栏渐变 ...
- 登录信息localStorage存储
localStorage拓展了cookie的4K限制,与sessionStorage的唯一一点区别就是localStorage属于永久性存储,而sessionStorage属于当会话结束的时候,ses ...
- 在网页上直接运行Win11,5秒内用AI克隆自己的声音 | 蛮三刀酱的Github周刊第二期
大家好,这里是每周更新的Github精彩分享周刊,我是每周都在搬砖的蛮三刀酱. 我会从Github热门趋势榜里选出 高质量.有趣,牛B 的开源项目进行分享. 1. PowerShell:不止于Wind ...