@Override public QueryInfo getFullQueryInfo(QueryId queryId) { return queryTracker.getQuery(queryId).getQueryInfo(); }
stats.queryStarted(); stats.queryStopped(); stats.queryFinished(execution.getQueryInfo());
@Override public QueryInfo getQueryInfo(QueryId queryId) { requireNonNull(queryId, "queryId is null"); QueryExecution query = queries.get(queryId); if (query == null) { throw new NoSuchElementException(); } return query.getQueryInfo(); }
@Override public List<QueryInfo> getAllQueryInfo() { return queries.values().stream() .map(queryExecution -> { try { return queryExecution.getQueryInfo(); } catch (RuntimeException ignored) { return null; } }) .filter(Objects::nonNull) .collect(toImmutableList()); }
private boolean isAbandoned(QueryExecution query) { DateTime oldestAllowedHeartbeat = DateTime.now().minus(clientTimeout.toMillis()); DateTime lastHeartbeat = query.getQueryInfo().getQueryStats().getLastHeartbeat(); return lastHeartbeat != null && lastHeartbeat.isBefore(oldestAllowedHeartbeat); }
/** * Remove completed queries after a waiting period */ private void removeExpiredQueries() { DateTime timeHorizon = DateTime.now().minus(maxQueryAge.toMillis()); // we're willing to keep queries beyond timeHorizon as long as we have fewer than maxQueryHistory while (expirationQueue.size() > maxQueryHistory) { QueryInfo queryInfo = expirationQueue.peek().getQueryInfo(); // expirationQueue is FIFO based on query end time. Stop when we see the // first query that's too young to expire if (queryInfo.getQueryStats().getEndTime().isAfter(timeHorizon)) { return; } // only expire them if they are older than maxQueryAge. We need to keep them // around for a while in case clients come back asking for status QueryId queryId = queryInfo.getQueryId(); log.debug("Remove query %s", queryId); queries.remove(queryId); expirationQueue.remove(); } }
QueryInfo queryInfo = execution.getQueryInfo(); queryMonitor.createdEvent(queryInfo); queryMonitor.completionEvent(queryInfo); QueryInfo queryInfo = queryExecution.getQueryInfo(); queryMonitor.createdEvent(queryInfo); QueryInfo info = queryExecution.getQueryInfo();
public void failAbandonedQueries() { for (QueryExecution queryExecution : queries.values()) { QueryInfo queryInfo = queryExecution.getQueryInfo(); if (queryInfo.getState().isDone()) { continue; } if (isAbandoned(queryExecution)) { log.info("Failing abandoned query %s", queryExecution.getQueryId()); queryExecution.fail(new AbandonedException("Query " + queryInfo.getQueryId(), queryInfo.getQueryStats().getLastHeartbeat(), DateTime.now())); } } }
/** * Enforce timeout at the query level */ public void enforceQueryMaxRunTimeLimits() { for (QueryExecution query : queries.values()) { if (query.getState().isDone()) { continue; } Duration queryMaxRunTime = SystemSessionProperties.getQueryMaxRunTime(query.getSession()); DateTime executionStartTime = query.getQueryInfo().getQueryStats().getCreateTime(); if (executionStartTime.plus(queryMaxRunTime.toMillis()).isBeforeNow()) { query.fail(new PrestoException(EXCEEDED_TIME_LIMIT, "Query exceeded maximum time limit of " + queryMaxRunTime)); } } }