---
title: Kanal Koşulları - Akıllı Bildirim Filtreleme
sidebarTitle: Koşullar
description: "Echobell bildirimlerini koşullu ifadelerle filtreleyin: operatörler, zamana dayalı kurallar ve uyarı yorgunluğunu azaltmak için en iyi uygulamalar."
---

# Kanal Koşulları

Kanal koşulları, bildirimlerin ne zaman gönderileceğini belirleyen güçlü ifadelerdir. Kanalınıza koşullar tanımlayarak bildirimleri değişkenlerin veya HTTP başlıklarının içeriğine göre filtreleyebilir, abonelerin yalnızca kendileriyle ilgili uyarıları almasını sağlayabilirsiniz. Bu, uyarı yorgunluğunu azaltmak ve bildirim sisteminizde yüksek bir sinyal/gürültü oranını korumak için hayati önemdedir.

Koşulları bildirimlerinizin kapı bekçisi gibi düşünün: gelen tetikleyici verisini değerlendirir ve yalnızca belirli ölçütler karşılandığında bildirimlerin geçmesine izin verirler.

## Koşulları Anlamak

Koşullar, `true` ya da `false` olarak değerlendirilen ifadelerdir. Bir kanal tetiklendiğinde:

- Koşullar **tanımlı değilse** (boşsa), bildirimler tüm abonelere gönderilir.
- Koşullar **tanımlıysa**, bildirimler yalnızca ifade `true` olarak değerlendirildiğinde gönderilir.

## Koşul Yazma

Koşullar, şablonlarda kullanılan `{{}}` sarmalayıcıları olmadan ifade olarak yazılır. Örneğin:

```
status == "active"
```

Bu koşul, yalnızca `status` değişkeni "active" değerine eşit olduğunda bildirim gönderilmesine izin verir.

## Yaygın Kullanım Senaryoları

Koşulları nasıl kullanabileceğinize dair bazı pratik örnekler:

### Temel Değişken Kontrolleri

```
amount > 100
```

Yalnızca "amount" değişkeni 100'den büyük olduğunda bildir.

```
message != ""
```

Yalnızca "message" değişkeni boş olmadığında bildir.

```
isUrgent == true
```

Yalnızca "isUrgent" değişkeni true olduğunda bildir.

### HTTP Başlıklarını Kontrol Etme

HTTP başlıklarına özel `header` değişkeniyle erişebilirsiniz:

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

Yalnızca özel bir kaynak başlığı tam olarak "grafana" ile eşleştiğinde bildir.

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

Yalnızca içerik türü JSON olduğunda bildir.

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

Yalnızca özel bir öncelik başlığı "high" olarak ayarlandığında bildir.

<Callout type="info">Başlıklardaki tüm anahtarlar küçük harflidir.</Callout>

### Karmaşık Koşullar

Birden çok koşulu mantıksal operatörlerle birleştirebilirsiniz:

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

Yalnızca sıcaklık 30'u ya da basınç 100'ü aştığında ve durum "monitoring" olduğunda bildir.

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

Yalnızca üretim ortamındaki kritik veya yüksek seviyeli hatalar için bildir.

## Desteklenen Operatörler

Koşul ifadelerinde şu operatörler desteklenir:

| Operatör                  | Açıklama                 | Örnek                                       |
| ------------------------- | ------------------------ | ------------------------------------------- |
| `==`                      | Eşittir                  | `status == "active"`                        |
| `!=`                      | Eşit değildir            | `status != "inactive"`                      |
| `!`                       | Mantıksal DEĞİL          | `!isCompleted`                              |
| `<`                       | Küçüktür                 | `count < 10`                                |
| `>`                       | Büyüktür                 | `price > 99.99`                             |
| `<=`                      | Küçük veya eşittir       | `battery <= 20`                             |
| `>=`                      | Büyük veya eşittir       | `confidence >= 0.95`                        |
| `&&`                      | Mantıksal VE             | `isAdmin && isActive`                       |
| <code>&#124;&#124;</code> | Mantıksal VEYA           | <code>isError &#124;&#124; isWarning</code> |

