---
title: 'Hata Bütçesi'
source: 'https://academia.sh/tr/kurslar/gozlemlenebilirlik/hata-butcesi'
course: 'Gözlemlenebilirlik ve Güvenilirlik'
language: tr
updated: '2026-08-17T18:06:52+00:00'
license: 'CC BY-SA 4.0'
---

# Hata Bütçesi

Hedefin tersinin harcanabilir bir sayıya çevrilmesi: bütçenin ödünç sisteminin gerçek istek kayıtlarından kötü istek adedi olarak hesaplanması, dört yayın hızının bu bütçeyi hangi hızla tükettiğinin sayılması ve bütçe bittiğinde yayın kapısının kaç yayını engelleyip aşımı ne kadar küçülttüğünün ölçülmesi.

Önceki ders dört sinyali dakika çözünürlüğünde hesapladı; artık bir hedefin altına düşüldüğü
anlaşılabiliyor. Altına düşüldüğünde **ne olacağı** hâlâ yazılı değil. Ödünç sistemine haftada iki
yayın da yapılabilir, günde iki yayın da; her yayın kayıtlarda ölçülebilir bir iz bırakır ve hedefin
altında geçen her dakika bir yerden ödenir. Bu ders o ödemenin defterini tutar.

## Bütçe Telemetriden Çıkar

Hedef yüzde 99,9 ise, isteklerin binde biri kötü olabilir. Bu oran bir **adede** çevrildiğinde
harcanabilir bir büyüklük olur: otuz günde kaç istek geldiyse binde biri o ayın **hata bütçesidir**.
Bütçe, kalanı okunabilen, günlük tüketimi çizilebilen ve bittiği gün belli olan bir sayıdır.

Sistem Tasarımına Giriş kursu aynı büyüklüğü aylık kesinti dakikası olarak kurmuştu; yüzde ile
dakika arasındaki çevrim orada yapıldı ve burada tekrarlanmaz. Buradaki fark bölenin nereden
geldiğidir: bütçe istek kaydından hesaplandığında **trafikle birlikte değişir.** Trafik iki katına
çıkarsa izin verilen kötü istek sayısı da iki katına çıkar, çünkü aynı oran daha büyük bir tabana
uygulanır. Dakika cinsinden yazılmış bir bütçede bu esneme yoktur.

## Yayın Hızı Bütçeyi Nasıl Yer

Aşağıdaki koşum otuz günü dakika dakika yürütür. Yayınlar sabit aralıklarla yapılır, her yayın bir
olasılıkla bozulma bırakır ve bozulmanın şiddeti ile süresi **yayının büyüklüğüne** bağlıdır. Yayın
büyüklüğünün ölçüsü, iki yayın arasında geçen gün sayısıdır: aralık uzadıkça yayın daha çok
değişiklik taşır.

```js
// butce/kosum.mjs — hata butcesi telemetriden cikar: hedef %99,9 ise izin verilen kotu istek
// sayisi toplam istegin binde 1'idir. Oranlar on binde birimindedir.
export const DK = 30 * 1440, TOHUM = 20260731, HEDEF = 0.999, TABAN = 2;
const uret = (t) => (n) => Math.floor(((t = (t * 1664525 + 1013904223) >>> 0) / 2 ** 32) * n);
const saat = (t) => Math.floor(t / 60) % 24;
export const istekDk = (t) => (saat(t) >= 8 && saat(t) < 22 ? 100 : 30);
export const TOPLAM = [...Array(DK)].reduce((a, _, t) => a + istekDk(t), 0);
export const BUTCE = Math.round(TOPLAM * (1 - HEDEF));
export const kapi = (kalan) => kalan > 0;        // yayin kapisi: butce bittiyse yayin yok

// SD1 (varsayim): yayin arasindaki gun buyudukce bozulmanin olasiligi, siddeti ve geri alma
// suresi buyur: olasilik %15 + %15*gun, siddet on binde 200 + 400*gun, sure 10 + 20*gun dk.
export function kosum(araGun, kapiAcik) {
  const rp = uret(TOHUM), rt = uret(TOHUM), periyot = Math.round(araGun * 1440);
  // araGun 0: hic yayin yapilmaz, taban hatanin tek basina yedigi olculur
  const p = Math.min(900, 150 + 150 * araGun), si = Math.min(2500, 200 + 400 * araGun);
  const sr = Math.min(120, Math.round(10 + 20 * araGun));
  let kalan = BUTCE, yayin = 0, bozulan = 0, engel = 0, bitti = 0, son = -1;
  const gunluk = [];
  for (let t = 0; t < DK; t += 1) {
    if (periyot > 0 && t >= 600 && (t - 600) % periyot === 0) {
      if (kapiAcik && !kapi(kalan)) engel += 1;
      else { yayin += 1; if (rp(1000) < p) { bozulan += 1; son = t + sr; } }
    }
    const oran = TABAN + (t < son ? si : 0);
    for (let i = 0, n = istekDk(t); i < n; i += 1) if (rt(10000) < oran) kalan -= 1;
    if (kalan <= 0 && bitti === 0) bitti = Math.floor(t / 1440) + 1;
    if ((t + 1) % 1440 === 0) gunluk.push(kalan / BUTCE);
  }
  return { yayin, bozulan, engel, bitti, harcanan: BUTCE - kalan, gunluk };
}

export const HIZ = [["yayin yok", 0], ["gunde 2", 0.5], ["gunde 1", 1],
  ["3 gunde 1", 3], ["5 gunde 1", 5]];

if (import.meta.filename === process.argv[1]) {
  console.log(`30 gunde ${TOPLAM} istek, hedef %99,9 -> butce ${BUTCE} kotu istek; taban hata ` +
    `on binde ${TABAN} tek basina ${Math.round((TOPLAM * TABAN) / 10000)} istek yer`);
  console.log(`\n${"yayin araligi".padEnd(15)}${"yayin".padStart(7)}${"bozulan".padStart(9)}` +
    `${"bozuk dakika".padStart(14)}${"harcanan".padStart(10)}${"butcenin".padStart(10)}` +
    `${"biten gun".padStart(11)}`);
  for (const [ad, g] of HIZ) {
    const r = kosum(g, false), dk = r.bozulan * Math.min(120, Math.round(10 + 20 * g));
    console.log(`${ad.padEnd(15)}${String(r.yayin).padStart(7)}${String(r.bozulan).padStart(9)}` +
      `${(dk + " dk").padStart(14)}${String(r.harcanan).padStart(10)}` +
      `${`%${(100 * r.harcanan / BUTCE).toFixed(1)}`.padStart(10)}` +
      `${(r.bitti ? `${r.bitti}.` : "-").padStart(11)}`);
  }
}
```

```
30 gunde 3060000 istek, hedef %99,9 -> butce 3060 kotu istek; taban hata on binde 2 tek basina 612 istek yer

yayin araligi    yayin  bozulan  bozuk dakika  harcanan  butcenin  biten gun
yayin yok            0        0          0 dk       631     %20.6          -
gunde 2             60       13        260 dk      1486     %48.6          -
gunde 1             30        6        180 dk      1717     %56.1          -
3 gunde 1           10        5        350 dk      5523    %180.5        16.
5 gunde 1            6        4        440 dk     10248    %334.9         6.
```

## Sayı Değil, Büyüklük

İlk satır bütçenin bir kısmının değişimle hiç ilgisi olmadığını söylüyor: hiç yayın yapılmadığında
bile taban hata otuz günde bütçenin yüzde 20,6'sını yiyor. Ay boyunca dokunulmayan bir sistemin
bile bütçesi vardır ve tamamı değişime ayrılamaz.

Asıl karşıtlık ikinci ve dördüncü satırlar arasında. Günde iki yayın yapan takım ayda **60 yayın**
çıkardı ve bütçenin yüzde 48,6'sını harcadı; üç günde bir yayın yapan takım **10 yayın** çıkardı ve
bütçenin yüzde 180,5'ini harcadı, üstelik bütçe 16. günde bitti. Altı kat daha çok yayın, üçte bir
kadar tüketim.

