Performance analysis commit

This commit is contained in:
hezhongqi 2021-07-28 22:18:31 +08:00
parent c0ca6a4fe8
commit d0b4c13cee
10 changed files with 510 additions and 5 deletions

View File

@ -16,6 +16,14 @@ resource:
user: root
password: shulie@2020
database: jmeter
## 引擎包位置 引擎包可在github下载
pressure.engine.install.dir: /Users/shulie/engine/pressure-engine.tar.gz
## 引擎包工作目录 记录引擎包工作的配置文件 记录引擎包生成的日志jtl,log
pressure.engine.task.dir: /Users/shulie/engine
## 脚本管理 临时文件目录
script.temp.path: /data/apps/tro-cloud/script/temp
## 脚本管理 脚本文件目录
script.path: /data/apps/tro-cloud/script/
## 配置cloud地址 即当前系统部署的url
console.url: http://127.0.0.1:10010/tro-cloud

View File

@ -0,0 +1,40 @@
package io.shulie.tro.web.app.conf;
import javax.sql.DataSource;
import com.shulie.tesla.sequence.impl.DefaultSequence;
import com.shulie.tesla.sequence.impl.DefaultSequenceDao;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author 无涯
* @Package io.shulie.tro.web.app.conf
* @date 2020/12/21 5:16 下午
*/
@Configuration
public class TeslaConfig {
@Bean
public DefaultSequence baseOrderLineSequence(DataSource dataSource) {
DefaultSequenceDao defaultSequenceDao = new DefaultSequenceDao();
defaultSequenceDao.setDataSource(dataSource);
defaultSequenceDao.setStep(500);
defaultSequenceDao.setTableName("t_tc_sequence");
DefaultSequence defaultSequence = new DefaultSequence();
defaultSequence.setSequenceDao(defaultSequenceDao);
defaultSequence.setName("BASE_ORDER_LINE");
return defaultSequence;
}
@Bean
public DefaultSequence threadOrderLineSequence(DataSource dataSource) {
DefaultSequenceDao defaultSequenceDao = new DefaultSequenceDao();
defaultSequenceDao.setDataSource(dataSource);
defaultSequenceDao.setStep(500);
defaultSequenceDao.setTableName("t_tc_sequence");
DefaultSequence defaultSequence = new DefaultSequence();
defaultSequence.setSequenceDao(defaultSequenceDao);
defaultSequence.setName("THREAD_ORDER_LINE");
return defaultSequence;
}
}

View File

@ -0,0 +1,47 @@
package io.shulie.tro.web.app.controller.perfomanceanaly;
import io.shulie.tro.web.app.request.perfomanceanaly.MemoryAnalysisRequest;
import io.shulie.tro.web.app.response.perfomanceanaly.DownloadDumpResponse;
import io.shulie.tro.web.app.response.perfomanceanaly.MemoryAnalysisResponse;
import io.shulie.tro.web.app.service.perfomanceanaly.MemoryAnalysisService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName MemoryAnalyController
* @Description 内存分析
* @Author qianshui
* @Date 2020/11/4 上午11:05
*/
@RestController
@RequestMapping("/api/memory")
@Api(tags = "内存分析")
public class MemoryAnalyzeController {
@Autowired
private MemoryAnalysisService memoryAnalysisService;
@PostMapping("/dump")
@ApiOperation(value = "获取内存分析数据")
public MemoryAnalysisResponse getMemoryDump(@RequestBody MemoryAnalysisRequest request) {
return memoryAnalysisService.queryMemoryDump(request);
}
/**
* 上传到zk
*/
@GetMapping("/download/dump")
@ApiOperation(value = "上传zk")
public DownloadDumpResponse downloadDump(@RequestParam("agentId") String agentId) throws Throwable {
return memoryAnalysisService.downloadDump(agentId);
}
}

View File

