全部产品
Search
文档中心

Elasticsearch:Memulai manajemen data deret waktu Elasticsearch menggunakan plug-in aliyun-timestream

更新时间:Mar 26, 2026

Plug-in aliyun-timestream, yang dikembangkan oleh tim Alibaba Cloud Elasticsearch, memungkinkan Anda mengelola indeks deret waktu melalui API khusus—tanpa perlu menulis kueri bahasa domain-spesifik (DSL) yang kompleks. Gunakan PromQL untuk mengkueri data metrik yang disimpan di kluster Anda, dan manfaatkan praktik terbaik bawaan Elasticsearch untuk penyimpanan deret waktu guna mengurangi penggunaan disk.

Untuk ikhtisar lengkap plug-in ini, lihat Ikhtisar aliyun-timestream. Untuk referensi API lengkap dan integrasi Prometheus, lihat Ikhtisar API yang didukung oleh aliyun-timestream dan Integrasikan aliyun-timestream dengan API Prometheus.

Kapan menggunakan aliyun-timestream

Gunakan plug-in aliyun-timestream jika data Anda memenuhi semua kriteria berikut:

  • Data terdiri dari pengukuran metrik dengan timestamp (misalnya, penggunaan CPU, memori, I/O disk, dan sejenisnya)

  • Data ditulis hampir secara real-time dan kira-kira dalam urutan @timestamp

  • Setiap titik data diidentifikasi oleh serangkaian bidang dimensi (label seperti clusterId, nodeId, namespace)

  • Anda berencana mengkueri data menggunakan PromQL atau agregasi Elasticsearch

Indeks deret waktu yang dibuat melalui aliyun-timestream dibangun di atas data stream Elasticsearch, dengan konfigurasi otomatis untuk index.mode: time_series, plug-in kompresi indeks aliyun-codec, dan routing berbasis dimensi. Ini berbeda dari indeks atau data stream biasa dalam beberapa aspek utama:

  • Indeks pendukung berbatas waktu: Data dari jendela waktu yang sama dirutekan ke indeks pendukung yang sama, berdasarkan index.time_series.start_time dan index.time_series.end_time.

  • Routing berbasis dimensi: Semua titik data yang memiliki nilai dimensi yang sama disimpan pada shard yang sama, diidentifikasi oleh bidang internal _tsid. Hal ini meningkatkan kompresi dan kinerja kueri.

  • Penyimpanan bidang metrik: Bidang metrik hanya menyimpan doc values dan tidak menyimpan data indeks terbalik, sehingga mengurangi penggunaan disk.

  • Dukungan PromQL: Kueri data metrik menggunakan PromQL melalui API kompatibel Prometheus dari plug-in, bukan DSL.

Prasyarat

Sebelum memulai, pastikan Anda memiliki:

  • Kluster Alibaba Cloud Elasticsearch Edisi Standar yang memenuhi salah satu persyaratan versi berikut:

    • Versi kluster V7.16 atau lebih baru, dan versi kernel V1.7.0 atau lebih baru

    • Versi kluster V7.10, dan versi kernel V1.8.0 atau lebih baru

Untuk instruksi membuat kluster, lihat Buat kluster Alibaba Cloud Elasticsearch.

Kelola indeks deret waktu

Buat indeks deret waktu

Buat indeks deret waktu bernama test_stream:

PUT _time_stream/test_stream

Ini akan membuat data stream Elasticsearch (bukan indeks mandiri), beserta templat indeks bernama .timestream_test_stream yang telah dikonfigurasi sebelumnya dengan pengaturan berikut:

PengaturanNilaiEfek
index.modetime_seriesMengaktifkan mode deret waktu dengan praktik terbaik bawaan Elasticsearch untuk penyimpanan deret waktu
index.codecaliMengaktifkan plug-in kompresi indeks aliyun-codec
index.ali_codec_service.enabledtrueMengaktifkan kompresi indeks
index.doc_value.compression.defaultzstdMengompresi data berorientasi kolom (doc values) menggunakan algoritma zstd
index.postings.compressionzstdMengompresi data indeks terbalik menggunakan zstd
index.ali_codec_service.source_reuse_doc_values.enabledtrueMengaktifkan penggunaan ulang source dari doc values untuk mengurangi penyimpanan
index.source.compressionzstdMengompresi data berorientasi baris (source) menggunakan zstd
index.translog.durabilityASYNCMengurangi latensi tulis dengan menggunakan penulisan translog asinkron
index.refresh_interval10sMengelompokkan penyegaran indeks untuk meningkatkan throughput tulis
index.routing_pathlabels.*Merutekan dokumen ke shard berdasarkan bidang label

