LoginSignup
1
0

More than 5 years have passed since last update.

new relic で 一定期間が経過したレコードを削除する

Last updated at Posted at 2017-04-28

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日で処理)ように。
あんまり変える需要はないかもですが

スクリーンショット 2017-04-28 17.27.27.png

see also

Feature Idea: Auto Delete Non-Reporting Servers - Feature Ideas / Feature Ideas: APM/UI - New Relic Online Technical Community

最初はこのワンライナーを、気がついたときに手動で行ってました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0