Aradaki fark yayın başına düşen maliyette görünüyor. Taban tüketimi (631) çıkarıldığında günde iki
yayın hızında yayınlara düşen 855 kötü istek var: yayın başına 14. Üç günde bir hızında yayınlara
düşen 4.892 kötü istek var: yayın başına 489. Otuz beş kat. Bozuk dakika sütunu nedenini gösteriyor:
hızlı hızda 13 bozulma oldu ama toplam 260 dakika sürdü, yavaş hızda 5 bozulma oldu ve 350 dakika
sürdü. Bozulma **sayısı** hızlı takımda daha yüksek, bozulmanın **süresi ve şiddeti** yavaş takımda
daha yüksek, ve bütçeyi yiyen ikincisidir.

Bu sonuç SD1'in içinde saklıdır ve orada tartışılmalıdır: model, bir bozulmanın olasılığının,
şiddetinin ve geri alma süresinin yayın büyüklüğüyle arttığını varsayar. Varsayım değişirse tablo
da değişir. Varsayımı ölçüye çevirmenin yolu telemetride yazılıdır: her yayının zamanı işaretlenir,
yayından sonraki bozulma penceresi kayıtlardan çıkarılır ve üç parametre — olasılık, şiddet, süre —
yayın büyüklüğüne karşı çizilir. Bu üç sayı ölçüldükten sonra yayın hızı tartışması bir tercih
tartışması olmaktan çıkar.

## Bütçe Bittiğinde

Bütçe bir izin belgesidir: kalan pozitifken değişim serbesttir, tükendiğinde öncelik kararlılığa
döner. Bunun kodda karşılığı tek satırlık bir kapıdır — `kapi(kalan)` yanlış döndüğünde yayın
yapılmaz. Aşağıdaki koşum aynı dört hızı kapı kapalı ve açık olmak üzere iki kez yürütür.

```js
// butce/kapi.mjs — yayin kapisi acikken ne degisir: butce bittiginde yayin engellenir.
// Ayni dort yayin araligi, kapi kapali ve acik olmak uzere iki kez kosulur.
import { kosum, HIZ, BUTCE } from "./kosum.mjs";
const y = (x) => `%${(100 * x).toFixed(1)}`;

console.log(`butce ${BUTCE} kotu istek\n`);
console.log(`${"yayin araligi".padEnd(15)}${"kapi".padStart(8)}${"yayin".padStart(7)}` +
  `${"engellenen".padStart(12)}${"harcanan".padStart(10)}${"butcenin".padStart(10)}` +
  `${"asim".padStart(9)}`);
for (const [ad, g] of HIZ)
  for (const acik of [false, true]) {
    const r = kosum(g, acik);
    console.log(`${ad.padEnd(15)}${(acik ? "acik" : "kapali").padStart(8)}` +
      `${String(r.yayin).padStart(7)}${String(r.engel).padStart(12)}` +
      `${String(r.harcanan).padStart(10)}${y(r.harcanan / BUTCE).padStart(10)}` +
      `${(r.harcanan > BUTCE ? String(r.harcanan - BUTCE) : "-").padStart(9)}`);
  }

const GUN = [3, 6, 9, 12, 15, 18, 21, 24, 27, 30];
console.log(`\nkalan butce (kapi kapali)\n${"gun".padEnd(15)}${GUN.map((g) => String(g).padStart(8)).join("")}`);
for (const [ad, g] of HIZ) {
  const r = kosum(g, false);
  console.log(`${ad.padEnd(15)}${GUN.map((d) => y(r.gunluk[d - 1]).padStart(8)).join("")}`);
}
```

```
butce 3060 kotu istek

yayin araligi      kapi  yayin  engellenen  harcanan  butcenin     asim
yayin yok        kapali      0           0       631     %20.6        -
yayin yok          acik      0           0       631     %20.6        -
gunde 2          kapali     60           0      1486     %48.6        -
gunde 2            acik     60           0      1486     %48.6        -
gunde 1          kapali     30           0      1717     %56.1        -
gunde 1            acik     30           0      1717     %56.1        -
3 gunde 1        kapali     10           0      5523    %180.5     2463
3 gunde 1          acik      6           4      3531    %115.4      471
5 gunde 1        kapali      6           0     10248    %334.9     7188
5 gunde 1          acik      2           4      5416    %177.0     2356

kalan butce (kapi kapali)
gun                   3       6       9      12      15      18      21      24      27      30
yayin yok         %98.0   %96.2   %93.5   %91.2   %89.2   %87.2   %85.3   %82.9   %81.2   %79.4
gunde 2           %98.0   %92.0   %86.7   %80.7   %76.2   %68.8   %63.9   %59.2   %56.8   %51.4
gunde 1           %98.0   %96.2   %93.5   %80.4   %78.3   %70.2   %62.1   %53.8   %45.7   %43.9
3 gunde 1         %67.0   %65.2   %62.5   %27.8   %25.8   %-7.6   %-9.5  %-43.9  %-45.7  %-80.5
5 gunde 1         %19.9  %-60.2  %-62.8  %-65.2  %-67.2 %-148.2 %-150.1 %-152.5 %-233.1 %-234.9
```

