要在分布式追踪领域确定自己的方向是很困难的,让追踪设置的所有部分都能很好地相互配合也是有点困难的。
但追踪的好处是不可否认的。在你的应用程序/服务中添加分布式跟踪,可以提供:
- 洞察请求如何在系统中流动
- 能够轻松地看到不同服务调用的延迟(内部/外部)。
- 当出现问题时,你的工具箱中又多了一个工具。
作为一名DevOps工程师,我一直在Proactima AS的各种项目中使用Cortex、Grafana和Grafana Loki,该公司拥有强大的客户组合,涉及运输、能源、石油和天然气、金融、卫生和公共领域。无论哪个行业或工作范围,我都对我们现有堆栈的功能、性能和配置选项感到满意。因此,当我们决定将追踪功能加入到组合中时,自然选择了Grafana Tempo,到目前为止,它已经提供了我想要的一切,甚至更多。
Tempo为你提供了一个追踪中立的后端,以存储和查询所有常见的追踪格式。Tempo后台的灵活性也使得这个开源的解决方案很容易适应几乎所有的环境。你可以根据你的需要以任何规模设置Tempo,独立的写路径和读路径甚至可以根据负载情况单独扩展。
在这篇文章中,我将向你展示如何连接所有必要的部分,最终形成一个系统,从Grafana实例中收集痕迹,该实例位于NGINX Ingress Controller后面,在Linkerd服务网格上运行。
概述
这篇博文将探讨的堆栈是如下内容:
- Grafana Tempo(v1.2)
- Linkerd (stable-2.11.1)
- NGINX Ingress Controller (v1.0.4)
- Grafana(v8.2.4)
- Grafana Loki(v2.4)--可选
我不会去看如何安装所有的组件,但我会展示每个组件所需的具体配置,以使它们一起工作。
这是对请求路径和跨度运输如何发生的一个高级概述。
向Grafana Tempo发送跨度
Grafana Tempo是一个高规模、最小依赖性的分布式追踪后端。
Grafana Tempo不需要任何特定的配置,只是你需要确保Tempo正在监听你要用来运送跨度的端口/协议。在这个例子中,我将使用以下协议:
- Jaeger Compact UDP (port 6831) - 用于从Grafana获取数据。
- OpenCensus TCP (port 55678) - 用于从Linkerd Proxy获取数据。
- Zipkin TCP(端口9411)--用于从NGINX入口控制器获取数据。
配置中的Tempo接收器部分应该是这样的:
...
distributor:
receivers:
jaeger:
thrift_compact:
endpoint: 0.0.0.0:6831
opencensus:
endpoint: 0.0.0.0:55678
zipkin:
endpoint: 0.0.0.0:9411
...
在这个例子中,我将直接把traces发送到分销商,但你也可以通过Gateway发送(即如果你正在运行多租户)。
Linkerd是决定很多事情如何进行的部分。原因是,目前Linkerd只支持B3传播标准。因此,为了让Linkerd代理参加追踪,所有其他部分都需要使用B3标准。如果你不关心Linkerd的跨度,你可以自由地使用其他传播标准。
为了配置Linkerd进行追踪,你必须部署linkerd-jaeger
扩展。创建一个包含以下内容的配置文件。(你也可以在这里添加其他选项。关于所有的有效值,请看这里的选项的完整列表):
collector:
enabled: false # We don't need the collector, we can just ship it directly to Tempo
jaeger:
enabled: false # We don't need the Jaeger UI, we'll just use Grafana
webhook:
collectorSvcAddr: tempo-distributor.tempo.svc.cluster.local:55678 # Replace with the FQDN:Port of your Tempo Distributor service
collectorSvcAccount: tempo # Replace with the ServiceAccount Tempo is running with
用linkerd jaeger install -f linkerd-jaeger-values.yaml > linkerd-jaeger.yaml
生成所需的YAML,然后用kubectl apply -f linkerd-jaeger.yaml
应用。
这将创建一个名为linkerd-jaeger
的命名空间,它将包含jaeger-injector
。
NGINX Ingress控制器
我假设NGINX Ingress Controller已经与Helm一起部署,因为这似乎是最常见的做法。要启用追踪功能,你只需要在你的values.yaml
中添加几行:
controller:
config:
enable-opentracing: "true"
zipkin-collector-host: tempo-distributor.tempo.svc.cluster.local # Replace this with the FQDN of your Tempo Distributor service
zipkin-service-name: nginx-internal # This will show up as a process field in the spans with the key 'service.name'. Useful if you have multiple ingress deployments
以正常的方式做一个helm upgrade
,你就可以开始了。
要配置Grafana发射跨度,你需要用以下值更新你的grafana.ini
(用你的Tempo分销商服务的FQDN:端口替换address
):
[tracing]
type = jaeger
[tracing.jaeger]
address = tempo-distributor.tempo.svc.cluster.local:6831
zipkin_propagation = true
Grafana Loki数据源(可选)
如果你把你的日志运送到Grafana Loki,你可以配置你的Loki数据源进行traceID检测。
通过UI
编辑你的Loki数据源并添加一个衍生字段:
名称。TraceID
Regex: traceID=(\w+)
查询:${__value.raw}
内部链接:已勾选
下拉菜单:选择你的Tempo数据源
测试这一切
现在,在Grafana中点击几下,生成一些请求。然后你可以选择如何找到你的痕迹:
-
如果你在Grafana Tempo和Grafana中都激活了实验性的Tempo搜索功能:
- 转到探索
- 选择Tempo数据源
- 点击搜索--测试版
- 你应该在这里看到一些蛛丝马迹
-
如果你把你的Grafana日志运送到Loki:
- 转到探索
- 选择Tempo数据源
- 选择Loki搜索
- 对你的Grafana日志进行搜索,即:
{namespace="monitoring", job="monitoring/grafana"}
或类似的,取决于你的设置 - 你应该在这里看到一些蛛丝马迹
-
从Grafana抓取日志,可以直接从pods或通过你的日志系统:
- 寻找
traceID
- 转到Grafana Explore
- 选择Tempo数据源
- 选择traceID
- 输入traceID并运行查询
- 你应该看到一个跟踪
- 寻找
总结
上面的例子显示了如何从Ingress中的请求命中点开始追踪,一直到堆栈。例如,如果你运行Cortex,你可以启用追踪功能,并进一步跟踪你的请求。
对于你自己的应用程序/服务,有几种不同的解决方案来收集和发送跟踪。一个好的解决方案是OpenTelemetry项目,它有适用于最常见语言的SDK,并支持不同的导出格式和传播格式。
但首先,你应该测试一下这个设置!启动Grafana Tempo进程的单个实例,并向其发送一些追踪信息。使用Grafana来探索追踪数据,并思考它如何能适合你的堆栈。