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

Dokümantasyon / Incident'lar

Raporu okumak

Bir incident raporunda neler bulunur ve nasıl okunur: kodun hesapladığı bulgular, Investigator'ın verdiği tek yargı, sonucun nasıl belirlendiği ve kendi araçlarınızda kullanmanız için Markdown'ın yanında duran JSON dosyaları.

Nerede

Her inceleme bir klasör yazar:

.ivralo/incidents/incident-20261012-101500/
  digest.json     gerçekler, herhangi bir model bir şey okumadan önce kodun hesapladığı
  report.json     veri olarak rapor
  report.md       insanlar için rapor

.ivralo/ git tarafından yok sayılır; bu dosyaların hiçbiri bir commit'e girmez. ivralo'nun kendi kimlik bilgileri, iki rapor dosyası da yazılmadan önce gizlenir. Ama log'ların içindeki bir secret, örneğin bir istek satırındaki token, yine de alıntılanabilir.

Digest: kodun hesapladığı bulgular

Investigator daha hiçbir şey okumadan, kod bundle'ı bir digest'e çevirir. Rapordaki her sayı buradan gelir.

Bölümİçeriği
İmzalarHer hata, satırdan satıra değişen kısımları (id'ler, sayılar, tırnak içindeki değerler, zaman damgaları) ayıklanmış metniyle ve stack frame'leriyle gruplanır. Hata veren 340 satır, sayısı, ilk ve son görüldüğü an, endpoint'leri ve bir örneğiyle birlikte tek bir imzaya dönüşür.
Zaman çizelgesiBundle'da bulunan deploy'lar ve her imza için: son deploy'dan kaç dakika sonra başladığı, hata sürerken bir deploy yapılıp yapılmadığı ya da herhangi bir deploy'dan önce başlayıp başlamadığı.
Revizyon ve şüphelilerRepo'da deploy edilen commit'in olup olmadığı, o deploy'un neyi değiştirdiği (diff'iyle birlikte), stack frame'lerinin hangi dosyaları gösterdiği, bu dosyaların repo'da olup olmadığı, bir frame'in bastığı satırın repo'daki aynı numaralı satırla aynı olup olmadığı ve hangi dosyaların hem bir trace'te geçip hem de deploy'la değiştiği.
Tükenme ipucuBir satır, sürecin kendi sınırına dayandığını söylüyorsa (bellek yetersiz, diskte yer kalmadı, çok fazla açık dosya ya da istemci, bir pod'un OOMKilled olması): önceki beş dakikada istek gelen route'lar, kaynağın ve trafiğin metriklerde nasıl değiştiği ve kod indeksi varsa her route'u sunan dosyalar. Bir sınırın ayarlanmış olması, o sınıra ulaşıldığı anlamına gelmez.
Bildirilen bağlamBrief'te ya da bir notta adı geçen sayfalar ve route'lar, her biri kaynağıyla.
Not establishedDigest'in karara bağlayamadığı şeyler; örneğin repo'da bulunmayan bir deploy.

Lead, incelemenin çıkış noktası olan imzadır. Digest'teki her liste, neyi dışarıda bıraktığını da belirtir.

Yargı

Investigator digest'i ve digest'in gösterdiği kodu okur, sonra iki şeye karar verir:

  • sınıf: code, config, data, infrastructure, external ya da ambiguous;
  • neden, ve kanıtların bu nedeni kanıtlayıp kanıtlamadığı (established).

Bir nedenin "kanıtlanmış" sayılması için ne gerektiği sınıfa göre değişir:

SınıfKanıtlar şunu gösteriyorsa kanıtlanmıştır
codeRepo'da bulunan ve kodu, alıntılanan bir satırın gösterdiği davranışı üreten bir dosya. Log satırlarının bu dosyanın adını vermesi gerekmez; eşleşmeyi siz değerlendirebilin diye rapor, repo'daki satırı kanıtın yanına basar.
configAyarın adını ve değiştiğini ya da eksik olduğunu gösteren bir satır.
dataKaydın kendisi ve ihlal ettiği kural.
infrastructureKaynak ve durumu.
externalSağlayıcının kendi satırı.

Her sınıf, bundle'dan en az bir alıntılanmış satır ister. Investigator kaydını tek bir araçla, file_incident_report ile yapar; bu araç her referansı bundle'da ve repo'da kontrol eder. Çözülemeyen bir referans reddedilir ve Investigator kaydı yeniden yapar.

Araç, nedende geçen miktar ifadelerini de digest'teki sayılarla karşılaştırır. Digest başka bir endpoint'te de hata sayarken "Tüm hatalar GET /api/orders üzerinde" demek, bozuk bir referans gibi reddedilir. Sayıların desteklemediği "çoğu" ya da "birkaç" gibi ifadeler kaydedilir; ama nedenin kanıtlanmış sayılıp sayılmayacağını da sonucu da değiştirmez. ivralo bunu, hesaplanan sayılarla birlikte Not established altında not eder.

Sonuç

Yargıyı tek bir sonuca model değil, kod çevirir. Kurallar şu sırayla uygulanır:

  1. Investigator okuyana yönelik bir satır bildirdiyse: ESCALATED.
  2. Sınıf config, data, infrastructure ya da external ise, kanıtlanmışsa ve en az bir alıntılanmış satır varsa: NOT_CODE_ISSUE.
  3. Sınıf code ise, kanıtlanmışsa, alıntılanmış bir satır ve repo'da bulunan en az bir şüpheli dosya varsa: DIAGNOSED.
  4. ambiguous dahil geri kalan her durumda: INSUFFICIENT_EVIDENCE.

Güven yüzdesi yoktur. Repo'da deploy edilen revizyonun olup olmadığı bir bulgu olarak bildirilir ve hiçbir sonucu değiştirmez.

report.md, bölüm bölüm

Bölümİçeriği
OutcomeTek satır: sonuç ve sınıf, örneğin DIAGNOSED - class code. ESCALATED'in sınıfı olmaz.
ObservedHesaplanan bulgular, her satırda bir tane, her birinin sonunda kaynağı: app.log:160-170, deploy.log:3, bir commit.
InferredSınıf ve neden, ikisi de çıkarım olarak işaretli; şüpheli dosyalar ve alıntılanan satırlar. Bunları modelin metninden değil, bundle'dan kod kopyalar. Şüpheli bir dosya için repo'daki o satırın kodu da basılır.
HypothesesYalnızca Investigator bir defter tuttuysa görünür (aşağıda).
Not establishedKanıtların karara bağlayamadığı şeyler. Her satır, kimin yazdığını belirtir: (code) ya da (investigator).
Instructions found in the evidenceYalnızca böyle satırlar varsa görünür: her satır alıntılanır ve uygulanmadığı belirtilir, ya da bir kenara konduysa "not an instruction to the reader" diye işaretlenir. Bkz. Kötü niyetli kanıt.
Evidence indexRaporun kullandığı bütün referanslar.

Sayılar, zamanlar ve aralıklar yalnızca Observed bölümünde ve ivralo'nun Not established altındaki kendi satırlarında görünür. "Deploy hatalardan önce yapıldı" gözlenmiş bir bulgudur; neden ise bir çıkarımdır ve bunu açıkça belirtir.

Hipotez defteri

Rapor tek bir neden söyler. İsteğe bağlı defter (ledger) ise Investigator'ın başka hangi ihtimalleri tarttığını gösterir; böylece raporu inceleyen kişi neyin elendiğini görür, INSUFFICIENT_EVIDENCE ile biten bir rapor da hangi ihtimallerin açık kaldığını söyler.

DurumAnlamıAlıntılanmış satır gerekir mi
validatedKanıtlar bunu gösteriyor.evet
invalidatedKanıtlar bunun öyle olmadığını gösteriyor.evet
inconclusiveTartıldı, ama kanıtlar iki yönde de karar vermeye yetmiyor.hayır
checked healthyBakılan ve sağlıklı bulunan bir bileşen.evet
not checkedAdı geçti ama bakılmadı.hayır

Satır gerektirdiği halde hiç satır göstermeyen ya da çözülemeyen bir satır gösteren kayıt deftere alınmaz; hangisinin neden alınmadığı Not established altında yazar. Defter en fazla 20 kayıt tutar. Sonucu hiçbir zaman değiştirmez, yalnızca açıklar.

ivralo why -s <id> last "the database was down" tek bir hipotezi dayandığı satırlara kadar takip eder.

report.json

Aynı raporun veri hali. Başlıca anahtarlar:

Anahtarİçeriği
formatBiçim sürümü, 1.
incidentIncident id'si, yani klasörün adı.
outcome, class, establishedSonuç, sınıf ve nedenin kanıtlanıp kanıtlanmadığı.
bundle, digestBundle'ın yolu ve digest.json'ın yolu.
leadLead imzası: id, text, count, first, last, kind (exhaustion ya da boş).
signatures, timelineHer imza (id, level, count, text) ve her an (time, kind, label, ref).
deploy, revisionLead'in karşılaştırıldığı deploy ve repo'da onun commit'inin olup olmadığı (held).
changed, changed_range, on_trace_and_changed, framesDeploy'un neyi değiştirdiği ve stack frame'lerinin repo ile nasıl karşılaştırıldığı.
suspectsŞüpheli dosyalar: path, line, held, note, code.
cause, evidence, commitsNeden ve alıntılanan her referans, bundle'dan kopyalanmış lines ile birlikte.
hostile, set_asideOkuyana yönelik satırlar ve talimat sayılmayıp bir kenara konan satırlar.
hypothesesDefter; yoksa [].
not_established{"by": "code" or "investigator", "text": ...} biçimindeki kayıtlar.
run_id, session_id, model, filed_atKaydı hangi çalıştırmanın, hangi oturumda, hangi modelle ve ne zaman (UTC) yaptığı.

digest.json

Digest'in tamamı; raporda olandan fazlasını içerir: bundle (her dosyanın boyutu, satır sayısı ve okunup okunmadığı), frame'leri ve endpoint'leriyle signatures, deploys, moments, placements (her imzanın kendinden önceki deploy'a uzaklığı), correlation (deploy'un diff'i dahil repo bulguları), reported_context, limits (her listenin ne kadarını gösterdiği) ve not_established.

Sonuç için report.json'ı, Investigator'a tam olarak ne verildiğini görmeniz gerektiğinde de digest.json'ı kullanın.