我每隔 _getListData() {
List<Widget> widgets = [];
for (int i = 0; i < 100; i++) {
widgets.add(Padding(
padding: EdgeInsets.all(10.0),
child: Column(
children: <Widget>[
Expanded(
child: Container(),
),
FlatButton(
onPressed: () => {},
color: Colors.orange,
padding: EdgeInsets.all(10.0),
child: Column(
// Replace with a Row for horizontal icon + text
children: <Widget>[Icon(Icons.add), Text("Add")],
)),
],
)));
}
return widgets;
}
从我的API服务器上抓取一次请求延迟的直方图。
然后我将直方图可视化为Grafana中的热图。看起来像这样:
我的查询是:
1m
我了解要执行的操作是:在相关时间取存储桶矢量,并在1分钟前减去存储桶矢量,以获取该分钟的存储桶矢量(直方图会累积,并且每次刮擦时都不会清除其存储桶)< / p>
但是问题是,查看我的请求日志,我看到了:
sum(http_request_duration_seconds_bucket) by (le)
-
sum(http_request_duration_seconds_bucket offset 1m) by (le)
如您所见,第一次出现“ Inf”运行时请求是在 13:56 中,但是如果我们查看直方图,直到 13:58 。
为什么数据要偏移2分钟?
答案 0 :(得分:0)
Grafana具有查询检查器按钮。您可以使用它来查看Prometheus返回的确切响应,并确定是Grafana还是Prometheus(或两者)引入了这种转变。
在Prometheus端我可以看到这种情况的一个可能原因是抓取分辨率。如果您每分钟仅抓取一次,则可能最多需要一分钟才能看到增加(平均延迟为原来的一半)。此外,如果您已经记录了处理抓取数据的规则,并且正在显示所述记录的规则的结果,那么这也会增加延迟。
因此,在1分钟的刮擦间隔和1分钟的评估间隔内,您可以看到0到2分钟之间的任何变化(甚至在考虑由于目标速度慢和/或Prometheus实例过载造成的抖动之前)。
编辑:几乎忘了,您也很想使用increase
/ rate
而不是减法,以便更好地处理实例重启。 (不幸的是,increase
/ rate
会使指标偏离与范围除以抓取间隔成比例的数量,并且会丢失一些样本,但是您必须选择毒药。)
答案 1 :(得分:0)
我想我可以解释这个延迟。有两个方面的作用:
我错误地认为普罗米修斯保留了单个事件的时间戳。取而代之的是,在刮擦发生的那一刻收集直方图中的数据,并将数据标记为在此刻出现。
我忘记了我自己的仪器的详细信息-我在请求完成后立即使用Prometheus客户端库将数据点添加到直方图指标(以及怎么回事?其他方式?我们想知道延迟!)
因此,如果在请求返回的那一刻(此点后超过30秒),将13:57:15
(第一个长期运行的请求)的请求数据添加到直方图中,请在{{ 1}},然后抓取时间为:[{13:56:10
,13:57:10
,13:58:10
],然后在13:56:18
开始 的请求最终成为13:58
抓图的一部分。