Skip to content

Commit cadda88

Browse files
committed
graph, server: Measure query timings for successful and failed queries
Before, we weren't recording failed queries at all
1 parent 475b65b commit cadda88

File tree

2 files changed

+26
-25
lines changed

2 files changed

+26
-25
lines changed

graph/src/data/query/result.rs

+11
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,17 @@ impl QueryResults {
5757
pub fn first(&self) -> Option<&Arc<QueryResult>> {
5858
self.results.first()
5959
}
60+
61+
pub fn has_errors(&self) -> bool {
62+
self.results.iter().any(|result| result.has_errors())
63+
}
64+
65+
pub fn deployment_hash(&self) -> Option<&DeploymentHash> {
66+
self.results
67+
.iter()
68+
.filter_map(|result| result.deployment.as_ref())
69+
.next()
70+
}
6071
}
6172

6273
impl Serialize for QueryResults {

server/http/src/service.rs

+15-25
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::task::Context;
55
use std::task::Poll;
66
use std::time::Instant;
77

8+
use graph::data::query::QueryResults;
89
use graph::prelude::*;
910
use graph::{components::server::query::GraphQLServerError, data::query::QueryTarget};
1011
use http::header;
@@ -19,7 +20,6 @@ use crate::request::parse_graphql_request;
1920

2021
pub struct GraphQLServiceMetrics {
2122
query_execution_time: Box<HistogramVec>,
22-
failed_query_execution_time: Box<HistogramVec>,
2323
}
2424

2525
impl fmt::Debug for GraphQLServiceMetrics {
@@ -34,36 +34,29 @@ impl GraphQLServiceMetrics {
3434
.new_histogram_vec(
3535
"query_execution_time",
3636
"Execution time for successful GraphQL queries",
37-
vec![String::from("deployment")],
37+
vec![String::from("deployment"), String::from("status")],
3838
vec![0.1, 0.5, 1.0, 10.0, 100.0],
3939
)
4040
.expect("failed to create `query_execution_time` histogram");
4141

42-
let failed_query_execution_time = registry
43-
.new_histogram_vec(
44-
"query_failed_execution_time",
45-
"Execution time for failed GraphQL queries",
46-
vec![String::from("deployment")],
47-
vec![0.1, 0.5, 1.0, 10.0, 100.0],
48-
)
49-
.expect("failed to create `query_failed_execution_time` histogram");
50-
5142
Self {
5243
query_execution_time,
53-
failed_query_execution_time,
5444
}
5545
}
5646

57-
pub fn observe_query_execution_time(&self, duration: f64, deployment_id: String) {
47+
pub fn observe_query(&self, duration: Duration, results: &QueryResults) {
48+
let id = results
49+
.deployment_hash()
50+
.map(|h| h.as_str())
51+
.unwrap_or("unknown");
52+
let status = if results.has_errors() {
53+
"failed"
54+
} else {
55+
"success"
56+
};
5857
self.query_execution_time
59-
.with_label_values(vec![deployment_id.as_ref()].as_slice())
60-
.observe(duration);
61-
}
62-
63-
pub fn observe_failed_query_execution_time(&self, duration: f64, deployment_id: String) {
64-
self.failed_query_execution_time
65-
.with_label_values(vec![deployment_id.as_ref()].as_slice())
66-
.observe(duration);
58+
.with_label_values(&[id, status])
59+
.observe(duration.as_secs_f64());
6760
}
6861
}
6962

@@ -197,10 +190,7 @@ where
197190
Err(e) => return Err(e),
198191
};
199192

200-
if let Some(id) = result.first().and_then(|res| res.deployment.clone()) {
201-
service_metrics
202-
.observe_query_execution_time(start.elapsed().as_secs_f64(), id.to_string());
203-
}
193+
service_metrics.observe_query(start.elapsed(), &result);
204194

205195
Ok(result.as_http_response())
206196
}

0 commit comments

Comments
 (0)