Ошибка, связанная с удалением yaml в структуру

#go #yaml #prometheus

#Вперед #yaml #prometheus

Вопрос:

Я хочу разархивировать [] байтовую переменную int struct prometheusyml. Вот определение promethuesyml и []байтовой переменной.

 type prometheusyml struct {
        Global        global          `yaml:"global,omitempty"`
        ScrapeConfigs []scrapeConfigs `yaml:"scrape_configs,omitempty"`
}

type global struct {
        ScrapeInterval     string `yaml:"scrape_interval,omitempty"`
        EvaluationInterval string `yaml:"evaluation_interval,omitempty"`
}

type scrapeConfigs struct {
        JobNmaes        string            `yaml:"job_name,omitempty"`
        RelabelConfigs  []relabelConfigs  `yaml:"relabel_configs,omitempty"`
        MetricsPath     string            `yaml:"metrics_path,omitempty"`
        Scheme          string            `yaml:"scheme,omitempty"`
        ConsulSdConfigs []consulSdConfigs `yaml:"consul_sd_configs,omitempty"`
}

type relabelConfigs struct {
        SourceLabels string `yaml:"source_labels,omitempty"`
        Action       string `yaml:"action,omitempty"`
        Regex        string `yaml:"regex,omitempty"`
        Replacement  string `yaml:"replacement,omitempty"`
        TargetLabel  string `yaml:"target_label,omitempty"`
}

type consulSdConfigs struct {
        Server   string   `yaml:"server,omitempty"`
        Services []string `yaml:"services,omitempty"`
}

# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).


scrape_configs:
  - job_name: 'consul'
    relabel_configs:
        - source_labels:  ["__meta_consul_service"]
          action: replace
          regex: "(.*)"
          replacement: '${1}'
          target_label: "service"
        - source_labels: ["__meta_consul_tags"]
          action: replace
          regex: ',(?:[^,] ,){0}([^=] )=([^,] ),.*'
          replacement: '${2}'
          target_label: '${1}'
        - source_labels: ["__meta_consul_tags"]
          action: replace
          regex: ',(?:[^,] ,){1}([^=] )=([^,] ),.*'
          replacement: '${2}'
          target_label: '${1}'
        - source_labels: ["__meta_consul_tags"]
          action: replace
          regex: ',(?:[^,] ,){2}([^=] )=([^,] ),.*'
          replacement: '${2}'
          target_label: '${1}'
    metrics_path: /metrics
    scheme: http
    consul_sd_configs:
        - server: 192.168.0.101:8500
          services:
              - cfs
  

Но когда я запустил программу. Он показывает ошибку, которая подразумевает, что source_labels нельзя разархивировать в struct . Вполне вероятно, что [«__meta_consul_tags»] не может быть переведен в строку!!!! Но что я должен сделать, чтобы исправить ошибку? И каков фактический тип?

 line 11: cannot unmarshal !!seq into string
  

Комментарии:

1. Вы объявляете поле, которое должно быть заполнено, SourceLabels как a string , но пытаетесь передать его ["__meta_consul_service"] . Поскольку имя множественное, вы не хотите использовать фрагмент строк ? Этого можно добиться, изменив строку на SourceLabels []string `yaml:"source_labels,omitempty"`

Ответ №1:

source_labels in relabel_configs явно представляет собой массив string . Итак, вам нужно заменить data type SourceLabels from string на []string . Тогда все готово.

 type relabelConfigs struct {
    SourceLabels []string `yaml:"source_labels,omitempty"`
    Action       string   `yaml:"action,omitempty"`
    Regex        string   `yaml:"regex,omitempty"`
    Replacement  string   `yaml:"replacement,omitempty"`
    TargetLabel  string   `yaml:"target_label,omitempty"`
}
  

Простое изменение этого решает вашу проблему.