OpenTelemetry 可用于从您的 Go 应用程序生成遥测数据。然后可以将收集的数据发送到可观察性工具进行存储和可视化。 OpenTelemetry 是 Cloud Native Computing Foundation (CNCF) 下的一个开源项目,旨在标准化遥测数据的生成和收集。

在本教程中,我们将使用 OpenTelemetry Go 库来检测 Go 应用程序,然后使用开源可观察性工具 -SigNoz将其可视化。

开始使用 OpenTelemetry for Go 应用程序的步骤:

  • 安装 SigNoz

  • 使用 OpenTelemetry 检测 Go 应用程序

  • 将自定义属性和自定义事件添加到 span

  • 使用 SigNoz 仪表板监控您的 Go 应用程序

安装 SigNoz

首先,您需要安装 SigNoz,以便 OpenTelemetry 可以将数据发送给它。

只需三个步骤,使用简单的安装脚本即可将 SigNoz 安装在 macOS 或 Linux 机器上。

安装脚本会自动在 Linux 上安装 Docker Engine。但是,在 macOS 上,您必须在运行安装脚本之前手动安装Docker Engine。

git clone -b main https://github.com/SigNoz/signoz.git
cd signoz/deploy/
./install.sh

进入全屏模式 退出全屏模式

您可以访问我们的文档以获取有关如何使用 Docker Swarm 和 Helm Charts 安装 SigNoz 的说明。

完成 SigNoz 安装后,您可以通过http://localhost:3301访问 UI

