From 48ac4460143b922936c6f18f4b5d37c67e1f25b9 Mon Sep 17 00:00:00 2001 From: tjq Date: Sat, 10 Sep 2022 23:41:48 +0800 Subject: [PATCH] feat: define MonitorService to inject monitor context --- .../core/handler/WorkerRequestHandler.java | 6 +-- .../server/core/lock/UseCacheLockAspect.java | 6 +-- .../tech/powerjob/server/monitor/Monitor.java | 6 +++ .../server/monitor/MonitorContext.java | 24 ++++++++++ .../server/monitor/MonitorService.java | 11 +++++ .../server/monitor/monitors/LogMonitor.java | 36 ++++++++++++++ .../monitor/monitors/ServerMonitor.java | 39 --------------- .../monitor/monitors/impl/LogMonitor.java | 22 --------- .../monitor/DatabaseMonitorAspect.java | 6 +-- .../initializer/PowerJobMonitorService.java | 48 +++++++++++++++++++ .../logback-config/powerjob_monitor.xml | 2 +- 11 files changed, 135 insertions(+), 71 deletions(-) create mode 100644 powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/MonitorContext.java create mode 100644 powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/MonitorService.java create mode 100644 powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/monitors/LogMonitor.java delete mode 100644 powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/monitors/ServerMonitor.java delete mode 100644 powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/monitors/impl/LogMonitor.java create mode 100644 powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/initializer/PowerJobMonitorService.java diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/WorkerRequestHandler.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/WorkerRequestHandler.java index df8ab472..47be383e 100644 --- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/WorkerRequestHandler.java +++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/handler/WorkerRequestHandler.java @@ -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); } diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/lock/UseCacheLockAspect.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/lock/UseCacheLockAspect.java index f51809fb..aed87933 100644 --- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/lock/UseCacheLockAspect.java +++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/lock/UseCacheLockAspect.java @@ -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> 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, diff --git a/powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/Monitor.java b/powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/Monitor.java index 7d3a4de2..e53f7f5d 100644 --- a/powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/Monitor.java +++ b/powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/Monitor.java @@ -7,6 +7,12 @@ package tech.powerjob.server.monitor; * @since 2022/9/6 */ public interface Monitor { + + /** + * 全局上下文绑定 & 初始化 + * @param monitorContext 日志上下文 + */ + void init(MonitorContext monitorContext); /** * 记录监控事件 * 请注意该方法务必异步不阻塞!!! diff --git a/powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/MonitorContext.java b/powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/MonitorContext.java new file mode 100644 index 00000000..63549192 --- /dev/null +++ b/powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/MonitorContext.java @@ -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; + +} diff --git a/powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/MonitorService.java b/powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/MonitorService.java new file mode 100644 index 00000000..0fa1465f --- /dev/null +++ b/powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/MonitorService.java @@ -0,0 +1,11 @@ +package tech.powerjob.server.monitor; + +/** + * 对外暴露的监控服务 + * + * @author tjq + * @since 2022/9/10 + */ +public interface MonitorService { + void monitor(Event event); +} diff --git a/powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/monitors/LogMonitor.java b/powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/monitors/LogMonitor.java new file mode 100644 index 00000000..8ffed245 --- /dev/null +++ b/powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/monitors/LogMonitor.java @@ -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()); + } +} diff --git a/powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/monitors/ServerMonitor.java b/powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/monitors/ServerMonitor.java deleted file mode 100644 index 62f30035..00000000 --- a/powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/monitors/ServerMonitor.java +++ /dev/null @@ -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 monitors = Lists.newLinkedList(); - - @Autowired - public ServerMonitor(List 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)); - } -} diff --git a/powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/monitors/impl/LogMonitor.java b/powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/monitors/impl/LogMonitor.java deleted file mode 100644 index 79e433bb..00000000 --- a/powerjob-server/powerjob-server-monitor/src/tech/powerjob/server/monitor/monitors/impl/LogMonitor.java +++ /dev/null @@ -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()); - } -} diff --git a/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/monitor/DatabaseMonitorAspect.java b/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/monitor/DatabaseMonitorAspect.java index 71aef266..cd8649b3 100644 --- a/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/monitor/DatabaseMonitorAspect.java +++ b/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/monitor/DatabaseMonitorAspect.java @@ -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)); } } diff --git a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/initializer/PowerJobMonitorService.java b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/initializer/PowerJobMonitorService.java new file mode 100644 index 00000000..8cebd969 --- /dev/null +++ b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/initializer/PowerJobMonitorService.java @@ -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 monitors = Lists.newLinkedList(); + + @Autowired + public PowerJobMonitorService(List 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)); + } +} diff --git a/powerjob-server/powerjob-server-starter/src/main/resources/logback-config/powerjob_monitor.xml b/powerjob-server/powerjob-server-starter/src/main/resources/logback-config/powerjob_monitor.xml index 89c1bcb4..397c29c8 100644 --- a/powerjob-server/powerjob-server-starter/src/main/resources/logback-config/powerjob_monitor.xml +++ b/powerjob-server/powerjob-server-starter/src/main/resources/logback-config/powerjob_monitor.xml @@ -4,7 +4,7 @@ - +