4

設置如何讓CloudWatch的代理和指標過濾到報表中的維度

CloudWatch的代理上的EC2實例運行報告審計日誌的CloudWatch。在報告日誌時,CloudWatch中的度量過濾器會創建成功登錄,失敗登錄等的指標。通過指標篩選產生不分配尺寸

問題

指標,所以我不能查詢的CloudWatch得到一組度量INSTANCEID統計。這非常有用,因爲我想知道每個計算機的審計指標而非每個日誌組。

評論

附加尺寸使用put-metric-data命令是很容易的。我可以使用InstanceId的維度標記度量標準,然後僅使用get-metric-statistics檢索這些度量標準。使用度量標準過濾器+ CloudWatch Agent安裝程序,這種功能是不可能的嗎?什麼是可能的解決方法?

+0

我一直在梳理互聯網小時,現在試圖找到一個解決方案這個問題非常令人沮喪,因爲AWS不給您提供附加度量過濾器的維度的方法。沒有他們的IMO,度量過濾器不是很有用。 – markdb314

+1

@ markdb314我能夠通過使用lambda函數發佈自己的指標來解決此問題。如果我得到一些時間不適,請詳細說明如何去做。它工作得很好。 – johnnywhoop

回答

2

因此,您需要做的是創建一個將事件源設置爲您希望爲其創建度量標準的日誌組的lambda。我創建了度量對象來檢查每個日誌中是否存在特定的模式。下面的代碼是你需要做的事情的要點。我不得不撕掉一些不適用的東西。如果有人試圖讓我知道它是否有問題。

我創建一個lambda(注意指標數組):

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; 
相關問題