From dd2c3208de0c143ee5a06c0c7696d3f46cbd0a69 Mon Sep 17 00:00:00 2001 From: Henrik Gundersen Date: Wed, 15 Jan 2025 15:39:33 +0100 Subject: [PATCH] Forbedrer logging i etterlatte-hendelser-ufoere og fikser integrasjonstest --- .../hendelserufoere/UfoereHendelseFordeler.kt | 45 ++++++++---- .../common/UfoerehendelseKonsument.kt | 13 +++- .../kotlin/hendelserufoere/IntegrationTest.kt | 36 ---------- .../UfoereHendelseFordelerTest.kt | 34 +++++++-- .../UfoereHendelseIntegrationTest.kt | 72 +++++++++++++++++++ 5 files changed, 140 insertions(+), 60 deletions(-) delete mode 100644 apps/etterlatte-hendelser-ufoere/src/test/kotlin/hendelserufoere/IntegrationTest.kt create mode 100644 apps/etterlatte-hendelser-ufoere/src/test/kotlin/hendelserufoere/UfoereHendelseIntegrationTest.kt diff --git a/apps/etterlatte-hendelser-ufoere/src/main/kotlin/hendelserufoere/UfoereHendelseFordeler.kt b/apps/etterlatte-hendelser-ufoere/src/main/kotlin/hendelserufoere/UfoereHendelseFordeler.kt index 51174cb6b02..0ab51b6936d 100644 --- a/apps/etterlatte-hendelser-ufoere/src/main/kotlin/hendelserufoere/UfoereHendelseFordeler.kt +++ b/apps/etterlatte-hendelser-ufoere/src/main/kotlin/hendelserufoere/UfoereHendelseFordeler.kt @@ -1,7 +1,9 @@ package no.nav.etterlatte.hendelserufoere import no.nav.etterlatte.BehandlingKlient +import no.nav.etterlatte.libs.common.logging.sikkerlogger import no.nav.etterlatte.libs.common.person.maskerFnr +import no.nav.etterlatte.libs.common.toJson import org.slf4j.Logger import org.slf4j.LoggerFactory import java.time.temporal.ChronoUnit @@ -13,37 +15,52 @@ class UfoereHendelseFordeler( suspend fun haandterHendelse(hendelse: UfoereHendelse) { try { - val attenAarIMaaneder = 12 * 18 - val tjueenAarIMaaneder = 12 * 21 + logger.info("Mottok hendelse for vedtak av type ${hendelse.vedtaksType} for bruker ${hendelse.personIdent.maskerFnr()}") + sikkerlogger().info("Mottok hendelse for vedtak av type ${hendelse.vedtaksType} for bruker ${hendelse.personIdent}") - val alderVedVirkningstidspunkt = ChronoUnit.MONTHS.between(hendelse.fodselsdato, hendelse.virkningsdato) + val alderIMaanederVedVirkningstidspunkt = ChronoUnit.MONTHS.between(hendelse.fodselsdato, hendelse.virkningsdato) + val alderIAarVedVirkningstidspunkt = ChronoUnit.YEARS.between(hendelse.fodselsdato, hendelse.virkningsdato) - if (alderVedVirkningstidspunkt in attenAarIMaaneder..tjueenAarIMaaneder) { - logger.info("Bruker er mellom 18 og 21 på på virkningstidspunktet. Sender ufoerehendelse til behandling") - behandlingKlient.postTilBehandling( - ufoereHendelse = hendelse, + // Skal inkludere personer fra og med måneden de fyller 18 år og til og med måneden de fyller 21 år + if (alderIMaanederVedVirkningstidspunkt in ATTEN_AAR_I_MAANEDER..TJUEEN_AAR_I_MAANEDER) { + logger.info( + "Bruker er mellom 18 og 21 år på virkningstidspunktet (alderIAarVedVirkningstidspunkt = " + + "$alderIAarVedVirkningstidspunkt, alderIMaanederVedVirkningstidspunkt = " + + "$alderIMaanederVedVirkningstidspunkt). Hendelse sendes videre til behandling for sjekk mot " + + "løpende barnepensjonssaker.", ) + behandlingKlient.postTilBehandling(hendelse) } else { logger.info( - "Ufoerehendelse med personidentifikator=${hendelse.personIdent.maskerFnr()} " + - "og alderVedVirkningstidspunkt=$alderVedVirkningstidspunkt " + - "er ikke innenfor aldersgruppen 18-21. Hendelsen blir ikke sendt videre.", + "Hendelse ignoreres da bruker ikke er innenfor intervallet som kvalifiserer for barnepensjon " + + "(alderIAarVedVirkningstidspunkt = $alderIAarVedVirkningstidspunkt, " + + "alderIMaanederVedVirkningstidspunkt = $alderIMaanederVedVirkningstidspunkt).", ) } } catch (e: Exception) { - loggFeilVedHaandteringAvHendelse(hendelse.vedtaksType.name, e) + loggFeilVedHaandteringAvHendelse(hendelse, e) throw e } } private fun loggFeilVedHaandteringAvHendelse( - hendelsestype: String?, + hendelse: UfoereHendelse, e: Exception, ) { logger.error( - "Kunne ikke haandtere $hendelsestype. Dette skyldes sannsynligvis at " + - "ufoerehendelsen ser annerledes ut enn forventet.", + "Kunne ikke håndtere hendelse for ${hendelse.personIdent.maskerFnr()}. " + + "Dette skyldes sannsynligvis at hendelsen ser annerledes ut enn forventet. Se sikkerlogg for detaljer.", + e, + ) + sikkerlogger().error( + "Kunne ikke håndtere hendelse for ${hendelse.personIdent}. Dette skyldes sannsynligvis at " + + "hendelsen ser annerledes ut enn forventet: ${hendelse.toJson()}", e, ) } + + private companion object { + private const val ATTEN_AAR_I_MAANEDER = 12 * 18 + private const val TJUEEN_AAR_I_MAANEDER = 12 * 21 + } } diff --git a/apps/etterlatte-hendelser-ufoere/src/main/kotlin/hendelserufoere/common/UfoerehendelseKonsument.kt b/apps/etterlatte-hendelser-ufoere/src/main/kotlin/hendelserufoere/common/UfoerehendelseKonsument.kt index 6ad896c22bc..7d4d994dfcf 100644 --- a/apps/etterlatte-hendelser-ufoere/src/main/kotlin/hendelserufoere/common/UfoerehendelseKonsument.kt +++ b/apps/etterlatte-hendelser-ufoere/src/main/kotlin/hendelserufoere/common/UfoerehendelseKonsument.kt @@ -7,6 +7,7 @@ import no.nav.etterlatte.hendelserufoere.UfoereHendelse import no.nav.etterlatte.hendelserufoere.UfoereHendelseFordeler import no.nav.etterlatte.kafka.Kafkakonsument import no.nav.etterlatte.libs.common.deserialize +import no.nav.etterlatte.libs.common.logging.sikkerlogger import org.apache.kafka.clients.consumer.KafkaConsumer import org.slf4j.LoggerFactory import java.time.Duration @@ -26,10 +27,16 @@ class UfoerehendelseKonsument( stream { hendelser -> runBlocking { val ventbareHendelser = - hendelser.map { + hendelser.map { hendelse -> async(context = Dispatchers.Default) { - val ufoereHendelse: UfoereHendelse = deserialize(it.value()) - ufoereHendelseFordeler.haandterHendelse(ufoereHendelse) + try { + val ufoereHendelse: UfoereHendelse = deserialize(hendelse.value()) + ufoereHendelseFordeler.haandterHendelse(ufoereHendelse) + } catch (e: Exception) { + logger.error("Feilet ved innlesing av uførehendelse. Se sikkerlogg for detaljer.") + sikkerlogger().error("Feilet ved innlesing av uførehendelse: ${hendelse.value()}") + throw e + } } } ventbareHendelser.forEach { it.await() } diff --git a/apps/etterlatte-hendelser-ufoere/src/test/kotlin/hendelserufoere/IntegrationTest.kt b/apps/etterlatte-hendelser-ufoere/src/test/kotlin/hendelserufoere/IntegrationTest.kt deleted file mode 100644 index 13e9021481b..00000000000 --- a/apps/etterlatte-hendelser-ufoere/src/test/kotlin/hendelserufoere/IntegrationTest.kt +++ /dev/null @@ -1,36 +0,0 @@ -package no.nav.etterlatte.hendelserufoere - -import io.confluent.kafka.serializers.KafkaAvroDeserializer -import io.mockk.mockk -import no.nav.etterlatte.BehandlingKlient -import no.nav.etterlatte.hendelserufoere.common.UfoerehendelseKonsument -import no.nav.etterlatte.kafka.KafkaConsumerEnvironmentTest -import no.nav.etterlatte.kafka.KafkaContainerHelper.Companion.kafkaContainer -import no.nav.etterlatte.lesHendelserFraUfoere -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.TestInstance - -@TestInstance(TestInstance.Lifecycle.PER_METHOD) -class IntegrationTest { - private val behandlingKlient = mockk() - - @Test - fun `skal opprette ufoerehendelse paa ufoere, konsumere den, håndtere den og sende videre`() { - val ufoerehendelseKonsument = - UfoerehendelseKonsument( - UFOERE_TOPIC, - KafkaConsumerEnvironmentTest().konfigurer( - kafkaContainer, - KafkaAvroDeserializer::class.java.canonicalName, - ), - UfoereHendelseFordeler(behandlingKlient), - ) - - lesHendelserFraUfoere(ufoerehendelseKonsument) - } - - companion object { - const val UFOERE_TOPIC = "ufoere-topic" - private val kafkaContainer = kafkaContainer(UFOERE_TOPIC) - } -} diff --git a/apps/etterlatte-hendelser-ufoere/src/test/kotlin/hendelserufoere/UfoereHendelseFordelerTest.kt b/apps/etterlatte-hendelser-ufoere/src/test/kotlin/hendelserufoere/UfoereHendelseFordelerTest.kt index cdedb4691b5..64632b89a81 100644 --- a/apps/etterlatte-hendelser-ufoere/src/test/kotlin/hendelserufoere/UfoereHendelseFordelerTest.kt +++ b/apps/etterlatte-hendelser-ufoere/src/test/kotlin/hendelserufoere/UfoereHendelseFordelerTest.kt @@ -5,6 +5,7 @@ import io.mockk.coVerify import io.mockk.mockk import kotlinx.coroutines.runBlocking import no.nav.etterlatte.BehandlingKlient +import no.nav.etterlatte.libs.testdata.grunnlag.SOEKER_FOEDSELSNUMMER import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import java.time.LocalDate @@ -24,7 +25,7 @@ internal class UfoereHendelseFordelerTest { val ufoereHendelse = UfoereHendelse( - personIdent = "12312312312", + personIdent = SOEKER_FOEDSELSNUMMER.value, virkningsdato = LocalDate.parse("2018-01-01"), fodselsdato = LocalDate.parse("2000-01-01"), vedtaksType = VedtaksType.INNV, @@ -38,12 +39,12 @@ internal class UfoereHendelseFordelerTest { } @Test - fun `skal håndtere ufoerehendelse der bruker fyller 21 på virkningstidspunkt`() { + fun `skal håndtere ufoerehendelse der bruker fyller 21 i måneden for virkningstidspunkt`() { coEvery { behandlingKlient.postTilBehandling(any()) } returns Unit val ufoereHendelse = UfoereHendelse( - personIdent = "12312312312", + personIdent = SOEKER_FOEDSELSNUMMER.value, virkningsdato = LocalDate.parse("2021-01-01"), fodselsdato = LocalDate.parse("2000-01-01"), vedtaksType = VedtaksType.INNV, @@ -57,17 +58,36 @@ internal class UfoereHendelseFordelerTest { } @Test - fun `skal ignorere ufoerehendelse der bruker ikke er mellom og 18 og 21 på virkningstidspunkt`() { + fun `skal ignorere ufoerehendelse der bruker er 21 år og 1 mnd på virkningstidspunkt`() { val ufoereHendelse = UfoereHendelse( - personIdent = "12312312312", - virkningsdato = LocalDate.parse("2021-01-01"), - fodselsdato = LocalDate.parse("1980-01-01"), + personIdent = SOEKER_FOEDSELSNUMMER.value, + virkningsdato = LocalDate.parse("2021-02-01"), + fodselsdato = LocalDate.parse("2000-01-01"), + vedtaksType = VedtaksType.INNV, + ) + + runBlocking { + ufoereHendelseFordeler.haandterHendelse(ufoereHendelse) + } + + coVerify(exactly = 0) { behandlingKlient.postTilBehandling(any()) } + } + + @Test + fun `skal ignorere ufoerehendelse der bruker er 17 år og 11 mnd på virkningstidspunkt`() { + val ufoereHendelse = + UfoereHendelse( + personIdent = SOEKER_FOEDSELSNUMMER.value, + virkningsdato = LocalDate.parse("2017-12-01"), + fodselsdato = LocalDate.parse("2000-01-01"), vedtaksType = VedtaksType.INNV, ) runBlocking { ufoereHendelseFordeler.haandterHendelse(ufoereHendelse) } + + coVerify(exactly = 0) { behandlingKlient.postTilBehandling(any()) } } } diff --git a/apps/etterlatte-hendelser-ufoere/src/test/kotlin/hendelserufoere/UfoereHendelseIntegrationTest.kt b/apps/etterlatte-hendelser-ufoere/src/test/kotlin/hendelserufoere/UfoereHendelseIntegrationTest.kt new file mode 100644 index 00000000000..6eb9cd98e9b --- /dev/null +++ b/apps/etterlatte-hendelser-ufoere/src/test/kotlin/hendelserufoere/UfoereHendelseIntegrationTest.kt @@ -0,0 +1,72 @@ +package no.nav.etterlatte.hendelserufoere + +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.confirmVerified +import io.mockk.just +import io.mockk.mockk +import io.mockk.runs +import no.nav.etterlatte.BehandlingKlient +import no.nav.etterlatte.hendelserufoere.common.UfoerehendelseKonsument +import no.nav.etterlatte.kafka.KafkaConsumerEnvironmentTest +import no.nav.etterlatte.kafka.KafkaContainerHelper.Companion.SCHEMA_REGISTRY_URL +import no.nav.etterlatte.kafka.KafkaContainerHelper.Companion.kafkaContainer +import no.nav.etterlatte.kafka.KafkaProducerTestImpl +import no.nav.etterlatte.lesHendelserFraUfoere +import no.nav.etterlatte.libs.common.toJson +import no.nav.etterlatte.libs.testdata.grunnlag.SOEKER_FOEDSELSNUMMER +import org.apache.kafka.common.serialization.StringDeserializer +import org.apache.kafka.common.serialization.StringSerializer +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.TestInstance +import java.time.LocalDate + +@TestInstance(TestInstance.Lifecycle.PER_METHOD) +internal class UfoereHendelseIntegrationTest { + private val behandlingKlient = mockk() + + @Test + fun `skal opprette ufoerehendelse paa topicen, konsumere den, og sende videre til behandling`() { + coEvery { behandlingKlient.postTilBehandling(any()) } just runs + + val ufoerehendelseKonsument = + UfoerehendelseKonsument( + UFOERE_TOPIC, + KafkaConsumerEnvironmentTest().konfigurer( + kafkaContainer, + StringDeserializer::class.java.canonicalName, + ), + UfoereHendelseFordeler(behandlingKlient), + ) + + val ufoerehendelseProdusent = + KafkaProducerTestImpl( + kafkaContainer, + serialiseringsklasse = StringSerializer::class.java.canonicalName, + schemaRegistryUrl = SCHEMA_REGISTRY_URL, + ) + + val hendelse = + UfoereHendelse( + personIdent = SOEKER_FOEDSELSNUMMER.value, + fodselsdato = LocalDate.parse("2000-01-01"), + virkningsdato = LocalDate.parse("2020-01-01"), + vedtaksType = VedtaksType.INNV, + ) + + ufoerehendelseProdusent.sendMelding(UFOERE_TOPIC, "test-key", hendelse.toJson()) + + lesHendelserFraUfoere(ufoerehendelseKonsument) + + coVerify(exactly = 1, timeout = 5000) { + behandlingKlient.postTilBehandling(hendelse) + } + + confirmVerified(behandlingKlient) + } + + private companion object { + private const val UFOERE_TOPIC = "ufoere-topic" + private val kafkaContainer = kafkaContainer(UFOERE_TOPIC) + } +}