目前,幾乎全部的研發人員天天都在跟API打交道:後端爲實現業務不停的生產API,前端爲實現產品功能不停的調用API。API已經成爲前端與後端、產品與產品、公司與公司之間技術溝通、業務合做的橋樑。html
微服務中,API幾乎是服務與外界的惟一交互渠道,API服務的穩定性、可靠性愈來愈成爲不可忽略的部分。咱們須要實時瞭解API的運行情況(請求次數、延時、失敗等),須要經過對歷史數據的分析瞭解哪些API存在瓶頸以便後期優化。因此,爲了確保系統良好的提供服務,絕大多數的微服務框架也都集成了API監控組件。前端
本文將爲算術運算服務增長API監控功能:Prometheus
做爲監控組件,Grafana
做爲可視化工具,二者均經過docker-compose
部署運行。go-kit已經提供prometheus
組件(metric/prometheus
),所以集成工做變得很是容易。在開始以前咱們須要先了解一下所需的知識點。linux
Prometheus (中文名稱:普羅米修斯)是一套開源的系統監控報警框架。做爲新一代的監控框架,Prometheus 具備如下特色:git
Grafana是一個跨平臺的開源的度量分析和可視化工具,能夠經過將採集的數據查詢而後可視化的展現,並及時通知。它主要有如下六大特色:github
在該示例中,經過配置文件爲Prometheus添加做業(job),尤爲定時向本示例服務發起HTTP請求監控指標數據(即pull模式)。golang
因爲個人電腦windows安裝docker一直不成功,我把運行環境切換到ubuntu 18.04下,仍是使用Goland開發。docker
若是已經配置過docker和docker-compose可跳過步驟一、2;json
docker-ce
。另外,爲了提升鏡像下載速度,可選擇國內鏡像修改方式以下:# 打開(沒有會新建)文件
sudo vim /etc/docker/daemon.json
# 設置如下內容
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
# 重啓服務
sudo service docker restart
複製代碼
usr/local/bin/docker-compose
;而後設置權限安裝成功的。步驟以下:# 移動或複製文件到指定目錄
sudo mv [your download file] /usr/local/bin/docker-compose
# 設置權限
sudo chmod +x /usr/local/bin/docker-compose
# 檢查是否安裝成功
docker-compose --version
複製代碼
go get github.com/prometheus/client_golang/prometheus
複製代碼
arithmetic_rate_limit_demo
,從新命名爲arithmetic_monitor_dmeo
;本示例將基於《go-kit微服務:限流》的代碼進行改進,使用go-kit中間件機制爲Service
添加Prometheus監控指標採集功能。在instrument.go
下增長新的結構類型:ubuntu
// metricMiddleware 定義監控中間件,嵌入Service
// 新增監控指標項:requestCount和requestLatency
type metricMiddleware struct {
Service
requestCount metrics.Counter
requestLatency metrics.Histogram
}
複製代碼
接下來建立爲Service封裝指標採集的方法Metric
,採集請求次數和請求延遲兩個指標項:vim
// Metrics 指標採集方法
func Metrics(requestCount metrics.Counter, requestLatency metrics.Histogram) ServiceMiddleware {
return func(next Service) Service {
return metricMiddleware{
next,
requestCount,
requestLatency}
}
}
複製代碼
而後跟限流、日誌中間件的方式一致,因爲嵌入了Service接口,須要依次實現該接口的方法,以Add爲例進行說明,其餘方法與之相似。
func (mw metricMiddleware) Add(a, b int) (ret int) {
defer func(beign time.Time) {
lvs := []string{"method", "Add"}
mw.requestCount.With(lvs...).Add(1)
mw.requestLatency.With(lvs...).Observe(time.Since(beign).Seconds())
}(time.Now())
ret = mw.Service.Add(a, b)
return ret
}
複製代碼
在transport.go
中新增用於Prometheus輪循拉取監控指標的代碼,開放API接口/metrics
。
r.Path("/metrics").Handler(promhttp.Handler())
複製代碼
首先建立指標採集對象:請求次數採集和請求延時採集對象。
fieldKeys := []string{"method"}
requestCount := kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{
Namespace: "raysonxin",
Subsystem: "arithmetic_service",
Name: "request_count",
Help: "Number of requests received.",
}, fieldKeys)
requestLatency := kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
Namespace: "raysonxin",
Subsystem: "arithemetic_service",
Name: "request_latency",
Help: "Total duration of requests in microseconds.",
}, fieldKeys)
複製代碼
使用Metrics
方法對Service對象進行封裝:
svc = Metrics(requestCount, requestLatency)(svc)
複製代碼
因爲最後須要使用Postman進行接口測試,這裏我將限流器的容量改成了100。
//add ratelimit,refill every second,set capacity 3
ratebucket := rate.NewLimiter(rate.Every(time.Second*1), 100)
endpoint = NewTokenBucketLimitterWithBuildIn(ratebucket)(endpoint)
複製代碼
至此,代碼修改完成,可經過go build
進行編譯,確保沒有問題。
本示例使用Prometheus和Gafana的官方docker鏡像(prom/prometheus和grafana/grafana),經過docker-compose搭建環境。
首先爲Prometheus建立配置文件(docker/prometheus.yml),建立每隔5秒定時從咱們的微服務抓取監控指標數據的Job,命名爲raysonxin。該配置文件須要在運行時加載到鏡像中。注意targets設置爲算術運算服務的訪問地址;yml文件配置信息的縮進。
global:
scrape_interval: 15s
external_labels:
monitor: 'raysonxin-monitor'
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
labels:
group: 'local'
- job_name: 'raysonxin'
scrape_interval: 5s
static_configs:
- targets: ['192.168.10.113:9000']
labels:
group: 'arithmetic'
複製代碼
對於Gafana鏡像有兩項配置須要在yml文件中設置:
GF_SECURITY_ADMIN_PASSWORD
;接下來建立docker-compose運行所需的配置文件:docker/docker-compose.yml,內容以下:
version: '2'
services:
prometheus:
image: prom/prometheus
ports:
- 9090:9090
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
grafana:
image: grafana/grafana
ports:
- 3000:3000
environment:
- GF_SECURITY_ADMIN_PASSWORD=password
volumes:
- $PWD/extra/grafana_db:/var/lib/grafana grafana/grafana
複製代碼
如今就可使用命令啓動docker了。
萬事俱備只欠東風了。接下來就是依次啓動咱們的服務、Prometheus和Grafana鏡像,而後使用Postman進行測試。
./arithmetic_monitor_demo
Http Server start at port:9000
複製代碼
# 啓動docker
docker-compose -f docker/docker-compose.yml up -d
# 查看運行狀態
sudo docker-compose -f docker/docker-compose.yml ps
# 中止docker
sudo docker-compose -f docker/docker-compose.yml stop
複製代碼
經過「查看運行狀態」指令看到如下界面,說明Prometheus和Grafana已經開始運行了。
Runner
功能(界面左上角),首先將算術運算服務的四個請求添加到一個Collection
中;而後建立一個Environment
(界面右上角)命名爲env-gokit-article
;而後依次進入Runner
-選擇Collection
,按照下圖進行設置後,點擊按鈕Run demo1
開始執行測試。初次經過瀏覽器訪問Grafana
須要進行若干配置,纔可查看監控數據,比較簡單,步驟以下:
localhost:3000
,使用用戶名admin
和yml配置的密碼password
登陸;create your first datasource
,選擇Prometheus
,配置HTTP.URL
(建議設置爲http://[IP]:[port]
,不要使用localhost),最後保存成功。create your first dashboard
,選擇Graph
,點擊Title
下拉菜單中的Edit
,便可進入以下界面(選擇Metric選項):如圖所示,在查詢輸入框輸入raysonxin
便可看到咱們採集的四個監控指標項,選擇其中一項便可在圖表中查看細節(請自行查閱資料進行分析,本文不展開,由於還不懂)。
今天的示例爲運算服務增長基於Prometheus的API監控功能,經過Prometheus(官方docker鏡像)採集運算服務的監控指標數據,經過Grafana(官方docker鏡像)的Dashboard查看監控指標數據。
因爲go-kit自己已經對Prometheus監控組件進行了封裝,因此代碼編寫工做比較省時間,更多的時間在於環境的搭建與測試,固然因爲使用docker技術效率已經大大提升。
本文只是流水帳似的把個人學習過程記錄下來,並無對其中使用的技術和原理進行深刻分析。
本文示例代碼可經過個人github獲取,若是有任何疑問歡迎留言討論。
本文首發於本人微信公衆號【兮一昂吧】,歡迎掃碼關注!