collector.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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
  14. // Collector is the interface implemented by anything that can be used by
  15. // Prometheus to collect metrics. A Collector has to be registered for
  16. // collection. See Registerer.Register.
  17. //
  18. // The stock metrics provided by this package (Gauge, Counter, Summary,
  19. // Histogram, Untyped) are also Collectors (which only ever collect one metric,
  20. // namely itself). An implementer of Collector may, however, collect multiple
  21. // metrics in a coordinated fashion and/or create metrics on the fly. Examples
  22. // for collectors already implemented in this library are the metric vectors
  23. // (i.e. collection of multiple instances of the same Metric but with different
  24. // label values) like GaugeVec or SummaryVec, and the ExpvarCollector.
  25. type Collector interface {
  26. // Describe sends the super-set of all possible descriptors of metrics
  27. // collected by this Collector to the provided channel and returns once
  28. // the last descriptor has been sent. The sent descriptors fulfill the
  29. // consistency and uniqueness requirements described in the Desc
  30. // documentation. (It is valid if one and the same Collector sends
  31. // duplicate descriptors. Those duplicates are simply ignored. However,
  32. // two different Collectors must not send duplicate descriptors.) This
  33. // method idempotently sends the same descriptors throughout the
  34. // lifetime of the Collector. If a Collector encounters an error while
  35. // executing this method, it must send an invalid descriptor (created
  36. // with NewInvalidDesc) to signal the error to the registry.
  37. Describe(chan<- *Desc)
  38. // Collect is called by the Prometheus registry when collecting
  39. // metrics. The implementation sends each collected metric via the
  40. // provided channel and returns once the last metric has been sent. The
  41. // descriptor of each sent metric is one of those returned by
  42. // Describe. Returned metrics that share the same descriptor must differ
  43. // in their variable label values. This method may be called
  44. // concurrently and must therefore be implemented in a concurrency safe
  45. // way. Blocking occurs at the expense of total performance of rendering
  46. // all registered metrics. Ideally, Collector implementations support
  47. // concurrent readers.
  48. Collect(chan<- Metric)
  49. }
  50. // selfCollector implements Collector for a single Metric so that the Metric
  51. // collects itself. Add it as an anonymous field to a struct that implements
  52. // Metric, and call init with the Metric itself as an argument.
  53. type selfCollector struct {
  54. self Metric
  55. }
  56. // init provides the selfCollector with a reference to the metric it is supposed
  57. // to collect. It is usually called within the factory function to create a
  58. // metric. See example.
  59. func (c *selfCollector) init(self Metric) {
  60. c.self = self
  61. }
  62. // Describe implements Collector.
  63. func (c *selfCollector) Describe(ch chan<- *Desc) {
  64. ch <- c.self.Desc()
  65. }
  66. // Collect implements Collector.
  67. func (c *selfCollector) Collect(ch chan<- Metric) {
  68. ch <- c.self
  69. }