Skip to content

Commit 3d098c4

Browse files
authored
Merge pull request #209 from prgrms-aibe-devcourse/ci/env
S3 요청량 감소를 위한 로그처리 및 필터 적용 등..
2 parents ea1ec68 + 9d4f29a commit 3d098c4

6 files changed

Lines changed: 27 additions & 109 deletions

File tree

.github/workflows/deploy.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: CI/CD Pipeline to EC2 with Blue/Green
22

33
on:
44
push:
5-
branches: [main, dev]
5+
branches: [main, dev, ci/env]
66

77
# ───────────────────────────────────────────────────────────────
88
concurrency:

docker/docker-compose.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@ services:
4444

4545
healthcheck:
4646
test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
47-
interval: 15s
47+
interval: 10s
4848
timeout: 10s
4949
retries: 10
50-
start_period: 60s
50+
start_period: 20s
5151
restart: unless-stopped
5252
networks:
5353
- shared-app-monitor-network
@@ -95,10 +95,10 @@ services:
9595

9696
healthcheck:
9797
test: ["CMD", "curl", "-f", "http://localhost:8081/actuator/health"]
98-
interval: 15s
98+
interval: 10s
9999
timeout: 10s
100100
retries: 10
101-
start_period: 60s
101+
start_period: 20s
102102
restart: unless-stopped
103103
networks:
104104
- shared-app-monitor-network

monitoring/loki/config.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ ingester:
2121
kvstore: { store: inmemory }
2222
replication_factor: 1
2323
num_tokens: 512
24-
final_sleep: 0s
25-
chunk_idle_period: 24h # 하루 단위 업로드 (업무 시간만 업로드)
26-
chunk_block_size: 4194304 # 4MB로 확대
24+
final_sleep: 30m # 서버 종료 시 최대 30분 동안 남은 청크 flush
25+
chunk_idle_period: 8h # 8시간으로 변경 (서버 운영 시간 고려)
26+
chunk_block_size: 10485760 # 10MB로 확대
2727
chunk_retain_period: 72h # 청크가 로컬에 유지되는 최대 시간
28-
max_chunk_age: 24h # 무조건 하루 단위로 S3 업로드
28+
max_chunk_age: 8h # 8시간으로 변경 (서버 운영 시간 고려)
2929

3030
compactor:
3131
compaction_interval: 6h # 기존 10분 → 6시간

monitoring/promtail/config.yml

Lines changed: 15 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -15,134 +15,51 @@ scrape_configs:
1515
- job_name: container_logs # 이 job_name은 초기값으로 사용되며, relabel_configs에서 변경됩니다.
1616
docker_sd_configs:
1717
- host: unix:///var/run/docker.sock # Docker 데몬 소켓
18-
refresh_interval: 5s # 컨테이너 변경 감지 주기
18+
refresh_interval: 1m # 컨테이너 변경 감지 주기
1919

2020
relabel_configs:
21-
# ────────────────────────────────────────────────────────────
22-
# 1) 'job' 라벨 할당 (순서 중요!)
23-
# - 먼저 모든 로그에 'default-container-logs'를 할당합니다.
24-
# - 그 다음 특정 컨테이너에 대해 이 라벨을 덮어씁니다.
25-
# ────────────────────────────────────────────────────────────
26-
# 모든 로그에 기본 'job' 라벨 할당 (fallback)
27-
- source_labels: ['__meta_docker_container_name']
28-
regex: '.*'
29-
replacement: 'default-container-logs'
30-
target_label: 'job'
31-
action: replace
32-
33-
# Spring Boot 앱 컨테이너에 'spring-boot-app' job 라벨 할당
34-
- source_labels: ['__meta_docker_container_name']
35-
regex: '/?lastdance-(blue-app|green-app)'
36-
replacement: 'spring-boot-app'
37-
target_label: 'job'
38-
action: replace
39-
40-
# 모니터링 스택 컨테이너에 'monitoring-stack' job 라벨 할당
41-
- source_labels: ['__meta_docker_container_name']
42-
regex: '/?(prometheus|grafana|node-exporter|loki|promtail|alertmanager)' # alertmanager 추가
43-
replacement: 'monitoring-stack'
44-
target_label: 'job'
45-
action: replace
46-
47-
# ────────────────────────────────────────────────────────────
48-
# 2) 'instance' 라벨 할당 (각 서비스의 고유 식별자)
49-
# ────────────────────────────────────────────────────────────
50-
# 앱 컨테이너 instance: blue-app:8080, green-app:8081 형태
51-
- source_labels: ['__meta_docker_container_name','__meta_docker_container_port']
52-
regex: '/?lastdance-(blue-app|green-app).*?;(.*)'
53-
replacement: '$1:$2'
54-
target_label: 'instance'
55-
action: replace
56-
57-
# 모니터링 스택 각 컴포넌트 instance 라벨
58-
- source_labels: ['__meta_docker_container_name']
59-
regex: '/?prometheus'
60-
replacement: 'prometheus:9090'
61-
target_label: 'instance'
62-
action: replace
63-
- source_labels: ['__meta_docker_container_name']
64-
regex: '/?grafana'
65-
replacement: 'grafana:3000'
66-
target_label: 'instance'
67-
action: replace
68-
- source_labels: ['__meta_docker_container_name']
69-
regex: '/?node-exporter'
70-
replacement: 'node-exporter:9100'
71-
target_label: 'instance'
72-
action: replace
73-
- source_labels: ['__meta_docker_container_name']
74-
regex: '/?loki'
75-
replacement: 'loki:3100'
76-
target_label: 'instance'
77-
action: replace
78-
- source_labels: ['__meta_docker_container_name']
79-
regex: '/?promtail'
80-
replacement: 'promtail:9080'
81-
target_label: 'instance'
82-
action: replace
83-
- source_labels: ['__meta_docker_container_name']
84-
regex: '/?alertmanager' # alertmanager 추가
85-
replacement: 'alertmanager:9093'
86-
target_label: 'instance'
87-
action: replace
88-
89-
# ────────────────────────────────────────────────────────────
90-
# 3) 기타 유용한 라벨 할당
91-
# ────────────────────────────────────────────────────────────
9221
# 'container_name' 라벨: 실제 컨테이너 이름만 추출 (예: 'lastdance-blue-app')
9322
- source_labels: ['__meta_docker_container_name']
9423
regex: '/(.*)'
9524
replacement: '$1'
9625
target_label: 'container_name'
9726
action: replace
9827

