Skip to content

Commit

Permalink
Flytt alle metrikkdefinisjoner til egen fil (#697)
Browse files Browse the repository at this point in the history
  • Loading branch information
bjerga authored Oct 4, 2024
1 parent 3377833 commit 05ed769
Show file tree
Hide file tree
Showing 14 changed files with 177 additions and 218 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisConnection
import no.nav.helsearbeidsgiver.felles.rapidsrivers.registerShutdownLifecycle
import no.nav.helsearbeidsgiver.inntektsmelding.api.aktiveorgnr.aktiveOrgnrRoute
import no.nav.helsearbeidsgiver.inntektsmelding.api.auth.Tilgangskontroll
import no.nav.helsearbeidsgiver.inntektsmelding.api.hentforespoersel.hentForespoerselRoute
import no.nav.helsearbeidsgiver.inntektsmelding.api.hentforespoerselIdListe.hentForespoerselIdListeRoute
import no.nav.helsearbeidsgiver.inntektsmelding.api.hentforespoersel.hentForespoersel
import no.nav.helsearbeidsgiver.inntektsmelding.api.hentforespoerselIdListe.hentForespoerselIdListe
import no.nav.helsearbeidsgiver.inntektsmelding.api.hentselvbestemtim.hentSelvbestemtImRoute
import no.nav.helsearbeidsgiver.inntektsmelding.api.innsending.innsendingRoute
import no.nav.helsearbeidsgiver.inntektsmelding.api.innsending.innsending
import no.nav.helsearbeidsgiver.inntektsmelding.api.inntekt.inntektRoute
import no.nav.helsearbeidsgiver.inntektsmelding.api.inntektselvbestemt.inntektSelvbestemtRoute
import no.nav.helsearbeidsgiver.inntektsmelding.api.kvittering.kvitteringRoute
import no.nav.helsearbeidsgiver.inntektsmelding.api.kvittering.kvittering
import no.nav.helsearbeidsgiver.inntektsmelding.api.lagreselvbestemtim.lagreSelvbestemtImRoute
import no.nav.helsearbeidsgiver.inntektsmelding.api.tilgang.TilgangProducer
import no.nav.helsearbeidsgiver.inntektsmelding.api.tilgangorgnr.tilgangOrgnrRoute
Expand Down Expand Up @@ -116,12 +116,12 @@ fun Application.apiModule(

authenticate {
route(Routes.PREFIX) {
hentForespoerselRoute(rapid, tilgangskontroll, redisConnection)
hentForespoerselIdListeRoute(rapid, tilgangskontroll, redisConnection)
hentForespoersel(rapid, tilgangskontroll, redisConnection)
hentForespoerselIdListe(rapid, tilgangskontroll, redisConnection)
inntektRoute(rapid, tilgangskontroll, redisConnection)
inntektSelvbestemtRoute(rapid, tilgangskontroll, redisConnection)
innsendingRoute(rapid, tilgangskontroll, redisConnection)
kvitteringRoute(rapid, tilgangskontroll, redisConnection)
innsending(rapid, tilgangskontroll, redisConnection)
kvittering(rapid, tilgangskontroll, redisConnection)
lagreSelvbestemtImRoute(rapid, tilgangskontroll, redisConnection)
hentSelvbestemtImRoute(rapid, tilgangskontroll, redisConnection)
aktiveOrgnrRoute(rapid, redisConnection)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
package no.nav.helsearbeidsgiver.inntektsmelding.api

import io.ktor.http.ContentType
import io.ktor.server.application.Application
import io.ktor.server.application.call
import io.ktor.server.response.respondText
import io.ktor.server.response.respondTextWriter
import io.ktor.server.routing.get
import io.ktor.server.routing.routing
import io.prometheus.client.CollectorRegistry
import io.prometheus.client.exporter.common.TextFormat
import no.nav.helsearbeidsgiver.felles.metrics.Metrics

fun Application.helsesjekkerRouting() {
routing {
Expand All @@ -25,8 +23,8 @@ fun Application.helsesjekkerRouting() {
?.toSet()
.orEmpty()

call.respondTextWriter(ContentType.parse(TextFormat.CONTENT_TYPE_004)) {
TextFormat.write004(this, CollectorRegistry.defaultRegistry.filteredMetricFamilySamples(names))
call.respondTextWriter(Metrics.Expose.contentType004) {
Metrics.Expose.filteredMetricsWrite004(this, names)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@ import io.ktor.http.HttpStatusCode
import io.ktor.server.application.call
import io.ktor.server.routing.Route
import io.ktor.server.routing.post
import io.prometheus.client.Summary
import kotlinx.serialization.builtins.serializer
import no.nav.helse.rapids_rivers.RapidsConnection
import no.nav.helsearbeidsgiver.felles.domene.HentForespoerselResultat
import no.nav.helsearbeidsgiver.felles.domene.ResultJson
import no.nav.helsearbeidsgiver.felles.metrics.Metrics
import no.nav.helsearbeidsgiver.felles.metrics.recordTime
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisConnection
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisPrefix
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisStore
Expand All @@ -30,74 +31,66 @@ import no.nav.helsearbeidsgiver.utils.json.fromJson
import no.nav.helsearbeidsgiver.utils.json.toJson
import java.util.UUID

fun Route.hentForespoerselRoute(
fun Route.hentForespoersel(
rapid: RapidsConnection,
tilgangskontroll: Tilgangskontroll,
redisConnection: RedisConnection,
) {
val hentForespoerselProducer = HentForespoerselProducer(rapid)
val redisPoller = RedisStore(redisConnection, RedisPrefix.HentForespoersel).let(::RedisPoller)

val requestLatency =
Summary
.build()
.name("simba_hent_forespoersel_latency_seconds")
.help("hent forespoersel endpoint latency in seconds")
.register()

post(Routes.HENT_FORESPOERSEL) {
val transaksjonId = UUID.randomUUID()

val requestTimer = requestLatency.startTimer()
runCatching {
receive(HentForespoerselRequest.serializer())
}.onSuccess { request ->
logger.info("Henter data for uuid: ${request.uuid}")
try {
tilgangskontroll.validerTilgangTilForespoersel(call.request, request.uuid)
Metrics.hentForespoerselEndpoint.recordTime(Route::hentForespoersel) {
runCatching {
receive(HentForespoerselRequest.serializer())
}.onSuccess { request ->
logger.info("Henter data for uuid: ${request.uuid}")
try {
tilgangskontroll.validerTilgangTilForespoersel(call.request, request.uuid)

val arbeidsgiverFnr = call.request.lesFnrFraAuthToken()
val arbeidsgiverFnr = call.request.lesFnrFraAuthToken()

hentForespoerselProducer.publish(transaksjonId, request, arbeidsgiverFnr)
hentForespoerselProducer.publish(transaksjonId, request, arbeidsgiverFnr)

val resultatJson = redisPoller.hent(transaksjonId).fromJson(ResultJson.serializer())
val resultatJson = redisPoller.hent(transaksjonId).fromJson(ResultJson.serializer())

sikkerLogger.info("Hentet forespørsel: $resultatJson")
sikkerLogger.info("Hentet forespørsel: $resultatJson")

val resultat = resultatJson.success?.fromJson(HentForespoerselResultat.serializer())
if (resultat != null) {
respond(HttpStatusCode.Created, resultat.toResponse(), HentForespoerselResponse.serializer())
} else {
val feilmelding = resultatJson.failure?.fromJson(String.serializer()) ?: "Teknisk feil, prøv igjen senere."
val resultat = resultatJson.success?.fromJson(HentForespoerselResultat.serializer())
if (resultat != null) {
respond(HttpStatusCode.Created, resultat.toResponse(), HentForespoerselResponse.serializer())
} else {
val feilmelding = resultatJson.failure?.fromJson(String.serializer()) ?: "Teknisk feil, prøv igjen senere."
val response =
ResultJson(
failure = feilmelding.toJson(),
)
respond(HttpStatusCode.ServiceUnavailable, response, ResultJson.serializer())
}
} catch (e: ManglerAltinnRettigheterException) {
val response =
ResultJson(
failure = "Du har ikke rettigheter for organisasjon.".toJson(),
)
respondForbidden(response, ResultJson.serializer())
} catch (_: RedisPollerTimeoutException) {
logger.info("Fikk timeout for ${request.uuid}")
val response =
ResultJson(
failure = feilmelding.toJson(),
failure = RedisTimeoutResponse(request.uuid).toJson(RedisTimeoutResponse.serializer()),
)
respond(HttpStatusCode.ServiceUnavailable, response, ResultJson.serializer())
respondInternalServerError(response, ResultJson.serializer())
}
} catch (e: ManglerAltinnRettigheterException) {
val response =
ResultJson(
failure = "Du har ikke rettigheter for organisasjon.".toJson(),
)
respondForbidden(response, ResultJson.serializer())
} catch (_: RedisPollerTimeoutException) {
logger.info("Fikk timeout for ${request.uuid}")
}.onFailure {
logger.error("Klarte ikke lese request.", it)
val response =
ResultJson(
failure = RedisTimeoutResponse(request.uuid).toJson(RedisTimeoutResponse.serializer()),
failure = "Mangler forespørsel-ID for å hente forespørsel.".toJson(),
)
respondInternalServerError(response, ResultJson.serializer())
respondBadRequest(response, ResultJson.serializer())
}
}.also {
requestTimer.observeDuration()
}.onFailure {
logger.error("Klarte ikke lese request.", it)
val response =
ResultJson(
failure = "Mangler forespørsel-ID for å hente forespørsel.".toJson(),
)
respondBadRequest(response, ResultJson.serializer())
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import io.ktor.server.application.call
import io.ktor.server.routing.Route
import io.ktor.server.routing.post
import io.ktor.util.pipeline.PipelineContext
import io.prometheus.client.Summary
import kotlinx.serialization.builtins.MapSerializer
import kotlinx.serialization.builtins.serializer
import no.nav.helse.rapids_rivers.RapidsConnection
Expand All @@ -15,6 +14,8 @@ import no.nav.helsearbeidsgiver.felles.Tekst.UGYLDIG_REQUEST
import no.nav.helsearbeidsgiver.felles.domene.Forespoersel
import no.nav.helsearbeidsgiver.felles.domene.ResultJson
import no.nav.helsearbeidsgiver.felles.domene.VedtaksperiodeIdForespoerselIdPar
import no.nav.helsearbeidsgiver.felles.metrics.Metrics
import no.nav.helsearbeidsgiver.felles.metrics.recordTime
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisConnection
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisPrefix
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisStore
Expand All @@ -38,51 +39,42 @@ import java.util.UUID

const val MAKS_ANTALL_VEDTAKSPERIODE_IDER = 100

fun Route.hentForespoerselIdListeRoute(
fun Route.hentForespoerselIdListe(
rapid: RapidsConnection,
tilgangskontroll: Tilgangskontroll,
redisConnection: RedisConnection,
) {
val hentForespoerslerProducer = HentForespoerslerProducer(rapid)
val redisPoller = RedisStore(redisConnection, RedisPrefix.HentForespoerslerForVedtaksperiodeIdListe).let(::RedisPoller)

val requestLatency =
Summary
.build()
.name("simba_hent_forespoersel_id_liste_latency_seconds")
.help("hent forespoersel id liste endpoint latency in seconds")
.register()

post(Routes.HENT_FORESPOERSEL_ID_LISTE) {
val requestTimer = requestLatency.startTimer()

runCatching {
receive(HentForespoerslerRequest.serializer())
}.onSuccess { request ->
if (request.vedtaksperiodeIdListe.size > MAKS_ANTALL_VEDTAKSPERIODE_IDER) {
loggErrorSikkerOgUsikker(
"Stopper forsøk på å hente forespørsler for mer enn $MAKS_ANTALL_VEDTAKSPERIODE_IDER vedtaksperiode-IDer på en gang.",
)
respondBadRequest(UGYLDIG_REQUEST, String.serializer())
} else {
try {
hentForespoersler(request, hentForespoerslerProducer, redisPoller, tilgangskontroll)
} catch (_: ManglerAltinnRettigheterException) {
respondForbidden("Mangler rettigheter for organisasjon.", String.serializer())
} catch (e: RedisPollerTimeoutException) {
loggErrorSikkerOgUsikker("Fikk timeout ved henting av forespørselIDer for vedtaksperiodeIDene: ${request.vedtaksperiodeIdListe}", e)
respondInternalServerError(RedisTimeoutResponse(), RedisTimeoutResponse.serializer())
} catch (e: Exception) {
loggErrorSikkerOgUsikker("Ukjent feil ved henting av forespørselIDer for vedtaksperiodeIDene: ${request.vedtaksperiodeIdListe}", e)
respondInternalServerError(TEKNISK_FEIL_FORBIGAAENDE, String.serializer())
Metrics.hentForespoerselIdListeEndpoint.recordTime(Route::hentForespoerselIdListe) {
runCatching {
receive(HentForespoerslerRequest.serializer())
}.onSuccess { request ->
if (request.vedtaksperiodeIdListe.size > MAKS_ANTALL_VEDTAKSPERIODE_IDER) {
loggErrorSikkerOgUsikker(
"Stopper forsøk på å hente forespørsler for mer enn $MAKS_ANTALL_VEDTAKSPERIODE_IDER vedtaksperiode-IDer på en gang.",
)
respondBadRequest(UGYLDIG_REQUEST, String.serializer())
} else {
try {
hentForespoersler(request, hentForespoerslerProducer, redisPoller, tilgangskontroll)
} catch (_: ManglerAltinnRettigheterException) {
respondForbidden("Mangler rettigheter for organisasjon.", String.serializer())
} catch (e: RedisPollerTimeoutException) {
loggErrorSikkerOgUsikker("Fikk timeout ved henting av forespørselIDer for vedtaksperiodeIDene: ${request.vedtaksperiodeIdListe}", e)
respondInternalServerError(RedisTimeoutResponse(), RedisTimeoutResponse.serializer())
} catch (e: Exception) {
loggErrorSikkerOgUsikker("Ukjent feil ved henting av forespørselIDer for vedtaksperiodeIDene: ${request.vedtaksperiodeIdListe}", e)
respondInternalServerError(TEKNISK_FEIL_FORBIGAAENDE, String.serializer())
}
}
}.onFailure {
"Klarte ikke lese request.".let { feilMelding ->
loggErrorSikkerOgUsikker(feilMelding, it)
respondBadRequest(feilMelding, String.serializer())
}
}
}.also {
requestTimer.observeDuration()
}.onFailure {
"Klarte ikke lese request.".let { feilMelding ->
loggErrorSikkerOgUsikker(feilMelding, it)
respondBadRequest(feilMelding, String.serializer())
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@ import io.ktor.server.application.call
import io.ktor.server.request.receiveText
import io.ktor.server.routing.Route
import io.ktor.server.routing.post
import io.prometheus.client.Summary
import kotlinx.serialization.builtins.serializer
import no.nav.helse.rapids_rivers.RapidsConnection
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmelding
import no.nav.helsearbeidsgiver.felles.Tekst
import no.nav.helsearbeidsgiver.felles.domene.ResultJson
import no.nav.helsearbeidsgiver.felles.metrics.Metrics
import no.nav.helsearbeidsgiver.felles.metrics.recordTime
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisConnection
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisPrefix
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisStore
Expand All @@ -29,27 +30,18 @@ import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.respondInternalServerE
import no.nav.helsearbeidsgiver.utils.json.fromJson
import no.nav.helsearbeidsgiver.utils.json.parseJson
import java.util.UUID
import kotlin.system.measureTimeMillis

fun Route.innsendingRoute(
fun Route.innsending(
rapid: RapidsConnection,
tilgangskontroll: Tilgangskontroll,
redisConnection: RedisConnection,
) {
val producer = InnsendingProducer(rapid)
val redisPoller = RedisStore(redisConnection, RedisPrefix.Innsending).let(::RedisPoller)

val requestLatency =
Summary
.build()
.name("simba_innsending_latency_seconds")
.help("innsending endpoint latency in seconds")
.register()

// TODO ubrukt path param satt til optional. fjern i frontend, så her.
post(Routes.INNSENDING + "/{forespoerselId?}") {
val requestTimer = requestLatency.startTimer()
measureTimeMillis {
Metrics.innsendingEndpoint.recordTime(Route::innsending) {
val transaksjonId = UUID.randomUUID()

val skjema =
Expand Down Expand Up @@ -119,9 +111,6 @@ fun Route.innsendingRoute(
}
}
}
}.also {
requestTimer.observeDuration()
logger.info("Api call to ${Routes.INNSENDING} took $it ms")
}
}
}
Loading

0 comments on commit 05ed769

Please sign in to comment.