@ -0,0 +1,65 @@
package io.shulie.tro.web.app.controller.perfomanceanaly;
import java.util.concurrent.atomic.AtomicInteger;
import io.shulie.tro.web.app.constant.AgentUrls;
import io.shulie.tro.web.app.convert.performace.PerformanceBaseReqConvert;
import io.shulie.tro.web.app.input.PerformanceBaseDataCreateInput;
import io.shulie.tro.web.app.req.perfomanceanaly.PerformanceBaseDataReq;
import io.shulie.tro.web.app.service.perfomanceanaly.PerformanceBaseDataService;
import io.shulie.tro.web.app.service.perfomanceanaly.ThreadAnalyService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName PerformanceBaseDataController
* @Description
* @Author qianshui
* @Date 2020/11/4 下午2:49
*/
@RestController
@RequestMapping(value = AgentUrls.PREFIX_URL)
@Api(tags = "性能分析数据")
public class PerformanceBaseDataController {
@Value("${performance.base.agent.frequency:1}")
private String frequency;
@Autowired
private PerformanceBaseDataService performanceBaseDataService;
@Autowired
private ThreadAnalyService threadAnalyService;
private static AtomicInteger integer = new AtomicInteger();
@PostMapping(value = AgentUrls.PERFORMANCE_BASE_URL)
@ApiOperation(value = "接收agent写入数据")
public void receivePerformanceBaseData(@RequestBody PerformanceBaseDataReq req) {
if(integer.get() > 100000000) {
integer.set(0);
}
if(integer.getAndIncrement() % Integer.parseInt(frequency) == 0) {
PerformanceBaseDataCreateInput input = PerformanceBaseReqConvert.INSTANCE.reqToInput(req);
performanceBaseDataService.cache(input);
}
}
/**
* 秒级别
* @param second
*/
@GetMapping("/clear")
@ApiOperation(value = "清理数据接口")
public String clear(@RequestParam("second") Integer second) {
performanceBaseDataService.clearData(Integer.valueOf(second));
threadAnalyService.clearData(Integer.valueOf(second));
return "清理成功";
}
}

View File

@ -0,0 +1,98 @@
package io.shulie.tro.web.app.controller.perfomanceanaly;
import io.shulie.tro.common.beans.page.PagingList;
import io.shulie.tro.web.app.input.PressureMachineInput;
import io.shulie.tro.web.app.request.perfomanceanaly.PressureMachineDeleteRequest;
import io.shulie.tro.web.app.request.perfomanceanaly.PressureMachineInsertRequest;
import io.shulie.tro.web.app.request.perfomanceanaly.PressureMachineLogQueryRequest;
import io.shulie.tro.web.app.request.perfomanceanaly.PressureMachineUpdateRequest;
import io.shulie.tro.web.app.response.perfomanceanaly.PressureMachineLogResponse;
import io.shulie.tro.web.app.response.perfomanceanaly.PressureMachineResponse;
import io.shulie.tro.web.app.service.perfomanceanaly.PressureMachineLogService;
import io.shulie.tro.web.app.service.perfomanceanaly.PressureMachineService;
import io.shulie.tro.web.data.param.machine.PressureMachineQueryParam;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: mubai
* @Date: 2020-11-13 09:17
* @Description:
*/
@RestController
@RequestMapping(value = "/api/pressure/machine")
@Api(tags = "压力机接口")
public class PressureMachineController {
@Autowired
private PressureMachineService pressureMachineService;
@Autowired
private PressureMachineLogService machineLogService;
@PostMapping("/upload")
@ApiOperation(value = "上报压力机信息")
public void uploadMachineInfo(@RequestBody PressureMachineInsertRequest request) {
PressureMachineInput input = new PressureMachineInput();
BeanUtils.copyProperties(request, input);
pressureMachineService.upload(input);
}
@GetMapping(value = "/log/info")
@ApiOperation(value = "压力机日志趋势图")
public PressureMachineLogResponse getPressureMachineLogChart(
@RequestParam(value = "id", required = true) Long id,
@RequestParam(value = "queryTime", required = true) String queryTime) {
PressureMachineLogQueryRequest request = new PressureMachineLogQueryRequest();
request.setMachineId(id);
request.setQueryTime(queryTime);
return machineLogService.queryByExample(request);
}
@PutMapping
@ApiOperation(value = "修改压力机")
public void update(@RequestBody PressureMachineUpdateRequest request) {
pressureMachineService.update(request);
}
@DeleteMapping
@ApiOperation(value = "删除压力机")
public void delete(@RequestBody PressureMachineDeleteRequest request) {
pressureMachineService.delete(request);
}
@GetMapping(value = "/list")
@ApiOperation(value = "压力机列表")
public PagingList<PressureMachineResponse> getPressureMachineList(
@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "ip", required = false) String ip,
@RequestParam(value = "flag", required = false) String flag,
@RequestParam(value = "status", required = false) Integer status,
@RequestParam(value = "order", required = false) Integer order,
@RequestParam(value = "current", required = false, defaultValue = "0") Integer current,
@RequestParam(value = "pageSize", required = false) Integer pageSize
) {
PressureMachineQueryParam request = new PressureMachineQueryParam();
request.setName(name);
request.setIp(ip);
request.setFlag(flag);
request.setStatus(status);
request.setMachineUsageOrder(order);
request.setCurrent(current + 1);
request.setPageSize(pageSize);
return pressureMachineService.queryByExample(request);
}
}

