由于Grafana Loki的重大发布,我尝试了从日志收集到仪表盘化的整个过程
首先
目前,我们正在使用Prometheus + Grafana(+ Alertmanager + Consul)来运维监控环境。但是,对于日志监视方面,我们使用了现场自制的工具。
然而,由于我正在使用的CNCF认可的应用程序的机会难得,所以我正在调查是否可以与之协作,实现更现代化的日志监控。
一种选择是使用ElasticSearch + Fluentd + Kibana的EFK堆栈,但从零开始搭建这个环境会花费相当大的成本。
我正在检查CNCF景观时,考虑是否有其他替代方案,突然发现了Grafana Loki。
以下のように中国語で言い換えることができます:
在Grafana Loki的GitHub摘要部分中,
就像普罗米修斯(Prometheus),但针对日志。
看到这篇文章时,我觉得写得很好,似乎与目前的Grafana非常兼容,所以决定试一试。本文是关于那次试验的笔记。
对于每个相关项目和概念进行说明。
Grafana Loki 是什么?
这是一个关于Prometheus度量日志版本的项目,正如在GitHub的描述中所写。
将来自后述的 Promtail 发送的日志保存到特定的存储中,并与 Grafana 等进行协作以便使用。
Promtail
Promtail是向Loki发送日志的代理程序。
将要获取日志的应用程序实例部署在特定位置,并获取和发送日志。
Promtail的流程如下:
-
- 发现要收集的日志目标,
-
- 为日志流添加标签,
- 将上述日志发送到Loki实例。
变成了这样的东西。
Grafana 是什么?
这是Grafana Loki的母项目,即本文的主题。
使用Grafana Loki和Prometheus存储的日志和指标作为数据源,在称为仪表盘的界面上将各种信息可视化。
通过Promtail、Loki、Prometheus等工具获取的数据是人类可读性较低的机器可读文本数据,通过在Grafana中进行可视化,使其变得人类可读。
使用Promtail + Grafana Loki + Grafana的基本配置
总结到目前为止的结构,使用Grafana Loki来获取日志,并将其在Grafana上进行可视化的基本流程如下。
-
- 使用Promtail将特定日志发送到Loki,
-
- Loki保存并处理来自Promtail的日志,
-
- 然后在Grafana中获取并显示日志,
- 就是这样的。
实操
那么,让我们动手实际操作一下试试看吧。
我将在前面先描述本次尝试的docker-compose文件。
作为顺序
-
- 通过flog应用程序将虚拟日志输出到/var/log/flog.log,
-
- 添加Promtail的配置,以获取上述flog日志并将其发送到Loki进行配置
-
- 在Loki上接收由Promtail发送的日志,
- 在Grafana中添加Loki作为数据源,并将其可视化为仪表盘。
成为了这种事情。
version: '3.7'
networks:
grafana:
services:
grafana:
image: grafana/grafana
environment:
GF_EXPLORE_ENABLED=true
ports:
3000:3000
networks:
grafana
loki:
image: grafana/loki
ports:
3100:3100
networks:
grafana
promtail:
image: grafana/promtail
ports:
9080:9080
command: -config.file=/etc/promtail/flog-config.yaml
volumes:
./etc/promtail:/etc/promtail
./var/log:/var/log
networks:
grafana
flog-logger:
image: mingrammer/flog
command: -n 5 -d 5 -t log -w -o /var/log/flog.log -l
volumes:
./var/log:/var/log
networks:
grafana
打开一个虚拟日志生成应用程序,并生成日志。
首先,我们将从生成用于Loki管理的日志开始进行。
由于有一个名为mingrammer/flog的Docker镜像可以输出随机日志,所以我决定使用它。
为了方便使用Promtail进行收集,我们调整了选项,将日志输出到名为/var/log/flog.log的文件中,并在docker-compose启动时执行该配置,以便将日志发送到标准输出。
我将为您提供Docker运行时的输出示例。输出看起来很不错。
$ docker run mingrammer/flog
160.42.94.201 hettinger6406 [08/12/2019:08:06:47 +0000] "DELETE /bricks-and-clicks" 501 8708
216.202.164.184 schumm2546 [08/12/2019:08:06:47 +0000] "DELETE /harness" 502 8144
127.193.172.88 [08/12/2019:08:06:47 +0000] "DELETE /cross-media" 501 10036
35.157.101.153 [08/12/2019:08:06:47 +0000] "DELETE /facilitate" 404 26412
70.73.208.218 [08/12/2019:08:06:47 +0000] "HEAD /communities/b2c/morph" 500 6639
189.108.176.231 erdman6222 [08/12/2019:08:06:47 +0000] "HEAD /best-of-breed/real-time/implement" 301 9151
100.181.144.136 hane3425 [08/12/2019:08:06:47 +0000] "DELETE /orchestrate/transform" 205 25930
(...)
启动Promtail以收集日志
由于生成了日志,接下来需要让Promtail获取日志并发送到Loki。
在启动时,明确配置Promtail容器从flog容器获取日志并向Loki容器的API发送请求。
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
url: http://loki:3100/loki/api/v1/push
scrape_configs:
job_name: flog-logger
static_configs:
targets:
flog-logger
labels:
job: flog
__path__: /var/log/flog.log
当您启动后,可以通过在浏览器中打开 http://localhost:9080/targets 来确认Promtail已经成功启动并开始获取日志。

启动Grafana Loki,接收来自Promtail的推送。
只要Promtail正确地将日志发送到Loki,Loki一侧将自动保存日志。
为了确认这一点,您可以通过向Loki发送REST API请求来获取存储的日志。
当发送GET请求至/loki/api/v1/query时,您可以收到以下结果。
$ curl -G -s "http://localhost:3100/loki/api/v1/query" --data-urlencode 'query={job="flog"}' | jq
{
"status": "success",
"data": {
"resultType": "streams",
"result": [
{
"stream": {
"filename": "/var/log/flog.log",
"job": "flog"
},
"values": [
[
"1575790467377181386",
"15.152.22.86 - pacocha1603 [08/12/2019:07:33:47 +0000] \"POST /mission-critical\" 203 12036"
],
[
"1575790462309234273",
"132.100.60.192 - white7155 [08/12/2019:07:33:47 +0000] \"HEAD /envisioneer/morph/matrix/compelling\" 501 19202"
],
(...)
]
}
]
}
}
我们可以看到,由Promtail获取并发送到Loki的日志是由这个操作生成的。
让我们接下来使用Grafana对这些日志数据进行可视化。
在Grafana中将Loki设置为数据源,并在Explorer中进行可视化展示。
你可以通过在浏览器中打开localhost:3000来打开Grafana。
可以使用admin/admin进行登录认证。
在Grafana启动后,您可以通过输入admin作为用户名和密码来登录。

登录成功后,需要指定数据来源,即用于数据可视化的数据源。
登录后,您可能会看到类似于下面的屏幕,请选择“添加数据源”。
接下来,您将转到选择使用哪个应用程序作为数据源的界面。
请选择位于”Logging & document databases”项中的Loki。

这样一来,您将转到输入连接信息的页面。
现在我们要将本地的Loki设置为连接目标,所以在URL输入框中输入http://loki:3100,并点击“保存并测试”,如果出现绿色提示框,则表示连接成功。

完成设置后,接下来选择左侧菜单中的“资源管理器”。

在这里,您可以创建一个简易的仪表盘,只需从屏幕上的”日志标签”中选择文件名,即可显示如下的图表和日志列表。

虽然以上只是简单介绍了应用程序的日志输出、通过Promtail获取日志、使用Loki进行日志管理以及在Grafana中可视化日志数据的过程!