use crate::LOG_TARGET;
use pingora::upstreams::peer::Tracing;
use std::sync::Arc;
use std::sync::atomic::{AtomicI32, Ordering};
use tracing::debug;
#[derive(Clone, Debug)]
pub(crate) struct UpstreamPeerTracer {
name: String,
connected: Arc<AtomicI32>, }
impl UpstreamPeerTracer {
pub fn new(name: &str) -> Self {
Self {
name: name.to_string(),
connected: Arc::new(AtomicI32::new(0)),
}
}
#[inline]
pub fn connected(&self) -> i32 {
self.connected.load(Ordering::Relaxed)
}
}
impl Tracing for UpstreamPeerTracer {
fn on_connected(&self) {
debug!(
target: LOG_TARGET,
name = self.name,
"upstream peer connected"
);
self.connected.fetch_add(1, Ordering::Relaxed);
}
fn on_disconnected(&self) {
debug!(
target: LOG_TARGET,
name = self.name,
"upstream peer disconnected"
);
self.connected.fetch_sub(1, Ordering::Relaxed);
}
fn boxed_clone(&self) -> Box<dyn Tracing> {
Box::new(self.clone())
}
}
#[cfg(test)]
mod tests {
use super::UpstreamPeerTracer;
use pingora::upstreams::peer::Tracing;
use pretty_assertions::assert_eq;
#[test]
fn test_upstream_peer_tracer() {
let tracer = UpstreamPeerTracer::new("upstreamname");
tracer.on_connected();
assert_eq!(1, tracer.connected());
tracer.on_disconnected();
assert_eq!(0, tracer.connected());
}
}