4

НастройкаКак получить CloudWatch агент и метрические Фильтры для отчета Размеры

CloudWatch Агент работает на экземпляре EC2 отчеты журналов аудита в CloudWatch. Метрический фильтр в CloudWatch создает метрики для успешных логинов, неудачных входов и т. Д. ... при регистрации журналов.

Проблема

Метрики, созданная с помощью метрического фильтра не присваивают размеры, так что я не могу запрос CloudWatch, чтобы получить набор метрических статистики по InstanceId. Это было бы чрезвычайно полезно, потому что я хочу знать показатели аудита для каждой машины, а не для группы журналов.

Комментарии

Прикрепление размеры довольно легко с помощью команды put-metric-data. Я могу пометить метрики с параметром для InstanceId, а затем получить только те показатели, которые используются get-metric-statistics. Является ли такая функциональность невозможной с помощью установки Metric Filters + CloudWatch Agent? Каким будет возможное обходное решение?

+0

Я прочесывают интернет в течение нескольких часов в настоящее время пытается найти решение эта проблема, очень расстраивающая то, что AWS не дает вам способ прикреплять размеры для метрического фильтра. Метрические фильтры не очень полезны без них ИМО. – markdb314

+1

@ markdb314 Я смог обойти эту проблему, разместив свои собственные показатели через функцию лямбда. Если я получу какое-то время, постараюсь понять, как это сделать. Это работает очень хорошо. – johnnywhoop

ответ

2

Так что вам нужно создать лямбда, у которой есть источник событий, установленный для группы журналов, для которой вы хотите создать метрики. Я создал метрические объекты, которые будут проверять каждый журнал на определенные шаблоны. Кодекс ниже - суть того, что вам нужно будет сделать. Я должен был вырвать некоторые вещи, которые не были применимы. Если кто-нибудь попытается, сообщите мне, есть ли у него проблемы.

Я создал лямбда (обратите внимание на массив метрик):

var zlib = require('zlib'); 
var Q = require('q'); 
var cloudwatchAgent = require('cloudwatchAgent'); 

var metrics = [ 
{ 
    "name": "SuccessfulLogins", 
    "patterns": ["session opened for user", "successful logon"], 
    "dimensionName":"HostName", 
    "namespace":"UserStats" 
}]; 

exports.handler = function (event, context) { 
var payload = new Buffer(event.awslogs.data, 'base64'); 

zlib.gunzip(payload, function (e, result) { 
if (e) { 
    context.fail(e); 
} else { 
    result = JSON.parse(result.toString('utf-8')); 
    console.log('Decoded payload: ', JSON.stringify(result)); 

metrics.forEach(function (metric) { 
     promises.push(cloudwatchAgent.processMetric(metric, result.logStream, result.logEvents)); 
    }); 

Q.all(promises).fail(function (error) { 
     context.fail('Error processing log events: ' + error); 
    }).done(function() { 
     context.succeed('Successfully processed log events.'); 
    }); 
    } 
}); 
}; 

Это лямбда вызывает эту функцию:

var sdk = require('aws-sdk'); 
var Q = require('q'); 
var cloudwatch = new sdk.CloudWatch(); 

function processMetric(metric, streamName, logs) { 
console.log('Checking metric ' + metric.name + ' against these patterns:' + metric.patterns.toString()); 
var deferred = Q.defer(); 
var value = 0; 

logs.forEach(function (logEvent) { 
metric.patterns.forEach(function(pattern) { 
    if(logEvent.message.toLowerCase().indexOf(pattern) > -1) { 
    value++; 
    } 
}); 
}); 

var params = { 
    MetricData: [{ 
     MetricName: metric.name, 
     Dimensions: [{ 
      Name: metric.dimensionName, 
      Value: streamName 
     }], 
     Timestamp: new Date(), 
     Value: value 
    }], 
    Namespace: metric.namespace 
}; 

cloudwatch.putMetricData(params, function (err, data) { 
    if (err) { 
    console.log(err, err.stack); 
    deferred.reject(err); 
    } else { 
    console.log('Successfully created metric for ' + metric.name + ' with value ' + value); 
    deferred.resolve(data); 
    } 
}); 

return deferred.promise; 
} 

module.exports.processMetric = processMetric; 
Смежные вопросы