Skip to content

Commit b1cc6c7

Browse files
committed
all: Have GraphQlRunner manage effort tracking
1 parent 01cf897 commit b1cc6c7

File tree

8 files changed

+45
-1
lines changed

8 files changed

+45
-1
lines changed

graph/src/components/graphql.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use futures::prelude::*;
22

3+
use crate::data::graphql::effort::QueryEffort;
34
use crate::data::query::{Query, QueryError, QueryResult};
45
use crate::data::subscription::{Subscription, SubscriptionError, SubscriptionResult};
56

@@ -8,6 +9,7 @@ use failure::format_err;
89
use failure::Error;
910
use futures03::compat::Future01CompatExt;
1011
use graphql_parser::query as q;
12+
use std::sync::Arc;
1113

1214
/// Future for query results.
1315
pub type QueryResultFuture = Box<dyn Future<Item = QueryResult, Error = QueryError> + Send>;
@@ -47,4 +49,6 @@ pub trait GraphQlRunner: Send + Sync + 'static {
4749
}
4850
})
4951
}
52+
53+
fn effort(&self) -> Arc<QueryEffort>;
5054
}

graphql/src/query/mod.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ use std::sync::{atomic::AtomicBool, Arc};
55
use std::time::Instant;
66
use uuid::Uuid;
77

8+
use graph::data::graphql::effort::QueryEffort;
9+
810
use crate::execution::*;
911
use crate::schema::ast as sast;
1012

@@ -30,6 +32,8 @@ where
3032

3133
/// Maximum value for the `first` argument.
3234
pub max_first: u32,
35+
36+
pub effort: Arc<QueryEffort>,
3337
}
3438

3539
/// Executes a query and returns a result.
@@ -74,13 +78,15 @@ where
7478
// Execute top-level `query { ... }` and `{ ... }` expressions.
7579
let start = Instant::now();
7680
let result = execute_root_selection_set(&ctx, selection_set, query_type, block_ptr);
81+
let elapsed = start.elapsed();
82+
options.effort.add(query.shape_hash, elapsed);
7783
if *graph::log::LOG_GQL_TIMING {
7884
info!(
7985
query_logger,
8086
"Query timing (GraphQL)";
8187
"query" => &query.query_text,
8288
"variables" => &query.variables_text,
83-
"query_time_ms" => start.elapsed().as_millis(),
89+
"query_time_ms" => elapsed.as_millis(),
8490
"cached" => ctx.cached.load(std::sync::atomic::Ordering::SeqCst),
8591
"block" => block_ptr.map(|b| b.number).unwrap_or(0),
8692
"complexity" => &query.complexity

graphql/src/runner.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use crate::prelude::{
1111
};
1212
use crate::query::execute_query;
1313
use crate::subscription::execute_prepared_subscription;
14+
use graph::data::graphql::effort::QueryEffort;
1415
use graph::prelude::{
1516
o, shape_hash, EthereumBlockPointer, GraphQlRunner as GraphQlRunnerTrait, Logger, Query,
1617
QueryExecutionError, QueryResult, QueryResultFuture, Store, StoreError, SubgraphDeploymentId,
@@ -24,6 +25,7 @@ pub struct GraphQlRunner<S> {
2425
logger: Logger,
2526
store: Arc<S>,
2627
expensive: HashMap<u64, Arc<q::Document>>,
28+
effort: Arc<QueryEffort>,
2729
}
2830

2931
lazy_static! {
@@ -47,6 +49,8 @@ lazy_static! {
4749
.map(|s| u32::from_str(&s)
4850
.unwrap_or_else(|_| panic!("failed to parse env var GRAPH_GRAPHQL_MAX_FIRST")))
4951
.unwrap_or(1000);
52+
static ref WINDOW_SIZE: Duration = Duration::from_secs(300);
53+
static ref BIN_SIZE: Duration = Duration::from_secs(1);
5054
}
5155

5256
impl<S> GraphQlRunner<S>
@@ -63,6 +67,7 @@ where
6367
logger: logger.new(o!("component" => "GraphQlRunner")),
6468
store,
6569
expensive,
70+
effort: Arc::new(QueryEffort::new(*WINDOW_SIZE, *BIN_SIZE)),
6671
}
6772
}
6873

@@ -132,6 +137,7 @@ where
132137
resolver,
133138
deadline: GRAPHQL_QUERY_TIMEOUT.map(|t| Instant::now() + t),
134139
max_first: max_first.unwrap_or(*GRAPHQL_MAX_FIRST),
140+
effort: self.effort.clone(),
135141
},
136142
) {
137143
Err(errs) => errors.extend(errs),
@@ -210,4 +216,8 @@ where
210216

211217
Box::new(future::result(result))
212218
}
219+
220+
fn effort(&self) -> Arc<QueryEffort> {
221+
self.effort.clone()
222+
}
213223
}

