diff --git a/.github/workflows/build-deploy-feature-branch-dev.yaml b/.github/workflows/build-deploy-feature-branch-dev.yaml index fb4ac3c9..43a26f9c 100644 --- a/.github/workflows/build-deploy-feature-branch-dev.yaml +++ b/.github/workflows/build-deploy-feature-branch-dev.yaml @@ -34,7 +34,7 @@ jobs: uses: nais/docker-build-push@v0 id: docker-build-push with: - team: pto + team: obo identity_provider: ${{ secrets.NAIS_WORKLOAD_IDENTITY_PROVIDER }} project_id: ${{ vars.NAIS_MANAGEMENT_PROJECT_ID }} diff --git a/src/main/java/no/nav/pto/veilarbfilter/config/ApplicationConfig.java b/src/main/java/no/nav/pto/veilarbfilter/config/ApplicationConfig.java index d40b783a..f6f1e234 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/config/ApplicationConfig.java +++ b/src/main/java/no/nav/pto/veilarbfilter/config/ApplicationConfig.java @@ -10,13 +10,9 @@ import no.nav.common.auth.context.AuthContextHolderThreadLocal; import no.nav.common.job.leader_election.LeaderElectionClient; import no.nav.common.job.leader_election.LeaderElectionHttpClient; -import no.nav.common.metrics.InfluxClient; -import no.nav.common.metrics.MetricsClient; import no.nav.common.rest.client.RestClient; import no.nav.common.token_client.builder.AzureAdTokenClientBuilder; import no.nav.common.token_client.client.AzureAdMachineToMachineTokenClient; -import no.nav.common.utils.EnvironmentUtils; -import no.nav.common.utils.UrlUtils; import no.nav.poao_tilgang.client.*; import no.nav.pto.veilarbfilter.domene.deserializer.DateDeserializer; import no.nav.pto.veilarbfilter.domene.deserializer.DateSerializer; @@ -76,11 +72,6 @@ public ObjectMapper objectMapper() { return mapper; } - @Bean - public MetricsClient metricsClient() { - return new InfluxClient(); - } - @Bean public LeaderElectionClient leaderElectionClient() { return new LeaderElectionHttpClient(); diff --git a/src/main/java/no/nav/pto/veilarbfilter/config/ScheduleConfig.java b/src/main/java/no/nav/pto/veilarbfilter/config/ScheduleConfig.java index 30f2ed04..bcfc1ed7 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/config/ScheduleConfig.java +++ b/src/main/java/no/nav/pto/veilarbfilter/config/ScheduleConfig.java @@ -35,7 +35,7 @@ public void fjernVeilederSomErIkkeAktive() { } } - @Scheduled(fixedDelay = 30, timeUnit = TimeUnit.MINUTES) + @Scheduled(fixedDelay = 60, timeUnit = TimeUnit.MINUTES) public void reportLagradeFilter() { try { if (leaderElectionClient.isLeader()) { diff --git a/src/main/java/no/nav/pto/veilarbfilter/service/MetricsReporter.java b/src/main/java/no/nav/pto/veilarbfilter/service/MetricsReporter.java index 02402eae..d8473272 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/service/MetricsReporter.java +++ b/src/main/java/no/nav/pto/veilarbfilter/service/MetricsReporter.java @@ -1,174 +1,157 @@ package no.nav.pto.veilarbfilter.service; +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.MultiGauge; +import io.micrometer.core.instrument.Tags; +import io.micrometer.core.instrument.binder.MeterBinder; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import no.nav.common.metrics.Event; -import no.nav.common.metrics.MetricsClient; import no.nav.pto.veilarbfilter.domene.PortefoljeFilter; -import org.apache.commons.codec.digest.DigestUtils; +import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; -import java.util.List; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @Slf4j -public class MetricsReporter { +public class MetricsReporter implements MeterBinder { private final MineLagredeFilterService mineLagredeFilterService; - private final MetricsClient metricsClient; - public void reportLagradeFilter() { - log.info("Reporting metrics..."); + private MultiGauge lagredeFilterStats; - mineLagredeFilterService.hentAllLagredeFilter().forEach(filterModel -> { - Event metrikk = new Event("portefolje.metrikker.lagredefilter.veileder-filter-counter"); - metrikk.addFieldToReport("navn-lengde", filterModel.getFilterNavn().length()); - metrikk.addTagToReport("id", getHash(filterModel.getVeilederId())); - metrikk.addFieldToReport("filterId", filterModel.getFilterId()); - PortefoljeFilter filterValg = filterModel.getFilterValg(); - var antallFiltre = 0; + @Override + public void bindTo(@NotNull MeterRegistry meterRegistry) { + if (lagredeFilterStats == null) { + lagredeFilterStats = MultiGauge.builder("portefolje_lagredefilter") + .description("Stats for lagrede filter") + .register(meterRegistry); + } + } - if (filterValg.getAktiviteter() != null) { - metrikk.addTagToReport("aktiviteter", "1"); - if (!"NA".equals(filterValg.getAktiviteter().getBEHANDLING())) { - metrikk.addTagToReport("BEHANDLING", "1"); - antallFiltre++; - } - if (!"NA".equals(filterValg.getAktiviteter().getEGEN())) { - metrikk.addTagToReport("EGEN", "1"); - antallFiltre++; - } - if (!"NA".equals(filterValg.getAktiviteter().getGRUPPEAKTIVITET())) { - metrikk.addTagToReport("GRUPPEAKTIVITET", "1"); - antallFiltre++; - } - if (!"NA".equals(filterValg.getAktiviteter().getIJOBB())) { - metrikk.addTagToReport("IJOBB", "1"); - antallFiltre++; - } - if (!"NA".equals(filterValg.getAktiviteter().getMOTE())) { - metrikk.addTagToReport("MOTE", "1"); - antallFiltre++; - } - if (!"NA".equals(filterValg.getAktiviteter().getSOKEAVTALE())) { - metrikk.addTagToReport("SOKEAVTALE", "1"); - antallFiltre++; - } - if (!"NA".equals(filterValg.getAktiviteter().getSTILLING())) { - metrikk.addTagToReport("STILLING", "1"); - antallFiltre++; - } - if (!"NA".equals(filterValg.getAktiviteter().getTILTAK())) { - metrikk.addTagToReport("TILTAK", "1"); - antallFiltre++; - } - if (!"NA".equals(filterValg.getAktiviteter().getUTDANNINGAKTIVITET())) { - metrikk.addTagToReport("UTDANNINGAKTIVITET", "1"); - antallFiltre++; - } - } - if (filterValg.getAlder() != null && !filterValg.getAlder().isEmpty()) { - metrikk.addTagToReport("alder", "1"); - addValuesAsTags(metrikk, filterValg.getAlder()); - antallFiltre += filterValg.getAlder().size(); - } - if (filterValg.getFerdigfilterListe() != null && !filterValg.getFerdigfilterListe().isEmpty()) { - metrikk.addTagToReport("ferdigfilterListe", "1"); - addValuesAsTags(metrikk, filterValg.getFerdigfilterListe()); - antallFiltre += filterValg.getFerdigfilterListe().size(); - } - if (filterValg.getFodselsdagIMnd() != null && !filterValg.getFodselsdagIMnd().isEmpty()) { - metrikk.addTagToReport("fodselsdagIMnd", "1"); - antallFiltre += filterValg.getFodselsdagIMnd().size(); - } - if (filterValg.getFormidlingsgruppe() != null && !filterValg.getFormidlingsgruppe().isEmpty()) { - metrikk.addTagToReport("formidlingsgruppe", "1"); - addValuesAsTags(metrikk, filterValg.getFormidlingsgruppe()); - antallFiltre += filterValg.getFormidlingsgruppe().size(); - } - if (filterValg.getHovedmal() != null && !filterValg.getHovedmal().isEmpty()) { - metrikk.addTagToReport("hovedmal", "1"); - addValuesAsTags(metrikk, filterValg.getHovedmal()); - antallFiltre += filterValg.getHovedmal().size(); - } - if (filterValg.getInnsatsgruppe() != null && !filterValg.getInnsatsgruppe().isEmpty()) { - metrikk.addTagToReport("innsatsgruppe", "1"); - addValuesAsTags(metrikk, filterValg.getInnsatsgruppe()); - antallFiltre += filterValg.getInnsatsgruppe().size(); - } - if (filterValg.getKjonn() != null && !filterValg.getKjonn().isEmpty()) { - metrikk.addTagToReport("kjonn", "1"); - metrikk.addTagToReport(filterValg.getKjonn(), "1"); - antallFiltre++; - } - if (filterValg.getManuellBrukerStatus() != null && !filterValg.getManuellBrukerStatus().isEmpty()) { - metrikk.addTagToReport("manuellBrukerStatus", "1"); - addValuesAsTags(metrikk, filterValg.getManuellBrukerStatus()); - antallFiltre += filterValg.getManuellBrukerStatus().size(); - } - if (filterValg.getRettighetsgruppe() != null && !filterValg.getRettighetsgruppe().isEmpty()) { - metrikk.addTagToReport("rettighetsgruppe", "1"); - addValuesAsTags(metrikk, filterValg.getRettighetsgruppe()); - antallFiltre += filterValg.getRettighetsgruppe().size(); - } - if (filterValg.getServicegruppe() != null && !filterValg.getServicegruppe().isEmpty()) { - metrikk.addTagToReport("servicegruppe", "1"); - addValuesAsTags(metrikk, filterValg.getServicegruppe()); - antallFiltre += filterValg.getServicegruppe().size(); - } - if (filterValg.getTiltakstyper() != null && !filterValg.getTiltakstyper().isEmpty()) { - metrikk.addTagToReport("tiltakstyper", "1"); - addValuesAsTags(metrikk, filterValg.getTiltakstyper()); - antallFiltre += filterValg.getTiltakstyper().size(); - } - if (filterValg.getVeilederNavnQuery() != null && !filterValg.getVeilederNavnQuery().isEmpty()) { - metrikk.addTagToReport("veilederNavnQuery", "1"); - antallFiltre++; - } - if (filterValg.getVeiledere() != null && !filterValg.getVeiledere().isEmpty()) { - metrikk.addTagToReport("veiledere", "1"); - antallFiltre += filterValg.getVeiledere().size(); - } - if (filterValg.getYtelse() != null && !filterValg.getYtelse().isEmpty()) { - metrikk.addTagToReport("ytelse", "1"); - metrikk.addTagToReport(filterValg.getYtelse(), "1"); - antallFiltre++; - } - if (filterValg.getRegistreringstype() != null && !filterValg.getRegistreringstype().isEmpty()) { - metrikk.addTagToReport("registreringstype", "1"); - addValuesAsTags(metrikk, filterValg.getRegistreringstype()); - antallFiltre += filterValg.getRegistreringstype().size(); - } - if (filterValg.getCvJobbprofil() != null && !filterValg.getCvJobbprofil().isEmpty()) { - metrikk.addTagToReport("cvJobbprofil", "1"); - metrikk.addTagToReport(filterValg.getCvJobbprofil(), "1"); - antallFiltre++; - } - if (filterValg.getArbeidslisteKategori() != null && !filterValg.getArbeidslisteKategori().isEmpty()) { - metrikk.addTagToReport("arbeidslisteKategori", "1"); - antallFiltre += filterValg.getArbeidslisteKategori().size(); - } - if (filterValg.getLandgruppe() != null && !filterValg.getLandgruppe().isEmpty()) { - metrikk.addTagToReport("landgruppe", "1"); - addValuesAsTags(metrikk, filterValg.getLandgruppe()); - antallFiltre += filterValg.getLandgruppe().size(); - } - if (filterValg.getTolkebehov() != null && !filterValg.getTolkebehov().isEmpty()) { - metrikk.addTagToReport("tolkbehov", "1"); - addValuesAsTags(metrikk, filterValg.getTolkebehov()); - antallFiltre += filterValg.getTolkebehov().size(); - } - metrikk.addFieldToReport("antallFiltre", antallFiltre); - metricsClient.report(metrikk); + public void reportLagradeFilter() { + try { + Map stats = new HashMap<>(); - }); - } + log.info("Reporting metrics..."); - private void addValuesAsTags(Event metrikk, List listValues) { - listValues.forEach(x -> metrikk.addTagToReport(x, "1")); + mineLagredeFilterService.hentAllLagredeFilter().forEach(filterModel -> { + + PortefoljeFilter filterValg = filterModel.getFilterValg(); + if (filterValg.getAktiviteter() != null) { + incrementFilterStats(stats, "aktiviteter"); + if (!"NA".equals(filterValg.getAktiviteter().getBEHANDLING())) { + incrementFilterStats(stats, "behandling"); + } + if (!"NA".equals(filterValg.getAktiviteter().getEGEN())) { + incrementFilterStats(stats, "egen"); + } + if (!"NA".equals(filterValg.getAktiviteter().getGRUPPEAKTIVITET())) { + incrementFilterStats(stats, "gruppeaktivitet"); + } + if (!"NA".equals(filterValg.getAktiviteter().getIJOBB())) { + incrementFilterStats(stats, "ijobb"); + } + if (!"NA".equals(filterValg.getAktiviteter().getMOTE())) { + incrementFilterStats(stats, "mote"); + } + if (!"NA".equals(filterValg.getAktiviteter().getSOKEAVTALE())) { + incrementFilterStats(stats, "sokeavtale"); + } + if (!"NA".equals(filterValg.getAktiviteter().getSTILLING())) { + incrementFilterStats(stats, "stilling"); + } + if (!"NA".equals(filterValg.getAktiviteter().getTILTAK())) { + incrementFilterStats(stats, "tiltak"); + } + if (!"NA".equals(filterValg.getAktiviteter().getUTDANNINGAKTIVITET())) { + incrementFilterStats(stats, "utdanningaktivitet"); + } + } + if (filterValg.getAlder() != null && !filterValg.getAlder().isEmpty()) { + incrementFilterStats(stats, "alder"); + } + if (filterValg.getFerdigfilterListe() != null && !filterValg.getFerdigfilterListe().isEmpty()) { + incrementFilterStats(stats, "ferdigfilterliste"); + filterValg.getFerdigfilterListe().forEach(x -> incrementFilterStats(stats, x)); + } + if (filterValg.getFodselsdagIMnd() != null && !filterValg.getFodselsdagIMnd().isEmpty()) { + incrementFilterStats(stats, "fodselsdagimnd"); + } + if (filterValg.getFormidlingsgruppe() != null && !filterValg.getFormidlingsgruppe().isEmpty()) { + incrementFilterStats(stats, "formidlingsgruppe"); + } + if (filterValg.getHovedmal() != null && !filterValg.getHovedmal().isEmpty()) { + incrementFilterStats(stats, "hovedmal"); + } + if (filterValg.getInnsatsgruppe() != null && !filterValg.getInnsatsgruppe().isEmpty()) { + incrementFilterStats(stats, "innsatsgruppe"); + } + if (filterValg.getKjonn() != null && !filterValg.getKjonn().isEmpty()) { + incrementFilterStats(stats, "kjonn"); + } + if (filterValg.getManuellBrukerStatus() != null && !filterValg.getManuellBrukerStatus().isEmpty()) { + incrementFilterStats(stats, "manuellbrukerstatus"); + } + if (filterValg.getRettighetsgruppe() != null && !filterValg.getRettighetsgruppe().isEmpty()) { + incrementFilterStats(stats, "rettighetsgruppe"); + } + if (filterValg.getServicegruppe() != null && !filterValg.getServicegruppe().isEmpty()) { + incrementFilterStats(stats, "servicegruppe"); + } + if (filterValg.getTiltakstyper() != null && !filterValg.getTiltakstyper().isEmpty()) { + incrementFilterStats(stats, "tiltakstyper"); + } + if (filterValg.getVeilederNavnQuery() != null && !filterValg.getVeilederNavnQuery().isEmpty()) { + incrementFilterStats(stats, "veiledernavnquery"); + } + if (filterValg.getVeiledere() != null && !filterValg.getVeiledere().isEmpty()) { + incrementFilterStats(stats, "veiledere"); + } + if (filterValg.getYtelse() != null && !filterValg.getYtelse().isEmpty()) { + incrementFilterStats(stats, "ytelse"); + } + if (filterValg.getRegistreringstype() != null && !filterValg.getRegistreringstype().isEmpty()) { + incrementFilterStats(stats, "registreringstype"); + } + if (filterValg.getCvJobbprofil() != null && !filterValg.getCvJobbprofil().isEmpty()) { + incrementFilterStats(stats, "cvjobbprofil"); + } + if (filterValg.getArbeidslisteKategori() != null && !filterValg.getArbeidslisteKategori().isEmpty()) { + incrementFilterStats(stats, "arbeidslistekategori"); + } + if (filterValg.getLandgruppe() != null && !filterValg.getLandgruppe().isEmpty()) { + incrementFilterStats(stats, "landgruppe"); + } + if (filterValg.getFoedeland() != null && !filterValg.getFoedeland().isEmpty()) { + incrementFilterStats(stats, "foedeland"); + } + if (filterValg.getBarnUnder18Aar() != null && !filterValg.getBarnUnder18Aar().isEmpty()) { + incrementFilterStats(stats, "barnunder18aar"); + } + if (filterValg.getTolkebehov() != null && !filterValg.getTolkebehov().isEmpty()) { + incrementFilterStats(stats, "tolkbehov"); + } + if (filterValg.getEnsligeForsorgere() != null && !filterValg.getEnsligeForsorgere().isEmpty()) { + incrementFilterStats(stats, "ensligeforsorgere"); + } + if (filterValg.getFargekategorier() != null && !filterValg.getFargekategorier().isEmpty()) { + incrementFilterStats(stats, "fargekategorier"); + } + }); + lagredeFilterStats.register(stats.entrySet().stream().map(entry -> MultiGauge.Row.of(Tags.of("filterNavn", entry.getKey()), entry.getValue())).collect(Collectors.toList()), true); + } catch (Exception e) { + log.error("Can not report metrics " + e, e); + } } - private String getHash(String veilederId) { - return DigestUtils.md5Hex(veilederId); + private void incrementFilterStats(Map stats, String statName) { + if (stats.containsKey(statName)) { + stats.put(statName, stats.get(statName) + 1); + } else { + stats.put(statName, 1); + } } } diff --git a/src/test/java/no/nav/pto/veilarbfilter/config/AppConfig.java b/src/test/java/no/nav/pto/veilarbfilter/config/AppConfig.java index 1f05e176..a7d43172 100644 --- a/src/test/java/no/nav/pto/veilarbfilter/config/AppConfig.java +++ b/src/test/java/no/nav/pto/veilarbfilter/config/AppConfig.java @@ -2,7 +2,6 @@ import no.nav.common.auth.context.AuthContextHolder; import no.nav.common.auth.context.AuthContextHolderThreadLocal; -import no.nav.common.metrics.InfluxClient; import no.nav.common.types.identer.EnhetId; import no.nav.poao_tilgang.client.Decision; import no.nav.poao_tilgang.client.PoaoTilgangClient; @@ -38,8 +37,6 @@ OverblikkVisningRepository.class, OverblikkVisningController.class}) public class AppConfig { - @MockBean - public InfluxClient metricsClient; @Bean public AuthContextHolder authContextHolder() {