go-kit微服務:API監控

rayson發表於2019-02-21

概述

目前,幾乎所有的研發人員每天都在跟API打交道:後端為實現業務不停的生產API,前端為實現產品功能不停的呼叫API。API已經成為前端與後端、產品與產品、公司與公司之間技術溝通、業務合作的橋樑。

微服務中,API幾乎是服務與外界的唯一互動渠道,API服務的穩定性、可靠性越來越成為不可忽略的部分。我們需要實時瞭解API的執行狀況(請求次數、延時、失敗等),需要通過對歷史資料的分析瞭解哪些API存在瓶頸以便後期優化。所以,為了確保系統良好的提供服務,絕大多數的微服務框架也都整合了API監控元件。

本文將為算術運算服務增加API監控功能:Prometheus作為監控元件,Grafana作為視覺化工具,兩者均通過docker-compose部署執行。go-kit已經提供prometheus元件(metric/prometheus),因此整合工作變得非常容易。在開始之前我們需要先了解一下所需的知識點。

Prometheus

Prometheus (中文名稱:普羅米修斯)是一套開源的系統監控報警框架。作為新一代的監控框架,Prometheus 具有以下特點:

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

Grafana

Grafana是一個跨平臺的開源的度量分析和視覺化工具,可以通過將採集的資料查詢然後視覺化的展示,並及時通知。它主要有以下六大特點:

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

在該示例中,通過配置檔案為Prometheus新增作業(job),尤其定時向本示例服務發起HTTP請求監控指標資料(即pull模式)。

實戰演練

Step-1:環境準備

由於我的電腦windows安裝docker一直不成功,我把執行環境切換到ubuntu 18.04下,還是使用Goland開發。

如果已經配置過docker和docker-compose可跳過步驟1、2;

  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下增加新的結構型別:

// metricMiddleware 定義監控中介軟體,嵌入Service
// 新增監控指標項:requestCount和requestLatency
type metricMiddleware struct {
	Service
	requestCount   metrics.Counter
	requestLatency metrics.Histogram
}
複製程式碼

接下來建立為Service封裝指標採集的方法Metric,採集請求次數和請求延遲兩個指標項:

// 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已經開始執行了。

go-kit微服務:API監控

  • 使用Postman呼叫算術運算服務。這裡使用Postman的Runner功能(介面左上角),首先將算術運算服務的四個請求新增到一個Collection中;然後建立一個Environment(介面右上角)命名為env-gokit-article;然後依次進入Runner-選擇Collection,按照下圖進行設定後,點選按鈕Run demo1開始執行測試。

go-kit微服務:API監控

go-kit微服務:API監控

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選項):

go-kit微服務:API監控

如圖所示,在查詢輸入框輸入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獲取,如果有任何疑問歡迎留言討論。

本文參考

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

go-kit微服務:API監控

相關文章