From 41e4bddc4b73ebc08481bef1064639ce65a9b0f8 Mon Sep 17 00:00:00 2001 From: Jakob Havstein Eriksen Date: Mon, 24 Jun 2024 12:00:34 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=8A=20Logg=20hva=20som=20ble=20endret?= =?UTF-8?q?=20p=C3=A5=20lagrede=20generasjoner?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Så vi kan få innblikk i hvordan dette går for seg ute i virkeligheten, og skaffe innsikt til tuning av databaseoperasjoner. Co-authored-by: Christian Bülow Skovborg --- .../vedtaksperiode/GenerasjonRepository.kt | 59 ++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/spesialist-selve/src/main/kotlin/no/nav/helse/modell/vedtaksperiode/GenerasjonRepository.kt b/spesialist-selve/src/main/kotlin/no/nav/helse/modell/vedtaksperiode/GenerasjonRepository.kt index 4357bb7da..dd9c3e456 100644 --- a/spesialist-selve/src/main/kotlin/no/nav/helse/modell/vedtaksperiode/GenerasjonRepository.kt +++ b/spesialist-selve/src/main/kotlin/no/nav/helse/modell/vedtaksperiode/GenerasjonRepository.kt @@ -5,6 +5,8 @@ import kotliquery.sessionOf import no.nav.helse.mediator.builders.GenerasjonBuilder import no.nav.helse.modell.VedtakDao import no.nav.helse.modell.person.vedtaksperiode.IVedtaksperiodeObserver +import no.nav.helse.modell.person.vedtaksperiode.VarselDto +import org.slf4j.LoggerFactory import java.time.LocalDate import java.util.UUID import javax.sql.DataSource @@ -12,6 +14,9 @@ import javax.sql.DataSource internal class GenerasjonRepository(private val dataSource: DataSource) : IVedtaksperiodeObserver { private val dao = GenerasjonDao(dataSource) private val vedtakDao = VedtakDao(dataSource) + private var hentedeGenerasjoner: List = emptyList() + + private val sikkerLogger = LoggerFactory.getLogger("tjenestekall") internal fun brukVedtaksperiode( fødselsnummer: String, @@ -53,7 +58,7 @@ internal class GenerasjonRepository(private val dataSource: DataSource) : IVedta private fun TransactionalSession.finnGenerasjoner(vedtaksperiodeId: UUID): List { return with(dao) { - finnGenerasjoner(vedtaksperiodeId) + finnGenerasjoner(vedtaksperiodeId).also { hentedeGenerasjoner = it } } } @@ -65,6 +70,8 @@ internal class GenerasjonRepository(private val dataSource: DataSource) : IVedta lagreVedtaksperiode(fødselsnummer, vedtaksperiode) } with(dao) { + loggDiffMellomHentetOgSkalLagres(vedtaksperiode) + hentedeGenerasjoner = emptyList() vedtaksperiode.generasjoner.forEach { generasjonDto -> lagreGenerasjon(generasjonDto) } @@ -74,6 +81,56 @@ internal class GenerasjonRepository(private val dataSource: DataSource) : IVedta } } + private fun loggDiffMellomHentetOgSkalLagres(vedtaksperiode: VedtaksperiodeDto) { + val antallHentet = hentedeGenerasjoner.size + if (antallHentet == 0) return + val generasjonerForLagring = vedtaksperiode.generasjoner + val antallNå = generasjonerForLagring.size + val builder = + StringBuilder().appendLine( + "Hentet $antallHentet generasjon(er) for ${vedtaksperiode.vedtaksperiodeId}, skal lagre $antallNå.", + ) + + if (antallHentet == antallNå) { + val nyesteHentet = hentedeGenerasjoner.last() + val nyesteSkalLagres = generasjonerForLagring.last() + val nyesteErEendret = nyesteHentet != nyesteSkalLagres + builder.appendLine("Ingen generasjoner ble lagt til. Nyeste versjon ble endret: $nyesteErEendret") + if (nyesteErEendret) { + builder.appendLine() + } + builder.diffMellomToGenerasjoner(nyesteHentet, nyesteSkalLagres) + } + val hentedeBortsettFraSiste = hentedeGenerasjoner.dropLast(1) + if (hentedeBortsettFraSiste.isNotEmpty()) { + val historiskeForLagring = generasjonerForLagring.take(hentedeBortsettFraSiste.size) + val historiskeErUlike = hentedeBortsettFraSiste != historiskeForLagring + if (historiskeErUlike) { + builder.appendLine("Historiske generasjoner ble endret") + builder.appendLine(" før - etter:") + hentedeGenerasjoner.zip(historiskeForLagring).forEach { (hentet, skalLagres) -> + builder.diffMellomToGenerasjoner(hentet, skalLagres) + } + } else { + builder.appendLine("Historiske generasjoner ble ikke endret") + } + } + sikkerLogger.info(builder.toString()) + } + + private fun StringBuilder.diffMellomToGenerasjoner( + hentet: GenerasjonDto, + skalLagres: GenerasjonDto, + ) { + appendLine(" utbetaling: ${hentet.utbetalingId} - ${skalLagres.utbetalingId}") + appendLine(" varsler: ${hentet.varsler.map { it.varselkode }} - ${skalLagres.varsler.map(VarselDto::varselkode)}") + appendLine(" tags: ${hentet.tags} - ${skalLagres.tags}") + appendLine(" fom: ${hentet.fom} - ${skalLagres.fom}") + appendLine(" tom: ${hentet.tom} - ${skalLagres.tom}") + appendLine(" tilstand: ${hentet.tilstand} - ${skalLagres.tilstand}") + appendLine(" skj.tidspkt: ${hentet.skjæringstidspunkt} - ${skalLagres.skjæringstidspunkt}") + } + internal fun byggGenerasjon( vedtaksperiodeId: UUID, generasjonBuilder: GenerasjonBuilder,