如何將自訂指標推送至 Amazon CloudWatch?
簡短說明
AWS 服務預設會將資料點推送至 CloudWatch。不過,在某些情況下,您可能必須根據 AWS 服務不支援的指標校準資源效能。在這些情況下,您可以使用統一的 CloudWatch 代理程式或 API 將自訂指標推送至 CloudWatch。
**重要事項:**自訂指標會根據其儲存空間和 API 使用量收費。
解決方法
使用 CloudWatch 代理程式推送自訂指標
統一的 CloudWatch 代理程式會收集系統層級指標,並將其做為自訂指標傳送至 CloudWatch。您可以使用代理程式從以下位置推送自訂指標:
- Linux 或 Windows 伺服器
- Amazon Elastic Compute Cloud (Amazon EC2) 執行個體或內部部署伺服器
對於 Linux,請參閱支援的指標清單。
針對磁碟指標 (Linux) 的代理程式組態檔案指標區塊的範例:
"disk":
{
"measurement": [
"used_percent"
],
"resources": [
"*"
],
"drop_device":
true
}
對於 Windows,您可以參考代理程式組態檔中 Windows 效能監控提到的任何計數器。
針對處理器計數器 (Windows) 的代理程式組態檔案指標區塊的範例:
"Processor": {
"measurement": [
{"name": "% Idle Time", "rename": "CPU_IDLE", "unit": "Percent"},
"% Interrupt Time",
"% User Time",
"% Processor Time"
],
"resources": [
"*"
],
"append_dimensions": {
"d1": "win_foo",
"d2": "win_bar"
}
}
您也可以使用「StatsD」和「collectd」通訊協定,從應用程式或服務擷取自訂指標。然後,指標會透過代理程式推送。在 Linux 和 Windows 伺服器上都支援 StatsD。而只有在 Linux 伺服器上才支援 collectd。使用這些通訊協定:
1. 安裝 CloudWatch 統一代理程式。
2. 為具有 CloudWatch 權限的執行個體指派角色或憑證。
3. 建立 CloudWatch 代理程式組態檔案。
4. 啟動代理程式。
使用 PutMetricData 推送自訂指標
如果您的使用案例不支援使用 CloudWatch 統一代理程式,您可以使用 PutMetricData API 將自訂指標推送至 CloudWatch。
例如,若要將特定連接埠的連線推送做為自訂指標,您可以在本機擷取值並在 API 中傳輸這些值:
total_conn=$(netstat -an | grep <port> | wc -l)
aws cloudwatch put-metric-data --namespace "totalconn" --metric-name <port> --dimensions Instance=<InstanceId> --value $ total_conn
同樣地,您可以使用 AWS SDK 以使用 PutMetricData API,並將自訂指標傳送至 CloudWatch。建立定期執行以傳送自訂指標的本機指令碼。由於以下原因,API 最適合推送不同的指標和多個值:
- 您可以在單一 API 中使用多達 1,000 個不同的指標。
- 使用值和計數方法,您可以使用一個 PutMetricData 請求,讓每個指標可發佈多達 150 個值。
- 每個指標可使用多達 30 個維度。
- 針對 HTTP POST 請求,每個 PutMetricData 請求的限制為 1 MB。
例如,您可以使用單一 API 呼叫推送多個指標,而不是針對每個指標進行個別的 API 呼叫:
aws cloudwatch put-metric-data --namespace "Usage Metrics" --metric-data file://metric.json
metric.json 位於:
[
{
"MetricName": "DiskMetric",
"Value": <value_derived_by_some_calculation>,
"Unit": "Count"
},
{
"MetricName": "MemoryMetric",
"Value": <value_derived_by_some_calculation>,
"Unit": "Count"
}
]
這種方法通常會降低成本,因為自訂指標是根據 API 用量和儲存空間收費。這種方法也可能有助於減少 PutMetricData API 上的限流。