99-
# 'image' 라벨: Docker 이미지 이름만 추출 (예: 'lastdance-ecr')
100-
- source_labels: ['__meta_docker_image']
101-
regex: '.*/(.*):.*'
102-
replacement: '$1'
103-
target_label: 'image'
104-
action: replace
105-
106-
# 'host' 라벨: 컨테이너 ID 사용
107-
- source_labels: ['__meta_docker_container_id']
108-
target_label: 'host'
109-
action: replace
28+
- action: labeldrop
29+
regex: 'component|host|instance|job|logger|service_name|thread'
11030

11131
pipeline_stages:
11232
- docker: {} # Docker JSON 로그 파싱
11333

11434
# Spring Boot 표준 로그 정규식
11535
- match:
116-
selector: '{job="spring-boot-app"}'
36+
selector: '{container_name=~"lastdance-(blue|green)-app"}'
11737
stages:
11838
- regex:
119-
expression: '^(?P<timestamp>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z)\s+(?P<level>\S+)\s+(?P<pid>\d+)\s+---\s+\[(?P<thread>.*?)\]\s+\[(?P<application_name>.*?)\]\s+(?P<logger>[a-zA-Z0-9.$]+)\s+:\s+(?P<message>.*)$'
39+
expression: '^(?P<timestamp>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z)\s+(?P<level>\S+)\s+.*:\s+(?P<message>.*)$'
12040
- timestamp:
12141
source: timestamp
12242
format: RFC3339Nano
12343
- labels:
12444
level:
125-
logger:
45+
- drop:
46+
source: level
47+
regex: 'DEBUG|TRACE'
12648

12749
# 'monitoring-stack' job의 로그에만 logfmt을 적용합니다.
12850
- match:
129-
selector: '{job="monitoring-stack"}'
51+
selector: '{container_name=~"prometheus|grafana|loki|promtail|alertmanager"}'
13052
stages:
13153
- logfmt:
132-
# 로그에 나타나는 key=value 쌍 중 추출하고 싶은 필드들을 명시합니다.
13354
mapping:
134-
level: # 'level' 필드 추출
135-
ts: # 'ts' 필드 추출
136-
caller: # 'caller' 필드 추출 (선택 사항)
137-
component: # 'component' 필드 추출 (선택 사항)
138-
msg: # 'msg' 필드 추출 (선택 사항)
139-
err: # 'err' 필드 추출 (선택 사항)
55+
level:
56+
ts:
57+
msg:
14058
- timestamp:
14159
source: ts
14260
format: RFC3339Nano
14361
- labels:
14462
level:
145-
component:
146-
# 필요하다면 다른 추출 필드를 라벨로 추가할 수 있습니다:
147-
# caller:
148-
# err:
63+
- drop:
64+
source: level
65+
regex: 'DEBUG|TRACE|INFO'

src/main/java/store/lastdance/config/SecurityConfig.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
5454
// Actuator 경로 허용 (필요시)
5555
.requestMatchers("/actuator/**").permitAll()
5656
// 기타 공개 경로들
57-
.requestMatchers("/error").permitAll()
57+
.requestMatchers("/error", "/favicon.ico").permitAll()
58+
.requestMatchers("/api/v1/notifications/stream").permitAll()
5859
// /api/v1/expenses/analyze 요청은 인증이 필요함 AOP 프록시
5960
.requestMatchers("/api/v1/expenses/analyze").authenticated()
6061
// 나머지 요청은 인증 필요

src/main/java/store/lastdance/service/notification/SSENotificationServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public SseEmitter createConnection(UUID userId) {
6060

6161
emitter.onCompletion(() -> disconnectUser(userId));
6262
emitter.onTimeout(() -> {
63-
log.warn("SSE 연결 타임아웃: userId={}", userId);
63+
log.debug("SSE 연결 타임아웃: userId={}", userId);
6464
disconnectUser(userId);
6565
});
6666
emitter.onError(e -> {

0 commit comments

Comments
 (0)