İçeriğe geç

/gauge

docs/src/snippets/modules.test.ts
// import { integrate, window } from "pricemeter/gauge";
const sept = window({ from: Date.parse("2026-09-01T00:00:00Z"), to: Date.parse("2026-10-01T00:00:00Z") });
const seats = [
{ at: Date.parse("2026-08-20T00:00:00Z"), value: 2 }, // before the window: the starting level
{ at: Date.parse("2026-09-16T00:00:00Z"), value: 3 }, // one seat added mid-month
];
integrate({ samples: seats, window: sept, mode: "last" }); // 3
integrate({ samples: seats, window: sept, mode: "max" }); // 3
integrate({ samples: seats, window: sept, mode: "time_weighted", unit: "s" }); // 6_480_000 seat-seconds
// 2 seats × 30 days + 1 seat × 15 days = 75 seat-days = 6,480,000 seat-seconds

Koltuk sayısı, depolanan GB, açık instance: bunlar olay değil seviyedir. pricemeter/gauge uygulamanın tuttuğu seviye örneklerini dönem sonunda tek bir tamsayı miktara indirger; o miktar sıradan bir observe ile fiyatlanır. Modül testindeki dikişi “gözlem miktarı üretmek”tir.

API Ne yapar
window({ from, to }) Yarı açık [from, to) pencere; boşsa ya da sonlu değilse fırlatır
integrate({ samples, window, mode, unit? }) Basamak fonksiyonunu pencere üzerinde toplar, yukarı yuvarlanmış tamsayı döner
mode Sonuç Tipik kullanım
last Pencerenin sonundaki seviye “ay sonunda kaç koltuk”
max Pencere içindeki en yüksek seviye aylık tepe GB (B10)
time_weighted Seviye × zaman, unit cinsinden (ms, s, h; varsayılan s) koltuk-saniye, per ile oranlama (B9)
  • Bir örnek { at, value }: value, at’ten bir sonraki örneğe kadar geçerlidir. Örnekler herhangi bir sırada verilebilir; ilk örnekten önceki seviye 0’dır.
  • Pencereden önceki örnekler başlangıç seviyesini belirler. Negatif ya da sonlu olmayan değer fırlatır.
  • Sonuç, float gürültüsü temizlenerek yukarı yuvarlanır.

Oranlama: time_weighted koltuk-saniye verir; tarife unitPriceMicroUsd: aylık fiyat, per: ayın saniyesi olur. Ayın yarısında eklenen koltuk yarı fiyattır. Dönem sonu gözlemi at: window.to − 1 ile yapılır (A98). Tam akış: SaaS koltuk örneği.

Birkaç satırlık bir döngüdür:

docs/src/snippets/modules.test.ts
// Without /gauge: walk the step function yourself.
let level = 0;
let t = sept.from;
let area = 0;
for (const s of [...seats].sort((a, b) => a.at - b.at)) {
if (s.at <= sept.from) level = s.value;
else if (s.at < sept.to) {
area += level * (s.at - t);
[t, level] = [s.at, s.value];
}
}
area += level * (sept.to - t);
Math.ceil(area / 1000); // 6_480_000 — then remember float noise, unsorted input and negative values

Yazarken dikkat edilecekler: sıralanmamış girdi, pencereden önceki başlangıç seviyesi, yarı açık pencere, float gürültüsünün tamsayıyı bir üste itmesi (ceil(2.0000000001)), negatif değerler. Seviyeleri zaten veritabanında zaman ağırlıklı topluyorsan (SUM(value × duration)) modüle gerek yoktur; çıkan sayıyı observe’a ver.