İçeriğe geç
academia.sh

Ders 19 / 19

Çökme Raporlama ve Analitik

Yalnız bir dil yapılandırmasında çöken bir kusura toplam çökmesiz oturum denetiminin kör kaldığının, yapılandırma başına denetimin ise ayırdığının ve kursun on dokuz dersinin kapanış tablosunun ölçümü.

Yayın Güncelleme

Bu derste

  • Yalnız bir dil yapılandırmasında çöken kusuru toplam çökmesiz oturum denetiminin göremediğini ölçer
  • Çökme sayacını yapılandırma başına ayıran denetimin kusuru ayırdığını doğrular
  • Yeniden adlandırılan bir analitik olayını eski adla sayan pano denetiminin gürültülü kaldığını gösterir
  • Kursun on dokuz dersinin ayrımını tek tabloda okuyup dağılımı sayar
İçindekiler

Yayına çıkan bir sürüm kullanıcıda çöktüğünde bunu öğrenmenin yolu, çökme raporudur. Rapor, çöken oturumun izini ekibe geri taşır. Analitik ise çökmeyen oturumlarda kullanıcının ne yaptığını sayar. İkisi de bir sayaçtır ve sayaçlar, bir kusurun nerede yaşadığını bilmeden okunursa yanıltır.

Kursun ölçü sorusu hep aynıdır: aynı denetim doğru sürüme ve kusurlu sürüme uygulanınca iki yanıt farklı mı. Doğru sürümün geçip kusurlunun kaldığı denetim ayıran, ikisinin de geçtiği kör, ikisinin de kaldığı gürültülü, doğrunun kalıp kusurlunun geçtiği terstir. Çıktıda ayiran, kor, gurultulu ve ters olarak yazılırlar. Çekirdek önceki derslerdeki gibi birebir gelir.

// Separation.swift — bir denetimin dogru surumu kusurlu surumden ayirip ayirmadigini siniflandirir
struct Contrast<Output: CustomStringConvertible> {
    let label: String
    let correct: Output
    let faulty: Output
    let passesCorrect: Bool
    let passesFaulty: Bool

    var separation: String {
        switch (passesCorrect, passesFaulty) {
        case (true, false): return "ayiran"
        case (true, true): return "kor"
        case (false, false): return "gurultulu"
        case (false, true): return "ters"
        }
    }

    func describe() -> String {
        let onCorrect = passesCorrect ? "gecti" : "kaldi"
        let onFaulty = passesFaulty ? "gecti" : "kaldi"
        print("\(label) | dogru=\(correct)/\(onCorrect) kusurlu=\(faulty)/\(onFaulty) -> \(separation)")
        return separation
    }
}

func contrast<Output>(_ label: String, correct: Output, faulty: Output, check: (Output) -> Bool) -> Contrast<Output> {
    Contrast(label: label, correct: correct, faulty: faulty, passesCorrect: check(correct), passesFaulty: check(faulty))
}

func countSeparations(_ results: [String]) {
    for name in ["ayiran", "kor", "gurultulu", "ters"] {
        print("\(name): \(results.filter { $0 == name }.count)")
    }
}

Bu dersin kusuru yalnız bir dil yapılandırmasındadır: tarih biçimi çözülemeyen kullanıcılarda uygulama çöker, öteki yapılandırmalarda çalışır. Çökmenin kendisi modelde gerçekleşmez; model her yapılandırma için oturum ve çökme sayısını tutar ve sayıları bir rapor gibi okur.

Raporun Modeli

ConfigTally bir yapılandırmanın oturum ve çökme sayısıdır. Telemetry üç yapılandırmayı ve tek bir analitik olay adını taşır; kendini oturum, cokme ve olay olarak özetler. overallPasses bütün oturumlar üzerinden çökmesiz oranın eşikte kalıp kalmadığına, configPasses tek bir yapılandırma üzerinden aynı şeye bakar. dashboardCount ise panonun belirli bir olay adıyla saydığı kaydı döndürür.

// Crash.swift — yapilandirma basina oturum ve cokme sayilari, tek bir olay adi
struct ConfigTally {
    let config: String
    let sessions: Int
    let crashes: Int
}

struct Telemetry: CustomStringConvertible {
    let tallies: [ConfigTally]
    let eventName: String

    var sessions: Int { tallies.reduce(0) { $0 + $1.sessions } }
    var crashes: Int { tallies.reduce(0) { $0 + $1.crashes } }

    var description: String {
        "oturum=\(sessions) cokme=\(crashes) olay=\(eventName)"
    }
}

func crashFree(sessions: Int, crashes: Int, threshold: Int) -> Bool {
    (sessions - crashes) * 100 >= sessions * threshold
}

