---初始化项目
This commit is contained in:
28
powerjob-server/powerjob-server-monitor/pom.xml
Normal file
28
powerjob-server/powerjob-server-monitor/pom.xml
Normal file
@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>powerjob-server</artifactId>
|
||||
<groupId>tech.powerjob</groupId>
|
||||
<version>5.1.2</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>powerjob-server-monitor</artifactId>
|
||||
<version>${project.parent.version}</version>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>8</maven.compiler.source>
|
||||
<maven.compiler.target>8</maven.compiler.target>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>tech.powerjob</groupId>
|
||||
<artifactId>powerjob-server-common</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
@ -0,0 +1,22 @@
|
||||
package tech.powerjob.server.monitor;
|
||||
|
||||
/**
|
||||
* 监控事件
|
||||
*
|
||||
* @author tjq
|
||||
* @since 2022/9/6
|
||||
*/
|
||||
public interface Event {
|
||||
|
||||
/**
|
||||
* 监控事件的类型
|
||||
* @return 监控类型
|
||||
*/
|
||||
String type();
|
||||
|
||||
/**
|
||||
* 监控事件的内容
|
||||
* @return 监控事件的内容
|
||||
*/
|
||||
String message();
|
||||
}
|
||||
@ -0,0 +1,21 @@
|
||||
package tech.powerjob.server.monitor;
|
||||
|
||||
/**
|
||||
* 监视器
|
||||
*
|
||||
* @author tjq
|
||||
* @since 2022/9/6
|
||||
*/
|
||||
public interface Monitor {
|
||||
|
||||
/**
|
||||
* 全局上下文绑定 & 初始化
|
||||
*/
|
||||
void init();
|
||||
/**
|
||||
* 记录监控事件
|
||||
* 请注意该方法务必异步不阻塞!!!
|
||||
* @param event 事件
|
||||
*/
|
||||
void record(Event event);
|
||||
}
|
||||
@ -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,32 @@
|
||||
package tech.powerjob.server.monitor;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* PowerJob 服务端监控
|
||||
*
|
||||
* @author tjq
|
||||
* @since 2022/9/10
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class PowerJobMonitorService implements MonitorService {
|
||||
|
||||
private final List<Monitor> monitors = Lists.newLinkedList();
|
||||
|
||||
public PowerJobMonitorService(List<Monitor> monitors) {
|
||||
monitors.forEach(m -> {
|
||||
log.info("[MonitorService] register monitor: {}", m.getClass().getName());
|
||||
this.monitors.add(m);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void monitor(Event event) {
|
||||
monitors.forEach(m -> m.record(event));
|
||||
}
|
||||
}
|
||||
@ -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 DatabaseType 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);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,22 @@
|
||||
package tech.powerjob.server.monitor.events.db;
|
||||
|
||||
/**
|
||||
* DatabaseEventType
|
||||
*
|
||||
* @author tjq
|
||||
* @since 2022/9/6
|
||||
*/
|
||||
public enum DatabaseType {
|
||||
/**
|
||||
* 本地存储库,H2
|
||||
*/
|
||||
LOCAL,
|
||||
/**
|
||||
* 远程核心库
|
||||
*/
|
||||
CORE,
|
||||
/**
|
||||
* 扩展库
|
||||
*/
|
||||
EXTRA
|
||||
}
|
||||
@ -0,0 +1,39 @@
|
||||
package tech.powerjob.server.monitor.events.lock;
|
||||
|
||||
import lombok.Setter;
|
||||
import lombok.experimental.Accessors;
|
||||
import tech.powerjob.server.common.SJ;
|
||||
import tech.powerjob.server.monitor.Event;
|
||||
|
||||
/**
|
||||
* 长时间等待锁事件
|
||||
*
|
||||
* @author tjq
|
||||
* @since 2022/9/9
|
||||
*/
|
||||
@Setter
|
||||
@Accessors(chain = true)
|
||||
public class SlowLockEvent implements Event {
|
||||
|
||||
private Type type;
|
||||
private String lockType;
|
||||
private String lockKey;
|
||||
private String callerService;
|
||||
private String callerMethod;
|
||||
private long cost;
|
||||
|
||||
public enum Type {
|
||||
LOCAL,
|
||||
DB
|
||||
}
|
||||
|
||||
@Override
|
||||
public String type() {
|
||||
return "MONITOR_LOGGER_SLOW_LOCK";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String message() {
|
||||
return SJ.MONITOR_JOINER.join(type, lockType, lockKey, callerService, callerMethod, cost);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,47 @@
|
||||
package tech.powerjob.server.monitor.events.w2s;
|
||||
|
||||
import lombok.Setter;
|
||||
import lombok.experimental.Accessors;
|
||||
import tech.powerjob.common.enums.InstanceStatus;
|
||||
import tech.powerjob.server.common.SJ;
|
||||
import tech.powerjob.server.monitor.Event;
|
||||
|
||||
/**
|
||||
* TaskTrackerReportInstanceStatus
|
||||
*
|
||||
* @author tjq
|
||||
* @since 2022/9/9
|
||||
*/
|
||||
@Setter
|
||||
@Accessors(chain = true)
|
||||
public class TtReportInstanceStatusEvent implements Event {
|
||||
|
||||
private Long appId;
|
||||
private Long jobId;
|
||||
private Long instanceId;
|
||||
|
||||
private Long wfInstanceId;
|
||||
|
||||
private InstanceStatus instanceStatus;
|
||||
|
||||
private Long delayMs;
|
||||
|
||||
private Status serverProcessStatus;
|
||||
|
||||
private Long serverProcessCost;
|
||||
|
||||
public enum Status {
|
||||
SUCCESS,
|
||||
FAILED
|
||||
}
|
||||
|
||||
@Override
|
||||
public String type() {
|
||||
return "MONITOR_LOGGER_TT_REPORT_STATUS";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String message() {
|
||||
return SJ.MONITOR_JOINER.join(appId, jobId, instanceId, wfInstanceId, instanceStatus, delayMs, serverProcessStatus, serverProcessCost);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,44 @@
|
||||
package tech.powerjob.server.monitor.events.w2s;
|
||||
|
||||
import lombok.Setter;
|
||||
import lombok.experimental.Accessors;
|
||||
import tech.powerjob.server.common.SJ;
|
||||
import tech.powerjob.server.monitor.Event;
|
||||
|
||||
/**
|
||||
* worker 心跳事件监控
|
||||
*
|
||||
* @author tjq
|
||||
* @since 2022/9/9
|
||||
*/
|
||||
@Setter
|
||||
@Accessors(chain = true)
|
||||
public class WorkerHeartbeatEvent implements Event {
|
||||
|
||||
private String appName;
|
||||
/**
|
||||
* 虽然和 AppName 冗余,但考虑到其他日志使用 appId 监控,此处可方便潜在的其他处理
|
||||
*/
|
||||
private Long appId;
|
||||
private String version;
|
||||
|
||||
private String protocol;
|
||||
|
||||
private String tag;
|
||||
private String workerAddress;
|
||||
/**
|
||||
* worker 上报时间与 server 之间的延迟
|
||||
*/
|
||||
private long delayMs;
|
||||
private Integer score;
|
||||
|
||||
@Override
|
||||
public String type() {
|
||||
return "MONITOR_LOGGER_WORKER_HEART_BEAT";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String message() {
|
||||
return SJ.MONITOR_JOINER.join(appName, appId, version, protocol, tag, workerAddress, delayMs, score);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,48 @@
|
||||
package tech.powerjob.server.monitor.events.w2s;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.experimental.Accessors;
|
||||
import tech.powerjob.server.common.SJ;
|
||||
import tech.powerjob.server.monitor.Event;
|
||||
|
||||
/**
|
||||
* description
|
||||
*
|
||||
* @author tjq
|
||||
* @since 2022/9/11
|
||||
*/
|
||||
@Setter
|
||||
@Accessors(chain = true)
|
||||
public class WorkerLogReportEvent implements Event {
|
||||
|
||||
private String workerAddress;
|
||||
|
||||
/**
|
||||
* 日志条数
|
||||
*/
|
||||
private long logNum;
|
||||
|
||||
/**
|
||||
* 日志大小,用于统计 IO 压力
|
||||
*/
|
||||
private long logSize;
|
||||
|
||||
private Status status;
|
||||
|
||||
public enum Status {
|
||||
SUCCESS,
|
||||
REJECTED,
|
||||
EXCEPTION
|
||||
}
|
||||
|
||||
@Override
|
||||
public String type() {
|
||||
return "MONITOR_LOGGER_WORKER_LOG_REPORT";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String message() {
|
||||
return SJ.MONITOR_JOINER.join(workerAddress, logNum, logSize, status);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,43 @@
|
||||
package tech.powerjob.server.monitor.monitors;
|
||||
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.slf4j.MDC;
|
||||
import org.springframework.stereotype.Component;
|
||||
import tech.powerjob.server.common.aware.ServerInfoAware;
|
||||
import tech.powerjob.server.common.module.ServerInfo;
|
||||
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, ServerInfoAware {
|
||||
|
||||
/**
|
||||
* server 启动依赖 DB,DB会被 monitor,因此最初的几条 log serverInfo 一定为空,在此处简单防空
|
||||
*/
|
||||
private ServerInfo serverInfo = new ServerInfo();
|
||||
|
||||
private static final String MDC_KEY_SERVER_ID = "serverId";
|
||||
|
||||
|
||||
@Override
|
||||
public void init() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void record(Event event) {
|
||||
MDC.put(MDC_KEY_SERVER_ID, String.valueOf(serverInfo.getId()));
|
||||
LoggerFactory.getLogger(event.type()).info(event.message());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setServerInfo(ServerInfo serverInfo) {
|
||||
this.serverInfo = serverInfo;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user