太卷了,史上最简单的监控系统 catpaw 简介

Posted 龙渊秦五

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了太卷了,史上最简单的监控系统 catpaw 简介相关的知识,希望对你有一定的参考价值。

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 的二进制中,方便大家使用,一起来吧!

太卷了,太卷了,一个技术总监出来求职,竟找不到工作

太卷了,太卷了,太卷了!前段时间,我一个朋友,身为一个技术总监离职后出来求职,竟然找不到工作!属实是震惊我一整年。

之后,我也就这个事件本身进行了一些思考,下面说说我的看法吧。

事件缘由

前段时间,一个在北京进行技术交流时认识的一个朋友问我有没有工作岗位介绍,他说他这段时间在找工作,但是一直找不到。

我就觉得很奇怪,上次见到这位朋友时他不是还在一个公司任技术总监吗?怎么就突然就失业了?再说一个技术总监,找工作还找不到?

朋友向我说了一下事情的原因。

开局一手好牌

这位朋友目前已经工作8年半了,算是一个老开发了。他一开始是搞后端的,在百度干过3年,后来去小米干了2年。技术积累的很不错,工作经历也是都是大厂。

之后为了顾家,追求工作和生活的平衡,就去了一个创业公司做了个小管理,原来的技术总监不干了,于是公司就让他去顶位,就这样混成了“技术总监”。

他在这个创业公司做了半年小管理,两年多技术总监。管理开发、后台、测试等团队,手底下也有50多号人。同时也有些期权,本想着靠它实现财富自由,没成想现在到30多岁了,又要出去找工作。

从大厂出来后,每天都在焦虑

早几年前,公司发展还不错,那时想着是等公司上市,卖掉期权,就可以实现财富自由了。

但是一切并没有想象的那么顺利。他说他从大厂出来后每天都在焦虑。

公司的核心产品是秀场直播,盈利模式主要是广告+主播分成。虽然日活不多,但是有土豪大哥用他们产品业绩还算不错。但是也只完成了A轮融资。公司这几年营收并不理想。

朋友他们公司现在,每月服务器带宽费用、第三方SDK使用费不断,但是短视频新业务发展受挫,新用户增量不多,老用户流失,朋友表示都焦虑的秃了。

目前公司融资受挫,已经拖欠2个月没发了,还很多员工都走了。朋友感觉这怕是撑不到年底了,于是就在外面看看新机会。

一朝不慎,满盘皆输

他之前的履历还是十分亮眼的,那时候哪怕海投简历也能不断的收到面试邀约,offer 拿到手软。

但是他自己说,在技术上,早已经被创业公司琐碎事情磨的差不多了。他现在的技术都是过去一些旧框架,甚至都生疏了。虽然平时面试别人,但是都是从职业规划、职业发展,还有候选人性格,沟通能力去看,技术这块都是各组的leader去把关了。

一些深入的细节,一问就懵逼。毕竟进入管理层后不天天写代码,没有时间去研究技术。

最后,我建议他不要去面试技术类型的岗位了,打击自信心。让他去看一些项目管理岗位和产品类的岗位,相对来说,他在这块还是有些优势的。

笔者感想

朋友的经历让我有很多感慨,对我也有很多启发,主要有以下三点。

(一)不要太早进入管理岗

有人说管理岗位多好哇,指挥别人干活,协调资源+开会就行了。但是,搞开发的,看的就是技术,也只有技术才是铁饭碗。我希望大家记住:就算进入管理岗,技术也不能全丢了。

在此之前也有不少人找过我说要一起合伙创业,还许诺了期权,管理岗位什么的。看起来是挺不错的,不过我还是没去。我一直坚持说还想深入搞几年技术。

无论怎样,技术还是不能丢,如果想持续在技术这条路上走下去,大家可以在工作之余给自己投资,充电。

可以参考下面的几个点出发:

一、学习计划

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习(可以直接滑到文末免费获取

1.规划图

我就拿我自学Python的经历来说吧,当时对我来说是1门全新的语言,在我看完课程大纲之后,我自己做了1个规划图,为什么呢?这样能让我很快地就知道自己处于什么阶段、我后面还有多长的路。

这个规划图并不会很细化,太细化了看着很乱,但需要有时间和对应环节,比如说这样:

我比较注重基础,基础知识本身可以很快的,但我追求稳重发展,整个规划下来,我需要花费80多天才能掌握Python并用于后端开发,同时也对前端知识有了比较好的了解。

2.学习进度表

有点类似于打卡了,我强迫自己去做这个事情。

我的学习进度表是用EXCEL来做的,里面具体到每1节课,有时候1天是3节课,有时候是1节课,当时我的判断标准也很简单,看课时长度来做规划,每当我按照要求完成1个学习目标,我就会在后面的进度标上100%,如果有事情耽误了,我会记下时间便于下次继续学习。

3.跟自己的约定:绝不落下目标超过3天

我在自学的时候会跟自己做1个约定,就是因为事情耽误的课时,我会在3天之内补完,而且会严格执行,因为我知道,我一旦落下了某1节,往后就会有更多节落下,长此以往很有可能就会半途而废。

二、定时学习

定时学习是很重要的一个点,每天按时按量来学习,我一般都是晚上8点进行学习,然后学到晚上10点,我们那个时候晚上基本都没有课程,所以我也没有做特殊处理,反正就是每天晚上不低于2个小时的学习,也没有什么周末不周末的,我当时就孤家寡人1个,哈哈哈哈。

三、做自己的知识点导图

做思维导图是我从一个大佬那边学来的,我当时就觉得大佬说得很有道理:“视频里面的老师讲的东西你虽然听懂了,但你不去按照自己的理解做总结归纳,那么知识还是老师的,不是你的。”

于是从那时候我开始用Xmind做思维导图来整理自己学到的知识,把重点整理并记录,就比如下面这种知识点导图,我做了十来张,让我一直坚持做思维导图来整理知识的原因还有1个很重要的点,就是我去回顾我学过的知识时,我脑子里很清晰我已经学了什么,能记起80%以上,只有比较少的东西需要我再去看视频才能想起。

图片太太太太太太大了,完整清晰版可以直接滑到文末免费获取。

四、老师引路

作为自学过来的人,我推荐大家还是要寻找1位以上的具有多年开发经验的大佬,在前进的道路上给你指引方向。但你不能对大佬有很多的期待,技术性的问题尽量不要去打扰大佬,大佬要工作要生活,没得时间去给你烧脑想这些问题,大佬又不是教育机构的老师,他没收过你钱,所以技术型问题就别问的好。

但你可以问大佬一些方向性、经验性的问题,尤其是当你感觉前路很迷茫的时候,大佬的“仙人指路”会给你拨开迷雾。

像我之前也是如此,我经常去给博客大佬捧场,在大佬的粉丝群里也比较活跃,甚至我还给大佬发红包(因为他帮我解决了问题),虽然大佬没有收,但关系都很好,每当我迷茫的时候,我就会去问问他们这种每天浸泡在IT领域的人,听听他们的意见。

五、做1个以上的真实项目

一定一定要自己做1个以上的真实项目,这种项目不是GitHub上面的开源项目,而是你自己真实一行一行码上去的项目,做的时候可以耗时较长也没关系,但一定要自己做,这样你会对1个项目的前前后后、其中每个细节都一清二楚,这是属于你的项目。下面是我学习过的一些项目:

比如我自己刚学完Python的时候,我自己做了web端的小商城网站,前期我做的非常简单,一开始的前端只有产品的图片、价格、购买数量和后端的一些操作和数据,数量购买数量还得自己从后台进行手动调整,连社交功能都没有,完全是1个不能用的web商城,后面随着我学到了更多的技术点,逐渐增加了视频和社交功能,有了一定的雏形,以及到后面完善更多功能,比如数据对接到移动端小程序等等。

前前后后花了2年多的时间,但我一直没有放弃过它,说实话我做的项目很多,但最后能让我拿得出手的项目,它就是为数不多的其中之一,而且也让我在面试的时候不仅对答如流,拿到了1.8万的薪资,而且在工作当中也帮到了我很多东西,因为有些技术难点当时的痛苦我历历在目,我知道怎么解决它们。

这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。

以上是关于太卷了,史上最简单的监控系统 catpaw 简介的主要内容,如果未能解决你的问题,请参考以下文章

太卷了,企业级的智慧物业系统,也完全开源....

java太卷了如何转其它语言

[避坑] 太卷了!一个技术总监出来求职,竟然找不到工作!

[避坑] 太卷了!一个技术总监出来求职,竟然找不到工作!

一分钟带你快速进入Nacos的世界,史上最简易教程!零基础也能看明白!谁反对?

太卷了,华为某领导说招外包只要985!