Kapı üç şeyi birden söylüyor. **Hızlı takımı hiç durdurmuyor:** günde iki ve günde bir yayın
satırlarında engellenen yayın sıfır, çünkü bütçe hiç tükenmiyor. Kapı bir yayın hızı sınırı değil,
bir bütçe sınırıdır; hızlı yayın yapan takım kapıyı hiç görmez.

**Yavaş takımda dört yayın engelleniyor** ve aşım 2.463'ten 471'e düşüyor: bütçenin ötesine geçen
tüketimin yüzde 81'i önleniyor. On yayının altısı yapılabiliyor, dördü ay sonuna kalıyor.

**Kapı geç kalır.** Açıkken bile 471 istek aşımı var, çünkü kapı bütçe bittikten sonra devreye
girer, önce değil. Kalan bütçe tablosu bunu gün gün gösteriyor: üç günde bir yayın yapan takımda
kalan 12. günde yüzde 27,8'e inmişti ve 18. günde eksiye geçti. Yüzde 27,8 görülen gün ile aşımın
başladığı gün arasında altı gün var ve o günlerde iki yayın daha yapıldı. Kapının tek başına
yetmemesinin nedeni budur: bir eşiği **aştıktan sonra** kapanan kapı, aşımın kendisini engellemez;
gereken şey bütçenin **tükenmeden önce** haber vermesidir.

## Özet

- Hata bütçesi hedefin tersinin istek kaydına uygulanmış hâlidir: otuz günde 3.060.000 istek ve
  yüzde 99,9 hedefi 3.060 kötü isteklik bir bütçe verir, ve bu bütçe trafikle birlikte esner.
- Bütçenin bir kısmı değişimle ilgisizdir: hiç yayın yapılmadan taban hata bütçenin yüzde 20,6'sını
  yedi.
- Altı kat daha çok yayın daha çok tüketim demek değil: 60 yayın bütçenin yüzde 48,6'sını, 10 yayın
  yüzde 180,5'ini harcadı ve ikincisinde bütçe 16. günde bitti.
- Yayın başına maliyet 14 kötü isteğe karşı 489 kötü istek; bozulma sayısı hızlı takımda yüksek
  (13'e 5), bozulmanın süresi yavaş takımda yüksek (260 dakikaya 350 dakika) ve bütçeyi yiyen
  süredir.
- Yayın kapısı tek satırlık bir koşuldur ve hızlı takımı hiç durdurmaz; yavaş takımda dört yayını
  engelleyerek aşımı 2.463'ten 471'e indirdi.
- Kapı bütçe bittikten sonra kapandığı için aşımın tamamını önleyemez; bütçe tükenmeden önce haber
  veren bir düzenek gerekir.

## Sonraki Adım

Kalan bütçe tablosundaki her satır ay sonunda okunabiliyor, oysa karar 12. günde verilmeliydi. O
gün kimse tabloya bakmıyorsa sayının bir değeri yok — birinin çağrılması gerekir. Çağrının hangi
kuraldan doğacağı ise açık bir soru: kural bildirim kuyruğunun derinliğine mi bakar, ödünç
servisinin bellek kullanımına mı, yoksa doğrudan üyenin gördüğü hata oranına mı? Bu seçim uyarı
sayısını, aynı olayda kaç kez çalındığını ve hiç çalmayan olayların sayısını belirler. Sonraki ders
iki ayrı kural kümesini aynı olayların üzerinden geçirir ve ikisini bu üç sayıyla karşılaştırır.
