暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Grafana全家桶(六)日志平台Loki的部署

栋总侃技术 2023-10-24
619

上一节给大家对Loki进行了介绍,了解了其存储日志、查询日志的相关组件及原理。这一节将会带领大家实际地完成Loki、Promtail的部署,完成服务日志的采集,以及在grafana上查询日志的使用介绍。

下图描述了日志平台日志采集和查询的数据流,在本章节我们将会完成PromTail、Loki的部署,然后在Grafana上配置Loki数据源完成日志的查询。


Loki Chart部署

在Loki的代码仓库中production目录提供了Loki Helm部署的Chart包,其中也提供了日志采集端fluent-bit、promtail等组件的Chart部署包。

部署Loki时,只需要对Values文件中依赖的存储进行配置即可完成默认安装:

  storage:
    s3:
      accessKeyId: null
      endpoint: null
      http_config: {}
      insecure: false
      region: null
      s3: null
      s3ForcePathStyle: false
      secretAccessKey: null
      signatureVersion: null
    type: s3

如果进行demo学习可以将type配置为filesystem,但是此时的副本数只能设置为1

我们这里demo部署的是单二进制模式(如果需要完成分布式的部署,仅需要打开其他的配置开关即可),设置singleBinary.replicas为1

singleBinary:
  # -- Number of replicas for the single binary
  replicas: 1

运行命令完成部署

helm install --namespace=log-demo  loki loki/

完成部署后,单机模式的Loki将会以statefulset运行,同时还会部署一个以Nginx作为网关。在分布式模式,Nginx将会分别反向代理读写请求至Query Fronted和Distributor。

Promtail Chart部署

Promtail 的Chart只需要完成配置日志写入Loki的接口地址即可完成部署:

config:
  clients:
    - url: http://loki-gateway.log-demo.svc.cluster.local:80/loki/api/v1/push
由于Promtail与Loki部署在一个集群内,所以只需要配置访问到loki-gateway的service即可。

Promtail将会以Daemonset形式运行在每个Node上,采集K8s集群中运行的服务输出在控制台的日志。

Grafana 配置Loki数据源

在Grafana的数据源管理页面选择添加Loki类型数据源

填入名称,查询地址 http://loki-gateway.log-demo.svc.cluster.local:80

点击save&test按钮完成数据源配置。

Grafana 查询日志

点击首页的探索(Explore),选择配置的Loki数据源即可开始查询日志,在链路跟踪章节中我们实现的Go demo 程序会输出日志,我们对这个命名空间的日志进行查询

可以看到我们在日志中传入了TraceID, 这样可以结合日志输出和链路跟踪对服务问题进行排查了。
如果对Loki提供的LogQL比较熟悉,也可以通过切换右侧的BuilderCode来选择输入查询语句方式:

新手建议Builder结合Code进行使用,基于界面的交互能够降低查询的学习门槛。

使用LogQL查询Json日志

这里带来一个使用LogQL查询的示例。在Go Demo的server1服务中,不知道大家还是否记得在Trace中有个模拟异常输出的日志。

在Demo中日志的输出是Json格式的,这行日志内容为:

{"TraceID":"283867f7da0f32b5ad14848f37ed58a8","description":"sending go-server2","file_line":"server1/main.go:54","level":"error","service":"go-demo-server1","timestamp":"2023-10-21T14:24:02.103+0800","version":"v0.0.1"}

而我们通过grafana的Label filter下拉选项是没有这行日志中Json的Key的。

常见的,我们需要根据日志级别筛选日志、或者根据TraceID查询日志该如何通过LogQL实现呢?
首先我们通过管道运算符将采集的日志整体转化为Json

{namespace="go-optl-demo", component="server1"} | json

我们应用输出的日志在log字段,我们再将log字段转化为Json

{namespace="go-optl-demo", component="server1"} | json | line_format `{{.log}}` | json

这样,应用程序本身输出的字段就可以通过label filters进行过滤了

以上过程也可以通过界面完成设置,大家在使用过程中Builder结合Code使用更能加快对LogQL的理解

关于LogQL更多的查询技巧,大家可以在Grafana官网中Loki章节查询示例进行学习了解。


到这里就完成了Loki整体的搭建,大家可以在Grafana完成链路、日志的查询了,而不需要多个应用进行切换了。


而通过grafana看板查看Prometheus监控指标想必大家都比较熟悉了,那只需要Grafana一个前端应用就可以完成监控、日志、链路跟踪数据的查询,能够提升查找分析问题的效率。

往期回顾:

Grafana全家桶(五)日志系统Loki的介绍

Grafana全家桶(四)链路跟踪Demo-Go代码集成opentelemetry SDK

Grafana全家桶(三)使用Grafana Agent与Tempo实现链路追踪完整demo

Grafana全家桶(二)链路跟踪Grafana Tempo的介绍和部署

Grafana全家桶(一)Grafana Labs产品介绍

文章转载自栋总侃技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论