写点什么

DataBuff 如何结合 Opentelemetry 监控 golang 应用

作者:乘云 DataBuff
  • 2023-07-06
    浙江
  • 本文字数:2032 字

    阅读完需:约 7 分钟

DataBuff 如何结合 Opentelemetry 监控 golang 应用

01

​Opentelemetry 简介

Opentelemetry 是一个开源的观测框架,用于收集、管理和导出分布式系统中的跟踪、日志和度量数据,帮助开发人员诊断问题、分析行为和优化应用程序。Opentelemetry 正在逐渐形成行业标准,越来越多的用户考虑并进行接入。

1 优点

  • 标准化:提供统一的观测数据收集、传播和分析方法,使不同系统和工具无缝集成。

  • 多语言支持:适用于多种编程语言,如 Java、Python、Go、JavaScript 等。

  • 多云平台支持:可在多个云平台上运行,如 AWS、Azure、Google Cloud 等。

  • 高度可扩展:可添加和定制观测器、导出器和适配器,以满足特定需求和集成要求。

2 缺点

  • 学习曲线:学习和使用 Opentelemetry 可能需要一些时间和精力,特别是对于复杂的分布式系统和集成环境。

  • 配置复杂性:Opentelemetry 的配置可能相对复杂,需要一些配置和调整才能与特定应用程序和观测工具集成。

  • 运行时开销:添加跟踪代码和数据传播可能带来一定的运行时开销,对应用程序性能产生影响。


02

Opentelemetry 架构


使用 OTEL Go SDK 采集数据到 Databuff


引用自 https://opentelemetry.io/docs/

注意:这里不过多对 Opentelemetry 的架构进行解读,可以访问 OTEL 官方文档(https://opentelemetry.io/docs/)进行深入了解。


03

使用 OTEL Go SDK 采集数据到 Databuff


#01 架构

#02 代码实践

准备工作

  1. Go 环境

  2. OpenTelemetry Go SDK

  3. Gin Web 框架

  4. MySQL 数据库

  5. 确保测试环境安装了 OneAgent

步骤

1. 导入所需的包和库

printf("hello world!");
复制代码

2. 定义配置常量,用于指定 OpenTelemetry 导出器和服务名称

const OTEL_ENDPOINT = "localhost:18126"const OTEL_SERVICE = "test::ginserver"const OTEL_MID_MYSQL = "mysql"
复制代码

3. 创建 OpenTelemetry  OTLP 导出器将跟踪数据导出到指定的地址和默认资源设置:

exporter, err := otlptrace.New(    context.Background(),    otlptracehttp.NewClient(        otlptracehttp.WithInsecure(),        otlptracehttp.WithEndpoint(OTEL_ENDPOINT),    ),)​if err != nil {    log.Fatal(err)}defer exporter.Shutdown(context.Background())​resAttrs := []attribute.KeyValue{    attribute.String("service.name", OTEL_SERVICE),}res := resource.NewWithAttributes(resource.Default().SchemaURL(), resAttrs...)​
复制代码

4. 创建跟踪器提供者并设置全局提供者:

printf("hello world!");
复制代码

5. 创建 Gin 引擎并添加中间件

r := gin.Default()r.Use(otelgin.Middleware("service-name"))
复制代码

这将创建一个默认的 Gin 引擎,并使用 OpenTelemetry 中间件来自动记录每个传入请求的跟踪信息,并将服务名称设置为 "service-name",可以根据实际情况将服务名称替换为您的应用程序的名称。

6. 添加示例路由和数据库查询

为了演示分布式跟踪,添加一个示例路由和数据库查询操作。请参考以下代码:

r.GET("/hello", func(c *gin.Context) {    tracer := otel.Tracer(OTEL_MID_MYSQL)    ctx, span := tracer.Start(c.Request.Context(), "hello-span")    defer span.End()​    // 模拟数据库查询    db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/database")    if err != nil {        span.RecordError(err)        c.AbortWithStatus(http.StatusInternalServerError)        return    }    defer db.Close()​    var result string    err = db.QueryRowContext(ctx, "SELECT message FROM TableName WHERE id = ?", 1).Scan(&result)    if err != nil {        span.RecordError(err)        c.AbortWithStatus(http.StatusInternalServerError)        return    }​    span.SetAttributes(attribute.String("db.query", "SELECT message FROM TableName WHERE id = ?"))​    c.JSON(http.StatusOK, gin.H{        "message": result,    })})​
复制代码

本示例中,我们使用 OpenTelemetry 的 Tracer 创建一个跟踪器。在路由处理函数中,我们开始一个名为 "hello-span" 的跟踪 span,并在结束后关闭它。在数据库查询操作中,我们使用上下文包装了查询,并将查询语句设置为 span 的属性。最后,我们返回查询结果作为 JSON 响应。

7. 运行应用程序:

printf("hello world!");
复制代码

您现在可以访问 http://localhost:8080/hello 来测试应用程序。每个请求都将自动记录为一个跟踪 span,并将跟踪数据导出到指定的地址。

以上展示了使用 OpenTelemetry Go SDK 为应用程序添加分布式跟踪的基本教程。可以根据需要进一步扩展和自定义跟踪功能。


#03 效果展示




参考:

  • [OneAgent]https://mp.weixin.qq.com/s/dRVQYUu3Ph10gACokFJFCg

  • [opentelemetry doc]https://opentelemetry.io/docs/

  • [github.opentelemetry-go-contrib]https://github.com/open-telemetry/opentelemetry-go-contrib

  • [github.opentelemetry-go]https://github.com/open-telemetry/opentelemetry-go

  • [gopkg]https://pkg.go.dev/go.opentelemetry.io/otel


发布于: 刚刚阅读数: 4
用户头像

让云运维更简单 2023-06-25 加入

云观测领导者

评论

发布
暂无评论
DataBuff 如何结合 Opentelemetry 监控 golang 应用_云原生_乘云 DataBuff_InfoQ写作社区