287 lines
7.3 KiB
Markdown
287 lines
7.3 KiB
Markdown
# Level 1 Auto-Retry - TQQQ 배포
|
|
|
|
> 배포일: 2026-02-05
|
|
> 상태: ✅ 실전 배포 완료
|
|
|
|
## 개요
|
|
|
|
TQQQ 15분 모니터링에 Level 1 Auto-Retry 시스템을 적용하여 Yahoo Finance API 일시적 장애 시 자동 복구 가능하게 개선.
|
|
|
|
## 배포 내용
|
|
|
|
### 1. 래퍼 스크립트 생성
|
|
|
|
**파일**: `~/openclaw/scripts/tqqq-monitor-with-retry.js`
|
|
|
|
```javascript
|
|
const { executeWithNotifications } = require('../lib/auto-retry');
|
|
|
|
async function fetchTQQQ() {
|
|
return new Promise((resolve, reject) => {
|
|
exec(`${CONFIG.PYTHON_SCRIPT} ${CONFIG.SYMBOL}`, {
|
|
timeout: 15000,
|
|
maxBuffer: 10 * 1024 * 1024
|
|
}, (error, stdout, stderr) => {
|
|
if (error) {
|
|
if (error.killed || error.signal === 'SIGTERM') {
|
|
error.code = 'ETIMEDOUT';
|
|
}
|
|
reject(error);
|
|
} else {
|
|
resolve({output: stdout, stderr, duration});
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
const result = await executeWithNotifications(
|
|
fetchTQQQ,
|
|
{
|
|
maxRetries: 3,
|
|
backoff: 'exponential',
|
|
discordWebhook: CONFIG.DISCORD_WEBHOOK,
|
|
taskName: 'TQQQ 15분 모니터링'
|
|
}
|
|
);
|
|
```
|
|
|
|
**특징:**
|
|
- Python 스크립트 (`~/openclaw/skills/yahoo-finance/yf TQQQ`) 래핑
|
|
- 타임아웃 에러 자동 분류 (`ETIMEDOUT`)
|
|
- 최대 3회 재시도 (exponential backoff)
|
|
- Discord 알림 (재시도 중/성공/실패)
|
|
- JSONL 로그 (`~/openclaw/logs/auto-retry.jsonl`)
|
|
|
|
### 2. 실행 테스트
|
|
|
|
```bash
|
|
$ node ~/openclaw/scripts/tqqq-monitor-with-retry.js
|
|
|
|
📊 TQQQ 15분 모니터링 (with Auto-Retry)
|
|
|
|
✅ Success after 1 attempt(s)
|
|
|
|
✅ Success
|
|
Attempts: 1
|
|
Duration: 1912ms
|
|
Script execution: 1912ms
|
|
|
|
📈 TQQQ POSTPOST
|
|
╭─────────────────┬───────────────────╮
|
|
│ 항목 │ 값 │
|
|
├─────────────────┼───────────────────┤
|
|
│ 현재가 (USD) │ $49.76 │
|
|
│ 현재가 (KRW) │ ₩72,507 │
|
|
│ 전일 종가 │ $52.52 │
|
|
│ 변동 (전일比) │ ▼ $2.76 (-5.26%) │
|
|
│ 일중 범위 │ $48.43 ~ $52.15 │
|
|
│ 일중 범위 (KRW) │ ₩70,569 ~ ₩75,989 │
|
|
│ 거래량 │ 140,842,191 │
|
|
│ 환율 │ $1 = ₩1,457.13 │
|
|
╰─────────────────┴───────────────────╯
|
|
|
|
⚠️ 5.3% 변동 - 주의 필요!
|
|
```
|
|
|
|
**결과**: ✅ 첫 시도 성공 (1.9초)
|
|
|
|
### 3. Cron 설정 업데이트
|
|
|
|
**파일**: `~/.openclaw/cron/jobs.json`
|
|
|
|
**변경 사항**:
|
|
- Cron ID: `c55df4d3-9dd8-490b-b835-0cea8e744476`
|
|
- 이름: "TQQQ 15분 모니터링"
|
|
- 스케줄: `*/15 * * * *` (15분마다)
|
|
|
|
**변경 전**:
|
|
```bash
|
|
~/openclaw/skills/yahoo-finance/yf TQQQ
|
|
```
|
|
|
|
**변경 후**:
|
|
```bash
|
|
node ~/openclaw/scripts/tqqq-monitor-with-retry.js
|
|
```
|
|
|
|
## 효과
|
|
|
|
### Before (재시도 없음)
|
|
```
|
|
API 타임아웃 → ❌ 즉시 실패 → Discord 에러 알림 → 수동 재실행 필요
|
|
```
|
|
|
|
### After (Level 1 적용)
|
|
```
|
|
API 타임아웃 → 🔄 자동 재시도 (1초 대기) → ✅ 성공
|
|
→ 🔄 재시도 2 (2초 대기) → ✅ 성공
|
|
→ 🔄 재시도 3 (4초 대기) → ✅ 성공
|
|
→ ❌ 최종 실패 (3회 후)
|
|
```
|
|
|
|
**예상 개선율**:
|
|
- 일시적 네트워크 장애: 90% 자동 복구
|
|
- 사람 개입 필요: 10%로 감소 (현재 100% → 10%)
|
|
|
|
## 로그 확인
|
|
|
|
```bash
|
|
# 실시간 모니터링
|
|
tail -f ~/openclaw/logs/auto-retry.jsonl
|
|
|
|
# 최근 TQQQ 실행 기록
|
|
jq -r 'select(.context.symbol == "TQQQ")' ~/openclaw/logs/auto-retry.jsonl | tail -10
|
|
|
|
# 재시도 성공 건수
|
|
jq -r 'select(.type == "success" and .attempts.length > 1)' ~/openclaw/logs/auto-retry.jsonl | wc -l
|
|
```
|
|
|
|
## 다음 적용 대상
|
|
|
|
### 우선순위 1 (외부 API 의존)
|
|
- [ ] GitHub Watcher (`~/openclaw/skills/github-watcher/check.sh`)
|
|
- [ ] Market Volatility (시장 급변 감지)
|
|
- [ ] 일일 주식 브리핑
|
|
|
|
### 우선순위 2 (네트워크 의존)
|
|
- [ ] Trend Hunter
|
|
- [ ] 매일 뉴스 분석
|
|
- [ ] GitHub 트렌드 감시
|
|
|
|
### 우선순위 3 (안정성 중요)
|
|
- [ ] 월급날 정기투자 알림
|
|
- [ ] 환율 모니터링
|
|
|
|
## 검증 포인트
|
|
|
|
### 1주차 검증 (2026-02-05 ~ 02-12)
|
|
- [ ] 재시도 발생 횟수 확인 (로그 분석)
|
|
- [ ] 자동 복구 성공률 측정
|
|
- [ ] Discord 알림 정상 작동 확인
|
|
- [ ] 최종 실패 건수 확인
|
|
|
|
### 2주차 확장 (2026-02-12 ~ 02-19)
|
|
- [ ] 다른 cron에 적용 (3-5개)
|
|
- [ ] 설정 최적화 (backoff, maxRetries)
|
|
|
|
### 3주차 안정화 (2026-02-19 ~ 02-26)
|
|
- [ ] 전체 cron 적용
|
|
- [ ] Level 2 설계 (파라미터 자동 조정)
|
|
|
|
## 기술 상세
|
|
|
|
### 에러 분류
|
|
|
|
**재시도 가능** (Retryable):
|
|
- Network: `ETIMEDOUT`, `ECONNRESET`, `ENOTFOUND`, `EAI_AGAIN`, `ECONNREFUSED`
|
|
- HTTP: 408, 429, 500, 502, 503, 504
|
|
|
|
**재시도 불가** (Non-retryable):
|
|
- HTTP: 400, 401, 403, 404
|
|
- File: `ENOENT`
|
|
- Logic: 기타 모든 에러
|
|
|
|
### Backoff 전략
|
|
|
|
**Exponential** (기본):
|
|
```
|
|
Attempt 1: 즉시
|
|
Attempt 2: 1초 후
|
|
Attempt 3: 2초 후
|
|
Attempt 4: 4초 후
|
|
Attempt 5: 8초 후
|
|
```
|
|
|
|
### Discord 알림 형식
|
|
|
|
**재시도 중** (Orange):
|
|
```
|
|
🔄 재시도 중
|
|
TQQQ 15분 모니터링 (시도 2/3)
|
|
|
|
에러: Request timeout
|
|
카테고리: timeout
|
|
다음 시도: 2000ms 후
|
|
```
|
|
|
|
**성공** (Green):
|
|
```
|
|
✅ 재시도 성공
|
|
TQQQ 15분 모니터링 (2번째 시도에서 성공)
|
|
```
|
|
|
|
**최종 실패** (Red):
|
|
```
|
|
❌ 최종 실패
|
|
TQQQ 15분 모니터링 (3회 시도 후 실패)
|
|
|
|
제안: Network timeout - check connection or increase timeout
|
|
```
|
|
|
|
## 파일 목록
|
|
|
|
```
|
|
~/openclaw/
|
|
├── scripts/
|
|
│ └── tqqq-monitor-with-retry.js (새로 생성)
|
|
├── lib/
|
|
│ └── auto-retry.js (공통 라이브러리)
|
|
├── logs/
|
|
│ └── auto-retry.jsonl (자동 생성)
|
|
├── docs/
|
|
│ ├── auto-retry-integration.md (통합 가이드)
|
|
│ └── level1-tqqq-deployment.md (이 문서)
|
|
└── examples/
|
|
├── demo-retry.js (데모)
|
|
└── auto-retry-usage.js (사용 예시)
|
|
```
|
|
|
|
## 설정
|
|
|
|
**CONFIG** (`tqqq-monitor-with-retry.js`):
|
|
```javascript
|
|
{
|
|
PYTHON_SCRIPT: '~/openclaw/skills/yahoo-finance/yf',
|
|
SYMBOL: 'TQQQ',
|
|
MAX_RETRIES: 3,
|
|
BACKOFF: 'exponential',
|
|
DISCORD_WEBHOOK: '~/.openclaw/monitoring.json',
|
|
POSITION: {
|
|
avgPrice: 50.79,
|
|
shares: 137,
|
|
totalInvested: 10096898
|
|
},
|
|
STRATEGY: {
|
|
stopLoss: 47.00, // -7.5%
|
|
buyMore: 49.26, // -3%
|
|
takeProfit: 52.31 // +3%
|
|
}
|
|
}
|
|
```
|
|
|
|
## 주의사항
|
|
|
|
1. **Python 스크립트 변경 금지**
|
|
- 기존 `~/openclaw/skills/yahoo-finance/yf` 스크립트는 변경하지 않음
|
|
- 래퍼만 추가하는 방식으로 호환성 유지
|
|
|
|
2. **Cron 실행 주기**
|
|
- 15분마다 실행 (`*/15 * * * *`)
|
|
- 최악의 경우 재시도로 최대 7초 소요 (1+2+4)
|
|
- 15분 간격이므로 충분한 여유
|
|
|
|
3. **Discord 알림**
|
|
- 재시도 발생 시에만 알림 (성공 시 조용)
|
|
- 최종 실패 시 빨간색 알림
|
|
- 알림 spam 방지 (15분당 최대 1회)
|
|
|
|
4. **로그 관리**
|
|
- JSONL 형식으로 누적 (rotate 필요 시 별도 설정)
|
|
- 위치: `~/openclaw/logs/auto-retry.jsonl`
|
|
- 일주일 후 용량 확인 예정
|
|
|
|
---
|
|
|
|
**상태**: ✅ 배포 완료, 실전 모니터링 시작
|
|
**다음**: 1주일 후 효과 분석 및 다른 cron 적용 검토
|