Öğretici: Azure İzleyici ile App Service uygulamasında sorun giderme

Bu öğreticide, Azure İzleyici kullanarak App Service uygulamasında sorun giderme adımları gösterilmektedir. Örnek uygulama, belleği tüketmek ve HTTP 500 hatalarına neden olmak için kullanılan kodu içerir, böylece Azure İzleyici'yi kullanarak sorunu tanılayabilir ve düzeltebilirsiniz. İşiniz bittiğinde, Azure İzleyici ile tümleştirilmiş Linux üzerinde App Service üzerinde çalışan bir örnek uygulamanız vardır.

Azure İzleyici , bulut ve şirket içi ortamlarınızdan telemetri toplamak, analiz etmek ve üzerinde işlem gerçekleştirmek için kapsamlı bir çözüm sunarak uygulamalarınızın ve hizmetlerinizin kullanılabilirliğini ve performansını en üst düzeye çıkarır.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • Azure İzleyici ile web uygulaması yapılandırma
  • Konsol günlüklerini Log Analytics'e gönderme
  • Web uygulaması hatalarını belirlemek ve gidermek için Günlük sorgularını kullanma

Bu öğreticideki adımları MacOS, Linux ve Windows üzerinde izleyebilirsiniz.

Azure aboneliğiniz yoksa başlamadan önce birücretsiz Azure hesabı oluşturun.

Önkoşullar

Bu öğreticiyi tamamlamak için aşağıdakiler gerekir:

  • Azure Cloud Shell'de Bash ortamını kullanın. Daha fazla bilgi için bkz . Azure Cloud Shell'de Bash için hızlı başlangıç.

  • CLI başvuru komutlarını yerel olarak çalıştırmayı tercih ediyorsanız Azure CLI'yı yükleyin . Windows veya macOS üzerinde çalışıyorsanız Azure CLI’yi bir Docker kapsayıcısında çalıştırmayı değerlendirin. Daha fazla bilgi için bkz . Docker kapsayıcısında Azure CLI'yi çalıştırma.

    • Yerel yükleme kullanıyorsanız az login komutunu kullanarak Azure CLI ile oturum açın. Kimlik doğrulama işlemini tamamlamak için terminalinizde görüntülenen adımları izleyin. Diğer oturum açma seçenekleri için bkz . Azure CLI ile oturum açma.

    • İstendiğinde, ilk kullanımda Azure CLI uzantısını yükleyin. Uzantılar hakkında daha fazla bilgi için bkz. Azure CLI ile uzantıları kullanma.

    • Yüklü sürümü ve bağımlı kitaplıkları bulmak için az version komutunu çalıştırın. En son sürüme yükseltmek için az upgrade komutunu çalıştırın.

Azure kaynakları oluşturma

İlk olarak, bu öğreticiyle kullanılacak örnek bir uygulama ayarlamak için yerel olarak birkaç komut çalıştırırsınız. Komutlar Azure kaynakları oluşturur, bir dağıtım kullanıcısı oluşturur ve örnek uygulamayı Azure'a dağıtır. Dağıtım kullanıcısının oluşturulmasının bir parçası olarak sağlanan parola istenir.

az group create --name myResourceGroup --location "South Central US"
az webapp deployment user set --user-name <username> --password <password>
az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku B1 --is-linux
az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "PHP|8.1" --deployment-local-git
az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings DEPLOYMENT_BRANCH='main'
git clone https://github.com/Azure-Samples/App-Service-Troubleshoot-Azure-Monitor
cd App-Service-Troubleshoot-Azure-Monitor
git branch -m main
git remote add azure <url-from-app-webapp-create>
git push azure main

Azure İzleyici'yi yapılandırma

Log Analytics Çalışma Alanı Oluşturma

Örnek uygulamayı Azure Uygulaması Hizmeti'ne dağıttığınıza göre, artık sorun oluştuğunda uygulamayı gidermek için izleme özelliğini yapılandıracaksınız. Azure İzleyici günlük verilerini log Analytics çalışma alanında depolar. Çalışma alanı, veri ve yapılandırma bilgilerini içeren bir kapsayıcıdır.

Bu adımda, uygulamanızla Azure İzleyici'yi yapılandırmak için bir Log Analytics çalışma alanı oluşturursunuz.

az monitor log-analytics workspace create --resource-group myResourceGroup --workspace-name myMonitorWorkspace

Tanılama ayarı oluşturma

Tanılama ayarları, günlük sorgularını kullanarak diğer izleme verileriyle analiz için belirli Azure hizmetlerinin ölçümlerini Azure İzleyici Günlüklerine toplamak için kullanılabilir. Bu öğretici için web sunucusunu ve standart çıkış/hata günlüklerini etkinleştirirsiniz. Günlük türlerinin ve açıklamalarının tam listesi için desteklenen günlük türlerine bakın.