func overallPasses(_ telemetry: Telemetry, threshold: Int) -> Bool {
    crashFree(sessions: telemetry.sessions, crashes: telemetry.crashes, threshold: threshold)
}

func configPasses(_ telemetry: Telemetry, config: String, threshold: Int) -> Bool {
    telemetry.tallies.filter { $0.config == config }.allSatisfy {
        crashFree(sessions: $0.sessions, crashes: $0.crashes, threshold: threshold)
    }
}

func dashboardCount(_ telemetry: Telemetry, name: String) -> Int {
    telemetry.eventName == name ? telemetry.sessions : 0
}

let crashFreeThreshold = 90
let correctTelemetry = Telemetry(
    tallies: [ConfigTally(config: "en", sessions: 40, crashes: 0),
              ConfigTally(config: "tr", sessions: 30, crashes: 0),
              ConfigTally(config: "ja", sessions: 10, crashes: 0)],
    eventName: "siparis-tamamlandi")
let faultyTelemetry = Telemetry(
    tallies: [ConfigTally(config: "en", sessions: 40, crashes: 0),
              ConfigTally(config: "tr", sessions: 30, crashes: 0),
              ConfigTally(config: "ja", sessions: 10, crashes: 4)],
    eventName: "siparis-tamamlandi")

DG21. Oturum ve çökme sayıları modelin kendi sayılarıdır; gerçek bir uygulamanın çökme oranını göstermez. Yüzde doksan eşiği de dersin kuralıdır, platformun ya da bir servisin eşiği değildir.

Üç Denetim

Birinci denetim bütün oturumlara bakar. İkincisi yalnız ja yapılandırmasının sayacına bakar. Üçüncüsü, olayın adı geçen sürümde siparis-verildi iken siparis-tamamlandi olarak değiştirildiği için, panonun hâlâ eski adla saydığı kaydı arar. Olay iki sürümde de yeni adla gönderilir.

// main.swift — toplam sayac, yapilandirma sayaci, eski olay adi
let overall = contrast("toplam-cokmesiz-oturum-esikte", correct: correctTelemetry, faulty: faultyTelemetry) { overallPasses($0, threshold: crashFreeThreshold) }.describe()
let japanese = contrast("ja-yapilandirmasi-cokmesiz-esikte", correct: correctTelemetry, faulty: faultyTelemetry) { configPasses($0, config: "ja", threshold: crashFreeThreshold) }.describe()
let oldName = contrast("panoda-eski-olay-adi-var", correct: correctTelemetry, faulty: faultyTelemetry) { dashboardCount($0, name: "siparis-verildi") > 0 }.describe()

countSeparations([overall, japanese, oldName])
toplam-cokmesiz-oturum-esikte | dogru=oturum=80 cokme=0 olay=siparis-tamamlandi/gecti kusurlu=oturum=80 cokme=4 olay=siparis-tamamlandi/gecti -> kor
ja-yapilandirmasi-cokmesiz-esikte | dogru=oturum=80 cokme=0 olay=siparis-tamamlandi/gecti kusurlu=oturum=80 cokme=4 olay=siparis-tamamlandi/kaldi -> ayiran
panoda-eski-olay-adi-var | dogru=oturum=80 cokme=0 olay=siparis-tamamlandi/kaldi kusurlu=oturum=80 cokme=4 olay=siparis-tamamlandi/kaldi -> gurultulu
ayiran: 1
kor: 1
gurultulu: 1
ters: 0

Toplam denetim kör çıktı. Kusurlu sürümde dört oturum çöker, ama seksen oturumun içinde bu dört oturum eşiğin altına düşmeyi gerektirmez. Denetim doğru bir şeye bakar, yalnız kusurun yaşadığı yere bakmaz. Yapılandırma başına denetim aynı veriden kusuru ayırır, çünkü çöken dört oturum küçük bir yapılandırmada yoğunlaşmıştır. Bir ortalamanın içinde küçük bir kullanıcı grubunun çökmesi kaybolur.

Pano denetimi gürültülü çıktı. Olay yeniden adlandırıldığı için eski adla sayan pano iki sürümde de sıfır görür ve kalır. Kırmızı pano çökmeyi göstermez; panonun yeni adı bilmediğini gösterir.

Raporlama Yapılandırması

Çökme raporlama servisi ve sembolleştirme bu derste ölçülmez. İkisi de KAYNAK olarak kalır: yapılandırma, raporun açık olduğunu ve sembollerin yüklendiğini söyler.

# telemetry.yaml — raporlama yapilandirmasi (KAYNAK, olculmez)
crash_reporting:
  enabled: true
  upload_symbols: true
analytics:
  events:
    - siparis-tamamlandi
# sembol-yukleme adimi — KAYNAK
# 1. arsivden sembol dosyalari cikarilir
# 2. sembol dosyalari raporlama servisine yuklenir
# 3. servis gelen cokme izini bu dosyalarla okunur hale getirir

Sembol yüklenmeden gelen bir çökme izi adres satırlarından ibarettir ve hangi işlevde çöküldüğünü söylemez. Bu yüzden sembol yükleme adımı, hattaki hiçbir adımı kırmızıya çevirmeyen ama unutulursa raporu işe yaramaz kılan bir adımdır.

DG22. Çökme raporunun ekibe hangi gecikmeyle ve hangi oranda ulaştığı ölçülmedi. Raporlama servisi, sembolleştirme ve panonun gerçek davranışı da ölçülmedi.

Sınırlayıcı Ölçüm

Toplam denetimin körlüğü eşiğe bağlıdır. Aşağıda aynı iki sürüm eşiğin değişen değerleriyle, bir de çökmeyen tr yapılandırmasıyla ve yeni olay adıyla denetlenir.

// main.swift — esik ve yapilandirma degisince
let strictOverall = contrast("toplam-esik-96", correct: correctTelemetry, faulty: faultyTelemetry) { overallPasses($0, threshold: 96) }.describe()
let turkish = contrast("tr-yapilandirmasi", correct: correctTelemetry, faulty: faultyTelemetry) { configPasses($0, config: "tr", threshold: crashFreeThreshold) }.describe()
let newName = contrast("panoda-yeni-olay-adi-var", correct: correctTelemetry, faulty: faultyTelemetry) { dashboardCount($0, name: "siparis-tamamlandi") > 0 }.describe()
let strictJapanese = contrast("ja-yapilandirmasi-esik-100", correct: correctTelemetry, faulty: faultyTelemetry) { configPasses($0, config: "ja", threshold: 100) }.describe()

countSeparations([strictOverall, turkish, newName, strictJapanese])
toplam-esik-96 | dogru=oturum=80 cokme=0 olay=siparis-tamamlandi/gecti kusurlu=oturum=80 cokme=4 olay=siparis-tamamlandi/kaldi -> ayiran
tr-yapilandirmasi | dogru=oturum=80 cokme=0 olay=siparis-tamamlandi/gecti kusurlu=oturum=80 cokme=4 olay=siparis-tamamlandi/gecti -> kor
panoda-yeni-olay-adi-var | dogru=oturum=80 cokme=0 olay=siparis-tamamlandi/gecti kusurlu=oturum=80 cokme=4 olay=siparis-tamamlandi/gecti -> kor
ja-yapilandirmasi-esik-100 | dogru=oturum=80 cokme=0 olay=siparis-tamamlandi/gecti kusurlu=oturum=80 cokme=4 olay=siparis-tamamlandi/kaldi -> ayiran
ayiran: 2
kor: 2
gurultulu: 0
ters: 0

Eşik doksandan doksan altıya çıkınca toplam denetim ayıran olur. Çökmeyen tr yapılandırmasına bakan denetim yine kördür, çünkü kusur orada yaşamaz. Yeni adla sayan pano iki sürümde de geçer ve kördür: panonun doğru saydığı olay çökmeyi bilmez.

Sınırlar açıktır. Ayrım bir mimarinin, bir test kümesinin ya da bir yayın sürecinin seçim ölçütünün tamamı değildir. Maliyet, ekibin büyüklüğü ve bir yapının zaman içinde sürdürülebilirliği bu kursta ölçülmedi ve bir sayıya dökülmedi; bunlar düzyazıyla tartışılır.

DG23. Eşikler dersin kuralıdır. Hangi eşiğin doğru olduğu, ekibin kullanıcıya ve çökmeye ne kadar tahammül ettiğine bağlıdır ve bu ders onu söylemez.

Kurs Kapanışı

Kursun on dokuz dersi, her biri kendi kusuruyla, aşağıdaki tabloda yan yana durur. Ayrım sütunu her dersin kendi ## Özet bölümündeki karardan alındı.

Ders Kusur Ayrım Sınırlayıcı ölçüm
Mimari Kalıplar indirim iki kez uygulanır dördü (2/2/1/1) yüzde değişince aynı denetim kör, sonra ayıran
Koordinatör Kalıbı ödemeden sonra yanlış ekran kör kusur ara adıma kayınca yalnız son ekran kör
Tek Yönlü Veri Akışı indirgeyici yanlış durum üretir ayıran kayıtlı örnek kusurludan alınınca ters
Bağımlılık Enjeksiyonu boş yanıtta liste silinir gürültülü güdük hep dolu dönünce kör
Modülerleştirme özellik modülü başka özelliğe bağlanır kör yeniden derleme bütçesi: biri ayıran, biri kör
Birim Testleri eşikte ücret hâlâ alınır ayıran beklenen değer kusurludan kopyalanınca ters
Arayüz Testleri düğme sipariş göndermez gürültülü ekran oturmadan bakınca gürültülü
Test Planları ve Kapsam indirim yanlış hesaplanır kör tek dile yazılan beklenti gürültülü
Profil Çıkarma Araçları hücre gereğinden çok iş yapar ayıran bütçeye göre gürültülü, ayıran, kör
Bellek Sızıntısı Tespiti kapanış nesneyi güçlü tutar ayıran sayaç ekranı sayınca kör
Başlangıç ve Kaydırma Başarımı açılışta ve kaydırmada fazla iş ters yenilenen temel değer kör
Kod Kalitesi Araçları zorla açma boş girdide çöker kör sıkı kural gürültülü
İmzalama ve Sağlama Profilleri paket bildirim yetkisini taşımaz ters aynı denetim üç girdide üç ayrım
Sürekli Tümleştirme sepet toplamı son kalemi atlar gürültülü adım sırası değişince ayrım değişir
Yayın Otomasyonu derleme numarası artmaz ayıran son numara kaynağına göre gürültülü ya da ters
Beta Dağıtımı bayrak kitle dışına açık kör yeni davetlide ters
Mağaza İnceleme Süreci izin açıklaması boş gürültülü boşluk açıklamasında uzunluk maddesi kör
Mağaza Listelemesi ekran görüntüsü eski arayüzü gösterir ters doğru referansla ayıran
Çökme Raporlama ve Analitik yalnız bir dilde çöker kör eşik değişince ayıran

Tablonun ayrım sütunu açılış dersini dördü olarak, öteki on sekiz dersi tek ayrımla yazar. Aşağıdaki ölçüm bu on sekiz kararı sayar; son karar bu dersin kendi toplam denetiminden gelir. Altına çekirdeğin altı denetimi ayrıca konur.

// main.swift — acilis disindaki on sekiz dersin dagilimi
let ownLesson = contrast("kapanis", correct: correctTelemetry, faulty: faultyTelemetry) { overallPasses($0, threshold: crashFreeThreshold) }.separation
let remaining = ["kor", "ayiran", "gurultulu", "kor",
                 "ayiran", "gurultulu", "kor", "ayiran", "ayiran", "ters", "kor",
                 "ters", "gurultulu", "ayiran", "kor", "gurultulu", "ters",
                 ownLesson]
print("acilis-disi-on-sekiz")
countSeparations(remaining)
print("cekirdek-alti-denetim")
countSeparations(["ayiran", "ayiran", "kor", "kor", "gurultulu", "ters"])
acilis-disi-on-sekiz
ayiran: 5
kor: 6
gurultulu: 4
ters: 3
cekirdek-alti-denetim
ayiran: 2
kor: 2
gurultulu: 1
ters: 1

Açılış dışındaki on sekiz dersin dağılımı beş ayıran, altı kör, dört gürültülü ve üç terstir. Çekirdeğin 2/2/1/1 dağılımı bundan farklı bir şeydir: çekirdek ilk dersteki altı denetimi sayar, bu dağılım ise on sekiz dersin ayrımını. Tablodan okunacak şey dağılımın kendisi değil, aynı denetim türünün farklı kusurlarda dört ayrımın hepsine düşebildiğidir. Kör ve ters birlikte dokuz derste çıkar; ayıran beşte kalır.

M30 burada kapanır: Swift dili, platform ve araçlar, bildirimsel arayüz, buyurgan arayüz ve köprüleme, veri ve ağ, mimari ve yayın olmak üzere altı kurs tamamlandı.

Özet

  • Çökme sayacı bütün oturumların toplamında okunursa, tek bir dil yapılandırmasında çöken kusur toplamda kaybolur.
  • Çökme sayacını yapılandırma başına ayıran denetim aynı veriden kusuru ayırır.
  • Yeniden adlandırılan olayı eski adla sayan pano iki sürümde de sıfır görür ve gürültülü olur.
  • Toplam denetimin eşiği sıkılaştırılınca aynı denetim ayıran olur; kör olmak denetimin değil, denetimle eşiğin ortak özelliğidir.
  • Kursun on dokuz dersinde ayrım dört kategoriye dağılır; hiçbir denetim türü yalnız tek kategoride kalmaz.
  • Bu dersin ayrımı: kör.

Sonraki Adım

Bu, kursun son dersidir. Yeni bir denetim yazarken sorulacak soru değişmez: denetimi doğru sürüme ve kusurlu sürüme uygulayın, iki yanıtı yan yana okuyun.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ ↵ Esc gezin · aç · kapat