在这个例子中,我们将使用OpenTelemetry和Jaeger来追踪应用程序的请求流。这个应用是一个基本的Golang Rest API。我已经创建了一个简单的trace 包供你使用。它隔离了一些OpenTelemetry功能,以简化和规范整个应用程序的使用。同时,这个应用程序是开放的,可以由你自己来改进,这不是这里的主要重点
OpenTelemetry规范了遥测数据的收集和传输方式。Jaeger允许我们导出和可视化遥测数据。在我们的案例中,它是通过一组包/文件的HTTP请求跟踪。这个功能使我们能够准确地指出故障或性能问题的位置。请看下面的基本流程,这样Jaeger用户界面中的痕迹才有意义。
流程
-
用户发送一个HTTP请求。
-
控制器对象捕捉到它。(父跨度是由请求上下文创建的)
-
请求对象对其进行验证。(子跨度从延迟上下文中创建)
-
服务对象处理它。(子跨度从延迟上下文中创建)。
-
存储对象存储它。(子跨度是从延迟上下文中创建的)。
-
控制器对它作出反应。
每个步骤中的每个跨度都被关闭/结束,一旦他们的工作完成。
结构
├── 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中获得更多相关的错误信息和数据。