11 Ocak 2018 Perşembe

Azure App Service üzerinde problem çözümü


Farklı katmanlarda hatalar oluşabilmekte. Bunlar;

1-Uygulamanın kendisi: 
"object reference not set" hatasından "An error occurred while sending the request." hatasına kadar çeşitli hatalar oluşabilmekte.
Tabi bir de StackOverflowException hatasını unutmamalı. https://blogs.msdn.microsoft.com/spike/2011/11/04/how-to-create-a-stackoverflowexception-and-how-to-figure-out-where-it-is-happening/

2-Uygulamanın üzerinde çalıştığı ortam: 
Yani .Net Framework / .Net Core. Uygulamanın geliştirildiği ortam ve çalışma ortamı (production) arasındaki farklılıklardan kaynaklanabilir.
Kendilerini "Unhandled Exception: System.TypeInitializationException: The type initializer for 'System.Diagnostics.DiagnosticListener' threw an exception." hatası olarak belli ederler.
Yani uygulama çalışırken değil daha en baştan (Program.Main(String[] args)) uygulamanın başlamasına engel olurlar.
Bu bazen uygulama doğru version üzerinde çalışıyor olsa bile ortaya çıkabilir. Azure örneğinde "App Service" uygulamasına eklenen bir extension ile uyumsuzluk da sebep olabilir.
Örneğin: Application Insight 2.4.7 https://stackoverflow.com/questions/47411101/could-not-load-type-system-diagnostics-productionbreakpointsstub-error-in-app-d?rq=1



3-Uygulamayı barındıran servis:
Bu windows için IIS. Örneğin IIS logları sistem diski üzerinde açık unutulduğunda, IIS çalışabilmesi için kendine yer bulamaz ve servis yapamaz duruma gelir.
401 - Unauthorized. 404 - Not found. Diğer hatalardan.
Geçmişe göre artık yeni versiyonlarda güvenlik ve diğer tanımlar IIS üzerinden uygulama üzerine taşındığı için bu tip hataları artık uygula çalışma zamanında karşışabiliyoruz.

Dikkat: Bu noktada Azure App Service şöyle bir problem barındırıyor:
Belirli aralıklarla servisde güncellemeler yapılıyor ve bu "App Recycle" oluşmasına neden oluyor.
"Diagnose and Solve Problems" adımından "App Restart Analysis" seçilirse farklı günler kontrol edildiğinde alttaki gibi bilgiler çıkacaktır:

Reasons for your web app restart
-Your application was recycled due to an intermittent Azure infrastructure issue while accessing remote file storage. This can happen due to multiple reasons like platform instances getting upgraded or instance(s) experiencing high latencies accessing the remote storage....
>>> Explore app service local cache
-Around 2/26/2018 12:23:26 AM (UTC), On Instance RD0003FF74AE23, Your application was recycled as the Azure scale unit was undergoing an upgrade. There are periodic updates made by Microsoft to the underlying Azure platform to improve overall reliability, performance, and security of the platform infrastructure where your application is running on. ...


Hatayı bulma.


Kritiklik seviyesine göre 3-2-1 şeklinde sıralayabilir. Çalışma zamanında hata veren bir uygulama hiç çalışmayan bir uygulamadan iyidir.
2. Madde özelinde malesef Azure üzerinde problemler ortaya çıkabilmekte. Örneğin bir extension için güncelleme çıktığında, nasıl olsa herşeyin son versiyonunu kullanıyorum, gönül rahatlığıyla güncelleme yapabilirim denilemiyor.

Burda önemli bir özellik, "Deployment slot" kullanılarak olası canlı ortam prolemlerini önüne geçilir.
Production ve Staging ortamları için "Extension" kurulumları ayrı ayrı yapılıyor. Dolayısıyla "Extension" staging ortmamında güncellenip test edilmeli.

1. Madde için durum biraz daha karışık. Azure portal üzerinde farklı seçenekler var.
Bununla birlikte app-name.scm.azurewebsites.net adresinden erişilebilen "Kudu" servisi var.

Uygulama üzerine log tutma tanımları ve seçenekleri:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?tabs=aspnetcore2x

Provider
.Net Core ile birlikte gelenler:
Console,
Debug (VS output window veya https://docs.microsoft.com/en-us/sysinternals/downloads/debugview),
EventLog (Windows),
AzureAppService > Azure App Service tanımı üzerinden file system yada Blog storage üzerinde log tutmak için (Diagnostig Logs/Application Logging On konumuna getirilmeli),

TraceSource > (.Net Framework için),
EventSource > Uygulama profiling sonucunda oluşan çıktıda loglama bilgilerin eklemek için.
Örneğin PerfView aracıyla memory/process dump çıktısını incelerken

Kategorilere göre ayırma: İsim belirterek yada "contructure" üzerinden oluştururken kullanılacağı class verilir.

Log Level: Trace, Debug, Information, Warning, Error, Critical

Filtre uygulama: Kodlayarak yada appsettings.json dosyasında namespace bazında LogLevel belirtilebilir.
Filter function ile "provider, category, logLevel" üzerinden koşullu loglama yapılabilir.
Süre gibi ek bilgiler de belirtilebilseydi iyi olurdu.


Daha farklı loglama seçenekleri (Provider) için alternatif kütüphaneler ;
NLog, Serilog


Kontol edilebilecek noktalar

Enable diagnostics logging for web apps in Azure App Service

-Azure Log Streaming
-Download
-Application Insights


App Service / Diagnose And Solve Problems adımında
-"A health checkup" analizi yapılabilir.
-Support tools alanındaki linklerden farklı log servislerine erişilebilir.
https://[site-name].scm.azurewebsites.net/Support


-Application Insights
-Kudu/Debug Console >
LogFiles altında Event Log, Site log
Site altında logs yada wwwroot/logs altında uygulama logları


Azure App Service de LogLevel belirtmek için "Application Settings" > "App Settings"
Logging:LogLevel:Microsoft = Warning


Hiç yorum yok: