Sentry için telefon araması uyarıları: kritik hatalar

Sentry'de arama eylemi yok. Issue uyarılarını webhook ile yönlendirip yalnızca üretimi bozan hataların telefonunuzu çaldırmasını sağlayın: kurulum ve filtreler.

Güncellendi

İçindekiler

Sentry sizi arayamaz. E-posta gönderebilir, Slack'e yazabilir ya da uyarıyı PagerDuty'ye devredebilir — ama yerleşik bir sesli arama eylemi yoktur. Bir olay yönetimi platformu satın almadan bunu elde etmenin yolu, Sentry issue uyarısını çalan bir webhook'a göndermektir: bir dahili entegrasyon oluşturun, onu bir Echobell arama kanalına yöneltin ve önüne bir filtre koyun ki yalnızca üretimi gerçekten bozan hatalar geçsin.

Bu rehber yolun tamamını kapsıyor: entegrasyon, uyarı kuralı, Sentry'nin gerçekten gönderdiği veri, onu okuyan şablonlar ve insanları vazgeçiren iki tuzak.

Sentry kendi başına telefonunuzu neden çaldıramaz

Sentry issue uyarılarının eylemleri bildirimleri (e-posta, Slack, Discord, Microsoft Teams), bilet oluşturmayı (Jira, GitHub, Azure DevOps) ve bir çağrı ürününe devretmeyi (PagerDuty, Opsgenie) kapsar. Hepsi ya bakıyor olmanız gereken bir ekranda ya da başka bir platformdaki ücretli bir koltukta biter.

Saat 14.00'te sorun yok. Saat 03.00'te bir Slack mesajı sessizlikten ayırt edilemez, anlık bildirim de Rahatsız Etmeyin'e yenilir. İki saatlik gecikmenin gerçek para ettiği küçük hata kümesi için — ödeme adımının 500 döndürmesi, kimlik doğrulamanın herkesi reddetmesi, bir worker'ın işleri sessizce düşürmesi — çalan bir cihaz istersiniz.

Webhook tam da bu ek yeridir. Sentry, uyarı kuralı eylemi olarak herhangi bir HTTPS uç noktasını çağırabilir; Echobell ise bu HTTP isteğini iOS Odak modunu delip geçen arama tarzı bir uyarıya dönüştürür.

Gerekenler

  • Settings → Developer Settings bölümüne erişebildiğiniz bir Sentry organizasyonu (owner veya manager)
  • Kurulu Echobell (App Store / Google Play)
  • Beş dakika

Sizin tarafınızda internetten erişilebilir olması gereken hiçbir şey yok. Giden isteği Sentry yapar; siz yalnızca alırsınız.

Adım 1 — Çalan bir kanal oluşturun

Echobell'de bir kanal oluşturun ve bildirim türünü Arama yapın. İşin bütün amacı bu: arama kanalı bir bildirim gibi değil, gelen çağrı gibi davranır, böylece Odak ve Rahatsız Etmeyin modlarını aşar.

Ona gece 3'te de anlam taşıyacak şablonlar verin. Sentry'nin verisi derin iç içe olduğundan değişken yolları alışıldığından uzundur:

Başlık: {{data.event.level}}: {{data.event.metadata.type}}
Gövde: {{data.event.title}} — {{data.event.culprit}}

Gelişmiş ayarlarda bağlantı şablonunu ayarlayın ki bildirime dokununca ilgili issue açılsın:

{{data.event.web_url}}

Webhook URL'sini kanal ayrıntı ekranından kopyalayın. Şöyle görünür:

https://hook.echobell.one/t/<channel-token>

Adım 2 — Sentry dahili entegrasyonu oluşturun

Sentry, webhook'u uyarı kuralı eylemi olarak yalnızca bir entegrasyon üzerinden sunar, dolayısıyla bir tane oluşturmanız gerekir. Bu bir form, bir servis değil — tek satır kod yazmayacaksınız.

  1. Settings → Developer Settings → Custom Integrations yolunu izleyin
  2. Create New Integration → Internal Integration
  3. Name: Echobell (kuralda seçeceğiniz ad budur)
  4. Webhook URL: 1. adımdaki kanal URL'si
  5. Alert Rule Action anahtarını açın
  6. Permissions: Issue & Event → Read yeterli
  7. Webhooks altındaki tüm kutuları işaretsiz bırakın — aşağıdaki tuzağa bakın
  8. Kaydedin

Dahili entegrasyon yalnızca kendi organizasyonunuzda geçerlidir ve kendini kurar. Ürettiği belirteç bu kurulumda hiç gerekmez.

Adım 3 — Entegrasyonu kural eylemi olarak ekleyin

Alerts → Create Alert → Issue Alert yoluna gidin ya da mevcut bir kuralı düzenleyin.

