Separate metrics for messages sent & received (#2721)

* metered channel - sent & received

* Add for readouts

* metrics for both sent & received

* retract on send failure
This commit is contained in:
Robert Habermeier
2021-03-26 14:11:01 +01:00
committed by GitHub
parent 064df81ee4
commit 73b9247c10
6 changed files with 140 additions and 56 deletions
+13 -10
View File
@@ -54,8 +54,7 @@ impl<T> Stream for UnboundedMeteredReceiver<T> {
fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
match mpsc::UnboundedReceiver::poll_next(Pin::new(&mut self.inner), cx) {
Poll::Ready(x) => {
// always use Ordering::SeqCst to avoid underflows
self.meter.fill.fetch_sub(1, Ordering::SeqCst);
self.meter.note_received();
Poll::Ready(x)
}
other => other,
@@ -78,7 +77,7 @@ impl<T> UnboundedMeteredReceiver<T> {
pub fn try_next(&mut self) -> Result<Option<T>, mpsc::TryRecvError> {
match self.inner.try_next()? {
Some(x) => {
self.meter.fill.fetch_sub(1, Ordering::SeqCst);
self.meter.note_received();
Ok(Some(x))
}
None => Ok(None),
@@ -131,18 +130,23 @@ impl<T> UnboundedMeteredSender<T> {
where
Self: Unpin,
{
self.meter.fill.fetch_add(1, Ordering::SeqCst);
self.meter.note_sent();
let fut = self.inner.send(item);
futures::pin_mut!(fut);
fut.await
fut.await.map_err(|e| {
self.meter.retract_sent();
e
})
}
/// Attempt to send message or fail immediately.
pub fn unbounded_send(&mut self, msg: T) -> result::Result<(), mpsc::TrySendError<T>> {
self.inner.unbounded_send(msg)?;
self.meter.fill.fetch_add(1, Ordering::SeqCst);
Ok(())
self.meter.note_sent();
self.inner.unbounded_send(msg).map_err(|e| {
self.meter.retract_sent();
e
})
}
}
@@ -160,7 +164,6 @@ impl<T> futures::sink::Sink<T> for UnboundedMeteredSender<T> {
fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
match Pin::new(&mut self.inner).poll_ready(cx) {
val @ Poll::Ready(_)=> {
self.meter.fill.store(0, Ordering::SeqCst);
val
}
other => other,
@@ -170,7 +173,7 @@ impl<T> futures::sink::Sink<T> for UnboundedMeteredSender<T> {
fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
match Pin::new(&mut self.inner).poll_ready(cx) {
val @ Poll::Ready(_)=> {
self.meter.fill.fetch_add(1, Ordering::SeqCst);
self.meter.note_sent();
val
}
other => other,