AppServiceConsoleLogs (standart çıkış/hata) ve AppServiceHTTPLogs (web sunucusu günlükleri) için tanılama ayarları oluşturmak için aşağıdaki komutları çalıştırırsınız. Uygulama-adı> ve< çalışma alanı-adı> değerleriniz ile değiştirin.<

Not

İlk iki komut resourceID ve workspaceID, az monitor diagnostic-settings create komutunda kullanılacak değişkenlerdir. Bu komut hakkında daha fazla bilgi için bkz . Azure CLI kullanarak tanılama ayarları oluşturma.

resourceID=$(az webapp show -g myResourceGroup -n <app-name> --query id --output tsv)

workspaceID=$(az monitor log-analytics workspace show -g myResourceGroup --workspace-name <workspace-name> --query id --output tsv)

az monitor diagnostic-settings create --resource $resourceID \
 --workspace $workspaceID \
 -n myMonitorLogs \
 --logs '[{"category": "AppServiceConsoleLogs", "enabled": true},
  {"category": "AppServiceHTTPLogs", "enabled": true}]'

Uygulamadaki sorunları giderme

http://<app-name>.azurewebsites.net adresine göz atın.

ImageConverter örnek uygulaması, eklenen görüntüleri 'den'e JPGPNGdönüştürür. Bu öğretici için koda kasıtlı olarak bir hata yerleştirildi. Yeterli görüntü seçerseniz uygulama, görüntü dönüştürme sırasında bir HTTP 500 hatası oluşturur. Geliştirme aşamasında bu senaryonun göz önünde bulundurulmamış olduğunu düşünün. Hatayı gidermek için Azure İzleyici'yi kullanacaksınız.

Uygulamanın çalıştığını doğrulama

Resimleri dönüştürmek için öğesine tıklayın Tools ve öğesini seçin Convert to PNG.

Click Tools and select Convert to PNG

İlk iki resmi seçin ve öğesine tıklayın convert. Bu işlem başarıyla dönüştürülür.

Select the first two images

Uygulamayı kesme

İki görüntüyü başarıyla dönüştürerek uygulamayı doğruladığınıza göre, ilk beş görüntüyü dönüştürmeye çalışıyoruz.

Convert first five images

Bu eylem başarısız olur ve geliştirme sırasında test edilmedi bir HTTP 500 hata üretir.

The convert will result in a HTTP 500 error

Azure İzleyici günlüklerini görüntülemek için günlük sorgusunu kullanma

Log Analytics çalışma alanında hangi günlüklerin kullanılabildiğini görelim.

Azure portalında çalışma alanınıza erişmek için bu Log Analytics çalışma alanı bağlantısına tıklayın.

Azure portalında Log Analytics çalışma alanınızı seçin.

Günlük sorguları

Günlük sorguları, Azure İzleyici Günlüklerinde toplanan verilerin değerini tam olarak uygulamanıza yardımcı olur. Günlük sorgularını hem AppServiceHTTPLogs hem de AppServiceConsoleLogs içindeki günlükleri tanımlamak için kullanırsınız. Günlük sorguları hakkında daha fazla bilgi için günlük sorgusuna genel bakış bölümüne bakın.

Günlük sorgusuyla AppServiceHTTPLogs'ları görüntüleme

Uygulamaya erişdiğimize göre, içinde bulunan AppServiceHTTPLogsHTTP istekleriyle ilişkili verileri görüntüleyelim.

  1. Sol gezinti bölmesinden tıklayın Logs .

Log Anlytics Worksace Logs

  1. için appservice arama yapıp çift tıklayın AppServiceHTTPLogs.

Log analytics Workspace Tables

  1. Run’a tıklayın.

Log Analytics Workspace App Service HTTP Logs

Sorgu, AppServiceHTTPLogs son 24 saat içindeki tüm istekleri döndürür. Sütun ScStatus HTTP durumunu içerir. Hataları tanılamak HTTP 500 için öğesini 500 ile sınırlayın ScStatus ve sorguyu aşağıda gösterildiği gibi çalıştırın:

AppServiceHTTPLogs
| where ScStatus == 500

Günlük sorgusuyla AppServiceConsoleLogs'ları görüntüleme

HTTP 500'leri onayladığınıza göre, şimdi uygulamadan standart çıkışa/hatalara göz atalım. Bu günlükler 'AppServiceConsoleLogs' içinde bulunur.

(1) Yeni sorgu oluşturmak için tıklayın + .

(2) Tabloya AppServiceConsoleLogs çift tıklayın ve öğesine tıklayın Run.

Beş görüntünün dönüştürülmesi sunucu hatalarıyla sonuçlandığından, uygulamanın aşağıda gösterildiği gibi hataları filtreleyerek hata yazıp ResultDescription yazmadığı görebilirsiniz:

AppServiceConsoleLogs |
where ResultDescription  contains "error" 

ResultDescription sütununda aşağıdaki hatayı görürsünüz:

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted 
(tried to allocate 16384 bytes) in /home/site/wwwroot/process.php on line 20, 
referer: http://<app-name>.azurewebsites.net/

AppServiceHTTPLogs ve AppServiceConsoleLogs'a Katılma

Artık hem HTTP 500'leri hem de standart hataları tanımladığınıza göre, bu iletiler arasında bir bağıntı olup olmadığını onaylamanız gerekir. Ardından, zaman damgasına TimeGeneratedgöre tabloları birleştirin.

Not

Aşağıdakiler için bir sorgu hazırlanmıştır:

  • HTTPLogs'a 500 hatası için filtre uygular
  • Konsol günlüklerini sorgular
  • Üzerindeki tabloları birleştirir TimeGenerated

Aşağıdaki sorguyu çalıştırın:

let myHttp = AppServiceHTTPLogs | where  ScStatus == 500 | project TimeGen=substring(TimeGenerated, 0, 19), CsUriStem, ScStatus;  

let myConsole = AppServiceConsoleLogs | project TimeGen=substring(TimeGenerated, 0, 19), ResultDescription;

myHttp | join myConsole on TimeGen | project TimeGen, CsUriStem, ScStatus, ResultDescription;

ResultDescription sütununda, web sunucusu hatalarıyla aynı anda aşağıdaki hatayı görürsünüz:

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted 
(tried to allocate 16384 bytes) in /home/site/wwwroot/process.php on line 20, 
referer: http://<app-name>.azurewebsites.net/

İleti, belleğin 20 process.php. satırında tükendiğini belirtir. Uygulamanın HTTP 500 hatası sırasında bir hata ürettiğini doğruladınız. Şimdi sorunu belirlemek için koda göz atalım.

Hatayı belirleme

Yerel dizinde öğesini açın process.php ve 20. satıra bakın.

imagepng($imgArray[$x], $filename);

İlk bağımsız değişken olan $imgArray[$x], dönüştürmeye ihtiyaç duyan tüm JPG'leri (bellek içi) tutan bir değişkendir. Ancak, tüm görüntüleri değil yalnızca imagepng görüntünün dönüştürülmesi gerekir. Görüntülerin önceden yüklenmesi gerekli değildir ve bellek tükenmesine neden olarak HTTP 500'lere yol açabilir. Sorunu çözip çözmediğini görmek için isteğe bağlı görüntüleri yüklemek için kodu güncelleştirelim. Ardından, bellek sorununu gidermek için kodu geliştirin.

Uygulamayı düzeltme

Kodu yerel makinede güncelleştirme ve yeniden dağıtma

Bellek tükenmesini işlemek için 'de aşağıdaki değişiklikleri process.php yaparsınız:

<?php

//Retrieve query parameters
$maxImages = $_GET['images'];
$imgNames  = explode(",",$_GET['imgNames']);

//Load JPEGs into an array (in memory)
for ($x=0; $x<$maxImages; $x++){
    $filename = './images/converted_' . substr($imgNames[$x],0,-4) . '.png';
    imagepng(imagecreatefromjpeg("./images/" . $imgNames[$x]), $filename);
}

Değişikliklerinizi Git’e işleyin ve ardından kod değişikliklerini Azure’a gönderin.

git commit -am "Load images on-demand in process.php"
git push azure main

Azure uygulamasına göz atın

http://<app-name>.azurewebsites.net adresine göz atın.

Görüntülerin dönüştürülmesi artık HTTP 500 hataları oluşturmamalıdır.

PHP app running in Azure App Service

Kaynakları temizleme

Önceki adımlarda, bir kaynak grubunda Azure kaynakları oluşturdunuz. Bu kaynakların gelecekte gerekli olacağını düşünmüyorsanız, Cloud Shell’de aşağıdaki komutu çalıştırarak kaynak grubunu silin:

az group delete --name myResourceGroup

Bu komutun çalıştırılması bir dakika sürebilir.

Tanılama ayarını aşağıdaki komutla silin:

az monitor diagnostic-settings delete --resource $resourceID -n myMonitorLogs

Öğrendikleriniz:

  • Azure İzleyici ile web uygulaması yapılandırma
  • Log Analytics'e gönderilen günlükler
  • Web uygulaması hatalarını belirlemek ve gidermek için kullanılan günlük sorguları

Sonraki adımlar