View File

@ -0,0 +1,49 @@
package io.shulie.tro.web.app.controller.perfomanceanaly;
import java.util.List;
import io.shulie.tro.web.app.request.perfomanceanaly.PressureMachineStatisticsRequest;
import io.shulie.tro.web.app.response.perfomanceanaly.PressureMachineStatisticsResponse;
import io.shulie.tro.web.app.response.perfomanceanaly.TypeValueDateVo;
import io.shulie.tro.web.app.service.perfomanceanaly.PressureMachineStatisticsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: mubai
* @Date: 2020-11-13 17:44
* @Description:
*/
@RestController
@RequestMapping("/api/pressure/machine/statistics")
@Api(tags = "压力机统计")
public class PressureMachineStatisticsController {
@Autowired
private PressureMachineStatisticsService pressureMachineStatisticsService;
@GetMapping
@ApiOperation(value = "压力机最新统计")
public PressureMachineStatisticsResponse statistics() {
return pressureMachineStatisticsService.getNewlyStatistics();
}
@GetMapping(value = "/trend/chart")
@ApiOperation(value = "压力机趋势图")
public List<TypeValueDateVo> statisticsTrendChart(
@RequestParam String startTime, @RequestParam String endTime) {
PressureMachineStatisticsRequest request = new PressureMachineStatisticsRequest();
request.setStartTime(startTime);
request.setEndTime(endTime);
request.setCurrent(0);
request.setPageSize(-1);
return pressureMachineStatisticsService.queryByExample(request);
}
}

View File

@ -0,0 +1,108 @@
package io.shulie.tro.web.app.controller.perfomanceanaly;
import java.util.Collections;
import java.util.List;
import com.google.common.collect.Lists;
import io.shulie.tro.web.app.request.perfomanceanaly.PerformanceAnalyzeRequest;
import io.shulie.tro.web.app.request.perfomanceanaly.ThreadCpuUseRateRequest;
import io.shulie.tro.web.app.request.perfomanceanaly.ThreadListRequest;
import io.shulie.tro.web.app.request.perfomanceanaly.ThreadStackRequest;
import io.shulie.tro.web.app.response.common.SelectListResponse;
import io.shulie.tro.web.app.response.perfomanceanaly.ProcessBaseDataResponse;
import io.shulie.tro.web.app.response.perfomanceanaly.ThreadCpuChartResponse;
import io.shulie.tro.web.app.response.perfomanceanaly.ThreadCpuUseRateChartResponse;
import io.shulie.tro.web.app.response.perfomanceanaly.ThreadListResponse;
import io.shulie.tro.web.app.response.perfomanceanaly.ThreadStackInfoResponse;
import io.shulie.tro.web.app.service.perfomanceanaly.PerformanceBaseDataService;
import io.shulie.tro.web.app.service.perfomanceanaly.ThreadAnalyService;
import io.shulie.tro.web.app.service.report.impl.ReportApplicationService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName ThreadAnalyController
* @Description 线程分析
* @Author qianshui
* @Date 2020/11/4 上午11:05
*/
@RestController
@RequestMapping("/api/thread")
@Api(tags = "线程分析")
public class ThreadAnalyzeController {
@Autowired
private ReportApplicationService reportApplicationService;
@Autowired
private PerformanceBaseDataService performanceBaseDataService;
@Autowired
private ThreadAnalyService threadAnalyService;
@GetMapping("/application")
@ApiOperation(value = "应用列表")
public List<SelectListResponse> getApplicationList(Long reportId) {
List<String> dataList = reportApplicationService.getReportApplication(reportId).getApplicationNames();
Collections.sort(dataList);
return convert(dataList);
}
@GetMapping("/process")
@ApiOperation(value = "进程名称列表")
public List<SelectListResponse> getProcess(Long reportId, String appName) {
return convert(performanceBaseDataService.getProcessName(reportId, appName));
}
@GetMapping("/base")
@ApiOperation(value = "基础信息")
public ProcessBaseDataResponse getBaseData(PerformanceAnalyzeRequest request) {
return threadAnalyService.getBaseData(request);
}
@GetMapping("/analyze")
@ApiOperation(value = "分析图表")
public List<ThreadCpuChartResponse> getThreadAnalyze(PerformanceAnalyzeRequest request) {
return threadAnalyService.getThreadAnalyze(request);
}
@GetMapping("/list")
@ApiOperation(value = "线程列表")
public ThreadListResponse getThreadList(ThreadListRequest request) { return threadAnalyService.getThreadList(request);
}
@PostMapping("/getThreadStackInfo")
@ApiOperation(value = "获取线程栈信息")
public ThreadStackInfoResponse getThreadStackInfo(@RequestBody ThreadStackRequest request) {
ThreadStackInfoResponse response = new ThreadStackInfoResponse();
response.setThreadStack(threadAnalyService.getThreadStackInfo(request.getLink()));
return response;
}
@GetMapping("/cpuUseRate")
@ApiOperation(value = "线程cpu占用率图表")
public List<ThreadCpuUseRateChartResponse> getThreadCpuUseRate(ThreadCpuUseRateRequest request) {
return threadAnalyService.getThreadCpuUseRate(request);
}
private List<SelectListResponse> convert(List<String> dataList) {
if(CollectionUtils.isEmpty(dataList)) {
return Collections.EMPTY_LIST;
}
List<SelectListResponse> responses = Lists.newArrayList();
dataList.stream().forEach(data -> {
SelectListResponse temp = new SelectListResponse();
temp.setLabel(data);
temp.setValue(data);
responses.add(temp);
});
return responses;
}
}

View File

@ -0,0 +1,73 @@
package io.shulie.tro.web.app.controller.perfomanceanaly;
import java.util.List;
import io.shulie.tro.web.app.constant.AgentUrls;
import io.shulie.tro.web.app.exception.ExceptionCode;
import io.shulie.tro.web.app.exception.TroWebException;
import io.shulie.tro.web.app.request.perfomanceanaly.TraceManageCreateRequest;
import io.shulie.tro.web.app.request.perfomanceanaly.TraceManageDeployQueryRequest;
import io.shulie.tro.web.app.request.perfomanceanaly.TraceManageQueryListRequest;
import io.shulie.tro.web.app.response.perfomanceanaly.TraceManageCreateResponse;
import io.shulie.tro.web.app.response.perfomanceanaly.TraceManageResponse;
import io.shulie.tro.web.app.service.perfomanceanaly.TraceManageService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author zhaoyong
*/
@RestController
@RequestMapping(value = AgentUrls.PREFIX_URL)
@Api(tags = "方法追踪")
public class TraceManageController {
@Autowired
private TraceManageService traceManageService;
@PostMapping("/traceManage/createTraceManage")
@ApiOperation(value = "创建方法追踪获取trace方法追踪凭证")
public TraceManageCreateResponse createTraceManage(@RequestBody TraceManageCreateRequest traceManageCreateRequest)
throws Exception {
return traceManageService.createTraceManage(traceManageCreateRequest);
}
@GetMapping("/traceManage/queryTraceManageDeploy")
@ApiOperation(value = "查询方法追踪树状结构信息")
public TraceManageResponse queryTraceManageDeploy(@ApiParam(value = "传入traceManageId 查询所有信息") Long id,
@ApiParam(value = "追踪凭证id") String sampleId) {
TraceManageDeployQueryRequest traceManageDeployQueryRequest = new TraceManageDeployQueryRequest();
traceManageDeployQueryRequest.setId(id);
traceManageDeployQueryRequest.setSampleId(sampleId);
return traceManageService.queryTraceManageDeploy(traceManageDeployQueryRequest);
}
@GetMapping("/traceManage/queryTraceManageList")
@ApiOperation(value = "查询方法追踪列表信息")
public List<TraceManageResponse> queryTraceManageList(@ApiParam(value = "报告id") Long reportId,
@ApiParam(value = "进程名称") String processName) {
if (StringUtils.isEmpty(processName)){
throw new TroWebException(ExceptionCode.TRACE_MANAGE_PARAM_VALID_ERROR,"报告id为空");
}
if (reportId == null){
throw new TroWebException(ExceptionCode.TRACE_MANAGE_PARAM_VALID_ERROR,"进程名称为空");
}
TraceManageQueryListRequest traceManageQueryListRequest = new TraceManageQueryListRequest();
traceManageQueryListRequest.setReportId(reportId);
String[] split = StringUtils.split(processName, "|");
traceManageQueryListRequest.setAgentId(split[1]);
return traceManageService.queryTraceManageList(traceManageQueryListRequest);
}
}

View File

@ -72,6 +72,12 @@
<artifactId>tro-web-amdb-accessor</artifactId>
</dependency>
<dependency>
<groupId>com.shulie.tesla</groupId>
<artifactId>tesla-sequence</artifactId>
<version>1.0.1</version>
</dependency>
</dependencies>
<build>

View File

@ -12,7 +12,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.shulie.tro.web.data.dao.perfomanceanaly;
import java.math.BigDecimal;
@ -29,6 +28,7 @@ import javax.annotation.Resource;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.pamirs.tro.common.util.DateUtils;
import com.shulie.tesla.sequence.impl.DefaultSequence;
import io.shulie.tro.utils.json.JsonHelper;
import io.shulie.tro.web.common.vo.perfomanceanaly.PerformanceThreadDataVO;
import io.shulie.tro.web.data.common.InfluxDBWriter;
@ -42,6 +42,7 @@ import io.shulie.tro.web.data.result.perfomanceanaly.PerformanceBaseDataResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
@ -64,9 +65,19 @@ public class PerformanceBaseDataDAOImpl implements PerformanceBaseDataDAO {
@Resource
private PerformanceThreadStackDataMapper performanceThreadStackDataMapper;
@Autowired
private DefaultSequence baseOrderLineSequence;
@Autowired
private DefaultSequence threadOrderLineSequence;
@Override
public void insert(PerformanceBaseDataParam param) {
long baseId = baseOrderLineSequence.nextValue();
// 插入base数据
influxWriterBase(param, baseId);
// 插入thread数据
influxWriterThread(param, baseId);
}
private void influxWriterThread(PerformanceBaseDataParam param, Long baseId) {
@ -77,8 +88,7 @@ public class PerformanceBaseDataDAOImpl implements PerformanceBaseDataDAO {
if (StringUtils.isBlank(data.getThreadStatus())) {
data.setThreadStatus(DEFAULT_THREAD_STATUS);
}
long threadId = 0L;
//threadOrderLineSequence.nextValue();
long threadId = threadOrderLineSequence.nextValue();
// 记录关联关系
PerformanceThreadStackDataEntity entity = new PerformanceThreadStackDataEntity();
entity.setThreadStackLink(threadId);
@ -105,7 +115,7 @@ public class PerformanceBaseDataDAOImpl implements PerformanceBaseDataDAO {
long mid = System.currentTimeMillis();
// threadStack 存入mysql thread_stack_link
performanceThreadStackDataMapper.insertBatchSomeColumn(stackDataEntities);
log.info("influxDBWriter运行时间{},insertBatchSomeColumn运行时间:{},数据量:{}", mid - start,
log.debug("influxDBWriter运行时间{},insertBatchSomeColumn运行时间:{},数据量:{}", mid - start,
System.currentTimeMillis() - mid, stackDataEntities.size());
}
@ -239,3 +249,4 @@ public class PerformanceBaseDataDAOImpl implements PerformanceBaseDataDAO {
influxDBWriter.query(influxDBSQL.toString(), PerformanceBaseDataResult.class);
}
}