在此博客中,我们将看到如何与Nodejs应用程序一起在Docker上创建Grafana堆栈和流利的位置。
堆栈简介:
Grafana stack包括-grafana(Admin Web Portal),Loki(日志数据存储)和Fluent -Bit(Logs Collector)。 Fluent-Bit的目的是从原始服务器中获取日志,在日志上添加过滤器并将其发送到数据存储。 Loki的目的是在系统上存储带有索引和元数据的日志。 Grafana的目的是通过提供在单个系统上运行的管理UI来分析/查询/监视您的服务。
我们还可以使用麋鹿(弹性搜索,logstash,kibana)堆栈进行日志聚合和监视微服务应用程序。让我们检查一下两个堆栈之间的区别。
Elasticsearch:
Elasticsearch是一种搜索引擎工具,它是使用Lucene构建的。弹性搜索将非结构化数据存储为其数据存储中的JSON对象,该对象是从LogStash收集的
Kibana让用户可视化管理门户上的日志。
弹性搜索以以下方式存储数据。它将索引LogStash提供的所有内容并存储文档。它将使弹性搜索可从文档中的每个键搜索,因此需要更多的存储空间。
loki:
Loki是一个日志聚合工具,还将数据存储为键值对。但它还可以存储使用日志数据的标签。因此,通过使用标签可以搜索来自Loki的数据,因此它在数据存储系统中创建较低的索引,并且可以使其更有效地存储。
要使用什么:
就存储效率而言,LOKI是一个不错的选择,因为它不使用太多存储空间,并且可以根据标签获取日志流。但是,如果您有一个带有日志的大数据集,则您的日志中有元数据和其他额外字段,那么Loki将需要很多时间来获取日志流,因为它将创建多个标签并在数据上创建多个日志流。在这种情况下,弹性搜索可能是存储此类日志数据的好选择,因为它将为您在数据存储中存储的所有字段创建索引。
让我们从将Grafana堆栈与Docker的集成开始。
fluent-bit:
environment:
LOG_LEVEL: debug
LOKI_URL: http://loki:3100/loki/api/v1/push
build:
context: ./fluent-bit
dockerfile: Dockerfile
ports:
- "24224:24224"
- "24224:24224/udp"
networks:
- backend
loki:
image: grafana/loki:latest
expose:
- "3100"
networks:
- backend
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
GF_RENDERING_SERVER_URL: http://renderer:8081/render
GF_RENDERING_CALLBACK_URL: http://grafana:3000/
GF_LOG_FILTERS: rendering:debug
networks:
- backend
renderer:
image: grafana/grafana-image-renderer:latest
expose:
- "8081"
environment:
ENABLE_METRICS: "true"
networks:
- backend
networks:
backend:
driver: bridge
在这里,我们正在使用Fluent-Bit的自定义图像,因为我们将其用于Grafana堆栈。 Grafana提供了与Loki集成的流利位图像。您可以查看文档here。
在项目的根部创建fluent-bit
文件夹,在该文件夹中创建Dockerfile
。
FROM grafana/fluent-bit-plugin-loki:latest
COPY ./conf/fluent.conf /fluent-bit/etc/fluent-bit.conf
我们将配置传递给Docker映像。在Fluent-Bit文件夹中创建配置。创建conf
文件夹,然后在该文件夹中创建文件fluent-bit.conf
[INPUT]
Name forward
Listen 0.0.0.0
Port 24224
[Output]
Name grafana-loki
Match *
Url ${LOKI_URL}
RemoveKeys source
Labels {job="fluent-bit"}
LabelKeys container_name
BatchWait 1s
BatchSize 1001024
LineFormat json
LogLevel ${LOG_LEVEL}
我们将LOKI_URL
作为环境变量传递。
要在Docker容器中更新logging
,更新docker-compose.yml
文件中服务器的Docker-Compose配置。
order:
build:
context: ./order
dockerfile: Dockerfile
restart: on-failure
ports:
- "9003:9003"
env_file:
- ./order/.env
networks:
- backend
volumes:
- ./order:/app/order
- /app/order/node_modules
logging:
driver: fluentd
options:
fluentd-async: "true"
fluentd-address: localhost:24224
tag: order-service
在这里,在Docker-Compose配置中,使用的驱动程序是Fluentd,因为Fluent-Bit也是Fluentd系统的一部分。在选项中,fluentd-async: true
将与Docker Env的Fluent-Bit实例建立异步连接。因此,订单服务将在docker中启动服务器,而不会出现任何错误。该标签将在Grafana UI中用于标识每个服务。
启动我们的微服务应用程序在终端docker-compose up
中写下命令,它将一起启动所有Docker容器。
根据Docker-Compose配置文件,Grafana实例应在端口3000上运行。使用默认用户名admin
和密码admin
来访问该门户。它还会要求您在登录后输入首选密码。
登录后,它将显示仪表板屏幕。
单击添加数据源。
单击Loki并输入URL:http://loki:3100
时,我们在Docker中使用Loki。因此,我们可以使用Docker容器名称访问Localhost的服务。
单击save & test
,它将保存Grafana管理员的数据源。然后单击explore
打开查询仪表板。
单击run query
,以显示Grafana堆栈中每个作业的日志。如果您正在寻找任何服务的特定日志。您可以从log browser
查询日志。
要了解有关查询语言的更多信息,您可以查看Grafana在logQL上提供的文档。
结论:
添加集中记录将使微服务应用程序更易于调试/监视,因为我们有单个UI监视所有服务。当系统的数量增加,并且在云平台上很难一起监视服务的服务数量会增加时,对集中式记录的使用将更加有益。选择正确的日志记录堆栈将在崩溃时对生产应用程序的调试过程产生巨大影响。
感谢您阅读本文。如果您有任何疑问,请随时通过harsh.make1998@gmail.com给我发送电子邮件。
直到下次!