Merge branch 'metrics'
* metrics: Some initial metrics Prometheus metrics Add metricspull/5/head
commit
47890e7e5a
@ -0,0 +1,57 @@
|
||||
use crate::config::*;
|
||||
use crate::errors::*;
|
||||
use crate::varz::*;
|
||||
|
||||
use futures::prelude::*;
|
||||
use hyper::header::CONTENT_TYPE;
|
||||
use hyper::server::conn::Http;
|
||||
use hyper::service::service_fn;
|
||||
use hyper::{Body, Request, Response, StatusCode};
|
||||
use prometheus::{self, Encoder, TextEncoder};
|
||||
use std::sync::Arc;
|
||||
use tokio::net::TcpListener;
|
||||
use tokio::runtime::Runtime;
|
||||
|
||||
async fn handle_client_connection(
|
||||
req: Request<Body>,
|
||||
varz: Varz,
|
||||
path: Arc<String>,
|
||||
) -> Result<Response<Body>, Error> {
|
||||
let mut buffer = vec![];
|
||||
if req.uri().path() != path.as_str() {
|
||||
let response = Response::builder()
|
||||
.status(StatusCode::NOT_FOUND)
|
||||
.body(Body::empty())?;
|
||||
return Ok(response);
|
||||
}
|
||||
let StartInstant(start_instant) = varz.start_instant;
|
||||
let uptime = start_instant.elapsed().as_secs();
|
||||
varz.uptime.set(uptime as f64);
|
||||
let client_queries = varz.client_queries_udp.get() + varz.client_queries_tcp.get();
|
||||
varz.client_queries.set(client_queries);
|
||||
let metric_families = prometheus::gather();
|
||||
let encoder = TextEncoder::new();
|
||||
encoder.encode(&metric_families, &mut buffer)?;
|
||||
let response = Response::builder()
|
||||
.header(CONTENT_TYPE, encoder.format_type())
|
||||
.body(buffer.into())?;
|
||||
Ok(response)
|
||||
}
|
||||
|
||||
pub async fn prometheus_service(
|
||||
varz: Varz,
|
||||
metrics_config: MetricsConfig,
|
||||
runtime: Arc<Runtime>,
|
||||
) -> Result<(), Error> {
|
||||
let path = Arc::new(metrics_config.path);
|
||||
let mut stream = TcpListener::bind(metrics_config.listen_addr).await?;
|
||||
loop {
|
||||
let (client, _client_addr) = stream.accept().await?;
|
||||
let path = path.clone();
|
||||
let varz = varz.clone();
|
||||
let service =
|
||||
service_fn(move |req| handle_client_connection(req, varz.clone(), path.clone()));
|
||||
let connection = Http::new().serve_connection(client, service);
|
||||
runtime.spawn(connection.map(|_| {}));
|
||||
}
|
||||
}
|
@ -0,0 +1,184 @@
|
||||
use coarsetime::Instant;
|
||||
use prometheus::{Counter, Gauge, Histogram};
|
||||
use std::sync::Arc;
|
||||
|
||||
pub struct StartInstant(pub Instant);
|
||||
|
||||
pub struct Inner {
|
||||
pub start_instant: StartInstant,
|
||||
pub uptime: Gauge,
|
||||
pub cache_frequent_len: Gauge,
|
||||
pub cache_recent_len: Gauge,
|
||||
pub cache_test_len: Gauge,
|
||||
pub cache_inserted: Gauge,
|
||||
pub cache_evicted: Gauge,
|
||||
pub client_queries: Gauge,
|
||||
pub client_queries_udp: Counter,
|
||||
pub client_queries_tcp: Counter,
|
||||
pub client_queries_cached: Counter,
|
||||
pub client_queries_expired: Counter,
|
||||
pub client_queries_offline: Counter,
|
||||
pub client_queries_errors: Counter,
|
||||
pub inflight_udp_queries: Gauge,
|
||||
pub inflight_tcp_queries: Gauge,
|
||||
pub upstream_errors: Counter,
|
||||
pub upstream_sent: Counter,
|
||||
pub upstream_received: Counter,
|
||||
pub upstream_timeout: Counter,
|
||||
pub upstream_response_sizes: Histogram,
|
||||
}
|
||||
|
||||
pub type Varz = Arc<Inner>;
|
||||
|
||||
pub fn new() -> Varz {
|
||||
Arc::new(Inner::new())
|
||||
}
|
||||
|
||||
impl Inner {
|
||||
pub fn new() -> Inner {
|
||||
Inner {
|
||||
start_instant: StartInstant::default(),
|
||||
uptime: register_gauge!(opts!(
|
||||
"encrypted_dns_uptime",
|
||||
"Uptime",
|
||||
labels! {"handler" => "all",}
|
||||
))
|
||||
.unwrap(),
|
||||
cache_frequent_len: register_gauge!(opts!(
|
||||
"encrypted_dns_cache_frequent_len",
|
||||
"Number of entries in the cached set of \
|
||||
frequent items",
|
||||
labels! {"handler" => "all",}
|
||||
))
|
||||
.unwrap(),
|
||||
cache_recent_len: register_gauge!(opts!(
|
||||
"encrypted_dns_cache_recent_len",
|
||||
"Number of entries in the cached set of \
|
||||
recent items",
|
||||
labels! {"handler" => "all",}
|
||||
))
|
||||
.unwrap(),
|
||||
cache_test_len: register_gauge!(opts!(
|
||||
"encrypted_dns_cache_test_len",
|
||||
"Number of entries in the cached set of \
|
||||
staged items",
|
||||
labels! {"handler" => "all",}
|
||||
))
|
||||
.unwrap(),
|
||||
cache_inserted: register_gauge!(opts!(
|
||||
"encrypted_dns_cache_inserted",
|
||||
"Number of entries added to the cache",
|
||||
labels! {"handler" => "all",}
|
||||
))
|
||||
.unwrap(),
|
||||
cache_evicted: register_gauge!(opts!(
|
||||
"encrypted_dns_cache_evicted",
|
||||
"Number of entries evicted from the cache",
|
||||
labels! {"handler" => "all",}
|
||||
))
|
||||
.unwrap(),
|
||||
client_queries: register_gauge!(opts!(
|
||||
"encrypted_dns_client_queries",
|
||||
"Number of client queries received",
|
||||
labels! {"handler" => "all",}
|
||||
))
|
||||
.unwrap(),
|
||||
client_queries_udp: register_counter!(opts!(
|
||||
"encrypted_dns_client_queries_udp",
|
||||
"Number of client queries received \
|
||||
using UDP",
|
||||
labels! {"handler" => "all",}
|
||||
))
|
||||
.unwrap(),
|
||||
client_queries_tcp: register_counter!(opts!(
|
||||
"encrypted_dns_client_queries_tcp",
|
||||
"Number of client queries received \
|
||||
using TCP",
|
||||
labels! {"handler" => "all",}
|
||||
))
|
||||
.unwrap(),
|
||||
client_queries_cached: register_counter!(opts!(
|
||||
"encrypted_dns_client_queries_cached",
|
||||
"Number of client queries sent from \
|
||||
the cache",
|
||||
labels! {"handler" => "all",}
|
||||
))
|
||||
.unwrap(),
|
||||
client_queries_expired: register_counter!(opts!(
|
||||
"encrypted_dns_client_queries_expired",
|
||||
"Number of expired client queries",
|
||||
labels! {"handler" => "all",}
|
||||
))
|
||||
.unwrap(),
|
||||
client_queries_offline: register_counter!(opts!(
|
||||
"encrypted_dns_client_queries_offline",
|
||||
"Number of client queries answered \
|
||||
while upstream resolvers are \
|
||||
unresponsive",
|
||||
labels! {"handler" => "all",}
|
||||
))
|
||||
.unwrap(),
|
||||
client_queries_errors: register_counter!(opts!(
|
||||
"encrypted_dns_client_queries_errors",
|
||||
"Number of bogus client queries",
|
||||
labels! {"handler" => "all",}
|
||||
))
|
||||
.unwrap(),
|
||||
inflight_udp_queries: register_gauge!(opts!(
|
||||
"encrypted_dns_inflight_udp_queries",
|
||||
"Number of UDP queries currently waiting for a response",
|
||||
labels! {"handler" => "all",}
|
||||
))
|
||||
.unwrap(),
|
||||
inflight_tcp_queries: register_gauge!(opts!(
|
||||
"encrypted_dns_inflight_tcp_queries",
|
||||
"Number of TCP queries currently waiting for a response",
|
||||
labels! {"handler" => "all",}
|
||||
))
|
||||
.unwrap(),
|
||||
upstream_errors: register_counter!(opts!(
|
||||
"encrypted_dns_upstream_errors",
|
||||
"Number of bogus upstream servers responses",
|
||||
labels! {"handler" => "all",}
|
||||
))
|
||||
.unwrap(),
|
||||
upstream_sent: register_counter!(opts!(
|
||||
"encrypted_dns_upstream_sent",
|
||||
"Number of upstream servers queries sent",
|
||||
labels! {"handler" => "all",}
|
||||
))
|
||||
.unwrap(),
|
||||
upstream_received: register_counter!(opts!(
|
||||
"encrypted_dns_upstream_received",
|
||||
"Number of upstream servers responses received",
|
||||
labels! {"handler" => "all",}
|
||||
))
|
||||
.unwrap(),
|
||||
upstream_timeout: register_counter!(opts!(
|
||||
"encrypted_dns_upstream_timeout",
|
||||
"Number of upstream servers responses \
|
||||
having timed out",
|
||||
labels! {"handler" => "all",}
|
||||
))
|
||||
.unwrap(),
|
||||
upstream_response_sizes: register_histogram!(histogram_opts!(
|
||||
"encrypted_dns_upstream_response_sizes",
|
||||
"Response size in bytes",
|
||||
vec![64.0, 128.0, 192.0, 256.0, 512.0, 1024.0, 2048.0]
|
||||
))
|
||||
.unwrap(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for Inner {
|
||||
fn default() -> Self {
|
||||
Self::new()
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for StartInstant {
|
||||
fn default() -> StartInstant {
|
||||
StartInstant(Instant::now())
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue