pangolin_exporter
118 строк · 3.1 Кб
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.
13package collector
14
15import (
16"context"
17"database/sql"
18
19"github.com/go-kit/log"
20"github.com/prometheus/client_golang/prometheus"
21)
22
23func init() {
24registerCollector(statioUserIndexesSubsystem, defaultDisabled, NewPGStatioUserIndexesCollector)
25}
26
27type PGStatioUserIndexesCollector struct {
28log log.Logger
29}
30
31const statioUserIndexesSubsystem = "statio_user_indexes"
32
33func NewPGStatioUserIndexesCollector(config collectorConfig) (Collector, error) {
34return &PGStatioUserIndexesCollector{log: config.logger}, nil
35}
36
37var (
38statioUserIndexesIdxBlksRead = prometheus.NewDesc(
39prometheus.BuildFQName(namespace, statioUserIndexesSubsystem, "idx_blks_read_total"),
40"Number of disk blocks read from this index",
41[]string{"schemaname", "relname", "indexrelname"},
42prometheus.Labels{},
43)
44statioUserIndexesIdxBlksHit = prometheus.NewDesc(
45prometheus.BuildFQName(namespace, statioUserIndexesSubsystem, "idx_blks_hit_total"),
46"Number of buffer hits in this index",
47[]string{"schemaname", "relname", "indexrelname"},
48prometheus.Labels{},
49)
50
51statioUserIndexesQuery = `
52SELECT
53schemaname,
54relname,
55indexrelname,
56idx_blks_read,
57idx_blks_hit
58FROM pg_statio_user_indexes
59`
60)
61
62func (c *PGStatioUserIndexesCollector) Update(ctx context.Context, instance *instance, ch chan<- prometheus.Metric) error {
63db := instance.getDB()
64rows, err := db.QueryContext(ctx,
65statioUserIndexesQuery)
66
67if err != nil {
68return err
69}
70defer rows.Close()
71for rows.Next() {
72var schemaname, relname, indexrelname sql.NullString
73var idxBlksRead, idxBlksHit sql.NullFloat64
74
75if err := rows.Scan(&schemaname, &relname, &indexrelname, &idxBlksRead, &idxBlksHit); err != nil {
76return err
77}
78schemanameLabel := "unknown"
79if schemaname.Valid {
80schemanameLabel = schemaname.String
81}
82relnameLabel := "unknown"
83if relname.Valid {
84relnameLabel = relname.String
85}
86indexrelnameLabel := "unknown"
87if indexrelname.Valid {
88indexrelnameLabel = indexrelname.String
89}
90labels := []string{schemanameLabel, relnameLabel, indexrelnameLabel}
91
92idxBlksReadMetric := 0.0
93if idxBlksRead.Valid {
94idxBlksReadMetric = idxBlksRead.Float64
95}
96ch <- prometheus.MustNewConstMetric(
97statioUserIndexesIdxBlksRead,
98prometheus.CounterValue,
99idxBlksReadMetric,
100labels...,
101)
102
103idxBlksHitMetric := 0.0
104if idxBlksHit.Valid {
105idxBlksHitMetric = idxBlksHit.Float64
106}
107ch <- prometheus.MustNewConstMetric(
108statioUserIndexesIdxBlksHit,
109prometheus.CounterValue,
110idxBlksHitMetric,
111labels...,
112)
113}
114if err := rows.Err(); err != nil {
115return err
116}
117return nil
118}
119