new relic로 일정 기간이 경과한 레코드 삭제

11746 단어 AWSLambdaNewRelicAWS

new relic에서 "server not responding"이 된 후 일정 기간이 경과한 레코드 삭제



AWS EC2에서 인스턴스가 Auto Scaling으로 종료된 후에도 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



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

    처음에는 이 원라이너를, 깨달았을 때에 수동으로 가고 있었습니다.

    좋은 웹페이지 즐겨찾기