Kondisi Saluran - Penyaringan Notifikasi yang Cerdas

Saring notifikasi Echobell dengan ekspresi kondisional: operator, aturan berbasis waktu, dan praktik terbaik untuk menekan kelelahan peringatan.


Kondisi saluran adalah ekspresi tangguh yang menentukan kapan notifikasi perlu dikirim. Dengan menetapkan kondisi pada saluran Anda, Anda bisa menyaring notifikasi berdasarkan isi variabel atau header HTTP, sehingga pelanggan hanya menerima peringatan yang relevan. Ini penting untuk mengurangi kelelahan akibat peringatan dan menjaga rasio sinyal terhadap derau tetap tinggi di sistem notifikasi Anda.

Anggap kondisi sebagai penjaga gerbang notifikasi Anda - kondisi mengevaluasi data pemicu yang masuk dan hanya meloloskan notifikasi saat kriteria tertentu terpenuhi.

Memahami Kondisi

Kondisi adalah ekspresi yang menghasilkan nilai true atau false. Saat sebuah saluran terpicu:

  • Kalau kondisi tidak disetel (kosong), notifikasi dikirim ke semua pelanggan.
  • Kalau kondisi disetel, notifikasi hanya dikirim saat ekspresinya menghasilkan true.

Kondisi ditulis sebagai ekspresi tanpa pembungkus {{}} yang dipakai di templat. Contohnya:

status == "active"

Kondisi ini hanya akan meloloskan notifikasi saat variabel status bernilai "active".

Kasus Penggunaan Umum

Berikut beberapa contoh praktis pemakaian kondisi:

Pemeriksaan Variabel Dasar

amount > 100

Hanya memberi tahu saat variabel "amount" lebih besar dari 100.

message != ""

Hanya memberi tahu saat variabel "message" tidak kosong.

isUrgent == true

Hanya memberi tahu saat variabel "isUrgent" bernilai true.

Memeriksa Header HTTP

Anda bisa mengakses header HTTP memakai variabel khusus header:

header["x-webhook-source"] == "grafana"

Hanya memberi tahu saat header sumber khusus persis bernilai "grafana".

header["content-type"] == "application/json"

Hanya memberi tahu saat content type-nya JSON.

header["x-priority"] == "high"

Hanya memberi tahu saat header prioritas khusus disetel ke "high".

Semua kunci di header ditulis dengan huruf kecil.

Kondisi Kompleks

Anda bisa menggabungkan beberapa kondisi memakai operator logika:

(temperature > 30 || pressure > 100) && status == "monitoring"

Hanya memberi tahu saat suhu melebihi 30 atau tekanan melebihi 100, dan statusnya "monitoring".

environment == "production" && (errorLevel == "critical" || errorLevel == "high")

Hanya memberi tahu untuk kesalahan tingkat kritis atau tinggi di environment produksi.

Operator yang Didukung

Operator berikut didukung dalam ekspresi kondisi:

OperatorDeskripsiContoh
==Sama denganstatus == "active"
!=Tidak sama denganstatus != "inactive"
!NOT logika!isCompleted
<Kurang daricount < 10
>Lebih dariprice > 99.99
<=Kurang dari atau samabattery <= 20
>=Lebih dari atau samaconfidence >= 0.95
&&AND logikaisAdmin && isActive
||OR logikaisError || isWarning

Variabel Kondisi

Saat sebuah saluran terpicu lewat webhook, Anda bisa mengakses:

  1. Parameter query dari URL
  2. Body JSON dari permintaan POST
  3. Header HTTP lewat objek header

Untuk pemicu email, Anda bisa mengakses:

  • from: Alamat pengirim email
  • to: Alamat penerima
  • subject: Baris subjek email
  • text: Isi email dalam teks biasa
  • html: Isi email dalam HTML

Variabel Waktu Sistem (UTC)

Variabel baca-saja berikut selalu tersedia baik di kondisi maupun templat. Semua nilainya dihitung dalam UTC.

Nilai-nilai berikut disuntikkan langsung (datar) dan bisa dipakai lewat namanya:

  • year: Tahun 4 digit (angka)
  • month: Nomor bulan 1–12
  • dayOfMonth: Tanggal 1–31
  • dayOfWeek: Hari dalam pekan 0–6 (Minggu = 0)
  • hour: Jam 0–23
  • minute: Menit 0–59
  • second: Detik 0–59
  • date: String YYYY-MM-DD
  • time: String HH:mm:ss
  • iso: Waktu saat ini sebagai string ISO‑8601 (misalnya, 2025-05-06T12:34:56.789Z)

