我有一个XDB时间序列数据库,我正在存储一个名为api\u calls
的度量。此度量有两个相关度量,call\u called
和call\u failed
。每个度量也有一个标记,带有与其关联的供应商id。
每分钟,我都有一个服务,它会整理我调用call\u调用的次数(启动API调用时触发)和
call\u失败的次数(从API调用中收到错误消息时触发)并将它们存储到XDB中。因此,基本上,每分钟我都会在XDB“表”中得到一条记录(据我所知,每个标记一条记录)(因为没有更好的术语),这两个值都与之相关。
我一直在绞尽脑汁试图找出如何显示API失败率最高的前十大供应商id。
我该怎么做?我有很强的SQL背景,但我尝试过的一切要么根本不起作用,要么肯定不能正常工作。
匿名用户
我对您的模式做了一些猜测,并使用CLI构建了一个解决方案。我在这里使用的是流感数据库v1.0.2。
请注意,TOP()在2016年1月左右才成为一个工作函数。
如果你的版本是比这更旧的,下面的将不起作用。
首先,一些样本数据:
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
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,我们可以键入格式化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]]}]}]}
那有帮助吗?
抱歉——我注意到你在找百分比,而不是十大数字。
在XDB中,有两个问题:第一个问题是如何生成百分比。
关于函数中嵌套运算符的注意事项:XDB通常还不能保证嵌套函数或函数参数中的运算符能够工作。有些允许,许多不允许。这里很重要:TOP()
只允许字段键或标记作为参数,而不允许对标记进行操作(例如调用失败/总调用)。您需要执行额外的查询来生成百分比,并且必须存储它们。您可以根据“原始”值逐分钟计算它们:
SELECT (call_failed / (call_failed + call_invoked)) AS pct_fail INTO api_calls FROM api_calls GROUP BY vendor_id
(groupbytime
是隐式的:在不使用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
(连续查询需要一个groupbytime()
子句)。
没有技术要求将连续查询结果推送到新的度量中-例如,您可以选择将计算结果返回到api_调用中。但是将原始数据和汇总结果放在同一个度量中会导致查询结果有很多空值。在XDB中,将结果推到一个新的度量通常会更整洁。
从那里,像前面一样使用TOP()
:
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)
这是我的代码: 但它不起作用并显示此错误:
如果你还需要看什么,请告诉我。 我把Facebook添加到我的项目中。我用的是Android Studio。生成后我的错误是:
我下载了Android Studio项目。在项目的根只有一个build.gradle下一个结构: 当我运行 build.gradle 脚本时,我收到错误: 我知道肯定还有另一个像这样的顶级gradle文件: 但它不存在。如何添加此构建文件?或者也许是解决此问题的另一种方法? 该项目是在旧版本的android studio中创建的。也许他在旧版本中为另一种方式工作?我在等待帮助。非常感谢。
试图写一个程序在Java计算幂级数近似in(x)使用以下公式: 我是用while循环来做的,我似乎无法100%正确地得到sin近似值。你知道我哪里出错了吗? 这目前给了我以下输出:
有没有一种方法可以像这样在liferay中创建/处理友好的URL? ... 其中John Doe是应显示其数据的客户的名称。 更详细一点: 我说的不是为了友好的url而放弃“web”或“group”,而是在第一个“/”之后有一个友好的url。 我们希望以http://server/ClientName其中ClientName解析为客户端的名称。这是一个问题,因为liferay通常希望在第一个“/”
我是vert的新手。x、 我不想把代码片段/示例作为vert。x github页面上满是它们。 我在寻找一些事实和最佳实践。 我正在编码一个应用程序,它的主要顶点是一个HttpServer,处理Restful请求。 我使用maven shade插件打包应用程序,如下所述:http://vertx.io/blog/my-first-vert-x-3-application/ 第一个问题: 运行应用程