参考官方开源文档
使用HTTP API查询数据https://docs.influxdata.com/influxdb/v1.7/guides/querying_data/数据库
使用HTTP的API查询数据
HTTP API是在InfluxDB中查询数据的主要方法(有关查询数据库的其余方法,请参阅命令行界面和客户端库)。数组
注意:如下示例使用
curl
命令行工具,该工具使用URL传输数据。学习的基础知识curl
与HTTP脚本指南。bash
API查询语句
查询语句以下:curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=testdb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'"
微信
在前面的篇章中,我已经建立了testdb
数据库,以及插入了数据。 首先查看一下当前InfluxDB中的数据,以下:网络
> show databases name: databases name ---- _internal mydb testdb > > use testdb Using database testdb > > show measurements name: measurements name ---- cpu_load_short tobeornottobe > > select * from cpu_load_short name: cpu_load_short time direction host region value ---- --------- ---- ------ ----- 1422568543702900257 in server01 us-west 2 1422568543702900257 server02 us-west 0.55 1434055562000000000 server01 us-west 0.64 1546849598178339889 server02 0.67 1546850175491084332 server02 0.67 1546850460880063366 server02 0.67 > > select * from cpu_load_short where region = 'us-west' name: cpu_load_short time direction host region value ---- --------- ---- ------ ----- 1422568543702900257 in server01 us-west 2 1422568543702900257 server02 us-west 0.55 1434055562000000000 server01 us-west 0.64 >
下面使用API请求查询以下:app
[root@server81 ~]# curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=testdb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'" { "results": [ { "statement_id": 0, "series": [ { "name": "cpu_load_short", "columns": [ "time", "value" ], "values": [ [ "2015-01-29T21:55:43.702900257Z", 2 ], [ "2015-01-29T21:55:43.702900257Z", 0.55 ], [ "2015-06-11T20:46:02Z", 0.64 ] ] } ] } ] } [root@server81 ~]#
能够从上面看出,能够正确查询出条件为region = 'us-west'
的三条数据。curl
InfluxDB返回数据的格式是JSON格式。查询结果显示在"results"数组中。若是发生错误,InfluxDB会设置一个"error"带有错误解释。ide
例如查询region = 'us-south'
这个在数据中是没有的。下面执行看看:工具
[root@server81 ~]# curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=testdb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-south'" { "results": [ { "statement_id": 0 } ] } [root@server81 ~]#
注意:附加pretty=true
到URL能够启用漂亮的JSON输出。虽然这对于调试或直接使用相似工具查询颇有用curl,但不建议将其用于生产,由于它会消耗没必要要的网络带宽。学习
若是没有pretty=true
,那么执行会是怎么样的结果呢?执行以下:
[root@server81 ~]# curl -G 'http://localhost:8086/query' --data-urlencode "db=testdb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'" {"results":[{"statement_id":0,"series":[{"name":"cpu_load_short","columns":["time","value"],"values":[["2015-01-29T21:55:43.702900257Z",2],["2015-01-29T21:55:43.702900257Z",0.55],["2015-06-11T20:46:02Z",0.64]]}]}]} [root@server81 ~]#
API进行多个查询语句
在单个API调用中向InfluxDB发送多个查询。只需使用分号分隔每一个查询,例如:curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=testdb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west';SELECT count(\"value\") FROM \"cpu_load_short\" WHERE \"region\"='us-west'"
执行请求以下:
[root@server81 ~]# curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=testdb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west';SELECT count(\"value\") FROM \"cpu_load_short\" WHERE \"region\"='us-west'" { "results": [ { "statement_id": 0, "series": [ { "name": "cpu_load_short", "columns": [ "time", "value" ], "values": [ [ "2015-01-29T21:55:43.702900257Z", 2 ], [ "2015-01-29T21:55:43.702900257Z", 0.55 ], [ "2015-06-11T20:46:02Z", 0.64 ] ] } ] }, { "statement_id": 1, "series": [ { "name": "cpu_load_short", "columns": [ "time", "count" ], "values": [ [ "1970-01-01T00:00:00Z", 3 ] ] } ] } ] } [root@server81 ~]#
能够从上面的返回结果看出,两个查询语句的结果都会合并到result数组中返回。
查询数据的其余选项
设置时间戳格式
curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=testdb" --data-urlencode "epoch=s" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'"
下面对比查看两个请求,一个有写--data-urlencode "epoch=s"
条件,第二个没有该条件,分析一下返回结果中的时间格式。
[root@server81 ~]# curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=testdb" --data-urlencode "epoch=s" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'" { "results": [ { "statement_id": 0, "series": [ { "name": "cpu_load_short", "columns": [ "time", "value" ], "values": [ [ 1422568543, 2 ], [ 1422568543, 0.55 ], [ 1434055562, 0.64 ] ] } ] } ] } [root@server81 ~]# [root@server81 ~]# curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=testdb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'" { "results": [ { "statement_id": 0, "series": [ { "name": "cpu_load_short", "columns": [ "time", "value" ], "values": [ [ "2015-01-29T21:55:43.702900257Z", 2 ], [ "2015-01-29T21:55:43.702900257Z", 0.55 ], [ "2015-06-11T20:46:02Z", 0.64 ] ] } ] } ] } [root@server81 ~]#
能够从上面的格式中看出,第一个查询出来的时间戳为1422568543
,第二个查询出来的时间戳是2015-01-29T21:55:43.702900257Z
。
关于查询是2015-01-29T21:55:43.702900257Z
的解释:InfluxDB中的全部内容都以UTC格式存储和报告。默认状况下,时间戳以RFC3339 UTC返回,并具备纳秒级精度。
关于查询是1422568543
的解释:设置epoch参数,则能够设置返回的时间戳格式,格式为epoch=[h,m,s,ms,u,ns]
。 例如,设置秒级的时间戳则是epoch=s
。
那么若是查询毫秒(ms
)级别的呢?下面来查询看看:curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=testdb" --data-urlencode "epoch=ms" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'"
[root@server81 ~]# curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=testdb" --data-urlencode "epoch=ms" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'" { "results": [ { "statement_id": 0, "series": [ { "name": "cpu_load_short", "columns": [ "time", "value" ], "values": [ [ 1422568543702, 2 ], [ 1422568543702, 0.55 ], [ 1434055562000, 0.64 ] ] } ] } ] } [root@server81 ~]#
秒级的时间戳:1422568543 毫秒级的时间戳:1422568543702 能够看出精度愈来愈高,多了最后的702三位。
最大行限制
该max-row-limit
配置选项容许用户限制返回结果的最大数量,以防止InfluxDB运行内存溢出。默认状况下,max-row-limit
配置选项设置为0
。该默认设置容许每一个请求返回无限数量的行。
最大行限制仅适用于非分块查询。分块查询能够返回无限数量的点。
分块
经过设置chunked=true
查询字符串参数,可使用分块返回结果。
下面使用实操来演示一下分块的返回效果,首先查询一下数据以下:curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=testdb" --data-urlencode "epoch=ms" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\""
[root@server81 ~]# curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=testdb" --data-urlencode "epoch=ms" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\"" { "results": [ { "statement_id": 0, "series": [ { "name": "cpu_load_short", "columns": [ "time", "value" ], "values": [ [ 1422568543702, 2 ], [ 1422568543702, 0.55 ], [ 1434055562000, 0.64 ], [ 1546849598178, 0.67 ], [ 1546850175491, 0.67 ], [ 1546850460880, 0.67 ] ] } ] } ] } [root@server81 ~]#
能够从返回的结果看出,全部查询的结果都是写入一个result数组里面的。可否分红多个result数组返回结果呢?
下面来设置分块参数执行语句以下: 设置参数--data-urlencode "chunked=true" --data-urlencode "chunk_size=1"
一条数据为一个返回result数组。 总体语句以下: curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=testdb" --data-urlencode "epoch=ms" --data-urlencode "chunked=true" --data-urlencode "chunk_size=1" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\""
[root@server81 ~]# curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=testdb" --data-urlencode "epoch=ms" --data-urlencode "chunked=true" --data-urlencode "chunk_size=1" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\"" { "results": [ { "statement_id": 0, "series": [ { "name": "cpu_load_short", "columns": [ "time", "value" ], "values": [ [ 1422568543702, 2 ] ], "partial": true } ], "partial": true } ] } { "results": [ { "statement_id": 0, "series": [ { "name": "cpu_load_short", "columns": [ "time", "value" ], "values": [ [ 1422568543702, 0.55 ] ], "partial": true } ], "partial": true } ] } { "results": [ { "statement_id": 0, "series": [ { "name": "cpu_load_short", "columns": [ "time", "value" ], "values": [ [ 1434055562000, 0.64 ] ], "partial": true } ], "partial": true } ] } { "results": [ { "statement_id": 0, "series": [ { "name": "cpu_load_short", "columns": [ "time", "value" ], "values": [ [ 1546849598178, 0.67 ] ], "partial": true } ], "partial": true } ] } { "results": [ { "statement_id": 0, "series": [ { "name": "cpu_load_short", "columns": [ "time", "value" ], "values": [ [ 1546850175491, 0.67 ] ], "partial": true } ], "partial": true } ] } { "results": [ { "statement_id": 0, "series": [ { "name": "cpu_load_short", "columns": [ "time", "value" ], "values": [ [ 1546850460880, 0.67 ] ] } ] } ] } [root@server81 ~]#
好了,从上面能够看出,已经将每一条查询结果都分块到各自的result数组之中了。
本文分享自微信公众号 - DevOps社群(DevOpsCommunity)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。