You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

65 lines
2.3 KiB

using System.Diagnostics;
using System.Diagnostics.Metrics;
using Microsoft.Extensions.Logging;
namespace CellularManagement.Infrastructure.Monitoring;
public class WebSocketMetrics
{
private readonly ILogger<WebSocketMetrics> _logger;
private readonly Meter _meter;
private readonly Counter<int> _connectionsCounter;
private readonly Counter<int> _messagesCounter;
private readonly Histogram<double> _messageLatency;
private readonly Histogram<double> _messageSize;
private readonly Counter<int> _errorsCounter;
public WebSocketMetrics(ILogger<WebSocketMetrics> logger)
{
_logger = logger;
_meter = new Meter("CellularManagement.WebSocket", "1.0.0");
_connectionsCounter = _meter.CreateCounter<int>("websocket.connections", "个", "活跃连接数");
_messagesCounter = _meter.CreateCounter<int>("websocket.messages", "个", "消息处理数");
_messageLatency = _meter.CreateHistogram<double>("websocket.message.latency", "ms", "消息处理延迟");
_messageSize = _meter.CreateHistogram<double>("websocket.message.size", "bytes", "消息大小");
_errorsCounter = _meter.CreateCounter<int>("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<double>($"websocket.{name}", () => value);
_logger.LogDebug("WebSocket gauge recorded: {Name} = {Value}", name, value);
}
}