用于 Go 的 Span 剖析与 Traces 到 profiles
Span 剖析代表了剖析方法论的重大转变,能够更深入地分析追踪和剖析数据。传统的持续剖析在固定间隔内提供应用范围的视图。相比之下,Span 剖析侧重于应用内特定执行范围(例如单个请求或特定追踪 Span)的动态分析。
这一转变使得对性能有了更细粒度的视图,通过将剖析直接与追踪关联起来,从而增强了剖析的效用,以便全面理解应用行为。因此,工程团队可以更高效地识别和解决性能瓶颈。
要了解更多关于 Span 剖析的信息,请参阅结合追踪和剖析提升可观测性:Span 剖析介绍。
Pyroscope 可以与支持 OpenTelemetry 标准的分布式追踪系统集成。此集成允许您将追踪与剖析数据关联,并查找您的追踪 Span 中特定代码行的资源使用情况。
注意
- 仅支持 CPU 剖析。
- 由于采样剖析器的工作方式,短于采样间隔的 Span 可能无法捕获。Go CPU 剖析器每秒探测堆栈追踪 100 次,这意味着短于 10 毫秒的 Span 可能无法捕获。
要使用 Span 剖析,您需要
开始之前
在使用 Span 剖析之前,您的应用必须完成剖析和追踪的插桩。
- 剖析:您的应用必须使用 Pyroscope 的 Go SDK 完成插桩。如果您尚未完成,请参阅Go(推送模式)指南。
- 追踪:您的应用必须使用 OpenTelemetry 追踪完成插桩。如果您尚未完成,请参阅OpenTelemetry指南。
配置 otel-profiling-go
包
要开始收集 Go 应用的 Span 剖析,您需要在代码中包含 otel-profiling-go
包。这个包是一个 TracerProvider
实现,它使用 Span ID 标记剖析数据。这使得可以使用在 Grafana 或 Grafana Cloud 中配置的 Tempo 数据源来查询特定 Span 的剖析数据。
这个包是一个 TracerProvider
实现,它使用 span ID 标记 profiling 数据。这使得使用在 Grafana 或 Grafana Cloud 中配置的 Tempo 数据源来查询针对特定 span 的 profiling 数据成为可能。
# Make sure you also upgrade pyroscope server to version 0.14.0 or higher.
go get github.com/grafana/otel-profiling-go
接下来,您需要创建并配置追踪器提供程序
package main
import (
otelpyroscope "github.com/grafana/otel-profiling-go"
"github.com/grafana/pyroscope-go"
)
func main() {
// Initialize your tracer provider as usual.
tp := initTracer()
// Wrap it with otelpyroscope tracer provider.
otel.SetTracerProvider(otelpyroscope.NewTracerProvider(tp))
// If you're using Pyroscope Go SDK, initialize pyroscope profiler.
_, _ = pyroscope.Start(pyroscope.Config{
ApplicationName: "my-service",
ServerAddress: "https://:4040",
})
// Your code goes here.
}
设置好追踪器后,您可以从任何地方创建新的追踪,剖析器将自动捕获其剖析数据。
ctx, span := otel.Tracer("tracerName").Start(ctx, "ExampleSpan")
defer span.End()
// Your code goes here.
在 Grafana 或 Grafana Cloud 中查看 Span 剖析
要在 Grafana Tempo 中查看 Span 剖析,您需要一个配置了 Tempo 数据源的 Grafana 实例,以便关联追踪 Span 和剖析数据。请参考 Grafana 或 Grafana Cloud 的配置文档。
要了解如何设置 Traces 到 profiles 以及如何查看 Span 剖析,请参阅Traces 到 profiles。
示例
查看 examples 目录,获取一个展示追踪集成功能的完整示例应用。