[IT 運用と保守] Go は、プロメテウス アラームのトリガーと受信エンドとして機能するプログラムを作成します

アラームを送信するためのインターフェイス

  • インターフェイスアドレス https://prometheus.io/docs/alerting/latest/clients/
  • 公共ライブラリは https://github.com/prometheus/common を使用しました

1. アラームトリガーとして機能し、アラームをアラートマネージャーに送信する go プログラムを作成します。

  • コード
package main

import (
	"bytes"
	"encoding/json"
	"github.com/prometheus/common/model"

	"io/ioutil"
	"log"
	"net/http"
)

func alertSend(alertMUrl string) {
    
    
	lables := model.LabelSet{
    
    }

	lables["alertname"] = "报警测试"
	lables["group"] = "abc"
	lables["severity"] = "2"
	lables["job"] = "node_exporter"
	anno := model.LabelSet{
    
    }
	anno["value"] = "88"
	alerts := make([]*model.Alert, 0)
	a := &model.Alert{
    
    
		Labels:       lables,
		Annotations:  anno,
		GeneratorURL: "http://localhost:9090",
	}
	alerts = append(alerts, a)
	jsonStr, _ := json.Marshal(alerts)

	req, err := http.NewRequest("POST", alertMUrl, bytes.NewBuffer(jsonStr))
	req.Header.Set("Content-Type", "application/json")

	client := &http.Client{
    
    }
	resp, err := client.Do(req)
	if err != nil {
    
    
		log.Printf("[http.post.request.err][url:%v][err:%v]", alertMUrl, err)
		return
	}
	defer resp.Body.Close()

	log.Printf("response Status:%v", resp.Status)
	log.Printf("response Headers:%v", resp.Header)
	body, _ := ioutil.ReadAll(resp.Body)
	log.Printf("response Body:%v", string(body))
}

func main() {
    
    
	alertMUrl := "http://172.20.70.205:9093/api/v1/alerts"
	alertSend(alertMUrl)

}

  • github.com/prometheus/common/model でアラート オブジェクトを構築し、関連するフィールドを挿入します
  • http post を使用して json をアラートマネージャー インターフェイスに送信します。

2. プログラムを実行して、alertmanager に警告します。

  • アラートマネージャー Web ページをチェックすると、送信されたアラートを確認できます。
    ここに画像の説明を挿入します

3. アラート受信者として機能し、アラートマネージャーから Webhook アラート情報を受信する go プログラムを作成します。

  • Webhookのコードを受け取る
package main

import (
	"errors"
	"flag"
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/prometheus/alertmanager/notify/webhook"
	"log"
)

func main() {
    
    

	listenAddress := flag.String("addr", ":5001",
		"Address on which to expose metrics and web interface.")
	flag.Parse()
	r := gin.Default()

	r.POST("/alert", alertReceive)
	r.Run(*listenAddress) // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

func alertReceive(c *gin.Context) {
    
    
	var msg webhook.Message
	if err := c.BindJSON(&msg); err != nil {
    
    
		c.JSON(400, errors.New("invalid args"))
		return
	}
	baseMsg := fmt.Sprintf("[状态:%s][报警条数:%d]", msg.Status, len(msg.Alerts))
	log.Printf("[alertReceive][baseMsg:%+v]", baseMsg)
	for i := 0; i < len(msg.Alerts); i++ {
    
    
		alert := msg.Alerts[i]
		log.Printf("[detail][%d/%d][alert:%+v]", i+1, len(msg.Alerts), alert)
	}
	c.JSON(200, "ok")
}

  • gin を使用して http を開始する
  • alertReceive は、alertmanager によって送信されたアラートを受信します
  • json フィールドを github.com/prometheus/alertmanager/notify/webhook のメッセージに解析します。
  • いくつかのフィールドを印刷するだけです

4. アラートマネージャー設定ファイルを編集する

  • デフォルトの Webhook 送信者を上記のアラート受信者に向けます
  • 受信機プログラムを実行する
  • 送信プログラムを実行する
  • 受信側はアラームを受信し、関連するログを出力できる必要があります。
2023/07/02 17:28:42 [alertReceive][baseMsg:[状态:firing][报警条数:1]]
2023/07/02 17:28:42 [detail][1/1][alert:{
    
    Status:firing Labels:map[alertname:[004]go代码发送的报警测试 group:abc job:node_exporter severity:2] Annotations:map[value:88] StartsAt:2023
-07-02 17:28:37.569313212 +0800 CST EndsAt:0001-01-01 00:00:00 +0000 UTC GeneratorURL:http://localhost:9090 Fingerprint:56558b02b61ab8cf}]

Supongo que te gusta

Origin blog.csdn.net/qq_45277554/article/details/131611423
Recomendado
Clasificación