我将InfluxDB与Grafana结合使用,并且有一个名为 的测量,items其中包含一些标签和一个名为 的字段itemType。我需要过滤itemType某个字符串所在的行。以下 InfluxQL 查询正是我所需要的:
SELECT * FROM "items" WHERE "itemType" = 'example'
Run Code Online (Sandbox Code Playgroud)
我怎样才能在Flux中做同样的事情?
我目前有以下查询,它执行除按字段过滤之外的所有操作:
from(bucket: "dbname/autogen")
|> range(start: 2020-10-12T01:56:34Z, stop: 2020-10-12T02:54:10Z)
|> filter(fn:(r) => r._measurement == "items")
|> aggregateWindow(every: 5m, fn: count)
Run Code Online (Sandbox Code Playgroud)
但是用 替换该filter函数filter(fn:(r) => r._measurement == "items" and r.itemType == "example")不会返回任何结果,即使上面的 InfluxQL 查询在 InfluxDB CLI 中使用时确实返回数据。
我想存储交易以及最佳要价/出价数据,后者在InfluxDB中的更新速度比前者快得多。
我想,如果可能的话,使用一种允许我查询的模式:“对于市场X上的每笔交易,找到其时间标记<=该交易的时间标记的市场Y上的最佳要价/出价”。
(我将使用任何版本的Influx。)
例如,交易可能看起来像这样:
Time Price Volume Direction Market
00:01.000 100 5 1 foo-bar
00:03.000 99 50 0 bar-baz
00:03.050 99 25 0 foo-bar
00:04.000 101 15 1 bar-baz
Run Code Online (Sandbox Code Playgroud)
刻度数据可能更像这样:
Time Ask Bid Market
00:00.763 100 99 bar-baz
00:01.010 101 99 foo-bar
00:01.012 101 98 bar-baz
00:01.012 101 99 foo-bar
00:01:238 100 99 bar-baz
...
00:03:021 101 98 bar-baz
Run Code Online (Sandbox Code Playgroud)
我希望能够以某种方式加入某个市场(例如foo-bar)的每笔交易,而只有其他市场(例如bar-baz)上的最新卖/卖点数据点,才能得到如下结果:
Time Trade Price Ask Bid
00:01.000 100 100 99
00:03.050 99 101 98
Run Code Online (Sandbox Code Playgroud)
这样我就可以计算出市场foo-bar上的交易价格与最新报价的市场 …
我试图决定如何在 InfluxDB 数据库中组织测量(我相信他们称之为架构设计和数据布局),但我认为这可能是一个更一般的数据库类型问题。
举一个简单的例子,我正在测量两个数量,温度和湿度(我知道是有想象力的!),在两个位置,客厅和室外。
InfluxDB 具有插入数据点的语法:
测量, tag_key=tag_value field_key=field_value
所以有两个明显的(至少对我而言)选择。简而言之,第一个选项将插入这样的数据点:
INSERT temperature,location=outside value=15
INSERT humidity,location=outside value=50
Run Code Online (Sandbox Code Playgroud)
而第二种选择会这样做:
INSERT sensor_measurements,location=outside temperature=15,humidity=50
Run Code Online (Sandbox Code Playgroud)
我的问题更高级:
我个人的想法:
在我看来,选项 1 更像是 InfluxDB 描述“测量”所暗示的内容。温度和湿度都是独立的量。但仅仅称其为“价值”似乎有点笨拙。
选项 2 似乎具有以下优势:湿度和温度共享完全相同的时间戳。这将很有用,例如,如果我想将数据导入其他软件并在两个数量之间进行关联,这意味着我不必进行任何插值或分箱来使它们匹配。
我不确定在选项 2 中只进行一个名为sensor_measurements的一般测量是否是一个坏主意,并且以后很难维护。
详细:
在时间t1,插入数据:
INSERT humidity,location=outside value=50
INSERT temperature,location=outside value=15
INSERT humidity,location=living_room …Run Code Online (Sandbox Code Playgroud) 最近,我们在InfluxDB的GROUP BY时间上面临一个非常烦人的问题。事实证明,如果我们尝试汇总每30天的数据,则InfluxDB会通过意外的时间段来汇总我们的数据。
例如以下查询:
SELECT COUNT(user_id) AS result FROM measurement1 WHERE time > '2017-12-31 23:59:59' AND time < '2019-01-01 23:59:59' GROUP BY time(30d) FILL(0);
Run Code Online (Sandbox Code Playgroud)
然后我们得到以下响应(以毫秒为单位的时间):
time result
---- ------
1513728000000000000 0
1516320000000000000 0
1518912000000000000 0
1521504000000000000 0
1524096000000000000 0
1526688000000000000 0
1529280000000000000 0
1531872000000000000 0
1534464000000000000 4
1537056000000000000 1
1539648000000000000 0
1542240000000000000 0
1544832000000000000 0
Run Code Online (Sandbox Code Playgroud)
好了,将时间转换为正常日期后,我们发现返回的时间间隔是20/12 / 17、19 / 01/18到15/12/18(每30天)。
据我了解,聚合点是由influxdb根据时间上的第一个值(GROUP BY time(value))预先定义的。它甚至在文档中被提及,但规模更小-“预设时间边界”。但是,这些示例处理的是分钟和1天的汇总,并且可以通过offset参数轻松修复,因为这些标度的默认汇总间隔为午夜。
很好,但是在这里我们要处理很多天。在我们的例子中,我们无法使用offset参数,因为我们无法知道GROUP BY返回的时间间隔。
是否有任何源/公式/算法或任何东西可以帮助我们预测这些时间间隔,以便我们可以对它们进行抵消?如果没有这样的东西,那我们该如何克服这个问题呢?
我猜这一切的原因是性能,但是很奇怪的是,在他们的文档中没有提到此问题,因为这不是一种直观的行为。
编辑:我想我发现潮汐如何确定这些时间间隔-它总是从0个时代开始。如果是这样,那么我们可以在拍摄查询之前根据需要使用偏移量。我希望将其添加到他们的文档中,因为这可以为其他人节省大量时间,并且可以确认下一个版本中不会有重大更改。
我正在将 influx1.x 升级到 influx2.x (将查询从 influxQL 更新为 Flux 语法)。对于非常简单的查询,当我尝试查询超过 500,000 个点时,性能会急剧下降,并且我不确定是否可以采取任何措施来改进查询以获得更好的性能
涌入QL:
select last("y") AS "y" from "mydata".autogen."profile"
WHERE time >= '2019-01-01T00:00:00Z' and time <= '2019-01-07T23:59:59Z'
GROUP BY time(1s) FILL(none)
Run Code Online (Sandbox Code Playgroud)
通量:
data=from(bucket: "mydata")
|> range(start: 2019-01-01T00:00:00Z, stop: 2019-01-07T23:59:59Z)
|> filter(fn: (r) => r._measurement == "profile")
|> filter(fn: (r) => r._field=="y")
|> aggregateWindow(every: 1s, fn: last, createEmpty: false)
|> yield()
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?
我正在尝试使用 Flux 查询语言来查找基于一个人的列的总和。如果我有以下输入表:
如何使用 Flux 查询来获取以下输出表:
到目前为止,我已经尝试过类似的操作,但出现错误:
from: (bucket: "example")
|> range(start:v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r)=> r["_measurement"] == "test")
|> group(columns: r["person"])
|> reduce( fn: (r, accumulator) => ({sum: r._value + accumulator.sum}), identity: {sum: 0})
Run Code Online (Sandbox Code Playgroud) 我的 influxdb 数据库中有一些测量数据,我可以通过以下方式查询:
select * from E_real_con
名称:E_real_con
时间值
---- -----
1537920001044785525 | 57160036.00
1538006401069651036 | 57227208.00
1538092800108297103 | 57294112.00
1538179200697333731 | 57366108.00
但是,“值”是一个累积值,我想获取两个连续值之间的增量/差值。
我尝试了以下方法:
SELECT difference(last(value)) FROM E_real_con WHERE time >= now() - 7d GROUP BY time(1d) fill(null)
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误消息:
ERR: unsupported difference iterator type: *query.stringInterruptIterator
Run Code Online (Sandbox Code Playgroud)
我很乐意获得一些如何解决我的问题的提示和反馈。
我正在使用 influxdb 1.6.1
多谢!克里斯托夫
我正在尝试获取给定测量的标签值。我在 influxDB 中进行了测量,如下所示。
> select * from "EVENT_LIVE"
name: EVENT_LIVE
time GROUP_ID COUNT
---- ------------- ---------
1531008000000000000 84 2
1531008000000000000 9 8
1532822400000000000 249 1
1534636800000000000 43 1
1534636800000000000 68 1
1535241600000000000 13 13
1535241600000000000 18 4
1535241600000000000 205 2
1535241600000000000 21 6
1535241600000000000 214 1
1535241600000000000 23 1
1535241600000000000 238 1
1535241600000000000 249 1
1535241600000000000 282 14
1535241600000000000 29 1
1535241600000000000 316 3
1535241600000000000 32 13
1535241600000000000 41 7
1535241600000000000 43 1
1535241600000000000 6 1
Run Code Online (Sandbox Code Playgroud)
此处测量的名称是EVENT_LIVE和GROUP_ID …
我有一个Grafana + InfluxDB + Telegraf设置来监控我组织的服务器。我想制作一个仪表板,在其中监视多个服务器的计算机资源,例如 CPU、RAM 等。我想在 Grafana 仪表板中,如果我的服务器处理器高于 80%,则仅显示“0”;如果服务器处理器低于 80%,则显示“1”。为此,我如何使用CASE WHEN语句根据我设置的阈值显示 0/1。