gpt4 book ai didi

database - InfluxDb 前 X 罪犯

转载 作者:搜寻专家 更新时间:2023-10-30 20:15:46 24 4
gpt4 key购买 nike

我有一个 InfluxDb 时间序列数据库,我正在存储一个名为 api_calls 的指标。此指标有两个相关的度量,call_invokedcall_failed。每个测量也有一个标签,标签带有与之关联的供应商 ID。

每分钟,我都有一个服务来整理我调用call_invoked(在我启动 API 调用时触发)和 call_failed(在我收到请求时触发)的次数来自 API 调用的错误消息)并将它们存储到 InfluxDb 中。所以基本上,每一分钟我都会在 InfluxDb“表”(因为缺少更好的术语)中得到一个记录(每个标签,据我所知),它有这两个值与之相关联。

我一直在绞尽脑汁想弄清楚如何显示 API 失败百分比最高的前 10 个供应商 ID。

我该怎么做?我有很强的 SQL 背景,但我尝试过的一切要么根本不起作用,要么绝对不能正常工作。

最佳答案

我已经对您的架构进行了一些猜测,并使用 CLI 构建了一个解决方案。我在这里使用 InfluxDB v1.0.2。

请注意 TOP() 2016 年 1 月左右才成为一项工作职能

如果您的 InfluxDB 版本低于此版本,则以下内容将不起作用。

首先,一些示例数据:

CREATE DATABASE foo
USE foo
PRECISION rfc3339

INSERT api_calls,vendor_id=1 call_invoked=3i,call_failed=3i 1483228860000000000
INSERT api_calls,vendor_id=2 call_invoked=3i,call_failed=8i 1483228860000000000
INSERT api_calls,vendor_id=3 call_invoked=3i,call_failed=5i 1483228860000000000
INSERT api_calls,vendor_id=4 call_invoked=3i,call_failed=9i 1483228860000000000
INSERT api_calls,vendor_id=5 call_invoked=3i,call_failed=10i 1483228860000000000
INSERT api_calls,vendor_id=6 call_invoked=3i,call_failed=1i 1483228860000000000
INSERT api_calls,vendor_id=7 call_invoked=3i,call_failed=6i 1483228860000000000
INSERT api_calls,vendor_id=8 call_invoked=3i,call_failed=9i 1483228860000000000
INSERT api_calls,vendor_id=9 call_invoked=3i,call_failed=6i 1483228860000000000
INSERT api_calls,vendor_id=10 call_invoked=3i,call_failed=5i 1483228860000000000

然后运行以下查询。请注意 WHERE time > x AND time < y子句可以替换为类似 WHERE time > now() - 1h 的内容.

SELECT TOP(call_failed,3), vendor_id FROM api_calls WHERE time > '2017-01-01T00:00:00Z' AND time < '2017-01-01T00:05:00Z' GROUP BY time(1m)

结果为:

name: api_calls
---------------
time top vendor_id
2017-01-01T00:00:00Z
2017-01-01T00:01:00Z 10 5
2017-01-01T00:01:00Z 9 4
2017-01-01T00:01:00Z 9 8
2017-01-01T00:02:00Z
2017-01-01T00:03:00Z
2017-01-01T00:04:00Z

请注意,没有数据的每一分钟返回一行,但是有数据的地方返回3行。

如果我们告诉 CLI 我们想查看 JSON,我们可以输入 format json ,当我们重复相同的查询时,我们得到:

{"results":[{"series":[{"name":"api_calls","columns":["time","top","vendor_id"],"values":[["2017-01-01T00:00:00Z",null,null],["2017-01-01T00:01:00Z",10,"5"],["2017-01-01T00:01:00Z",9,"4"],["2017-01-01T00:01:00Z",9,"8"],["2017-01-01T00:02:00Z",null,null],["2017-01-01T00:03:00Z",null,null],["2017-01-01T00:04:00Z",null,null]]}]}]}

这有帮助吗?

编辑 - 重新处理百分比。

抱歉 - 我注意到您是在寻找百分比,而不是 Top X 计数。

在 InfluxDB 中,这是两个问题:第一个是如何生成百分比。

关于函数中嵌套运算符的注意事项:InfluxDB 还不能普遍保证函数参数中的嵌套函数或运算符会起作用。有些会,很多不会。这里很重要:TOP()只允许字段键或标签作为参数,而不是对标签的操作(例如 call_failed/total_calls)。您需要执行额外的查询来生成百分比,并且您必须存储它们。您可以根据“原始”、逐分钟的值计算它们:

SELECT (call_failed / (call_failed + call_invoked)) AS pct_fail INTO api_calls FROM api_calls GROUP BY vendor_id

(GROUP BY time 是隐含的:在没有 INTO 子句的情况下从 CLI 重新运行该查询以查看如何实现)。

或者您可以总结每个,例如小时:

SELECT (sum(call_failed) / (sum(call_failed) + sum(call_invoked))) AS pct_fail INTO api_calls_hourly FROM api_calls GROUP BY time(1h), vendor_id

这可以作为现有数据的一次性完成。对于任何新到达的数据,可以使用连续查询:

CREATE CONTINUOUS QUERY fail_pct_calc ON foo BEGIN SELECT (sum(call_failed) / (sum(call_failed) + sum(call_invoked))) AS pct_fail INTO api_calls_summary FROM api_calls GROUP BY time(1h), vendor_id END

(连续查询需要 GROUP BY time() 子句)。

将连续查询结果推送到新的测量中没有技术要求 - 您可以 SELECT返回计算结果INTO api_calls , 例如。但是将原始数据和汇总结果放在同一个度量中会导致查询结果中有很多 空值。在 InfluxDB 中,将结果推送到新的测量值通常更整洁。

从那里,使用 TOP()和以前一样:

已编辑 - 修复了“FROM”测量值

SELECT TOP(pct_fail,3), vendor_id FROM api_calls_summary WHERE time > '2017-01-01T00:00:00Z' AND time < '2017-01-01T00:05:00Z' GROUP BY time(1m)

关于database - InfluxDb 前 X 罪犯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42090997/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com