feat: define DatabaseEvent

This commit is contained in:
tjq 2022-09-06 01:54:10 +08:00
parent 5080796c6f
commit a0cc5670d4
8 changed files with 180 additions and 0 deletions

View File

@ -14,4 +14,6 @@ public class SJ {
public static final Splitter COMMA_SPLITTER = Splitter.on(",");
public static final Joiner COMMA_JOINER = Joiner.on(",");
public static final Joiner MONITOR_JOINER = Joiner.on("|").useForNull("-");
}

View File

@ -0,0 +1,48 @@
package tech.powerjob.server.monitor.events.db;
import lombok.Setter;
import lombok.experimental.Accessors;
import tech.powerjob.server.common.SJ;
import tech.powerjob.server.monitor.Event;
/**
* 数据库操作事件
*
* @author tjq
* @since 2022/9/6
*/
@Setter
@Accessors(chain = true)
public class DatabaseEvent implements Event {
private DatabaseEventType type;
private String serviceName;
private String methodName;
private Status status;
private Integer rows;
private long cost;
private String errorMsg;
private String extra;
public enum Status {
SUCCESS,
FAILED
}
@Override
public String type() {
return "MONITOR_LOGGER_DB_OPERATION";
}
@Override
public String message() {
return SJ.MONITOR_JOINER.join(type, serviceName, methodName, status, rows, cost, errorMsg, extra);
}
}

View File

@ -0,0 +1,13 @@
package tech.powerjob.server.monitor.events.db;
/**
* DatabaseEventType
*
* @author tjq
* @since 2022/9/6
*/
public enum DatabaseEventType {
H2,
CORE,
MONGO
}

View File

@ -0,0 +1,20 @@
package tech.powerjob.server.monitor.events.db;
import java.lang.annotation.*;
/**
* 数据库监控注解
*
* @author tjq
* @since 2022/9/6
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DatabaseMonitor {
/**
* 类型比如 H2 / CORE / MONGO
* @return 类型
*/
DatabaseEventType type();
}

View File

@ -0,0 +1,56 @@
package tech.powerjob.server.monitor.events.db;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import tech.powerjob.server.monitor.monitors.ServerMonitor;
import javax.annotation.Resource;
/**
* 监控切面
*
* @author tjq
* @since 2022/9/6
*/
@Slf4j
@Aspect
@Component
public class DatabaseMonitorAspect {
@Resource
private ServerMonitor serverMonitor;
@Around(value = "@annotation(databaseMonitor))")
public Object execute(ProceedingJoinPoint point, DatabaseMonitor databaseMonitor) throws Throwable {
final String className = point.getTarget().getClass().getSimpleName();
final String methodName = point.getSignature().getName();
DatabaseEvent event = new DatabaseEvent().setType(databaseMonitor.type())
.setServiceName(className)
.setMethodName(methodName)
.setStatus(DatabaseEvent.Status.SUCCESS);
long startTs = System.currentTimeMillis();
try {
final Object ret = point.proceed();
event.setRows(parseEffectRows(ret));
return ret;
} catch (Throwable t) {
long cost = System.currentTimeMillis() - startTs;
event.setCost(cost).setErrorMsg(t.getMessage()).setStatus(DatabaseEvent.Status.FAILED);
serverMonitor.record(event);
throw t;
}
}
private static Integer parseEffectRows(Object ret) {
// TODO: 计算影响行数可能需要小改下 DAO
return null;
}
}

View File

@ -23,6 +23,10 @@
<groupId>tech.powerjob</groupId>
<artifactId>powerjob-server-common</artifactId>
</dependency>
<dependency>
<groupId>tech.powerjob</groupId>
<artifactId>powerjob-server-monitor</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,34 @@
<?xml version="1.0"?>
<included>
<property name="MONITOR_LOG_PATH" value="${LOG_PATH}/monitors"/>
<property name="ROTATE_PATTERN" value="%d{yyyy-MM-dd}.%i"/>
<property name="MONITOR_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS}|%thread|%msg%n"/>
<!-- Configuration for database monitor logs. -->
<appender name="MONITOR_LOGGER_DB_OPERATION_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${MONITOR_LOG_PATH}/database.log</file>
<encoder>
<pattern>${MONITOR_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${MONITOR_LOG_PATH}/database.log.${ROTATE_PATTERN}</fileNamePattern>
<maxHistory>3</maxHistory>
<maxFileSize>500MB</maxFileSize>
<totalSizeCap>1500MB</totalSizeCap>
</rollingPolicy>
</appender>
<appender name="ASYNC_MONITOR_LOGGER_DB_OPERATION_APPENDER" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>512</queueSize>
<discardingThreshold>0</discardingThreshold>
<neverBlock>true</neverBlock>
<appender-ref ref="MONITOR_LOGGER_DB_OPERATION_APPENDER"/>
</appender>
<logger name="MONITOR_LOGGER_DB_OPERATION" level="INFO" additivity="false">
<appender-ref ref="ASYNC_MONITOR_LOGGER_DB_OPERATION_APPENDER"/>
</logger>
<!-- End of configuration for database monitor logs. -->
</included>

View File

@ -14,6 +14,9 @@
-->
<property name="LOG_PATH" value="${user.home}/powerjob/server/logs"/>
<!-- include other logback configs -->
<include resource="logback-config/powerjob_monitor.xml"/>
<!-- Configuration for ERROR logs. All error logs will write twice. -->
<appender name="ERROR_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/powerjob-server-error.log</file>