为什么服务需要监控
监控进程状态
及时发现问题
掌握主动权
监控什么
1、进程运行状态
2、机器资源状态
(机器广义上包括PM/VM/Docker)
(资源包括cpu\memory\disk\network\io)
Linux下如何监控:
a、磁盘 df -h
b、内存 free -g
c、cpu vmstat
d、网络 ifstat
磁盘情况
![](https://i-blog.csdnimg.cn/blog_migrate/b1054ae80ddcff4d3ba43623e25924b6.png)
1、只有一块磁盘
tmpfs 临时文件系统
2、Etcd存储就是放在tmpfs上 性能非常好
操作系统内部临时的文件系统
3、124分区不同
4、如果三个磁盘是这样的 sda1 sdb2 sdc3
内存情况
![](https://i-blog.csdnimg.cn/blog_migrate/fdba225f78be929d533d7bedf286197b.png)
应用程序可用的内存是 free + buffer+cache
cpu情况一秒刷新一次
![](https://i-blog.csdnimg.cn/blog_migrate/b35e6414147b9a2269e10d1433cd6c81.png)
io、cpu空闲率 基本上在50%以下会比较好
网络情况
![](https://i-blog.csdnimg.cn/blog_migrate/03a3684c1d38ac1629ce33e4189fef0d.png)
一块网卡就是etc0
两块网卡就是 etc0 etc1
In 进包
out 发包
监控数据如何采集
-
用户请求日志打印
-
服务端数据上报
-
前端页面数据埋点
日志规范
-
格式key=value -
空格分割key=value对
服务传统监控手段
![](https://i-blog.csdnimg.cn/blog_migrate/a315852386271f9caa0a13ab63953459.jpeg)
1、进程活着 但不代表正常运行即可能存在进程假死的情况
2、通过语义监控保证进程不是假死状态即模拟用户对接口发出请求
3、服务稳定的表现是每分钟错误量都是固定的
4、数据波动监控 比如数据流量突然增加了50% 可能是别人通过爬虫调用你的接口
进程监控
进程是否存活
-
原始解决方案
1、ps -aux|grep 进程名
2、不断轮询 没有输出解决触发告警
-
优雅解决方案
Linux daemontools supervise
supervise监控启动方法
![](https://i-blog.csdnimg.cn/blog_migrate/4d27fffd6d898167cd6b95a8f05d132a.png)
父进程 fork 开启子进程
子进程退出 发送一个signal给父进程
supervise 是二进制文件代表父进程
弊端
解决不了进程假死问题 仅仅监控进程是否还活着
语义监控
![](https://i-blog.csdnimg.cn/blog_migrate/6711f9c603c603e956b11e5752c0eca1.png)
错误日志监控
相对通用的解决方案
![](https://i-blog.csdnimg.cn/blog_migrate/a9e67555f9c852b2a4278104c354ee33.png)
数据波动监控
解决方案
![](https://i-blog.csdnimg.cn/blog_migrate/8f596fed3906f05e4b7f441841775af4.png)
1、环比:和昨天相比
2、同比:和上周的今天相比
3、每天几百T或上P的数据量 监控系统推荐使用小米开源的open-falcon
4、大数据处理
a、实时流计算 spark
b、离线批量计算 mapreduce
c、实时+批量 flink
d、阿里基于flink开源了Blink
![](https://i-blog.csdnimg.cn/blog_migrate/559fb820fcbd5848083ddc04b4d3d833.png)
优秀开源监控框架
![](https://i-blog.csdnimg.cn/blog_migrate/a2edb3a6f257c8905a5f719dd9e75cf1.jpeg)
1、ZABBIX主要用于Mysql监控
2、Prometheus、Grafana主要用于监控TiDB
3、其他监控场景使用falcon
Open-Falcon
特点
![](https://i-blog.csdnimg.cn/blog_migrate/ea9065699d8b07da5dd47fe59a042413.jpeg)
自动发现就是发现监控项
主动往agent上推送数据
系统架构
![](https://i-blog.csdnimg.cn/blog_migrate/cec00e04816b64cf23a5bb45abbd20c4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/12ace35eaf2a2364222674697ed33ef3.png)
输入监控命令
![](https://i-blog.csdnimg.cn/blog_migrate/95674828715f96b5333badc93faa3ac6.png)
Dashboard
![](https://i-blog.csdnimg.cn/blog_migrate/3c35fa90f6fca60c1191c2b0f4804259.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7835b619f980bad72a4799a5a7ed6715.jpeg)
配置模型基本信息
![](https://i-blog.csdnimg.cn/blog_migrate/bae1ed1a2d9b9590034e59bca28364bf.png)
多纬度立体监控
![](https://i-blog.csdnimg.cn/blog_migrate/423c8d4db19c5d4a6829d1fb06024fcc.png)
多视角监控
![](https://i-blog.csdnimg.cn/blog_migrate/a2c47505b741aa97a9859be397ce919d.png)
层次和维度
![](https://i-blog.csdnimg.cn/blog_migrate/0fe51b69067ec4fcbae2a2c109b63ae2.jpeg)
通用监控项
-
机器指标
![](https://i-blog.csdnimg.cn/blog_migrate/82153a8fa3e2e69ad0378f73b7dbb12a.png)
-
JVM指标
![](https://i-blog.csdnimg.cn/blog_migrate/35142907546452906a96a0ada6b63f11.png)
-
进程指标
![](https://i-blog.csdnimg.cn/blog_migrate/e9d44547b2e87cf4a3ccf6c71485aa08.png)
-
DB指标
![](https://i-blog.csdnimg.cn/blog_migrate/e5b4c51dc8f31120781ad5c1c44e061a.png)
业务监控项
比如监控发布次数
商品信息中包含的非法字符个数
红包使用次数
立体监控特点
-
业务隔离 原逻辑不动
-
随时修改 即时生效
-
运行时不占用资源 零消耗
传统监控系统无法理解业务
不满足业务级监控需求
目标
![](https://i-blog.csdnimg.cn/blog_migrate/3bd0fd4f81102a72cc2c282cbda98cf5.png)
立体监控业务层面设计于实践
方案选择
-
本地日志
![](https://i-blog.csdnimg.cn/blog_migrate/f57ef13858b14546cdae5501b530f993.png)
-
日志平台
![](https://i-blog.csdnimg.cn/blog_migrate/c11149b4b9525fd313d3a0b12df16cf1.png)
-
立体监控平台
![](https://i-blog.csdnimg.cn/blog_migrate/a8ff0f29970b10cc91df7bfbe4343040.png)
日志平台VS立体监控
![](https://i-blog.csdnimg.cn/blog_migrate/74dc3bf0eb6ca153854bce198352521d.png)
职责边界
接入方
-
定义监控目标 -
监控数据产生
平台方
-
分布式环境中数据汇总 -
告警条件对比与发出告警 -
数据存储方案 -
图形化展示
抽象监控规范
名称术语
![](https://i-blog.csdnimg.cn/blog_migrate/b1700bac338bfa189c59edd928a7a8dc.png)
聚合算法
![](https://i-blog.csdnimg.cn/blog_migrate/5a4bdaa7d1e5e1cfc0e8061076b40cda.png)
约定规则
![](https://i-blog.csdnimg.cn/blog_migrate/23079716de3a9228d9df1c1e3f356ff2.png)
立体架构
![](https://i-blog.csdnimg.cn/blog_migrate/6a538d4af670e776fcdb0b5d83b38039.png)
1、业务环境:网关层、业务逻辑层、数据访问层、数据存储层
2、代理即是一个jar包
3、代理与数据收集服务 UDP协议通信
4、立体监控平台即是一个Web服务
业务接入与Agent
![](https://i-blog.csdnimg.cn/blog_migrate/a20b64469904a8984470d51e1ba29765.jpeg)
1、一个机器有一个agnet
所有的应用都和这个agent通讯 使用UDP协议
2、用go实现agent是业内标准
本身是damon程序
稳定性和性能很好
Agent聚合方法
聚合内存
优点
-
无通讯协议开销 -
全局锁 -
固定内存
![](https://i-blog.csdnimg.cn/blog_migrate/5080cd0c7fa10c36eff114f9942b2fb0.png)
聚合内存c语言应用用的比较多 对Java应用意义不大
TCP传输
优点
-
可靠传输 -
容错方案 -
存储模型
![](https://i-blog.csdnimg.cn/blog_migrate/0e99be26d2a21ad3946dfd660712a332.png)
tcp同步阻塞模型可能会阻塞进程
对日志传输意义不大
UDP传输
优点
-
直接仍 -
对业务流程无阻塞 -
模型简单
![](https://i-blog.csdnimg.cn/blog_migrate/0f8bbf721c4ff1e8c0c67209a2763ff7.png)
1、本地做些计算 再扔给远端
2、对敏感性、时效性要求不高可以使用UDP方式
业务方使用
监控以下函数
-
调用次数 -
平均耗时 -
最大耗时 -
异常次数
硬编码方式(不推荐)
![](https://i-blog.csdnimg.cn/blog_migrate/09bd3b972d9e4f3c49d6ce626a326b12.png)
注解方式
![](https://i-blog.csdnimg.cn/blog_migrate/49d1ac336c990a4562cdcb9676d56b3e.png)
通过Springboot\Guava 15.0+\Aspectj1.5.4+实现
监控组合
监控项和机器列表任意组合
![](https://i-blog.csdnimg.cn/blog_migrate/3f38d2e6b81a7ad517d736215b3cc8ae.jpeg)
自动采集JVM监控数据
![](https://i-blog.csdnimg.cn/blog_migrate/59aa3816718fe7a8892151d654eccf7b.jpeg)
可用内存
堆大小
耗时
服务器监控
![](https://i-blog.csdnimg.cn/blog_migrate/4a66d4318c73bc97a9224af24decbcfa.png)
利用率
机器负载
内存利用率
磁盘利用率
告警设置
![](https://i-blog.csdnimg.cn/blog_migrate/d38f280fa951ee6076878bc1374a518f.png)
最终示例
![](https://i-blog.csdnimg.cn/blog_migrate/630481e45a271cb792c813232568ed00.jpeg)