Skip to content

Commit 8616e4e

Browse files
committed
clean up with a small wrapper
1 parent c032fa6 commit 8616e4e

5 files changed

Lines changed: 99 additions & 49 deletions

File tree

apps/bfd-server-ng/src/main/java/gov/cms/bfd/server/ng/beneficiary/BeneficiaryRepository.java

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
package gov.cms.bfd.server.ng.beneficiary;
22

3+
import static gov.cms.bfd.server.ng.util.MetricTimer.PATIENT_MATCH_OUTCOME;
4+
35
import gov.cms.bfd.server.ng.DbFilterParam;
46
import gov.cms.bfd.server.ng.beneficiary.filter.PatientMatchFilter;
57
import gov.cms.bfd.server.ng.beneficiary.model.*;
68
import gov.cms.bfd.server.ng.claim.model.SystemType;
79
import gov.cms.bfd.server.ng.input.DateTimeRange;
810
import gov.cms.bfd.server.ng.util.LogUtil;
11+
import gov.cms.bfd.server.ng.util.MetricTimer;
912
import io.micrometer.core.annotation.Timed;
1013
import io.micrometer.core.aop.MeterTag;
1114
import io.micrometer.core.instrument.DistributionSummary;
1215
import io.micrometer.core.instrument.MeterRegistry;
13-
import io.micrometer.core.instrument.Timer;
1416
import jakarta.persistence.EntityManager;
1517
import java.util.ArrayList;
1618
import java.util.List;
@@ -40,9 +42,9 @@ public List<BeneficiaryIdentity> getValidBeneficiaryIdentities(long beneXrefSk)
4042
return entityManager
4143
.createQuery(
4244
"""
43-
SELECT identity
44-
FROM BeneficiaryIdentity identity
45-
WHERE identity.id.xrefSk = :beneXrefSk
45+
SELECT identity
46+
FROM BeneficiaryIdentity identity
47+
WHERE identity.id.xrefSk = :beneXrefSk
4648
""",
4749
BeneficiaryIdentity.class)
4850
.setParameter("beneXrefSk", beneXrefSk)
@@ -68,12 +70,12 @@ public Optional<Beneficiary> findById(
6870
.createQuery(
6971
String.format(
7072
"""
71-
SELECT bene
72-
FROM Beneficiary bene
73-
WHERE bene.beneSk = :beneSk
74-
AND ((cast(:lowerBound AS ZonedDateTime)) IS NULL OR bene.patientMeta.updatedTimestamp %s :lowerBound)
75-
AND ((cast(:upperBound AS ZonedDateTime)) IS NULL OR bene.patientMeta.updatedTimestamp %s :upperBound)
76-
ORDER BY bene.obsoleteTimestamp DESC
73+
SELECT bene
74+
FROM Beneficiary bene
75+
WHERE bene.beneSk = :beneSk
76+
AND ((cast(:lowerBound AS ZonedDateTime)) IS NULL OR bene.patientMeta.updatedTimestamp %s :lowerBound)
77+
AND ((cast(:upperBound AS ZonedDateTime)) IS NULL OR bene.patientMeta.updatedTimestamp %s :upperBound)
78+
ORDER BY bene.obsoleteTimestamp DESC
7779
""",
7880
lastUpdatedRange.getLowerBoundSqlOperator(),
7981
lastUpdatedRange.getUpperBoundSqlOperator()),
@@ -122,9 +124,9 @@ public Optional<Long> getXrefSkFromMbi(String mbi) {
122124
return entityManager
123125
.createQuery(
124126
"""
125-
SELECT bene.xrefSk
126-
FROM Beneficiary bene
127-
WHERE bene.identifier.mbi = :mbi
127+
SELECT bene.xrefSk
128+
FROM Beneficiary bene
129+
WHERE bene.identifier.mbi = :mbi
128130
""",
129131
Long.class)
130132
.setParameter("mbi", mbi)
@@ -141,7 +143,7 @@ public Optional<Long> getXrefSkFromMbi(String mbi) {
141143
* @return beneficiary, if found
142144
*/
143145
public PatientMatchResult searchPatientMatch(PatientMatch patientMatch) {
144-
var timer = Timer.start(meterRegistry);
146+
var timer = new MetricTimer(meterRegistry);
145147
var scenariosAttempted = 0;
146148
var success = false;
147149

@@ -159,12 +161,12 @@ public PatientMatchResult searchPatientMatch(PatientMatch patientMatch) {
159161
entityManager.createQuery(
160162
String.format(
161163
"""
162-
SELECT bene
163-
FROM Beneficiary bene
164-
WHERE bene.latestTransactionFlag = 'Y'
165-
%s
166-
ORDER BY bene.obsoleteTimestamp DESC
167-
""",
164+
SELECT bene
165+
FROM Beneficiary bene
166+
WHERE bene.latestTransactionFlag = 'Y'
167+
%s
168+
ORDER BY bene.obsoleteTimestamp DESC
169+
""",
168170
filters.filterClause()),
169171
Beneficiary.class);
170172
var benes =
@@ -191,13 +193,11 @@ public PatientMatchResult searchPatientMatch(PatientMatch patientMatch) {
191193

192194
return new PatientMatchResult(combinationResults, Optional.empty(), Optional.empty());
193195
} finally {
194-
timer.stop(
195-
Timer.builder("application.beneficiary.patient_match.outcome")
196-
.tag("outcome", success ? "match" : "no_match")
197-
.register(meterRegistry));
196+
var outcome = success ? "match" : "no_match";
197+
timer.stop("application.beneficiary.patient_match.outcome", PATIENT_MATCH_OUTCOME, outcome);
198198

199199
DistributionSummary.builder("application.beneficiary.patient_match.scenarios_attempted")
200-
.tag("outcome", success ? "match" : "no_match")
200+
.tag(PATIENT_MATCH_OUTCOME, outcome)
201201
.register(meterRegistry)
202202
.record(scenariosAttempted);
203203
}

apps/bfd-server-ng/src/main/java/gov/cms/bfd/server/ng/claim/ClaimAsyncService.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package gov.cms.bfd.server.ng.claim;
22

3+
import static gov.cms.bfd.server.ng.util.MetricTimer.CLAIM_TYPE;
4+
35
import gov.cms.bfd.server.ng.DbFilter;
46
import gov.cms.bfd.server.ng.DbFilterBuilder;
57
import gov.cms.bfd.server.ng.DbFilterParam;
68
import gov.cms.bfd.server.ng.claim.model.*;
79
import gov.cms.bfd.server.ng.input.ClaimSearchCriteria;
810
import gov.cms.bfd.server.ng.util.LogUtil;
11+
import gov.cms.bfd.server.ng.util.MetricTimer;
912
import io.micrometer.core.instrument.MeterRegistry;
10-
import io.micrometer.core.instrument.Timer;
1113
import jakarta.persistence.EntityManager;
1214
import jakarta.persistence.PersistenceContext;
1315
import java.util.*;
@@ -45,7 +47,7 @@ CompletableFuture<List<C>> findByIdsInClaimType(
4547
""",
4648
baseQuery, whereClause);
4749

48-
var timer = Timer.start(meterRegistry);
50+
var timer = new MetricTimer(meterRegistry);
4951

5052
try {
5153
var result =
@@ -58,9 +60,7 @@ CompletableFuture<List<C>> findByIdsInClaimType(
5860
return CompletableFuture.completedFuture(result);
5961
} finally {
6062
timer.stop(
61-
Timer.builder("application.claim.search_by_ids_in_claim_type")
62-
.tag("claim_type", claimClass.getSimpleName())
63-
.register(meterRegistry));
63+
"application.claim.search_by_ids_in_claim_type", CLAIM_TYPE, claimClass.getSimpleName());
6464
}
6565
}
6666

@@ -83,7 +83,7 @@ protected <T extends ClaimBase> CompletableFuture<List<T>> fetchClaims(
8383
""",
8484
baseQuery, whereClause);
8585

86-
var timer = Timer.start(meterRegistry);
86+
var timer = new MetricTimer(meterRegistry);
8787

8888
try {
8989
var result =
@@ -96,9 +96,7 @@ protected <T extends ClaimBase> CompletableFuture<List<T>> fetchClaims(
9696
return CompletableFuture.completedFuture(result);
9797
} finally {
9898
timer.stop(
99-
Timer.builder("application.claim.fetch_claims_with_claim_type")
100-
.tag("claim_type", claimClass.getSimpleName())
101-
.register(meterRegistry));
99+
"application.claim.fetch_claims_with_claim_type", CLAIM_TYPE, claimClass.getSimpleName());
102100
}
103101
}
104102

apps/bfd-server-ng/src/main/java/gov/cms/bfd/server/ng/coverage/CoverageRepository.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package gov.cms.bfd.server.ng.coverage;
22

3+
import static gov.cms.bfd.server.ng.util.MetricTimer.*;
4+
35
import gov.cms.bfd.server.ng.coverage.model.BeneficiaryCoverage;
46
import gov.cms.bfd.server.ng.input.CoveragePart;
57
import gov.cms.bfd.server.ng.input.DateTimeRange;
68
import gov.cms.bfd.server.ng.util.DateUtil;
79
import gov.cms.bfd.server.ng.util.LogUtil;
10+
import gov.cms.bfd.server.ng.util.MetricTimer;
811
import io.micrometer.core.aop.MeterTag;
912
import io.micrometer.core.instrument.MeterRegistry;
10-
import io.micrometer.core.instrument.Timer;
1113
import jakarta.persistence.EntityManager;
1214
import java.util.Optional;
1315
import lombok.AllArgsConstructor;
@@ -43,7 +45,7 @@ public Optional<BeneficiaryCoverage> searchBeneficiaryWithCoverage(
4345
// In the case of rx enrollments, if multiple records have matching begin dates then we sort by
4446
// latest pdp rx info begin date.
4547

46-
var timer = Timer.start(meterRegistry);
48+
var timer = new MetricTimer(meterRegistry);
4749
var hasPartC = false;
4850
var hasPartD = false;
4951
var hasLis = false;
@@ -158,11 +160,13 @@ OR EXISTS (
158160
return beneficiaryCoverage;
159161
} finally {
160162
timer.stop(
161-
Timer.builder("application.coverage.search_by_bene")
162-
.tag("hasPartC", String.valueOf(hasPartC))
163-
.tag("hasPartD", String.valueOf(hasPartD))
164-
.tag("hasLis", String.valueOf(hasLis))
165-
.register(meterRegistry));
163+
"application.coverage.search_by_bene",
164+
HAS_PART_C,
165+
String.valueOf(hasPartC),
166+
HAS_PART_D,
167+
String.valueOf(hasPartD),
168+
HAS_LIS,
169+
String.valueOf(hasLis));
166170
}
167171
}
168172

apps/bfd-server-ng/src/main/java/gov/cms/bfd/server/ng/eob/EobHandler.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package gov.cms.bfd.server.ng.eob;
22

3+
import static gov.cms.bfd.server.ng.util.MetricTimer.SAMHSA_FILTER_MODE;
4+
35
import gov.cms.bfd.server.ng.ClaimSecurityStatus;
46
import gov.cms.bfd.server.ng.SamhsaFilterMode;
57
import gov.cms.bfd.server.ng.SecurityLabel;
@@ -11,10 +13,10 @@
1113
import gov.cms.bfd.server.ng.loadprogress.LoadProgressRepository;
1214
import gov.cms.bfd.server.ng.util.FhirUtil;
1315
import gov.cms.bfd.server.ng.util.IdrConstants;
16+
import gov.cms.bfd.server.ng.util.MetricTimer;
1417
import gov.cms.bfd.server.ng.util.SystemUrls;
1518
import io.micrometer.core.instrument.DistributionSummary;
1619
import io.micrometer.core.instrument.MeterRegistry;
17-
import io.micrometer.core.instrument.Timer;
1820
import java.time.LocalDate;
1921
import java.util.Comparator;
2022
import java.util.List;
@@ -68,7 +70,7 @@ public Optional<ExplanationOfBenefit> find(final Long fhirId, SamhsaFilterMode s
6870
* @return bundle
6971
*/
7072
public Bundle searchByBene(ClaimSearchCriteria criteria, SamhsaFilterMode samhsaFilterMode) {
71-
var timer = Timer.start(meterRegistry);
73+
var timer = new MetricTimer(meterRegistry);
7274

7375
try {
7476
var beneSk = criteria.beneSk();
@@ -98,21 +100,18 @@ public Bundle searchByBene(ClaimSearchCriteria criteria, SamhsaFilterMode samhsa
98100
.map(claim -> transformToFhir(claim, samhsaFilterMode));
99101

100102
var bundle = FhirUtil.bundleOrDefault(filteredClaims, loadProgressRepository::lastUpdated);
101-
102103
recordResultSize(bundle, samhsaFilterMode);
103-
104104
return bundle;
105+
105106
} finally {
106107
timer.stop(
107-
Timer.builder("application.eob.handler.search_by_bene")
108-
.tag("samhsa_filter_mode", samhsaFilterMode.name())
109-
.register(meterRegistry));
108+
"application.eob.handler.search_by_bene", SAMHSA_FILTER_MODE, samhsaFilterMode.name());
110109
}
111110
}
112111

113112
private void recordResultSize(Bundle bundle, SamhsaFilterMode samhsaFilterMode) {
114113
DistributionSummary.builder("application.eob.handler.results.size")
115-
.tag("samhsa_filter_mode", samhsaFilterMode.name())
114+
.tag(SAMHSA_FILTER_MODE, samhsaFilterMode.name())
116115
.register(meterRegistry)
117116
.record(bundle.getEntry().size());
118117
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package gov.cms.bfd.server.ng.util;
2+
3+
import io.micrometer.core.instrument.MeterRegistry;
4+
import io.micrometer.core.instrument.Timer;
5+
6+
/** Utility class used for metric timing recordings with dynamic tags. */
7+
public class MetricTimer {
8+
9+
/** Metric tag name for the claim type being queried. */
10+
public static final String CLAIM_TYPE = "claim_type";
11+
12+
/** Metric tag name for the samhsa filter mode used. */
13+
public static final String SAMHSA_FILTER_MODE = "samhsa_filter_mode";
14+
15+
/** Metric tag name indicating if an operation was successful. */
16+
public static final String PATIENT_MATCH_OUTCOME = "outcome";
17+
18+
/** Metric tag name indicating whether a coverage query included Part C. */
19+
public static final String HAS_PART_C = "hasPartC";
20+
21+
/** Metric tag name indicating whether a coverage query included Part D. */
22+
public static final String HAS_PART_D = "hasPartD";
23+
24+
/** Metric tag name indicating whether a coverage query included LIS. */
25+
public static final String HAS_LIS = "hasLis";
26+
27+
private final MeterRegistry meterRegistry;
28+
private final Timer.Sample timer;
29+
30+
/**
31+
* Creates a metrics timer and starts timing from this point forward until stop.
32+
*
33+
* @param meterRegistry the registry used to publish the recorded timer metric.
34+
*/
35+
public MetricTimer(MeterRegistry meterRegistry) {
36+
this.meterRegistry = meterRegistry;
37+
this.timer = Timer.start(meterRegistry);
38+
}
39+
40+
/**
41+
* Stops the timer and records the metric with the provided name and tags.
42+
*
43+
* @param metricName metric name to record
44+
* @param tags alternating tag keys and values
45+
*/
46+
public void stop(String metricName, String... tags) {
47+
timer.stop(Timer.builder(metricName).tags(tags).register(meterRegistry));
48+
}
49+
}

0 commit comments

Comments
 (0)