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