通過HTTP API寫入數據
有很多方法可以向TSDB For InfluxDB?寫入數據,包括通過命令行界面(command line interface)和客戶端(client libraries)。在這一章中,我們將向您展示如何使用內嵌的HTTP API寫入數據。
本章節中的示例使用了curl,一種通過URL來傳輸數據的命令行工具。
通過HTTP API發送POST
請求到/write
路徑是數據寫入TSDB For InfluxDB?的主要方式。假設已經成功創建好數據庫mydb
,現在我們來探索如何通過HTTP API將數據寫入mydb
。
單點寫入
下面的例子展示了如何將一個數據點寫入mydb數據庫。其中,該數據點的measurement為cpu_load_short
,有兩個tag,tag key分別為host
和region
,對應的tag value分別為server01
和us-west
,field key是value
,field value是0.64
,timestamp是1434055562000000000
:
curl -i -XPOST 'https://<網絡地址>:3242/write?db=mydb&u=<賬號名稱>&p=<密碼>' --data-binary 'cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000'
<網絡地址>是您購買的TSDB For InfluxDB?實例的地址。
<賬號名稱>和<密碼>分別是您設置的用戶賬號和密碼。
TSDB For InfluxDB?默認使用端口
3242
。數據寫入的時候,需要設置參數
db
的值,該值必須是一個已有的數據庫。如果您沒有通過參數rp
來設置數據保留策略的話,那么數據會寫到db
默認的數據保留策略中。
想要獲得完整的參數信息,請參閱文檔HTTP API。
我們稱POST的主體內容,包含你想要存儲的時序數據,為行協議(Line Protocol),它的組成部分有measurement、tags、fields和timestamp。TSDB For InfluxDB?要求時序數據必須有measurement。嚴格來講,tag是可選的,但是大多數時序數據都會包含tag,用于區分數據的來源,使查詢變得簡單和高效。tag key和tag value都必須是字符串。field key也是必須的,并且必須是字符串,field value默認的數據類型是float。時間戳放在行的最后,是一個從UTC 1970年1月1日起到現在的納秒級的Unix時間,它是可選的,如果沒有明確給出時間戳,TSDB For InfluxDB?會把服務器本地的納秒級的Unix時間當作數據點的時間戳。在TSDB For InfluxDB?中,任何時間戳都是UTC時間(協調世界時)。
多點寫入
通過用換行符來分隔多個數據點,可以將它們同時發送到多個時間序列,這種批量發送的方式可以獲得更高的性能。
下面的例子展示了將3個數據點寫入數據庫mydb
。
第一個點屬于measurement為
cpu_load_short
、tag為host=server0
的時間序列,timestamp是服務器本地的時間戳。
第二個點屬于measurement為
cpu_load_short
、tag為host=server02,region=us-west
的時間序列,有明確的時間戳,timestamp為142256854370290025
。
第三個點跟第二個點的時間戳一樣,但是該數據點屬于measurement為
cpu_load_short
、tag為direction=in,host=server01,region=us-west
的時間序列。
curl -i -XPOST 'https://<網絡地址>:3242/write?db=mydb&u=<賬號名稱>&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通過@filename
的方式,將文件中的數據點寫入TSDB For InfluxDB?。文件中的數據需要滿足行協議的語法。
以下是格式正確的文件(cpu_data.txt
)的一個示例:
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
通過以下命令將文件cpu_data.txt
里的數據寫入數據庫mydb
:
curl -i -XPOST 'https://<網絡地址>:3242/write?db=mydb&u=<賬號名稱>&p=<密碼>' --data-binary @cpu_data.txt
如果您的一個文件中有超過5000個數據點,建議將該文件拆分成多個文件,以便將數據批量寫進TSDB For InfluxDB?,因為HTTP請求默認在5秒后超時,雖然寫入請求超時后,TSDB For InfluxDB?依舊會嘗試將這些數據點寫入數據庫,但是并不保障數據一定會寫入成功。
Schemaless(無模式)的設計
TSDB For InfluxDB?是一個Schemaless的數據庫。您可以在任意時間添加新的measurement、tags和fields。
如果您嘗試寫入跟之前類型不同的數據(例如,field原來接收的是整型數據,現在卻寫了一個字符串進去),TSDB For InfluxDB?會拒絕這些數據。
關于REST的說明
TSDB For InfluxDB?使用HTTP作為方便且廣泛支持的數據傳輸協議。
現代Web的API都基于REST的設計,因為它解決了一個共同的需求。隨著終端數量的增加,對組織系統的需求變得越來越迫切。REST是一個工業界認定的用來組織大量終端的標準。這種一致性對于API的開發者和消費者都有好處:每個參與者都知道期望的是什么。
然而,REST只是一個慣例。TSDB For InfluxDB?是一個簡單、易懂的系統,只提供三個API端點,使用HTTP作為InfluxQL的傳輸方法。所以TSDB For InfluxDB? API并不試圖完全符合RESTful的標準。
HTTP返回值概要
2xx:如果您發送寫請求后返回信息
HTTP 204 No Content
,說明數據成功寫入TSDB For InfluxDB?了!4xx:表示TSDB For InfluxDB?不知道您發的是什么請求。
5xx:系統過載或著嚴重受損。
下面舉幾個返回錯誤的例子:
field value原來是布爾類型的,現在寫入浮點數:
curl -i -XPOST 'https://<網絡地址>:3242/write?db=<數據庫名稱>&u=<賬號名稱>&p=<密碼>' --data-binary 'tobeornottobe booleanonly=true'
curl -i -XPOST 'https://<網絡地址>:3242/write?db=<數據庫名稱>&u=<賬號名稱>&p=<密碼>' --data-binary 'tobeornottobe booleanonly=5'
系統會返回:
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"}
將數據寫入到一個不存在的數據庫:
curl -i -XPOST 'https://<網絡地址>:3242/write?db=atlantis&u=<賬號名稱>&p=<密碼>' --data-binary 'liters value=10'
系統會返回:
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\""}
后續任務
現在您已經知道了如何使用TSDB For InfluxDB?內置的HTTP API來寫入數據,下一步,我們將在文檔通過HTTP API查詢數據中學習如何將數據讀出來。若想獲取更多關于如何使用HTTP API寫入數據的信息,請查閱文檔HTTP API。
InfluxDB? is a trademark registered by InfluxData, which is not affiliated with, and does not endorse, TSDB for InfluxDB?.