Java Cloudwatch度量从未返回任何结果

Java Cloudwatch度量从未返回任何结果,java,amazon-web-services,amazon-dynamodb,amazon-cloudwatch,Java,Amazon Web Services,Amazon Dynamodb,Amazon Cloudwatch,我一直在尝试运行一个简单的应用程序,它返回一些cloudwatch指标。我尝试了3个不同的web示例,没有一个返回任何数据。我可以在AWS控制台上看到数据。也许有人能发现我的错误,或者给我举一个简单的例子,让我知道这是可行的 我想实现的原则是:我想知道应用程序何时接近其dynamoDB读/写限制,然后增加它们。我假设我需要编写一些线程来查询统计数据,如果它达到80%的容量,就会增加限制 private static void findCloudWatchData() throws Interru

我一直在尝试运行一个简单的应用程序,它返回一些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());
    }
 }
private static void findCloudWatchData()抛出InterruptedException{
AmazonCloudWatchClient cloudWatch=新的AmazonCloudWatchClient(新的BasicAWSCredentials(key,secret));
cloudWatch.setEndpoint(“monitoring.eu-west-1.amazonaws.com”);
GetMetricStatisticsRequest GetMetricStatisticsRequest=新建GetMetricStatisticsRequest();
GregorianCalendar g=新的GregorianCalendar(2012,9,17,12,0);
getMetricStatisticsRequest.setStartTime(g.getTime());
g、 添加(日历日/月/日,2);
getMetricStatisticsRequest.setEndTime(g.getTime());
getMetricStatisticsRequest.setNamespace(“AWS/DynamoDB”);
getMetricStatisticsRequest.setMetricName(“SuccessfulRequestLatency”);
getMetricStatisticsRequest.setPeriod(5*60);
维度表维度=新维度();
tableDimension.setName(“TableName”);
tableDimension.setValue(“personalization.user_favorite-int”);
维度操作维度=新维度();
operationDimension.setName(“操作”);
operationDimension.setValue(“查询”);
getMetricStatisticsRequest.setDimensions(数组.asList(tableDimension,operationDimension));
集合统计信息=新的ArrayList();
统计数据。加上(“平均值”);
getMetricStatisticsRequest.setStatistics(统计);
getMetricStatisticsRequest.setUnit(StandardUnit.Count);
//结果
GetMetricStatisticsResult=cloudWatch.getMetricStatistics(getMetricStatisticsRequest);
System.err.println(result.getDatapoints().size());//这将始终返回0
for(数据点p:result.getDatapoints()){
System.out.println(p.getTimestamp()+“”+p.getAverage());
}
}

我在评论中建议,您可以依靠CloudWatch警报来实现这一点。它将避免您运行自己的监控工具的痛苦

您可以将“”附加到警报。其中一个操作是
SNS主题
SNS
依次可用于触发HTTP(S)调用、发送JSON、提要
SQS


这可能是一个多一点的工作,以设置,但我相信它将是非常,更容易维护。顺便说一句,你将很容易适应免费层。

我在评论中建议,你可以依靠CloudWatch警报来实现这一点。它将避免您运行自己的监控工具的痛苦

您可以将“”附加到警报。其中一个操作是
SNS主题
SNS
依次可用于触发HTTP(S)调用、发送JSON、提要
SQS


这可能是一个多一点的工作,以设置,但我相信它将是非常,更容易维护。顺便说一句,你将很容易适应免费层。

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

或 getMetricStatisticsRequest.setMetricName(“ConsumerDaredCapacityUnits”)

并按如下方式设置日期:

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

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

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

或 getMetricStatisticsRequest.setMetricName(“ConsumerDaredCapacityUnits”)

并按如下方式设置日期:

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

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

您不能为此使用警报吗?可能,这在编程上相当于警报。有没有办法让我发出警报来调用java进程?我只见过向某人发送电子邮件的能力。你们不能用闹钟吗?可能,这是一种类似于闹钟的编程功能。有没有办法让我发出警报来调用java进程?我只见过向某人发送电子邮件的能力。感谢-提醒是我第一次尝试,但一开始我遇到了问题(也许我对他们太陌生了)。我也不知道你可以使用SNS,我以为那只是电子邮件。我已经设法解决了为什么我现在无法获取数据的问题,但我将再次调查您建议的这条路线。这可能是一种更好的方法。经过进一步的测试,我似乎找不到任何适合我需要的闹钟。我希望在达到某个百分比(如80%)时提高速率-但我能看到的唯一报警似乎是绝对值,如“1000次点击/5分钟”。当达到所配置吞吐量的x%(建议为80%)时,您可以配置报警。这个界面在DynamoDB管理工具上,而不是cloudwatchone:)你做过吗?我只是测试了一下,结果不起作用。它认为80%是绝对值的0.8。“超过阈值:1个数据点(525.0)大于或等于阈值(0.8)。”-我们可能偏离了原始主题。关于这一点,我应该问一个新的SO问题。仅供参考,我已经问了一个与此相关的不同问题-如果你有时间,最好听听你的意见。非常感谢谢谢-警报是我第一次尝试这样做,但一开始我对它们有问题(也许我对它们太陌生了)。我也不知道你可以使用SNS,我以为那只是电子邮件。我已经设法解决了为什么我现在无法获取数据的问题,但我将再次调查您建议的这条路线。这可能是一种更好的做事方式。经过一段时间