4

HTTP サービスのステータスをチェックするために、スプレッドシートを通過するスクリプトを作成しました。URL のリストについては、それらがアップかダウンかをチェックします。スクリプトは 5 分ごとに時間駆動されます。

UrlFetchApp.fetch(url) から断続的な「予期しないエラー」エラーがまれに発生し、数秒後にリクエストを繰り返すと、DNS エラーとタイムアウト エラーが時々発生します。

誰かが助けてくれるなら、いくつかの実際の質問はありません: Utilities.sleep(5000) を使用して 5 秒間一時停止しましたが、それで問題ありませんか、それとも数秒後に待機して再度フェッチするより良い方法がありますか?

5 秒後にリクエストを繰り返しても「予期しないエラー」が発生するのはなぜですか?

以下のコードを改善するにはどうすればよいですか?

実際のスクリプト:

/* 
Periodically check status of web sites :-)
Google Apps for Busines UrlFetch daily limit is 100.000 requests,

Algorithm
  read site and old status from sheet
  check site and set new status  
  if status changed send email (+sms in future by using twilio)
  update status in spreadsheet

"Site, Status code, Time of last change, Last error description"
*/
function main() {
  var sheet = SpreadsheetApp.getActiveSheet() ;
  var currentRow, oldStatusCode, newStatusCode ;
  var url, response, err, subject, message ; 
  var today = new Date() ;

  currentRow = 2
  while ((url = sheet.getRange(currentRow, 1).getValue()) != "") {
    oldStatusCode = sheet.getRange(currentRow, 2).getValue() ;
    newStatusCode = "Ok"
    subject = "mCheck: " + url + " Up Status Change!" ;  
    message = url + " Up Status Change!" + "\n Time: " + today.toUTCString() ;

    var tries = 3 ; // Check at least three times that status changed and it is not a one time glitch
    do {
      try {
        response = UrlFetchApp.fetch(url) ;
      } catch (err) {
      newStatusCode = "Down"
      sheet.getRange(currentRow, 4).setValue(err.message) ;
      subject = "mCheck: " + url + " Down Status Change!" ;  
      message = url + " Down Status Change!" + "\n Error message: " + err.message + "\n Time: " + today.toUTCString() ;
      if (err.message.indexOf("Unexpected") > -1) { // If UrlFetch failed on Google side just ignore this iteration...
        newStatusCode = oldStatusCode ;
      }
    }
    if (oldStatusCode != newStatusCode) { // In case of status change wait 5 seconds before trying again
      Utilities.sleep(5000) ;
    }
    --tries ;
  } while ((oldStatusCode != newStatusCode) && tries >= 0)

  if (oldStatusCode != newStatusCode) {
    sheet.getRange(currentRow, 2).setValue(newStatusCode) ;
    sheet.getRange(currentRow, 3).setValue(today.toUTCString()) ;
    if (oldStatusCode != "") {
      MailApp.sendEmail(email_to, subject, message) ;
    }
  }
  ++currentRow;
 } 

}

4

1 に答える 1

1

失敗をキャッチするために、 muteHttpExceptions パラメーターを使用できます。応答コードが失敗を示している場合、フェッチは例外をスローせず、代わりに HTTPResponse を返します。

サンプル

var params = {muteHttpExceptions:true};
response = UrlFetchApp.fetch(url, params);

また、sheldue には cURL またはアナロジーを使用できます。

サンプル

カール。運用システムに合わせて設定してください。

curl -L URL_OF_YOUR_SCRIPT

スクリプトに追加

function doGet(e) {
    var result = {'status': 'ok'};
    try{
        main();
    }catch(err){
        result.['status'] = err;
    }
  return ContentService.createTextOutput(JSON.stringify(result)).setMimeType(ContentService.MimeType.JSON);
 }

このためには、スクリプトを Web アプリとしてデプロイする必要があります。

2 番目のサンプルを使用する場合、Utilities.sleep(5000) は必要ありません。

一番。

于 2014-08-08T14:20:43.213 に答える