此前,已改造完基础监控工厂。此篇,将基于此前的功能,实现API请求的监控日志记录。
系列文章
开发思路
为实现对系统Api请求进行监控,主要记录“请求地址”,“执行时长”、“配置服务编码”、“请求参数”、“返回结果”、“请求ip地址”、“异常信息”、“用户代理信息”、“请求客户端信息”数据。
在后期系统上线运行过程中,进行实时监控,以便于优化对应Api接口性能。
设计数据库
yml配置
# api监控配置
api:
# 是否监控
is-monitor: true
# 是否保存用户代理信息
is-save-user-agent: true
# 是否保存异常信息
is-save-throwable: true
# 是否保存请求客户端信息
is-save-request-client: true
# 是否保存返回结果集
is-save-return-results: true
# 是否保存请求参数
is-save-request-params: true
此上配置,用于动态配置是否记录某些信息。
PO定义
package com.flycoding.monitor.entity;
import com.flycoding.dblibrary.annotation.create.Column;
import com.flycoding.dblibrary.annotation.create.PrimaryAuto;
import com.flycoding.dblibrary.annotation.create.Table;
import com.flycoding.dblibrary.enums.ColumnType;
import com.flycoding.dblibrary.enums.OrderByType;
import com.flycoding.drivenlibrary.engine.annotation.function.FunctionConfig;
import com.flycoding.drivenlibrary.engine.annotation.function.config.popup.PopupConfig;
import com.flycoding.drivenlibrary.engine.annotation.function.config.table.TableConfig;
import com.flycoding.drivenlibrary.engine.annotation.function.form.FormConfig;
import com.flycoding.drivenlibrary.engine.annotation.function.form.FormFieldConfig;
import com.flycoding.drivenlibrary.engine.annotation.function.form.field.FieldConfig;
import com.flycoding.drivenlibrary.engine.constants.DefaultFieldConstants;
import com.flycoding.drivenlibrary.engine.constants.FieldConfigConstants;
import com.flycoding.drivenlibrary.engine.constants.SqlConstants;
import com.flycoding.drivenlibrary.engine.constants.config.DrivenElementConstants;
import com.flycoding.drivenlibrary.enums.dictionary.QueryType;
import com.flycoding.drivenlibrary.enums.dictionary.base.DataState;
import com.flycoding.monitor.entity.base.BaseMonitorPO;
import com.flycoding.monitor.entity.base.BaseRequestMonitorPO;
/**
* api监控对象
*
* @author 赵屈犇
* @version 1.0
* @date 创建时间: 2020/10/15 15:48
*/
@Table(tableName = MonitorApiPO.TABLE_NAME)
@FunctionConfig(funcName = "监控服务管理", funcCode = "Sy_Monitor_Api", tableConfig = @TableConfig(tableName = MonitorApiPO.TABLE_NAME,
columns = {
@Column(columnName = DefaultFieldConstants.CREATE_TIME, isInsertUse = false, isSelectUse = false, orderBy = OrderByType.DESC)
}), formConfig = @FormConfig(keyCode = "id", isCreateTableAddBtn = false, popupConfig = @PopupConfig(popupWidth = 850, popupHeight = 550)))
public class MonitorApiPO extends BaseRequestMonitorPO {
public static final String TABLE_NAME = "Sys_Monitor_Api";
@PrimaryAuto(columnName = "id", comment = "主键ID")
@FormFieldConfig(fieldCode = "id", fieldName = "主键ID", isPageVisibility = false, isTableEnable = false, fieldParentName = MONITOR_BASIC_MESSAGE_NAME)
private Integer id;
/**
* 监控请求地址
*/
@FormFieldConfig(fieldCode = "monitor_api_url", fieldName = "请求地址", fieldParentName = MONITOR_BASIC_MESSAGE_NAME, tableQueryType = QueryType.LIKE, tableColumnWidth = "235")
@Column(columnName = "monitor_api_url", columnType = ColumnType.VARCHAR, length = 1024)
private String monitorApiUrl;
/**
* 执行时长
*/
@FormFieldConfig(fieldCode = "executor_duration", fieldName = "执行时长(毫秒)", fieldParentName = MONITOR_BASIC_MESSAGE_NAME)
@Column(columnName = "executor_duration", columnType = ColumnType.INTEGER, length = 8)
private Long executorDuration;
/**
* 监控的服务配置编码
*/
@FormFieldConfig(fieldCode = "monitor_config_code", fieldName = "配置编码", dataState = DataState.DISABLE, fieldParentName = MONITOR_BASIC_MESSAGE_NAME)
@Column(columnName = "monitor_config_code", columnType = ColumnType.VARCHAR, length = SqlConstants.DB_CODE_SIZE)
private String monitorConfigCode;
/**
* 请求参数
*/
@Column(columnName = "request_params", columnType = ColumnType.LONG_TEXT, comment = "请求参数")
@FormFieldConfig(fieldCode = "request_params", fieldName = "请求参数", config = @FieldConfig(appendCss = FieldConfigConstants.CSS_HALF_SCREEN_COL),
elementCode = DrivenElementConstants.BIG_INPUT_ELEMENT, isTableEnable = false, fieldParentName = BaseMonitorPO.DETAIL_BASIC_MESSAGE_NAME)
private String requestParams;
/**
* 返回结果
*/
@Column(columnName = "return_results", columnType = ColumnType.LONG_TEXT, comment = "返回结果")
@FormFieldConfig(fieldCode = "return_results", fieldName = "返回结果", config = @FieldConfig(appendCss = FieldConfigConstants.CSS_HALF_SCREEN_COL),
elementCode = DrivenElementConstants.BIG_INPUT_ELEMENT, isTableEnable = false, fieldParentName = BaseMonitorPO.DETAIL_BASIC_MESSAGE_NAME)
private String returnResults;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getMonitorApiUrl() {
return monitorApiUrl;
}
public void setMonitorApiUrl(String monitorApiUrl) {
this.monitorApiUrl = monitorApiUrl;
}
public Long getExecutorDuration() {
return executorDuration;
}
public void setExecutorDuration(Long executorDuration) {
this.executorDuration = executorDuration;
}
public String getMonitorConfigCode() {
return monitorConfigCode;
}
public void setMonitorConfigCode(String monitorConfigCode) {
this.monitorConfigCode = monitorConfigCode;
}
public String getRequestParams() {
return requestParams;
}
public void setRequestParams(String requestParams) {
this.requestParams = requestParams;
}
public String getReturnResults() {
return returnResults;
}
public void setReturnResults(String returnResults) {
this.returnResults = returnResults;
}
}
监控工厂实现
package com.flycoding.monitor.factory;
import com.flycoding.biz.manage.constants.ManageDictionaryConstants;
import com.flycoding.monitor.entity.MonitorApiPO;
import com.flycoding.monitor.entity.base.BaseMonitorPO;
import com.flycoding.monitor.factory.base.BaseMonitorFactory;
import com.flycoding.drivenlibrary.engine.config.DrivenEngineConfig;
import com.flycoding.drivenlibrary.engine.config.constants.DrivenConstants;
import com.flycoding.utillibrary.java.JSONUtils;
/**
* 监控Api工厂类
*
* @author 赵屈犇
* @version 1.0
* @date 创建时间: 2020/10/15 16:02
*/
public class MonitorApiFactory extends BaseMonitorFactory<MonitorApiFactory> {
/**
* 监控api地址 配置编码
*/
private String monitorApiUrl, configCode;
/**
* 请求参数 返回结果集
*/
private Object requestParams, returnResults;
/**
* 是否保存 请求结果集 请求参数
*/
private boolean isReturnResults, isRequestParams;
public static MonitorApiFactory builder() {
return new MonitorApiFactory();
}
private MonitorApiFactory() {
super();
isRequestParams = DrivenEngineConfig.getConfigValue(prefix + DrivenConstants.MonitorConstants.IS_SAVE_REQUEST_PARAMS, true);
isReturnResults = DrivenEngineConfig.getConfigValue(prefix + DrivenConstants.MonitorConstants.IS_SAVE_RETURN_RESULTS, true);
}
/**
* 设置监控的配置编码
*
* @param configCode
* @return
*/
public MonitorApiFactory configCode(String configCode) {
if (isMonitor) {
this.configCode = configCode;
}
return this;
}
/**
* 设置监控的服务地址
*
* @param monitorApiUrl
* @return
*/
public MonitorApiFactory monitorApiUrl(String monitorApiUrl) {
if (isMonitor) {
this.monitorApiUrl = monitorApiUrl;
}
return this;
}
/**
* 设置返回结果集数据
*
* @param returnResults
* @return
*/
public MonitorApiFactory returnResults(Object returnResults) {
if (isMonitor && isReturnResults) {
this.returnResults = returnResults;
}
return this;
}
/**
* 设置请求参数
*
* @param requestParams
* @return
*/
public MonitorApiFactory requestParams(Object requestParams) {
if (isMonitor && isRequestParams) {
this.requestParams = requestParams;
}
return this;
}
@Override
protected BaseMonitorPO getMonitorInfo(long duration, MonitorFileFactory monitorFileFactory) throws Exception {
MonitorApiPO monitorInfo = new MonitorApiPO();
// 存储请求参数
if (isRequestParams) {
monitorInfo.setRequestParams(JSONUtils.toJSON(requestParams));
}
// 存储返回结果
if (isReturnResults) {
monitorInfo.setReturnResults(JSONUtils.toJSON(returnResults));
}
// 设置监控api地址
monitorInfo.setMonitorApiUrl(monitorApiUrl);
// 设置监控配置编码
monitorInfo.setMonitorConfigCode(configCode);
// 设置执行时间
monitorInfo.setExecutorDuration(duration);
return monitorInfo;
}
@Override
protected String getMonitorConfigKey() {
return "api";
}
@Override
protected String getMonitorChannelCode() {
return ManageDictionaryConstants.ChannelDictionary.MONITOR_API;
}
}
此工厂,实现了api请求记录。