使用Grafana監控Go應用

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端口地址,如下圖

go-monitor-1

接着我們在Query框輸入以下命令,完成測試數據庫的創建

CREATE DATABASE "helloWorld"

go-monitor-2

這樣我們的測試數據庫就創建完成了。

grafana設置

我們需要訪問grafana,進行一些參數和環境的設置

用戶名和密碼默認爲 admin / admin

go-monitor-3

登陸成功後,進入主頁面

go-monitor-4

在上面的主頁面,點擊一下 “Add data source”的綠色按鈕,點擊後,進入創建數據源的信息填寫表單:

go-monitor-5

現在,我們填寫我們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,如下圖:

go-monitor-6

然後我們選擇“Graph”,如下圖:

go-monitor-7

當panel出現後,我們鼠標點擊標題,當出現一個選擇創建的時候,我們繼續選擇“Edit”, 如下圖:

go-monitor-8

接下來,我們需要創建查詢Query的組合語句,如下圖

go-monitor-10

注意:如果我們想更多瞭解我們有哪些的指標項,我們還可以再瀏覽器進行相關查詢,例如:

go-monitor-9

再設置X軸和Y軸的數據展示單位

go-monitor-11

上述主要的設置完成後,保存並刷新頁面,可以看到我們的監控數據已經出現在我們的監控面板上:

go-monitor-12


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章