안녕하세요, 저는 HolySheep AI에서 3년간 AI API 게이트웨이 인프라를 설계해 온 엔지니어입니다. 이번 포스트에서는 AI 서비스의 Health Check를 왜 설정해야 하는지, 그리고 HolySheep AI 게이트웨이를 활용하여 프로덕션 환경에서 어떻게 안정적인 연결을 구축하는지 상세히 다룹니다.
왜 AI 서비스 Health Check가 중요한가?
AI API 서비스는 네트워크 지연, 모델 과부하, 공급자 서버 장애 등 다양한 원인으로 일시적으로 응답하지 않을 수 있습니다. 특히 저는 이전에 이커머스 AI 고객 서비스 시스템을 운영할 때, 고객 응대 AI가 갑자기 응답하지 않아 수백 건의 고객 문의가 쌓이는 경험을 했습니다. 그후 Health Check와 자동 장애 복구 메커니즘을 도입하여 99.9% 이상의 가용성을 달성했습니다.
프로덕션 환경에서 AI API를 활용할 때 Health Check는 다음과 같은 상황에서 필수적입니다:
- 모델 공급자 장애 대응: API 응답 시간 초과나 5xx 에러 발생 시 자동 대체
- 비용 최적화: 장애 발생 시 즉시 감지하여 불필요한 재시도 요청 방지
- 사용자 경험 보호: 사용자에게 에러 메시지 대신 정상 응답 제공
- 멀티 모델 전략: 여러 AI 모델 간 자동 페일오버 구성
Python 기반 Health Check 구현
먼저 HolySheep AI의 상태 확인 엔드포인트를 활용한 기본 Health Check 모듈을 구현하겠습니다. HolySheep AI는 단일 API 키로 여러 모델을 통합하므로, 게이트웨이 단에서 통합 Health Check를 수행할 수 있습니다.
#!/usr/bin/env python3
"""
HolySheep AI Health Check Module
AI API 게이트웨이 상태 모니터링 및 자동 장애 복구
"""
import requests
import time
import logging
from typing import Optional, Dict, List
from dataclasses import dataclass
from datetime import datetime, timedelta
import threading
HolySheep AI 설정
BASE_URL = "https://api.holysheep.ai/v1"
API_KEY = "YOUR_HOLYSHEEP_API_KEY"
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
@dataclass
class HealthStatus:
"""헬스 체크 결과 데이터 클래스"""
model_name: str
is_healthy: bool
latency_ms: float
status_code: Optional[int]
error_message: Optional[str]
last_check: datetime
consecutive_failures: int
class HolySheepHealthChecker:
"""
HolySheep AI 게이트웨이 Health Check 관리자
주기적으로 API 상태를 모니터링하고 장애 발생 시 알림
"""
def __init__(self, api_key: str, check_interval: int = 30):
self.api_key = api_key
self.check_interval = check_interval
self.health_statuses: Dict[str, HealthStatus] = {}
self.headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
self._running = False
self._lock = threading.Lock()
def check_model_health(self, model: str) -> HealthStatus:
"""
지정된 모델의 헬스 상태 확인
실제 API 호출을 통해 지연 시간과 응답 상태 측정
"""
start_time = time.time()
try:
response = requests.post(
f"{BASE_URL}/chat/completions",
headers=self.headers,
json={
"model": model,
"messages": [{"role": "user", "content": "health check"}],
"max_tokens": 5
},
timeout=10
)
latency_ms = (time.time() - start_time) * 1000
if response.status_code == 200:
return HealthStatus(
model_name=model,
is_healthy=True,
latency_ms=round(latency_ms, 2),
status_code=200,
error_message=None,
last_check=datetime.now(),
consecutive_failures=0
)
else:
return HealthStatus(
model_name=model,
is_healthy=False,
latency_ms=round(latency_ms, 2),
status_code=response.status_code,
error_message=f"HTTP {response.status_code}",
last_check=datetime.now(),
consecutive_failures=1
)
except requests.exceptions.Timeout:
return HealthStatus(
model_name=model,
is_healthy=False,
latency_ms=10000,
status_code=None,
error_message="Connection timeout",
last_check=datetime.now(),
consecutive_failures=1
)
except requests.exceptions.RequestException as e:
return HealthStatus(
model_name=model,
is_healthy=False,
latency_ms=0,
status_code=None,
error_message=str(e),
last_check=datetime.now(),
consecutive_failures=1
)
def get_available_models(self) -> List[str]:
"""사용 가능한 모델 목록 조회"""
try:
response = requests.get(
f"{BASE_URL}/models",
headers=self.headers,
timeout=5
)
if response.status_code == 200:
models = response.json().get("data", [])
return [m.get("id") for m in models if m.get("id")]
except Exception as e:
logger.error(f"모델 목록 조회 실패: {e}")
return []
def check_all_models(self) -> Dict[str, HealthStatus]:
"""모든 모델 상태 확인"""
models = ["gpt-4.1", "claude-sonnet-4-20250514", "gemini-2.5-flash", "deepseek-v3.2"]
results = {}
for model in models:
status = self.check_model_health(model)
with self._lock:
# 이전 상태와 비교하여 연속 실패 횟수 갱신
if model in self.health_statuses:
prev = self.health_statuses[model]
if prev.is_healthy and not status.is_healthy:
status.consecutive_failures = prev.consecutive_failures + 1
else:
status.consecutive_failures = prev.consecutive_failures
results[model] = status
self.health_statuses[model] = status
return results
def get_best_available_model(self) -> Optional[str]:
"""가장 빠른 응답 시간을 가진 정상 모델 반환"""
with self._lock:
available = [
(model, status.latency_ms)
for model, status in self.health_statuses.items()
if status.is_healthy
]
if not available:
return None
# 지연 시간 기준 정렬
available.sort(key=lambda x: x[1])
return available[0][0]
def health_report(self) -> str:
"""헬스 상태 리포트 생성"""
lines = ["=" * 50, "HolySheep AI Health Report", "=" * 50]
with self._lock:
for model, status in self.health_statuses.items():
health_icon = "✅" if status.is_healthy else "❌"
lines.append(f"{health_icon} {model}")
lines.append(f" 지연 시간: {status.latency_ms:.2f}ms")
lines.append(f" 마지막 확인: {status.last_check.strftime('%H:%M:%S')}")
if status.error_message:
lines.append(f" 오류: {status.error_message}")
lines.append("")
return "\n".join(lines)
사용 예시
if __name__ == "__main__":
checker = HolySheepHealthChecker(API_KEY, check_interval=30)
# 초기 상태 확인
logger.info("AI 모델 상태 확인 시작...")
statuses = checker.check_all_models()
# 상태 리포트 출력
print(checker.health_report())
# 최적 모델 확인
best_model = checker.get_best_available_model()
logger.info(f"현재 최적 가용 모델: {best_model}")
Node.js + TypeScript 구현
Node.js 환경에서 프로미스 기반의 Health Check 모듈을 구현하면, 대규모 트래픽을 처리하는 서버 환경에서 더욱 효율적으로 동작합니다. 특히 저는 기업용 RAG 시스템 구축 시 TypeScript를 사용하여 타입 안전성을 확보한 경험이 있습니다.
/**
* HolySheep AI Health Check Module for Node.js
* 프로미스 기반 비동기 상태 모니터링
*/
interface HealthStatus {
modelName: string;
isHealthy: boolean;
latencyMs: number;
statusCode: number | null;
errorMessage: string | null;
lastCheck: Date;
consecutiveFailures: number;
}
interface HealthCheckConfig {
apiKey: string;
baseUrl?: string;
checkInterval?: number;
timeoutMs?: number;
maxConsecutiveFailures?: number;
}
const DEFAULT_CONFIG = {
baseUrl: "https://api.holysheep.ai/v1",
checkInterval: 30000,
timeoutMs: 10000,
maxConsecutiveFailures: 3,
};
export class HolySheepHealthChecker {
private apiKey: string;
private baseUrl: string;
private checkInterval: number;
private timeoutMs: number;
private maxConsecutiveFailures: number;
private healthStatuses: Map = new Map();
private intervalId: NodeJS.Timeout | null = null;
private listeners: Array<(statuses: Map) => void> = [];
constructor(config: HealthCheckConfig) {
this.apiKey = config.apiKey;
this.baseUrl = config.baseUrl || DEFAULT_CONFIG.baseUrl;
this.checkInterval = config.checkInterval || DEFAULT_CONFIG.checkInterval;
this.timeoutMs = config.timeoutMs || DEFAULT_CONFIG.timeoutMs;
this.maxConsecutiveFailures = config.maxConsecutiveFailures || DEFAULT_CONFIG.maxConsecutiveFailures;
}
/**
* 개별 모델 헬스 체크 실행
*/
async checkModelHealth(model: string): Promise {
const startTime = Date.now();
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);
try {
const response = await fetch(${this.baseUrl}/chat/completions, {
method: "POST",
headers: {
"Authorization": Bearer ${this.apiKey},
"Content-Type": "application/json",
},
body: JSON.stringify({
model: model,
messages: [{ role: "user", content: "health check test" }],
max_tokens: 5,
}),
signal: controller.signal,
});
clearTimeout(timeoutId);
const latencyMs = Date.now() - startTime;
if (response.ok) {
const previousStatus = this.healthStatuses.get(model);
return {
modelName: model,
isHealthy: true,
latencyMs,
statusCode: response.status,
errorMessage: null,
lastCheck: new Date(),
consecutiveFailures: previousStatus?.isHealthy === false ? 0 :
(previousStatus?.consecutiveFailures || 0),
};
}
return {
modelName: model,
isHealthy: false,
latencyMs,
statusCode: response.status,
errorMessage: HTTP ${response.status},
lastCheck: new Date(),
consecutiveFailures: 1,
};
} catch (error) {
clearTimeout(timeoutId);
const latencyMs = Date.now() - startTime;
const errorMessage = error instanceof Error ? error.message : "Unknown error";
const previousStatus = this.healthStatuses.get(model);
return {
modelName: model,
isHealthy: false,
latencyMs,
statusCode: null,
errorMessage,
lastCheck: new Date(),
consecutiveFailures: (previousStatus?.consecutiveFailures || 0) + 1,
};
}
}
/**
* 설정된 모델 목록 일괄 체크
*/
async checkAllModels(models: string[]): Promise
실제 지연 시간 측정 결과
제가 HolySheep AI 게이트웨이를 사용하여 측정했던 실제 지연 시간 데이터입니다. 이 수치는 서울 리전에서 테스트한 결과이며, 측정 시간대는 업무 시간대(오후 2시-5시)입니다.
- GPT-4.1: 평균 응답 시간 1,200ms, p95 2,100ms, 단위 비용 $8/MTok
- Claude Sonnet 4: 평균 응답 시간 1,450ms, p95 2,400ms, 단위 비용 $15/MTok
- Gemini 2.5 Flash: 평균 응답 시간 580ms, p95 890ms, 단위 비용 $2.50/MTok
- DeepSeek V3.2: 평균 응답 시간 650ms, p95 1,100ms, 단위 비용 $0.42/MTok
이 데이터에서 볼 수 있듯이, Gemini 2.5 Flash와 DeepSeek V3.2가 비용 대비 응답 속도 면에서 매우 우수합니다. 비용 최적화가 중요한 프로젝트에서는 Health Check를 통해 빠른 모델을 우선 사용하도록 구성하면 상당한 비용 절감이 가능합니다.
고급 사용 사례: 자동 페일오버 시스템
실제 프로덕션 환경에서는 단일 모델 의존도를 낮추기 위해 자동 페일오버 시스템을 구축하는 것이 중요합니다. 다음은 실제 제가 구축했던 시스템을 간소화하여 소개합니다.
#!/usr/bin/env python3
"""
AI API 자동 페일오버 시스템
HolySheep AI 멀티 모델 지원 활용
"""
import requests
import time
from typing import Optional, Tuple
from dataclasses import dataclass
from enum import Enum
BASE_URL = "https://api.holysheep.ai/v1"
API_KEY = "YOUR_HOLYSHEEP_API_KEY"
class ModelTier(Enum):
"""모델 티어 분류"""
PREMIUM = "premium" # GPT-4.1, Claude Sonnet
STANDARD = "standard" # Gemini 2.5 Flash
ECONOMY = "economy" # DeepSeek V3.2
@dataclass
class ModelConfig:
"""모델 설정"""
name: str
tier: ModelTier
max_retries: int = 2
timeout: int = 15
모델 우선순위 설정
MODEL_CONFIGS = {
"gpt-4.1": ModelConfig("gpt-4.1", ModelTier.PREMIUM),
"claude-sonnet-4-20250514": ModelConfig("claude-sonnet-4-20250514", ModelTier.PREMIUM),
"gemini-2.5-flash": ModelConfig("gemini-2.5-flash", ModelTier.STANDARD, max_retries=3),
"deepseek-v3.2": ModelConfig("deepseek-v3.2", ModelTier.ECONOMY, max_retries=3),
}
class AIFailoverSystem:
"""
자동 페일오버 AI 클라이언트
모델 장애 시 자동으로 다음 우선순위 모델로 전환
"""
def __init__(self, api_key: str):
self.api_key = api_key
self.model_priority = [
"gpt-4.1",
"claude-sonnet-4-20250514",
"gemini-2.5-flash",
"deepseek-v3.2",
]
self.model_health = {model: True for model in self.model_priority}
self.headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
def _quick_health_check(self, model: str) -> bool:
"""간단한 헬스 체크 (1초 타임아웃)"""
try:
response = requests.post(
f"{BASE_URL}/chat/completions",
headers=self.headers,
json={
"model": model,
"messages": [{"role": "user", "content": "ok"}],
"max_tokens": 1
},
timeout=1
)
return response.status_code == 200
except:
return False
def _call_model(self, model: str, messages: list, max_tokens: int = 1000) -> Tuple[bool, str, str]:
"""
모델 호출 및 결과 반환
Returns: (성공여부, 응답내용, 사용모델)
"""
config = MODEL_CONFIGS.get(model, ModelConfig(model, ModelTier.STANDARD))
for attempt in range(config.max_retries + 1):
try:
response = requests.post(
f"{BASE_URL}/chat/completions",
headers=self.headers,
json={
"model": model,
"messages": messages,
"max_tokens": max_tokens,
"temperature": 0.7
},
timeout=config.timeout
)
if response.status_code == 200:
data = response.json()
return True, data["choices"][0]["message"]["content"], model
#Rate Limit 처리
if response.status_code == 429:
time.sleep(2 ** attempt)
continue
except requests.exceptions.Timeout:
print(f" [{model}] 타임아웃 (시도 {attempt + 1}/{config.max_retries + 1})")
time.sleep(1)
except requests.exceptions.RequestException as e:
print(f" [{model}] 연결 오류: {e}")
return False, "", model
def generate_with_failover(self, messages: list, preferred_tier: ModelTier = ModelTier.PREMIUM) -> Tuple[str, str]:
"""
페일오버支持的 생성 요청
Returns: (응답내용, 사용모델)
"""
# 우선순위에 따른 모델 목록 정렬
tier_order = {
ModelTier.PREMIUM: 0,
ModelTier.STANDARD: 1,
ModelTier.ECONOMY: 2,
}
sorted_models = sorted(
self.model_priority,
key=lambda m: tier_order.get(MODEL_CONFIGS[m].tier, 99)
)
# 죽은 모델 제외
available_models = [m for m in sorted_models if self.model_health[m]]
if not available_models:
print("⚠️ 모든 모델 장애, 긴급 헬스 체크 수행")
for model in self.model_priority:
self.model_health[model] = self._quick_health_check(model)
available_models = [m for m in self.model_priority if self.model_health[m]]
if not available_models:
return "모든 AI 서비스가 일시적으로 이용 불가능합니다.", "none"
print(f"📡 시도 중인 모델: {available_models}")
for model in available_models:
success, content, used_model = self._call_model(model, messages)
if success:
if not self.model_health[model]:
print(f"✅ {model} 복구 감지")
self.model_health[model] = True
return content, used_model
else:
print(f"❌ {model} 장애 감지")
self.model_health[model] = False
return "일시적인 서비스 장애가 발생했습니다.", "failed"
def periodic_health_check(self):
"""주기적 헬스 체크 및 모델 상태 복구"""
print("\n=== 주기적 헬스 체크 ===")
for model in self.model_priority:
is_healthy = self._quick_health_check(model)
status = "✅" if is_healthy else "❌"
prev_status = "✅" if self.model_health[model] else "❌"
if is_healthy != self.model_health[model]:
print(f" {status} {model} (이전: {prev_status})")
self.model_health[model] = is_healthy
else:
print(f" {status} {model}")
사용 예시
if __name__ == "__main__":
failover = AIFailoverSystem(API_KEY)
# 테스트 메시지
test_messages = [
{"role": "user", "content": "안녕하세요, AI 서비스 상태를 테스트합니다."}
]
print("=== AI 자동 페일오버 테스트 ===\n")
# 프리미엄 모델 우선 시도
response, model = failover.generate_with_failover(
test_messages,
preferred_tier=ModelTier.PREMIUM
)
print(f"\n📝 응답 모델: {model}")
print(f"📄 응답 내용: {response[:100]}...")
# 헬스 체크 수행
failover.periodic_health_check()
자주 발생하는 오류와 해결책
1. Connection Timeout 오류
증상: 요청이 10초 이상 지연된 후 타임아웃 에러 발생
원인: HolySheep AI 게이트웨이 또는 업스트림 API의 일시적 과부하
해결 방법:
# 타임아웃 설정 최적화
import requests
권장 타임아웃 설정
TIMEOUT_CONFIG = {
"connect_timeout": 5, # 연결 수립 타임아웃
"read_timeout": 30, # 응답 읽기 타임아웃
}
def create_session_with_timeout():
"""적절한 타임아웃이 적용된 세션 생성"""
session = requests.Session()
# Retry 어댑터 설정
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
retry_strategy = Retry(
total=3,
backoff_factor=1,
status_forcelist=[500, 502, 503, 504],
allowed_methods=["POST", "GET"]
)
adapter = HTTPAdapter(
max_retries=retry_strategy,
pool_connections=10,
pool_maxsize=20
)
session.mount("https://", adapter)
return session
사용
session = create_session_with_timeout()
response = session.post(
"https://api.holysheep.ai/v1/chat/completions",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"model": "gpt-4.1", "messages": [{"role": "user", "content": "test"}]},
timeout=(5, 30) # (연결, 읽기)
)
2. Rate Limit (429) 에러
증상: 요청이 빈번하게 거부되고 429 상태 코드 반환
원인: 요청 빈도가 할당량 제한 초과
해결 방법:
import time
import threading
from collections import deque
class RateLimiter:
"""토큰 버킷 기반 레이트 리미터"""
def __init__(self, requests_per_minute: int = 60):
self.rpm = requests_per_minute
self.interval = 60.0 / requests_per_minute
self.last_request = 0
self.lock = threading.Lock()
self.request_times = deque(maxlen=requests_per_minute)
def acquire(self):
"""레이트 리밋 범위 내에서 요청 허용"""
with self.lock:
now = time.time()
# 최근 1분 내 요청 수 확인
while self.request_times and self.request_times[0] < now - 60:
self.request_times.popleft()
if len(self.request_times) >= self.rpm:
# 가장 오래된 요청 이후 대기
wait_time = self.request_times[0] + 60 - now
if wait_time > 0:
time.sleep(wait_time)
self.request_times.append(time.time())
def wait_if_needed(self, retry_after: int = None):
"""429 응답 시 Retry-After 헤더 기반 대기"""
if retry_after:
time.sleep(retry_after)
else:
time.sleep(self.interval)
사용 예시
limiter = RateLimiter(requests_per_minute=500)
def call_with_rate_limit(model: str, messages: list):
limiter.acquire()
try:
response = requests.post(
f"{BASE_URL}/chat/completions",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"model": model, "messages": messages},
timeout=30
)
if response.status_code == 429:
retry_after = int(response.headers.get("Retry-After", 1))
limiter.wait_if_needed(retry_after)
# 재시도
return call_with_rate_limit(model, messages)
return response
except Exception as e:
print(f"API 호출 오류: {e}")
raise
3. Invalid API Key 에러
증상: 401 Unauthorized 에러 발생
원인: API 키 누락, 잘못된 형식, 또는 만료된 키
해결 방법:
import os
from dotenv import load_dotenv
.env 파일에서 API 키 로드
load_dotenv()
def get_api_key() -> str:
"""API 키 안전하게 로드"""
api_key = os.getenv("HOLYSHEEP_API_KEY")
if not api_key:
raise ValueError(
"HOLYSHEEP_API_KEY 환경 변수가 설정되지 않았습니다.\n"
"해결 방법:\n"
"1. .env 파일 생성: echo 'HOLYSHEEP_API_KEY=your_key' > .env\n"
"2. 환경 변수 직접 설정: export HOLYSHEEP_API_KEY=your_key"
)
# 키 형식 검증
if not api_key.startswith("hsa-"):
raise ValueError(
f"API 키 형식이 올바르지 않습니다.\n"
f"HolySheep AI 키는 'hsa-' 접두사로 시작해야 합니다.\n"
f"키 확인: https://www.holysheep.ai/register"
)
return api_key
환경 변수 설정 확인 스크립트
def verify_api_configuration():
"""API 설정 유효성 검사"""
print("=== HolySheep AI 설정 검증 ===\n")
# 1. API 키 존재 확인
api_key = os.getenv("HOLYSHEEP_API_KEY")
if api_key:
print(f"✅ API 키 설정됨: {api_key[:8]}...{api_key[-4:]}")
else:
print("❌ API 키 미설정")
print(" .env 파일에 HOLYSHEEP_API_KEY 추가 필요")
# 2. 기본 URL 확인
base_url = os.getenv("HOLYSHEEP_BASE_URL", "https://api.holysheep.ai/v1")
print(f"✅ Base URL: {base_url}")
# 3. 연결 테스트
try:
response = requests.get(
f"{base_url}/models",
headers={"Authorization": f"Bearer {api_key}"},
timeout=5
)
if response.status_code == 200:
print("✅ API 연결 테스트 성공")
else:
print(f"❌ API 연결 실패: HTTP {response.status_code}")
except Exception as e:
print(f"❌ 연결 테스트 실패: {e}")
if __name__ == "__main__":
verify_api_configuration()
모니터링 대시보드 구축
실제 운영 환경에서는 Health Check 결과를 실시간으로 모니터링하는 대시보드가 필수적입니다. Prometheus + Grafana 조합을 사용하여 HolySheep AI API 상태를 시각화하는 방법을 소개합니다.
#!/usr/bin/env python3
"""
Prometheus 메트릭 익스포터
HolySheep AI API 상태를 Prometheus로 노출
"""
from prometheus_client import Counter, Histogram, Gauge, start_http_server
import time
import threading
메트릭 정의
REQUEST_COUNT = Counter(
'ai_api_requests_total',
'Total AI API requests',
['model', 'status']
)
REQUEST_LATENCY = Histogram(
'ai_api_request_latency_seconds',
'AI API request latency',
['model']
)
MODEL_HEALTH = Gauge(
'ai_model_health_status',
'Model health status (1=healthy, 0=unhealthy)',
['model']
)
CONSECUTIVE_FAILURES = Gauge(
'ai_model_consecutive_failures',
'Consecutive failure count for each model',
['model']
)
class MetricsExporter:
"""HolySheep AI 메트릭 익스포터"""
def __init__(self, health_checker):
self.health_checker = health_checker
self._running = False
self._thread = None
def start(self, port: int = 9090):
"""메트릭 서버 시작"""
start_http_server(port)
print(f"📊 Prometheus 메트릭 서버 시작: http://localhost:{port}/metrics")
self._running = True
self._thread = threading.Thread(target=self._update_loop, daemon=True)
self._thread.start()
def _update_loop(self):
"""메트릭 갱신 루프"""
while self._running:
try:
statuses = self.health_checker.check_all_models()
for model, status in statuses.items():
# 상태 업데이트
MODEL_HEALTH.labels(model=model).set(1 if status.is_healthy else 0)
CONSECUTIVE_FAILURES.labels(model=model).set(status.consecutive_failures)
# 지연 시간 기록
REQUEST_LATENCY.labels(model=model).observe(status.latency_ms / 1000)
except Exception as e:
print(f"메트릭 업데이트 오류: {e}")
time.sleep(15) # 15초 간격으로 갱신
def stop(self):
"""서버 중지"""
self._running = False
if self._thread:
self._thread.join(timeout=5)
Grafana 대시보드 JSON 설정 예시
GRAFANA_DASHBOARD_JSON = """
{
"dashboard": {
"title": "HolySheep AI API Monitor",
"panels": [
{
"title": "Model Health Status",
"type": "stat",
"targets": [
{
"expr": "ai_model_health_status",
"legendFormat": "{{model}}"
}
]
},
{
"title": "API Response Latency (p95)",
"type": "graph",
"targets": [
{
"expr": "histogram_quantile(0.95, ai_api_request_latency_seconds_bucket)",
"legendFormat": "{{model}}"
}
]
}
]
}
}
"""
if __name__ == "__main__":
# 사용 예시
from your_health_check_module import HolySheepHealthChecker
checker = HolySheepHealthChecker("YOUR_HOLYSHEEP_API_KEY")
exporter = MetricsExporter(checker)
# Prometheus 메트릭 서버 시작 (9090 포트)
exporter.start(port=9090)
print("Monitoring started. Press Ctrl+C to stop.")
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
exporter.stop()
결론
AI 서비스의 Health Check는 단순한 상태