这篇文章上次修改于 479 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
本人并不炒币,本文章只用于讲解 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 语言开发的高性能时序数据库。
mysql | influxdb | 说明 |
---|---|---|
database | database | 数据库 |
table | measurement | 类似 mysql 中表的概念 |
record | tag + 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)
值 | 说明 |
---|---|
coinstats | measurement ,类似于MYSQL中的表 |
"tickers_0_from" = 'BTC' AND "tickers_0_to" = 'USD' | 在 telegraf 中定义的两个tag |
tickers_0_price | field ,数据 |
这样一个简单的趋势图就创建好了,还可以通过右边的侧边栏修改显示效果,比如添加一个表格,展示最小值、最大值、平均值、当前值等。
返回 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
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)
没有评论