我們用一個系列來講解從需求到上線、從代碼到k8s部署、從日誌到監控等各個方面的微服務完整實踐。
整個項目使用了go-zero開發的微服務,基本包含了go-zero以及相關go-zero作者開發的一些中間件,所用到的技術棧基本是go-zero項目組的自研組件,基本是go-zero全家桶了。
實戰項目地址:https://github.com/Mikaelemmmm/go-zero-looklook
1、概述
好的服務一定是可以被及時監控的,在go-zero-looklook中我們使用目前比較流行的prometheus來作爲監控工具,然後使用grafana來顯示
go-zero已經在代碼中給我們集成好了prometheus
// StartAgent starts a prometheus agent.
func StartAgent(c Config) {
if len(c.Host) == 0 {
return
}
once.Do(func() {
enabled.Set(true)
threading.GoSafe(func() {
http.Handle(c.Path, promhttp.Handler())
addr := fmt.Sprintf("%s:%d", c.Host, c.Port)
logx.Infof("Starting prometheus agent at %s", addr)
if err := http.ListenAndServe(addr, nil); err != nil {
logx.Error(err)
}
})
})
}
無論當我們啓動api、rpc都會額外啓動一個goroutine 提供prometheus的服務
【注】如果像我們之前order-mq這種使用serviceGroup管理的服務,在啓動文件main中要顯式調用一下才可以,api、rpc不需要,配置都一樣
package main
.....
func main() {
....
// log、prometheus、trace、metricsUrl.
if err := c.SetUp(); err != nil {
panic(err)
}
......
}
2、實現
2.1 配置prometheus與grafana
在項目下的docker-compose-env.yml文件中
我們來deploy/prometheus/server/prometheus.yml看看prometheus配置文件
global:
scrape_interval:
external_labels:
monitor: 'codelab-monitor'
# 這裏表示抓取對象的配置
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s #重寫了全局抓取間隔時間,由15秒重寫成5秒
static_configs:
- targets: ['127.0.0.1:9090']
- job_name: 'order-api'
static_configs:
- targets: ['order-api:9091']
labels:
job: order-api
app: order-api
env: dev
- job_name: 'order-rpc'
static_configs:
- targets: ['order-rpc:9091']
labels:
job: order-rpc
app: order-rpc
env: dev
- job_name: 'order-mq'
static_configs:
- targets: ['order-mq:9091']
labels:
job: order-mq
app: order-mq
env: dev
- job_name: 'usercenter-api'
static_configs:
- targets: ['usercenter-api:9091']
labels:
job: usercenter-api
app: usercenter-api
env: dev
- job_name: 'usercenter-rpc'
static_configs:
- targets: ['usercenter-rpc:9091']
labels:
job: usercenter-rpc
app: usercenter-rpc
env: dev
- job_name: 'travel-api'
static_configs:
- targets: ['travel-api:9091']
labels:
job: travel-api
app: travel-api
env: dev
- job_name: 'travel-rpc'
static_configs:
- targets: ['travel-rpc:9091']
labels:
job: travel-rpc
app: travel-rpc
env: dev
- job_name: 'payment-api'
static_configs:
- targets: ['payment-api:9091']
labels:
job: payment-api
app: payment-api
env: dev
- job_name: 'payment-rpc'
static_configs:
- targets: ['payment-rpc:9091']
labels:
job: payment-rpc
app: payment-rpc
env: dev
- job_name: 'mqueue-rpc'
static_configs:
- targets: ['mqueue-rpc:9091']
labels:
job: mqueue-rpc
app: mqueue-rpc
env: dev
- job_name: 'message-mq'
static_configs:
- targets: ['message-mq:9091']
labels:
job: message-mq
app: message-mq
env: dev
- job_name: 'identity-api'
static_configs:
- targets: ['identity-api:9091']
labels:
job: identity-api
app: identity-api
env: dev
- job_name: 'identity-rpc'
static_configs:
- targets: [ 'identity-rpc:9091' ]
labels:
job: identity-rpc
app: identity-rpc
env: dev
2.2 業務配置
實現上我們業務也不需要添加任何代碼(除了serviceGroup管理的服務)
我們只需要在業務配置文件中配置即可,我們拿usercenter來舉例
1)api
2)rpc
3)mq(serviceGroup)
【注】(再強調一次)如果像我們之前order-mq這種使用serviceGroup管理的服務,在啓動文件main中要顯示調用一下才可以,api、rpc不需要
package main
.....
func main() {
....
// log、prometheus、trace、metricsUrl.
if err := c.SetUp(); err != nil {
panic(err)
}
......
}
2.3 查看
訪問 http://127.0.0.1:9090/ , 點擊上面菜單“Status”,再點擊Targets ,藍色的就是啓動成了,紅色就是沒啓動成功
2.4 配置grafana
訪問http://127.0.0.1:3001, 默認賬號、密碼都是admin
配置數據源是prometheus
然後配置
【注】這裏是在docker中配置的,所以http的url不能寫127.0.0.1
查看是否配置成功
配置dashboard
然後點擊第一個
我們添加一個cpu指標,在下方輸入cpu選擇
然後我們就可以看到我們想要看的監控指標
3、結尾
這裏只演示了一個指標,其他想看的指標自己配置就可以了,同時你也可以在grafana添加alert報警配置,這個就不作爲演示了自行整理
項目地址
https://github.com/zeromicro/go-zero
歡迎使用 go-zero
並 star 支持我們!
微信交流羣
關注『微服務實踐』公衆號並點擊 交流羣 獲取社區羣二維碼。