内容简介:本文章为本人在ops内容建设团队第二期分享欢迎关注微信公众号:OPS无界工程师本文章最后更新时间:2018-05-13
本文章为本人在ops内容建设团队第二期分享
欢迎关注微信公众号:OPS无界工程师
本文章最后更新时间:2018-05-13
个人博客地址:www.sqdyy.cn
大家晚上好,今晚由我来分享基于telegraf+influxdb+grafana构建监控平台的方案,首先我们先来了解InfluxDB。influxdb是一款专为时序数据编写的高性能数据库,采用 GO 语言开发,并且开源!它是TICK技术栈的一部分。它采用TSM引擎进行高速摄取和数据压缩。并提供高性能的写入/查询 HTTP API,其表达式语句类似 SQL 查询语句(但数据结构概念不太一样,详见 InfluxDB design insights and tradeoffs 。
先对上面的一些名称进行解释,TICK技术栈指的是InfluxData公司研发的四款监控开源产品,包括Telegraf、InfluxDB、Chronograf、Kapacitor。其中InfluxDB使用最广泛,是开源的时序数据库,一个比较常见的应用场景为日志存储。Kapacitor提供了基于influxdb的监控报警方案,支持多种数据聚合,选择,变换,预测方法。Chronograf用于对数据进行展示,可以使用功能更强大的Grafana替代。
TSM引擎这块我也不太熟悉,属于进阶知识,网上资料也不多,感兴趣的大佬可以自己去研究:
influxdb
时序数据库主要用于存储系统的监控数据,一般具有如下特征:
- 以时间为维度的高效查询
- 方便的down sampling
- 高效的处理过期数据
对于influxdb的学习方式,我建议先参考 Linux大学的InfluxDB系列教程 对Influxdb有一个基本的了解(但不需要死抠,因为其中有些描述是过时的),然后再去influxdb官档深入学习为佳。
下载并安装influxdb
# 添加yum 源 cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo [influxdb] name = InfluxDB Repository - RHEL \$releasever baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable enabled = 1 gpgcheck = 1 gpgkey = https://repos.influxdata.com/influxdb.key EOF sudo yum install influxdb influx -version 复制代码
启动服务、添加开机启动:
sudo service influxdb start sudo systemctl start influxdb 复制代码
主要概念
InfluxDB与传统数据库在概念上有一些不同,我介绍一些基本的概念,如果你想了解更多请参考官档influxdb concepts
与传统数据库中的名词做比较
influxDB中的名词 | 传统数据库中的概念 |
---|---|
database | 数据表 |
measurement | 数据库中的表 |
points | 表里面的一行数据 |
InfluxDB的独有概念
刚才说的是InfluxDB与传统数据库相同的概念,下面介绍它的特有概念。
Point
Point相当于传统数据库中表里面的一行数据,由timestamp(时间戳),field(数据),tags(标签)组成。
Point属性 | 传统数据库中的概念 |
---|---|
timestamp | 每个数据都需要一个时间戳(主索引&自动生成),在TSM存储引擎中会特殊对待,以为了优化后续的查询操作 |
field | (field key,field set,field value) 各种记录值(没有索引的属性),例如温度 |
tag | (tag key,tag sets,tag value) 各种有索引的属性,例如地区 |
series
series相当于是InfluxDB中一些数据的集合。所有在数据库中的数据,都要通过图表展示出来,而series则表示表里面的数据,可以在图表上画成几条线(通过tags排列组合算出来):
> show series from cpu key --- cpu,cpu=cpu-total,host=VM_42_233_centos cpu,cpu=cpu0,host=VM_42_233_centos cpu,cpu=cpu1,host=VM_42_233_centos cpu,cpu=cpu2,host=VM_42_233_centos cpu,cpu=cpu3,host=VM_42_233_centos 复制代码
其代码结构如下:
type Series struct { mu sync.RWMutex Key string // series key Tags map[string]string // tags id uint64 // id measurement *Measurement // measurement } 复制代码
shard
每个存储策略下会存在许多shard,每个shard存储一个指定时间段的数据,例如7点-8点的数据落入shard0中,8点-9点的数据落到shard1中,每个shard都对应一个底层的tsm存储引擎,有独立的cache,wal,tsm file。
数据保留策略
保留策略(RP)是用来定义数据在InfluxDB存放的时间,或者定义保存某个期间的数据。当你创建数据库时,InfluxDB会自动创建一个autogen(具有无限保留的保留策略):
> SHOW RETENTION POLICIES ON telegraf name duration shardGroupDuration replicaN default ---- -------- ------------------ -------- ------- autogen 0s 168h0m0s 1 true 复制代码
上面是查询数据库现有策略的语句,查询结果各字段含义如下:
字段 | 含义 |
---|---|
name | 策略名称 |
duration | 持续时间,0代表无限保留 |
shardGroupDuration | shardGroup是InfluxDB的一个基本储存结构,168h0m0s表上单个shard所存储的时间间隔为168小时,超过168小时后会被存放到下一个shard中 |
replicaN | 全称replication,副本个数(不太懂) |
default | 是否是默认策略 |
func shardGroupDuration(d time.Duration) time.Duration { if d >= 180*24*time.Hour || d == 0 { // 6 months or 0 return 7 * 24 * time.Hour } else if d >= 2*24*time.Hour { // 2 days return 1 * 24 * time.Hour } return 1 * time.Hour } 复制代码
我们可以创建一个新的保留策略,下面语句在telegraf库中创建了一个2小时保留策略,名为2h0m0s并设置为默认策略:
> CREATE RETENTION POLICY "2h0m0s" ON "telegraf" DURATION 2h REPLICATION 1 DEFAULT > SHOW RETENTION POLICIES ON telegraf name duration shardGroupDuration replicaN default ---- -------- ------------------ -------- ------- autogen 0s 168h0m0s 1 false 2h0m0s 2h0m0s 1h0m0s 1 true 复制代码
目前我们的autogen已经不再是默认策略,如果你需要查询这个策略的数据,你需要在查询时显式的加上策略名:
> SELECT time,host,usage_system FROM "autogen".cpu limit 2 name: cpu time host usage_system ---- ---- ------------ 1526008670000000000 VM_42_233_centos 1.7262947210419817 1526008670000000000 VM_42_233_centos 1.30130130130254 复制代码
更多保留策略相关的内容,请参考官档database_management。
连续查询
连续查询(CQ)是在数据库中自动定时启动的一组语句,InfulxDB会将查询结果存储在指定的数据表中。
- 使用连续查询是最优降低采样率的方式,连续查询和存储策略搭配使用将会大大降低InfulxDB的系统占用量。
- 使用连续查询后,数据会存放到指定的数据表中,这样就为以后统计不同精度的数据提供了方便。
- 连续查询一旦创建就无法更改。要更改连续查询,您必须先DROP再重新使用CREATE创建新查询。
下面是连续查询的语法:
// 基本语法 CREATE CONTINUOUS QUERY <cq_name> ON <database_name> RESAMPLE EVERY <interval> FOR <interval> BEGIN SELECT <function[s]> INTO <destination_measurement> FROM <measurement> [WHERE <stuff>] GROUP BY time(<interval>)[,<tag_key[s]>] END 复制代码
例如,下面语句在telegraf库中新建了一个名为cq_30m的连续查询,每30分钟会取used字段的平均值加入到mem_used_30m表中。使用的数据保留策略都是default:
CREATE CONTINUOUS QUERY cq_30m ON telegraf BEGIN SELECT mean(used) INTO mem_used_30m FROM mem GROUP BY time(30m) END 复制代码
下面是一些常用操作:
SQL | 描述 |
---|---|
SHOW CONTINUOUS QUERIES | 查询所有CQ |
DROP CONTINUOUS QUERY <cq_name> ON <database_name> | 删除连续查询 |
更多连续查询相关的内容,请参考官档continuous_queries。
常用函数
InfluxDB提供了很多的有用的函数,其中分为三类:
- 聚合类函数
函数 | 描述 |
---|---|
count(field_key) | 返回计数 |
DISTINCT(field_key) | 返回唯一值 |
INTEGRAL(field_key) | 计算字段值覆盖的曲面的面积值并得到面积之和 |
MEAN(field_key) | 返回平均值 |
MEDIAN(field_key) | 返回中间值 |
MODE(field_key) | 返回字段里最频繁的值 |
SPREAD(field_key) | 返回最大差值 |
SUM(field_key) | 返回总和 |
- 选择类函数
函数 | 描述 |
---|---|
BOTTOM(field_key,N) | 返回最小的N个值 |
FIRST(field_key) | 返回一个字段中最老的取值 |
LAST(field_key) | 返回一个字段中最新的取值 |
MAX(field_key) | 返回一个字段中的最大值 |
MIN(field_key) | 返回一个字段中的最小值 |
PERCENTILE(field_key,N) | Returns the Nth percentile field value. |
SAMPLE(field_key,N) | 返回N个字段的随机样本 |
TOP(field_key,N) | 返回最大的N个值 |
- 转换类函数
函数 | 描述 |
---|---|
CEILING() | ~ |
CUMULATIVE_SUM() | ~ |
DERIVATIVE() | ~ |
DIFFERENCE() | ~ |
ELAPSED() | ~ |
FLOOR() | ~ |
HISTOGRAM() | ~ |
MOVING_AVERAGE() | ~ |
NON_NEGATIVE_DERIVATIVE() | ~ |
NON_NEGATIVE_DIFFERENCE() | ~ |
- 预测类
函数 | 描述 |
---|---|
HOLT_WINTERS() | 季节性预测算法-对数据流量趋势进行预测和预警 |
Telegraf
建立起了对时序库的概念后,接下来我们就该往时序库写数据了,你可以通过你应用服务的metrics程序采集指标,然后通过influxdb提供的http api向influxdb写入数据,但是本期我们并不介绍这样的用法(如 java 的metrics还需介绍java的语法),下面为大家介绍一款与influxdb完美结合的采集数据的代理程序: Telegraf
Telegraf是用Go写的代理程序,可以用于收集系统和服务的统计数据,是 TICK技术栈 的一部分。它具备输入插件,可以直接从系统获取指标数据,从第三方API获取指标数据,甚至可以通过statsd和Kafka获取指标数据。它还具备输出插件,可以将采集的指标发送到各种数据存储,服务和消息队列。比如InfluxDB,Graphite,OpenTSDB,Datadog,Librato,Kafka,MQTT,NSQ等等。
下载并安装Telegraf:
wget https://dl.influxdata.com/telegraf/releases/telegraf-1.6.2-1.x86_64.rpm sudo yum install telegraf-1.6.2-1.x86_64.rpm telegraf -version 复制代码
如果你的telegraf是安装的,其配置文件位置为:
/etc/telegraf/telegraf.conf 复制代码
编辑配置文件,将我们配置好的influxdb数据库指定为期望的输出源:
[[outputs.influxdb]] urls=["http://localhost:8086"] 复制代码
启动服务、添加开机启动:
sudo systemctl start telegraf.service sudo service telegraf status sudo systemctl enable telegraf.service 复制代码
在InfluxDB上检查默认配置下telegraf采集了哪些数据:
> show databases > use telegraf > show measurements > SHOW FIELD KEYS 复制代码
如何进行配置
默认配置下,会启用system分类下的INPUT插件,即telegraf.conf有如下配置:
# Read metrics about cpu usage # 读取有关CPU使用情况的指标 [[inputs.cpu]] ## Whether to report per-cpu stats or not percpu = true ## Whether to report total system cpu stats or not totalcpu = true ## If true, collect raw CPU time metrics. collect_cpu_time = false ## If true, compute and report the sum of all non-idle CPU states. report_active = false # Read metrics about disk usage by mount point # 通过mount point读取有关磁盘使用情况的指标 [[inputs.disk]] ## Ignore mount points by filesystem type. ignore_fs = ["tmpfs", "devtmpfs", "devfs"] # Read metrics about disk IO by device # 通过device读取有关磁盘IO的指标 [[inputs.diskio]] # Get kernel statistics from /proc/stat # 通过/proc/stat获取内核统计信息 [[inputs.kernel]] # no configuration # Read metrics about memory usage # 读取有关内存使用量的指标 [[inputs.mem]] # no configuration # Get the number of processes and group them by status # 获取进程的数量并按状态分组 [[inputs.processes]] # no configuration # Read metrics about swap memory usage # 读取有关交换内存使用量的指标 [[inputs.swap]] # no configuration # Read metrics about system load & uptime # 读取有关系统负载和运行时间的指标 [[inputs.system]] # no configuration 复制代码
其具体采集数据如下(其中第一级别为measurements,第二级别为字段(省略了时间戳字段)):
- cpu[units: percent (out of 100)] - usage_guest float - usage_guest_nice float - usage_idle float - usage_iowait float - usage_irq float - usage_nice float - usage_softirq float - usage_steal float - usage_system float - usage_user float - disk - free integer - inodes_free integer - inodes_total integer - inodes_used integer - total integer - used integer - used_percent float - diskio - io_time integer - iops_in_progress integer - read_bytes integer - read_time integer - reads integer - weighted_io_time integer - write_bytes integer - write_time integer - writes integer - kernel - boot_time integer - context_switches integer - entropy_avail integer - interrupts integer - processes_forked integer - mem - active integer - available integer - available_percent float - buffered integer - cached integer - free integer - inactive integer - slab integer - total integer - used integer - used_percent float - wired integer - processes - blocked integer - dead integer - idle integer - paging integer - running integer - sleeping integer - stopped integer - total integer - total_threads integer - unknown integer - zombies integer - swap - free integer - in integer - out integer - total integer - used integer - used_percent float - system - load1 float - load15 float - load5 float - n_cpus integer - n_users integer - uptime integer - uptime_format string 复制代码
如何查找指标及其采集数据
telegraf主要分为输入插件和输入插件,其源码目录分别对应 plugins/inputs
和 plugins/outputs
,你只要参考telegraf官档找到你所需要的插件然后去到源码对应的目录找到相应的 .md
文件,按照提示获取相关信息进行配置即可。
启用telegraf服务后,你会发现在influxdb中多了一个telegraf的库,其中有多个measurement,这说明我们的数据采集已经成功了。有了数据以后,我们需要关心的是如何把数据聚合然后进行展示。下面将介绍一款可视化套件grafana。
Grafana
Grafana是一个开源指标分析和可视化套件,常用于可视化基础设施的性能数据和应用程序分析的时间序列数据。也可以应用于其他领域,包括工业传感器,家庭自动化,天气和过程控制。但请注意,我们使用Grafana最关心的是如何把数据进行聚合后进行展示。
Grafana支持多种不同的时序数据库数据源,Grafana对每种数据源提供不同的查询方法,而且能很好的支持每种数据源的特性。它支持下面几种数据源:Graphite、Elasticsearch、CloudWatch、InfluxDB、OpenTSDB、Prometheus、 MySQL 、Postgres、Microsoft SQL Server (MSSQL)。每种数据源都有相应的文档,您可以将多个数据源的数据合并到一个单独的仪表板上,本文只举例influxdb数据源的应用。
下载并安装Telegraf:
# 安装grafana wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.1.2-1.x86_64.rpm # 启动服务、添加开机启动: systemctl enable grafana-server systemctl start grafana-server # 配置 配置文件 /etc/grafana/grafana.ini systemd服务名 grafana-server.service 默认日志文件 /var/log/grafana/grafana.log 默认数据库文件 /var/lib/grafana/grafana.db 复制代码
简单使用
启动服务后访问 http://localhost:3000
,默认端口为 3000
,可在配置文件修改。默认用户名和密码为admin/admin。登录后按照提示配置数据源:
接着创建一个dashboard:
我们先选择导入模板的方式来预览效果,再来了解grafana/dashboard的相关配置,这里选择官方提供的一套 Telegraf: system dashboard ,地址 https://grafana.com/dashboards/928
。请你根据它的提示配置你的telegraf。然后在dashboards中选择 import->Upload.jsonFile
,将下载的模板导入:
查看结果:
你还可以安装一些插件,例如安装一款时间面板插件。
安装方式是到你的/var/lib/grafana/plugins目录下执行grafana-cli工具安装插件,下面安装时间面板插件:
> sudo grafana-cli plugins install grafana-clock-panel installing grafana-clock-panel @ 0.0.9 from url: https://grafana.com/api/plugins/grafana-clock-panel/versions/0.0.9/download into: /var/lib/grafana/plugins ✔ Installed grafana-clock-panel successfully Restart grafana after installing plugins . <service grafana-server restart> # 重启服务 > sudo systemctl restart grafana-server 复制代码
自己动手配置几个
我们创建一个新的dashboard,Dashboard由多个Row组成,一行Row分为12列,我们可以自定义面板的Span宽度和高度。现在我们选择添加一个Singlestat(如果是绘制线性表选Graph),然后点击Panel Title->Edit编辑我们的面板信息,默认打开Metrics视图,我们修改后得到如下信息:
我们修改options中的单位和颜色:
同样的,你可以尝试添加其他的面板实现下面效果:
Grafana的功能非常丰富,在这里不能详细叙述,请您参考官档了解更多: http://docs.grafana.org/features/datasources/
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 如何构建日志监控系统
- HDFS监控背后那些事儿,构建Hadoop监控共同体
- 构建 Zabbix 高可用监控平台
- 轻松构建微服务之监控平台
- 创业公司如何快速构建高效的监控系统?
- 使用Prometheus和Grafana构建Redis实时监控平台
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。