Skip to content

Commit

Permalink
Add ICMP duration metrics (#346)
Browse files Browse the repository at this point in the history
* Add ICMP duration metrics

Add a gauge to measure various parts of the ICMP probe.

Signed-off-by: Ben Kochie <[email protected]>

* Update travis config

Update travis config to match upstream prometheus.

Signed-off-by: Ben Kochie <[email protected]>
  • Loading branch information
SuperQ authored and brian-brazil committed Jul 24, 2018
1 parent 33ae924 commit 2a04b8e
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 2 deletions.
3 changes: 2 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@ sudo: false

language: go

# Whenever the Go version is updated here, .circleci/config.yml should also be
# updated.
go:
- 1.10.x
- 1.x

go_import_path: github.com/prometheus/blackbox_exporter

Expand Down
19 changes: 18 additions & 1 deletion prober/icmp.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,28 @@ func ProbeICMP(ctx context.Context, target string, module config.Module, registr
socket net.PacketConn
requestType icmp.Type
replyType icmp.Type

durationGaugeVec = prometheus.NewGaugeVec(prometheus.GaugeOpts{
Name: "probe_icmp_duration_seconds",
Help: "Duration of icmp request by phase",
}, []string{"phase"})
)

for _, lv := range []string{"resolve", "setup", "rtt"} {
durationGaugeVec.WithLabelValues(lv)
}

registry.MustRegister(durationGaugeVec)

timeoutDeadline, _ := ctx.Deadline()
deadline := time.Now().Add(timeoutDeadline.Sub(time.Now()))

ip, _, err := chooseProtocol(module.ICMP.PreferredIPProtocol, target, registry, logger)
ip, lookupTime, err := chooseProtocol(module.ICMP.PreferredIPProtocol, target, registry, logger)
if err != nil {
level.Warn(logger).Log("msg", "Error resolving address", "err", err)
return false
}
durationGaugeVec.WithLabelValues("resolve").Add(lookupTime)

var srcIP net.IP
if len(module.ICMP.SourceIPAddress) > 0 {
Expand All @@ -67,6 +80,7 @@ func ProbeICMP(ctx context.Context, target string, module config.Module, registr
level.Info(logger).Log("msg", "Using source address", "srcIP", srcIP)
}

setupStart := time.Now()
level.Info(logger).Log("msg", "Creating socket")
if ip.IP.To4() == nil {
requestType = ipv6.ICMPTypeEchoRequest
Expand Down Expand Up @@ -134,7 +148,9 @@ func ProbeICMP(ctx context.Context, target string, module config.Module, registr
level.Error(logger).Log("msg", "Error marshalling packet", "err", err)
return
}
durationGaugeVec.WithLabelValues("setup").Add(time.Since(setupStart).Seconds())
level.Info(logger).Log("msg", "Writing out packet")
rttStart := time.Now()
if _, err = socket.WriteTo(wb, ip); err != nil {
level.Warn(logger).Log("msg", "Error writing to socket", "err", err)
return
Expand Down Expand Up @@ -173,6 +189,7 @@ func ProbeICMP(ctx context.Context, target string, module config.Module, registr
rb[3] = 0
}
if bytes.Compare(rb[:n], wb) == 0 {
durationGaugeVec.WithLabelValues("rtt").Add(time.Since(rttStart).Seconds())
level.Info(logger).Log("msg", "Found matching reply packet")
return true
}
Expand Down

0 comments on commit 2a04b8e

Please sign in to comment.