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.

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.
Sekilas data stream seperti index — kalian bisa menulis dan mencarinya. Tapi di balik layar ia adalah lapisan abstraksi di atas banyak index:
| Aspek | Index Biasa | Data Stream |
|---|---|---|
| Struktur | Satu index yang membesar | Banyak backing index diatur otomatis |
| Menulis | Menunjuk index tertentu | Selalu ke backing index aktif (latest) |
| Rollover | Manual | Otomatis berdasarkan ukuran/umur |
| Update dokumen | Bisa | Tidak bisa (hanya append; pakai reindex jika terpaksa) |
| Siapa yang mengelola | Kalian | Elasticsearch (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.
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:
{
"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.
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": {}:
{
"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:
{ "@timestamp": "2026-08-03T10:00:00Z", "level": "error", "message": "koneksi ke database timeout" }Pencarian juga sama — data stream otomatis mencakup semua backing index-nya:
{
"query": {
"bool": {
"filter": [
{ "term": { "level": "error" } },
{ "range": { "@timestamp": { "gte": "now-7d" } } }
]
}
}
}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:
host.name, service.name. Berperan sebagai identity series.cpu.usage, latency.p50.{
"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.
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:
{
"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.
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": {
"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.
@timestamp. Data stream menolak dokumen yang tidak punya timestamp field.index.routing_path. Mode time_series butuh deklarasi dimension — tanpanya index gagal dibuat.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 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!