sui_proxy/
handlers.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3use 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
40/// Publish handler which receives metrics from nodes.  Nodes will call us at this endpoint
41/// and we relay them to the upstream tsdb
42///
43/// Clients will receive a response after successfully relaying the metrics upstream
44pub 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}