在Golang HTTP API中实现OpenTelemetry和Jaeger追踪功能

333 阅读2分钟

在这个例子中,我们将使用OpenTelemetry和Jaeger来追踪应用程序的请求流。这个应用是一个基本的Golang Rest API。我已经创建了一个简单的trace 包供你使用。它隔离了一些OpenTelemetry功能,以简化和规范整个应用程序的使用。同时,这个应用程序是开放的,可以由你自己来改进,这不是这里的主要重点

OpenTelemetry规范了遥测数据的收集和传输方式。Jaeger允许我们导出和可视化遥测数据。在我们的案例中,它是通过一组包/文件的HTTP请求跟踪。这个功能使我们能够准确地指出故障或性能问题的位置。请看下面的基本流程,这样Jaeger用户界面中的痕迹才有意义。

流程

  1. 用户发送一个HTTP请求。

  2. 控制器对象捕捉到它。(父跨度是由请求上下文创建的)

  3. 请求对象对其进行验证。(子跨度从延迟上下文中创建)

  4. 服务对象处理它。(子跨度从延迟上下文中创建)。

  5. 存储对象存储它。(子跨度是从延迟上下文中创建的)。

  6. 控制器对它作出反应。

每个步骤中的每个跨度都被关闭/结束,一旦他们的工作完成。

结构

├── cmd

前提条件

go get -u go.opentelemetry.io/otel

文件

docker-compose.yaml

version: "3.4"

dump.sql

CREATE TABLE IF NOT EXISTS `users` (

main.go

package main

http.go

package trace

provider.go

package trace

span.go

你可能已经注意到,我为每个跨度使用了相同的全局追踪器。然而,如果你愿意,你可以为每个跨度创建一个新的追踪器。这一切都取决于你的应用需求。

package trace

user.go

package storage

controller.go

package users

request.go

package users

service.go

package users

测试

请确保你已经运行了你的docker容器和go应用程序。你可以从http://localhost:16686/ 访问Jaeger,从http://localhost:8080/api/v1/users 地址访问应用程序。起初,你不会在Jaeger用户界面上看到任何跟踪或服务。

一个有效的请求

你已经发送了一个有效的HTTP请求,而且一切都很顺利。这是你会得到的结果。




一个无效的500请求

我特意在数据库中重命名了字段名,这样storage/user.go 文件就会返回一个错误。这将有助于我在span上记录一个错误。**注意:**虽然我在controller.go 中做的大部分事情是为了演示,但实际上你应该在相关的对象/文件中使用其中的一些跟踪函数。例如,你需要在存储文件中使用AddSpanError&FailSpan 函数,而不是在控制器文件中。你会在Jaeger中获得更多相关的错误信息和数据。



参考资料