django python

Django Newrelic Entegrasyonu

Erkan Keskin 2 dakika okuma süresi
Django Newrelic Entegrasyonu
Paylaş

Merhaba, yazılılarımızın sağlığı için hem yazılımın hem de üzerinde çalıştığı sunucunun performansını ölçmek, hatalarını yakalamak ve hızla fixlemek çok önemlidir. Bunu yaparken kendi ölçümleme mekanizmalarımızı kurabiliriz. Ancak bu, çok maliyetli olacaktır. Bu işi yapan onlarca araç varken, bu araçlardan faydalanmak çok daha uygundur.

Bu araçlardan newrelic kullanırken uygulamamıza nasıl entegre edeceğimizden bahsedeceğim. Son 1-2 haftam bu aracı çalıştığım şirkette projemize entegre etmek ve ayarlamaları ile geçti. Entegrasyonun birkaç yolu var. Ölçümlemede istediğimiz metrikleri istediğimiz gibi görebilmek içinde bazı ayarlamalar yapmak gerekiyor. Bu makalede bunu anlayacağız ve öğreneceğiz. Ben uzunca bir zamandır projelerimde django kullanıyorum. Bu nedenle django ile entegrasyonundan bahsedeceğim. Uygulamamı docker ile çalıştıracağım. Ancak mantık diğer yazılım dilleri ve uygulamalarda da aynı olacaktır.

Öncelikle newrelic hakkında biraz bilgi sahibi olalım. Newrelic; uygulama performansı, altyapı izleme, günlük ( log ) yönetimi, hata izleme, gerçek kullanıcı izlemesi ve daha fazlası için eksiksiz bir monitoring platformudur. Ücretsiz versiyonunda aylık 100GB data girişine izin verir. Yazılım ile kusursuz bir entegrasyon sonucu logları bizim belirlediğimiz ayarlara göre tutar. Hataları izler. Bunu yapan APM'dir, (Application Monitoring Service). Ayrıca sunucu tarafınada entegrasyon yapıp, sunucunun CPU ve Memory performansınıda izleyebiliriz. Ancak bu, bu makalenin konusu değildir. Biz burda APM'i inceleyeceğiz. Django uygulamamızın içerisine newrelic paketini yükleyerek işe başlayabiliriz;

pip install newrelic

Daha sonra bir newrelic.ini dosyası oluşturacağız. İçeriği basit şekilde şöyle olabilir;

[newrelic]
license_key=YOUR_LICENSE_KEY
log_file=newrelic.log

[newrelic:development]
app_name=APP_NAME ( Development )
log_level=error

[newrelic:staging]
app_name=APP_NAME ( Staging )
log_level=warning

[newrelic:production]
app_name=APP_NAME ( Production )
log_level=warning

Bu newrelic için bir config dosyasıdır. Yukarıda [newrelic] altında default ayarları yazdık ve ayarlarımızı 3 adet geliştirme ortamımız olduğunu varsayarak yaptık. Burada dikkat etmemiz gereken önemli bir husus var. O da log_level değerleri. Burada warning, debug, info, error gibi log seviyeleri belirleyebiliriz. Log seviyeleri kapsama alanı şu şekildedir;

DEBUG > INFO > WARNING > ERROR

Yani hiyerarşinin en tepesindeki diğerlerinide kapsar. Mesela eğer log_level info verirsek warning, error ve fatal kapsama alanında olacak. Daha fazla bilgi ve detay için şuraya gidebilirsiniz. Bir .env dosyası oluşturalım ve içeriğinde newrelic ile alakalı bazı tanımlamalar yapalım;

NEW_RELIC_ENVIRONMENT=development
NEW_RELIC_CONFIG_FILE=/path/to/newrelic.ini
NEW_RELIC_LOG_LEVEL=error
NEW_RELIC_MONITOR_MODE=false

Docker kullanıyorsak docker-compose dosyamız içerisinde bu değerleri environment altında tanımlayalım;

evnironment:
  - NEW_RELIC_ENVIRONMENT=${NEW_RELIC_ENVIRONMENT}
  - NEW_RELIC_LOG_LEVEL=${NEW_RELIC_LOG_LEVEL}
  - NEW_RELIC_CONFIG_FILE=${NEW_RELIC_CONFIG_FILE}
  - NEW_RELIC_MONITOR_MODE=${NEW_RELIC_MONITOR_MODE}

Şimdi wsgi.py dosyası içinde bu yaptığımız ini dosyasının yolunu verelim ve agent başlatalım;

import newrelic.agent
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
newrelic_ini_path = os.path.join(BASE_DIR, 'newrelic.ini')
environment = os.getenv('NEW_RELIC_ENVIRONMENT', 'development')
newrelic.agent.initialize(newrelic_ini_path, environment)

burada olan şey environment belirlerken .env dosyamızda verdiğimiz değere göre ini dosyamız içerisindeki ortamı seçiyor. Dashboard üzerinde app_name değerlerine göre tüm sunucularınızı görebilir ve ayrı ayrı configure edebilirsiniz. 

Sonuç; 

Burada python / django ve docker ile APM entegrasyonunu gördük. Tabiki tek yol bu değil. Tamamen uygulamamız üzerinden bu entegrasyonu yapabilir, ya da tamamen docker kullanarak ve newrelic-admin ile web sunucusunu çalıştırarak gibi farklı farklı yöntemlerle de entegrasyon yapabilirdik. Bu biraz uygulama içinden biraz docker tarafından karma bir yolla olmuş gibi görünüyor. Ancak güzel bir yapılandırma, çünkü özel olarak tüm parametreleri ( .env üzerinden ) yönetebiliyorsunuz. Herhangi bir sorunuz olursa telegram kanalımdan sorabilirsiniz.

Takip Et
En yeni içeriklerden ilk önce haberdar olmak için e-posta adresini kaydet!
Telegram
Telegram kanalımdaki topluluğa katılın!