new relic で "server not responding" になったあと、一定期間が経過したレコードを削除する
AWS EC2 で、インスタンスが Auto Scaling でterminateされた後も new relic 側でレコードが残り続けるので、Lambdaを使って定期的に削除するようにしました。
- Lambda のランタイムは Node.js 6.10 を使用
- 3秒以上かかるとtimeoutしてしまうので、timeoutの設定を10秒に増やしている
code
- やっていることは、
npm install moment request
をして、curl的な処理をしているだけ - Lambdaにアップロードするzipには、メインのjsファイルと node_modules ディレクトリを格納
- トリガは CloudWatch events に、週1で実行するルール追加(毎日とかでも良いかも)
index.js
var request = require('request');
var moment = require('moment');
var expireDays = process.env.expireDays || 7;
var apiKey = '【new relic で発行されたAPI KEY】';
var options = {
url: 'https://api.newrelic.com/v2/servers.json',
headers: {
'X-Api-Key': apiKey
}
};
var options_del = {
url: 'https://api.newrelic.com/v2/servers/%s.json', // 実行時に上書き
method: 'DELETE',
headers: {
'X-Api-Key': apiKey
}
};
var now = moment();
function callback(error, response, body) {
if (!error && response.statusCode == 200) {
var info = JSON.parse(body);
info.servers.forEach(function(item, index, arr) {
if (item.reporting == false) {
var m = moment(item.last_reported_at);
if (now.diff(m, 'days') >= expireDays) {
// send DETETE request
console.log('*** deleting not reporting server from newrelic ***')
console.log(item);
options_del['url'] = 'https://api.newrelic.com/v2/servers/' + item.id + '.json';
// console.log(options_del);
request(options_del, callback_del);
}
}
});
} else {
console.log('*** execute FAILED ***');
console.log(body);
}
}
function callback_del(error, response, body) {
if (!error && response.statusCode == 200) {
var info = JSON.parse(body);
// console.log(info);
var id = info.server.id;
console.log('*** execute DELETE SUCCEEDED:' + id + ' ***');
} else {
console.log('*** execute DELETE FAILED ***');
console.log(body);
}
}
exports.handler = (event, context, _callback) => {
console.log('*** start: deleting not reporting server from newrelic more than '+ expireDays + ' days ago ***');
request(options, callback);
_callback(null, 'all done: delete records more than '+ expireDays + ' days ago.');
};
対象の日数は環境変数で変えられる
process.env.*
で環境変数を参照できるので、これを使って。
expireDays で指定できる(指定なしの場合は7日で処理)ように。
あんまり変える需要はないかもですが
see also
最初はこのワンライナーを、気がついたときに手動で行ってました。