using System.Diagnostics; using System.Diagnostics.Metrics; using Microsoft.Extensions.Logging; namespace CellularManagement.Infrastructure.Monitoring; public class WebSocketMetrics { private readonly ILogger _logger; private readonly Meter _meter; private readonly Counter _connectionsCounter; private readonly Counter _messagesCounter; private readonly Histogram _messageLatency; private readonly Histogram _messageSize; private readonly Counter _errorsCounter; public WebSocketMetrics(ILogger logger) { _logger = logger; _meter = new Meter("CellularManagement.WebSocket", "1.0.0"); _connectionsCounter = _meter.CreateCounter("websocket.connections", "个", "活跃连接数"); _messagesCounter = _meter.CreateCounter("websocket.messages", "个", "消息处理数"); _messageLatency = _meter.CreateHistogram("websocket.message.latency", "ms", "消息处理延迟"); _messageSize = _meter.CreateHistogram("websocket.message.size", "bytes", "消息大小"); _errorsCounter = _meter.CreateCounter("websocket.errors", "个", "错误数"); } public void ConnectionEstablished() { _connectionsCounter.Add(1); _logger.LogInformation("WebSocket connection established"); } public void ConnectionClosed() { _connectionsCounter.Add(-1); _logger.LogInformation("WebSocket connection closed"); } public void MessageReceived(int size) { _messagesCounter.Add(1); _messageSize.Record(size); _logger.LogDebug("WebSocket message received, size: {Size} bytes", size); } public void MessageProcessed(TimeSpan latency) { _messageLatency.Record(latency.TotalMilliseconds); _logger.LogDebug("WebSocket message processed, latency: {Latency}ms", latency.TotalMilliseconds); } public void ErrorOccurred(string errorType) { _errorsCounter.Add(1); _logger.LogError("WebSocket error occurred: {ErrorType}", errorType); } public void RecordGauge(string name, double value) { var gauge = _meter.CreateObservableGauge($"websocket.{name}", () => value); _logger.LogDebug("WebSocket gauge recorded: {Name} = {Value}", name, value); } }