Not able to read TOML file using Go with BurntSushi library

牧云@^-^@ 提交于 2021-01-28 07:08:46

问题


I am using the BurntSushi library to load a TOML configuration file in my GO application. I have followed the instructions on the library to write the structs and the configuration toml file itself. I am running into some trouble, and I cant seem to find the source of my issues.

Here are the details:

Structs:

package main


//ConfigurationParameters provides the struct to hold configuration parameters from config file
type ConfigurationParameters struct {
    Title string
    //serviceDiscovery captures configuration parameters needed for service discovery registration with Consul
    ServiceDiscovery ConsulConf `toml:"ServiceDiscovery"`
    //metadataReporting captures which metadata to be registered with service into consul for use during discovery
    MetadataReporting MetaDataConf `toml:"MetadataReporting"`
    //awsTagsToLabels captures the aws tags that should be added to reported metrics as Labels
    AwsTagsToLabels LabelConf `toml:"AwsTagsToLabels"`
    //collectors captures the list of collectors to use
    Collectors CollectorConf `toml:"Collectors"`
    //service captures agent related configurations
    Service ServiceConf `toml:"Service"`
}

//ConsulConf captures configuration parameters needed for service discovery registration with Consul
type ConsulConf struct {
    enabled    bool
    endpoint   string
    port       int
    datacenter string
    serviceID  string
}
//MetaDataConf captures which metadata to be registered with service into consul for use during discovery
    type MetaDataConf struct {
        enabled   bool
        awsregion string
    }
//LabelConf captures the aws tags that should be added to reported metrics as Labels
type LabelConf struct {
    enabled       bool
    refreshPeriod int
}

//CollectorConf captures the list of collectors to use
type CollectorConf struct {
    goCollectionEnabled       bool
    exporterCollectionEnabled bool
    wmiCollectionEnabled      bool
    agentCollectionEnabled    bool
    enabledCollectors         string
    metricMap                 []MetricMap
}

//MetricMap captures a mapping between one or more WMI metrics and the name it should be reported with
type MetricMap struct {
    wmiMetricName  []string
    exportName     string
    dropMetric     bool
    computedMetric bool
    computeLogic   string
}

//ServiceConf captures agent related configurations
type ServiceConf struct {
    listenIP           string
    listenPort         int
    metricPath         string
    collectionInterval int
    serviceName        string
}

and the configuration toml file:

Title = "WMI Exporter Configuration"

[ServiceDiscovery]
    enabled = true
    endpoint = "my.consul.server"
    port = 5500
    datacenter = "ucm-west"
    serviceID = "ucm.agent.wmiExporter"

[MetadataReporting]
    enabled = true
    awsregion = "us-west-2"

[AwsTagsToLabels]
    enabled = true
    refreshPeriod = 3600

[Collectors]
    goCollectionEnabled = true
    exporterCollectionEnabled = true
    wmiCollectionEnabled = true
    agentCollectionEnabled = false
    enabledCollectors   = "cpu,os"
    [Collectors.MetricMap.0]
        wmiMetricName = ["test"]
        exportName = "export_test"

[Service]
    listenPort =  9103
    metricPath = "/metrics"
    collectionInterval = 60
    serviceName = "wmi_exporter"

And the code that reads the config file:

// InitializeFromConfig reads configuration parameters from configuration file and initializes this service
func InitializeFromConfig(configfile string) ConfigurationParameters {
    conf := ConfigurationParameters{}

    if configfile == "" {
        return conf
    }

    _, err := toml.DecodeFile(configfile, &conf)
    if err != nil {
        log.Fatalf("Cannot parse configuration file at %s. Error=%s", configfile, err)
    }
    //at this point, conf is a fully loaded configuration now; now initialize everything from conf
    return conf
}

The issue I am facing is that only the value for the Title attribute gets mapped into the GO struct members. All of the other configs stay unmapped. Looking at all of the examples on github for BurntSushi and (Go) How to use toml files?, I cant see any difference from what I am currently doing in code.

