首页 > 解决方案 > opentelemetry-proto 导入路径和 AnyValue

问题描述

有这个回购https://github.com/open-telemetry/opentelemetry-proto

我有兴趣将数据序列化为这种结构: https://github.com/open-telemetry/opentelemetry-proto/blob/main/opentelemetry/proto/logs/v1/logs.proto 如此处所述-> https:// github.com/open-telemetry/opentelemetry-proto/blob/main/opentelemetry/proto/logs/v1/logs.proto

我生成了Go文件

make gen-go

所以这会生成文件

$GOPATH/src/github.com/open-telemetry/opentelemetry-proto/gen/go/logs/v1

我用它导入了它(虽然我知道这是错误的方法,因为生成了多个 Go 文件)

import otl "github.com/open-telemetry/opentelemetry-proto/gen/go/logs/v1"

在这个

type LogRecord struct {

有这个字段:

Body *v11.AnyValue `protobuf:"bytes,5,opt,name=body,proto3" json:"body,omitempty"`

而且我不知道如何从字符串创建该类型的变量。名称文件是字符串类型,所以这很容易:)

lr := &otl.LogRecord{
  Name : "example1",

但是身体呢?AnyValue 的定义在 github.com/open-telemetry/opentelemetry-proto/gen/go/common/v1/common.pb.go 但我不知道如何将字符串转换为这种类型。

编辑:我“认为”我想通了,但有人可以确认它是正确的吗?

package main

import (
  "fmt"
  "time"
  "io/ioutil"
  "log"
  "github.com/golang/protobuf/proto"
  pb "github.com/open-telemetry/opentelemetry-proto/gen/go/logs/v1"
  v11 "github.com/open-telemetry/opentelemetry-proto/gen/go/common/v1"

)

func main() {
  nanos := time.Now().UnixNano()
  avs := v11.AnyValue_StringValue{
    StringValue : "test",
  }
  av :=  &v11.AnyValue{
    Value : &avs,
  }
  lr := &pb.LogRecord{
    Name : "syslog1",
    TimeUnixNano : uint64(nanos),
    Body : av,
  }
  fmt.Println(lr.GetName())
  out, err:= proto.Marshal(lr)
  if err != nil {
    log.Fatal(err.Error())
  }
  if err := ioutil.WriteFile("data", out, 0644); err != nil {
        log.Fatalln("Failed to write address book:", err)
    }
}

谢谢你。:) btw 如何为该结构添加一些属性?

Attributes             []*v11.KeyValue `protobuf:"bytes,6,rep,name=attributes,proto3" json:"attributes,omitempty"`

标签: goprotocol-buffersopen-telemetry

解决方案


推荐阅读