本文介紹多值資料查詢方法。
多值模型資料查詢 mquery
請求路徑和方法
請求路徑 | 要求方法 | 描述 |
/api/mquery | POST | 查詢資料 |
多值模型資料和原來寫入的單值模型資料不相容。單值模型資料需要通過原有的/api/put
介面進行寫入。同時多值寫入資料需要通過/api/mquery
介面進行查詢,單值寫入的資料需要通過/api/query
進行查詢。
請求內容
名稱 | 類型 | 是否必選 | 描述 | 預設值 | 舉例 |
start | Long | 是 | 開始時間,單位為秒或者毫秒。判斷規則詳見下面的“時間戳記說明”。 | 無 | 1499158925 |
end | Long | 否 | 結束時間,單位為秒或者毫秒。判斷規則詳見下面的“時間戳記說明”。預設值為TSDB伺服器目前時間。 | 目前時間 | 1499162916 |
queries | Array | 是 | 子查詢數組。 | 無 | 見子查詢說明 |
msResolution | boolean | 否 | 子查詢數組。 | false | 該參數只對未經處理資料單位是秒的查詢生效。當該參數設定為true時,查詢結果中的時間戳記會轉換為毫秒,否則仍保留原始時間單位,對於未經處理資料是毫秒的查詢,返回結果中時間戳記始終為毫秒。 |
hint | Map | 否 | 查詢Hint化。 | 無 | 見查詢Hint化說明。 |
時間戳記說明
時間戳記的單位可以是秒或者毫秒。TSDB會通過數值大小來判斷時間戳記的單位,規則如下:
時間戳記區間為 [4284768,9999999999]:判斷為秒,表示的日期時間區間為:[1970-02-20 00:59:28,2286-11-21 01:46:39] 。
時間戳記區間為 [10000000000,9999999999999]:判斷為毫秒,表示的日期時間區間為:[1970-04-27 01:46:40.000,,2286-11-21 01:46:39.999] 。
時間戳記區間為 (-∞,4284768)和(9999999999999,+∞):判斷為非法時間戳記區間。
說明適用於寫入資料 (
/api/put
&/api/mput
)和查詢資料(/api/query
&/api/mquery
)兩個介面。
單時間點資料查詢
TSDB支援單時間點資料查詢。您可以將開始時間和結束時間設定為相同的數值。
例如:"start":1356998400
,"end":1356998400
。
子查詢 JSON 格式
名稱 | 類型 | 是否必選 | 描述 | 預設值 | 舉例 |
metric | String | 是 | 指標名。 | 無 | wind |
fields | List | 是 | 域查詢資訊。 | 無 | - |
rate | Boolean | 否 | 是否計算指定指標值的增長速率,計算公式:Vt-Vt-1/t1-t-1。 | false | true |
delta | Boolean | 否 | 是否計算指定指標值的差值,計算公式:Vt-Vt-1。 | false | true |
limit | Integer | 否 | 資料分頁,子查詢每條時間序列返回資料點的最大數目。 | 0 | 1000 |
offset | Integer | 否 | 資料分頁,子查詢每條時間序列返回資料點的位移量。 | 0 | 500 |
dpValue | String | 否 | 根據提供條件過濾返回資料點,支援“>”,“<”, “=”,”<=”, “>=”, “!=”。 | 無 | >=1000 |
preDpValue | String | 否 | 根據提供的條件在掃描未經處理資料點時進行過濾,支援”>”, “<”, “=”,”<=”, “>=”, “!=”。 說明 它與 | 無 | >=1000 |
downsample | String | 否 | 時間維度降採樣。 | 無 | 60m-avg |
tags | Map | 否 | 指定查詢標籤過濾,和filters衝突。 | 無 | - |
filters | List | 否 | 過濾器,和tags衝突。 | 無 | - |
hint | Map | 否 | 查詢Hint化。 | 無 | 見查詢Hint化說明 |
一個查詢中能夠包含的總的
Field
個數最多不超過200個。 樣本如下:假設現有一個查詢包含3個子查詢,第一個子查詢包含3個
Field
,第二個子查詢包括2個Field
,第三個子查詢包含6個Field
,那麼這個查詢包含的總的Field
個數totalFields=3+2+6=11
,即查詢時需要保證totalFields
不能大於200。tags
和filters
都指定的情境下,後指定的過濾條件生效。
域查詢資訊 JSON 格式
名稱 | 類型 | 是否必選 | 描述 | 預設值 | 舉例 |
aggregator | String | 是 | 彙總函式,詳見下面的“彙總(Aggregate)說明”。 | 無 | sum |
field | String | 是 | 網域名稱稱,”*”代表查詢指標下所有域。 | 無 | - |
alias | String | 否 | 網域名稱稱在返回結果中新名字。 | 無 | - |
downsample | String | 否 | 時間維度降採樣。 | 無 | 60m-avg |
rate | Boolean | 否 | 是否計算指定指標值的增長速率,計算公式: Vt-Vt-1/t1-t-1。 | false | true |
dpValue | String | 否 | 根據提供條件過濾返回資料點,支援“>”、“<”、 “=”、“<=”、“>=”、 “!=”。 | 無 | >=1000 |
where | String | 否 | 當域查詢資訊的field指定為萬用字元“*”時,該欄位用於指定過濾最終查詢結果時針對哪個欄位進行過濾。其本質與 | 無 | f1>=100 |
關於 limit
、dpValue
、downsample
、tags
和filters
的詳細資料請見下面的相關說明。
查詢樣本
請求:POST/api/mquery
請求體
{
"start" : 1346846400,
"end" : 1346846411,
"msResolution" : true,
"queries" : [
{
"metric" : "wind",
"fields" : [
{
"field" : "speed",
"aggregator" : "sum",
"downsample" : "2s-last",
"alias" : "speed_sum"
},
{
"field" : "*",
"aggregator" : "sum",
"downsample" : "2s-count",
"where":"speed>10"
}
]
}
]
}
資料分頁查詢(Limit 和 Offset)說明
Limit:子查詢每條時間序列返回資料點的最大數目。預設值是0,代表不限制返回點數量。
Offset:子查詢每條時間序列返回資料點的位移量。預設值也是0,代表不位移返回的資料點。
limit和offset不能為負數。
limit和offset是對最後多值返回結果的分頁查詢處理,而不是對某一域查詢結果進行處理。
樣本
返回第1001到1500的資料點,則limit設為500,offset設為1000。
{
"start" : 1346846400,
"end" : 1346846411,
"msResolution" : true,
"queries" : [
{
"metric" : "wind",
"fields" : [
{
"field" : "*",
"aggregator" : "sum",
"downsample" : "2s-count"
}
],
"filters" : [
{
"filter" : "IOTE_8859_0005|IOTE_8859_0004",
"tagk" : "sensor",
"type" : "literal_or"
}
],
"limit" : 500,
"offset" : 1000
}
]
}
值過濾(dpValue) 說明
根據使用者佈建的數值限制條件,過濾最終的返回資料點。支援 “>”、“<”、 “=”、 “<=”、 “>=”、 “!=”。
不同 fields 之間的 dpValue 關係是“或”。“和”的關係暫時不支援。
字串僅支援“=”、“!=”。
樣本
{
"start" : 1346846400,
"end" : 1346846411,
"msResolution" : true,
"queries" : [
{
"metric" : "wind",
"fields" : [
{
"field" : "level",
"aggregator" : "avg",
"downsample" : "2s-avg",
"dpValue" : ">=8.0"
}
],
"filters" : [
{
"filter" : "IOTE_8859_0005|IOTE_8859_0004",
"tagk" : "sensor",
"type" : "literal_or"
}
]
}
]
}
差值(delta)說明
當使用者在子查詢中指定差值運算元的時候,TSDB返回的資料的dps
中的key-value
對的value
值將是計算所得的差值。
如果未指定差值時返回的dps
中有n
個key-value
對,那麼計算完差值後返回的dps
中將只包含n-1
個key-value
對(第一個key-value
對因無法求差值將被捨去)。差值運算元對於Downsample
後的值也同樣適用。
使用者指定了差值運算元時,還可以進一步在子查詢中指定deltaOptions
來對求差值的行為進行進一步控制。當前支援的deltaOptions
如下所示:
名稱 | 類型 | 是否必選 | 描述 | 預設值 | 舉例 |
counter | Boolean | 否 | 當該標記位被指定時,則表示假定用於計算差值的指標值,被使用者視作是一個類似計數器的單調遞增(或遞減)的累計值(伺服器並不會加以檢查)。 | false | true |
counterMax | Integer | 否 | 當counter被設定為true時,該值用於指定差值的閾值。當差值的絕對值超過該閾值時將被視作異常值,該值不指定時則對差值不設閾值。 | 無 | 100 |
dropReset | Boolean | 否 | 該標記位需要與上述 | false | true |
樣本
{
"start":1346046400,
"end":1347056500,
"queries":[
{
"aggregator":"none",
"downsample":"5s-avg",
"delta":true,
"deltaOptions":{
"counter":true,
"counterMax":100
}
"metric":"sys.cpu.0",
"dpValue":">=50",
"tags":{
"host":"localhost",
"appName":"hitsdb"
}
}
]
}
降採樣(Downsample)說明
當查詢的時間範圍比較長,只需要返回每個時間間隔的統計值時使用。查詢結果返回的時間戳記是按照查詢指定的間隔對齊後的時間區間起始值。查詢格式如下:
<interval><units>-<aggregator>[-fill policy]
指定了降採樣後,查詢指定的起始時間範圍會自動按照指定的interval
區間向前後取整對齊。例如,指定時間戳記範圍為[1346846401,1346846499] ,指定的interval
為5m,則查詢真實的時間戳記範圍為[1346846101,1346846799]。
其中:
interval
:指數值,如 5、60等,特殊的“0all”表示時間維度彙總為一個點。units
:s代表秒,m代表分,h代表小時,d代表天,n代表月,y代表年。說明預設按照時間戳記模數對齊,即“對齊時間戳記=資料時間戳記-(資料時間戳記 % interval)”。
支援基於日曆時間間隔的降採樣。要使用日曆界限,您需要在時間單位units後添加一個
c
。例如,1dc
代表從當日零點到次日零點之間的 24 小時。
aggregator
:降採樣使用的運算元及其說明如下表所示。
運算元 | 描述 |
avg | 平均值。 |
count | 資料點數。 |
first | 取第一個值。 |
last | 取最後一個值。 |
min | 最小值。 |
max | 最大值。 |
sum | 求和。 |
zimsum | 求和。 |
rfirst | 功能同 |
rlast | 功能同 |
rmin | 功能同 |
rmax | 功能同 |
當降採樣的彙總運算元指定為rfirst
, rlast
, rmin
或rmax
時,不能再在降採樣運算式中指定fill policy
。
Fill policy
Fill policy
即填值。降採樣先把所有時間軸按照指定精度切分,並把每個降採樣區間內的資料做一次運算,降採樣後如果某個精度區間沒有值,fill policy
可以指定在這個時間點填充具體的值。比如某條時間軸降採樣後的時間戳記為:t+0,t+20,t+30,此時如果不指定fill policy
,只有3個值,如果指定了fill policy
為null
,此時間軸會有4個值,其中t+10時刻的值為null
。Fill policy
與具體填儲值的對應如下表所示。
Fill Policy | 填儲值 |
none | 預設行為,不填值。 |
nan | NaN |
null | null |
zero | 0 |
linear | 線性填儲值。 |
previous | 之前的一個值。 |
near | 鄰近的一個值。 |
after | 之後的一個值。 |
fixed | 用指定的一個固定填儲值(請參照下面樣本)。 |
Fixed Fill Policy
使用方法:將固定的填儲值寫到 “#”之後。填儲值支援正負數。格式如下:
<interval><units>-<aggregator>-fixed#<number>
樣本:1h-sum-fixed#6
, 1h-avg-fixed#-8
降採樣樣本
樣本:1m-avg
,1h-sum-zero
,1h-sum-near
在域查詢資訊中,downsample
不是必要條款。您甚至可以在查詢時明確標明其值為null
或者空("")
,例如:{"downsample": null}
或者 {"downsample": ""}
,這樣就不會觸發資料點降採樣。但是,如果又一個域查詢使用了downsample
,在同一子查詢下的所有域查詢資訊都需要包括 downsample
並且採用同樣的降採樣區間。
彙總(Aggregate)說明
在降採樣後會得到多條時間軸的值,並且這些時間軸的時間戳記是對齊的,而彙總就是把多條時間軸的值按各個對齊時刻彙總為一條時間軸的結果(注意:如果只有一條時間軸,則不進行彙總)。彙總時必須要求每條時間軸在對應時刻都有值,如果某條時間軸在某個時刻沒有值,則會進行插值,插值描述如下。
在域查詢資訊中,aggregator
是必要條款,但是可以通過none
來指明不做彙總運算。但是,TSDB多值模型不支援在同一個查詢中有的域做彙總,有的域不做彙總。
插值
如果某條時間軸某個精度區間沒有值且沒有使用fill policy
進行填值,而待彙總的其他時間軸中有一條時間軸在此精度區間有值,則會對本時間軸的這個缺值精度區間進行插值。
例如:降採樣以及彙總條件為{"downsample": "10s-avg", "aggregator": "10s-avg", "aggregator": "sum"}
,有兩條時間軸需要使用 sum彙總,按10s-avg
做降採樣後的這兩條時間軸有值的時間戳記分別為:
line 1:t+0,t+10,t+20,t+30、line 2:t+0,t+20,t+30。
第二條時間軸 line 2 缺 “t+10” 這個時刻的值,那麼在彙總前會對line 2的“t+10”這個時間點進行插值。插值的方法與彙總的運算元有關,詳見下面的運算元列表。
運算元 | 描述 | 插值方法 |
avg | 平均值 | 線性插值(斜率擬合) |
count | 資料點數 | 插 0 |
mimmin | 最小值 | 插最大值 |
mimmax | 最大值 | 插最小值 |
min | 最小值 | 線性插值 |
max | 最大值 | 線性插值 |
none | 不做計算 | 插 0 |
sum | 求和 | 線性插值 |
zimsum | 求和 | 插 0 |
Filters 說明
有以下兩種方法可以指定filter:
在指定 tagk 時指定filter:
tagk = *:對tagk下面的tagv做分組,相同的tagv做彙總。
tagk = tagv1|tagv2:分別對tagk下面的tagv1和tagv2資料做彙總。
使用JSON格式指定filter:
名字 | 類型 | 是否必選 | 描述 | 預設值 | 舉例 |
type | String | 是 | filter 類型,詳見下面說明。 | 無 | literal_or |
tagk | String | 是 | 指定tagk名。 | 無 | host |
filter | String | 是 | filter運算式。 | 無 | web01丨web02 |
groupBy | Boolean | 否 | 是否按照tagv 做分組。 | false | false |
Filter 類型說明
名稱 | filter 舉例 | 描述 |
literal_or | web01丨web02 | 分別對多個tagv做彙總,區分大小寫。 |
wildcard | *.example.com | 分別對滿足萬用字元的tagv做彙總,區分大小寫。 |
查詢樣本
包含 filter 的查詢樣本
請求體:
{
"start" : 1346846400,
"end" : 1346846411,
"msResolution" : true,
"queries" : [
{
"metric" : "wind",
"fields" : [
{
"field" : "speed",
"aggregator" : "none",
"alias" : "column_speed"
},
{
"field" : "*",
"aggregator" : "none",
"alias" : "column_"
}
],
"filters" : [
{
"filter" : "IOTE_8859_0005|IOTE_8859_0004",
"tagk" : "sensor",
"type" : "literal_or"
}
]
}
]
}
查詢結果說明
查詢成功的HTTP響應碼為200,響應內容為JSON格式資料。說明如下:
名稱 | 描述 |
metric | 指標名。 |
columns | 查詢結果對應的列的名稱。 |
tags | tagv未做彙總的tag。 |
aggregateTags | tagv做了彙總的tag。 |
values | Tuple結構查詢結果。 |
響應結果樣本:
Aggregator
:None
情境樣本
[
{
"metric":"wind",
"columns":[
"timestamp",
"column_speed",
"column_description",
"column_direction",
"column_level",
"column_speed"
],
"tags":{
"city":"hangzhou",
"country":"china",
"province":"zhejiang",
"sensor":"IOTE_8859_0005"
},
"aggregatedTags":[],
"values":[
[ 1346846406000, null, "Fresh breeze", "East", 0.5, null ],
[ 1346846407000, null, "Fresh breeze", "South", 1.5, null ]
},
{
"metric":"wind",
"columns":[
"timestamp",
"column_speed",
"column_description",
"column_direction",
"column_level",
"column_speed"
],
"tags":{
"city":"hangzhou",
"country":"china",
"province":"zhejiang",
"sensor":"IOTE_8859_0004"
},
"aggregatedTags":[],
"values":[
[ 1346846400000, 40.4, "Fresh breeze", "East", 0.4, 40.4 ],
[ 1346846401000, 41.4, "Fresh breeze", "South", 1.4, 41.4 ],
[ 1346846402000, 42.4, "Fresh breeze", "West", 2.4, 42.4 ],
[ 1346846403000, 43.4, "Fresh breeze", "North", 3.4,43.4 ]
}
]
Aggregator
:Avg
的情境樣本(查看杭州市所有sensor監控的平均風速和平均風等級)
[
{
"metric": "wind",
"columns": [
"timestamp",
"avg_level",
"avg_speed"
],
"tags": {
"city": "hangzhou"
},
"aggregatedTags": [
"country",
"province",
"sensor"
],
"values": [
[1346846400000, 0.25, 40.25],
[1346846401000, 1.25, 41.25],
[1346846402000, 2.5, 42.5],
[1346846411000, 5.5, null]
]
}
]
查詢 Hint 化說明
情境說明
該特性主要是提高查詢速度。假設某一個tags A命中的時間軸明顯大於其他的tags B命中的時間軸,則需要捨棄,避免撈取tags A的大量時間軸之後,被tags B小規模時間軸交集後,結果集等於tags B。
格式說明
目前的版本只支援tagk層級的查詢索引限制(hint下的tagk是固定寫法)。
其中,
0
表示不使用對應tagk的索引,反之1
表示使用對應tagk的索引。
版本說明
從v2.6.1版本開始支援hint特性。
查詢樣本
子查詢層級
{
"queries": [
{
"metric": "demo.mf",
"tags": {
"sensor": "IOTE_8859_0001",
"city": "hangzhou",
"province": "zhejiang",
"country": "china"
},
"fields": [
"speed"
],
"hint": {
"tagk": {
"dc": 1
}
}
}
]
}
整體查詢層級
{
"queries": [
{
"metric": "demo.mf",
"tags": {
"sensor": "IOTE_8859_0001",
"city": "hangzhou",
"province": "zhejiang",
"country": "china"
},
"fields": [
"speed"
]
}
],
"hint": {
"tagk": {
"dc": 1
}
}
}
異常情況
不可同時指定 0 和 1
{
"start": 1346846400,
"end": 1346846400,
"queries": [
{
"aggregator": "none",
"metric": "sys.cpu.nice",
"tags": {
"dc": "lga",
"host": "web01"
}
}
],
"hint": {
"tagk": {
"dc": 1,
"host": 0
}
}
}
會返回如下報錯資訊:
{
"error": {
"code": 400,
"message": "The value of hint should only be 0 or 1, and there should not be both 0 and 1",
"details": "TSQuery(start_time=1346846400, end_time=1346846400, subQueries[TSSubQuery(metric=sys.cpu.nice, filters=[filter_name=literal_or, tagk=dc, literals=[lga], group_by=true, filter_name=literal_or, tagk=host, literals=[web01], group_by=true], tsuids=[], agg=none, downsample=null, ds_interval=0, rate=false, rate_options=null, delta=false, delta_options=null, top=0, granularity=null, granularityDownsample=null, explicit_tags=explicit_tags, index=0, realTimeSeconds=-1, useData=auto, limit=0, offset=0, dpValue=null, preDpValue=null, startTime=1346846400000, endTime=1346846400000, Query_ID=null)] padding=false, no_annotations=false, with_global_annotations=false, show_tsuids=false, ms_resolution=false, options=[])"
}
}
不可指定除了 0 和 1 之外的值
{
"start": 1346846400,
"end": 1346846400,
"queries": [
{
"aggregator": "none",
"metric": "sys.cpu.nice",
"tags": {
"dc": "lga",
"host": "web01"
}
}
],
"hint": {
"tagk": {
"dc": 100
}
}
}
會返回如下報錯資訊:
{
"error": {
"code": 400,
"message": "The value of hint can only be 0 or 1, and it is detected that '100' is passed in",
"details": "TSQuery(start_time=1346846400, end_time=1346846400, subQueries[TSSubQuery(metric=sys.cpu.nice, filters=[filter_name=literal_or, tagk=dc, literals=[lga], group_by=true, filter_name=literal_or, tagk=host, literals=[web01], group_by=true], tsuids=[], agg=none, downsample=null, ds_interval=0, rate=false, rate_options=null, delta=false, delta_options=null, top=0, granularity=null, granularityDownsample=null, explicit_tags=explicit_tags, index=0, realTimeSeconds=-1, useData=auto, limit=0, offset=0, dpValue=null, preDpValue=null, startTime=1346846400000, endTime=1346846400000, Query_ID=null)] padding=false, no_annotations=false, with_global_annotations=false, show_tsuids=false, ms_resolution=false, options=[])"
}
}