From 70d15493236129cf52caf5ce0eb6b684182335ca Mon Sep 17 00:00:00 2001 From: Nils Martin Sande Date: Mon, 16 Sep 2024 10:12:49 +0200 Subject: [PATCH] La til metrics for freg status og oppholdstillatelse --- .../paw/arbeidssokerregisteret/Application.kt | 6 ++- .../RequestHandlerFactory.kt | 7 ++- .../application/RequestValidator.kt | 11 ++++- .../application/StartStoppRequestHandler.kt | 1 + .../services/PersonInfoService.kt | 1 + .../services/PersonInfoStats.kt | 46 +++++++++++++++++++ .../arbeidssokerregisteret/TestCaseContext.kt | 5 +- .../application/RequestValidatorTest.kt | 12 +++-- 8 files changed, 78 insertions(+), 11 deletions(-) create mode 100644 apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/services/PersonInfoStats.kt diff --git a/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/Application.kt b/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/Application.kt index c615263b..4acb749f 100644 --- a/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/Application.kt +++ b/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/Application.kt @@ -30,10 +30,12 @@ fun main() { logger.info("Starter ${ApplicationInfo.id}") val applicationConfig = loadNaisOrLocalConfiguration(CONFIG_FILE_NAME) val kafkaConfig = loadNaisOrLocalConfiguration(KAFKA_CONFIG) + val registry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT) val (startStoppRequestHandler, opplysningerRequestHandler) = requestHandlers( config = applicationConfig, kafkaFactory = KafkaFactory(kafkaConfig), - regler = InngangsReglerV1 + regler = InngangsReglerV1, + registry = registry ) val server = embeddedServer( factory = Netty, @@ -45,7 +47,7 @@ fun main() { } ) { module( - registry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT), + registry = registry, authProviders = applicationConfig.authProviders, startStoppRequestHandler = startStoppRequestHandler, opplysningerRequestHandler = opplysningerRequestHandler diff --git a/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/RequestHandlerFactory.kt b/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/RequestHandlerFactory.kt index b4fc9e67..02bae914 100644 --- a/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/RequestHandlerFactory.kt +++ b/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/RequestHandlerFactory.kt @@ -1,6 +1,7 @@ package no.nav.paw.arbeidssokerregisteret import io.ktor.client.* +import io.micrometer.prometheusmetrics.PrometheusMeterRegistry import no.nav.common.token_client.client.AzureAdMachineToMachineTokenClient import no.nav.paw.arbeidssokerregisteret.application.OpplysningerRequestHandler import no.nav.paw.arbeidssokerregisteret.application.Regler @@ -21,7 +22,8 @@ import org.apache.kafka.common.serialization.LongSerializer fun requestHandlers( config: Config, kafkaFactory: KafkaFactory, - regler: Regler + regler: Regler, + registry: PrometheusMeterRegistry ): Pair { val clients = with(azureAdM2MTokenClient(config.naisEnv, config.authProviders.azure)) { clientsFactory(config) @@ -35,7 +37,8 @@ fun requestHandlers( val requestValidator = RequestValidator( autorisasjonService = AutorisasjonService(clients.poaoTilgangClient), personInfoService = PersonInfoService(clients.pdlClient), - regler = regler + regler = regler, + registry = registry ) val startStoppRequestHandler = StartStoppRequestHandler( hendelseTopic = config.eventLogTopic, diff --git a/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/RequestValidator.kt b/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/RequestValidator.kt index 6675e772..0715b6fe 100644 --- a/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/RequestValidator.kt +++ b/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/RequestValidator.kt @@ -3,6 +3,7 @@ package no.nav.paw.arbeidssokerregisteret.application import arrow.core.Either import arrow.core.NonEmptyList import arrow.core.flatMap +import io.micrometer.prometheusmetrics.PrometheusMeterRegistry import io.opentelemetry.instrumentation.annotations.WithSpan import no.nav.paw.arbeidssokerregisteret.RequestScope import no.nav.paw.arbeidssokerregisteret.application.authfaktka.navAnsattTilgangFakta @@ -12,12 +13,15 @@ import no.nav.paw.arbeidssokerregisteret.application.regler.TilgangsRegler import no.nav.paw.arbeidssokerregisteret.domain.Identitetsnummer import no.nav.paw.arbeidssokerregisteret.services.AutorisasjonService import no.nav.paw.arbeidssokerregisteret.services.PersonInfoService +import no.nav.paw.arbeidssokerregisteret.services.personInfoStats +import no.nav.paw.arbeidssokerregisteret.utils.logger import no.nav.paw.pdl.graphql.generated.hentperson.Person class RequestValidator( private val autorisasjonService: AutorisasjonService, private val personInfoService: PersonInfoService, - private val regler: Regler + private val regler: Regler, + private val registry: PrometheusMeterRegistry ) { context(RequestScope) @@ -46,6 +50,11 @@ class RequestValidator( .flatMap { grunnlagForGodkjentAuth -> val person = personInfoService.hentPersonInfo(identitetsnummer.verdi) val opplysning = person?.let { genererPersonFakta(it) } ?: setOf(DomeneOpplysning.PersonIkkeFunnet) + try { + person?.let { p -> registry.personInfoStats(p, opplysning) } + } catch (ex: Exception) { + logger.warn("Feil under stats generering", ex) + } regler.evaluer( opplysning + grunnlagForGodkjentAuth.opplysning ) diff --git a/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/StartStoppRequestHandler.kt b/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/StartStoppRequestHandler.kt index 3b6ad27f..11e09f5f 100644 --- a/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/StartStoppRequestHandler.kt +++ b/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/StartStoppRequestHandler.kt @@ -2,6 +2,7 @@ package no.nav.paw.arbeidssokerregisteret.application import arrow.core.Either import arrow.core.NonEmptyList +import io.micrometer.prometheusmetrics.PrometheusMeterRegistry import io.opentelemetry.instrumentation.annotations.WithSpan import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope diff --git a/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/services/PersonInfoService.kt b/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/services/PersonInfoService.kt index 26989998..6c6dffe6 100644 --- a/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/services/PersonInfoService.kt +++ b/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/services/PersonInfoService.kt @@ -1,5 +1,6 @@ package no.nav.paw.arbeidssokerregisteret.services +import io.micrometer.prometheusmetrics.PrometheusMeterRegistry import kotlinx.coroutines.channels.ClosedReceiveChannelException import no.nav.paw.arbeidssokerregisteret.RequestScope import no.nav.paw.arbeidssokerregisteret.plugins.InternFeilkode diff --git a/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/services/PersonInfoStats.kt b/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/services/PersonInfoStats.kt new file mode 100644 index 00000000..0213c09f --- /dev/null +++ b/apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/services/PersonInfoStats.kt @@ -0,0 +1,46 @@ +package no.nav.paw.arbeidssokerregisteret.services + +import io.micrometer.core.instrument.Tag +import io.micrometer.prometheusmetrics.PrometheusMeterRegistry +import no.nav.paw.arbeidssokerregisteret.application.opplysninger.DomeneOpplysning +import no.nav.paw.arbeidssokerregisteret.application.opplysninger.Opplysning +import no.nav.paw.pdl.graphql.generated.hentperson.Person +import java.time.LocalDate +import java.time.temporal.ChronoUnit + +fun PrometheusMeterRegistry.personInfoStats(person: Person, opplysninger: Collection) { + val tags = listOf( + Tag.of("bosatt", opplysninger.contains(DomeneOpplysning.BosattEtterFregLoven).toString()), + Tag.of( + "oppholdstillatelse", + opplysninger.find { it.id.contains("Oppholdstillatelse", ignoreCase = true) }?.id ?: "null" + ), + Tag.of( + "dager_siden_oppholdstillatelse_start", + person.opphold.firstOrNull()?.oppholdFra?.let(LocalDate::parse)?.let(::daysBetweenNow)?.let(::asBucket) ?: "null" + ), + Tag.of( + "dager_til_oppholdstillatelse_stopp", + person.opphold.firstOrNull()?.oppholdTil?.let(LocalDate::parse)?.let(::daysBetweenNow)?.let(::asBucket) ?: "null" + ), + Tag.of( + "avtale_land", (opplysninger.contains(DomeneOpplysning.ErEuEoesStatsborger) || opplysninger.contains(DomeneOpplysning.ErGbrStatsborger)).toString() + ) + ) + counter("paw_arbeidssoeker_inngang_opplysninger", tags) +} + +fun daysBetweenNow(then: LocalDate): Long { + val now = LocalDate.now() + return ChronoUnit.DAYS.between(now, then) +} + +fun asBucket(number: Long): String = + when { + number < 14 -> "[0, 14>" + number < 28 -> "[14-28>" + number < 56 -> "[28-56>" + number < 112 -> "[56-112>" + number < 224 -> "[112-224>" + else -> "[224-" + } \ No newline at end of file diff --git a/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/TestCaseContext.kt b/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/TestCaseContext.kt index b8344c0e..0933d321 100644 --- a/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/TestCaseContext.kt +++ b/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/TestCaseContext.kt @@ -1,5 +1,7 @@ package no.nav.paw.arbeidssokerregisteret +import io.micrometer.prometheusmetrics.PrometheusConfig +import io.micrometer.prometheusmetrics.PrometheusMeterRegistry import io.mockk.mockk import no.nav.paw.arbeidssokerregisteret.application.Regler import no.nav.paw.arbeidssokerregisteret.application.RequestValidator @@ -34,7 +36,8 @@ fun initTestCaseContext(regler: Regler): TestCaseContext { requestValidator = RequestValidator( autorisasjonService = autorisasjonService, personInfoService = personInfoService, - regler = regler + regler = regler, + registry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT) ), producer = producer, kafkaKeysClient = kafkaKeys diff --git a/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/application/RequestValidatorTest.kt b/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/application/RequestValidatorTest.kt index 197fa2f4..23f11119 100644 --- a/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/application/RequestValidatorTest.kt +++ b/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/application/RequestValidatorTest.kt @@ -7,6 +7,8 @@ import io.kotest.matchers.collections.shouldContain import io.kotest.matchers.collections.shouldNotContain import io.kotest.matchers.shouldBe import io.kotest.matchers.types.shouldBeInstanceOf +import io.micrometer.prometheusmetrics.PrometheusConfig +import io.micrometer.prometheusmetrics.PrometheusMeterRegistry import io.mockk.coEvery import io.mockk.mockk import no.nav.paw.arbeidssokerregisteret.RequestScope @@ -28,7 +30,7 @@ import java.util.* class RequestValidatorTest : FreeSpec({ "Tester requestvalidator" - { - + val registry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT) val identitsnummer = Identitetsnummer("12345678909") val personInfoService: PersonInfoService = mockk() "Når veileder er logget inn" - { @@ -47,7 +49,7 @@ class RequestValidatorTest : FreeSpec({ coEvery { autorisasjonService.verifiserVeilederTilgangTilBruker(any(), any()) } returns true - val requestValidator = RequestValidator(autorisasjonService, personInfoService, InngangsReglerV2) + val requestValidator = RequestValidator(autorisasjonService, personInfoService, InngangsReglerV2, registry) "Når forhandsgodkjent av veileder er false" { val tilgangskontrollresultat = with(requestScope) { requestValidator.validerTilgang(identitsnummer) @@ -68,7 +70,7 @@ class RequestValidatorTest : FreeSpec({ coEvery { autorisasjonService.verifiserVeilederTilgangTilBruker(any(), any()) } returns false - val requestValidator = RequestValidator(autorisasjonService, personInfoService, InngangsReglerV2) + val requestValidator = RequestValidator(autorisasjonService, personInfoService, InngangsReglerV2, registry) val tilgangskontrollresultat = with(requestScope) { requestValidator.validerTilgang(identitsnummer) @@ -86,7 +88,7 @@ class RequestValidatorTest : FreeSpec({ path = "test" ) val autorisasjonService: AutorisasjonService = mockk() - val requestValidator = RequestValidator(autorisasjonService, personInfoService, InngangsReglerV2) + val requestValidator = RequestValidator(autorisasjonService, personInfoService, InngangsReglerV2, registry) "standardbruker" { val tilgangskontrollresultat = with(requestScope) { requestValidator.validerTilgang(identitsnummer) @@ -110,7 +112,7 @@ class RequestValidatorTest : FreeSpec({ "Når bruker er innlogget" - { val autorisasjonService: AutorisasjonService = mockk() - val requestValidator = RequestValidator(autorisasjonService, personInfoService, InngangsReglerV2) + val requestValidator = RequestValidator(autorisasjonService, personInfoService, InngangsReglerV2, registry) "over 18 år og bosatt etter folketrygdloven" - { val requestScope = RequestScope( claims = ResolvedClaims()