/api/mquery エンドポイントを使用して、メトリックごとに複数のフィールドを格納するマルチバリアント(多変量)データポイントをクエリします。ユニバリアント(単変量)データには代わりに /api/query を使用してください。
書き込みパスとクエリパスはデータモデルによって異なります。/api/mput を使用してマルチバリアントデータを書き込み、/api/mquery を使用してクエリします。/api/put および /api/query はユニバリアントデータ専用です。これら 2 つのモデルは相互に交換できません。
リクエスト
エンドポイント
| パス | メソッド |
|---|---|
/api/mquery | POST |
リクエスト本文のパラメーター
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
start | Long | はい | — | 開始時刻。秒またはミリ秒単位の UNIX タイムスタンプを受け付けます。「タイムスタンプの単位」をご参照ください。 |
end | Long | いいえ | 現在のサーバー時刻 | 終了時刻。秒またはミリ秒単位の UNIX タイムスタンプを受け付けます。「タイムスタンプの単位」をご参照ください。 |
queries | 配列 | はい | — | サブクエリオブジェクトの配列です。「サブクエリのパラメーター」をご参照ください。 |
msResolution | ブール値 | いいえ | false | true の場合、秒単位で格納されたデータポイントのタイムスタンプをミリ秒単位で返します。ミリ秒単位で格納されたデータには影響しません(これらのデータは常にミリ秒単位のタイムスタンプを返します)。 |
hint | オブジェクト | いいえ | — | インデックス使用量を制限するためのクエリヒントワードです。TSDB V2.6.1 以降が必要です。「クエリヒントワード」をご参照ください。 |
サブクエリのパラメーター
queries 配列内の各オブジェクトは、以下のパラメーターをサポートします:
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
metric | 文字列 | はい | — | メトリック名です。 |
fields | 配列 | はい | — | フィールドクエリオブジェクトの配列です。「フィールドクエリのパラメーター」をご参照ください。 |
rate | ブール値 | いいえ | false | 連続する値間の成長率を計算します:(Vt − Vt-1) / (t − t-1)。 |
delta | ブール値 | いいえ | false | 連続する値間の差分(デルタ)を計算します:Vt − Vt-1。「デルタ演算子」をご参照ください。 |
limit | 整数 | いいえ | 0 | タイムラインあたりに返す最大データポイント数です。0 は制限なしを意味します。ページ分割対応のマルチバリアントクエリにのみ適用され、個別のフィールドクエリには適用されません。 |
offset | 整数 | いいえ | 0 | タイムラインあたりにスキップするデータポイント数です。limit と組み合わせてページ分割に使用します。 |
dpValue | 文字列 | いいえ | — | 返されるデータポイントを値でフィルターします。サポートされる演算子: >、<、=、<=、>=、!=。文字列として設定した場合、= および != のみがサポートされます。 |
preDpValue | 文字列 | いいえ | — | 集約前のスキャン中にデータポイントをフィルターします。dpValue(集約後の結果をフィルター)とは異なり、preDpValue は一致するデータポイントをすべてのクエリおよび計算から除外します。 |
downsample | 文字列 | いいえ | — | ダウンサンプリング式です。「ダウンサンプリング」をご参照ください。 |
tags | オブジェクト | いいえ | — | データをフィルターするためのタグのキーと値のペアです。filters と競合します — 両方が指定された場合、JSON 内で後に出た方の設定が有効になります。 |
filters | 配列 | いいえ | — | タグベースのフィルターを行うためのフィルター・オブジェクトです。tags と競合します。「フィルター」をご参照ください。 |
hint | オブジェクト | いいえ | — | サブクエリレベルのクエリヒントワードです。このサブクエリに対してトップレベルのヒントワードを上書きします。 |
フィールドクエリのパラメーター
fields 配列内の各オブジェクトは、以下のパラメーターをサポートします:
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
aggregator | 文字列 | はい | — | 適用する集約関数です。none を指定すると集約をスキップします。同一サブクエリ内のいずれかのフィールドクエリで指定した場合、そのサブクエリ内のすべてのフィールドクエリで指定する必要があります。 |
field | 文字列 | はい | — | フィールド名です。* を使用すると、そのメトリックのすべてのフィールドをクエリできます。 |
alias | 文字列 | いいえ | — | 返されるフィールド名のエイリアスです。 |
downsample | 文字列 | いいえ | — | ダウンサンプリング式です。同一サブクエリ内のすべてのフィールドクエリで同じ間隔を使用する必要があります。 |
rate | ブール値 | いいえ | false | このフィールドの成長率を計算します。 |
dpValue | 文字列 | いいえ | — | このフィールドの返される値をフィルターします。サポートされる演算子: >、<、=、<=、>=、!=。フィールドごとに独立して適用されます(フィールド間では適用されません)。 |
where | 文字列 | いいえ | — | field が * の場合にのみ使用されます。返される結果の前にフィールドをフィルターし、dpValue と同じロジックを使用します。例:speed>10。 |
1 つのクエリで、すべてのサブクエリを含めたフィールド値の合計は最大 200 個までです。カウント方法:すべてのサブクエリ内のfield値の数を、すべてのfields配列で合計します。
タイムスタンプの単位
TSDB は数値の範囲に基づいてタイムスタンプの単位を決定します:
| 範囲 | 単位 | 対応する日付範囲 |
|---|---|---|
[4284768, 9999999999] | 秒 | 1970-02-20 ~ 2286-11-21 |
[10000000000, 9999999999999] | ミリ秒 | 1970-04-27 ~ 2286-11-21 |
| 両方の有効値の範囲外 | 無効 | — |
これらのルールは /api/put、/api/mput、/api/query、および /api/mquery に適用されます。
単一時点のデータをクエリするには、start および end を同じ値に設定します。例:"start": 1356998400, "end": 1356998400。
サンプルリクエスト
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"
}
]
}
]
}ダウンサンプリング
ダウンサンプリングは、固定時間間隔でデータを集約し、返されるデータポイント数を削減します。1 秒単位の粒度が不要な長期間のクエリ時に使用します。
式の形式
<間隔><単位>-<集約関数>[-塗りつぶしポリシー]`間隔`: 5 や 60 などの数値です。0all を使用すると、範囲内のすべてのデータポイントを 1 つの値に集約します。
`単位`:
| 単位 | 意味 |
|---|---|
s | 秒 |
m | 分 |
h | 時 |
d | 日 |
n | 月 |
y | 年 |
c を追加すると、カレンダーによる配置(例: 1dc は当日 00:00 からの 24 時間を表します)が有効になります。c を指定しない場合、タイムスタンプの配置は次の式で行われます:配置済みタイムスタンプ = データタイムスタンプ − (データタイムスタンプ % 間隔)。
`集約関数` の選択肢:
| 演算子 | 説明 |
|---|---|
avg | 平均値 |
count | データポイント数 |
first | 最初の値(配置済みタイムスタンプ) |
last | 最後の値(配置済みタイムスタンプ) |
min | 最小値(配置済みタイムスタンプ) |
max | 最大値(配置済みタイムスタンプ) |
sum | 値の合計 |
zimsum | 値の合計 |
rfirst | オリジナル(未配置)タイムスタンプ付きの最初の値 |
rlast | オリジナル(未配置)タイムスタンプ付きの最後の値 |
rmin | オリジナル(未配置)タイムスタンプ付きの最小値 |
rmax | オリジナル(未配置)タイムスタンプ付きの最大値 |
rfirst、rlast、rmin、およびrmax演算子は、塗りつぶしポリシーとともに使用できません。
時間ウィンドウの拡張
downsample を指定すると、TSDB は自動的にクエリ範囲を両側に 1 つの間隔分拡張します。たとえば、範囲が [1346846401, 1346846499] で間隔が 5m の場合、実際のクエリ範囲は [1346846101, 1346846799] になります。
フィル ポリシー
タイムバケットにデータポイントがない場合、塗りつぶしポリシーにより、そのバケットに対して報告される値が決定されます。
| フィル ポリシー | 値 |
|---|---|
none | 値は塗りつぶされません。これがデフォルト値です。 |
nan | NaN |
null | null |
zero | 0 |
linear | 線形補間に基づいて計算された値。 |
previous | 前の値。 |
near | 隣接する値。 |
after | 次の値。 |
fixed | ユーザー指定の固定値。「固定塗りつぶしポリシー」をご参照ください。 |
固定塗りつぶしポリシー
フォーマットに固定値を # を使用して追加します:
<間隔><単位>-<集約関数>-fixed#<数値>固定値は正または負の値を指定できます。例:1h-sum-fixed#6、1h-avg-fixed#-8。
ダウンサンプリングの例
有効なダウンサンプリング式の例: 1m-avg、1h-sum-zero、1h-sum-near。
downsample パラメーターはフィールドクエリでは任意です。ダウンサンプリングを明示的に無効にするには、null または空文字列を指定します:{"downsample": null} または {"downsample": ""}。サブクエリ内のいずれかのフィールドクエリで downsample を指定した場合、そのサブクエリ内のすべてのフィールドクエリで同じ間隔を指定する必要があります。
集約関数
ダウンサンプリング後、複数のタイムラインが配置済みタイムスタンプを共有することがあります。aggregator は、各タイムスタンプにおける値を集約することで、それらのタイムラインを 1 つにマージします。タイムラインが 1 つのみの場合、集約は実行されません。
aggregator はすべてのフィールドクエリで必須です。none を指定すると集約をスキップできます。サブクエリ内のいずれかのフィールドクエリで aggregator を指定した場合、そのサブクエリ内のすべてのフィールドクエリで指定する必要があります。サブクエリ内で部分的な集約はサポートされていません。
補間
複数のタイムラインを集約する場合、あるタイムラインが配置済みタイムスタンプに値を持たず、他のタイムラインが持つ場合、TSDB は欠落しているタイムラインに対して補間値を計算します。これは塗りつぶしポリシーが設定されていない場合にのみ適用されます。
補間方法は集約関数によって異なります:
| アグリゲーター | 補間方法 |
|---|---|
avg | 線形補間 |
count | ゼロを補間 |
min | 線形補間 |
max | 線形補間 |
mimmin | 最大値を補間 |
mimmax | 最小値を補間 |
none | ゼロを補間 |
sum | 線形補間 |
zimsum | ゼロを補間 |
デルタ演算子
delta が true に設定されている場合、dps の各キーと値のペア内の value は、計算されたデルタ (Vt − Vt-1) で置き換えられます。
元の結果に n 個のキーと値のペアが含まれる場合、デルタ結果には n-1 個のペアが含まれます — 最初のペアは、比較可能な先行値がないため破棄されます。デルタ演算子はダウンサンプリング後にも適用されます。
`deltaOptions` のパラメーター
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
counter | ブール値 | いいえ | false | メトリック値を単調増加または単調減少するカウンターとして扱います。サーバーは単調性を検証しません。 |
counterMax | 整数 | いいえ | — | 許容される絶対デルタの最大値です。このしきい値を超えるデルタは異常と見なされ、破棄または 0 にリセットされます。counter が true の場合にのみ適用されます。 |
dropReset | ブール値 | いいえ | false | counterMax が必要です。異常なデルタが検出された場合、true はそれを破棄し、false(または省略)はそれを 0 にリセットします。 |
例
{
"start": 1346046400,
"end": 1347056500,
"queries": [
{
"metric": "sys.cpu.0",
"aggregator": "none",
"downsample": "5s-avg",
"delta": true,
"deltaOptions": {
"counter": true,
"counterMax": 100
},
"dpValue": ">=50",
"tags": {
"host": "localhost",
"appName": "hitsdb"
}
}
]
}limit および offset を使用したページ分割
limit および offset を使用して、複数のタイムラインにわたる結果をページ分割します。
limit:ページあたりのタイムラインごとの最大データポイント数です。0は制限なし(デフォルト)を意味します。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
}
]
}フィルター
フィルターは、タグ値に基づいてクエリに含めるタイムラインを選択します。filters パラメーターは tags と競合します — JSON 内で両方が出現した場合、後に出た方の設定が有効になります。
フィルター・オブジェクトのパラメーター
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
type | 文字列 | はい | — | フィルターの種類です。以下のフィルターの種類をご参照ください。 |
tagk | 文字列 | はい | — | フィルター対象のタグキーです。 |
filter | 文字列 | はい | — | フィルター式です。 |
groupBy | ブール値 | いいえ | false | タグ値で結果をグループ化します。 |
フィルターの種類
| 種類 | 例 | 説明 |
|---|---|---|
literal_or | web01|web02 | 各 tagv の値が集約されます。このフィルターは大文字小文字を区別します。 |
wildcard | *.example.com | 各 tagv の値のうち、指定されたワイルドカードを含むものだけが集約されます。このフィルターは大文字小文字を区別します。 |
また、タグのショートハンドを使用してフィルターを指定することもできます:
tagk = *:そのキーのすべてのタグ値をグループ化し、個別の値ごとに集約します。tagk = tagv1|tagv2:tagv1の値をまとめてグループ化し、tagv2の値をまとめてグループ化します。
フィルターを使用した例
{
"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 | 値が集計されなかったタグ(正確なフィルターとして適用されました)。 |
aggregatedTags | タイムライン全体で集約されたタグの値です。 |
values | タプルの配列です。各タプルは columns でキー付けされたデータ行に対応します。 |
例:aggregator を `none` に設定した場合
一致したタイムラインごとに 1 つの結果オブジェクトを返します(センサー間での集約は行いません):
[
{
"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` に設定した場合
都市内のすべてのセンサーにわたる平均風速および平均レベルを返します:
[
{
"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]
]
}
]クエリ ヒント
クエリヒントワードは、TSDB に対してタイムライン解決時にどのタグインデックスを使用(またはスキップ)するかを指示し、あるタグセットによってターゲットとなるタイムラインの集合が、他のタグセットの既知のサブセットである場合に応答時間を短縮します。
TSDB V2.6.1 以降が必要です。
フォーマット
hint.tagk の下にタグキー名を指定し、値として 0(インデックスをスキップ)または 1(インデックスを使用)を設定します。1 つのヒントワード内では、すべての値が 0 またはすべてが 1 である必要があります — 混在するとエラーが発生します。
サブクエリにスコープを限定したヒントワード
{
"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": "ヒントワードの値は 0 または 1 のみであり、0 と 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=[])"
}
}エラー:無効なヒントワードの値
{
"start": 1346846400,
"end": 1346846400,
"queries": [
{
"aggregator": "none",
"metric": "sys.cpu.nice",
"tags": {
"dc": "lga",
"host": "web01"
}
}
],
"hint": {
"tagk": {
"dc": 100
}
}
}返されるレスポンス:
{
"error": {
"code": 400,
"message": "ヒントワードの値は 0 または 1 のみであり、'100' が渡されたことが検出されました",
"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=[])"
}
}