http://lihaoquan.me/2017/2/2/monitor-go-with-influxdb-and-grafana.html
互聯網企業背後,依靠的是成千上萬臺服務器日夜不停運轉,以支撐其業務的運轉,宕機對於互聯網企業來說,代價是 沉重的,輕則影響用戶體驗,重則直接影響交易,特別給我們這些做電商的造成不可挽回的損失。對於這些機器隊友的 開發和運維人員來說,依靠人力是不可能完成24小時不間斷盯着服務器的。所以對於互聯網公司,監控工作的地位 已經越來越重要了,作爲Devops也是需要掌握各種技術方案的監控。
Go語言在過去的2016年成爲了年度的最佳語言,這說明在國內甚至全球範圍內,越來越多公司都在使用Go來開發他們的產品。 Go具備高併發,部署方便等特點,已經成爲很多後端開發工程師的首選語言。
本文會以Go爲入口,利用目前在監控工具中很火的Grafana和infuxDB作爲例子,介紹下我們如何數據可視化的方式實時監控我們的 go應用。
環境準備
influxDB 和 grafana
Grafana一般是和一些時間序列數據庫進行配合來展示數據的,例如:Graphite、OpenTSDB、InfluxDB等,主要特點:
-
grafana是用於可視化大型測量數據的開源程序,他提供了強大和優雅的方式去創建、共享、瀏覽數據。dashboard中顯示了你不同metric數據源中的數據。
-
grafana最常用於因特網基礎設施和應用分析,但在其他領域也有機會用到,比如:工業傳感器、家庭自動化、過程控制等等。
-
grafana有熱插拔控制面板和可擴展的數據源,目前已經支持Graphite、InfluxDB、OpenTSDB、Elasticsearch。
本次實驗, 我們需要使用influxDB
存儲我們的指標數據,由於我們的指標數據是時序性的,所以influxDB比較合適,當然也可以使用 prometheus
作爲時序數據持久化方案。
由於我想快速搭建環境,我就不拘束於常規的安裝方式,這裏直接使用Docker來構建我們的influxDB容器
sudo docker run -d -p 8083:8083 -p 8086:8086 tutum/influxdb:latest
同樣,我們也用Docker開構建我們的grafana容器
sudo docker run -d -p 9090:3000/tcp --name=grafana grafana/grafana:latest
上面的容器構建並啓動後,我們可以在瀏覽器完成一些相關的配置:
初始化influxDB
我們在瀏覽器訪問 8083端口地址,如下圖
接着我們在Query框輸入以下命令,完成測試數據庫的創建
CREATE DATABASE "helloWorld"
這樣我們的測試數據庫就創建完成了。
grafana設置
我們需要訪問grafana,進行一些參數和環境的設置
用戶名和密碼默認爲 admin / admin
登陸成功後,進入主頁面
在上面的主頁面,點擊一下 “Add data source”的綠色按鈕,點擊後,進入創建數據源的信息填寫表單:
現在,我們填寫我們influxDB的一些關鍵信息,如上圖,然後點擊“保存” ,這樣我們在Grafana就完成了數據源的關聯工作。
在進一步配置我們的監控面板之前,我們先實現我們指標監控測試代碼
數據埋點
我們先實現一個用於測試的代碼, 本代碼是模擬在隨機的時間內申請內存,用於參數內存和GC等監控指標。
這些指標會發送到influxDB中,最後,我們可以再Grafana中完成對指標數據的監控觀察。
package main
import (
"fmt"
"math/rand"
"time"
"github.com/rcrowley/go-metrics"
"github.com/vrischmann/go-metrics-influxdb"
)
//使用內存
func useMemory() {
a := rand.Intn(100)
m := make([]int, a*1e6)
d := time.Second * time.Duration(rand.Intn(15))
fmt.Printf("Generated something with size %dMB, sleeping for %s\n", len(m)/1e6, d)
time.Sleep(d)
fmt.Printf("Done using %dMB\n", len(m)/1e6)
}
func main() {
r := metrics.NewRegistry()
metrics.RegisterDebugGCStats(r)
metrics.RegisterRuntimeMemStats(r)
go metrics.CaptureDebugGCStats(r, time.Second*5)
go metrics.CaptureRuntimeMemStats(r, time.Second*5)
go influxdb.InfluxDB(
r, // metrics registry
time.Second*5, // 時間間隔
"http://192.168.139.140:8086", // InfluxDB url
"helloWorld", // InfluxDB 數據庫名
"", // InfluxDB user
"", // InfluxDB password
)
time.Sleep(time.Second * 10)
for {
go useMemory()
time.Sleep(time.Duration(rand.Intn(15)) * time.Second)
}
}
我們在終端啓動我們的測試代碼:
go run main.go
創建監控面板
一旦我們的DataSource完成配置後,在Grafana我們可以開始造一個監控面板,我們繼續點擊左上角的logo圖案,在Dashboards中 選擇New
,來創建一個新的panel,如下圖:
然後我們選擇“Graph”,如下圖:
當panel出現後,我們鼠標點擊標題,當出現一個選擇創建的時候,我們繼續選擇“Edit”, 如下圖:
接下來,我們需要創建查詢Query的組合語句,如下圖
注意:如果我們想更多瞭解我們有哪些的指標項,我們還可以再瀏覽器進行相關查詢,例如:
再設置X軸和Y軸的數據展示單位
上述主要的設置完成後,保存並刷新頁面,可以看到我們的監控數據已經出現在我們的監控面板上: