[afterCode] docker 速成班 7: 实战 构建基于graphtie/grafana监控应用

news/2024/6/20 0:06:58

由于公司没有运维, 又需要监控服务器的一些数据信息, 想尽快的启动一个数值监控系统. 技术评估了下打算 graphite + grafana 的方式来建设.

graphite 是一个时间数列数据库,并且自带一些简单 web 图形展示功能. 虽然 web 展示方面不是很完美,但是在收集时间数据上非常的方便和简单. 根据 https://graphiteapp.org/ 官网的例子,只需要一个 tcp 连接就能向 graphite 服务上传基于时间的数值了.

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

而 grafana 呢? 是一个颜值极高的数据图形化分析和监控应用. 至于颜值有多高呢?自己直接看看这个 demo 就能知道了 http://play.grafana.org/. 最重要的一点是 grafana 官方自带 graphite 的数据源的插件. 这应用组合在一起就开箱即用了.

那为了方便快捷开发和开发这个系统,就决定用 docker-compose 的方式构建由graphite 和 grafana 组合的服务.

服务端配置

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-compose up -d 就将服务启动起来了;用配置 grafana 默认管理员账户密码配置好 graphite 的数据源. 需要注意的就是在配置 graphite 的http url 的时候直接使用 http://monitor_graphite 就可以了; 访问的方式选择为proxy. 最后填好 graphite 对应的鉴权信息. 服务端 graphite 和 grafana 就配置好了.

这里需要注意的是, graphite 的 2003 是需要暴露到公网的. 所以记得设置主机的防火墙;还有就是由于是直接暴露到了公网的,最好针对访问的 ip 做好白名单.

客户端

收集数据的客户端其实非常的简单, 创建一个到 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.

希望大家喜欢.


http://www.niftyadmin.cn/n/2015600.html

相关文章

Python获取对象的应用个数

在Python中获取对象的应用个数是使用sys模块。如下&#xff1a; In [1]: class Myclass:...: pass...:In [2]: c MyClass() ------------------------------------------------ NameError Traceb <ipython-input-2-7a6d4d069ec7> i…

java之 JVM 内存管理详解

一、JVM结构 根据《java虚拟机规范》规定&#xff0c;JVM的基本结构一般如下图所示&#xff1a; 从左图可知&#xff0c;JVM主要包括四个部分&#xff1a; 1.类加载器&#xff08;ClassLoader&#xff09;:在JVM启动时或者在类运行时将需要的class加载到JVM中。&#xff08;右图…

ubuntu15.04 无线上网问题

今天将笔记本装成了ubuntu15.04&#xff0c;但是一开始无法上无线wifi&#xff0c;可把我郁闷坏了&#xff0c;就开始百度呗&#xff0c;然后就找到了一些前辈们的足迹sudo iwlist wlan0 scan #找到要的ESSID比如chinanet #假设密码1234567890 sudo iwconfig wlan0 essid china…

Python模块导入与__name__变量的使用

我有以下三个python文件&#xff1a;在python中每一个py文件都是一个模块&#xff0c;不管里面写了什么。 现在main.py调用test1模块&#xff0c;那么导入的方式可以是&#xff1a;import test1导入test1包&#xff0c;在使用其中的类或者方法时&#xff0c;需要指定&#xff0…

uboot中MAC网络(待续)

start ->start_armboot ->main_loop 实际应用中问题&#xff1a;为什么从nandflash读出的MAC&#xff08;写到物理phy上&#xff09;与上层网口地址不同&#xff08;上层网口采用env的mac&#xff09;&#xff1f; 从nandflash读出mac并写入phy后&#xff0c;才初始化网络…

微型项目实践(12):查询与显示

上一篇中&#xff0c;我们分析了页面中的控件和数据绑定中的扩展方法&#xff0c;今天我们看数据的查询和显示。其中&#xff0c;数据的查询属于业务逻辑层&#xff08;Business&#xff09;&#xff0c;而显示属于UI层。 假设我们要根据以下两个条件进行查询&#xff1a; 日志…

Python 核心编程(第二版)——文件和输入输出

1.文件对象 文件对象不仅可以用来访问普通的磁盘文件, 而且也可以访问任何其它类型抽象层面上的"文件". 一旦设置了合适的"钩子", 你就可以访问具有文件类型接口的其它对象, 就好像访问的是普通文件一样。文件只是连续的字节序列. 数据的传输经常会用到字节…

使用 Nim 语言和使用 C 语言, 调用系统 POSIX 接口传递文件描述符的对比

进程组之间传递文件描述符, 是多进程服务器共享套接字常用的方式. 基于此方式, 可以提供 round-robin , 使每个服务器获得平衡的负载. Nim 和 C 语言调用相同的 POSIX 接口的编程方式如下, (事实上, Nim 是调用的 C POSIX 接口) Nim import posixproc CMSG_LEN(length: cuint)…