Templat indeks juga telah dikonfigurasi sebelumnya untuk pemetaan dua kategori bidang:

  • Bidang dimensi (labels.*): Dipetakan sebagai keyword dengan time_series_dimension: true. Semua bidang dimensi digabungkan ke dalam bidang internal _tsid, yang secara unik mengidentifikasi setiap deret waktu.

  • Bidang metrik (metrics.*): Dipetakan sebagai double atau long dengan "index": false. Hanya doc values yang disimpan—tidak ada data indeks terbalik.

Lihat konfigurasi lengkap test_stream:

GET _time_stream/test_stream

Sesuaikan templat indeks

Kirimkan badan template saat membuat indeks untuk mengganti pengaturan default. Contoh berikut menunjukkan penyesuaian umum:

  • Tentukan jumlah shard primary:

    PUT _time_stream/test_stream
    {
      "template": {
        "settings": {
          "index": {
            "number_of_shards": "2"
          }
        }
      }
    }
  • Sesuaikan model data (konvensi penamaan bidang):

    PUT _time_stream/test_stream
    {
      "template": {
        "settings": {
          "index": {
            "number_of_shards": "2"
          }
        }
      },
      "time_stream": {
        "labels_fields": ["labels_*"],
        "metrics_fields": ["metrics_*"]
      }
    }

Perbarui indeks deret waktu

Perbarui jumlah shard primary untuk test_stream:

POST _time_stream/test_stream/_update
{
  "template": {
    "settings": {
      "index": {
        "number_of_shards": "4"
      }
    }
  }
}
Penting

Sertakan semua konfigurasi yang ada dalam badan permintaan pembaruan, bukan hanya bidang yang ingin diubah. Menghilangkan suatu bidang akan mengembalikannya ke nilai default. Jalankan GET _time_stream/test_stream terlebih dahulu untuk mengambil konfigurasi lengkap saat ini, lalu modifikasi bidang yang diperlukan.

Setelah diperbarui, pengaturan baru tidak berlaku untuk indeks pendukung saat ini. Lakukan rollover pada indeks untuk menerapkannya:

POST test_stream/_rollover

Indeks pendukung baru dibuat dengan pengaturan yang diperbarui. Indeks pendukung asli tetap mempertahankan pengaturan sebelumnya.

Hapus indeks deret waktu

Hapus test_stream dan semua datanya:

DELETE _time_stream/test_stream
Catatan

Operasi ini akan menghapus semua data dan konfigurasi indeks secara permanen serta tidak dapat dikembalikan.

Tulis dan kueri data deret waktu

Indeks deret waktu digunakan dengan cara yang sama seperti indeks Elasticsearch biasa untuk penulisan data dan kueri dasar.

Tulis data

Gunakan API bulk atau index untuk menulis dokumen. Setiap dokumen harus menyertakan bidang @timestamp yang diatur ke waktu pengukuran dilakukan.

POST test_stream/_doc
{
  "@timestamp": 1630465208722,
  "metrics": {
    "cpu.idle": 79.67298116109929,
    "disk_ioutil": 17.630910821570456,
    "mem.free": 75.79973639970004
  },
  "labels": {
    "disk_type": "disk_type2",
    "namespace": "namespaces1",
    "clusterId": "clusterId3",
    "nodeId": "nodeId5"
  }
}

Cara kerja routing berbasis waktu

Setiap indeks pendukung dalam data stream memiliki rentang waktu yang ditentukan oleh index.time_series.start_time dan index.time_series.end_time. Dokumen ditulis ke indeks pendukung yang rentang waktunya mencakup nilai @timestamp dokumen tersebut.

Data stream mengelola rentang waktu ini secara otomatis. Setelah rollover, indeks pendukung baru mengambil alih dari waktu akhir indeks sebelumnya, sehingga semua indeks pendukung bersama-sama mencakup rentang waktu kontinu tanpa celah.

Diagram
Catatan

Batasan rentang waktu dalam UTC. Jika aplikasi Anda berjalan di UTC+8, lakukan konversi yang sesuai: misalnya, 2022-06-21T00:00:00.000Z (UTC) sesuai dengan 2022-06-21T08:00:00.000 di UTC+8.

Kueri data

Cari semua dokumen dalam test_stream:

GET test_stream/_search

Lihat detail indeks:

GET _cat/indices/test_stream?v&s=i

Lihat statistik indeks

Dapatkan statistik untuk test_stream, termasuk jumlah deret waktu yang dilacak per shard:

GET _time_stream/test_stream/_stats

Contoh respons:

{
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "time_stream_count" : 1,
  "indices_count" : 1,
  "total_store_size_bytes" : 19132,
  "time_streams" : [
    {
      "time_stream" : "test_stream",
      "indices_count" : 1,
      "store_size_bytes" : 19132,
      "tsid_count" : 2
    }
  ]
}

Metrik time_stream_count menghitung jumlah deret waktu unik per shard primary dengan membaca doc values bidang _tsid. Ini merupakan operasi yang relatif mahal. Untuk mengurangi biaya:

  • Untuk indeks read-only, konfigurasikan kebijakan caching sehingga penghitungan hanya dilakukan sekali dan tidak diperbarui lagi.

  • Untuk indeks aktif, cache diperbarui setiap 5 menit secara default. Sesuaikan interval ini dengan parameter index.time_series.stats.refresh_interval. Nilai minimum adalah 1 menit.

Gunakan API Prometheus untuk mengkueri data

Plug-in aliyun-timestream menyediakan antarmuka kueri kompatibel Prometheus di /_time_stream/prom/{index_name}. Gunakan ini untuk mengintegrasikan dengan Grafana atau tool kompatibel Prometheus lainnya.

Konfigurasikan sumber data Prometheus

Opsi 1: Konsol Grafana

Di konsol Grafana, tambahkan sumber data Prometheus dan atur URL ke /_time_stream/prom/test_stream. Indeks deret waktu kemudian tersedia sebagai sumber data Prometheus secara langsung.

Configure a data source in the Grafana console

Opsi 2: Awalan dan akhiran bidang kustom

Saat mengkueri melalui API Prometheus, plug-in secara default menghapus awalan metrics. dari bidang metrik dan awalan labels. dari bidang dimensi.

Jika Anda membuat indeks dengan model data kustom (awalan bidang non-default), konfigurasikan pemetaan awalan dan akhiran secara eksplisit:

PUT _time_stream/{name}
{
  "time_stream": {
    "labels_fields": "@labels.*_l",
    "metrics_fields": "@metrics.*_m",
    "label_prefix": "@labels.",
    "label_suffix": "_l",
    "metric_prefix": "@metrics.",
    "metric_suffix": "_m"
  }
}

Kueri metadata

Lihat semua bidang metrik dalam test_stream:

GET /_time_stream/prom/test_stream/metadata

Contoh respons:

{
  "status" : "success",
  "data" : {
    "cpu.idle" : [
      {
        "type" : "gauge",
        "help" : "",
        "unit" : ""
      }
    ],
    "disk_ioutil" : [
      {
        "type" : "gauge",
        "help" : "",
        "unit" : ""
      }
    ],
    "mem.free" : [
      {
        "type" : "gauge",
        "help" : "",
        "unit" : ""
      }
    ]
  }
}

Lihat semua bidang dimensi dalam test_stream:

GET /_time_stream/prom/test_stream/labels

Contoh respons:

{
  "status" : "success",
  "data" : [
    "__name__",
    "clusterId",
    "disk_type",
    "namespace",
    "nodeId"
  ]
}

Lihat semua nilai untuk bidang dimensi tertentu:

GET /_time_stream/prom/test_stream/label/clusterId/values

Contoh respons:

{
  "status" : "success",
  "data" : [
    "clusterId1",
    "clusterId3"
  ]
}

Lihat semua deret waktu untuk metrik cpu.idle:

GET /_time_stream/prom/test_stream/series?match[]=cpu.idle

Contoh respons:

{
  "status" : "success",
  "data" : [
    {
      "__name__" : "cpu.idle",
      "disk_type" : "disk_type1",
      "namespace" : "namespaces2",
      "clusterId" : "clusterId1",
      "nodeId" : "nodeId2"
    },
    {
      "__name__" : "cpu.idle",
      "disk_type" : "disk_type1",
      "namespace" : "namespaces2",
      "clusterId" : "clusterId1",
      "nodeId" : "nodeId5"
    },
    {
      "__name__" : "cpu.idle",
      "disk_type" : "disk_type2",
      "namespace" : "namespaces1",
      "clusterId" : "clusterId3",
      "nodeId" : "nodeId5"
    }
  ]
}

Kueri data dengan PromQL

Gunakan API kueri instan dan kueri rentang Prometheus untuk menjalankan kueri PromQL terhadap indeks deret waktu Anda. Untuk detail sintaks PromQL yang didukung, lihat Dukungan aliyun-timestream untuk PromQL.