graphql/tests/introspection.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ extern crate pretty_assertions;
44
use graphql_parser::{query as q, schema as s};
55
use std::collections::HashMap;
66
use std::sync::Arc;
7+
use std::time::Duration;
78

9+
use graph::data::graphql::effort::QueryEffort;
810
use graph::prelude::{
911
o, slog, Logger, Query, QueryExecutionError, QueryResult, Schema, SubgraphDeploymentId,
1012
};
@@ -558,6 +560,10 @@ fn introspection_query(schema: Schema, query: &str) -> QueryResult {
558560
resolver: MockResolver,
559561
deadline: None,
560562
max_first: std::u32::MAX,
563+
effort: Arc::new(QueryEffort::new(
564+
Duration::from_millis(0),
565+
Duration::from_millis(0),
566+
)),
561567
};
562568

563569
let result = PreparedQuery::new(query, None, 100)

server/http/src/service.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,7 @@ mod tests {
475475
use hyper::{Body, Method, Request};
476476
use std::collections::BTreeMap;
477477

478+
use graph::data::graphql::effort::QueryEffort;
478479
use graph::prelude::*;
479480
use graph_mock::{mock_store_with_users_subgraph, MockMetricsRegistry};
480481
use graphql_parser::query as q;
@@ -513,6 +514,10 @@ mod tests {
513514
fn run_subscription(&self, _subscription: Subscription) -> SubscriptionResultFuture {
514515
unreachable!();
515516
}
517+
518+
fn effort(&self) -> Arc<QueryEffort> {
519+
unimplemented!()
520+
}
516521
}
517522

518523
#[test]

server/http/tests/server.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use hyper::{Body, Client, Request};
44
use std::collections::BTreeMap;
55
use std::time::Duration;
66

7+
use graph::data::graphql::effort::QueryEffort;
78
use graph::prelude::*;
89

910
use graph_server_http::test_utils;
@@ -60,6 +61,10 @@ impl GraphQlRunner for TestGraphQlRunner {
6061
fn run_subscription(&self, _subscription: Subscription) -> SubscriptionResultFuture {
6162
unreachable!();
6263
}
64+
65+
fn effort(&self) -> Arc<QueryEffort> {
66+
unimplemented!()
67+
}
6368
}
6469

6570
#[cfg(test)]

server/index-node/src/service.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ where
109109
.and_then(move |query| {
110110
let logger = logger.clone();
111111
let graphql_runner = graphql_runner.clone();
112+
let effort = graphql_runner.effort();
112113

113114
// Run the query using the index node resolver
114115
tokio::task::block_in_place(|| {
@@ -117,6 +118,7 @@ where
117118
resolver: IndexNodeResolver::new(&logger, graphql_runner, store),
118119
deadline: None,
119120
max_first: std::u32::MAX,
121+
effort,
120122
};
121123
let result = PreparedQuery::new(query, None, 100)
122124
.and_then(|query| execute_query(query, None, None, options));

store/test-store/src/lib.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
extern crate diesel;
33

44
use crate::tokio::runtime::{Builder, Runtime};
5+
use graph::data::graphql::effort::QueryEffort;
56
use graph::log;
67
use graph::prelude::{Store as _, *};
78
use graph_graphql::prelude::{
@@ -383,6 +384,7 @@ fn execute_subgraph_query_internal(
383384
) -> QueryResult {
384385
let logger = Logger::root(slog::Discard, o!());
385386
let query = return_err!(PreparedQuery::new(query, max_complexity, 100));
387+
//let effort =
386388
let mut values = std::collections::BTreeMap::new();
387389
let mut errors = Vec::new();
388390
for (bc, selection_set) in return_err!(query.block_constraint()) {
@@ -402,6 +404,10 @@ fn execute_subgraph_query_internal(
402404
resolver,
403405
deadline,
404406
max_first: std::u32::MAX,
407+
effort: Arc::new(QueryEffort::new(
408+
Duration::from_millis(0),
409+
Duration::from_millis(0),
410+
)),
405411
},
406412
) {
407413
Err(errs) => errors.extend(errs),

0 commit comments

Comments
 (0)