博客/社区

为分布式跟踪配置Grafana Tempo和Linkerd

2022年1月12日6分钟

在领导Cortex开发了五年之后,Grafana实验室不再为这个项目做出贡献。bob电竞频道在2022年3月,我们推出了Grafana Mimir,这是Prometheus的开源长期存储,可以让你扩展到10亿个指标甚至更多。如欲了解更多,请参阅阅读TSDB的公告博客参观Grafana米密尔页面。
2022年3月30日

Anders Østhus是数字工具团队的DevOps工程师Proactima作为是一家总部位于挪威的咨询公司,提供风险管理、网络安全、医疗保健、环境解决方案等方面的服务和专业知识。bob彩票中奖计划

在分布式跟踪空间中定位可能很困难,并且让跟踪设置的所有部分彼此良好地发挥作用可能有点棘手。

但是追踪的好处是不可否认的。添加分布式跟踪为您的应用程序/服务提供:

  • 深入了解请求如何流经系统
  • 能够轻松查看不同服务调用的延迟(内部/外部)
  • 当出现问题时,这是你工具箱里的额外工具

作为一个DevOps工程师,我一直在使用皮质Grafana,Grafana洛基Proactima AS拥有强大的客户组合,横跨运输、能源、石油和天然气、金融、卫生和公共部门。无论从事什么行业或工作范围,我总是对我们现有堆栈的特性、性能和配置选项感到满意。所以当我们决定在混合中添加跟踪时,自然的选择是Grafana节奏到目前为止,它满足了我想要的一切,甚至更多。

Tempo为您提供了一个与跟踪无关的后端来存储和查询所有常见的跟踪格式。Tempo后端的灵活性也使得开源解决方案很容易适应几乎所有的环境。你可以设置Tempo在任何尺度上根据您的需要,独立的写路径和读路径甚至可以根据负载单独伸缩。

在这篇文章中,我将向您展示如何将所有必要的部分连接起来,最终形成一个系统,从数据库中收集跟踪Grafana实例的后面NGINX入口控制器运行在Linkerd服务网格。

概述

本文将介绍的堆栈如下:

  • Grafana Tempo (v1.2
  • Linkerd (stable-2.11.1)
  • NGINX入口控制器(v1.0.4)
  • Grafana (v8.2.4
  • Grafana Loki (v2.4) -可选

我不会详细介绍如何安装所有组件,但我将展示每个组件所需的特定配置,以使它们协同工作。

这是一个高层次的概述,关于请求路径和跨度运输将如何发生:

航运跨度到Grafana Tempo

Grafana Tempo是一个高规模、最小依赖的分布式跟踪后端。

Grafana Tempo不需要任何特定的配置,除了你需要确保Tempo正在监听端口/协议,你将使用船跨度上。对于这个例子,我将使用以下协议:

  • 积家紧凑UDP(端口6831)-从Grafana跟踪
  • OpenCensus TCP(端口55678)-用于链接代理的跟踪
  • Zipkin TCP(端口9411)-用于NGINX入口控制器的跟踪

有关支持的端点及其相应端口的完整列表,请访问API文档

Tempo接收器部分的配置应该看起来像这样:

...分销商:接收器:jaeger: thrift_compact: endpoint: 0.0.0.0:6831 opencensus: endpoint: 0.0.0.0:55678 zipkin: endpoint: 0.0.0.0:9411…

在本例中,我将直接将跟踪发送到分发服务器,但是您也可以通过网关发送它(例如,如果您使用多租户运行)。

Linkerd

林克德将决定这一切将如何运作。原因是目前Linkerd只支持B3 Propagation标准。所以为了让Linkerd Proxy参与跟踪,所有其他部分都需要使用B3标准。如果您不关心来自Linkerd的跨度,您可以自由地使用另一种传播标准。

要为跟踪配置Linkerd,必须部署linkerd-jaeger扩展。创建一个配置文件,内容如下:(你也可以在这里添加其他选项。对于所有有效值,请看在这里查看完整的选项列表。)

collector: enabled: false #我们不需要收集器,我们可以直接将它传送到Tempo jaeger: enabled: false #我们不需要jaeger UI,我们只使用Grafana webhook: collectorSvcAddr: Tempo -distributor. Tempo .svc.cluster。local:55678 #替换为FQDN: Tempo分销商服务收集器的端口svcaccount: Tempo #替换为Tempo正在运行的ServiceAccount

生成所需的YAMLLinkerd jaeger install -f linkd -jaeger-values。Yaml > link -jaeger. Yaml然后应用于Kubectl应用-f link -jaeger.yaml

这将创建一个名为linkerd-jaeger,将包含jaeger-injector

NGINX入口控制器

我假设NGINX入口控制器已经与Helm一起部署,因为这似乎是最常见的做法。要启用跟踪,您只需要向您的values.yaml

Controller: config: enable-opentracing: "true" zipkin-collector-host: tempo-distributor.tempo.svc.cluster。将此替换为Tempo分销商服务的FQDN zipkin-service-name: nginx-internal #这将作为一个流程字段显示在span中,键为'service.name'。如果您有多个入口部署,则非常有用

做一个执掌升级用正常的方式,你就可以开始了。

Grafana

要配置Grafana以发出跨度,您需要更新您的grafana.ini用以下值(替换地址FQDN:您的Tempo分销商服务的端口):

[追踪]type = jaeger[追踪]地址= tempo-distributor.tempo.svc.cluster。Local:6831 zipkin_propagation = true

Grafana Loki数据源(可选)

如果您将日志发送到Grafana Loki,您可以为traceID检测配置Loki数据源。

通过UI
编辑Loki数据源并添加一个导出字段
名称:TraceID
Regex: traceID = (\ w +)
查询:$ {__value.raw}
内部链接:已检查
下拉菜单:选择Tempo数据源

全部测试

现在,在Grafana中单击几次以生成一些请求。然后你有几个选择如何找到你的痕迹:

  • 如果你已经激活了实验Tempo搜索功能Grafana节奏而且Grafana

    1. 去探索
    2. 选择Tempo数据源
    3. 点击搜索-测试版
    4. 您应该可以在这里看到一些痕迹
  • 如果你把你的Grafana日志寄给洛基

    1. 去探索
    2. 选择Tempo数据源
    3. 选择Loki搜索
    4. 搜索你的Grafana日志,即:={名称空间“监控”,工作=“监视/ grafana”}或者类似的,取决于你的设置
    5. 您应该可以在这里看到一些痕迹
  • 从Grafana获取日志,直接从吊舱或通过您的日志系统:

    1. 寻找traceID
    2. 前往Grafana Explore
    3. 选择Tempo数据源
    4. 选择traceID
    5. 输入traceID并运行查询
    6. 您应该会看到一个痕迹

结论

上面的例子展示了如何从Ingress中的请求命中一直跟踪到堆栈。例如,如果你经营Cortex,你就可以启用跟踪然后按照你的要求继续下去。

对于您自己的应用程序/服务,有几种不同的解决方案用于收集和发送跟踪。bob彩票中奖计划一个很好的解决方案是OpenTelemetry项目,它拥有针对最常见语言的sdk,并支持不同的导出格式和传播格式。

但是首先,您应该测试这个设置!启动Grafana Tempo流程的单个实例,并向其发送一些跟踪。使用Grafana探索跟踪数据,并考虑如何将其纳入您的堆栈。

要了解更多关于Grafana Tempo和观看现场演示,注册我们的免费网络研讨会《使用Grafana的分布式跟踪:从Tempo OSS到企业》由Grafanbob电竞频道a实验室的专业人员领导。

开始使用Tempo最简单的方法是Grafana云,我们的永久免费层现在包括50GB的跟踪,50GB的日志和10K系列指标。报名今天免费!