首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回AWS中的所有警报,而不是仅在Python上使用describe_alarms 50

返回AWS中的所有警报,而不是仅在Python上使用describe_alarms 50
EN

Stack Overflow用户
提问于 2015-12-09 13:05:05
回答 3查看 3.4K关注 0票数 4

当使用函数describe_alarms时,如何打印所有警报名称,而不是仅打印50个?

代码,使用Python:

代码语言:javascript
复制
conn = boto.connect_cloudwatch()
alarms = conn.describe_alarms()    
for item in alarms:
    print item.name

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-09 15:47:07

默认情况下,它返回50。如果需要更多信息,请设置max_records=value并尝试。

由于底层AWS实现限制,它将返回最多100个警报。不知道现在是不是修好了。

conn.describe_alarms(max_records=100)

有关模块boto.ec2.Cloudwatch中的方法describe_alarms的帮助: Describe_alarms(自我,action_prefix=None,alarm_name_prefix=None,alarm_names=None,max_records=None,state_value=None,next_token=None) 类型max_records: int :param max_records:要检索的最大警报描述数。

票数 2
EN

Stack Overflow用户

发布于 2017-01-24 15:53:25

尽管我参加聚会有点晚了,但这里是我的解决方案(用Java)。您必须获得下一个令牌,并一直在循环中询问结果,直到没有下一个令牌为止,因此它的行为就像在网站上分页一样。

代码语言:javascript
复制
String nextToken = null;
List<MetricAlarm> metricAlarms = new ArrayList<>();
for (int i = 0; i < 100; i++) {

    DescribeAlarmsRequest describeAlarmsRequest = new DescribeAlarmsRequest();
    describeAlarmsRequest.setNextToken(nextToken);
    describeAlarmsRequest.setMaxRecords(100);

    DescribeAlarmsResult describeAlarmsResult = getClient().describeAlarms(describeAlarmsRequest);
    List<MetricAlarm> metricAlarmsTmp = describeAlarmsResult.getMetricAlarms();
    metricAlarms.addAll(metricAlarmsTmp);
    nextToken = describeAlarmsResult.getNextToken();
    logger.info("nextToken: {}", nextToken);

    if (nextToken == null) {
        break;
    }
}
logger.info("metricAlarms size: {}", metricAlarms.size());

当然,还有改进的余地,例如创建一个while循环而不是for循环。

更新:

在这里,我的精致版本

代码语言:javascript
复制
String nextToken = null;
List<MetricAlarm> metricAlarms = new ArrayList<>();

while (nextToken != null || metricAlarms.size() == 0) {
    DescribeAlarmsRequest describeAlarmsRequest = new DescribeAlarmsRequest().withNextToken(nextToken).withMaxRecords(100); // create the request
    DescribeAlarmsResult describeAlarmsResult = getClient().describeAlarms(describeAlarmsRequest); // get the result
    metricAlarms.addAll(describeAlarmsResult.getMetricAlarms()); // add new alarms to our list
    nextToken = describeAlarmsResult.getNextToken(); // check if we have a nextToken
    if (nextToken == null && cachedMetricAlarms.size() == 0) { // if we have no alarm in AWS we get inside the loop but we would never exit -> intercept that
            break;
        }
}
logger.info("metricAlarms size: {}", metricAlarms.size());
票数 5
EN

Stack Overflow用户

发布于 2018-12-17 12:56:57

下面是一个完整的示例,说明如何在记录中分页,以确保检索所有记录,而不是受Cloudwatch警报API上的最大记录的限制:

代码语言:javascript
复制
alarmMaxRecords = 10

response = client.describe_alarms(
AlarmNamePrefix=prefix,
MaxRecords=alarmMaxRecords
)

alarmsItems = []
while response:
    alarmsItems += response['MetricAlarms']
    response = client.describe_alarms(AlarmNamePrefix=prefix, MaxRecords=alarmMaxRecords, NextToken=response['NextToken']) if 'NextToken' in response else None

for alarm in alarmsItems:
    # Do something with the alarm
    print(response['MetricAlarms'])

以上将检索10条记录一次,但可以是任何高达100。

或者更简单地使用boto3提供的boto3方法:

代码语言:javascript
复制
import boto3

# Create CloudWatch client
cloudwatch = boto3.client('cloudwatch')

# List alarms of insufficient data through the pagination interface
paginator = cloudwatch.get_paginator('describe_alarms')
for response in paginator.paginate(AlarmNamePrefix=prefix, MaxRecords=alarmMaxRecords):
    # Do something with the alarm
    print(response['MetricAlarms'])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34179570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档