蚊章汇 - Amit Saha
type: channel
link: https://linuxcn.bwsl.wang/author/1062/
description: Amit Saha
items: 理解监测指标，并使用 Python 去监测它们

理解监测指标，并使用 Python 去监测它们
type: item
date: 2018-09-14T17:51:06+08:00
description: 通过学习这些关键的术语和概念来理解 Python 应用监测。当我第一次看到术语“ 计数器 counter ”和“ 计量器 gauge ”和使用颜色及标记着“平均数”和“大于 90%”的数字图表时，我的反应之一是逃避。就像我看到它们一样，我并不感兴趣，因为我不理解它们是干什么的或如何去使用。因为我的工作不需要我去注意它们，它们被我完全无视。这都是在两年以前的事了。随着我的职业发展，我希望去了解更多关于我们的网络应用程序的知识，而那个时候就是我开始去学习 监测指标 metrics 的时候。我的理解监测的学习之旅共有三个阶段（到目前为止），它们是：阶段 1：什么？（王顾左右）阶段 2：没有指标，我们真的是瞎撞。阶段 3：出现不合理的指标我们该如何做？我现在处于阶段 2，我将分享到目前为止我学到了些什么。我正在向阶段 3 进发，在本文结束的位置我提供了一些我正在使用的学习资源。我们开始吧！需要的软件在文章中讨论时用到的 demo 都可以在 我的 GitHub 仓库 中找到。你需要安装 docker 和 docker-compose 才能使用它们。为什么要监测？关于监测的主要原因是：理解 正常的 和 不正常的 系统和服务的特征做容量规划、弹性伸缩有助于排错了解软件/硬件改变的效果测量响应中的系统行为变化当系统出现意外行为时发出警报指标和指标类型从我们的用途来看，一个指标就是在一个给定时间点上的某些数量的 测量 值。博客文章的总点击次数、参与讨论的总人数、在缓存系统中数据没有被找到的次数、你的网站上的已登录用户数 —— 这些都是指标的例子。它们总体上可以分为三类：计数器以你的个人博客为例。你发布一篇文章后，过一段时间后，你希望去了解有多少点击量，这是一个只会增加的数字。这就是一个 计数器 counter 指标。在你的博客文章的生命周期中，它的值从 0 开始增加。用图表来表示，一个计数器看起来应该像下面的这样：一个计数器指标总是在增加的。计量器如果你想去跟踪你的博客每天或每周的点击量，而不是基于时间的总点击量。这种指标被称为一个 计量器 gauge ，它的值可上可下。用图表来表示，一个计量器看起来应该像下面的样子：一个计量器指标可以增加或减少。一个计量器的值在某些时间窗口内通常有一个 最大值 ceiling 和<ruby最小值floor。柱状图和计时器 柱状图 histogram （在 Prometheus 中这么叫它）或 计时器 timer （在 StatsD 中这么叫它）是一个跟踪 已采样的观测结果 的指标。不像一个计数器类或计量器类指标，柱状图指标的值并不是显示为上或下的样式。我知道这可能并没有太多的意义，并且可能和一个计量器图看上去没有什么不同。它们的不同之处在于，你期望使用柱状图数据来做什么，而不是与一个计量器图做比较。因此，监测系统需要知道那个指标是一个柱状图类型，它允许你去做哪些事情。一个柱状图指标可以增加或减少。Demo 1：计算和报告指标Demo 1 是使用 Flask 框架写的一个基本的 web 应用程序。它演示了我们如何去 计算 和 报告 指标。在 src 目录中有 app.py 和 src/helpers/middleware.py 应用程序，包含以下内容：from flask import request import csv import time def start_timer(): request.start_time = time.time() def stop_timer(response): # convert this into milliseconds for statsd resp_time = (time.time() - request.start_time)*1000 with open('metrics.csv', 'a', newline='') as f: csvwriter = csv.writer(f) csvwriter.writerow([str(int(time.time())), str(resp_time)]) return response def setup_metrics(app): app.before_request(start_timer) app.after_request(stop_timer)当在应用程序中调用 setup_metrics() 时，它配置在一个请求被处理之前调用 start_timer() 函数，然后在该请求处理之后、响应发送之前调用 stop_timer() 函数。在上面的函数中，我们写了时间戳并用它来计算处理请求所花费的时间。当我们在 demo1 目录中运行 docker-compose up，它会启动这个 web 应用程序，然后在一…