clawsql 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/.env.example +97 -0
  2. package/README.md +372 -0
  3. package/dist/__tests__/config/settings.test.d.ts +5 -0
  4. package/dist/__tests__/config/settings.test.d.ts.map +1 -0
  5. package/dist/__tests__/config/settings.test.js +154 -0
  6. package/dist/__tests__/config/settings.test.js.map +1 -0
  7. package/dist/__tests__/core/discovery/topology.test.d.ts +5 -0
  8. package/dist/__tests__/core/discovery/topology.test.d.ts.map +1 -0
  9. package/dist/__tests__/core/discovery/topology.test.js +191 -0
  10. package/dist/__tests__/core/discovery/topology.test.js.map +1 -0
  11. package/dist/__tests__/core/failover/executor.test.d.ts +5 -0
  12. package/dist/__tests__/core/failover/executor.test.d.ts.map +1 -0
  13. package/dist/__tests__/core/failover/executor.test.js +256 -0
  14. package/dist/__tests__/core/failover/executor.test.js.map +1 -0
  15. package/dist/__tests__/core/monitoring/collector.test.d.ts +5 -0
  16. package/dist/__tests__/core/monitoring/collector.test.d.ts.map +1 -0
  17. package/dist/__tests__/core/monitoring/collector.test.js +131 -0
  18. package/dist/__tests__/core/monitoring/collector.test.js.map +1 -0
  19. package/dist/__tests__/core/monitoring/exporters.test.d.ts +5 -0
  20. package/dist/__tests__/core/monitoring/exporters.test.d.ts.map +1 -0
  21. package/dist/__tests__/core/monitoring/exporters.test.js +90 -0
  22. package/dist/__tests__/core/monitoring/exporters.test.js.map +1 -0
  23. package/dist/__tests__/core/routing/proxysql-manager.test.d.ts +5 -0
  24. package/dist/__tests__/core/routing/proxysql-manager.test.d.ts.map +1 -0
  25. package/dist/__tests__/core/routing/proxysql-manager.test.js +155 -0
  26. package/dist/__tests__/core/routing/proxysql-manager.test.js.map +1 -0
  27. package/dist/__tests__/types/index.test.d.ts +5 -0
  28. package/dist/__tests__/types/index.test.d.ts.map +1 -0
  29. package/dist/__tests__/types/index.test.js +290 -0
  30. package/dist/__tests__/types/index.test.js.map +1 -0
  31. package/dist/__tests__/utils/exceptions.test.d.ts +5 -0
  32. package/dist/__tests__/utils/exceptions.test.d.ts.map +1 -0
  33. package/dist/__tests__/utils/exceptions.test.js +142 -0
  34. package/dist/__tests__/utils/exceptions.test.js.map +1 -0
  35. package/dist/api/routes/clusters.d.ts +7 -0
  36. package/dist/api/routes/clusters.d.ts.map +1 -0
  37. package/dist/api/routes/clusters.js +123 -0
  38. package/dist/api/routes/clusters.js.map +1 -0
  39. package/dist/api/routes/config.d.ts +7 -0
  40. package/dist/api/routes/config.d.ts.map +1 -0
  41. package/dist/api/routes/config.js +65 -0
  42. package/dist/api/routes/config.js.map +1 -0
  43. package/dist/api/routes/failover.d.ts +7 -0
  44. package/dist/api/routes/failover.d.ts.map +1 -0
  45. package/dist/api/routes/failover.js +100 -0
  46. package/dist/api/routes/failover.js.map +1 -0
  47. package/dist/api/routes/instances.d.ts +11 -0
  48. package/dist/api/routes/instances.d.ts.map +1 -0
  49. package/dist/api/routes/instances.js +315 -0
  50. package/dist/api/routes/instances.js.map +1 -0
  51. package/dist/api/routes/monitoring.d.ts +7 -0
  52. package/dist/api/routes/monitoring.d.ts.map +1 -0
  53. package/dist/api/routes/monitoring.js +72 -0
  54. package/dist/api/routes/monitoring.js.map +1 -0
  55. package/dist/api/routes/webhooks.d.ts +12 -0
  56. package/dist/api/routes/webhooks.d.ts.map +1 -0
  57. package/dist/api/routes/webhooks.js +232 -0
  58. package/dist/api/routes/webhooks.js.map +1 -0
  59. package/dist/api/schemas/index.d.ts +965 -0
  60. package/dist/api/schemas/index.d.ts.map +1 -0
  61. package/dist/api/schemas/index.js +171 -0
  62. package/dist/api/schemas/index.js.map +1 -0
  63. package/dist/app.d.ts +13 -0
  64. package/dist/app.d.ts.map +1 -0
  65. package/dist/app.js +197 -0
  66. package/dist/app.js.map +1 -0
  67. package/dist/bin/clawsql.d.ts +12 -0
  68. package/dist/bin/clawsql.d.ts.map +1 -0
  69. package/dist/bin/clawsql.js +43 -0
  70. package/dist/bin/clawsql.js.map +1 -0
  71. package/dist/cli/agent/handler.d.ts +73 -0
  72. package/dist/cli/agent/handler.d.ts.map +1 -0
  73. package/dist/cli/agent/handler.js +258 -0
  74. package/dist/cli/agent/handler.js.map +1 -0
  75. package/dist/cli/agent/index.d.ts +14 -0
  76. package/dist/cli/agent/index.d.ts.map +1 -0
  77. package/dist/cli/agent/index.js +30 -0
  78. package/dist/cli/agent/index.js.map +1 -0
  79. package/dist/cli/agent/openclaw-integration.d.ts +81 -0
  80. package/dist/cli/agent/openclaw-integration.d.ts.map +1 -0
  81. package/dist/cli/agent/openclaw-integration.js +341 -0
  82. package/dist/cli/agent/openclaw-integration.js.map +1 -0
  83. package/dist/cli/agent/providers/anthropic.d.ts +27 -0
  84. package/dist/cli/agent/providers/anthropic.d.ts.map +1 -0
  85. package/dist/cli/agent/providers/anthropic.js +106 -0
  86. package/dist/cli/agent/providers/anthropic.js.map +1 -0
  87. package/dist/cli/agent/providers/base.d.ts +91 -0
  88. package/dist/cli/agent/providers/base.d.ts.map +1 -0
  89. package/dist/cli/agent/providers/base.js +24 -0
  90. package/dist/cli/agent/providers/base.js.map +1 -0
  91. package/dist/cli/agent/providers/openai.d.ts +27 -0
  92. package/dist/cli/agent/providers/openai.d.ts.map +1 -0
  93. package/dist/cli/agent/providers/openai.js +98 -0
  94. package/dist/cli/agent/providers/openai.js.map +1 -0
  95. package/dist/cli/agent/tools/index.d.ts +32 -0
  96. package/dist/cli/agent/tools/index.d.ts.map +1 -0
  97. package/dist/cli/agent/tools/index.js +263 -0
  98. package/dist/cli/agent/tools/index.js.map +1 -0
  99. package/dist/cli/commands/cleanup.d.ts +12 -0
  100. package/dist/cli/commands/cleanup.d.ts.map +1 -0
  101. package/dist/cli/commands/cleanup.js +205 -0
  102. package/dist/cli/commands/cleanup.js.map +1 -0
  103. package/dist/cli/commands/clusters.d.ts +12 -0
  104. package/dist/cli/commands/clusters.d.ts.map +1 -0
  105. package/dist/cli/commands/clusters.js +468 -0
  106. package/dist/cli/commands/clusters.js.map +1 -0
  107. package/dist/cli/commands/config.d.ts +12 -0
  108. package/dist/cli/commands/config.d.ts.map +1 -0
  109. package/dist/cli/commands/config.js +406 -0
  110. package/dist/cli/commands/config.js.map +1 -0
  111. package/dist/cli/commands/cron.d.ts +12 -0
  112. package/dist/cli/commands/cron.d.ts.map +1 -0
  113. package/dist/cli/commands/cron.js +215 -0
  114. package/dist/cli/commands/cron.js.map +1 -0
  115. package/dist/cli/commands/doctor.d.ts +13 -0
  116. package/dist/cli/commands/doctor.d.ts.map +1 -0
  117. package/dist/cli/commands/doctor.js +687 -0
  118. package/dist/cli/commands/doctor.js.map +1 -0
  119. package/dist/cli/commands/failover.d.ts +16 -0
  120. package/dist/cli/commands/failover.d.ts.map +1 -0
  121. package/dist/cli/commands/failover.js +333 -0
  122. package/dist/cli/commands/failover.js.map +1 -0
  123. package/dist/cli/commands/health.d.ts +12 -0
  124. package/dist/cli/commands/health.d.ts.map +1 -0
  125. package/dist/cli/commands/health.js +125 -0
  126. package/dist/cli/commands/health.js.map +1 -0
  127. package/dist/cli/commands/help.d.ts +12 -0
  128. package/dist/cli/commands/help.d.ts.map +1 -0
  129. package/dist/cli/commands/help.js +52 -0
  130. package/dist/cli/commands/help.js.map +1 -0
  131. package/dist/cli/commands/instances.d.ts +12 -0
  132. package/dist/cli/commands/instances.d.ts.map +1 -0
  133. package/dist/cli/commands/instances.js +801 -0
  134. package/dist/cli/commands/instances.js.map +1 -0
  135. package/dist/cli/commands/notify.d.ts +12 -0
  136. package/dist/cli/commands/notify.d.ts.map +1 -0
  137. package/dist/cli/commands/notify.js +43 -0
  138. package/dist/cli/commands/notify.js.map +1 -0
  139. package/dist/cli/commands/sql.d.ts +12 -0
  140. package/dist/cli/commands/sql.d.ts.map +1 -0
  141. package/dist/cli/commands/sql.js +90 -0
  142. package/dist/cli/commands/sql.js.map +1 -0
  143. package/dist/cli/commands/start.d.ts +12 -0
  144. package/dist/cli/commands/start.d.ts.map +1 -0
  145. package/dist/cli/commands/start.js +174 -0
  146. package/dist/cli/commands/start.js.map +1 -0
  147. package/dist/cli/commands/status.d.ts +12 -0
  148. package/dist/cli/commands/status.d.ts.map +1 -0
  149. package/dist/cli/commands/status.js +218 -0
  150. package/dist/cli/commands/status.js.map +1 -0
  151. package/dist/cli/commands/stop.d.ts +12 -0
  152. package/dist/cli/commands/stop.d.ts.map +1 -0
  153. package/dist/cli/commands/stop.js +128 -0
  154. package/dist/cli/commands/stop.js.map +1 -0
  155. package/dist/cli/commands/topology.d.ts +12 -0
  156. package/dist/cli/commands/topology.d.ts.map +1 -0
  157. package/dist/cli/commands/topology.js +106 -0
  158. package/dist/cli/commands/topology.js.map +1 -0
  159. package/dist/cli/completer.d.ts +47 -0
  160. package/dist/cli/completer.d.ts.map +1 -0
  161. package/dist/cli/completer.js +332 -0
  162. package/dist/cli/completer.js.map +1 -0
  163. package/dist/cli/formatter.d.ts +165 -0
  164. package/dist/cli/formatter.d.ts.map +1 -0
  165. package/dist/cli/formatter.js +408 -0
  166. package/dist/cli/formatter.js.map +1 -0
  167. package/dist/cli/index.d.ts +21 -0
  168. package/dist/cli/index.d.ts.map +1 -0
  169. package/dist/cli/index.js +79 -0
  170. package/dist/cli/index.js.map +1 -0
  171. package/dist/cli/raw-input.d.ts +97 -0
  172. package/dist/cli/raw-input.d.ts.map +1 -0
  173. package/dist/cli/raw-input.js +493 -0
  174. package/dist/cli/raw-input.js.map +1 -0
  175. package/dist/cli/registry.d.ts +103 -0
  176. package/dist/cli/registry.d.ts.map +1 -0
  177. package/dist/cli/registry.js +205 -0
  178. package/dist/cli/registry.js.map +1 -0
  179. package/dist/cli/repl.d.ts +83 -0
  180. package/dist/cli/repl.d.ts.map +1 -0
  181. package/dist/cli/repl.js +447 -0
  182. package/dist/cli/repl.js.map +1 -0
  183. package/dist/cli/ui/components.d.ts +144 -0
  184. package/dist/cli/ui/components.d.ts.map +1 -0
  185. package/dist/cli/ui/components.js +331 -0
  186. package/dist/cli/ui/components.js.map +1 -0
  187. package/dist/cli/ui/index.d.ts +7 -0
  188. package/dist/cli/ui/index.d.ts.map +1 -0
  189. package/dist/cli/ui/index.js +23 -0
  190. package/dist/cli/ui/index.js.map +1 -0
  191. package/dist/cli/utils/docker-files.d.ts +39 -0
  192. package/dist/cli/utils/docker-files.d.ts.map +1 -0
  193. package/dist/cli/utils/docker-files.js +223 -0
  194. package/dist/cli/utils/docker-files.js.map +1 -0
  195. package/dist/cli/utils/docker-prereq.d.ts +48 -0
  196. package/dist/cli/utils/docker-prereq.d.ts.map +1 -0
  197. package/dist/cli/utils/docker-prereq.js +203 -0
  198. package/dist/cli/utils/docker-prereq.js.map +1 -0
  199. package/dist/config/settings.d.ts +594 -0
  200. package/dist/config/settings.d.ts.map +1 -0
  201. package/dist/config/settings.js +250 -0
  202. package/dist/config/settings.js.map +1 -0
  203. package/dist/core/discovery/cluster-view.d.ts +50 -0
  204. package/dist/core/discovery/cluster-view.d.ts.map +1 -0
  205. package/dist/core/discovery/cluster-view.js +235 -0
  206. package/dist/core/discovery/cluster-view.js.map +1 -0
  207. package/dist/core/discovery/scanner.d.ts +70 -0
  208. package/dist/core/discovery/scanner.d.ts.map +1 -0
  209. package/dist/core/discovery/scanner.js +197 -0
  210. package/dist/core/discovery/scanner.js.map +1 -0
  211. package/dist/core/discovery/topology.d.ts +118 -0
  212. package/dist/core/discovery/topology.d.ts.map +1 -0
  213. package/dist/core/discovery/topology.js +550 -0
  214. package/dist/core/discovery/topology.js.map +1 -0
  215. package/dist/core/failover/candidate-selector.d.ts +46 -0
  216. package/dist/core/failover/candidate-selector.d.ts.map +1 -0
  217. package/dist/core/failover/candidate-selector.js +70 -0
  218. package/dist/core/failover/candidate-selector.js.map +1 -0
  219. package/dist/core/failover/executor.d.ts +104 -0
  220. package/dist/core/failover/executor.d.ts.map +1 -0
  221. package/dist/core/failover/executor.js +248 -0
  222. package/dist/core/failover/executor.js.map +1 -0
  223. package/dist/core/failover/operation-builder.d.ts +71 -0
  224. package/dist/core/failover/operation-builder.d.ts.map +1 -0
  225. package/dist/core/failover/operation-builder.js +157 -0
  226. package/dist/core/failover/operation-builder.js.map +1 -0
  227. package/dist/core/failover/operation-runner.d.ts +75 -0
  228. package/dist/core/failover/operation-runner.d.ts.map +1 -0
  229. package/dist/core/failover/operation-runner.js +191 -0
  230. package/dist/core/failover/operation-runner.js.map +1 -0
  231. package/dist/core/failover/promoter.d.ts +33 -0
  232. package/dist/core/failover/promoter.d.ts.map +1 -0
  233. package/dist/core/failover/promoter.js +97 -0
  234. package/dist/core/failover/promoter.js.map +1 -0
  235. package/dist/core/failover/recovery-manager.d.ts +47 -0
  236. package/dist/core/failover/recovery-manager.d.ts.map +1 -0
  237. package/dist/core/failover/recovery-manager.js +145 -0
  238. package/dist/core/failover/recovery-manager.js.map +1 -0
  239. package/dist/core/failover/types.d.ts +54 -0
  240. package/dist/core/failover/types.d.ts.map +1 -0
  241. package/dist/core/failover/types.js +8 -0
  242. package/dist/core/failover/types.js.map +1 -0
  243. package/dist/core/monitoring/collector.d.ts +25 -0
  244. package/dist/core/monitoring/collector.d.ts.map +1 -0
  245. package/dist/core/monitoring/collector.js +115 -0
  246. package/dist/core/monitoring/collector.js.map +1 -0
  247. package/dist/core/monitoring/exporters.d.ts +49 -0
  248. package/dist/core/monitoring/exporters.d.ts.map +1 -0
  249. package/dist/core/monitoring/exporters.js +126 -0
  250. package/dist/core/monitoring/exporters.js.map +1 -0
  251. package/dist/core/routing/proxysql-manager.d.ts +213 -0
  252. package/dist/core/routing/proxysql-manager.d.ts.map +1 -0
  253. package/dist/core/routing/proxysql-manager.js +632 -0
  254. package/dist/core/routing/proxysql-manager.js.map +1 -0
  255. package/dist/core/sync/replica-recovery.d.ts +40 -0
  256. package/dist/core/sync/replica-recovery.d.ts.map +1 -0
  257. package/dist/core/sync/replica-recovery.js +134 -0
  258. package/dist/core/sync/replica-recovery.js.map +1 -0
  259. package/dist/core/sync/sync-coordinator.d.ts +83 -0
  260. package/dist/core/sync/sync-coordinator.d.ts.map +1 -0
  261. package/dist/core/sync/sync-coordinator.js +254 -0
  262. package/dist/core/sync/sync-coordinator.js.map +1 -0
  263. package/dist/core/sync/topology-watcher.d.ts +76 -0
  264. package/dist/core/sync/topology-watcher.d.ts.map +1 -0
  265. package/dist/core/sync/topology-watcher.js +222 -0
  266. package/dist/core/sync/topology-watcher.js.map +1 -0
  267. package/dist/core/sync/types.d.ts +85 -0
  268. package/dist/core/sync/types.d.ts.map +1 -0
  269. package/dist/core/sync/types.js +8 -0
  270. package/dist/core/sync/types.js.map +1 -0
  271. package/dist/index.d.ts +5 -0
  272. package/dist/index.d.ts.map +1 -0
  273. package/dist/index.js +9 -0
  274. package/dist/index.js.map +1 -0
  275. package/dist/types/index.d.ts +212 -0
  276. package/dist/types/index.d.ts.map +1 -0
  277. package/dist/types/index.js +153 -0
  278. package/dist/types/index.js.map +1 -0
  279. package/dist/utils/database.d.ts +62 -0
  280. package/dist/utils/database.d.ts.map +1 -0
  281. package/dist/utils/database.js +257 -0
  282. package/dist/utils/database.js.map +1 -0
  283. package/dist/utils/exceptions.d.ts +69 -0
  284. package/dist/utils/exceptions.d.ts.map +1 -0
  285. package/dist/utils/exceptions.js +121 -0
  286. package/dist/utils/exceptions.js.map +1 -0
  287. package/dist/utils/logger.d.ts +20 -0
  288. package/dist/utils/logger.d.ts.map +1 -0
  289. package/dist/utils/logger.js +90 -0
  290. package/dist/utils/logger.js.map +1 -0
  291. package/dist/utils/mysql-client.d.ts +43 -0
  292. package/dist/utils/mysql-client.d.ts.map +1 -0
  293. package/dist/utils/mysql-client.js +125 -0
  294. package/dist/utils/mysql-client.js.map +1 -0
  295. package/docker/Dockerfile +61 -0
  296. package/docker/Dockerfile.node +41 -0
  297. package/docker/grafana/dashboards/clawsql.json +212 -0
  298. package/docker/grafana/provisioning/dashboards/dashboards.yml +13 -0
  299. package/docker/grafana/provisioning/datasources/datasources.yml +12 -0
  300. package/docker/init/primary.sql +26 -0
  301. package/docker/init/replica.sql +16 -0
  302. package/docker/orchestrator/orchestrator.conf.json +98 -0
  303. package/docker/prometheus/prometheus.yml +45 -0
  304. package/docker/proxysql/entrypoint.sh +8 -0
  305. package/docker/proxysql/init.sql.demo +30 -0
  306. package/docker/proxysql/proxysql.cnf +38 -0
  307. package/docker-compose.demo.yml +115 -0
  308. package/docker-compose.yml +217 -0
  309. package/init/primary.sql +19 -0
  310. package/init/replica.sql +13 -0
  311. package/package.json +84 -0
@@ -0,0 +1,54 @@
1
+ /**
2
+ * ClawSQL - Failover Types
3
+ *
4
+ * Type definitions for failover operations.
5
+ */
6
+ import { MySQLCluster, MySQLInstance, FailoverOperation } from '../../types/index.js';
7
+ /**
8
+ * Pre/Post failover hook type
9
+ */
10
+ export type FailoverHook = (operation: FailoverOperation, cluster: MySQLCluster) => Promise<void>;
11
+ /**
12
+ * Old primary awaiting recovery
13
+ */
14
+ export interface PendingRecovery {
15
+ clusterId: string;
16
+ instanceId: string;
17
+ host: string;
18
+ port: number;
19
+ newPrimaryId: string;
20
+ failedAt: Date;
21
+ recoveredAt?: Date;
22
+ }
23
+ /**
24
+ * Recovery result
25
+ */
26
+ export interface RecoveryResult {
27
+ success: boolean;
28
+ message: string;
29
+ }
30
+ /**
31
+ * Batch recovery result
32
+ */
33
+ export interface BatchRecoveryResult {
34
+ recovered: string[];
35
+ stillPending: string[];
36
+ errors: string[];
37
+ }
38
+ /**
39
+ * Promotion result
40
+ */
41
+ export interface PromotionResult {
42
+ success: boolean;
43
+ error?: string;
44
+ }
45
+ /**
46
+ * Operation context passed through execution steps
47
+ */
48
+ export interface OperationContext {
49
+ operation: FailoverOperation;
50
+ cluster: MySQLCluster;
51
+ newPrimary: MySQLInstance | null;
52
+ addStep: (step: string) => void;
53
+ }
54
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/failover/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEtF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAElG;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,IAAI,CAAC;IACf,WAAW,CAAC,EAAE,IAAI,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,OAAO,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,aAAa,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ /**
3
+ * ClawSQL - Failover Types
4
+ *
5
+ * Type definitions for failover operations.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/failover/types.ts"],"names":[],"mappings":";AAAA;;;;GAIG"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * ClawSQL - Metrics Collector
3
+ *
4
+ * Collects metrics from MySQL instances.
5
+ */
6
+ import { MySQLInstance, InstanceMetrics } from '../../types/index.js';
7
+ /**
8
+ * Metrics Collector
9
+ */
10
+ export declare class MetricsCollector {
11
+ private settings;
12
+ /**
13
+ * Collect metrics from a MySQL instance
14
+ */
15
+ collectMetrics(instance: MySQLInstance): Promise<InstanceMetrics>;
16
+ /**
17
+ * Parse SHOW STATUS rows into a key-value object
18
+ */
19
+ private parseStatusRows;
20
+ }
21
+ /**
22
+ * Get the metrics collector instance
23
+ */
24
+ export declare function getMetricsCollector(): MetricsCollector;
25
+ //# sourceMappingURL=collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../../src/core/monitoring/collector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EACL,aAAa,EACb,eAAe,EAEhB,MAAM,sBAAsB,CAAC;AAK9B;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAiB;IAEjC;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IA6EvE;;OAEG;IACH,OAAO,CAAC,eAAe;CAOxB;AAKD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAKtD"}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ /**
3
+ * ClawSQL - Metrics Collector
4
+ *
5
+ * Collects metrics from MySQL instances.
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.MetricsCollector = void 0;
12
+ exports.getMetricsCollector = getMetricsCollector;
13
+ const promise_1 = __importDefault(require("mysql2/promise"));
14
+ const logger_js_1 = require("../../utils/logger.js");
15
+ const index_js_1 = require("../../types/index.js");
16
+ const settings_js_1 = require("../../config/settings.js");
17
+ const logger = (0, logger_js_1.getLogger)('collector');
18
+ /**
19
+ * Metrics Collector
20
+ */
21
+ class MetricsCollector {
22
+ settings = (0, settings_js_1.getSettings)();
23
+ /**
24
+ * Collect metrics from a MySQL instance
25
+ */
26
+ async collectMetrics(instance) {
27
+ const instanceId = (0, index_js_1.createInstanceId)(instance.host, instance.port);
28
+ try {
29
+ const connection = await promise_1.default.createConnection({
30
+ host: instance.host,
31
+ port: instance.port,
32
+ user: this.settings.mysql.adminUser,
33
+ password: this.settings.mysql.adminPassword,
34
+ connectTimeout: 5000,
35
+ });
36
+ // Get replication status
37
+ const [slaveStatus] = await connection.execute('SHOW SLAVE STATUS');
38
+ const slaveStatusRow = slaveStatus[0];
39
+ // Get status variables
40
+ const [statusVars] = await connection.execute('SHOW GLOBAL STATUS WHERE Variable_name IN (?, ?, ?, ?, ?, ?, ?, ?)', [
41
+ 'Threads_connected',
42
+ 'max_connections',
43
+ 'Queries',
44
+ 'Uptime',
45
+ 'Innodb_buffer_pool_read_requests',
46
+ 'Innodb_buffer_pool_reads',
47
+ 'Bytes_received',
48
+ 'Bytes_sent',
49
+ ]);
50
+ const status = this.parseStatusRows(statusVars);
51
+ await connection.end();
52
+ // Calculate derived metrics
53
+ const bufferPoolReads = Number(status.Innodb_buffer_pool_reads) || 0;
54
+ const bufferPoolRequests = Number(status.Innodb_buffer_pool_read_requests) || 1;
55
+ const bufferPoolHitRate = bufferPoolRequests > 0
56
+ ? ((bufferPoolRequests - bufferPoolReads) / bufferPoolRequests) * 100
57
+ : 100;
58
+ return {
59
+ instanceId,
60
+ timestamp: new Date(),
61
+ replicationLagSeconds: slaveStatusRow
62
+ ? Number(slaveStatusRow.Seconds_Behind_Master)
63
+ : undefined,
64
+ replicationIoRunning: slaveStatusRow
65
+ ? slaveStatusRow.Slave_IO_Running === 'Yes'
66
+ : false,
67
+ replicationSqlRunning: slaveStatusRow
68
+ ? slaveStatusRow.Slave_SQL_Running === 'Yes'
69
+ : false,
70
+ connectionsCurrent: Number(status.Threads_connected) || 0,
71
+ connectionsMax: Number(status.max_connections) || 1000,
72
+ queriesPerSecond: Number(status.Queries) / (Number(status.Uptime) || 1),
73
+ innodbBufferPoolHitRate: bufferPoolHitRate,
74
+ uptimeSeconds: Number(status.Uptime) || 0,
75
+ };
76
+ }
77
+ catch (error) {
78
+ logger.error({ error, instanceId }, 'Failed to collect metrics');
79
+ return {
80
+ instanceId,
81
+ timestamp: new Date(),
82
+ replicationIoRunning: false,
83
+ replicationSqlRunning: false,
84
+ connectionsCurrent: 0,
85
+ connectionsMax: 0,
86
+ queriesPerSecond: 0,
87
+ innodbBufferPoolHitRate: 0,
88
+ uptimeSeconds: 0,
89
+ };
90
+ }
91
+ }
92
+ /**
93
+ * Parse SHOW STATUS rows into a key-value object
94
+ */
95
+ parseStatusRows(rows) {
96
+ const result = {};
97
+ for (const row of rows) {
98
+ result[row.Variable_name] = row.Value;
99
+ }
100
+ return result;
101
+ }
102
+ }
103
+ exports.MetricsCollector = MetricsCollector;
104
+ // Singleton instance
105
+ let metricsCollector = null;
106
+ /**
107
+ * Get the metrics collector instance
108
+ */
109
+ function getMetricsCollector() {
110
+ if (!metricsCollector) {
111
+ metricsCollector = new MetricsCollector();
112
+ }
113
+ return metricsCollector;
114
+ }
115
+ //# sourceMappingURL=collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.js","sourceRoot":"","sources":["../../../src/core/monitoring/collector.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;AAqHH,kDAKC;AAxHD,6DAAmC;AACnC,qDAAkD;AAClD,mDAI8B;AAC9B,0DAAuD;AAEvD,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,WAAW,CAAC,CAAC;AAEtC;;GAEG;AACH,MAAa,gBAAgB;IACnB,QAAQ,GAAG,IAAA,yBAAW,GAAE,CAAC;IAEjC;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,QAAuB;QAC1C,MAAM,UAAU,GAAG,IAAA,2BAAgB,EAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAElE,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,iBAAK,CAAC,gBAAgB,CAAC;gBAC9C,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS;gBACnC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa;gBAC3C,cAAc,EAAE,IAAI;aACrB,CAAC,CAAC;YAEH,yBAAyB;YACzB,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,UAAU,CAAC,OAAO,CAC5C,mBAAmB,CACpB,CAAC;YACF,MAAM,cAAc,GAAI,WAAyC,CAAC,CAAC,CAAC,CAAC;YAErE,uBAAuB;YACvB,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,UAAU,CAAC,OAAO,CAC3C,oEAAoE,EACpE;gBACE,mBAAmB;gBACnB,iBAAiB;gBACjB,SAAS;gBACT,QAAQ;gBACR,kCAAkC;gBAClC,0BAA0B;gBAC1B,gBAAgB;gBAChB,YAAY;aACb,CACF,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,UAAuC,CAAC,CAAC;YAE7E,MAAM,UAAU,CAAC,GAAG,EAAE,CAAC;YAEvB,4BAA4B;YAC5B,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;YACrE,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,gCAAgC,CAAC,IAAI,CAAC,CAAC;YAChF,MAAM,iBAAiB,GAAG,kBAAkB,GAAG,CAAC;gBAC9C,CAAC,CAAC,CAAC,CAAC,kBAAkB,GAAG,eAAe,CAAC,GAAG,kBAAkB,CAAC,GAAG,GAAG;gBACrE,CAAC,CAAC,GAAG,CAAC;YAER,OAAO;gBACL,UAAU;gBACV,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,qBAAqB,EAAE,cAAc;oBACnC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,qBAAqB,CAAC;oBAC9C,CAAC,CAAC,SAAS;gBACb,oBAAoB,EAAE,cAAc;oBAClC,CAAC,CAAC,cAAc,CAAC,gBAAgB,KAAK,KAAK;oBAC3C,CAAC,CAAC,KAAK;gBACT,qBAAqB,EAAE,cAAc;oBACnC,CAAC,CAAC,cAAc,CAAC,iBAAiB,KAAK,KAAK;oBAC5C,CAAC,CAAC,KAAK;gBACT,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC;gBACzD,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,IAAI;gBACtD,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACvE,uBAAuB,EAAE,iBAAiB;gBAC1C,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;aAC1C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,2BAA2B,CAAC,CAAC;YACjE,OAAO;gBACL,UAAU;gBACV,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,oBAAoB,EAAE,KAAK;gBAC3B,qBAAqB,EAAE,KAAK;gBAC5B,kBAAkB,EAAE,CAAC;gBACrB,cAAc,EAAE,CAAC;gBACjB,gBAAgB,EAAE,CAAC;gBACnB,uBAAuB,EAAE,CAAC;gBAC1B,aAAa,EAAE,CAAC;aACjB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,IAA+B;QACrD,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,CAAC,aAAuB,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;QAClD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AA7FD,4CA6FC;AAED,qBAAqB;AACrB,IAAI,gBAAgB,GAA4B,IAAI,CAAC;AAErD;;GAEG;AACH,SAAgB,mBAAmB;IACjC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * ClawSQL - Prometheus Exporter
3
+ *
4
+ * Exports metrics in Prometheus format.
5
+ */
6
+ /**
7
+ * Prometheus Exporter
8
+ */
9
+ export declare class PrometheusExporter {
10
+ private registry;
11
+ constructor();
12
+ /**
13
+ * Get metrics in Prometheus format
14
+ */
15
+ getMetrics(): Promise<string>;
16
+ /**
17
+ * Get content type for HTTP response
18
+ */
19
+ getContentType(): string;
20
+ /**
21
+ * Record a failover operation
22
+ */
23
+ recordFailover(clusterId: string, success: boolean, durationSeconds: number): void;
24
+ /**
25
+ * Set failover in progress status
26
+ */
27
+ setFailoverInProgress(clusterId: string, inProgress: boolean): void;
28
+ /**
29
+ * Update instance health metric
30
+ */
31
+ updateInstanceHealth(instanceId: string, clusterId: string, role: string, healthy: boolean): void;
32
+ /**
33
+ * Update replication lag metric
34
+ */
35
+ updateReplicationLag(instanceId: string, clusterId: string, lagSeconds: number): void;
36
+ /**
37
+ * Update connections metric
38
+ */
39
+ updateConnections(instanceId: string, clusterId: string, total: number): void;
40
+ /**
41
+ * Update QPS metric
42
+ */
43
+ updateQPS(instanceId: string, clusterId: string, qps: number): void;
44
+ }
45
+ /**
46
+ * Get the Prometheus exporter instance
47
+ */
48
+ export declare function getPrometheusExporter(): PrometheusExporter;
49
+ //# sourceMappingURL=exporters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exporters.d.ts","sourceRoot":"","sources":["../../../src/core/monitoring/exporters.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAsDH;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAkB;;IAMlC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI;IAMlF;;OAEG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI;IAInE;;OAEG;IACH,oBAAoB,CAClB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,GACf,IAAI;IAOP;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAIrF;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7E;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;CAGpE;AAKD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,kBAAkB,CAK1D"}
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ /**
3
+ * ClawSQL - Prometheus Exporter
4
+ *
5
+ * Exports metrics in Prometheus format.
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.PrometheusExporter = void 0;
12
+ exports.getPrometheusExporter = getPrometheusExporter;
13
+ const prom_client_1 = __importDefault(require("prom-client"));
14
+ const logger_js_1 = require("../../utils/logger.js");
15
+ const logger = (0, logger_js_1.getLogger)('prometheus');
16
+ // Initialize default metrics
17
+ prom_client_1.default.collectDefaultMetrics();
18
+ // Custom metrics
19
+ const failoverTotal = new prom_client_1.default.Counter({
20
+ name: 'clawsql_failover_total',
21
+ help: 'Total number of failover operations',
22
+ labelNames: ['cluster_id', 'success'],
23
+ });
24
+ const failoverDuration = new prom_client_1.default.Histogram({
25
+ name: 'clawsql_failover_duration_seconds',
26
+ help: 'Duration of failover operations',
27
+ labelNames: ['cluster_id'],
28
+ buckets: [1, 5, 10, 20, 30, 60],
29
+ });
30
+ const failoverInProgress = new prom_client_1.default.Gauge({
31
+ name: 'clawsql_failover_in_progress',
32
+ help: 'Whether a failover is in progress',
33
+ labelNames: ['cluster_id'],
34
+ });
35
+ const instanceHealth = new prom_client_1.default.Gauge({
36
+ name: 'clawsql_instance_health',
37
+ help: 'Health status of MySQL instances (1=healthy, 0=unhealthy)',
38
+ labelNames: ['instance_id', 'cluster_id', 'role'],
39
+ });
40
+ const replicationLag = new prom_client_1.default.Gauge({
41
+ name: 'clawsql_replication_lag_seconds',
42
+ help: 'Replication lag in seconds',
43
+ labelNames: ['instance_id', 'cluster_id'],
44
+ });
45
+ const connectionsTotal = new prom_client_1.default.Gauge({
46
+ name: 'clawsql_connections_total',
47
+ help: 'Total connections to MySQL instance',
48
+ labelNames: ['instance_id', 'cluster_id'],
49
+ });
50
+ const queriesPerSecond = new prom_client_1.default.Gauge({
51
+ name: 'clawsql_queries_per_second',
52
+ help: 'Queries per second on MySQL instance',
53
+ labelNames: ['instance_id', 'cluster_id'],
54
+ });
55
+ /**
56
+ * Prometheus Exporter
57
+ */
58
+ class PrometheusExporter {
59
+ registry;
60
+ constructor() {
61
+ this.registry = prom_client_1.default.register;
62
+ }
63
+ /**
64
+ * Get metrics in Prometheus format
65
+ */
66
+ async getMetrics() {
67
+ return this.registry.metrics();
68
+ }
69
+ /**
70
+ * Get content type for HTTP response
71
+ */
72
+ getContentType() {
73
+ return this.registry.contentType;
74
+ }
75
+ /**
76
+ * Record a failover operation
77
+ */
78
+ recordFailover(clusterId, success, durationSeconds) {
79
+ failoverTotal.inc({ cluster_id: clusterId, success: success.toString() });
80
+ failoverDuration.observe({ cluster_id: clusterId }, durationSeconds);
81
+ logger.debug({ clusterId, success, durationSeconds }, 'Failover recorded');
82
+ }
83
+ /**
84
+ * Set failover in progress status
85
+ */
86
+ setFailoverInProgress(clusterId, inProgress) {
87
+ failoverInProgress.set({ cluster_id: clusterId }, inProgress ? 1 : 0);
88
+ }
89
+ /**
90
+ * Update instance health metric
91
+ */
92
+ updateInstanceHealth(instanceId, clusterId, role, healthy) {
93
+ instanceHealth.set({ instance_id: instanceId, cluster_id: clusterId, role }, healthy ? 1 : 0);
94
+ }
95
+ /**
96
+ * Update replication lag metric
97
+ */
98
+ updateReplicationLag(instanceId, clusterId, lagSeconds) {
99
+ replicationLag.set({ instance_id: instanceId, cluster_id: clusterId }, lagSeconds);
100
+ }
101
+ /**
102
+ * Update connections metric
103
+ */
104
+ updateConnections(instanceId, clusterId, total) {
105
+ connectionsTotal.set({ instance_id: instanceId, cluster_id: clusterId }, total);
106
+ }
107
+ /**
108
+ * Update QPS metric
109
+ */
110
+ updateQPS(instanceId, clusterId, qps) {
111
+ queriesPerSecond.set({ instance_id: instanceId, cluster_id: clusterId }, qps);
112
+ }
113
+ }
114
+ exports.PrometheusExporter = PrometheusExporter;
115
+ // Singleton instance
116
+ let prometheusExporter = null;
117
+ /**
118
+ * Get the Prometheus exporter instance
119
+ */
120
+ function getPrometheusExporter() {
121
+ if (!prometheusExporter) {
122
+ prometheusExporter = new PrometheusExporter();
123
+ }
124
+ return prometheusExporter;
125
+ }
126
+ //# sourceMappingURL=exporters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exporters.js","sourceRoot":"","sources":["../../../src/core/monitoring/exporters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,213 @@
1
+ /**
2
+ * ClawSQL - ProxySQL Manager
3
+ *
4
+ * Manages ProxySQL configuration and routing.
5
+ */
6
+ import { MySQLInstance, MySQLCluster } from '../../types/index.js';
7
+ import { ProxySQLSettings } from '../../config/settings.js';
8
+ /**
9
+ * ProxySQL hostgroup
10
+ */
11
+ export interface ProxySQLHostGroup {
12
+ hostgroupId: number;
13
+ name: string;
14
+ instances: MySQLInstance[];
15
+ isWriter: boolean;
16
+ }
17
+ /**
18
+ * ProxySQL server
19
+ */
20
+ export interface ProxySQLServer {
21
+ hostgroupId: number;
22
+ hostname: string;
23
+ port: number;
24
+ weight: number;
25
+ status: 'ONLINE' | 'OFFLINE_SOFT' | 'OFFLINE_HARD';
26
+ maxConnections: number;
27
+ comment?: string;
28
+ }
29
+ /**
30
+ * ProxySQL server runtime statistics
31
+ */
32
+ export interface ProxySQLServerStats {
33
+ hostgroupId: number;
34
+ host: string;
35
+ port: number;
36
+ status: string;
37
+ connUsed: number;
38
+ connFree: number;
39
+ connOk: number;
40
+ connErr: number;
41
+ queries: number;
42
+ }
43
+ /**
44
+ * ProxySQL replication hostgroup mapping
45
+ */
46
+ export interface ProxySQLReplicationHostgroup {
47
+ writerHostgroup: number;
48
+ readerHostgroup: number;
49
+ clusterId?: string;
50
+ comment?: string;
51
+ }
52
+ /**
53
+ * ProxySQL query rule
54
+ */
55
+ export interface ProxySQLRule {
56
+ ruleId: number;
57
+ matchPattern: string;
58
+ destinationHostgroup: number;
59
+ apply: boolean;
60
+ active: boolean;
61
+ comment?: string;
62
+ }
63
+ /**
64
+ * ProxySQL Manager
65
+ */
66
+ export declare class ProxySQLManager {
67
+ private connection;
68
+ private settings;
69
+ private hostgroups;
70
+ private servers;
71
+ private rules;
72
+ static readonly DEFAULT_WRITER_HOSTGROUP = 10;
73
+ static readonly DEFAULT_READER_HOSTGROUP = 20;
74
+ constructor(settings?: ProxySQLSettings);
75
+ /**
76
+ * Connect to ProxySQL admin interface
77
+ */
78
+ connect(): Promise<void>;
79
+ /**
80
+ * Close the connection
81
+ */
82
+ close(): Promise<void>;
83
+ /**
84
+ * Execute a query on ProxySQL admin interface
85
+ * Note: ProxySQL admin doesn't support prepared statements, so we use query() instead
86
+ */
87
+ private execute;
88
+ /**
89
+ * Set monitor credentials
90
+ */
91
+ setMonitorCredentials(user: string, password: string): Promise<boolean>;
92
+ /**
93
+ * Add a MySQL server to ProxySQL
94
+ */
95
+ addServer(instance: MySQLInstance, hostgroupId: number, weight?: number, maxConnections?: number): Promise<boolean>;
96
+ /**
97
+ * Register a MySQL instance with ProxySQL
98
+ */
99
+ registerInstance(instance: MySQLInstance, isPrimary?: boolean, writerHostgroup?: number, readerHostgroup?: number): Promise<boolean>;
100
+ /**
101
+ * Remove a MySQL server from ProxySQL
102
+ */
103
+ removeServer(instance: MySQLInstance, hostgroupId: number): Promise<boolean>;
104
+ /**
105
+ * Setup read/write split routing rules
106
+ */
107
+ setupReadWriteSplit(_cluster: MySQLCluster, writerHostgroup?: number, readerHostgroup?: number): Promise<boolean>;
108
+ /**
109
+ * Sync an entire cluster to ProxySQL
110
+ */
111
+ syncCluster(cluster: MySQLCluster, writerHostgroup?: number, readerHostgroup?: number, adminUser?: string, adminPassword?: string): Promise<{
112
+ clusterId: string;
113
+ serversAdded: number;
114
+ serversRemoved: number;
115
+ hostgroups: {
116
+ writer: number;
117
+ reader: number;
118
+ };
119
+ success: boolean;
120
+ errors: string[];
121
+ }>;
122
+ /**
123
+ * Remove all servers for a cluster from ProxySQL
124
+ */
125
+ removeCluster(cluster: MySQLCluster, _writerHostgroup?: number, _readerHostgroup?: number): Promise<boolean>;
126
+ /**
127
+ * Load configuration changes to runtime
128
+ */
129
+ loadConfigToRuntime(): Promise<boolean>;
130
+ /**
131
+ * Save current configuration to disk
132
+ */
133
+ saveConfigToDisk(): Promise<boolean>;
134
+ /**
135
+ * Get servers configured in ProxySQL (queries live from mysql_servers table)
136
+ */
137
+ getServers(hostgroupId?: number): Promise<ProxySQLServer[]>;
138
+ /**
139
+ * Get live server statistics from ProxySQL stats_mysql_connection_pool
140
+ */
141
+ getServerStats(): Promise<ProxySQLServerStats[]>;
142
+ /**
143
+ * Get replication hostgroup mappings
144
+ */
145
+ getReplicationHostgroups(): Promise<ProxySQLReplicationHostgroup[]>;
146
+ /**
147
+ * Get the MySQL port that clients connect to
148
+ */
149
+ getMySQLPort(): number;
150
+ /**
151
+ * Get the ProxySQL host
152
+ */
153
+ getHost(): string;
154
+ /**
155
+ * Relocate a replica to follow a new primary
156
+ * This is used after failover to reconfigure replicas
157
+ */
158
+ relocateReplica(replica: MySQLInstance, newPrimary: MySQLInstance): Promise<boolean>;
159
+ /**
160
+ * Get configuration summary
161
+ */
162
+ getConfigSummary(): {
163
+ hostgroups: number;
164
+ servers: number;
165
+ rules: number;
166
+ };
167
+ /**
168
+ * Mirror server configuration to metadata database
169
+ */
170
+ private mirrorServer;
171
+ /**
172
+ * Mirror hostgroup configuration to metadata database
173
+ */
174
+ private mirrorHostgroup;
175
+ /**
176
+ * Mirror query rule to metadata database
177
+ */
178
+ private mirrorQueryRule;
179
+ /**
180
+ * Log action to audit table
181
+ */
182
+ private auditLog;
183
+ /**
184
+ * Restore ProxySQL configuration from metadata database
185
+ * Called on startup to sync ProxySQL with stored config
186
+ */
187
+ restoreFromDatabase(): Promise<{
188
+ servers: number;
189
+ hostgroups: number;
190
+ rules: number;
191
+ }>;
192
+ /**
193
+ * Get all mirrored servers from database
194
+ */
195
+ getMirroredServers(): Promise<ProxySQLServer[]>;
196
+ /**
197
+ * Get audit log entries
198
+ */
199
+ getAuditLog(limit?: number): Promise<{
200
+ id: number;
201
+ action: string;
202
+ entity_type: string;
203
+ entity_id: string;
204
+ old_value: unknown;
205
+ new_value: unknown;
206
+ changed_at: Date;
207
+ }[]>;
208
+ }
209
+ /**
210
+ * Get the ProxySQL manager instance
211
+ */
212
+ export declare function getProxySQLManager(): ProxySQLManager;
213
+ //# sourceMappingURL=proxysql-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxysql-manager.d.ts","sourceRoot":"","sources":["../../../src/core/routing/proxysql-manager.ts"],"names":[],"mappings":"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"}