node.js-如何继续描述特定查询的完整状态的CloudWatch日志查询



因此,对于任何熟悉CW日志的人。这不是返回结果的典型DB查询调用。您发送一个API调用以启动查询,该查询返回查询ID。然后,您发送另一个API调用以获取查询结果,并以"希望"完成查询结果,如果没有,则您不幸。那是我现在的位置。

我有一个需要一些时间的查询,我正在"猜测"处理此问题的方法是继续循环描述时设备调用,直到我在返回的完整查询阵列中找到匹配项,然后继续进行其余代码。我无法实现这一点!grrrr !!

我已经尝试过了。我尝试在找到匹配时设置逃生条件值。但是它永远不会设置,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...>

我该怎么做?我现在正在调查承诺,看看全部。如果描述设备找到了匹配项,我想触发getQueryResults api调用。

我遇到了AWS Athena的类似问题。当我启动查询时,我会收回已经启动的响应,但是完成后没有通知。我提出的最好的解决方案是使用SettiMeout每100ms左右检查其状态,并在查询完成时继续。希望会有所帮助。

这是一个通用函数,您可以使用它来等待查询完成并返回查询结果。

async function queryCloudWatch(queryRequest: StartQueryRequest): Promise<GetQueryResultsResponse> {
    const queryResponse: StartQueryResponse = await cloudwatchLogs.startQuery(queryRequest).promise()
    if (!queryResponse.queryId) return {}
    let response: GetQueryResultsResponse | undefined = undefined
    while (!response || response.status === 'Running') {
        response = await cloudwatchLogs.getQueryResults({
            "queryId": queryResponse.queryId
        }).promise()
    }
    return response;
}

您有两个选项:查询日志见解或查询日志组
如果您想查询日志见解:

使用 cloudwatchlogs.startquery cloudwatchlogs.getqueryresults apis
一个很好的例子可以在https://gist.github.com/zenoyu/f63799a9079a5df376d55daf3cea27be4

查询日志组使用 filterlogevents api:

const AWS = require('aws-sdk');
AWS.config.setPromisesDependency(require('bluebird'));
AWS.config.update({region: 'us-west-2'});
const cloudWatchLogs = new AWS.CloudWatchLogs({apiVersion: '2014-03-28'});
const timestamp = new Date();
const endtTime = timestamp.getTime();
const params = {
    endTime: endtTime,
    filterPattern: `"${stringToSearch}"`,
    startTime: new Date (endtTime - 5 * 60 * 60* 24 * 1000).getTime(), // Last 5 days
    logGroupName: 'myLogGroup',
    limit : 10
};
const events = await cloudWatchLogs.filterLogEvents(params).promise();
console.log(`successfully queryCloudWatchLogs ${stringToSearch} results: ${JSON.stringify(events)}`);
const results = events.events.map(e => e.message)
console.log(`successfully queryCloudWatchLogs ${stringToSearch} results (${results.length}): ${JSON.stringify(results)}`);

最新更新