diff --git a/prometheus/timer.go b/prometheus/timer.go new file mode 100644 index 0000000..31df7f8 --- /dev/null +++ b/prometheus/timer.go @@ -0,0 +1,29 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import "time" + +type Observable interface { + Observe(float64) +} + +type TimerFunc func(Observable) + +func NewTimer() TimerFunc { + begin := time.Now() + return func(obs Observable) { + obs.Observe(time.Since(begin).Seconds()) + } +} diff --git a/prometheus/timer_test.go b/prometheus/timer_test.go new file mode 100644 index 0000000..3ca7455 --- /dev/null +++ b/prometheus/timer_test.go @@ -0,0 +1,41 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "testing" + + dto "github.com/prometheus/client_model/go" +) + +func TestTimerObserve(t *testing.T) { + his := NewHistogram( + HistogramOpts{ + Name: "test_histogram", + }, + ) + + stop := NewTimer() + stop(his) + m := &dto.Metric{} + his.Write(m) + + for _, b := range m.Histogram.Bucket { + if int(b.GetCumulativeCount()) > 0 { + return + } + } + + t.Fatalf("no counts recorded") +}