Skip to content

Commit 8632e29

Browse files
authored
Count migrations by section (#420)
* Count migrations by section * Tidy logging
1 parent 1436f57 commit 8632e29

File tree

7 files changed

+77
-33
lines changed

7 files changed

+77
-33
lines changed

http/http-request.http

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ Authorization: Bearer {{OIDC_TOKEN}}
140140

141141
> {%
142142
client.test("Request executed successfully", function() {
143-
client.assert(response.status === 200, "Request failed");
143+
client.assert(response.status === 201, "Request failed");
144144
});
145145
%}
146146

src/main/kotlin/no/ssb/metadata/vardef/integrations/dapla/models/Dapla.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import io.micronaut.serde.config.naming.SnakeCaseStrategy
1111
@Serdeable(naming = SnakeCaseStrategy::class)
1212
data class Team(
1313
val uniformName: String,
14+
val sectionCode: String,
15+
val sectionName: String,
1416
)
1517

1618
@JsonIgnoreProperties(ignoreUnknown = true)

src/main/kotlin/no/ssb/metadata/vardef/integrations/dapla/services/StaticDaplaTeamService.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ const val DAPLA_PROPERTY = "dapla"
2929
@EachProperty(DAPLA_TEAM_PROPERTY_NAME)
3030
class StaticDaplaTeam(
3131
@param:Parameter val uniformName: String,
32+
@param:Parameter val sectionCode: String,
33+
@param:Parameter val sectionName: String,
3234
@param:Property(name = "dapla-teams.static-data-path")
3335
private val path: Path,
3436
private val jsonMapper: JsonMapper,
@@ -104,6 +106,8 @@ class StaticDaplaTeamService(
104106
val team: StaticDaplaTeam = beanContext.getBean(StaticDaplaTeam::class.java, Qualifiers.byName(teamName))
105107
Team(
106108
uniformName = team.uniformName,
109+
sectionCode = team.sectionCode,
110+
sectionName = team.sectionName,
107111
)
108112
}.onFailure { e ->
109113
logger.error("Error fetching static team with name '$teamName': ${e.message}", e)

src/main/kotlin/no/ssb/metadata/vardef/integrations/vardok/services/VardokApiService.kt

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,22 @@ package no.ssb.metadata.vardef.integrations.vardok.services
22

33
import com.fasterxml.jackson.dataformat.xml.XmlMapper
44
import com.fasterxml.jackson.module.kotlin.registerKotlinModule
5-
import io.micrometer.core.instrument.MeterRegistry
65
import io.micronaut.http.client.exceptions.HttpClientResponseException
7-
import io.micronaut.scheduling.annotation.Scheduled
86
import jakarta.inject.Singleton
97
import no.ssb.metadata.vardef.integrations.vardok.client.VardokClient
108
import no.ssb.metadata.vardef.integrations.vardok.models.*
119
import no.ssb.metadata.vardef.integrations.vardok.repositories.VardokIdMappingRepository
1210
import no.ssb.metadata.vardef.repositories.VariableDefinitionRepository
1311
import org.slf4j.LoggerFactory
14-
import java.util.concurrent.atomic.AtomicInteger
1512

1613
@Singleton
1714
open class VardokApiService(
1815
private val vardokClient: VardokClient,
1916
private val vardokIdMappingRepository: VardokIdMappingRepository,
2017
private val variableDefinitionRepository: VariableDefinitionRepository,
21-
meterRegistry: MeterRegistry,
2218
) : VardokService {
2319
private val logger = LoggerFactory.getLogger(VardokApiService::class.java)
2420

25-
private var totalMigrated: AtomicInteger = AtomicInteger()
26-
27-
init {
28-
totalMigrated.set(vardokIdMappingRepository.count().toInt())
29-
meterRegistry.gauge("ssb.variable-definitions.migrated.count", totalMigrated)
30-
}
31-
3221
override fun isDuplicate(name: String): Boolean = variableDefinitionRepository.existsByShortName(name)
3322

3423
private val xmlMapper = XmlMapper().registerKotlinModule()
@@ -113,12 +102,4 @@ open class VardokApiService(
113102
override fun getVardokIdByVardefId(vardokId: String): String? = vardokIdMappingRepository.getVardokIdByVardefId(vardokId)
114103

115104
override fun isAlreadyMigrated(vardokId: String): Boolean = vardokIdMappingRepository.existsByVardokId(vardokId)
116-
117-
@Scheduled(
118-
fixedRate = $$"${micronaut.metrics.custom.update-frequency:1h}",
119-
initialDelay = $$"${micronaut.metrics.custom.initial-delay:1h}",
120-
)
121-
open fun exportMetrics() {
122-
totalMigrated.set(vardokIdMappingRepository.count().toInt())
123-
}
124105
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package no.ssb.metadata.vardef.services
2+
3+
import io.micrometer.core.instrument.MeterRegistry
4+
import io.micrometer.core.instrument.MultiGauge
5+
import io.micrometer.core.instrument.Tags
6+
import io.micronaut.context.annotation.Requires
7+
import io.micronaut.scheduling.annotation.Scheduled
8+
import no.ssb.metadata.vardef.integrations.dapla.services.DaplaTeamApiService
9+
import no.ssb.metadata.vardef.integrations.vardok.repositories.VardokIdMappingRepository
10+
import org.slf4j.LoggerFactory
11+
import java.util.concurrent.atomic.AtomicInteger
12+
import javax.inject.Singleton
13+
14+
const val MIGRATED_COUNT_METRIC = "ssb.variable-definitions.migrated"
15+
const val SECTION_TAG_KEY = "section"
16+
17+
@Requires(env = ["naistest", "naisprod"])
18+
@Singleton
19+
class MetricsService(
20+
private val vardokIdMappingRepository: VardokIdMappingRepository,
21+
private val validityPeriodsService: ValidityPeriodsService,
22+
private val daplaTeamApiService: DaplaTeamApiService,
23+
private val meterRegistry: MeterRegistry,
24+
) {
25+
private val logger = LoggerFactory.getLogger(MetricsService::class.java)
26+
private val totalMigrated = AtomicInteger(0)
27+
private val migrated: MultiGauge =
28+
MultiGauge
29+
.builder(MIGRATED_COUNT_METRIC)
30+
.description("The number of migrated variable definitions, by section")
31+
.register(meterRegistry)
32+
33+
init {
34+
meterRegistry.gauge(MIGRATED_COUNT_METRIC, Tags.of(SECTION_TAG_KEY, "total"), totalMigrated)
35+
}
36+
37+
private fun countMigratedVariablesBySection(): Map<String, Int> =
38+
vardokIdMappingRepository
39+
.findAll()
40+
.map { (_, vardefId, _) ->
41+
validityPeriodsService
42+
.getLatestPatchInLastValidityPeriod(
43+
vardefId,
44+
).owner.team
45+
}.map {
46+
daplaTeamApiService.getTeam(it)?.sectionCode ?: "Unknown"
47+
}.groupBy { it }
48+
.mapValues { it.value.size }
49+
50+
@Scheduled(
51+
fixedRate = $$"${micronaut.metrics.custom.update-frequency:1h}",
52+
initialDelay = $$"${micronaut.metrics.custom.initial-delay:1h}",
53+
)
54+
fun exportMetrics() {
55+
totalMigrated.set(vardokIdMappingRepository.count().toInt())
56+
logger.debug("Updating metrics.")
57+
migrated.register(
58+
countMigratedVariablesBySection()
59+
.also { logger.debug(it.toString()) }
60+
.map {
61+
MultiGauge.Row.of(Tags.of(SECTION_TAG_KEY, it.key), it.value)
62+
}.toList(),
63+
true,
64+
)
65+
}
66+
}

src/test/kotlin/no/ssb/metadata/vardef/integrations/dapla/services/DaplaTeamApiMockkServiceTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class DaplaTeamApiMockkServiceTest {
3131

3232
@Test
3333
fun `valid team request`() {
34-
val expectedTeam = Team("dapla-felles")
34+
val expectedTeam = Team("dapla-felles", sectionName = "Dapla", sectionCode = "724")
3535
val mockResponse: HttpResponse<Team?> = mockk()
3636
every { mockResponse.status } returns HttpStatus.OK
3737
every { mockResponse.body() } returns expectedTeam

src/test/kotlin/no/ssb/metadata/vardef/integrations/vardok/VardokServiceTest.kt

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package no.ssb.metadata.vardef.integrations.vardok
22

3-
import io.micrometer.core.instrument.MeterRegistry
43
import io.micronaut.http.HttpStatus
54
import io.micronaut.http.exceptions.HttpStatusException
65
import io.mockk.MockKAnnotations
76
import io.mockk.clearAllMocks
87
import io.mockk.every
8+
import io.mockk.impl.annotations.InjectMockKs
99
import io.mockk.impl.annotations.MockK
1010
import io.mockk.mockk
1111
import no.ssb.metadata.vardef.integrations.vardok.client.VardokClient
@@ -22,9 +22,7 @@ import org.junit.jupiter.api.BeforeEach
2222
import org.junit.jupiter.api.Test
2323

2424
@MockK
25-
class VardokServiceTest(
26-
private val meterRegistry: MeterRegistry,
27-
) : BaseVardokTest() {
25+
class VardokServiceTest : BaseVardokTest() {
2826
@MockK
2927
lateinit var vardokMockkClient: VardokClient
3028

@@ -37,19 +35,12 @@ class VardokServiceTest(
3735
@MockK
3836
lateinit var variableDefinitionRepository: VariableDefinitionRepository
3937

38+
@InjectMockKs
4039
lateinit var vardokApiService: VardokApiService
4140

4241
@BeforeEach
4342
fun setup() {
4443
MockKAnnotations.init(this)
45-
every { vardokIdMappingRepository.count() } returns 0
46-
vardokApiService =
47-
VardokApiService(
48-
vardokMockkClient,
49-
vardokIdMappingRepository = vardokIdMappingRepository,
50-
variableDefinitionRepository = variableDefinitionRepository,
51-
meterRegistry = meterRegistry,
52-
)
5344
}
5445

5546
@AfterEach

0 commit comments

Comments
 (0)