3.4.3. Log Producer Jpa Data Provider#
Transactional uygulamalarda transactional bütünlüğü sağlamak ve uygulamanın hızını artırmak için outbox pattern kullanılabilir. Bu patternde veriyi üreten kaynak bir RDBMS üzerine transactional biçimde veriyi yazar. Veriyi okuyan kaynak ise RDBMS üzerinden bu datayı alarak işler.
Logları sisteme göndermek için kullanılacak Jpa Data sağlayıcı altyapısıdır. Bu altyapı kullanılarak logların veritabanı üzerinden loglanması sağlanmaktadır. Böylece loglar hem veritabanında bulunmuş olur hem de kafka üzerinden elastic search sistemine aktarılmış olur.
Bağımlılıklar#
Gradle Dependencies
Veritabanı Kurulumu (Liquibase)#
Log Producer Jpa Data Provider paketinin düzgün bir şekilde çalışabilmesi için veritabanı tablolarının oluşturulması gerekmektedir. Eğer liquibase kullanılıyorsa, paket içerisinden gelen liquibase dosyasının, projedeki liquibase dosyasına include edilmesi gerekmektedir.
Örnek liquibase root yaml dosyası aşağıdaki gibidir.
liquibase/logger-producer-jpa-data-provider/changelog-root.yaml
yolundaki dosya, kütüphanenin içinde bulunmaktadır ve liquibase dosyasına bu şekilde include edilerek gerekli veritabanı tablolarının oluşmasını sağlar.
Log Producer Jpa Data Provider Kullanımı#
@HvlEnabledLogProducerJpaDataProvider
anotasyonu konfigürasyon sınıfına eklenmelidir. Sonrasında HvlLogProducerJpaDataProvider
sınıfı inject edilerek kullanılabilir.
Log Processor Kurulumu#
HvlLogProducerJpaDataProvider
sınıfı yardımıyla gönderilen olay kayıtları ilk olarak veritabanındaki {şema_adı}.log_producer_task
tablosuna kaydedilecektir. Bu tablodaki kayıtları işleyip sıradaki adım olan kafka'ya yollaması için Logger Processor uygulamasına ihtiyaç vardır.
Yukarıdaki docker-compose yaml'ına benzer şekilde bir logger processor uygulaması oluşturulmalıdır. Buradaki önemli nokta; oluşturulacak docker compose yaml'ındaki DB_SCHEMA
parametresidir. {şema_adı}.log_producer_task
tablosunun şema adı bilgisi DB_SCHEMA
parametresine verilmesi gerekmektedir.
Bununla ilgili örnek docker-compose kullanımları hvl-infra içerisinde mevcuttur. Eksen uygulamalarını içeren docker-compose yaml'ındaki logger-processor-bpmn-service
ve logger-processor-oauth-service
servisleri incelenebilir. Eksen uygulamalarından da anlaşılacağı üzere Log Producer Jpa Data Provider paketini kullanan uygulamaların kendi logger processor instance'ları bulunmaktadır.
Log processor uygulaması doğru bir şekilde çalıştırıldıktan sonra {şema_adı}.log_producer_task
tablosuna atılan kayıtların logger processor tarafından işlenerek {şema_adı}.log_producer_task_history
tablosuna aktarıldığı görülmelidir. Bu aşamada olay kaydı, kafkadaki varsayılan topic olan javalt-logger-producer-log
topic'ine yazılmış anlamına gelir. Sonrasında fluentd bu topic'i consume ederek olay kayıtlarını elastic-search'e aktaracaktır. Detaylı bilgi ve istek yaşam döngüsü için Logger Processor sayfası incelenebilir.
Olay Kayıtlarının Farklı Bir Şemaya Yazılması#
Log producer jpa data provider paketi, olay kayıtlarının DB_SCHEMA
'da verilen şema dışında başka bir şemaya veri yazabilmektedir.
Bunun yapılabilmesi için config server tarafından sağlanan, hvl-infra
içerisinde bulunan application-hvl-logger.yml
dosyasındaki hvl.logger.producer.provider.jpa.schema
parametresi konfigüre edilmelidir.
hvl:
logger:
producer:
provider:
jpa:
schema: ${LOGGER_JPA_PROVIDER_SCHEMA:${spring.jpa.properties.hibernate.default_schema}}
Yukarıda görüldüğü üzere bu değer uygulama environment'larından LOGGER_JPA_PROVIDER_SCHEMA
label'ı kullanılarak ezilebilir. Varsayılan olarak da DB_SCHEMA
'dan gelen değer kullanılmaktadır. LOGGER_JPA_PROVIDER_SCHEMA
environment'i üzerinden şema verildiği durumda log_producer_task
ve log_producer_task_history
tabloları verilen bu şema altında oluşacaktır ve olay kayıtları bu şema altındaki tablolara yazılacaktır.
Logger Processor
Log processor üzerindeki DB_SCHEMA
parametresi de güncellenmelidir.
Liquibase Önerilir
Farklı şemaya yazılma ihtiyacı durumlarında liquibase kullanılması önerilmektedir. Aksi durumda DDL_AUTO_TYPE
create
veya update
ise logger tabloları yine DB_SCHEMA
'da verilen şema altında oluşacağı için istenmeyen durumlar olabilir. Bu durumda logların yazılması istenen şemada, tabloların doğru bir şekilde oluşturulması gerekir.
History Tablosunun Temizlenmesi#
Olay kayıtları işlendikçe, işlenen kayıtlar log_producer_task_history
tablosuna taşınmaktadır. Zamanla bu tablodaki veriler çoğalacağı için temizleme mekanizması geliştirilmiştir.
hvl:
logger:
producer:
provider:
jpa:
history-cleaner:
enabled: ${LOGGER_JPA_PROVIDER_HISTORY_CLEANER_ENABLED:true}
job-cron: ${LOGGER_JPA_PROVIDER_HISTORY_CLEANER_CRON:0 0 0 * * ?}
ttl-days: ${LOGGER_JPA_PROVIDER_HISTORY_CLEANER_TTL_DAYS:7}
hvl.logger.producer.provider.jpa.history-cleaner.enabled: Job'ın çalışıp çalışmayacağını belirtir.
hvl.logger.producer.provider.jpa.history-cleaner.cron: Job için cron bilgisidir. Varsayılan durumda her gün 00:00'da çalışmaktadır.
hvl.logger.producer.provider.jpa.history-cleaner.ttl-days: Verilen gün değerinden daha eski verilerin silineceği anlamına gelir. Varsayılan değer 7'dir.
Varsayılan durumda her gün 00:00'da 7 günden daha eski olan kayıtları temizlemektedir.
Uyarı
Mevcut durumda hvl-logger-producer-jpa-data-provider
paketini kullanan uygulama tarafından birşey yapılmasına gerek yoktur. Yukarıdaki özellikleri logger processor uygulamasındaki bir job kullanmaktadır ve yapılacak konfigürasyonlara göre periyodik olarak temizlik yapmaktadır.