All Products
Search
Document Center

:Kueri data multi-nilai

Last Updated:Mar 29, 2026

Kueri titik data multivariat—data yang disimpan dengan beberapa bidang per metrik—menggunakan titik akhir /api/mquery. Gunakan /api/query untuk data univariat.

Penting

Jalur penulisan dan kueri berbeda tergantung pada model data. Gunakan /api/mput untuk menulis data multivariat dan /api/mquery untuk mengkuerinya. Gunakan /api/put dan /api/query untuk data univariat. Kedua model tersebut tidak dapat saling dipertukarkan.

Permintaan

Titik Akhir

PathMetode
/api/mqueryPOST

Parameter body permintaan

ParameterTipeWajibBawaanDeskripsi
startLongYaWaktu mulai. Menerima timestamp Unix dalam satuan detik atau milidetik. Lihat Satuan timestamp.
endLongTidakWaktu server saat iniWaktu akhir. Menerima timestamp Unix dalam satuan detik atau milidetik. Lihat Satuan timestamp.
queriesArrayYaArray objek subkueri. Lihat Parameter subkueri.
msResolutionBooleanTidakfalseJika diatur ke true, mengembalikan timestamp dalam milidetik untuk titik data yang disimpan dalam detik. Tidak berpengaruh pada data yang disimpan dalam milidetik — data tersebut selalu mengembalikan timestamp dalam milidetik.
hintObjectTidakPetunjuk kueri untuk membatasi penggunaan indeks. Memerlukan TSDB V2.6.1 atau versi lebih baru. Lihat Petunjuk kueri.

Parameter subkueri

Setiap objek dalam array queries mendukung parameter berikut:

ParameterTipeWajibBawaanDeskripsi
metricStringYaNama metrik.
fieldsArrayYaArray objek kueri bidang. Lihat Parameter kueri bidang.
rateBooleanTidakfalseMenghitung laju pertumbuhan antara nilai-nilai berurutan: (Vt − Vt-1) / (t − t-1).
deltaBooleanTidakfalseMenghitung delta antara nilai-nilai berurutan: Vt − Vt-1. Lihat Operator delta.
limitIntegerTidak0Maksimum titik data yang dikembalikan per timeline. 0 berarti tanpa batas. Hanya berlaku untuk kueri multivariat terpaginasi — tidak berlaku untuk kueri bidang individual.
offsetIntegerTidak0Jumlah titik data yang dilewati per timeline. Gunakan bersama limit untuk paginasi.
dpValueStringTidakMenyaring titik data yang dikembalikan berdasarkan nilai. Operator yang didukung: >, <, =, <=, >=, !=. Jika diatur ke string, hanya operator = dan != yang didukung.
preDpValueStringTidakMenyaring titik data selama pemindaian, sebelum agregasi. Berbeda dengan dpValue (yang menyaring hasil pasca-agregasi), preDpValue mengecualikan titik data yang cocok dari semua kueri dan perhitungan.
downsampleStringTidakEkspresi downsampling. Lihat Downsampling.
tagsObjectTidakPasangan kunci-nilai tag untuk menyaring data. Bertentangan dengan filters — jika keduanya ditentukan, yang muncul belakangan dalam JSON yang berlaku.
filtersArrayTidakObjek filter untuk penyaringan berbasis tag. Bertentangan dengan tags. Lihat Filter.
hintObjectTidakPetunjuk kueri tingkat subkueri. Menggantikan petunjuk tingkat atas untuk subkueri ini.

Parameter kueri bidang

Setiap objek dalam array fields mendukung parameter berikut:

ParameterTipeWajibBawaanDeskripsi
aggregatorStringYaFungsi agregasi yang diterapkan. Atur ke none untuk melewati agregasi. Jika ditentukan dalam salah satu kueri bidang, harus ditentukan di semua kueri bidang dalam subkueri yang sama.
fieldStringYaNama bidang. Gunakan * untuk mengkueri semua bidang untuk metrik tersebut.
aliasStringTidakAlias untuk nama bidang yang dikembalikan.
downsampleStringTidakEkspresi downsampling. Semua kueri bidang dalam subkueri yang sama harus menggunakan interval yang sama.
rateBooleanTidakfalseMenghitung laju pertumbuhan untuk bidang ini.
dpValueStringTidakMenyaring nilai yang dikembalikan untuk bidang ini. Operator yang didukung: >, <, =, <=, >=, !=. Diterapkan secara independen per bidang — tidak berlaku lintas bidang.
whereStringTidakHanya digunakan ketika field adalah *. Menyaring bidang sebelum mengembalikan hasil, menggunakan logika yang sama seperti dpValue. Contoh: speed>10.
Satu kueri dapat mencakup paling banyak 200 nilai bidang di seluruh subkueri. Untuk menghitungnya, jumlahkan jumlah nilai field di seluruh array fields di semua subkueri.

Satuan timestamp

TSDB menentukan satuan timestamp berdasarkan nilai numerik:

RentangSatuanRentang tanggal yang sesuai
[4284768, 9999999999]Detik1970-02-20 hingga 2286-11-21
[10000000000, 9999999999999]Milidetik1970-04-27 hingga 2286-11-21
Di luar kedua rentang tersebutTidak valid

Aturan ini berlaku untuk /api/put, /api/mput, /api/query, dan /api/mquery.

Untuk mengkueri data pada satu titik waktu tertentu, atur start dan end ke nilai yang sama. Contohnya: "start": 1356998400, "end": 1356998400.

Contoh permintaan

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"
        }
      ]
    }
  ]
}

Downsampling

Downsampling mengagregasi data dalam interval waktu tetap sehingga mengurangi jumlah titik data yang dikembalikan. Fitur ini berguna saat mengkueri rentang waktu panjang di mana granularitas per detik tidak diperlukan.

Format ekspresi

<interval><units>-<aggregator>[-fill policy]

`interval`: Nilai numerik seperti 5 atau 60. Gunakan 0all untuk mengagregasi semua titik data dalam rentang menjadi satu nilai.

`units`:

UnitMakna
sDetik
mMenit
hJam
dHari
nBulan
yTahun

Tambahkan c untuk menggunakan penyelarasan kalender (misalnya, 1dc merepresentasikan periode 24 jam mulai pukul 00:00 hari tersebut). Tanpa c, timestamp diselaraskan menggunakan: timestamp selaras = timestamp data − (timestamp data % interval).

Opsi `aggregator`:

OperatorDeskripsi
avgNilai rata-rata
countJumlah titik data
firstNilai pertama (timestamp selaras)
lastNilai terakhir (timestamp selaras)
minNilai minimum (timestamp selaras)
maxNilai maksimum (timestamp selaras)
sumJumlah nilai
zimsumJumlah nilai
rfirstNilai pertama dengan timestamp asli (tidak diselaraskan)
rlastNilai terakhir dengan timestamp asli (tidak diselaraskan)
rminNilai minimum dengan timestamp asli (tidak diselaraskan)
rmaxNilai maksimum dengan timestamp asli (tidak diselaraskan)
Operator rfirst, rlast, rmin, dan rmax tidak dapat digunakan bersama kebijakan pengisian (fill policy).

Perluasan jendela waktu

Setelah menentukan downsample, TSDB secara otomatis memperluas rentang kueri sebesar satu interval di setiap sisi. Misalnya, jika rentangnya adalah [1346846401, 1346846499] dan intervalnya adalah 5m, maka rentang kueri aktual menjadi [1346846101, 1346846799].

Kebijakan Pengisian

Ketika bucket waktu tidak berisi titik data, kebijakan pengisian menentukan nilai apa yang dilaporkan untuk bucket tersebut.

Kebijakan pengisianNilai
noneTidak ada nilai yang diisi. Ini adalah nilai bawaan.
nanNaN
nullnull
zero0
linearNilai yang dihitung berdasarkan interpolasi linear.
previousNilai sebelumnya.
nearNilai yang berdekatan.
afterNilai berikutnya.
fixedNilai tetap yang ditentukan pengguna. Lihat Kebijakan pengisian tetap.

Kebijakan pengisian tetap

Tambahkan nilai tetap ke format menggunakan #:

<interval><units>-<aggregator>-fixed#<number>

Nilai tetap dapat bernilai positif atau negatif. Contoh: 1h-sum-fixed#6, 1h-avg-fixed#-8.

Contoh pengambilan sampel turun

Tiga contoh ekspresi downsampling yang valid: 1m-avg, 1h-sum-zero, 1h-sum-near.

Penting

Parameter downsample bersifat opsional dalam kueri bidang. Untuk menonaktifkan downsampling secara eksplisit, atur nilainya ke null atau string kosong: {"downsample": null} atau {"downsample": ""}. Jika salah satu kueri bidang dalam subkueri menentukan downsample, semua kueri bidang dalam subkueri tersebut harus menentukan interval yang sama.

Agregator

Setelah downsampling, beberapa timeline mungkin memiliki timestamp yang selaras. aggregator menggabungkan timeline tersebut menjadi satu dengan mengagregasi nilai pada setiap timestamp. Jika hanya ada satu timeline, agregasi tidak dilakukan.

Penting

aggregator wajib ditentukan di semua kueri bidang. Atur ke none untuk melewati agregasi. Jika salah satu kueri bidang dalam subkueri menentukan aggregator, semua kueri bidang dalam subkueri tersebut harus menentukannya. Agregasi parsial dalam satu subkueri tidak didukung.

Interpolasi

Saat mengagregasi beberapa timeline, jika suatu timeline tidak memiliki nilai pada timestamp yang selaras sedangkan timeline lain memiliki nilai tersebut, TSDB melakukan interpolasi nilai untuk timeline yang hilang. Hal ini hanya berlaku jika tidak ada kebijakan pengisian yang ditetapkan.

Metode interpolasi bergantung pada aggregator:

AggregatorMetode interpolasi
avgInterpolasi linear
countMenginterpolasi nol
minInterpolasi linear
maxInterpolasi linear
mimminMenginterpolasi nilai maksimum
mimmaxMenginterpolasi nilai minimum
noneMenginterpolasi nol
sumInterpolasi linear
zimsumMenginterpolasi nol

Operator delta

Ketika delta diatur ke true, value dalam setiap pasangan kunci-nilai dps diganti dengan delta yang dihitung (Vt − Vt-1).

Penting

Jika hasil asli berisi n pasangan kunci-nilai, hasil delta berisi n-1 pasangan—pasangan pertama dihilangkan karena tidak ada nilai sebelumnya untuk dihitung. Operator delta juga diterapkan setelah downsampling.

Parameter `deltaOptions`

ParameterTipeWajibBawaanDeskripsi
counterBooleanTidakfalseMemperlakukan nilai metrik sebagai pencacah (counter) yang meningkat atau menurun secara monotonik. Server tidak memvalidasi monotonicity.
counterMaxIntegerTidakDelta absolut maksimum yang diizinkan. Delta yang melebihi ambang batas ini dianggap tidak normal dan akan dijatuhkan atau diatur ulang ke 0. Hanya berlaku ketika counter bernilai true.
dropResetBooleanTidakfalseMemerlukan counterMax. Ketika delta abnormal terdeteksi, true menjatuhkannya; false (atau tidak ditentukan) mengatur ulang ke 0.

Contoh

{
  "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"
      }
    }
  ]
}

Paginasi dengan limit dan offset

Gunakan limit dan offset untuk memaginasi hasil di beberapa timeline.

  • limit: Maksimum titik data per timeline per halaman. 0 berarti tanpa batas (bawaan).

  • offset: Jumlah titik data yang dilewati per timeline.

Penting

Baik limit maupun offset tidak boleh bernilai negatif. Parameter ini berlaku untuk kueri multivariat terpaginasi dan tidak dapat digunakan untuk kueri bidang tunggal.

Contoh: Untuk mengembalikan titik data peringkat 1001 hingga 1500, atur limit ke 500 dan offset ke 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
    }
  ]
}

Filter

Filter memilih timeline mana yang akan dimasukkan dalam kueri berdasarkan nilai tag. Parameter filters bertentangan dengan tags—jika keduanya muncul dalam JSON, yang berada di posisi belakang yang berlaku.

Menyaring parameter objek

