docker-compose 安装基于telegraf + influxdb + grafana监控系统
docker-compose.yml
version: '3.7'
services:
influxdb:
image: influxdb
container_name: influxdb
restart: always
environment:
- PRE_CREATE_DB=telegraf
- ADMIN_USER="telegraf"
- INFLUXDB_INIT_PWD="telegraf123"
- GOGC=10
- INFLUXDB_DATA_INDEX_VERSION=tsi1
ports:
- "8186:8086"
expose:
- "8090"
- "8099"
volumes:
- "./influxdb/db:/var/lib/influxdb"
networks:
- monitor
grafana:
image: grafana/grafana
container_name: grafana
restart: always
ports:
- "3000:3000"
environment:
- HTTP_USER=admin
- HTTP_PASS=admin
- INFLUXDB_HOST=influxdb
- INFLUXDB_PORT=8186
- INFLUXDB_NAME=telegraf
- INFLUXDB_USER=root
- INFLUXDB_PASS=root
volumes:
- "./grafana:/var/lib/grafana"
networks:
- monitor
depends_on:
- "influxdb"
telegraf:
image: telegraf
container_name: telegraf
restart: always
volumes:
- ./telegraf:/etc/telegraf
- /sys:/rootfs/sys:ro
- /proc:/rootfs/proc:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- 'HOST_PROC=/rootfs/proc'
- 'HOST_SYS=/rootfs/sys'
- /etc/localtime:/etc/localtime:ro
networks:
- monitor
depends_on:
- influxdb
networks:
monitor:
telegraf
核心概念
Telegraf工作原理大概是这样:定时去执行输入插件收集数据,数据经过处理插件和聚合插件,批量输出到数据存储。
数据指标(Metrics)
- 指标名(Measurement name):指标描述和命名。
- 标签集合(Tags):Key/Value键值对,可以类比为关系型数据库的键值,常用于快速索引和唯一标识。标签在设计的时候,尽量避免各种数值型,尽量使用有限集合。
- 字段集合(Fields):Key/Value键值对,包含指标描述的数据类型和值。
- 时间戳(Timestamp):此条指标数据的时间戳。
插件(Plugins)
Telegraf有四种类型的插件:
- 输入插件(Inputs):收集各种时间序列性指标,包含各种系统信息和应用信息的插件。
- 处理插件(Process):当收集到的指标数据流要进行一些简单处理时,比如给所有指标添加、删除、修改一个Tag。只是针对当前的指标数据进行。
- 聚合插件(Aggregate):聚合插件有别于处理插件,就在于它要处理的对象是某段时间流经该插件的所有数据(所以,每个聚合插件都有一个
period
设置,只会处理now()-period
时间段内的数据),比如取最大值、最小值、平均值等操作。 - 输出插件(Outputs):收集到的数据,经过处理和聚合后,输出到数据存储系统,可以是各种地方,如:文件、InfluxDB、各种消息队列服务等等。
配置
全局tag
[global_tags]
# dc = "us-east-1" # will tag all metrics with dc=us-east-1
# rack = "1a"
## Environment variables can be used as tags, and throughout the config file
# user = "$USER"
代理
[agent]
## 数据收集周期
interval = "10s"
## 如果 interval="10s" :00, :10, :20 依次进行收集
round_interval = true
## 输出大小
metric_batch_size = 1000
## 缓存大小
metric_buffer_limit = 10000
## 接收插件休眠周期
collection_jitter = "0s"
## 数据flush周期
flush_interval = "10s"
## 发送插件休眠周期
flush_jitter = "0s"
## 支持的时间单位 "ns", "us" (or "µs"), "ms", "s".
precision = "s"
## 调试模式
debug = false
## 静默模式
quiet = false
## 日志路径
logfile = ""
## 主机名,默认 os.Hostname()
hostname = ""
## 如果设置为true,tag中将没有host信息
omit_hostname = false
输出插件 (非常多以influxdb为例)
-
influxdb
[[outputs.influxdb]] # urls 参数是一个数组,代表一个集群,如果其中包含多个服务,则每次只会选择其中一台进行写入。 # urls = ["unix:///var/run/influxdb.sock"] # urls = ["udp://127.0.0.1:8089"] # urls = ["http://127.0.0.1:8086"] urls = ["http://influxdb:8086"] ## 输出数据库 database = "telegraf" precision = "s" ## 输出时是否创建数据库,当telegraf没有权限创建数据库时设置为false # skip_database_creation = false ## 存储策略,默认default策略 # retention_policy = "" ## Write consistency (clusters only), can be: "any", "one", "quorum", "all".写入一致性 ## Only takes effect when using HTTP. 仅在使用HTTP时生效 # # write_consistency = "any" ## http 超时设置 timeout = "5s" ## HTTP 基本认证 username = "telegraf" password = "telegraf123" ## HTTP User-Agent # user_agent = "telegraf" ## UDP payload 大小限制 # udp_payload = 512 ## https证书 # tls_ca = "/etc/telegraf/ca.pem" # tls_cert = "/etc/telegraf/cert.pem" # tls_key = "/etc/telegraf/key.pem" ## 是否跳过证书校验 # insecure_skip_verify = false ## http代理设置 # http_proxy = "http://corporate.proxy:3128" ## 自定义HTTP头 # http_headers = {"X-Special-Header" = "Special-Value"} # HTTP Content-Encoding 编码, gzip或者identity # content_encoding = "identity" ## 是否支持无符号整型,必须与influxdb版本兼容 # influx_uint_support = false
-
Kafka
[outputs.kafka]] brokers = [“10.23.32.22:9092”] #kafka集群地址,多个实例以逗号隔开 topic = “telegraf-prd”#kafka的topic设置 routing_tag = “host” #是否路由tags,同一host写入到同一分片中 compression_codec = 1#数据传输是否压缩 required_acks = 1 #数据同步是否确认,0为否,1为leader确认,-1为全部同步确认 max_retry = 3#数据写入尝试次数 data_format = “json”#数据发送格式 #c.input设置: #主要设置采集器的各项插件采集配置 #服务器基础监控采用标准的telegraf.conf统一标准,软件项目的配置,新建conf文件放在/etc/telegraf/telegraf.d/文件夹中,重启生效
处理插件
- 数值类型转换
- 枚举类型
- 字符串转换
- topN
聚合插件
- 直方图
- 最大最小值
输入插件
-
docker
####################(input)输入配置 添加docker信息获取#################################### [[inputs.docker]] endpoint = "unix:///var/run/docker.sock" container_names = [] container_name_include = [] container_name_exclude = [] timeout = "5s" perdevice = true total = false tag_env = ["JAVA_HOME", "HEAP_SIZE"] docker_label_include = [] docker_label_exclude = []
-
kafka
# # Read metrics from Kafka topic(s) # [[inputs.kafka_consumer]] # ## kafka servers # brokers = ["localhost:9092"] # ## topic(s) to consume # topics = ["telegraf"] # # ## Optional Client id # # client_id = "Telegraf" # # ## Set the minimal supported Kafka version. Setting this enables the use of new # ## Kafka features and APIs. Of particular interest, lz4 compression # ## requires at least version 0.10.0.0. # ## ex: version = "1.1.0" # # version = "" # # ## Optional TLS Config # # tls_ca = "/etc/telegraf/ca.pem" # # tls_cert = "/etc/telegraf/cert.pem" # # tls_key = "/etc/telegraf/key.pem" # ## Use TLS but skip chain & host verification # # insecure_skip_verify = false # # ## Optional SASL Config # # sasl_username = "kafka" # # sasl_password = "secret" # # ## the name of the consumer group # consumer_group = "telegraf_metrics_consumers" # ## Offset (must be either "oldest" or "newest") # offset = "oldest" # # ## Data format to consume. # ## Each data format has its own unique set of configuration options, read # ## more about them here: # ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md # data_format = "influx" # # ## Maximum length of a message to consume, in bytes (default 0/unlimited); # ## larger messages are dropped # max_message_len = 1000000
-
官方文档
telegraf常用的input plugins: 收集docker相关的信息:https://github.com/influxdata/telegraf/tree/master/plugins/inputs/docker 主要是通过docker API调用相关监控 收集相关redis的信息:https://github.com/influxdata/telegraf/tree/master/plugins/inputs/redis 收集相关nginx的信息:https://github.com/influxdata/telegraf/tree/master/plugins/inputs/nginx 收集相关mysql的信息:https://github.com/influxdata/telegraf/tree/master/plugins/inputs/mysql 收集influxdb相关信息:https://github.com/influxdata/telegraf/tree/master/plugins/inputs/influxdb 收集系统相关的信息:https://github.com/influxdata/telegraf/tree/master/plugins/inputs/system 收集haproxy相关信息:https://github.com/influxdata/telegraf/tree/master/plugins/inputs/haproxy
生成配置文件
-
docker生成配置文件
mkdir ./telegraf # 复制telegraf.conf配置文件 docker run --rm telegraf telegraf config > ./telegraf/telegraf.conf # 我们用docker-compose安装 # docker run -d --name telegraf -v ./telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro telegraf -config /etc/telegraf/telegraf.conf
-
生成指定输入和输出插件的配置文件
telegraf --input-filter <pluginname>[:<pluginname>] --output-filter <outputname>[:<outputname>] config > telegraf.conf # 生成带 cpu、memroy、disk、diskio、net 和 influxdb 插件的配置文件 telegraf.conf,指定输出到 influxdb telegraf --input-filter cpu:mem:disk:diskio:net --output-filter influxdb config > telegraf.conf # telegraf 支持读取多个配置文件,可将多个配置文件放置在 /etc/telegraf/telegraf.d 目录下
测试是否配置成功
# 测试 /etc/telegraf/telegraf.conf 配置文件中输入 cpu 配置是否正确
telegraf -config /etc/telegraf/telegraf.conf -input-filter cpu -test
# 测试 /etc/telegraf/telegraf.conf 输出 influxdb 配置是否正确
telegraf -config /etc/telegraf/telegraf.conf -output-filter influxdb -test
# 测试 /etc/telegraf/telegraf.d/mysql.conf 输入 cpu 和 输出 influxdb 配置是否正确
telegraf -config /etc/telegraf/telegraf.d/mysql.conf -input-filter cpu -output-filter influxdb -test
重启 telegraf
# 重启 telegraf 服务,使配置文件生效
service telegraf restart
# Linux 不同系统服务的启动方式不同
systemctl start telegraf
配置多个配置文件示例
# 例子:配置 os 和 redis 采集的配置文件
# 配置 os
cd /etc/telegraf
# 1.生成配置文件(将配置文件权限更改为777,以免出现报错) docker安装的可以进容器内部对应目录生成
telegraf config > telegraf.conf
chmod 777 telegraf.conf
# 2.在指定配置文件中添加输入输出插件相关的配置
telegraf --input-filter cpu:mem:disk:diskio:net --output-filter influxdb config > telegraf.conf
# 3.修改配置文件内容
vim telegraf.conf
# 4.<配置多个配置文件> 如,配置 redis
cd /etc/telegraf/telegraf.d
telegraf config > redis.conf
chmod 777 telegraf.conf
telegraf --input-filter redis --output-filter influxdb config > redis.conf
vim redis.conf
# 5.测试配置文件是否配置正确
telegraf -config redis.conf --input-filter redis --output-filter opentsdb:influxdb -test
# 6.重启 telegraf
service telegraf restart
influxdb
展示所有策略
# duration--持续时间,0代表无限制
# shardGroupDuration 代表的是多长时间的数据放在同一个数据文件中
# 实际过期是按照数据文件为单位过期的, 比如上面的配置下一个数据文件中会含有2018-1-1 0:0:0 ~ 2018-1-1 23:59:59的# 数据,这个时间文件的过期时间就为2018-1-1 23:59:59+168h
# replicaN--全称是REPLICATION,副本个数
# default--是否是默认策略
> SHOW RETENTION POLICIES ON telegraf
name duration shardGroupDuration replicaN default
default 0 168h0m0s 1 true
官方推荐数据分片时间
Retention Policy’s DURATION | Shard Group Duration |
---|---|
< 2 days | 1 hour |
>= 2 days and <= 6 months | 1 day |
> 6 months | 7 days |
show shards 命令显示当前是所有shared数据文件和他们的过期时间
> show shards
name: _internal
id database retention_policy shard_group start_time end_time expiry_time
-- -------- ---------------- ----------- ---------- -------- -----------
6 _internal monitor 6 2018-05-19T00:00:00Z 2018-05-20T00:00:00Z 2018-05-27T00:00:00Z
7 _internal monitor 7 2018-05-20T00:00:00Z 2018-05-21T00:00:00Z 2018-05-28T00:00:00Z
8 _internal monitor 8 2018-05-21T00:00:00Z 2018-05-22T00:00:00Z 2018-05-29T00:00:00Z
10 _internal monitor 10 2018-05-22T00:00:00Z 2018-05-23T00:00:00Z 2018-05-30T00:00:00Z
11 _internal monitor 11 2018-05-23T00:00:00Z 2018-05-24T00:00:00Z 2018-05-31T00:00:00Z
14 _internal monitor 14 2018-05-24T00:00:00Z 2018-05-25T00:00:00Z 2018-06-01T00:00:00Z
15 _internal monitor 15 2018-05-25T00:00:00Z 2018-05-26T00:00:00Z 2018-06-02T00:00:00Z
16 _internal monitor 16 2018-05-26T00:00:00Z 2018-05-27T00:00:00Z 2018-06-03T00:00:00Z
创建数据过期策略
# '2_hours' 为策略名称 'telegraf'为数据库名称 DEFAULT 修改为默认策略
# 注意:新创建了一个默认策略后所有的查询和插入默认是操作的新策略下的数据, 如果不指定策略查询会查询不到老数据
> CREATE RETENTION POLICY "1_month" ON "telegraf" DURATION 30d REPLICATION 1 DEFAULT
> SHOW RETENTION POLICIES ON telegraf
name duration shardGroupDuration replicaN default
---- -------- ------------------ -------- -------
autogen 0s 168h0m0s 1 false
1_month 720h0m0s 24h0m0s 1 true
# 创建一个数据保存1年的策略
# create retention policy "1Y" on test duration 366d replication 1
# 为库exceptionless创建了一个名称为3_day的策略,其中数据保存时间为3天,SHARDDURATION为3h
# CREATE RETENTION POLICY "3_day" ON "telegraf" DURATION 3d REPLICATION 1 SHARD DURATION 3h DEFAULT;
修改策略
> ALTER RETENTION POLICY "2_hours" ON "telegraf" DURATION 4h DEFAULT
> show retention POLICIES on telegraf
name duration shardGroupDuration replicaN default
default 0 168h0m0s 1 false
2_hours 4h0m0s 1h0m0s 1 true
删除策略
> drop retention POLICY "autogen" ON "telegraf"
> show retention POLICIES on telegraf
name duration shardGroupDuration replicaN default
default 0 168h0m0s 1 false
单独设置的过期策略 查询数据的时候要带上策略名
# 1_month 非默认策略的情况下下 查询 1_month 策略下的cpu表数据
select * from "1_month".cpu
备份数据库
# 备份所有的数据库
influxd backup -portable /tmp/data/total
# 备份指定数据库
influxd backup -portable -database yhhblog /tmp/data/yhhblog
# 备份数据库中指定时间段的数据
influxd backup -portable -database yhhblog -start 2018-07-27T2:31:57Z -end 2018-07-27T2:32:59Z /tmp/data/yhhblog_per
恢复数据库
命令
influxd restore
[ -db <db_name> ] --> 待恢复的数据库(备份中的数据库名)
-portable | -online
[ -host <host:port> ] --> influxdb 的服务器
[ -newdb <newdb_name> ] --> 恢复到influxdb中的数据库名
[ -rp <rp_name> ] --> 备份中的保留策略
[ -newrp <newrp_name> ] --> 恢复的保留策略
[ -shard <shard_ID> ]
<path-to-backup-files>
例子
# 恢复到不存在的database
> influxd restore -portable -db yhhblog -newdb yhhblog_bk yhhblog_per
# 恢复到存在的DB
# 1. 首先是将备份恢复到一个不存在的数据库 yhhblog_bk 中
> influxd restore -portable -db yhhblog -newdb yhhblog_bk yhhblog_per
# 2. 准备 yhhblogNew 数据库
> create database yhhblogNew
# 3. 将临时数据库中的数据导入已存在的数据库中
> use yhhblog_bk
> SELECT * INTO yhhblogNew..:MEASUREMENT FROM /.*/ GROUP BY *
> drop yhhblog_bk
# 保留策略已存在时,恢复
> influxd restore -portable -db yhhblog -newdb yhhblog_tmp -rp autogen -newrp autogen_tmp yhhblog
# 进入influx控制台,执行拷贝
> user yhhblog_tmp
> SELECT * INTO yhhblogNew.autogen.:MEASUREMENT FROM /yhhblog_tmp.autogen_tmp.*/ GROUP BY *
> drop database yhhblog_tmp
grafana
- 修改权限
chmod 777 ./grafana