feat(api, bll): переделал сервис получения статистики из RabbitMQ. StatRabbitMqController - статистика по очередям и соединениям
This commit is contained in:
14
PARR.BLL/Domain/Mq/MqApiResult.cs
Normal file
14
PARR.BLL/Domain/Mq/MqApiResult.cs
Normal file
@@ -0,0 +1,14 @@
|
||||
namespace PARR.BLL.Domain.Mq
|
||||
{
|
||||
/// <summary>
|
||||
/// Ответ от API RabbitMQ
|
||||
/// </summary>
|
||||
public class MqApiResult
|
||||
{
|
||||
public bool IsSuccess { get; set; }
|
||||
|
||||
public object? Response { get; set; }
|
||||
|
||||
public Exception? Exception { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
namespace PARR.BLL.Domain.Mq
|
||||
{
|
||||
/// <summary>
|
||||
/// Результат запроса кол-ва сообщений в очереди RabbitMq
|
||||
/// </summary>
|
||||
public class MqQueueCountResult
|
||||
{
|
||||
public bool IsSuccess { get;set; }
|
||||
|
||||
public int Count { get; set; }
|
||||
|
||||
public int ConsumerCount { get; set; }
|
||||
|
||||
public Exception? Exception { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,7 @@
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="7.0.4" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="7.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Http" Version="7.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.1" />
|
||||
<PackageReference Include="RabbitMQ.Client" Version="6.5.0" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -18,6 +18,7 @@ namespace PARR.BLL
|
||||
|
||||
services.AddTransient<IFileService, FileService>();
|
||||
services.AddTransient<IMqService, MqService>();
|
||||
services.AddHttpClient<IMqAdminService, MqAdminService>();
|
||||
services.AddTransient<ITransformService, TransformService>();
|
||||
services.AddTransient<IIntervalService, IntervalService>();
|
||||
}
|
||||
|
||||
78
PARR.BLL/Services/Implementations/MqAdminService.cs
Normal file
78
PARR.BLL/Services/Implementations/MqAdminService.cs
Normal file
@@ -0,0 +1,78 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
using PARR.BLL.Contracts.Interfaces;
|
||||
using PARR.BLL.Domain.Mq;
|
||||
using PARR.BLL.Services.Interfaces;
|
||||
using System.Net;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Text;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace PARR.BLL.Services.Implementations
|
||||
{
|
||||
internal class MqAdminService : IMqAdminService
|
||||
{
|
||||
private readonly HttpClient httpClient;
|
||||
private readonly ILogger<MqAdminService> logger;
|
||||
|
||||
public MqAdminService(HttpClient httpClient, ILogger<MqAdminService> logger)
|
||||
{
|
||||
this.httpClient = httpClient;
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
|
||||
public async Task<MqApiResult> GetConnectionsAsync(IMqSettings mqSettings)
|
||||
{
|
||||
var url = $"http://{mqSettings.HostName}:15672/api/connections";
|
||||
|
||||
return await SendRequestAsync(mqSettings, url);
|
||||
}
|
||||
|
||||
|
||||
public async Task<MqApiResult> GetQueuesAsync(IMqSettings mqSettings)
|
||||
{
|
||||
var url = $"http://{mqSettings.HostName}:15672/api/queues";
|
||||
|
||||
return await SendRequestAsync(mqSettings, url);
|
||||
}
|
||||
|
||||
|
||||
private async Task<MqApiResult> SendRequestAsync(IMqSettings mqSettings, string url)
|
||||
{
|
||||
SetAuthorizationHeaders(mqSettings);
|
||||
|
||||
try
|
||||
{
|
||||
var result = await httpClient.GetAsync(url);
|
||||
|
||||
if (result.StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
var content = await result.Content.ReadAsStringAsync();
|
||||
var json = JsonSerializer.Deserialize<object>(content);
|
||||
|
||||
return new MqApiResult { IsSuccess = true, Response = json };
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.LogError($"Ошибка при запросе к RabbitMq, url: {url}, StatusCode: {result.StatusCode}");
|
||||
|
||||
return new MqApiResult { IsSuccess = false };
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logger.LogError(ex, $"Ошибка при запросе к RabbitMQ, url: {url}");
|
||||
return new MqApiResult { IsSuccess = false, Exception = ex };
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void SetAuthorizationHeaders(IMqSettings mqSettings)
|
||||
{
|
||||
httpClient.DefaultRequestHeaders.Clear();
|
||||
httpClient.DefaultRequestHeaders.Authorization =
|
||||
new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes($"{mqSettings.User}:{mqSettings.Password}")));
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -155,34 +155,6 @@ namespace PARR.BLL.Services.Implementations
|
||||
}
|
||||
}
|
||||
|
||||
public MqQueueCountResult GetQueueCount(IMqSettings mqSettings, string queueName)
|
||||
{
|
||||
var factory = new ConnectionFactory
|
||||
{
|
||||
HostName = mqSettings.HostName,
|
||||
UserName = mqSettings.User,
|
||||
Password = mqSettings.Password,
|
||||
};
|
||||
|
||||
try
|
||||
{
|
||||
using (var connection = factory.CreateConnection())
|
||||
using (var channel = connection.CreateModel())
|
||||
{
|
||||
var messageCount = channel.MessageCount(queueName);
|
||||
var consumerCount = channel.ConsumerCount(queueName);
|
||||
|
||||
return new MqQueueCountResult { Count = (int)messageCount, ConsumerCount = (int)consumerCount, IsSuccess = true };
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logger.LogError(ex, $"Ошибка при запросе кол-ва сообщений в очереди {queueName}");
|
||||
|
||||
return new MqQueueCountResult { Count = 0, IsSuccess = false, Exception = ex };
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
channel?.Close();
|
||||
|
||||
22
PARR.BLL/Services/Interfaces/IMqAdminService.cs
Normal file
22
PARR.BLL/Services/Interfaces/IMqAdminService.cs
Normal file
@@ -0,0 +1,22 @@
|
||||
using PARR.BLL.Contracts.Interfaces;
|
||||
using PARR.BLL.Domain.Mq;
|
||||
|
||||
namespace PARR.BLL.Services.Interfaces
|
||||
{
|
||||
public interface IMqAdminService
|
||||
{
|
||||
/// <summary>
|
||||
/// Получить статистику соединений из RabbitMQ
|
||||
/// </summary>
|
||||
/// <param name="mqSettings"></param>
|
||||
/// <returns></returns>
|
||||
Task<MqApiResult> GetConnectionsAsync(IMqSettings mqSettings);
|
||||
|
||||
/// <summary>
|
||||
/// Получить статистику по очередям из RabbitMQ
|
||||
/// </summary>
|
||||
/// <param name="mqSettings"></param>
|
||||
/// <returns></returns>
|
||||
Task<MqApiResult> GetQueuesAsync(IMqSettings mqSettings);
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,6 @@ namespace PARR.BLL.Services.Interfaces
|
||||
|
||||
public interface IMqService : IDisposable
|
||||
{
|
||||
MqQueueCountResult GetQueueCount(IMqSettings mqSettings, string queueName);
|
||||
bool InitConsumer(IMqSettings mqSettings, MqMessageHandlerDelegate messageHandler);
|
||||
MqSendResult Send(IMqSettings mqSettings, string[] msgList);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user