in src/query-service/src/main/java/org/apache/kylin/rest/service/QueryService.java [330:422]
public String logQuery(final SQLRequest request, final SQLResponse response) {
final String user = aclEvaluate.getCurrentUserName();
Collection<String> modelNames = Lists.newArrayList();
Collection<String> layoutIds = Lists.newArrayList();
Collection<String> isPartialMatchModel = Lists.newArrayList();
float duration = response.getDuration() / (float) 1000;
if (CollectionUtils.isNotEmpty(response.getNativeRealizations())) {
modelNames = response.getNativeRealizations().stream().map(NativeQueryRealization::getModelAlias)
.collect(Collectors.toList());
layoutIds = Collections2.transform(response.getNativeRealizations(),
realization -> String.valueOf(realization.getLayoutId()));
isPartialMatchModel = Collections2.transform(response.getNativeRealizations(),
realization -> String.valueOf(realization.isPartialMatchModel()));
}
int resultRowCount = 0;
if (!response.isException() && response.getResults() != null) {
resultRowCount = (int) response.getResultRowCount();
}
String sql = QueryContext.current().getUserSQL();
if (StringUtils.isEmpty(sql))
sql = request.getSql();
Collection<String> snapShots;
Collection<String> snapShotFilters;
if (response.getNativeRealizations() == null) {
snapShots = Lists.newArrayList();
snapShotFilters = Lists.newArrayList();
} else {
snapShots = response.getNativeRealizations().stream()
.flatMap(nativeQueryRealization -> nativeQueryRealization.getLookupTables().stream()).distinct()
.collect(Collectors.toList());
snapShotFilters = ContextUtil
.listContexts().stream().flatMap(ctx -> ctx.getFilterColumns().stream()
.filter(col -> snapShots.contains(col.getTable())).map(TblColRef::getCanonicalName))
.collect(Collectors.toList());
}
boolean isDerived = !snapShots.isEmpty() && layoutIds.stream().anyMatch(id -> !StringUtils.equals("-1", id));
String errorMsg = response.getExceptionMessage();
if (StringUtils.isNotBlank(errorMsg)) {
int maxLength = 5000;
errorMsg = errorMsg.length() > maxLength ? errorMsg.substring(0, maxLength) : errorMsg;
}
BloomFilterSkipCollector.logAndCleanStatus(QueryContext.current().getQueryId());
ParquetPageFilterCollector.logParquetPages(QueryContext.current().getQueryId());
QueryContext.current().record("end");
QueryContext.current().setResponseStartTime(System.currentTimeMillis());
LogReport report = new LogReport().put(LogReport.QUERY_ID, QueryContext.current().getQueryId())
.put(LogReport.SQL, sql).put(LogReport.USER, user)
.put(LogReport.SUCCESS, null == response.getExceptionMessage()).put(LogReport.DURATION, duration)
.put(LogReport.PROJECT, request.getProject()).put(LogReport.REALIZATION_NAMES, modelNames)
.put(LogReport.INDEX_LAYOUT_IDS, layoutIds).put(LogReport.IS_PARTIAL_MATCH_MODEL, isPartialMatchModel)
.put(LogReport.SCAN_ROWS, response.getScanRows())
.put(LogReport.TOTAL_SCAN_ROWS, response.getTotalScanRows()).put(LogReport.IS_DERIVED, isDerived)
.put(LogReport.SNAPSHOTS, snapShots).put(LogReport.SNAPSHOT_FILTERS, snapShotFilters)
.put(LogReport.SCAN_BYTES, response.getScanBytes())
.put(LogReport.TOTAL_SCAN_BYTES, response.getTotalScanBytes())
.put(LogReport.RESULT_ROW_COUNT, resultRowCount)
.put(LogReport.SHUFFLE_PARTITIONS, response.getShufflePartitions())
.put(LogReport.ACCEPT_PARTIAL, request.isAcceptPartial())
.put(LogReport.PARTIAL_RESULT, response.isPartial())
.put(LogReport.HIT_EXCEPTION_CACHE, response.isHitExceptionCache())
.put(LogReport.STORAGE_CACHE_USED, response.isStorageCacheUsed())
.put(LogReport.STORAGE_CACHE_TYPE, response.getStorageCacheType())
.put(LogReport.DATA_FETCH_TIME, response.getDataFetchTime())
.put(LogReport.PUSH_DOWN, response.isQueryPushDown()).put(LogReport.IS_PREPARE, response.isPrepare())
.put(LogReport.TIMEOUT, response.isTimeout())
.put(LogReport.TIMELINE_SCHEMA, QueryContext.current().getSchema())
.put(LogReport.TIMELINE, QueryContext.current().getTimeLine()).put(LogReport.ERROR_MSG, errorMsg)
.put(LogReport.USER_TAG, request.getUser_defined_tag())
.put(LogReport.PUSH_DOWN_FORCED, request.isForcedToPushDown())
.put(LogReport.INDEX_FORCED, request.isForcedToIndex())
.put(LogReport.USER_AGENT, request.getUserAgent())
.put(LogReport.BACK_DOOR_TOGGLES, request.getBackdoorToggles())
.put(LogReport.SCAN_SEGMENT_COUNT, QueryContext.current().getMetrics().getSegCount())
.put(LogReport.SCAN_FILE_COUNT, QueryContext.current().getMetrics().getFileCount())
.put(LogReport.REFUSE, response.isRefused());
String log = report.oldStyleLog();
if (!(QueryContext.current().getQueryTagInfo().isAsyncQuery()
&& NProjectManager.getProjectConfig(request.getProject()).isUniqueAsyncQueryYarnQueue())) {
logger.info(log);
logger.debug(report.jsonStyleLog());
if (request.getExecuteAs() != null)
logger.info("[EXECUTE AS USER]: User [{}] executes the sql as user [{}].", user,
request.getExecuteAs());
}
return log;
}