目前,我正在try 使用环境变量配置我的OTLP导出器.根据官方文件,这应该是可能的.

特别是,我想把重点放在OTEL_EXPORTER_OTLP_ENDPOINT个,也就是allowed for the OTLPtrace exporter个.根据the comments in their code,环境变量优先于代码中设置的任何其他值.

我用Go编写了一个非常基本的HTTP应用程序,它是用OpenTelemeter编写的.当我在如下代码中显式指定导出器终结点时:

exporter, err := otlptrace.New(
        context.Background(),
        otlptracegrpc.NewClient(
            otlptracegrpc.WithInsecure(),
            otlptracegrpc.WithEndpoint("My Endpoint"),
        ),
    )

仪器就像那样工作得很好.但是,如果我从代码中删除otlptracegrpc.NewClient配置,它不会 Select 在环境中设置的值,这些值设置如下:

OTEL_EXPORTER_OTLP_ENDPOINT="my endpoint"

因此,当我在调试器中运行此应用程序时,我可以看到Exporter客户端有一个空值作为终结点,但我可以在我的程序中获取它们,如下所示:

exporterEndpoint := os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT")

我将其解释为在执行代码时变量实际存在,这是我主要担心的.

这是为什么?我是不是漏掉了什么?我是否应该以不同的方式填充环境变量(我看到官方文档中有环境变量的"选项",但没有示例)?

推荐答案

根据我从您的代码中看到的,您正在try 通过GRPC调用联系OTLP导出器.如果您看到,在他们的文档中,他们在第71行写道:

如果使用WithGRPCConn,则此选项无效.

这意味着您可以完全避免将该变量传递给otlptracegrpc.NewClient函数.我用下面的代码实例化了一个GRPC客户端,它可以工作:

func newOtlpExporter(ctx context.Context) (trace.SpanExporter, error) {
    client := otlptracegrpc.NewClient(otlptracegrpc.WithInsecure(), otlptracegrpc.WithDialOption(grpc.WithBlock()))
    exporter, err := otlptrace.New(ctx, client)
    if err != nil {
        panic(err)
    }
    return exporter, err
}

Back to your question, you're right with your guess but only if you're sending metrics, traces, and so on through HTTPS calls.
Let me know if this helps to solve the issue or if anything else is needed!

编辑1

I overlooked this. The comment you linked in the question is taken from the wrong file. The correct line is this: https://github.com/open-telemetry/opentelemetry-go/blob/48a05478e238698e02b4025ac95a11ecd6bcc5ad/exporters/otlp/otlptrace/otlptracegrpc/options.go#L71
As you can see, the comment is clearer and you have only two options:

  1. 提供您自己的端点地址
  2. 使用缺省值localhost:0.0.0.0:4317

如果有帮助,请让我知道!

Go相关问答推荐

无法找到与golang、nginx和postquist进行的docker-compose./主要

如何从google.golang.org/grpc/stats包中将golang中不同事件的输出进行组合,以获取func HandlePRC

Go汇编器命名为Constants

Pulumi-S3-当策略依赖于访问点时,如何将AccesspintPolicy附加到访问点

Go-Colly:将数据切片为POST请求

macOS上GoLand 2023.3.4中的代码导航

Go 是否提供了标准或事实上的方法来处理单个语句中的错误(即内联错误处理)?

如何测试 Zerolog 记录器引发类型错误的日志(log)事件?

go-jwt 令牌验证错误 - 令牌签名无效:密钥类型无效

在密钥不存在时处理 PATCH 部分更新

如何使用名称具有包名称的嵌套 struct 启动 go struct

如何确定作为函数参数传递的指针是否正在被修改或副本是否正在被修改?

如何过滤来自 fsnotify 的重复系统消息

Go 中 SDL Surface 的 OpenGL 纹理

如何从 tinygo webassembly 目标返回对象

什么是无效字符实体 &ccb

Go:如何创建一个可以提供配置文件中描述的 url 的服务器

Go模板中的浮点除法

在 go (1.18) 的泛型上实现多态的最佳方法是什么?

是否存在一个Go泛型类型约束,该约束捕获了将类型用作映射中的键的能力?