登录
首页 >  Golang >  Go问答

使用 Go 通过 Google PubSub 发送 OpenTelemetry 上下文

来源:stackoverflow

时间:2024-02-25 10:33:29 431浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《使用 Go 通过 Google PubSub 发送 OpenTelemetry 上下文》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

使用 Go,如何通过 Google PubSub 传播 OpenTelemetry 上下文


正确答案


为了实现这一点,我实现了 textmapcarrier 接口

// textmapcarrier is the storage medium used by a textmappropagator.
type textmapcarrier interface {
    get(key string) string
    set(key string, value string)
    keys() []string
}

最终代码为:

package whatever

import (
    "cloud.google.com/go/pubsub"
    "context"
    "go.opentelemetry.io/otel"
)

const pubsubAttribPrefix = "whatever"

// PubsubMessageCarrier injects and extracts traces from a pubsub.Message.
type PubsubMessageCarrier struct {
    msg *pubsub.Message
}

// NewPubsubMessageCarrier creates a new PubsubMessageCarrier.
func NewPubsubMessageCarrier(msg *pubsub.Message) PubsubMessageCarrier {
    return PubsubMessageCarrier{msg: msg}
}

// Get retrieves a single value for a given key.
func (c PubsubMessageCarrier) Get(key string) string {
    return c.msg.Attributes[pubsubAttribPrefix+"_"+key]
}

// Set sets an attribute.
func (c PubsubMessageCarrier) Set(key, val string) {
    c.msg.Attributes[pubsubAttribPrefix+"_"+key] = val
}

// Keys returns a slice of all keys in the carrier.
func (c PubsubMessageCarrier) Keys() []string {
    i := 0
    out := make([]string, len(c.msg.Attributes))
    for k := range c.msg.Attributes {
        out[i] = k
        i++
    }
    return out
}

func PubSubMessageInjectContext(ctx context.Context, msg *pubsub.Message) {
    otel.GetTextMapPropagator().Inject(ctx, NewPubsubMessageCarrier(msg))
}

func PubSubMessageExtractContext(ctx context.Context, msg *pubsub.Message) context.Context {
    return otel.GetTextMapPropagator().Extract(ctx, NewPubsubMessageCarrier(msg))
}

所以剩下的就是将 spanpubsub 消息中的最新 context 提供给 pubsubmessageinjectcontext。这会将数据注入到消息中。

另一边将收到的 message 馈送到新的 context 以提取数据。并使用输出 context 创建一个新的 span

注意,这不提供需要添加到指定范围的属性。像 semconv.messagingdestinationkindtopic

虽然基础知识已经在这里,但它仍然没有经过战斗测试

感谢,来自 google 开发团队的 Alex Hongcode

到这里,我们也就讲完了《使用 Go 通过 Google PubSub 发送 OpenTelemetry 上下文》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>