Then perform these actions altında Send a notification via an integration ekleyin ve Echobell'i seçin.

Action interval değerini — "bu uyarı birden fazla kez tetiklendiyse" kısıtlayıcısını — en az 30 minutes yapın. Varsayılan her tetiklemede gönderir ve dakikada 400 kez patlayan bir hata, siz kapatana kadar numaranızı çevirir.

Kaydedin, sonra kuralın testini çalıştırıp gerçek bir veri paketinin geldiğini görün; güvenmeden önce.

Adım 4 — Gerçekte ne geldiğini bilin

Çoğu kurulum burada kırılır, çünkü veri paketi tahmin ettiğiniz biçimde değildir. Sentry her şeyi sarmalar:

{
  "action": "triggered",
  "actor": { "id": "sentry", "name": "Sentry", "type": "application" },
  "data": {
    "event": {
      "event_id": "e4874d664c3540c1a32eab185f12c5ab",
      "level": "error",
      "title": "ReferenceError: heck is not defined",
      "culprit": "?(<anonymous>)",
      "platform": "javascript",
      "project": 1,
      "release": null,
      "metadata": { "type": "ReferenceError", "value": "heck is not defined" },
      "tags": [["level", "error"], ["browser", "Chrome 75.0.3770"]],
      "issue_id": "1117540176",
      "issue_url": "https://sentry.io/api/0/issues/1117540176/",
      "web_url": "https://sentry.io/organizations/test-org/issues/1117540176/events/e4874.../"
    },
    "triggered_rule": "Very Important Alert!"
  },
  "installation": { "uuid": "a8e5d2..." }
}

Tek bir şablon yazmadan önce bilinmesi gereken dört şey:

  • İşe yarayan her şey data.event altında. {{title}} hiçbir şey basmaz; hatayı {{data.event.title}} basar.
  • data.event.project sayısal bir kimliktir, slug değil. Bildirimde okunaklı bir proje adı istiyorsanız onu başlık şablonuna düz metin yazın ve proje başına bir kanal kullanın.
  • environment alanı yok. Ortam, data.event.tags içinde ["environment", "production"] çifti olarak gelir ve dizideki konumu sabit değildir — bu yüzden indeksle erişmeyin. Ortamı Sentry kuralında filtreleyin (5. adım).
  • data.triggered_rule kuralın adıdır. Bir kanal birkaç kurala hizmet ediyorsa gövdede işe yarar.

Issue uyarılarında Sentry-Hook-Resource başlığı event_alert değerini taşır. Bunu bir kanal koşulunda zorunlu kılarak başka hiçbir şeyin kanalı çaldıramamasını sağlayabilirsiniz:

header["sentry-hook-resource"] == "event_alert"

Adım 5 — Aramayı hak edene kadar daraltın

Her yeni issue'da çalan bir arama kanalı, hiç kanal olmamasından daha kötüdür: bir hafta içinde sessize alırsınız ve o zaman önemli olan tek seferde de çalmaz. İki yerde filtreleyin.

Sentry'de, kuralın conditions ve filters alanlarıyla:

AmaçKural yapılandırması
Yalnızca üretimKuralın Environment değerini production yapın
Yalnızca gerçek arızalarFiltre: The event's level equals fatal (ya da error)
Anlık dalgalanmalar için değilKoşul: The issue is seen more than 25 times in 1 hour
Yalnızca kritik bir yolFiltre: The event's tags match transaction contains /checkout
Yalnızca geri dönüşlerKoşul: A resolved issue changes state from resolved to unresolved

Echobell'de, Sentry'nin ifade edemediği şeyler ya da bugün geçiremeyeceğiniz değişiklikler için kanal koşulunu emniyet ağı olarak kullanın:

data.event.level == "fatal" || data.event.level == "error"

Önem derecesini Sentry kuralında filtrelemek genelde daha iyidir, çünkü hız kısıtlaması da oradadır. Echobell'de filtrelemek ise tek bir Sentry kuralından iki aciliyet seviyesi çıkarmak istediğinizde daha iyidir.

Adım 6 — Uyarılara daha sessiz bir kapı açın

