Example1: Metric to capture api’s response time
Following metrics to be captured on api response time.
a. Total number of requests
b. Sum of all the response times
c. Maximum response time across all the apis
d. Minimum response time across all the apis
Example 2: Metric to capture outbound data transfer
a. Total number of data outbound requests.
b. Sum of data transferred
c. Maximum data size transferred in a given request
d. Minimum data size transferred in a given request
If you see above examples, it is good to capture the unit type in the metrics summary.
For example,
a. Unit for the response time can be milliseconds, seconds, minutes etc., for response time and
b. Unit for the data size can be in bits, bytes, KBs, MBs etc.,
Every Metric should have a name like apiResponseTimes, outboundDataSize etc., As we are going to maintain only the summary, we no need to store the granular level details like what is the response time at api level etc.,
Find the below working application.
AppMetric.java
package com.sample.app.commons;
public enum AppMetric {
API_RESPONSE_TIMES("Api response times"), OUT_BOUND_DATA_SIZE("Out bound data size");
AppMetric(String metricName) {
this.metricName = metricName;
}
String metricName;
}
AppMetricUnit.java
package com.sample.app.commons;
public enum AppMetricUnit {
MILLI_SECONDS,
SECONDS,
MINUTES,
BITS,
BYTES
}
AppMetricStats.java
package com.sample.app.commons;
import java.util.concurrent.atomic.AtomicLong;
public class AppMetricStats {
private final AppMetric appMetric;
private final AppMetricUnit appMetricUnit;
private final AtomicLong sum = new AtomicLong();
private final AtomicLong count = new AtomicLong();
private final AtomicLong maxValue = new AtomicLong(Long.MIN_VALUE);
private final AtomicLong minValue = new AtomicLong(Long.MAX_VALUE);
public AppMetricStats(AppMetric appMetric, AppMetricUnit appMetricUnit) {
this.appMetric = appMetric;
this.appMetricUnit = appMetricUnit;
}
public AppMetric getAppMeric() {
return appMetric;
}
public long getSum() {
return sum.get();
}
public long getCount() {
return count.get();
}
public long getMaxValue() {
return maxValue.get();
}
public long getMinValue() {
return minValue.get();
}
public AppMetricUnit getAppMetricUnit() {
return appMetricUnit;
}
public void addValue(long value) {
sum.addAndGet(value);
count.incrementAndGet();
maxValue.accumulateAndGet(value, Math::max);
minValue.accumulateAndGet(value, Math::min);
}
public void set(long sum, long count, long max, long min) {
this.sum.set(sum);
this.count.set(count);
this.maxValue.set(max);
this.minValue.set(min);
}
@Override
public String toString() {
return "AppMetricStats [appMetric=" + appMetric + ", appMetricUnit=" + appMetricUnit + ", sum=" + sum
+ ", count=" + count + ", maxValue=" + maxValue + ", minValue=" + minValue + "]";
}
}
AppMetricStatsDemo.java
package com.sample.app;
import com.sample.app.commons.AppMetric;
import com.sample.app.commons.AppMetricStats;
import com.sample.app.commons.AppMetricUnit;
public class AppMetricStatsDemo {
public static void main(String[] args) {
AppMetricStats stats = new AppMetricStats(AppMetric.API_RESPONSE_TIMES, AppMetricUnit.MILLI_SECONDS);
stats.addValue(100);
System.out.println(stats);
stats.addValue(90);
System.out.println(stats);
stats.addValue(900);
System.out.println(stats);
}
}
Output
AppMetricStats [appMetric=API_RESPONSE_TIMES, appMetricUnit=MILLI_SECONDS, sum=100, count=1, maxValue=100, minValue=100] AppMetricStats [appMetric=API_RESPONSE_TIMES, appMetricUnit=MILLI_SECONDS, sum=190, count=2, maxValue=100, minValue=90] AppMetricStats [appMetric=API_RESPONSE_TIMES, appMetricUnit=MILLI_SECONDS, sum=1090, count=3, maxValue=900, minValue=90]
You may like
How to break out of nested loops in Java?
Implementation of Bag data structure in Java
Scanner throws java.util.NoSuchElementException while reading the input
How to get all the enum values in Java?
No comments:
Post a Comment