This commit is contained in:
2025-08-21 14:56:35 +05:00
commit ecde1f0eeb
10 changed files with 923 additions and 0 deletions

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