/gauge
// 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" }); // 3integrate({ samples: seats, window: sept, mode: "max" }); // 3integrate({ 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-secondsKoltuk 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.
Bunu kullanmadan nasıl yapardım
Bölüm başlığı “Bunu kullanmadan nasıl yapardım”Birkaç satırlık bir döngüdür:
// 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 valuesYazarken 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.