初始化3.0.0版本

This commit is contained in:
zengqiao
2022-08-18 17:04:05 +08:00
parent 462303fca0
commit 51832385b1
2446 changed files with 93177 additions and 127211 deletions

131
km-common/pom.xml Normal file
View File

@@ -0,0 +1,131 @@
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xiaojukeji.kafka</groupId>
<artifactId>km-common</artifactId>
<version>${km.revision}</version>
<packaging>jar</packaging>
<parent>
<artifactId>km</artifactId>
<groupId>com.xiaojukeji.kafka</groupId>
<version>${km.revision}</version>
</parent>
<properties>
<maven.test.skip>true</maven.test.skip>
<downloadSources>true</downloadSources>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<file_encoding>UTF-8</file_encoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<!-- swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</dependency>
<!-- json -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<dependency>
<groupId>net.sf.jopt-simple</groupId>
<artifactId>jopt-simple</artifactId>
</dependency>
<dependency>
<groupId>io.github.zqrferrari</groupId>
<artifactId>logi-log</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.13</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,22 @@
package com.xiaojukeji.know.streaming.km.common.annotations;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* Kafka源码
* @author zengqiao
* @date 2020-07-20
*/
@Target({ElementType.TYPE, ElementType.LOCAL_VARIABLE})
@Retention(RUNTIME)
@Documented
public @interface KafkaSource {
int modified() default 0;
String modifyDesc() default "";
}

View File

@@ -0,0 +1,18 @@
package com.xiaojukeji.know.streaming.km.common.annotations.enterprise;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* License
*/
@Target({ElementType.PACKAGE, ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RUNTIME)
@Documented
public @interface EnterpriseLicense {
boolean all() default true; // 是否所有代码都是,默认是都是
}

View File

@@ -0,0 +1,18 @@
package com.xiaojukeji.know.streaming.km.common.annotations.enterprise;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* Load-reBalance能力
*/
@Target({ElementType.PACKAGE, ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RUNTIME)
@Documented
public @interface EnterpriseLoadReBalance {
boolean all() default true; // 是否所有代码都是,默认是都是
}

View File

@@ -0,0 +1,18 @@
package com.xiaojukeji.know.streaming.km.common.annotations.enterprise;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* Testing
*/
@Target({ElementType.PACKAGE, ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RUNTIME)
@Documented
public @interface EnterpriseTesting {
boolean all() default true; // 是否所有代码都是,默认是都是
}

View File

@@ -0,0 +1,13 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto;
import java.io.Serializable;
/**
*
*
* @author d06679
* @date 2019/3/13
*/
public class BaseDTO implements Serializable {
private static final long serialVersionUID = 7861489615519826338L;
}

View File

@@ -0,0 +1,65 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.acl;
import com.xiaojukeji.know.streaming.km.common.bean.dto.BaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @author zengqiao
* @date 22/03/01
*/
@Data
@ApiModel(description="创建Acl")
public class AclAtomDTO extends BaseDTO {
@NotNull(message = "clusterId不允许为null")
@ApiModelProperty(value = "集群ID", example = "1")
private Long clusterId;
@NotBlank(message = "kafkaUser不允许为空")
@ApiModelProperty(value = "kafkaUser名称", example = "know-streaming")
private String kafkaUser;
/**
* 定义操作 —— 操作类型
* @see org.apache.kafka.common.acl.AclOperation
*/
@ApiModelProperty(value = "操作类型,读/写/任意等", example = "2")
private Integer aclOperation;
/**
* 定义操作 — 权限状态,允许或者拒绝
* @see org.apache.kafka.common.acl.AclPermissionType
*/
@ApiModelProperty(value = "权限状态,允许/拒绝等", example = "3")
private Integer aclPermissionType;
/**
* 定义操作 — 客户端主机
*/
@ApiModelProperty(value = "客户端主机", example = "127.0.0.1")
private String aclClientHost;
/**
* 定义资源 —— 资源类型
* @see org.apache.kafka.common.resource.ResourceType
*/
@ApiModelProperty(value = "资源类型, Topic/Group等", example = "2")
private Integer resourceType;
/**
* 定义资源 —— 资源名称
*/
@ApiModelProperty(value = "资源名称")
private String resourceName;
/**
* 定义资源 —— 资源匹配方式
* @see org.apache.kafka.common.resource.PatternType
*/
@ApiModelProperty(value = "资源匹配方式", example = "3")
private Integer resourcePatternType;
}

View File

@@ -0,0 +1,20 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.cluster;
import com.xiaojukeji.know.streaming.km.common.bean.dto.pagination.PaginationSortDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* @author zengqiao
* @date 22/02/24
*/
@Data
public class ClusterBrokersOverviewDTO extends PaginationSortDTO {
@NotNull(message = "latestMetricNames不允许为空")
@ApiModelProperty("需要指标点的信息")
private List<String> latestMetricNames;
}

View File

@@ -0,0 +1,19 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.cluster;
import com.xiaojukeji.know.streaming.km.common.bean.dto.pagination.PaginationMulFuzzySearchDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author zengqiao
* @date 22/02/24
*/
@Data
public class ClusterGroupsOverviewDTO extends PaginationMulFuzzySearchDTO {
@ApiModelProperty("查找该Topic")
private String topicName;
@ApiModelProperty("查找该Group")
private String groupName;
}

View File

@@ -0,0 +1,30 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.cluster;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @author zengqiao
* @date 20/4/23
*/
@Data
@ApiModel(description = "集群信息接入")
@JsonIgnoreProperties(ignoreUnknown = true)
public class ClusterPhyAddDTO extends ClusterPhyBaseDTO {
@NotBlank(message = "name不允许为空串")
@ApiModelProperty(value="集群名称", example = "KnowStreaming")
protected String name;
@NotNull(message = "description不允许为空")
@ApiModelProperty(value="描述", example = "测试")
protected String description;
@NotBlank(message = "kafkaVersion不允许为空")
@ApiModelProperty(value="集群的kafka版本", example = "2.5.1")
protected String kafkaVersion;
}

View File

@@ -0,0 +1,37 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.cluster;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.xiaojukeji.know.streaming.km.common.bean.dto.BaseDTO;
import com.xiaojukeji.know.streaming.km.common.bean.entity.config.JmxConfig;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Properties;
/**
* @author zengqiao
* @date 20/4/23
*/
@Data
@ApiModel(description = "集群信息接入测试")
@JsonIgnoreProperties(ignoreUnknown = true)
public class ClusterPhyBaseDTO extends BaseDTO {
@NotNull(message = "zookeeper不允许为null")
@ApiModelProperty(value="ZK地址, 不允许修改", example = "127.0.0.1:2181")
protected String zookeeper;
@NotBlank(message = "bootstrapServers不允许为空串")
@ApiModelProperty(value="bootstrap地址", example = "127.0.0.1:9093")
protected String bootstrapServers;
@NotNull(message = "clientProperties不允许为空")
@ApiModelProperty(value="KM连接集群时使用的客户端配置")
protected Properties clientProperties;
@NotNull(message = "jmxProperties不允许为空")
@ApiModelProperty(value="Jmx配置")
protected JmxConfig jmxProperties;
}

View File

@@ -0,0 +1,21 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.cluster;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Min;
/**
* @author zengqiao
* @date 20/4/23
*/
@Data
@ApiModel(description = "集群信息修改")
@JsonIgnoreProperties(ignoreUnknown = true)
public class ClusterPhyModifyDTO extends ClusterPhyAddDTO {
@Min(value = 0, message = "id不允许小于0")
@ApiModelProperty(value="集群Id", example = "1")
private Long id;
}

View File

@@ -0,0 +1,28 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.cluster;
import com.xiaojukeji.know.streaming.km.common.bean.dto.metrices.MetricDTO;
import com.xiaojukeji.know.streaming.km.common.bean.dto.pagination.PaginationSortDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* @author zengqiao
* @date 22/02/24
*/
@Data
public class ClusterTopicsOverviewDTO extends PaginationSortDTO {
@NotNull(message = "latestMetricNames不允许为空")
@ApiModelProperty("需要指标点的信息")
private List<String> latestMetricNames;
@NotNull(message = "metricLines不允许为空")
@ApiModelProperty("需要指标曲线的信息")
private MetricDTO metricLines;
@ApiModelProperty("显示内部Topic")
private Boolean showInternalTopics;
}

View File

@@ -0,0 +1,27 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.cluster;
import com.xiaojukeji.know.streaming.km.common.bean.dto.metrices.MetricDTO;
import com.xiaojukeji.know.streaming.km.common.bean.dto.pagination.PaginationGeneralDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* @author zengqiao
* @date 22/02/24
*/
@Data
@NoArgsConstructor
public class MultiClusterDashboardDTO extends PaginationGeneralDTO {
@NotNull(message = "latestMetricNames不允许为空")
@ApiModelProperty("需要指标点的信息")
private List<String> latestMetricNames;
@NotNull(message = "metricLines不允许为空")
@ApiModelProperty("需要指标曲线的信息")
private MetricDTO metricLines;
}

View File

@@ -0,0 +1,26 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.config;
import com.xiaojukeji.know.streaming.km.common.bean.dto.BaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.util.Properties;
/**
* @author zengqiao
* @date 22/02/28
*/
@Data
@ApiModel(description = "Kafka配置信息")
public class KafkaConfigDTO extends BaseDTO {
@Min(value = 0, message = "clusterId不允许小于0")
@ApiModelProperty(value = "集群ID", example = "6")
private Long clusterId;
@NotNull(message = "changedProps不允许为空")
@ApiModelProperty(value = "配置值", example = "{}")
private Properties changedProps;
}

View File

@@ -0,0 +1,22 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.config;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Min;
/**
* @author zengqiao
* @date 22/02/28
*/
@Data
@ApiModel(description = "Kafka配置信息")
public class KafkaConfigModifyBrokerDTO extends KafkaConfigDTO {
@Min(value = 0, message = "brokerId不允许小于0")
@ApiModelProperty(value = "BrokerId", example = "1")
private Integer brokerId;
@ApiModelProperty(value = "应用到全部", example = "false")
private Boolean applyAll;
}

View File

@@ -0,0 +1,19 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.config;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @author zengqiao
* @date 22/02/28
*/
@Data
@ApiModel(description = "Kafka配置信息")
public class KafkaConfigModifyTopicDTO extends KafkaConfigDTO {
@NotBlank(message = "topicName不允许为空")
@ApiModelProperty(value = "配置名称", example = "know-streaming")
private String topicName;
}

View File

@@ -0,0 +1,34 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.config.platform;
import com.xiaojukeji.know.streaming.km.common.bean.dto.BaseDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
@NoArgsConstructor
public class PlatformClusterConfigDTO extends BaseDTO {
@Min(value = 0, message = "clusterId不允许小于0")
@ApiModelProperty(value = "集群ID", example = "6")
private Long clusterId;
@NotBlank(message = "valueGroup不允许空")
@ApiModelProperty(value = "配置组", example = "3423r43r")
private String valueGroup;
@NotBlank(message = "valueName不允许空")
@ApiModelProperty(value = "配置项的名称", example = "3423r43r")
private String valueName;
@NotNull(message = "value不允许为null")
@ApiModelProperty(value = "配置值", example = "3423r43r")
private String value;
@NotNull(message = "description不允许为null")
@ApiModelProperty(value = "备注", example = "测试")
private String description;
}

View File

@@ -0,0 +1,44 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.group;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.xiaojukeji.know.streaming.km.common.bean.dto.partition.PartitionOffsetDTO;
import com.xiaojukeji.know.streaming.km.common.bean.dto.topic.ClusterTopicDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* 重置offset
* @author zengqiao
* @date 19/4/8
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class GroupOffsetResetDTO extends ClusterTopicDTO {
@NotBlank(message = "groupName不允许为空")
@ApiModelProperty(value = "消费组名称", example = "g-know-streaming")
private String groupName;
/**
* @see com.xiaojukeji.know.streaming.km.common.enums.GroupOffsetResetEnum
*/
@NotNull(message = "resetType不允许为空")
@ApiModelProperty(value = "重置方式", example = "1")
private Integer resetType;
@ApiModelProperty(value = "重置到指定offset")
private List<PartitionOffsetDTO> offsetList;
@ApiModelProperty(value = "重置到指定时间")
private Long timestamp;
@ApiModelProperty(value = "如果不存在则创建")
private Boolean createIfNotExist;
public boolean isCreateIfNotExist() {
return createIfNotExist != null && createIfNotExist;
}
}

View File

@@ -0,0 +1,18 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.group;
import com.xiaojukeji.know.streaming.km.common.bean.dto.pagination.PaginationSortDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author zengqiao
* @date 22/02/24
*/
@Data
public class GroupTopicConsumedDTO extends PaginationSortDTO {
@ApiModelProperty("需要指标点的信息")
private List<String> latestMetricNames;
}

View File

@@ -0,0 +1,60 @@
/*
* Copyright (c) 2015, WINIT and/or its affiliates. All rights reserved. Use, Copy is subject to authorized license.
*/
package com.xiaojukeji.know.streaming.km.common.bean.dto.job;
import com.xiaojukeji.know.streaming.km.common.bean.dto.BaseDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import java.util.Date;
/**
* WorkTask Vo 对象
*
* @author fengqiongfeng
* @date 2020-12-21
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class JobDTO extends BaseDTO {
private static final long serialVersionUID = 1L;
@ApiModelProperty("任务id, 创建时不需要")
private Long id;
/**
* @see com.xiaojukeji.know.streaming.km.common.enums.job.JobTypeEnum
*/
@ApiModelProperty("任务类型")
private Integer jobType;
/**
* @see com.xiaojukeji.know.streaming.km.common.enums.job.JobStatusEnum
*/
@ApiModelProperty("任务状态")
private Integer jobStatus;
@ApiModelProperty("任务执行对象")
private String target;
@ApiModelProperty(value = "任务描述")
private String jobDesc;
@NotBlank(message = "creator不允许为空或空串")
@ApiModelProperty("创建人")
private String creator;
@ApiModelProperty("计划执行时间")
private Date planTime;
@NotBlank(message = "data不允许为空或空串")
@ApiModelProperty("data")
private String jobData;
}

View File

@@ -0,0 +1,30 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.job;
import com.xiaojukeji.know.streaming.km.common.bean.dto.pagination.PaginationBaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "任务处理信息")
public class JobPaginationDTO extends PaginationBaseDTO {
@ApiModelProperty("任务类型,-1全部0Topic迁移1Topic扩缩副本2集群均衡")
private Integer type = -1;
@ApiModelProperty("执行任务对象")
private String jobTarget;
@ApiModelProperty("任务创建人")
private String creator;
@ApiModelProperty("运行状态,为空则代表全部状态")
private List<Integer> status;
}

View File

@@ -0,0 +1,24 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.kafkauser;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
/**
* @author zengqiao
* @date 20/4/23
*/
@Data
@ApiModel(description="kafkaUser信息")
public class ClusterKafkaUserDTO {
@Min(value = 1, message = "clusterId不允许为null或者小于0")
@ApiModelProperty(value = "集群ID, 默认为逻辑集群ID", example = "6")
protected Long clusterId;
@NotBlank(message = "kafkaUser不允许为空串")
@ApiModelProperty(value = "kafkaUser名称", example = "know-streaming")
protected String kafkaUser;
}

View File

@@ -0,0 +1,24 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.kafkauser;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @author zengqiao
* @date 20/4/23
*/
@Data
@ApiModel(description="kafkaUser密码信息")
public class ClusterKafkaUserTokenDTO extends ClusterKafkaUserDTO {
@NotBlank(message = "token不允许为空串")
@ApiModelProperty(value = "密码", example = "12313224cerce32r344rC")
private String token;
@NotNull(message = "authType不允许为空")
@ApiModelProperty(value = "认证类型", example = "1300")
private Integer authType;
}

View File

@@ -0,0 +1,35 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.metrices;
import com.xiaojukeji.know.streaming.km.common.bean.dto.BaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author didi
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "指标查询基础信息")
public class MetricDTO extends BaseDTO {
@ApiModelProperty("开始时间")
private Long startTime;
@ApiModelProperty("结束时间")
private Long endTime;
@ApiModelProperty(value = "聚合类型:avg、max、min、sum默认avg", example = "avg")
private String aggType = "avg";
@ApiModelProperty(value = "指标类型/指标名称", example = "[\"topics\"]")
private List<String> metricsNames;
@ApiModelProperty("Top-Level:5,10,15,20")
private Integer topNu = 5;
}

View File

@@ -0,0 +1,25 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.metrices;
import com.xiaojukeji.know.streaming.km.common.bean.entity.topic.TopicPartitionKS;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author didi
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "Group&Partition指标查询信息")
public class MetricGroupPartitionDTO extends MetricDTO {
@ApiModelProperty("Group 名称")
private String group;
@ApiModelProperty("Group 的 topic & partition 信息")
private List<TopicPartitionKS> groupTopics;
}

View File

@@ -0,0 +1,22 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.metrices;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author didi
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "Group&Topic指标查询信息")
public class MetricGroupTopicDTO extends MetricDTO {
@ApiModelProperty("Group名称")
private String group;
@ApiModelProperty("Topic名称")
private String topic;
}

View File

@@ -0,0 +1,23 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.metrices;
import com.xiaojukeji.know.streaming.km.common.bean.dto.BaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author didi
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "指标查询基础信息")
public class MetricRealTimeDTO extends BaseDTO {
@ApiModelProperty("指标类型")
private Integer metricType;
@ApiModelProperty("指标名称")
private String metricName;
}

View File

@@ -0,0 +1,22 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.metrices;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author didi
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "topic指标查询信息")
public class MetricsBrokerDTO extends MetricDTO {
@ApiModelProperty("brokerId列表")
private List<Long> brokerIds;
}

View File

@@ -0,0 +1,22 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.metrices;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author didi
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "物理集群指标查询信息")
public class MetricsClusterPhyDTO extends MetricDTO {
@ApiModelProperty("物理集群Id列表")
private List<Long> clusterPhyIds;
}

View File

@@ -0,0 +1,22 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.metrices;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author didi
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "topic指标查询信息")
public class MetricsTopicDTO extends MetricDTO {
@ApiModelProperty("topic名称")
private List<String> topics;
}

View File

@@ -0,0 +1,20 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.metrices;
import com.xiaojukeji.know.streaming.km.common.bean.dto.BaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "用户指标显示设置配置信息")
public class UserMetricConfigDTO extends BaseDTO {
@ApiModelProperty("指标展示设置项key指标名value是否展现(true展现/false不展现)")
private Map<String, Boolean> metricsSet;
}

View File

@@ -0,0 +1,80 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.oprecord;
import com.xiaojukeji.know.streaming.km.common.bean.dto.BaseDTO;
import com.xiaojukeji.know.streaming.km.common.enums.operaterecord.ModuleEnum;
import com.xiaojukeji.know.streaming.km.common.enums.operaterecord.OperationEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
*
*
* @author d06679
* @date 2019/3/14
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "操作记录信息")
public class OperateRecordDTO extends BaseDTO {
/**
* 主键
*/
@ApiModelProperty("记录ID")
private Integer id;
/**
* @see ModuleEnum
*/
@ApiModelProperty("模块ID")
private Integer moduleId;
/**
* @see OperationEnum
*/
@ApiModelProperty("操作ID")
private Integer operateId;
/**
* 操作业务id String类型
*/
@ApiModelProperty("业务ID")
private String bizId;
/**
* 操作描述
*/
@ApiModelProperty("操作内容")
private String content;
/**
* 操作人 邮箱前缀
*/
@ApiModelProperty("操作人")
private String operator;
/**
* 操作时间
*/
@ApiModelProperty("操作时间")
private Date operateTime;
/**
* 操作起始时间 查询使用
*/
@ApiModelProperty("开始时间")
private Date beginTime;
/**
* 操作截止时间 查询使用
*/
@ApiModelProperty("结束时间")
private Date endTime;
}

View File

@@ -0,0 +1,25 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.pagination;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.xiaojukeji.know.streaming.km.common.constant.PaginationConstant;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
@ApiModel(description="列表分页查询的BaseDTO")
@JsonIgnoreProperties(ignoreUnknown = true)
public class PaginationBaseDTO {
@NotNull(message = "pageNo不允许为空")
@ApiModelProperty(value="页面位置默认1", example = "1")
private Integer pageNo = PaginationConstant.DEFAULT_PAGE_NO;
@NotNull(message = "pageSize不允许为空")
@ApiModelProperty(value="页面大小默认10", example = "10")
private Integer pageSize = PaginationConstant.DEFAULT_PAGE_SIZE;
@ApiModelProperty(value="模糊搜索", example = "")
private String searchKeywords;
}

View File

@@ -0,0 +1,32 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.pagination;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.xiaojukeji.know.streaming.km.common.bean.dto.pagination.field.PaginationPreciseFilterFieldDTO;
import com.xiaojukeji.know.streaming.km.common.bean.dto.pagination.field.PaginationRangeFilterFieldDTO;
import com.xiaojukeji.know.streaming.km.common.enums.SortTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.Valid;
import java.util.List;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel(description="通用分页信息")
public class PaginationGeneralDTO extends PaginationBaseDTO {
@ApiModelProperty(value="排序字段, 传入的字段名同返回的VO里面的字段名")
private String sortField;
@ApiModelProperty(value="排序类型[asc|desc]默认desc", example = "desc")
private String sortType = SortTypeEnum.DESC.getSortType();
@Valid
@ApiModelProperty(value="多字段精确过滤")
private List<PaginationPreciseFilterFieldDTO> preciseFilterDTOList;
@Valid
@ApiModelProperty(value="多字段范围过滤")
private List<PaginationRangeFilterFieldDTO> rangeFilterDTOList;
}

View File

@@ -0,0 +1,24 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.pagination;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.xiaojukeji.know.streaming.km.common.bean.dto.pagination.field.PaginationFuzzySearchFieldDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.Valid;
import java.util.List;
/**
* 模糊搜索
* @author zengqiao
* @date 22/02/23
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel(description="多字段模糊搜索")
public class PaginationMulFuzzySearchDTO extends PaginationBaseDTO {
@Valid
@ApiModelProperty(value="模糊搜索字段")
private List<PaginationFuzzySearchFieldDTO> fuzzySearchDTOList;
}

View File

@@ -0,0 +1,20 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.pagination;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.xiaojukeji.know.streaming.km.common.bean.dto.pagination.field.PaginationPreciseFilterFieldDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel(description="多字段精确过滤")
public class PaginationMulPreciseFilterDTO extends PaginationBaseDTO {
// GET请求格式
// filterDTOList[0].fieldValueList=aaa,bbb,ccc&filterDTOList[0].fieldName=clusterName 还需要将这个请求转义才可以
@ApiModelProperty(value="多字段精确过滤, 传入的字段名同返回的VO里面的字段名")
private List<PaginationPreciseFilterFieldDTO> preciseFilterDTOList ;
}

View File

@@ -0,0 +1,18 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.pagination;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.xiaojukeji.know.streaming.km.common.bean.dto.pagination.field.PaginationRangeFilterFieldDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel(description="多字段范围过滤")
public class PaginationMulRangeFilterDTO extends PaginationBaseDTO {
@ApiModelProperty(value="多字段范围过滤")
private List<PaginationRangeFilterFieldDTO> rangeFilterDTOList ;
}

View File

@@ -0,0 +1,29 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.pagination;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.xiaojukeji.know.streaming.km.common.bean.dto.pagination.field.PaginationFuzzySearchFieldDTO;
import com.xiaojukeji.know.streaming.km.common.bean.dto.pagination.field.PaginationPreciseFilterFieldDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.Valid;
import java.util.List;
/**
* 模糊搜索
* @author zengqiao
* @date 22/02/23
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel(description="多字段模糊搜索")
public class PaginationPreciseAndFuzzySearchDTO extends PaginationBaseDTO {
@Valid
@ApiModelProperty(value="模糊搜索字段, 传入的字段名同返回的VO里面的字段名")
private List<PaginationFuzzySearchFieldDTO> fuzzySearchDTOList;
@Valid
@ApiModelProperty(value="多字段精确过滤, 传入的字段名同返回的VO里面的字段名")
private List<PaginationPreciseFilterFieldDTO> preciseFilterDTOList ;
}

View File

@@ -0,0 +1,18 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.pagination;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.xiaojukeji.know.streaming.km.common.enums.SortTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel(description="列表分页查询-带过滤条件")
public class PaginationSortDTO extends PaginationBaseDTO {
@ApiModelProperty(value="排序字段, 传入的字段名同返回的VO里面的字段名", example = "topicName")
private String sortField;
@ApiModelProperty(value="排序类型[asc|desc]默认desc", example = "desc")
private String sortType = SortTypeEnum.DESC.getSortType();
}

View File

@@ -0,0 +1,19 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.pagination.field;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
@ApiModel(description="模糊搜索")
public class PaginationFuzzySearchFieldDTO {
@NotBlank(message = "fieldName不允许为空")
@ApiModelProperty(value="模糊搜索字段名", example = "kafkaUser")
private String fieldName;
@NotBlank(message = "fieldValue不允许为空")
@ApiModelProperty(value="模糊搜索字段值", example = "know-streaming-kafka-user")
private String fieldValue;
}

View File

@@ -0,0 +1,23 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.pagination.field;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
@NoArgsConstructor
@ApiModel(description="列表分页查询-过滤字段信息")
public class PaginationPreciseFilterFieldDTO {
@NotBlank(message = "fieldName不允许为空")
@ApiModelProperty(value="过滤字段")
private String fieldName;
@NotNull(message = "fieldValueList不允许为空")
@ApiModelProperty(value="过滤值")
private List<String> fieldValueList;
}

View File

@@ -0,0 +1,23 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.pagination.field;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
@ApiModel(description="列表分页查询-过滤字段信息")
public class PaginationRangeFilterFieldDTO {
@NotBlank(message = "fieldName不允许为空")
@ApiModelProperty(value="过滤字段", example = "healthScore")
private String fieldName;
@NotBlank(message = "fieldMinValue不允许为空")
@ApiModelProperty(value="最小值", example = "2")
private String fieldMinValue;
@NotBlank(message = "fieldMaxValue不允许为空")
@ApiModelProperty(value="最大值", example = "100")
private String fieldMaxValue;
}

View File

@@ -0,0 +1,31 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.partition;
import com.xiaojukeji.know.streaming.km.common.bean.dto.BaseDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Min;
/**
* Topic Offset
* @author zengqiao
* @date 19/6/2
*/
@Data
@NoArgsConstructor
public class PartitionOffsetDTO extends BaseDTO {
@Min(value = 0, message = "partitionId不允许小于0")
@ApiModelProperty(value = "分区ID", example = "1")
private Integer partitionId;
@Min(value = 0, message = "offset不允许小于0")
@ApiModelProperty(value = "分区offset", example = "123")
private Long offset;
public PartitionOffsetDTO(Integer partitionId, Long offset) {
this.partitionId = partitionId;
this.offset = offset;
}
}

View File

@@ -0,0 +1,22 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.reassign;
import com.xiaojukeji.know.streaming.km.common.bean.dto.BaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
@ApiModel(description="迁移Topic概要信息")
public class ReassignTopicOverviewDTO extends BaseDTO {
@Min(value = 1, message = "clusterId不允许为null或者小于0")
@ApiModelProperty(value = "集群ID", example = "2")
private Long clusterId;
@NotNull(message = "topicNameList不允许为空")
@ApiModelProperty(value = "Topic名称列表", example = "[ks-0, ks-1, ks-2]")
private List<String> topicNameList;
}

View File

@@ -0,0 +1,23 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.reassign.change;
import com.xiaojukeji.know.streaming.km.common.bean.dto.topic.ClusterTopicDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
@ApiModel(description="创建迁移Json")
public class CreateChangeReplicasPlanDTO extends ClusterTopicDTO {
@NotNull(message = "newReplicaNum必须大于等于1")
@Min(value = 1, message = "newReplicaNum必须大于等于1")
@ApiModelProperty(value = "副本数", example = "3")
private Integer newReplicaNum;
@NotNull(message = "brokerIdList不允许为空")
@ApiModelProperty(value = "BrokerID列表", example = "3,4,5")
private List<Integer> brokerIdList;
}

View File

@@ -0,0 +1,24 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.reassign.move;
import com.xiaojukeji.know.streaming.km.common.bean.dto.topic.ClusterTopicDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
@ApiModel(description="创建迁移Json")
public class CreateMoveReplicaPlanDTO extends ClusterTopicDTO {
@ApiModelProperty(value = "分区ID列表", example = "0,1,2")
private List<Integer> partitionIdList;
@NotNull(message = "brokerIdList不允许为空")
@ApiModelProperty(value = "BrokerID列表", example = "3,4,5")
private List<Integer> brokerIdList;
@NotNull(message = "enableRackAwareness不允许为空")
@ApiModelProperty(value = "是否机架感知", example = "false")
private Boolean enableRackAwareness;
}

View File

@@ -0,0 +1,30 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.reassign.plan;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author zengqiao
* @date 22/05/06
*/
@Data
@ApiModel(description = "迁移计划")
public class ReassignPartitionPlanDTO {
@ApiModelProperty(value="集群ID")
private Long clusterId;
@ApiModelProperty(value="Topic名称")
private String topicName;
@ApiModelProperty(value="分区ID")
private Integer partitionId;
@ApiModelProperty(value="当前BrokerId列表")
private List<Integer> originalBrokerIdList;
@ApiModelProperty(value="迁移BrokerId列表")
private List<Integer> reassignBrokerIdList;
}

View File

@@ -0,0 +1,55 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.reassign.plan;
import com.xiaojukeji.know.streaming.km.common.bean.vo.metrics.point.MetricPointVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author zengqiao
* @date 22/05/06
*/
@Data
@ApiModel(description = "迁移计划")
public class ReassignTopicPlanDTO {
@ApiModelProperty(value="集群ID")
private Long clusterId;
@ApiModelProperty(value="Topic名称")
private String topicName;
@ApiModelProperty(value="需要迁移Topic分区列表", example = "[1, 2, 3]")
private List<Integer> partitionIdList;
@ApiModelProperty(value="需要迁移Topic分区数", example = "10")
private Integer partitionNum;
@ApiModelProperty(value="当前副本数", example = "2")
private Integer presentReplicaNum;
@ApiModelProperty(value="新的副本数", example = "2")
private Integer newReplicaNum;
@ApiModelProperty(value="当前BrokerId列表")
private List<Integer> originalBrokerIdList;
@ApiModelProperty(value="迁移BrokerId列表")
private List<Integer> reassignBrokerIdList;
@ApiModelProperty(value="迁移计划列表")
private List<ReassignPartitionPlanDTO> partitionPlanList;
@ApiModelProperty(value="Topic当前数据保存时间", example = "10")
private Long originalRetentionTimeUnitMs;
@ApiModelProperty(value="Topic迁移时数据保存时间", example = "10")
private Long reassignRetentionTimeUnitMs;
@ApiModelProperty(value="近N天的avg的BytesIn")
private List<MetricPointVO> latestDaysAvgBytesInList;
@ApiModelProperty(value="近N天的max的BytesIn")
private List<MetricPointVO> latestDaysMaxBytesInList;
}

View File

@@ -0,0 +1,25 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.topic;
import com.xiaojukeji.know.streaming.km.common.bean.dto.BaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
/**
* @author zengqiao
* @date 20/4/23
*/
@Data
@ApiModel(description="Topic信息")
public class ClusterTopicDTO extends BaseDTO {
@Min(value = 1, message = "clusterId不允许为null或者小于0")
@ApiModelProperty(value = "集群ID, 默认为逻辑集群ID", example = "6")
protected Long clusterId;
@NotBlank(message = "topicName不允许为空串")
@ApiModelProperty(value = "Topic名称", example = "know-streaming")
protected String topicName;
}

View File

@@ -0,0 +1,39 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.topic;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Properties;
/**
* @author huangyiminghappy@163.com, zengqiao
* @date 2019-04-21
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel(description = "创建Topic")
public class TopicCreateDTO extends ClusterTopicDTO {
@Min(value = 1, message = "partitionNum不允许为空且最小值为1")
@ApiModelProperty(value = "分区数", example = "3")
private Integer partitionNum;
@Min(value = 1, message = "replicaNum不允许为空且最小值为1")
@ApiModelProperty(value = "副本数", example = "2")
private Integer replicaNum;
@ApiModelProperty(value = "brokerId列表为空时则选择所有的Broker", example = "[1, 2, 3]")
private List<Integer> brokerIdList;
@NotNull(message = "properties不允许为null")
@ApiModelProperty(value = "Topic属性列表", example = "{ \"retention.ms\": \"9876543210\", \"retention.bytes\": \"1234567890\",}")
private Properties properties;
@NotNull(message = "description不允许为null")
@ApiModelProperty(value = "备注", example = "测试Topic")
private String description;
}

View File

@@ -0,0 +1,25 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.topic;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Min;
import java.util.List;
/**
* @author zengqiao
* @date 20/1/2
*/
@Data
@ApiModel(value = "Topic扩分区")
@JsonIgnoreProperties(ignoreUnknown = true)
public class TopicExpansionDTO extends ClusterTopicDTO {
@Min(value = 1, message = "incPartitionNum不允许为null或者小于0")
@ApiModelProperty(value = "新增分区数", example = "1")
private Integer incPartitionNum;
@ApiModelProperty(value = "brokerId列表为空时则选择所有的Broker", example = "[1, 2, 3]")
private List<Integer> brokerIdList;
}

View File

@@ -0,0 +1,37 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.topic;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.xiaojukeji.know.streaming.km.common.bean.dto.BaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* @author zengqiao
* @date 2022-03-15
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel(description = "Topic记录")
public class TopicRecordDTO extends BaseDTO {
@NotNull(message = "truncate不允许为空")
@ApiModelProperty(value = "是否截断", example = "true")
private Boolean truncate;
@ApiModelProperty(value = "过滤的分区,为空时表示不过滤", example = "1")
private Integer filterPartitionId;
@ApiModelProperty(value = "过滤的key", example = "")
private String filterKey;
@ApiModelProperty(value = "过滤的value", example = "")
private String filterValue;
@ApiModelProperty(value = "预览最大消息条数", example = "100")
private Integer maxRecords = 100;
@ApiModelProperty(value = "预览超时时间", example = "10000")
private Long pullTimeoutUnitMs = 8000L;
}

View File

@@ -0,0 +1,25 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.util;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Properties;
/**
* @author zengqiao
* @date 20/4/23
*/
@Data
@ApiModel(description="Kafka-BootstrapServers信息")
public class ValidateKafkaBSDTO {
@NotBlank(message = "zookeeper不允许为空")
@ApiModelProperty(value = "bootstrapServers地址", example = "127.0.0.1:9093")
private String bootstrapServers;
@NotNull(message = "clientProperties不允许为null")
@ApiModelProperty(value = "客户端配置")
private Properties clientProperties;
}

View File

@@ -0,0 +1,24 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.util;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Properties;
/**
* @author zengqiao
* @date 20/4/23
*/
@Data
@ApiModel(description="Kafka信息")
public class ValidateKafkaDTO {
@ApiModelProperty(value = "bootstrapServers地址", example = "127.0.0.1:9093")
private String bootstrapServers;
@ApiModelProperty(value = "客户端配置")
private Properties clientProperties;
@ApiModelProperty(value = "zk地址", example = "127.0.0.1:2181")
private String zookeeper;
}

View File

@@ -0,0 +1,19 @@
package com.xiaojukeji.know.streaming.km.common.bean.dto.util;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @author zengqiao
* @date 20/4/23
*/
@Data
@ApiModel(description="Kafka-ZK信息")
public class ValidateKafkaZKDTO {
@NotBlank(message = "zookeeper不允许为空")
@ApiModelProperty(value = "zk地址", example = "127.0.0.1:2181")
private String zookeeper;
}

View File

@@ -0,0 +1,17 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @author d06679
* @date 2019/3/22
*/
@Data
public class BaseEntity implements Serializable {
protected Date createTime;
protected Date updateTime;
}

View File

@@ -0,0 +1,12 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity;
/**
* @author didi
*/
public interface EntifyIdInterface {
/**
* 获取id
* @return
*/
Long getId();
}

View File

@@ -0,0 +1,88 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.assign;
import lombok.Data;
import java.util.*;
/**
* Topic在Broker上的分布统计
*/
@Data
public class TopicAssignedCount implements Comparable<TopicAssignedCount> {
private static Integer presentReplicaIdx = 0;
private Integer brokerId;
private String rack;
/**
* 每个位置的副本都分配了哪些分区到该Broker上
*/
private List<List<Integer>> idxReplicaPartitionList;
/**
* 分配到该Broker上的分区
*/
private Set<Integer> assignedPartitionSet;
/**
* 是否参与分区分配
*/
private boolean includeAssign;
public TopicAssignedCount(Integer brokerId, String rack, Integer replicaNum, boolean includeAssign) {
this.brokerId = brokerId;
this.rack = rack;
this.idxReplicaPartitionList = new ArrayList<>();
for (int idx = 0; idx < replicaNum; ++idx) {
this.idxReplicaPartitionList.add(new ArrayList<>());
}
this.assignedPartitionSet = new HashSet<>();
this.includeAssign = includeAssign;
}
@Override
public int compareTo(TopicAssignedCount o) {
// 先按照该Broker在某个位置的副本数量进行排序
if (this.idxReplicaPartitionList.get(presentReplicaIdx).size() < o.idxReplicaPartitionList.get(o.presentReplicaIdx).size()) {
return -1;
} else if (this.idxReplicaPartitionList.get(presentReplicaIdx).size() > o.idxReplicaPartitionList.get(o.presentReplicaIdx).size()) {
return 1;
}
// 再按照Broker上的副本总数进行排序
if (this.assignedPartitionSet.size() < o.assignedPartitionSet.size()) {
return -1;
} else if (this.assignedPartitionSet.size() > o.assignedPartitionSet.size()) {
return 1;
}
// 最后按照brokerId进行排序
return this.brokerId.compareTo(o.brokerId);
}
public static void setPresentReplicaIdx(Integer replicaIdx, Integer replicaNum) {
presentReplicaIdx = replicaIdx % replicaNum;
}
public static Map<Integer, List<Integer>> convert2PartitionMap(List<TopicAssignedCount> assignedCountList, Integer replicaNum, List<Integer> filterPartitionIdList) {
Map<Integer, List<Integer>> partitionMap = new HashMap<>();
// 遍历每个位置的副本
for (int idx = 0; idx < replicaNum; ++idx) {
// 遍历Broker
for (TopicAssignedCount assignedCount: assignedCountList) {
// 遍历Broker上指定位置的副本被分配到的分区
for (Integer partitionId: assignedCount.getIdxReplicaPartitionList().get(idx)) {
if (filterPartitionIdList != null && filterPartitionIdList.contains(partitionId)) {
continue;
}
partitionMap.putIfAbsent(partitionId, new ArrayList<>());
partitionMap.get(partitionId).add(assignedCount.getBrokerId());
}
}
}
return partitionMap;
}
}

View File

@@ -0,0 +1,87 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.broker;
import com.xiaojukeji.know.streaming.km.common.zookeeper.znode.brokers.BrokerMetadata;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.kafka.common.Node;
import java.io.Serializable;
/**
* @author didi
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Broker implements Serializable {
/**
* 物理集群ID
*/
private Long clusterPhyId;
/**
* BrokerID
*/
private Integer brokerId;
/**
* 主机
*/
private String host;
/**
* 服务端口
*/
private Integer port;
/**
* JMX端口
*/
private Integer jmxPort;
/**
* 启动时间
*/
private Long startTimestamp;
/**
* rack信息
*/
private String rack;
/**
* 是否存活
*/
private Integer status;
public static Broker buildFrom(Long clusterPhyId, Node node, Long startTimestamp) {
Broker metadata = new Broker();
metadata.setClusterPhyId(clusterPhyId);
metadata.setBrokerId(node.id());
metadata.setHost(node.host());
metadata.setPort(node.port());
metadata.setJmxPort(-1);
metadata.setStartTimestamp(startTimestamp);
metadata.setRack(node.rack());
metadata.setStatus(1);
return metadata;
}
public static Broker buildFrom(Long clusterPhyId, Integer brokerId, BrokerMetadata brokerMetadata) {
Broker metadata = new Broker();
metadata.setClusterPhyId(clusterPhyId);
metadata.setBrokerId(brokerId);
metadata.setHost(brokerMetadata.getHost());
metadata.setPort(brokerMetadata.getPort());
metadata.setJmxPort(brokerMetadata.getJmxPort());
metadata.setStartTimestamp(brokerMetadata.getTimestamp());
metadata.setRack(brokerMetadata.getRack());
metadata.setStatus(1);
return metadata;
}
public boolean alive() {
return status != null && status > 0;
}
}

View File

@@ -0,0 +1,20 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.broker;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BrokerSpec {
private Integer brokerId;
private Double cpu;
private Double disk;
private Double flow;
}

View File

@@ -0,0 +1,80 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.cluster;
import com.xiaojukeji.know.streaming.km.common.bean.entity.EntifyIdInterface;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ClusterPhy implements Comparable<ClusterPhy>, EntifyIdInterface {
/**
* 主键
*/
private Long id;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
/**
* 集群名字
*/
private String name;
/**
* 集群服务地址
*/
private String bootstrapServers;
/**
* 版本信息
*/
private String kafkaVersion;
/**
* ZK地址
*/
private String zookeeper;
/**
* 集群客户端配置
*/
private String clientProperties;
/**
* jmx配置
*/
private String jmxProperties;
/**
* 开启ACL
* @see com.xiaojukeji.know.streaming.km.common.enums.cluster.ClusterAuthTypeEnum
*/
private Integer authType;
/**
* 运行状态
* @see com.xiaojukeji.know.streaming.km.common.enums.cluster.ClusterRunStateEnum
*/
private Integer runState;
/**
* 备注
*/
private String description;
@Override
public int compareTo(ClusterPhy clusterPhy) {
return this.id.compareTo(clusterPhy.id);
}
}

View File

@@ -0,0 +1,22 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.cluster;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 集群状态信息
* @author zengqiao
* @date 22/02/24
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ClusterPhysState {
private Integer liveCount;
private Integer downCount;
private Integer total;
}

View File

@@ -0,0 +1,40 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.common;
import lombok.Getter;
import java.util.concurrent.Delayed;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
@Getter
public class FutureTaskDelayQueueData<T> implements Delayed {
private final String taskName;
private final Future<T> futureTask;
private final long timeoutTimeUnitMs;
private final long createTimeUnitMs;
public FutureTaskDelayQueueData(String taskName, Future<T> futureTask, long timeoutTimeUnitMs) {
this.taskName = taskName;
this.futureTask = futureTask;
this.timeoutTimeUnitMs = timeoutTimeUnitMs;
this.createTimeUnitMs = System.currentTimeMillis();
}
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(timeoutTimeUnitMs - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
}
@Override
public int compareTo(Delayed delayed) {
FutureTaskDelayQueueData<T> other = (FutureTaskDelayQueueData<T>) delayed;
if (this.timeoutTimeUnitMs == other.timeoutTimeUnitMs) {
return (this.timeoutTimeUnitMs + "_" + this.createTimeUnitMs).compareTo((other.timeoutTimeUnitMs + "_" + other.createTimeUnitMs));
}
return (this.timeoutTimeUnitMs - other.timeoutTimeUnitMs) <= 0 ? -1: 1;
}
}

View File

@@ -0,0 +1,18 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.common;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class IpPortData implements Serializable {
private static final long serialVersionUID = -428897032994630685L;
private String ip;
private String port;
}

View File

@@ -0,0 +1,13 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.config;
import lombok.Data;
import java.io.Serializable;
@Data
public class BaseClusterConfigValue implements Serializable {
/**
* 物理集群ID
*/
protected Long clusterPhyId;
}

View File

@@ -0,0 +1,32 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.config;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @author zengqiao
* @date 22/02/24
*/
@Data
@ApiModel(description = "Jmx配置")
public class JmxConfig implements Serializable {
@ApiModelProperty(value="jmx端口", example = "8099")
private Integer jmxPort;
@ApiModelProperty(value="最大连接", example = "100")
private Integer maxConn;
@ApiModelProperty(value="是否开启SSL如果开始则username 与 token 必须非空", example = "false")
private Boolean openSSL;
@ApiModelProperty(value="SSL情况下的username", example = "Ks-Km")
private String username;
@ApiModelProperty(value="SSL情况下的token", example = "KsKmCCY19")
private String token;
}

View File

@@ -0,0 +1,21 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.config.healthcheck;
import com.xiaojukeji.know.streaming.km.common.bean.entity.config.BaseClusterConfigValue;
import com.xiaojukeji.know.streaming.km.common.enums.health.HealthCheckNameEnum;
import lombok.Data;
/**
* 单集群的配置
*/
@Data
public class BaseClusterHealthConfig extends BaseClusterConfigValue {
/**
* 健康检查名称
*/
protected HealthCheckNameEnum checkNameEnum;
/**
* 权重
*/
protected Float weight;
}

View File

@@ -0,0 +1,14 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.config.healthcheck;
import lombok.Data;
/**
* 单集群配置,比较大小
*/
@Data
public class HealthCompareValueConfig extends BaseClusterHealthConfig {
/**
* 比较值
*/
private Double value = 10.0;
}

View File

@@ -0,0 +1,19 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.config.healthcheck;
import lombok.Data;
/**
* 最近N分钟被检测到M次
*/
@Data
public class HealthDetectedInLatestMinutesConfig extends BaseClusterHealthConfig {
/**
* 最近多少时间
*/
private Integer latestMinutes = 10;
/**
* 被检测到的次数
*/
private Integer detectedTimes = 8;
}

View File

@@ -0,0 +1,48 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.config.kafkaconfig;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author zengqiao
* @date 22/02/28
*/
@Data
@ApiModel(description = "Kafka配置信息")
public class KafkaConfigDetail {
@ApiModelProperty(value = "配置名", example = "retention.ms")
private String name;
@ApiModelProperty(value = "配置值", example = "1268888")
private String value;
@ApiModelProperty(value = "默认配置值", example = "1268888")
private String defaultValue;
/**
* 配置源
* @see org.apache.kafka.common.requests.DescribeConfigsResponse.ConfigSource
*/
@ApiModelProperty(value = "配置源", example = "1268888")
private Integer configSource;
@ApiModelProperty(value = "敏感的配置", example = "false")
private Boolean sensitive;
@ApiModelProperty(value = "只读的配置", example = "false")
private Boolean readOnly;
/**
* 配置源
* @see org.apache.kafka.common.requests.DescribeConfigsResponse.ConfigType
*/
@ApiModelProperty(value = "配置value类型", example = "false")
private Integer configType;
@ApiModelProperty(value = "配置说明", example = "保存时间")
private String documentation;
@ApiModelProperty(value = "已覆写配置", example = "false")
private Boolean override;
}

View File

@@ -0,0 +1,32 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.config.kafkaconfig;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author zengqiao
* @date 22/02/28
*/
@Data
@ApiModel(description = "Kafka配置信息")
public class KafkaTopicDefaultConfig {
@ApiModelProperty(value = "配置名", example = "retention.ms")
private String name;
@ApiModelProperty(value = "默认配置值", example = "1268888")
private String defaultValue;
@ApiModelProperty(value = "只读的配置", example = "false")
private Boolean readOnly;
/**
* 配置源
* @see org.apache.kafka.common.requests.DescribeConfigsResponse.ConfigType
*/
@ApiModelProperty(value = "配置value类型", example = "false")
private Integer configType;
@ApiModelProperty(value = "配置说明", example = "保存时间")
private String documentation;
}

View File

@@ -0,0 +1,33 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.config.metric;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserMetricConfig {
private int type;
private String metric;
private boolean set;
@Override
public int hashCode(){
return metric.hashCode() << 1 + type;
}
@Override
public boolean equals(Object o){
if(!(o instanceof UserMetricConfig)) {
// 非 UserMetricConfig 类型则返回false
return false;
}
UserMetricConfig u = (UserMetricConfig) o;
return type == u.getType() && metric.equals(u.getMetric());
}
}

View File

@@ -0,0 +1,20 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.group;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author zengqiao
* @date 19/5/14
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class GroupTopic implements Serializable {
private String groupName;
private String topicName;
}

View File

@@ -0,0 +1,28 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.group;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* @author zengqiao
* @date 19/5/14
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class GroupTopicPartition implements Serializable {
private String groupName;
private String topicName;
private List<Integer> partitionIdList;
public GroupTopicPartition(String groupName, String topicName) {
this.groupName = groupName;
this.topicName = topicName;
}
}

View File

@@ -0,0 +1,40 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.health;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
public class HealthCheckResult {
/**
* 检查维度(0:未知1:Cluster2:Broker3:Topic4:Group)
*/
private Integer dimension;
/**
* 配置ID
*/
private String configName;
/**
* 物理集群ID
*/
private Long clusterPhyId;
/**
* 资源名称
*/
private String resName;
/**
* 是否通过
*/
private Integer passed;
public HealthCheckResult(Integer dimension, String configName, Long clusterPhyId, String resName) {
this.dimension = dimension;
this.configName = configName;
this.clusterPhyId = clusterPhyId;
this.resName = resName;
}
}

View File

@@ -0,0 +1,123 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.health;
import com.xiaojukeji.know.streaming.km.common.bean.entity.config.healthcheck.BaseClusterHealthConfig;
import com.xiaojukeji.know.streaming.km.common.bean.po.health.HealthCheckResultPO;
import com.xiaojukeji.know.streaming.km.common.enums.health.HealthCheckNameEnum;
import com.xiaojukeji.know.streaming.km.common.utils.ValidateUtils;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@Data
@NoArgsConstructor
public class HealthScoreResult {
private HealthCheckNameEnum checkNameEnum;
private Float presentDimensionTotalWeight;
private Float allDimensionTotalWeight;
private BaseClusterHealthConfig baseConfig;
private List<HealthCheckResultPO> poList;
private Boolean passed;
public HealthScoreResult(HealthCheckNameEnum checkNameEnum,
Float presentDimensionTotalWeight,
Float allDimensionTotalWeight,
BaseClusterHealthConfig baseConfig,
List<HealthCheckResultPO> poList) {
this.checkNameEnum = checkNameEnum;
this.baseConfig = baseConfig;
this.poList = poList;
this.presentDimensionTotalWeight = presentDimensionTotalWeight;
this.allDimensionTotalWeight = allDimensionTotalWeight;
if (!ValidateUtils.isEmptyList(poList) && poList.stream().filter(elem -> elem.getPassed() <= 0).count() <= 0) {
passed = true;
} else {
passed = false;
}
}
public Integer getTotalCount() {
if (poList == null) {
return 0;
}
return poList.size();
}
public Integer getPassedCount() {
if (poList == null) {
return 0;
}
return (int) (poList.stream().filter(elem -> elem.getPassed() > 0).count());
}
/**
* 计算所有检查结果的健康分
* 比如:计算集群健康分
*/
public Float calAllWeightHealthScore() {
Float healthScore = 100 * baseConfig.getWeight() / allDimensionTotalWeight;
if (poList == null || poList.isEmpty()) {
return 0.0f;
}
return healthScore * this.getPassedCount() / this.getTotalCount();
}
/**
* 计算当前维度的健康分
* 比如计算集群Broker健康分
*/
public Float calDimensionWeightHealthScore() {
Float healthScore = 100 * baseConfig.getWeight() / presentDimensionTotalWeight;
if (poList == null || poList.isEmpty()) {
return 0.0f;
}
return healthScore * this.getPassedCount() / this.getTotalCount();
}
/**
* 计算当前检查的健康分
* 比如计算集群Broker健康检查中的某一项的健康分
*/
public Integer calRawHealthScore() {
if (poList == null || poList.isEmpty()) {
return 100;
}
return 100 * this.getPassedCount() / this.getTotalCount();
}
public List<String> getNotPassedResNameList() {
if (poList == null) {
return new ArrayList<>();
}
return poList.stream().filter(elem -> elem.getPassed() <= 0).map(elem -> elem.getResName()).collect(Collectors.toList());
}
public Date getCreateTime() {
if (ValidateUtils.isEmptyList(poList)) {
return null;
}
return poList.get(0).getCreateTime();
}
public Date getUpdateTime() {
if (ValidateUtils.isEmptyList(poList)) {
return null;
}
return poList.get(0).getUpdateTime();
}
}

View File

@@ -0,0 +1,80 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.job;
import com.xiaojukeji.know.streaming.km.common.bean.entity.BaseEntity;
import com.xiaojukeji.know.streaming.km.common.bean.entity.job.content.BaseJobCreateContent;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Job extends BaseEntity {
/**
* 序列化版本号
*/
private static final long serialVersionUID = 1L;
/**
* id
*/
private Long id;
/**
* 集群id
*/
private Long clusterId;
/**
* 标题
*/
private String jobName;
/**
* 标题
*/
private String jobDesc;
/**
* 任务类型
*/
private Integer jobType;
/**
* 任务状态
*/
private Integer jobStatus;
/**
* 创建任务的详细数据
* @see BaseJobCreateContent
*/
private String jobData;
/**
* 任务执行对象
*/
private String target;
/**
* 任务运行详细状态(json), Success7 Fail1 Doing2
*/
private String runningStatus;
/**
* 任务计划开始执行时间
*/
private Date planTime;
/**
* 任务实际开始执行时间
*/
private Date startTime;
/**
* 创建人
*/
private String creator;
}

View File

@@ -0,0 +1,57 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.job;
import com.xiaojukeji.know.streaming.km.common.enums.job.JobStatusEnum;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@NoArgsConstructor
public class JobStatus {
/**
* @see JobStatusEnum
*/
private int status;
private int total;
private int success;
private int failed;
private int doing;
private int waiting;
private int unknown;
/**
* 按照状态,直接进行聚合
*/
public JobStatus(List<Integer> jobStatusList) {
this.total = jobStatusList.size();
this.success = 0;
this.failed = 0;
this.doing = 0;
this.waiting = 0;
this.unknown = 0;
for (Integer jobStatus: jobStatusList) {
if (JobStatusEnum.SUCCESS.getStatus() == jobStatus) {
success += 1;
} else if (JobStatusEnum.FAILED.getStatus() == jobStatus) {
failed += 1;
} else if (JobStatusEnum.RUNNING.getStatus() == jobStatus) {
doing += 1;
} else if (JobStatusEnum.WAITING.getStatus() == jobStatus) {
waiting += 1;
} else {
unknown += 1;
}
}
this.status = JobStatusEnum.getStatusBySubStatus(this.total, this.success, this.failed, this.doing).getStatus();
}
}

View File

@@ -0,0 +1,8 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.job.content;
import lombok.Data;
@Data
public class BaseJobCreateContent {
protected int type;
}

View File

@@ -0,0 +1,30 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.job.content;
import com.xiaojukeji.know.streaming.km.common.bean.dto.reassign.plan.ReassignTopicPlanDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
@ApiModel(description="创建/修改迁移及扩缩副本任务")
public class JobCommunityReassignContent extends BaseJobCreateContent {
@Min(value = 1, message = "clusterId不允许为null或者小于0")
@ApiModelProperty(value = "集群ID, 默认为逻辑集群ID", example = "6")
private Long clusterId;
@Min(value = 1, message = "throttle不允许为null或者小于0")
@ApiModelProperty(value = "限流值", example = "102400000")
private Long throttleUnitB;
@NotNull(message = "description不允许为null")
@ApiModelProperty(value = "备注信息", example = "测试")
private String description;
@NotNull(message = "topicPlanList不允许为空")
@ApiModelProperty("迁移计划")
private List<ReassignTopicPlanDTO> topicPlanList;
}

View File

@@ -0,0 +1,81 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.job.detail;
import com.xiaojukeji.know.streaming.km.common.bean.vo.job.sub.SubJobVO;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class JobDetail {
/**
* 任务id
*/
private Long id;
/**
* 任务类型
*/
private Integer jobType;
/**
* 任务名称
*/
private String jobName;
/**
* 任务状态
*/
private Integer jobStatus;
/**
* 任务描述
*/
private String jobDesc;
/**
* 任务计划执行时间
*/
private Date planTime;
/**
* 任务开始执行时间
*/
private Date startTime;
/**
* 任务完成执行时间
*/
private Date endTime;
/**
* 任务限流值
*/
private Double flowLimit;
/**
* 子任务成功数
*/
private Integer total;
/**
* 子任务成功数
*/
private Integer success;
/**
* 子任务失败数
*/
private Integer fail;
/**
* 子任务进行数
*/
private Integer doing;
/**
* 子任务列表,不同的子任务的实现不一样,需要具体场景具体处理
*/
private List<SubJobVO> subJobs;
}

View File

@@ -0,0 +1,45 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.job.detail;
import com.xiaojukeji.know.streaming.km.common.bean.entity.BaseEntity;
import lombok.Data;
import java.util.Date;
@Data
public class JobModifyDetail extends BaseEntity {
/**
* 任务id
*/
private Long id;
/**
* 任务类型
*/
private Integer jobType;
/**
* 任务名称
*/
private String jobName;
/**
* 任务描述
*/
private String jobDesc;
/**
* 任务状态
*/
private Integer jobStatus;
/**
* 任务扩展数据
*/
private String jobData;
/**
* 任务计划开始执行时间
*/
private Date planTime;
}

View File

@@ -0,0 +1,18 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.job.detail;
import lombok.Data;
import java.util.List;
@Data
public abstract class SubBrokerJobDetail extends SubJobDetail{
/**
* 源brokerId列表
*/
private List<Integer> sourceBrokers;
/**
* 目的brokerId列表
*/
private List<Integer> desBrokers;
}

View File

@@ -0,0 +1,4 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.job.detail;
public abstract class SubJobDetail {
}

View File

@@ -0,0 +1,57 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.job.detail;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SubJobPartitionDetail {
/**
* partitionId
*/
private Integer partitionId;
/**
* 源BrokerID
*/
private Integer sourceBrokerId;
/**
* 目标BrokerID
*/
private List<Integer> desBrokerIds;
/**
* 需迁移MessageSize
*/
private Double totalSize;
/**
* 已完成MessageSize
*/
private Double movedSize;
/**
* 任务状态
*/
private String status;
/**
* 预计剩余时长
*/
private Long remainTime;
/**
* BytesIn
*/
private Long byteIn;
/**
* 同步速率
*/
private Long byteMove;
}

View File

@@ -0,0 +1,68 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.job.detail;
import lombok.Data;
import java.util.List;
@Data
public class SubJobReplicaMoveDetail extends SubBrokerJobDetail {
/**
* topic 名称
*/
private String topicName;
/**
* 分区列表
*/
private List<Integer> partitions;
/**
* 当前数据保存时间
*/
private Long currentTimeSpent;
/**
* 迁移数据时间范围
*/
private Long moveTimeSpent;
/**
* 状态
*/
private Integer status;
/**
* 需迁移MessageSize
*/
private Double totalSize;
/**
* 已完成MessageSize
*/
private Double movedSize;
/**
* 预计剩余时长
*/
private Long remainTime;
/**
* 子任务成功数
*/
private Integer total;
/**
* 子任务成功数
*/
private Integer success;
/**
* 子任务失败数
*/
private Integer fail;
/**
* 子任务进行数
*/
private Integer doing;
}

View File

@@ -0,0 +1,61 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.job.detail;
import lombok.Data;
@Data
public class SubJobReplicaScalaDetail extends SubBrokerJobDetail {
/**
* topic 名称
*/
private String topicName;
/**
* 原副本数
*/
private Integer oldReplicaNu;
/**
* 新副本数
*/
private Integer newReplicaNu;
/**
* 状态
*/
private Integer status;
/**
* 需迁移MessageSize
*/
private Double totalSize;
/**
* 已完成MessageSize
*/
private Double movedSize;
/**
* 预计剩余时长
*/
private Long remainTime;
/**
* 子任务成功数
*/
private Integer total;
/**
* 子任务成功数
*/
private Integer success;
/**
* 子任务失败数
*/
private Integer fail;
/**
* 子任务进行数
*/
private Integer doing;
}

View File

@@ -0,0 +1,36 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.kafkacontroller;
import com.xiaojukeji.know.streaming.km.common.constant.Constant;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@NoArgsConstructor
public class KafkaController implements Serializable {
/**
* 物理集群ID
*/
private Long clusterPhyId;
/**
* brokerId
*/
private Integer brokerId;
/**
* 被选举时间
*/
private Long timestamp;
public KafkaController(Long clusterPhyId, Integer brokerId, Long timestamp) {
this.clusterPhyId = clusterPhyId;
this.brokerId = brokerId;
this.timestamp = timestamp;
}
public boolean alive() {
return !brokerId.equals(Constant.INVALID_CODE);
}
}

View File

@@ -0,0 +1,52 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.kafkauser;
import com.xiaojukeji.know.streaming.km.common.constant.Constant;
import com.xiaojukeji.know.streaming.km.common.utils.ConvertUtil;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.kafka.clients.admin.ScramMechanism;
import java.util.*;
@Data
@NoArgsConstructor
public class KafkaUser {
/**
* 集群Id
*/
private Long clusterPhyId;
/**
* KafkaUser
*/
private String name;
/**
* 密钥
*/
private String token;
/**
* 原始数据
*/
private Properties props;
public KafkaUser(Long clusterPhyId, String name, String token, Properties props) {
this.clusterPhyId = clusterPhyId;
this.name = name;
this.token = token;
this.props = props;
}
public String getCredentialString() {
List<String> credentialList = new ArrayList<>();
for (ScramMechanism scramMechanism: ScramMechanism.values()) {
if (!props.containsKey(scramMechanism.mechanismName())) {
continue;
}
credentialList.add(props.getProperty(scramMechanism.mechanismName()));
}
return ConvertUtil.list2String(credentialList, Constant.COMMA);
}
}

