一个软件系统有许多的变量,这些变量的值在它的生命周期中不停地发生变化。软件是运行在某种操作系统上的,而操作系统同时也在不停地变化。在我看来,当某些东西出错时,你所拥有的数据越多越好。
我建议去监测的关键操作系统指标有:
CPU 使用
系统内存使用
文件描述符使用
磁盘使用
还需要监测的其它关键指标根据你的软件应用程序不同而不同。
网络应用程序如果你的软件是一个监听客户端请求和为它提供服务的网络应用程序,需要测量的关键指标还有:
入站请求数(计数器)
未处理的错误(计数器)
请求延迟(柱状图/计时器)
排队时间,如果在你的应用程序中有队列(柱状图/计时器)
队列大小,如果在你的应用程序中有队列(计量器)
工作进程/线程用量(计量器)
如果你的网络应用程序在一个客户端请求的环境中向其它服务发送请求,那么它应该有一个指标去记录它与那个服务之间的通讯行为。需要监测的关键指标包括请求数、请求延迟、和响应状态。
HTTP web 应用程序后端HTTP 应用程序应该监测上面所列出的全部指标。除此之外,还应该按 HTTP 状态代码分组监测所有非 200 的 HTTP 状态代码的大致数据。如果你的 web 应用程序有用户注册和登录功能,同时也应该为这个功能设置指标。
长时间运行的进程长时间运行的进程如 Rabbit MQ 消费者或任务队列的工作进程,虽然它们不是网络服务,它们以选取一个任务并处理它的工作模型来运行。因此,我们应该监测请求的进程数和这些进程的请求延迟。
不管是什么类型的应用程序,都有指标与合适的元数据相关联。
将监测集成到一个 Python 应用程序中将监测集成到 Python 应用程序中需要涉及到两个组件:
更新你的应用程序去计算和报告指标
配置一个监测基础设施来容纳应用程序的指标,并允许去查询它们
下面是记录和报告指标的基本思路:
def work():
requests +=1
# report counter
start_time =time.time()
#<do the work >
# calculate and report latency
work_latency =time.time()- start_time
...
考虑到上面的模式,我们经常使用修饰符、内容管理器、中间件(对于网络应用程序)所带来的好处去计算和报告指标。在 Demo 1 和 Demo 2 中,我们在一个 Flask 应用程序中使用修饰符。
指标报告时的拉取和推送模型大体来说,在一个 Python 应用程序中报告指标有两种模式。在 拉取 模型中,监测系统在一个预定义的 HTTP 端点上“刮取”应用程序。在推送 模型中,应用程序发送数据到监测系统。
Pull and push models
工作在 拉取 模型中的监测系统的一个例子是 Prometheus。而 StatsD 是 推送 模型的一个例子。
集成 StatsD将 StatsD 集成到一个 Python 应用程序中,我们将使用 StatsD Python 客户端,然后更新我们的指标报告部分的代码,调用合适的库去推送数据到 StatsD 中。
首先,我们需要去创建一个客户端实例:
statsd = statsd.StatsClient(host='statsd', port=8125, prefix='webapp1')
prefix 关键字参数将为通过这个客户端报告的所有指标添加一个指定的前缀。
一旦我们有了客户端,我们可以使用如下的代码为一个计时器报告值:
statsd.timing(key, resp_time)
增加计数器:
statsd.incr(key)
将指标关联到元数据上,一个键的定义为:metadata1.metadata2.metric,其中每个 metadataX 是一个可以进行聚合和分组的字段。