Grafana Tempo笔记03: 使用OpenTelemetry Collector将跟踪数据发送Tempo
可以使用Grafana Agent将分布式追踪数据发送到Tempo,但这不是必需的。实际上,Tempo服务是一个暴露符合Open Telemetry TraceService标准的gRPC端点,通过HTTP Basic授权进行访问。任何能够使用正确的HTTP请求头调用该端点的工具都可以发送跟踪数据。
可以使用Grafana Agent将分布式追踪数据发送到Tempo,但这不是必需的。实际上,Tempo服务是一个暴露符合Open Telemetry TraceService标准的gRPC端点,通过HTTP Basic授权进行访问。任何能够使用正确的HTTP请求头调用该端点的工具都可以发送跟踪数据。
本文内容可能已过期 如何部署Tempo取决于我们的tracing需求。Tempo有两种部署模式:单体式或微服务式。当使用Helm在Kubernetes集群上部署Tempo时,对这两种模式都支持。 使用Tempo的Helm Charts可以在Kubernetes集群中配置、安装和升级Tempo。
Tempo介绍 Grafana Tempo是一个开源的、易于使用的且高吞容量的分布式追踪后端。Tempo具有成本效益高的特点,只需要一个对象存储来运行。Tempo可以和Grafana、Mimir、Prometheus和Loki 深度集成。可以使用Tempo与包括Jaeger、Zipkin或OpenTelemetry在内的开源追踪协议一起使用。
kubeadm是Kubernetes官方提供的用于快速安部署Kubernetes集群的工具。伴随Kubernetes每个版本的发布,kubeadm可能会对集群配置方面的一些实践做调整,通过实验kubeadm可以学习到Kubernetes官方在集群配置上一些新的最佳实践。
前面学习了Loki中日志的保留策略,本文整理一下对于使用Loki官方helm chart部署Loki时如何在values.yaml中配置日志保留策略。 所有的配置参考都可以在这个helm chart的默认的values.yaml中获得,地址是https://github.com/grafana/loki/blob/main/production/helm/loki/values.yaml。 基于默认的values.yaml结合前面已经学习的保留策略配置,对我们使用的values.yaml定制如下(下面只保留了"保留策略相关的配置"):
BoltDB Shipper使您能够在不依赖于NoSQL存储的情况下运行Loki,用来存储索引。它将索引以BoltDB文件的形式在本地存储,并将这些文件发送到共享对象存储(即用于存储数据块chunks的相同对象存储)。它还通过从共享对象存储同步BoltDB文件到配置的本地目录,获取由同一Loki集群的其他服务创建的索引。这样可以在运行Loki时减少一个依赖项,并且在存储方面节省成本,因为对象存储很可能比托管或运行自托管的NoSQL存储实例的成本更低。
Loki需要存储两种不同类型的数据:块(chunks)和索引(indexes)。 Loki接收来自不同流的日志,每个流通过其租户ID和标签集来唯一标识。当来自流的日志条目到达时,它们会被压缩为“块”(chunks)并保存在块存储(chunks存储)中。
前面学习了Promtail的基础知识和配置示例,本节做一个实战练习,使用Promtail收集Java应用日志发送给Loki。 这里假设的场景是一个Spring Boot的Java程序,日志框架使用了Logback。这个程序使用Logback将日志以文件形式写到磁盘上。 Logback的配置如下:
1.静态配置(static config)示例 尽管Promtail可能是以Prometheus服务发现代码命名的,但该代码同样适用于在虚拟机或裸机上直接追踪没有容器或容器环境的日志,并且能够很好地发挥作用。 server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /var/log/positions.yaml # Promtail需要有对此位置的写入权限。 clients: - url: http://ip_or_hostname_where_Loki_run:3100/loki/api/v1/push scrape_configs: - job_name: system pipeline_stages: static_configs: - targets: - localhost labels: job: varlogs # `job`标签在Prometheus中非常常见,对于关联指标(metrics)和日志非常有用。 host: yourhost # `host`标签将有助于区分来自此机器和其他机器的日志 __path__: /var/log/*.log # 路径匹配使用第三方库: https://github.com/bmatcuk/doublestar 如果你在轮转日志文件,请小心使用类似*.log的通配符模式,确保它不会匹配到已轮转的日志文件。例如,如果你每天将日志从server.log移动到同一个目录下的server.01-01-1970.log,那么使用通配符搜索模式*.log的静态配置将会捕捉到这个新文件并读取它,从而导致整天的日志重新被摄取。
1.Loki的客户端 Loki支持以下官方客户端来发送日志: Promtail: 在运行Kubernetes时,Promtail是首选的客户端,因为您可以配置它自动从在Promtail所在的同一节点上运行的Pod中抓取日志。在Kubernetes中同时运行Promtail和Prometheus可以实现强大的调试功能:如果Prometheus和Promtail使用相同的标签,用户可以使用像Grafana这样的工具根据标签集切换指标和日志。在裸机环境中,Promtail也是首选的客户端,因为可以配置它根据主机路径跟踪所有文件的日志。这是将日志从纯文本文件(例如,记录到/var/log/*.log的内容)发送到Loki的最简单方法。最后,如果您希望从日志中提取指标,例如计算特定消息的出现次数,Promtail也非常适用。 Docker Driver: 在使用Docker而不是Kubernetes时,应使用Docker的Loki日志驱动程序,因为它会自动添加适用于正在运行的容器的标签。 Fluentd和Fluent Bit: 当您已经部署了Fluentd并配置了解析器(Parser)和过滤器(Filter)插件时,Fluentd和Fluent Bit插件是理想的选择。当使用Fluentd的Prometheus插件时,它也非常适用于从日志中提取指标。 Logstash: 如果您已经在使用Logstash和/或Beats,那么这将是最简单的入门方式。通过添加我们的输出插件,您可以快速尝试Loki,而无需进行大量的配置更改。 Lambda Promtail: 这是一种将Promtail的push-api抓取配置和lambda-promtail AWS Lambda函数结合起来的工作流程,它将来自CloudWatch的日志传输到Loki。如果您希望以低占用资源的方式尝试Loki,或者希望在Loki中监视AWS Lambda日志,这是一个不错的选择。 此外,还有一些第三方客户端可用.请注意,Loki API目前尚不稳定,因此在使用或编写第三方客户端时可能会发生重大变更。