| 
									
										
										
										
											2015-06-22 12:00:55 +03:00
										 |  |  | package metrics | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"io" | 
					
						
							|  |  |  | 	"sort" | 
					
						
							|  |  |  | 	"time" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Write sorts writes each metric in the given registry periodically to the | 
					
						
							|  |  |  | // given io.Writer. | 
					
						
							|  |  |  | func Write(r Registry, d time.Duration, w io.Writer) { | 
					
						
							| 
									
										
										
										
											2018-02-23 10:56:08 +01:00
										 |  |  | 	for range time.Tick(d) { | 
					
						
							| 
									
										
										
										
											2015-06-22 12:00:55 +03:00
										 |  |  | 		WriteOnce(r, w) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // WriteOnce sorts and writes metrics in the given registry to the given | 
					
						
							|  |  |  | // io.Writer. | 
					
						
							|  |  |  | func WriteOnce(r Registry, w io.Writer) { | 
					
						
							|  |  |  | 	var namedMetrics namedMetricSlice | 
					
						
							|  |  |  | 	r.Each(func(name string, i interface{}) { | 
					
						
							|  |  |  | 		namedMetrics = append(namedMetrics, namedMetric{name, i}) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	sort.Sort(namedMetrics) | 
					
						
							|  |  |  | 	for _, namedMetric := range namedMetrics { | 
					
						
							|  |  |  | 		switch metric := namedMetric.m.(type) { | 
					
						
							|  |  |  | 		case Counter: | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "counter %s\n", namedMetric.name) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  count:       %9d\n", metric.Count()) | 
					
						
							|  |  |  | 		case Gauge: | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "gauge %s\n", namedMetric.name) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  value:       %9d\n", metric.Value()) | 
					
						
							|  |  |  | 		case GaugeFloat64: | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "gauge %s\n", namedMetric.name) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  value:       %f\n", metric.Value()) | 
					
						
							|  |  |  | 		case Healthcheck: | 
					
						
							|  |  |  | 			metric.Check() | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "healthcheck %s\n", namedMetric.name) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  error:       %v\n", metric.Error()) | 
					
						
							|  |  |  | 		case Histogram: | 
					
						
							|  |  |  | 			h := metric.Snapshot() | 
					
						
							|  |  |  | 			ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "histogram %s\n", namedMetric.name) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  count:       %9d\n", h.Count()) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  min:         %9d\n", h.Min()) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  max:         %9d\n", h.Max()) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  mean:        %12.2f\n", h.Mean()) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  stddev:      %12.2f\n", h.StdDev()) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  median:      %12.2f\n", ps[0]) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  75%%:         %12.2f\n", ps[1]) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  95%%:         %12.2f\n", ps[2]) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  99%%:         %12.2f\n", ps[3]) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  99.9%%:       %12.2f\n", ps[4]) | 
					
						
							|  |  |  | 		case Meter: | 
					
						
							|  |  |  | 			m := metric.Snapshot() | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "meter %s\n", namedMetric.name) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  count:       %9d\n", m.Count()) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  1-min rate:  %12.2f\n", m.Rate1()) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  5-min rate:  %12.2f\n", m.Rate5()) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  15-min rate: %12.2f\n", m.Rate15()) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  mean rate:   %12.2f\n", m.RateMean()) | 
					
						
							|  |  |  | 		case Timer: | 
					
						
							|  |  |  | 			t := metric.Snapshot() | 
					
						
							|  |  |  | 			ps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "timer %s\n", namedMetric.name) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  count:       %9d\n", t.Count()) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  min:         %9d\n", t.Min()) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  max:         %9d\n", t.Max()) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  mean:        %12.2f\n", t.Mean()) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  stddev:      %12.2f\n", t.StdDev()) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  median:      %12.2f\n", ps[0]) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  75%%:         %12.2f\n", ps[1]) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  95%%:         %12.2f\n", ps[2]) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  99%%:         %12.2f\n", ps[3]) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  99.9%%:       %12.2f\n", ps[4]) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  1-min rate:  %12.2f\n", t.Rate1()) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  5-min rate:  %12.2f\n", t.Rate5()) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  15-min rate: %12.2f\n", t.Rate15()) | 
					
						
							|  |  |  | 			fmt.Fprintf(w, "  mean rate:   %12.2f\n", t.RateMean()) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type namedMetric struct { | 
					
						
							|  |  |  | 	name string | 
					
						
							|  |  |  | 	m    interface{} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // namedMetricSlice is a slice of namedMetrics that implements sort.Interface. | 
					
						
							|  |  |  | type namedMetricSlice []namedMetric | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (nms namedMetricSlice) Len() int { return len(nms) } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (nms namedMetricSlice) Swap(i, j int) { nms[i], nms[j] = nms[j], nms[i] } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (nms namedMetricSlice) Less(i, j int) bool { | 
					
						
							|  |  |  | 	return nms[i].name < nms[j].name | 
					
						
							|  |  |  | } |