-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsettings.go
101 lines (86 loc) · 2.11 KB
/
settings.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package db
import (
"agent/logger"
"database/sql"
"time"
)
// https://www.postgresql.org/docs/10/view-pg-settings.html
type Setting struct {
ServerID *ServerID
Name string
Value string
Unit sql.NullString
Category string
Description string
Context string
VarType string
Source string
MinVal sql.NullString
MaxVal sql.NullString
EnumVals sql.NullString
BootVal sql.NullString
ResetVal sql.NullString
PendingRestart bool
MeasuredAt int64
}
type SettingsMonitor struct {
settingsChannel chan []*Setting
}
func (o *Observer) MonitorSettings() {
for _, postgresClient := range o.postgresClients {
go NewMonitorWorker(
o.config,
postgresClient,
&SettingsMonitor{
settingsChannel: o.settingsChannel,
},
).Start()
}
}
func (m *SettingsMonitor) Run(postgresClient *PostgresClient) {
settings := m.FindSettings(postgresClient)
select {
case m.settingsChannel <- settings:
// sent
default:
logger.Warn("Dropping settings: channel buffer full")
}
}
func (m *SettingsMonitor) FindSettings(postgresClient *PostgresClient) []*Setting {
query := `select name, setting, unit, category, short_desc || ' ' || coalesce(extra_desc, '') as desc,
context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart
from pg_settings` + postgresMonitorQueryComment()
rows, err := postgresClient.client.Query(query)
if err != nil {
return []*Setting{}
}
defer rows.Close()
var settings []*Setting
measuredAt := time.Now().UTC().Unix()
for rows.Next() {
var setting Setting
err := rows.Scan(
&setting.Name,
&setting.Value,
&setting.Unit,
&setting.Category,
&setting.Description,
&setting.Context,
&setting.VarType,
&setting.Source,
&setting.MinVal,
&setting.MaxVal,
&setting.EnumVals,
&setting.BootVal,
&setting.ResetVal,
&setting.PendingRestart,
)
if err != nil {
continue
}
setting.MeasuredAt = measuredAt
setting.ServerID = postgresClient.serverID
settings = append(settings, &setting)
}
return settings
}