Telegraf+Influxdb+Grafana构建监控平台

栏目: 服务器 · 发布时间: 7年前

内容简介:本文章为本人在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引擎这块我也不太熟悉,属于进阶知识,网上资料也不多,感兴趣的大佬可以自己去研究:

Telegraf+Influxdb+Grafana构建监控平台

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

Telegraf+Influxdb+Grafana构建监控平台
Telegraf+Influxdb+Grafana构建监控平台

接着创建一个dashboard:

Telegraf+Influxdb+Grafana构建监控平台

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

Telegraf+Influxdb+Grafana构建监控平台

查看结果:

Telegraf+Influxdb+Grafana构建监控平台

你还可以安装一些插件,例如安装一款时间面板插件。

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

Telegraf+Influxdb+Grafana构建监控平台

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

Telegraf+Influxdb+Grafana构建监控平台

同样的,你可以尝试添加其他的面板实现下面效果:

Telegraf+Influxdb+Grafana构建监控平台

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

High Performance JavaScript

High Performance JavaScript

Nicholas C. Zakas / O'Reilly Media / 2010-4-2 / USD 34.99

If you're like most developers, you rely heavily on JavaScript to build interactive and quick-responding web applications. The problem is that all of those lines of JavaScript code can slow down your ......一起来看看 《High Performance JavaScript》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器