Skip to content

Commit 2251295

Browse files
authored
Pre-register more metrics in the blackholes (#552)
This commit pre-registers metrics in our blackholes, a peer to #544. I have made use of OnceCell in situations where a registered metrics needs to cross task boundaries. Fortunately in our blackholes we do not use labels in our metrics so this was a fairly total conversion. Signed-off-by: Brian L. Troutwine <brian.troutwine@datadoghq.com>
1 parent 7c38855 commit 2251295

6 files changed

Lines changed: 82 additions & 21 deletions

File tree

src/blackhole/http.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ use hyper::{
99
service::{make_service_fn, service_fn},
1010
Body, Request, Response, Server, StatusCode,
1111
};
12-
use once_cell::unsync::OnceCell;
12+
use metrics::{register_counter, Counter};
13+
use once_cell::{sync, unsync::OnceCell};
1314
use serde::{Deserialize, Serialize};
1415
use tower::ServiceBuilder;
1516
use tracing::{debug, error, info};
@@ -19,6 +20,18 @@ use crate::signals::Shutdown;
1920
#[allow(clippy::declare_interior_mutable_const)]
2021
const RESPONSE: OnceCell<Vec<u8>> = OnceCell::new();
2122

23+
static BYTES_RECEIVED: sync::OnceCell<Counter> = sync::OnceCell::new();
24+
#[inline]
25+
fn bytes_received() -> &'static Counter {
26+
BYTES_RECEIVED.get_or_init(|| register_counter!("bytes_received"))
27+
}
28+
29+
static REQUESTS_RECEIVED: sync::OnceCell<Counter> = sync::OnceCell::new();
30+
#[inline]
31+
fn requests_received() -> &'static Counter {
32+
REQUESTS_RECEIVED.get_or_init(|| register_counter!("requests_received"))
33+
}
34+
2235
fn default_concurrent_requests_max() -> usize {
2336
100
2437
}
@@ -105,7 +118,7 @@ async fn srv(
105118
req: Request<Body>,
106119
headers: HeaderMap,
107120
) -> Result<Response<Body>, hyper::Error> {
108-
metrics::counter!("requests_received", 1);
121+
requests_received().increment(1);
109122

110123
let (parts, body) = req.into_parts();
111124

@@ -114,7 +127,7 @@ async fn srv(
114127
match crate::codec::decode(parts.headers.get(hyper::header::CONTENT_ENCODING), bytes) {
115128
Err(response) => Ok(response),
116129
Ok(body) => {
117-
metrics::counter!("bytes_received", body.len() as u64);
130+
bytes_received().increment(body.len() as u64);
118131

119132
let mut okay = Response::default();
120133
*okay.status_mut() = status;

src/blackhole/sqs.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ use hyper::{
88
service::{make_service_fn, service_fn},
99
Body, Request, Response, Server, StatusCode,
1010
};
11+
use metrics::{register_counter, Counter};
12+
use once_cell::sync;
1113
use rand::{distributions::Alphanumeric, thread_rng, Rng};
1214
use serde::Deserialize;
1315
use tokio::time::Duration;
@@ -23,6 +25,18 @@ pub enum Error {
2325
Hyper(hyper::Error),
2426
}
2527

28+
static BYTES_RECEIVED: sync::OnceCell<Counter> = sync::OnceCell::new();
29+
#[inline]
30+
fn bytes_received() -> &'static Counter {
31+
BYTES_RECEIVED.get_or_init(|| register_counter!("bytes_received"))
32+
}
33+
34+
static REQUESTS_RECEIVED: sync::OnceCell<Counter> = sync::OnceCell::new();
35+
#[inline]
36+
fn requests_received() -> &'static Counter {
37+
REQUESTS_RECEIVED.get_or_init(|| register_counter!("requests_received"))
38+
}
39+
2640
fn default_concurrent_requests_max() -> usize {
2741
100
2842
}
@@ -200,10 +214,10 @@ impl DeleteMessageBatch {
200214
}
201215

202216
async fn srv(req: Request<Body>) -> Result<Response<Body>, hyper::Error> {
203-
metrics::counter!("requests_received", 1);
217+
requests_received().increment(1);
204218

205219
let bytes = body::to_bytes(req).await?;
206-
metrics::counter!("bytes_received", bytes.len() as u64);
220+
bytes_received().increment(bytes.len() as u64);
207221

208222
let action: Action = serde_qs::from_bytes(&bytes).unwrap();
209223

src/blackhole/tcp.rs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,27 @@
33
use std::{io, net::SocketAddr};
44

55
use futures::stream::StreamExt;
6-
use metrics::counter;
6+
use metrics::{register_counter, Counter};
7+
use once_cell::sync;
78
use serde::Deserialize;
89
use tokio::net::{TcpListener, TcpStream};
910
use tokio_util::io::ReaderStream;
1011
use tracing::info;
1112

1213
use crate::signals::Shutdown;
1314

15+
static BYTES_RECEIVED: sync::OnceCell<Counter> = sync::OnceCell::new();
16+
#[inline]
17+
fn bytes_received() -> &'static Counter {
18+
BYTES_RECEIVED.get_or_init(|| register_counter!("bytes_received"))
19+
}
20+
21+
static MESSAGE_RECEIVED: sync::OnceCell<Counter> = sync::OnceCell::new();
22+
#[inline]
23+
fn message_received() -> &'static Counter {
24+
MESSAGE_RECEIVED.get_or_init(|| register_counter!("message_received"))
25+
}
26+
1427
#[derive(Debug)]
1528
/// Errors emitted by [`Tcp`]
1629
pub enum Error {
@@ -46,9 +59,9 @@ impl Tcp {
4659
let mut stream = ReaderStream::new(socket);
4760

4861
while let Some(msg) = stream.next().await {
49-
counter!("message_received", 1);
62+
message_received().increment(1);
5063
if let Ok(msg) = msg {
51-
counter!("bytes_received", msg.len() as u64);
64+
bytes_received().increment(msg.len() as u64);
5265
}
5366
}
5467
}
@@ -70,11 +83,13 @@ impl Tcp {
7083
.await
7184
.map_err(Error::Io)?;
7285

86+
let connection_accepted = register_counter!("connection_accepted");
87+
7388
loop {
7489
tokio::select! {
7590
conn = listener.accept() => {
7691
let (socket, _) = conn.map_err(Error::Io)?;
77-
counter!("connection_accepted", 1);
92+
connection_accepted.increment(1);
7893
tokio::spawn(async move {
7994
Self::handle_connection(socket).await;
8095
});

src/blackhole/udp.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
use std::{io, net::SocketAddr};
44

5-
use metrics::counter;
5+
use metrics::register_counter;
66
use serde::Deserialize;
77
use tokio::net::UdpSocket;
88
use tracing::info;
@@ -56,14 +56,17 @@ impl Udp {
5656
let socket = UdpSocket::bind(&self.binding_addr)
5757
.await
5858
.map_err(Error::Io)?;
59-
let mut buf: Vec<u8> = vec![0; 65536];
59+
let mut buf = [0; 65536];
60+
61+
let bytes_received = register_counter!("bytes_received");
62+
let packet_received = register_counter!("packet_received");
6063

6164
loop {
6265
tokio::select! {
6366
packet = socket.recv_from(&mut buf) => {
6467
let (bytes, _) = packet.map_err(Error::Io)?;
65-
counter!("packet_received", 1);
66-
counter!("bytes_received", bytes as u64);
68+
packet_received.increment(1);
69+
bytes_received.increment(bytes as u64);
6770
}
6871
_ = self.shutdown.recv() => {
6972
info!("shutdown signal received");

src/blackhole/unix_datagram.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use std::{io, path::PathBuf};
44

55
use futures::TryFutureExt;
6-
use metrics::counter;
6+
use metrics::register_counter;
77
use serde::Deserialize;
88
use tokio::net;
99
use tracing::info;
@@ -58,14 +58,15 @@ impl UnixDatagram {
5858
// socket, ignore any errors.
5959
let _res = tokio::fs::remove_file(&self.path).map_err(Error::Io);
6060
let socket = net::UnixDatagram::bind(&self.path).map_err(Error::Io)?;
61+
let mut buf = [0; 65536];
6162

62-
loop {
63-
let mut buf = [0; 65536];
63+
let bytes_received = register_counter!("bytes_received");
6464

65+
loop {
6566
tokio::select! {
6667
res = socket.recv(&mut buf) => {
6768
let n: usize = res.map_err(Error::Io)?;
68-
counter!("bytes_received", n as u64);
69+
bytes_received.increment(n as u64);
6970
}
7071
_ = self.shutdown.recv() => {
7172
info!("shutdown signal received");

src/blackhole/unix_stream.rs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,27 @@
33
use std::{io, path::PathBuf};
44

55
use futures::StreamExt;
6-
use metrics::counter;
6+
use metrics::{register_counter, Counter};
7+
use once_cell::sync;
78
use serde::Deserialize;
89
use tokio::net;
910
use tokio_util::io::ReaderStream;
1011
use tracing::info;
1112

1213
use crate::signals::Shutdown;
1314

15+
static BYTES_RECEIVED: sync::OnceCell<Counter> = sync::OnceCell::new();
16+
#[inline]
17+
fn bytes_received() -> &'static Counter {
18+
BYTES_RECEIVED.get_or_init(|| register_counter!("bytes_received"))
19+
}
20+
21+
static MESSAGE_RECEIVED: sync::OnceCell<Counter> = sync::OnceCell::new();
22+
#[inline]
23+
fn message_received() -> &'static Counter {
24+
MESSAGE_RECEIVED.get_or_init(|| register_counter!("message_received"))
25+
}
26+
1427
#[derive(Debug)]
1528
/// Errors produced by [`UnixStream`].
1629
pub enum Error {
@@ -57,11 +70,13 @@ impl UnixStream {
5770
pub async fn run(mut self) -> Result<(), Error> {
5871
let listener = net::UnixListener::bind(&self.path).map_err(Error::Io)?;
5972

73+
let connection_accepted = register_counter!("connection_accepted");
74+
6075
loop {
6176
tokio::select! {
6277
conn = listener.accept() => {
6378
let (socket, _) = conn.map_err(Error::Io)?;
64-
counter!("connection_accepted", 1);
79+
connection_accepted.increment(1);
6580
tokio::spawn(async move {
6681
Self::handle_connection(socket).await;
6782
});
@@ -78,9 +93,9 @@ impl UnixStream {
7893
let mut stream = ReaderStream::new(socket);
7994

8095
while let Some(msg) = stream.next().await {
81-
counter!("message_received", 1);
96+
message_received().increment(1);
8297
if let Ok(msg) = msg {
83-
counter!("bytes_received", msg.len() as u64);
98+
bytes_received().increment(msg.len() as u64);
8499
}
85100
}
86101
}

0 commit comments

Comments
 (0)