Telegraf+Influxdb+Grafana构建监控平台

本文章为本人在ops内容建设团队第二期分享
欢迎关注微信公众号:OPS无界工程师
本文章最后更新时间:2018-05-13
我的博客地址:blog.sqdyy.cn
html

你们晚上好,今晚由我来分享基于telegraf+influxdb+grafana构建监控平台的方案,首先咱们先来了解InfluxDB。influxdb是一款专为时序数据编写的高性能数据库,采用GO语言开发,而且开源!它是TICK技术栈的一部分。它采用TSM引擎进行高速摄取和数据压缩。并提供高性能的写入/查询 HTTP API,其表达式语句相似SQL查询语句(但数据结构概念不太同样,详见InfluxDB design insights and tradeoffsjava

先对上面的一些名称进行解释,TICK技术栈指的是InfluxData公司研发的四款监控开源产品,包括Telegraf、InfluxDB、Chronograf、Kapacitor。其中InfluxDB使用最普遍,是开源的时序数据库,一个比较常见的应用场景为日志存储。Kapacitor提供了基于influxdb的监控报警方案,支持多种数据聚合,选择,变换,预测方法。Chronograf用于对数据进行展现,可使用功能更强大的Grafana替代。node

TSM引擎这块我也不太熟悉,属于进阶知识,网上资料也很少,感兴趣的大佬能够本身去研究:linux

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
复制代码

启动服务、添加开机启动:json

sudo service influxdb start
sudo systemctl start influxdb
复制代码

主要概念

InfluxDB与传统数据库在概念上有一些不一样,我介绍一些基本的概念,若是你想了解更多请参考官档influxdb conceptscentos

与传统数据库中的名词作比较

influxDB中的名词 传统数据库中的概念
database 数据表
measurement 数据库中的表
points 表里面的一行数据

InfluxDB的独有概念

刚才说的是InfluxDB与传统数据库相同的概念,下面介绍它的特有概念。api

Point

Point至关于传统数据库中表里面的一行数据,由timestamp(时间戳),field(数据),tags(标签)组成。bash

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/inputsplugins/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。登陆后按照提示配置数据源:

配置数据源1
配置数据源2

接着建立一个dashboard:

建立面板1.png

咱们先选择导入模板的方式来预览效果,再来了解grafana/dashboard的相关配置,这里选择官方提供的一套Telegraf: system dashboard,地址https://grafana.com/dashboards/928。请你根据它的提示配置你的telegraf。而后在dashboards中选择import->Upload.jsonFile,将下载的模板导入:

导入模板

查看结果:

telegraf-system-dashboard

你还能够安装一些插件,例如安装一款时间面板插件

安装方式是到你的/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视图,咱们修改后获得以下信息:

upTime1

咱们修改options中的单位和颜色:

upTime2

一样的,你能够尝试添加其余的面板实现下面效果:

最终效果

Grafana的功能很是丰富,在这里不能详细叙述,请您参考官档了解更多: http://docs.grafana.org/features/datasources/

相关文章
相关标签/搜索