pangolin_exporter
88 строк · 2.2 Кб
1// Copyright 2023 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
19"github.com/prometheus/client_golang/prometheus"
20)
21
22const replicationSubsystem = "replication"
23
24func init() {
25registerCollector(replicationSubsystem, defaultEnabled, NewPGReplicationCollector)
26}
27
28type PGReplicationCollector struct {
29}
30
31func NewPGReplicationCollector(collectorConfig) (Collector, error) {
32return &PGReplicationCollector{}, nil
33}
34
35var (
36pgReplicationLag = prometheus.NewDesc(
37prometheus.BuildFQName(
38namespace,
39replicationSubsystem,
40"lag_seconds",
41),
42"Replication lag behind master in seconds",
43[]string{}, nil,
44)
45pgReplicationIsReplica = prometheus.NewDesc(
46prometheus.BuildFQName(
47namespace,
48replicationSubsystem,
49"is_replica",
50),
51"Indicates if the server is a replica",
52[]string{}, nil,
53)
54
55pgReplicationQuery = `SELECT
56CASE
57WHEN NOT pg_is_in_recovery() THEN 0
58WHEN pg_last_wal_receive_lsn () = pg_last_wal_replay_lsn () THEN 0
59ELSE GREATEST (0, EXTRACT(EPOCH FROM (now() - pg_last_xact_replay_timestamp())))
60END AS lag,
61CASE
62WHEN pg_is_in_recovery() THEN 1
63ELSE 0
64END as is_replica`
65)
66
67func (c *PGReplicationCollector) Update(ctx context.Context, instance *instance, ch chan<- prometheus.Metric) error {
68db := instance.getDB()
69row := db.QueryRowContext(ctx,
70pgReplicationQuery,
71)
72
73var lag float64
74var isReplica int64
75err := row.Scan(&lag, &isReplica)
76if err != nil {
77return err
78}
79ch <- prometheus.MustNewConstMetric(
80pgReplicationLag,
81prometheus.GaugeValue, lag,
82)
83ch <- prometheus.MustNewConstMetric(
84pgReplicationIsReplica,
85prometheus.GaugeValue, float64(isReplica),
86)
87return nil
88}
89