因此,对于任何熟悉CW日志的人来说......这不是典型的返回结果的DB查询调用。您发送一个API调用来启动一个查询,它返回一个查询ID。然后您发送一个不同的API调用来获取查询结果,“希望”查询完成,如果它没有完成,您就不走运了。这就是我现在所做的。
我有一个查询需要花费一些时间,我“猜测”处理这个问题的方法是不断循环DescribeQueries调用,直到我在返回的Completed查询数组中找到匹配项,然后继续执行其余代码。我无法完成这个任务!
我试过完全不起作用的While和Do.. While循环。我试过在找到匹配项时设置转义条件值..但它从未被设置,Lambda函数超时。
function checkQueryStatus (logGroup, qID, callback) {
var params = {
logGroupName: logGroup,
maxResults: '3',
status: 'Complete'
};
let found = 0;
do {
cwlogs.describeQueries(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else {
// console.log(data.queries); // successful response
const qList = data.queries;
if (qList.some(query => query.queryId === qID)) {
console.log('Query Done');
callback(1);
found = 1;
} else {
console.log('Query not done');
}
}
});
} while (found == 0);
}
checkQueryStatus(logGroupName, queryID, function(qStatus) {
console.log('Query Status: ', qStatus);
if (qStatus == 1) {
console.log('Query Done');
<do other code...>
我该怎么做呢?我现在正在查看Promises,看看这是怎么回事..如果DescribeQueries找到匹配项,我想触发GetQueryResults API调用。
3条答案
按热度按时间vdgimpew1#
我在AWS Athena中遇到过类似的问题。当我启动一个查询时,我会得到已经启动的响应,但在查询完成时却没有得到任何通知。我想到的最好的解决方案是使用setTimeout每隔100ms左右检查一次状态,并在查询完成时继续。希望这能有所帮助。
nkoocmlb2#
下面是一个通用函数,您可以使用它等待查询完成并返回查询结果。
dxxyhpgq3#
您有两种选择:查询日志洞察或查询日志组
如果要查询日志洞察:
要使用filterLogEvents API查询日志组: