Skip to content

Commit

Permalink
#65 improvement: add 'request rate' & 'request latency' chart in dyna…
Browse files Browse the repository at this point in the history
…mic-manager [vip:platform/pallas#884]
  • Loading branch information
NathanChan committed Jun 11, 2019
1 parent 3c7a223 commit 223fa42
Show file tree
Hide file tree
Showing 4 changed files with 121 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,24 @@
</div>
</div>
</div>
<div class="content">
<el-row :gutter="20">
<el-col :span="12">
<chart-container :title="`Request Rate(${indexSearchRateInfo.yAxisName})`" type="line">
<div slot="chart">
<MyLine id="indexSearchRate" :option-info="indexSearchRateInfo"></MyLine>
</div>
</chart-container>
</el-col>
<el-col :span="12">
<chart-container :title="`Request Latency(${indexSearchLatencyInfo.yAxisName})`" type="line">
<div slot="chart">
<MyLine id="indexSearchLatency" :option-info="indexSearchLatencyInfo"></MyLine>
</div>
</chart-container>
</el-col>
</el-row>
</div>
<div class="content">
<div v-if="operationList.length === 0" class="empty-operation">暂无数据</div>
<Timeline v-else>
Expand Down Expand Up @@ -100,6 +118,8 @@ export default {
dynamicInfoTitle: '',
isDynamicInfoVisible: false,
dynamicInfo: {},
indexSearchRateInfo: {},
indexSearchLatencyInfo: {},
dynamicDeleteInfo: {
indexId: this.$route.query.indexId,
indexName: this.$route.query.indexName,
Expand Down Expand Up @@ -136,6 +156,28 @@ export default {
this.loading = false;
});
},
getIndexSerachRate(indexingRate, searchRate, unit) {
const optionInfo = {
xAxis: indexingRate.map(e => e.x),
seriesData: [
{ name: 'indexing', data: indexingRate.map(e => e.y.toFixed(2)) },
{ name: 'search', data: searchRate.map(e => e.y.toFixed(2)) },
],
yAxisName: unit || '',
};
this.indexSearchRateInfo = optionInfo;
},
getIndexSearchLatency(indexingLatency, searchLatency, unit) {
const optionInfo = {
xAxis: indexingLatency.map(e => e.x),
seriesData: [
{ name: 'indexing', data: indexingLatency.map(e => e.y.toFixed(2)) },
{ name: 'search', data: searchLatency.map(e => e.y.toFixed(2)) },
],
yAxisName: unit || '',
};
this.indexSearchLatencyInfo = optionInfo;
},
getOperationList() {
if (JSON.stringify(this.timeRange) === '[null,null]') {
this.timeRange = '';
Expand Down Expand Up @@ -170,6 +212,12 @@ export default {
}
return rObj;
});
if (data.metric) {
this.getIndexSerachRate(data.metric.indexingRate.metricModel,
data.metric.searchRate.metricModel, data.metric.searchRate.unit);
this.getIndexSearchLatency(data.metric.indexingLatency.metricModel,
data.metric.searchLatency.metricModel, data.metric.searchLatency.unit);
}
});
},
handleDelete() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,18 @@
package com.vip.pallas.console.controller.index.dynamic;

import com.vip.pallas.bean.IndexOperationParams;
import com.vip.pallas.bean.monitor.MetricInfoModel;
import com.vip.pallas.bean.monitor.MonitorQueryModel;
import com.vip.pallas.console.utils.AuthorizeUtil;
import com.vip.pallas.exception.BusinessLevelException;
import com.vip.pallas.mybatis.entity.Index;
import com.vip.pallas.mybatis.entity.IndexOperationExample;
import com.vip.pallas.mybatis.entity.IndexVersion;
import com.vip.pallas.mybatis.entity.Page;
import com.vip.pallas.service.IndexOperationService;
import com.vip.pallas.service.IndexService;
import com.vip.pallas.service.IndexVersionService;
import com.vip.pallas.service.MonitorService;
import com.vip.pallas.utils.ObjectMapTool;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -35,8 +41,10 @@

import javax.servlet.http.HttpServletRequest;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;

