Home

Awesome

ping_exporter

Go Report Card

Prometheus exporter for ICMP echo requests using https://github.com/digineo/go-ping

This is a simple server that scrapes go-ping stats and exports them via HTTP for Prometheus consumption. The go-ping library is build and maintained by Digineo GmbH. For more information check the source code.

Getting Started

Config file

Targets can be specified in a YAML based config file:

targets:
  - 8.8.8.8
  - 8.8.4.4
  - 2001:4860:4860::8888
  - 2001:4860:4860::8844
  - google.com:
      asn: 15169

dns:
  refresh: 2m15s
  nameserver: 1.1.1.1

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

options:
  disableIPv6: false

Note: domains are resolved (regularly) to their corresponding A and AAAA records (IPv4 and IPv6). By default, ping_exporter uses the system resolver to translate domain names to IP addresses. You can override the resolver address by specifying the --dns.nameserver flag when starting the binary, e.g.

$ # use Cloudflare's public DNS server
$ ./ping_exporter --dns.nameserver=1.1.1.1:53 [other options]

The configuration file is watched via inotify. If the configuration is changed, ping_exporter will update the targets. To change any global options like the ping interval or history size, you must restart the exporter.

Exported metrics

Each metric has labels ip (the target's IP address), ip_version (4 or 6, corresponding to the IP version), and target (the target's name).

Additionally, a ping_up metric reports whether the exporter is running (and in which version).

Shell

To run the exporter:

$ ./ping_exporter [options] target1 target2 ...

or

$ ./ping_exporter --config.path my-config-file [options]

Help on flags:

$ ./ping_exporter --help

Getting the results for testing via cURL:

$ curl http://localhost:9427/metrics

Running as non-root user

On Linux systems CAP_NET_RAW is required to run ping_exporter as unpriviliged user.

# setcap cap_net_raw+ep /path/to/ping_exporter

When run through a rootless Docker implementation on Linux, the flag --cap-add=CAP_NET_RAW should be added to the docker run invocation.

If being invoked via systemd, you can alternately just add the following settings to the service's unit file in the [Service] section:

CapabilityBoundingSet=CAP_NET_RAW
AmbientCapabilities=CAP_NET_RAW

Docker

https://hub.docker.com/r/czerwonk/ping_exporter

To run the ping_exporter as a Docker container, run:

$ docker run -p 9427:9427 -v /path/to/config/directory:/config:ro --name ping_exporter czerwonk/ping_exporter

Kubernetes

To run the ping_exporter in Kubernetes, you can use the supplied helm chart

Prerequisites

Installing the chart

To install the chart with the release name ping-exporter:

$ helm repo add ping-exporter "https://raw.githubusercontent.com/czerwonk/ping_exporter/main/dist/charts/"
"ping-exporter" has been added to your repositories

$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "ping-exporter" chart repository
Update Complete. ⎈Happy Helming!⎈

$ helm install ping-exporter ping-exporter/ping-exporter
NAME: ping-exporter
...

General parameters

KeyTypeDefaultDescription
affinityobject{}Affinity
argslist[]Add additional command-line arguments when running ping_exporter
configobjectsee values.yamlContains the contents of ping_exporter's config file
fullnameOverridestring""String to fully override "ping-exporter.fullname"
image.repositorystring"czerwonk/ping_exporter"String to override the docker image repository
image.pullPolicystring"IfNotPresent"String to override the pullPolicy
image.tagstring""Overrides the ping_exporter image tag whose default is the chart appVersion
imagePullSecretslist[]If defined, uses a secret to pull an image from a private Docker registry or repository
ingress.enabledboolfalseEnable an ingress resource for the ping_exporter
ingress.classNamestring""Defines which ingress controller will implement the resource
ingress.annotationsobject{}Annotations to be added to the ingress resource
ingress.hostslist[{"host": "chart-example.local", "paths":[{"path": "/", "pathType": "ImplementationSpecific"}]}]Defines the ingress hosts and path to proxy
ingress.tlslist[]Defines the secret(s) containing TLS certs for the ingress host
nameOverridestring""Provide a name in place of ping-exporter
podAnnotationsobject{}Annotations to be added to ping_exporter pods
podSecurityContextobject{}Sets the container-level security context
replicaCountnumber1Override the number of replicas running
resourcesobject{}Defines the ping_exporter pod's resource cpu/memory limits and requests
nodeSelectorobject{}Node selector
securityContext.capabilitiesobject{"add": ["CAP_NET_RAW"]}This object overrided the pod's security context capabilities
service.typestring"ClusterIP"Sets the type of kubernetes service which is created for ping_exporter
service.portnumber9427Sets the port in which the kubernetes service will listen on and communicate with the ping_exporter pod
service.annotationsobject{}Annotations applied to the kubernetes service
serviceAccount.createbooltrueCreate a service account for the application
serviceAccount.annotationsobject{}Annotations applied to created service account
serviceAccount.namestring""Overrides the application's service account name which defaults to "ping-exporter.fullname"
tolerationslist[]Tolerations

Changes from previous versions

ping_loss_ratio vs ping_loss_percent

Previous versions of the exporter reported packet loss via a metric named ping_loss_percent. This was somewhat misleading / wrong, because it never actually reported a percent value (it was always a value between 0 and 1). To make this more clear, and to match with Prometheus best practices, this metric has been renamed to ping_loss_ratio instead.

If you had already been using an earlier version and want to continue to record this metric in Prometheus using the old name, this can be done using the metric_relabel_configs options in the Prometheus config, like so:

- job_name: "ping"
  static_configs:
    <...>
  metric_relabel_configs:
    - source_labels: [__name__]
      regex: "ping_loss_ratio"
      target_label: __name__
      replacement: "ping_loss_percent"

Time units

As per the recommendations for Prometheus best practices, the exporter reports time values in seconds by default. Previous versions defaulted to reporting milliseconds by default (with metric names ending in _ms instead of _seconds), so if you are upgrading from an older version, this may require some adjustment.

It is possible to change the ping exporter to report times in milliseconds instead (this is not recommended, but may be useful for compatibility with older versions, etc). To do this, the metrics.rttunit command-line switch can be used:

$ # keep using seconds (default)
$ ./ping_exporter --metrics.rttunit=s [other options]
$ # use milliseconds instead
$ ./ping_exporter --metrics.rttunit=ms [other options]
$ # report both millis and seconds
$ ./ping_exporter --metrics.rttunit=both [other options]

If you used the ping_exporter in the past, and want to migrate, start using --metrics.rttunit=both now. This gives you the opportunity to update all your alerts, dashboards, and other software depending on ms values to use proper scale (you "just" need to apply a factor of 1000 on everything). When you're ready, you just need to switch to --metrics.rttunit=s (or just remove the command-line option entirely).

Deprecated metrics

Previous versions of this exporter provided an older form of the RTT metrics as:

This metric had a label type with one of the following values:

These metrics are no longer exported by default, but can be enabled for backwards compatibility using the --metrics.deprecated command-line flag:

$ # also export deprecated metrics
$ ./ping_exporter --metrics.deprecated=enable [other options]
$ # or omit deprecated metrics (default)
$ ./ping_exporter --metrics.deprecated=disable [other options]

Contribute

Simply fork and create a pull-request. We'll try to respond in a timely fashion.

License

MIT License, Copyright (c) 2018 Philip Berndroth pberndro Daniel Czerwonk dan_nrw