İçeriğe geç
ivralo
Bölümler

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
DIAGNOSEDKanıtlanmış bir kod hatası; repo'da var olan bir dosyayı gösterir
NOT_CODE_ISSUEAlıntılanmış bir satırla kanıtlanmış yapılandırma, veri, altyapı ya da dış etken
ESCALATEDKanıtların içinde okuyana yönelik talimatlar var
INSUFFICIENT_EVIDENCEGeri 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 serve bunu yalnızca 127.0.0.1 üzerinde, token arkasında açar. POST /incident aynı 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.