使用mtail + Prometheus + Grafana来建立实时日志监控系统
首先
这篇文章是 NIFTY Advent Calendar 2017 第 22 天的文章。
第 21 天是 @machinanette 用 ATTiny 自制座椅离座检测装置。
这篇文章涉及使用 Prometheus 进行实时日志监控。
Prometheus的含义是什么?
SoundCloud公司正在开发的开源监控工具。它受到了Google的监控工具Borgmon的启发,并具有单一二进制文件的特点,通过Pull方式获取数据。Prometheus采用基于XOR编码的varbit编码,可以在每个样本中保持约1.5字节的大小。关于时序数据库编码的讨论非常有趣,建议阅读一次这篇文章。
– 关于时序数据库的基础知识和时序数据的编码方式。
Prometheus还为其提供了一个处理Pull型服务发现缺陷的机制。如果您想了解更多详细信息,请务必阅读此页面。它是下一代监控系统的首选!试试在实际运营中使用Prometheus吧。
mtail是一个什么东西?
一种用于解析Google日志的工具。类似tailf,连续读取日志并解析,以便可以通过HTTP从Prometheus上拉取为指标。
Grafana是什么?
用于可视化 Prometheus 存储的数据的可视化工具。要获取 Prometheus 的数据,需要使用一种类似 SQL 的 Prometheus 自有语言,即 PromQL。
这次要制作的东西的形象
建立
使用Docker Compose构建
接下来,我们将进行构建。构建方法是使用docker-compose进行构建。首先,创建一个工作目录,并在工作目录中创建Prometheus的配置文件。配置文件可以设置Prometheus的拉取周期,并在此处添加要监视的目标。本次我们将目标设为mtail节点的主机名和默认端口3903。如果在同一主机上启动Prometheus容器和mtail容器,需要注意的是,如果将目标指定为localhost,它将指向自身的容器,所以请一定要注意不要忘记给它起一个别名,否则无法正常工作。
global:
scrape_interval: 10s
evaluation_interval: 10s
external_labels:
monitor: 'codelab-monitor'
rule_files:
# - "/var/app/prometheus/alert.rules"
scrape_configs:
- job_name: 'mtail'
static_configs:
- targets:
- 'xxxxxxxxhost:3903'
一旦Prometheus的配置文件完成后,只需创建docker-compose文件并启动即可完成。本次选用了以下方式进行配置。在启动mtail容器时,需要指定作为入口点的解析条件和要监视的日志路径。本次将使用mtail示例程序中最简单的line_count(仅计算行数)。监视目标是将本地目录和挂载的var/log/syslog作为监视对象。
version: '3'
services:
prometheus:
image: prom/prometheus
container_name: prometheus
volumes:
- /usr/local/src/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- 9090:9090
mtail:
image: dylanmei/mtail
container_name: mtail
volumes:
- /var/log/:/var/log/
ports:
- 3903:3903
entrypoint:
- mtail
- --progs
- /go/src/github.com/google/mtail/examples/linecount.mtail
- --logs
- /var/log/syslog
grafana:
image: grafana/grafana
container_name: grafana
ports:
- 3000:3000
除此之外,Grafana还拥有许多方便实用的功能,例如模板功能。请务必自行查阅。
关于mtail的解析程序
让我们简要介绍一下mtail的解析程序。在解析程序中,可以使用正则表达式对日志进行匹配,并将日志的一部分变为变量。例如,请假设以下示例中的日志类似于category=”start” id=”1″ status=”success” time=”100ms”。首先,我们需要准备一个计数器变量来计数日志数据。计数器变量可以类似于标签,可以在PromQL中使用。然后,在”{“前面的正则表达式匹配成功后,可以执行包含在”{“内部的程序,同时使用(?P\w+)将其括起来,这样这部分内容就会存储在变量hoge中。如果想将日志视为数字,可以使用(?P\d+)。在这里,您也可以将变量用作条件语句,例如在以下示例中,使用$time作为条件进行分支。根据条件进行分支,将数据放入不同的样本中,并通过PromQL对积累的数据进行分析和可视化,这就是此系统的工作原理。
counter total_time by category
counter total_count by time category
category="(?P<category>\w+)" id="(?P<id>\d+)" status="(?P<status>\w+)" time="(?P<time>\d+)ms"/ {
$time < 50 {
total_count["50"][$category]++
}
$time < 100 {
total_count["100"][$category]++
}
$time < 200 {
total_count["200"][$category]++
}
total_count[$category]++
total_elapsed_time[$category] += $time
}
最后
最后,作为使用mtail的案例,我认为在想要可视化自制程序或软件等的日志时使用它是个不错的选择。原因是,在Prometheus中,有很多第三方创建的导出器可以将有关通用软件的信息聚合为指标。例如,如果想要可视化Apache的指标,使用ApacheExporter比较简便且准确度也更高。因此,我认为在想要可视化信息源非常有限且不太通用的自制程序或软件等独特格式的日志信息时,使用它是个不错的选择。至于解析程序,我认为最好是参考样例程序自己学习如何使用,因为信息来源有限。虽然文章内容有些杂乱,但如果能对Prometheus和mtail产生一丝兴趣,我会很高兴的。
请务必看一下我在第23天的文章中利用Neo4j来赢得格斗游戏的方法,文章由@megane42撰写。