行協議(Line Protocol)是一種基於文本的格式,用於將資料點寫入TSDB For InfluxDB®。
行協議
文法
<measurement>[,<tag_key>=<tag_value>[,<tag_key>=<tag_value>]] <field_key>=<field_value>[,<field_key>=<field_value>] [<timestamp>]使用分行符號\n分隔每一行,每一行表示TSDB For InfluxDB®中的一個資料點。行協議是對空格敏感的。
文法描述
行協議告訴TSDB For InfluxDB®資料的measurement、tag set、field set和時間戳記。
元素(element) | 可選/必需 | 描述 | 類型(請查看資料類型獲得更多資訊) |
|---|---|---|---|
Measurement | 必需。 | measurement的名字。TSDB For InfluxDB®中每個資料點接受一個measurement。 | 字串。 |
Tag set | 可選。 | 一個資料點上全部的tag key-value pairs。 | tag key和tag value都是字串。 |
Field set | 必需。資料點必須至少有一個field。 | 一個資料點上全部的field key-value pairs。 | field key是字串,field value可以是浮點數、整數或者布爾值。 |
時間戳記 | 可選。如果沒有指定資料點的時間戳記,那麼TSDB For InfluxDB®使用伺服器本地的納秒級時間戳記(UTC格式)作為資料點的時間戳記。 | 資料點的時間戳記。TSDB For InfluxDB®中每個資料點接受一個時間戳記。 | Unix納秒級時間戳記。使用HTTP API指定除納秒之外其它精度的時間戳記。 |
效能和設定提示: 在將資料點發送到資料庫之前,將tag按tag key進行排序。排序結果應該與Go bytes.Compare function的結果匹配。 時間戳記盡量使用最粗的精度,因為這可以顯著提高壓縮效果。 使用網路時間協議(Network Time Protocol,NTP)來同步主機(host)之間的時間。TSDB For InfluxDB®使用主機的本地UTC時間為資料分配時間戳記,如果主機的時鐘與NTP不同步,寫入TSDB For InfluxDB®的資料的時間戳記可能會不準確。
資料類型
資料類型 | 元素(element) | 描述 |
|---|---|---|
浮點數 | Field value | IEEE-754 64位浮點數。這是預設的數實值型別。 例如: |
整數 | Field value | 有符號的64位整數(從-9223372036854775808到9223372036854775807)。在數字後面加上 例如: |
字串 | Measurement,tag key,tag value,field key,Field value | 長度限制為64 KB。 |
布爾值 | Field value | 儲存TRUE或FALSE的值。
|
時間戳記 | 時間戳記 | Unix納秒級時間戳記。使用HTTP API指定除納秒之外其它精度的時間戳記。
|
寫入和查詢布爾值的文法
寫入和查詢布爾值的文法不一樣。請查看FAQ獲得更多相關資訊。
field type差異
在measurement中,一個field的資料類型在一個shard內不會不一致,但是在不同的shard,它的資料類型可以不同。若想瞭解field value的資料類型差異如何影響SELECT *查詢,請參見FAQ的相關章節。
樣本
樣本一:將field value 1.0作為浮點數寫入TSDB For InfluxDB®
> INSERT mymeas value=1.0樣本二:將field value 1作為浮點數寫入TSDB For InfluxDB®
> INSERT mymeas value=1樣本三:將field value -1.234456e+78作為浮點數寫入TSDB For InfluxDB®
> INSERT mymeas value=-1.234456e+78TSDB For InfluxDB®支援使用科學計數法指定field value。
樣本四:將field value 1作為整數寫入TSDB For InfluxDB®
> INSERT mymeas value=1i樣本五:將field value stringing along作為字串寫入TSDB For InfluxDB®
> INSERT mymeas value="stringing along"始終使用雙引號將字串類型的field value括起來。更多關於引號的介紹,請查看下文引號一節。
樣本六:將field value true作為布爾值寫入TSDB For InfluxDB®
> INSERT mymeas value=true請不要用引號將布爾類型的field value括起來。以下語句把true作為字串寫入TSDB For InfluxDB®:
> INSERT mymeas value="true"樣本七:嘗試將字串寫入之前接受浮點數的field
如果浮點數和字串上的時間戳記儲存在同一個shard:
> INSERT mymeas value=3 1465934559000000000
> INSERT mymeas value="stringing along" 1465934559000000001
ERR: {"error":"field type conflict: input field \"value\" on measurement \"mymeas\" is type string, already exists as type float"}如果浮點數和字串上的時間戳記不是儲存在同一個shard:
> INSERT mymeas value=3 1465934559000000000
> INSERT mymeas value="stringing along" 1466625759000000000
>引號、特殊字元和其它命名指南
引號
元素(element) | 雙引號 | 單引號 |
|---|---|---|
時間戳記 | 不使用 | 不使用 |
measurement, tag key, tag value, field key | 不使用 | 不使用 |
field value | 字串類型的field value需要用雙引號括起來。不要用雙引號將浮點數、整數或布爾值括起來。 | 不使用 |
行協議允許使用者使用雙引號和單引號將measurement的名字、tag key、tag value和field key括起來。然而,它會把雙引號和單引號當作是名字、key或value的一部分。這會使查詢文法複雜化(請看下面的樣本)。
樣本
樣本一:無效的行協議 - 用雙引號將時間戳記括起來
> INSERT mymeas value=9 "1466625759000000000"
ERR: {"error":"unable to parse 'mymeas value=9 \"1466625759000000000\"': bad timestamp"}用雙引號(或單引號)將時間戳記括起來,會產生bad timestamp錯誤。
樣本二:語義錯誤 - 用雙引號將布爾類型的field value括起來
> INSERT mymeas value="true"
> SHOW FIELD KEYS FROM "mymeas"
name: mymeas
------------
fieldKey fieldType
value stringTSDB For InfluxDB®假設所有用雙引號括起來的field value都是字串。
樣本三:語義錯誤 - 用雙引號將measurement的名字括起來
> INSERT "mymeas" value=200
> SHOW MEASUREMENTS
name: measurements
------------------
name
"mymeas"
> SELECT * FROM mymeas
> SELECT * FROM "mymeas"
> SELECT * FROM "\"mymeas\""
name: "mymeas"
--------------
time value
2016-06-14T20:36:21.836131014Z 200如果您使用雙引號將行協議中的measurement括起來,那麼對該measurement的任意查詢都需要在FROM子句中使用雙引號並且將雙引號轉義(\)。
特殊字元
對於tag key、tag value和field key,始終使用反斜線\來轉義:
逗號
,等號
=空格
對於measurement,始終使用反斜線\來轉義:
逗號
,空格
對於字串類型的field value,使用反斜線\來轉義:
雙引號
"
行協議不需要使用者將反斜線\轉義。使用者也不需要將其它的特殊字元轉義。
樣本
樣本一:寫入帶特殊字元的資料點
> INSERT "measurement\ with\ quo⚡️es\ and\ emoji",tag\ key\ with\ sp⚡️ces=tag\,value\,with"commas" field_k\ey="string field value, only \" need be esc⚡️ped"系統寫入一個資料點,其measurement為"measurement with quo⚡️es and emoji",tag key為tag key with sp⚡️ces,tag value為tag,value,with"commas",field key為field_k\ey,field value為string field value, only " need be esc⚡️ped。
其它命名指南
在行的開頭,#是行協議的有效注釋字元。TSDB For InfluxDB®會忽略所有的後續字元,直到遇到下一個分行符號\n。
measurement的名字、tag key、tag value、field key和field value都是大小寫敏感的。
行協議將InfluxQL關鍵字作為標識符名字。通常,我們建議避免在schema中使用InfluxQL關鍵字,因為它可能會在查詢資料時引起混淆。
關鍵字time是一個特例。time可以是一個連續查詢名字、資料庫名字、measurement的名字、保留原則名字、subscription的名字和使用者名稱。在這些情況下,不需要在查詢中用雙引號將time括起來。time不能是field key或tag key;TSDB For InfluxDB®拒絕寫入將time作為field key或tag key的資料,對於這種資料寫入,TSDB For InfluxDB®會返回錯誤。請參見FAQ獲得更多相關資訊。
在實踐中的行協議
關於如何將行協議資料寫入資料庫,請查看工具章節。
重複資料點
measurement的名字、tag set和時間戳記唯一標識一個資料點。如果您提交的資料具有相同measurement、tag set和時間戳記但具有不同field set,那麼資料的field set會變為舊field set和新field set的並集,如果有任何衝突以新field set為準。
有關此行為的完整樣本和如何避免這種情況,請參見FAQ相關章節。
InfluxDB® is a trademark registered by InfluxData, which is not affiliated with, and does not endorse, TSDB for InfluxDB®.