View File

@@ -0,0 +1,44 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.metrics;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.io.Serializable;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import static com.xiaojukeji.know.streaming.km.common.utils.CommonUtils.monitorTimestamp2min;
/**
* @author zengqiao
* @date 20/6/16
*/
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public abstract class BaseMetrics implements Serializable {
protected Long clusterPhyId;
protected Long timestamp = monitorTimestamp2min(System.currentTimeMillis());
protected Map<String, Float> metrics = new ConcurrentHashMap<>();
public void putMetric(String key, Float value){
metrics.put(key, value);
}
public void putMetric(Map<String, Float> metrics){ this.metrics.putAll(metrics);}
public Float getMetric(String key) {
return metrics.get(key);
}
public BaseMetrics(Long clusterPhyId){
this.clusterPhyId = clusterPhyId;
}
public abstract String unique();
}

View File

@@ -0,0 +1,47 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.metrics;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
/**
* @author zengqiao
* @date 20/6/17
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class BrokerMetrics extends BaseMetrics {
private Integer brokerId;
private String host;
private Integer port;
public BrokerMetrics(Long clusterPhyId, Integer brokerId){
super(clusterPhyId);
this.brokerId = brokerId;
}
public BrokerMetrics(Long clusterPhyId, Integer brokerId, String host, Integer port){
super(clusterPhyId);
this.brokerId = brokerId;
this.host = host;
this.port = port;
}
public static BrokerMetrics initWithMetric(Long clusterPhyId, Integer brokerId, String metric, Float value){
BrokerMetrics brokerMetrics = new BrokerMetrics();
brokerMetrics.setClusterPhyId( clusterPhyId );
brokerMetrics.setBrokerId( brokerId );
brokerMetrics.putMetric(metric, value);
return brokerMetrics;
}
@Override
public String unique() {
return "B@" + clusterPhyId + "@" + brokerId;
}
}

View File

@@ -0,0 +1,48 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.metrics;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
/**
* @author zengqiao
* @date 20/6/18
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class ClusterMetrics extends BaseMetrics {
private String kafkaVersion;
public ClusterMetrics(Long clusterPhyId){
super(clusterPhyId);
}
public ClusterMetrics(Long clusterPhyId, String kafkaVersion){
super(clusterPhyId);
this.kafkaVersion = kafkaVersion;
}
public static ClusterMetrics initWithMetrics(Long clusterId, String metric, Float value){
ClusterMetrics clusterMetrics = new ClusterMetrics();
clusterMetrics.setClusterPhyId(clusterId);
clusterMetrics.putMetric(metric, value);
return clusterMetrics;
}
public static ClusterMetrics initWithMetrics(Long clusterId, String metric, int value){
ClusterMetrics clusterMetrics = new ClusterMetrics();
clusterMetrics.setClusterPhyId(clusterId);
clusterMetrics.putMetric(metric, (float)value);
return clusterMetrics;
}
@Override
public String unique() {
return "C@" + clusterPhyId;
}
}

View File

@@ -0,0 +1,19 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.metrics;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;
/**
* @author didi
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ClusterPagingMetrics {
private Long clusterId;
private Float sortValue;
private Map<String, Float> metricValues;
}

View File

@@ -0,0 +1,68 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.metrics;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import static com.xiaojukeji.know.streaming.km.common.constant.Constant.ONE;
import static com.xiaojukeji.know.streaming.km.common.constant.Constant.ZERO;
/**
* Consumer实体类
* @author tukun
* @date 2015/11/12
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class GroupMetrics extends BaseMetrics{
private String group;
private String topic;
private Integer partitionId;
/**
* true: group维度的指标, topicName & partitionId 为null; false: group & topicName & partitionId维度的指标
*/
private boolean bGroupMetric;
/**
* 1: group维度的指标 0: group & topicName & partitionId维度的指标
* 针对类似枚举和状态类属性使用字符串来表示比使用数值或者bool类型ES的查询效率更高
*/
private String groupMetric;
public GroupMetrics(Long clusterPhyId, String group, boolean bGroupMetric){
this.clusterPhyId = clusterPhyId;
this.group = group;
this.bGroupMetric = bGroupMetric;
this.groupMetric = bGroupMetric ? ONE : ZERO;
}
public GroupMetrics(Long clusterPhyId, String group, String topic, Integer partitionId) {
this.clusterPhyId = clusterPhyId;
this.group = group;
this.topic = topic;
this.partitionId = partitionId;
this.bGroupMetric = false;
this.groupMetric = ZERO;
}
public GroupMetrics(Long clusterPhyId, Integer partitionId, String topic, String group, boolean bGroupMetric) {
super(clusterPhyId);
this.partitionId = partitionId;
this.topic = topic;
this.group = group;
this.bGroupMetric = bGroupMetric;
this.groupMetric = bGroupMetric ? ONE : ZERO;
}
@Override
public String unique() {
return ONE.equals( bGroupMetric ) ? "G@" +clusterPhyId + "@" + group
: "G@" +clusterPhyId + "@" + group + "@" + partitionId + "@" + topic;
}
}

View File

@@ -0,0 +1,34 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.metrics;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
/**
* @author zengqiao
* @date 20/6/17
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class PartitionMetrics extends BaseMetrics {
private String topic;
private Integer partitionId;
private Integer brokerId;
public PartitionMetrics(Long clusterId, String topicName, Integer brokerId, Integer partitionId){
super(clusterId);
this.topic = topicName;
this.brokerId = brokerId;
this.partitionId = partitionId;
}
@Override
public String unique() {
return "P@" + clusterPhyId + "@" + topic + "@" + brokerId + "@" +partitionId;
}
}

View File

@@ -0,0 +1,29 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.metrics;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ReplicationMetrics extends BaseMetrics{
private String topic;
private Integer partitionId;
private Integer brokerId;
public ReplicationMetrics(Long clusterId, String topicName, Integer brokerId, Integer partitionId){
super(clusterId);
this.topic = topicName;
this.brokerId = brokerId;
this.partitionId = partitionId;
}
@Override
public String unique() {
return "R@" + clusterPhyId + "@" + topic + "@" + brokerId + "@" +partitionId;
}
}

View File

@@ -0,0 +1,62 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.metrics;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import static com.xiaojukeji.know.streaming.km.common.constant.Constant.ONE;
import static com.xiaojukeji.know.streaming.km.common.constant.Constant.ZERO;
/**
* @author zengqiao
* @date 20/6/17
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class TopicMetrics extends BaseMetrics {
private String topic;
private Integer brokerId;
/**
* topic的指标是否是有broker上的指标聚合而来true的时候brokerId为null
*/
private boolean bBrokerAgg = true;
/**
* brokerAgg: 1是由broker聚合而成的topic整体维度指标0是broker维度的指标
* 针对类似枚举和状态类属性使用字符串来表示ES的查询效率更高
*/
private String brokerAgg = ONE;
public TopicMetrics(String topic, Long clusterPhyId){
this.topic = topic;
this.clusterPhyId = clusterPhyId;
this.bBrokerAgg = true;
this.brokerAgg = bBrokerAgg ? ONE : ZERO;
}
public TopicMetrics(String topic, Long clusterPhyId, boolean bBrokerAgg){
this.topic = topic;
this.clusterPhyId = clusterPhyId;
this.bBrokerAgg = bBrokerAgg;
this.brokerAgg = bBrokerAgg ? ONE : ZERO;
}
public TopicMetrics(String topic, Long clusterPhyId, Integer brokerId, boolean bBrokerAgg){
this.topic = topic;
this.clusterPhyId = clusterPhyId;
this.brokerId = brokerId;
this.bBrokerAgg = bBrokerAgg;
this.brokerAgg = bBrokerAgg ? ONE : ZERO;
}
@Override
public String unique() {
return ONE.equals( bBrokerAgg ) ? "T@" + clusterPhyId + "@" + topic
: "T@" + clusterPhyId + "@" + brokerId + "@" + topic;
}
}

View File

@@ -0,0 +1,19 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.metrics;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;
/**
* @author didi
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TopicPagingMetrics {
private String topic;
private Float sortValue;
private Map<String, Float> metricValues;
}

View File

@@ -0,0 +1,24 @@
package com.xiaojukeji.know.streaming.km.common.bean.entity.pagination;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(description = "分页信息")
public class Pagination {
@ApiModelProperty(value = "总记录数", example = "100")
private long total;
@ApiModelProperty(value = "当前页码", example = "0")
private long pageNo;
@ApiModelProperty(value = "单页大小", example = "10")
private long pageSize;
public Pagination(long total, long pageNo, long pageSize) {
this.total = total;
this.pageNo = pageNo;
this.pageSize = pageSize;
}
}

Some files were not shown because too many files have changed in this diff Show More