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;
}
///
/// Получить логи по лейблу
///
/// Параметры запроса
/// Список логов с timestamp и message
[HttpPost("query")]
public async Task>> 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 });
}
}
///
/// Получить логи по лейблам (GET запрос)
///
/// Лейблы в формате "key1=value1,key2=value2"
/// Время начала (опционально)
/// Время окончания (опционально)
/// Лимит записей (по умолчанию 100)
/// Список логов с timestamp и message
[HttpGet("query")]
public async Task>> 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 ParseLabels(string labelsString)
{
var result = new Dictionary();
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;
}
}