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
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);
|
|
}
|
|
}
|