Files
get-from-loki/Controllers/LogsController.cs
2025-08-21 14:56:35 +05:00

103 lines
3.2 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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