-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathChatMetricsService.cs
More file actions
93 lines (77 loc) · 3.46 KB
/
ChatMetricsService.cs
File metadata and controls
93 lines (77 loc) · 3.46 KB
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
using ProjectVG.Application.Models.Chat;
namespace ProjectVG.Application.Services.Chat.CostTracking
{
public class ChatMetricsService : IChatMetricsService
{
private readonly ILogger<ChatMetricsService> _logger;
private readonly AsyncLocal<ChatMetrics?> _currentMetrics = new();
public ChatMetricsService(ILogger<ChatMetricsService> logger)
{
_logger = logger;
}
public void StartChatMetrics(string sessionId, string userId, string characterId)
{
_currentMetrics.Value = new ChatMetrics
{
SessionId = sessionId,
UserId = userId,
CharacterId = characterId,
StartTime = DateTime.UtcNow
};
Console.WriteLine($"[METRICS] 채팅 메트릭 시작: {sessionId}");
}
public void StartProcessMetrics(string processName)
{
if (_currentMetrics.Value == null) return;
var processMetrics = new ProcessMetrics
{
ProcessName = processName,
StartTime = DateTime.UtcNow
};
_currentMetrics.Value.ProcessMetrics.Add(processMetrics);
Console.WriteLine($"[METRICS] 프로세스 시작: {processName}");
}
public void EndProcessMetrics(string processName, decimal cost = 0, string? errorMessage = null, Dictionary<string, object>? additionalData = null)
{
if (_currentMetrics.Value == null) return;
var processMetrics = _currentMetrics.Value.ProcessMetrics
.FirstOrDefault(p => p.ProcessName == processName && p.EndTime == default);
if (processMetrics != null)
{
processMetrics.EndTime = DateTime.UtcNow;
processMetrics.Duration = processMetrics.EndTime - processMetrics.StartTime;
processMetrics.Cost = cost;
processMetrics.ErrorMessage = errorMessage;
processMetrics.AdditionalData = additionalData;
}
}
public void EndChatMetrics()
{
if (_currentMetrics.Value == null) return;
_currentMetrics.Value.EndTime = DateTime.UtcNow;
_currentMetrics.Value.TotalDuration = _currentMetrics.Value.EndTime - _currentMetrics.Value.StartTime;
_currentMetrics.Value.TotalCost = _currentMetrics.Value.ProcessMetrics.Sum(p => p.Cost);
}
public ChatMetrics? GetCurrentChatMetrics()
{
return _currentMetrics.Value;
}
public void LogChatMetrics()
{
var metrics = _currentMetrics.Value;
if (metrics == null) return;
Console.WriteLine($"[METRICS] 채팅 메트릭 로그 시작: {metrics.SessionId}");
var totalCostInDollars = (double)metrics.TotalCost / 100_000.0;
_logger.LogInformation(
"채팅 메트릭 - UserId: {UserId}, 총 비용: ${TotalCost:F6}, 총 시간: {TotalDuration}",
metrics.SessionId, totalCostInDollars, metrics.TotalDuration);
foreach (var process in metrics.ProcessMetrics)
{
var processCostInDollars = (double)process.Cost / 100_000.0;
_logger.LogInformation(
" - {ProcessName}: {Duration}ms, 비용: ${Cost:F6}",
process.ProcessName, process.Duration.TotalMilliseconds, processCostInDollars);
}
}
}
}