Ana içeriğe geç

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

api (
    [group: 'tr.com.havelsan.framework.logger', name: 'hvl-logger-producer-jpa-data-provider'],
)

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.

databaseChangeLog:
  - include:
      file: liquibase/logger-producer-jpa-data-provider/changelog-root.yaml

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.