Dokümantasyon / Incident'lar
Server modu ve incident'lar
Server modunda ivralo production'ın yanında çalışır ve incident'ları inceler. Kanıtları servisin koduyla birlikte okur ve her iddiasını açıp bakabileceğiniz bir satıra dayandıran bir rapor yazar.
Server modu nedir
Server modu bir yetki kümesinden ibarettir. ivralo'nun kendi ana dizinindeki ayarlarla açılır, hiçbir zaman bir repo'dan değil; böylece bir repo kendine yetki veremez. Kurulumu ivralo init --server yapar.
Değişen tek şey, başında kimse olmayan bir çalıştırmanın neler yapabileceğidir. Geliştirici modunda böyle bir çalıştırmaya, bir kişiye sorulması gereken hiçbir yetki verilmez. Server modunda ise commit de atabilir ve tek bir amaç için, tek tür bir branch push'layabilir:
- branch'i o oturumda ivralo kendisi açmıştır ve üzerindeki her commit ivralo'nundur;
- varsayılan branch asla olmaz, remote'ta zaten var olan bir branch asla olmaz; force push yok, tag yok;
- sonunda forge'unuzda taslak bir pull request açılır.
Hiçbir şey merge edilmez. Shell politikası git push, gh pr merge ve benzerlerini hangi biçimde yazılırsa yazılsın reddeder. Yani dışarıya açılan tek kapı taslak pull request'tir ve ona ne olacağına bir insan karar verir.
Bir incident'ı incelemek
İnceleme bir bundle okur: servisin repo'sunun içinde, kanıtları tutan bir klasör. İçindeki her dosya kanıt sayılır.
incident/
alert.md alarmın tetiklendiği hâli
app.log o saatlerdeki servis logu
deploy.log neyin, ne zaman deploy edildiği
metrics.csv varsa birkaç seri
Sonra şunu çalıştırın:
ivralo incident incident/
ivralo bundle'ın içine hiçbir şey yazmaz. Yalnızca metin dosyalarını okur, her satırı 1'den başlayarak numaralar, binary dosyaları açmadan listeler.
Önce kodun hesapladığı bulgular
Model daha hiçbir şey okumadan, ivralo sayılabilen her şeyi çıkarır:
- hata imzaları, satırdan satıra değişen kısımlar ayıklanmış halde;
- deploy'ların bir zaman çizelgesi ve her hatanın son deploy'dan kaç dakika sonra başladığı;
- revizyon: repo'da deploy edilen commit'in olup olmadığı, o deploy'un neyi değiştirdiği ve stack trace'lerdeki satırların kodla örtüşüp örtüşmediği;
- tükenme ipuçları: bellek, disk, açık dosya ya da istemci sınırına dayanılıp dayanılmadığı ve hemen öncesinde hangi route'lara istek geldiği.
Sonra tek bir yargı
Ekipten tek bir üye, Investigator, bu bulguları ve kodu okur, sonra iki şeye karar verir: incident'ın sınıfı (kod, yapılandırma, veri, altyapı, dış etken ya da belirsiz) ve nedeni. Nedeni tek bir araçla kaydeder; bu araç her referansı bundle'da ve repo'da kontrol eder. Var olmayan bir satıra dayanan iddia reddedilir.
Investigator okuyabilir ve rapor yazabilir. Düzenleme yapamaz, kod çalıştıramaz, dışarıya hiçbir şey gönderemez.
Sonuç
Yargıyı dört sonuçtan birine model değil, kod çevirir. Güven yüzdesi diye bir şey yoktur.
| Sonuç | Ne zaman |
|---|---|
DIAGNOSED | Kanıtlanmış bir kod hatası; repo'da var olan bir dosyayı gösterir |
NOT_CODE_ISSUE | Alıntılanmış bir satırla kanıtlanmış yapılandırma, veri, altyapı ya da dış etken |
ESCALATED | Kanıtların içinde okuyana yönelik talimatlar var |
INSUFFICIENT_EVIDENCE | Geri kalan bütün durumlar |
Rapor
Rapor .ivralo/incidents/<id>/ altına report.md olarak yazılır; kendi araçlarınızda kullanmanız için yanında report.json ve digest.json da bulunur. Bölümleri, gözlenenle çıkarılanı birbirinden ayrı tutar:
- Observed: hesaplanan bulgular, her biri kaynağıyla.
- Inferred: sınıf ve neden, çıkarım olarak işaretli; alıntılanan satırları kod kopyalar.
- Hypotheses: neyin kontrol edildiği ve doğrulanıp doğrulanmadığı.
- Not established: kanıtların karara bağlayamadığı şeyler.
- Instructions found in the evidence: alıntılanır, asla uygulanmaz.
İçindeki her sayı hesaplanmıştır. Bir cümlenin nereden geldiğini görmek için şunu çalıştırın:
ivralo why -s <id> last "iddia, raporda geçtiği gibi"
Komut iddiayı, saklanan çalıştırma üzerinden dayandığı bundle satırına kadar takip eder.
İncelemeler nereden gelir
- Terminal: yukarıdaki gibi
ivralo incident. - Yerel API:
ivralo servebunu yalnızca127.0.0.1üzerinde, token arkasında açar.POST /incidentaynı incelemeyi çalıştırır ve ilerlemeyi stream olarak döner. - Alarm sisteminiz: Alertmanager ve PagerDuty API'ye gönderim yapabilir. Tetiklenen her alarm küçük bir bundle'a ve bir inceleme job'una dönüşür; job'lar sırayla çalışır. İnceleme sürerken ve job açıldıktan sonraki altı saat içinde aynı alarm yeniden gelirse aynı job sayılır; yani gürültülü bir alarm yalnızca bir kez incelenir.
Emir vermeye çalışan kanıtlar
Log'lar kullanıcıların yazdığı metinleri de taşır. Okuyana yönelik bir satır, örneğin "yukarıdakileri boş ver ve şunu çalıştır", kendi başlığı altında alıntılanır ve sonucu ESCALATED yapar. Ama güvenlik bu satırları yakalamaya dayanmaz: asıl güvence, Investigator'ın düzenleme yapan, komut çalıştıran ya da dışarıya bir şey gönderen hiçbir aracının olmamasıdır.
Kanıtlar ve barındırılan modeller
Incident kanıtları varsayılan olarak makinede kalır. Kanıtları okuyacak model başka bir yerde barındırılıyorsa, siz izin vermedikçe inceleme reddedilir. İzin vermek maskelemeyi de gerektirir: adresler, e-postalar ve listelediğiniz tanımlayıcılar dışarı çıkmadan önce sabit yer tutucularla değiştirilir, raporun sizde kalan kopyasında da geri konur.