Állapotfigyelés
Tipp.
Ez a tartalom egy részlet a .NET-alkalmazásokhoz készült .NET-alkalmazásokhoz készült eBook, .NET Microservices Architecture című eBookból, amely elérhető a .NET Docs-on vagy egy ingyenesen letölthető PDF-fájlként, amely offline módban is olvasható.
Az állapotfigyelés közel valós idejű információkat biztosít a tárolók és mikroszolgáltatások állapotáról. Az állapotmonitorozás kritikus fontosságú az üzemeltetési mikroszolgáltatások több aspektusa szempontjából, és különösen fontos, ha a vezénylők fázisokban hajtanak végre részleges alkalmazásfrissítéseket, amint azt később ismertetik.
A mikroszolgáltatás-alapú alkalmazások gyakran szívveréseket vagy állapotellenőrzéseket használnak, hogy a teljesítményfigyelőik, ütemezőik és vezénylőik nyomon követhessék a szolgáltatások sokaságát. Ha a szolgáltatások nem tudnak valamilyen "Életben vagyok" jelzést küldeni igény szerint vagy ütemezés szerint, előfordulhat, hogy az alkalmazás kockázatokkal szembesül a frissítések telepítésekor, vagy csak túl későn észleli a hibákat, és nem tudja leállítani azokat a kaszkádolt hibákat, amelyek jelentős leállásokhoz vezethetnek.
A tipikus modellben a szolgáltatások jelentéseket küldenek az állapotukról, és az adatok összesítése az alkalmazás állapotának általános áttekintéséhez történik. Ha vezénylőt használ, egészségügyi információkat adhat meg a vezénylő fürtjének, hogy a fürt ennek megfelelően működjön. Ha az alkalmazáshoz testre szabott, kiváló minőségű állapotjelentésbe fektet be, sokkal könnyebben észlelheti és kijavíthatja a futó alkalmazás problémáit.
Állapotellenőrzések végrehajtása ASP.NET Core-szolgáltatásokban
ASP.NET Core-mikroszolgáltatás vagy webalkalmazás fejlesztésekor használhatja az ASP .NET Core 2.2-ben (Microsoft.Extensions.Diagnostics.HealthChecks) megjelent beépített állapot-ellenőrzési funkciót. A ASP.NET alapvető funkciókhoz hasonlóan az állapot-ellenőrzések szolgáltatásokkal és köztes szoftverekkel is rendelkeznek.
Az állapot-ellenőrzési szolgáltatások és a köztes szoftverek könnyen használhatók, és olyan képességeket biztosítanak, amelyekkel ellenőrizheti, hogy az alkalmazáshoz szükséges külső erőforrások (például egy SQL Server-adatbázis vagy egy távoli API) megfelelően működnek-e. Ha ezt a funkciót használja, eldöntheti azt is, hogy mit jelent az erőforrás kifogástalan állapota, amint azt később elmagyarázzuk.
A funkció hatékony használatához először konfigurálnia kell a szolgáltatásokat a mikroszolgáltatásokban. Másodszor, szüksége van egy előtérbeli alkalmazásra, amely lekérdezi az állapotjelentéseket. Ez az előtér-alkalmazás lehet egyéni jelentéskészítő alkalmazás, vagy maga a vezénylő, amely ennek megfelelően reagál az állapotra.
A HealthChecks funkció használata a háttérbeli ASP.NET mikroszolgáltatásokban
Ebben a szakaszban megtudhatja, hogyan implementálhatja a HealthChecks funkciót egy minta ASP.NET Core 8.0 Web API-alkalmazásban a Microsoft.Extensions.Diagnostics.HealthChecks csomag használatakor. Ennek a funkciónak az implementációját egy nagy méretű mikroszolgáltatásban, például az eShopOnContainersben a következő szakaszban ismertetik.
Először meg kell határoznia, hogy mi minősül kifogástalan állapotnak az egyes mikroszolgáltatásokhoz. A mintaalkalmazásban meghatározzuk, hogy a mikroszolgáltatás kifogástalan állapotú-e, ha az API HTTP-en keresztül érhető el, és a kapcsolódó SQL Server-adatbázis is elérhető.
A .NET 8-ban a beépített API-k segítségével konfigurálhatja a szolgáltatásokat, és így adhat hozzá állapotellenőrzést a mikroszolgáltatáshoz és annak függő SQL Server-adatbázisához:
// Program.cs from .NET 8 Web API sample
//...
// Registers required services for health checks
builder.Services.AddHealthChecks()
// Add a health check for a SQL Server database
.AddCheck(
"OrderingDB-check",
new SqlConnectionHealthCheck(builder.Configuration["ConnectionString"]),
HealthStatus.Unhealthy,
new string[] { "orderingdb" });
Az előző kódban a services.AddHealthChecks()
metódus egy alapszintű HTTP-ellenőrzést konfigurál, amely egy 200-ás állapotkódot ad vissza "Kifogástalan" értékkel. A bővítménymetódus emellett konfigurál egy egyéni SqlConnectionHealthCheck
beállítást, AddCheck()
amely ellenőrzi a kapcsolódó SQL Database állapotát.
A AddCheck()
metódus egy új állapotellenőrzést ad hozzá egy megadott névvel és a típus IHealthCheck
implementálásával. Az AddCheck metódussal több állapotellenőrzést is hozzáadhat, így egy mikroszolgáltatás csak akkor ad "kifogástalan" állapotot, ha az összes ellenőrzése kifogástalan.
SqlConnectionHealthCheck
egy egyéni osztály, amely implementál IHealthCheck
egy kapcsolati sztring konstruktorparaméterként, és egy egyszerű lekérdezést hajt végre annak ellenőrzésére, hogy az SQL-adatbázishoz való kapcsolat sikeres-e. Akkor adja HealthCheckResult.Healthy()
vissza, ha a lekérdezést sikeresen végrehajtották, és FailureStatus
egy tényleges kivétellel, amikor meghiúsul.
// Sample SQL Connection Health Check
public class SqlConnectionHealthCheck : IHealthCheck
{
private const string DefaultTestQuery = "Select 1";
public string ConnectionString { get; }
public string TestQuery { get; }
public SqlConnectionHealthCheck(string connectionString)
: this(connectionString, testQuery: DefaultTestQuery)
{
}
public SqlConnectionHealthCheck(string connectionString, string testQuery)
{
ConnectionString = connectionString ?? throw new ArgumentNullException(nameof(connectionString));
TestQuery = testQuery;
}
public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default(CancellationToken))
{
using (var connection = new SqlConnection(ConnectionString))
{
try
{
await connection.OpenAsync(cancellationToken);
if (TestQuery != null)
{
var command = connection.CreateCommand();
command.CommandText = TestQuery;
await command.ExecuteNonQueryAsync(cancellationToken);
}
}
catch (DbException ex)
{
return new HealthCheckResult(status: context.Registration.FailureStatus, exception: ex);
}
}
return HealthCheckResult.Healthy();
}
}
Vegye figyelembe, Select 1
hogy az előző kódban az adatbázis állapotának ellenőrzésére használt lekérdezés. A mikroszolgáltatások rendelkezésre állásának monitorozásához a Kuberneteshez hasonló vezénylők rendszeresen végeznek állapot-ellenőrzéseket a mikroszolgáltatások tesztelésére irányuló kérések küldésével. Fontos, hogy az adatbázis-lekérdezések hatékonyak maradjanak, hogy ezek a műveletek gyorsak legyenek, és ne eredményezhessenek nagyobb erőforrás-kihasználtságot.
Végül adjon hozzá egy köztes szoftvert, amely az URL-címre /hc
válaszol:
// Program.cs from .NET 8 Web Api sample
app.MapHealthChecks("/hc");
A végpont <yourmicroservice>/hc
meghívásakor futtatja az indítási osztály metódusában AddHealthChecks()
konfigurált összes állapotellenőrzést, és megjeleníti az eredményt.
HealthChecks implementáció az eShopOnContainersben
Az eShopOnContainers mikroszolgáltatásai több szolgáltatásra támaszkodnak a feladat elvégzéséhez. Az eShopOnContainers mikroszolgáltatása például Catalog.API
számos szolgáltatástól függ, például az Azure Blob Storage-tól, az SQL Servertől és a RabbitMQ-tól. Ezért több állapotellenőrzést is hozzáadtunk a AddCheck()
módszerrel. Minden függő szolgáltatáshoz hozzá kell adni egy egyéni IHealthCheck
implementációt, amely meghatározza a megfelelő állapotot.
Az AspNetCore.Diagnostics.HealthChecks nyílt forráskódú projekt úgy oldja meg ezt a problémát, hogy egyéni állapot-ellenőrzési implementációkat biztosít az egyes vállalati szolgáltatásokhoz, amelyek a .NET 8-ra épülnek. Minden állapot-ellenőrzés különálló NuGet-csomagként érhető el, amely könnyen hozzáadható a projekthez. Az eShopOnContainers széles körben használja őket minden mikroszolgáltatásában.
A mikroszolgáltatásban például a Catalog.API
következő NuGet-csomagok lettek hozzáadva:
8-7. ábra. Custom Health Checks implementálva a Catalog.API-ban az AspNetCore.Diagnostics.HealthChecks használatával
A következő kódban a rendszer hozzáadja az állapot-ellenőrzési implementációkat minden függő szolgáltatáshoz, majd konfigurálja a köztes szoftvert:
// Extension method from Catalog.api microservice
//
public static IServiceCollection AddCustomHealthCheck(this IServiceCollection services, IConfiguration configuration)
{
var accountName = configuration.GetValue<string>("AzureStorageAccountName");
var accountKey = configuration.GetValue<string>("AzureStorageAccountKey");
var hcBuilder = services.AddHealthChecks();
hcBuilder
.AddSqlServer(
configuration["ConnectionString"],
name: "CatalogDB-check",
tags: new string[] { "catalogdb" });
if (!string.IsNullOrEmpty(accountName) && !string.IsNullOrEmpty(accountKey))
{
hcBuilder
.AddAzureBlobStorage(
$"DefaultEndpointsProtocol=https;AccountName={accountName};AccountKey={accountKey};EndpointSuffix=core.windows.net",
name: "catalog-storage-check",
tags: new string[] { "catalogstorage" });
}
if (configuration.GetValue<bool>("AzureServiceBusEnabled"))
{
hcBuilder
.AddAzureServiceBusTopic(
configuration["EventBusConnection"],
topicName: "eshop_event_bus",
name: "catalog-servicebus-check",
tags: new string[] { "servicebus" });
}
else
{
hcBuilder
.AddRabbitMQ(
$"amqp://{configuration["EventBusConnection"]}",
name: "catalog-rabbitmqbus-check",
tags: new string[] { "rabbitmqbus" });
}
return services;
}
Végül adja hozzá a HealthCheck köztes szoftvert a "/hc" végpont figyeléséhez:
// HealthCheck middleware
app.UseHealthChecks("/hc", new HealthCheckOptions()
{
Predicate = _ => true,
ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});
Mikroszolgáltatások lekérdezése az állapotuk jelentéséhez
Ha konfigurálta az állapot-ellenőrzéseket a cikkben leírtak szerint, és a Mikroszolgáltatás a Dockerben fut, közvetlenül ellenőrizheti a böngészőből, hogy kifogástalan állapotban van-e. Közzé kell tennie a tárolóportot a Docker-gazdagépen, hogy a tárolót a külső Docker-gazdagép IP-címén vagy a host.docker.internal
8–8. ábrán látható módon érhesse el.
8-8. ábra. Egyetlen szolgáltatás állapotának ellenőrzése böngészőből
Ebben a tesztben láthatja, hogy a mikroszolgáltatás (amely az Catalog.API
5101-ös porton fut) kifogástalan állapotú, a 200-os HTTP-állapotot és az állapotinformációkat adja vissza a JSON-ban. A szolgáltatás az SQL Server-adatbázis függőségének és a RabbitMQ-nak az állapotát is ellenőrizte, így az állapot-ellenőrzés kifogástalan állapotúnak minősült.
Watchdogok használata
A watchdog egy különálló szolgáltatás, amely figyelheti az állapotot és a terhelést a szolgáltatások között, és a korábban bevezetett kódtár lekérdezésével jelentést készíthet a HealthChecks
mikroszolgáltatások állapotáról. Ez segíthet megelőzni azokat a hibákat, amelyek egyetlen szolgáltatás nézete alapján nem észlelhetők. A watchdogok olyan kódokat is üzemeltethetnek, amelyek felhasználói beavatkozás nélkül végezhetnek szervizelési műveleteket az ismert feltételekhez.
Az eShopOnContainers minta egy olyan weblapot tartalmaz, amely a 8–9. ábrán látható módon megjeleníti a mintaállapot-ellenőrzési jelentéseket. Ez a legegyszerűbb watchdog, amelyet használhat, mivel csak az eShopOnContainers mikroszolgáltatásainak és webalkalmazásainak állapotát mutatja. A figyelők általában akkor is végeznek műveleteket, ha nem megfelelő állapotokat észlelnek.
Szerencsére az AspNetCore.Diagnostics.HealthChecks AspNetCore.HealthChecks.UI NuGet-csomagot is biztosít, amely a konfigurált URI-k állapot-ellenőrzési eredményeinek megjelenítésére használható.
8-9. ábra. Állapot-ellenőrzési mintajelentés az eShopOnContainersben
Összefoglalva, ez a watchdog szolgáltatás lekérdezi az egyes mikroszolgáltatások "/hc" végpontját. Ez végrehajtja a benne definiált összes állapotellenőrzést, és az összes ellenőrzéstől függően egy teljes állapotot ad vissza. A HealthChecksUI könnyen használható néhány konfigurációs bejegyzéssel és két sornyi kóddal, amelyeket hozzá kell adni a watchdog szolgáltatás Startup.cs .
Mintakonfigurációs fájl az állapot-ellenőrzési felhasználói felülethez:
// Configuration
{
"HealthChecksUI": {
"HealthChecks": [
{
"Name": "Ordering HTTP Check",
"Uri": "http://host.docker.internal:5102/hc"
},
{
"Name": "Ordering HTTP Background Check",
"Uri": "http://host.docker.internal:5111/hc"
},
//...
]}
}
Program.cs HealthChecksUI-t hozzáadó fájl:
// Program.cs from WebStatus(Watch Dog) service
//
// Registers required services for health checks
builder.Services.AddHealthChecksUI();
// build the app, register other middleware
app.UseHealthChecksUI(config => config.UIPath = "/hc-ui");
Állapotellenőrzés vezénylők használatakor
A mikroszolgáltatások rendelkezésre állásának monitorozásához az olyan vezénylők, mint a Kubernetes és a Service Fabric, rendszeresen végeznek állapot-ellenőrzéseket a mikroszolgáltatások tesztelésére irányuló kérések küldésével. Ha egy vezénylő megállapítja, hogy egy szolgáltatás/tároló állapota nem megfelelő, leállítja a kérések átirányítását az adott példányra. Emellett általában létrehoz egy új példányt a tárolóból.
A legtöbb vezénylő például állapotellenőrzéssel kezelheti a leállási idő nélküli üzemelő példányokat. A vezénylő csak akkor indítja el a forgalmat a szolgáltatás-/tárolópéldányok felé, ha a szolgáltatás/tároló állapota kifogástalan állapotúra változik.
Az állapotfigyelés különösen akkor fontos, ha egy vezénylő alkalmazásfrissítést hajt végre. Egyes vezénylők (például az Azure Service Fabric) fázisokban frissítik a szolgáltatásokat – például a fürtfelület egyötödét frissíthetik minden alkalmazásfrissítéshez. Az egyidejűleg frissített csomópontokat frissítési tartománynak nevezzük. Miután az egyes frissítési tartományok frissültek, és elérhetők a felhasználók számára, a frissítési tartománynak állapot-ellenőrzéseket kell végrehajtania, mielőtt az üzembe helyezés a következő frissítési tartományra kerül.
A szolgáltatás állapotának egy másik aspektusa a szolgáltatásból származó metrikák jelentése. Ez bizonyos vezénylők, például a Service Fabric állapotmodelljének fejlett képessége. A metrikák azért fontosak a vezénylők használatakor, mert az erőforrás-használat kiegyensúlyozására szolgálnak. A metrikák a rendszerállapot mutatói is lehetnek. Előfordulhat például, hogy egy alkalmazás sok mikroszolgáltatással rendelkezik, és minden példány másodpercenként egy kérelem (RPS) metrikát jelent. Ha egy szolgáltatás több erőforrást (memóriát, processzort stb.) használ, mint egy másik szolgáltatás, a vezénylő áthelyezheti a szolgáltatáspéldányokat a fürtben, hogy megpróbálja fenntartani az erőforrások kihasználtságát.
Vegye figyelembe, hogy az Azure Service Fabric saját Állapotfigyelő modellel rendelkezik, amely fejlettebb az egyszerű állapotellenőrzéseknél.
Speciális monitorozás: vizualizáció, elemzés és riasztások
A figyelés utolsó része az eseménystream vizualizációja, a szolgáltatás teljesítményéről való jelentéskészítés és a probléma észlelésekor történő riasztás. A figyelés ezen aspektusára különböző megoldásokat használhat.
A szolgáltatások állapotát megjelenítő egyszerű egyéni alkalmazásokat használhat, például az AspNetCore.Diagnostics.HealthChecks ismertetésekor megjelenő egyéni oldalt. Vagy használhat fejlettebb eszközöket, például az Azure Monitort , hogy riasztásokat gyűjtsön az események streamje alapján.
Végül, ha az összes eseménystreamet tárolja, a Microsoft Power BI vagy más megoldások, például a Kibana vagy a Splunk használatával vizualizálhatja az adatokat.
További erőforrások
HealthChecks és HealthChecks felhasználói felület ASP.NET Core-hoz
https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecksA Service Fabric állapotmonitorozásának bemutatása
https://learn.microsoft.com/azure/service-fabric/service-fabric-health-introductionAzure Monitor
https://azure.microsoft.com/services/monitor/
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: