pangolin_exporter

Форк
0
/
pg_statio_user_tables.go 
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

14
package collector
15

16
import (
17
	"context"
18
	"database/sql"
19

20
	"github.com/go-kit/log"
21
	"github.com/prometheus/client_golang/prometheus"
22
)
23

24
const statioUserTableSubsystem = "statio_user_tables"
25

26
func init() {
27
	registerCollector(statioUserTableSubsystem, defaultEnabled, NewPGStatIOUserTablesCollector)
28
}
29

30
type PGStatIOUserTablesCollector struct {
31
	log log.Logger
32
}
33

34
func NewPGStatIOUserTablesCollector(config collectorConfig) (Collector, error) {
35
	return &PGStatIOUserTablesCollector{log: config.logger}, nil
36
}
37

38
var (
39
	statioUserTablesHeapBlksRead = prometheus.NewDesc(
40
		prometheus.BuildFQName(namespace, statioUserTableSubsystem, "heap_blocks_read"),
41
		"Number of disk blocks read from this table",
42
		[]string{"datname", "schemaname", "relname"},
43
		prometheus.Labels{},
44
	)
45
	statioUserTablesHeapBlksHit = prometheus.NewDesc(
46
		prometheus.BuildFQName(namespace, statioUserTableSubsystem, "heap_blocks_hit"),
47
		"Number of buffer hits in this table",
48
		[]string{"datname", "schemaname", "relname"},
49
		prometheus.Labels{},
50
	)
51
	statioUserTablesIdxBlksRead = prometheus.NewDesc(
52
		prometheus.BuildFQName(namespace, statioUserTableSubsystem, "idx_blocks_read"),
53
		"Number of disk blocks read from all indexes on this table",
54
		[]string{"datname", "schemaname", "relname"},
55
		prometheus.Labels{},
56
	)
57
	statioUserTablesIdxBlksHit = prometheus.NewDesc(
58
		prometheus.BuildFQName(namespace, statioUserTableSubsystem, "idx_blocks_hit"),
59
		"Number of buffer hits in all indexes on this table",
60
		[]string{"datname", "schemaname", "relname"},
61
		prometheus.Labels{},
62
	)
63
	statioUserTablesToastBlksRead = prometheus.NewDesc(
64
		prometheus.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"},
67
		prometheus.Labels{},
68
	)
69
	statioUserTablesToastBlksHit = prometheus.NewDesc(
70
		prometheus.BuildFQName(namespace, statioUserTableSubsystem, "toast_blocks_hit"),
71
		"Number of buffer hits in this table's TOAST table (if any)",
72
		[]string{"datname", "schemaname", "relname"},
73
		prometheus.Labels{},
74
	)
75
	statioUserTablesTidxBlksRead = prometheus.NewDesc(
76
		prometheus.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"},
79
		prometheus.Labels{},
80
	)
81
	statioUserTablesTidxBlksHit = prometheus.NewDesc(
82
		prometheus.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"},
85
		prometheus.Labels{},
86
	)
87

88
	statioUserTablesQuery = `SELECT
89
		current_database() datname,
90
		schemaname,
91
		relname,
92
		heap_blks_read,
93
		heap_blks_hit,
94
		idx_blks_read,
95
		idx_blks_hit,
96
		toast_blks_read,
97
		toast_blks_hit,
98
		tidx_blks_read,
99
		tidx_blks_hit
100
	FROM pg_statio_user_tables`
101
)
102

