|  | // metrics2 is a client library for recording and reporting monitoring data. | 
|  | package metrics2 | 
|  |  | 
|  | import ( | 
|  | "net/http" | 
|  | "time" | 
|  |  | 
|  | "github.com/go-chi/chi/v5" | 
|  | "github.com/prometheus/client_golang/prometheus/promhttp" | 
|  | "go.skia.org/infra/go/sklog" | 
|  | ) | 
|  |  | 
|  | // Timer is a struct used for measuring elapsed time. Unlike the other metrics | 
|  | // helpers, timer does not continuously report data; instead, it reports a | 
|  | // single data point when Stop() is called. | 
|  | type Timer interface { | 
|  | // Start starts or resets the timer. | 
|  | Start() | 
|  |  | 
|  | // Stop stops the timer and reports the elapsed time. | 
|  | Stop() time.Duration | 
|  | } | 
|  |  | 
|  | // Liveness keeps a time-since-last-successful-update metric. | 
|  | // | 
|  | // The unit of the metrics is in seconds. | 
|  | // | 
|  | // It is used to keep track of periodic processes to make sure that they are running | 
|  | // successfully. Every liveness metric should have a corresponding alert set up that | 
|  | // will fire of the time-since-last-successful-update metric gets too large. | 
|  | type Liveness interface { | 
|  | // Get returns the current value of the Liveness. | 
|  | Get() int64 | 
|  |  | 
|  | // ManualReset sets the last-successful-update time of the Liveness to a specific value. Useful for tracking processes whose lifetimes are outside of that of the current process, but should not be needed in most cases. | 
|  | ManualReset(lastSuccessfulUpdate time.Time) | 
|  |  | 
|  | // Reset should be called when some work has been successfully completed. | 
|  | Reset() | 
|  |  | 
|  | // Close stops the internal goroutine. Usually used for testing since most Liveness instances | 
|  | // live for the duration of the process. | 
|  | Close() | 
|  | } | 
|  |  | 
|  | // BoolMetric is a metric which reports a Boolean value, represented on the backend as an int64. | 
|  | type BoolMetric interface { | 
|  | // Delete removes the metric from its Client's registry. | 
|  | Delete() error | 
|  |  | 
|  | // Get returns the current value of the metric. | 
|  | Get() bool | 
|  |  | 
|  | // Update adds a data point to the metric. | 
|  | Update(v bool) | 
|  | } | 
|  |  | 
|  | // Int64Metric is a metric which reports an int64 value. | 
|  | type Int64Metric interface { | 
|  | // Delete removes the metric from its Client's registry. | 
|  | Delete() error | 
|  |  | 
|  | // Get returns the current value of the metric. | 
|  | Get() int64 | 
|  |  | 
|  | // Update adds a data point to the metric. | 
|  | Update(v int64) | 
|  | } | 
|  |  | 
|  | // Float64Metric is a metric which reports a float64 value. | 
|  | type Float64Metric interface { | 
|  | // Delete removes the metric from its Client's registry. | 
|  | Delete() error | 
|  |  | 
|  | // Get returns the current value of the metric. | 
|  | Get() float64 | 
|  |  | 
|  | // Update adds a data point to the metric. | 
|  | Update(v float64) | 
|  | } | 
|  |  | 
|  | // Float64SummaryMetric is a metric which reports a summary of many float64 values. | 
|  | type Float64SummaryMetric interface { | 
|  | // Observe adds a data point to the metric. | 
|  | Observe(v float64) | 
|  | } | 
|  |  | 
|  | // Counter is a struct used for tracking metrics which increment or decrement. | 
|  | type Counter interface { | 
|  | // Dec decrements the counter by the given quantity. | 
|  | Dec(i int64) | 
|  |  | 
|  | // Delete removes the counter from metrics. | 
|  | Delete() error | 
|  |  | 
|  | // Get returns the current value in the counter. | 
|  | Get() int64 | 
|  |  | 
|  | // Inc increments the counter by the given quantity. | 
|  | Inc(i int64) | 
|  |  | 
|  | // Reset sets the counter to zero. | 
|  | Reset() | 
|  | } | 
|  |  | 
|  | // Client represents a set of metrics. | 
|  | type Client interface { | 
|  | // Flush pushes any queued data immediately. Long running apps shouldn't worry about this as Client will auto-push every so often. | 
|  | Flush() error | 
|  |  | 
|  | // GetCounter creates or retrieves a Counter with the given name and tag set and returns it. | 
|  | // Clients should cache this counter, as making multiple calls with the same keys will return | 
|  | // a fresh counter (initialized to 0), which is undesirable. These counters would all compete | 
|  | // with each other; the underlying metric would reflect the result of the most-recently | 
|  | // updated instance. | 
|  | GetCounter(name string, tagsList ...map[string]string) Counter | 
|  |  | 
|  | // GetFloat64Metric returns a Float64Metric instance. | 
|  | GetFloat64Metric(measurement string, tags ...map[string]string) Float64Metric | 
|  |  | 
|  | // GetInt64Metric returns an Int64Metric instance. | 
|  | GetInt64Metric(measurement string, tags ...map[string]string) Int64Metric | 
|  |  | 
|  | // GetBoolMetric returns a BoolMetric instance. | 
|  | GetBoolMetric(name string, tags ...map[string]string) BoolMetric | 
|  |  | 
|  | // GetFloat64SummaryMetric returns an Float64SummaryMetric instance. | 
|  | GetFloat64SummaryMetric(measurement string, tags ...map[string]string) Float64SummaryMetric | 
|  |  | 
|  | // NewLiveness creates a new Liveness metric helper. | 
|  | NewLiveness(name string, tagsList ...map[string]string) Liveness | 
|  |  | 
|  | // NewTimer creates and returns a new started timer. | 
|  | NewTimer(name string, tagsList ...map[string]string) Timer | 
|  |  | 
|  | // Int64MetricExists returns true if the given Int64Metric already exists. | 
|  | Int64MetricExists(measurement string, tags ...map[string]string) bool | 
|  | } | 
|  |  | 
|  | var ( | 
|  | defaultClient Client = NewPromClient() | 
|  | ) | 
|  |  | 
|  | // GetDefaultClient returns the default Client. | 
|  | func GetDefaultClient() Client { | 
|  | return defaultClient | 
|  | } | 
|  |  | 
|  | // InitPrometheus initializes metrics to be reported to Prometheus. | 
|  | // | 
|  | // port - string, The port on which to serve the metrics, e.g. ":10110". | 
|  | func InitPrometheus(port string) { | 
|  | r := chi.NewRouter() | 
|  | r.Handle("/metrics", promhttp.Handler()) | 
|  | go func() { | 
|  | sklog.Fatal(http.ListenAndServe(port, r)) | 
|  | }() | 
|  | } |