support total block requests

This commit is contained in:
Francis Dong
2021-07-05 17:02:27 +08:00
committed by linwaiwai
parent 54bc0c23b9
commit d343fcfe8e
4 changed files with 73 additions and 0 deletions

View File

@@ -28,6 +28,7 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.function.BiFunction;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -110,6 +111,21 @@ public class FlowStat {
* @return IncrRequestResult * @return IncrRequestResult
*/ */
public IncrRequestResult incrRequest(List<ResourceConfig> resourceConfigs, long curTimeSlotId) { public IncrRequestResult incrRequest(List<ResourceConfig> resourceConfigs, long curTimeSlotId) {
return incrRequest(resourceConfigs, curTimeSlotId, null);
}
/**
* Increase concurrent request counter for given resources chain
*
* @param resourceConfigs Resource configurations
* @param curTimeSlotId current time slot ID, it should be generated by
* Flowstat.currentTimeSlotId()
* @param totalBlockFunc [optional] callback function for statistic of total
* block requests of the resource and its parent resources
* @return IncrRequestResult
*/
public IncrRequestResult incrRequest(List<ResourceConfig> resourceConfigs, long curTimeSlotId,
BiFunction<ResourceConfig, List<ResourceConfig>, List<ResourceConfig>> totalBlockFunc) {
if (resourceConfigs == null || resourceConfigs.size() == 0) { if (resourceConfigs == null || resourceConfigs.size() == 0) {
return null; return null;
} }
@@ -126,6 +142,16 @@ public class FlowStat {
long n = resourceStat.getConcurrentRequests().get(); long n = resourceStat.getConcurrentRequests().get();
if (n >= maxCon) { if (n >= maxCon) {
resourceStat.incrBlockRequestToTimeSlot(curTimeSlotId); resourceStat.incrBlockRequestToTimeSlot(curTimeSlotId);
if (totalBlockFunc != null) {
List<ResourceConfig> parentResCfgs = totalBlockFunc.apply(resourceConfig,
resourceConfigs);
if (parentResCfgs != null && parentResCfgs.size() > 0) {
for (ResourceConfig pResCfg : parentResCfgs) {
getResourceStat(pResCfg.getResourceId())
.incrTotalBlockRequestToTimeSlot(curTimeSlotId);
}
}
}
return IncrRequestResult.block(resourceConfig.getResourceId(), return IncrRequestResult.block(resourceConfig.getResourceId(),
BlockType.CONCURRENT_REQUEST); BlockType.CONCURRENT_REQUEST);
} }
@@ -136,6 +162,16 @@ public class FlowStat {
long total = resourceStat.getTimeSlot(curTimeSlotId).getCounter().get(); long total = resourceStat.getTimeSlot(curTimeSlotId).getCounter().get();
if (total >= maxQPS) { if (total >= maxQPS) {
resourceStat.incrBlockRequestToTimeSlot(curTimeSlotId); resourceStat.incrBlockRequestToTimeSlot(curTimeSlotId);
if (totalBlockFunc != null) {
List<ResourceConfig> parentResCfgs = totalBlockFunc.apply(resourceConfig,
resourceConfigs);
if (parentResCfgs != null && parentResCfgs.size() > 0) {
for (ResourceConfig pResCfg : parentResCfgs) {
getResourceStat(pResCfg.getResourceId())
.incrTotalBlockRequestToTimeSlot(curTimeSlotId);
}
}
}
return IncrRequestResult.block(resourceConfig.getResourceId(), BlockType.QPS); return IncrRequestResult.block(resourceConfig.getResourceId(), BlockType.QPS);
} }
} }

View File

@@ -128,6 +128,14 @@ public class ResourceStat {
public void incrBlockRequestToTimeSlot(long timeSlotId) { public void incrBlockRequestToTimeSlot(long timeSlotId) {
this.getTimeSlot(timeSlotId).getBlockRequests().incrementAndGet(); this.getTimeSlot(timeSlotId).getBlockRequests().incrementAndGet();
} }
/**
* Increase total block request to the specified time slot
*
*/
public void incrTotalBlockRequestToTimeSlot(long timeSlotId) {
this.getTimeSlot(timeSlotId).getTotalBlockRequests().incrementAndGet();
}
/** /**
* Add request to the specified time slot * Add request to the specified time slot
@@ -197,6 +205,7 @@ public class ResourceStat {
long peakConcurrences = 0; long peakConcurrences = 0;
long errors = 0; long errors = 0;
long blockReqs = 0; long blockReqs = 0;
long totalBlockReqs = 0;
long compReqs = 0; long compReqs = 0;
for (long i = startSlotId; i < endSlotId;) { for (long i = startSlotId; i < endSlotId;) {
if (timeSlots.containsKey(i)) { if (timeSlots.containsKey(i)) {
@@ -210,6 +219,7 @@ public class ResourceStat {
totalRt = totalRt + timeSlot.getTotalRt().get(); totalRt = totalRt + timeSlot.getTotalRt().get();
errors = errors + timeSlot.getErrors().get(); errors = errors + timeSlot.getErrors().get();
blockReqs = blockReqs + timeSlot.getBlockRequests().get(); blockReqs = blockReqs + timeSlot.getBlockRequests().get();
totalBlockReqs = totalBlockReqs + timeSlot.getTotalBlockRequests().get();
compReqs = compReqs + timeSlot.getCompReqs().get(); compReqs = compReqs + timeSlot.getCompReqs().get();
} }
i = i + FlowStat.INTERVAL; i = i + FlowStat.INTERVAL;
@@ -220,6 +230,7 @@ public class ResourceStat {
tws.setTotal(totalReqs); tws.setTotal(totalReqs);
tws.setErrors(errors); tws.setErrors(errors);
tws.setBlockRequests(blockReqs); tws.setBlockRequests(blockReqs);
tws.setTotalBlockRequests(totalBlockReqs);
tws.setCompReqs(compReqs); tws.setCompReqs(compReqs);
if (compReqs > 0) { if (compReqs > 0) {

View File

@@ -70,6 +70,11 @@ public class TimeSlot {
* Block requests <br/> * Block requests <br/>
*/ */
private AtomicLong blockRequests = new AtomicLong(0); private AtomicLong blockRequests = new AtomicLong(0);
/**
* Total block requests of the resource and its underlying resources <br/>
*/
private AtomicLong totalBlockRequests = new AtomicLong(0);
public TimeSlot(long id) { public TimeSlot(long id) {
this.id = id; this.id = id;
@@ -181,4 +186,12 @@ public class TimeSlot {
this.compReqs = compReqs; this.compReqs = compReqs;
} }
public AtomicLong getTotalBlockRequests() {
return totalBlockRequests;
}
public void setTotalBlockRequests(AtomicLong totalBlockRequests) {
this.totalBlockRequests = totalBlockRequests;
}
} }

View File

@@ -79,6 +79,11 @@ public class TimeWindowStat {
* Block requests * Block requests
*/ */
private Long blockRequests; private Long blockRequests;
/**
* Total block requests
*/
private Long totalBlockRequests;
public Long getBlockRequests() { public Long getBlockRequests() {
return blockRequests; return blockRequests;
@@ -168,4 +173,12 @@ public class TimeWindowStat {
this.compReqs = compReqs; this.compReqs = compReqs;
} }
public Long getTotalBlockRequests() {
return totalBlockRequests;
}
public void setTotalBlockRequests(Long totalBlockRequests) {
this.totalBlockRequests = totalBlockRequests;
}
} }