Três invólucros em volta de um número
Peça estatísticas de pool a um BIG-IP e a resposta se parece com isto:
{ "entries": {
"https://localhost/mgmt/tm/ltm/pool/~Common~web_pool/stats": {
"nestedStats": {
"entries": {
"activeMemberCnt": { "value": 2 },
"status.availabilityState": { "description": "available" }
} } } } }
Dois membros. Esse fato vem envolvido em value, dentro de entries, dentro de
nestedStats, dentro de entries de novo — e a chave do objeto externo é uma
URL completa.
O formato não é perverso, ele é autodescritivo. value e description
distinguem um número de uma string sem precisar de schema. entries e
nestedStats permitem que as estatísticas do pool e as dos seus membros cheguem
numa resposta só, sem ambiguidade sobre quais pertencem a quem. É verboso porque
responde a uma pergunta sobre estrutura ao mesmo tempo que a uma pergunta sobre
números.
O contador que chega em duas metades
Esta é a parte que pega quem escreve o próprio parser:
"serverside.bitsIn.high": { "value": 3 },
"serverside.bitsIn.low": { "value": 1000000 }
Isso não são duas estatísticas. É um único contador de 64 bits dividido em
duas metades de 32, porque números JSON não carregam um inteiro de 64 bits com
segurança. O valor real é (high << 32) + low — aqui 12.885.901.888, e não
3 nem um milhão.
Um achatador que reporta as metades separadamente não está errado sobre o dado que recebeu, e está errado sobre o tráfego. Qualquer ferramenta que leia essas respostas precisa conhecer a divisão, e qualquer uma que não conheça vai sub-reportar em silêncio os seus contadores mais movimentados.
Totais, não taxas
Todo contador nessa resposta é um total desde o último reset. Não há intervalo no payload, então uma única amostra não pode produzir uma taxa — por mais que você queira.
Para obter uma taxa você precisa de duas amostras e do tempo entre elas, medido por você. Isso parece óbvio escrito assim, e é uma fonte rotineira de dashboards que mostram a vazão subindo continuamente para sempre porque alguém plotou o contador em vez da sua derivada.
O mesmo vale para status.availabilityState: ele diz o estado agora, não há
quanto tempo está assim.
Lendo uma na prática
Busque o endpoint /stats do objeto, ache os invólucros e leia os nomes. A
nomenclatura é consistente o bastante para ser previsível — clientside. e
serverside. separam as duas metades de uma conexão intermediada, .bitsIn e
.bitsOut são direcionais do ponto de vista do equipamento, e os prefixos cur,
max e tot distinguem valores atuais, de pico e cumulativos.
O decodificador de stats do iControl REST neste site faz o achatamento, combina os contadores divididos e informa quais valores foram combinados, para que você possa conferir a aritmética em vez de confiar nela.