如何才能将自定义指标推送到 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 开发工具包来使用 PutMetricData API 并向 CloudWatch 发送自定义指标。创建定期运行的本地脚本来发送自定义指标。API 最适合推送不同指标和多个值的情形,原因如下:
- 您最多可在单个 API 中使用 1000 个不同的指标。
- 使用 Values and Counts(值和计数)方法时,只需一次 PutMetricData 请求,即可最多为每个指标发布 150 个值。
- 每个指标最多可以使用 30 个维度。
- 对于 HTTP POST 请求,每个 PutMetricData 请求的大小不能超过 1MB。
例如,您可以通过单个 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 节流问题。