Kueri instan

GET /_time_stream/prom/test_stream/query?query=cpu.idle&time=1655769837

Parameter time dalam satuan detik Unix. Jika dihilangkan, kueri akan mengembalikan data dari 5 menit sebelumnya.

Contoh respons:

{
  "status" : "success",
  "data" : {
    "resultType" : "vector",
    "result" : [
      {
        "metric" : {
          "__name__" : "cpu.idle",
          "clusterId" : "clusterId1",
          "disk_type" : "disk_type1",
          "namespace" : "namespaces2",
          "nodeId" : "nodeId2"
        },
        "value" : [
          1655769837,
          "79.672981161"
        ]
      },
      {
        "metric" : {
          "__name__" : "cpu.idle",
          "clusterId" : "clusterId1",
          "disk_type" : "disk_type1",
          "namespace" : "namespaces2",
          "nodeId" : "nodeId5"
        },
        "value" : [
          1655769837,
          "79.672981161"
        ]
      },
      {
        "metric" : {
          "__name__" : "cpu.idle",
          "clusterId" : "clusterId3",
          "disk_type" : "disk_type2",
          "namespace" : "namespaces1",
          "nodeId" : "nodeId5"
        },
        "value" : [
          1655769837,
          "79.672981161"
        ]
      }
    ]
  }
}

Kueri rentang

GET /_time_stream/prom/test_stream/query_range?query=cpu.idle&start=1655769800&end=16557699860&step=1m

Contoh respons:

{
  "status" : "success",
  "data" : {
    "resultType" : "matrix",
    "result" : [
      {
        "metric" : {
          "__name__" : "cpu.idle",
          "clusterId" : "clusterId1",
          "disk_type" : "disk_type1",
          "namespace" : "namespaces2",
          "nodeId" : "nodeId2"
        },
        "value" : [
          [
            1655769860,
            "79.672981161"
          ]
        ]
      },
      {
        "metric" : {
          "__name__" : "cpu.idle",
          "clusterId" : "clusterId1",
          "disk_type" : "disk_type1",
          "namespace" : "namespaces2",
          "nodeId" : "nodeId5"
        },
        "value" : [
          [
            1655769860,
            "79.672981161"
          ]
        ]
      },
      {
        "metric" : {
          "__name__" : "cpu.idle",
          "clusterId" : "clusterId3",
          "disk_type" : "disk_type2",
          "namespace" : "namespaces1",
          "nodeId" : "nodeId5"
        },
        "value" : [
          [
            1655769860,
            "79.672981161"
          ]
        ]
      }
    ]
  }
}

Konfigurasikan downsampling

Downsampling mengurangi resolusi data deret waktu lama untuk mempercepat kueri pada rentang waktu besar. Plug-in secara otomatis memilih indeks downsampling yang paling sesuai berdasarkan nilai fixed_interval dalam kueri agregasi Anda.

Konfigurasikan interval downsampling saat membuat indeks deret waktu. Contoh berikut mengonfigurasi tiga interval downsampling: 1 menit, 10 menit, dan 60 menit.

PUT _time_stream/test_stream
{
  "time_stream": {
    "downsample": [
      {
        "interval": "1m"
      },
      {
        "interval": "10m"
      },
      {
        "interval": "60m"
      }
    ]
  }
}

Setelah data ditulis dan indeks pendukung asli di-rollover, plug-in secara otomatis menghasilkan indeks downsampling dari indeks pendukung asli. Downsampling dimulai ketika waktu saat ini setidaknya dua jam melewati end_time indeks tersebut.

Cara kerja pemilihan indeks otomatis

Saat Anda menjalankan kueri agregasi, berikan nama indeks asli dan tentukan fixed_interval dalam agregasi date_histogram. Plugin memilih indeks downsampling dengan Presisi waktu tertinggi yang masih merupakan kelipatan dari fixed_interval.

Misalnya, jika fixed_interval adalah 120m dan interval downsampling adalah 1m, 10m, dan 60m, plug-in akan mengkueri indeks downsampling 60m.

Query data in downsampling indexes

Contoh kueri menggunakan fixed_interval: 120m:

GET test_stream/_search?size=0&request_cache=false
{
  "aggs": {
    "1": {
      "terms": {
        "field": "labels.disk_type",
        "size": 10
      },
      "aggs": {
        "2": {
          "date_histogram": {
            "field": "@timestamp",
            "fixed_interval": "120m"
          }
        }
      }
    }
  }
}

Contoh respons (mengkueri indeks downsampling 60m):

