master
go 278 lines 15.7 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package mysql
4
5 import (
6 "strings"
7
8 "github.com/netdata/netdata/go/plugins/pkg/metrix"
9 )
10
11 type collectorMetrics struct {
12 globalStatus globalStatusMetrics
13 replication map[string]metrix.SnapshotGaugeVec
14 userstats map[string]metrix.SnapshotCounterVec
15
16 wsrepLocalState metrix.StateSetInstrument
17 wsrepClusterStatus metrix.StateSetInstrument
18 }
19
20 type globalStatusMetrics struct {
21 gauges map[string]metrix.SnapshotGauge
22 counters map[string]metrix.SnapshotCounter
23 }
24
25 func newCollectorMetrics(store metrix.CollectorStore) *collectorMetrics {
26 meter := store.Write().SnapshotMeter("")
27 replicationVec := meter.Vec("connection")
28 userVec := meter.Vec("user")
29
30 return &collectorMetrics{
31 globalStatus: globalStatusMetrics{
32 gauges: map[string]metrix.SnapshotGauge{
33 "innodb_buffer_pool_bytes_data": meter.Gauge("innodb_buffer_pool_bytes_data"),
34 "innodb_buffer_pool_bytes_dirty": meter.Gauge("innodb_buffer_pool_bytes_dirty"),
35 "innodb_buffer_pool_pages_data": meter.Gauge("innodb_buffer_pool_pages_data"),
36 "innodb_buffer_pool_pages_dirty": meter.Gauge("innodb_buffer_pool_pages_dirty"),
37 "innodb_buffer_pool_pages_free": meter.Gauge("innodb_buffer_pool_pages_free"),
38 "innodb_buffer_pool_pages_misc": meter.Gauge("innodb_buffer_pool_pages_misc"),
39 "innodb_buffer_pool_pages_total": meter.Gauge("innodb_buffer_pool_pages_total"),
40 "innodb_buffer_pool_read_requests": meter.Gauge("innodb_buffer_pool_read_requests"),
41 "innodb_buffer_pool_write_requests": meter.Gauge("innodb_buffer_pool_write_requests"),
42 "innodb_checkpoint_age": meter.Gauge("innodb_checkpoint_age"),
43 "innodb_data_pending_fsyncs": meter.Gauge("innodb_data_pending_fsyncs"),
44 "innodb_data_pending_reads": meter.Gauge("innodb_data_pending_reads"),
45 "innodb_data_pending_writes": meter.Gauge("innodb_data_pending_writes"),
46 "innodb_log_file_size": meter.Gauge("innodb_log_file_size"),
47 "innodb_log_files_in_group": meter.Gauge("innodb_log_files_in_group"),
48 "innodb_log_group_capacity": meter.Gauge("innodb_log_group_capacity"),
49 "innodb_log_occupancy": meter.Gauge("innodb_log_occupancy"),
50 "innodb_os_log_pending_fsyncs": meter.Gauge("innodb_os_log_pending_fsyncs"),
51 "innodb_os_log_pending_writes": meter.Gauge("innodb_os_log_pending_writes"),
52 "innodb_row_lock_current_waits": meter.Gauge("innodb_row_lock_current_waits"),
53 "key_blocks_not_flushed": meter.Gauge("key_blocks_not_flushed"),
54 "key_blocks_unused": meter.Gauge("key_blocks_unused"),
55 "key_blocks_used": meter.Gauge("key_blocks_used"),
56 "max_connections": meter.Gauge("max_connections"),
57 "max_used_connections": meter.Gauge("max_used_connections"),
58 "open_files": meter.Gauge("open_files"),
59 "open_tables": meter.Gauge("open_tables"),
60 "process_list_fetch_query_duration": meter.Gauge("process_list_fetch_query_duration"),
61 "process_list_longest_query_duration": meter.Gauge("process_list_longest_query_duration"),
62 "process_list_queries_count_system": meter.Gauge("process_list_queries_count_system"),
63 "process_list_queries_count_user": meter.Gauge("process_list_queries_count_user"),
64 "qcache_free_blocks": meter.Gauge("qcache_free_blocks"),
65 "qcache_free_memory": meter.Gauge("qcache_free_memory"),
66 "qcache_queries_in_cache": meter.Gauge("qcache_queries_in_cache"),
67 "qcache_total_blocks": meter.Gauge("qcache_total_blocks"),
68 "table_open_cache": meter.Gauge("table_open_cache"),
69 "thread_cache_misses": meter.Gauge("thread_cache_misses"),
70 "threads_cached": meter.Gauge("threads_cached"),
71 "threads_connected": meter.Gauge("threads_connected"),
72 "threads_running": meter.Gauge("threads_running"),
73 "wsrep_cluster_size": meter.Gauge("wsrep_cluster_size"),
74 "wsrep_cluster_weight": meter.Gauge("wsrep_cluster_weight"),
75 "wsrep_connected": meter.Gauge("wsrep_connected"),
76 "wsrep_local_recv_queue": meter.Gauge("wsrep_local_recv_queue"),
77 "wsrep_local_send_queue": meter.Gauge("wsrep_local_send_queue"),
78 "wsrep_open_transactions": meter.Gauge("wsrep_open_transactions"),
79 "wsrep_ready": meter.Gauge("wsrep_ready"),
80 "wsrep_thread_count": meter.Gauge("wsrep_thread_count"),
81 },
82 counters: map[string]metrix.SnapshotCounter{
83 "aborted_connects": meter.Counter("aborted_connects"),
84 "binlog_cache_disk_use": meter.Counter("binlog_cache_disk_use"),
85 "binlog_cache_use": meter.Counter("binlog_cache_use"),
86 "binlog_stmt_cache_disk_use": meter.Counter("binlog_stmt_cache_disk_use"),
87 "binlog_stmt_cache_use": meter.Counter("binlog_stmt_cache_use"),
88 "bytes_received": meter.Counter("bytes_received"),
89 "bytes_sent": meter.Counter("bytes_sent"),
90 "com_delete": meter.Counter("com_delete"),
91 "com_insert": meter.Counter("com_insert"),
92 "com_replace": meter.Counter("com_replace"),
93 "com_select": meter.Counter("com_select"),
94 "com_update": meter.Counter("com_update"),
95 "connection_errors_accept": meter.Counter("connection_errors_accept"),
96 "connection_errors_internal": meter.Counter("connection_errors_internal"),
97 "connection_errors_max_connections": meter.Counter("connection_errors_max_connections"),
98 "connection_errors_peer_address": meter.Counter("connection_errors_peer_address"),
99 "connection_errors_select": meter.Counter("connection_errors_select"),
100 "connection_errors_tcpwrap": meter.Counter("connection_errors_tcpwrap"),
101 "connections": meter.Counter("connections"),
102 "created_tmp_disk_tables": meter.Counter("created_tmp_disk_tables"),
103 "created_tmp_files": meter.Counter("created_tmp_files"),
104 "created_tmp_tables": meter.Counter("created_tmp_tables"),
105 "handler_commit": meter.Counter("handler_commit"),
106 "handler_delete": meter.Counter("handler_delete"),
107 "handler_prepare": meter.Counter("handler_prepare"),
108 "handler_read_first": meter.Counter("handler_read_first"),
109 "handler_read_key": meter.Counter("handler_read_key"),
110 "handler_read_next": meter.Counter("handler_read_next"),
111 "handler_read_prev": meter.Counter("handler_read_prev"),
112 "handler_read_rnd": meter.Counter("handler_read_rnd"),
113 "handler_read_rnd_next": meter.Counter("handler_read_rnd_next"),
114 "handler_rollback": meter.Counter("handler_rollback"),
115 "handler_savepoint": meter.Counter("handler_savepoint"),
116 "handler_savepoint_rollback": meter.Counter("handler_savepoint_rollback"),
117 "handler_update": meter.Counter("handler_update"),
118 "handler_write": meter.Counter("handler_write"),
119 "innodb_buffer_pool_pages_flushed": meter.Counter("innodb_buffer_pool_pages_flushed"),
120 "innodb_buffer_pool_read_ahead": meter.Counter("innodb_buffer_pool_read_ahead"),
121 "innodb_buffer_pool_read_ahead_evicted": meter.Counter("innodb_buffer_pool_read_ahead_evicted"),
122 "innodb_buffer_pool_read_ahead_rnd": meter.Counter("innodb_buffer_pool_read_ahead_rnd"),
123 "innodb_buffer_pool_reads": meter.Counter("innodb_buffer_pool_reads"),
124 "innodb_buffer_pool_wait_free": meter.Counter("innodb_buffer_pool_wait_free"),
125 "innodb_data_fsyncs": meter.Counter("innodb_data_fsyncs"),
126 "innodb_data_read": meter.Counter("innodb_data_read"),
127 "innodb_data_reads": meter.Counter("innodb_data_reads"),
128 "innodb_data_writes": meter.Counter("innodb_data_writes"),
129 "innodb_data_written": meter.Counter("innodb_data_written"),
130 "innodb_deadlocks": meter.Counter("innodb_deadlocks"),
131 "innodb_last_checkpoint_at": meter.Counter("innodb_last_checkpoint_at"),
132 "innodb_log_sequence_number": meter.Counter("innodb_log_sequence_number"),
133 "innodb_log_waits": meter.Counter("innodb_log_waits"),
134 "innodb_log_write_requests": meter.Counter("innodb_log_write_requests"),
135 "innodb_log_writes": meter.Counter("innodb_log_writes"),
136 "innodb_os_log_fsyncs": meter.Counter("innodb_os_log_fsyncs"),
137 "innodb_os_log_written": meter.Counter("innodb_os_log_written"),
138 "innodb_rows_deleted": meter.Counter("innodb_rows_deleted"),
139 "innodb_rows_inserted": meter.Counter("innodb_rows_inserted"),
140 "innodb_rows_read": meter.Counter("innodb_rows_read"),
141 "innodb_rows_updated": meter.Counter("innodb_rows_updated"),
142 "key_read_requests": meter.Counter("key_read_requests"),
143 "key_reads": meter.Counter("key_reads"),
144 "key_write_requests": meter.Counter("key_write_requests"),
145 "key_writes": meter.Counter("key_writes"),
146 "opened_files": meter.Counter("opened_files"),
147 "opened_tables": meter.Counter("opened_tables"),
148 "qcache_hits": meter.Counter("qcache_hits"),
149 "qcache_inserts": meter.Counter("qcache_inserts"),
150 "qcache_lowmem_prunes": meter.Counter("qcache_lowmem_prunes"),
151 "qcache_not_cached": meter.Counter("qcache_not_cached"),
152 "queries": meter.Counter("queries"),
153 "questions": meter.Counter("questions"),
154 "select_full_join": meter.Counter("select_full_join"),
155 "select_full_range_join": meter.Counter("select_full_range_join"),
156 "select_range": meter.Counter("select_range"),
157 "select_range_check": meter.Counter("select_range_check"),
158 "select_scan": meter.Counter("select_scan"),
159 "slow_queries": meter.Counter("slow_queries"),
160 "sort_merge_passes": meter.Counter("sort_merge_passes"),
161 "sort_range": meter.Counter("sort_range"),
162 "sort_scan": meter.Counter("sort_scan"),
163 "table_locks_immediate": meter.Counter("table_locks_immediate"),
164 "table_locks_waited": meter.Counter("table_locks_waited"),
165 "table_open_cache_overflows": meter.Counter("table_open_cache_overflows"),
166 "threads_created": meter.Counter("threads_created"),
167 "wsrep_flow_control_paused_ns": meter.Counter("wsrep_flow_control_paused_ns"),
168 "wsrep_local_bf_aborts": meter.Counter("wsrep_local_bf_aborts"),
169 "wsrep_local_cert_failures": meter.Counter("wsrep_local_cert_failures"),
170 "wsrep_received": meter.Counter("wsrep_received"),
171 "wsrep_received_bytes": meter.Counter("wsrep_received_bytes"),
172 "wsrep_replicated": meter.Counter("wsrep_replicated"),
173 "wsrep_replicated_bytes": meter.Counter("wsrep_replicated_bytes"),
174 },
175 },
176 replication: map[string]metrix.SnapshotGaugeVec{
177 "seconds_behind_master": replicationVec.Gauge("seconds_behind_master"),
178 "slave_sql_running": replicationVec.Gauge("slave_sql_running"),
179 "slave_io_running": replicationVec.Gauge("slave_io_running"),
180 },
181 userstats: map[string]metrix.SnapshotCounterVec{
182 "userstats_total_connections": userVec.Counter("userstats_total_connections"),
183 "userstats_lost_connections": userVec.Counter("userstats_lost_connections"),
184 "userstats_denied_connections": userVec.Counter("userstats_denied_connections"),
185 "userstats_empty_queries": userVec.Counter("userstats_empty_queries"),
186 "userstats_binlog_bytes_written": userVec.Counter("userstats_binlog_bytes_written"),
187 "userstats_rows_read": userVec.Counter("userstats_rows_read"),
188 "userstats_rows_sent": userVec.Counter("userstats_rows_sent"),
189 "userstats_rows_deleted": userVec.Counter("userstats_rows_deleted"),
190 "userstats_rows_inserted": userVec.Counter("userstats_rows_inserted"),
191 "userstats_rows_updated": userVec.Counter("userstats_rows_updated"),
192 "userstats_rows_fetched": userVec.Counter("userstats_rows_fetched"),
193 "userstats_select_commands": userVec.Counter("userstats_select_commands"),
194 "userstats_update_commands": userVec.Counter("userstats_update_commands"),
195 "userstats_other_commands": userVec.Counter("userstats_other_commands"),
196 "userstats_access_denied": userVec.Counter("userstats_access_denied"),
197 "userstats_commit_transactions": userVec.Counter("userstats_commit_transactions"),
198 "userstats_rollback_transactions": userVec.Counter("userstats_rollback_transactions"),
199 "userstats_cpu_time": userVec.Counter("userstats_cpu_time"),
200 },
201
202 wsrepLocalState: meter.StateSet(
203 "wsrep_local_state",
204 metrix.WithStateSetMode(metrix.ModeBitSet),
205 metrix.WithStateSetStates("undefined", "joining", "donor", "joined", "synced", "error"),
206 ),
207 wsrepClusterStatus: meter.StateSet(
208 "wsrep_cluster_status",
209 metrix.WithStateSetMode(metrix.ModeBitSet),
210 metrix.WithStateSetStates("primary", "non_primary", "disconnected"),
211 ),
212 }
213 }
214
215 func (m *collectorMetrics) set(name string, value int64) {
216 if c, ok := m.globalStatus.counters[name]; ok {
217 c.ObserveTotal(float64(value))
218 return
219 }
220 if g, ok := m.globalStatus.gauges[name]; ok {
221 g.Observe(float64(value))
222 }
223 }
224
225 func (m *collectorMetrics) setReplication(name, connection string, value int64) {
226 connection = strings.ToLower(connection)
227 if metric, ok := m.replication[name]; ok {
228 metric.WithLabelValues(connection).Observe(float64(value))
229 }
230 }
231
232 func (m *collectorMetrics) setUser(name, user string, value int64) {
233 user = strings.ToLower(user)
234 if metric, ok := m.userstats[name]; ok {
235 metric.WithLabelValues(user).ObserveTotal(float64(value))
236 }
237 }
238
239 func (m *collectorMetrics) setWsrepLocalState(value string) {
240 state := "error"
241 switch value {
242 case "0":
243 state = "undefined"
244 case "1":
245 state = "joining"
246 case "2":
247 state = "donor"
248 case "3":
249 state = "joined"
250 case "4":
251 state = "synced"
252 default:
253 if parseInt(value) <= 0 {
254 state = "undefined"
255 }
256 }
257 m.wsrepLocalState.Enable(state)
258 }
259
260 func (m *collectorMetrics) setWsrepClusterStatus(value string) {
261 switch strings.ToUpper(value) {
262 case "PRIMARY":
263 m.wsrepClusterStatus.Enable("primary")
264 case "NON-PRIMARY":
265 m.wsrepClusterStatus.Enable("non_primary")
266 case "DISCONNECTED":
267 m.wsrepClusterStatus.Enable("disconnected")
268 default:
269 m.wsrepClusterStatus.ObserveStateSet(metrix.StateSetPoint{})
270 }
271 }
272
273 type collectRunState struct {
274 connections int64
275 threadsCreated int64
276
277 innodbCheckpointAge int64
278 }