API cloudwatch para recuperar métricas TransitGatewayAttachment via python não funciona

Oct 03 2020

Posso recuperar as métricas do transitgateway usando o código abaixo, mas não funciona quando faço isso para o anexo tgw. Mas eu sei que há estatísticas porque o painel do gerenciador de rede mostra as métricas para o tgw e todos os anexos e representa os valores em gráficos.

O código abaixo funciona e eu recebo um array de resposta para o tgw, a região está configurada corretamente etc. O anexo tgw também está na mesma região, então eu uso o mesmo objeto cloudwatch.

O intervalo de tempo solicitado é idêntico para o anexo tgw e tgw e ambos foram criados ao mesmo tempo, então tenho certeza de que não é um problema de intervalo de tempo.

response = cloudwatch.get_metric_data(
MetricDataQueries=[
    {
        'Id': 'm1',
        'MetricStat': {
            'Metric': {
                'Namespace': 'AWS/TransitGateway',
                'MetricName': 'BytesIn',
                'Dimensions': [
                    {
                        'Name': 'TransitGateway',
                        'Value': 'tgw-0456c4c6fe596f58b',
                    },
                ]
            },
            'Period': 360,
            'Stat': 'Sum',  
            'Unit': 'None'
        },
        'ReturnData': True,
    },
],
StartTime=datetime(2020, 10, 1),
EndTime=datetime.now(),
)

O código abaixo traz de volta um array vazio, o código de retorno é 200 e não reclama de sintaxe. o tgw attach id está correto e na verdade está anexado ao tgw acima. Eu sei que o suporte para métricas granulares de nuvem tgw attach aconteceu recentemente, então talvez ainda não seja compatível com a API.

response_attach = cloudwatch.get_metric_data(
MetricDataQueries=[
    {
        'Id': 'm1',
        'MetricStat': {
            'Metric': {
                'Namespace': 'AWS/TransitGatewayAttachment',
                'MetricName': 'BytesIn',
                'Dimensions': [
                    {
                        'Name': 'TransitGatewayAttachment',
                        'Value': 'tgw-attach-08ed0e1d3e5f488d8'
                    },
                ]
            },
            'Period': 360,
            'Stat': 'Sum',
            'Unit': 'None'
        },
        'ReturnData': True,
    },
],
StartTime=datetime(2020, 10, 1),
EndTime=datetime.now(),
)

Os resultados têm a seguinte aparência, nenhum resultado de Valores, em que, como o primeiro conjunto de código para o tgw, retorna uma matriz em Valores. Tentei diferentes Stat, Period, MetricName sem sucesso.

{'MetricDataResults': [{'Id': 'm1', 'Label': 'BytesIn', 'Timestamps': [], 'Values': [], 'StatusCode': 'Complete'}], 'Messages': [], 'ResponseMetadata': {'RequestId': '495f97d5-5862-49f2-b8d0-91346606c88a', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': '495f97d5-5862-49f2-b8d0-91346606c88a', 'content-type': 'text/xml', 'content-length': '490', 'date': 'Sat, 03 Oct 2020 10:57:38 GMT'}, 'RetryAttempts': 0}}

Algo óbvio que estou fazendo de errado? Desde já, obrigado.

Respostas

Marcin Oct 03 2020 at 19:18

Seu namespace está incorreto:

 'Namespace': 'AWS/TransitGatewayAttachment',

deveria ser:

 'Namespace': 'AWS/TransitGateway',

O motivo é que TransitGatewayAttachmenté uma dimensão dentro do AWS/TransitGatewaynamespace, conforme explicado em:

  • Métricas do CloudWatch para seus gateways de trânsito
js9999 Oct 04 2020 at 15:13

Isso finalmente funcionou e acredito que está me dando as métricas de apego. Portanto, parece que você tem que fornecer o tgw e o anexo na dimensão, mas ele retorna apenas 1 array de resultado e, olhando para ele e comparando, quando eu apenas peço tgw, parece que o valor correto apenas para o anexo.

Eu peguei a pista olhando para o console do cloudwatch mgmt e olhando para o gráfico, a guia de origem mostrou este trecho abaixo e observe que especificou o tgw e o anexo, embora estivesse apenas representando o anexo.

{
    "view": "timeSeries",
    "stacked": false,
    "metrics": [
        [ "AWS/TransitGateway", "BytesIn", "TransitGatewayAttachment", "tgw-attach-08ed0e1d3e5f488d8", "TransitGateway", "tgw-0456c4c6fe596f58b" ]
    ],
    "region": "us-east-1"
}

Código que funciona

response = cloudwatch.get_metric_data(
MetricDataQueries=[
    {
        'Id': 'm1',
        'MetricStat': {
            'Metric': {
                'Namespace': 'AWS/TransitGateway',
                'MetricName': 'BytesIn',
                'Dimensions': [
                    {
                        'Name': 'TransitGateway',
                        'Value': 'tgw-0456c4c6fe596f58b',
                    },
                    {
                        'Name': 'TransitGatewayAttachment',
                        'Value': 'tgw-attach-08ed0e1d3e5f488d8'
                    },
                ]
            },
            'Period': 360, # 3600,
            'Stat': 'Sum',   # 'SampleCount',
            'Unit': 'None'
        },
        'ReturnData': True,
    },
],
StartTime=datetime(2020, 10, 1),
EndTime=datetime.now(),
)