prometheus golang 客戶端的使用

簡單使用

package main

import (
    "context"
    "github.com/prometheus/client_golang/api"
    v1 "github.com/prometheus/client_golang/api/prometheus/v1"
    "github.com/prometheus/common/model"
    log "github.com/sirupsen/logrus"
    "time"
)

func main() {
    // 創(chuàng)建一個 prom 客戶端
    client,err := api.NewClient(api.Config{
        Address: "http://localhost:9090",
    })
    if err != nil{
        log.Fatalf("init client failed! %s", err)
    }

    // 創(chuàng)建一個 api v1客戶端
    v1Api := v1.NewAPI(client)
    
    query := `node_cpu_seconds_total`
    result, warnings, err := v1Api.Query(context.Background(), query, time.Now())
    if err != nil{
        log.Fatalf("query failed, %s", err)
    }
    if len(warnings) > 0{
        log.Info("Warning,",warnings)
    }

    log.Infof("ResultTypeis: %s", result.Type())
    vector,ok := result.(model.Vector)
    if !ok {
        log.Info("result is not a vector")
        return
    }

    // 遍歷結(jié)果向量中的每個樣本
    for _, sample := range vector {
        log.Infof("Metrics: %s, Value: %s\n", sample.String(), sample.Value)
    }
}

日常使用總結(jié)

查詢方法

在 PromQL 中,主要有兩種類型的查詢方法:瞬時查詢(instant query)和區(qū)間查詢(range query)。他們的主要差異在于所需參數(shù)的不通侍咱,并且適用的場景也有所不同什湘。

  • 瞬時查詢 (Instant Query)

瞬時查詢是最常見的一種查詢類型猫胁,其特點(diǎn)是在指定的時間點(diǎn)上取樣一次,這種查詢常用來查看當(dāng)前狀態(tài)下的指標(biāo)值剂买,例如查看當(dāng)前時刻的 cpu 負(fù)載,網(wǎng)絡(luò)流量等癌蓖。

    //例如查詢當(dāng)前時間 cpu 的節(jié)點(diǎn)消耗的總 CPU 時間
    query := `node_cpu_seconds_total`
    result, warnings, err := v1Api.Query(context.Background(), query, time.Now())
  • 區(qū)間查詢(Range Query)

區(qū)間查詢則允許用戶指定一個時間窗口瞬哼,并在該窗口的每一段時間點(diǎn)上采樣一次,這種查詢常用來觀察一段時期內(nèi)的指標(biāo)變化趨勢租副,例如查看最近 7 天的平均 cpu 負(fù)載坐慰,近一個月的網(wǎng)絡(luò)流量峰值等等

    //查詢了過去 60 分鐘內(nèi)每 5 分鐘的節(jié)點(diǎn)空閑 CPU 時間的變化速率。
    query := `rate(node_cpu_seconds_total{mode="idle"}[5m])`
    stepDuration := 15 * time.Minute // Set your desired step duration here
    endTime := time.Now()
    startTime := endTime.Add(-60 * time.Minute)
    rng := v1.Range{
        Start: startTime,
        End:  endTime,
        Step:  stepDuration,
    }
    result, warnings, err := v1Api.QueryRange(context.Background(), query, rng)

