pangolin_exporter
99 строк · 2.6 Кб
1// Copyright 2022 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
14package collector
15
16import (
17"context"
18"sync"
19
20"github.com/go-kit/log"
21"github.com/go-kit/log/level"
22"github.com/prometheus-community/postgres_exporter/config"
23"github.com/prometheus/client_golang/prometheus"
24)
25
26type ProbeCollector struct {
27registry *prometheus.Registry
28collectors map[string]Collector
29logger log.Logger
30instance *instance
31}
32
33func NewProbeCollector(logger log.Logger, excludeDatabases []string, registry *prometheus.Registry, dsn config.DSN) (*ProbeCollector, error) {
34collectors := make(map[string]Collector)
35initiatedCollectorsMtx.Lock()
36defer initiatedCollectorsMtx.Unlock()
37for key, enabled := range collectorState {
38// TODO: Handle filters
39// if !*enabled || (len(f) > 0 && !f[key]) {
40// continue
41// }
42if !*enabled {
43continue
44}
45if collector, ok := initiatedCollectors[key]; ok {
46collectors[key] = collector
47} else {
48collector, err := factories[key](
49collectorConfig{
50logger: log.With(logger, "collector", key),
51excludeDatabases: excludeDatabases,
52})
53if err != nil {
54return nil, err
55}
56collectors[key] = collector
57initiatedCollectors[key] = collector
58}
59}
60
61instance, err := newInstance(dsn.GetConnectionString())
62if err != nil {
63return nil, err
64}
65
66return &ProbeCollector{
67registry: registry,
68collectors: collectors,
69logger: logger,
70instance: instance,
71}, nil
72}
73
74func (pc *ProbeCollector) Describe(ch chan<- *prometheus.Desc) {
75}
76
77func (pc *ProbeCollector) Collect(ch chan<- prometheus.Metric) {
78// Set up the database connection for the collector.
79err := pc.instance.setup()
80if err != nil {
81level.Error(pc.logger).Log("msg", "Error opening connection to database", "err", err)
82return
83}
84defer pc.instance.Close()
85
86wg := sync.WaitGroup{}
87wg.Add(len(pc.collectors))
88for name, c := range pc.collectors {
89go func(name string, c Collector) {
90execute(context.TODO(), name, c, pc.instance, ch, pc.logger)
91wg.Done()
92}(name, c)
93}
94wg.Wait()
95}
96
97func (pc *ProbeCollector) Close() error {
98return pc.instance.Close()
99}
100