## Koşul Değişkenleri

Bir kanal webhook ile tetiklendiğinde şunlara erişebilirsiniz:

1. URL'deki **sorgu parametreleri**
2. POST isteklerinden gelen **JSON gövdesi**
3. `header` nesnesi üzerinden **HTTP başlıkları**

E-posta tetikleyicileri için şunlara erişebilirsiniz:

- `from`: E-postayı gönderenin adresi
- `to`: Alıcının adresi
- `subject`: E-postanın konu satırı
- `text`: Düz metin gövde içeriği
- `html`: HTML gövde içeriği

### Sistem Zamanı Değişkenleri (UTC)

Bu salt okunur değişkenler hem koşullarda hem de şablonlarda her zaman kullanılabilir. Tüm değerler UTC olarak hesaplanır.

Aşağıdaki değerler doğrudan (düz olarak) enjekte edilir ve adlarıyla kullanılabilir:

- `year`: 4 haneli yıl (sayı)
- `month`: Ay numarası `1–12`
- `dayOfMonth`: Ayın günü `1–31`
- `dayOfWeek`: Haftanın günü `0–6` (Pazar = 0)
- `hour`: Günün saati `0–23`
- `minute`: Dakika `0–59`
- `second`: Saniye `0–59`
- `date`: `YYYY-MM-DD` metni
- `time`: `HH:mm:ss` metni
- `iso`: Geçerli zaman, ISO‑8601 metni olarak (örneğin `2025-05-06T12:34:56.789Z`)

Ek değerler **yalnızca** `sys.` ad alanı altında kullanılabilir (düz adlar olarak enjekte edilmezler):

- `sys.timezone`: Sabit `"UTC"` metni
- `sys.now`: Geçerli zaman, ISO‑8601 metni olarak (`iso` ile aynı değer)
- `sys.epochMs`: Unix epoch'tan bu yana geçen milisaniye (sayı)
- `sys.epochSeconds`: Unix epoch'tan bu yana geçen saniye (sayı)
- `sys.monthName`: Ay adı `January–December`
- `sys.dayOfWeekName`: Gün adı `Sunday–Saturday`

`sys.` ad alanı ayrıca tüm düz değerleri de yansıtır (örneğin `sys.year`, `sys.hour`).

Örnekler:

```
// Weekdays during 09:00–17:00 UTC
hour >= 9 && hour < 17 && dayOfWeek >= 1 && dayOfWeek <= 5

// Weekends only
dayOfWeek == 0 || dayOfWeek == 6

// First day of month at top of hour
dayOfMonth == 1 && minute == 0
```

## En İyi Uygulamalar

### Basit Başlayın
Temel koşullarla başlayın ve gerektikçe karmaşıklık ekleyin:

**1. Aşama:** Tek koşullarla başlayın
```
temperature > 30
```

**2. Aşama:** Mantıksal operatörler ekleyin
```
temperature > 30 && location == "server-room"
```

**3. Aşama:** İç içe mantık ekleyin
```
(temperature > 30 || humidity > 80) && location == "server-room" && status == "monitoring"
```

### İyice Test Edin
Koşullarınızın beklendiği gibi çalıştığından emin olmak için onları çeşitli girdilerle test edin:

1. **Normal değerlerle test edin** - Koşulların beklenen senaryolarda çalıştığını doğrulayın
2. **Sınır durumlarını test edin** - Tam olarak eşik değerinde ne olur?
3. **Eksik değişkenlerle test edin** - Koşul, olmayan veriyi nasıl ele alıyor?
4. **Beklenmedik türlerle test edin** - Bir sayı metin olarak gönderilirse ne olur?
5. **Test webhook'ları kullanın** - Farklı veri birleşimleriyle test tetiklemeleri gönderin

### Koşullarınızı Belgeleyin
Karmaşık koşulları açıklamak için kanalınızın not alanına açıklamalar ekleyin:

