source: code/trunk/vendor/github.com/prometheus/client_golang/prometheus/doc.go@ 822

Last change on this file since 822 was 822, checked in by yakumo.izuru, 22 months ago

Prefer immortal.run over runit and rc.d, use vendored modules
for convenience.

Signed-off-by: Izuru Yakumo <yakumo.izuru@…>

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