指标监控的痛点
当下比拟风行的监控零碎,比方 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 的二进制中,不便大家应用,一起来吧!