amazon-web-services - 如何在 CloudWatch 的仪表板上显示 AWS 服务的正常运行时间百分比?

标签 amazon-web-services amazon-elastic-beanstalk amazon-cloudwatch

我想构建一个仪表板,显示我公司 Elastic Beanstalk 服务每个月的正常运行时间百分比。

所以我用了 boto3 get_metric_data检索 Environment Health CloudWatch 指标数据并计算我的服务非严重时间的百分比。

from datetime import datetime
import boto3

SEVERE = 25

client = boto3.client('cloudwatch')

metric_data_queries = [
    {
        'Id': 'healthStatus', 
        'MetricStat': {
            'Metric': {
                'Namespace': 'AWS/ElasticBeanstalk',
                'MetricName': 'EnvironmentHealth',
                'Dimensions': [
                    {
                        'Name': 'EnvironmentName', 
                        'Value': 'ServiceA'
                    }
                ]
            },
            'Period': 300,
            'Stat': 'Maximum'
        },
        'Label': 'EnvironmentHealth',
        'ReturnData': True
    }
]

response = client.get_metric_data(
    MetricDataQueries=metric_data_queries,
    StartTime=datetime(2019, 9, 1),
    EndTime=datetime(2019, 9, 30),
    ScanBy='TimestampAscending'
    )

health_data = response['MetricDataResults'][0]['Values']
total_times = len(health_data)
severe_times = health_data.count(SEVERE)
print(f'total_times: {total_times}')
print(f'severe_times: {severe_times}')
print(f'healthy percent: {1 - (severe_times/total_times)}')

现在我想知道如何在 CloudWatch 的仪表板上显示百分比。我的意思是我想展示如下内容:

enter image description here

有谁知道如何将我计算的健康百分比上传到 CloudWatch 的仪表板?

或者有没有其他工具更适合显示我的服务的正常运行时间?

最佳答案

您可以使用 CloudWatch 指标进行数学计算:
https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/using-metric-math.html

您可以使用 metric_data_queries 中的指标创建指标数学表达式。并在图表上得到结果。指标数学也适用于 GetMetricData API,因此您可以将您进行的计算移至 MetricDataQuery 并直接从 CloudWatch 获取您需要的数字。

看起来您需要一个数字来说明指标值等于 25 的上个月数据点的百分比。

您可以这样计算(这是图表的来源,您可以在源选项卡上的 CloudWatch 控制台中使用,确保区域与您的区域匹配并且指标名称与您的指标匹配):

{
  "metrics": [
    [
      "AWS/ElasticBeanstalk",
      "EnvironmentHealth",
      "EnvironmentName",
      "ServiceA",
      {
        "label": "metric",
        "id": "m1",
        "visible": false,
        "stat": "Maximum"
      }
    ],
    [
      {
        "expression": "25",
        "label": "Value for severe",
        "id": "severe_c",
        "visible": false
      }
    ],
    [
      {
        "expression": "m1*0",
        "label": "Constant 0 time series",
        "id": "zero_ts",
        "visible": false
      }
    ],
    [
      {
        "expression": "1-AVG(CEIL(ABS(m1-severe_c)/MAX(m1)))",
        "label": "Percentage of times value equals severe",
        "id": "severe_pct",
        "visible": false
      }
    ],
    [
      {
        "expression": "(zero_ts+severe_pct)*100",
        "label": "Service Uptime",
        "id": "e1"
      }
    ]
  ],
  "view": "singleValue",
  "stacked": false,
  "region": "eu-west-1",
  "period": 300
}

解释那里发生的事情(上面每个元素的目的是什么,通过 id):
  • m1 - 这是您的原始指标。将 stat 设置为 Maximum .
  • 严重_c - 您想用于 SEVERE 值的常量。
  • zero_ts - 创建一个所有值都为零的常量时间序列。这是必需的,因为无法绘制常量并且最终值将是常量。所以要绘制它,我们只需将常量添加到这个时间序列的零中。
  • 严重_pct - 这是您实际计算等于 SEVERE 的值百分比的地方。
  • m1-severe_c - 将值等于 SEVERE 的数据点设置为 0。
  • ABS(m1-severe_c) - 使所有值都为正,将 SEVERE 数据点保持为 0。
  • ABS(m1-severe_c)/MAX(m1) - 除以最大值确保所有值现在都在 0 和 1 之间。
  • CEIL(ABS(m1-severe_c)/MAX(m1)) - 捕捉所有不同于 0 到 1 的值,保持 SEVERE 为 0。
  • AVG(CEIL(ABS(m1-severe_c)/MAX(m1)) - 因为指标现在全是 1 和 0,0 表示严重,取平均值可以得到非严重数据点的百分比。
  • 1-AVG(CEIL(ABS(m1-severe_c)/MAX(m1))) - 最后,您需要严重值的百分比,并且由于值是严重值或不严重值,从 1 中减去即可得到所需的数字。
  • e1 - 最后一个表达式给出了一个介于 0 和 1 之间的常数。你需要一个介于 0 和 100 之间的时间序列。这个表达式给出了:(zero_ts+severe_pct)*100 .并不是说这是您返回的唯一结果,所有其他表达式都有 "visible": false .
  • 关于amazon-web-services - 如何在 CloudWatch 的仪表板上显示 AWS 服务的正常运行时间百分比?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58488129/

    相关文章:

    node.js - AWS EB 实例崩溃时会自动重启吗?

    ruby-on-rails - worker puma 日志的提前终止是什么意思,为什么会发生这种情况?

    amazon-web-services - 实例停止时发送 SNS 通知

    python - 如何使用 Python 从 cloudwatch 获取指标?

    php - DynamoDB PHP 返回值

    amazon-web-services - 使用 AWSCredentials 创建 AmazonDynamoDBClient

    amazon-cloudfront - 如何使用 route 53、cloudfront distribution 和 elastic beanstalk 修复 504 ERROR

    amazon-web-services - 使用 Cloudformation AWS 将 SNS 主题添加到现有 CloudWatch 警报

    java - 使用DriverManager类设置jdbc拦截器

    amazon-web-services - AWS Lambda 元数据,如用于 lambda 的 EC2 元数据