Solo.Beacon 1.0.5
Solo.Beacon
Solo.Beacon — это переиспользуемый ASP.NET Core пакет для сервисов ft-soft. Он предоставляет:
- endpoint
/beacon/discovery, который публикует путиhealthиstatsтекущего сервиса - endpoint
/health, который отвечает200 OKна любой HTTP-метод и содержит ссылку на endpoint статистики - endpoint
/statsдля состояния текущего сервиса - общий флаг логирования запросов к
/beacon/discovery,/healthи/stats - опциональный фоновый опрос зависимых сервисов с обработкой результатов через delegate
- стартовую health-проверку зависимостей сразу после запуска приложения
Быстрый старт
using Solo.Beacon;
using Solo.Beacon.Extensions;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddBeacon();
var app = builder.Build();
// Сразу регистрирует health и fallback stats.
app.MapBeacon();
app.UseAuthentication();
app.UseAuthorization();
// Перезаписывает fallback пользовательским защищенным обработчиком.
app.MapBeaconStats(GetStatsAsync);
MapBeacon() регистрирует /beacon/discovery, /health и fallback /stats, поэтому его можно вызвать до настройки авторизации и получать health и базовую статистику во время запуска приложения.
Пока MapBeaconStats(handler) не вызван, /stats отвечает 200 OK с текстом Статистика не инициализирована. Сервис всё еще запускается, или он не зарегистрировал обработчик. После регистрации обработчика fallback пропускает запрос к защищенному endpoint-у, добавленному после middleware авторизации.
Где настраивать пути
Пути к health и stats можно задавать в трех местах. Это сделано для разных сценариев:
- дефолты пакета — подходят, когда сервису достаточно
/healthи/stats - секция
Beaconв конфиге — основной способ для приложений, где пути должны меняться без правкиProgram.cs - параметры
MapHealth(...)иMapBeaconStats(...)— точечное переопределение маршрута рядом с регистрацией endpoint-а
Приоритет такой:
url, переданный прямо вMapHealth(url)илиMapBeaconStats(handler, url).BeaconOptions.HealthUrl/BeaconOptions.StatsUrl, полученные изAddBeacon(...).- дефолтные пути
/healthи/stats.
Самый высокий приоритет у параметров MapHealth(...) и MapBeaconStats(...), потому что они регистрируют конкретный route в ASP.NET Core.
app.MapBeacon()
.MapHealth("/internal/health");
app.UseAuthentication();
app.UseAuthorization();
app.MapBeaconStats(GetStatsAsync, "/internal/stats");
Для согласованности discovery с фактическими маршрутами обычно задавайте оба пути в конфигурации.
Рекомендация
Для большинства сервисов лучше хранить пути в конфиге и не передавать url в MapHealth(...) / MapBeaconStats(...). Так настройка остается одинаковой для разных окружений и не требует отдельной правки кода:
{
"Beacon": {
"LoggingEnabled": false,
"HealthUrl": "/health",
"StatsUrl": "/stats"
}
}
builder.Services.AddBeacon();
app.MapBeacon();
app.UseAuthentication();
app.UseAuthorization();
app.MapBeaconStats(GetStatsAsync);
Передавайте url прямо в MapHealth(...) или MapBeaconStats(...), когда путь является частью кода конкретного приложения: например, endpoint должен жить под уже существующим /internal/*, рядом с reverse proxy rules или legacy routing.
Конфигурация через код
Если настройки нельзя брать из IConfiguration, используйте перегрузку с Action<BeaconOptions>:
builder.Services.AddBeacon(options =>
{
options.LoggingEnabled = true;
options.HealthUrl = "/health";
options.StatsUrl = "/stats";
});
Эта перегрузка настраивает BeaconOptions из кода. Если нужен обычный appsettings.json, используйте builder.Services.AddBeacon() без lambda.
Stats
MapBeacon() сразу регистрирует fallback /stats с базовым ответом. Чтобы заменить его реальной статистикой, обязательно передайте обработчик в отдельный вызов MapBeaconStats(handler) после middleware аутентификации и авторизации.
/health отвечает 200 OK с Healthy и HTML-ссылкой на endpoint статистики, например <a href="/stats">Статистика</a>.
Если нужен собственный ответ /stats, передайте async-handler в MapBeaconStats(...). В нем доступны HttpContext и CancellationToken, поэтому состав статистики можно настраивать в зависимости от пользователя, заголовков и других деталей запроса.
app.UseAuthentication();
app.UseAuthorization();
app.MapBeaconStats(async (httpContext, cancellationToken) =>
{
var statsProvider = httpContext.RequestServices.GetRequiredService<StatsProvider>();
var stats = await statsProvider.GetStatsAsync(cancellationToken);
var userName = httpContext.User.Identity?.Name;
return TypedResults.Ok(new
{
stats,
userName,
});
});
Любой /stats, подключенный через MapBeaconStats(...), закрыт авторизацией и использует стандартные сервисы авторизации ASP.NET Core из хост-приложения. Чтобы в HttpContext.User были данные пользователя, хост-приложение должно само настроить аутентификацию обычным для себя способом.
Мониторинг зависимостей
{
"Beacon": {
"LoggingEnabled": false,
"HealthUrl": "/health",
"StatsUrl": "/stats",
"Monitoring": {
"Enabled": true,
"ProbeInterval": "00:00:30",
"RequestTimeout": "00:00:05",
"Services": [
"https://solo-butler.ru",
"https://solo.ru/solo",
"https://solo.ru/org"
]
}
}
}
Если мониторинг включен, пакет сразу после старта приложения делает первый проход по Services: запрашивает у каждого сервиса /discovery, находит опубликованный health endpoint и проверяет его доступность. Дальше проверки повторяются с интервалом ProbeInterval.
Если нужно обработать результаты мониторинга зависимостей, настройте handler через BeaconBuilder:
builder.Services
.AddBeacon()
.AddMonitoringHandler(
static async (serviceProvider, responses, cancellationToken) =>
{
var cache = serviceProvider.GetRequiredService<IMonitoringCache>();
await cache.StoreAsync(responses, cancellationToken);
});
Успешные проверки и ошибки пишутся в лог только при LoggingEnabled = true.
Discovery
/discovery всегда находится на фиксированном пути и не настраивается через конфиг. Мониторинг зависимостей полагается именно на этот адрес, чтобы сначала узнать реальные пути health и stats у сервиса, а затем проверить опубликованный health endpoint.
Если зависимый сервис возвращает 404 Not Found на /discovery, это трактуется как отсутствие поддержки Solo.Beacon. Если health endpoint зависимого сервиса возвращает не JSON, Solo.Beacon сформирует служебный payload со статусом проверки.
No packages depend on Solo.Beacon.
.NET Standard 2.1
- Microsoft.AspNetCore.Authentication.Abstractions (>= 2.3.0)
- Microsoft.AspNetCore.Authentication.Core (>= 2.3.9)
- Microsoft.AspNetCore.Authorization (>= 2.3.0)
- Microsoft.AspNetCore.Authorization.Policy (>= 2.3.9)
- Microsoft.AspNetCore.Http.Abstractions (>= 2.3.10)
- Microsoft.Extensions.DependencyInjection (>= 10.0.0)
- Microsoft.Extensions.Hosting (>= 10.0.0)
- Microsoft.Extensions.Http (>= 10.0.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 10.0.0)
- System.Text.Json (>= 10.0.0)
| Version | Downloads | Last updated |
|---|---|---|
| 1.0.6 | 2 | 08/04/2026 |
| 1.0.5 | 28 | 08/03/2026 |
| 1.0.3 | 245 | 07/21/2026 |
| 1.0.3-pre01 | 1 | 07/21/2026 |
| 1.0.2 | 29 | 07/20/2026 |
| 1.0.2-pre03 | 1 | 07/20/2026 |
| 1.0.2-pre02 | 1 | 07/20/2026 |
| 1.0.2-pre01 | 1 | 07/20/2026 |
| 1.0.1 | 1 | 07/20/2026 |
| 1.0.0 | 6 | 05/28/2026 |
| 1.0.0-pre-doc4847-07 | 5 | 05/19/2026 |
| 1.0.0-pre-doc4847-06 | 5 | 05/19/2026 |
| 1.0.0-pre-doc4847-05 | 5 | 05/19/2026 |
| 1.0.0-pre-doc4847-04 | 5 | 05/19/2026 |
| 1.0.0-pre-doc4847-03 | 5 | 05/18/2026 |
| 1.0.0-pre-doc4847-02 | 5 | 05/18/2026 |
| 1.0.0-pre-doc4847-01 | 5 | 05/18/2026 |