@@ -106,50 +106,65 @@ func (r *MySQL) Probe() (bool, string) {
106
106
107
107
// Check if we need to query specific data
108
108
if len (r .Data ) > 0 {
109
- for k , v := range r .Data {
110
- log .Debugf ("[%s / %s / %s] - Verifying Data - [%s] : [%s]" , r .ProbeKind , r .ProbeName , r .ProbeTag , k , v )
111
- sql , err := r .getSQL (k )
112
- if err != nil {
113
- return false , err .Error ()
114
- }
115
- log .Debugf ("[%s / %s / %s] - SQL - [%s]" , r .ProbeKind , r .ProbeName , r .ProbeTag , sql )
116
- rows , err := db .Query (sql )
117
- if err != nil {
118
- return false , err .Error ()
119
- }
120
- if ! rows .Next () {
121
- rows .Close ()
122
- return false , fmt .Sprintf ("No data found for [%s]" , k )
123
- }
124
- //check the value is equal to the value in data
125
- var value string
126
- if err := rows .Scan (& value ); err != nil {
127
- rows .Close ()
128
- return false , err .Error ()
129
- }
130
- if value != v {
131
- rows .Close ()
132
- return false , fmt .Sprintf ("Value not match for [%s] expected [%s] got [%s] " , k , v , value )
133
- }
134
- rows .Close ()
135
- log .Debugf ("[%s / %s / %s] - Data Verified Successfully! - [%s] : [%s]" , r .ProbeKind , r .ProbeName , r .ProbeTag , k , v )
136
- }
137
- } else {
138
- err = db .Ping ()
139
- if err != nil {
109
+ if err := r .ProbeWithDataVerification (db ); err != nil {
140
110
return false , err .Error ()
141
111
}
142
- row , err := db . Query ( "show status like \" uptime \" " ) // run a SQL to test
143
- if err != nil {
112
+ } else {
113
+ if err := r . ProbeWithPing ( db ); err != nil {
144
114
return false , err .Error ()
145
115
}
146
- defer row .Close ()
147
116
}
148
117
149
118
return true , "Check MySQL Server Successfully!"
150
119
151
120
}
152
121
122
+ // ProbeWithPing do the health check with ping
123
+ func (r * MySQL ) ProbeWithPing (db * sql.DB ) error {
124
+ if err := db .Ping (); err != nil {
125
+ return err
126
+ }
127
+ row , err := db .Query ("show status like \" uptime\" " ) // run a SQL to test
128
+ if err != nil {
129
+ return err
130
+ }
131
+ defer row .Close ()
132
+ return nil
133
+ }
134
+
135
+ // ProbeWithDataVerification do the health check with data verification
136
+ func (r * MySQL ) ProbeWithDataVerification (db * sql.DB ) error {
137
+ for k , v := range r .Data {
138
+ log .Debugf ("[%s / %s / %s] - Verifying Data - [%s] : [%s]" , r .ProbeKind , r .ProbeName , r .ProbeTag , k , v )
139
+ sql , err := r .getSQL (k )
140
+ if err != nil {
141
+ return err
142
+ }
143
+ log .Debugf ("[%s / %s / %s] - SQL - [%s]" , r .ProbeKind , r .ProbeName , r .ProbeTag , sql )
144
+ rows , err := db .Query (sql )
145
+ if err != nil {
146
+ return err
147
+ }
148
+ if ! rows .Next () {
149
+ rows .Close ()
150
+ return fmt .Errorf ("No data found for [%s]" , k )
151
+ }
152
+ //check the value is equal to the value in data
153
+ var value string
154
+ if err := rows .Scan (& value ); err != nil {
155
+ rows .Close ()
156
+ return err
157
+ }
158
+ if value != v {
159
+ rows .Close ()
160
+ return fmt .Errorf ("Value not match for [%s] expected [%s] got [%s] " , k , v , value )
161
+ }
162
+ rows .Close ()
163
+ log .Debugf ("[%s / %s / %s] - Data Verified Successfully! - [%s] : [%s]" , r .ProbeKind , r .ProbeName , r .ProbeTag , k , v )
164
+ }
165
+ return nil
166
+ }
167
+
153
168
// getSQL get the SQL statement
154
169
// input: database:table:column:key:value
155
170
// output: SELECT column FROM database.table WHERE key = value
@@ -161,16 +176,16 @@ func (r *MySQL) getSQL(str string) (string, error) {
161
176
if len (fields ) != 5 {
162
177
return "" , fmt .Errorf ("Invalid SQL data - [%s]. (syntax: database:table:field:key:value)" , str )
163
178
}
164
- db := fields [0 ]
165
- table := fields [1 ]
166
- field := fields [2 ]
167
- key := fields [3 ]
168
- value := fields [4 ]
179
+ db := global . EscapeQuote ( fields [0 ])
180
+ table := global . EscapeQuote ( fields [1 ])
181
+ field := global . EscapeQuote ( fields [2 ])
182
+ key := global . EscapeQuote ( fields [3 ])
183
+ value := global . EscapeQuote ( fields [4 ])
169
184
//check value is int or not
170
185
if _ , err := strconv .Atoi (value ); err != nil {
171
186
return "" , fmt .Errorf ("Invalid SQL data - [%s], the value must be int" , str )
172
187
}
173
188
174
- sql := fmt .Sprintf ("SELECT %s FROM %s.%s WHERE %s = %s" , field , db , table , key , value )
189
+ sql := fmt .Sprintf ("SELECT `%s` FROM `%s`.`%s` WHERE `%s` = %s" , field , db , table , key , value )
175
190
return sql , nil
176
191
}
0 commit comments