因爲公司沒有運維, 又須要監控服務器的一些數據信息, 想盡快的啓動一個數值監控系統. 技術評估了下打算 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
但願你們喜歡.運維