[afterCode] docker 速成班 7: 實戰 構建基於graphtie/grafana監控應用

因爲公司沒有運維, 又須要監控服務器的一些數據信息, 想盡快的啓動一個數值監控系統. 技術評估了下打算 graphite + grafana 的方式來建設.javascript

graphite 是一個時間數列數據庫,而且自帶一些簡單 web 圖形展現功能. 雖然 web 展現方面不是很完美,可是在收集時間數據上很是的方便和簡單. 根據 https://graphiteapp.org/ 官網的例子,只須要一個 tcp 鏈接就能向 graphite 服務上傳基於時間的數值了.java

echo "foo.bar 1 `date +%s`" | nc graphitehost 2003

grafana 呢? 是一個顏值極高的數據圖形化分析和監控應用. 至於顏值有多高呢?本身直接看看這個 demo 就能知道了 http://play.grafana.org/. 最重要的一點是 grafana 官方自帶 graphite 的數據源的插件. 這應用組合在一塊兒就開箱即用了.node

那爲了方便快捷開發和開發這個系統,就決定用 docker-compose 的方式構建由graphite 和 grafana 組合的服務.web

服務端配置

version: '3'

services:
  graphite:
    container_name: monitor_graphite
    restart: always
    image: sitespeedio/graphite
    volumes:
      - ./data/graphite/storage/whisper:/opt/graphite/storage/whisper
      - ./data/graphite/storage-schemas.conf:/opt/graphite/conf/storage-schemas.conf
    ports:
      - "2003:2003"
      - "8093:80"
  grafana:
    container_name: monitor_grafana
    restart: always
    image: grafana/grafana
    ports:
      - 3018:3000
    environment:
      - "GF_SECURITY_ADMIN_PASSWORD=screct"
      - "GF_SERVER_ROOT_URL=http://subdomain.yourdomain.com"
    volumes:
      - "./data/grafana:/var/lib/grafana"

這裏經過 volumes 字段將兩個服務的磁盤空間都映射到本地主機上;映射的路徑均可以在 docker hub 上這個容器說明裏面看到;這樣咱們監控的數據就持久化到了本地.docker

在服務端經過 docker-compose up -d 就將服務啓動起來了;用配置 grafana 默認管理員帳戶密碼配置好 graphite 的數據源. 須要注意的就是在配置 graphite 的http url 的時候直接使用 http://monitor_graphite 就能夠了; 訪問的方式選擇爲proxy. 最後填好 graphite 對應的鑑權信息. 服務端 graphite 和 grafana 就配置好了.數據庫

這裏須要注意的是, graphite 的 2003 是須要暴露到公網的. 因此記得設置主機的防火牆;還有就是因爲是直接暴露到了公網的,最好針對訪問的 ip 作好白名單.bash

客戶端

收集數據的客戶端其實很是的簡單, 建立一個到 graphite 的 TCP 鏈接;而後寫入本身須要的保存的數據便可.爲了驗證可行性,就直接用 node.js 來寫入便可.服務器

// report.js

function ts() {
    return Math.floor(Date.now() / 1000)
}

const client = net.connect(config.graphitePort, config.graphiteHost, () => {
 client.setNoDelay(true)

  setInterval(function () {
    const [cpuUsageIn1Min] = os.loadavg()
    client.write(`server.${config.nameSpace}.os.cpu ${cpuUsageIn1Min} ${ts()}\n`)
  }, ms('10s'));
})

client.on('end', () => {
  process.exit(0)
})

使用 docker 能夠快速的構建起應用所須要基礎設施,本身只要寫一些定製的內容就很快的完成任務. 感謝 docker.app

但願你們喜歡.運維

相關文章
相關標籤/搜索