fly coding 监控(三):实现API监控

41 阅读3分钟

此前,已改造完基础监控工厂。此篇,将基于此前的功能,实现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请求记录。