这篇文章上次修改于 283 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

E8LrNIaUUAAVptY.jpg
本人并不炒币,本文章只用于讲解 TICK 技术栈的简单应用。

TICK 是由 InfluxData 开发的一套开源工具栈,由 Telegraf、InfluxDB、Chronograf、Kapacitor 四个工具的首字母组成。

  • Telegraf - 指标数据采集
  • InfluxDB - 数据接收和存储
  • Chronograf 和 Grafana - 数据可视化展示
  • Kapacitor - 时序数据的处理,监视和警报等(本文并没有使用,使用 Grafana 内置的告警功能)

环境搭建

首先得需要安装 docker 和 docker-compose

wget get.docker.com
bash ./install.sh

curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

创建 docker-compose 配置文件

mkdir tigk && cd tigk
mkdir -p influxdb/data grafana/data telegraf/config
cd telegraf/config
wget https://github.com/influxdata/telegraf/raw/master/etc/telegraf.conf
cd ../..
vim docker-compose.yml
version: '3'

services:
  influxdb:
    image: influxdb:1.8
    container_name: influxdb
    ports:
      - '8086:8086'
    volumes:
      - ./influxdb/data:/var/lib/influxdb

  grafana:
    image: grafana/grafana:7.5.13
    container_name: grafana
    ports:
      - '3000:3000'
    volumes:
      - ./grafana/data:/var/lib/grafana
      
  telegraf:
    image: telegraf
    container_name: telegraf
    volumes:
    - ./telegraf/config/telegraf.conf:/etc/telegraf/telegraf.conf:ro

修改grafana/data/文件夹权限。

chown -R 472:472 grafana/data/

启动容器:

docker-compose up

配置 Telegraf

Telegraf 是一款轻量的数据采集工具,通常用作运维收集各种系统信息,支持多种第三方 API 提取指标。

这里使用 HTTP input 功能获取API数据,储存到数据库中。

[[outputs.influxdb]]
   urls = ["http://influxdb:8086"] #influxdb数据库地址
   database = "coins" 

[[inputs.http]]
  urls = [
  "https://api.coinstats.app/public/v1/tickers?exchange=yobit&pair=BTC-USD",
  "https://api.coinstats.app/public/v1/tickers?exchange=yobit&pair=ETH-USD"
  ]
  method = "GET" 
  interval = "60s"
  timeout = "10s"
  data_format = "json"
  name_override = "coinstats" #保存在名为coinstats的measurement中
  tag_keys = ["tickers_0_from","tickers_0_to"]

tag_keys:将JSON中的"from""to"保存位数据库字段中的tag

因为在json中的路径为tickers->0->from,在这里用下划线区分,写作tickers_0_from

对应的API获取的JSON:

{
    "tickers": [{
        "from": "BTC",
        "to": "USD",
        "exchange": "Yobit",
        "price": 44141.95689195
    }]
}

InfluxDB 基本概念

InfluxDB 是基于 GO 语言开发的高性能时序数据库。

mysqlinfluxdb说明
databasedatabase数据库
tablemeasurement类似 mysql 中表的概念
recordtag + field + timestamp传统表中的一行数据,映射到 influxdb 中,可以划分为三个

1. database

数据库,和 mysql 的数据库相比,没有太大的歧义

2. measurement

对比的是 mysql 中的 table,从实际体验来看,两个之间最明显的区别在于没有单独的创建 measurement 的方法,直接新增一条数据时,若 measurement 不存在,则直接创建并插入一条数据

3. Point

这个对比的是 mysql 中的 record,在 influxDB 中,表示每个表中,某个时刻,满足某个条件的 filed 数据(简单来说就是 timestamp + tag + filed) 的组成一个 point

  • timestamp : 时间戳,ns 单位,每个记录都必然有这个属性,没有显示添加时,默认给一个
  • tag: 标签,kv 结构,在 database 中, tag + measurement 一起构建索引

    • 参与索引创建,因此适合作为查询的过滤条件
    • tag 的数据量不要太多,最好能有典型的辨别性(和 mysql 的建立索引的原则差不多)
    • value 为 String 类型
    • tag 是可选的,在 measurement 不设置 tag 也是 ok 的
  • field:存储数据,kv 结构

    • 数据类型为: long, String, boolean, float

4. Series

Series: tag key 与 tag value 的唯一组合

配置Grafana

登录 grafana,默认账户和密码是 admin/admin。

连接到 InfluxDB 数据库

侧边栏 => Configuration => Data sources => Add data source。

URL为http://influxdb:8086

database:coins ,与 Telegraf 的配置相同 。

保存并测试,没有问题进入下一步。

创建 dashboard

创建一个新的 dashboard,并新建 panel。

侧边栏 => Create => Dashboard => Add Panel。

可视化操作很方便,直接通过点击修改查询的内容。

转换为查询语句就是这样:

SELECT mean("tickers_0_price") FROM "coinstats" WHERE ("tickers_0_from" = 'BTC' AND "tickers_0_to" = 'USD') AND $timeFilter GROUP BY time($__interval) fill(null)
说明
coinstatsmeasurement ,类似于MYSQL中的表
"tickers_0_from" = 'BTC' AND "tickers_0_to" = 'USD'telegraf中定义的两个tag
tickers_0_pricefield,数据

这样一个简单的趋势图就创建好了,还可以通过右边的侧边栏修改显示效果,比如添加一个表格,展示最小值、最大值、平均值、当前值等。

返回 Dashboard,点击 Panel 的下拉菜单,复制一个面板:

修改面板的 Title,查询的币种换成 ETH:

SELECT mean("tickers_0_price") FROM "coinstats" WHERE ("tickers_0_from" = 'ETH' AND "tickers_0_to" = 'USD') AND $timeFilter GROUP BY time($__interval) fill(null)

完成后就是这个样子:

通过 Dashboard 右上角的按钮修改查询的时间段和自动刷新时间。

看起来有些简陋,你也可以去下载别人制作的 Dashboard,学习并完善自己的。

https://grafana.com/grafana/dashboards/?search=linux

创建告警功能

首先需要创建 Notification channels ,即要怎么通知。

侧边栏 => Alerting => Notification channels => New channel。

我使用的telegram的bot,也有其他的通知方法,比如邮件、钉钉和 webhock 等。

测试一下

然后编辑 Dashboard 的 panel,点击 Alert 标签卡,Create Alert

image-20220120195700577

Evaluate every监控时间间隔
For检测的持续时间
WHEN这段时间内的数值的一个聚合函数,可以是平均值,最大值,最小值等
OF代表检查的范围,这里有3个参数,第一个参数代表你的查询语句的编号;第二个参数代表检测的开始时间与现在的时间跨度;第三个参数表示检测结束时间,一般写now() 表示直到现在为止
IS BELOW指的是阈值(它的值表示y轴的数值大小),在这个数字前面可以配置规则(就是前面的那个蓝色的字),比如高于这个值(IS ABOVE),或者低于这个值(IS BELOW)

如果没有数据或者所有数据为空是否告警,Alerting 表示告警,OK 表示不告警
SQL 执行错误或者超时是否告警,Alerting 表示告警,OK 表示不告警

如图,当 BTC 价格低于 40000 时 5 分钟后将会激活告警

你还可以通过上下拖动右边的标尺来调整阀值

参考

[[文章]Grafana的告警规则配置说明](http://bbs.learnfuture.com/topic/11688)

Telegraf 简单使用介绍

时序数据库InfluxDB基本概念小结

🍊