Amazon web services 如何在CloudWatch的仪表板上显示AWS服务的正常运行时间百分比?
我想构建一个仪表板,显示公司弹性Beanstalk服务每月的正常运行时间百分比 因此,我用来检索Environment Health CloudWatch metrics数据并计算我的服务的非严重时间百分比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
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-这是您实际计算同等严重程度值百分比的地方。
-将值等于severe的数据点设置为0m1-severe\u c
-使所有值为正值,将严重数据点保持为0ABS(m1-severe\u c)
-除以最大值可确保所有值现在都在0和1之间ABS(m1-c)/MAX(m1)
捕捉所有不同于0到1的值,将severe保持在0李>CEIL(ABS(m1-severe_c)/MAX(m1))
-因为度量现在都是1和0,0表示严重,取平均值可以得到非严重数据点的百分比AVG(CEIL(ABS(m1-severe_c)/MAX(m1))
-最后,您需要严重值的百分比,因为值要么严重,要么不严重,从1中减去就得到了所需的数字1-AVG(CEIL(ABS(m1-severe_c)/MAX(m1))
- e1-上一个表达式为您提供了一个介于0和1之间的常数。您需要一个介于0和100之间的时间序列。这是一个表达式,它为您提供了:
。这不是您返回的唯一结果,所有其他表达式都具有(零+严重pct)*100
“可见”:false
(零+严重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
}