init
This commit is contained in:
102
Controllers/LogsController.cs
Normal file
102
Controllers/LogsController.cs
Normal file
@ -0,0 +1,102 @@
|
||||
using GetFromLoki.Models;
|
||||
using GetFromLoki.Services;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace GetFromLoki.Controllers;
|
||||
|
||||
[ApiController]
|
||||
[Route("api/[controller]")]
|
||||
public class LogsController : ControllerBase
|
||||
{
|
||||
private readonly ILokiService _lokiService;
|
||||
|
||||
public LogsController(ILokiService lokiService)
|
||||
{
|
||||
_lokiService = lokiService;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Получить логи по лейблу
|
||||
/// </summary>
|
||||
/// <param name="request">Параметры запроса</param>
|
||||
/// <returns>Список логов с timestamp и message</returns>
|
||||
[HttpPost("query")]
|
||||
public async Task<ActionResult<List<LogEntry>>> GetLogs([FromBody] LogQueryRequest request)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (request.Labels.Count == 0)
|
||||
{
|
||||
return BadRequest("Должен быть указан хотя бы один лейбл");
|
||||
}
|
||||
|
||||
var logs = await _lokiService.GetLogsAsync(request);
|
||||
return Ok(logs);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return StatusCode(500, new { error = ex.Message });
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Получить логи по лейблам (GET запрос)
|
||||
/// </summary>
|
||||
/// <param name="labels">Лейблы в формате "key1=value1,key2=value2"</param>
|
||||
/// <param name="startTime">Время начала (опционально)</param>
|
||||
/// <param name="endTime">Время окончания (опционально)</param>
|
||||
/// <param name="limit">Лимит записей (по умолчанию 100)</param>
|
||||
/// <returns>Список логов с timestamp и message</returns>
|
||||
[HttpGet("query")]
|
||||
public async Task<ActionResult<List<LogEntry>>> GetLogs(
|
||||
[FromQuery] string labels,
|
||||
[FromQuery] DateTime? startTime = null,
|
||||
[FromQuery] DateTime? endTime = null,
|
||||
[FromQuery] int? limit = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(labels))
|
||||
{
|
||||
return BadRequest("Labels обязателен для запроса");
|
||||
}
|
||||
|
||||
var request = new LogQueryRequest
|
||||
{
|
||||
Labels = ParseLabels(labels),
|
||||
StartTime = startTime,
|
||||
EndTime = endTime,
|
||||
Limit = limit
|
||||
};
|
||||
|
||||
if (request.Labels.Count == 0)
|
||||
{
|
||||
return BadRequest("Не удалось распарсить лейблы");
|
||||
}
|
||||
|
||||
var logs = await _lokiService.GetLogsAsync(request);
|
||||
return Ok(logs);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return StatusCode(500, new { error = ex.Message });
|
||||
}
|
||||
}
|
||||
|
||||
private static Dictionary<string, string> ParseLabels(string labelsString)
|
||||
{
|
||||
var result = new Dictionary<string, string>();
|
||||
var pairs = labelsString.Split(',', StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
foreach (var pair in pairs)
|
||||
{
|
||||
var parts = pair.Split('=', 2);
|
||||
if (parts.Length == 2)
|
||||
{
|
||||
result[parts[0].Trim()] = parts[1].Trim();
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user