```
Channel Note:
Condition: (cpu > 80 && memory > 90) || diskSpace < 10

This condition triggers alerts when:
- Both CPU is above 80% AND memory is above 90%
- OR when disk space drops below 10GB
```

Bu, ekip üyelerinin ifadeyi çözümlemek zorunda kalmadan uyarı mantığını anlamasına yardımcı olur.

### Sınır Durumlarını Göz Önünde Bulundurun
Eksik değişkenleri veya beklenmedik değerleri hesaba katın:

- **Eksik değişkenler**: Tanımsız değişkenler boş/false olarak değerlendirilir; mantığınızın bunu ele aldığından emin olun
- **Sayısal karşılaştırmalar**: `<`, `>`, `<=` ve `>=` operatörleri **her iki** işleneni de `Number()` ile dönüştürür, yani sözlüksel değil sayısal karşılaştırma yaparlar. `"100" > "20"` ifadesi sözlük sırasına göre değil, `true` sonucunu verir (100 > 20).
- **Sayısal olmayan değerler**: Bir `<`, `>`, `<=` veya `>=` karşılaştırmasının herhangi bir tarafı sayı değilse `Number()` sonucu `NaN` olur ve karşılaştırma her zaman `false` döner.
- **Eşitlik ve karşılaştırma**: `==` ve `!=` gevşek eşitlik kullanır (bu nedenle `count == "5"` ifadesi 5 sayısıyla eşleşir), sıralama operatörleri ise her zaman sayı olarak karşılaştırır.
- **Büyük/küçük harf duyarlılığı**: `status == "Active"` ile `status == "active"` farklıdır

### Uyarı Fırtınalarını Önleyin
Geçici sorunlar için arka arkaya bildirim gönderilmesini engellemek üzere koşulları kullanın:

```
errorCount > 5    # Not just errorCount > 0
cpuUsage > 90     # Not cpuUsage > 50
failureRate > 0.1 # Not just hasFailures
```

Kritik olayları kaçırmadan gürültüyü azaltmak için bunları uygun eşiklerle birleştirin.

### Mesai Saatleri Filtresi Kullanın
Önem derecesini zamana dayalı koşullarla birleştirin:

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

Bu, kritik uyarıları 7/24 gönderir; yüksek öncelikli uyarıları ise yalnızca mesai saatlerinde iletir.

### Başlık Kontrollerinden Yararlanın
Spam'i veya yetkisiz tetiklemeleri önlemek için webhook kaynaklarını doğrulayın:

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

Bu, isteğin kaynağını denetleyerek bir güvenlik katmanı ekler.

## Gerçek Hayattan Örnekler

### Sunucu İzleme - Kademeli Uyarılar
```
# Only alert when CPU is consistently high, not transient spikes
cpu > 80 && duration >= 300
```

### E-ticaret - Yüksek Tutarlı Siparişler
```
# Only notify for orders above $500 or fraud-flagged orders
orderAmount > 500 || isFraudSuspected == true
```

### Geliştirme - Kritik Derleme Hataları
```
# Alert only for main branch failures or failed deployments
(branch == "main" || branch == "master") && status == "failed"
```

### IoT - Ortam İzleme
```
# Temperature extremes outside acceptable range
temperature < 15 || temperature > 28
```

### Güvenlik - Başarısız Oturum Açma Denemeleri
```
# Multiple failed logins from same IP in short time
failedAttempts >= 3 && timeSinceFirst < 300
```

### CI/CD - Dağıtım Takibi
```
# Only notify on production deploys or staging failures
(environment == "production") || (environment == "staging" && status == "failed")
```

### Trading - Fiyat Uyarıları
```
# Significant price movements beyond threshold
(priceChange > 5 || priceChange < -5) && volume > 1000000
```

### Destek - SLA İhlalleri
```
# Tickets approaching or exceeding SLA
ticketAge > slaThreshold || priority == "urgent"
```

## Yaygın Koşul Desenleri

### Eşiğe Dayalı Uyarı
```
value > threshold
percentage >= 90
count < minimumRequired
```

### Duruma Dayalı Filtreleme
```
status == "error" || status == "critical"
state != "healthy"
isActive == true
```

