/* @tier medium @module mg @transform msg-gateway-batch */ /* * mg_bt_0016.pgc - 전문게이트웨이 채널 헬스체크 집계 배치 [tier=medium] * * 채널 상태 테이블(mg_chan)을 커서로 순회하며 채널별 헬스 응답률(성공/총 * 요청)을 계산하고, 임계(95%) 미만 채널을 비정상으로 분류·집계한다. * 배치 main 엔트리 포함. * * 실행: mg_bt_0016 [db@host] */ #include #include #include #include "txcore.h" #include "txcore_dbio.h" #include "acq_util.h" #include "mg_core.h" EXEC SQL INCLUDE sqlca; #define MG_HEALTH_THRESHOLD 95 /* 정상 판정 응답률(%) */ static int run_mg_bt_0016(void) { EXEC SQL BEGIN DECLARE SECTION; char h_chan_cd[8]; long h_req; long h_ok; EXEC SQL END DECLARE SECTION; long chans = 0, healthy = 0, unhealthy = 0, idle = 0; EXEC SQL DECLARE cur_mg_bt_0016 CURSOR FOR SELECT chan_cd, COALESCE(req_cnt, 0), COALESCE(ok_cnt, 0) FROM mg_chan ORDER BY chan_cd; EXEC SQL OPEN cur_mg_bt_0016; if (sqlca.sqlcode != TX_SQL_OK) { TX_DBIO_LOG_ERR("OPEN cur_mg_bt_0016"); return TX_EDB; } for (;;) { long rate; EXEC SQL FETCH cur_mg_bt_0016 INTO :h_chan_cd, :h_req, :h_ok; if (sqlca.sqlcode == TX_SQL_NOTFOUND) break; if (sqlca.sqlcode != TX_SQL_OK) { TX_DBIO_LOG_ERR("FETCH cur_mg_bt_0016"); break; } chans++; if (h_req <= 0) { idle++; tx_log(TX_LOG_DEBUG, "[mg_bt_0016] 유휴채널 chan=%s", h_chan_cd); continue; } rate = (h_ok * 100) / h_req; if (rate >= MG_HEALTH_THRESHOLD) { healthy++; } else { unhealthy++; tx_log(TX_LOG_WARN, "[mg_bt_0016] 비정상 채널 chan=%s 응답률=%ld%%", h_chan_cd, rate); } } EXEC SQL CLOSE cur_mg_bt_0016; tx_log(TX_LOG_INFO, "[mg_bt_0016] 헬스집계 채널=%ld 정상=%ld 비정상=%ld 유휴=%ld", chans, healthy, unhealthy, idle); printf("========== 채널 헬스체크 집계 [mg_bt_0016] ==========\n"); printf(" 총 채널수 : %ld\n", chans); printf(" 정상 채널 : %ld\n", healthy); printf(" 비정상 채널 : %ld\n", unhealthy); printf(" 유휴 채널 : %ld\n", idle); printf("=============================================\n"); return (unhealthy == 0) ? TX_OK : TX_FAIL; } int main(int argc, char **argv) { const char *biz_date; const char *target; int rc; tx_set_loglevel(TX_LOG_INFO); if (argc < 2) { fprintf(stderr, "사용법: %s [db@host]\n", argv[0]); return 2; } biz_date = argv[1]; target = (argc >= 3) ? argv[2] : NULL; if (!date_is_valid(biz_date)) { fprintf(stderr, "오류: 유효하지 않은 영업일 '%s'\n", biz_date); return 2; } tx_log(TX_LOG_INFO, "[mg_bt_0016] 헬스체크 배치 시작 date=%s", biz_date); rc = mg_dbio_connect(target); if (rc != TX_OK) { tx_log(TX_LOG_ERROR, "[mg_bt_0016] DB 접속 실패 rc=%d", rc); return 1; } rc = run_mg_bt_0016(); mg_dbio_disconnect(); tx_log(TX_LOG_INFO, "[mg_bt_0016] 배치 종료 rc=%d(%s)", rc, tx_strerror(rc)); return (rc == TX_OK) ? 0 : 1; }