mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-17 21:15:32 +09:00
fix(gifs): bound shard cache memory
This commit is contained in:
1 parent
5015452280
commit
c0048504db
7 files changed
+642
-77
No files matched your search
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in new issue
Block a user