Ao consultar o Prometheus por
process_cpu_seconds_total{instance="localhost:9090"}
Vejo que o navegador faz uma chamada onde a hora atual é usada no parâmetro de consulta time :
curl 'http://localhost:9090/api/v1/query?query=process_cpu_seconds_total%7Binstance%3D%22localhost%3A9090%22%7D&time=1700078953.325' \
--compressed
E o resultado
{"status":"success","data":{"resultType":"vector","result":[{"metric":{"__name__":"process_cpu_seconds_total","instance":"localhost:9090","job":"prometheus"},"
value":[1700078953.325,"0.82"]}]}}%
SEMPRE correspondeu ao carimbo de data/hora fornecido como parâmetro de consulta.
Quando eu consulto um vetor de intervalo, o resultado é próximo do que eu esperava, o navegador ainda usa o horário atual como parâmetro de consulta, mas no resultado geralmente esse tempo não está lá, pois a métrica só é extraída a cada 15 segundos.
curl 'http://localhost:9090/api/v1/query?query=process_cpu_seconds_total%7Binstance%3D%22localhost%3A9090%22%7D%5B1m%5D&time=1700078953.325' \
--compressed
{"status":"success","data":{"resultType":"matrix","result":[{"metric":{"__name__":"process_cpu_seconds_total","instance":"localhost:9090","job":"prometheus"},"
values":[[1700078900.426,"0.8"],[1700078915.427,"0.8"],[1700078930.388,"0.82"],[1700078945.388,"0.82"]]}]}}%
Por que o Prometeu sempre finge saber o valor de agora , quando solicitamos uma consulta por um vetor instantâneo?
Quando você consulta um vetor instantâneo (direta ou indiretamente, como
sum(my_metric)
oumetric1 + metric2
), o Prometheus simplesmente retorna a amostra mais recente antes do horário solicitado. Isso serve principalmente para dar suporte a casos como agregação (sum
,avg
e assim por diante), em que várias séries temporais agregadas não se alinham exatamente no tempo.Quando você consulta o vetor de intervalo, o Prometheus retorna valores dentro do intervalo especificado como estão. Como os vetores de intervalo só podem ser usados em casos limitados (principalmente agregação/processamento ao longo do tempo e raramente simplesmente solicitando
my_metric[1m]
), é razoável esperar que nenhum desses casos exija qualquer alinhamento para diferentes séries temporais e, portanto, nenhum mecanismo desse tipo é implementado.