Trūkstamų „Azure“ funkcijų žurnalų trikčių šalinimas programoje „Application Insights“.
Darbas su „Azure Functions“ dažnai atrodo lyg kurtumėte gerai suteptą automatikos variklį. Bet kas nutinka, kai kai kurie svarbūs žurnalai dingsta iš jūsų Application Insights darbo srities? 🤔 Tai iššūkis, su kuriuo neseniai susidūriau kurdamas Timer Trigger Azure Function. Mano informacijos lygio žurnalų, kurie puikiai veikė „Azure Portal“ žurnalų pulte, paslaptingai nebuvo Žurnalų darbo srityje.
Iš pradžių maniau, kad viskas sukonfigūruota teisingai. Galų gale, kurdamas savo funkcijų programą, buvau nustatęs „Application Insights“ ir atrodė, kad telemetrijos sąranka veikė iš karto. Kaip kūrėjas, nėra nieko labiau glumina, kaip matyti Įspėjimo ir Klaidų žurnalus, rodomus teisingai, o informacijos žurnalų niekur nerasta. Kur jie slėpėsi?
Ši problema man priminė panašų momentą derinant žiniatinklio programą. Klaidų žurnalai šaukė „Pataisyk mane! o subtilūs Informacijos lygio žurnalai paslydo po radaru. Tai panašu į dingusios dėlionės dalies paiešką – žinant, kad ji egzistuoja, bet ne visai jos matyti krūvoje. 🧩 Čia dažnai vaidina „Azure“ host.json ir telemetrijos nustatymai.
Šiame straipsnyje paaiškinsiu pagrindinę šios problemos priežastį ir žingsnis po žingsnio, kaip ją išspręsti. Nuo host.json konfigūracijų iki žurnalo lygio slenksčių patvirtinimo padėsiu išspręsti problemą. Pasirūpinkime, kad trūkstami Informacijos žurnalai sugrįžtų į Žurnalų darbo sritį.
komandą | Naudojimo pavyzdys |
---|---|
ConfigureFunctionsWorkerDefaults() | Inicijuoja ir konfigūruoja Azure Functions darbuotojo dujotiekį. Tai užtikrina, kad tarpinė programinė įranga ir paslaugos būtų tinkamai nustatytos vykdyti Azure Functions. |
Configure<LoggerFilterOptions>() | Naudojamas žurnalams filtruoti pagal jų žurnalo lygį, pvz., Informacija, įspėjimas arba klaida. Tai užtikrina, kad apdorojami tik norimi žurnalo lygiai. |
services.AddApplicationInsightsTelemetryWorkerService() | Registruoja „Application Insights“ darbuotojų paslaugoms. Tai įgalina telemetrijos rinkimą ir registravimą specialiai „Azure“ funkcijoms ne HTTP suaktyvintuose kontekstuose. |
options.MinLevel = LogLevel.Information | Nustato minimalų žurnalo lygio slenkstį. Pavyzdžiui, „Informacija“ užtikrina, kad būtų užfiksuoti informacijos, įspėjimų ir klaidų lygių žurnalai. |
ConfigureServices() | Pateikiamas būdas pridėti pasirinktines paslaugas arba konfigūruoti priklausomybes, pvz., registravimą, „Application Insights“ arba bet kokius su DI konteineriais susijusius komponentus. |
samplingSettings: { isEnabled: false } | Išjungiamas telemetrijos mėginių ėmimas, siekiant užtikrinti, kad visi žurnalai, įskaitant informacijos lygio žurnalus, būtų užfiksuoti neišfiltruojant. |
host.Run() | Vykdo sukonfigūruotą pagrindinį kompiuterį, kad paleistų Azure Functions darbuotojo procesą, ir pradeda klausytis gaunamų įvykių ar aktyviklių. |
builder.SetMinimumLevel(LogLevel.Information) | Aiškiai nustato minimalų žurnalo lygį registratoriaus konfigūracijai, kad būtų apdorojami išsamūs informacijos ir aukštesnio lygio žurnalai. |
Assert.True(condition, message) | Naudojamas vieneto bandymuose, siekiant patikrinti, ar sąlyga yra teisinga. Tokiu atveju jis patvirtina, kad informacijos žurnalai sėkmingai užfiksuoti. |
LogInformation("Message") | Registruoja informacinį pranešimą. Tai labai svarbu derinant ir stebint nekritinę veiklą „Azure Functions“. |
Trūkstamų Azure funkcijų žurnalų supratimas ir kaip tai išspręsti
Anksčiau pateikti scenarijai skirti išspręsti dažną problemą, kur Informacijos lygio žurnalai sugeneruoti „Azure“ funkcijos, nerodomi žurnalų darbo srityje, net jei jie rodomi „Azure Portal“ žurnalo konsolėje. Šis neatitikimas dažnai atsiranda dėl netinkamos konfigūracijos host.json faile, nepakankamų telemetrijos nustatymų arba dėl Application Insights integravimo problemų. Naudodami tokias komandas kaip ConfigureFunctionsWorkerDefaults() ir AddApplicationInsightsTelemetryWorkerService(), užtikriname, kad „Application Insights“ užfiksuotų žurnalus, kaip tikėtasi. Šie scenarijai sukuria tvirtą pagrindą telemetrijos duomenims rinkti ir tvarkyti.
Pirma, „HostBuilder“ Program.cs nustato „Azure Function“ darbuotojo aplinką. Metodas ConfigureFunctionsWorkerDefaults() užtikrina, kad būtų inicijuota visa reikalinga „Azure Functions“ tarpinė programinė įranga. Tai taip pat leidžia tinkinti registravimą ir priklausomybės įpurškimo konfigūraciją. Tada mes aiškiai užregistruojame Application Insights naudodami AddApplicationInsightsTelemetryWorkerService(). Šis veiksmas užtikrina, kad telemetrijos rinkinys būtų tinkamai sukonfigūruotas ne HTTP suaktyvintoms Azure funkcijoms. Pavyzdžiui, įsivaizduokite Laikmačio paleidimo funkcijos derinimą: be Application Insights našumo stebėjimas ir problemų nustatymas tampa rankiniu ir daug laiko reikalaujančiu procesu. 🔧
Failas host.json atlieka pagrindinį vaidmenį valdant, kokie žurnalo lygiai fiksuojami. Numatytajame ir „Application Insights“ skiltyse nustatydami „LogLevel“ į Information, aiškiai apibrėžiame, kad informacijos lygio žurnalai turi būti apdorojami. Tačiau ypatybė samplingSettings kartais gali filtruoti žurnalus, todėl žurnalų darbo srityje trūksta įrašų. Išjungę atranką ("isEnabled": false'), užtikriname, kad bus užfiksuoti visi telemetrijos duomenys, įskaitant informacijos žurnalus. Tai ypač svarbu šalinant gamybos problemas, kai net nedidelė detalė gali atskleisti pagrindinę priežastį. Kartą susidūriau su situacija, kai mažas LogInformation pranešimas padėjo atskleisti netinkamai sukonfigūruotą planavimo priemonę. 🎯
Galiausiai, vieneto bandymo scenarijus patikrina, ar skirtingų lygių žurnalai – informacija, įspėjimas ir klaida – yra tinkamai išsiunčiami ir užfiksuoti. Naudojant SetMinimumLevel(), užtikriname, kad registratorius apdoros visus žurnalus, atitinkančius norimą slenkstį arba virš jo. Mūsų pavyzdyje patvirtinome, kad informacijos žurnalai rodomi, kai jie yra aiškiai sukonfigūruoti. Rašydami vienetų testus, kaip šis, užtikrinama, kad registravimo elgsena visose aplinkose būtų nuosekli ir išvengiama netikėtumų diegimo metu. Kartu šie scenarijai suteikia išsamų sprendimą, kaip pašalinti trūkstamus Azure Function žurnalus ir optimizuoti telemetrijos rinkimą debesies programose.
Užtikrinti, kad „Azure“ funkcijų žurnalai būtų rodomi žurnalų darbo srityje
Čia yra C# galinis sprendimas, skirtas išspręsti trūkstamos informacijos žurnalų problemą, užtikrinant tinkamą Application Insights konfigūraciją.
// Solution 1: Proper Host Configuration and Log Filtering
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
public class Program
{
public static void Main(string[] args)
{
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.ConfigureServices(services =>
{
services.AddApplicationInsightsTelemetryWorkerService();
services.Configure<LoggerFilterOptions>(options =>
{
options.MinLevel = LogLevel.Information;
});
})
.Build();
host.Run();
}
}
Konfigūracijos peržiūra, siekiant užtikrinti tinkamą registraciją žurnalo lygiu
Konfigūracijos failo sąranka, siekiant užtikrinti, kad host.json ir Application Insights žurnalo lygiai būtų suderinti.
// host.json Configuration
{
"version": "2.0",
"logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Function": "Information"
},
"applicationInsights": {
"LogLevel": {
"Default": "Information"
},
"samplingSettings": {
"isEnabled": false
}
}
}
}
Alternatyva: konkrečių žurnalo lygių filtravimas „Azure“ funkcijos kode
C# scenarijus, skirtas aiškiai filtruoti ir siųsti įvairių lygių žurnalus.
using Microsoft.Extensions.Logging;
public class MyFunction
{
private readonly ILogger _logger;
public MyFunction(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<MyFunction>();
}
public void Run()
{
_logger.LogInformation("Executing Information level log.");
_logger.LogWarning("This is a Warning level log.");
_logger.LogError("This is an Error level log.");
}
}
Įrenginio tikrinimas žurnalo lygio konfigūracijai
Paprastas vieneto testas, skirtas patvirtinti, kad žurnalai informacijos lygiu užfiksuoti teisingai.
using Xunit;
using Microsoft.Extensions.Logging;
public class LogTests
{
[Fact]
public void VerifyInformationLogsAreCaptured()
{
var loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddConsole();
builder.SetMinimumLevel(LogLevel.Information);
});
var logger = loggerFactory.CreateLogger("TestLogger");
logger.LogInformation("This is a test Information log.");
Assert.True(true, "Information log captured successfully.");
}
}
Trūkstamų Azure funkcijų žurnalų sprendimas tyrinėjant telemetrijos duomenis
Kitas svarbus „Azure Function“ žurnalų aspektas, nerodomas Žurnalų darbo srityje, yra telemetrijos kanalo konfigūracija, kurią naudoja „Application Insights“. Pagal numatytuosius nustatymus „Azure Functions“ naudoja „Application Insights“ SDK, kuris saugo žurnalus prieš siųsdamas juos į telemetrijos galutinį tašką. Tačiau šis buferis gali atidėti arba praleisti tam tikrus žurnalo įrašus, pvz., Informacijos lygio žurnalus dėl atrankos arba netinkamo telemetrijos duomenų plovimo. Tinkamo telemetrijos kanalo veikimo užtikrinimas yra labai svarbus norint išlaikyti nuoseklius žurnalus.
Vienas dažnai nepastebimas veiksnys yra atrankos nustatymai konfigūracija host.json. Kai atranka įgalinta, tik dalis žurnalų siunčiama į Application Insights, kad būtų sumažintas duomenų kiekis ir išlaidos. Tačiau jei informacijos žurnalai yra labai svarbūs derinant, turite visiškai išjungti atranką („isEnabled“: false) arba pakoreguoti atrankos logiką, kad būtų užfiksuoti visi reikalingi žurnalai. Pavyzdžiui, susidūriau su problema, kai įgalinus atranką atsitiktinai sumažėjo nekritinės informacijos žurnalai, o tai sukėlė nusivylimą derinant produkciją. 💻
Be to, naudojant Nuplaukite Komandos užtikrina, kad visa buferinė telemetrija būtų išsiųsta nedelsiant, išvengiant duomenų praradimo. Esant scenarijams, kai „Azure Functions“ veikia esant didelės apkrovos aktyvikliams, pvz., HTTP užklausoms arba laikmačio aktyvikliams, telemetrijos buferis gali greitai kauptis ir sukelti vėlavimą. Aiškiai iškvietę TelemetryClient.Flush() arba patikrinę telemetrijos galinio taško ryšį, kūrėjai gali sumažinti žurnalų neatitikimus ir palaikyti tikslią stebėjimo aplinką. Galiausiai mėginių ėmimo, buferio ir praplovimo subalansavimas užtikrina optimalų žurnalo matomumą ir sumažina išlaidas.
Dažnai užduodami klausimai apie „Azure“ funkcijų žurnalus
- Kodėl žurnalų darbo srityje trūksta mano informacijos žurnalų?
- Informacijos žurnalai gali nepasirodyti dėl samplingSettings esančiame host.json. Išjungti atranką naudojant "isEnabled": false kad užfiksuotų visus rąstus.
- Ką daro LogLevel konfigūracija host.json?
- The LogLevel nurodo minimalų užfiksuoto žurnalo sunkumą, pvz., "Default": "Information", užtikrinant, kad būtų apdorojami šio lygio arba aukštesnio lygio žurnalai.
- Kaip užtikrinti, kad telemetrijos duomenys būtų išplauti į „Application Insights“?
- Naudokite TelemetryClient.Flush() metodą savo funkcijos kode, kad priverstumėte visą buferinę telemetriją siųsti nedelsiant.
- Kodėl matomi įspėjimų ir klaidų žurnalai, bet ne informacijos žurnalai?
- Ši problema iškyla, kai LogLevel yra netinkamai sukonfigūruotas arba samplingSettings mesti informacijos žurnalus dėl optimizavimo.
- Ar galiu pakoreguoti atrankos logiką, kad įtrauktų konkrečius žurnalus?
- Taip, galite tinkinti excludedTypes turtas pagal samplingSettings neįtraukti konkrečių telemetrijos tipų, pvz Request arba Exception.
- Koks yra AddApplicationInsightsTelemetryWorkerService() vaidmuo?
- The AddApplicationInsightsTelemetryWorkerService() metodas registruoja „Azure Functions“ telemetrijos taikomąsias įžvalgas.
- Kaip patikrinti, ar „Application Insights“ yra tinkamai susietas?
- Patikrinkite Instrumentation Key arba Connection String Function App konfigūracijos skiltyje Application Insights nustatymuose.
- Ar galiu programiškai registruoti informacijos lygio pranešimus?
- Taip, galite naudoti _logger.LogInformation("Your message") Informacinių pranešimų registravimo metodas, aiškiai nurodytas jūsų funkcijos kode.
- Kaip pašalinti trūkstamus žurnalus naudojant laikmačio paleidimo funkciją?
- Patikrinkite host.json konfigūruoti, įsitikinkite, kad telemetrija prijungta, ir paskambinkite Flush() funkcijos pabaigoje.
- Ką veikia ConfigureFunctionsWorkerDefaults()?
- The ConfigureFunctionsWorkerDefaults() metodas inicijuoja Azure Functions tarpinę programinę įrangą ir nustato registravimą.
Žurnalo matomumo užtikrinimas „Azure“ funkcijų žurnaluose
Pagrindinės įžvalgos ir tolesni žingsniai
Norint užtikrinti tinkamą žurnalo matomumą „Azure Functions“, reikia kruopščiai konfigūruoti host.json ir tinkamus telemetrijos nustatymus. Tokios problemos kaip mėginių ėmimas ir numatytosios žurnalo lygio slenksčiai gali lemti žurnalų trūkumą, net kai duomenys rodomi portalo konsolėje. Aiškus atrankos išjungimas ir telemetrijos praplovimo metodų iškvietimas dažnai išsprendžia šią problemą.
Be to, patvirtinti, kad „Application Insights“ yra tinkamai prijungta, ir užtikrinti atitinkamus žurnalo lygius abiejose Program.cs ir konfigūracijos failai yra labai svarbūs. Atlikus šiuos koregavimus, informacijos žurnalai bus patikimai rodomi žurnalų darbo srityje, suteikiant aiškias įžvalgas apie „Azure Function“ elgseną. 🛠️
Rąstai
- Oficiali Microsoft dokumentacija apie Application Insights konfigūraciją – „Microsoft Learn“.
- Geriausia „Azure“ funkcijų registravimo praktika – Azure funkcijų stebėjimas