使用Grafana堆栈和Fluent-Bit在微服务中集中伐木。
#node #docker #grafana #fluentbit

在此博客中,我们将看到如何与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来访问该门户。它还会要求您在登录后输入首选密码。

Grafana login page

登录后,它将显示仪表板屏幕。

Grafana dashboard

单击添加数据源。

Datasource listing

单击Loki并输入URL:http://loki:3100时,我们在Docker中使用Loki。因此,我们可以使用Docker容器名称访问Localhost的服务。

Loki datasource

单击save & test,它将保存Grafana管理员的数据源。然后单击explore打开查询仪表板。

Query dashboard

单击run query,以显示Grafana堆栈中每个作业的日志。如果您正在寻找任何服务的特定日志。您可以从log browser查询日志。

Query output

要了解有关查询语言的更多信息,您可以查看Grafana在logQL上提供的文档。

结论:
添加集中记录将使微服务应用程序更易于调试/监视,因为我们有单个UI监视所有服务。当系统的数量增加,并且在云平台上很难一起监视服务的服务数量会增加时,对集中式记录的使用将更加有益。选择正确的日志记录堆栈将在崩溃时对生产应用程序的调试过程产生巨大影响。

感谢您阅读本文。如果您有任何疑问,请随时通过harsh.make1998@gmail.com给我发送电子邮件。

直到下次!