mirror of
https://github.com/PowerJob/PowerJob.git
synced 2025-07-17 00:00:04 +08:00
feat: define MonitorService to inject monitor context
This commit is contained in:
parent
ac1b1fe0c8
commit
48ac446014
@ -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);
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -7,6 +7,12 @@ package tech.powerjob.server.monitor;
|
||||
* @since 2022/9/6
|
||||
*/
|
||||
public interface Monitor {
|
||||
|
||||
/**
|
||||
* 全局上下文绑定 & 初始化
|
||||
* @param monitorContext 日志上下文
|
||||
*/
|
||||
void init(MonitorContext monitorContext);
|
||||
/**
|
||||
* 记录监控事件
|
||||
* 请注意该方法务必异步不阻塞!!!
|
||||
|
@ -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;
|
||||
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package tech.powerjob.server.monitor;
|
||||
|
||||
/**
|
||||
* 对外暴露的监控服务
|
||||
*
|
||||
* @author tjq
|
||||
* @since 2022/9/10
|
||||
*/
|
||||
public interface MonitorService {
|
||||
void monitor(Event event);
|
||||
}
|
@ -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());
|
||||
}
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
@ -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());
|
||||
}
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
@ -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">
|
||||
|
Loading…
x
Reference in New Issue
Block a user