如何计算MQL中两个Stackdriver度量之间的差异和比率?
这个问题有两个部分,但如果你能帮我一个,我很感激:
- 计算两个时间序列之间的差异
- 计算两个时间序列之间的比率。Addon(如果可能的话(:分母为null的情况应该优雅地处理
到目前为止,但它没有产生预期的结果(产生的时间序列总是零(:
fetch global
| { t_0:
metric 'custom.googleapis.com/http/server/requests/count'
| filter
(metric.service == 'service-a' && metric.uri =~ '/api/started')
| align next_older(1m);
t_1:
metric 'custom.googleapis.com/http/server/requests/count'
| filter
(metric.service == 'service-a' && metric.uri =~ '/api/completed')
| align next_older(1m)
}
| outer_join 0
| div
显然,该代码已被匿名化。我想完成的是跟踪已经启动的流程与已完成的流程之间是否存在差异。
编辑/附加信息2021-11-18
我使用projects.timeSeries v3 API进行进一步的调试。显然,outer_join操作假设两个时间序列之间的标签是相同的,但在我的示例中并非如此。
有人知道如何删除标签,以便我可以执行连接和聚合吗
编辑/附加信息2021-11-19
聚合现在可以工作了,因为我设法使用map drop[...]
maplet删除了标签。
挑战实际上是标签,因为这些标签是由Micrometer的Spring Boot实现生成的。由于标签在这两个度量之间是不同的,所以对于join
,联接操作总是空的,或者对于outer_join
,只有第二个时间序列。
正如我所看到的,您想知道进程开始时和完成时的server_req_count之间的比率,并且您使用的align next_older(1m(可能会获取该期间的最新值。因此,当进程开始时,计数可能为零。因此,我建议您将aligner更改为mean或max,以便在不同的时间序列中启动和完成过程中的req_count。
align mean(1m)
有关比率查询的更多方法,请参阅文档:比率查询示例
这就是我到目前为止得到的。现在,聚合在删除标签时工作。当我了解更多信息时,我会更新这个例子。
fetch global
| {
t_0:
metric 'custom.googleapis.com/http/server/requests/count'
| filter
(metric.service == 'service-a' && metric.uri =~ '/api/started')
| every (1m)
| map drop [resource.project_id, metric.status, metric.uri, metric.exception, metric.method, metric.service, metric.outcome]
; t_1:
metric 'custom.googleapis.com/http/server/requests/count'
| filter
(metric.service == 'service-a' && metric.uri =~ '/api/completed')
| every (1m)
| map drop [resource.project_id, metric.status, metric.uri, metric.exception, metric.method, metric.service, metric.outcome]
}
| within d'2021/11/18-00:00:00', d'2021/11/18-15:15:00'
| outer_join 0
| value val(0)-val(1)
像您自己的答案中那样使用映射添加/映射删除运算符后,请确保使用outer_join 0,0
,这将为您提供一个完整的外部联接。注意CCD_ 5变元到CCD_;如果任一流的值丢失则替换零";。
在您的情况下,由于第一个流计数为"0";"启动";任务和第二流计数";已完成";任务中,您可能会发现第一个度量的行数多于第二个度量的情况。如果要执行左联接操作,语法为outer_join _, 0
。后跟0的下划线表示"0";如果第一个流的值丢失,请不要替换任何内容,但如果第二个流的价值丢失,请替换零">