用opentelemetry监测杜松子酒和GOR
#编程 #go #性能 #monitoring

仍在使用Jaeger/Sentry? UpTrace是一种opentelemetry跟踪工具,可将数据存储在极其高效的Clickhouse数据库中,并提供强大的过滤和分组。

Uptrace distributed tracing tool



OpentElemetry和Uptrace

OpenTelemetry是用于分布式痕迹和指标的供应商中性API。您可以使用OpenTelemetry收集痕迹,错误和日志。将数据存储数据,汇总和处理它以帮助您查明失败并找到性能瓶颈。

UpTrace是一个open source APM,并且以Opentelemetry和Clickhouse为动力的速度快速的distributed tracing tool。它是Jaeger的流行替代品,可以通过下载DEB/RPM软件包或预编译的二进制文件来为installed

什么是跟踪?

OpenTelemetry Tracing允许您查看请求如何通过不同的服务和组件,每个操作的时间安排,任何日志和错误发生时进行进展。在分布式环境中,跟踪还可以帮助您了解分布式微服务和系统之间的关系和互动。

Distributed tracing

使用跟踪,您可以将请求分解为spans span 是您的应用程序执行请求的操作(工作单位),例如数据库查询或A
网络呼叫。

跟踪是一棵跨度的树,显示了请求通过应用程序制定的路径。根跨度是跟踪中的第一个跨度。

Spans and trace

要了解有关追踪的更多信息,请参见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的链接。打开链接后,您应该看到以下内容:

Gin and GORM OpenTelemetry

下一步是什么?

接下来,您可以了解OpenTelemetry Go Tracing以创建自己的乐器或浏览社区提供的现有OpenTelemetry instrumentations