103 lines
3.2 KiB
C#
103 lines
3.2 KiB
C#
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;
|
||
}
|
||
}
|