仍在使用Jaeger/Sentry? UpTrace是一种opentelemetry跟踪工具,可将数据存储在极其高效的Clickhouse数据库中,并提供强大的过滤和分组。
- What is tracing?
- OpenTelemetry and Uptrace
- Creating spans
- Example application
- Configuring OpenTelemetry
- Instrumenting Gin
- Instrumenting GORM
- Recording logs
- Running the example
- What's next
OpentElemetry和Uptrace
OpenTelemetry是用于分布式痕迹和指标的供应商中性API。您可以使用OpenTelemetry收集痕迹,错误和日志。将数据存储数据,汇总和处理它以帮助您查明失败并找到性能瓶颈。
UpTrace是一个open source APM,并且以Opentelemetry和Clickhouse为动力的速度快速的distributed tracing tool。它是Jaeger的流行替代品,可以通过下载DEB/RPM软件包或预编译的二进制文件来为installed。
什么是跟踪?
OpenTelemetry Tracing允许您查看请求如何通过不同的服务和组件,每个操作的时间安排,任何日志和错误发生时进行进展。在分布式环境中,跟踪还可以帮助您了解分布式微服务和系统之间的关系和互动。
使用跟踪,您可以将请求分解为spans。 span 是您的应用程序执行请求的操作(工作单位),例如数据库查询或A
网络呼叫。
跟踪是一棵跨度的树,显示了请求通过应用程序制定的路径。根跨度是跟踪中的第一个跨度。
要了解有关追踪的更多信息,请参见Distributed tracing using OpenTelemetry。
创建跨度
您可以使用OpenTelemetry Go Tracing API这样的创建跨度:
import "go.opentelemetry.io/otel"
var tracer = otel.Tracer("app_or_package_name")
func someFunc(ctx context.Context) error {
ctx, span := tracer.Start(ctx, "some-func")
defer span.End()
// the code you are measuring
return nil
}
示例应用程序
在本教程中,您将启动使用Gin Router和Gorm数据库客户端的toy app。您可以使用以下命令检索源代码:
git clone git@github.com:uptrace/uptrace.git
cd example/gin-gorm
配置OpentElemetry
UpTrace提供配置
的OpenTelemetry Go发行版
OpentElemetry SDK为您。安装发行版:
go get github.com/uptrace/uptrace-go
然后,每当您启动应用程序时,您都需要初始化发行版:
import "github.com/uptrace/uptrace-go/uptrace"
uptrace.ConfigureOpentelemetry(
// copy your project DSN here or use UPTRACE_DSN env var
//uptrace.WithDSN("https://<key>@uptrace.dev/<project_id>"),
uptrace.WithServiceName("myservice"),
uptrace.WithServiceVersion("v1.0.0"),
)
有关详细信息,请参见documentation。
乐器杜松子酒
您可以使用OpenTelemetry提供的OpenTelemetry Gin仪器进行托运杜松子道路由器:
import (
"github.com/gin-gonic/gin"
"go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
)
router := gin.Default()
router.Use(otelgin.Middleware("service-name"))
Otelgin仪器将在Go context.Context
中保存active span。您可以从http.Request
中检索上下文,从中提取跨度,
并使用跨度记录attributes:
func (h *Handler) Index(c *gin.Context) {
ctx := c.Request.Context()
// Extract span from the request context.
span := trace.SpanFromContext(ctx)
// Check if the span was sampled and is recording the data.
if span.IsRecording() {
span.SetAttributes(
attribute.String("string_key", "string_value"),
attribute.Int("int_key", 42),
attribute.StringSlice("string_slice_key", []string{"foo", "bar"}),
)
}
otelgin.HTML(c, http.StatusOK, indexTmpl, gin.H{
"traceURL": otelplay.TraceURL(trace.SpanFromContext(ctx)),
})
}
仪器Gorm
您可以使用OpenTelemetry GORM仪器来仪器GORM数据库客户端:
import (
"github.com/uptrace/opentelemetry-go-extra/otelgorm"
"gorm.io/gorm"
)
if err := db.Use(otelgorm.NewPlugin()); err != nil {
panic(err)
}
仪器仪器后,您应该使用WithContext
方法对propagate主动跟踪上下文:
user := new(User)
if err := h.db.WithContext(ctx).Where("username = ?", username).First(user).Error; err != nil {
_ = c.Error(err)
return
}
记录日志
您还可以使用OpenTelemetry Zap仪表记录库库记录日志消息:
// Create Zap logger.
log := otelzap.New(zap.NewExample())
// Extract the active context from the request.
ctx := c.Request.Context()
// Use the logger and the context to record log messages on the active span.
log.Ctx(ctx).Error("hello from zap",
zap.Error(errors.New("hello world")),
zap.String("foo", "bar"))
// otelzap also supports an alternative syntax.
log.ErrorContext(ctx, "hello from zap",
zap.Error(errors.New("hello world")),
zap.String("foo", "bar"))
}
运行示例
您可以使用Docker example的单个命令启动trace后端:
docker-compose up -d
,然后启动app作为ENV变量通过上Uptrace DSN:
UPTRACE_DSN=http://project2_secret_token@localhost:14317/2 go run .
该应用程序应在http://localhost:9999
上提供请求,并应呈现指向UpTrace UI的链接。打开链接后,您应该看到以下内容:
下一步是什么?
接下来,您可以了解OpenTelemetry Go Tracing以创建自己的乐器或浏览社区提供的现有OpenTelemetry instrumentations。