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

问题描述 投票:0回答:2

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

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

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

amazon-web-services amazon-elastic-beanstalk amazon-cloudwatch
2个回答
7
投票

您可以使用 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 - 这是您的原始指标。将统计数据设置为
    Maximum
  • severe_c - 您要用于 SEVERE 值的常量。
  • zero_ts - 创建所有值均为零的恒定时间序列。这是必需的,因为常量无法绘制成图表,并且最终值将是常量。因此,为了绘制它,我们只需将常数添加到这个零时间序列中。
  • severe_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

0
投票

聚会已经很晚了,但也许对其他人也有好处。

Dejan 的解决方案对我来说不起作用,而且我也无法完全理解它想要实现的目标。从那时起,Cloudwatch 或 Elastic beanstalk 可能发生了一些变化。

尝试以下指标,这应该正确显示正常运行时间:

{
"sparkline": true,
"metrics": [
    [ "AWS/ElasticBeanstalk", "EnvironmentHealth", "EnvironmentName", "<env-name>", { "label": "metric", "id": "m1", "visible": false, "stat": "Maximum" } ],
    [ { "expression": "m1 >= 15", "label": "Value for higher than warning", "id": "warning_or_higher", "visible": false } ],
    [ { "expression": "m1 < 15", "label": "Value for lower than warning", "id": "ok", "visible": false } ],
    [ { "expression": "100*RUNNING_SUM(ok)/(RUNNING_SUM(ok)+RUNNING_SUM(warning_or_higher))", "label": "Uptime", "id": "uptime", "visible": true } ]
],
"view": "timeSeries",
"stacked": true,
"region": "<region>",
"period": 300,
"stat": "Average"
}

RUNNING_SUM
确保您返回一个时间序列,而不仅仅是一个值。

  1. m1
    - 是环境健康值,可以是:0 - 正常、1 - 信息、5 - 未知、10 - 无数据、15 - 警告、20 - 降级、25 - 严重
  2. m1 >= 15
    - 返回一个时间序列,如果条件为 true,则值为 1,否则返回 0。我检查了大于 15 的任何内容,因此检查了状态“警告”、“降级”、“严重”。通过更改此值,您可以更改您考虑的状态
  3. m1 < 15
    - 这基本上只是第二个被否定的指标。这就是你所谓的“好吧”
  4. 公式本身:将有利的结果(即环境还好)除以所有结果的总和(即环境还好+环境不好)。您会得到一个介于 0 和 1 之间的值,因此乘以 100 即可得到百分比。
© www.soinside.com 2019 - 2024. All rights reserved.