pangolin_exporter
222 строки · 6.6 Кб
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"database/sql"
19
20"github.com/go-kit/log"
21"github.com/prometheus/client_golang/prometheus"
22)
23
24const statioUserTableSubsystem = "statio_user_tables"
25
26func init() {
27registerCollector(statioUserTableSubsystem, defaultEnabled, NewPGStatIOUserTablesCollector)
28}
29
30type PGStatIOUserTablesCollector struct {
31log log.Logger
32}
33
34func NewPGStatIOUserTablesCollector(config collectorConfig) (Collector, error) {
35return &PGStatIOUserTablesCollector{log: config.logger}, nil
36}
37
38var (
39statioUserTablesHeapBlksRead = prometheus.NewDesc(
40prometheus.BuildFQName(namespace, statioUserTableSubsystem, "heap_blocks_read"),
41"Number of disk blocks read from this table",
42[]string{"datname", "schemaname", "relname"},
43prometheus.Labels{},
44)
45statioUserTablesHeapBlksHit = prometheus.NewDesc(
46prometheus.BuildFQName(namespace, statioUserTableSubsystem, "heap_blocks_hit"),
47"Number of buffer hits in this table",
48[]string{"datname", "schemaname", "relname"},
49prometheus.Labels{},
50)
51statioUserTablesIdxBlksRead = prometheus.NewDesc(
52prometheus.BuildFQName(namespace, statioUserTableSubsystem, "idx_blocks_read"),
53"Number of disk blocks read from all indexes on this table",
54[]string{"datname", "schemaname", "relname"},
55prometheus.Labels{},
56)
57statioUserTablesIdxBlksHit = prometheus.NewDesc(
58prometheus.BuildFQName(namespace, statioUserTableSubsystem, "idx_blocks_hit"),
59"Number of buffer hits in all indexes on this table",
60[]string{"datname", "schemaname", "relname"},
61prometheus.Labels{},
62)
63statioUserTablesToastBlksRead = prometheus.NewDesc(
64prometheus.BuildFQName(namespace, statioUserTableSubsystem, "toast_blocks_read"),
65"Number of disk blocks read from this table's TOAST table (if any)",
66[]string{"datname", "schemaname", "relname"},
67prometheus.Labels{},
68)
69statioUserTablesToastBlksHit = prometheus.NewDesc(
70prometheus.BuildFQName(namespace, statioUserTableSubsystem, "toast_blocks_hit"),
71"Number of buffer hits in this table's TOAST table (if any)",
72[]string{"datname", "schemaname", "relname"},
73prometheus.Labels{},
74)
75statioUserTablesTidxBlksRead = prometheus.NewDesc(
76prometheus.BuildFQName(namespace, statioUserTableSubsystem, "tidx_blocks_read"),
77"Number of disk blocks read from this table's TOAST table indexes (if any)",
78[]string{"datname", "schemaname", "relname"},
79prometheus.Labels{},
80)
81statioUserTablesTidxBlksHit = prometheus.NewDesc(
82prometheus.BuildFQName(namespace, statioUserTableSubsystem, "tidx_blocks_hit"),
83"Number of buffer hits in this table's TOAST table indexes (if any)",
84[]string{"datname", "schemaname", "relname"},
85prometheus.Labels{},
86)
87
88statioUserTablesQuery = `SELECT
89current_database() datname,
90schemaname,
91relname,
92heap_blks_read,
93heap_blks_hit,
94idx_blks_read,
95idx_blks_hit,
96toast_blks_read,
97toast_blks_hit,
98tidx_blks_read,
99tidx_blks_hit
100FROM pg_statio_user_tables`
101)
102
103func (PGStatIOUserTablesCollector) Update(ctx context.Context, instance *instance, ch chan<- prometheus.Metric) error {
104db := instance.getDB()
105rows, err := db.QueryContext(ctx,
106statioUserTablesQuery)
107
108if err != nil {
109return err
110}
111defer rows.Close()
112
113for rows.Next() {
114var datname, schemaname, relname sql.NullString
115var heapBlksRead, heapBlksHit, idxBlksRead, idxBlksHit, toastBlksRead, toastBlksHit, tidxBlksRead, tidxBlksHit sql.NullInt64
116
117if err := rows.Scan(&datname, &schemaname, &relname, &heapBlksRead, &heapBlksHit, &idxBlksRead, &idxBlksHit, &toastBlksRead, &toastBlksHit, &tidxBlksRead, &tidxBlksHit); err != nil {
118return err
119}
120datnameLabel := "unknown"
121if datname.Valid {
122datnameLabel = datname.String
123}
124schemanameLabel := "unknown"
125if schemaname.Valid {
126schemanameLabel = schemaname.String
127}
128relnameLabel := "unknown"
129if relname.Valid {
130relnameLabel = relname.String
131}
132
133heapBlksReadMetric := 0.0
134if heapBlksRead.Valid {
135heapBlksReadMetric = float64(heapBlksRead.Int64)
136}
137ch <- prometheus.MustNewConstMetric(
138statioUserTablesHeapBlksRead,
139prometheus.CounterValue,
140heapBlksReadMetric,
141datnameLabel, schemanameLabel, relnameLabel,
142)
143
144heapBlksHitMetric := 0.0
145if heapBlksHit.Valid {
146heapBlksHitMetric = float64(heapBlksHit.Int64)
147}
148ch <- prometheus.MustNewConstMetric(
149statioUserTablesHeapBlksHit,
150prometheus.CounterValue,
151heapBlksHitMetric,
152datnameLabel, schemanameLabel, relnameLabel,
153)
154
155idxBlksReadMetric := 0.0
156if idxBlksRead.Valid {
157idxBlksReadMetric = float64(idxBlksRead.Int64)
158}
159ch <- prometheus.MustNewConstMetric(
160statioUserTablesIdxBlksRead,
161prometheus.CounterValue,
162idxBlksReadMetric,
163datnameLabel, schemanameLabel, relnameLabel,
164)
165
166idxBlksHitMetric := 0.0
167if idxBlksHit.Valid {
168idxBlksHitMetric = float64(idxBlksHit.Int64)
169}
170ch <- prometheus.MustNewConstMetric(
171statioUserTablesIdxBlksHit,
172prometheus.CounterValue,
173idxBlksHitMetric,
174datnameLabel, schemanameLabel, relnameLabel,
175)
176
177toastBlksReadMetric := 0.0
178if toastBlksRead.Valid {
179toastBlksReadMetric = float64(toastBlksRead.Int64)
180}
181ch <- prometheus.MustNewConstMetric(
182statioUserTablesToastBlksRead,
183prometheus.CounterValue,
184toastBlksReadMetric,
185datnameLabel, schemanameLabel, relnameLabel,
186)
187
188toastBlksHitMetric := 0.0
189if toastBlksHit.Valid {
190toastBlksHitMetric = float64(toastBlksHit.Int64)
191}
192ch <- prometheus.MustNewConstMetric(
193statioUserTablesToastBlksHit,
194prometheus.CounterValue,
195toastBlksHitMetric,
196datnameLabel, schemanameLabel, relnameLabel,
197)
198
199tidxBlksReadMetric := 0.0
200if tidxBlksRead.Valid {
201tidxBlksReadMetric = float64(tidxBlksRead.Int64)
202}
203ch <- prometheus.MustNewConstMetric(
204statioUserTablesTidxBlksRead,
205prometheus.CounterValue,
206tidxBlksReadMetric,
207datnameLabel, schemanameLabel, relnameLabel,
208)
209
210tidxBlksHitMetric := 0.0
211if tidxBlksHit.Valid {
212tidxBlksHitMetric = float64(tidxBlksHit.Int64)
213}
214ch <- prometheus.MustNewConstMetric(
215statioUserTablesTidxBlksHit,
216prometheus.CounterValue,
217tidxBlksHitMetric,
218datnameLabel, schemanameLabel, relnameLabel,
219)
220}
221return rows.Err()
222}
223