İçeriğe geç
academia.sh

Ders 11 / 16

İzleme Kategorileri

Toplanan ölçüt kümesinin eksiksizliğinin bir kapsama ölçüsüyle sınanması: izleme ile gözlemlenebilirliğin ayrılması, hizmet erişilebilirliği, sağlık, başarım, kullanım ve güvenlik kategorilerinin sordukları soruya göre tanımlanması, bir kategori hiç toplanmadığında önceki konunun hangi tanısının yapılamaz kaldığının sayılması ve tanının tek bir ölçütle değil ölçüt bileşimiyle kurulduğunun gösterilmesi.

İçindekiler

Önceki konu on tanı kurdu ve hepsini aynı üç adımla yürüttü: belirti bir sayıyla yazıldı, aynı belirtiyi veren ikinci bir neden kuruldu, ikisini ayıran bir ölçüm gösterildi. Konu kapanışı bu on dersin ortak koşulunu bıraktı — hepsi bir ölçüm varsa yapılabilir. O ölçümün nereden geldiği ise hiçbir derste sorulmadı: hangi ölçütün toplandığı, hangisinin toplanmadığı ve toplanmayanın hangi tanıyı elden aldığı hep varsayıldı.

Bu ders o boşluğu doldurur ve tek bir soruyla başlar: bir sistemden toplanan ölçüt kümesi ne zaman eksiksiz sayılır? Eksiksizlik burada bir liste uzunluğu değil, bir kapsama ölçüsüdür — hangi kategori boşsa hangi tanı yapılamaz. Ölçü bu yüzden önceki konunun on dersi üzerinde tanımlanır.

İzleme ve Gözlemlenebilirlik

İzleme (monitoring) önceden belirlenmiş soruların yanıtlarını sürekli toplamaktır; gözlemlenebilirlik (observability) ise önceden sorulmamış bir soruya toplanmış veriden yanıt verilebilmesidir. Bu ders izlemeyi kurar, çünkü sorulmamış soruya yanıt verebilmenin ön koşulu sorulmuş soruların hangi boşluğu bıraktığını bilmektir.

Bir ölçüt (metric) bir soruya karşılık gelir ve kategorisi o sorunun türüdür. Beş kategori şunları sorar:

  • Hizmet erişilebilirliği (availability): istek yanıtlanabildi mi? Terim arayüz erişilebilirliğiyle karıştırılmamalıdır ve kısaltılmaz; ayrım Sistem Tasarımına Giriş kursunda yapıldı. Ölçütleri istek başarı oranı ve kesinti dakikasıdır; ikincisi doğrudan o kursun aylık 43,2 dakikalık kesinti bütçesini ve içindeki 28,2 dakikalık arıza payını harcar.
  • Sağlık: hangi kopya iş alabilir durumda? Sağlık ucunun içeriği — sığ denetim, hazır olma denetimi, derin denetim — Dayanıklılık ve Güvenilirlik kursunda tasarlandı ve burada yeniden tasarlanmaz; ucun ürettiği evet-hayır burada bir izleme ölçütü olarak yerine konur.
  • Başarım: iş ne kadar sürüyor? Yanıt süresi yüzdelikleri ve alt çağrıların süreleri.
  • Kullanım: kaynağın ne kadarı harcandı? Doluluk, taşınan bayt, istek başına çağrı sayısı, bellekteki nesne sayısı, önbellek isabet oranı, taranan kayıt sayısı, müşteri başına iş payı.
  • Güvenlik: isteği kim gönderdi ve gönderme hakkı var mıydı? Reddedilen yetkisiz istek ve hız sınırı tetiklenmesi.

Başarım kategorisinin tek başına okunamamasının nedeni aynı kursta ölçülmüştü: bir gecikme sayısı hangi yükte alındığı söylenmeden okunamaz. Tepe uçtaki 513,89 istek/s ile ölçülen bir yüzdelik ile gece yarısında ölçülen aynı yüzdelik aynı sayı değildir. Bu yüzden her başarım ölçütü yanında bir kullanım ölçütü ister.

Eksiksizlik Bir Kapsama Ölçüsüdür

Aşağıdaki hesap on tanıyı ve on altı ölçütü eşler, sonra her kategoriyi tek tek boşaltıp kaç tanının yapılamaz kaldığını sayar. Eşlemenin kendisi bu dersin varsayımıdır (IZ1): önceki konu her tanı için bir ayırt eden ölçüm gösterdi, aşağıdaki tablo o ölçümlerin karşılığı olan ölçütleri seçer ve kategorilere yerleştirir. Başka bir eşleme başka sayılar verir. Çıkan sayılar hesap sınıfındadır.

// izleme/kapsam.mjs — bes kategorinin eksiksizlik olcusu: Karsit Kaliplar konusundaki on tani
// hangi olcutu gerektiriyor, bir kategori hic toplanmazsa hangi tanilar yapilamaz kaliyor.
const OLCUT = {
  "istek basari orani": "erisilebilirlik",
  "kesinti dakikasi": "erisilebilirlik",
  "kopya havuz durumu": "saglik",
  "hazir olma durumu": "saglik",
  "yanit suresi yuzdeligi": "basarim",
  "depo sorgu suresi": "basarim",
  "istek basina cagri sayisi": "kullanim",
  "tasinan govde bayti": "kullanim",
  "islemci dolulugu": "kullanim",
  "havuz dolulugu": "kullanim",
  "bellekteki nesne sayisi": "kullanim",
  "onbellek isabet orani": "kullanim",
  "taranan kayit sayisi": "kullanim",
  "musteri basina is payi": "kullanim",
  "reddedilen yetkisiz istek": "guvenlik",
  "hiz siniri tetiklenmesi": "guvenlik",
};

const TANI = {
  "mesgul veritabani": ["depo sorgu suresi", "islemci dolulugu", "yanit suresi yuzdeligi"],
  "mesgul on yuz": ["tasinan govde bayti", "yanit suresi yuzdeligi"],
  "gevezelik eden g/c": ["istek basina cagri sayisi", "yanit suresi yuzdeligi"],
  "asiri veri cekme": ["tasinan govde bayti", "onbellek isabet orani"],
  "hatali nesne yaratimi": ["bellekteki nesne sayisi", "islemci dolulugu"],
  "tek parca kalicilik": ["taranan kayit sayisi", "depo sorgu suresi", "islemci dolulugu"],
  "onbelleksizlik": ["onbellek isabet orani", "islemci dolulugu", "yanit suresi yuzdeligi"],
  "gurultulu komsu": ["musteri basina is payi", "yanit suresi yuzdeligi", "hiz siniri tetiklenmesi"],
  "eszamanli g/c": ["havuz dolulugu", "hazir olma durumu", "yanit suresi yuzdeligi"],
  "yeniden deneme firtinasi": ["istek basari orani", "istek basina cagri sayisi",
    "kopya havuz durumu", "hiz siniri tetiklenmesi"],
};

const KATEGORI = [...new Set(Object.values(OLCUT))];
const kategorisi = (o) => OLCUT[o];
const tanilar = Object.keys(TANI);

console.log(`${KATEGORI.length} kategori, ${Object.keys(OLCUT).length} olcut, ${tanilar.length} tani`);
console.log(`\n${"kategori".padEnd(18)}${"olcut".padStart(7)}${"besledigi tani".padStart(16)}` +
  `${"kategori bos: dusen tani".padStart(26)}`);
const dusen = {};
for (const k of KATEGORI) {
  const olcutler = Object.keys(OLCUT).filter((o) => kategorisi(o) === k);
  dusen[k] = tanilar.filter((t) => TANI[t].some((o) => kategorisi(o) === k));
  console.log(`${k.padEnd(18)}${String(olcutler.length).padStart(7)}` +
    `${String(dusen[k].length).padStart(16)}` +
    `${`${dusen[k].length}/${tanilar.length}`.padStart(26)}`);
}
console.log(`hicbir kategori bos birakilamaz: en az yuk tasiyan kategori ` +
  `${KATEGORI.reduce((a, b) => (dusen[a].length <= dusen[b].length ? a : b))} ve o da ` +
  `${Math.min(...KATEGORI.map((k) => dusen[k].length))} taniyi dusuruyor`);

const sayim = Object.keys(OLCUT)
  .map((o) => [o, tanilar.filter((t) => TANI[t].includes(o)).length])
  .sort((a, b) => b[1] - a[1]);
const tekil = sayim.filter(([, n]) => n === 1).map(([o]) => o);
const sifir = sayim.filter(([, n]) => n === 0).map(([o]) => o);
console.log(`\nen cok paylasilan olcut = ${sayim[0][0]} (${sayim[0][1]}/${tanilar.length} tani), ` +
  `ikincisi ${sayim[1][0]} (${sayim[1][1]}/${tanilar.length})`);
console.log(`tek bir tanida gecen olcut (${tekil.length}): ${tekil.join(", ")}`);
console.log(`hicbir tanida gecmeyen olcut (${sifir.length}): ${sifir.join(", ")}`);

console.log(`\n${"tani".padEnd(26)}${"olcut".padStart(6)}${"kategori".padStart(10)}` +
  `${"ayirt eden (tek tanida gecen)".padStart(31)}`);
for (const t of tanilar) {
  const kats = new Set(TANI[t].map(kategorisi));
  const ayirt = TANI[t].filter((o) => tekil.includes(o));
  console.log(`${t.padEnd(26)}${String(TANI[t].length).padStart(6)}${String(kats.size).padStart(10)}` +
    `${(ayirt[0] ?? "-").padStart(31)}`);
}

