API cloudwatch para recuperar métricas TransitGatewayAttachment via python não funciona
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
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
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(),
)