|
|
|
|
@ -161,11 +161,12 @@ type Probe struct { |
|
|
|
|
tick ticker |
|
|
|
|
labels map[string]string |
|
|
|
|
|
|
|
|
|
mu sync.Mutex |
|
|
|
|
start time.Time // last time doProbe started
|
|
|
|
|
end time.Time // last time doProbe returned
|
|
|
|
|
result bool // whether the last doProbe call succeeded
|
|
|
|
|
lastErr error |
|
|
|
|
mu sync.Mutex |
|
|
|
|
start time.Time // last time doProbe started
|
|
|
|
|
end time.Time // last time doProbe returned
|
|
|
|
|
latency time.Duration // last successful probe latency
|
|
|
|
|
succeeded bool // whether the last doProbe call succeeded
|
|
|
|
|
lastErr error |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Close shuts down the Probe and unregisters it from its Prober.
|
|
|
|
|
@ -254,8 +255,13 @@ func (p *Probe) recordEnd(start time.Time, err error) { |
|
|
|
|
p.mu.Lock() |
|
|
|
|
defer p.mu.Unlock() |
|
|
|
|
p.end = end |
|
|
|
|
p.result = err == nil |
|
|
|
|
p.succeeded = err == nil |
|
|
|
|
p.lastErr = err |
|
|
|
|
if p.succeeded { |
|
|
|
|
p.latency = end.Sub(p.start) |
|
|
|
|
} else { |
|
|
|
|
p.latency = 0 |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type varExporter struct { |
|
|
|
|
@ -289,13 +295,13 @@ func (v varExporter) probeInfo() map[string]ProbeInfo { |
|
|
|
|
Labels: probe.labels, |
|
|
|
|
Start: probe.start, |
|
|
|
|
End: probe.end, |
|
|
|
|
Result: probe.result, |
|
|
|
|
Result: probe.succeeded, |
|
|
|
|
} |
|
|
|
|
if probe.lastErr != nil { |
|
|
|
|
inf.Error = probe.lastErr.Error() |
|
|
|
|
} |
|
|
|
|
if probe.end.After(probe.start) { |
|
|
|
|
inf.Latency = probe.end.Sub(probe.start).String() |
|
|
|
|
if probe.latency > 0 { |
|
|
|
|
inf.Latency = probe.latency.String() |
|
|
|
|
} |
|
|
|
|
out[probe.name] = inf |
|
|
|
|
probe.mu.Unlock() |
|
|
|
|
@ -358,9 +364,10 @@ func (v varExporter) WritePrometheus(w io.Writer, prefix string) { |
|
|
|
|
} |
|
|
|
|
if !probe.end.IsZero() { |
|
|
|
|
fmt.Fprintf(w, "%s_end_secs{%s} %d\n", prefix, labels, probe.end.Unix()) |
|
|
|
|
// Start is always present if end is.
|
|
|
|
|
fmt.Fprintf(w, "%s_latency_millis{%s} %d\n", prefix, labels, probe.end.Sub(probe.start).Milliseconds()) |
|
|
|
|
if probe.result { |
|
|
|
|
if probe.latency > 0 { |
|
|
|
|
fmt.Fprintf(w, "%s_latency_millis{%s} %d\n", prefix, labels, probe.latency.Milliseconds()) |
|
|
|
|
} |
|
|
|
|
if probe.succeeded { |
|
|
|
|
fmt.Fprintf(w, "%s_result{%s} 1\n", prefix, labels) |
|
|
|
|
} else { |
|
|
|
|
fmt.Fprintf(w, "%s_result{%s} 0\n", prefix, labels) |
|
|
|
|
|