const cift = [];
for (let i = 0; i < tanilar.length; i += 1)
  for (let j = i + 1; j < tanilar.length; j += 1) {
    const [a, b] = [tanilar[i], tanilar[j]];
    const ortak = TANI[a].filter((o) => TANI[b].includes(o));
    cift.push({ a, b, ortak });
  }
const enCok = Math.max(...cift.map((c) => c.ortak.length));
console.log(`\nen cok olcut paylasan tani ciftleri (ortak ${enCok} olcut):`);
for (const { a, b, ortak } of cift.filter((c) => c.ortak.length === enCok))
  console.log(`  ${a} / ${b} -> ortak ${ortak.join(" + ")}; ayiran ` +
    `${TANI[a].filter((o) => !ortak.includes(o)).join(" + ")} / ` +
    `${TANI[b].filter((o) => !ortak.includes(o)).join(" + ")}`);
5 kategori, 16 olcut, 10 tani

kategori            olcut  besledigi tani  kategori bos: dusen tani
erisilebilirlik         2               1                      1/10
saglik                  2               2                      2/10
basarim                 2               7                      7/10
kullanim                8              10                     10/10
guvenlik                2               2                      2/10
hicbir kategori bos birakilamaz: en az yuk tasiyan kategori erisilebilirlik ve o da 1 taniyi dusuruyor

en cok paylasilan olcut = yanit suresi yuzdeligi (6/10 tani), ikincisi islemci dolulugu (4/10)
tek bir tanida gecen olcut (7): istek basari orani, kopya havuz durumu, hazir olma durumu, havuz dolulugu, bellekteki nesne sayisi, taranan kayit sayisi, musteri basina is payi
hicbir tanida gecmeyen olcut (2): kesinti dakikasi, reddedilen yetkisiz istek

tani                       olcut  kategori  ayirt eden (tek tanida gecen)
mesgul veritabani              3         2                              -
mesgul on yuz                  2         2                              -
gevezelik eden g/c             2         2                              -
asiri veri cekme               2         1                              -
hatali nesne yaratimi          2         1        bellekteki nesne sayisi
tek parca kalicilik            3         2           taranan kayit sayisi
onbelleksizlik                 3         2                              -
gurultulu komsu                3         3         musteri basina is payi
eszamanli g/c                  3         3                 havuz dolulugu
yeniden deneme firtinasi       4         4             istek basari orani

en cok olcut paylasan tani ciftleri (ortak 2 olcut):
  mesgul veritabani / tek parca kalicilik -> ortak depo sorgu suresi + islemci dolulugu; ayiran yanit suresi yuzdeligi / taranan kayit sayisi
  mesgul veritabani / onbelleksizlik -> ortak islemci dolulugu + yanit suresi yuzdeligi; ayiran depo sorgu suresi / onbellek isabet orani

Kategori Boş Kalırsa

Birinci tablo eksiksizlik ölçüsünü veriyor. Kullanım kategorisi on tanının onunu birden besliyor: yalnız hizmet erişilebilirliği ve yanıt süresi toplayan bir sistemde on tanının hiçbiri yapılamaz. Bu şaşırtıcı görünmez ama sonucu serttir — bir belirtinin nedenini bulmak kaynağın ne kadarının harcandığını bilmeyi gerektirir, oysa kullanım ölçütleri toplanması en çok ihmal edilen kategoridir, çünkü kimse onlara bakmadan da hizmetin ayakta olduğunu görebilir.

Başarım yedi tanıyı besliyor. Kalan üç kategori bir ya da iki tanı besliyor ve buradaki sayının küçük olması onları isteğe bağlı yapmaz: erişilebilirlik hiç toplanmazsa yeniden deneme fırtınası kendiliğinden artan yükten ayrılamaz, sağlık hiç toplanmazsa eşzamanlı girdi/çıktı ile fırtına ayırt edilemez, güvenlik hiç toplanmazsa gürültülü komşu ile fırtına ayırt edilemez. Düşen tanılar başka kategoriden telafi edilmiyor; bu yüzden ölçü bir toplam değil, bir kapsamadır.

İki ölçüt hiçbir tanıda geçmiyor: kesinti dakikası ve reddedilen yetkisiz istek. Bu bir eksiklik değil, kategorinin tanımının sonucudur. Bir kategori yanıtladığı soruyla tanımlanır, mümkün kıldığı tanılarla değil. Kesinti dakikası hiçbir karşıt kalıbı ayırt etmez ama aylık 43,2 dakikalık bütçeyi harcayan tek sayıdır ve o bütçe olmadan hiçbir uyarı eşiği savunulamaz. Tanı listesine göre budanan bir ölçüt kümesi, tanı dışındaki soruları kaybeder.

Varsayımın duyarlılığı da tabloda okunuyor. IZ1’deki eşlemede işlemci doluluğu dört tanıya girdi veriyor ve meşgul veritabanı tanısının tek kullanım ölçütüdür; o ölçüt toplanmazsa bu tanının kullanım ayağı tümüyle kalkar. Eşlemeyi değiştirmek sütunun sayılarını değiştirir, ama hiçbir değişiklik beş kategoriden birini tümüyle yüksüz bırakmaz.

Tanı Ölçüt Bileşimidir

İkinci blok dersin ikinci sonucunu veriyor. Yanıt süresi yüzdeliği on tanının altısında geçiyor, işlemci doluluğu dördünde. En çok toplanan ölçüt en az ayırt eden ölçüttür. Bir yanıt süresi grafiğinin yükselmesi altı ayrı nedenin ortak belirtisidir ve tek başına hiçbirini göstermez; önceki konunun “yavaş bir tanı değildir” cümlesinin sayısal karşılığı budur.

Yedi ölçüt tek bir tanıda geçiyor ve bunlar imza ölçütleridir: bellekteki nesne sayısı, müşteri başına iş payı, taranan kayıt sayısı, havuz doluluğu, hazır olma durumu, kopya havuz durumu ve istek başarı oranı. Beş tanının imza ölçütü var, beşinin yok; ikinciler yalnız bileşimle ayrılır. Son iki satır bunun nasıl olduğunu gösteriyor. Meşgul veritabanı ile önbelleksizlik iki ölçütü paylaşıyor — işlemci doluluğu ve yanıt süresi yüzdeliği — ve ayrımı üçüncü ölçüt yapıyor: depo sorgu süresi mi büyüdü, yoksa önbellek isabet oranı mı düştü? Aynı biçimde meşgul veritabanı ile tek parça kalıcılık depo sorgu süresi ve işlemci doluluğunu paylaşıyor; ayrımı taranan kayıt sayısı yapıyor, çünkü tek depoya yığılmanın belirtisi bir sorgunun kendi veri sınıfının kat kat üstünde kayıt taramasıdır.

Bu, enstrümantasyon kararının biçimini de belirler: bir ölçüt tek başına değil, ayırt ettiği çift için toplanır. Bir ölçütün değerini “kaç tanıda geçtiği” değil, “hangi iki nedeni birbirinden ayırdığı” verir.

Özet

  • İzleme önceden belirlenmiş soruların yanıtını toplar; gözlemlenebilirlik önceden sorulmamış bir soruya toplanmış veriden yanıt verebilmektir.
  • Beş kategori sordukları soruyla tanımlanır: hizmet erişilebilirliği, sağlık, başarım, kullanım ve güvenlik; sağlık ucunun içeriği önceki kursta tasarlandı ve burada yalnız kategori olarak konur.
  • Eksiksizlik bir kapsama ölçüsüdür: kullanım kategorisi on tanının onunu, başarım yedisini besler; erişilebilirlik bir, sağlık ve güvenlik ikişer tanı besler ve hiçbiri boş bırakılamaz.
  • Kesinti dakikası ve reddedilen yetkisiz istek hiçbir tanıda geçmez ama toplanır; bir kategori mümkün kıldığı tanılarla değil, yanıtladığı soruyla tanımlanır.
  • En çok paylaşılan ölçüt en az ayırt eden ölçüttür: yanıt süresi yüzdeliği altı tanıda geçer, bu yüzden tek başına hiçbirini göstermez.
  • On altı ölçütten yedisi tek bir tanıda geçer ve o tanının imzasıdır; beş tanının imza ölçütü yoktur ve yalnız bileşimle ayrılır: meşgul veritabanı ile önbelleksizlik iki ölçütü paylaşır, ayrımı depo sorgu süresi ile önbellek isabet oranı yapar.

Sonraki Adım

Bu ders on altı ölçütü bir listeye koydu ve listenin eksiksizliğini kapsamayla sınadı, ama listenin bir bedeli olduğunu hiç hesaba katmadı. Her ölçüt üretilir, taşınır, saklanır ve okunur; her biri bir kod yoluna eklenir ve o kod yolu tepe uçtaki 513,89 isteğin her birinde çalışır. Ölçüt sayısı arttıkça toplanan kayıt sayısı da artar ve bir noktada izleme sisteminin ürettiği yük, izlediği sistemin yüküyle karşılaştırılabilir hâle gelir. Sonraki ders bu bedeli sayar: bir ölçütün istek başına ürettiği kayıt, gün başına saklanan bayt ve eklediği kod yolu bir yanda, mümkün kıldığı tanı öbür yanda tartılır; örnekleme ile toplulaştırmanın ucuzlatırken hangi bilgiyi kaybettiği ölçülür.

İ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