通過(guò)HTTP API寫入數(shù)據(jù)
有很多方法可以向TSDB For InfluxDB?寫入數(shù)據(jù),包括通過(guò)命令行界面(command line interface)和客戶端(client libraries)。在這一章中,我們將向您展示如何使用內(nèi)嵌的HTTP API寫入數(shù)據(jù)。
本章節(jié)中的示例使用了curl,一種通過(guò)URL來(lái)傳輸數(shù)據(jù)的命令行工具。
通過(guò)HTTP API發(fā)送POST
請(qǐng)求到/write
路徑是數(shù)據(jù)寫入TSDB For InfluxDB?的主要方式。假設(shè)已經(jīng)成功創(chuàng)建好數(shù)據(jù)庫(kù)mydb
,現(xiàn)在我們來(lái)探索如何通過(guò)HTTP API將數(shù)據(jù)寫入mydb
。
單點(diǎn)寫入
下面的例子展示了如何將一個(gè)數(shù)據(jù)點(diǎn)寫入mydb數(shù)據(jù)庫(kù)。其中,該數(shù)據(jù)點(diǎn)的measurement為cpu_load_short
,有兩個(gè)tag,tag key分別為host
和region
,對(duì)應(yīng)的tag value分別為server01
和us-west
,field key是value
,field value是0.64
,timestamp是1434055562000000000
:
curl -i -XPOST 'https://<網(wǎng)絡(luò)地址>:3242/write?db=mydb&u=<賬號(hào)名稱>&p=<密碼>' --data-binary 'cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000'
<網(wǎng)絡(luò)地址>是您購(gòu)買的TSDB For InfluxDB?實(shí)例的地址。
<賬號(hào)名稱>和<密碼>分別是您設(shè)置的用戶賬號(hào)和密碼。
TSDB For InfluxDB?默認(rèn)使用端口
3242
。數(shù)據(jù)寫入的時(shí)候,需要設(shè)置參數(shù)
db
的值,該值必須是一個(gè)已有的數(shù)據(jù)庫(kù)。如果您沒(méi)有通過(guò)參數(shù)rp
來(lái)設(shè)置數(shù)據(jù)保留策略的話,那么數(shù)據(jù)會(huì)寫到db
默認(rèn)的數(shù)據(jù)保留策略中。
想要獲得完整的參數(shù)信息,請(qǐng)參閱文檔HTTP API。
我們稱POST的主體內(nèi)容,包含你想要存儲(chǔ)的時(shí)序數(shù)據(jù),為行協(xié)議(Line Protocol),它的組成部分有measurement、tags、fields和timestamp。TSDB For InfluxDB?要求時(shí)序數(shù)據(jù)必須有measurement。嚴(yán)格來(lái)講,tag是可選的,但是大多數(shù)時(shí)序數(shù)據(jù)都會(huì)包含tag,用于區(qū)分?jǐn)?shù)據(jù)的來(lái)源,使查詢變得簡(jiǎn)單和高效。tag key和tag value都必須是字符串。field key也是必須的,并且必須是字符串,field value默認(rèn)的數(shù)據(jù)類型是float。時(shí)間戳放在行的最后,是一個(gè)從UTC 1970年1月1日起到現(xiàn)在的納秒級(jí)的Unix時(shí)間,它是可選的,如果沒(méi)有明確給出時(shí)間戳,TSDB For InfluxDB?會(huì)把服務(wù)器本地的納秒級(jí)的Unix時(shí)間當(dāng)作數(shù)據(jù)點(diǎn)的時(shí)間戳。在TSDB For InfluxDB?中,任何時(shí)間戳都是UTC時(shí)間(協(xié)調(diào)世界時(shí))。
多點(diǎn)寫入
通過(guò)用換行符來(lái)分隔多個(gè)數(shù)據(jù)點(diǎn),可以將它們同時(shí)發(fā)送到多個(gè)時(shí)間序列,這種批量發(fā)送的方式可以獲得更高的性能。
下面的例子展示了將3個(gè)數(shù)據(jù)點(diǎn)寫入數(shù)據(jù)庫(kù)mydb
。
第一個(gè)點(diǎn)屬于measurement為
cpu_load_short
、tag為host=server0
的時(shí)間序列,timestamp是服務(wù)器本地的時(shí)間戳。
第二個(gè)點(diǎn)屬于measurement為
cpu_load_short
、tag為host=server02,region=us-west
的時(shí)間序列,有明確的時(shí)間戳,timestamp為142256854370290025
。
第三個(gè)點(diǎn)跟第二個(gè)點(diǎn)的時(shí)間戳一樣,但是該數(shù)據(jù)點(diǎn)屬于measurement為
cpu_load_short
、tag為direction=in,host=server01,region=us-west
的時(shí)間序列。
curl -i -XPOST 'https://<網(wǎng)絡(luò)地址>:3242/write?db=mydb&u=<賬號(hào)名稱>&p=<密碼>' --data-binary 'cpu_load_short,host=server02 value=0.67
cpu_load_short,host=server02,region=us-west value=0.55 1422568543702900257
cpu_load_short,direction=in,host=server01,region=us-west value=2.0 1422568543702900257'
文件寫入
curl通過(guò)@filename
的方式,將文件中的數(shù)據(jù)點(diǎn)寫入TSDB For InfluxDB?。文件中的數(shù)據(jù)需要滿足行協(xié)議的語(yǔ)法。
以下是格式正確的文件(cpu_data.txt
)的一個(gè)示例:
cpu_load_short,host=server02 value=0.67
cpu_load_short,host=server02,region=us-west value=0.55 1422568543702900257
cpu_load_short,direction=in,host=server01,region=us-west value=2.0 1422568543702900257
通過(guò)以下命令將文件cpu_data.txt
里的數(shù)據(jù)寫入數(shù)據(jù)庫(kù)mydb
:
curl -i -XPOST 'https://<網(wǎng)絡(luò)地址>:3242/write?db=mydb&u=<賬號(hào)名稱>&p=<密碼>' --data-binary @cpu_data.txt
如果您的一個(gè)文件中有超過(guò)5000個(gè)數(shù)據(jù)點(diǎn),建議將該文件拆分成多個(gè)文件,以便將數(shù)據(jù)批量寫進(jìn)TSDB For InfluxDB?,因?yàn)镠TTP請(qǐng)求默認(rèn)在5秒后超時(shí),雖然寫入請(qǐng)求超時(shí)后,TSDB For InfluxDB?依舊會(huì)嘗試將這些數(shù)據(jù)點(diǎn)寫入數(shù)據(jù)庫(kù),但是并不保障數(shù)據(jù)一定會(huì)寫入成功。
Schemaless(無(wú)模式)的設(shè)計(jì)
TSDB For InfluxDB?是一個(gè)Schemaless的數(shù)據(jù)庫(kù)。您可以在任意時(shí)間添加新的measurement、tags和fields。
如果您嘗試寫入跟之前類型不同的數(shù)據(jù)(例如,field原來(lái)接收的是整型數(shù)據(jù),現(xiàn)在卻寫了一個(gè)字符串進(jìn)去),TSDB For InfluxDB?會(huì)拒絕這些數(shù)據(jù)。
關(guān)于REST的說(shuō)明
TSDB For InfluxDB?使用HTTP作為方便且廣泛支持的數(shù)據(jù)傳輸協(xié)議。
現(xiàn)代Web的API都基于REST的設(shè)計(jì),因?yàn)樗鉀Q了一個(gè)共同的需求。隨著終端數(shù)量的增加,對(duì)組織系統(tǒng)的需求變得越來(lái)越迫切。REST是一個(gè)工業(yè)界認(rèn)定的用來(lái)組織大量終端的標(biāo)準(zhǔn)。這種一致性對(duì)于API的開(kāi)發(fā)者和消費(fèi)者都有好處:每個(gè)參與者都知道期望的是什么。
然而,REST只是一個(gè)慣例。TSDB For InfluxDB?是一個(gè)簡(jiǎn)單、易懂的系統(tǒng),只提供三個(gè)API端點(diǎn),使用HTTP作為InfluxQL的傳輸方法。所以TSDB For InfluxDB? API并不試圖完全符合RESTful的標(biāo)準(zhǔn)。
HTTP返回值概要
2xx:如果您發(fā)送寫請(qǐng)求后返回信息
HTTP 204 No Content
,說(shuō)明數(shù)據(jù)成功寫入TSDB For InfluxDB?了!4xx:表示TSDB For InfluxDB?不知道您發(fā)的是什么請(qǐng)求。
5xx:系統(tǒng)過(guò)載或著嚴(yán)重受損。
下面舉幾個(gè)返回錯(cuò)誤的例子:
field value原來(lái)是布爾類型的,現(xiàn)在寫入浮點(diǎn)數(shù):
curl -i -XPOST 'https://<網(wǎng)絡(luò)地址>:3242/write?db=<數(shù)據(jù)庫(kù)名稱>&u=<賬號(hào)名稱>&p=<密碼>' --data-binary 'tobeornottobe booleanonly=true'
curl -i -XPOST 'https://<網(wǎng)絡(luò)地址>:3242/write?db=<數(shù)據(jù)庫(kù)名稱>&u=<賬號(hào)名稱>&p=<密碼>' --data-binary 'tobeornottobe booleanonly=5'
系統(tǒng)會(huì)返回:
HTTP/1.1 400 Bad Request
Content-Type: application/json
Request-Id: [...]
X-Influxdb-Version: 1.7.x
Date: Wed, 01 Mar 2017 19:38:01 GMT
Content-Length: 150
{"error":"field type conflict: input field \"booleanonly\" on measurement \"tobeornottobe\" is type float, already exists as type boolean dropped=1"}
將數(shù)據(jù)寫入到一個(gè)不存在的數(shù)據(jù)庫(kù):
curl -i -XPOST 'https://<網(wǎng)絡(luò)地址>:3242/write?db=atlantis&u=<賬號(hào)名稱>&p=<密碼>' --data-binary 'liters value=10'
系統(tǒng)會(huì)返回:
HTTP/1.1 404 Not Found
Content-Type: application/json
Request-Id: [...]
X-Influxdb-Version: 1.7.x
Date: Wed, 01 Mar 2017 19:38:35 GMT
Content-Length: 45
{"error":"database not found: \"atlantis\""}
后續(xù)任務(wù)
現(xiàn)在您已經(jīng)知道了如何使用TSDB For InfluxDB?內(nèi)置的HTTP API來(lái)寫入數(shù)據(jù),下一步,我們將在文檔通過(guò)HTTP API查詢數(shù)據(jù)中學(xué)習(xí)如何將數(shù)據(jù)讀出來(lái)。若想獲取更多關(guān)于如何使用HTTP API寫入數(shù)據(jù)的信息,請(qǐng)查閱文檔HTTP API。
InfluxDB? is a trademark registered by InfluxData, which is not affiliated with, and does not endorse, TSDB for InfluxDB?.