如何获取AWS CloudWatch实时指标用于Nagios监控?
获取AWS CloudWatch实时指标并集成到Nagios监控
一、替换历史查询为近实时指标拉取
你当前用的get-metric-statistics是针对历史时间段的批量查询,要获取接近实时的指标,改用get-metric-data更高效——它支持一次拉取多指标,且能精准获取最近1分钟粒度的数据(CloudWatch默认实时指标间隔)。
示例命令(替换your-cluster-id为你的ElastiCache集群ID):
aws cloudwatch get-metric-data \ --metric-data-queries '[ { "Id": "cpu", "MetricStat": { "Metric": { "Namespace": "AWS/ElastiCache", "MetricName": "CPUUtilization", "Dimensions": [{"Name": "CacheClusterId", "Value": "your-cluster-id"}] }, "Period": 60, "Stat": "Average" }, "ReturnData": true }, { "Id": "memory", "MetricStat": { "Metric": { "Namespace": "AWS/ElastiCache", "MetricName": "FreeableMemory", "Dimensions": [{"Name": "CacheClusterId", "Value": "your-cluster-id"}] }, "Period": 60, "Stat": "Average" }, "ReturnData": true } ]' \ --start-time $(date -u -d "5 minutes ago" +%Y-%m-%dT%H:%M:%SZ) \ --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ)
注:CloudWatch用UTC时间,命令中通过date -u生成符合要求的时间格式,拉取最近5分钟内的最新数据点。
二、编写适配Nagios的监控脚本
Nagios要求插件输出固定格式的状态(OK/WARNING/CRITICAL/UNKNOWN),以下是封装好的shell脚本,集成指标拉取、阈值判断和状态输出:
#!/bin/bash # 配置参数 CLUSTER_ID="your-cluster-id" CPU_WARN=70 # CPU使用率警告阈值(%) CPU_CRIT=90 # CPU使用率临界阈值(%) MEMORY_WARN=1024 # 剩余内存警告阈值(MB) MEMORY_CRIT=512 # 剩余内存临界阈值(MB) # 拉取指标数据 METRIC_DATA=$(aws cloudwatch get-metric-data \ --metric-data-queries '[ {"Id": "cpu", "MetricStat": {"Metric": {"Namespace": "AWS/ElastiCache", "MetricName": "CPUUtilization", "Dimensions": [{"Name": "CacheClusterId", "Value": "'$CLUSTER_ID'"}]}, "Period": 60, "Stat": "Average"}, "ReturnData": true}, {"Id": "memory", "MetricStat": {"Metric": {"Namespace": "AWS/ElastiCache", "MetricName": "FreeableMemory", "Dimensions": [{"Name": "CacheClusterId", "Value": "'$CLUSTER_ID'"}]}, "Period": 60, "Stat": "Average"}, "ReturnData": true} ]' \ --start-time $(date -u -d "5 minutes ago" +%Y-%m-%dT%H:%M:%SZ) \ --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \ --output json) # 解析指标值(取最新数据点) CPU_VALUE=$(echo $METRIC_DATA | jq -r '.MetricDataResults[] | select(.Id=="cpu") | .Values[-1]') MEMORY_VALUE=$(echo $METRIC_DATA | jq -r '.MetricDataResults[] | select(.Id=="memory") | .Values[-1] / 1024 / 1024') # 处理指标拉取失败的情况 if [[ -z "$CPU_VALUE" || -z "$MEMORY_VALUE" ]]; then echo "UNKNOWN - Failed to retrieve ElastiCache metrics" exit 3 fi # 判断告警状态 STATUS="OK" EXIT_CODE=0 MESSAGE="CPU Utilization: $(printf "%.1f" $CPU_VALUE)%, Freeable Memory: $(printf "%.1f" $MEMORY_VALUE)MB" if (( $(echo "$CPU_VALUE >= $CPU_CRIT" | bc -l) )) || (( $(echo "$MEMORY_VALUE <= $MEMORY_CRIT" | bc -l) )); then STATUS="CRITICAL" EXIT_CODE=2 elif (( $(echo "$CPU_VALUE >= $CPU_WARN" | bc -l) )) || (( $(echo "$MEMORY_VALUE <= $MEMORY_WARN" | bc -l) )); then STATUS="WARNING" EXIT_CODE=1 fi echo "${STATUS} - ${MESSAGE}" exit $EXIT_CODE
脚本依赖说明
- 安装
jq用于JSON解析:sudo apt install jq(Debian/Ubuntu)或sudo yum install jq(RHEL/CentOS) - 安装
bc用于浮点数值比较:sudo apt install bc或sudo yum install bc - 给Nagios运行用户配置IAM权限:允许
cloudwatch:GetMetricData操作,可限制到指定的ElastiCache集群维度
三、Nagios集成配置
- 将脚本放到Nagios插件目录(如
/usr/lib/nagios/plugins/),赋予执行权限:chmod +x /usr/lib/nagios/plugins/check_elasticache_metrics.sh - 在
commands.cfg中添加命令定义:define command { command_name check_elasticache_metrics command_line $USER1$/check_elasticache_metrics.sh } - 在
services.cfg中添加监控服务:define service { host_name your-monitored-host service_description ElastiCache CPU/Memory check_command check_elasticache_metrics max_check_attempts 3 check_interval 5 retry_interval 1 check_period 24x7 notification_interval 60 notification_period 24x7 }
四、优化建议
- 将脚本参数化:把集群ID、阈值做成命令行参数,让脚本支持多集群监控
- 配置IAM最小权限:给Nagios用户的IAM角色仅授权
cloudwatch:GetMetricData,并通过资源策略限制到特定ElastiCache集群 - 验证指标粒度:确认你的ElastiCache实例启用了1分钟粒度指标(默认开启,部分旧实例可能为5分钟)
内容的提问来源于stack exchange,提问作者Ajay
相关产品推荐
相关产品推荐

