Skip to content
Closed
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
13 changes: 13 additions & 0 deletions .github/workflows/deploy-fastapi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ jobs:
echo "OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }}" >> .env.prod
echo "MODE=prd" >> .env.prod
echo "APP_NAME=pre-processing" >> .env.prod
echo "GRAFANA_CLOUD_PROMETHEUS_URL=${{ secrets.GRAFANA_CLOUD_PROMETHEUS_URL }}" >> .env.prod
echo "GRAFANA_CLOUD_PROMETHEUS_USER=${{ secrets.GRAFANA_CLOUD_PROMETHEUS_USER }}" >> .env.prod
echo "GRAFANA_CLOUD_API_KEY=${{ secrets.GRAFANA_CLOUD_API_KEY }}" >> .env.prod

- name: Set repo lowercase
run: echo "REPO_LC=${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV
Expand Down Expand Up @@ -64,6 +67,16 @@ jobs:
target: "~/app"
overwrite: true

- name: Copy agent-config to FastAPI EC2
uses: appleboy/[email protected]
with:
host: ${{ secrets.FASTAPI_SERVER_HOST }}
username: ubuntu
key: ${{ secrets.SERVER_SSH_KEY }}
source: "docker/production-fastapi/agent-config.yml"
target: "~/app"
overwrite: true

- name: Deploy on EC2
uses: appleboy/[email protected]
with:
Expand Down
4 changes: 4 additions & 0 deletions apps/pre-processing-service/app/core/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,10 @@ class BaseSettingsConfig(BaseSettings):
loki_password: str
loki_port: int = 3100

grafana_cloud_prometheus_url: Optional[str] = None
grafana_cloud_prometheus_user: Optional[str] = None
grafana_cloud_api_key: Optional[str] = None

# ν…ŒμŠ€νŠΈ/μΆ”κ°€μš© ν•„λ“œ
openai_api_key: Optional[str] = None # << 이 λΆ€λΆ„ μΆ”κ°€

Expand Down
17 changes: 11 additions & 6 deletions apps/pre-processing-service/app/core/logging_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,22 @@
def setup_file_logging():
"""
PromTail을 톡해 Loki둜 μ „μ†‘ν•˜κΈ° μœ„ν•œ 파일 λ‘œκΉ… μ„€μ •
ν™˜κ²½λ³€μˆ˜ MODE에 따라 개발/운영 ν™˜κ²½ 뢄리
"""
# κΈ°μ‘΄ loguru ν•Έλ“€λŸ¬ 제거 (κΈ°λ³Έ μ½˜μ†” 좜λ ₯ 제거)
logger.remove()

log_dir = "../../docker/local/logs/develop"
mode = os.getenv("MODE", "dev").lower()

# 둜그 디렉토리가 μ—†μœΌλ©΄ 생성

# 둜그 파일 경둜 μ„€μ •
log_file_path = log_dir + "/pre-processing-app.log"
error_log_file_path = log_dir + "/pre-processing-app-error.log"
if mode == "prd":
log_dir = "/logs/production"
log_file_path = f"{log_dir}/app.log"
error_log_file_path = f"{log_dir}/error.log"
else:
# κ°œλ°œν™˜κ²½: κΈ°μ‘΄ 둜컬 경둜
log_dir = "../../docker/local/logs/develop"
log_file_path = f"{log_dir}/pre-processing-app.log"
error_log_file_path = f"{log_dir}/pre-processing-app-error.log"

# trace_idλ₯Ό ν¬ν•¨ν•œ κ°„λ‹¨ν•œ 포맷 λ¬Έμžμ—΄ μ‚¬μš©
def add_trace_id_filter(record):
Expand Down
6 changes: 6 additions & 0 deletions apps/pre-processing-service/app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from starlette.exceptions import HTTPException as StarletteHTTPException
from fastapi.exceptions import RequestValidationError
from app.middleware.ServiceLoggerMiddleware import ServiceLoggerMiddleware
from prometheus_fastapi_instrumentator import Instrumentator

# 파일 λ‘œκΉ… μ„€μ • μ΄ˆκΈ°ν™”
from app.core.logging_config import setup_file_logging
Expand All @@ -19,6 +20,11 @@
# --- FastAPI μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μΈμŠ€ν„΄μŠ€ 생성 ---
app = FastAPI(title="pre-processing-service", description="", version="1.0.0")

# --- Prometheus λ©”νŠΈλ¦­μŠ€ μ„€μ • ---
instrumentator = Instrumentator()
instrumentator.instrument(app)
instrumentator.expose(app, endpoint="/actuator/prometheus")

