本文介紹go micro中加入metric, 並接入Prometheus、Grafananode
go micro中提供了prometheus pluginsgit
github.com/micro/go-plugins/wrapper/monitoring/prometheus/github
package main import ( "net/http" "github.com/micro/go-plugins/wrapper/monitoring/prometheus/v2" "github.com/prometheus/client_golang/prometheus/promhttp" //... ) func main() { // New Service service := micro.NewService( micro.Name("go.micro.api.myauth"), micro.Version("latest"), micro.WrapHandler(prometheus.NewHandlerWrapper()), ) // Initialise service service.Init( // create wrap for the Myauth service client micro.WrapHandler(client.MyauthWrapper(service)), ) go PrometheusBoot() // Register Handler myauth.RegisterMyauthHandler(service.Server(), new(handler.Myauth)) // Run service if err := service.Run(); err != nil { log.Fatal(err) } } func PrometheusBoot() { http.Handle("/metrics", promhttp.Handler()) // 啓動web服務,監聽8085端口 go func() { err := http.ListenAndServe("localhost:8085", nil) if err != nil { log.Fatal("ListenAndServe: ", err) } }() }
代碼很簡單,在micro.NewService中傳入micro.WrapHandler(prometheus.NewHandlerWrapper()),
golang
再啓動web服務,監聽8085端口,暴露metric數據web
訪問http://localhost:8085/metrics
便可看到數據docker
本文演示prometheus、grafana在docker中運行segmentfault
啓動prometheusapi
global: scrape_interval: 15s # By default, scrape targets every 15 seconds. # Attach these labels to any time series or alerts when communicating with # external systems (federation, remote storage, Alertmanager). external_labels: monitor: 'codelab-monitor' # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: 'prometheus' # Override the global default and scrape targets from this job every 5 seconds. scrape_interval: 5s static_configs: - targets: ['host.docker.internal:8085']
這裏示例 micro 微服務直接運行在宿主機上,Prometheus抓取數據須要訪問主機端口,因此targets的ip寫的是host.docker.internalapp
docker run -d -p 9090:9090 -v /Users/wulin/gowork/myauth/prometheus.yml:/etc/prometheus/prometheus.yml --name prometheus prom/prometheus
ide
訪問地址http://localhost:9090/
能夠看到抓取狀態是正常的
docker run -d -p 3000:3000 grafana/grafana
訪問地址http://localhost:3000/
首先設置數據源,選擇prometheus,url填http://宿主ip:9090/ ,點擊保存,提示成功便可
dashboard中點擊`add panel`, 選擇數據源,填寫metrics(點擊有提示),完成後點`apply`便可
測試用的node-exporter,能夠用於測試
docker run -d -p 9100:9100 \ -v "/proc:/host/proc:ro" \ -v "/sys:/host/sys:ro" \ -v "/:/rootfs:ro" \ prom/node-exporter
以上內容討論的是 go micro
的metrics,
如下內容討論的是micro網關
中的metrics,官方plugins請見https://github.com/micro/go-p...
自定義 micro 網關
代碼以下,僅列出metrics相關代碼
import ( "github.com/micro/go-plugins/micro/metrics/v2" "github.com/micro/micro/v2/cmd" "github.com/micro/micro/v2/plugin" ) func main() { plugin.Register(metrics.NewPlugin()) cmd.Init() }
插件中代碼以下
// NewPlugin returns a new metrics plugin func NewPlugin() plugin.Plugin { metrics := new(Metrics) return plugin.NewPlugin( plugin.WithName("metrics"), plugin.WithFlag( &cli.StringFlag{ Name: "metrics", Usage: "Specify the type of metrics provider e.g prometheus", }, ), plugin.WithHandler(metrics.Handler), plugin.WithInit(func(ctx *cli.Context) error { provider := ctx.String("metrics") switch provider { case "prometheus": metrics.Provider = prometheus.New() log.Info("Loaded prometheus metrics at /metrics") } return nil }), ) }
看起來不是很完善,目前只支持prometheus,且參數不能在代碼指定metrics ,啓動以下
go run ./gateway/main.go -metrics prometheus api --handler=api
plugins參數指定須要放到api以前哦
啓動後能夠看見控制檯
file=v2@v2.9.1/metrics.go:49 level=info Loaded prometheus metrics at /metrics
訪問http://localhost:8080/metrics ,便可看到metrics信息
數據收集展示和上文同樣,這裏就不重複介紹了。
go micro 分析系列文章
go micro server 啓動分析
go micro client
go micro broker
go micro cmd
go micro config
go micro store
go micro registry
go micro router
go micro runtime
go micro transport
go micro web
go micro registry 插件consul
go micro plugin
go micro jwt 網關鑑權
go micro 鏈路追蹤
go micro 熔斷與限流
go micro wrapper 中間件
go micro metrics 接入Prometheus、Grafana