|
@ -3,11 +3,11 @@ package com.yihu.hos.broker.services;
|
|
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
import com.mongodb.*;
|
|
|
import com.yihu.hos.broker.models.BusinessLog;
|
|
|
import com.yihu.hos.broker.models.ServiceMetrics;
|
|
|
import com.yihu.hos.core.datatype.DateUtil;
|
|
|
import com.yihu.hos.core.datatype.NumberUtil;
|
|
|
import com.yihu.hos.core.datatype.StringUtil;
|
|
|
import com.yihu.hos.broker.models.BusinessLog;
|
|
|
import com.yihu.hos.broker.models.ServiceMetrics;
|
|
|
import org.json.JSONObject;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
@ -15,7 +15,10 @@ import org.springframework.data.mongodb.core.MongoOperations;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
import java.util.*;
|
|
|
import java.util.Date;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
|
|
|
/**
|
|
|
* Created by chenweida on 2016/1/27.
|
|
@ -31,61 +34,6 @@ public class ServiceMonitorService {
|
|
|
private MongoOperations mongoOperations;
|
|
|
|
|
|
private DBCollection businessLog;
|
|
|
// public Result mapReduce(String beginTime, String endTime) {
|
|
|
// DBCollection businessLogDB = mongoOperations.getCollection(mongoOperations
|
|
|
// .getCollectionName(BusinessLog.class));
|
|
|
//
|
|
|
// String map = "function(){emit(this.breadcrumbId, this.fireTime);}";
|
|
|
// String reduce = "function(key, values){ return values[0];}";
|
|
|
// String out = reduceTableName;
|
|
|
// BasicDBObject queryObject = new BasicDBObject().append(QueryOperators.AND,
|
|
|
// new BasicDBObject[]{
|
|
|
// new BasicDBObject().append("fireTime",
|
|
|
// new BasicDBObject().append(QueryOperators.GTE, DateUtil.toTimestamp(beginTime))),
|
|
|
// new BasicDBObject().append("fireTime",
|
|
|
// new BasicDBObject().append(QueryOperators.LT, DateUtil.toTimestamp(endTime)))});
|
|
|
//
|
|
|
// MapReduceOutput mapReduceOutput = businessLogDB.mapReduce(map,
|
|
|
// reduce.toString(), out, queryObject);
|
|
|
// DBCollection resultColl = mapReduceOutput.getOutputCollection();
|
|
|
// DBCursor cursor = resultColl.find();
|
|
|
// String result = "";
|
|
|
//
|
|
|
// while (cursor.hasNext()) {
|
|
|
// result += cursor.next();
|
|
|
// }
|
|
|
// return Result.success(result);
|
|
|
// }
|
|
|
//
|
|
|
// public JSONObject aggregate(String beginTime, String endTime) {
|
|
|
// DBCollection reduceDB = mongoOperations.getCollection(mongoOperations
|
|
|
// .getCollectionName(ReduceResult.class));
|
|
|
// BasicDBObject queryObject = new BasicDBObject().append(QueryOperators.AND,
|
|
|
// new BasicDBObject[]{
|
|
|
// new BasicDBObject().append("value",
|
|
|
// new BasicDBObject().append(QueryOperators.GTE, DateUtil.toTimestamp(beginTime))),
|
|
|
// new BasicDBObject().append("value",
|
|
|
// new BasicDBObject().append(QueryOperators.LT, DateUtil.toTimestamp(endTime)))});
|
|
|
//
|
|
|
// DBObject match = new BasicDBObject("$match", queryObject);
|
|
|
//
|
|
|
// // Now the $group operation
|
|
|
// DBObject groupFields = new BasicDBObject( "_id", new BasicDBObject("$minute", "$value"));
|
|
|
// groupFields.put("pv", new BasicDBObject( "$sum", 1));
|
|
|
// DBObject group = new BasicDBObject("$group", groupFields);
|
|
|
//
|
|
|
// // build the $sort operation
|
|
|
// DBObject sortFields = new BasicDBObject( "_id", 1);
|
|
|
// DBObject sort = new BasicDBObject("$sort", sortFields );
|
|
|
// // run aggregation
|
|
|
// AggregationOutput output = reduceDB.aggregate(match, group, sort);
|
|
|
// String result = "";
|
|
|
// for (DBObject dbObject : output.results()) {
|
|
|
// result += dbObject.toString();
|
|
|
// }
|
|
|
// JSONObject jsonObject = new JSONObject(result);
|
|
|
// return jsonObject;
|
|
|
// }
|
|
|
|
|
|
public DBCollection getBusinessLog() {
|
|
|
if (businessLog == null) {
|
|
@ -95,6 +43,7 @@ public class ServiceMonitorService {
|
|
|
return businessLog;
|
|
|
|
|
|
}
|
|
|
|
|
|
public void bandwidth(String beginTime, String endTime, List<String> codeList) {
|
|
|
|
|
|
DBObject match = getMatchFields(beginTime, endTime);
|
|
@ -103,7 +52,7 @@ public class ServiceMonitorService {
|
|
|
DBObject serviceGroup = getServiceGroupFields();
|
|
|
// run aggregation
|
|
|
AggregationOutput flowOutput = getBusinessLog().aggregate(match, flowGroup, sort);
|
|
|
//流程带宽
|
|
|
//流程带宽
|
|
|
Map<String, Integer> bandwidthMapF = new HashMap<>();
|
|
|
for (DBObject dbObject : flowOutput.results()) {
|
|
|
Integer count = Integer.parseInt(StringUtil.toString(dbObject.get("count")));
|
|
@ -117,7 +66,7 @@ public class ServiceMonitorService {
|
|
|
bandwidthMapF.put(code, bodyLength);
|
|
|
}
|
|
|
}
|
|
|
//服务带宽
|
|
|
//服务带宽
|
|
|
// run aggregation
|
|
|
AggregationOutput serviceOutput = getBusinessLog().aggregate(match, serviceGroup, sort);
|
|
|
Map<String, Integer> bandwidthMapS = new HashMap<>();
|
|
@ -140,7 +89,7 @@ public class ServiceMonitorService {
|
|
|
Integer flowCalls = bandwidthMapF.get(code);
|
|
|
bandwidth = NumberUtil.divideBigDecimal(BigDecimal.valueOf(flowCalls), BigDecimal.valueOf(interval));
|
|
|
} else if (!StringUtil.isEmpty(bandwidthMapS.get(code))) {
|
|
|
Integer serviceCalls = bandwidthMapS.get(code)/2;
|
|
|
Integer serviceCalls = bandwidthMapS.get(code) / 2;
|
|
|
bandwidth = NumberUtil.divideBigDecimal(BigDecimal.valueOf(serviceCalls), BigDecimal.valueOf(interval));
|
|
|
}
|
|
|
saveServiceMetrics(code, "bandwidth", bandwidth.toString(), endTime);
|
|
@ -162,7 +111,7 @@ public class ServiceMonitorService {
|
|
|
BasicDBObject id = (BasicDBObject) dbObject.get("_id");
|
|
|
String code = StringUtil.toString(id.get("routeId"));
|
|
|
Integer total = Integer.parseInt(StringUtil.toString(dbObject.get("total")));
|
|
|
if (total == count/2) {
|
|
|
if (total == count / 2) {
|
|
|
if (qpsMapF.containsKey(code)) {
|
|
|
Integer flowCalls = qpsMapF.get(code);
|
|
|
qpsMapF.put(code, ++flowCalls);
|
|
@ -195,7 +144,7 @@ public class ServiceMonitorService {
|
|
|
Integer flowCalls = qpsMapF.get(code);
|
|
|
qps = NumberUtil.divideBigDecimal(BigDecimal.valueOf(flowCalls), BigDecimal.valueOf(interval));
|
|
|
} else if (!StringUtil.isEmpty(qpsMapS.get(code))) {
|
|
|
Integer serviceCalls = qpsMapS.get(code)/2;
|
|
|
Integer serviceCalls = qpsMapS.get(code) / 2;
|
|
|
qps = NumberUtil.divideBigDecimal(BigDecimal.valueOf(serviceCalls), BigDecimal.valueOf(interval));
|
|
|
}
|
|
|
saveServiceMetrics(code, "qps", qps.toString(), endTime);
|
|
@ -215,7 +164,7 @@ public class ServiceMonitorService {
|
|
|
Integer count = Integer.parseInt(StringUtil.toString(dbObject.get("count")));
|
|
|
BasicDBObject id = (BasicDBObject) dbObject.get("_id");
|
|
|
String code = StringUtil.toString(id.get("routeId"));
|
|
|
if (total == count/2) {
|
|
|
if (total == count / 2) {
|
|
|
if (usageMapSuccessF.containsKey(code)) {
|
|
|
Integer countTemp = usageMapSuccessF.get(code);
|
|
|
usageMapSuccessF.put(code, ++countTemp);
|
|
@ -268,21 +217,21 @@ public class ServiceMonitorService {
|
|
|
JSONObject result = new JSONObject();
|
|
|
Integer successCountF = isNull(usageMapSuccessF.get(code));
|
|
|
Integer failureCountF = isNull(usageMapFailF.get(code));
|
|
|
Integer successCountS= isNull(usageMapSuccessS.get(code));
|
|
|
Integer successCountS = isNull(usageMapSuccessS.get(code));
|
|
|
Integer failureCountS = isNull(usageMapFailS.get(code));
|
|
|
|
|
|
if (successCountF > 0 || failureCountF > 0) {
|
|
|
result.put("totalCount", successCountF + failureCountF);
|
|
|
result.put("successCount", successCountF);
|
|
|
result.put("failureCount",failureCountF);
|
|
|
result.put("failureCount", failureCountF);
|
|
|
} else if (successCountS > 0 || failureCountS > 0) {
|
|
|
result.put("totalCount", successCountS + failureCountS);
|
|
|
result.put("successCount", successCountS);
|
|
|
result.put("failureCount",failureCountS);
|
|
|
result.put("failureCount", failureCountS);
|
|
|
} else {
|
|
|
result.put("totalCount", 0);
|
|
|
result.put("successCount", 0);
|
|
|
result.put("failureCount",0);
|
|
|
result.put("failureCount", 0);
|
|
|
}
|
|
|
ObjectMapper objectMapper = new ObjectMapper();
|
|
|
saveServiceMetrics(code, "usage", objectMapper.writeValueAsString(result.toString()), endTime);
|
|
@ -363,46 +312,46 @@ public class ServiceMonitorService {
|
|
|
public DBObject getServiceGroupFields() {
|
|
|
|
|
|
// Now the $group operation
|
|
|
DBObject groupFields = new BasicDBObject( "_id",
|
|
|
DBObject groupFields = new BasicDBObject("_id",
|
|
|
new BasicDBObject("id", "$_id")
|
|
|
.append("code", "$code"));
|
|
|
groupFields.put("count", new BasicDBObject( "$sum", 1));
|
|
|
groupFields.put("bodyLength", new BasicDBObject( "$sum", "$bodyLength"));
|
|
|
groupFields.put("total", new BasicDBObject( "$first", "$totalServers"));
|
|
|
groupFields.put("count", new BasicDBObject("$sum", 1));
|
|
|
groupFields.put("bodyLength", new BasicDBObject("$sum", "$bodyLength"));
|
|
|
groupFields.put("total", new BasicDBObject("$first", "$totalServers"));
|
|
|
return new BasicDBObject("$group", groupFields);
|
|
|
}
|
|
|
|
|
|
public DBObject getFlowGroupFields() {
|
|
|
|
|
|
// Now the $group operation
|
|
|
DBObject groupFields = new BasicDBObject( "_id",
|
|
|
DBObject groupFields = new BasicDBObject("_id",
|
|
|
new BasicDBObject("breadcrumbId", "$breadcrumbId")
|
|
|
.append("routeId", "$routeId"));
|
|
|
groupFields.put("count", new BasicDBObject( "$sum", 1));
|
|
|
groupFields.put("bodyLength", new BasicDBObject( "$sum", "$bodyLength"));
|
|
|
groupFields.put("total", new BasicDBObject( "$first", "$totalServers"));
|
|
|
groupFields.put("beginTime", new BasicDBObject( "$first", "$fireTimeSource"));
|
|
|
groupFields.put("count", new BasicDBObject("$sum", 1));
|
|
|
groupFields.put("bodyLength", new BasicDBObject("$sum", "$bodyLength"));
|
|
|
groupFields.put("total", new BasicDBObject("$first", "$totalServers"));
|
|
|
groupFields.put("beginTime", new BasicDBObject("$first", "$fireTimeSource"));
|
|
|
groupFields.put("endTime", new BasicDBObject("$last", "$fireTimeSource"));
|
|
|
|
|
|
return new BasicDBObject("$group", groupFields);
|
|
|
}
|
|
|
|
|
|
public DBObject getSortFields() {
|
|
|
DBObject sortFields = new BasicDBObject( "_id", 1);
|
|
|
return new BasicDBObject("$sort", sortFields );
|
|
|
DBObject sortFields = new BasicDBObject("_id", 1);
|
|
|
return new BasicDBObject("$sort", sortFields);
|
|
|
}
|
|
|
|
|
|
public long getInterval(String beginTime, String endTime) {
|
|
|
Date from = DateUtil.toTimestamp(beginTime, DateUtil.DEFAULT_YMDHMSDATE_FORMAT);
|
|
|
Date to = DateUtil.toTimestamp(endTime, DateUtil.DEFAULT_YMDHMSDATE_FORMAT);
|
|
|
long interval = (to.getTime() - from.getTime())/1000;
|
|
|
long interval = (to.getTime() - from.getTime()) / 1000;
|
|
|
return interval;
|
|
|
}
|
|
|
|
|
|
public long getIntervalExact(String beginTime, String endTime) {
|
|
|
Date from = DateUtil.toTimestamp(beginTime, DateUtil.DEFAULT_TIMESTAMP_FORMAT);
|
|
|
Date to = DateUtil.toTimestamp(endTime, DateUtil.DEFAULT_TIMESTAMP_FORMAT);
|
|
|
long interval = (to.getTime() - from.getTime())/1000;
|
|
|
long interval = (to.getTime() - from.getTime()) / 1000;
|
|
|
return interval;
|
|
|
}
|
|
|
|