### Zaman Aralığına Göre Filtreleme
```
# Business hours only (9 AM - 5 PM UTC, Monday-Friday)
hour >= 9 && hour < 17 && dayOfWeek >= 1 && dayOfWeek <= 5

# After hours only
hour < 9 || hour >= 17 || dayOfWeek == 0 || dayOfWeek == 6

# Weekend maintenance windows
(dayOfWeek == 0 || dayOfWeek == 6) && hour >= 2 && hour < 6
```

### Çok Etkenli Koşullar
```
# Combine multiple criteria
severity == "high" && environment == "production" && region == "us-east-1"

# Either critical OR production with high severity
severity == "critical" || (severity == "high" && environment == "production")
```

### Metin Eşleştirme
```
# Exact match (there is no "contains" operator)
status == "error"
errorType == "database"

# String comparison
environment == "production"
username != "test-user"
```

## Koşulları Şablonlarla Birleştirme

Koşullar ve [şablonlar](/docs/template), akıllı ve bağlamsal bildirimler oluşturmak için birlikte çalışır:

**Koşul** (hangi tetiklemelerin bildirim göndereceğini filtreler):
```
temperature > 30 || humidity > 80
```

**Şablon** (bildirim içeriğini biçimlendirir):
```
Title: {{location}} Environment Alert
Body: Temp: {{temperature}}°C, Humidity: {{humidity}}%
```

Bu ayrım şunları yapmanızı sağlar:
1. İstenmeyen bildirimleri koşullarla **filtreleyin**
2. Önemli bildirimleri şablonlarla **biçimlendirin**
3. Bildirim içeriğini önem derecesine göre **uyarlayın**

[Şablon sözdizimi ve özellikleri](/docs/template) hakkında daha fazla bilgi edinin.

## Koşullarda Hata Ayıklama

Koşullar beklendiği gibi çalışmıyorsa:

1. **Koşulu basitleştirin** - Her seferinde tek bir karşılaştırmayla test edin
2. **Değişken adlarını kontrol edin** - Tam olarak eşleştiklerinden emin olun (büyük/küçük harfe duyarlı)
3. **Veri türlerini doğrulayın** - Değişken türlerini onaylamak için test webhook'ları kullanın
4. **Boolean mantığını test edin** - Karmaşık koşulları daha küçük parçalara bölün
5. **Operatör önceliğini gözden geçirin** - Amacınızı netleştirmek için parantez kullanın
6. **Yazım hatalarını kontrol edin** - `header["Content-Type"]` değil `header["content-type"]`

## İlgili Dokümantasyon

- **[Şablon Kılavuzu](/docs/template)** - Bildirim içeriğini değişkenlerle biçimlendirin
- **[Webhook Entegrasyonu](/docs/webhook)** - Değişkenleri HTTP istekleriyle aktarın
- **[E-posta Tetikleyicileri](/docs/email-trigger)** - E-posta tetikleyicilerinden gelen değişkenler
- **[Başlarken](/docs)** - Koşullu ilk kanalınızı kurun

## Sonraki Adımlar

Artık koşulları anladığınıza göre:

- **[Akıllı izleme uyarıları oluşturun](/docs/developer/grafana)** - Altyapı uyarılarını filtreleyin
- **[CI/CD bildirimlerini kurun](/docs/developer/github)** - Yalnızca önemli derleme olaylarında uyarı alın
- **[Zamana dayalı uyarıları yapılandırın](/blog/time-window-notifications-using-utc-conditions)** - Mesai saatleri filtresi
- **[Tüm özellikleri keşfedin](/docs/features)** - Echobell'in başka neler yapabildiğini görün

---

Koşulları etkili biçimde kullanarak bildirim gürültüsünü azaltabilir ve abonelerin yalnızca kendileriyle ilgili ve eyleme geçirilebilir uyarıları almasını sağlayabilirsiniz. Basit koşullarla başlayın ve ihtiyaçlarınız geliştikçe kademeli olarak daha gelişmiş filtreleme mantığı kurun.
