Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 22 additions & 11 deletions pkg/rdbms/mysql/diagnostics/collectorBuffer.go
Original file line number Diff line number Diff line change
@@ -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
}
Expand All @@ -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
}
37 changes: 26 additions & 11 deletions pkg/rdbms/mysql/diagnostics/collectorThread.go
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
}
2 changes: 1 addition & 1 deletion pkg/rdbms/mysql/diagnostics/collectorWorkload.go
Original file line number Diff line number Diff line change
Expand Up @@ -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%'
Expand Down
1 change: 0 additions & 1 deletion websrc/controllers/healthCheckHandlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down