1use crate::admin::{Labels, ReqwestClient};
4use crate::consumer::{NodeMetric, convert_to_remote_write, populate_labels};
5use crate::histogram_relay::HistogramRelay;
6use crate::middleware::LenDelimProtobuf;
7use crate::peers::AllowedPeer;
8use axum::{
9 extract::{ConnectInfo, Extension},
10 http::StatusCode,
11};
12use multiaddr::Multiaddr;
13use once_cell::sync::Lazy;
14use prometheus::{CounterVec, HistogramVec};
15use prometheus::{register_counter_vec, register_histogram_vec};
16use std::net::SocketAddr;
17
18static HANDLER_HITS: Lazy<CounterVec> = Lazy::new(|| {
19 register_counter_vec!(
20 "http_handler_hits",
21 "Number of HTTP requests made.",
22 &["handler", "remote"]
23 )
24 .unwrap()
25});
26
27static HTTP_HANDLER_DURATION: Lazy<HistogramVec> = Lazy::new(|| {
28 register_histogram_vec!(
29 "http_handler_duration_seconds",
30 "The HTTP request latencies in seconds.",
31 &["handler", "remote"],
32 vec![
33 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.25, 4.5, 4.75,
34 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0
35 ],
36 )
37 .unwrap()
38});
39
40pub async fn publish_metrics(
45 Extension(labels): Extension<Labels>,
46 Extension(client): Extension<ReqwestClient>,
47 ConnectInfo(addr): ConnectInfo<SocketAddr>,
48 Extension(AllowedPeer { name, public_key }): Extension<AllowedPeer>,
49 Extension(relay): Extension<HistogramRelay>,
50 LenDelimProtobuf(data): LenDelimProtobuf,
51) -> (StatusCode, &'static str) {
52 HANDLER_HITS
53 .with_label_values(&["publish_metrics", &name])
54 .inc();
55 let timer = HTTP_HANDLER_DURATION
56 .with_label_values(&["publish_metrics", &name])
57 .start_timer();
58 let data = populate_labels(name, labels.network, labels.inventory_hostname, data);
59 relay.submit(data.clone());
60 let response = convert_to_remote_write(
61 client.clone(),
62 NodeMetric {
63 data,
64 peer_addr: Multiaddr::from(addr.ip()),
65 public_key,
66 },
67 )
68 .await;
69 timer.observe_duration();
70 response
71}