feat: define MonitorService to inject monitor context

This commit is contained in:
tjq 2022-09-10 23:41:48 +08:00
parent ac1b1fe0c8
commit 48ac446014
11 changed files with 135 additions and 71 deletions

View File

@ -19,8 +19,8 @@ import tech.powerjob.server.core.handler.impl.WorkerRequestHttpHandler;
import tech.powerjob.server.core.instance.InstanceLogService;
import tech.powerjob.server.core.instance.InstanceManager;
import tech.powerjob.server.core.workflow.WorkflowInstanceManager;
import tech.powerjob.server.monitor.MonitorService;
import tech.powerjob.server.monitor.events.handler.WorkerHeartbeatEvent;
import tech.powerjob.server.monitor.monitors.ServerMonitor;
import tech.powerjob.server.persistence.remote.model.ContainerInfoDO;
import tech.powerjob.server.persistence.remote.model.JobInfoDO;
import tech.powerjob.server.persistence.remote.repository.ContainerInfoRepository;
@ -48,7 +48,7 @@ import java.util.stream.Collectors;
public class WorkerRequestHandler {
@Resource
private ServerMonitor serverMonitor;
private MonitorService monitorService;
@Resource
private Environment environment;
@Resource
@ -81,7 +81,7 @@ public class WorkerRequestHandler {
WorkerHeartbeatEvent event = new WorkerHeartbeatEvent();
BeanUtils.copyProperties(heartbeat, event);
serverMonitor.record(event.setScore(heartbeat.getSystemMetrics().getScore()));
monitorService.monitor(event.setScore(heartbeat.getSystemMetrics().getScore()));
WorkerClusterManagerService.updateStatus(heartbeat);
}

View File

@ -11,8 +11,8 @@ import org.aspectj.lang.annotation.Aspect;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import tech.powerjob.server.common.utils.AOPUtils;
import tech.powerjob.server.monitor.MonitorService;
import tech.powerjob.server.monitor.events.lock.SlowLockEvent;
import tech.powerjob.server.monitor.monitors.ServerMonitor;
import javax.annotation.Resource;
import java.lang.reflect.Method;
@ -33,7 +33,7 @@ import java.util.concurrent.locks.ReentrantLock;
public class UseCacheLockAspect {
@Resource
private ServerMonitor serverMonitor;
private MonitorService monitorService;
private final Map<String, Cache<String, ReentrantLock>> lockContainer = Maps.newConcurrentMap();
@ -67,7 +67,7 @@ public class UseCacheLockAspect {
.setCallerMethod(method.getName())
.setCost(timeCost);
serverMonitor.record(slowLockEvent);
monitorService.monitor(slowLockEvent);
log.warn("[UseSegmentLockAspect] wait lock for method({}#{}) cost {} ms! key = '{}', args = {}, ", method.getDeclaringClass().getSimpleName(), method.getName(), timeCost,
key,

View File

@ -7,6 +7,12 @@ package tech.powerjob.server.monitor;
* @since 2022/9/6
*/
public interface Monitor {
/**
* 全局上下文绑定 & 初始化
* @param monitorContext 日志上下文
*/
void init(MonitorContext monitorContext);
/**
* 记录监控事件
* 请注意该方法务必异步不阻塞

View File

@ -0,0 +1,24 @@
package tech.powerjob.server.monitor;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* 日志全局上下文
*
* @author tjq
* @since 2022/9/10
*/
@Getter
@Setter
@ToString
@Accessors(chain = true)
public class MonitorContext implements Serializable {
private long serverId;
private String serverAddress;
}

View File

@ -0,0 +1,11 @@
package tech.powerjob.server.monitor;
/**
* 对外暴露的监控服务
*
* @author tjq
* @since 2022/9/10
*/
public interface MonitorService {
void monitor(Event event);
}

View File

@ -0,0 +1,36 @@
package tech.powerjob.server.monitor.monitors;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import tech.powerjob.server.monitor.Event;
import tech.powerjob.server.monitor.Monitor;
import tech.powerjob.server.monitor.MonitorContext;
/**
* 系统默认实现基于日志的监控监视器
* 需要接入方自行基于类 ELK 系统采集
*
* @author tjq
* @since 2022/9/6
*/
@Component
public class LogMonitor implements Monitor {
private MonitorContext monitorContext;
private static final String MDC_KEY_SERVER_ID = "serverId";
private static final String MDC_KEY_SERVER_ADDRESS = "serverAddress";
@Override
public void init(MonitorContext monitorContext) {
this.monitorContext = monitorContext;
}
@Override
public void record(Event event) {
MDC.put(MDC_KEY_SERVER_ID, String.valueOf(monitorContext.getServerId()));
MDC.put(MDC_KEY_SERVER_ADDRESS, monitorContext.getServerAddress());
LoggerFactory.getLogger(event.type()).info(event.message());
}
}

View File

@ -1,39 +0,0 @@
package tech.powerjob.server.monitor.monitors;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import tech.powerjob.server.monitor.Event;
import tech.powerjob.server.monitor.Monitor;
import java.util.List;
/**
* 服务端监视器
*
* @author tjq
* @since 2022/9/6
*/
@Slf4j
@Component
public class ServerMonitor implements Monitor {
private final List<Monitor> monitors = Lists.newLinkedList();
@Autowired
public ServerMonitor(List<Monitor> monitors) {
monitors.forEach(m -> {
if (m == this) {
return;
}
log.info("[ServerMonitor] register monitor: {}", m.getClass().getName());
this.monitors.add(m);
});
}
@Override
public void record(Event event) {
monitors.forEach(m -> m.record(event));
}
}

View File

@ -1,22 +0,0 @@
package tech.powerjob.server.monitor.monitors.impl;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import tech.powerjob.server.monitor.Event;
import tech.powerjob.server.monitor.Monitor;
/**
* 系统默认实现基于日志的监控监视器
* 需要接入方自行基于类 ELK 系统采集
*
* @author tjq
* @since 2022/9/6
*/
@Component
public class LogMonitor implements Monitor {
@Override
public void record(Event event) {
LoggerFactory.getLogger(event.type()).info(event.message());
}
}

View File

@ -7,9 +7,9 @@ import org.aspectj.lang.annotation.Aspect;
import org.springframework.data.domain.Slice;
import org.springframework.stereotype.Component;
import tech.powerjob.server.common.utils.AOPUtils;
import tech.powerjob.server.monitor.MonitorService;
import tech.powerjob.server.monitor.events.db.DatabaseEvent;
import tech.powerjob.server.monitor.events.db.DatabaseType;
import tech.powerjob.server.monitor.monitors.ServerMonitor;
import javax.annotation.Resource;
import java.util.Collection;
@ -28,7 +28,7 @@ import java.util.stream.Stream;
public class DatabaseMonitorAspect {
@Resource
private ServerMonitor serverMonitor;
private MonitorService monitorService;
@Around("execution(* tech.powerjob.server.persistence.remote.repository..*.*(..))")
public Object monitorCoreDB(ProceedingJoinPoint joinPoint) throws Throwable {
@ -59,7 +59,7 @@ public class DatabaseMonitorAspect {
throw t;
} finally {
long cost = System.currentTimeMillis() - startTs;
serverMonitor.record(event.setCost(cost));
monitorService.monitor(event.setCost(cost));
}
}

View File

@ -0,0 +1,48 @@
package tech.powerjob.server.initializer;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import tech.powerjob.server.monitor.Event;
import tech.powerjob.server.monitor.Monitor;
import tech.powerjob.server.monitor.MonitorContext;
import tech.powerjob.server.monitor.MonitorService;
import tech.powerjob.server.remote.server.ServerInfoService;
import javax.annotation.Resource;
import java.util.List;
/**
* PowerJob 服务端监控
*
* @author tjq
* @since 2022/9/10
*/
@Slf4j
@Component
public class PowerJobMonitorService implements MonitorService {
@Resource
private ServerInfoService service;
private final List<Monitor> monitors = Lists.newLinkedList();
@Autowired
public PowerJobMonitorService(List<Monitor> monitors) {
MonitorContext monitorContext = new MonitorContext().setServerId(service.getServerId()).setServerAddress(service.getServerIp());
log.info("[MonitorService] use monitor context: {}", monitorContext);
monitors.forEach(m -> {
log.info("[MonitorService] register monitor: {}", m.getClass().getName());
m.init(monitorContext);
this.monitors.add(m);
});
}
@Override
public void monitor(Event event) {
monitors.forEach(m -> m.record(event));
}
}

View File

@ -4,7 +4,7 @@
<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"/>
<property name="MONITOR_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS}|%thread|%X{serverId}|%msg%n"/>
<!-- Configuration for database monitor logs. -->
<appender name="MONITOR_LOGGER_DB_OPERATION_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">