@RestController
@Validated
Expand All @@ -45,6 +53,15 @@ public class IndexOperationPageController{
@Autowired
private IndexOperationService indexOperationService;

@Autowired
private MonitorService monitorService;

@Autowired
private IndexVersionService indexVersionService;

@Autowired
private IndexService indexService;

@RequestMapping("/index/dynamic/page.json")
public Map<String, Object> list(@RequestBody Map<String, Object> params) throws Exception {
Integer currentPage = ObjectMapTool.getInteger(params, "currentPage");
Expand Down Expand Up @@ -84,13 +101,47 @@ public Map<String, Object> list(@RequestBody Map<String, Object> params) throws
long total = indexOperationService.countByExample(example);
long pageCount = (int) (total % pageSize == 0 ? total / pageSize : total / pageSize + 1);

// 获取request rate & request latency
MonitorQueryModel queryModel = constructMonitorQuery(indexId,versionId,timeRangeList);
if (queryModel != null){
MetricInfoModel metricInfoModel = monitorService.getMetricInfoModel(queryModel);
resultMap.put("metric",metricInfoModel);
}
resultMap.put("list", indexOperationService.selectByExampleWithBLOBs(example));
resultMap.put("total", total);
resultMap.put("pageCount", pageCount);

return resultMap;
}

private MonitorQueryModel constructMonitorQuery(Long indexId,Integer versionId,List<String> timeRangeList) throws ParseException {
MonitorQueryModel query = new MonitorQueryModel();
Index index = indexService.findById(indexId);
if (null == index)return null;
if (null == versionId || 0 == versionId){
// 没传则拿启用中的
IndexVersion version = indexVersionService.findUsedIndexVersionByIndexId(indexId);
if (null == version)return null;
query.setIndexName(index.getIndexName()+"_"+version.getId());
}else {
query.setIndexName(index.getIndexName()+"_"+versionId);
}
query.setClusterName(index.getClusterName());
if (timeRangeList != null && timeRangeList.size() == 2 ) {
DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
format.setTimeZone(TimeZone.getTimeZone("Asia/Beijing"));
Date start = format.parse(timeRangeList.get(0).replaceAll("\"", ""));
Date end = format.parse(timeRangeList.get(1).replaceAll("\"", ""));
query.setFrom(start.getTime());
query.setTo(end.getTime());
}else {
// set last day time
long cur = System.currentTimeMillis();
query.setFrom(cur-TimeUnit.DAYS.toMillis(1));
query.setTo(cur);
}
return query;
}

@RequestMapping("/index/dynamic/delete.json")
public void deleteIndexDynamic(@RequestBody @Validated IndexOperationParams params, HttpServletRequest request) {
if (!AuthorizeUtil.authorizeIndexPrivilege(request, params.getIndexId(), params.getIndexName())) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,5 @@ public interface MonitorService {

List<IndexGaugeMetricModel> queryIndicesInfo(MonitorQueryModel queryModel) throws Exception;

MetricInfoModel getMetricInfoModel(MonitorQueryModel queryModel) throws Exception;
}
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,19 @@ public NodeMetricInfoModel queryNodeMetrics(MonitorQueryModel queryModel) throws

return nodeMetricInfoModel;
}
@Override
public MetricInfoModel getMetricInfoModel(MonitorQueryModel queryModel) throws Exception {
Map<String, Object> dataMap = getDataMap(queryModel);
Template templateAggs = getTempalte(ParamConstantUtil.AGGS_STATS_TEMPLATE);
Cluster cluster = getCluster(queryModel.getClusterName());

MetricInfoModel model = new MetricInfoModel();

dataMap.put("type", ParamConstantUtil.TYPE_INDEX_STATS);
dataMap.put("indexName", queryModel.getIndexName());
constructMetricModel(templateAggs,dataMap,cluster,model);
return model;
}

@Override
public IndexMetricInfoModel queryIndexMetrices(MonitorQueryModel queryModel) throws Exception{
Expand Down Expand Up @@ -206,15 +219,19 @@ public IndexMetricInfoModel queryIndexMetrices(MonitorQueryModel queryModel) thr
indexMetricInfoModel.setIndex_disk_primary(getIndex_disk(templateAggs, dataMap, "index_stats.primaries.store.size_in_bytes", cluster));
indexMetricInfoModel.setIndex_disk_total(getIndex_disk(templateAggs, dataMap, "index_stats.total.store.size_in_bytes", cluster));

constructMetricModel(templateAggs,dataMap,cluster,indexMetricInfoModel);

return indexMetricInfoModel;
}

private void constructMetricModel(Template templateAggs, Map<String, Object> dataMap, Cluster cluster,MetricInfoModel model) throws PallasException {
dataMap.put("isDerivative", true);
List<MetricModel<Date, Long>> searchRate = getSearchRate(templateAggs, dataMap, "index_stats.total.search.query_total", cluster);
List<MetricModel<Date, Long>> indexingRate = getIndexingRate(templateAggs, dataMap, "index_stats.total.indexing.index_total", cluster);
List<MetricModel<Date, Long>> searchTime = getSearchTime(templateAggs, dataMap, "index_stats.total.search.query_time_in_millis", cluster);
List<MetricModel<Date, Long>> indexingTime = getIndexingTime(templateAggs, dataMap, "index_stats.total.indexing.index_time_in_millis", cluster);

setLatency(searchRate, searchTime, indexingRate, indexingTime, dataMap, indexMetricInfoModel);

return indexMetricInfoModel;
setLatency(searchRate, searchTime, indexingRate, indexingTime, dataMap, model);
}


Expand Down

0 comments on commit 223fa42

Please sign in to comment.