[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

但愿你们喜欢.运维

相关文章
相关标签/搜索