查詢結(jié)果

  • Scalar Result
    Scalar結(jié)果通常用于只返回一個簡單數(shù)字的查詢用僧,例如計算某個特定的計數(shù)器的總和结胀,例如,查看k8s集群中有多少個 pod责循。我們可以把查詢語句寫成 count(kube_pod_info)
    // 構(gòu)建查詢表達(dá)式
    query := `sum(node_memory_MemTotal_bytes) / 1024 / 1024`
    // 執(zhí)行查詢
    result, _, err := v1Api.Query(context.Background(), query, time.Now())
    if err != nil {
        log.Fatal(err)
    }
    // 將結(jié)果斷言為標(biāo)量類型
    scalar, ok := result.(*model.Scalar)
    if !ok {
        log.Fatal("Unexpected query result type")
    }
    // 輸出標(biāo)量值
    log.Infof("The result is %f\n", scalar.Value)
  • Vector Result
    Vector通常用于返回一組帶有標(biāo)簽的指標(biāo)糟港,例如正在運(yùn)行的所有 pod 的數(shù)量
    query := `kube_pod_info{namespace='prometheus'}`
    result, _, err := v1Api.Query(context.Background(), query, time.Now())

    vector, ok := result.(model.Vector)
    if !ok {
        log.Error("Unexpected query result type")
        return
    }

    for _, sample := range vector {
        // 獲取標(biāo)簽的值
        namespace := sample.Metric["namespace"]
        podName := sample.Metric["pod"]

        log.Infof("Metrics: namespace=%s, pod=%s, Value: %s\n", namespace, podName, sample.Value)
    }
  • Matrix Result
    Matrix 結(jié)果通常用于返回一段時間范圍內(nèi)的歷史數(shù)據(jù),例如過去一天 cpu 利用率的變化趨勢院仿,例如秸抚,我們可以寫這樣一個表達(dá)式:
    rate(node_cpu_seconds_total{mode="idle"}[5m])速和,它的結(jié)果就是一個矩陣。
    特別的剥汤,對于包含聚合函數(shù)的查詢颠放,如sum()、avg()等吭敢,Prometheus也會返回一個樣本流碰凶,但其中只有一條記錄,即聚合后的結(jié)果省有。這種情況下痒留,你也無法將其轉(zhuǎn)換為model.Vector類型,因為它不是一個向量蠢沿,而是一個樣本流伸头。
    query := `rate(node_cpu_seconds_total{mode="idle"}[5m])`
    stepDuration := 15 * time.Minute // 設(shè)置您所需的步長(時間間隔)在這里
    endTime := time.Now()
    startTime := endTime.Add(-60 * time.Minute)
    rng := v1.Range{
        Start: startTime,
        End:   endTime,
        Step:  stepDuration,
    }
    result, _, err := v1Api.QueryRange(context.Background(), query, rng)
    if err != nil {
        log.Fatal(err)
    }

    matrix, ok := result.(model.Matrix)
    if !ok {
        log.Fatalf("unexpected result type: %T", result)
    }

    for _, stream := range matrix {
        fmt.Println("Metric:", stream.Metric)
        for _, sample := range stream.Values {
            fmt.Printf("Time: %s, Value: %s\n", sample.Timestamp, sample.Value)
        }
    }

總結(jié)

本文針對 prometheus golang 客戶端進(jìn)行了簡單的使用介紹,當(dāng)查詢設(shè)計多維度時舷蟀,Pronetheus 會返回一個樣本流而不是單個樣本恤磷,以下是一個處理多種情況的示例,僅供參考

    switch result.Type() {
    case model.ValScalar:
        scalar := result.(*model.Scalar)
        fmt.Println("Scalar value:", scalar.Value)
    case model.ValVector:
        vector := result.(model.Vector)
        for _, sample := range vector {
            fmt.Println("Sample metric:", sample.Metric, " Sample value:", sample.Value)
        }
    case model.ValMatrix:
        matrix := result.(model.Matrix)
        for _, stream := range matrix {
            fmt.Println("Stream values:")
            for _, point := range stream.Values {
                fmt.Println("\tPoint timestamp:", point.Timestamp, " Point value:", point.Value)
            }
        }
    default:
        fmt.Println("Unknown type of result")
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末野宜,一起剝皮案震驚了整個濱河市扫步,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匈子,老刑警劉巖河胎,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異虎敦,居然都是意外死亡游岳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門其徙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胚迫,“玉大人,你說我怎么就攤上這事唾那》枚停” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵闹获,是天一觀的道長期犬。 經(jīng)常有香客問我,道長避诽,這世上最難降的妖魔是什么哭懈? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮茎用,結(jié)果婚禮上遣总,老公的妹妹穿的比我還像新娘睬罗。我一直安慰自己,他們只是感情好旭斥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布容达。 她就那樣靜靜地躺著,像睡著了一般垂券。 火紅的嫁衣襯著肌膚如雪花盐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天菇爪,我揣著相機(jī)與錄音算芯,去河邊找鬼。 笑死凳宙,一個胖子當(dāng)著我的面吹牛熙揍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氏涩,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼届囚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了是尖?” 一聲冷哼從身側(cè)響起意系,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饺汹,沒想到半個月后蛔添,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兜辞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年迎瞧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弦疮。...
    茶點(diǎn)故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡夹攒,死狀恐怖蜘醋,靈堂內(nèi)的尸體忽然破棺而出胁塞,到底是詐尸還是另有隱情,我是刑警寧澤压语,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布啸罢,位于F島的核電站,受9級特大地震影響胎食,放射性物質(zhì)發(fā)生泄漏扰才。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一厕怜、第九天 我趴在偏房一處隱蔽的房頂上張望衩匣。 院中可真熱鬧蕾总,春花似錦、人聲如沸琅捏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柄延。三九已至蚀浆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搜吧,已是汗流浹背市俊。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滤奈,地道東北人摆昧。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像僵刮,于是被迫代替她去往敵國和親据忘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容