Instana / opentelemetry集成用于GO应用程序
#go #opentelemetry #observability #apm

Image description

Image description
IBM的Instana应用程序资源监控(ARM)工具利用自动化和人工智能来提供可见性和可行的信息DevOps团队来管理动态应用程序。 Instana可以在部署目标平台的代理后立即开始监视平台,而VOILã就是这样。

但是,如果客户已经构建了几个微服务应用程序,这些应用程序是由Instana部署在非观察基础架构并已经生成OpenTelemetry跨度上的?

怎么办?

OpentElemetry是API,SDK和工具的集合。使用它来仪器,生成,收集和导出遥测数据(指标,日志和痕迹)来帮助您分析软件的性能和行为。

这是一个只想知道这是否可行的客户要求的。为了向客户证明这一点,我去了官方文档,并尝试以Go编程语言进行示例尝试。

Instana可以与OpenTelemetry无缝集成,还可以增强OpenTelemetry的数据。这种集成进一步增强了数据采集功能。

官方文件在这里:OpenTelemetry Integration for Go Application也指向public GitHub repository

显然,第一件事是克隆存储库。

git clone https://github.com/instana/go-otel-exporter.git

我在笔记本电脑上有一个旧版本的Go,我将其更新为20,以便制作这项工作。

在将代码克隆到以下的文件夹中(如GitHub页面上所述)

 go get github.com/instana/go-otel-exporter

使用克隆的存储库,main.go应用在示例中子文件夹。根据您的工作方式,您可能需要创建以下 go.work 文件。

// go.work

go 1.20

use ./example

提供的 main.go github repo上的文件如下;

package main

import (
    "context"
    "time"

    instana "github.com/instana/go-otel-exporter"
    "go.opentelemetry.io/otel"
    sdktrace "go.opentelemetry.io/otel/sdk/trace"
    "go.opentelemetry.io/otel/trace"
)

// This example application demonstrates how to use the Instana OTel Exporter.
// Make sure to provide the required environment variables before run the application:
// * INSTANA_ENDPOINT_URL
// * INSTANA_AGENT_KEY
func main() {
    ch := make(chan bool)
    // Acquire an instance of the Instana OTel Exporter
    exporter := instana.New()

    // Setup and bootstrap the tracer provider
    tracerProvider := sdktrace.NewTracerProvider(
        sdktrace.WithBatcher(exporter),
    )

    otel.SetTracerProvider(tracerProvider)

    ctx := context.Background()

    // Instrument something with OTel
    tracer := otel.Tracer("my-traced-tech")
    _, span := tracer.Start(ctx, "my_span", trace.WithSpanKind(trace.SpanKindServer))

    // This simulates the time that a span takes to be completed
    time.Sleep(time.Millisecond * 400)
    span.End()

    <-ch
}

所需的元素才能在Instana中进行跟踪

所需的元素使所有工作都是;

  • instana_agent_key 可以从您要使用的Instana实例/租户中检索。请按照此链接查找信息:Preparing endpoints and keys

  • instana_endpoint_url :请按以下链接找到信息:Preparing endpoints and keys

  • 您肯定希望拥有服务名称 instana_service_name

  • 最后但并非最不重要的一点是,您应该在应用程序的各个部分都有跨度,以便可以追溯到Precisel

Spans **表示代码执行的时间;换句话说,一个开始和结束时间的动作。它还包含一组由时间戳和持续时间组成的数据。**

我想要一个真正的“快速而肮脏” 版本,我做了一些更改并进行了以下内容;

package main

import (
    "context"
    "fmt"
    "os"
    "time"

    instana "github.com/instana/go-otel-exporter"
    "go.opentelemetry.io/otel"
    sdktrace "go.opentelemetry.io/otel/sdk/trace"
    "go.opentelemetry.io/otel/trace"
)

// This example application demonstrates how to use the Instana OTel Exporter.
// Make sure to provide the required environment variables before run the application:
// * INSTANA_ENDPOINT_URL
// * INSTANA_AGENT_KEY
// You can also use the INSTANA_LOG_LEVEL environment variable to set the log level. Available options are:
// * debug
// * info
// * warn
// * error
func main() {

    os.Setenv("INSTANA_AGENT_KEY", "XXXXXXXX ---- MY INSTANA SERVER AGENT KEY ------")
    os.Setenv("INSTANA_ENDPOINT_URL", "https://serverless-orange-saas.instana.io")
    os.Setenv("INSTANA_SERVICE_NAME", "AAM-SERVICE")

    fmt.Println("INSTANA_AGENT_KEY:", os.Getenv("INSTANA_AGENT_KEY"))
    fmt.Println("INSTANA_ENDPOINT_URL:", os.Getenv("INSTANA_ENDPOINT_URL"))
    fmt.Println("INSTANA_SERVICE_NAME:", os.Getenv("INSTANA_SERVICE_NAME"))

    //ch := make(chan struct{})
    // Acquire an instance of the Instana OTel Exporter
    exporter := instana.New()

    // Setup and bootstrap the tracer provider
    tracerProvider := sdktrace.NewTracerProvider(
        sdktrace.WithBatcher(exporter),
    )

    otel.SetTracerProvider(tracerProvider)

    ctx := context.Background()

    // Instrument something with OTel
    tracer := otel.Tracer("AAM-my-traced-tech")
    _, span := tracer.Start(ctx, "my_span", trace.WithSpanKind(trace.SpanKindServer))
    time.Sleep(time.Millisecond * 400)
    span.End()


    for i := 0; i < 300; i++ {
        time.Sleep(time.Millisecond * 500)
        fmt.Println("i:", i)
    }

}

执行应用程序后,请转到Instana仪表板并为您的服务做搜索过滤器。

Image description

这个示例不仅仅是基本示例。它只是表明,以任何将跟踪指标发送到 opentelemetry 的语言编写的应用程序代码很容易被修改以与 instana

我的下一步是用 python

进行相同的样本展示柜

感谢您的阅读和关注!

链接

追踪的概念:https://www.ibm.com/docs/en/instana-observability/current?topic=monitoring-traces

监视GO:https://www.ibm.com/docs/en/instana-observability/current?topic=technologies-monitoring-go#tracing