Skip to content

[config] configuration yaml format needs attention to template hostnames properly #129

@daveoy

Description

@daveoy

when trying to use the current yaml unmarshal with target labels, users run into templating issues with the helm chart in its current format.

adding a target that has labels, but uses a hostname:

- kubernetes.default:
    resolver: k8s

results in the following configmap:

apiVersion: v1
data:
  config.yml: |
    ping:
      history-size: 42
      interval: 2s
      payload-size: 120
      timeout: 3s
    dns:
      nameserver: 1.1.1.1
      refresh: 2m15s
    targets:
      - 8.8.8.8
      - 8.8.4.4
      - 2001:4860:4860::8888
      - 2001:4860:4860::8844
      - google.com
      - kubernetes:
          default:
            resolver: k8s

i have a proposed fix to this issue here config/target.go:

// UnmarshalYAML implements yaml.Unmarshaler interface.
func (t *TargetConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
	// If the input is a string, treat it as the Addr
	var s string
	if err := unmarshal(&s); err == nil {
		t.Addr = s
		t.Labels = nil
		return nil
	}
	// Temporary map to capture raw data
	raw := make(map[string]string)
	if err := unmarshal(&raw); err != nil {
		return err
	}

	// Extract "host" key into Addr
	if addr, ok := raw["host"]; ok {
		t.Addr = addr
		delete(raw, "host") // Remove from labels
	}

	// Store remaining keys as labels
	t.Labels = raw
	return nil
}

which would be a breaking change for people who use labels, but would provide better templating ability and IMO be easier to follow and work with. the above config then becomes (or config for using labels in general):

config:
  targets:
    - 8.8.8.8
    - 8.8.4.4
    - 2001:4860:4860::8888
    - 2001:4860:4860::8844
    - google.com
    - host: www.facebook.com
      mylabel: testlabel
    - host: kubernetes.default
      resolver: k8s

  dns:
    refresh: 2m15s
    nameserver: 1.1.1.1

  ping:
    interval: 2s
    timeout: 3s
    history-size: 42
    payload-size: 120

which produces a configmap:

apiVersion: v1
data:
  config.yml: |
    ping:
      history-size: 42
      interval: 2s
      payload-size: 120
      timeout: 3s
    dns:
      nameserver: 1.1.1.1
      refresh: 2m15s
    targets:
      - 8.8.8.8
      - 8.8.4.4
      - 2001:4860:4860::8888
      - 2001:4860:4860::8844
      - google.com
      - host: www.facebook.com
        mylabel: testlabel
      - host: kubernetes.default.svc.cluster.local
        resolver: k8s

and successfully parses down to metrics:

# HELP ping_loss_ratio Packet loss from 0.0 to 1.0
# TYPE ping_loss_ratio gauge
ping_loss_ratio{ip="142.250.191.206",ip_version="4",mylabel="",resolver="",target="google.com"} 0
ping_loss_ratio{ip="157.240.254.35",ip_version="4",mylabel="testlabel",resolver="",target="www.facebook.com"} 0
ping_loss_ratio{ip="172.17.0.5",ip_version="4",mylabel="",resolver="k8s",target="kubernetes.default.svc.cluster.local"} 0
ping_loss_ratio{ip="2001:4860:4860::8844",ip_version="6",mylabel="",resolver="",target="2001:4860:4860::8844"} 1
ping_loss_ratio{ip="2001:4860:4860::8888",ip_version="6",mylabel="",resolver="",target="2001:4860:4860::8888"} 1
ping_loss_ratio{ip="2607:f8b0:4009:81c::200e",ip_version="6",mylabel="",resolver="",target="google.com"} 1
ping_loss_ratio{ip="2a03:2880:f356:1:face:b00c:0:25de",ip_version="6",mylabel="testlabel",resolver="",target="www.facebook.com"} 1
ping_loss_ratio{ip="8.8.4.4",ip_version="4",mylabel="",resolver="",target="8.8.4.4"} 0
ping_loss_ratio{ip="8.8.8.8",ip_version="4",mylabel="",resolver="",target="8.8.8.8"} 0
# HELP ping_rtt_best_seconds Best round trip time in seconds
# TYPE ping_rtt_best_seconds gauge
ping_rtt_best_seconds{ip="142.250.191.206",ip_version="4",mylabel="",resolver="",target="google.com"} 0.0021468479633331298
ping_rtt_best_seconds{ip="157.240.254.35",ip_version="4",mylabel="testlabel",resolver="",target="www.facebook.com"} 0.002195908069610596
ping_rtt_best_seconds{ip="172.17.0.5",ip_version="4",mylabel="",resolver="k8s",target="kubernetes.default.svc.cluster.local"} 6.050999835133553e-05
ping_rtt_best_seconds{ip="8.8.4.4",ip_version="4",mylabel="",resolver="",target="8.8.4.4"} 0.0020604650974273683
ping_rtt_best_seconds{ip="8.8.8.8",ip_version="4",mylabel="",resolver="",target="8.8.8.8"} 0.00217268705368042
# HELP ping_rtt_mean_seconds Mean round trip time in seconds
# TYPE ping_rtt_mean_seconds gauge
ping_rtt_mean_seconds{ip="142.250.191.206",ip_version="4",mylabel="",resolver="",target="google.com"} 0.0023349974155426026
ping_rtt_mean_seconds{ip="157.240.254.35",ip_version="4",mylabel="testlabel",resolver="",target="www.facebook.com"} 0.002380847692489624
ping_rtt_mean_seconds{ip="172.17.0.5",ip_version="4",mylabel="",resolver="k8s",target="kubernetes.default.svc.cluster.local"} 0.00011093642562627793
ping_rtt_mean_seconds{ip="8.8.4.4",ip_version="4",mylabel="",resolver="",target="8.8.4.4"} 0.002241145133972168
ping_rtt_mean_seconds{ip="8.8.8.8",ip_version="4",mylabel="",resolver="",target="8.8.8.8"} 0.002362915277481079
# HELP ping_rtt_std_deviation_seconds Standard deviation in seconds
# TYPE ping_rtt_std_deviation_seconds gauge
ping_rtt_std_deviation_seconds{ip="142.250.191.206",ip_version="4",mylabel="",resolver="",target="google.com"} 0.00013656458258628844
ping_rtt_std_deviation_seconds{ip="157.240.254.35",ip_version="4",mylabel="testlabel",resolver="",target="www.facebook.com"} 0.00013933387398719788
ping_rtt_std_deviation_seconds{ip="172.17.0.5",ip_version="4",mylabel="",resolver="k8s",target="kubernetes.default.svc.cluster.local"} 3.0496323481202125e-05
ping_rtt_std_deviation_seconds{ip="8.8.4.4",ip_version="4",mylabel="",resolver="",target="8.8.4.4"} 0.00011795162409543991
ping_rtt_std_deviation_seconds{ip="8.8.8.8",ip_version="4",mylabel="",resolver="",target="8.8.8.8"} 9.476055949926377e-05
# HELP ping_rtt_worst_seconds Worst round trip time in seconds
# TYPE ping_rtt_worst_seconds gauge
ping_rtt_worst_seconds{ip="142.250.191.206",ip_version="4",mylabel="",resolver="",target="google.com"} 0.0027680320739746096
ping_rtt_worst_seconds{ip="157.240.254.35",ip_version="4",mylabel="testlabel",resolver="",target="www.facebook.com"} 0.002882652997970581
ping_rtt_worst_seconds{ip="172.17.0.5",ip_version="4",mylabel="",resolver="k8s",target="kubernetes.default.svc.cluster.local"} 0.00018282100558280945
ping_rtt_worst_seconds{ip="8.8.4.4",ip_version="4",mylabel="",resolver="",target="8.8.4.4"} 0.002826992988586426
ping_rtt_worst_seconds{ip="8.8.8.8",ip_version="4",mylabel="",resolver="",target="8.8.8.8"} 0.0025727999210357665
# HELP ping_up ping_exporter version
# TYPE ping_up gauge
ping_up{version="1.1.3"} 1

would you like me to PR this solution?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions