StatusOk+InfluxDb+Grafana(一)StatusOk - 轻量级的信息监控工具

Statusok 是一款基于Go语言开发的轻量级的信息监控工具,基于c/s模式,定期由客户端发送http请求,支持多类信息通知客户端的api监控,配合InfluxDb+Grafana,可以达到快速部署一个简单的HTTP站点监控应用的目的!

Grafana: 用于分析和监控的开放平台,数据可视化和监控,支持Graphite,InfluxDB,Prometheus,Elasticsearch和更多数据库

InfluxDB是一个由InfluxData开发的开源时序型数据库,具有跨OSS,云和企业产品的通用API的可编程性和高性能,可为您提供高粒度,高规模和高可用性。它由Go写成,着力于高性能地查询与存储时序型数据;InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。

概述

服务端的日志收集方案有Elastic Stack,如果是在运维无法短时间内快速部署整套环境,仅想对指定URL进行简单监控,可以考虑下基于C/S模式的监控方式。

1. StatusOK

1.1. StatusOK大体的设计思路

主main进程中创建:

  1. 【requestChannel】:listenToRequestChannel goroutine,做后台请求执行的通道,通过信号量throttle做了并发限制;
  2. 通过for循环,为Config配置中每一个HTTP请求,创建一个时钟createTicker goroutine;
  3. 每个时钟createTicker Goroutine,通过for循环进行Select时钟信号监听,当内部时钟Ticket发过来的消息,发送对应的消息到【requestChannel】,让listenToRequestChannel开始请求工作;

请求方法,PerformRequest

针对通道传递过来的消息,开始执行HTTP请求操作,将对应的请求正确或错误的记录,通过InfluxDB Go客户端,写入至InfluxDB数据库中,以提供Grafana进行读取进行数据呈现!

1.2. 通过Golang自行构建中statusok的一些问题

  1. mailgun_notify.go,负责通知的包中,,发现该应用代码不太健壮(消息通知的功能构建前,建议先禁用);
  2. requests.go,负责请求的方法中,相关命名不是很规范,诸如配置文件中的ResponseTime代表timeout的含义;
  3. database.go,负责InfluxDB信息插入的中,重复代码片段过多
  4. influxdb.go,负责InfluxDB的客户端包不兼容,原InfluxData团队计划V2.0版本的客户端,原来InfluxDBV1.0的仓库被移除
  5. mailgun_notify.go,负责邮件通知的接口已升级,对应的send()方法存在问题

1.3. 安装statusok

Statusok 是一款基于Go语言开发的轻量级的信息监控工具,基于c/s模式,定期由客户端发送http请求,支持多类信息通知客户端的api监控,配合InfluxDb+Grafana,可以达到快速部署一个简单的HTTP站点监控应用的目的!

从您的计算机监控您的网站和API,当服务器关闭或响应时间超过预期时,通过Slack,电子邮件通知。

go get github.com/codegangsta/cli
go get github.com/mailgun/mailgun-go
go get github.com/influxdata/influxdb-client-go

// 安装
go install github.com/sanathp/statusok

// 启动
statusok -config config.json

1.4. StatusOK弊端和优势

1.4.1. 弊端

  1. 由于StatusOK是基于客户端-CS模式的,在监控方面会受客户端本地网络环境影响较大,比如国内外网络波动等;
  2. 相关数据受CDN的缓存影响、WAF防火墙等因素,可能引发监控不稳定(比如请求被云WAF拦截)
  3. 针对大型post数据模拟这些比较繁琐
  4. 行为模拟客户端请求,如果服务器接口升级,也需要对应更新
  5. 请求受限于HTTP的路由和负载均衡策略

1.4.2. 优势

  1. StatusOK可以不受服务器运维环境的限制,可以在开发、测试等本地环境方面快速部署起来,做到最基本的监听;
  2. 一些针对服务器环境rt时间很短,但客户反馈等待时间较长的,可以做一些区域试点监控;
  3. 快速监控实现,针对简单的URL资源进行监控,可以考虑做一版客户端监控,整体搭建较为轻量级;

2. grafana

2.1. 安装grafana

Grafana: 用于分析和监控的开放平台,数据可视化和监控,支持Graphite,InfluxDB,Prometheus,Elasticsearch和更多数据库

基于Docker安装1

可以使用语法**GF_**(GF_<SectionName>_<KeyName>)使用环境变量覆盖conf/grafana.ini中定义的所有选项;同时,重新设置了环境变量后,需要重启容器!

2.2. 单一docker容器运行

// 快速启动
docker run -d --name=grafana -p 3000:3000 grafana/grafana

// 基于环境变量启动
$ docker run \
  -d \
  -p 3000:3000 \
  --name=grafana \
  -e "GF_SERVER_ROOT_URL=http://grafana.server.name" \
  -e "GF_SECURITY_ADMIN_PASSWORD=secret" \
  grafana/grafana

2.3. 配置路径

启动Grafana Docker容器时,以下设置是硬编码的,只能使用环境变量覆盖;或者通过Copy到镜像中自行Build;

Setting Default value 说明
GF_PATHS_CONFIG /etc/grafana/grafana.ini 主配置文件
GF_PATHS_DATA /var/lib/grafana 数据存储路径
GF_PATHS_HOME /usr/share/grafana 软件安装路径
GF_PATHS_LOGS /var/log/grafana 日志
GF_PATHS_PLUGINS /var/lib/grafana/plugins 插件
GF_PATHS_PROVISIONING /etc/grafana/provisioning -

2.4. 使用绑定挂载的Grafana容器,注意权限问题

ID=$(id -u)

// 1. starts grafana with your user id and using the data folder
docker run -d --user $ID --volume "$PWD/data:/var/lib/grafana" -p 3000:3000 grafana/grafana:5.1.0

3. influxDB

3.1. 安装和部署influxDB

目前,主分支现在代表InfluxDB 2.0,目前仅有1.x的客户端,2.0的API的Go客户端还在筹划中!

最新的InfluxDB 1.x是稳定版本,推荐用于生产。InfluxDB 2.0(主分支中的内容)目前处于alpha阶段。

3.2. 单一docker容器运行

暴露出来的8086,提供REST的HTTP请求操作!

$ docker run -p 8086:8086 \
      -v /var/lib/influxdb:/var/lib/influxdb \
      influxdb

3.3. docker-composer.yml

docker-composer.yml将grafana与influxdb进行了融合,暂未将statusOK放入进去,这块后续计划将自己DockerFile那块再单独去实现!

user: "501",是因为文末的502网关问题,主要是grafana在操作/var/lib/grafana时候没有权限!

version: "3"
services:
    grafana:
        image: grafana/grafana
        ports:
            - "3000:3000"
        restart: always
        depends_on:
            - influxdb
        volumes:
            - /var/lib/grafana:/var/lib/grafana
        user: "501"
    influxdb:
        image: influxdb:alpine
        ports:
            - "8086:8086"
            - "8083:8083"
            - "2003:2003"
        environment:
            - INFLUXDB_HTTP_AUTH_ENABLED=true
        restart: always
        volumes:
            - /var/lib/influxdb:/var/lib/influxdb

4. 其他

4.1. 补一张图

4.2. 问题:Network Error: Bad Gateway(502)

在Docker中通过Bind挂载方式对宿主机器和容器进行数据共享,需要保证Granafa的账号权限与宿主机器一致

4.3. 参考


  1. https://grafana.com/docs/installation/docker/ ↩︎