func (s *summary) Write(out *dto.Metric) error { sum := &dto.Summary{} qs := make([]*dto.Quantile, 0, len(s.objectives)) s.bufMtx.Lock() s.mtx.Lock() if len(s.hotBuf) != 0 { s.swapBufs(time.Now()) } s.bufMtx.Unlock() s.flushColdBuf() sum.SampleCount = proto.Uint64(s.cnt) sum.SampleSum = proto.Float64(s.sum) for _, rank := range s.sortedObjectives { qs = append(qs, &dto.Quantile{ Quantile: proto.Float64(rank), Value: proto.Float64(s.headStream.Query(rank)), }) } s.mtx.Unlock() if len(qs) > 0 { sort.Sort(quantSort(qs)) } sum.Quantile = qs out.Summary = sum out.Label = s.labelPairs return nil }
func testMetric(t *testing.T, v expvar.Var, load func(), desc string, vals ...string) { coll := NewCollector(prometheus.Opts{ Name: "test_name", Help: "test_help", }, v) if load != nil { load() } ch := make(chan prometheus.Metric, 1) go func() { coll.Collect(ch) close(ch) }() for _, val := range vals { met, ok := <-ch if !ok { t.Error("coll.Collect(ch): too few metrics returned") } if got := met.Desc().String(); got != desc { t.Errorf("met.Desc().String(): %q, want %q", got, desc) } m := pb.Metric{} if err := met.Write(&m); err != nil { t.Fatalf("met.Write(): err=%s, want nil", err) } if got := m.String(); got != val { t.Errorf("met.Write(&m); m.String(): %q, want %q", got, val) } } _, ok := <-ch if ok { t.Error("coll.Collect(ch): too many metrics returned") } }
func makeQuantiles(m *dto.Metric) map[string]string { result := map[string]string{} for _, q := range m.GetSummary().Quantile { result[fmt.Sprint(q.GetQuantile())] = fmt.Sprint(q.GetValue()) } return result }
func makeBuckets(m *dto.Metric) map[string]string { result := map[string]string{} for _, b := range m.GetHistogram().Bucket { result[fmt.Sprint(b.GetUpperBound())] = fmt.Sprint(b.GetCumulativeCount()) } return result }
// Get Buckets from histogram metric func makeBuckets(m *dto.Metric) map[string]interface{} { fields := make(map[string]interface{}) for _, b := range m.GetHistogram().Bucket { fields[fmt.Sprint(b.GetUpperBound())] = float64(b.GetCumulativeCount()) } return fields }
func (r *registry) giveMetric(m *dto.Metric) { m.Reset() select { case r.metricPool <- m: default: } }
// Get Quantiles from summary metric func makeQuantiles(m *dto.Metric) map[string]interface{} { fields := make(map[string]interface{}) for _, q := range m.GetSummary().Quantile { if !math.IsNaN(q.GetValue()) { fields[fmt.Sprint(q.GetQuantile())] = float64(q.GetValue()) } } return fields }
func populateMetric( t ValueType, v float64, labelPairs []*dto.LabelPair, m *dto.Metric, ) { m.Label = labelPairs switch t { case CounterValue: m.Counter = &dto.Counter{Value: proto.Float64(v)} case GaugeValue: m.Gauge = &dto.Gauge{Value: proto.Float64(v)} case UntypedValue: m.Untyped = &dto.Untyped{Value: proto.Float64(v)} default: panic(fmt.Errorf("encountered unknown type %v", t)) } }
func (h *histogram) Write(out *dto.Metric) error { his := &dto.Histogram{} buckets := make([]*dto.Bucket, len(h.upperBounds)) his.SampleSum = proto.Float64(math.Float64frombits(atomic.LoadUint64(&h.sumBits))) his.SampleCount = proto.Uint64(atomic.LoadUint64(&h.count)) var count uint64 for i, upperBound := range h.upperBounds { count += atomic.LoadUint64(&h.counts[i]) buckets[i] = &dto.Bucket{ CumulativeCount: proto.Uint64(count), UpperBound: proto.Float64(upperBound), } } his.Bucket = buckets out.Histogram = his out.Label = h.labelPairs return nil }
func (t *UptimeSuite) TestUptimeReporting(c *gc.C) { now := time.Now() u, err := monitoring.NewUptimeCollector("test", "test", "test", time.Now) c.Assert(err, jc.ErrorIsNil) ch := make(chan prometheus.Metric, 1000) u.Collect(ch) var m prometheus.Metric select { case m = <-ch: default: c.Error("metric not provided by collector") } var raw prometheusinternal.Metric err = m.Write(&raw) c.Assert(err, jc.ErrorIsNil) cnt := raw.GetCounter() val := cnt.GetValue() c.Assert(val, gc.Equals, float64(now.Unix())) }
func (s *summary) Write(out *dto.Metric) error { sum := &dto.Summary{} qs := make([]*dto.Quantile, 0, len(s.objectives)) s.bufMtx.Lock() s.mtx.Lock() // Swap bufs even if hotBuf is empty to set new hotBufExpTime. s.swapBufs(time.Now()) s.bufMtx.Unlock() s.flushColdBuf() sum.SampleCount = proto.Uint64(s.cnt) sum.SampleSum = proto.Float64(s.sum) for _, rank := range s.sortedObjectives { var q float64 if s.headStream.Count() == 0 { q = math.NaN() } else { q = s.headStream.Query(rank) } qs = append(qs, &dto.Quantile{ Quantile: proto.Float64(rank), Value: proto.Float64(q), }) } s.mtx.Unlock() if len(qs) > 0 { sort.Sort(quantSort(qs)) } sum.Quantile = qs out.Summary = sum out.Label = s.labelPairs return nil }
func (s *constSummary) Write(out *dto.Metric) error { sum := &dto.Summary{} qs := make([]*dto.Quantile, 0, len(s.quantiles)) sum.SampleCount = proto.Uint64(s.count) sum.SampleSum = proto.Float64(s.sum) for rank, q := range s.quantiles { qs = append(qs, &dto.Quantile{ Quantile: proto.Float64(rank), Value: proto.Float64(q), }) } if len(qs) > 0 { sort.Sort(quantSort(qs)) } sum.Quantile = qs out.Summary = sum out.Label = s.labelPairs return nil }
func (h *constHistogram) Write(out *dto.Metric) error { his := &dto.Histogram{} buckets := make([]*dto.Bucket, 0, len(h.buckets)) his.SampleCount = proto.Uint64(h.count) his.SampleSum = proto.Float64(h.sum) for upperBound, count := range h.buckets { buckets = append(buckets, &dto.Bucket{ CumulativeCount: proto.Uint64(count), UpperBound: proto.Float64(upperBound), }) } if len(buckets) > 0 { sort.Sort(buckSort(buckets)) } his.Bucket = buckets out.Histogram = his out.Label = h.labelPairs return nil }
func getValue(m *dto.Metric) float64 { if m.Gauge != nil { return m.GetGauge().GetValue() } if m.Counter != nil { return m.GetCounter().GetValue() } if m.Untyped != nil { return m.GetUntyped().GetValue() } return 0. }
func (cm *CallbackMetric) Write(m *dto.Metric) { m.Untyped = &dto.Untyped{Value: proto.Float64(cm.callback())} }
func ExampleExpvarCollector() { expvarCollector := prometheus.NewExpvarCollector(map[string]*prometheus.Desc{ "memstats": prometheus.NewDesc( "expvar_memstats", "All numeric memstats as one metric family. Not a good role-model, actually... ;-)", []string{"type"}, nil, ), "lone-int": prometheus.NewDesc( "expvar_lone_int", "Just an expvar int as an example.", nil, nil, ), "http-request-map": prometheus.NewDesc( "expvar_http_request_total", "How many http requests processed, partitioned by status code and http method.", []string{"code", "method"}, nil, ), }) prometheus.MustRegister(expvarCollector) // The Prometheus part is done here. But to show that this example is // doing anything, we have to manually export something via expvar. In // real-life use-cases, some library would already have exported via // expvar what we want to re-export as Prometheus metrics. expvar.NewInt("lone-int").Set(42) expvarMap := expvar.NewMap("http-request-map") var ( expvarMap1, expvarMap2 expvar.Map expvarInt11, expvarInt12, expvarInt21, expvarInt22 expvar.Int ) expvarMap1.Init() expvarMap2.Init() expvarInt11.Set(3) expvarInt12.Set(13) expvarInt21.Set(11) expvarInt22.Set(212) expvarMap1.Set("POST", &expvarInt11) expvarMap1.Set("GET", &expvarInt12) expvarMap2.Set("POST", &expvarInt21) expvarMap2.Set("GET", &expvarInt22) expvarMap.Set("404", &expvarMap1) expvarMap.Set("200", &expvarMap2) // Results in the following expvar map: // "http-request-count": {"200": {"POST": 11, "GET": 212}, "404": {"POST": 3, "GET": 13}} // Let's see what the scrape would yield, but exclude the memstats metrics. metricStrings := []string{} metric := dto.Metric{} metricChan := make(chan prometheus.Metric) go func() { expvarCollector.Collect(metricChan) close(metricChan) }() for m := range metricChan { if strings.Index(m.Desc().String(), "expvar_memstats") == -1 { metric.Reset() m.Write(&metric) metricStrings = append(metricStrings, metric.String()) } } sort.Strings(metricStrings) for _, s := range metricStrings { fmt.Println(strings.TrimRight(s, " ")) } // Output: // label:<name:"code" value:"200" > label:<name:"method" value:"GET" > untyped:<value:212 > // label:<name:"code" value:"200" > label:<name:"method" value:"POST" > untyped:<value:11 > // label:<name:"code" value:"404" > label:<name:"method" value:"GET" > untyped:<value:13 > // label:<name:"code" value:"404" > label:<name:"method" value:"POST" > untyped:<value:3 > // untyped:<value:42 > }
func (cm *CallbackMetric) Write(m *dto.Metric) error { m.Untyped = &dto.Untyped{Value: proto.Float64(cm.callback())} return nil }
// Get name and value from metric func getNameAndValue(m *dto.Metric) map[string]interface{} { fields := make(map[string]interface{}) if m.Gauge != nil { if !math.IsNaN(m.GetGauge().GetValue()) { fields["gauge"] = float64(m.GetGauge().GetValue()) } } else if m.Counter != nil { if !math.IsNaN(m.GetGauge().GetValue()) { fields["counter"] = float64(m.GetCounter().GetValue()) } } else if m.Untyped != nil { if !math.IsNaN(m.GetGauge().GetValue()) { fields["value"] = float64(m.GetUntyped().GetValue()) } } return fields }
func (s *collectionSizeSuite) TestCollectionSizeReporting(c *gc.C) { collection := s.Session.DB("test").C("test_collection") u := monitoring.NewCollectionSizeCollector("test", "test", "test", collection) defer u.Close() err := collection.Insert(bson.M{"test": true}) c.Assert(err, jc.ErrorIsNil) ch := make(chan prometheus.Metric, 2) u.Collect(ch) var m prometheus.Metric // read the size select { case m = <-ch: default: c.Error("metric not provided by collector") } var raw prometheusinternal.Metric err = m.Write(&raw) c.Assert(err, jc.ErrorIsNil) cnt := raw.GetGauge() valueOne := cnt.GetValue() // read the count select { case m = <-ch: default: c.Error("metric not provided by collector") } err = m.Write(&raw) c.Assert(err, jc.ErrorIsNil) cnt = raw.GetGauge() val := cnt.GetValue() c.Assert(val, gc.Equals, float64(1.0)) err = collection.Insert(bson.M{"test": true}) c.Assert(err, jc.ErrorIsNil) u.Collect(ch) // read the size select { case m = <-ch: default: c.Error("metric not provided by collector") } err = m.Write(&raw) c.Assert(err, jc.ErrorIsNil) cnt = raw.GetGauge() valueTwo := cnt.GetValue() c.Assert(2*valueOne, gc.Equals, valueTwo) // read the count select { case m = <-ch: default: c.Error("metric not provided by collector") } err = m.Write(&raw) c.Assert(err, jc.ErrorIsNil) cnt = raw.GetGauge() val = cnt.GetValue() c.Assert(val, gc.Equals, float64(2.0)) }