File size: 4,108 Bytes
02d9941
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
"""
์„ฑ๋Šฅ ์ธก์ • ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ชจ๋“ˆ
"""
import time
import logging
import functools
import traceback
import psutil
import os
import platform
import gc
from typing import Callable, Any

# ๋กœ๊น… ์„ค์ •
logger = logging.getLogger(__name__)

def performance_logger(func):
    """
    ํ•จ์ˆ˜ ์‹คํ–‰ ์‹œ๊ฐ„ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๋กœ๊น…ํ•˜๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ
    
    Args:
        func (callable): ์ธก์ •ํ•  ํ•จ์ˆ˜
        
    Returns:
        callable: ๋ž˜ํ•‘๋œ ํ•จ์ˆ˜
    """
    @functools.wraps(func)
    async def wrapper(*args, **kwargs):
        # ์‹œ์ž‘ ์‹œ๊ฐ„ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ธก์ •
        start_time = time.time()
        start_memory = 0
        
        try:
            # ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ธก์ • (๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ)
            if psutil:
                process = psutil.Process(os.getpid())
                start_memory = process.memory_info().rss / 1024 / 1024  # MB ๋‹จ์œ„
        except Exception:
            pass
        
        # ํ•จ์ˆ˜ ํ˜ธ์ถœ
        try:
            result = await func(*args, **kwargs)
        except Exception as e:
            logger.error(f"ํ•จ์ˆ˜ {func.__name__} ์‹คํ–‰ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")
            logger.error(traceback.format_exc())
            raise
        
        # ์ข…๋ฃŒ ์‹œ๊ฐ„ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ธก์ •
        end_time = time.time()
        end_memory = 0
        
        try:
            if psutil:
                process = psutil.Process(os.getpid())
                end_memory = process.memory_info().rss / 1024 / 1024  # MB ๋‹จ์œ„
        except Exception:
            pass
        
        # ์‹คํ–‰ ์ •๋ณด ๋กœ๊น…
        execution_time = end_time - start_time
        memory_usage = end_memory - start_memory if end_memory > 0 else 0
        
        logger.info(f"ํ•จ์ˆ˜ {func.__name__} ์‹คํ–‰ ์‹œ๊ฐ„: {execution_time:.4f}์ดˆ")
        
        if end_memory > 0:
            logger.info(f"ํ•จ์ˆ˜ {func.__name__} ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๋ณ€ํ™”: {memory_usage:.2f} MB (์‹œ์ž‘: {start_memory:.2f} MB, ์ข…๋ฃŒ: {end_memory:.2f} MB)")
        
        return result
    
    return wrapper

def log_system_info():
    """์‹œ์Šคํ…œ ์ •๋ณด ๋กœ๊น…"""
    try:
        logger.info("===== ์‹œ์Šคํ…œ ์ •๋ณด =====")
        logger.info(f"OS: {platform.system()} {platform.release()}")
        logger.info(f"Python ๋ฒ„์ „: {platform.python_version()}")
        
        if psutil:
            # CPU ์ •๋ณด
            cpu_count = psutil.cpu_count(logical=False)
            cpu_count_logical = psutil.cpu_count(logical=True)
            logger.info(f"CPU: {cpu_count} ์ฝ”์–ด ({cpu_count_logical} ๋…ผ๋ฆฌ ํ”„๋กœ์„ธ์„œ)")
            
            # ๋ฉ”๋ชจ๋ฆฌ ์ •๋ณด
            mem = psutil.virtual_memory()
            total_mem = mem.total / (1024 * 1024 * 1024)  # GB ๋‹จ์œ„
            available_mem = mem.available / (1024 * 1024 * 1024)  # GB ๋‹จ์œ„
            logger.info(f"๋ฉ”๋ชจ๋ฆฌ: ์ด {total_mem:.2f} GB (์‚ฌ์šฉ ๊ฐ€๋Šฅ: {available_mem:.2f} GB)")
            
            # ๋””์Šคํฌ ์ •๋ณด
            disk = psutil.disk_usage('/')
            total_disk = disk.total / (1024 * 1024 * 1024)  # GB ๋‹จ์œ„
            free_disk = disk.free / (1024 * 1024 * 1024)  # GB ๋‹จ์œ„
            logger.info(f"๋””์Šคํฌ: ์ด {total_disk:.2f} GB (์—ฌ์œ  ๊ณต๊ฐ„: {free_disk:.2f} GB)")
        
        logger.info("=======================")
    except Exception as e:
        logger.error(f"์‹œ์Šคํ…œ ์ •๋ณด ๋กœ๊น… ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")

def cleanup_memory():
    """
    ๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ ํ•จ์ˆ˜ - ๊ธด ์ž‘์—… ํ›„ ๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ์— ์‚ฌ์šฉ
    """
    try:
        # ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๊ฐ•์ œ ์‹คํ–‰
        collected = gc.collect()
        logger.debug(f"๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์‹คํ–‰: {collected}๊ฐœ ๊ฐ์ฒด ์ˆ˜์ง‘")
        
        # ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๋กœ๊น… (๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ)
        if psutil:
            process = psutil.Process(os.getpid())
            memory_usage = process.memory_info().rss / 1024 / 1024  # MB ๋‹จ์œ„
            logger.debug(f"ํ˜„์žฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰: {memory_usage:.2f} MB")
    except Exception as e:
        logger.error(f"๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")