diff --git a/pkg/rdbms/mysql/diagnostics/collectorBuffer.go b/pkg/rdbms/mysql/diagnostics/collectorBuffer.go index a8cd984..ae31309 100644 --- a/pkg/rdbms/mysql/diagnostics/collectorBuffer.go +++ b/pkg/rdbms/mysql/diagnostics/collectorBuffer.go @@ -1,21 +1,19 @@ package diagnostics import ( + "fmt" "database/sql" ) -const BufferCacheQuery string = ` +const BufferCacheQueryTpl string = ` SELECT ROUND( (SUM(IF(variable_name='Innodb_buffer_pool_read_requests', variable_value, 0)) / (SUM(IF(variable_name IN ('Innodb_buffer_pool_read_requests', 'Innodb_buffer_pool_reads'), variable_value, 0))) ) * 100, 2) AS buffer_pool_hit_ratio_pct -FROM performance_schema.global_status; +FROM %s ` -// FROM information_schema.GLOBAL_STATUS; // MariaDB -// FROM performance_schema.global_status; // MySQL; - type DatabaseBufferStat struct { BufferPoolHitRatio float64 } @@ -31,12 +29,25 @@ func NewDatabaseBufferCollector(db *sql.DB) *DatabaseBufferCollector { } func (b *DatabaseBufferCollector) Collect() (DatabaseBufferStat, error) { - var hitRatio float64 - err := b.DB.QueryRow(BufferCacheQuery).Scan(&hitRatio) - if err != nil { - return DatabaseBufferStat{}, err + var fromCandidates = []string{ + "performance_schema.global_status", // MySQL + "information_schema.GLOBAL_STATUS", // MariaDB } + var stat DatabaseBufferStat + var lastErr error + + for _, from := range fromCandidates { + query := fmt.Sprintf(BufferCacheQueryTpl, from) + + var hitRatio float64 + err := b.DB.QueryRow(query).Scan(&hitRatio) + if err == nil { + stat.BufferPoolHitRatio = hitRatio + return stat, nil + } + + lastErr = fmt.Errorf("buffer cache query failed on %s: %w", from, err) + } - stat := DatabaseBufferStat{BufferPoolHitRatio: hitRatio} - return stat, nil + return DatabaseBufferStat{}, lastErr } diff --git a/pkg/rdbms/mysql/diagnostics/collectorThread.go b/pkg/rdbms/mysql/diagnostics/collectorThread.go index b9e3598..7932845 100644 --- a/pkg/rdbms/mysql/diagnostics/collectorThread.go +++ b/pkg/rdbms/mysql/diagnostics/collectorThread.go @@ -1,18 +1,18 @@ package diagnostics -import "database/sql" +import ( + "fmt" + "database/sql" +) -const ThreadQuery string = ` +const ThreadQueryTpl = ` SELECT MAX(CASE WHEN VARIABLE_NAME = 'Threads_connected' THEN VARIABLE_VALUE END) AS threads_connected, MAX(CASE WHEN VARIABLE_NAME = 'Threads_running' THEN VARIABLE_VALUE END) AS threads_running - FROM performance_schema.global_status +FROM %s WHERE VARIABLE_NAME IN ('Threads_connected', 'Threads_running'); ` -// FROM information_schema.GLOBAL_STATUS; // MariaDB -// FROM performance_schema.global_status; // MySQL; - type DatabaseThreadStat struct { ThreadConnected int64 ThreadRunning int64 @@ -29,11 +29,26 @@ func NewDatabaseThreadCollector(db *sql.DB) *DatabaseThreadCollector { } func (b *DatabaseThreadCollector) Collect() (DatabaseThreadStat, error) { - var threadStat DatabaseThreadStat - err := b.DB.QueryRow(ThreadQuery).Scan(&threadStat.ThreadConnected, &threadStat.ThreadRunning) - if err != nil { - return DatabaseThreadStat{}, err + var fromCandidates = []string{ + "performance_schema.global_status", // MySQL + "information_schema.GLOBAL_STATUS", // MariaDB } + var threadStat DatabaseThreadStat + var lastErr error + + for _, from := range fromCandidates { + query := fmt.Sprintf(ThreadQueryTpl, from) + + err := b.DB.QueryRow(query).Scan(&threadStat.ThreadConnected, &threadStat.ThreadRunning) + if err == nil { + // 성공 + return threadStat, nil + } + + // 실패하면 다음 candidate 시도 + lastErr = fmt.Errorf("query failed on %s: %w", from, err) + } - return threadStat, nil + // 모든 candidate 실패 시 에러 반환 + return DatabaseThreadStat{}, lastErr } diff --git a/pkg/rdbms/mysql/diagnostics/collectorWorkload.go b/pkg/rdbms/mysql/diagnostics/collectorWorkload.go index 434b078..ddc4f3c 100644 --- a/pkg/rdbms/mysql/diagnostics/collectorWorkload.go +++ b/pkg/rdbms/mysql/diagnostics/collectorWorkload.go @@ -14,7 +14,7 @@ SELECT SUM(SUM_TIMER_WAIT) AS total_latency_ps, MAX(MAX_TIMER_WAIT) AS max_latency_ps FROM performance_schema.events_statements_summary_by_digest -WHERE OBJECT_SCHEMA = ? +WHERE SCHEMA_NAME = ? AND DIGEST_TEXT NOT LIKE 'COMMIT%' AND DIGEST_TEXT NOT LIKE 'ROLLBACK%' AND DIGEST_TEXT NOT LIKE 'START TRANSACTION%' diff --git a/websrc/controllers/healthCheckHandlers.go b/websrc/controllers/healthCheckHandlers.go index c9cf12b..1b04016 100644 --- a/websrc/controllers/healthCheckHandlers.go +++ b/websrc/controllers/healthCheckHandlers.go @@ -49,7 +49,6 @@ func (h *HealthHandler) GetSystemReadyHandler(ctx echo.Context) error { start := time.Now() logger, logstrings := pageLogInit(ctx, "healthcheck-task", "Ready?", start) - // TODO - db 헬스체크 추가 예정 dbHealthy := h.isDatabaseHealthy() if !dbHealthy { errStr := "db is not healthy"