I also used the tomlv validator from the BurntSushi package to look at the types from the TOML file, and I believe they look correct.

Datatypes:

Title                                             String
ServiceDiscovery                                  Hash
    ServiceDiscovery.enabled                      Bool
    ServiceDiscovery.endpoint                     String
    ServiceDiscovery.port                         Integer
    ServiceDiscovery.datacenter                   String
    ServiceDiscovery.serviceID                    String
MetadataReporting                                 Hash
    MetadataReporting.enabled                     Bool
    MetadataReporting.awsregion                   String
AwsTagsToLabels                                   Hash
    AwsTagsToLabels.enabled                       Bool
    AwsTagsToLabels.refreshPeriod                 Integer
Collectors                                        Hash
    Collectors.goCollectionEnabled                Bool
    Collectors.exporterCollectionEnabled          Bool
    Collectors.wmiCollectionEnabled               Bool
    Collectors.agentCollectionEnabled             Bool
    Collectors.enabledCollectors                  String
        Collectors.MetricMap.0                    Hash
            Collectors.MetricMap.0.wmiMetricName  Array
            Collectors.MetricMap.0.exportName     String
Service                                           Hash
    Service.listenPort                            Integer
    Service.metricPath                            String
    Service.collectionInterval                    Integer
    Service.serviceName                           String

I tried debugging into the BurntSushi package code, but it was not very helpful (the Delve debugger was not able to display some of the variables in that package, and seemed to randomly jump between the lines in that package).

Any help or pointers on what I could be doing wrong?

Thanks.


回答1:


You need to export any fields that you want BurntSushi/toml to unmarshal into, including subfields:

//ConfigurationParameters provides the struct to hold configuration parameters from config file
type ConfigurationParameters struct {
    Title string
    //serviceDiscovery captures configuration parameters needed for service discovery registration with Consul
    ServiceDiscovery ConsulConf `toml:"ServiceDiscovery"`
    //metadataReporting captures which metadata to be registered with service into consul for use during discovery
    MetadataReporting MetaDataConf `toml:"MetadataReporting"`
    //awsTagsToLabels captures the aws tags that should be added to reported metrics as Labels
    AwsTagsToLabels LabelConf `toml:"AwsTagsToLabels"`
    //collectors captures the list of collectors to use
    Collectors CollectorConf `toml:"Collectors"`
    //service captures agent related configurations
    Service ServiceConf `toml:"Service"`
}

//ConsulConf captures configuration parameters needed for service discovery registration with Consul
type ConsulConf struct {
    Enabled    bool
    Endpoint   string
    Port       int
    Datacenter string
    ServiceID  string
}

//MetaDataConf captures which metadata to be registered with service into consul for use during discovery
type MetaDataConf struct {
    Enabled   bool
    Awsregion string
}

//LabelConf captures the aws tags that should be added to reported metrics as Labels
type LabelConf struct {
    Enabled       bool
    RefreshPeriod int
}

//CollectorConf captures the list of collectors to use
type CollectorConf struct {
    GoCollectionEnabled       bool
    ExporterCollectionEnabled bool
    WmiCollectionEnabled      bool
    AgentCollectionEnabled    bool
    EnabledCollectors         string
    MetricMap                 []MetricMap
}

//MetricMap captures a mapping between one or more WMI metrics and the name it should be reported with
type MetricMap struct {
    WmiMetricName  []string
    ExportName     string
    DropMetric     bool
    ComputedMetric bool
    ComputeLogic   string
}

//ServiceConf captures agent related configurations
type ServiceConf struct {
    ListenIP           string
    ListenPort         int
    MetricPath         string
    CollectionInterval int
    ServiceName        string
}

Also i'm not sure what this Collectors.MetricMap.0 syntax is supposed to represent but to unmarshal your toml values into the []MetricMap field what you want to do is something like this instead:

[[Collectors.MetricMap]]
    wmiMetricName = ["test"]
    exportName = "export_test"


来源:https://stackoverflow.com/questions/43218484/not-able-to-read-toml-file-using-go-with-burntsushi-library

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!