package org.apache.synapse.transport.nhttp.util;
import org.apache.http.protocol.HttpContext;
import org.apache.synapse.transport.nhttp.NhttpConstants;
public class LatencyCollector {
private long backendLatency = 0;
private long latency = 0;
private long serverDecodeLatency = 0;
private long clientEncodeLatency = 0;
private long clientDecodeLatency = 0;
private long serverEncodeLatency = 0;
private long serverWorkerQueuedTime = 0;
private long clientWorkerQueuedTime = 0;
private long serverWorkerLatency = 0;
private long clientWorkerLatency = 0;
public LatencyCollector(HttpContext context, boolean isS2S) {
Object o1, o2, o3, o4;
o1 = context.getAttribute(NhttpConstants.REQ_ARRIVAL_TIME);
o2 = context.getAttribute(NhttpConstants.REQ_DEPARTURE_TIME);
if (isS2S) {
o3 = context.getAttribute(NhttpConstants.RES_HEADER_ARRIVAL_TIME);
o4 = context.getAttribute(NhttpConstants.RES_TO_CLIENT_WRITE_START_TIME);
} else {
o3 = context.getAttribute(NhttpConstants.RES_ARRIVAL_TIME);
o4 = context.getAttribute(NhttpConstants.RES_DEPARTURE_TIME);
}
if (o1 != null && o2 != null && o3 != null && o4 != null) {
long tReqArrival = (Long) o1;
long tReqDeparture = (Long) o2;
long tResArrival = (Long) o3;
long tResDeparture = (Long) o4;
backendLatency = (tResArrival - tReqDeparture);
latency = (tResDeparture - tReqArrival) - backendLatency;
}
o1 = context.getAttribute(NhttpConstants.REQ_FROM_CLIENT_READ_START_TIME);
o2 = context.getAttribute(NhttpConstants.REQ_FROM_CLIENT_READ_END_TIME);
long reqestFromClientReadEndTime = 0;
if (o1 != null && o2 != null) {
reqestFromClientReadEndTime = (Long) o2;
serverDecodeLatency = reqestFromClientReadEndTime - (Long) o1;
}
o1 = context.getAttribute(NhttpConstants.REQ_TO_BACKEND_WRITE_START_TIME);
o2 = context.getAttribute(NhttpConstants.REQ_TO_BACKEND_WRITE_END_TIME);
if (o1 != null && o2 != null) {
clientEncodeLatency = (Long) o2 - (Long) o1;
}
o1 = context.getAttribute(NhttpConstants.RES_FROM_BACKEND_READ_START_TIME);
o2 = context.getAttribute(NhttpConstants.RES_FROM_BACKEND_READ_END_TIME);
long responseFromBEReadEndTime = 0;
if (o1 != null && o2 != null) {
responseFromBEReadEndTime = (Long) o2;
clientDecodeLatency = responseFromBEReadEndTime - (Long) o1;
}
o1 = context.getAttribute(NhttpConstants.RES_TO_CLIENT_WRITE_START_TIME);
o2 = context.getAttribute(NhttpConstants.RES_TO_CLIENT_WRITE_END_TIME);
if (o1 != null && o2 != null) {
serverEncodeLatency = (Long) o2 - (Long) o1;
}
long serverWorkerStartTime = 0;
o1 = context.getAttribute(NhttpConstants.SERVER_WORKER_START_TIME);
o2 = context.getAttribute(NhttpConstants.SERVER_WORKER_INIT_TIME);
if (o1 != null && o2 != null) {
serverWorkerStartTime = (Long) o1;
serverWorkerQueuedTime = serverWorkerStartTime - (Long) o2;
}
o1 = context.getAttribute(NhttpConstants.CLIENT_WORKER_START_TIME);
o2 = context.getAttribute(NhttpConstants.CLIENT_WORKER_INIT_TIME);
long clientWorkerStartTime = 0;
if (o1 != null && o2 != null) {
clientWorkerStartTime = (Long) o1;
clientWorkerQueuedTime = clientWorkerStartTime - (Long) o2;
}
o1 = context.getAttribute(NhttpConstants.REQ_TO_BACKEND_WRITE_START_TIME);
o2 = context.getAttribute(NhttpConstants.SERVER_WORKER_START_TIME);
if (o1 != null && o2 != null) {
serverWorkerLatency = (Long) o1 - (Long) o2;
}
o1 = context.getAttribute(NhttpConstants.RES_TO_CLIENT_WRITE_START_TIME);
o2 = context.getAttribute(NhttpConstants.CLIENT_WORKER_START_TIME);
if (o1 != null && o2 != null) {
clientWorkerLatency = (Long) o1 - (Long) o2;
}
if (clientWorkerQueuedTime > 0) {
if (responseFromBEReadEndTime > clientWorkerStartTime) {
if (!isS2S) {
backendLatency = backendLatency - clientWorkerQueuedTime;
}
clientDecodeLatency = clientDecodeLatency - clientWorkerQueuedTime;
}
}
if (serverWorkerQueuedTime > 0) {
if (reqestFromClientReadEndTime > serverWorkerStartTime) {
serverDecodeLatency = serverDecodeLatency - serverWorkerQueuedTime;
}
}
}
public long getBackendLatency() {
return backendLatency;
}
public long getLatency() {
return latency;
}
public long getServerDecodeLatency() {
return serverDecodeLatency;
}
public long getServerEncodeLatency() {
return serverEncodeLatency;
}
public long getClientEncodeLatency() {
return clientEncodeLatency;
}
public long getClientDecodeLatency() {
return clientDecodeLatency;
}
public long getServerWorkerQueuedTime() {
return serverWorkerQueuedTime;
}
public long getClientWorkerQueuedTime() {
return clientWorkerQueuedTime;
}
public long getServerWorkerLatency() {
return serverWorkerLatency;
}
public long getClientWorkerLatency() {
return clientWorkerLatency;
}
public static void clearTimestamps(HttpContext context) {
if (context == null) {
return;
}
context.removeAttribute(NhttpConstants.REQ_ARRIVAL_TIME);
context.removeAttribute(NhttpConstants.REQ_DEPARTURE_TIME);
context.removeAttribute(NhttpConstants.RES_HEADER_ARRIVAL_TIME);
context.removeAttribute(NhttpConstants.RES_TO_CLIENT_WRITE_START_TIME);
context.removeAttribute(NhttpConstants.RES_ARRIVAL_TIME);
context.removeAttribute(NhttpConstants.RES_DEPARTURE_TIME);
context.removeAttribute(NhttpConstants.REQ_FROM_CLIENT_READ_START_TIME);
context.removeAttribute(NhttpConstants.REQ_FROM_CLIENT_READ_END_TIME);
context.removeAttribute(NhttpConstants.REQ_TO_BACKEND_WRITE_START_TIME);
context.removeAttribute(NhttpConstants.REQ_TO_BACKEND_WRITE_END_TIME);
context.removeAttribute(NhttpConstants.RES_FROM_BACKEND_READ_START_TIME);
context.removeAttribute(NhttpConstants.RES_FROM_BACKEND_READ_END_TIME);
context.removeAttribute(NhttpConstants.RES_TO_CLIENT_WRITE_END_TIME);
context.removeAttribute(NhttpConstants.SERVER_WORKER_START_TIME);
context.removeAttribute(NhttpConstants.SERVER_WORKER_INIT_TIME);
context.removeAttribute(NhttpConstants.CLIENT_WORKER_START_TIME);
context.removeAttribute(NhttpConstants.CLIENT_WORKER_INIT_TIME);
}
}