Nilai tambahan hanya tersedia di bawah namespace sys. (nilai-nilai ini tidak disuntikkan sebagai nama datar):

  • sys.timezone: String konstan "UTC"
  • sys.now: Waktu saat ini sebagai string ISO‑8601 (nilainya sama dengan iso)
  • sys.epochMs: Milidetik sejak Unix epoch (angka)
  • sys.epochSeconds: Detik sejak Unix epoch (angka)
  • sys.monthName: Nama bulan January–December
  • sys.dayOfWeekName: Nama hari Sunday–Saturday

Namespace sys. juga mencerminkan setiap nilai datar (misalnya sys.year, sys.hour).

Contoh:

// Hari kerja pukul 09.00–17.00 UTC
hour >= 9 && hour < 17 && dayOfWeek >= 1 && dayOfWeek <= 5

// Hanya akhir pekan
dayOfWeek == 0 || dayOfWeek == 6

// Hari pertama tiap bulan tepat di awal jam
dayOfMonth == 1 && minute == 0

Praktik Terbaik

Mulai dari yang Sederhana

Mulailah dengan kondisi dasar lalu tambahkan kerumitannya sesuai kebutuhan:

Tahap 1: Mulai dengan satu kondisi

temperature > 30

Tahap 2: Tambahkan operator logika

temperature > 30 && location == "server-room"

Tahap 3: Tambahkan logika bersarang

(temperature > 30 || humidity > 80) && location == "server-room" && status == "monitoring"

Uji Secara Menyeluruh

Uji kondisi Anda dengan berbagai masukan untuk memastikan semuanya bekerja sesuai harapan:

  1. Uji dengan nilai normal - Pastikan kondisinya bekerja pada skenario yang diharapkan
  2. Uji kasus batas - Apa yang terjadi tepat pada nilai ambang batas?
  3. Uji dengan variabel yang hilang - Bagaimana kondisi itu menangani data yang tidak ada?
  4. Uji dengan tipe yang tak terduga - Bagaimana kalau angka dikirim sebagai string?
  5. Pakai webhook uji coba - Kirim pemicu uji coba dengan berbagai kombinasi data

Dokumentasikan Kondisi Anda

Tambahkan penjelasan di kolom catatan saluran Anda untuk menerangkan kondisi yang rumit:

Catatan Saluran:
Kondisi: (cpu > 80 && memory > 90) || diskSpace < 10

Kondisi ini memicu peringatan saat:
- CPU di atas 80% DAN memori di atas 90%
- ATAU saat ruang disk turun di bawah 10GB

Dengan begitu anggota tim bisa memahami logika peringatannya tanpa harus membedah ekspresinya.

Perhatikan Kasus Batas

Antisipasi variabel yang hilang atau nilai yang tak terduga:

  • Variabel yang hilang: Variabel yang tidak terdefinisi dievaluasi sebagai kosong/false - pastikan logika Anda menanganinya
  • Perbandingan numerik: <, >, <=, dan >= mengonversi kedua operandnya dengan Number(), jadi perbandingannya numerik, bukan leksikal. "100" > "20" bernilai true (100 > 20), bukan mengikuti urutan leksikal.
  • Nilai non-numerik: Kalau salah satu sisi perbandingan <, >, <=, atau >= bukan angka, Number() menghasilkan NaN dan perbandingannya selalu false.
  • Kesamaan vs. perbandingan: == dan != memakai kesamaan longgar (jadi count == "5" cocok dengan angka 5), sedangkan operator pengurutan selalu membandingkan sebagai angka.
  • Peka huruf besar-kecil: status == "Active" berbeda dengan status == "active"

Cegah Badai Peringatan

Gunakan kondisi untuk mencegah notifikasi beruntun akibat masalah sesaat:

errorCount > 5    # Bukan sekadar errorCount > 0
cpuUsage > 90     # Bukan cpuUsage > 50
failureRate > 0.1 # Bukan sekadar hasFailures

Padukan dengan ambang batas yang tepat untuk menekan derau tanpa melewatkan kejadian kritis.

Gunakan Penyaringan Jam Kerja

Padukan tingkat keparahan dengan kondisi berbasis waktu:

severity == "critical" || (severity == "high" && hour >= 9 && hour < 17)

Dengan begitu peringatan kritis dikirim 24/7, sedangkan peringatan berprioritas tinggi hanya pada jam kerja.

Manfaatkan Pemeriksaan Header

Validasi sumber webhook untuk mencegah spam atau pemicu tanpa izin:

header["x-webhook-source"] == "grafana" || header["x-webhook-source"] == "prometheus"

