monitorlog.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. package model
  2. import (
  3. "database/sql"
  4. "errors"
  5. "fmt"
  6. "time"
  7. )
  8. type MonitorLog struct {
  9. Model
  10. }
  11. type MonitorLogRow struct {
  12. Id int64
  13. RedisId int64
  14. RedisAddress string
  15. RedisRemark string
  16. LogTime int64
  17. QueryStatus bool
  18. FailedCount int64
  19. UsedMemory int64
  20. MaxMemory int64
  21. SystemMemory int64
  22. Connection int64
  23. QPS int64
  24. EvictedKeys int64
  25. EviIncreased int64
  26. LastMailTime int64
  27. }
  28. func NewMonitorLog(db *sql.DB) *MonitorLog {
  29. return &MonitorLog{
  30. Model{
  31. db: db,
  32. },
  33. }
  34. }
  35. func (m *MonitorLog) Add(row *MonitorLogRow) (int64, error) {
  36. if row.RedisId <= 0 {
  37. return 0, errors.New("Redis的ID必须是正整数")
  38. }
  39. if row.LogTime <= 0 {
  40. row.LogTime = time.Now().Unix()
  41. }
  42. queryStatusInt := 0
  43. if row.QueryStatus {
  44. queryStatusInt = 1
  45. }
  46. ret, err := m.db.Exec(`INSERT INTO monitorlog(redis_id,log_time,query_status,failed_count,used_memory,max_memory,system_memory,connection,qps,evicted_keys,evi_increased) VALUES(?,?,?,?,?,?,?,?,?,?,?)`,
  47. row.RedisId,
  48. row.LogTime,
  49. queryStatusInt,
  50. row.FailedCount,
  51. row.UsedMemory,
  52. row.MaxMemory,
  53. row.SystemMemory,
  54. row.Connection,
  55. row.QPS,
  56. row.EvictedKeys,
  57. row.EviIncreased,
  58. )
  59. if err != nil {
  60. return 0, err
  61. } else {
  62. return ret.LastInsertId()
  63. }
  64. }
  65. func (m *MonitorLog) CleanUntil(until int64) (int64, error) {
  66. ret, err := m.db.Exec("DELETE FROM monitorlog WHERE log_time<?", until)
  67. if err != nil {
  68. return 0, err
  69. } else {
  70. return ret.RowsAffected()
  71. }
  72. }
  73. func (m *MonitorLog) Count(redisId int64) (int64, error) {
  74. var (
  75. row *sql.Row
  76. cnt int64
  77. )
  78. if redisId == 0 {
  79. row = m.db.QueryRow("SELECT COUNT(*) FROM monitorlog")
  80. } else {
  81. row = m.db.QueryRow("SELECT COUNT(*) FROM monitorlog WHERE redis_id=?", redisId)
  82. }
  83. if err := row.Scan(&cnt); err != nil {
  84. return 0, err
  85. } else {
  86. return cnt, nil
  87. }
  88. }
  89. func (m *MonitorLog) GetList(redisId int64, offset int64, limit int64, orderDesc bool) ([]*MonitorLogRow, error) {
  90. var (
  91. orderDir string
  92. ret *sql.Rows
  93. err error
  94. )
  95. if orderDesc {
  96. orderDir = "DESC"
  97. } else {
  98. orderDir = "ASC"
  99. }
  100. if redisId == 0 {
  101. if limit > 0 {
  102. sql := fmt.Sprintf(`SELECT
  103. monitorlog.id,
  104. monitorlog.redis_id,
  105. monitorlog.log_time,
  106. monitorlog.query_status,
  107. monitorlog.failed_count,
  108. monitorlog.used_memory,
  109. monitorlog.max_memory,
  110. monitorlog.system_memory,
  111. monitorlog.connection,
  112. monitorlog.qps,
  113. monitorlog.evicted_keys,
  114. monitorlog.evi_increased,
  115. rediscfg.address,
  116. rediscfg.remark
  117. FROM monitorlog INNER JOIN rediscfg ON monitorlog.redis_id=rediscfg.id ORDER BY monitorlog.id %s LIMIT ?,?`,
  118. orderDir,
  119. )
  120. ret, err = m.db.Query(sql, offset, limit)
  121. } else {
  122. sql := fmt.Sprintf(`SELECT
  123. monitorlog.id,
  124. monitorlog.redis_id,
  125. monitorlog.log_time,
  126. monitorlog.query_status,
  127. monitorlog.failed_count,
  128. monitorlog.used_memory,
  129. monitorlog.max_memory,
  130. monitorlog.system_memory,
  131. monitorlog.connection,
  132. monitorlog.qps,
  133. monitorlog.evicted_keys,
  134. monitorlog.evi_increased,
  135. rediscfg.address,
  136. rediscfg.remark
  137. FROM monitorlog INNER JOIN rediscfg ON monitorlog.redis_id=rediscfg.id ORDER BY monitorlog.id %s`,
  138. orderDir,
  139. )
  140. ret, err = m.db.Query(sql)
  141. }
  142. } else {
  143. if limit > 0 {
  144. sql := fmt.Sprintf(`SELECT
  145. monitorlog.id,
  146. monitorlog.redis_id,
  147. monitorlog.log_time,
  148. monitorlog.query_status,
  149. monitorlog.failed_count,
  150. monitorlog.used_memory,
  151. monitorlog.max_memory,
  152. monitorlog.system_memory,
  153. monitorlog.connection,
  154. monitorlog.qps,
  155. monitorlog.evicted_keys,
  156. monitorlog.evi_increased,
  157. rediscfg.address,
  158. rediscfg.remark
  159. FROM monitorlog INNER JOIN rediscfg ON monitorlog.redis_id=rediscfg.id WHERE monitorlog.redis_id=? ORDER BY monitorlog.id %s LIMIT ?,?`,
  160. orderDir,
  161. )
  162. ret, err = m.db.Query(sql, redisId, offset, limit)
  163. } else {
  164. sql := fmt.Sprintf(`SELECT
  165. monitorlog.id,
  166. monitorlog.redis_id,
  167. monitorlog.log_time,
  168. monitorlog.query_status,
  169. monitorlog.failed_count,
  170. monitorlog.used_memory,
  171. monitorlog.max_memory,
  172. monitorlog.system_memory,
  173. monitorlog.connection,
  174. monitorlog.qps,
  175. monitorlog.evicted_keys,
  176. monitorlog.evi_increased,
  177. rediscfg.address,
  178. rediscfg.remark
  179. FROM monitorlog INNER JOIN rediscfg ON monitorlog.redis_id=rediscfg.id WHERE monitorlog.redis_id=? ORDER BY monitorlog.id %s`,
  180. orderDir,
  181. )
  182. ret, err = m.db.Query(sql, redisId)
  183. }
  184. }
  185. if err != nil {
  186. return nil, err
  187. } else {
  188. rows := make([]*MonitorLogRow, 0)
  189. for ret.Next() {
  190. row := MonitorLogRow{}
  191. err = ret.Scan(
  192. &row.Id,
  193. &row.RedisId,
  194. &row.LogTime,
  195. &row.QueryStatus,
  196. &row.FailedCount,
  197. &row.UsedMemory,
  198. &row.MaxMemory,
  199. &row.SystemMemory,
  200. &row.Connection,
  201. &row.QPS,
  202. &row.EvictedKeys,
  203. &row.EviIncreased,
  204. &row.RedisAddress,
  205. &row.RedisRemark,
  206. )
  207. if err != nil {
  208. continue
  209. }
  210. rows = append(rows, &row)
  211. }
  212. return rows, nil
  213. }
  214. }