1

我一直在尝试让一个简单的应用程序运行,它返回一些 cloudwatch 指标。我尝试了 3 个不同的 Web 示例,但没有一个返回任何数据。我可以在 AWS 控制台上看到数据。也许有人可以发现我的错误或指出一个已知有效的简单示例?

我想要实现的原则是:我想知道我们的应用程序何时接近其 dynamoDB 读/写限制,然后增加它们。我假设我需要编写一些线程来轮询询问统计信息,如果它达到容量的 80%,则增加限制。

private static void findCloudWatchData() throws InterruptedException {
    AmazonCloudWatchClient cloudWatch = new AmazonCloudWatchClient(new BasicAWSCredentials(key, secret));
    cloudWatch.setEndpoint("monitoring.eu-west-1.amazonaws.com");

    GetMetricStatisticsRequest getMetricStatisticsRequest = new GetMetricStatisticsRequest();

    GregorianCalendar g = new GregorianCalendar(2012, 9, 17, 12, 0);

    getMetricStatisticsRequest.setStartTime(g.getTime());
    g.add(Calendar.DAY_OF_MONTH, 2);
    getMetricStatisticsRequest.setEndTime(g.getTime());

    getMetricStatisticsRequest.setNamespace("AWS/DynamoDB");
    getMetricStatisticsRequest.setMetricName("SuccessfulRequestLatency");
    getMetricStatisticsRequest.setPeriod(5*60);

    Dimension tableDimension = new Dimension();
    tableDimension.setName("TableName");
    tableDimension.setValue("personalisation.user_favourite-int");

    Dimension operationDimension = new Dimension();
    operationDimension.setName("Operation");
    operationDimension.setValue("Query");

    getMetricStatisticsRequest.setDimensions(Arrays.asList(tableDimension, operationDimension));

    Collection<String> statistics = new ArrayList<String>();
    statistics.add("Average");

    getMetricStatisticsRequest.setStatistics(statistics);
    getMetricStatisticsRequest.setUnit(StandardUnit.Count);

    //results
    GetMetricStatisticsResult result = cloudWatch.getMetricStatistics(getMetricStatisticsRequest);
    System.err.println(result.getDatapoints().size());  //this returns 0 always
    for (Datapoint p : result.getDatapoints()) {
        System.out.println(p.getTimestamp() + " " + p.getAverage());
    }
 }
4

2 回答 2

4

我发现了问题。如果我将“SuccessfulRequestLatency”更改为:

    getMetricStatisticsRequest.setMetricName("ConsumedWriteCapacityUnits");

或 getMetricStatisticsRequest.setMetricName("ConsumedReadCapacityUnits");

并像这样设置日期:

    now.add(Calendar.MINUTE, -5);
    getMetricStatisticsRequest.setEndTime(now.getTime());
    now.add(Calendar.DAY_OF_MONTH, -1);
    getMetricStatisticsRequest.setStartTime(now.getTime());

它开始返回数据。令人尴尬的是,我错误地使用了日期范围,并假设月份 = 9 是九月,而实际上月份 = 8 是九月。Dynamo 不会抛出任何无效范围异常。

于 2012-09-18T15:38:39.643 回答
1

我在评论中建议,您可以依赖 CloudWatch 警报。它将避免您运行自己的监控工具的痛苦。

您可以将“操作”附加到警报。其中一项行动是SNS topicSNS进而可用于触发 HTTP(S) 调用、发送 JSON、feed SQS......

这可能需要更多的设置工作,但我相信它会更容易维护。顺便说一句,您将轻松适应免费层。

于 2012-09-18T14:54:16.857 回答