Skip to content

mgumz/mtr-exporter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

d26b9e6 · Nov 25, 2024

History

46 Commits
Nov 19, 2024
Oct 31, 2024
Mar 8, 2020
Mar 8, 2020
Oct 31, 2024
Nov 25, 2024
Aug 28, 2023
Dec 23, 2022
Nov 25, 2024
Oct 31, 2024
Mar 8, 2020
Oct 31, 2024
Nov 19, 2024
Nov 25, 2024
Aug 28, 2023
Aug 28, 2023
Aug 28, 2023

Repository files navigation

mtr-exporter

Go Report Card

mtr-exporter periodically executes mtr to a given host and provides the measured results as prometheus metrics.

Usually, mtr is producing the following output:

 HOST: src.example.com       Loss%   Snt   Last   Avg  Best  Wrst StDev
 1.|-- 127.0.0.1             0.0%     2    0.6   0.6   0.6   0.7   0.1
 2.|-- 127.0.0.2             0.0%     2    6.1  10.2   6.1  14.3   5.8
 3.|-- 127.0.0.3             0.0%     2   13.0  12.3  11.6  13.0   1.0
 4.|-- 127.0.0.4             0.0%     2    7.0   9.1   7.0  11.1   2.9
 5.|-- 127.0.0.5             0.0%     2   12.5  16.5  12.5  20.6   5.7
 6.|-- 127.0.0.6             0.0%     2   19.1  18.5  17.9  19.1   0.9
 7.|-- 127.0.0.7             0.0%     2   18.3  18.2  18.0  18.3   0.2
 8.|-- 127.0.0.8             0.0%     2   89.9  61.6  33.3  89.9  40.0
 9.|-- 127.0.0.9             0.0%     2   18.5  18.3  18.1  18.5   0.2
10.|-- 127.0.0.10            0.0%     2   20.4  19.8  19.2  20.4   0.8

mtr-exporter exposes the measured values like this:

# mtr run: 2020-03-08T16:37:05.000377Z
# cmdline: /usr/local/sbin/mtr -j -c 2 -n example.com
mtr_report_duration_ms_gauge{bitpattern="0x00",dst="example.com",psize="64",src="src.example.com",tests="2",tos="0x0"} 7179 1583685425000
mtr_report_count_hubs_gauge{bitpattern="0x00",dst="example.com",psize="64",src="src.example.com",tests="2",tos="0x0"} 10 1583685425000
mtr_report_loss_gauge{bitpattern="0x00",hop="first",count="1",dst="example.com",host="127.0.0.1",psize="64",src="src.example.com",tests="2",tos="0x0"} 0.000000 1583685425000
mtr_report_snt_gauge{bitpattern="0x00",hop="first",count="1",dst="example.com",host="127.0.0.1",psize="64",src="src.example.com",tests="2",tos="0x0"} 2 1583685425000
mtr_report_last_gauge{bitpattern="0x00",hop="first",count="1",dst="example.com",host="127.0.0.1",psize="64",src="src.example.com",tests="2",tos="0x0"} 0.380000 1583685425000
mtr_report_avg_gauge{bitpattern="0x00",hop="first",count="1",dst="example.com",host="127.0.0.1",psize="64",src="src.example.com",tests="2",tos="0x0"} 0.480000 1583685425000
mtr_report_best_gauge{bitpattern="0x00",hop="first",count="1",dst="example.com",host="127.0.0.1",psize="64",src="src.example.com",tests="2",tos="0x0"} 0.380000 1583685425000
mtr_report_wrst_gauge{bitpattern="0x00",hop="first",count="1",dst="example.com",host="127.0.0.1",psize="64",src="src.example.com",tests="2",tos="0x0"} 0.570000 1583685425000
mtr_report_stdev_gauge{bitpattern="0x00",hop="first",count="1",dst="example.com",host="127.0.0.1",psize="64",src="src.example.com",tests="2",tos="0x0"} 0.130000 1583685425000

Each hop gets a label "hop"="first", "hop"="last", "hop"="first_last" or "hop"="intermediate", depending where on the path to the destination the hop is.

Legacy: the last hop in the list of tested hosts contains the label "last"="true". Use hop=~".*last" in your Prometheus queries to achieve the same.

When prometheus scrapes the data, you can visualise the observed values:

MTR results in prometheus

MTR results in prometheus

Usage

$> mtr-exporter [FLAGS] -- [MTR-FLAGS]

FLAGS:
-bind       <bind-address>
            bind address (default ":8080")
-flag.deprecatedMetrics
            render deprecated metrics (default: false)
            helps with transition time until deprecated metrics are gone
-h
            show help
-jobs       <path-to-jobsfile>
            file describing multiple mtr-jobs. syntax is given below.
-label      <job-label>
            use <job-label> in prometheus-metrics (default: "mtr-exporter-cli")
-mtr        <path-to-binary>
            path to mtr binary (default: "mtr")
-schedule   <schedule>
            schedule at which often mtr is launched (default: "@every 60s")
            examples:
               @every <dur>  - example "@every 60s"
               @hourly       - run once per hour
               10 * * * *    - execute 10 minutes after the full hour
            see https://en.wikipedia.org/wiki/Cron
-tslogs
            use timestamps in logs
-watch-jobs <schedule>
            periodically watch the file defined via -jobs (default: "")
            if it has changed stop previously running mtr-jobs and apply
            all jobs defined in -jobs.
-version
            show version
MTR-FLAGS:
        see "man mtr" for valid flags to mtr.

At /metrics the measured values of the last run are exposed.

Examples

$> mtr-exporter -- example.com
# probe every minute "example.com"

$> mtr-exporter -- -n example.com
# probe every minute "example.com", do not resolve DNS

$> mtr-exporter -schedule "@every 30s" -- -G 1 -m 3 -I ven3 -n example.com
# probe every 30s "example.com", wait 1s for response, try a max of 3 hops,
# use interface "ven3", do not resolve DNS.

Jobs-File Syntax

# comment lines start with '#' are ignored
# empty lines are ignored as well
label -- <schedule> -- mtr-flags

Example:

quad9       -- @every 120s -- -I ven1 -n 9.9.9.9
example.com -- @every 45s  -- -I ven2 -n example.com

Requirements

Runtime:

  • mtr-0.89 and newer (added --json support)

Build:

  • golang-1.21 and newer

Building

$> git clone https://github.com/mgumz/mtr-exporter
$> cd mtr-exporter
$> make

One-off building and "installation":

$> go install github.com/mgumz/mtr-exporter/cmd/mtr-exporter@latest

OCI Images

OCI images for linux/amd64 platform are available for recent releases under https://github.com/mgumz/mtr-exporter/pkgs/container/mtr-exporter

License

see LICENSE file

Author(s)