ParameterTipeWajibBawaanDeskripsi
typeStringYaJenis filter. Lihat jenis filter di bawah.
tagkStringYaKunci tag yang akan difilter.
filterStringYaEkspresi filter.
groupByBooleanTidakfalseMengelompokkan hasil berdasarkan nilai tag.

Jenis filter

JenisContohDeskripsi
literal_orweb01|web02Nilai-nilai setiap tagv diagregasi. Filter ini peka huruf besar/kecil.
wildcard*.example.comNilai tag yang mengandung wildcard yang ditentukan untuk setiap tagv diagregasi. Filter ini peka huruf besar/kecil.

Anda juga dapat menentukan filter menggunakan singkatan tag:

  • tagk = *: Mengelompokkan semua nilai tag untuk kunci tersebut dan mengagregasi per nilai unik.

  • tagk = tagv1|tagv2: Mengelompokkan nilai tagv1 bersama dan nilai tagv2 bersama.

Contoh dengan 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"
        }
      ]
    }
  ]
}

Tanggapan

Kueri yang berhasil mengembalikan HTTP 200 dengan array JSON.

Bidang tanggapan

BidangDeskripsi
metricNama metrik.
columnsKolom yang dikembalikan.
tagsTag yang nilainya tidak diagregasi (diterapkan sebagai filter eksak).
aggregatedTagsTag yang nilainya diagregasi lintas timeline.
valuesArray tupel. Setiap tupel merepresentasikan satu baris data yang dikaitkan dengan columns.

Contoh: aggregator diatur ke `none`

Mengembalikan satu objek hasil per timeline yang cocok (tanpa agregasi lintas sensor):

[
  {
    "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]
    ]
  }
]

Contoh: aggregator diatur ke `avg`

Mengembalikan kecepatan angin rata-rata dan level yang diagregasi lintas semua sensor di kota tersebut:

[
  {
    "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]
    ]
  }
]

Petunjuk kueri

Petunjuk kueri memberi tahu TSDB indeks tag mana yang harus digunakan (atau dilewati) saat menyelesaikan timeline, sehingga mengurangi waktu respons ketika kumpulan timeline yang ditargetkan oleh satu set tag merupakan subset yang diketahui dari yang lain.

Penting

Memerlukan TSDB V2.6.1 atau versi lebih baru.

Format

Tentukan nama kunci tag di bawah hint.tagk dengan nilai 0 (lewati indeks) atau 1 (gunakan indeks). Semua nilai dalam satu petunjuk harus semuanya 0 atau semuanya 1—mencampurnya akan menghasilkan error.

Petunjuk cakupan subkueri

{
  "queries": [
    {
      "metric": "demo.mf",
      "tags": {
        "sensor": "IOTE_8859_0001",
        "city": "hangzhou",
        "province": "zhejiang",
        "country": "china"
      },
      "fields": ["speed"],
      "hint": {
        "tagk": { "dc": 1 }
      }
    }
  ]
}

Petunjuk cakupan seluruh kueri

{
  "queries": [
    {
      "metric": "demo.mf",
      "tags": {
        "sensor": "IOTE_8859_0001",
        "city": "hangzhou",
        "province": "zhejiang",
        "country": "china"
      },
      "fields": ["speed"]
    }
  ],
  "hint": {
    "tagk": { "dc": 1 }
  }
}

Error: mencampur 0 dan 1 dalam petunjuk yang sama

{
  "start": 1346846400,
  "end": 1346846400,
  "queries": [
    {
      "aggregator": "none",
      "metric": "sys.cpu.nice",
      "tags": {
        "dc": "lga",
        "host": "web01"
      }
    }
  ],
  "hint": {
    "tagk": {
      "dc": 1,
      "host": 0
    }
  }
}

Mengembalikan:

{
  "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=[])"
  }
}

Error: nilai petunjuk tidak valid

{
  "start": 1346846400,
  "end": 1346846400,
  "queries": [
    {
      "aggregator": "none",
      "metric": "sys.cpu.nice",
      "tags": {
        "dc": "lga",
        "host": "web01"
      }
    }
  ],
  "hint": {
    "tagk": {
      "dc": 100
    }
  }
}

Mengembalikan:

{
  "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=[])"
  }
}