在上面的 Demo 1 中,我们注意到在我们报告指标时,这里生成了许多数据。当我们将它们用于指标时我们需要做统计,因为它们实在是太多了。我们需要的是整体行为,我们没法去处理单个值。我们预期展现出来的值的行为应该是代表我们观察的系统的行为。
Demo 2:在指标上增加特征在我们上面的的 Demo 1 应用程序中,当我们计算和报告一个请求的延迟时,它指向了一个由一些特征 唯一标识的特定请求。下面是其中一些:
HTTP 端点
HTTP 方法
运行它的主机/节点的标识符
如果我们将这些特征附加到要观察的指标上,每个指标将有更多的内容。我们来解释一下 Demo 2 中添加到我们的指标上的特征。
在写入指标时,src/helpers/middleware.py 文件将在 CSV 文件中写入多个列:
node_ids =['10.0.1.1','10.1.3.4']
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
node_id = node_ids[random.choice(range(len(node_ids)))]
with open('metrics.csv','a', newline='')as f:
csvwriter = csv.writer(f)
csvwriter.writerow([
str(int(time.time())),'webapp1', node_id,
request.endpoint, request.method, str(response.status_code),
str(resp_time)
])
return response
因为这只是一个演示,在报告指标时,我们将随意的报告一些随机 IP 作为节点的 ID。当我们在 demo2 目录下运行 docker-compose up 时,我们的结果将是一个有多个列的 CSV 文件。
用 pandas 分析指标我们将使用 pandas 去分析这个 CSV 文件。运行 docker-compose up 将打印出一个 URL,我们将使用它来打开一个 Jupyter 会话。一旦我们上传 Analysis.ipynb notebook 到会话中,我们就可以将 CSV 文件读入到一个 pandas 数据帧DataFrame中:
import pandas as pd
metrics = pd.read_csv('/data/metrics.csv', index_col=0)
index_col 表明我们要指定时间戳作为索引。
因为每个特征我们都要在数据帧中添加一个列,因此我们可以基于这些列进行分组和聚合:
import numpy as np
metrics.groupby(['node_id','http_status']).latency.aggregate(np.percentile,99.999)
更多内容请参考 Jupyter notebook 在数据上的分析示例。
我应该监测什么?