proxy: remove unused metrics (#826)

This PR removes the unused `request_duration_ms` and `response_duration_ms` histogram metrics from the proxy. It also removes them from the `simulate-proxy` script's output, and from `docs/proxy-metrics.md`

Closes #821
This commit is contained in:
Eliza Weisman 2018-04-23 16:05:20 -07:00 committed by GitHub
parent d27782b9d0
commit 3511801b1c
2 changed files with 9 additions and 107 deletions

View File

@ -61,10 +61,8 @@ pub use self::labels::DstLabels;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
struct Metrics { struct Metrics {
request_total: Metric<Counter, Arc<RequestLabels>>, request_total: Metric<Counter, Arc<RequestLabels>>,
request_duration: Metric<Histogram, Arc<RequestLabels>>,
response_total: Metric<Counter, Arc<ResponseLabels>>, response_total: Metric<Counter, Arc<ResponseLabels>>,
response_duration: Metric<Histogram, Arc<ResponseLabels>>,
response_latency: Metric<Histogram, Arc<ResponseLabels>>, response_latency: Metric<Histogram, Arc<ResponseLabels>>,
tcp_accept_open_total: Metric<Counter, Arc<TransportLabels>>, tcp_accept_open_total: Metric<Counter, Arc<TransportLabels>>,
@ -152,25 +150,11 @@ impl Metrics {
"A counter of the number of requests the proxy has received.", "A counter of the number of requests the proxy has received.",
); );
let request_duration = Metric::<Histogram, Arc<RequestLabels>>::new(
"request_duration_ms",
"A histogram of the duration of a request. This is measured from \
when the request headers are received to when the request \
stream has completed.",
);
let response_total = Metric::<Counter, Arc<ResponseLabels>>::new( let response_total = Metric::<Counter, Arc<ResponseLabels>>::new(
"response_total", "response_total",
"A counter of the number of responses the proxy has received.", "A counter of the number of responses the proxy has received.",
); );
let response_duration = Metric::<Histogram, Arc<ResponseLabels>>::new(
"response_duration_ms",
"A histogram of the duration of a response. This is measured from \
when the response headers are received to when the response \
stream has completed.",
);
let response_latency = Metric::<Histogram, Arc<ResponseLabels>>::new( let response_latency = Metric::<Histogram, Arc<ResponseLabels>>::new(
"response_latency_ms", "response_latency_ms",
"A histogram of the total latency of a response. This is measured \ "A histogram of the total latency of a response. This is measured \
@ -219,9 +203,7 @@ impl Metrics {
Metrics { Metrics {
request_total, request_total,
request_duration,
response_total, response_total,
response_duration,
response_latency, response_latency,
tcp_accept_open_total, tcp_accept_open_total,
tcp_accept_close_total, tcp_accept_close_total,
@ -242,22 +224,6 @@ impl Metrics {
.or_insert_with(Counter::default) .or_insert_with(Counter::default)
} }
fn request_duration(&mut self,
labels: &Arc<RequestLabels>)
-> &mut Histogram {
self.request_duration.values
.entry(labels.clone())
.or_insert_with(Histogram::default)
}
fn response_duration(&mut self,
labels: &Arc<ResponseLabels>)
-> &mut Histogram {
self.response_duration.values
.entry(labels.clone())
.or_insert_with(Histogram::default)
}
fn response_latency(&mut self, fn response_latency(&mut self,
labels: &Arc<ResponseLabels>) labels: &Arc<ResponseLabels>)
-> &mut Histogram { -> &mut Histogram {
@ -334,9 +300,7 @@ impl Metrics {
impl fmt::Display for Metrics { impl fmt::Display for Metrics {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
writeln!(f, "{}", self.request_total)?; writeln!(f, "{}", self.request_total)?;
writeln!(f, "{}", self.request_duration)?;
writeln!(f, "{}", self.response_total)?; writeln!(f, "{}", self.response_total)?;
writeln!(f, "{}", self.response_duration)?;
writeln!(f, "{}", self.response_latency)?; writeln!(f, "{}", self.response_latency)?;
writeln!(f, "{}", self.tcp_accept_open_total)?; writeln!(f, "{}", self.tcp_accept_open_total)?;
writeln!(f, "{}", self.tcp_accept_close_total)?; writeln!(f, "{}", self.tcp_accept_close_total)?;
@ -504,21 +468,17 @@ impl Aggregate {
// when the stream *finishes*. // when the stream *finishes*.
}, },
Event::StreamRequestFail(ref req, ref fail) => { Event::StreamRequestFail(ref req, _) => {
let labels = Arc::new(RequestLabels::new(req)); let labels = Arc::new(RequestLabels::new(req));
self.update(|metrics| { self.update(|metrics| {
*metrics.request_duration(&labels) +=
fail.since_request_open;
*metrics.request_total(&labels).incr(); *metrics.request_total(&labels).incr();
}) })
}, },
Event::StreamRequestEnd(ref req, ref end) => { Event::StreamRequestEnd(ref req, _) => {
let labels = Arc::new(RequestLabels::new(req)); let labels = Arc::new(RequestLabels::new(req));
self.update(|metrics| { self.update(|metrics| {
*metrics.request_total(&labels).incr(); *metrics.request_total(&labels).incr();
*metrics.request_duration(&labels) +=
end.since_request_open;
}) })
}, },
@ -529,7 +489,6 @@ impl Aggregate {
)); ));
self.update(|metrics| { self.update(|metrics| {
*metrics.response_total(&labels).incr(); *metrics.response_total(&labels).incr();
*metrics.response_duration(&labels) += end.since_response_open;
*metrics.response_latency(&labels) += end.since_request_open; *metrics.response_latency(&labels) += end.since_request_open;
}); });
}, },
@ -539,7 +498,6 @@ impl Aggregate {
let labels = Arc::new(ResponseLabels::fail(res)); let labels = Arc::new(ResponseLabels::fail(res));
self.update(|metrics| { self.update(|metrics| {
*metrics.response_total(&labels).incr(); *metrics.response_total(&labels).incr();
*metrics.response_duration(&labels) += fail.since_response_open;
*metrics.response_latency(&labels) += fail.since_request_open; *metrics.response_latency(&labels) += fail.since_request_open;
}); });
}, },

View File

@ -403,48 +403,6 @@ fn metrics_endpoint_outbound_response_latency() {
"response_latency_ms_count{authority=\"tele.test.svc.cluster.local\",direction=\"outbound\",classification=\"success\",status_code=\"200\"} 4"); "response_latency_ms_count{authority=\"tele.test.svc.cluster.local\",direction=\"outbound\",classification=\"success\",status_code=\"200\"} 4");
} }
// https://github.com/runconduit/conduit/issues/613
#[test]
#[cfg_attr(not(feature = "flaky_tests"), ignore)]
fn metrics_endpoint_inbound_request_duration() {
let _ = env_logger::try_init();
let Fixture { client, metrics, proxy: _proxy } = Fixture::inbound();
// request with body should increment request_duration
info!("client.get(/)");
assert_eq!(client.get("/"), "hello");
assert_contains!(metrics.get("/metrics"),
"request_duration_ms_count{authority=\"tele.test.svc.cluster.local\",direction=\"inbound\"} 1");
// request without body should also increment request_duration
info!("client.get(/)");
assert_eq!(client.get("/"), "hello");
assert_contains!(metrics.get("/metrics"),
"request_duration_ms_count{authority=\"tele.test.svc.cluster.local\",direction=\"inbound\"} 2");
}
// https://github.com/runconduit/conduit/issues/613
#[test]
#[cfg_attr(not(feature = "flaky_tests"), ignore)]
fn metrics_endpoint_outbound_request_duration() {
let _ = env_logger::try_init();
let Fixture { client, metrics, proxy: _proxy } = Fixture::outbound();
info!("client.get(/)");
assert_eq!(client.get("/"), "hello");
assert_contains!(metrics.get("/metrics"),
"request_duration_ms_count{authority=\"tele.test.svc.cluster.local\",direction=\"outbound\"} 1");
info!("client.get(/)");
assert_eq!(client.get("/"), "hello");
assert_contains!(metrics.get("/metrics"),
"request_duration_ms_count{authority=\"tele.test.svc.cluster.local\",direction=\"outbound\"} 2");
}
// Tests for destination labels provided by control plane service discovery. // Tests for destination labels provided by control plane service discovery.
mod outbound_dst_labels { mod outbound_dst_labels {
use super::support::*; use super::support::*;
@ -544,9 +502,7 @@ mod outbound_dst_labels {
info!("client.get(/)"); info!("client.get(/)");
assert_eq!(client.get("/"), "hello"); assert_eq!(client.get("/"), "hello");
assert_contains!(metrics.get("/metrics"), assert_contains!(metrics.get("/metrics"),
"request_duration_ms_count{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"foo\",dst_set_label=\"bar\"} 1"); "response_latency_ms_count{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"foo\",dst_set_label=\"bar\",classification=\"success\",status_code=\"200\"} 1");
assert_contains!(metrics.get("/metrics"),
"response_duration_ms_count{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"foo\",dst_set_label=\"bar\",classification=\"success\",status_code=\"200\"} 1");
assert_contains!(metrics.get("/metrics"), assert_contains!(metrics.get("/metrics"),
"request_total{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"foo\",dst_set_label=\"bar\"} 1"); "request_total{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"foo\",dst_set_label=\"bar\"} 1");
assert_contains!(metrics.get("/metrics"), assert_contains!(metrics.get("/metrics"),
@ -578,9 +534,7 @@ mod outbound_dst_labels {
assert_eq!(client.get("/"), "hello"); assert_eq!(client.get("/"), "hello");
// the first request should be labeled with `dst_addr_label="foo"` // the first request should be labeled with `dst_addr_label="foo"`
assert_contains!(metrics.get("/metrics"), assert_contains!(metrics.get("/metrics"),
"request_duration_ms_count{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"foo\",dst_set_label=\"unchanged\"} 1"); "response_latency_ms_count{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"foo\",dst_set_label=\"unchanged\",classification=\"success\",status_code=\"200\"} 1");
assert_contains!(metrics.get("/metrics"),
"response_duration_ms_count{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"foo\",dst_set_label=\"unchanged\",classification=\"success\",status_code=\"200\"} 1");
assert_contains!(metrics.get("/metrics"), assert_contains!(metrics.get("/metrics"),
"request_total{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"foo\",dst_set_label=\"unchanged\"} 1"); "request_total{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"foo\",dst_set_label=\"unchanged\"} 1");
assert_contains!(metrics.get("/metrics"), assert_contains!(metrics.get("/metrics"),
@ -598,18 +552,14 @@ mod outbound_dst_labels {
assert_eq!(client.get("/"), "hello"); assert_eq!(client.get("/"), "hello");
// the second request should increment stats labeled with `dst_addr_label="bar"` // the second request should increment stats labeled with `dst_addr_label="bar"`
assert_contains!(metrics.get("/metrics"), assert_contains!(metrics.get("/metrics"),
"request_duration_ms_count{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"bar\",dst_set_label=\"unchanged\"} 1"); "response_latency_ms_count{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"bar\",dst_set_label=\"unchanged\",classification=\"success\",status_code=\"200\"} 1");
assert_contains!(metrics.get("/metrics"),
"response_duration_ms_count{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"bar\",dst_set_label=\"unchanged\",classification=\"success\",status_code=\"200\"} 1");
assert_contains!(metrics.get("/metrics"), assert_contains!(metrics.get("/metrics"),
"request_total{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"bar\",dst_set_label=\"unchanged\"} 1"); "request_total{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"bar\",dst_set_label=\"unchanged\"} 1");
assert_contains!(metrics.get("/metrics"), assert_contains!(metrics.get("/metrics"),
"response_total{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"bar\",dst_set_label=\"unchanged\",classification=\"success\",status_code=\"200\"} 1"); "response_total{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"bar\",dst_set_label=\"unchanged\",classification=\"success\",status_code=\"200\"} 1");
// stats recorded from the first request should still be present. // stats recorded from the first request should still be present.
assert_contains!(metrics.get("/metrics"), assert_contains!(metrics.get("/metrics"),
"request_duration_ms_count{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"foo\",dst_set_label=\"unchanged\"} 1"); "response_latency_ms_count{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"foo\",dst_set_label=\"unchanged\",classification=\"success\",status_code=\"200\"} 1");
assert_contains!(metrics.get("/metrics"),
"response_duration_ms_count{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"foo\",dst_set_label=\"unchanged\",classification=\"success\",status_code=\"200\"} 1");
assert_contains!(metrics.get("/metrics"), assert_contains!(metrics.get("/metrics"),
"request_total{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"foo\",dst_set_label=\"unchanged\"} 1"); "request_total{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_addr_label=\"foo\",dst_set_label=\"unchanged\"} 1");
assert_contains!(metrics.get("/metrics"), assert_contains!(metrics.get("/metrics"),
@ -639,9 +589,7 @@ mod outbound_dst_labels {
assert_eq!(client.get("/"), "hello"); assert_eq!(client.get("/"), "hello");
// the first request should be labeled with `dst_addr_label="foo"` // the first request should be labeled with `dst_addr_label="foo"`
assert_contains!(metrics.get("/metrics"), assert_contains!(metrics.get("/metrics"),
"request_duration_ms_count{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_set_label=\"foo\"} 1"); "response_latency_ms_count{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_set_label=\"foo\",classification=\"success\",status_code=\"200\"} 1");
assert_contains!(metrics.get("/metrics"),
"response_duration_ms_count{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_set_label=\"foo\",classification=\"success\",status_code=\"200\"} 1");
assert_contains!(metrics.get("/metrics"), assert_contains!(metrics.get("/metrics"),
"request_total{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_set_label=\"foo\"} 1"); "request_total{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_set_label=\"foo\"} 1");
assert_contains!(metrics.get("/metrics"), assert_contains!(metrics.get("/metrics"),
@ -658,18 +606,14 @@ mod outbound_dst_labels {
assert_eq!(client.get("/"), "hello"); assert_eq!(client.get("/"), "hello");
// the second request should increment stats labeled with `dst_addr_label="bar"` // the second request should increment stats labeled with `dst_addr_label="bar"`
assert_contains!(metrics.get("/metrics"), assert_contains!(metrics.get("/metrics"),
"request_duration_ms_count{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_set_label=\"bar\"} 1"); "response_latency_ms_count{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_set_label=\"bar\",classification=\"success\",status_code=\"200\"} 1");
assert_contains!(metrics.get("/metrics"),
"response_duration_ms_count{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_set_label=\"bar\",classification=\"success\",status_code=\"200\"} 1");
assert_contains!(metrics.get("/metrics"), assert_contains!(metrics.get("/metrics"),
"request_total{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_set_label=\"bar\"} 1"); "request_total{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_set_label=\"bar\"} 1");
assert_contains!(metrics.get("/metrics"), assert_contains!(metrics.get("/metrics"),
"response_total{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_set_label=\"bar\",classification=\"success\",status_code=\"200\"} 1"); "response_total{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_set_label=\"bar\",classification=\"success\",status_code=\"200\"} 1");
// stats recorded from the first request should still be present. // stats recorded from the first request should still be present.
assert_contains!(metrics.get("/metrics"), assert_contains!(metrics.get("/metrics"),
"request_duration_ms_count{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_set_label=\"foo\"} 1"); "response_latency_ms_count{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_set_label=\"foo\",classification=\"success\",status_code=\"200\"} 1");
assert_contains!(metrics.get("/metrics"),
"response_duration_ms_count{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_set_label=\"foo\",classification=\"success\",status_code=\"200\"} 1");
assert_contains!(metrics.get("/metrics"), assert_contains!(metrics.get("/metrics"),
"request_total{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_set_label=\"foo\"} 1"); "request_total{authority=\"labeled.test.svc.cluster.local\",direction=\"outbound\",dst_set_label=\"foo\"} 1");
assert_contains!(metrics.get("/metrics"), assert_contains!(metrics.get("/metrics"),