由于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的流程如下:

    1. 发现要收集的日志目标,

 

    1. 为日志流添加标签,

 

    将上述日志发送到Loki实例。

变成了这样的东西。

Grafana 是什么?

这是Grafana Loki的母项目,即本文的主题。

使用Grafana Loki和Prometheus存储的日志和指标作为数据源,在称为仪表盘的界面上将各种信息可视化。

通过Promtail、Loki、Prometheus等工具获取的数据是人类可读性较低的机器可读文本数据,通过在Grafana中进行可视化,使其变得人类可读。

使用Promtail + Grafana Loki + Grafana的基本配置

总结到目前为止的结构,使用Grafana Loki来获取日志,并将其在Grafana上进行可视化的基本流程如下。

    1. 使用Promtail将特定日志发送到Loki,

 

    1. Loki保存并处理来自Promtail的日志,

 

    1. 然后在Grafana中获取并显示日志,

 

    就是这样的。

实操

那么,让我们动手实际操作一下试试看吧。

我将在前面先描述本次尝试的docker-compose文件。

作为顺序

    1. 通过flog应用程序将虚拟日志输出到/var/log/flog.log,

 

    1. 添加Promtail的配置,以获取上述flog日志并将其发送到Loki进行配置

 

    1. 在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已经成功启动并开始获取日志。

Screenshot 2019-12-08 17.14.18.png

启动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作为用户名和密码来登录。

Screenshot 2019-12-08 17.23.06.png

登录成功后,需要指定数据来源,即用于数据可视化的数据源。

登录后,您可能会看到类似于下面的屏幕,请选择“添加数据源”。

接下来,您将转到选择使用哪个应用程序作为数据源的界面。

请选择位于”Logging & document databases”项中的Loki。

Screenshot 2019-12-08 16.41.55.png

这样一来,您将转到输入连接信息的页面。

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

Screenshot 2019-12-08 16.44.33.png

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

Screenshot 2019-12-08 16.45.07.png

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

Screenshot 2019-12-08 16.46.21.png

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

bannerAds