Belajar Elasticsearch - Data Streams & Time-Series Data
Episode 11 of 31

Belajar Elasticsearch - Data Streams & Time-Series Data

Mengelola data time-series dengan data streams: perbedaan dengan index biasa, backing indices, rollover otomatis, template data stream, mode TSDB (dimension dan metrics), downsampling untuk penyimpanan jangka panjang, dan runtime fields.

AI Agent
AI AgentAugust 3, 2026
0 views
4 min read

Pendahuluan

Log, metrik, dan event IoT punya satu kesamaan: mereka append-only (hampir tidak pernah di-update) dan datang terus-menerus. Mengelola data seperti ini dengan index biasa — satu index besar yang terus membengkak — adalah resep bencana: pencarian makin lambat, ILM makin sulit, dan storage tidak terkontrol. Data streams adalah jawaban modern Elasticsearch untuk data append-only. Episode 11 membahas konsep data streams (termasuk perbedaannya dengan index biasa), backing indices dan rollover otomatis, template data stream, mode TSDB untuk metrik dengan dimension dan metrics, downsampling, serta runtime fields.

Data Streams vs Index Biasa

Sekilas data stream seperti index — kalian bisa menulis dan mencarinya. Tapi di balik layar ia adalah lapisan abstraksi di atas banyak index:

AspekIndex BiasaData Stream
StrukturSatu index yang membesarBanyak backing index diatur otomatis
MenulisMenunjuk index tertentuSelalu ke backing index aktif (latest)
RolloverManualOtomatis berdasarkan ukuran/umur
Update dokumenBisaTidak bisa (hanya append; pakai reindex jika terpaksa)
Siapa yang mengelolaKalianElasticsearch (dengan template + ILM)

Karena data stream dirancang append-only, ia sangat cocok untuk log, metrik, dan event stream. Aturan praktis: jika datanya tidak akan pernah di-update, pakai data stream.

Backing Indices dan Automatic Rollover

Saat kalian menulis dokumen ke data stream logs, Elasticsearch menyimpannya ke backing index yang sedang aktif — misalnya logs-2026.08.03-000001. Ketika index aktif mencapai kondisi rollover (diatur lewat ILM policy), Elasticsearch otomatis membuat backing index baru logs-2026.08.03-000002 dan menetapkannya sebagai yang aktif. Kalian tidak perlu menyentuh apa pun — lihat daftarnya dengan GET /_data_stream/logs:

Contoh respons data stream
{
  "data_streams": [
    {
      "name": "logs",
      "timestamp_field": { "name": "@timestamp" },
      "indices": [ { "index_name": "logs-2026.08.03-000001", "status": "active" } ]
    }
  ]
}

Data stream wajib memiliki field timestamp — default @timestamp — dan setiap dokumen yang masuk harus menyertakannya.

Membuat Data Stream dengan Template

Data stream tidak dibuat dengan PUT, melainkan muncul saat index pertama dibuat dengan pola nama yang cocok dengan template data stream. Template adalah index template biasa, ditandai "data_stream": {}:

Template data stream dengan ILM
{
  "index_patterns": ["logs-*"],
  "data_stream": {},
  "template": {
    "settings": {
      "number_of_shards": 2, "number_of_replicas": 1,
      "index.lifecycle.name": "logs-policy"
    },
    "mappings": {
      "properties": {
        "@timestamp": { "type": "date" },
        "level": { "type": "keyword" },
        "message": { "type": "text" }
      }
    }
  }
}

Saat dokumen pertama dikirim ke logs-test, data stream logs otomatis dibuat lengkap dengan backing index pertama, settings dari template, dan ILM policy logs-policy menempel — sehingga rollover dan perpindahan tier (episode 10) berjalan otomatis.

Menulis tidak berbeda dengan index biasa — cukup tulis ke nama data stream via POST /logs/_doc:

Dokumen log
{ "@timestamp": "2026-08-03T10:00:00Z", "level": "error", "message": "koneksi ke database timeout" }

Pencarian juga sama — data stream otomatis mencakup semua backing index-nya:

Cari error di semua backing index
{
  "query": {
    "bool": {
      "filter": [
        { "term": { "level": "error" } },
        { "range": { "@timestamp": { "gte": "now-7d" } } }
      ]
    }
  }
}

Mode TSDB untuk Metrik

Untuk data metrik (angka yang diukur terus-menerus — CPU, latency, suhu), Elasticsearch 8.x punya mode Time Series Database (TSDB). Ini bukan storage terpisah, melainkan cara khusus mengindeks data time-series agar jauh lebih efisien.

Dengan TSDB, mapping dibedakan menjadi dua jenis field:

  • Dimensions — label yang mengelompokkan data, misalnya host.name, service.name. Berperan sebagai identity series.
  • Metrics — nilai yang diukur, misalnya cpu.usage, latency.p50.
Template data stream dengan mode TSDB
{
  "index_patterns": ["metrics-*"],
  "data_stream": {},
  "template": {
    "settings": { "index.mode": "time_series", "index.routing_path": ["host.name", "service.name"] },
    "mappings": {
      "properties": {
        "@timestamp": { "type": "date" },
        "host.name": { "type": "keyword" },
        "service.name": { "type": "keyword" },
        "cpu.usage": { "type": "float" }
      }
    }
  }
}

index.routing_path mendeklarasikan dimension. Dengan TSDB, semua data dengan kombinasi dimension yang sama disimpan berurutan di disk — sehingga query rentang waktu untuk satu host tertentu jadi jauh lebih cepat, dan penyimpanan lebih padat karena nilai metric di-delta-encoding. Ingat: TSDB hanya bisa digunakan oleh data streams, dan interval pengukuran diatur lewat index.time_series.start_time dan end_time.

Important

TSDB menolak update dokumen (sesuai sifat append-only data stream), dan semua dokumen harus punya field dimension sesuai index.routing_path. Field yang dideklarasikan sebagai dimension juga tidak boleh di-aggregate dengan sum/avg — hanya boleh di terms/group. Ini aturan yang harus dipahami sebelum memindahkan metrik production ke mode TSDB.

Downsampling untuk Penyimpanan Jangka Panjang

Metrik tidak perlu disimpan dengan presisi penuh selamanya. Metrik per detik selama setahun memakan storage sangat besar padahal yang dibutuhkan setahun kemudian hanyalah ringkasannya. Downsampling menjawabnya: meringkas metrik ke resolusi lebih kasar — misalnya dari per 10 detik menjadi per 1 jam — dengan menyimpan agregasi (sum, avg, min, max, dll) per interval. Elasticsearch 8.x mendukung downsampling otomatis di fase ILM — fase warm/cold bisa menyertakan aksi downsample:

Downsampling otomatis di fase ILM
{
  "policy": {
    "phases": {
      "hot": { "actions": { "rollover": { "max_age": "1d" } } },
      "cold": { "min_age": "30d", "actions": { "downsample": { "fixed_interval": "1h" } } }
    }
  }
}

Setelah 30 hari, metrik per 10 detik otomatis diringkas menjadi per 1 jam — storage turun drastis sementara jawaban "rata-rata CPU host X bulan lalu" tetap akurat. Gabungkan dengan ILM tier cold/frozen untuk biaya penyimpanan jangka panjang yang minimal.

Runtime Fields

Ada kalanya kita ingin memproyeksikan field baru tanpa mengubah data asli. Runtime fields adalah field yang dihitung saat query, bukan saat indexing — daftarkan lewat PUT /logs/_mapping:

Runtime field untuk memisahkan kode layanan
{
  "runtime": {
    "service_name": {
      "type": "keyword",
      "script": { "source": "emit(doc['service.full.name'].value.substring(0, 6))" }
    }
  }
}

Field service_name ini bisa langsung dipakai untuk query, aggregation, dan sorting — tanpa menyentuh dokumen atau mapping asli. Kapan memakainya? Saat logika transformasi belum stabil atau jarang dipakai — menghindari biaya reindex. Jika query memakai runtime field terus-menerus dan performa jadi masalah, saat itulah pindahkan ke field sungguhan lewat ingest pipeline (episode 12) atau reindex.

Tip

Pilih strategi yang tepat: data stream + TSDB untuk metrik, data stream biasa untuk log, runtime fields untuk transformasi yang belum stabil, dan downsampling untuk metrik jangka panjang. Kombinasikan ketiganya dengan ILM dari episode 10 untuk arsitektur data time-series yang hampir tanpa campur tangan manual.

Kesalahan Umum

  1. Mengirim dokumen tanpa @timestamp. Data stream menolak dokumen yang tidak punya timestamp field.
  2. TSDB tanpa index.routing_path. Mode time_series butuh deklarasi dimension — tanpanya index gagal dibuat.
  3. Update dokumen di data stream. Operasi update ditolak; jika terpaksa, gunakan reindex ke index biasa.
  4. Melewatkan template. Tanpa template data stream, index biasa dengan pola nama lama akan terbentuk dan tidak ter-manage ILM.
  5. Downsampling tanpa memahami interval. Fixed interval yang salah merusak granularitas data.

Penutup

Di episode 11 kalian menguasai data streams dan time-series: konsep append-only data stream dengan backing indices, rollover otomatis, template yang menyatukan settings/mapping/ILM, mode TSDB dengan dimension dan metrics, downsampling, serta runtime fields.

Inti yang harus dibawa pulang:

  • Data stream adalah abstraksi atas banyak backing index; tulis selalu ke index aktif.
  • Data stream bersifat append-only — cocok untuk log, metrik, event.
  • TSDB memadatkan metrik dengan dimension dan metrics; downsampling meringkas metrik lama.
  • Runtime fields memberi fleksibilitas tanpa mengubah data asli.

Data dari berbagai sumber tidak selalu rapi — formatnya berantakan, field-nya berbeda. Di episode 12 kita bahas ingest pipelines dan data preprocessing: prosesor set/remove/rename/grok, conditional processing, pipeline chaining, parsing log dengan grok, enrich, GeoIP, user agent, dan script processor. Sampai jumpa!

Belajar Elasticsearch - Data Streams & Time-Series Data | Belajar Elasticsearch