Metrics 度量的重要性
我所在的公司曾经搞过一项运动, 口号至今印象深刻 - "Own your codes on production", 也就是掌控你在产品线上的代码.
作为一个软件工程师, 不能仅仅交付产品给运维人员就完事了, 你必须深刻了解你的代码在产品线上是怎么运行的, 是否和你想的一样, 还是大相径庭.
常言说道:
If you can’t measure it, you can’t manage it 如果你不能度量它, 你就不能管理它
If you can’t measure it, you can’t prove it 如果你不能度量它, 你就不能证明它
If you can’t measure it, you can’t improve it 如果你不能度量它, 你就不能提高它
特别对于微服务来说, 度量是必不可少的一环, 微服务数量这么多, 更新这么频繁, 发生故障的可能性随时都存在,必需要做好监控和度量工作。
到底要度量什么
这里我想强调三个方面的度量:
1. 度量你的工作
度量贯穿于你的整个开发周期, 从需要分析, 设计, 编码, 测试到部署上线, 一切都应该有所度量 并且这个度量工作应该全员参与, 从项目经理, 开发, 测试, 运维和一众项目干系人, 你们所做的工作和决策都应该基于度量
对于工作度量来说, 这是另外一个比较大的主题, 有两本书我推荐两本书 PSP 和 TSP
- PSP: 个人软件过程
- TSP: 团队软件过程
对于开发者自身来说, 我们可以对我们的日常工作做一些度量, 看看时间都去哪儿了, 并可以评估我们的工作效率, 数量和质量
- 工作量 – 文档或代码行数
- 时间 – 在各项任务上所花费的时间
- 质量 – 静态扫描, 自动或手工测试所发现的问题(bug)数量,
- 计划 – 对于计划的任务, 截止时间, 里程碑的实际完成情况
对于团队来说, 整个团队和项目的进度, 质量依然有些指标可以做有限的度量
- Backlog上user story 数量
- 本次Release中已完成和未完成的 user story 数据 - 任务估计时间与实际完成时间表 - 代码复杂性 - 测试覆盖率 - 部署速度
2. 度量你的产品
你的产品运行在产品环境上, 它可能会碰到各种你意想不到的情况, 你必须密切关注"他"的健康和行为, 不放过任务错误和故障和任何蛛丝马迹, 就微服务来说, 我们需要度量如下指标:
- 服务健康程度
- 服务用量和趋势
- 业务关键指标 KPI
业务千差万别, 前两项存在不少共性, 它们对于微服务的高可用性至关重要, 俗话说: "隐患险于明火, 防范胜于救灾, 责任重于泰山", 微服务的分流, 限流和断流的依据
3. 度量用户的行为
你的产品最终是给人用的, 即使是开发给机器或第三方服务, 你也得听其言, 观其行, 度量用户的行为喜好, 了解所有合理合法或异常非法的操作和行为
微服务的好处在于开发快, 修改快,上线快, 度量可以帮你发现用户特别喜欢某个功能点, 对某个功能有误用, 或者完全无视, 抑或利用系统漏洞做出一些意料之外的行为, 从而有的放矢做出反应.
度量的层次
就产品度量而言, 我们一般分为三个层次
- 基础设施指标
- 应用指标
- 业务指标
例如:
| 层次 | 度量指标 |
|---|---|
| 1. 基础架构层 | * CPU * Memory * Instances 进程数 * Opened Handlers 打开句柄数 * I/O statistics 输入输出统计 * Network 网络流量统计 |
| 2. 应用程序层 | |
| 2.1 交互 | * QPS(Query Per Second) 每秒查询数 * TPS(Transaction Per Second) 每秒事务数 * 响应时长及任务处理时间 * 请求数量统计 (成功, 错误和超时) |
| 2.2 内部 | * 内部线程个数 * 事件队列长度 * 共享锁等待时间 |
| 2.3 质量 | * Error Code Statistic 错误代码统计 * 数据包的延迟,丢包,抖动,乱序 |
| 3. 业务层 | * 用户访问次数及时长统计 * 对于不同特性及功能使用统计 * 用户的地域,年龄及职业等的分布 |
度量的类型
Gauge 采样值
对某项指标的采样数值, 比如 CPU 或内存使用率
Counter 计数
增加或减少的数值, 比如用户访问次数, 服务请求次数
Meter 计量器
用来度量一段时间内事件发生的频率, 比如 QPS(Query Per Second)
Histogram 直方图
用来记录和统计持续发生的数据流, 比如最大值, 最小值, 平均数, 中位数, 方差, 百分位数等等
Timer 计时器
统计和计量事件所花费的时间, 比如持续观测和度量数据库最耗时查询
如何做度量
我把它总结为4个A:
1. Aggregate 聚合
其中又分为三个步骤
1.1 产生和记录度量数据
在相关切面及关键点进行度量的记录和统计, 并写日志, 发送消息, 或提供API 供查询
1.2 收集度量数据
收集的方式有拉和推两种方式, 比如:
- Logstash 把数据拖到 Elastics Search 中
- 用 SNMP 把数据推送出去,
- 把数据通过消息队列系统 Kafaka 发送出去
也可以把多种方法结合起来
1.3 存储度量数据
把度量数据存储到数据库, ElasticsSearch, InfluxDB, Graphite 或 Hadoop中供进一步分析
2. Analyze 分析
对于收集到的数据进行分析才能产生价值, 方法和工具有很多, 比如最常用的 SQL 以及各种大数据分析工具,比如 Pandas,Splunk Query 等等
3. Alert and Report 报警和汇报
在分析的结果之上, 我们可以得出许多有价值的东西, 以供采取相应的运动,进行运维,技术设计和市场策略的调整.
有一些比较严重的问题,需要立即采取行动,必需立即报警,常用方法有:
- SNMP alert: 通过SNMP发送报警
- Email : 发送给值班的运维人员
- SMS: 短信
- IM: 即时消息
- Phone: 电话
曾经使用过 Seyren,它是一款开源的监控报警系统,可以和流行的Graphite, InfluxDB等系统集成,可以以各种方式报警。 而 Pagerduty 是另外商业系统,有众多的 API 可以和你的系统集成,还有一个排班系统,任何一个产线事故都会呼叫值班人员立即进行处理。 Seyren 和 PagerDuty 系统可以集成在一起使用。
4. Action 行动
根据报警系统和报表分析的结果, 我们需要采取相应的行动, 如果可以自动处理的话,尽量减少人工干预。 当然产线上的情况比较复杂, 有些操作还有需要有经验的工程师见机行事
在微服务高可用性中提及的对于微服务的分流,限流和断流都可以在度量的基础上设定相应策略自动处理。
部分行动清单
- 流量过大: 进行限流 Rate limiting 或者横向扩展 Scale out 增加更多的服务器
- 部分节点出现严重故障: 熔断 Circuit Beak
- 新版软件有重大缺陷: 回滚或紧急热修复
- 部分集群或地区硬件故障:切换至备份集群,或做灾难恢复
- 发现黑客攻击行为:更新黑名单,阻断特定IP的请求等
产品设计和技术方案的优化调整不能凭空猜测,而是应该在度量结果分析的基础之上有的放矢。 性能需不需要优化,容量需不需要提高, 新功能用户喜不喜欢, 一切由度量数据说了算
度量用到的商业及开源工具与软件库
在此不做展开,仅作列举, 有用到的时候另作专题详述
开源软件
-
Metrics library Metrics Mind the gap. Metrics is a Java library which gives you unparalleled insight into what your code does in production. Metrics provides a powerful toolkit of ways to measure the behavior of critical components in your production environment.
-
EKL: 大名鼎鼎的 EKL 组合,几乎成为日志收集分析系统的标配
-
Graphite Graphite is an enterprise-ready monitoring tool that runs equally well on cheap hardware or Cloud infrastructure. Teams use Graphite to track the performance of their websites, applications, business services, and networked servers.
Open Source Time Series DB Platform for Metrics & Events (Time Series Data). Creator of the TICK Stack: InfluxDB, Telegraf, Chronograf & Kapacitor. Providing real-time analytics, IoT applications, and DevOps Monitoring.
-
Seyren Seyren (/ˈsaɪ.rʌn/) is an alerting dashboard for Graphite. 当然也不仅限于于 Graphite 集成
-
Nagios Nagios provides enterprise-class Open Source IT monitoring, network monitoring, server and applications monitoring. Download Nagios Today!
Zabbix is a mature and effortless enterprise-class open source monitoring solution for network monitoring and application monitoring of millions of metrics.
-
Cacti Cacti is a complete network graphing solution designed to harness the power of RRDTool's data storage and graphing functionality
-
Sonar 是代码静态扫描的利器,与上述软件不同,它是在开发阶段对代码质量的度量 Sonar is an open source platform used by development teams to manage source code quality. Sonar has been developed with a main objective in mind: make code quality management accessible to everyone with minimal effort.
- Duplicated code
- Coding standards
- Unit tests
- Complex code
- Potential bugs
- Comments
- Design and architecture
商业软件
近几年,大数据的风潮之下,商业的度量收集和数据分析软件发展迅速,仅我使用过的就有以下
-
Splunk Splunk Inc. turns machine data into answers with the leading platform to tackle the toughest IT, IoT and security challenges. Use Splunk to search, monitor, analyze and visualize machine data.
-
New Relic New Relic’s digital intelligence platform lets developers, ops, and tech teams measure and monitor the performance of their applications and infrastructure.
-
Circonus Circonus is a trusted & ultra-scalable analytics & monitoring for IT Ops & DevOps platform. Offering Real-Time Performance monitoring-try a free demo today.
-
Platfora: Platfora's Big Data Discovery and Analytics platform is the only end-to-end solution native on Hadoop + Spark.
-
Qlik: The Qlik data analytics platform offers powerful self-service visualization, guided and embedded analytics and reporting capabilities to over 45,000 customers worldwide.
-
AppDynamics: Get real-time insight from your apps using Application Performance Monitoring & Management—how they’re being used, how they’re performing, where they need help.