0

如何在prometheus中无步查询指定指标的原始时间序列值?比如我想查询1分钟内实际有多少个datapoints,但是当我指定step为15s时,不管datapoints个数多少都会产生4个结果

package main

import (
    "context"
    "fmt"
    "github.com/prometheus/client_golang/api"
    v1 "github.com/prometheus/client_golang/api/prometheus/v1"
    "log"
    "time"
)

var (
    prometheus string        = "http://10.22.5.54:8481/select/0/prometheus"
    timeout    time.Duration = time.Second * 30
)

func main() {

    client, err := api.NewClient(api.Config{Address: prometheus})
    if err != nil {
        log.Fatalln("Error connect to the prometheus: ", err)
    }

    v1api := v1.NewAPI(client)
    ctx, cancel := context.WithTimeout(context.Background(), timeout)
    defer cancel()

    result, warnings, err := v1api.QueryRange(ctx, "up{app=\"activity-api\"}", v1.Range{Start: time.Now().Add(-time.Minute * 1), End: time.Now(), Step: time.Second * 15})

    if err != nil {
        log.Printf("Error querying Prometheus: %s\n", err)
    }
    if len(warnings) > 0 {
        log.Printf("Warnings: %s", warnings)
    }

    fmt.Println(result)
}
4

1 回答 1

0

您需要使用v1api.Query而不是,并在系列选择器v1api.QueryRange末尾的方括号中添加所需的间隔。例如,以下查询应返回在给定结束的最后 15 秒内的时间序列匹配的原始样本。up{app="activity-api"}time

t := time.Now()
result, warnings, err := v1api.Query(ctx, `up{app="activity-api"}[15s]`, t)

在此处查看更多详细信息。

github.com/prometheus/client_golang该包在 内部只查询/api/v1/query HTTP 端点,因此向该端点发出 HTTP 请求可能更容易,而无需弄清楚如何使用github.com/prometheus/client_golang. 例如,以下命令将从 VictoriaMetrics 集群返回原始样本:

curl http://10.22.5.54:8481/select/0/prometheus/api/v1/query -d 'up{app="activity-api"}[15s]'

VictoriaMetrics 还提供用于导出原始样本的 API

另请参阅https://valyala.medium.com/analyzing-prometheus-data-with-external-tools-5f3e5e147639

于 2022-02-16T17:39:30.710 回答