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.
- package/.env.example +97 -0
- package/README.md +372 -0
- package/dist/__tests__/config/settings.test.d.ts +5 -0
- package/dist/__tests__/config/settings.test.d.ts.map +1 -0
- package/dist/__tests__/config/settings.test.js +154 -0
- package/dist/__tests__/config/settings.test.js.map +1 -0
- package/dist/__tests__/core/discovery/topology.test.d.ts +5 -0
- package/dist/__tests__/core/discovery/topology.test.d.ts.map +1 -0
- package/dist/__tests__/core/discovery/topology.test.js +191 -0
- package/dist/__tests__/core/discovery/topology.test.js.map +1 -0
- package/dist/__tests__/core/failover/executor.test.d.ts +5 -0
- package/dist/__tests__/core/failover/executor.test.d.ts.map +1 -0
- package/dist/__tests__/core/failover/executor.test.js +256 -0
- package/dist/__tests__/core/failover/executor.test.js.map +1 -0
- package/dist/__tests__/core/monitoring/collector.test.d.ts +5 -0
- package/dist/__tests__/core/monitoring/collector.test.d.ts.map +1 -0
- package/dist/__tests__/core/monitoring/collector.test.js +131 -0
- package/dist/__tests__/core/monitoring/collector.test.js.map +1 -0
- package/dist/__tests__/core/monitoring/exporters.test.d.ts +5 -0
- package/dist/__tests__/core/monitoring/exporters.test.d.ts.map +1 -0
- package/dist/__tests__/core/monitoring/exporters.test.js +90 -0
- package/dist/__tests__/core/monitoring/exporters.test.js.map +1 -0
- package/dist/__tests__/core/routing/proxysql-manager.test.d.ts +5 -0
- package/dist/__tests__/core/routing/proxysql-manager.test.d.ts.map +1 -0
- package/dist/__tests__/core/routing/proxysql-manager.test.js +155 -0
- package/dist/__tests__/core/routing/proxysql-manager.test.js.map +1 -0
- package/dist/__tests__/types/index.test.d.ts +5 -0
- package/dist/__tests__/types/index.test.d.ts.map +1 -0
- package/dist/__tests__/types/index.test.js +290 -0
- package/dist/__tests__/types/index.test.js.map +1 -0
- package/dist/__tests__/utils/exceptions.test.d.ts +5 -0
- package/dist/__tests__/utils/exceptions.test.d.ts.map +1 -0
- package/dist/__tests__/utils/exceptions.test.js +142 -0
- package/dist/__tests__/utils/exceptions.test.js.map +1 -0
- package/dist/api/routes/clusters.d.ts +7 -0
- package/dist/api/routes/clusters.d.ts.map +1 -0
- package/dist/api/routes/clusters.js +123 -0
- package/dist/api/routes/clusters.js.map +1 -0
- package/dist/api/routes/config.d.ts +7 -0
- package/dist/api/routes/config.d.ts.map +1 -0
- package/dist/api/routes/config.js +65 -0
- package/dist/api/routes/config.js.map +1 -0
- package/dist/api/routes/failover.d.ts +7 -0
- package/dist/api/routes/failover.d.ts.map +1 -0
- package/dist/api/routes/failover.js +100 -0
- package/dist/api/routes/failover.js.map +1 -0
- package/dist/api/routes/instances.d.ts +11 -0
- package/dist/api/routes/instances.d.ts.map +1 -0
- package/dist/api/routes/instances.js +315 -0
- package/dist/api/routes/instances.js.map +1 -0
- package/dist/api/routes/monitoring.d.ts +7 -0
- package/dist/api/routes/monitoring.d.ts.map +1 -0
- package/dist/api/routes/monitoring.js +72 -0
- package/dist/api/routes/monitoring.js.map +1 -0
- package/dist/api/routes/webhooks.d.ts +12 -0
- package/dist/api/routes/webhooks.d.ts.map +1 -0
- package/dist/api/routes/webhooks.js +232 -0
- package/dist/api/routes/webhooks.js.map +1 -0
- package/dist/api/schemas/index.d.ts +965 -0
- package/dist/api/schemas/index.d.ts.map +1 -0
- package/dist/api/schemas/index.js +171 -0
- package/dist/api/schemas/index.js.map +1 -0
- package/dist/app.d.ts +13 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +197 -0
- package/dist/app.js.map +1 -0
- package/dist/bin/clawsql.d.ts +12 -0
- package/dist/bin/clawsql.d.ts.map +1 -0
- package/dist/bin/clawsql.js +43 -0
- package/dist/bin/clawsql.js.map +1 -0
- package/dist/cli/agent/handler.d.ts +73 -0
- package/dist/cli/agent/handler.d.ts.map +1 -0
- package/dist/cli/agent/handler.js +258 -0
- package/dist/cli/agent/handler.js.map +1 -0
- package/dist/cli/agent/index.d.ts +14 -0
- package/dist/cli/agent/index.d.ts.map +1 -0
- package/dist/cli/agent/index.js +30 -0
- package/dist/cli/agent/index.js.map +1 -0
- package/dist/cli/agent/openclaw-integration.d.ts +81 -0
- package/dist/cli/agent/openclaw-integration.d.ts.map +1 -0
- package/dist/cli/agent/openclaw-integration.js +341 -0
- package/dist/cli/agent/openclaw-integration.js.map +1 -0
- package/dist/cli/agent/providers/anthropic.d.ts +27 -0
- package/dist/cli/agent/providers/anthropic.d.ts.map +1 -0
- package/dist/cli/agent/providers/anthropic.js +106 -0
- package/dist/cli/agent/providers/anthropic.js.map +1 -0
- package/dist/cli/agent/providers/base.d.ts +91 -0
- package/dist/cli/agent/providers/base.d.ts.map +1 -0
- package/dist/cli/agent/providers/base.js +24 -0
- package/dist/cli/agent/providers/base.js.map +1 -0
- package/dist/cli/agent/providers/openai.d.ts +27 -0
- package/dist/cli/agent/providers/openai.d.ts.map +1 -0
- package/dist/cli/agent/providers/openai.js +98 -0
- package/dist/cli/agent/providers/openai.js.map +1 -0
- package/dist/cli/agent/tools/index.d.ts +32 -0
- package/dist/cli/agent/tools/index.d.ts.map +1 -0
- package/dist/cli/agent/tools/index.js +263 -0
- package/dist/cli/agent/tools/index.js.map +1 -0
- package/dist/cli/commands/cleanup.d.ts +12 -0
- package/dist/cli/commands/cleanup.d.ts.map +1 -0
- package/dist/cli/commands/cleanup.js +205 -0
- package/dist/cli/commands/cleanup.js.map +1 -0
- package/dist/cli/commands/clusters.d.ts +12 -0
- package/dist/cli/commands/clusters.d.ts.map +1 -0
- package/dist/cli/commands/clusters.js +468 -0
- package/dist/cli/commands/clusters.js.map +1 -0
- package/dist/cli/commands/config.d.ts +12 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +406 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/cron.d.ts +12 -0
- package/dist/cli/commands/cron.d.ts.map +1 -0
- package/dist/cli/commands/cron.js +215 -0
- package/dist/cli/commands/cron.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +13 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +687 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/failover.d.ts +16 -0
- package/dist/cli/commands/failover.d.ts.map +1 -0
- package/dist/cli/commands/failover.js +333 -0
- package/dist/cli/commands/failover.js.map +1 -0
- package/dist/cli/commands/health.d.ts +12 -0
- package/dist/cli/commands/health.d.ts.map +1 -0
- package/dist/cli/commands/health.js +125 -0
- package/dist/cli/commands/health.js.map +1 -0
- package/dist/cli/commands/help.d.ts +12 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +52 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/instances.d.ts +12 -0
- package/dist/cli/commands/instances.d.ts.map +1 -0
- package/dist/cli/commands/instances.js +801 -0
- package/dist/cli/commands/instances.js.map +1 -0
- package/dist/cli/commands/notify.d.ts +12 -0
- package/dist/cli/commands/notify.d.ts.map +1 -0
- package/dist/cli/commands/notify.js +43 -0
- package/dist/cli/commands/notify.js.map +1 -0
- package/dist/cli/commands/sql.d.ts +12 -0
- package/dist/cli/commands/sql.d.ts.map +1 -0
- package/dist/cli/commands/sql.js +90 -0
- package/dist/cli/commands/sql.js.map +1 -0
- package/dist/cli/commands/start.d.ts +12 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +174 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +12 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +218 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +12 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +128 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/topology.d.ts +12 -0
- package/dist/cli/commands/topology.d.ts.map +1 -0
- package/dist/cli/commands/topology.js +106 -0
- package/dist/cli/commands/topology.js.map +1 -0
- package/dist/cli/completer.d.ts +47 -0
- package/dist/cli/completer.d.ts.map +1 -0
- package/dist/cli/completer.js +332 -0
- package/dist/cli/completer.js.map +1 -0
- package/dist/cli/formatter.d.ts +165 -0
- package/dist/cli/formatter.d.ts.map +1 -0
- package/dist/cli/formatter.js +408 -0
- package/dist/cli/formatter.js.map +1 -0
- package/dist/cli/index.d.ts +21 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +79 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/raw-input.d.ts +97 -0
- package/dist/cli/raw-input.d.ts.map +1 -0
- package/dist/cli/raw-input.js +493 -0
- package/dist/cli/raw-input.js.map +1 -0
- package/dist/cli/registry.d.ts +103 -0
- package/dist/cli/registry.d.ts.map +1 -0
- package/dist/cli/registry.js +205 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/cli/repl.d.ts +83 -0
- package/dist/cli/repl.d.ts.map +1 -0
- package/dist/cli/repl.js +447 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/cli/ui/components.d.ts +144 -0
- package/dist/cli/ui/components.d.ts.map +1 -0
- package/dist/cli/ui/components.js +331 -0
- package/dist/cli/ui/components.js.map +1 -0
- package/dist/cli/ui/index.d.ts +7 -0
- package/dist/cli/ui/index.d.ts.map +1 -0
- package/dist/cli/ui/index.js +23 -0
- package/dist/cli/ui/index.js.map +1 -0
- package/dist/cli/utils/docker-files.d.ts +39 -0
- package/dist/cli/utils/docker-files.d.ts.map +1 -0
- package/dist/cli/utils/docker-files.js +223 -0
- package/dist/cli/utils/docker-files.js.map +1 -0
- package/dist/cli/utils/docker-prereq.d.ts +48 -0
- package/dist/cli/utils/docker-prereq.d.ts.map +1 -0
- package/dist/cli/utils/docker-prereq.js +203 -0
- package/dist/cli/utils/docker-prereq.js.map +1 -0
- package/dist/config/settings.d.ts +594 -0
- package/dist/config/settings.d.ts.map +1 -0
- package/dist/config/settings.js +250 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/core/discovery/cluster-view.d.ts +50 -0
- package/dist/core/discovery/cluster-view.d.ts.map +1 -0
- package/dist/core/discovery/cluster-view.js +235 -0
- package/dist/core/discovery/cluster-view.js.map +1 -0
- package/dist/core/discovery/scanner.d.ts +70 -0
- package/dist/core/discovery/scanner.d.ts.map +1 -0
- package/dist/core/discovery/scanner.js +197 -0
- package/dist/core/discovery/scanner.js.map +1 -0
- package/dist/core/discovery/topology.d.ts +118 -0
- package/dist/core/discovery/topology.d.ts.map +1 -0
- package/dist/core/discovery/topology.js +550 -0
- package/dist/core/discovery/topology.js.map +1 -0
- package/dist/core/failover/candidate-selector.d.ts +46 -0
- package/dist/core/failover/candidate-selector.d.ts.map +1 -0
- package/dist/core/failover/candidate-selector.js +70 -0
- package/dist/core/failover/candidate-selector.js.map +1 -0
- package/dist/core/failover/executor.d.ts +104 -0
- package/dist/core/failover/executor.d.ts.map +1 -0
- package/dist/core/failover/executor.js +248 -0
- package/dist/core/failover/executor.js.map +1 -0
- package/dist/core/failover/operation-builder.d.ts +71 -0
- package/dist/core/failover/operation-builder.d.ts.map +1 -0
- package/dist/core/failover/operation-builder.js +157 -0
- package/dist/core/failover/operation-builder.js.map +1 -0
- package/dist/core/failover/operation-runner.d.ts +75 -0
- package/dist/core/failover/operation-runner.d.ts.map +1 -0
- package/dist/core/failover/operation-runner.js +191 -0
- package/dist/core/failover/operation-runner.js.map +1 -0
- package/dist/core/failover/promoter.d.ts +33 -0
- package/dist/core/failover/promoter.d.ts.map +1 -0
- package/dist/core/failover/promoter.js +97 -0
- package/dist/core/failover/promoter.js.map +1 -0
- package/dist/core/failover/recovery-manager.d.ts +47 -0
- package/dist/core/failover/recovery-manager.d.ts.map +1 -0
- package/dist/core/failover/recovery-manager.js +145 -0
- package/dist/core/failover/recovery-manager.js.map +1 -0
- package/dist/core/failover/types.d.ts +54 -0
- package/dist/core/failover/types.d.ts.map +1 -0
- package/dist/core/failover/types.js +8 -0
- package/dist/core/failover/types.js.map +1 -0
- package/dist/core/monitoring/collector.d.ts +25 -0
- package/dist/core/monitoring/collector.d.ts.map +1 -0
- package/dist/core/monitoring/collector.js +115 -0
- package/dist/core/monitoring/collector.js.map +1 -0
- package/dist/core/monitoring/exporters.d.ts +49 -0
- package/dist/core/monitoring/exporters.d.ts.map +1 -0
- package/dist/core/monitoring/exporters.js +126 -0
- package/dist/core/monitoring/exporters.js.map +1 -0
- package/dist/core/routing/proxysql-manager.d.ts +213 -0
- package/dist/core/routing/proxysql-manager.d.ts.map +1 -0
- package/dist/core/routing/proxysql-manager.js +632 -0
- package/dist/core/routing/proxysql-manager.js.map +1 -0
- package/dist/core/sync/replica-recovery.d.ts +40 -0
- package/dist/core/sync/replica-recovery.d.ts.map +1 -0
- package/dist/core/sync/replica-recovery.js +134 -0
- package/dist/core/sync/replica-recovery.js.map +1 -0
- package/dist/core/sync/sync-coordinator.d.ts +83 -0
- package/dist/core/sync/sync-coordinator.d.ts.map +1 -0
- package/dist/core/sync/sync-coordinator.js +254 -0
- package/dist/core/sync/sync-coordinator.js.map +1 -0
- package/dist/core/sync/topology-watcher.d.ts +76 -0
- package/dist/core/sync/topology-watcher.d.ts.map +1 -0
- package/dist/core/sync/topology-watcher.js +222 -0
- package/dist/core/sync/topology-watcher.js.map +1 -0
- package/dist/core/sync/types.d.ts +85 -0
- package/dist/core/sync/types.d.ts.map +1 -0
- package/dist/core/sync/types.js +8 -0
- package/dist/core/sync/types.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +212 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +153 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/database.d.ts +62 -0
- package/dist/utils/database.d.ts.map +1 -0
- package/dist/utils/database.js +257 -0
- package/dist/utils/database.js.map +1 -0
- package/dist/utils/exceptions.d.ts +69 -0
- package/dist/utils/exceptions.d.ts.map +1 -0
- package/dist/utils/exceptions.js +121 -0
- package/dist/utils/exceptions.js.map +1 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +90 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/mysql-client.d.ts +43 -0
- package/dist/utils/mysql-client.d.ts.map +1 -0
- package/dist/utils/mysql-client.js +125 -0
- package/dist/utils/mysql-client.js.map +1 -0
- package/docker/Dockerfile +61 -0
- package/docker/Dockerfile.node +41 -0
- package/docker/grafana/dashboards/clawsql.json +212 -0
- package/docker/grafana/provisioning/dashboards/dashboards.yml +13 -0
- package/docker/grafana/provisioning/datasources/datasources.yml +12 -0
- package/docker/init/primary.sql +26 -0
- package/docker/init/replica.sql +16 -0
- package/docker/orchestrator/orchestrator.conf.json +98 -0
- package/docker/prometheus/prometheus.yml +45 -0
- package/docker/proxysql/entrypoint.sh +8 -0
- package/docker/proxysql/init.sql.demo +30 -0
- package/docker/proxysql/proxysql.cnf +38 -0
- package/docker-compose.demo.yml +115 -0
- package/docker-compose.yml +217 -0
- package/init/primary.sql +19 -0
- package/init/replica.sql +13 -0
- 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 @@
|
|
|
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":"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"}
|
|
@@ -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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"}
|