Katmanlamanın amacı, telefon aramasının anlamını korumasıdır. Zamana Duyarlı (Time Sensitive) türünde ikinci bir Echobell kanalı oluşturun, eşiği daha düşük ikinci bir Sentry kuralı ekleyin ve onu ikinci bir dahili entegrasyona yöneltin (bir entegrasyon tek bir webhook URL'si taşır, dolayısıyla ikinci kanal ikinci bir entegrasyon ister).

Gerçek bir haftayı atlatan kurulum kabaca şöyle görünür:

Sentry kuralıSeviye / eşikEchobell kanalıDavranış
prod-fatalfatal, üretimAramaOdak modunu delip çalar
prod-error-spikeerror, 1 saatte 100'den fazlaZamana DuyarlıKilit ekranına düşer, çalmaz
new-issue-digestherhangi bir yeni issueNormalSıradan bildirim, vakit olunca okunur

Yalnızca mesai dışında çalsın

Gündüz zaten Sentry'ye bakıyorsunuz. Echobell, koşullara UTC sistem saati değişkenleri sunar; böylece bir kanal ikinci bir Sentry kuralına gerek kalmadan saate göre farklı davranabilir:

data.event.level == "fatal" && (hour >= 17 || hour < 9)

Hafta sonunuz gerçekten tatilse gün denetimi de ekleyin:

data.event.level == "fatal" && (hour >= 17 || hour < 9 || dayOfWeek == 0 || dayOfWeek == 6)

Bunların hepsi UTC'dir, dolayısıyla sayıları kesinleştirmeden önce kendi saat diliminizden çevirin. Koşul referansı tam değişken listesini içerir.

İki tuzak

Tuzak 1: Webhooks kutularını işaretlemek. Dahili entegrasyonun birbirinden bağımsız iki webhook yolu vardır. Alert Rule Action anahtarı entegrasyonu uyarı kurallarında seçilebilir kılar — istediğiniz budur. Webhooks kutuları (issue, error, comment) ise sizi o kaynağın her olayına abone eder: organizasyon genelinde oluşturulan, çözülen, atanan, arşivlenen ya da yoksayılan her issue. issue kutusunu işaretlerseniz bir ekip arkadaşınız bir şeyi çözdüğünde telefonunuz çalar. Hepsini boş bırakın; o zaman webhook'u yalnızca uyarı kurallarınız tetikler.

Tuzak 2: eski Webhooks eklentisini kullanmak. Proje başına çalışan eski Legacy Integrations → WebHooks eklentisi hâlâ duruyor ve hâlâ çalışıyor; entegrasyon oluşturmadan URL yapıştırabildiğiniz için kestirme gibi görünüyor. Ancak veri paketi farklı ve daha düz bir biçimde, istekleri imzalanmıyor ve Sentry yeni kurulumları oradan uzaklaştırıyor. Onu kullanırsanız şablonlarınız yukarıdakilerden farklı değişken yollarına ihtiyaç duyar. Dahili entegrasyonu kullanın.

Veri boyutu, hata fırtınaları ve kırpma

Büyük ölçekte bir şey ters gitmeden önce bilinmesi gereken üç sınır:

  • 1 MiB gövde. Echobell, 1 MiB'ı aşan tetikleyici gövdelerini HTTP 413 ile reddeder. Sentry verisi tam yığın izini ve istek bağlamını taşır, bu genelde onlarca kilobayt eder — ama büyük bir istek gövdesi olan bir olay sınıra yaklaşabilir. Sentry tarafında max_alerts gibi bir ayar yok; çözüm, SDK'nızın beforeSend kancasında büyük istek gövdelerini temizlemek. Zaten gizlilik açısından da istediğiniz şey budur.
  • Belirteç başına dakikada 120 istek. Bunun üstünde tetikleyici 429 ile RATE_LIMIT_EXCEEDED ve bir Retry-After döndürür. Sizi sınırın altında tutan şey Sentry'nin action interval'ıdır; 30 minutes fazlasıyla yeter.
  • 1500 bayt bildirim gövdesi. Daha uzunu cihaza ulaşmadan kırpılır. data.event.title artı culprit rahatça sığar; data.event.exception dökmek sığmaz ve kilit ekranında zaten okunmaz. Ayrıntıyı bağlantı şablonunun arkasında bırakın.

Ekiple paylaşmak

Bir Echobell kanalına birden çok kişi abone olabilir ve her abone kendi bildirim türünü seçer. Böylece aynı Sentry kuralı nöbetteki mühendisin telefonunu çaldırırken diğerlerine sıradan bir bildirim olarak ulaşabilir — koltuk başına ücret yok, nöbet dizilimi yapılandırması yok.

Ama bu bir yükseltme politikası değildir. "Beş dakikada kimse onaylamazsa bir sonrakini ara" diye bir şey yok. Ona ihtiyacınız varsa gerçek bir nöbet platformu gerekir; Echobell onun altındaki iletim katmanını kapsar.

Bu kurulumun vermediği şeyler

Açıkça söylemekte fayda var:

  • Onay yok. Aramayı açmanız Sentry'ye hiçbir şey söylemez ve diğer abonelerin telefonlarını susturmaz.
  • Nöbet dizilimi ya da yükseltme yok. Ya abone olan herkes alır ya da hiç kimse.
  • Sentry'ninkinin ötesinde tekilleştirme yok. Gruplama ve kısıtlama Sentry kuralında olur; Echobell geleni iletir.
  • Çift yönlü eşitleme yok. Issue'yu Sentry'de çözmek telefonunuzda hiçbir şeyi temizlemez.

Bunlar sizin için kırmızı çizgiyse doğru araç değil. Ama asıl ihtiyacınız "ödeme bozulduğunda beni uyandır" ise, bunu elde etmenin aşağı yukarı en ucuz güvenilir yolu budur.

Sorun giderme

Kural tetikleniyor ama hiçbir şey gelmiyor. Entegrasyonda Alert Rule Action'ın açık olduğunu doğrulayın. Kapalıysa entegrasyon kuralın eylem listesinde hiç görünmez — ve açmadan önce kaydettiğiniz bir kural eski eylemi saklamaya devam eder.

Bildirim geliyor ama boş. Şablonunuz üst düzey anahtarları okuyor. Sentry her şeyi data.event altına yerleştirir.

Beklemediğiniz şeyler için çalıyor. Önce entegrasyondaki Webhooks kutularına bakın (Tuzak 1), sonra kuralın ortamının "All Environments" olarak kalıp kalmadığına.

Aynı hata için defalarca çalıyor. Sentry kuralının action interval değerini yükseltin. Echobell'in yeniden denemesi ayrı bir şeydir: uygulama ayarlarındaki Başarısız aramayı yeniden dene, kaçırdığınız bir aramayı tekrar çevirir.

Test bile dahil hiçbir şey gelmiyor. Echobell tarafını elemek için önce kanalı curl ile tetikleyin:

curl -X POST https://hook.echobell.one/t/<channel-token> \
  -H 'Content-Type: application/json' \
  -d '{"data":{"event":{"level":"fatal","title":"Test error","culprit":"manual test","metadata":{"type":"TestError"}}}}'

Bu çalıyor ama Sentry çalmıyorsa sorun kanalda değil, entegrasyondadır.

Sık sorulan sorular

Sentry doğrudan telefon araması yapabilir mi?

Hayır. Sentry'nin issue uyarı eylemleri bildirimler, bilet oluşturma ve çağrı ürünleriyle entegrasyonlardan ibarettir. Sesli arama harici bir servis gerektirir — ya PagerDuty gibi bir çağrı platformu ya da Echobell gibi çalan bir webhook alıcısı.

Sentry uyarısı Rahatsız Etmeyin'i aşar mı?

Yalnızca arama tarzı bir uyarı olarak geldiğinde. Arama türündeki bir Echobell kanalı gelen çağrı gibi davranır ve iOS Odak ile Rahatsız Etmeyin bunu geçirir. Herhangi bir uygulamanın sıradan bildirimi geçmez.

Webhook için ücretli bir Sentry planı gerekir mi?

Dahili entegrasyonlar ve uyarı kuralı eylemleri Sentry'nin Developer planından itibaren kullanılabilir. Webhook'un kendisi ek ücret getirmez.

Şablon değişkenim neden boş?

Neredeyse her zaman yol çok kısa olduğu için. Uyarı verisi olayı data.event altına yerleştirir, dolayısıyla {{title}} değil {{data.event.title}} olmalı. Kanalı bir kez tetikleyin ve uygulamada kaydedilen istek gövdesine bakıp aldığınız tam biçimi görün.

Yalnızca tek bir ortam için nasıl uyarı alırım?

Sentry uyarı kuralındaki Environment alanını ayarlayın. Bunu data.event.tags üzerinden okumaya çalışmayın — sırası garanti edilmeyen [anahtar, değer] çiftlerinden oluşan bir dizidir.

Aynı hata için iki kişi aranabilir mi?

Evet. Kanalı paylaşın ve herkes istediği bildirim türüyle abone olsun. Onay mekanizması olmadığı için "arama"yı seçen herkes aranır.

Filtrelemeyi Sentry'de mi Echobell'de mi yapmalı?

Mümkün olduğunda Sentry'de — kısıtlama ve ortam kapsamı da kuralda yaşar. Tek bir kuraldan iki aciliyet seviyesi istediğinizde, saat penceresine ihtiyacınız olduğunda ya da kuralı bugün değiştiremediğinizde Echobell'de.

Özet

Kurulum dört parçadan oluşuyor: bir arama kanalı, Alert Rule Action açık ve Webhooks kutuları boş bir dahili entegrasyon, telefon aramasını hak edecek kadar dar bir uyarı kuralı ve data.event'i okuyan şablonlar. Bu sayfadaki geri kalan her şey, bir ay sonra o zilin hâlâ bir anlam taşıması için kurulumu yeterince dar tutmakla ilgili.

Echobell'i iPhone için indirin ya da Google Play'den edinin; gerçekten önemli bir şeyi bu yola emanet etmeden önce yukarıdaki curl'ü gönderin.

İlgili yazılar