1

我正在解组一个 yaml 文件snmp.yml。我想知道是否可以就创建更好的结构获得建议。这就是我现在所拥有的,但我猜我为 Metric 创建的结构很好,但 SNMPyaml 需要更好的重组才能完全能够正确使用未编组的数据。

非常感谢这里的任何建议/反馈。先感谢您!

package system

import (
    "fmt"
    "io/ioutil"
    "log"
    "path/filepath"

    y "gopkg.in/yaml.v2"
)

//SNMPyaml struct
type SNMPyaml struct {
    Metrics Metric `yaml:"metrics"`
}

//Metric exportable
type Metric struct {
    Name string `yaml:"name,omitempty"`
    Oid  string `yaml:"oid"`
    Type string `yaml:"type"`
    Help string `yaml:"help,omitempty"`
}

// Yamlparser 
func Yamlparser() {
    // Read the snmp.yml file
    absPath, _ := filepath.Abs("./app/snmp.yml")
    yamlFile, yamlerror := ioutil.ReadFile(absPath)
    if yamlerror != nil {
        log.Fatalf("ioutil err: %v", yamlerror)
    }

    //Unmarshall

    var c SNMPyaml
    err := y.Unmarshal(yamlFile, &c)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Print(c)

}
  metrics:
  - name: sysStatClientCurConns
    oid: 1.3.6.1.4.1.3375.2.1.1.2.1.8
    type: gauge
    indexes:
      - labelname: sysStatClientCurConns
        type: gauge
  - name: sysClientsslStatCurConns
    oid: 1.3.6.1.4.1.3375.2.1.1.2.9.2
    type: gauge
    indexes:
      - labelname: sysClientsslStatCurConns
        type: gauge
  - name: sysClientSslStatTotNativeConns
    oid: 1.3.6.1.4.1.3375.2.1.1.2.9.6
    type: gauge
    indexes:
      - labelname: sysClientSslStatTotNativeConns
        type: gauge

我得到的错误是:

    2019/07/31 23:25:58 yaml: line 25: mapping values are not allowed in this context
    exit status 1
4

1 回答 1

1

在您的输入metrics中是一个序列(列表),因此您不能将其编组为单个Metric. 使用切片[]Metric::

type SNMPyaml struct {
    Metrics []Metric `yaml:"metrics"`
}

还有一个indexes字段,另一个序列,您的Metric结构中没有相应的字段,并且您有一个不必要的Help(至少在您提供的输入中没有这样的字段):

type Metric struct {
    Name    string  `yaml:"name,omitempty"`
    Oid     string  `yaml:"oid"`
    Type    string  `yaml:"type"`
    Indexes []Index `yaml:"indexes"`
}

可以使用此结构对索引进行建模的位置:

type Index struct {
    LabelName string `yaml:"labelname"`
    Type      string `yaml:"type"`
}

通过这些更改,它运行,在Go Playground上尝试,并产生以下输出:

{[{sysStatClientCurConns 1.3.6.1.4.1.3375.2.1.1.2.1.8 仪表 [{sysStatClientCurConns 仪表}]} {sysClientsslStatCurConns 1.3.6.1.4.1.3375.2.1.1.2.9.2 仪表 [{sysClientsslStatCurConns 仪表}]} {sysClientSslStatTotNativeConns 1.3.6.1.4.1.3375.2.1.1.2.9.6 量规 [{sysClientSslStatTotNativeConns 量规}]}]}

另请注意,有一个在线 YAML-to-Go 转换器,您可以在其中输入您的 YAML 源,它会生成对您的输入进行建模的 Go 数据结构:https ://mengzhuo.github.io/yaml-to-go/

生成的代码使用未命名的结构(如果您必须为其创建值,这会很痛苦),但这是一个很好的起点,您可以轻松地将它们重构为命名类型。它从您的 YAML 输入生成以下模型:

type AutoGenerated struct {
    Metrics []struct {
        Name    string `yaml:"name"`
        Oid     string `yaml:"oid"`
        Type    string `yaml:"type"`
        Indexes []struct {
            Labelname string `yaml:"labelname"`
            Type      string `yaml:"type"`
        } `yaml:"indexes"`
    } `yaml:"metrics"`
}
于 2019-08-01T06:58:39.160 回答