Bri*_*ian 7 amazon-web-services amazon-cloudwatch amazon-elastic-beanstalk
我想要构建一个仪表板来显示我公司 Elastic Beanstalk 服务每月的正常运行时间百分比。
因此,我使用boto3 get_metric_data检索环境运行状况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)}')
Run Code Online (Sandbox Code Playgroud)
现在我想知道如何在 CloudWatch 的仪表板上显示百分比。我的意思是我想展示如下内容:
有谁知道如何将我计算的健康百分比上传到 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
}
Run Code Online (Sandbox Code Playgroud)
解释一下发生了什么(上面每个元素的用途是什么,按 id):
Maximum
.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 中减去即可得到所需的数字。(zero_ts+severe_pct)*100
。这并不是您返回的唯一结果,所有其他表达式都有"visible": false
. 归档时间: |
|
查看次数: |
4856 次 |
最近记录: |