[](https://res.cloudinary.com/practicaldev/image/fetch/s--SjMOCgs1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://signoz.io/ img/blog/common/signoz_dashboard_homepage.webp)

SigNoz 仪表板 - 它显示来自与应用程序捆绑在一起的示例应用程序的服务

使用 OpenTelemetry 检测 Go 应用程序

第 1 步:从 GitHub 获取示例 Go 应用程序

示例 Go 应用程序存储库包含我们将检测的样板代码。

without-instrumentation

第 2 步:安装依赖项

必须先安装与 OpenTelemetry 导出器和 SDK 相关的依赖项。导航到应用程序源文件夹后运行以下命令:

go get go.opentelemetry.io/otel \
  go.opentelemetry.io/otel/trace \
  go.opentelemetry.io/otel/sdk \
  go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin \
  go.opentelemetry.io/otel/exporters/otlp/otlptrace \
  go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc \

进入全屏模式 退出全屏模式

步骤 3:声明用于配置 OpenTelemetry 的环境变量

main.go
var (
    serviceName  = os.Getenv("SERVICE_NAME")
    signozToken  = os.Getenv("SIGNOZ_ACCESS_TOKEN")
    collectorURL = os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT")
    insecure     = os.Getenv("INSECURE_MODE")
)

进入全屏模式 退出全屏模式

第 4 步:使用 OpenTelemetry 检测您的 Go 应用程序

main.go
import (
  .....

    "github.com/gin-gonic/gin"
    "go.opentelemetry.io/otel"
    "go.opentelemetry.io/otel/attribute"
    "go.opentelemetry.io/otel/exporters/otlp/otlptrace"
    "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"

    "go.opentelemetry.io/otel/sdk/resource"
    sdktrace "go.opentelemetry.io/otel/sdk/trace"
)

func initTracer() func(context.Context) error {

    headers := map[string]string{
        "signoz-access-token": signozToken,
    }

    secureOption := otlptracegrpc.WithTLSCredentials(credentials.NewClientTLSFromCert(nil, ""))
    if len(insecure) > 0 {
        secureOption = otlptracegrpc.WithInsecure()
    }

    exporter, err := otlptrace.New(
        context.Background(),
        otlptracegrpc.NewClient(
            secureOption,
            otlptracegrpc.WithEndpoint(collectorURL),
            otlptracegrpc.WithHeaders(headers),
        ),
    )

    if err != nil {
        log.Fatal(err)
    }
    resources, err := resource.New(
        context.Background(),
        resource.WithAttributes(
            attribute.String("service.name", serviceName),
            attribute.String("library.language", "go"),
        ),
    )
    if err != nil {
        log.Printf("Could not set resources: ", err)
    }

    otel.SetTracerProvider(
        sdktrace.NewTracerProvider(
            sdktrace.WithSampler(sdktrace.AlwaysSample()),
            sdktrace.WithSpanProcessor(sdktrace.NewBatchSpanProcessor(exporter)),
            sdktrace.WithSyncer(exporter),
            sdktrace.WithResource(resources),
        ),
    )
    return exporter.Shutdown
}

进入全屏模式 退出全屏模式

步骤 5:在 main.go 中初始化跟踪器

main.go
func main() {
    cleanup := initTracer()
    defer cleanup(context.Background())

    ......
}

进入全屏模式 退出全屏模式

第 6 步:添加 OpenTelemetry Gin 中间件

main.go
import (
    ....
  "go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
)

func main() {
    ......
    r := gin.Default()
    r.Use(otelgin.Middleware(serviceName))
    ......
}

进入全屏模式 退出全屏模式

第 7 步:设置环境变量并运行您的 Go Gin 应用程序

现在您已经使用 OpenTelemetry 检测了 Go Gin 应用程序,您需要设置一些环境变量以将数据发送到 SigNoz 后端:

SERVICE_NAME
OTEL_EXPORTER_OTLP_ENDPOINT

因为,我们已经在本地机器上安装了 SigNoz,所以我们使用上面的 IP。如果您在另一台机器上安装 SigNoz,您可以使用相关 IP 对其进行更新。

因此,最终的运行命令如下所示:

SERVICE_NAME=goGinApp INSECURE_MODE=true OTEL_EXPORTER_OTLP_ENDPOINT=localhost:4317 go run main.go

进入全屏模式 退出全屏模式

而且,恭喜!您已经检测了示例 Golang 应用程序。

/books

向 span 添加自定义属性和自定义事件

也可以将自定义属性或标签设置为跨度。要添加自定义属性和事件,请按照以下步骤操作:

第 1 步:导入跟踪和属性库

import (
    ...
    "go.opentelemetry.io/otel/attribute"
    "go.opentelemetry.io/otel/trace"
)

进入全屏模式 退出全屏模式

第 2 步:从上下文中获取当前跨度

span := trace.SpanFromContext(c.Request.Context())

进入全屏模式 退出全屏模式

第 3 步:设置当前属性

span.SetAttributes(attribute.String("controller", "books"))

进入全屏模式 退出全屏模式

SigNoz 仪表板可用于跟踪这些自定义属性。

[](https://res.cloudinary.com/practicaldev/image/fetch/s--nV1_gVqi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://signoz .io/img/blog/2022/05/opentelemetry_go_custom_attributes.webp)

Tags

我们还可以使用它自己的属性在 span 上设置自定义事件。

span.AddEvent("This is a sample event", trace.WithAttributes(attribute.Int("pid", 4328), attribute.String("sampleAttribute", "Test")))

进入全屏模式 退出全屏模式

您还可以在 SigNoz 仪表板上查看这些自定义事件。

[](https://res.cloudinary.com/practicaldev/image/fetch/s--Sljijayl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://signoz .io/img/blog/2022/05/opentelemetry_go_events.webp)

Events
Events

使用 SigNoz 仪表板监控您的 Go 应用程序

通过上述步骤,您已使用 OpenTelemetry 检测您的 Go 应用程序。 OpenTelemetry 将收集到的数据发送到 SigNoz,SigNoz 可用于存储和可视化它。让我们看看 SigNoz 如何帮助您监控您的 Go 应用程序。

/books

然后,您可以导航到http://localhost:3301/application(需要注册)以查看您的 Go 应用程序正在被监控。

MetricsgoGinApp

[](https://res.cloudinary.com/practicaldev/image/fetch/s--T2RH-F8P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https ://signoz.io/img/blog/2022/04/goginapp_signoz_dashboard.webp)

在 SigNoz 仪表板上监控您的 Go Gin 应用程序

Metrics

[](https://res.cloudinary.com/practicaldev/image/fetch/s--5LRj2Sgh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://signoz. io/img/blog/2022/04/gin_application_metrics.webp)

您可以监控您的 Go Gin 应用程序指标,例如应用程序延迟、每秒请求数、错误百分比等。

OpenTelemetry 也会从您的 Gin 应用程序中捕获跟踪数据。跟踪数据可以帮助您可视化用户请求如何在多服务应用程序中跨服务执行。

Traces

[](https://res.cloudinary.com/practicaldev/image/fetch/s--xOP7HC7---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://signoz .io%2520/img/blog/2022/04/gin_application_traces.webp)

使用强大的过滤器分析来自 Gin 应用程序的跟踪数据

您还可以借助火焰图和甘特图可视化跟踪数据。

[](https://res.cloudinary.com/practicaldev/image/fetch/s--xPFm-vPS--/c_limit%2Cf_auto%2Cfl_progressive% 2Cq_auto%2Cw_880/https://signoz.io/img/blog/2022/04/gin_application_flamegraph.webp)

SigNoz 仪表板上的火焰图和甘特图

结论

使用 OpenTelemetry 库,您可以检测 Go 应用程序以设置可观察性。然后,您可以使用像 SigNoz 这样的开源 APM 工具来确保您的 Go 应用程序的流畅性能。

OpenTelemetry 是为云原生应用程序设置可观察性的未来。它由一个庞大的社区提供支持,涵盖了各种各样的技术和框架。使用 OpenTelemetry,工程团队可以高枕无忧地检测多语言和分布式应用程序。

SigNoz 是一种开源可观察性工具,具有类似 SaaS 的体验。您可以通过访问其 GitHub 存储库来试用 SigNoz 👇

如果您在试用 SigNoz 时遇到任何问题,请随时写信给我们:support@signoz.io

如果您想了解有关 SigNoz 的更多信息👇

使用 OpenTelemetry 和 SigNoz 监控您的 Spring Boot 应用程序


延伸阅读

SigNoz - DataDog的开源替代品