Skip to content

Commit

Permalink
Legg til metrikk for feil status (#727)
Browse files Browse the repository at this point in the history
* Legg til metrikk for feil status

* Fjern uriktig kommentar

* Ikke gjenbruk IdMapping, bruk ny klasse
  • Loading branch information
tu55eladd authored Nov 15, 2023
1 parent 987b093 commit 3e473d7
Show file tree
Hide file tree
Showing 7 changed files with 185 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
import no.nav.poao.dab.spring_auth.IAuthService;
import no.nav.veilarbaktivitet.aktivitet.AktivitetDAO;
import no.nav.veilarbaktivitet.aktivitetskort.MigreringService;
import no.nav.veilarbaktivitet.aktivitetskort.idmapping.IdMapping;
import no.nav.veilarbaktivitet.aktivitetskort.idmapping.IdMappingDAO;
import no.nav.veilarbaktivitet.aktivitetskort.idmapping.IdMappingWithAktivitetStatus;
import no.nav.veilarbaktivitet.arena.model.ArenaAktivitetDTO;
import no.nav.veilarbaktivitet.arena.model.ArenaAktivitetTypeDTO;
import no.nav.veilarbaktivitet.arena.model.ArenaId;
Expand Down Expand Up @@ -65,7 +65,8 @@ public List<ArenaAktivitetDTO> hentArenaAktiviteter() {
var arenaAktiviteter = arenaService.hentAktiviteter(fnr);
var ideer = arenaAktiviteter.stream().map(arenaAktivitetDTO -> new ArenaId(arenaAktivitetDTO.getId())).toList();
var idMappings = idMappingDAO.getMappings(ideer);
var aktivitetsVersjoner = aktivitetDAO.getAktivitetsVersjoner(idMappings.values().stream().map(IdMapping::getAktivitetId).toList());
var aktivitetsVersjoner = aktivitetDAO.getAktivitetsVersjoner(idMappings.values().stream()
.map(IdMappingWithAktivitetStatus::getAktivitetId).toList());
var filtrerteArenaAktiviteter = arenaAktiviteter
.stream()
// Bare vis arena aktiviteter som mangler id, dvs ikke er migrert
Expand All @@ -79,7 +80,7 @@ public List<ArenaAktivitetDTO> hentArenaAktiviteter() {
return arenaAktivitet;
})
.toList();
migreringService.countArenaAktiviteter(arenaAktiviteter, filtrerteArenaAktiviteter);
migreringService.countArenaAktiviteter(arenaAktiviteter, idMappings);
logUmigrerteIder(filtrerteArenaAktiviteter);
return filtrerteArenaAktiviteter;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,27 @@ import org.springframework.stereotype.Component
@Component
class AktivitetskortMetrikker(private val meterRegistry: MeterRegistry) {

fun countMigrerteArenaAktiviteter(type: ArenaAktivitetTypeDTO, foer: Int, etter: Int) {
val diff = foer - etter
fun countMigrerteArenaAktiviteter(type: ArenaAktivitetTypeDTO, total: Int, migrertRiktigStatus: Int, migrertFeilStatus: Int, ikkeMigrert: Int) {
Counter.builder(VISTE_MIGRERTE_ARENA_AKTIVITETER)
.tag("tiltakstype", type.name)
.tag("counter_type", "ikke_migrert")
.register(meterRegistry)
.increment((foer - diff).toDouble())
.increment((ikkeMigrert).toDouble())
Counter.builder(VISTE_MIGRERTE_ARENA_AKTIVITETER)
.tag("tiltakstype", type.name)
.tag("counter_type", "filtrert_bort")
.register(meterRegistry)
.increment(diff.toDouble())
.increment(migrertRiktigStatus.toDouble())
Counter.builder(VISTE_MIGRERTE_ARENA_AKTIVITETER)
.tag("tiltakstype", type.name)
.tag("counter_type", "filtrert_bort_feil_status")
.register(meterRegistry)
.increment(migrertFeilStatus.toDouble())
Counter.builder(VISTE_MIGRERTE_ARENA_AKTIVITETER)
.tag("tiltakstype", type.name)
.tag("counter_type", "total")
.register(meterRegistry)
.increment(foer.toDouble())
.increment(total.toDouble())
}

fun countAktivitetskortUpsert(bestilling: AktivitetskortBestilling, upsertActionResult: UpsertActionResult) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import io.getunleash.Unleash
import lombok.extern.slf4j.Slf4j
import no.nav.veilarbaktivitet.aktivitet.dto.AktivitetDTO
import no.nav.veilarbaktivitet.aktivitetskort.idmapping.IdMappingDAO
import no.nav.veilarbaktivitet.aktivitetskort.idmapping.IdMappingWithAktivitetStatus
import no.nav.veilarbaktivitet.arena.model.ArenaAktivitetDTO
import no.nav.veilarbaktivitet.arena.model.ArenaAktivitetTypeDTO
import no.nav.veilarbaktivitet.arena.model.ArenaId
Expand All @@ -20,20 +21,38 @@ class MigreringService (
) {

/* Hører kanskje ikke til her men var lettere å gjøre groupBy i kotlin vs java */
fun countArenaAktiviteter(foer: MutableList<ArenaAktivitetDTO>, etter: MutableList<ArenaAktivitetDTO> ) {
fun countArenaAktiviteter(
foer: List<ArenaAktivitetDTO>,
idMappings: Map<ArenaId, IdMappingWithAktivitetStatus>
) {
if (foer.isEmpty()) return
val antallFoer = foer.groupBy { it.type }.mapValues { it.value.size }
val antallEtter = etter.groupBy { it.type }.mapValues { it.value.size }

// Bruker status som indikator på om dataene er riktig
fun sjekkMigreringsStatus(aktivitet: ArenaAktivitetDTO): MigreringsStatus {
return idMappings[ArenaId(aktivitet.id)]
?.let { match -> if (match.status == aktivitet.status) MigreringsStatus.MigrertRiktigStatus else MigreringsStatus.MigrertFeilStatus }
?: MigreringsStatus.IkkeMigrert
}
val migrert = foer
.map { it to sjekkMigreringsStatus(it) }
.filter { it.second != MigreringsStatus.IkkeMigrert }

val (etterMedRiktigStatus, etterMedFeilStatus) = migrert.partition { it.second == MigreringsStatus.MigrertRiktigStatus }
val antallMigrertMedRiktigStatus = etterMedRiktigStatus.groupBy { it.first.type }.mapValues { it.value.size }
val antallMigrertMedFeilStatus = etterMedFeilStatus.groupBy { it.first.type }.mapValues { it.value.size }
ArenaAktivitetTypeDTO.values()
.map {
val totaltFoer = antallFoer[it] ?: 0
val totaltEtter = antallEtter[it] ?: 0
reportMetric(it, totaltFoer, totaltEtter)
val totaltMigrertRiktigStatus = antallMigrertMedRiktigStatus[it] ?: 0
val totaltMigrertFeilStatus = antallMigrertMedFeilStatus[it] ?: 0
val ikkeMigrert = totaltFoer - (totaltMigrertRiktigStatus + totaltMigrertFeilStatus)
reportMetric(it, totaltFoer, totaltMigrertRiktigStatus, totaltMigrertFeilStatus, ikkeMigrert)
}
}
private fun reportMetric(type: ArenaAktivitetTypeDTO, foer: Int, etter: Int) {
if (foer == 0) return
aktivitetskortMetrikker.countMigrerteArenaAktiviteter(type, foer, etter)
private fun reportMetric(type: ArenaAktivitetTypeDTO, total: Int, migrertRiktigStatus: Int, migrertFeilStatus: Int, ikkeMigrert: Int) {
if (total == 0) return
aktivitetskortMetrikker.countMigrerteArenaAktiviteter(type, total, migrertRiktigStatus, migrertFeilStatus, ikkeMigrert)
}

fun filtrerBortArenaTiltakHvisToggleAktiv(arenaIds: Set<ArenaId?>): Predicate<ArenaAktivitetDTO> {
Expand Down Expand Up @@ -71,3 +90,9 @@ class MigreringService (
private val alleArenaAktiviteter = Predicate { _: ArenaAktivitetDTO -> true }
}
}

enum class MigreringsStatus {
IkkeMigrert,
MigrertRiktigStatus,
MigrertFeilStatus
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,18 @@
package no.nav.veilarbaktivitet.aktivitetskort.idmapping

import no.nav.veilarbaktivitet.aktivitet.domain.AktivitetStatus
import no.nav.veilarbaktivitet.arena.model.ArenaId
import java.util.*

data class IdMapping(
public val arenaId: ArenaId,
public val aktivitetId: Long,
public val funksjonellId: UUID
val arenaId: ArenaId,
val aktivitetId: Long,
val funksjonellId: UUID,
)

data class IdMappingWithAktivitetStatus (
val arenaId: ArenaId,
val aktivitetId: Long,
val funksjonellId: UUID,
val status: AktivitetStatus
)
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package no.nav.veilarbaktivitet.aktivitetskort.idmapping

import no.nav.veilarbaktivitet.aktivitet.domain.AktivitetStatus
import no.nav.veilarbaktivitet.arena.model.ArenaId
import org.springframework.jdbc.core.RowMapper
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource
Expand Down Expand Up @@ -62,34 +63,44 @@ open class IdMappingDAO (
}
}

fun getMappings(ids: List<ArenaId>): Map<ArenaId, IdMapping> {
fun getMappings(ids: List<ArenaId>): Map<ArenaId, IdMappingWithAktivitetStatus> {
if (ids.isEmpty()) return HashMap()
val stringIds = ids.stream().map { obj: ArenaId -> obj.id() }.toList()
val params = MapSqlParameterSource()
.addValue("arenaIds", stringIds)
val idList = db.query(
"""
SELECT * FROM ID_MAPPINGER where ID_MAPPINGER.EKSTERN_REFERANSE_ID in (:arenaIds)
""".trimIndent(), params, rowmapper
SELECT ID_MAPPINGER.AKTIVITET_ID, ID_MAPPINGER.EKSTERN_REFERANSE_ID, ID_MAPPINGER.FUNKSJONELL_ID, AKTIVITET.LIVSLOPSTATUS_KODE AS STATUS FROM ID_MAPPINGER
LEFT JOIN AKTIVITET ON ID_MAPPINGER.AKTIVITET_ID = AKTIVITET.AKTIVITET_ID
WHERE ID_MAPPINGER.EKSTERN_REFERANSE_ID in (:arenaIds) AND AKTIVITET.GJELDENDE = 1
""".trimIndent(), params, rowmapperWithAktivitetStatus
)
return idList.stream()
.reduce(HashMap(), { mapping: HashMap<ArenaId, IdMapping>, singleIdMapping: IdMapping ->
.reduce(HashMap(), { mapping: HashMap<ArenaId, IdMappingWithAktivitetStatus>, singleIdMapping: IdMappingWithAktivitetStatus ->
mapping[singleIdMapping.arenaId] = singleIdMapping
mapping
}) { accumulatedMappings: HashMap<ArenaId, IdMapping>, nextSingleMapping: HashMap<ArenaId, IdMapping>? ->
}) { accumulatedMappings: HashMap<ArenaId, IdMappingWithAktivitetStatus>, nextSingleMapping: HashMap<ArenaId, IdMappingWithAktivitetStatus>? ->
accumulatedMappings.putAll(
nextSingleMapping!!
)
accumulatedMappings
}
}

var rowmapper = RowMapper { rs: ResultSet, _: Int ->
private var rowmapper = RowMapper { rs: ResultSet, _: Int ->
IdMapping(
ArenaId(rs.getString("EKSTERN_REFERANSE_ID")),
rs.getLong("AKTIVITET_ID"),
UUID.fromString(rs.getString("FUNKSJONELL_ID"))
UUID.fromString(rs.getString("FUNKSJONELL_ID")),
)
}

private var rowmapperWithAktivitetStatus = RowMapper { rs: ResultSet, _: Int ->
IdMappingWithAktivitetStatus(
ArenaId(rs.getString("EKSTERN_REFERANSE_ID")),
rs.getLong("AKTIVITET_ID"),
UUID.fromString(rs.getString("FUNKSJONELL_ID")),
AktivitetStatus.valueOf(rs.getString("STATUS"))
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ class ArenaAktivitetskortService (
val idMapping = IdMapping(
arenaId,
opprettetAktivitet.getId(),
aktivitetskort.id
aktivitetskort.id,
)
idMappingDAO.insert(idMapping)
forhaandsorienteringDAO.getFhoForArenaAktivitet(arenaId)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
package no.nav.veilarbaktivitet.aktivitetskort

import io.getunleash.Unleash
import no.nav.veilarbaktivitet.aktivitet.domain.AktivitetStatus
import no.nav.veilarbaktivitet.aktivitetskort.idmapping.IdMappingDAO
import no.nav.veilarbaktivitet.aktivitetskort.idmapping.IdMappingWithAktivitetStatus
import no.nav.veilarbaktivitet.arena.model.ArenaAktivitetDTO
import no.nav.veilarbaktivitet.arena.model.ArenaAktivitetTypeDTO
import no.nav.veilarbaktivitet.arena.model.ArenaId
import org.junit.jupiter.api.Test
import org.mockito.Mockito.mock
import org.mockito.kotlin.verify
import java.util.*

class MigreringServiceTest {

val testAktiviteter = listOf(
ArenaAktivitetDTO.builder()
.type(ArenaAktivitetTypeDTO.TILTAKSAKTIVITET)
.id("ARENATA101")
.status(AktivitetStatus.PLANLAGT).build(),
ArenaAktivitetDTO.builder()
.type(ArenaAktivitetTypeDTO.TILTAKSAKTIVITET)
.id("ARENATA102")
.status(AktivitetStatus.GJENNOMFORES).build(),
ArenaAktivitetDTO.builder()
.type(ArenaAktivitetTypeDTO.TILTAKSAKTIVITET)
.id("ARENATA103")
.status(AktivitetStatus.FULLFORT).build()
)

@Test
fun `skal telle feil status og riktig status`() {
val metrikker = mock(AktivitetskortMetrikker::class.java)
val migreringService = MigreringService(
unleash = mock(Unleash::class.java),
idMappingDAO = mock(IdMappingDAO::class.java),
aktivitetskortMetrikker = metrikker
)
migreringService.countArenaAktiviteter(
foer = testAktiviteter,
idMappings = mapOf(
ArenaId("ARENATA101") to IdMappingWithAktivitetStatus(
ArenaId("ARENATA101"),
1,
UUID.randomUUID(),
AktivitetStatus.PLANLAGT
),
ArenaId("ARENATA102") to IdMappingWithAktivitetStatus(
ArenaId("ARENATA102"),
2,
UUID.randomUUID(),
AktivitetStatus.PLANLAGT // Feil status
)
)
)
verify(metrikker).countMigrerteArenaAktiviteter(ArenaAktivitetTypeDTO.TILTAKSAKTIVITET, 3, 1,1,1)
}

@Test
fun `skal telle riktig når ingen er migrert`() {
val metrikker = mock(AktivitetskortMetrikker::class.java)
val migreringService = MigreringService(
unleash = mock(Unleash::class.java),
idMappingDAO = mock(IdMappingDAO::class.java),
aktivitetskortMetrikker = metrikker
)
migreringService.countArenaAktiviteter(
foer = testAktiviteter,
idMappings = mapOf()
)
verify(metrikker).countMigrerteArenaAktiviteter(ArenaAktivitetTypeDTO.TILTAKSAKTIVITET, 3, 0,0,3)
}

@Test
fun `skal telle riktig når alle er feil status`() {
val metrikker = mock(AktivitetskortMetrikker::class.java)
val migreringService = MigreringService(
unleash = mock(Unleash::class.java),
idMappingDAO = mock(IdMappingDAO::class.java),
aktivitetskortMetrikker = metrikker
)
migreringService.countArenaAktiviteter(
foer = testAktiviteter,
idMappings = mapOf(
ArenaId("ARENATA101") to IdMappingWithAktivitetStatus(
ArenaId("ARENATA101"),
1,
UUID.randomUUID(),
AktivitetStatus.FULLFORT
),
ArenaId("ARENATA102") to IdMappingWithAktivitetStatus(
ArenaId("ARENATA102"),
2,
UUID.randomUUID(),
AktivitetStatus.PLANLAGT // Feil status
),
ArenaId("ARENATA103") to IdMappingWithAktivitetStatus(
ArenaId("ARENATA103"),
3,
UUID.randomUUID(),
AktivitetStatus.PLANLAGT // Feil status
)
)
)
verify(metrikker).countMigrerteArenaAktiviteter(ArenaAktivitetTypeDTO.TILTAKSAKTIVITET, 3, 0,3,0)
}
}

0 comments on commit 3e473d7

Please sign in to comment.