103
func (PGStatIOUserTablesCollector) Update(ctx context.Context, instance *instance, ch chan<- prometheus.Metric) error {
104
	db := instance.getDB()
105
	rows, err := db.QueryContext(ctx,
106
		statioUserTablesQuery)
107

108
	if err != nil {
109
		return err
110
	}
111
	defer rows.Close()
112

113
	for rows.Next() {
114
		var datname, schemaname, relname sql.NullString
115
		var heapBlksRead, heapBlksHit, idxBlksRead, idxBlksHit, toastBlksRead, toastBlksHit, tidxBlksRead, tidxBlksHit sql.NullInt64
116

117
		if err := rows.Scan(&datname, &schemaname, &relname, &heapBlksRead, &heapBlksHit, &idxBlksRead, &idxBlksHit, &toastBlksRead, &toastBlksHit, &tidxBlksRead, &tidxBlksHit); err != nil {
118
			return err
119
		}
120
		datnameLabel := "unknown"
121
		if datname.Valid {
122
			datnameLabel = datname.String
123
		}
124
		schemanameLabel := "unknown"
125
		if schemaname.Valid {
126
			schemanameLabel = schemaname.String
127
		}
128
		relnameLabel := "unknown"
129
		if relname.Valid {
130
			relnameLabel = relname.String
131
		}
132

133
		heapBlksReadMetric := 0.0
134
		if heapBlksRead.Valid {
135
			heapBlksReadMetric = float64(heapBlksRead.Int64)
136
		}
137
		ch <- prometheus.MustNewConstMetric(
138
			statioUserTablesHeapBlksRead,
139
			prometheus.CounterValue,
140
			heapBlksReadMetric,
141
			datnameLabel, schemanameLabel, relnameLabel,
142
		)
143

144
		heapBlksHitMetric := 0.0
145
		if heapBlksHit.Valid {
146
			heapBlksHitMetric = float64(heapBlksHit.Int64)
147
		}
148
		ch <- prometheus.MustNewConstMetric(
149
			statioUserTablesHeapBlksHit,
150
			prometheus.CounterValue,
151
			heapBlksHitMetric,
152
			datnameLabel, schemanameLabel, relnameLabel,
153
		)
154

155
		idxBlksReadMetric := 0.0
156
		if idxBlksRead.Valid {
157
			idxBlksReadMetric = float64(idxBlksRead.Int64)
158
		}
159
		ch <- prometheus.MustNewConstMetric(
160
			statioUserTablesIdxBlksRead,
161
			prometheus.CounterValue,
162
			idxBlksReadMetric,
163
			datnameLabel, schemanameLabel, relnameLabel,
164
		)
165

166
		idxBlksHitMetric := 0.0
167
		if idxBlksHit.Valid {
168
			idxBlksHitMetric = float64(idxBlksHit.Int64)
169
		}
170
		ch <- prometheus.MustNewConstMetric(
171
			statioUserTablesIdxBlksHit,
172
			prometheus.CounterValue,
173
			idxBlksHitMetric,
174
			datnameLabel, schemanameLabel, relnameLabel,
175
		)
176

177
		toastBlksReadMetric := 0.0
178
		if toastBlksRead.Valid {
179
			toastBlksReadMetric = float64(toastBlksRead.Int64)
180
		}
181
		ch <- prometheus.MustNewConstMetric(
182
			statioUserTablesToastBlksRead,
183
			prometheus.CounterValue,
184
			toastBlksReadMetric,
185
			datnameLabel, schemanameLabel, relnameLabel,
186
		)
187

188
		toastBlksHitMetric := 0.0
189
		if toastBlksHit.Valid {
190
			toastBlksHitMetric = float64(toastBlksHit.Int64)
191
		}
192
		ch <- prometheus.MustNewConstMetric(
193
			statioUserTablesToastBlksHit,
194
			prometheus.CounterValue,
195
			toastBlksHitMetric,
196
			datnameLabel, schemanameLabel, relnameLabel,
197
		)
198

199
		tidxBlksReadMetric := 0.0
200
		if tidxBlksRead.Valid {
201
			tidxBlksReadMetric = float64(tidxBlksRead.Int64)
202
		}
203
		ch <- prometheus.MustNewConstMetric(
204
			statioUserTablesTidxBlksRead,
205
			prometheus.CounterValue,
206
			tidxBlksReadMetric,
207
			datnameLabel, schemanameLabel, relnameLabel,
208
		)
209

210
		tidxBlksHitMetric := 0.0
211
		if tidxBlksHit.Valid {
212
			tidxBlksHitMetric = float64(tidxBlksHit.Int64)
213
		}
214
		ch <- prometheus.MustNewConstMetric(
215
			statioUserTablesTidxBlksHit,
216
			prometheus.CounterValue,
217
			tidxBlksHitMetric,
218
			datnameLabel, schemanameLabel, relnameLabel,
219
		)
220
	}
221
	return rows.Err()
222
}
223

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.