在上一篇fabric運維監控:prometheus+grafana框架搭建中搭建了prometheus+grafana監控框架,但這里存在一個問題,所有監控job都提前寫好在組態檔prometheus.yml中,后面新增job時,都得手動修改組態檔、重啟服務,這在生產中是非常麻煩的,如當用prometheus去監控baas平臺時,如何做到prometheus動態監控新增的節點?
Prometheus提供了多種動態服務發現的功能,這里以consul為例介紹動態加載組態檔程序,
1 . 安裝consul(docker 方式)
docker pull consul
docker run --name consul -d -p 8500:8500 consul
consul 提供標準API方式注冊/注銷服務:
//注冊服務
curl -X PUT -d '{"id": "orderer0.ordererOrg.com","name": "orderer0.ordererOrg.com-172.30.12.167","address": "192.168.20.111","port": 8443,"tags": ["test"],"checks": [{"http": "http://192.168.20.111:8443/metrics", "interval": "5s"}]}' http://192.168.20.84:8500/v1/agent/service/register
//注冊增加meta,meta支持自定義標簽資訊:
curl -X PUT -d '{"id": "orderer0.ordererOrg.com","name": "orderer0.ordererOrg.com-172.30.12.167", "Meta": { "app": "spring-boot", "team": "appgroup", "project": "bigdata" },"address": "192.168.20.111","port": 8443,"tags": ["test"],"checks": [{"http": "http://192.168.20.111:8443/metrics", "interval": "5s"}]}' http://192.168.20.84:8500/v1/agent/service/register
//注銷服務:
curl -X PUT http://192.168.20.84:8500/v1/agent/service/deregister/orderer0.ordererOrg.com
2 . 修改 prometheus.yml 檔案支持consul 服務發現:relabel_configs中去除consul 服務,支持Meta標簽
- keep: 丟棄
source_labels的值中沒有匹配到 regex 正則運算式內容的 Target 實體 - labelmap: 根據 regex 去匹配 Target 實體所有標簽的名稱(注意是名稱),并且將捕獲到的內容作為為新的標簽名稱,regex 匹配到標簽的的值作為新標簽的值
global:
scrape_interval: 60s
evaluation_interval: 60s
scrape_configs:
- job_name: 'consul-prometheus'
consul_sd_configs:
- server: '192.168.20.84:8500'
- services: []
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*test.*
action: keep
- regex: __meta_consul_service_metadata_(.+)
action: labelmap
3 . 使用go 向consul動態注冊/注銷服務
import "github.com/hashicorp/consul/api"
//注冊
func Register(consortiumName,nodeName,NodeType string ,port int) error {
config :=api.DefaultConfig()
config.Address = ""
check := api.AgentServiceCheck{
Interval: "5s",
HTTP: "",
}
m := make(map[string]string) //自定義標簽資訊
m["consortium"] = consortiumName
m["NodeType"] = NodeType
m["NodeName"] = nodeName
reg := api.AgentServiceRegistration{
ID: nodeName,
Name: consortiumName,
Address: ip,
Port: port,
Tags: []string{"baas"},
Check: &check,
Meta: m,
}
client, err := api.NewClient(config)
if err != nil {
return err
}
return client.Agent().ServiceRegister(®)
}
//注銷
func Deregister(id string) error {
config :=api.DefaultConfig()
config.Address = ""
client, err := api.NewClient(config)
if err != nil {
return err
}
return client.Agent().ServiceDeregister(id)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/307375.html
標籤:區塊鏈
上一篇:9 月安全事件回顧
