AWS CloudWatch возвращает InvalidNextToken - PullRequest
0 голосов
/ 23 февраля 2020

Я пытаюсь получить некоторые метрики CloudWatch, используя. NET SDK. Код, который показан ниже, возвращает некоторые точки данных, но после возврата около 20 точек данных он вызывает исключение InvalidNextToken.

private static void Main(string[] args)
    {
        Console.Clear();

        var creds = new StoredProfileAWSCredentials();
        var c = new AmazonCloudWatchClient(creds, RegionEndpoint.EUCentral1);

        Task<GetMetricDataResponse> t = null;

        string nextToken = null;
        do
        {
            var req = new GetMetricDataRequest
            {
                EndTimeUtc = DateTime.UtcNow,
                MaxDatapoints = 10,
                StartTimeUtc = DateTime.UtcNow.AddHours(-1),
                ScanBy = new ScanBy("TimestampDescending"),
                NextToken = nextToken,
                MetricDataQueries = new List<MetricDataQuery>
                {
                    new MetricDataQuery
                    {
                        Id = "a" + Guid.NewGuid().ToString().Replace("-", ""),

                        MetricStat = new MetricStat
                        {
                            Stat = "Maximum",
                            Metric = new Metric
                            {
                                MetricName = "CPUUtilization",

                                Dimensions = new List<Dimension>
                                {
                                    new Dimension
                                    {
                                        Name = "InstanceId",
                                        Value = "i-04f27d16c91c70119"
                                    }
                                },
                                Namespace = "AWS/EC2"
                            },
                            Period = 60,

                            Unit = StandardUnit.Percent
                        }
                    }
                }
            };
            t = c.GetMetricDataAsync(req);

            t.Wait();
            var usage = t.Result;
            if (usage.MetricDataResults.Any())
                foreach (var r in usage.MetricDataResults)
                foreach (var rValue in r.Values)
                    Console.WriteLine(Math.Round(rValue * 100));


            nextToken = t.Result.NextToken;
        } while (!string.IsNullOrEmpty(nextToken));


        Console.ReadKey();
    } 

Точное сообщение об исключении:

InvalidNextTokenException: Служба вернула ошибку с кодом ошибки InvalidNextToken и телом HTTP: отправитель InvalidNextToken 795050a1-3bcd-4a44-9794-5becd0c4f5cf

1 Ответ

0 голосов
/ 27 февраля 2020

Чтобы nextToken работал, вам необходимо отправить точно такой же запрос, при этом между вызовами меняется только токен.

У вас есть id, StartTimeUtc и EndTimeUtc между запросами. Инициализация их до того, как l oop исправит вашу проблему.

Попробуйте что-то вроде этого:

private static void Main(string[] args)
    {
        Console.Clear();

        var creds = new StoredProfileAWSCredentials();
        var c = new AmazonCloudWatchClient(creds, RegionEndpoint.EUCentral1);

        Task<GetMetricDataResponse> t = null;

        string nextToken = null;


        var endTime = DateTime.UtcNow;
        var startTime = endTime.AddHours(-1);
        var id = "a" + Guid.NewGuid().ToString().Replace("-", "");

        do
        {
            var req = new GetMetricDataRequest
            {
                EndTimeUtc = endTime,
                MaxDatapoints = 10,
                StartTimeUtc = startTime,
                ScanBy = new ScanBy("TimestampDescending"),
                NextToken = nextToken,
                MetricDataQueries = new List<MetricDataQuery>
                {
                    new MetricDataQuery
                    {
                        Id = id,

                        MetricStat = new MetricStat
                        {
                            Stat = "Maximum",
                            Metric = new Metric
                            {
                                MetricName = "CPUUtilization",

                                Dimensions = new List<Dimension>
                                {
                                    new Dimension
                                    {
                                        Name = "InstanceId",
                                        Value = "i-04f27d16c91c70119"
                                    }
                                },
                                Namespace = "AWS/EC2"
                            },
                            Period = 60,

                            Unit = StandardUnit.Percent
                        }
                    }
                }
            };
            t = c.GetMetricDataAsync(req);

            t.Wait();
            var usage = t.Result;
            if (usage.MetricDataResults.Any())
                foreach (var r in usage.MetricDataResults)
                foreach (var rValue in r.Values)
                    Console.WriteLine(Math.Round(rValue * 100));


            nextToken = t.Result.NextToken;
        } while (!string.IsNullOrEmpty(nextToken));


        Console.ReadKey();
    } 
...