Ini menambah lapisan keamanan dengan memeriksa asal permintaan.

Contoh Dunia Nyata

Pemantauan Server - Peringatan Bertingkat

# Hanya memberi peringatan saat CPU tinggi secara konsisten, bukan lonjakan sesaat
cpu > 80 && duration >= 300

E-commerce - Pesanan Bernilai Tinggi

# Hanya memberi tahu untuk pesanan di atas $500 atau pesanan yang ditandai penipuan
orderAmount > 500 || isFraudSuspected == true

Pengembangan - Kegagalan Build yang Kritis

# Beri peringatan hanya untuk kegagalan di branch main atau deployment yang gagal
(branch == "main" || branch == "master") && status == "failed"

IoT - Pemantauan Lingkungan

# Suhu ekstrem di luar rentang yang dapat diterima
temperature < 15 || temperature > 28

Keamanan - Percobaan Login yang Gagal

# Beberapa login gagal dari IP yang sama dalam waktu singkat
failedAttempts >= 3 && timeSinceFirst < 300

CI/CD - Pelacakan Deployment

# Hanya memberi tahu saat deploy ke produksi atau kegagalan di staging
(environment == "production") || (environment == "staging" && status == "failed")

Trading - Peringatan Harga

# Pergerakan harga signifikan yang melewati ambang batas
(priceChange > 5 || priceChange < -5) && volume > 1000000

Dukungan - Pelanggaran SLA

# Tiket yang mendekati atau melewati SLA
ticketAge > slaThreshold || priority == "urgent"

Pola Kondisi yang Umum

Peringatan Berbasis Ambang Batas

value > threshold
percentage >= 90
count < minimumRequired

Penyaringan Berbasis Status

status == "error" || status == "critical"
state != "healthy"
isActive == true

Penyaringan Berbasis Jendela Waktu

# Hanya jam kerja (09.00 - 17.00 UTC, Senin-Jumat)
hour >= 9 && hour < 17 && dayOfWeek >= 1 && dayOfWeek <= 5

# Hanya di luar jam kerja
hour < 9 || hour >= 17 || dayOfWeek == 0 || dayOfWeek == 6

# Jendela pemeliharaan akhir pekan
(dayOfWeek == 0 || dayOfWeek == 6) && hour >= 2 && hour < 6

Kondisi Multifaktor

# Gabungkan beberapa kriteria
severity == "high" && environment == "production" && region == "us-east-1"

# Kritis ATAU produksi dengan tingkat keparahan tinggi
severity == "critical" || (severity == "high" && environment == "production")

Pencocokan String

# Cocok persis (tidak ada operator "contains")
status == "error"
errorType == "database"

# Perbandingan string
environment == "production"
username != "test-user"

Memadukan Kondisi dengan Templat

Kondisi dan templat bekerja bersama untuk menghasilkan notifikasi yang cerdas dan kontekstual:

Kondisi (menyaring pemicu mana yang mengirim notifikasi):

temperature > 30 || humidity > 80

Templat (memformat isi notifikasi):

Title: {{location}} Environment Alert
Body: Temp: {{temperature}}°C, Humidity: {{humidity}}%

Pemisahan ini memungkinkan Anda:

  1. Menyaring notifikasi yang tidak diinginkan dengan kondisi
  2. Memformat notifikasi penting dengan templat
  3. Menyesuaikan isi notifikasi berdasarkan tingkat keparahannya

Pelajari selengkapnya tentang sintaks dan fitur templat.

Men-debug Kondisi

Kalau kondisi tidak bekerja seperti yang diharapkan:

  1. Sederhanakan kondisinya - Uji satu perbandingan saja lebih dulu
  2. Periksa nama variabel - Pastikan namanya sama persis (peka huruf besar-kecil)
  3. Verifikasi tipe data - Pakai webhook uji coba untuk memastikan tipe variabelnya
  4. Uji logika boolean - Pecah kondisi rumit menjadi bagian-bagian kecil
  5. Tinjau urutan operator - Gunakan tanda kurung untuk memperjelas maksudnya
  6. Periksa salah ketik - header["content-type"], bukan header["Content-Type"]

Dokumentasi Terkait

Langkah Berikutnya

Setelah Anda memahami kondisi:


Dengan memakai kondisi secara efektif, Anda bisa menekan derau notifikasi dan memastikan pelanggan hanya menerima peringatan yang relevan dan bisa ditindaklanjuti. Mulailah dari kondisi sederhana lalu bangun logika penyaringan yang lebih canggih secara bertahap seiring kebutuhan Anda berkembang.