go-kit微服務:API監控

概述

目前,幾乎全部的研發人員天天都在跟API打交道:後端爲實現業務不停的生產API,前端爲實現產品功能不停的調用API。API已經成爲前端與後端、產品與產品、公司與公司之間技術溝通、業務合做的橋樑。html

微服務中,API幾乎是服務與外界的惟一交互渠道,API服務的穩定性、可靠性愈來愈成爲不可忽略的部分。咱們須要實時瞭解API的運行情況(請求次數、延時、失敗等),須要經過對歷史數據的分析瞭解哪些API存在瓶頸以便後期優化。因此,爲了確保系統良好的提供服務,絕大多數的微服務框架也都集成了API監控組件。前端

本文將爲算術運算服務增長API監控功能:Prometheus做爲監控組件,Grafana做爲可視化工具,二者均經過docker-compose部署運行。go-kit已經提供prometheus組件(metric/prometheus),所以集成工做變得很是容易。在開始以前咱們須要先了解一下所需的知識點。linux

Prometheus

Prometheus (中文名稱:普羅米修斯)是一套開源的系統監控報警框架。做爲新一代的監控框架,Prometheus 具備如下特色:git

  • 提供強大的多維度數據模型,如Counter、Gauge、Histogram、Summary;
  • 強大而靈活的查詢語句(PromQL),可方便的實現對時間序列數據的查詢、聚合操做;
  • 易於管理與高效;
  • 提供pull模式、push gateway方式實現時間序列數據的採集;
  • 支持多種可視化圖形界面:Grafana、Web UI、API clients;
  • 報警規則管理、報警檢測和報警推送功能。

Grafana

Grafana是一個跨平臺的開源的度量分析和可視化工具,能夠經過將採集的數據查詢而後可視化的展現,並及時通知。它主要有如下六大特色:github

  • 展現方式:快速靈活的客戶端圖表,面板插件有許多不一樣方式的可視化指標和日誌,官方庫中具備豐富的儀表盤插件,好比熱圖、折線圖、圖表等多種展現方式;
  • 數據源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB等;
  • 通知提醒:以可視方式定義最重要指標的警報規則,Grafana將不斷計算併發送通知,在數據達到閾值時經過Slack、PagerDuty等得到通知;
  • 混合展現:在同一圖表中混合使用不一樣的數據源,能夠基於每一個查詢指定數據源,甚至自定義數據源;
  • 註釋:使用來自不一樣數據源的豐富事件註釋圖表,將鼠標懸停在事件上會顯示完整的事件元數據和標記;
  • 過濾器:Ad-hoc過濾器容許動態建立新的鍵/值過濾器,這些過濾器會自動應用於使用該數據源的全部查詢。

在該示例中,經過配置文件爲Prometheus添加做業(job),尤爲定時向本示例服務發起HTTP請求監控指標數據(即pull模式)。golang

實戰演練

Step-1:環境準備

因爲個人電腦windows安裝docker一直不成功,我把運行環境切換到ubuntu 18.04下,仍是使用Goland開發。docker

若是已經配置過docker和docker-compose可跳過步驟一、2;json

  1. 按照官方指南安裝docker-ce。另外,爲了提升鏡像下載速度,可選擇國內鏡像修改方式以下:
# 打開(沒有會新建)文件
 sudo vim /etc/docker/daemon.json
 
 # 設置如下內容
 {
    "registry-mirrors": [
        "https://registry.docker-cn.com"
    ]
}

# 重啓服務
sudo service docker restart
複製代碼
  1. 安裝docker-compose。官方將安裝包放在aws,使用其推薦的curl方式特別慢。我是先到Release頁面下載最新版本,複製到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
複製代碼
  1. 下載最新版本Prometheus客戶端
go get github.com/prometheus/client_golang/prometheus
複製代碼
  1. 複製目錄arithmetic_rate_limit_demo,從新命名爲arithmetic_monitor_dmeo

Step-2:添加指標採集中間件

本示例將基於《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爲例進行說明,其餘方法與之相似。

  • 每接收一次請求,請求次數每次加1;
  • 經過請求結束時間減去請求開始的差值(單位秒)做爲請求延時;
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
}
複製代碼

Step-3:開放Prometheus指標採集接口

transport.go中新增用於Prometheus輪循拉取監控指標的代碼,開放API接口/metrics

r.Path("/metrics").Handler(promhttp.Handler())
複製代碼

Step-4:修改main.go

首先建立指標採集對象:請求次數採集和請求延時採集對象。

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進行編譯,確保沒有問題。

Step-5:配置docker鏡像

本示例使用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文件中設置:

  • 經過環境變量設置admin的登陸密碼選項GF_SECURITY_ADMIN_PASSWORD
  • 建立volumes爲其指定數據存儲目錄;

接下來建立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了。

Step-6:運行

萬事俱備只欠東風了。接下來就是依次啓動咱們的服務、Prometheus和Grafana鏡像,而後使用Postman進行測試。

  • 啓動算術運算服務。
./arithmetic_monitor_demo 
Http Server start at port:9000
複製代碼
  • 啓動docker。
# 啓動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已經開始運行了。

  • 使用Postman調用算術運算服務。這裏使用Postman的Runner功能(界面左上角),首先將算術運算服務的四個請求添加到一個Collection中;而後建立一個Environment(界面右上角)命名爲env-gokit-article;而後依次進入Runner-選擇Collection,按照下圖進行設置後,點擊按鈕Run demo1開始執行測試。

Step-7:查看監控數據

初次經過瀏覽器訪問Grafana須要進行若干配置,纔可查看監控數據,比較簡單,步驟以下:

  • 登陸Grafana:經過瀏覽器訪問localhost:3000,使用用戶名admin和yml配置的密碼password登陸;
  • 建立數據源:點擊create your first datasource,選擇Prometheus,配置HTTP.URL(建議設置爲http://[IP]:[port],不要使用localhost),最後保存成功。
  • 建立Dashboard:點擊create your first dashboard,選擇Graph,點擊Title下拉菜單中的Edit,便可進入以下界面(選擇Metric選項):

如圖所示,在查詢輸入框輸入raysonxin便可看到咱們採集的四個監控指標項,選擇其中一項便可在圖表中查看細節(請自行查閱資料進行分析,本文不展開,由於還不懂)。

  • raysonxin_arithmetic_service_request_count;
  • raysonxin_arithmetic_service_request_latency;
  • raysonxin_arithmetic_service_request_latency_count;
  • raysonxin_arithmetic_service_request_latency_sum;

總結

今天的示例爲運算服務增長基於Prometheus的API監控功能,經過Prometheus(官方docker鏡像)採集運算服務的監控指標數據,經過Grafana(官方docker鏡像)的Dashboard查看監控指標數據。

因爲go-kit自己已經對Prometheus監控組件進行了封裝,因此代碼編寫工做比較省時間,更多的時間在於環境的搭建與測試,固然因爲使用docker技術效率已經大大提升。

本文只是流水帳似的把個人學習過程記錄下來,並無對其中使用的技術和原理進行深刻分析。

本文示例代碼可經過個人github獲取,若是有任何疑問歡迎留言討論。

本文參考

本文首發於本人微信公衆號【兮一昂吧】,歡迎掃碼關注!

相關文章
相關標籤/搜索