open-falcon业务监控实践

上一篇已经写了falcon的基础安装配置以及简单的使用说明,现在来记录下一些业务相关的监控如何做,截图居多。心疼流量三秒…其实实现方法都不难,设计一个良好的命名规范以及科学的分组,实际上对监控来说是十分必要的。还有就是要对监控指标的判断做个性化设置,最好就是看图的话一眼就概览全局(要让图清晰直观的反应状况),报警的话做到真实有效人性化。这篇里面只涉及如何对常见服务进行配置。

  1. 对于基础监控:cpu、内存、IO、网络适合折线图;而磁盘使用量这些其实设置多维度报警即可(如磁盘使用率>80%且小于20G报警)
  2. 对于服务和端口:监控出数字显示服务总数量,服务正常数量、服务异常数量,然后配置报警即可
  3. 对于业务监控:对业务指标使用折线图一般都是适用的

监控自定义服务进程或端口

Tips:一般而言,对于某一服务仅监听服务或端口取其一即可,因为一般而言进程挂了端口自然也就down了,这两者是有直接关联的。但也分业务,具体看需求吧

监控端口

Tips:端口监控,falcon现在的机制是配置完策略agent才会去采集这些信息。可参考官网说明

  • 设置端口监控模板
    falconuse-1
  • 模板关联至主机组
  • 然后就可以收到报警信息了(这里为测试方便监控了Mysql的3306端口,有值就报警)
    falconuse-2

监控服务

Tips:官方给出两种方案,一种取/proc/$pid/status这里面的name字段,另一种取/proc/$pid/cmdline里的name字段,这里拿mysql举例,个人推荐cmdline,因为name字段很容易重复

  • 获取两个字段

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ps axu | grep mysql
    #root 5465 0.0 0.0 113176 1600 ? S May18 0:00 /bin/sh /usr/libexec/mysql55/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
    #mysql 5658 0.0 1.2 1336076 101032 ? Sl May18 27:08 /usr/libexec/mysql55/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
    #tai_ops 28522 0.0 0.0 110408 868 pts/0 S+ 03:04 0:00 grep mysql
    cat /proc/5465/status | grep -i name
    #Name: mysqld_safe
    cat /proc/5465/cmdline
    #/bin/sh/usr/libexec/mysql55/mysqld_safe--datadir=/var/lib/mysql--socket=/var/lib/mysql/mysql.sock--pid-file=/var/run/mysqld/mysqld.pid--basedir=/usr--user=mysql
    cat /proc/5658/status | grep -i name
    #Name: mysqld
    cat /proc/5658/cmdline
    #/usr/libexec/mysql55/mysqld--basedir=/usr--datadir=/var/lib/mysql--plugin-dir=/usr/lib64/mysql/plugin--user=mysql--log-error=/var/log/mysqld.log--pid-file=/var/run/mysqld/m
  • Dashboard上模板配置
    falconuse-3

  • 报警如下
    注意:我测试的host组有3台机器,其中一台是没有mysql的,所以检测不到进程所以就报警了,从这也可以看出,falcon默认是不收集这些数据的,当你写上规则之后它会按这个规则进行抓取不管有没有这个服务,只要你配置了规则,就按这个规则去取数据,取不到或取到报警阈值都会报警
    falconuse-4

常用服务监控

Tips:常用服务监控除了官方提供的一些方案也可以自己往transfer接口post自定义的监控数据,不过个人感觉使用crontab的方式收集数据还是挺僵硬的

Redis监控/Ardb监控

官方提供了两种方案,都在github开源,由于第二种方案目前还不支持redis3.2.0,所以我使用第一种。实际上就是连接到redis然后获取一些redis的info信息,然后用固定的数据格式post给falcon,ardb与redis监控基本相同。

  • 获取监控脚本
    需要特别注意脚本中redis-cli的命令路径,我就折在这里了

    1
    2
    3
    4
    5
    git clone https://github.com/iambocai/falcon-monit-scripts.git
    ll /data/falcon_scripts/falcon-monit-scripts/redis/redis-monitor.py
    #vim redis-monitor.py 修改脚本,主要该host、port、redis-cli的路径
    #设置crontab -e
    #* * * * * python /opt/falcon-agent/scripts/falcon-monit-scripts/redis/redis-monitor.py
  • web配置如下
    5

  • 出图如下
    6

Mysql监控

由于小米官方给出的方案是需要go环境进行的编译的,所以就直接在falcon的server机器上进行编译,然后拿编译的包对mysql机器进行分发部署

  • 下载并编译监控mysql的脚本源码
    这里监控连接数据库的用户必须是root不然会access deney

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cd $GOPATH/src/github.com/open-falcon
    git clone https://github.com/open-falcon/mymon.git
    cd mymon
    go get ./...
    go build -o mymon
    #crontab设置 crontab -e 或直接写配置
    #* * * * * cd $GOPATH/src/github.com/open-falcon/mymon && ./mymon -c etc/mon.cfg
    #echo '* * * * * cd $GOPATH/src/github.com/open-falcon/mymon && ./mymon -c etc/mon.cfg' > /etc/cron.d/mymon
    tar czvf mysql_monitor.tar.gz mymon etc/
    #然后去部署这个tar包即可
  • 调试正常后log输出
    具体监控项、tag等信息都可以通过日志获得,安装文档中有队metric的汇总表


    {“level”:”debug”,”msg”:”MetaData Metric:Innodb_mutex_spin_waits Endpoint:ip-10-222-0-63 Value:302 CounterType:COUNTER Tags:port=3306 Timestamp:1499389081 Step:60”,”time”:”2017-07-07T00:58:01Z”}
    {“level”:”debug”,”msg”:”MetaData Metric:Innodb_mutex_spin_rounds Endpoint:ip-10-222-0-63 Value:1780 CounterType:COUNTER Tags:port=3306 Timestamp:1499389081 Step:60”,”time”:”2017-07-07T00:58:01Z”}
    {“level”:”debug”,”msg”:”MetaData Metric:Innodb_mutex_os_waits Endpoint:ip-10-222-0-63 Value:42 CounterType:COUNTER Tags:port=3306 Timestamp:1499389081 Step:60”,”time”:”2017-07-07T00:58:01Z”}
    {“level”:”debug”,”msg”:”MetaData Metric:Is_slave Endpoint:ip-10-222-0-63 Value:0 CounterType:GAUGE Tags:port=3306 Timestamp:1499389081 Step:60”,”time”:”2017-07-07T00:58:01Z”}
    {“level”:”info”,”msg”:”Send response 127.0.0.1:3306: success”,”time”:”2017-07-07T00:58:01Z”}
    {“level”:”debug”,”msg”:”Send to http://10.222.0.44:1988/v1/push, size: 1”,”time”:”2017-07-07T00:58:01Z”}
    {“level”:”debug”,”msg”:”MetaData Metric:mysql_alive_local Endpoint:ip-10-222-0-63 Value:1 CounterType:GAUGE Tags:port=3306 Timestamp:1499389081 Step:60”,”time”:”2017-07-07T00:58:01Z”}
    {“level”:”info”,”msg”:”Alive data response 127.0.0.1:3306: success”,”time”:”2017-07-07T00:58:01Z”}

  • Web配置举例
    7
  • 出图如下
    8

nginx监控

这个目前没什么需求,就直接先参考小米给出的方案吧,其实都大同小异,有需求的话之后可能会自己写一些业务方面的监控脚本。到时候再共享

关于排错

  • 绘图数据流向及验证

    agent->transfer->graph->query->dashboard
    可以从 graph** 的http接口进行验证