# --- μ˜ˆμ™Έ ν•Έλ“€λŸ¬ 등둝 ---
# 등둝 μˆœμ„œκ°€ μ€‘μš”ν•©λ‹ˆλ‹€: ꡬ체적인 μ˜ˆμ™ΈλΆ€ν„° λ“±λ‘ν•˜κ³  κ°€μž₯ 일반적인 μ˜ˆμ™Έ(Exception)λ₯Ό λ§ˆμ§€λ§‰μ— λ“±λ‘ν•©λ‹ˆλ‹€.
app.add_exception_handler(CustomException, custom_exception_handler)
Expand Down
33 changes: 32 additions & 1 deletion apps/pre-processing-service/poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions apps/pre-processing-service/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ dbutils=">=3.1.2,<4.0.0"
onnxruntime = "^1.22.1"
openai = "^1.107.3"
aiohttp = "^3.12.15"
prometheus-client = "^0.23.1"
prometheus-fastapi-instrumentator = "^7.1.0"

[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package site.icebang.domain.workflow.runner;
package site.icebang.domain.workflow.runner.fastapi;

import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Component;
Expand All @@ -10,6 +10,7 @@

import site.icebang.domain.execution.model.TaskRun;
import site.icebang.domain.workflow.model.Task;
import site.icebang.domain.workflow.runner.TaskRunner;
import site.icebang.external.fastapi.adapter.FastApiAdapter;

@Component("fastapiTaskRunner")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package site.icebang.domain.workflow.runner.body;
package site.icebang.domain.workflow.runner.fastapi.body;

import java.util.Map;
import java.util.Optional;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package site.icebang.domain.workflow.runner.body;
package site.icebang.domain.workflow.runner.fastapi.body;

import java.util.Map;
import java.util.Optional;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package site.icebang.domain.workflow.runner.body;
package site.icebang.domain.workflow.runner.fastapi.body;

import java.util.Map;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package site.icebang.domain.workflow.runner.body;
package site.icebang.domain.workflow.runner.fastapi.body;

import java.util.Map;
import java.util.Optional;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package site.icebang.domain.workflow.runner.body;
package site.icebang.domain.workflow.runner.fastapi.body;

import java.util.Map;
import java.util.Optional;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package site.icebang.domain.workflow.runner.body;
package site.icebang.domain.workflow.runner.fastapi.body;

import java.util.Map;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package site.icebang.domain.workflow.runner.body;
package site.icebang.domain.workflow.runner.fastapi.body;

import java.util.Map;
import java.util.Optional;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package site.icebang.domain.workflow.runner.body;
package site.icebang.domain.workflow.runner.fastapi.body;

import java.util.Map;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
import site.icebang.domain.workflow.model.Job;
import site.icebang.domain.workflow.model.Task;
import site.icebang.domain.workflow.runner.TaskRunner;
import site.icebang.domain.workflow.runner.body.TaskBodyBuilder;
import site.icebang.domain.workflow.runner.fastapi.body.TaskBodyBuilder;

@Slf4j
@Service
Expand Down
32 changes: 32 additions & 0 deletions docker/production-fastapi/agent-config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
server:
log_level: info

prometheus:
wal_directory: /tmp/grafana-agent-wal
global:
scrape_interval: 15s
external_labels:
cluster: production
service: pre-processing-service

configs:
- name: pre-processing-service-metrics
remote_write:
- url: ${GRAFANA_CLOUD_PROMETHEUS_URL}
basic_auth:
username: ${GRAFANA_CLOUD_PROMETHEUS_USER}
password: ${GRAFANA_CLOUD_API_KEY}

scrape_configs:
- job_name: 'pre-processing-service'
static_configs:
- targets: ['pre-processing-service:8000']
metrics_path: '/actuator/prometheus'
scrape_interval: 15s
params:
format: ['prometheus']

- job_name: 'node-exporter'
static_configs:
- targets: ['node-exporter:9100']
scrape_interval: 15s
42 changes: 42 additions & 0 deletions docker/production-fastapi/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ services:
- promtail
env_file:
- .env.prod
networks:
- app-network

promtail:
image: grafana/promtail:2.9.0
Expand All @@ -31,7 +33,47 @@ services:
hard: 65535
env_file:
- .env.prod
networks:
- app-network

grafana-agent:
image: grafana/agent:latest
container_name: grafana-agent
restart: unless-stopped
volumes:
- ./agent-config.yml:/etc/agent/agent.yml:ro
networks:
- app-network
env_file:
- .env.prod
command:
- --config.file=/etc/agent/agent.yml
- --config.expand-env=true

node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
ports:
- "127.0.0.1:9100:9100" # localhostμ—μ„œλ§Œ μ ‘κ·Ό
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
networks:
- app-network



volumes:
logs_volume:
driver: local

networks:
app-network:
driver: bridge
Loading