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.