Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,12 @@ public class MetricsConfiguration {

/** List of metric names that are allowed to be published to Cloudwatch by Micrometer. */
public static final Set<String> MICROMETER_ALLOWED_METRIC_PREFIX_NAMES =
Set.of("application.", "jvm.threads.virtual.", "executor.");
Set.of(
"application.",
"jvm.threads.virtual.",
"executor.",
"http-requests.latency.",
"http-requests.count.");

/**
* Configures Micrometer to support @MeterTag annotations with SPEL expressions.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package gov.cms.bfd.server.ng.beneficiary;

import static gov.cms.bfd.server.ng.util.MetricTimer.PATIENT_MATCH_OUTCOME;
import static gov.cms.bfd.server.ng.util.MetricRecorder.PATIENT_MATCH_OUTCOME;

import gov.cms.bfd.server.ng.DbFilterParam;
import gov.cms.bfd.server.ng.beneficiary.filter.PatientMatchFilter;
Expand All @@ -9,11 +9,9 @@
import gov.cms.bfd.server.ng.input.DateTimeRange;
import gov.cms.bfd.server.ng.log.QueryTelemetryUtil;
import gov.cms.bfd.server.ng.util.LogUtil;
import gov.cms.bfd.server.ng.util.MetricTimer;
import gov.cms.bfd.server.ng.util.MetricRecorder;
import io.micrometer.core.annotation.Timed;
import io.micrometer.core.aop.MeterTag;
import io.micrometer.core.instrument.DistributionSummary;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tags;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
Expand All @@ -32,8 +30,7 @@
@SuppressWarnings("java:S2077")
public class BeneficiaryRepository {
@PersistenceContext private EntityManager entityManager;
private final MeterRegistry meterRegistry;
private final MetricTimer metricTimer;
private final MetricRecorder metricRecorder;
private final QueryTelemetryUtil queryTelemetryUtil;

private static final String PATIENT_MATCH_TYPE = "exact";
Expand Down Expand Up @@ -162,7 +159,7 @@ public PatientMatchResult searchPatientMatch(PatientMatch patientMatch) {
""";

var result =
metricTimer.recordMetric(
metricRecorder.recordMetric(
"application.beneficiary.patient_match.outcome",
() -> {
var combinationResults = new ArrayList<MatchCombinationResult>();
Expand Down Expand Up @@ -210,10 +207,12 @@ public PatientMatchResult searchPatientMatch(PatientMatch patientMatch) {
PATIENT_MATCH_OUTCOME,
r.matchedBeneficiary().isPresent() ? "match" : "no_match"));

DistributionSummary.builder("application.beneficiary.patient_match.scenarios_attempted")
.tag(PATIENT_MATCH_OUTCOME, result.matchedBeneficiary().isPresent() ? "match" : "no_match")
.register(meterRegistry)
.record(result.combinations().size());
metricRecorder.recordDistribution(
"application.beneficiary.patient_match.scenarios_attempted",
result.combinations().size(),
PATIENT_MATCH_OUTCOME,
result.matchedBeneficiary().isPresent() ? "match" : "no_match");

return result;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package gov.cms.bfd.server.ng.claim;

import static gov.cms.bfd.server.ng.util.MetricTimer.CLAIM_TYPE;
import static gov.cms.bfd.server.ng.util.MetricRecorder.CLAIM_TYPE;

import gov.cms.bfd.server.ng.DbFilter;
import gov.cms.bfd.server.ng.DbFilterBuilder;
Expand All @@ -9,7 +9,7 @@
import gov.cms.bfd.server.ng.input.ClaimSearchCriteria;
import gov.cms.bfd.server.ng.log.QueryTelemetryUtil;
import gov.cms.bfd.server.ng.util.LogUtil;
import gov.cms.bfd.server.ng.util.MetricTimer;
import gov.cms.bfd.server.ng.util.MetricRecorder;
import io.micrometer.core.instrument.Tags;
import jakarta.persistence.EntityManagerFactory;
import java.util.*;
Expand All @@ -28,7 +28,7 @@
public class ClaimAsyncService {

private final EntityManagerFactory entityManagerFactory;
private final MetricTimer metricTimer;
private final MetricRecorder metricRecorder;
private final QueryTelemetryUtil queryTelemetryUtil;

@Async
Expand All @@ -52,7 +52,7 @@ CompletableFuture<List<C>> findByIdsInClaimType(
""",
baseQuery, whereClause);

return metricTimer.recordMetricAsync(
return metricRecorder.recordMetricAsync(
"application.claim.search_by_ids_in_claim_type",
() -> Tags.of(CLAIM_TYPE, claimClass.getSimpleName()),
() -> {
Expand Down Expand Up @@ -89,7 +89,7 @@ protected <T extends ClaimBase> CompletableFuture<List<T>> fetchClaims(
""",
baseQuery, whereClause);
try (var entityManager = entityManagerFactory.createEntityManager()) {
return metricTimer.recordMetricAsync(
return metricRecorder.recordMetricAsync(
"application.claim.fetch_claims_with_claim_type",
() -> Tags.of(CLAIM_TYPE, claimClass.getSimpleName()),
() -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,9 @@
import gov.cms.bfd.server.ng.claim.model.*;
import gov.cms.bfd.server.ng.input.ClaimSearchCriteria;
import gov.cms.bfd.server.ng.input.DateTimeRange;
import gov.cms.bfd.server.ng.util.MetricRecorder;
import io.micrometer.core.annotation.Timed;
import io.micrometer.core.aop.MeterTag;
import io.micrometer.core.instrument.DistributionSummary;
import io.micrometer.core.instrument.MeterRegistry;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Stream;
Expand All @@ -21,7 +20,7 @@
public class ClaimRepository {

private final ClaimAsyncService asyncService;
private final MeterRegistry meterRegistry;
private final MetricRecorder metricRecorder;

private static final String CLAIM_PROFESSIONAL_SHARED_SYSTEMS =
"""
Expand Down Expand Up @@ -192,9 +191,7 @@ public List<ClaimBase> findByBeneXrefSk(
d.baseQuery(), d.claimClass(), d.systemType(), criteria, filterBuilders))
.toList();

DistributionSummary.builder("application.claim.search_by_bene.fan_out")
.register(meterRegistry)
.record(futures.size());
metricRecorder.recordDistribution("application.claim.search_by_bene.fan_out", futures.size());

CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
Stream<ClaimBase> claims = futures.stream().flatMap(f -> f.join().stream());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package gov.cms.bfd.server.ng.coverage;

import static gov.cms.bfd.server.ng.util.MetricTimer.*;
import static gov.cms.bfd.server.ng.util.MetricRecorder.*;

import gov.cms.bfd.server.ng.coverage.model.BeneficiaryCoverage;
import gov.cms.bfd.server.ng.input.CoveragePart;
import gov.cms.bfd.server.ng.input.DateTimeRange;
import gov.cms.bfd.server.ng.log.QueryTelemetryUtil;
import gov.cms.bfd.server.ng.util.DateUtil;
import gov.cms.bfd.server.ng.util.MetricTimer;
import gov.cms.bfd.server.ng.util.MetricRecorder;
import io.micrometer.core.aop.MeterTag;
import io.micrometer.core.instrument.Tags;
import jakarta.persistence.EntityManager;
Expand All @@ -25,7 +25,7 @@ public class CoverageRepository {
@PersistenceContext private EntityManager entityManager;
private final DateUtil dateUtil;
private final QueryTelemetryUtil queryTelemetryUtil;
private final MetricTimer metricTimer;
private final MetricRecorder metricRecorder;

/**
* Retrieves a {@link BeneficiaryCoverage} record by its ID and last updated timestamp.
Expand Down Expand Up @@ -141,7 +141,7 @@ OR EXISTS (
.setParameter("today", benefitDate)
.setParameter("beneSk", beneSk);

return metricTimer.recordMetric(
return metricRecorder.recordMetric(
"application.coverage.search_by_bene",
() ->
queryTelemetryUtil.executeAndTrack("searchBeneficiaryWithCoverage", query).stream()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package gov.cms.bfd.server.ng.eob;

import static gov.cms.bfd.server.ng.util.MetricTimer.SAMHSA_FILTER_MODE;
import static gov.cms.bfd.server.ng.util.MetricRecorder.SAMHSA_FILTER_MODE;

import gov.cms.bfd.server.ng.ClaimFilterOptions;
import gov.cms.bfd.server.ng.ClaimSecurityStatus;
Expand All @@ -14,10 +14,8 @@
import gov.cms.bfd.server.ng.loadprogress.LoadProgressRepository;
import gov.cms.bfd.server.ng.util.FhirUtil;
import gov.cms.bfd.server.ng.util.IdrConstants;
import gov.cms.bfd.server.ng.util.MetricTimer;
import gov.cms.bfd.server.ng.util.MetricRecorder;
import gov.cms.bfd.server.ng.util.SystemUrls;
import io.micrometer.core.instrument.DistributionSummary;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tags;
import java.time.LocalDate;
import java.util.Comparator;
Expand All @@ -44,8 +42,7 @@ public class EobHandler {
private final BeneficiaryRepository beneficiaryRepository;
private final ClaimRepository claimRepository;
private final LoadProgressRepository loadProgressRepository;
private final MeterRegistry meterRegistry;
private final MetricTimer metricTimer;
private final MetricRecorder metricRecorder;

// Cache the security labels map to avoid repeated I/O and parsing
private static final Map<String, List<SecurityLabel>> SECURITY_LABELS =
Expand Down Expand Up @@ -91,29 +88,28 @@ public Bundle searchByBene(ClaimSearchCriteria criteria, ClaimFilterOptions opti
criteria.sources());

var claims = claimRepository.findByBeneXrefSk(repositoryCriteria);

var filteredClaims =
metricTimer.recordMetric(
"application.eob.handler.search_by_bene",
() ->
filterSamhsaClaims(claims, options.getSamhsaFilterMode())
.skip(repositoryCriteria.resolveOffset())
.limit(repositoryCriteria.resolveLimit())
.map(claim -> transformToFhir(claim, options)),
_ -> Tags.of(SAMHSA_FILTER_MODE, options.getSamhsaFilterMode().name()));

var bundle = FhirUtil.bundleOrDefault(filteredClaims, loadProgressRepository::lastUpdated);
recordResultSize(bundle, options.getSamhsaFilterMode());
var samhsaFilterMode = options.getSamhsaFilterMode();

var bundle =
metricRecorder.recordMetric(
"application.eob.handler.transform",
() -> {
var filteredClaims =
filterSamhsaClaims(claims, samhsaFilterMode)
.skip(repositoryCriteria.resolveOffset())
.limit(repositoryCriteria.resolveLimit())
.map(claim -> transformToFhir(claim, options));
return FhirUtil.bundleOrDefault(filteredClaims, loadProgressRepository::lastUpdated);
},
_ -> Tags.of(SAMHSA_FILTER_MODE, samhsaFilterMode.name()));
metricRecorder.recordDistribution(
"application.eob.handler.results.size",
bundle.getEntry().size(),
SAMHSA_FILTER_MODE,
samhsaFilterMode.name());
return bundle;
}

private void recordResultSize(Bundle bundle, SamhsaFilterMode samhsaFilterMode) {
DistributionSummary.builder("application.eob.handler.results.size")
.tag(SAMHSA_FILTER_MODE, samhsaFilterMode.name())
.register(meterRegistry)
.record(bundle.getEntry().size());
}

private Stream<? extends ClaimBase> filterSamhsaClaims(
List<? extends ClaimBase> claims, SamhsaFilterMode samhsaFilterMode) {
// Process claims in parallel
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ public void doFilter(
if (servletRequest instanceof HttpServletRequest httpRequest
&& servletResponse instanceof HttpServletResponse httpResponse) {
requestTelemetryLogger.recordResponse(httpRequest, httpResponse);
requestTelemetryLogger.logRequestComplete(httpRequest, httpResponse);
}
// Clean up to prevent leaks
MDC.clear();
Expand Down
Loading