---
title: Kondisi Saluran - Penyaringan Notifikasi yang Cerdas
sidebarTitle: Kondisi
description: "Saring notifikasi Echobell dengan ekspresi kondisional: operator, aturan berbasis waktu, dan praktik terbaik untuk menekan kelelahan peringatan."
---

# Kondisi Saluran

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`.

## Menulis Kondisi

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".

<Callout type="info">Semua kunci di header ditulis dengan huruf kecil.</Callout>

### 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:

| Operator                  | Deskripsi                | Contoh                                      |
| ------------------------- | ------------------------ | ------------------------------------------- |
| `==`                      | Sama dengan              | `status == "active"`                        |
| `!=`                      | Tidak sama dengan        | `status != "inactive"`                      |
| `!`                       | NOT logika               | `!isCompleted`                              |
| `<`                       | Kurang dari              | `count < 10`                                |
| `>`                       | Lebih dari               | `price > 99.99`                             |
| `<=`                      | Kurang dari atau sama    | `battery <= 20`                             |
| `>=`                      | Lebih dari atau sama     | `confidence >= 0.95`                        |
| `&&`                      | AND logika               | `isAdmin && isActive`                       |
| <code>&#124;&#124;</code> | OR logika                | <code>isError &#124;&#124; isWarning</code> |

## 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](/docs/template) 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](/docs/template).

## 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

- **[Panduan Templat](/docs/template)** - Format isi notifikasi memakai variabel
- **[Integrasi Webhook](/docs/webhook)** - Kirim variabel lewat permintaan HTTP
- **[Pemicu Email](/docs/email-trigger)** - Variabel dari pemicu email
- **[Panduan Memulai](/docs)** - Siapkan saluran berkondisi pertama Anda

## Langkah Berikutnya

Setelah Anda memahami kondisi:

- **[Buat peringatan pemantauan yang cerdas](/docs/developer/grafana)** - Saring peringatan infrastruktur
- **[Siapkan notifikasi CI/CD](/docs/developer/github)** - Beri peringatan hanya untuk peristiwa build yang penting
- **[Konfigurasikan peringatan berbasis waktu](/blog/time-window-notifications-using-utc-conditions)** - Penyaringan jam kerja
- **[Jelajahi semua fitur](/docs/features)** - Temukan apa lagi yang bisa dilakukan Echobell

---

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.
