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

Amazon web services 如何在CloudWatch的仪表板上显示AWS服务的正常运行时间百分比?,amazon-web-services,amazon-elastic-beanstalk,amazon-cloudwatch,Amazon Web Services,Amazon Elastic Beanstalk,Amazon Cloudwatch,我想构建一个仪表板,显示公司弹性Beanstalk服务每月的正常运行时间百分比 因此,我用来检索Environment Health CloudWatch metrics数据并计算我的服务的非严重时间百分比 from datetime import datetime import boto3 SEVERE = 25 client = boto3.client('cloudwatch') metric_data_queries = [ { 'Id': 'healthS

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

因此,我用来检索Environment Health CloudWatch metrics数据并计算我的服务的非严重时间百分比

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的仪表板上显示百分比。我的意思是我想展示如下内容:

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


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

您可以使用CloudWatch度量进行计算:

您可以使用
metric\u data\u querys
中的度量创建度量数学表达式,并在图形上获得结果。Metric math还与GetMetricData API配合使用,因此您可以将所做的计算移动到MetricDataQuery中,并直接从CloudWatch获得所需的数字

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

您可以这样计算它(这是图形的源,您可以在CloudWatch控制台的源选项卡上使用,确保区域与您的区域匹配,度量名称与您的度量匹配):

要解释那里发生了什么(通过id,上面每个元素的用途是什么):

  • m1-这是您的原始指标。将stat设置为
    最大值
  • 严重值\u c-要用于严重值的常数
  • 零\u ts-创建一个所有值均为零的恒定时间序列。这是必需的,因为常数不能用图形表示,最终值将是常量。为了绘制它,我们将把常数加到这个时间序列的零上
  • 严重程度\u pct-这是您实际计算同等严重程度值百分比的地方。
    • m1-severe\u c
      -将值等于severe的数据点设置为0
    • ABS(m1-severe\u c)
      -使所有值为正值,将严重数据点保持为0
    • ABS(m1-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之间的时间序列。这是一个表达式,它为您提供了:
    (零+严重pct)*100
    。这不是您返回的唯一结果,所有其他表达式都具有
    “可见”:false

谢谢您的建议,但是我如何计算图形化指标中严重指标(EnvironmentHealth value=25)的数量?我找不到任何函数可用于确定指标点是否等于特定数字。您可以计算。我更新了答案,让我知道这是否是您需要的。昨天,我的
(零+严重pct)*100
显示了
-99.9
,因此我将其更改为
-(零+严重pct)*100
。但是今天,我在表达式e1中得到了
错误[不支持的从标量到时间序列的类型转换]
错误
(零+严重pct)*100
表达式。这很奇怪。这是CloudWatch的一个bug吗?有趣的是,如果将所有表达式折叠成1:
(m1*0+(1-AVG(CEIL(ABS(m1-25)/MAX(m1)))*100
{
  "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
}