HTTP API
TSDB For InfluxDB?提供了一種與數據庫進行交互的簡易方法,它使用了HTTP響應碼、HTTP認證、JWT令牌和基本(basic)認證,并以JSON格式返回結果。
以下章節假設TSDB For InfluxDB?實例運行在<網絡地址>上,端口為3242
,并且開啟HTTPS。
TSDB For InfluxDB? HTTP路徑(endpoint)
路徑 | 描述 |
/ping | 使用 |
/query | 使用 |
/write | 使用 |
/ping HTTP路徑
/ping
路徑接受GET
和HEAD
的HTTP請求。使用這個路徑,檢查TSDB For InfluxDB?實例的狀態和TSDB For InfluxDB?的版本。
定義
GET https://<網絡地址>:3242/ping?u=<賬號名稱>&p=<密碼>
HEAD https://<網絡地址>:3242/ping?u=<賬號名稱>&p=<密碼>
選項verbose
默認情況下,/ping
HTTP路徑返回一個簡單的HTTP 204狀態,讓客戶端知道服務器正在運行。verbose
的默認值是false
。當verbose
設置為true時(/ping?verbose=true
),返回HTTP 200狀態。
示例
您可以使用/ping
路徑查看TSDB For InfluxDB?實例的版本(version)。頭部字段X-Influxdb-Version
顯示了TSDB For InfluxDB?的版本。
~ curl -sl -I https://<網絡地址>:3242/ping?u=<賬號名稱>&p=<密碼>
HTTP/1.1 204 No Content
Content-Type: application/json
Request-Id: 9c353b0e-aadc-11e8-8023-000000000000
X-Influxdb-Build: OSS
X-Influxdb-Version: v1.7.x
X-Request-Id: 9c353b0e-aadc-11e8-8023-000000000000
Date: Tue, 05 Nov 2018 16:08:32 GMT
狀態碼和響應
響應的正文是空的。
HTTP狀態碼 | 描述 |
204 | 成功!TSDB For InfluxDB?實例已經啟動并正在運行 |
/query HTTP路徑
/query
路徑接受GET
和POST
的HTTP請求。使用這個路徑,查詢數據和管理數據庫、保留策略和用戶。
定義
GET https://<網絡地址>:3242/query?u=<賬號名稱>&p=<密碼>
POST https://<網絡地址>:3242/query?u=<賬號名稱>&p=<密碼>
動詞用法(Verb usage)
動詞(Verb) | 查詢類型 |
GET | 用于以如下關鍵字開頭的所有查詢: SELECT SHOW |
POST | 用于以如下關鍵字開頭的所有查詢: ALTER CREATE DELETE DROP GRANT KILL REVOKE |
* 唯一的例外是包含INTO子句的SELECT查詢,這些查詢需要使用POST
請求。
示例
使用SELECT語句查詢數據
$ curl -G 'https://<網絡地址>:3242/query?db=mydb&u=<賬號名稱>&p=<密碼>' --data-urlencode 'q=SELECT * FROM "mymeas"'
{"results":[{"statement_id":0,"series":[{"name":"mymeas","columns":["time","myfield","mytag1","mytag2"],"values":[["2017-03-01T00:16:18Z",33.1,null,null],["2017-03-01T00:17:18Z",12.4,"12","14"]]}]}]}
measurement mymeas
中有兩個數據點。在第一個數據點中,時間戳是2017-03-01T00:16:18Z,field key myfield
的值是33.1,tag key mytag1
和mytag2
沒有tag value。在第二個數據點中,時間戳是2017-03-01T00:17:18Z,field key myfield
的值是12.4,tag key mytag1
和mytag2
的值分別為12
和14
。
相同的查詢在TSDB For InfluxDB?的命令行界面中則返回:
name: mymeas
time myfield mytag1 mytag2
---- ------- ------ ------
2017-03-01T00:16:18Z 33.1
2017-03-01T00:17:18Z 12.4 12 14
使用SELECT語句和INTO子句查詢數據
$ curl -XPOST 'https://<網絡地址>:3242/query?db=mydb&u=<賬號名稱>&p=<密碼>' --data-urlencode 'q=SELECT * INTO "newmeas" FROM "mymeas"'
{"results":[{"statement_id":0,"series":[{"name":"result","columns":["time","written"],"values":[["1970-01-01T00:00:00Z",2]]}]}]}
包含INTO
子句的SELECT
查詢需要使用POST
請求。
返回結果顯示,TSDB For InfluxDB?寫入兩個數據點到measurement newmeas
。請注意,系統使用epoch 0
(1970-01-01T00:00:00Z
)作為空時間戳。
字符串類型的查詢參數
字符串類型的查詢參數 | 可選/必需 | 描述 |
chunked=[true, | 可選。 | 批量流式地返回數據點,而不是將所有數據一次性返回。如果設置為true,TSDB For InfluxDB?按序列或按10,000個數據點(哪個條件最先滿足就以哪個條件來分塊)分批返回結果。如果設置為一個特定的值,TSDB For InfluxDB?按序列或按指定數量的數據點分批返回結果。 |
db= | 對依賴數據庫的查詢是必需的(大多數 | 設置查詢的目標數據庫 |
epoch=[ns,u,μ,ms,s,m,h] | 可選。 | 返回具有特定精度的epoch時間戳。TSDB For InfluxDB?默認返回RFC3339格式的時間戳,精度為納秒。 |
p= | 如果沒有開啟認證,這是可選的。開啟認證后,這是必需的。 | 如果開啟了認證,請設置用于認證的密碼。需要與參數 |
pretty=true | 可選。 | 開啟JSON輸出的美觀打印(pretty-printed)。雖然它在調試的時候非常有用,但是不建議用于生產,因為它會消耗不必要的網絡帶寬。 |
q= | 必需。 | 需要執行的InfluxQL命令。 |
u= | 如果沒有開啟認證,這是可選的。開啟認證后,這是必需的。 | 如果開啟了認證,請設置用于認證的用戶名。用戶必須具有讀數據庫的權限。需要與參數 |
* 如果沒有使用參數chunked
,TSDB For InfluxDB?不會截斷請求返回的行數。
示例
使用SELECT語句查詢數據并返回美觀打印的JSON
$ curl -G 'https://<網絡地址>:3242/query?db=mydb&pretty=true&u=<賬號名稱>&p=<密碼>' --data-urlencode 'q=SELECT * FROM "mymeas"'
{
"results": [
{
"statement_id": 0,
"series": [
{
"name": "mymeas",
"columns": [
"time",
"myfield",
"mytag1",
"mytag2"
],
"values": [
[
"2017-03-01T00:16:18Z",
33.1,
null,
null
],
[
"2017-03-01T00:17:18Z",
12.4,
"12",
"14"
]
]
}
]
}
]
}
使用SELECT語句查詢數據并返回除納秒外其它精度的epoch時間戳
$ curl -G 'https://<網絡地址>:3242/query?db=mydb&epoch=s&u=<賬號名稱>&p=<密碼>' --data-urlencode 'q=SELECT * FROM "mymeas"'
{"results":[{"statement_id":0,"series":[{"name":"mymeas","columns":["time","myfield","mytag1","mytag2"],"values":[[1488327378,33.1,null,null],[1488327438,12.4,"12","14"]]}]}]}
Request body
--data-urlencode "q=<InfluxQL query>"
所有查詢都必須進行URL編碼,并遵循InfluxQL語法。本頁面的所有示例都使用了curl
,在curl
命令中使用參數--data-urlencode
。
選項(options)
請求多個查詢
用分號(;
)將多個查詢隔開。
發送文件中的查詢
API支持使用multipart POST
請求發送文件中的查詢。文件中的多個查詢必須用分號隔開。
語法:
curl -F "q=@<path_to_file>" -F "async=true" https://<網絡地址>:3242/query?u=<賬號名稱>&p=<密碼>
請求返回CSV格式的查詢結果
語法:
curl -H "Accept: application/csv" -G 'https://<網絡地址>:3242/query?u=<賬號名稱>&p=<密碼>' [...]
請注意,當請求中包含-H Accept: application/csv
,系統將返回epoch格式的時間戳,而不是RFC3339格式。
綁定參數
API支持將參數綁定到WHERE
子句中特定的field value或tag value。使用語法$<placeholder_key>
作為查詢中的占位符(placeholder),并且URL會對request body中的placeholder key和placeholder value的映射(Map)進行編碼:
查詢語法:
--data-urlencode 'q= SELECT [...] WHERE [ <field_key> | <tag_key> ] = $<placeholder_key>'
映射語法:
--data-urlencode 'params={"<placeholder_key>":[ <placeholder_float_field_value> | <placeholder_integer_field_value> | "<placeholder_string_field_value>" | <placeholder_boolean_field_value> | "<placeholder_tag_value>" ]}'
使用逗號(,
)將多個placeholder key-value pair隔開。
示例
請求多個查詢
$ curl -G 'https://<網絡地址>:3242/query?db=mydb&epoch=s&u=<賬號名稱>&p=<密碼>' --data-urlencode 'q=SELECT * FROM "mymeas";SELECT mean("myfield") FROM "mymeas"'
{"results":[{"statement_id":0,"series":[{"name":"mymeas","columns":["time","myfield","mytag1","mytag2"],"values":[[1488327378,33.1,null,null],[1488327438,12.4,"12","14"]]}]},{"statement_id":1,"series":[{"name":"mymeas","columns":["time","mean"],"values":[[0,22.75]]}]}]}
該請求包含兩個查詢:SELECT * FROM "mymeas"
和SELECT mean("myfield") FROM "mymeas"
。從結果中我們可以看到,系統為每個返回的查詢分配一個statement標識符:statement_id
。第一個查詢返回的結果對應的statement_id
是0,第二個查詢返回的結果對應的statement_id
是1。
請求返回CSV格式的查詢結果
$ curl -H "Accept: application/csv" -G 'https://<網絡地址>:3242/query?db=mydb&u=<賬號名稱>&p=<密碼>' --data-urlencode 'q=SELECT * FROM "mymeas"'
name,tags,time,myfield,mytag1,mytag2
mymeas,,1488327378000000000,33.1,mytag1,mytag2
mymeas,,1488327438000000000,12.4,12,14
第一個數據點的兩個tag key mytag1
和mytag2
都沒有tag value。
發送文件中的查詢語句
$ curl -F "q=@queries.txt" -F "async=true" 'https://<網絡地址>:3242/query?u=<賬號名稱>&p=<密碼>'
其中,文件queries.txt
中的查詢如下:
SELECT * FROM "mymeas";
SELECT mean("myfield") FROM "mymeas";
將WHERE子句中的參數綁定到指定的tag value
$ curl -G 'https://<網絡地址>:3242/query?db=mydb&u=<賬號名稱>&p=<密碼>' --data-urlencode 'q=SELECT * FROM "mymeas" WHERE "mytag1" = $tag_value' --data-urlencode 'params={"tag_value":"12"}'
{"results":[{"statement_id":0,"series":[{"name":"mymeas","columns":["time","myfield","mytag1","mytag2"],"values":[["2017-03-01T00:17:18Z",12.4,"12","14"]]}]}]}
該請求將$tag_value
映射到12
。TSDB For InfluxDB?將tag value存儲為字符串,所以必須使用雙引號將請求中的tag value括起來。
將WHERE子句中的參數綁定到數值類型的field value
$ curl -G 'https://<網絡地址>:3242/query?db=mydb&u=<賬號名稱>&p=<密碼>' --data-urlencode 'q=SELECT * FROM "mymeas" WHERE "myfield" > $field_value' --data-urlencode 'params={"field_value":30}'
{"results":[{"statement_id":0,"series":[{"name":"mymeas","columns":["time","myfield","mytag1","mytag2"],"values":[["2017-03-01T00:16:18Z",33.1,null,null]]}]}]}
該請求將$field_value
映射到30。不需要使用雙引號將30括起來,因為在myfield
中存儲的是數值類型的field value。
將WHERE子句中的兩個參數分別綁定到指定的tag value和數值類型的field value
$ curl -G 'https://<網絡地址>:3242/query?db=mydb&u=<賬號名稱>&p=<密碼>' --data-urlencode 'q=SELECT * FROM "mymeas" WHERE "mytag1" = $tag_value AND "myfield" < $field_value' --data-urlencode 'params={"tag_value":"12","field_value":30}'
{"results":[{"statement_id":0,"series":[{"name":"mymeas","columns":["time","myfield","mytag1","mytag2"],"values":[["2017-03-01T00:17:18Z",12.4,"12","14"]]}]}]}
該請求將$tag_value
映射到12
,并且將$field_value
映射到30。
狀態碼和響應
響應以JSON格式返回。通過添加參數pretty=true
,可開啟JSON的美觀打印(pretty-print)。
總結
HTTP狀態碼 | 描述 |
200 OK | 成功!返回的JSON提供更多信息。 |
400 Bad Request | 無法處理該請求。可能是查詢的語法不正確引起的。返回的JSON提供更多信息。 |
401 Unauthorized | 無法處理該請求。可能是認證憑證無效引起的。 |
示例
成功返回數據的請求
$ curl -i -G 'https://<網絡地址>:3242/query?db=mydb&u=<賬號名稱>&p=<密碼>' --data-urlencode 'q=SELECT * FROM "mymeas"'
HTTP/1.1 200 OK
Connection: close
Content-Type: application/json
Request-Id: [...]
X-Influxdb-Version: 1.7.x
Date: Wed, 08 Nov 2017 19:22:54 GMT
Transfer-Encoding: chunked
{"results":[{"statement_id":0,"series":[{"name":"mymeas","columns":["time","myfield","mytag1","mytag2"],"values":[["2017-03-01T00:16:18Z",33.1,null,null],["2017-03-01T00:17:18Z",12.4,"12","14"]]}]}]}
成功返回錯誤的請求
$ curl -i -G 'https://<網絡地址>:3242/query?db=mydb1&u=<賬號名稱>&p=<密碼>' --data-urlencode 'q=SELECT * FROM "mymeas"'
HTTP/1.1 200 OK
Connection: close
Content-Type: application/json
Request-Id: [...]
X-Influxdb-Version: 1.7.x
Date: Wed, 08 Nov 2017 19:23:48 GMT
Transfer-Encoding: chunked
{"results":[{"statement_id":0,"error":"database not found: mydb1"}]}
格式錯誤的查詢
$ curl -i -G 'https://<網絡地址>:3242/query?db=mydb&u=<賬號名稱>&p=<密碼>' --data-urlencode 'q=SELECT *'
HTTP/1.1 400 Bad Request
Content-Type: application/json
Request-Id: [...]
X-Influxdb-Version: 1.7.x
Date: Wed, 08 Nov 2017 19:24:25 GMT
Content-Length: 76
{"error":"error parsing query: found EOF, expected FROM at line 1, char 9"}
使用無效的認證憑證查詢數據
$ curl -i -XPOST 'https://<網絡地址>:3242/query?u=myusername&p=notmypassword' --data-urlencode 'q=CREATE DATABASE "mydb"'
HTTP/1.1 401 Unauthorized
Content-Type: application/json
Request-Id: [...]
Www-Authenticate: Basic realm="InfluxDB"
X-Influxdb-Version: 1.7.x
Date: Wed, 08 Nov 2017 19:11:26 GMT
Content-Length: 33
{"error":"authorization failed"}
/write HTTP路徑
/write
路徑接受POST
的HTTP請求。使用這個路徑,將數據寫入已經創建好的數據庫。
定義
POST https://<網絡地址>:3242/write?u=<賬號名稱>&p=<密碼>
字符串類型的查詢參數
字符串類型的查詢參數 | 可選/必需 | 描述 |
db=\ | 必需 | 設置寫入的目標數據庫。 |
p=\ | 如果沒有開啟認證,這是可選的。開啟認證后,這是必需的。 | 如果開啟了認證,請設置用于認證的密碼。需要與參數 |
precision=[ns,u,ms,s,m,h] | 可選 | 設置所提供的Unix時間的精度。如果您不指定精度,TSDB For InfluxDB?假設時間戳的精度為納秒。 |
rp=\ | 可選 | 設置寫入的目標保留策略。如果您不指定保留策略,TSDB For InfluxDB?會將數據寫入默認( |
u=\ | 如果沒有開啟認證,這是可選的。開啟認證后,這是必需的。 | 如果開啟了認證,請設置用于認證的用戶名。用戶必須具有寫數據庫的權限。需要與參數 |
** 我們建議盡量使用最低的精度,因為這可以顯著提高壓縮效果。
示例
將時間戳精確到秒的數據點寫入數據庫mydb
$ curl -i -XPOST "https://<網絡地址>:3242/write?db=mydb&precision=s&u=<賬號名稱>&p=<密碼>" --data-binary 'mymeas,mytag=1 myfield=90 1463683075'
HTTP/1.1 204 No Content
Content-Type: application/json
Request-Id: [...]
X-Influxdb-Version: 1.7.x
Date: Wed, 08 Nov 2017 17:33:23 GMT
將數據點寫入數據庫mydb和保留策略myrp
$ curl -i -XPOST "https://<網絡地址>:3242/write?db=mydb&rp=myrp&u=<賬號名稱>&p=<密碼>" --data-binary 'mymeas,mytag=1 myfield=90'
HTTP/1.1 204 No Content
Content-Type: application/json
Request-Id: [...]
X-Influxdb-Version: 1.7.x
Date: Wed, 08 Nov 2017 17:34:31 GMT
使用HTTP認證,將數據點寫入數據庫mydb
有效的憑證:
$ curl -i -XPOST "https://<網絡地址>:3242/write?db=mydb&u=myusername&p=mypassword" --data-binary 'mymeas,mytag=1 myfield=91'
HTTP/1.1 204 No Content
Content-Type: application/json
Request-Id: [...]
X-Influxdb-Version: 1.7.x
Date: Wed, 08 Nov 2017 17:34:56 GMT
無效的憑證:
$ curl -i -XPOST "https://<網絡地址>:3242/write?db=mydb&u=myusername&p=notmypassword" --data-binary 'mymeas,mytag=1 myfield=91'
HTTP/1.1 401 Unauthorized
Content-Type: application/json
Request-Id: [...]
Www-Authenticate: Basic realm="InfluxDB"
X-Influxdb-Version: 1.7.x
Date: Wed, 08 Nov 2017 17:40:30 GMT
Content-Length: 33
{"error":"authorization failed"}
使用基本(basic)認證,將數據點寫入數據庫mydb
有效的憑證:
$ curl -i -XPOST -u myusername:mypassword "https://<網絡地址>:3242/write?db=mydb" --data-binary 'mymeas,mytag=1 myfield=91'
HTTP/1.1 204 No Content
Content-Type: application/json
Request-Id: [...]
X-Influxdb-Version: 1.7.x
Date: Wed, 08 Nov 2017 17:36:40 GMT
無效的憑證:
$ curl -i -XPOST -u myusername:notmypassword "https://<網絡地址>:3242/write?db=mydb" --data-binary 'mymeas,mytag=1 myfield=91'
HTTP/1.1 401 Unauthorized
Content-Type: application/json
Request-Id: [...]
Www-Authenticate: Basic realm="InfluxDB"
X-Influxdb-Version: 1.7.x
Date: Wed, 08 Nov 2017 17:46:40 GMT
Content-Length: 33
{"error":"authorization failed"}
Request body
--data-binary '<Data in Line Protocol format>'
所有數據必須采用二進制編碼并采用行協議格式。本頁面的所有示例都使用了curl
,在curl
命令中使用參數--data-binary
。使用除--data-binary
外的其它編碼方式,可能會導致錯誤;-d
、--data-urlencode
和--data-ascii
可能會將換行符去掉或者引入新的、非預期的格式。
選項:
通過用換行符分隔多個數據點,可在一個請求中將這些數據點寫入數據庫。
將文件中的數據點寫入數據庫,該文件需帶標記
@
。文件中的數據點需要使用行協議格式。每個數據點必須占據一行,多個數據點用換行符(\n
)隔開。文件中包含回車鍵會導致解析錯誤。
我們建議分批寫入數據,每批數據5,000或10,000個數據點。如果每一批數據的數據點變少,會產生更多的HTTP請求,導致性能無法達到最優。
示例
將時間戳精確到納秒的數據點寫入數據庫mydb
$ curl -i -XPOST "https://<網絡地址>:3242/write?db=mydb&u=<賬號名稱>&p=<密碼>" --data-binary 'mymeas,mytag=1 myfield=90 1463683075000000000'
HTTP/1.1 204 No Content
Content-Type: application/json
Request-Id: [...]
X-Influxdb-Version: 1.7.x
Date: Wed, 08 Nov 2017 18:02:57 GMT
將使用本地服務器時間戳(精確到納秒)的數據點寫入數據庫mydb
$ curl -i -XPOST "https://<網絡地址>:3242/write?db=mydb&u=<賬號名稱>&p=<密碼>" --data-binary 'mymeas,mytag=1 myfield=90'
HTTP/1.1 204 No Content
Content-Type: application/json
Request-Id: [...]
X-Influxdb-Version: 1.7.x
Date: Wed, 08 Nov 2017 18:03:44 GMT
使用換行符,將多個數據點寫入數據庫mydb
$ curl -i -XPOST "https://<網絡地址>:3242/write?db=mydb&u=<賬號名稱>&p=<密碼>" --data-binary 'mymeas,mytag=3 myfield=89 1463689152000000000
mymeas,mytag=2 myfield=34 1463689152000000000'
HTTP/1.1 204 No Content
Content-Type: application/json
Request-Id: [...]
X-Influxdb-Version: 1.7.x
Date: Wed, 08 Nov 2017 18:04:02 GMT
從文件data.txt中,將多個數據點寫入數據庫mydb
$ curl -i -XPOST "https://<網絡地址>:3242/write?db=mydb&u=<賬號名稱>&p=<密碼>" --data-binary @data.txt
HTTP/1.1 204 No Content
Content-Type: application/json
Request-Id: [...]
X-Influxdb-Version: 1.7.x
Date: Wed, 08 Nov 2017 18:08:11 GMT
其中,文件data.txt
中的示例數據如下:
mymeas,mytag1=1 value=21 1463689680000000000
mymeas,mytag1=1 value=34 1463689690000000000
mymeas,mytag2=8 value=78 1463689700000000000
mymeas,mytag3=9 value=89 1463689710000000000
狀態碼和響應
一般來說,2xx
形式的狀態碼表示成功,4xx
表示TSDB For InfluxDB?無法理解請求,5xx
表示系統過載或嚴重受損。錯誤以JSON格式返回。
總結
HTTP狀態碼 | 描述 |
204 No Content | 成功! |
400 Bad Request | 無法處理該請求。可能寫協議語法錯誤引起的,或者是用戶嘗試將數據寫入之前接受不同數據類型的field引起的。返回的JSON提供更多信息。 |
401 Unauthorized | 無法處理該請求。可能是認證憑證無效引起的。 |
404 Not Found | 無法處理該請求。可能是用戶嘗試將數據寫入不存在的數據庫引起的。返回的JSON提供更多信息。 |
500 Internal Server Error | 系統過載或嚴重受損。可能是用戶嘗試將數據寫入不存在的保留策略引起的。返回的JSON提供更多信息。 |
示例
寫入成功
HTTP/1.1 204 No Content
寫入時間戳不正確的數據點
HTTP/1.1 400 Bad Request
[...]
{"error":"unable to parse 'mymeas,mytag=1 myfield=91 abc123': bad timestamp"}
將整數寫入到之前接受浮點數的field
HTTP/1.1 400 Bad Request
[...]
{"error":"field type conflict: input field \"myfield\" on measurement \"mymeas\" is type int64, already exists as type float"}
使用無效的認證憑證寫入數據
HTTP/1.1 401 Unauthorized
[...]
{"error":"authorization failed"}
將數據點寫入不存在的數據庫
HTTP/1.1 404 Not Found
[...]
{"error":"database not found: \"mydb1\""}
將數據點寫入不存在的保留策略
HTTP/1.1 500 Internal Server Error
[...]
{"error":"retention policy not found: myrp"}
InfluxDB? is a trademark registered by InfluxData, which is not affiliated with, and does not endorse, TSDB for InfluxDB?.