菜单
开源

Go (推送模式)

我们的 Go 剖析器是一款尖端的工具,旨在优化 Golang 应用程序。通过与 Pyroscope 集成,剖析器为开发人员提供了对其 Go 代码库的深入了解,从而实现实时性能分析。这种强大的工具对于查明效率低下、简化代码执行和确保 Go 应用程序的峰值性能至关重要。

Pyroscope 使用标准的 runtime/pprof 包来收集剖析数据。有关详细信息,请参阅 官方文档

注意

有关 Go 支持的剖析类型列表,请参阅 可用剖析类型

开始之前

要捕获和分析剖析数据,您需要一个托管的 Pyroscope OSS 服务器或一个托管的 具有 Grafana Cloud Profiles 的 Pyroscope 实例(需要一个免费的 Grafana Cloud 帐户)。

Pyroscope 服务器可以是用于开发的本地服务器或用于生产使用的远程服务器。

配置 Go 客户端

要开始剖析 Go 应用程序,您需要在应用程序中包含 Go 模块

go get github.com/grafana/pyroscope-go

注意

如果您更喜欢使用拉取模式,可以使用 Grafana Agent

然后将以下代码添加到您的应用程序

Go
package main

import "github.com/grafana/pyroscope-go"

func main() {
  // These 2 lines are only required if you're using mutex or block profiling
  // Read the explanation below for how to set these rates:
  runtime.SetMutexProfileFraction(5)
  runtime.SetBlockProfileRate(5)

  pyroscope.Start(pyroscope.Config{
    ApplicationName: "simple.golang.app",

    // replace this with the address of pyroscope server
    ServerAddress:   "http://pyroscope-server:4040",

    // you can disable logging by setting this to nil
    Logger:          pyroscope.StandardLogger,

    // you can provide static tags via a map:
    Tags:            map[string]string{"hostname": os.Getenv("HOSTNAME")},

    ProfileTypes: []pyroscope.ProfileType{
      // these profile types are enabled by default:
      pyroscope.ProfileCPU,
      pyroscope.ProfileAllocObjects,
      pyroscope.ProfileAllocSpace,
      pyroscope.ProfileInuseObjects,
      pyroscope.ProfileInuseSpace,

      // these profile types are optional:
      pyroscope.ProfileGoroutines,
      pyroscope.ProfileMutexCount,
      pyroscope.ProfileMutexDuration,
      pyroscope.ProfileBlockCount,
      pyroscope.ProfileBlockDuration,
    },
  })

  // your code goes here
}

向您的应用程序添加剖析标签

您可以向剖析数据添加标签(标签)。这些标签可用于在 UI 中筛选数据。有一个与 go-native pprof API 一致的自定义 API

Go
// these two ways of adding tags are equivalent:
pyroscope.TagWrapper(context.Background(), pyroscope.Labels("controller", "slow_controller"), func(c context.Context) {
  slowCode()
})

pprof.Do(context.Background(), pprof.Labels("controller", "slow_controller"), func(c context.Context) {
  slowCode()
})

互斥锁剖析

互斥锁剖析有助于查找应用程序中的争用来源。它可以帮助您找出哪些互斥锁由哪些 goroutine 持有。

要启用互斥锁剖析,您需要将以下代码添加到您的应用程序

Go
runtime.SetMutexProfileFraction(rate)

rate 参数控制互斥锁配置文件中报告的互斥锁竞争事件的比例。平均情况下会报告 1/rate 个事件。

阻塞分析

阻塞分析可帮助您分析程序在以下阻塞操作上等待的时间:

  • select
  • 通道发送/接收
  • semacquire
  • notifyListWait

要启用阻塞分析,您需要在应用程序中添加以下代码:

Go
runtime.SetBlockProfileRate(rate)

rate 参数控制阻塞配置文件中报告的协程阻塞事件的比例。分析器旨在平均每阻塞 rate 纳秒采样一个阻塞事件。

将数据发送到 Pyroscope OSS 或 Grafana Cloud Profiles

Go
pyroscope.Start(pyroscope.Config{
  ApplicationName:   "example.golang.app",
  ServerAddress:     "<URL>",
  // Optional HTTP Basic authentication
  BasicAuthUser:     "<User>",
  BasicAuthPassword: "<Password>",
  // Optional Pyroscope tenant ID (only needed if using multi-tenancy). Not needed for Grafana Cloud.
  // TenantID:          "<TenantID>",
  ProfileTypes: []pyroscope.ProfileType{
    pyroscope.ProfileCPU,
    pyroscope.ProfileInuseObjects,
    pyroscope.ProfileAllocObjects,
    pyroscope.ProfileInuseSpace,
    pyroscope.ProfileAllocSpace,
  },
})

要将 Golang SDK 配置为将数据发送到 Pyroscope,请将 <URL> 占位符替换为适当的服务器 URL。这可能是 Grafana Cloud URL 或您自己的自定义 Pyroscope 服务器 URL。

如果您需要将数据发送到 Grafana Cloud,则需要配置 HTTP 基本身份验证。将 <User> 替换为您的 Grafana Cloud 堆栈用户,将 <Password> 替换为您的 Grafana Cloud API 密钥。

如果您的 Pyroscope 服务器启用了多租户功能,则需要配置租户 ID。将 <TenantID> 替换为您的 Pyroscope 租户 ID。

Golang 分析示例

查看以下资源,详细了解 Golang 分析