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.
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
dns:
refresh: 2m15s
nameserver: 1.1.1.1
ping:
interval: 2s
timeout: 3s
history-size: 42
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]
ping_rtt_best_seconds
: Best round trip time in secondsping_rtt_worst_seconds
: Worst round trip time in secondsping_rtt_mean_seconds
: Mean round trip time in secondsping_rtt_std_deviation_seconds
: Standard deviation in secondsping_loss_ratio
: Packet loss as a value from 0.0 to 1.0
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).
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
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
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
To run the ping_exporter in Kubernetes, you can use the supplied helm chart
- Helm v3.0.0+
To install the chart with the release name ping-exporter
:
$ helm repo add ping-exporter "https://raw.githubusercontent.com/czerwonk/ping_exporter/master/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
...
Key | Type | Default | Description |
---|---|---|---|
affinity | object | {} |
Affinity |
args | list | [] |
Add additional command-line arguments when running ping_exporter |
config | object | see values.yaml | Contains the contents of ping_exporter's config file |
fullnameOverride | string | "" |
String to fully override "ping-exporter.fullname" |
image.repository | string | "czerwonk/ping_exporter" |
String to override the docker image repository |
image.pullPolicy | string | "IfNotPresent" |
String to override the pullPolicy |
image.tag | string | "" |
Overrides the ping_exporter image tag whose default is the chart appVersion |
imagePullSecrets | list | [] |
If defined, uses a secret to pull an image from a private Docker registry or repository |
ingress.enabled | bool | false |
Enable an ingress resource for the ping_exporter |
ingress.className | string | "" |
Defines which ingress controller will implement the resource |
ingress.annotations | object | {} |
Annotations to be added to the ingress resource |
ingress.hosts | list | [{"host": "chart-example.local", "paths":[{"path": "/", "pathType": "ImplementationSpecific"}]}] |
Defines the ingress hosts and path to proxy |
ingress.tls | list | [] |
Defines the secret(s) containing TLS certs for the ingress host |
nameOverride | string | "" |
Provide a name in place of ping-exporter |
podAnnotations | object | {} |
Annotations to be added to ping_exporter pods |
podSecurityContext | object | {} |
Sets the container-level security context |
replicaCount | number | 1 |
Override the number of replicas running |
resources | object | {} |
Defines the ping_exporter pod's resource cpu/memory limits and requests |
nodeSelector | object | {} |
Node selector |
securityContext.capabilities | object | {"add": ["CAP_NET_RAW"]} |
This object overrided the pod's security context capabilities |
service.type | string | "ClusterIP" |
Sets the type of kubernetes service which is created for ping_exporter |
service.port | number | 9427 |
Sets the port in which the kubernetes service will listen on and communicate with the ping_exporter pod |
service.annotations | object | {} |
Annotations applied to the kubernetes service |
serviceAccount.create | bool | true |
Create a service account for the application |
serviceAccount.annotations | object | {} |
Annotations applied to created service account |
serviceAccount.name | string | "" |
Overrides the application's service account name which defaults to "ping-exporter.fullname" |
tolerations | list | [] |
Tolerations |
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"
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).
Previous versions of this exporter provided an older form of the RTT metrics as:
ping_rtt_ms
: Round trip times in millis
This metric had a label type
with one of the following values:
best
denotes best round trip timeworst
denotes worst round trip timemean
denotes mean round trip timestd_dev
denotes standard deviation
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]
Simply fork and create a pull-request. We'll try to respond in a timely fashion.
MIT License, Copyright (c) 2018 Philip Berndroth pberndro Daniel Czerwonk dan_nrw