You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

doc.go 9.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. // Copyright 2014 The Prometheus Authors
  2. // Licensed under the Apache License, Version 2.0 (the "License");
  3. // you may not use this file except in compliance with the License.
  4. // You may obtain a copy of the License at
  5. //
  6. // http://www.apache.org/licenses/LICENSE-2.0
  7. //
  8. // Unless required by applicable law or agreed to in writing, software
  9. // distributed under the License is distributed on an "AS IS" BASIS,
  10. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. // See the License for the specific language governing permissions and
  12. // limitations under the License.
  13. // Package prometheus is the core instrumentation package. It provides metrics
  14. // primitives to instrument code for monitoring. It also offers a registry for
  15. // metrics. Sub-packages allow to expose the registered metrics via HTTP
  16. // (package promhttp) or push them to a Pushgateway (package push). There is
  17. // also a sub-package promauto, which provides metrics constructors with
  18. // automatic registration.
  19. //
  20. // All exported functions and methods are safe to be used concurrently unless
  21. // specified otherwise.
  22. //
  23. // A Basic Example
  24. //
  25. // As a starting point, a very basic usage example:
  26. //
  27. // package main
  28. //
  29. // import (
  30. // "log"
  31. // "net/http"
  32. //
  33. // "github.com/prometheus/client_golang/prometheus"
  34. // "github.com/prometheus/client_golang/prometheus/promhttp"
  35. // )
  36. //
  37. // var (
  38. // cpuTemp = prometheus.NewGauge(prometheus.GaugeOpts{
  39. // Name: "cpu_temperature_celsius",
  40. // Help: "Current temperature of the CPU.",
  41. // })
  42. // hdFailures = prometheus.NewCounterVec(
  43. // prometheus.CounterOpts{
  44. // Name: "hd_errors_total",
  45. // Help: "Number of hard-disk errors.",
  46. // },
  47. // []string{"device"},
  48. // )
  49. // )
  50. //
  51. // func init() {
  52. // // Metrics have to be registered to be exposed:
  53. // prometheus.MustRegister(cpuTemp)
  54. // prometheus.MustRegister(hdFailures)
  55. // }
  56. //
  57. // func main() {
  58. // cpuTemp.Set(65.3)
  59. // hdFailures.With(prometheus.Labels{"device":"/dev/sda"}).Inc()
  60. //
  61. // // The Handler function provides a default handler to expose metrics
  62. // // via an HTTP server. "/metrics" is the usual endpoint for that.
  63. // http.Handle("/metrics", promhttp.Handler())
  64. // log.Fatal(http.ListenAndServe(":8080", nil))
  65. // }
  66. //
  67. //
  68. // This is a complete program that exports two metrics, a Gauge and a Counter,
  69. // the latter with a label attached to turn it into a (one-dimensional) vector.
  70. //
  71. // Metrics
  72. //
  73. // The number of exported identifiers in this package might appear a bit
  74. // overwhelming. However, in addition to the basic plumbing shown in the example
  75. // above, you only need to understand the different metric types and their
  76. // vector versions for basic usage. Furthermore, if you are not concerned with
  77. // fine-grained control of when and how to register metrics with the registry,
  78. // have a look at the promauto package, which will effectively allow you to
  79. // ignore registration altogether in simple cases.
  80. //
  81. // Above, you have already touched the Counter and the Gauge. There are two more
  82. // advanced metric types: the Summary and Histogram. A more thorough description
  83. // of those four metric types can be found in the Prometheus docs:
  84. // https://prometheus.io/docs/concepts/metric_types/
  85. //
  86. // A fifth "type" of metric is Untyped. It behaves like a Gauge, but signals the
  87. // Prometheus server not to assume anything about its type.
  88. //
  89. // In addition to the fundamental metric types Gauge, Counter, Summary,
  90. // Histogram, and Untyped, a very important part of the Prometheus data model is
  91. // the partitioning of samples along dimensions called labels, which results in
  92. // metric vectors. The fundamental types are GaugeVec, CounterVec, SummaryVec,
  93. // HistogramVec, and UntypedVec.
  94. //
  95. // While only the fundamental metric types implement the Metric interface, both
  96. // the metrics and their vector versions implement the Collector interface. A
  97. // Collector manages the collection of a number of Metrics, but for convenience,
  98. // a Metric can also “collect itself”. Note that Gauge, Counter, Summary,
  99. // Histogram, and Untyped are interfaces themselves while GaugeVec, CounterVec,
  100. // SummaryVec, HistogramVec, and UntypedVec are not.
  101. //
  102. // To create instances of Metrics and their vector versions, you need a suitable
  103. // …Opts struct, i.e. GaugeOpts, CounterOpts, SummaryOpts, HistogramOpts, or
  104. // UntypedOpts.
  105. //
  106. // Custom Collectors and constant Metrics
  107. //
  108. // While you could create your own implementations of Metric, most likely you
  109. // will only ever implement the Collector interface on your own. At a first
  110. // glance, a custom Collector seems handy to bundle Metrics for common
  111. // registration (with the prime example of the different metric vectors above,
  112. // which bundle all the metrics of the same name but with different labels).
  113. //
  114. // There is a more involved use case, too: If you already have metrics
  115. // available, created outside of the Prometheus context, you don't need the
  116. // interface of the various Metric types. You essentially want to mirror the
  117. // existing numbers into Prometheus Metrics during collection. An own
  118. // implementation of the Collector interface is perfect for that. You can create
  119. // Metric instances “on the fly” using NewConstMetric, NewConstHistogram, and
  120. // NewConstSummary (and their respective Must… versions). That will happen in
  121. // the Collect method. The Describe method has to return separate Desc
  122. // instances, representative of the “throw-away” metrics to be created later.
  123. // NewDesc comes in handy to create those Desc instances. Alternatively, you
  124. // could return no Desc at all, which will mark the Collector “unchecked”. No
  125. // checks are performed at registration time, but metric consistency will still
  126. // be ensured at scrape time, i.e. any inconsistencies will lead to scrape
  127. // errors. Thus, with unchecked Collectors, the responsibility to not collect
  128. // metrics that lead to inconsistencies in the total scrape result lies with the
  129. // implementer of the Collector. While this is not a desirable state, it is
  130. // sometimes necessary. The typical use case is a situation where the exact
  131. // metrics to be returned by a Collector cannot be predicted at registration
  132. // time, but the implementer has sufficient knowledge of the whole system to
  133. // guarantee metric consistency.
  134. //
  135. // The Collector example illustrates the use case. You can also look at the
  136. // source code of the processCollector (mirroring process metrics), the
  137. // goCollector (mirroring Go metrics), or the expvarCollector (mirroring expvar
  138. // metrics) as examples that are used in this package itself.
  139. //
  140. // If you just need to call a function to get a single float value to collect as
  141. // a metric, GaugeFunc, CounterFunc, or UntypedFunc might be interesting
  142. // shortcuts.
  143. //
  144. // Advanced Uses of the Registry
  145. //
  146. // While MustRegister is the by far most common way of registering a Collector,
  147. // sometimes you might want to handle the errors the registration might cause.
  148. // As suggested by the name, MustRegister panics if an error occurs. With the
  149. // Register function, the error is returned and can be handled.
  150. //
  151. // An error is returned if the registered Collector is incompatible or
  152. // inconsistent with already registered metrics. The registry aims for
  153. // consistency of the collected metrics according to the Prometheus data model.
  154. // Inconsistencies are ideally detected at registration time, not at collect
  155. // time. The former will usually be detected at start-up time of a program,
  156. // while the latter will only happen at scrape time, possibly not even on the
  157. // first scrape if the inconsistency only becomes relevant later. That is the
  158. // main reason why a Collector and a Metric have to describe themselves to the
  159. // registry.
  160. //
  161. // So far, everything we did operated on the so-called default registry, as it
  162. // can be found in the global DefaultRegisterer variable. With NewRegistry, you
  163. // can create a custom registry, or you can even implement the Registerer or
  164. // Gatherer interfaces yourself. The methods Register and Unregister work in the
  165. // same way on a custom registry as the global functions Register and Unregister
  166. // on the default registry.
  167. //
  168. // There are a number of uses for custom registries: You can use registries with
  169. // special properties, see NewPedanticRegistry. You can avoid global state, as
  170. // it is imposed by the DefaultRegisterer. You can use multiple registries at
  171. // the same time to expose different metrics in different ways. You can use
  172. // separate registries for testing purposes.
  173. //
  174. // Also note that the DefaultRegisterer comes registered with a Collector for Go
  175. // runtime metrics (via NewGoCollector) and a Collector for process metrics (via
  176. // NewProcessCollector). With a custom registry, you are in control and decide
  177. // yourself about the Collectors to register.
  178. //
  179. // HTTP Exposition
  180. //
  181. // The Registry implements the Gatherer interface. The caller of the Gather
  182. // method can then expose the gathered metrics in some way. Usually, the metrics
  183. // are served via HTTP on the /metrics endpoint. That's happening in the example
  184. // above. The tools to expose metrics via HTTP are in the promhttp sub-package.
  185. // (The top-level functions in the prometheus package are deprecated.)
  186. //
  187. // Pushing to the Pushgateway
  188. //
  189. // Function for pushing to the Pushgateway can be found in the push sub-package.
  190. //
  191. // Graphite Bridge
  192. //
  193. // Functions and examples to push metrics from a Gatherer to Graphite can be
  194. // found in the graphite sub-package.
  195. //
  196. // Other Means of Exposition
  197. //
  198. // More ways of exposing metrics can easily be added by following the approaches
  199. // of the existing implementations.
  200. package prometheus