fix(gifs): bound shard cache memory

This commit is contained in:
Hampus authored and GitHub committed 2026-08-26 23:22:46 +02:00
1 parent 5015452280
commit c0048504db
7 files changed
+642 -77

No files matched your search

+15
View File
@@ -2,9 +2,11 @@
use libc::{CLOCK_MONOTONIC, clock_gettime, timespec};
use std::fmt::Write;
use std::sync::Arc;
use std::sync::atomic::{AtomicI64, AtomicU64, Ordering};
const ORDERING: Ordering = Ordering::Relaxed;
pub(crate) type AdditionalMetricsRenderer = Arc<dyn Fn(&mut String) + Send + Sync>;
const HISTOGRAM_BUCKETS_MS: &[u64] = &[
1, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000, 30000,
@@ -71,6 +73,7 @@ pub struct ServiceMetrics {
pub shard_forwards_total: AtomicU64,
pub request_duration: Histogram,
start_ms: AtomicI64,
additional_renderer: Option<AdditionalMetricsRenderer>,
}
impl Default for ServiceMetrics {
@@ -83,11 +86,19 @@ impl Default for ServiceMetrics {
shard_forwards_total: AtomicU64::new(0),
request_duration: Histogram::new(),
start_ms: AtomicI64::new(0),
additional_renderer: None,
}
}
}
impl ServiceMetrics {
pub(crate) fn with_additional_renderer(renderer: AdditionalMetricsRenderer) -> Self {
Self {
additional_renderer: Some(renderer),
..Self::default()
}
}
pub fn init(&self) {
self.start_ms.store(now_ms(), ORDERING);
}
@@ -167,6 +178,10 @@ impl ServiceMetrics {
uptime_ms as f64 / 1000.0,
);
if let Some(renderer) = self.additional_renderer.as_ref() {
renderer(&mut out);
}
out
}
}
+7 -1
View File
@@ -16,6 +16,7 @@ pub trait ShardService: Send + Sync + 'static {
type Response: serde::Serialize + serde::de::DeserializeOwned + Send + 'static;
fn service_name(&self) -> &str;
fn render_prometheus_metrics(&self, _output: &mut String) {}
fn handle(
&self,
request: Self::Request,
@@ -36,7 +37,12 @@ where
let shard_subject = format!("svc.{name}.shard.{shard_id}");
let health_addr = config.listen_addr;
let metrics = Arc::new(ServiceMetrics::default());
let metrics_service = service.clone();
let additional_renderer: Arc<dyn Fn(&mut String) + Send + Sync> =
Arc::new(move |output| metrics_service.render_prometheus_metrics(output));
let metrics = Arc::new(ServiceMetrics::with_additional_renderer(
additional_renderer,
));
metrics.init();
let is_serving = Arc::new(AtomicBool::new(false));