{
  "took" : 15,
  "timed_out" : false,
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "1" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "disk_type2",
          "doc_count" : 9,
          "2" : {
            "buckets" : [
              {
                "key_as_string" : "2022-06-20T06:00:00.000Z",
                "key" : 1655704800000,
                "doc_count" : 9
              }
            ]
          }
        }
      ]
    }
  }
}

hits.total.value adalah 1, artinya satu catatan hasil downsampling dikembalikan. doc_count sebesar 9 dalam agregasi menunjukkan bahwa 9 titik data asli digabungkan menjadi catatan tersebut, mengonfirmasi bahwa kueri mengenai indeks downsampling, bukan yang asli.

Sebagai perbandingan, mengatur fixed_interval ke 20s akan mengkueri indeks asli dan mengembalikan hits.total.value: 9, sesuai dengan doc_count: 9.

Catatan

Indeks downsampling memiliki pengaturan dan pemetaan yang sama dengan indeks asli, kecuali data diagregasi ke dalam bucket waktu berdasarkan interval yang dikonfigurasi.

Uji downsampling dengan indeks demo

Prosedur berikut mendemonstrasikan siklus hidup downsampling lengkap menggunakan rentang waktu yang dikontrol secara manual. Ini berguna untuk pengujian dan validasi. Di lingkungan produksi, plug-in memicu downsampling secara otomatis setelah rollover.

  1. Buat indeks dengan rentang waktu tetap dan konfigurasi downsampling. Nilai start_time dan end_time mensimulasikan jendela waktu lampau sehingga kondisi pemicu downsampling (waktu saat ini setidaknya dua jam melewati end_time) langsung terpenuhi.

    Penting

    Setelah langkah ini, periksa end_time dengan menjalankan GET {index}/_settings. Sistem menyesuaikan end_time setiap 5 menit secara default. Lanjutkan ke langkah berikutnya sebelum end_time diperbarui.

    PUT _time_stream/test_stream
    {
      "template": {
        "settings": {
          "index.time_series.start_time": "2022-06-20T00:00:00.000Z",
          "index.time_series.end_time": "2022-06-21T00:00:00.000Z"
        }
      },
      "time_stream": {
        "downsample": [
          {
            "interval": "1m"
          },
          {
            "interval": "10m"
          },
          {
            "interval": "60m"
          }
        ]
      }
    }
  2. Tulis dokumen dengan @timestamp diatur ke nilai dalam rentang [start_time, end_time):

    POST test_stream/_doc
    {
      "@timestamp": 1655706106000,
      "metrics": {
        "cpu.idle": 79.67298116109929,
        "disk_ioutil": 17.630910821570456,
        "mem.free": 75.79973639970004
      },
      "labels": {
        "disk_type": "disk_type2",
        "namespace": "namespaces1",
        "clusterId": "clusterId3",
        "nodeId": "nodeId5"
      }
    }
  3. Hapus start_time dan end_time dari indeks, dan pertahankan konfigurasi downsampling:

    POST _time_stream/test_stream/_update
    {
      "time_stream": {
        "downsample": [
          {
            "interval": "1m"
          },
          {
            "interval": "10m"
          },
          {
            "interval": "60m"
          }
        ]
      }
    }
  4. Lakukan rollover pada indeks:

    POST test_stream/_rollover
  5. Setelah rollover selesai, lihat indeks downsampling yang dihasilkan:

    GET _cat/indices/test_stream?v&s=i

    Output yang diharapkan:

    health status index                                          uuid                   pri rep docs.count docs.deleted store.size pri.store.size
    green  open   .ds-test_stream-2022.06.21-000001              vhEwKIlwSGO3ax4RKn****   1   1          9            0     18.5kb         12.1kb
    green  open   .ds-test_stream-2022.06.21-000001_interval_10m r9Tsj0v-SyWJDc64oC****   1   1          1            0     15.8kb          7.9kb
    green  open   .ds-test_stream-2022.06.21-000001_interval_1h  cKsAlMK-T2-luefNAF****   1   1          1            0     15.8kb          7.9kb
    green  open   .ds-test_stream-2022.06.21-000001_interval_1m  L6ocasDFTz-c89KjND****   1   1          1            0     15.8kb          7.9kb
    green  open   .ds-test_stream-2022.06.21-000002              42vlHEFFQrmMAdNdCz****   1   1          0            0       452b           226b

    Tiga indeks downsampling (_interval_1m, _interval_10m, _interval_1h) dibuat bersamaan dengan indeks pendukung baru (000002).

Langkah selanjutnya