From 736d5a00b718ada6bfb739cdf573daa6e0c16533 Mon Sep 17 00:00:00 2001 From: Xiang Hong Wei Date: Fri, 7 May 2021 19:06:47 +0800 Subject: [PATCH 01/21] optimize the migration task name --- .../kafka/manager/web/converters/ReassignModelConverter.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/ReassignModelConverter.java b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/ReassignModelConverter.java index 747fbb8b..cac1e553 100644 --- a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/ReassignModelConverter.java +++ b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/ReassignModelConverter.java @@ -89,18 +89,20 @@ public class ReassignModelConverter { } ReassignTaskVO vo = new ReassignTaskVO(); - vo.setTaskName(String.format("%s 数据迁移任务", DateUtils.getFormattedDate(taskId))); vo.setTaskId(taskId); vo.setTotalTopicNum(doList.size()); vo.setBeginTime(0L); vo.setEndTime(0L); Integer completedTopicNum = 0; + StringBuilder clusterAndTopicName = new StringBuilder(); Set statusSet = new HashSet<>(); for (ReassignTaskDO elem: doList) { vo.setGmtCreate(elem.getGmtCreate().getTime()); vo.setOperator(elem.getOperator()); vo.setDescription(elem.getDescription()); + // There is only one `ReassignTaskDO` in the `doList` + clusterAndTopicName.append("-").append(elem.getClusterId()).append("-").append(elem.getTopicName()); if (TaskStatusReassignEnum.isFinished(elem.getStatus())) { completedTopicNum += 1; statusSet.add(elem.getStatus()); @@ -113,6 +115,7 @@ public class ReassignModelConverter { // 任务计划开始时间 vo.setBeginTime(elem.getBeginTime().getTime()); } + vo.setTaskName(String.format("%s 数据迁移任务%s", DateUtils.getFormattedDate(taskId), clusterAndTopicName.toString())); // 任务整体状态 if (statusSet.contains(TaskStatusReassignEnum.RUNNING.getCode())) { From c46c35b2486f1acfb28164400a4918cda1a44fe2 Mon Sep 17 00:00:00 2001 From: zengqiao Date: Wed, 23 Jun 2021 10:11:38 +0800 Subject: [PATCH 02/21] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dpoll=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E6=97=B6,=20=E8=B6=85=E6=97=B6=E6=97=B6=E9=97=B4=E4=B8=8D?= =?UTF-8?q?=E7=94=9F=E6=95=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/TopicServiceImpl.java | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicServiceImpl.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicServiceImpl.java index 63191888..5c0176b1 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicServiceImpl.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicServiceImpl.java @@ -648,10 +648,11 @@ public class TopicServiceImpl implements TopicService { List dataList = new ArrayList<>(); int currentSize = dataList.size(); while (dataList.size() < maxMsgNum) { + if (remainingWaitMs <= 0) { + break; + } + try { - if (remainingWaitMs <= 0) { - break; - } ConsumerRecords records = kafkaConsumer.poll(TopicSampleConstant.POLL_TIME_OUT_UNIT_MS); for (ConsumerRecord record : records) { String value = (String) record.value(); @@ -661,20 +662,22 @@ public class TopicServiceImpl implements TopicService { : value ); } - // 当前批次一条数据都没拉取到,则结束拉取 - if (dataList.size() - currentSize == 0) { - break; - } - currentSize = dataList.size(); - // 检查是否超时 - long elapsed = System.currentTimeMillis() - begin; - if (elapsed >= maxWaitMs) { - break; - } - remainingWaitMs = maxWaitMs - elapsed; } catch (Exception e) { LOGGER.error("fetch topic data failed, TopicPartitions:{}.", kafkaConsumer.assignment(), e); } + + // 当前批次一条数据都没拉取到,则结束拉取 + if (dataList.size() - currentSize == 0) { + break; + } + currentSize = dataList.size(); + + // 检查是否超时 + long elapsed = System.currentTimeMillis() - begin; + if (elapsed >= maxWaitMs) { + break; + } + remainingWaitMs = maxWaitMs - elapsed; } return dataList.subList(0, Math.min(dataList.size(), maxMsgNum)); } @@ -698,14 +701,15 @@ public class TopicServiceImpl implements TopicService { : value ); } - if (System.currentTimeMillis() - timestamp > timeout - || dataList.size() >= maxMsgNum) { - break; - } Thread.sleep(10); } catch (Exception e) { LOGGER.error("fetch topic data failed, TopicPartitions:{}.", kafkaConsumer.assignment(), e); } + + if (System.currentTimeMillis() - timestamp > timeout || dataList.size() >= maxMsgNum) { + // 超时或者是数据已采集足够时, 直接返回 + break; + } } return dataList.subList(0, Math.min(dataList.size(), maxMsgNum)); } From eb3b8c4b31fd538a60066db49d308289f1bc9df3 Mon Sep 17 00:00:00 2001 From: zengqiao Date: Wed, 23 Jun 2021 21:31:43 +0800 Subject: [PATCH 03/21] bump jackson-databind version to 2.9.10.8 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 51fa20e0..a7c70e54 100644 --- a/pom.xml +++ b/pom.xml @@ -147,7 +147,7 @@ com.fasterxml.jackson.core jackson-databind - 2.9.10.5 + 2.9.10.8 From ca81f9663572ad797e4fc2846958812763d5c96e Mon Sep 17 00:00:00 2001 From: fengxusong Date: Thu, 24 Jun 2021 12:13:29 +0800 Subject: [PATCH 04/21] feat: update dockerfile and charts --- container/dockerfiles/Dockerfile | 41 +++++++---------------- container/helm/Chart.lock | 6 ++++ container/helm/Chart.yaml | 9 +++-- container/helm/charts/mysql-8.6.3.tgz | Bin 0 -> 33841 bytes container/helm/templates/configmap.yaml | 18 +++++++--- container/helm/templates/deployment.yaml | 8 +++++ container/helm/values.yaml | 18 ++++++++-- 7 files changed, 64 insertions(+), 36 deletions(-) create mode 100644 container/helm/Chart.lock create mode 100644 container/helm/charts/mysql-8.6.3.tgz diff --git a/container/dockerfiles/Dockerfile b/container/dockerfiles/Dockerfile index 1ffe27e4..fa1850e3 100644 --- a/container/dockerfiles/Dockerfile +++ b/container/dockerfiles/Dockerfile @@ -1,43 +1,28 @@ FROM openjdk:16-jdk-alpine3.13 -LABEL author="yangvipguang" - -ENV VERSION 2.3.1 - -RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories -RUN apk add --no-cache --virtual .build-deps \ - font-adobe-100dpi \ - ttf-dejavu \ - fontconfig \ - curl \ - apr \ - apr-util \ - apr-dev \ - tomcat-native \ - && apk del .build-deps - -RUN apk add --no-cache tini - - +LABEL author="fengxsong" +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && apk add --no-cache tini +ENV VERSION 2.4.2 +WORKDIR /opt/ ENV AGENT_HOME /opt/agent/ - -WORKDIR /tmp - -COPY $JAR_PATH/kafka-manager.jar app.jar -# COPY application.yml application.yml ##默认使用helm 挂载,防止敏感配置泄露 - COPY docker-depends/config.yaml $AGENT_HOME COPY docker-depends/jmx_prometheus_javaagent-0.15.0.jar $AGENT_HOME ENV JAVA_AGENT="-javaagent:$AGENT_HOME/jmx_prometheus_javaagent-0.15.0.jar=9999:$AGENT_HOME/config.yaml" ENV JAVA_HEAP_OPTS="-Xms1024M -Xmx1024M -Xmn100M " ENV JAVA_OPTS="-verbose:gc \ - -XX:MaxMetaspaceSize=256M -XX:+DisableExplicitGC -XX:+UseStringDeduplication \ - -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:-UseContainerSupport" + -XX:MaxMetaspaceSize=256M -XX:+DisableExplicitGC -XX:+UseStringDeduplication \ + -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:-UseContainerSupport" + +RUN wget https://github.com/didi/Logi-KafkaManager/releases/download/v${VERSION}/kafka-manager-${VERSION}.tar.gz && \ + tar xvf kafka-manager-${VERSION}.tar.gz && \ + mv kafka-manager-${VERSION}/kafka-manager.jar /opt/app.jar && \ + rm -rf kafka-manager-${VERSION}* + EXPOSE 8080 9999 ENTRYPOINT ["tini", "--"] -CMD ["sh","-c","java -jar $JAVA_AGENT $JAVA_HEAP_OPTS $JAVA_OPTS app.jar --spring.config.location=application.yml"] +CMD [ "sh", "-c", "java -jar $JAVA_AGENT $JAVA_HEAP_OPTS $JAVA_OPTS app.jar --spring.config.location=application.yml"] \ No newline at end of file diff --git a/container/helm/Chart.lock b/container/helm/Chart.lock new file mode 100644 index 00000000..04958b2d --- /dev/null +++ b/container/helm/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: mysql + repository: https://charts.bitnami.com/bitnami + version: 8.6.3 +digest: sha256:d250c463c1d78ba30a24a338a06a551503c7a736621d974fe4999d2db7f6143e +generated: "2021-06-24T11:34:54.625217+08:00" diff --git a/container/helm/Chart.yaml b/container/helm/Chart.yaml index 7161f735..088abfb0 100644 --- a/container/helm/Chart.yaml +++ b/container/helm/Chart.yaml @@ -1,6 +1,6 @@ apiVersion: v2 name: didi-km -description: A Helm chart for Kubernetes +description: Logi-KafkaManager # A chart can be either an 'application' or a 'library' chart. # @@ -21,4 +21,9 @@ version: 0.1.0 # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "1.16.0" +appVersion: "2.4.2" +dependencies: + - condition: mysql.enabled + name: mysql + repository: https://charts.bitnami.com/bitnami + version: 8.x.x diff --git a/container/helm/charts/mysql-8.6.3.tgz b/container/helm/charts/mysql-8.6.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..c5fde140590a79862c1f4e2ead46ad6278028fd3 GIT binary patch literal 33841 zcmV)tK$pKCiwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PMa0dfPaXC^~=ZDRAVT({|RRWIJ(sbWZj=ZYSNFZ#s$BcK6I~ zrmqc=kc2TsumRAHCeHotYuwknPjWvL022HqQ9tY?-QweX8zu!N8`V{`{_xt644-Ss|e>!;DKYseWe{^ts^r!y8;nCCnpHTlH zfGIzzkeL6ezjj|`KrgYxLo7%KC-fJ>1!eI7-5z#u zl4L)>^ZWkcvrb475{D!XC=r8>hhjV>0~E07l*Ju{I7yhG5?Y-|nTSEJ7bt=g{*cNT zPpKcUY0v!KK}g~;0OKL^&db`mwOt?hAN&uUkcfcOM8Yc|Vk8*~IKh%2jQ)d;C(#Vy zTTCN7j0k!&yZFzaP!Od;65g3G1*ZjROywjUx}X>+dy*5ZZNbF` z3qhpl35kOnp-cDZbgcjK;I(&n*#B^N^wdw{ap#82?ideY{B+wM3hfklNWZXvduT$( z6N?v(sGN1Cn8p&*m~d!=OfikrB-oe#$APYc%p84h#$5l>{R)=yKu_eHp|LX)vfzer z&w^}gz;Ed4HYb*2|ETl1>3#bYAD90}EVy}yJ{Iu*{?XAK~vp>HmcsV>0TDNlZAFBpjgbVgK;J>mPfE2bcZ+;OW8O*;D`d zcgNp-_w+AE$N$~kvYIxJUjMf^N{M(V0dW5MKR!Nsc3fWn$A??_?@^we9rR1lV{#f{Ayl&$ z&hL&w&xl_}EQL(N^#&o~hzmfz~;GUNxn-c33rJSLI|pR!)a0?|ta z;odl_q!lD=>%sHMRHmb}y z+7;%HX(}Wd5;Vne3e~m35h5A`6{|f|Bsd^@C6q)xP7;e7(aTnZm$1;w1oxgoLgVEn zoZezdJUhib-Ttc&c$!2o`8zv+bVjD|W*(h7BV{Y0_rIEn*Rv#fO4NkTSc>jg8igpL zH$;6Agdp-ka*Sv^VtfjEBw{g&*jP^jdM%Mmc`VTPCl~*r)?<%x^!DV~aITgW#glRwr z+~7Q?iHAL>6T3398O}fbEC?TDFBmU=t&+j34^*f=klseo9hDPH8=QoSwsB;3jkoVE zUk%XTCL~5wek-)RFd-=6XN|l6a2RIWfMyf)NqTZ$SG_f?6E<%dGjc7y!qOp(!hf20cg&GJP zBNE?I&f=*Oa&IxGO2)OFq$2C$2h~8KAH@&Nk}~6|J7ID{xRTLh1nd_joZZrpgy>F< zX1Przn;BuOtM>VBokXGgDZ*kU3$^42sCTPGz@8D1jFD4)vc*y$mfB+KQ`TBWO-*gO z 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 literal 0 HcmV?d00001 diff --git a/container/helm/templates/configmap.yaml b/container/helm/templates/configmap.yaml index ffc75ec5..25940cc6 100644 --- a/container/helm/templates/configmap.yaml +++ b/container/helm/templates/configmap.yaml @@ -1,7 +1,17 @@ +{{- define "datasource.mysql" -}} +{{- if .Values.mysql.enabled }} + {{- printf "%s-mysql" (include "didi-km.fullname" .) -}} +{{- else -}} + {{- printf "%s" .Values.externalDatabase.host -}} +{{- end -}} +{{- end -}} + apiVersion: v1 kind: ConfigMap metadata: - name: km-cm + name: {{ include "didi-km.fullname" . }}-configs + labels: + {{- include "didi-km.labels" . | nindent 4 }} data: application.yml: | server: @@ -17,9 +27,9 @@ data: name: kafkamanager datasource: kafka-manager: - jdbc-url: jdbc:mysql://xxxxx:3306/kafka-manager?characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false - username: admin - password: admin + jdbc-url: jdbc:mysql://{{ include "datasource.mysql" . }}:3306/{{ .Values.mysql.auth.database }}?characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false + username: {{ .Values.mysql.auth.username }} + password: {{ .Values.mysql.auth.password }} driver-class-name: com.mysql.jdbc.Driver main: allow-bean-definition-overriding: true diff --git a/container/helm/templates/deployment.yaml b/container/helm/templates/deployment.yaml index 4754b53e..80ab2c29 100644 --- a/container/helm/templates/deployment.yaml +++ b/container/helm/templates/deployment.yaml @@ -42,6 +42,10 @@ spec: protocol: TCP resources: {{- toYaml .Values.resources | nindent 12 }} + volumeMounts: + - name: configs + mountPath: /tmp/application.yml + subPath: application.yml {{- with .Values.nodeSelector }} nodeSelector: {{- toYaml . | nindent 8 }} @@ -54,3 +58,7 @@ spec: tolerations: {{- toYaml . | nindent 8 }} {{- end }} + volumes: + - name: configs + configMap: + name: {{ include "didi-km.fullname" . }}-configs diff --git a/container/helm/values.yaml b/container/helm/values.yaml index a5f49e40..8eadbb1a 100644 --- a/container/helm/values.yaml +++ b/container/helm/values.yaml @@ -5,13 +5,14 @@ replicaCount: 1 image: - repository: docker.io/yangvipguang/km + repository: docker.io/fengxsong/logi-kafka-manager pullPolicy: IfNotPresent # Overrides the image tag whose default is the chart appVersion. - tag: "v18" + tag: "2.4.2" imagePullSecrets: [] nameOverride: "" +# fullnameOverride must set same as release name fullnameOverride: "km" serviceAccount: @@ -77,3 +78,16 @@ nodeSelector: {} tolerations: [] affinity: {} + +# more configurations are set with configmap in file template/configmap.yaml +externalDatabase: + host: "" +mysql: + # if enabled is set to false, then you should manually specified externalDatabase.host + enabled: true + architecture: standalone + auth: + rootPassword: "s3cretR00t" + database: "logi_kafka_manager" + username: "logi_kafka_manager" + password: "n0tp@55w0rd" From 1912a4209149c1354a35dd28c358f445d45c8f83 Mon Sep 17 00:00:00 2001 From: fengxusong Date: Thu, 24 Jun 2021 14:00:29 +0800 Subject: [PATCH 05/21] fix: default config --- container/helm/templates/configmap.yaml | 3 +++ container/helm/values.yaml | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/container/helm/templates/configmap.yaml b/container/helm/templates/configmap.yaml index 25940cc6..b487f2bd 100644 --- a/container/helm/templates/configmap.yaml +++ b/container/helm/templates/configmap.yaml @@ -64,7 +64,10 @@ data: sync-topic-enabled: false # 未落盘的Topic定期同步到DB中 account: + # ldap settings ldap: + enabled: false + authUserRegistration: false kcm: enabled: false diff --git a/container/helm/values.yaml b/container/helm/values.yaml index 8eadbb1a..cbb6f3d4 100644 --- a/container/helm/values.yaml +++ b/container/helm/values.yaml @@ -8,7 +8,7 @@ image: repository: docker.io/fengxsong/logi-kafka-manager pullPolicy: IfNotPresent # Overrides the image tag whose default is the chart appVersion. - tag: "2.4.2" + tag: "v2.4.2" imagePullSecrets: [] nameOverride: "" @@ -60,10 +60,10 @@ resources: # resources, such as Minikube. If you do want to specify resources, uncomment the following # lines, adjust them as necessary, and remove the curly braces after 'resources:'. limits: - cpu: 50m + cpu: 500m memory: 2048Mi requests: - cpu: 10m + cpu: 100m memory: 200Mi autoscaling: From 0f746917a741c0e259e2446e02d9c3895c197c6f Mon Sep 17 00:00:00 2001 From: zengqiao Date: Fri, 2 Jul 2021 16:41:57 +0800 Subject: [PATCH 06/21] =?UTF-8?q?Topic=E5=9F=BA=E6=9C=AC=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E4=B8=AD=E5=A2=9E=E5=8A=A0retention.bytes=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constant/TopicCreationConstant.java | 2 + .../common/entity/ao/topic/TopicBasicDTO.java | 13 ++- .../entity/vo/normal/topic/TopicBasicVO.java | 108 ++++++++++-------- .../cache/PhysicalClusterMetadataManager.java | 43 +++++-- .../service/impl/TopicServiceImpl.java | 1 + ...ionTime.java => FlushTopicProperties.java} | 19 ++- .../normal/NormalTopicController.java | 5 +- .../web/converters/TopicModelConverter.java | 1 + 8 files changed, 119 insertions(+), 73 deletions(-) rename kafka-manager-task/src/main/java/com/xiaojukeji/kafka/manager/task/schedule/metadata/{FlushTopicRetentionTime.java => FlushTopicProperties.java} (68%) diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/TopicCreationConstant.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/TopicCreationConstant.java index 3a6dd478..4d569907 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/TopicCreationConstant.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/TopicCreationConstant.java @@ -25,6 +25,8 @@ public class TopicCreationConstant { public static final String TOPIC_RETENTION_TIME_KEY_NAME = "retention.ms"; + public static final String TOPIC_RETENTION_BYTES_KEY_NAME = "retention.bytes"; + public static final Long DEFAULT_QUOTA = 3 * 1024 * 1024L; public static Properties createNewProperties(Long retentionTime) { diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/topic/TopicBasicDTO.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/topic/TopicBasicDTO.java index e3ea08ed..9150569b 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/topic/TopicBasicDTO.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/topic/TopicBasicDTO.java @@ -37,6 +37,8 @@ public class TopicBasicDTO { private Long retentionTime; + private Long retentionBytes; + public Long getClusterId() { return clusterId; } @@ -157,6 +159,14 @@ public class TopicBasicDTO { this.retentionTime = retentionTime; } + public Long getRetentionBytes() { + return retentionBytes; + } + + public void setRetentionBytes(Long retentionBytes) { + this.retentionBytes = retentionBytes; + } + @Override public String toString() { return "TopicBasicDTO{" + @@ -166,7 +176,7 @@ public class TopicBasicDTO { ", principals='" + principals + '\'' + ", topicName='" + topicName + '\'' + ", description='" + description + '\'' + - ", regionNameList='" + regionNameList + '\'' + + ", regionNameList=" + regionNameList + ", score=" + score + ", topicCodeC='" + topicCodeC + '\'' + ", partitionNum=" + partitionNum + @@ -175,6 +185,7 @@ public class TopicBasicDTO { ", modifyTime=" + modifyTime + ", createTime=" + createTime + ", retentionTime=" + retentionTime + + ", retentionBytes=" + retentionBytes + '}'; } } diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/topic/TopicBasicVO.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/topic/TopicBasicVO.java index 946a9997..b200a150 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/topic/TopicBasicVO.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/topic/TopicBasicVO.java @@ -33,6 +33,9 @@ public class TopicBasicVO { @ApiModelProperty(value = "存储时间(ms)") private Long retentionTime; + @ApiModelProperty(value = "单分区数据保存大小(Byte)") + private Long retentionBytes; + @ApiModelProperty(value = "创建时间") private Long createTime; @@ -62,12 +65,20 @@ public class TopicBasicVO { this.clusterId = clusterId; } - public String getTopicCodeC() { - return topicCodeC; + public String getAppId() { + return appId; } - public void setTopicCodeC(String topicCodeC) { - this.topicCodeC = topicCodeC; + public void setAppId(String appId) { + this.appId = appId; + } + + public String getAppName() { + return appName; + } + + public void setAppName(String appName) { + this.appName = appName; } public Integer getPartitionNum() { @@ -86,22 +97,6 @@ public class TopicBasicVO { this.replicaNum = replicaNum; } - public Long getModifyTime() { - return modifyTime; - } - - public void setModifyTime(Long modifyTime) { - this.modifyTime = modifyTime; - } - - public Long getCreateTime() { - return createTime; - } - - public void setCreateTime(Long createTime) { - this.createTime = createTime; - } - public String getPrincipals() { return principals; } @@ -110,30 +105,6 @@ public class TopicBasicVO { this.principals = principals; } - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public void setAppId(String appId) { - this.appId = appId; - } - - public void setBootstrapServers(String bootstrapServers) { - this.bootstrapServers = bootstrapServers; - } - - public String getAppId() { - return appId; - } - - public String getBootstrapServers() { - return bootstrapServers; - } - public Long getRetentionTime() { return retentionTime; } @@ -142,12 +113,28 @@ public class TopicBasicVO { this.retentionTime = retentionTime; } - public String getAppName() { - return appName; + public Long getRetentionBytes() { + return retentionBytes; } - public void setAppName(String appName) { - this.appName = appName; + public void setRetentionBytes(Long retentionBytes) { + this.retentionBytes = retentionBytes; + } + + public Long getCreateTime() { + return createTime; + } + + public void setCreateTime(Long createTime) { + this.createTime = createTime; + } + + public Long getModifyTime() { + return modifyTime; + } + + public void setModifyTime(Long modifyTime) { + this.modifyTime = modifyTime; } public Integer getScore() { @@ -158,6 +145,30 @@ public class TopicBasicVO { this.score = score; } + public String getTopicCodeC() { + return topicCodeC; + } + + public void setTopicCodeC(String topicCodeC) { + this.topicCodeC = topicCodeC; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getBootstrapServers() { + return bootstrapServers; + } + + public void setBootstrapServers(String bootstrapServers) { + this.bootstrapServers = bootstrapServers; + } + public List getRegionNameList() { return regionNameList; } @@ -176,6 +187,7 @@ public class TopicBasicVO { ", replicaNum=" + replicaNum + ", principals='" + principals + '\'' + ", retentionTime=" + retentionTime + + ", retentionBytes=" + retentionBytes + ", createTime=" + createTime + ", modifyTime=" + modifyTime + ", score=" + score + diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/PhysicalClusterMetadataManager.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/PhysicalClusterMetadataManager.java index 631b254f..a7142fa9 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/PhysicalClusterMetadataManager.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/PhysicalClusterMetadataManager.java @@ -3,10 +3,12 @@ package com.xiaojukeji.kafka.manager.service.cache; import com.xiaojukeji.kafka.manager.common.bizenum.KafkaBrokerRoleEnum; import com.xiaojukeji.kafka.manager.common.constant.Constant; import com.xiaojukeji.kafka.manager.common.constant.KafkaConstant; +import com.xiaojukeji.kafka.manager.common.constant.TopicCreationConstant; import com.xiaojukeji.kafka.manager.common.entity.KafkaVersion; import com.xiaojukeji.kafka.manager.common.entity.pojo.ClusterDO; import com.xiaojukeji.kafka.manager.common.utils.JsonUtils; import com.xiaojukeji.kafka.manager.common.utils.ListUtils; +import com.xiaojukeji.kafka.manager.common.utils.NumberUtils; import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; import com.xiaojukeji.kafka.manager.common.utils.jmx.JmxConfig; import com.xiaojukeji.kafka.manager.common.utils.jmx.JmxConnectorWrap; @@ -56,7 +58,7 @@ public class PhysicalClusterMetadataManager { private final static Map> TOPIC_METADATA_MAP = new ConcurrentHashMap<>(); - private final static Map> TOPIC_RETENTION_TIME_MAP = new ConcurrentHashMap<>(); + private final static Map> TOPIC_PROPERTIES_MAP = new ConcurrentHashMap<>(); private final static Map> BROKER_METADATA_MAP = new ConcurrentHashMap<>(); @@ -95,7 +97,7 @@ public class PhysicalClusterMetadataManager { // 初始化topic-map TOPIC_METADATA_MAP.put(clusterDO.getId(), new ConcurrentHashMap<>()); - TOPIC_RETENTION_TIME_MAP.put(clusterDO.getId(), new ConcurrentHashMap<>()); + TOPIC_PROPERTIES_MAP.put(clusterDO.getId(), new ConcurrentHashMap<>()); // 初始化cluster-map CLUSTER_MAP.put(clusterDO.getId(), clusterDO); @@ -158,7 +160,7 @@ public class PhysicalClusterMetadataManager { KAFKA_VERSION_MAP.remove(clusterId); TOPIC_METADATA_MAP.remove(clusterId); - TOPIC_RETENTION_TIME_MAP.remove(clusterId); + TOPIC_PROPERTIES_MAP.remove(clusterId); CLUSTER_MAP.remove(clusterId); } @@ -262,24 +264,45 @@ public class PhysicalClusterMetadataManager { //---------------------------配置相关元信息-------------- - public static void putTopicRetentionTime(Long clusterId, String topicName, Long retentionTime) { - Map timeMap = TOPIC_RETENTION_TIME_MAP.get(clusterId); - if (timeMap == null) { + public static void putTopicProperties(Long clusterId, String topicName, Properties properties) { + if (ValidateUtils.isNull(clusterId) || ValidateUtils.isBlank(topicName) || ValidateUtils.isNull(properties)) { return; } - timeMap.put(topicName, retentionTime); + + Map propertiesMap = TOPIC_PROPERTIES_MAP.get(clusterId); + if (ValidateUtils.isNull(propertiesMap)) { + return; + } + propertiesMap.put(topicName, properties); } public static Long getTopicRetentionTime(Long clusterId, String topicName) { - Map timeMap = TOPIC_RETENTION_TIME_MAP.get(clusterId); - if (timeMap == null) { + Map propertiesMap = TOPIC_PROPERTIES_MAP.get(clusterId); + if (ValidateUtils.isNull(propertiesMap)) { return null; } - return timeMap.get(topicName); + + Properties properties = propertiesMap.get(topicName); + if (ValidateUtils.isNull(properties)) { + return null; + } + + return NumberUtils.string2Long(properties.getProperty(TopicCreationConstant.TOPIC_RETENTION_TIME_KEY_NAME)); } + public static Long getTopicRetentionBytes(Long clusterId, String topicName) { + Map propertiesMap = TOPIC_PROPERTIES_MAP.get(clusterId); + if (ValidateUtils.isNull(propertiesMap)) { + return null; + } + Properties properties = propertiesMap.get(topicName); + if (ValidateUtils.isNull(properties)) { + return null; + } + return NumberUtils.string2Long(properties.getProperty(TopicCreationConstant.TOPIC_RETENTION_BYTES_KEY_NAME)); + } //---------------------------Broker元信息相关-------------- diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicServiceImpl.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicServiceImpl.java index 5c0176b1..154faf77 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicServiceImpl.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicServiceImpl.java @@ -223,6 +223,7 @@ public class TopicServiceImpl implements TopicService { basicDTO.setCreateTime(topicMetadata.getCreateTime()); basicDTO.setModifyTime(topicMetadata.getModifyTime()); basicDTO.setRetentionTime(PhysicalClusterMetadataManager.getTopicRetentionTime(clusterId, topicName)); + basicDTO.setRetentionBytes(PhysicalClusterMetadataManager.getTopicRetentionBytes(clusterId, topicName)); TopicDO topicDO = topicManagerService.getByTopicName(clusterId, topicName); if (!ValidateUtils.isNull(topicDO)) { diff --git a/kafka-manager-task/src/main/java/com/xiaojukeji/kafka/manager/task/schedule/metadata/FlushTopicRetentionTime.java b/kafka-manager-task/src/main/java/com/xiaojukeji/kafka/manager/task/schedule/metadata/FlushTopicProperties.java similarity index 68% rename from kafka-manager-task/src/main/java/com/xiaojukeji/kafka/manager/task/schedule/metadata/FlushTopicRetentionTime.java rename to kafka-manager-task/src/main/java/com/xiaojukeji/kafka/manager/task/schedule/metadata/FlushTopicProperties.java index 225f8393..41a8bde4 100644 --- a/kafka-manager-task/src/main/java/com/xiaojukeji/kafka/manager/task/schedule/metadata/FlushTopicRetentionTime.java +++ b/kafka-manager-task/src/main/java/com/xiaojukeji/kafka/manager/task/schedule/metadata/FlushTopicProperties.java @@ -14,13 +14,14 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.List; +import java.util.Properties; /** * @author zengqiao * @date 20/7/23 */ @Component -public class FlushTopicRetentionTime { +public class FlushTopicProperties { private final static Logger LOGGER = LoggerFactory.getLogger(LogConstant.SCHEDULED_TASK_LOGGER); @Autowired @@ -33,7 +34,7 @@ public class FlushTopicRetentionTime { try { flush(clusterDO); } catch (Exception e) { - LOGGER.error("flush topic retention time failed, clusterId:{}.", clusterDO.getId(), e); + LOGGER.error("flush topic properties failed, clusterId:{}.", clusterDO.getId(), e); } } } @@ -41,22 +42,20 @@ public class FlushTopicRetentionTime { private void flush(ClusterDO clusterDO) { ZkConfigImpl zkConfig = PhysicalClusterMetadataManager.getZKConfig(clusterDO.getId()); if (ValidateUtils.isNull(zkConfig)) { - LOGGER.error("flush topic retention time, get zk config failed, clusterId:{}.", clusterDO.getId()); + LOGGER.error("flush topic properties, get zk config failed, clusterId:{}.", clusterDO.getId()); return; } for (String topicName: PhysicalClusterMetadataManager.getTopicNameList(clusterDO.getId())) { try { - Long retentionTime = KafkaZookeeperUtils.getTopicRetentionTime(zkConfig, topicName); - if (retentionTime == null) { - LOGGER.warn("get topic retentionTime failed, clusterId:{} topicName:{}.", - clusterDO.getId(), topicName); + Properties properties = KafkaZookeeperUtils.getTopicProperties(zkConfig, topicName); + if (ValidateUtils.isNull(properties)) { + LOGGER.warn("get topic properties failed, clusterId:{} topicName:{}.", clusterDO.getId(), topicName); continue; } - PhysicalClusterMetadataManager.putTopicRetentionTime(clusterDO.getId(), topicName, retentionTime); + PhysicalClusterMetadataManager.putTopicProperties(clusterDO.getId(), topicName, properties); } catch (Exception e) { - LOGGER.error("get topic retentionTime failed, clusterId:{} topicName:{}.", - clusterDO.getId(), topicName, e); + LOGGER.error("get topic properties failed, clusterId:{} topicName:{}.", clusterDO.getId(), topicName, e); } } } diff --git a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/normal/NormalTopicController.java b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/normal/NormalTopicController.java index aaac290f..bb42cadd 100644 --- a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/normal/NormalTopicController.java +++ b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/normal/NormalTopicController.java @@ -61,10 +61,7 @@ public class NormalTopicController { @ApiOperation(value = "Topic基本信息", notes = "") @RequestMapping(value = "{clusterId}/topics/{topicName}/basic-info", method = RequestMethod.GET) @ResponseBody - public Result getTopicBasic( - @PathVariable Long clusterId, - @PathVariable String topicName, - @RequestParam(value = "isPhysicalClusterId", required = false) Boolean isPhysicalClusterId) { + public Result getTopicBasic(@PathVariable Long clusterId, @PathVariable String topicName, @RequestParam(value = "isPhysicalClusterId", required = false) Boolean isPhysicalClusterId) { Long physicalClusterId = logicalClusterMetadataManager.getPhysicalClusterId(clusterId, isPhysicalClusterId); if (ValidateUtils.isNull(physicalClusterId)) { return Result.buildFrom(ResultStatus.CLUSTER_NOT_EXIST); diff --git a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/TopicModelConverter.java b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/TopicModelConverter.java index 4e28ca8b..c7364cb5 100644 --- a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/TopicModelConverter.java +++ b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/TopicModelConverter.java @@ -31,6 +31,7 @@ public class TopicModelConverter { vo.setReplicaNum(dto.getReplicaNum()); vo.setPrincipals(dto.getPrincipals()); vo.setRetentionTime(dto.getRetentionTime()); + vo.setRetentionBytes(dto.getRetentionBytes()); vo.setCreateTime(dto.getCreateTime()); vo.setModifyTime(dto.getModifyTime()); vo.setScore(dto.getScore()); From fcdeef01469b53c42798448a690dd7ad793caf02 Mon Sep 17 00:00:00 2001 From: "hongtenzone@foxmail.com" Date: Sun, 4 Jul 2021 17:55:54 +0800 Subject: [PATCH 07/21] remove duplicate operation --- .../src/main/java/com/xiaojukeji/kafka/manager/bpm/Converts.java | 1 - 1 file changed, 1 deletion(-) diff --git a/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/Converts.java b/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/Converts.java index 956491b2..39d80369 100644 --- a/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/Converts.java +++ b/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/Converts.java @@ -19,7 +19,6 @@ public class Converts { orderDO.setApprover(""); orderDO.setOpinion(""); orderDO.setExtensions(orderDTO.getExtensions()); - orderDO.setType(orderDTO.getType()); return orderDO; } } \ No newline at end of file From 31fc6e4e566ce2486a2b37ed2df4a2f516a83563 Mon Sep 17 00:00:00 2001 From: "hongtenzone@foxmail.com" Date: Sun, 4 Jul 2021 17:59:36 +0800 Subject: [PATCH 08/21] remove duplicate operation --- .../kafka/manager/web/converters/ReassignModelConverter.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/ReassignModelConverter.java b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/ReassignModelConverter.java index cac1e553..747fbb8b 100644 --- a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/ReassignModelConverter.java +++ b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/ReassignModelConverter.java @@ -89,20 +89,18 @@ public class ReassignModelConverter { } ReassignTaskVO vo = new ReassignTaskVO(); + vo.setTaskName(String.format("%s 数据迁移任务", DateUtils.getFormattedDate(taskId))); vo.setTaskId(taskId); vo.setTotalTopicNum(doList.size()); vo.setBeginTime(0L); vo.setEndTime(0L); Integer completedTopicNum = 0; - StringBuilder clusterAndTopicName = new StringBuilder(); Set statusSet = new HashSet<>(); for (ReassignTaskDO elem: doList) { vo.setGmtCreate(elem.getGmtCreate().getTime()); vo.setOperator(elem.getOperator()); vo.setDescription(elem.getDescription()); - // There is only one `ReassignTaskDO` in the `doList` - clusterAndTopicName.append("-").append(elem.getClusterId()).append("-").append(elem.getTopicName()); if (TaskStatusReassignEnum.isFinished(elem.getStatus())) { completedTopicNum += 1; statusSet.add(elem.getStatus()); @@ -115,7 +113,6 @@ public class ReassignModelConverter { // 任务计划开始时间 vo.setBeginTime(elem.getBeginTime().getTime()); } - vo.setTaskName(String.format("%s 数据迁移任务%s", DateUtils.getFormattedDate(taskId), clusterAndTopicName.toString())); // 任务整体状态 if (statusSet.contains(TaskStatusReassignEnum.RUNNING.getCode())) { From c9f7da84d0377d1d3c13f96cb2a575685d2d6391 Mon Sep 17 00:00:00 2001 From: zengqiao Date: Mon, 5 Jul 2021 12:14:37 +0800 Subject: [PATCH 09/21] =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=92=89=E9=92=89?= =?UTF-8?q?=E7=BE=A4=E4=BA=8C=E7=BB=B4=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +----- docs/assets/images/common/dingding_group.jpg | Bin 20207 -> 0 bytes 2 files changed, 1 insertion(+), 5 deletions(-) delete mode 100644 docs/assets/images/common/dingding_group.jpg diff --git a/README.md b/README.md index e69e1688..bdbafda6 100644 --- a/README.md +++ b/README.md @@ -73,11 +73,7 @@ ![image](https://user-images.githubusercontent.com/5287750/111266722-e531d800-8665-11eb-9242-3484da5a3099.png) -微信加群:关注公众号 Obsuite(官方公众号) 回复 "Logi加群" - -![dingding_group](./docs/assets/images/common/dingding_group.jpg) -钉钉群ID:32821440 - +微信加群:关注公众号 Obsuite(官方公众号) 回复 "Logi加群" ## 4 OCE认证 OCE是一个认证机制和交流平台,为滴滴Logi-KafkaManager生产用户量身打造,我们会为OCE企业提供更好的技术支持,比如专属的技术沙龙、企业一对一的交流机会、专属的答疑群等,如果贵司Logi-KafkaManager上了生产,[快来加入吧](http://obsuite.didiyun.com/open/openAuth) diff --git a/docs/assets/images/common/dingding_group.jpg b/docs/assets/images/common/dingding_group.jpg deleted file mode 100644 index ee597d873fb1bb6c993996d49c3ffc4d8ecf9bf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20207 zcmb5V1z21?*ETx16pBNkxVyUz?hb>M;x5IlP~3|<6n801ao6JRv`C9){btDuGWrDYV2dIVL z4?s!(btB>T)C<5uhS7lL11&Ku77QE~%u^qL3|a~Vm_PLAH2?q(79IuxfQW>Qg8Bmb zz*kHF3>@?t96TaC5+Xb@qALt601gWtn*xCYhY}M}T%8lw#F+{ykUT*GFJFVJhT4=J zzsF@-GLbt7d0kVC#*BdHB+0cvO{zBdlvaz^JlU<+cqXLqmD2{DG@nHs$h|1#Yv|dm zj7PwxthQx63MwHHJp&`ZfS{bbf{w19zLm9&t*4jw`>^nc$f)?#wDgS3yyBA5vhs>A z4UJ9BEv?;s{R4wT!y{93^9zgLzAvq9ZSU;v?H`<9TwYz@+}=H-d`A5b{lWPR0v_Q% zD6s&ruuzl2(a+*;V{rTg2Tk7fG6h=$3bAH+-m5=2_@F>!WT8+%+RtFjEi9k$xVpJ} zJYxz74hj7WS5k7yU(gDR{svcDSN}J@-mm{4oc#yl#^&E3&;CWZ43GpM{vlLEMAVn4 zsHiWoUqT6+0Q;E;hzb4>@!v%Ghv=S(`Cod1GJ!!tLVAJv0tXcphn0+ojP?JTo|XV; zaDS=~3o2Zf%5Svi8yxf_`so>Ql6Ig4rvgVBF^7r5Gvw_v-{;da{q=T-4idfQ)h7Me}#e`D7c|!z?w;gym zDPY4*+r+D!#_GD5(gu**PD}Mbd9KzuXqKnk!5|mI@Vm79{2@_Nx&AY5m15g7(uMM0 zjE%O{Gie_Tx(HQ#?#dg%Y|;XI<-gy6+~z$&Z!JKY`it4_?yh)>-!$5JJKha6-z!9x z*Hp{SGLAyqHKe5t+9e)$?Mzd6i-}7*QgN@pd5^lWszY(evnwL){agL5)!6*e z*kNW@vA4r}F4PN?#UMBL{gnpioD{9M7T(~tSt5l4cRGz{*?C4fO56T(x?JUO{4T0) ztt`AcvP13dl=sML5ps?BX%|G48aF|D!FFSLgldRNJBm zWDRETc3Tt<-`j3H(zd6SR=;SjE*!F(7p`t~S+p6LkFoG>80S4c%&7vKuiJgRU|bg> z5@f8N=%BP-`VZLicMF~G?(j3~ss$mfM*P*)1D~6tHoaS04{bMNz;Cz8LwVkO*OBxz z(BaTF$ab${Oe-nTa$h2C_LrzOE$CS6KKywj`1^k}#MWJhW?CunxHF`|;1VRrqkiGO zmGj+D_Q#wH=Lybeh+CQ@+l~8jw}IyvB4XIzt7CB0KHmRct|BQ8tXc%dJUCq8XWZ#v zO`o4l)XD09|B+FMahIRydH{EBe(70q|7JFP$yNqNzPM}fR>m;!&(}UDx)Q~2{Y?+n zS!bAK%#{F(elWO}eJd+2dEUD9Nwc$}6--~OEVXDeG~1SW0XzLafbQmm8>$}SZ9!@b zr4JiM-FZeY@izU24Z@8Ko&e$oZ0-hho^L?P4PM{|ous>dr?*ES{YAP39lWJQk*US_ z_mAFeRhqKyIM15uxmU<#W|U<{mSu)1#p%uVR3_SDDUx7u7ikPi%@-7N7tIuuFiJ}+ zGuqM?Ku;T-zm%M5+8-Tb(52c16q<&U^@%-N0kO=xitupyJQqWYZ*KTV=Nky`NbM&` zxfjq1~HyL9D;3SGwVI ze4Uw_!*OEs(&tpIh!mV_i~H=MWV%%v7ySxvhocnSC%^!Gtfi_mP)aSFm<#v5YWfY( z&Etgtg&xKw-kiZ+Mc!sSx%$m-g2o;{M z6M2tXx3XJz?Am5)Rt;9<2z>0^U7HP7j0{xU^}z`nNX_!jj*UHcE*q?}5oA<-7&fi# ziMP3}Lho{q%)D0UYJjD`vsWrUnJ>+mE!hYBQ2#)?>&Ck*HSR+@Z{t8xv9_x2jqrJI zg{}?D!L~{JyA{G`DuN{g%vwvUiuId-E7{BcK3G8E`(GsHDzu&Dp#`(!) z_XMzmf?IZjhNRS2;e`I1WXoMkysNFR;nAh84R_m0eL(9gR~HTkvFcrbuJ<|@F8D1n zy-$FmC=YEE95x4q-%Tu2-`MVCN?XC78YG_puWmQjyX^j9>}|y6CiIx^U;26V>J(wT zWEC>qE(jB}w6t^OUe1T5XhKcU78-q3+4S+^^-2-8gOB-2RmIF1)0UEYN6Cvf8Sjo* zLo=@@Pe+%Bm^Irz%Qt-cjrm63FQ?ATzaGQNh|A6DICfFi?)qayqn*yg$@#9A_u%o_ zx5|syIo2bZSe_*%=HKYQ__TEzUGupd?vnx)(p)?0S2({PS=I+J9i^`PFgzNL{hHXu zaV!*&bG5UDr(gOG%H+IV_-NyM^@_H~7Y1lUsG2x%FCT!MK#s!iX5TGSH|~sDh~A|b zFxj_uW;?I^sB~Ge|GeX)Jx@GsNFl`SqhF%E{u@)I_v(P>xG`1xRJ`%XE>H(0YG>ic z(hmmmOj?BE@t6l>>Eq=FS)PW>YbFA;VST;(!ulsb^Kz49Q$8PAY3_v!t;Hj$$36Tv zs``6Vs}9dA$~%!6R+Xs-5eU;Gapa2haL!i?>D7jq_~nfiPffoFUm$V(vb}X<&b13~ z+RJ5o<%VUbkhiZI*QL34hFyGnhktF`BHcf5L{fXycvR;hoyoUd&O38FWVqaLTtf-O zWU)!Tnm8K~k}Ii;-Sw`|{OS0mr8QPh!>doQYs3)p*EUy7GD0aec8%O2x#UIcWsA6 zF6HiJm#<1%d405FvhkE!Ug~#rbaXJyi07Rvv~FltTEN$)|LC<+EWBsL`(`;r7NPOd z-O<9SZFOYhQk3)wK=LeJZBCh+4l5#$yp5EQ6S8Tan7$`KF`HJ`6rAfaLIq1Bt}4R7 z4~njpt5f5uI!A(on(wm~B0uj9Psx7!@*Vwr>yzEOc&Fnuc|o<(SY!M#W;xd~rkHWL z{c614=o5NAFBep`Iec{u`gY@a{l@PnPx0J+Lo$wX`?qSACfBId*P$u%t>&wgkN7&2 zDUHYK;zS-oTc6Ndua-95V_e^jegmh@l$#29Y&*KJdI|{%R8{A7#W{RwZshvK$2sv) z0H>kUq&3C`e9>x#z)^QCYd1MFww{m?Kp?cZ{YYeqD+`c(zWZ5xF z;ONTEtixd3;a#ZX8C87!x8)T_9f?jd51gf**0;)5qQAZ0M-Vu>cId~=z7BrmXckh8 z**N;4KmIPe?V?HKS#zDRI*iy~H8nXvuAMwYI;bvKSETxV-ZbqV4~)z$|9(AI5$>9^ zbM6A_Z)mtSW>x>(wvI{1YlIuurBD7_^CoQ%M?H|X#799w;&*pua`<>BqCY|_3+ia><6C3ArH(TDtlG^3kHK*FW`o+8% zwedQn$EJOm@nGQg<-CvY8~5z~;uZh=YXbLX$`>zmSy=6_B`qVL07~!J?6nWdGwur; z_aO_YGifabD{mw+9A~}p68ZRdI2}|ym-8A!-l*g|T5;~S>U~EauP4}R)k@{%&@FV0 zJqFpw*|)d1f>y8$dU=^(`AE7}b{<*U1X5dQmy>XpwSQZX6y0ktd`b*iOZD43YV~i3 z8MS{TSB=0S1YPmscm-lhuTQRcg+J&E<+?2ai)?&S*Z2?|+N_!xRuqSVT~?$oK6&i0 z&5KO#3z*98jdwYA5}Y0rK-MA`Co*UJJ(`gpIX#ZX-XSi!67bnWYwEXCZNsOF%a4y7 z4PCQ7?l?o8^(~F<%OtDg9rcQ>P0E>R4z4EkKlPUS-M!H>S;$*KJL?e2TnBmys4=_r z?)2T2C+9nSK36uUx{fBXw+&S>BUQUgSJ@*=6EB!X-xOLjsXF>SH@sW1PyK=qPuth8 z6Ocj2*M8p$VhVQ7cJ?DZS;pQ_Uc$1u;HNdJO;q-noAEUrw1gdSFTd;DNcokP#;0KT z-MHZ`m0hjMq^rny=bEPyj(ek`m8*Lbonzcfdz@bj6T@$!z=VG_im?0}(K%9JaKtsyctJdOGxCc&|2z)bP&eIZS=an!5h_ z=CSeac$F`;adEi5F36$B!wG%%0)ORNxeC85_?r3eq5XC0k|*5bYt7E^)hmZ$;&HIU z7hdGrF6GeS6`Xbqw`-Q!zTEbcpT8ZeKAe3sqO*kSb57j-hBhnTxZX@*X6_TaV2|Zo zpUym8pQ7u~X44{j5lb6t83t|fmZLNsPoskC@H;jy+a*4Wl8G6g4_)?+ZA}taujl0| z2@zM#Y@72|ul9eZ)H^KVGkJOp=V0tTo<9<_i*yb;2W=d@wCBZlmBwE+bH`e7&~df7 zd+mlCY`v1NLrL(p=DzSz+y5v1eeH_ui!iSp!qP??4DR+|MmY;>G)z5m&OB1_L^x`s zF=^Pq`@!S5Hutfxjc-=Yqq-`nmOMN?lqs^pih5Wh>qE5WbLsPO%+n}_)NG_uS!MBM zou~Kn?(XhKg_ZxCz&{KBzo_&fBKMDh3-y)(VV(d!W@Y0?17EoWyqQg?q(jc6ZZ@x0 z();@H-x3e5vm(FhmU;p#S&lfzB@UPxg+P8LA&h!4vmd2yLaqk?@PRts{^C>m^;jX@ z$N3cBHR8*}tK!$4{tkoj-Nzqawj!M(3HOzl<2(UuGF}mSq2-y~gdg3UAI0`EbB(tO zA>A*N{cUq20--i{DvGpqL2(hruS`&4l0I59iR{<;fpYrfY92Y&Vur^BF7BE3m%*F+ zOBsHJRU)D+oZ9&Y^eDh^{Fk7zAvGPH%@Z{093X~~kxV^;T4CfF z86Rb6pSwaC_Y**RK$B4!q%d3bAd10!QLGX?8A>RjWle=TEnrs}!6Fq}l%!?0e~mid zEy_(ASPCZ@SGhGlIP?VIG#4ka@b-d)KB(XdIGo?!7?Nc<1t*t$mBvq^ zEoQ|@>d%sh_?K6T6^$y)OKB=N5gQy*G0(@78I#S;rBD;%x^Um*9+>cMPU`#eJo>(p z5ylxD6)!QeOO)Ocgw>SRydnO;RG?n2QNdJ-ZrHrYcAb0NV5Q(^bm0SY@Rp&9X?Jgy z*{xXkn~_Q`*^YuD_%04>Fv8rAHOGzHR{RV&uJb6bnSY5Uay=6W^kmrTGUy_2&sVTQYMcI^-g;2#^ z@_XNl`&S0Lm~MWj_7yrrWPxlySV8*c@;9)3pET}p3fdd)4T9WL)Lyc95_~LfP!_&9 zS-bV|EyYvAVDVc>-;SR*;K5i1t|Q{&N(E!8p44#L@mFq;HTw7dxmw1G4~o#v#q`ez zhd^a3nE#ghpvso12V!*MKWzy*)qr79RK?xVOT5-34JP65)Y#Bw&`uV=<#2Su$d*N{ zj0l|INOTvL6Rm57>zrw~-D`S6w+z9L6544lN+JxcCgiaqy9Q%$9H z{+xFXyLhjfae7U#n17xs#`nVSRN*aU5%noJO_A#zGKF&{U6db--&M3Vf}pe2y*vb; zMiw_O{t3W#1Kev7nA&!$oYFFL%e$;SWt?z`;Dl?AieCoI=Cl0elPuEaT2bE$951Vq>3ZOYy!KnU*8OlEhAqT@t)Zk3O->DWRwqWu`>>C#etJU9kR`PmB;jUT?E-ml}nArha{=*GdmWYg+sB$+!#4ZZe1qp_Y zAMH5aypO8La27n+xON`P1353wPM7n^^}&?Nqb-+{Nme&M0p1u?0u^I}y24^)j$X(k zsW6z@u`=;zHQaRhHmgt=XO&AGJOR9N`-}9@W@L)cx&rgHN6P68D{i?NZ0Cw}s$wcQ zb3L@f7b|0{UVu2H5l{4!MB9RAW^$Qk1L>N!t~RywJe@TwyyCO#13@pbFbnRShY? zI!jK4w!SbH5M6f;9>`AfAkb*tKj(p1B{6C#GZo6xAn*tGz3()TV_;BCw`+>D;L#~B zMWUn?U`8Nnco97ZDm#Y|5GBeTp55ZJXb_AQyzf*Il7}4`DL2Y+HZI^6^~ap0+^&|% z#GY+l0rQW1$f2v;*^0#aj7J@qXKSEg3^S+I3Cib4zZ9@JIrF{MN4zap9 z7MPu!PJ*`viDG<`>Q7Cv)&8OJF0NLVZ1Kb<=+>NimZG#)Uu7mBFLOIKmz9NG?~yXT zqU^nmOnP-Md^v!%aD0%a0bZlgT0oUbYvKX8c9%qDVT z47Zi+szl!MG9oO3Nx1Kg*qo9>O7a#Le_6+(*r8CV)(jrIe?51)ylI|=bs;}^+_-Sr z%*VU^B27RP0YSp+D4iZ?HAl*+H=ZQIF(eWNwf063i;|6HSODc?Gg|~A8RndE&rAhU z>CxRlge^4(8KgtiM&-LMSs?LknSA@`K*5WohnE%#61Kt@=Ps0*Q}X9GK)c7Id!yg> zlonBNZ*dnLz|0oP9|&uZism$055}yyM-2exEPbHHo~eOy&G+qxp4Xm`r|z`n@+dHv1^H{19LOa9OR9<^6_qq)8ty_uU;`II1`wfu7dqJL{cBj(8kGm+GGs&grj7_@Q z(xgTNY-9d#iQcHzttYqh6%17B8Y-=bMfs@k!78aW9=Nq$-cNuR*kkR9#nz09$^~55 z@I^XX=hR6DbD#2x%d&-`S~-PMs-!cdhWX4qlZ>;^Ig@@<;-E#t&%7>>YHQj?8V~+3 zt>;WTIQ{}%F-DmC0Nw8*pGK^t2+G%>TmzsHX*p6Ttl&pfL!m*BZYbnGjcaQ+JGeEI z)Q7R-AG@9n*yO2IlSg|;AX56LfOtZRfZSISbAV8WiAmaTf6A#mb*!>5Gxx|ij>T# zk%*2_`vmA{7>-wZt94;2P0z@}wBJ)AQf$JYgPCj85UNs4P4=tnNACRN;Qj1fS99-F zF$1C6JmpahfxoB5cKOtB|xfDNskVUI@rJr-j()RS)#iJ zy0lc;g&6hqPz0~}3e;IPK59aXnZo`4a^d#c#TX)*LFO3#+2I0PO?GsmN0);1kJSci*pl!s?=EI#RXC0`zWQ| zv)t87z$xD4@pC5No=6&*DDEj9X;e9Nshr@*ijC1nvASV+5`VT64tG&Th1qk# z7FgNR6H%q%isTON%MTJ=<38<`FbZe4T`R?*4srt$?$07};r2+SdRBXW!`*wUlCyj!UjF=TZlLlX_Kiz>ETzoB7_e6zB= zpp6kN0gH8^GFj*D1vYAt*6qpkB;-)%g#AwJrJh946 zVo-!$+6x5joe%oQEK~eim~-`~gf)|fTD}z-?2E$@O(HB}`6J0UPF5)@G7T3u^-Q*6 z`mzmim8xBuMEhx#pvINfe9>;)HBrZe*3T&DE~ppxL?VNvM4Ja&IABH?8SUmkI*kRB zew;jzXoCx@g}Fo-5HZ)UO1M%5XcqfA5>tjUFISePqdoEp8NiWSXLM-ZT~Eg<*pP8J zbTAlRom+XE?!OMa;R@dZAN&HY+CWz~LWveRbmZYwlQi z{+(pd`Afk(x?K>UlH+8QeJ-f|Of=c0TyB&F_=Xonl^Lv`?Pa?jQpQwH7fNjO9oS3U z^_{GD3~!)*F%FSgE5}lB&Zd7h(VuiQEfdj}?)&AvZp~y2Pw6FxHMnS(XfaecQ(GG^ zHD~-)+YX$8TWRI>vDG%?Ku+8bSGd$p+>3e09)u$F4!T^%Nf!_(6*!O?e*gPcuJq4e z)OOj;=Y}_#R`UvE+BF`ZhXw7lb*2Z}{ike#7-@|GLpJC0fv(bWCmNvXMZMqOAm zHVRo?p=T7uwm{8oS47c_Ob+RQ%(;Nt#}EkF8SN#cbn516u2rWItU)3|$!hP66?GU%IE({#hsmQak~!UVI|`u#m=M}6jm8-FWw>o zT4bs$Vxh50WIl%5c-P5~!dZmy7$HG$+clJ4G$Ik=BC5RbzewfWlBHTRPf9F_&C*D2 zm%cbf?0>qQpU1a2LrIJCmST}*u0uqA7^lm%o-jnq$7X~NNBaE)=uQ?>1ld&qGqYkN z6Z+bt{Il&3tvKQ-#>Ob>eU* zNRG^mX6~^~Evc?@Z`N-X_w)%TsoS}K=DK|F;Mp#uGp@NJjz_`{gKv>e1+w>>&7!%A)XK<7dBF0VQ{pPYmYA`j7N zK<(=y7s;_6QrRc)-o-B7|6Dp${~=*yh#+kERuKuCZzD;7xQ{{w53OcIUdR`ahiUk* zs*jXL>c@Dr^2+$uzg2jSQj2D#z}uPlL49u=O(Nr5zD8&f>kR9zBooJq@F8@f6bG4x zp`%h#Vsd`TqVnJF?XluZk1+n`zg$?X z;zYiSGof=M&=*aWNoqOV`|9KgFkZ?@hap_(-|thRnRVN>E4+AXm#V7>gn_ndDSoT*5P7Zz1XcL_Uh50`NDefl_(k=tfoDSe30ZG}!UVx(Y#8CUoe zT>m=KFop2UgIu7ns^-plkvg{(ZmsDP;QPDWAFn3_tUh)HK=3{#hp0pz)58WJji_fw z^t}Agb*6({K^ejA9q9j%FgT~Er4G(KByJFh_3C<*y?g!@aIjowZU>za>K(K&XJzqQY1kC5evVH70;O{t4y#GDx@6a_+?^v{ejZUr z8Z72+HnvafM<>>Kum*Jd$G?RzsVFacLA>$@S@6MMkw-!@&418sj-w}1laQYO5f86g zbU#$&lc{7}0gMoeUC7(l()!Q#tF!x9oG*wMG4)Sdkd({QG z4B(1pE48idC$WJDaiU12qPEOjFM6T}v|G*3sl8hUyij@$qO2x|xFWrqEyHN6wspV5 z-~{($(`z!t3l)ErTa;}j(#LcPUJdp>!I3}LqNE{An4#@!3GAiuR(}oaX9SUlAuM1# zi&AewRp(+u-fe!=ZpgwCy(Xzx7SP1~9^CiMGjF{_nDlT-5-p@n*3I)mZr6h8+p!Af zR0Yke1OGM8*VI%!Q<>c-U|bh)PFpb9LA&w(NsX{TSpa+p(z?~FB7S!f<@dVI{yq3| zGJE85$IyKOvAz7C5Si{wr?T_oyVVIfC!x+qpNk~S_}5sV#5JB?-T`=X-zR_v z>7}S4Rjb^*c(a1Zz;qcifyqQCqcsj=Pm=VR7T~<#(*IU5h7&vO)4&HquIAe9Yt?WK zIPS?$5f*4IqWYx|B2cX?*{jMSzkOVI1Mea)`r>n}6IX2pT)foo69Ck^J4mt%<|Xzn zsYw*dv2H0_Cqzuy7aOFFGBsnqSyi`;MS&cv?7(sMV>cV40zcg}WkWE#Hht%ezR3TI z^%#z%Wq2j}S>5OLII+jOOOJ3^yLu_;eyeCL*I)$F6m_#xmrG_8yGIb?r*z^$=nUmd zN+p?GMK;&yd^esRCHqo03rc`t&D*i|uyuCYt{E?)OW2zKOjrf^au zQ_gK6r%QAKF_>?5BKLy^r8v&v0I$H@Q2cL;&DpId0N(&Y5rm$}0){$iWwE)E?zJ9; zDD{|X7Z3eJUeP%57uvNhy!RDuXC=%yG;0ZKFGzM3Tgl0wKJ+swRcVrTrVrhx z%2;0zjj^Qe_uPLt-pE8N_r~t^+YQV@&;u!CF-dm$%PO)Dr$+Kwdd9R?IpsD~U5#cU zS8SqgKV~fQS6T*8{Qh!~-BsyfLa^2c!t;EO8k{#GF~tws_@eX#2<&>e_dh?vMH5Ay zl#RMww;`V#iS+M;6>fh5+|m|M$iVtGlY^7&i_kEnzVjOYp5by(4sgO)wi?Cs@`@nTy2B>^RXJf0b+-C~WmoRr}kP?61kH$RIZRtj_-(X%+h0Os9{8dC|--&e~P?(0(i!2N#*!41oAmx zwfOqkqqnTt8yQWX8>$oF(4U$?{0|~BEFo-69=AMctt{v&TmG zNCjQ8V#|^BR}`|^i*M7^k4J8mL*~R%p8j{dnCd~eJ>NO=jWA9Q=k=9R*3tBS)#H_a zrH^B!`^y?=S3fgNF~dAjRK%e%YnCOumqfghQ%s+6Q$l2hoB6Qd>>|(ObX%%DB?J7J zzWIXSeE|cTO9BVV{M)kj;RwhcEHC?xWYtC%_JJk}nrBoziav2dgo61;3L0%21#&I3 zFz>q3oX=~?DzeN@M(16}2UJLy)!RtyLv%Fl%@f63_(XKIu3W>Cp_m{1Z|QD-%#(9u z&yr5!wb_6FI+M}f>L2p`wV>uO*$JAWa~lB-anFa}y*+&-NC}Y2&nBDnKY?eGYewvu zjg%1+fK#bLe#K`nlOAHwr)Q?k^`vt>k9 zsEB5ia$`}!;U@jCC)LO*eG3Y5_T8%DPXKn}9MzrU9XEuDYglhXCA*Pu- zq`;_e66H97v-~v!)KV_en7j1BUwA*F^?2L2bUo1B)o$mBP)&O|-uz`PbFiaBg#Z`P z-y^{=Nvc=ZeMS|#m=BY1El9Y*Pj3AsiNZq&_JY)awErX|YA9}~?j!{cLn?B;kv6Y>5cCXII{5 zipeQ;ZY)hyBcDUaQ_n!Xjv8MO?QVocKr#mKbfHLm0-PtqAVPISd5_h6uJ#AL%l|Hb zI(g1Q&eHN(3_1l!?U~8%p~f~jM(S}79raHeZ!wVZ+e7h0+1ihc%)~*~pHap>Oi>4& zA%CI6O5#B_@V^5Tg+Bp$FAxc_za?533tTsV#Gu2hVk38Y*olrHdHC96g0hJSkn4`_8+uM7D}?|8A|gW2q=wL*(*a`<(L=~e0RZ?u zx#x5Un%qzyTJ%_mQeVh(x_hWEKq*=&0vTEC&wcn1_&zac*~F9r{**^bN$L5N8XHp@ zdwzawynQHoC^}*+dTb1u!%ze)XHZ^6Ln2p z(qrJm#<2&1DYgHDr7sOatN-mIwyDfK1o)W#@AjPMcg%8yiR*?S?^xd;`S~SlP~ZM zwg0aV9W5oOr5)Hc4D~l0;=c6%VKojs^nu#VLp>RS>3M6YdGty}{dFdMqVF{9^}U$` zyA!A3L!3^O!p`%iGo3I?!r$kjV_H+ked_0=N<|?=Bm6WoKoT<>%+L0sl*4$03x@+6 z^DNG~D2QXOc#}OaF6>wC>4u3JPToakbU!;Qp>{Oq`!fbGB+sv~q(aM+zCyx^!C$_SsNvRjWb$d+qAd zo4x_>5T(%FeOm5 z3e@EAQ9Chxkx`4n)l@>`XR=`s>Z3Pf?8wC8OXotbE7z?Q3tufrjd@<#Yt_XVXopj_ zud6F^;Ql&u%BmEe7KWF`Rf(DIP-HuXhh@66M&%hEST#k=MC)v$4 z7PTF-(_b41o7I<2oTy%-mN!~mL`+vEmO&Yfq=(HF7$J*cMNNNj%qk;57(P zLlgZSZ-;J69~~WYZyeTw*l=D`ENq3Nv$nze3fxjamE#%J6JV5yM%7C8I}OT~anh^c zI~#Hw@uOG!ahV2{w&iOWon{ahQ5)!Xhvi)e^Zt$^X6;$u*{gX%O7&i1`K^7ZisDXW zF1|$(eeX9)f1rz+{YtVX`8G|mDdnuw=&#Jr{O^pYc5*L2X9#r`+*?2CjNSP?JM*jAXrXX` z-Wu5+!f>WYHfvc8xo%CQOly=>hVSReY4YSuh%M~_%GCOle7(fiK7*Nwl4!=~mfxd? z%i(A|^eRl*QP_Erq{%tOyvnm(u#O|Y|I&~V%XbwEM&9rcihcMYqL9gEz7aW&%|(@w zt(dAi!oyrlB*8hUE(2lWM0L8&y^6sp;p!2>T-W?hrEN9E4h2#Lr_kpMgQ#95Q-2JUr?@s-l92liSH|< z>hJo!PaTo)POm5mz`y|VJ^Y4_;pjUJzMm*x!O)RbmPY^+yL58->&WXilBTJH)dKQ{ zRHnFUB2h&(EmUZ!u;H-494(og(Hhs*J8O@y6yal~nm295dCEnM!j%1ti4s`X4ks3s6U={~Axd z1r5ruByBl6v4TJFB;HjxA>bGIEkPYbnVsG>cyS!)$SN0rE2W)BD2tdVIXv2^({dJ> z79tBuW{!pz08@-2l4MGK!A$x(2|6z~bm?t*WfHc(5)l7|NtZlz@IpJ;l>%#f9MBvS zkU)9H+HXfikJ%HD%#}=$@oGksls{Z>tW=yP>9=lhoO4A%Yp=3)Pobap?arVUqQBOng_4?PN?`h zz?RY=M9x*&&@(1O$?Kx4joq7E8C#=7HjYHY21}Plg5S}IoBP+hWGXU84{6j)v}jmw z;c01>wP<)HMVix%onW~Y68MQe*R)qx2#X3nI35WLSb1N}3N>@4hw!`2Q$Bq(rN&C+ z7em6M36hHlLP|&+FBqkSjd$O%e*qxXRU*BIx}1wYQ3NosE3FBHHM%P8<;x3x{f`{u zh)vZI!o315`F^3)hsTUJ^^Ve?+NF2p%Z!^JO*0RB9&L2|w3f4YP+;P(ZBrQRV%%Pfw|5nmF!Sli6qVyf)e7D3TqM2<`%lRJ zJ+w_s-nLSF50{}A=;$X$9{NNVAf!6@Ko6fo#$sI9NS(zwL?m7}wbP;%Wp098if$wN z`Ijz^F?EZ{Nccu{5Vm{|hx*S2w;|5=K1KNqE5}8QnBDwo<%Q#OE{Fsfk>$*;{P`iK z4e_=Lx{?H<2c=7x*rsofe@%*iNuVR1*$XS#^hVCuDsU#AsGjqp-ulxal?SzI1>_0-H(lQ981tZ=<7 zB=|V+HoGuli|F+LeAZ#>Ic$v`3@0sZDZjqlg#8U3fe=2sfaR#?hV`j1Kut^Th0KY) z{xTZBq(>H8QBXjJvk=0o&(xoZ`g4R=5H-FiI&ecnF2=Kf*)ip~LJXPH7pR$^;{i zjtW!LDu1HdG@lwe8u1I+iEBQM+ua&rAmA&<8y8}1V+&eA=T)X^ebZvoZA>Q6a2O^# zmQ{^RohBwHBc-phA7SwfoMimFSIv3F@ahJ}#` zn}_kM&NBn>xzIkcI`cCroAOI&BKFLfz49T(COc0!SH1i36L@0K;IU^`QMyw**@H;l zjk26g6OX)4cr?n1$(>_UDjO?s0MTZ2X8hImbAGL)zYkr^N|}{bf?MoG@n!|`ARQCp zi=Au#@Z)`<+}*Z@O{$WFlZIYx)@(CS_z6XLW)u1a^Z9z75B6w}4j5my=;;s-HU8 z!~N3u3BWOr`Rx=WOU{O#a6qpNKR-sH;^a>=+pY9PcB6vwTs}-UMCnvUTwBI4TEVQJ z5+;x*3JLMd`PyTPRMRf%Nje0Ek9IF!Edj#{@9u#gfmYJu z)T)GgmV-Q)@U%aSuw7W3JebrjltNNa!oYXi_dOq$Ou#I@ZjZZ(8V43J_?Dg^E zg!(CD$N0ONy;0QsF-+4S!4b=KAE{h!^jNh(8hIVu+X`QtSWZbQ?jMt!a?Z_zF?kDw zLy0}ZII(6yOza)S^6(UcQBJUUHPWVLo(#p~3el0#JtS12DIy^W_&c3B2lnk#x|06uDH`pjMeUj=(VS?mhDZ zwmoV;EFI_cMH8y=h*mu2)HO0KE(a-XH?c&T5LNs^&Mc$&Q18ne1)d=Fq9LnvcTxpJ zo>1cmS%%(j3gJx2qWQ#pt`N>P8O~%l(J&@exO(zL+=v&Q5;$=<5ti+K0(bEG*6Vj z0+Ef=Bd;$AarRktlP5VdOU%Z5(|Kjte>_#FOK6TL_Km~a7=s-WAU4+fZt;O}dNDA< zEca6=4rQW>2{I1PEloeJ@MVf2FDxbW1A)?k3*&qOq2uH;GYwjLYn|)4TopCsSN?4P zW4Y*z$V^%e8<-cS6bOULhyPJjrp&Dn(j=l?N4HrtVHBlvv9B|vlrY4%c`M{6QuV5& z*6kxTm_$mOnX)!#)a;RjwE)2XQ@MFYHGySuJb?fS1W7>-L12=QMp;NmP(fM(m_nop z2rRhtCZnJz;2=f}F(ADe2sP4&K|vi0s00F17Z7!1Mn$S?0YMxgia41)M|VE$**)*u zJ@3Ok_kH-^|L@*+!IFE?&d8*5H9C?2$s_x#scf6Hv93ma0T3BK0C+~dyYF)~oe@U7 z5oYeo-D|S$dm4tgYO4z{+TbI*!qlYXjcXv#?;hD0_0T=@mmc`_#NKz39hMl`a{}8Q zKgTGI(LRai-cJS@`;Qk}i)I^ow$2`_(hk-4%B2 zo4EDf1X{-fE5N_eyiCw5V~cHA1Uh$bCr4ZZnM|2hdGe}$oTDxhYzT-G@`mHxEH{tU zvwcn%AYo+d=Akx;b;f*DMVd*_E!7AxrOL9nt!MR$jh?Uxm_DAWb9`4wg4$(H3@ReS z2u6a6{O009_FuC^nL$|D9qxPtJwsnDC@Q5<1?y}eXw<|TnM5yCFf57E9Iq!n<5?P= zI-1Rk^%ae%h)*@atOB*Bdh9F|GGwGf?UkHc6p^9I%Kv#4T{}XSOnKN?L4v;kIuVa| zvW3I257qlwro>mBZ^k_P&?lHdgJ|d4>a5}9Vx>Z)y(ukg3Yom&q2NCQ=cf?TK`fFr zas!cCNZ7C3>*1p1IcIzK)(tX!oTQRG8y=;WR~LfP7b3HsHEWmhV8bWNZnAL+Pqj5V&6R-NOtDH!lZ5dcpsKHZz$u=~ z9mMTJsdS$Rma?WkX??R`kGq}>xN==c@)$80*T6tJC3m=dUaIa%w*Q6y7UjIoMwPT; zlhP2VDbx_ITQ#%@WhE51+aEM}Q~@&aU?i!g=Wm?mWZ%>%5G0(v&(%(n~bKm?b8R6<$?DieoUfU%y z-!-jzg9j^cMaaMRo|omv|88$VC144~d)NB%pvh@g5J#pjsq9RR`)GV-^V^Lt0G;C( z;)bejw4U5PhzczeDX3a{caRwdW5@M(Iju3oSLV~a_Unrx%fGN zYn}T#SFb;C5I*BZ2Uz4!h<9}Bj0i1Sg5s_!5mUFCR*NNG@QHuPo83+m-N;zmwq_3= zzeb5W_ATo(#4%7FI_t(g#d_f_NlV*Gb0q-ZpD@G8e#(Q2wAF5zd2dKY9FM?9w?|;t zpMNy?>818|a`H|0td9%q^l)}Py|8!LAcnQI_A%P#Omj(Q3?jULWqx|)&H>U~(Mmnk z!)#_*-GZYxf6=~;I5ksD}5q0;nB1(RE-|=T4_EOgwvzR`XtG zsriGouWmbm(p%+Y-?5@CjNo*M+|)hz^0h z5k0U)Bor{q)MzkoR2!01WjyTiN!lZ23NuqOB{q??q%qNAv;<9a)V&_)onLUpRd%?E z5E?%)ubdO7G@OKuQZ{rDD@T-rIn7sWSox8g45QA!qwYvN_ z4n{~cJp}`Xl@ zA##V90fdn96}vUxlqL;Y+ zAxk$%`>4hv{OBV%@}A~->DaQoF42Z9gt||Et@0+(FnchM4IP<|eH;7cMN8*`(ME&* zJLew<3T*oiZu=?F1(#_q4F<-Sk}BmLzmDp5=r<8}kbgPOi@Z*%1-y5vo9%hf41N{^Jzc%(rV9Y@wA8+4tniud{zOUv z_Y+PG5B>k=Hf86(S->V3C zpdwjipo%fENH8?3G!#E0Kab`Hs~XPrS%$I-iFNH@s;_3~4I-I?*!Yb^tX&bwb6UFf ze+0U~ia_mmOaOW;#}UT+(KwX_=*O+Qn}J^&pB1anZ9QQGFRmMQf!&1>_eh^myL{AD z(3zR#7eCbr)R3iL4{&Dk8icOZ zN*nEETq&e{K|s+W2bmlEbcF)BYO% Date: Tue, 6 Jul 2021 17:36:23 +0800 Subject: [PATCH 10/21] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bdbafda6..5c6d880d 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ ![image](https://user-images.githubusercontent.com/5287750/111266722-e531d800-8665-11eb-9242-3484da5a3099.png) -微信加群:关注公众号 Obsuite(官方公众号) 回复 "Logi加群" +微信加群:关注公众号 云原生可观测性 回复 "Logi加群" ## 4 OCE认证 OCE是一个认证机制和交流平台,为滴滴Logi-KafkaManager生产用户量身打造,我们会为OCE企业提供更好的技术支持,比如专属的技术沙龙、企业一对一的交流机会、专属的答疑群等,如果贵司Logi-KafkaManager上了生产,[快来加入吧](http://obsuite.didiyun.com/open/openAuth) From 48d26347f7755ff41f0fdd3b4493a0e7c048aced Mon Sep 17 00:00:00 2001 From: Peng <71620349+PenceX@users.noreply.github.com> Date: Fri, 9 Jul 2021 11:01:18 +0800 Subject: [PATCH 11/21] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 替换logo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5c6d880d..e30308d5 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ --- -![kafka-manager-logo](./docs/assets/images/common/logo_name.png) +![logi_logo](https://user-images.githubusercontent.com/71620349/125017036-ec617380-e0a4-11eb-99d3-02c2511cc63d.png) **一站式`Apache Kafka`集群指标监控与运维管控平台** From 8c842af4ba84336f7605e42a78f2fa1906ed27d0 Mon Sep 17 00:00:00 2001 From: Peng <71620349+PenceX@users.noreply.github.com> Date: Fri, 9 Jul 2021 12:46:18 +0800 Subject: [PATCH 12/21] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新小尺寸logo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e30308d5..ad88eada 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ --- -![logi_logo](https://user-images.githubusercontent.com/71620349/125017036-ec617380-e0a4-11eb-99d3-02c2511cc63d.png) +![logikm_logo](https://user-images.githubusercontent.com/71620349/125024570-9e07a100-e0b3-11eb-8ebc-22e73e056771.png) **一站式`Apache Kafka`集群指标监控与运维管控平台** From 387d89d3af35ef9b6985c41148ed8f5d84005085 Mon Sep 17 00:00:00 2001 From: zengqiao Date: Tue, 13 Jul 2021 10:39:28 +0800 Subject: [PATCH 13/21] optimize code format by sonar-lint --- .../utils/factory/KafkaConsumerFactory.java | 16 +++--- .../service/cache/ConsumerMetadataCache.java | 3 ++ .../service/cache/KafkaClientPool.java | 53 +++++++++---------- .../service/cache/KafkaMetricsCache.java | 13 +++-- .../cache/LogicalClusterMetadataManager.java | 2 +- .../cache/PhysicalClusterMetadataManager.java | 20 +++---- 6 files changed, 56 insertions(+), 51 deletions(-) diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/factory/KafkaConsumerFactory.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/factory/KafkaConsumerFactory.java index 68109779..5964d162 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/factory/KafkaConsumerFactory.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/factory/KafkaConsumerFactory.java @@ -1,7 +1,7 @@ package com.xiaojukeji.kafka.manager.common.utils.factory; -import com.alibaba.fastjson.JSONObject; import com.xiaojukeji.kafka.manager.common.entity.pojo.ClusterDO; +import com.xiaojukeji.kafka.manager.common.utils.JsonUtils; import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; import org.apache.commons.pool2.BasePooledObjectFactory; import org.apache.commons.pool2.PooledObject; @@ -16,7 +16,7 @@ import java.util.Properties; * @author zengqiao * @date 20/8/24 */ -public class KafkaConsumerFactory extends BasePooledObjectFactory { +public class KafkaConsumerFactory extends BasePooledObjectFactory> { private ClusterDO clusterDO; public KafkaConsumerFactory(ClusterDO clusterDO) { @@ -25,17 +25,17 @@ public class KafkaConsumerFactory extends BasePooledObjectFactory @Override public KafkaConsumer create() { - return new KafkaConsumer(createKafkaConsumerProperties(clusterDO)); + return new KafkaConsumer(createKafkaConsumerProperties(clusterDO)); } @Override - public PooledObject wrap(KafkaConsumer obj) { - return new DefaultPooledObject(obj); + public PooledObject> wrap(KafkaConsumer obj) { + return new DefaultPooledObject<>(obj); } @Override - public void destroyObject(final PooledObject p) throws Exception { - KafkaConsumer kafkaConsumer = p.getObject(); + public void destroyObject(final PooledObject> p) throws Exception { + KafkaConsumer kafkaConsumer = p.getObject(); if (ValidateUtils.isNull(kafkaConsumer)) { return; } @@ -57,7 +57,7 @@ public class KafkaConsumerFactory extends BasePooledObjectFactory if (ValidateUtils.isBlank(clusterDO.getSecurityProperties())) { return properties; } - properties.putAll(JSONObject.parseObject(clusterDO.getSecurityProperties(), Properties.class)); + properties.putAll(JsonUtils.stringToObj(clusterDO.getSecurityProperties(), Properties.class)); return properties; } } \ No newline at end of file diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/ConsumerMetadataCache.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/ConsumerMetadataCache.java index 41fd0092..3fd6aaac 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/ConsumerMetadataCache.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/ConsumerMetadataCache.java @@ -17,6 +17,9 @@ public class ConsumerMetadataCache { private static final Map CG_METADATA_IN_BK_MAP = new ConcurrentHashMap<>(); + private ConsumerMetadataCache() { + } + public static void putConsumerMetadataInZK(Long clusterId, ConsumerMetadata consumerMetadata) { if (clusterId == null || consumerMetadata == null) { return; diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/KafkaClientPool.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/KafkaClientPool.java index 921b13ba..56e17ae5 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/KafkaClientPool.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/KafkaClientPool.java @@ -1,7 +1,7 @@ package com.xiaojukeji.kafka.manager.service.cache; -import com.alibaba.fastjson.JSONObject; import com.xiaojukeji.kafka.manager.common.entity.pojo.ClusterDO; +import com.xiaojukeji.kafka.manager.common.utils.JsonUtils; import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; import com.xiaojukeji.kafka.manager.common.utils.factory.KafkaConsumerFactory; import kafka.admin.AdminClient; @@ -26,19 +26,22 @@ import java.util.concurrent.locks.ReentrantLock; * @date 19/12/24 */ public class KafkaClientPool { - private final static Logger LOGGER = LoggerFactory.getLogger(KafkaClientPool.class); + private static final Logger LOGGER = LoggerFactory.getLogger(KafkaClientPool.class); /** * AdminClient */ - private static Map AdminClientMap = new ConcurrentHashMap<>(); + private static final Map ADMIN_CLIENT_MAP = new ConcurrentHashMap<>(); - private static Map> KAFKA_PRODUCER_MAP = new ConcurrentHashMap<>(); + private static final Map> KAFKA_PRODUCER_MAP = new ConcurrentHashMap<>(); - private static Map> KAFKA_CONSUMER_POOL = new ConcurrentHashMap<>(); + private static final Map>> KAFKA_CONSUMER_POOL = new ConcurrentHashMap<>(); private static ReentrantLock lock = new ReentrantLock(); + private KafkaClientPool() { + } + private static void initKafkaProducerMap(Long clusterId) { ClusterDO clusterDO = PhysicalClusterMetadataManager.getClusterFromCache(clusterId); if (clusterDO == null) { @@ -55,7 +58,7 @@ public class KafkaClientPool { properties.setProperty(ProducerConfig.COMPRESSION_TYPE_CONFIG, "lz4"); properties.setProperty(ProducerConfig.LINGER_MS_CONFIG, "10"); properties.setProperty(ProducerConfig.RETRIES_CONFIG, "3"); - KAFKA_PRODUCER_MAP.put(clusterId, new KafkaProducer(properties)); + KAFKA_PRODUCER_MAP.put(clusterId, new KafkaProducer<>(properties)); } catch (Exception e) { LOGGER.error("create kafka producer failed, clusterDO:{}.", clusterDO, e); } finally { @@ -77,25 +80,22 @@ public class KafkaClientPool { if (ValidateUtils.isNull(kafkaProducer)) { return false; } - kafkaProducer.send(new ProducerRecord(topicName, data)); + kafkaProducer.send(new ProducerRecord<>(topicName, data)); return true; } private static void initKafkaConsumerPool(ClusterDO clusterDO) { lock.lock(); try { - GenericObjectPool objectPool = KAFKA_CONSUMER_POOL.get(clusterDO.getId()); + GenericObjectPool> objectPool = KAFKA_CONSUMER_POOL.get(clusterDO.getId()); if (objectPool != null) { return; } - GenericObjectPoolConfig config = new GenericObjectPoolConfig(); + GenericObjectPoolConfig> config = new GenericObjectPoolConfig<>(); config.setMaxIdle(24); config.setMinIdle(24); config.setMaxTotal(24); - KAFKA_CONSUMER_POOL.put( - clusterDO.getId(), - new GenericObjectPool(new KafkaConsumerFactory(clusterDO), config) - ); + KAFKA_CONSUMER_POOL.put(clusterDO.getId(), new GenericObjectPool<>(new KafkaConsumerFactory(clusterDO), config)); } catch (Exception e) { LOGGER.error("create kafka consumer pool failed, clusterDO:{}.", clusterDO, e); } finally { @@ -106,7 +106,7 @@ public class KafkaClientPool { public static void closeKafkaConsumerPool(Long clusterId) { lock.lock(); try { - GenericObjectPool objectPool = KAFKA_CONSUMER_POOL.remove(clusterId); + GenericObjectPool> objectPool = KAFKA_CONSUMER_POOL.remove(clusterId); if (objectPool == null) { return; } @@ -118,11 +118,11 @@ public class KafkaClientPool { } } - public static KafkaConsumer borrowKafkaConsumerClient(ClusterDO clusterDO) { + public static KafkaConsumer borrowKafkaConsumerClient(ClusterDO clusterDO) { if (ValidateUtils.isNull(clusterDO)) { return null; } - GenericObjectPool objectPool = KAFKA_CONSUMER_POOL.get(clusterDO.getId()); + GenericObjectPool> objectPool = KAFKA_CONSUMER_POOL.get(clusterDO.getId()); if (ValidateUtils.isNull(objectPool)) { initKafkaConsumerPool(clusterDO); objectPool = KAFKA_CONSUMER_POOL.get(clusterDO.getId()); @@ -139,11 +139,11 @@ public class KafkaClientPool { return null; } - public static void returnKafkaConsumerClient(Long physicalClusterId, KafkaConsumer kafkaConsumer) { + public static void returnKafkaConsumerClient(Long physicalClusterId, KafkaConsumer kafkaConsumer) { if (ValidateUtils.isNull(physicalClusterId) || ValidateUtils.isNull(kafkaConsumer)) { return; } - GenericObjectPool objectPool = KAFKA_CONSUMER_POOL.get(physicalClusterId); + GenericObjectPool> objectPool = KAFKA_CONSUMER_POOL.get(physicalClusterId); if (ValidateUtils.isNull(objectPool)) { return; } @@ -155,7 +155,7 @@ public class KafkaClientPool { } public static AdminClient getAdminClient(Long clusterId) { - AdminClient adminClient = AdminClientMap.get(clusterId); + AdminClient adminClient = ADMIN_CLIENT_MAP.get(clusterId); if (adminClient != null) { return adminClient; } @@ -166,26 +166,26 @@ public class KafkaClientPool { Properties properties = createProperties(clusterDO, false); lock.lock(); try { - adminClient = AdminClientMap.get(clusterId); + adminClient = ADMIN_CLIENT_MAP.get(clusterId); if (adminClient != null) { return adminClient; } - AdminClientMap.put(clusterId, AdminClient.create(properties)); + ADMIN_CLIENT_MAP.put(clusterId, AdminClient.create(properties)); } catch (Exception e) { LOGGER.error("create kafka admin client failed, clusterId:{}.", clusterId, e); } finally { lock.unlock(); } - return AdminClientMap.get(clusterId); + return ADMIN_CLIENT_MAP.get(clusterId); } public static void closeAdminClient(ClusterDO cluster) { - if (AdminClientMap.containsKey(cluster.getId())) { - AdminClientMap.get(cluster.getId()).close(); + if (ADMIN_CLIENT_MAP.containsKey(cluster.getId())) { + ADMIN_CLIENT_MAP.get(cluster.getId()).close(); } } - public static Properties createProperties(ClusterDO clusterDO, Boolean serialize) { + public static Properties createProperties(ClusterDO clusterDO, boolean serialize) { Properties properties = new Properties(); properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, clusterDO.getBootstrapServers()); if (serialize) { @@ -198,8 +198,7 @@ public class KafkaClientPool { if (ValidateUtils.isBlank(clusterDO.getSecurityProperties())) { return properties; } - Properties securityProperties = JSONObject.parseObject(clusterDO.getSecurityProperties(), Properties.class); - properties.putAll(securityProperties); + properties.putAll(JsonUtils.stringToObj(clusterDO.getSecurityProperties(), Properties.class)); return properties; } } \ No newline at end of file diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/KafkaMetricsCache.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/KafkaMetricsCache.java index 011bc1e6..7ba1e304 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/KafkaMetricsCache.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/KafkaMetricsCache.java @@ -14,7 +14,10 @@ public class KafkaMetricsCache { /** * */ - private static Map> TopicMetricsMap = new ConcurrentHashMap<>(); + private static final Map> TOPIC_METRICS_MAP = new ConcurrentHashMap<>(); + + private KafkaMetricsCache() { + } public static void putTopicMetricsToCache(Long clusterId, List dataList) { if (clusterId == null || dataList == null) { @@ -24,22 +27,22 @@ public class KafkaMetricsCache { for (TopicMetrics topicMetrics : dataList) { subMetricsMap.put(topicMetrics.getTopicName(), topicMetrics); } - TopicMetricsMap.put(clusterId, subMetricsMap); + TOPIC_METRICS_MAP.put(clusterId, subMetricsMap); } public static Map getTopicMetricsFromCache(Long clusterId) { - return TopicMetricsMap.getOrDefault(clusterId, Collections.emptyMap()); + return TOPIC_METRICS_MAP.getOrDefault(clusterId, Collections.emptyMap()); } public static Map> getAllTopicMetricsFromCache() { - return TopicMetricsMap; + return TOPIC_METRICS_MAP; } public static TopicMetrics getTopicMetricsFromCache(Long clusterId, String topicName) { if (clusterId == null || topicName == null) { return null; } - Map subMap = TopicMetricsMap.getOrDefault(clusterId, Collections.emptyMap()); + Map subMap = TOPIC_METRICS_MAP.getOrDefault(clusterId, Collections.emptyMap()); return subMap.get(topicName); } } diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/LogicalClusterMetadataManager.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/LogicalClusterMetadataManager.java index 5cd81581..744101ef 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/LogicalClusterMetadataManager.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/LogicalClusterMetadataManager.java @@ -160,7 +160,7 @@ public class LogicalClusterMetadataManager { public void flush() { List logicalClusterDOList = logicalClusterService.listAll(); if (ValidateUtils.isNull(logicalClusterDOList)) { - logicalClusterDOList = Collections.EMPTY_LIST; + logicalClusterDOList = Collections.emptyList(); } Set inDbLogicalClusterIds = logicalClusterDOList.stream() .map(LogicalClusterDO::getId) diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/PhysicalClusterMetadataManager.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/PhysicalClusterMetadataManager.java index a7142fa9..c5f09820 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/PhysicalClusterMetadataManager.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/PhysicalClusterMetadataManager.java @@ -39,7 +39,7 @@ import java.util.concurrent.ConcurrentHashMap; */ @Service public class PhysicalClusterMetadataManager { - private final static Logger LOGGER = LoggerFactory.getLogger(PhysicalClusterMetadataManager.class); + private static final Logger LOGGER = LoggerFactory.getLogger(PhysicalClusterMetadataManager.class); @Autowired private ControllerDao controllerDao; @@ -50,22 +50,22 @@ public class PhysicalClusterMetadataManager { @Autowired private ClusterService clusterService; - private final static Map CLUSTER_MAP = new ConcurrentHashMap<>(); + private static final Map CLUSTER_MAP = new ConcurrentHashMap<>(); - private final static Map CONTROLLER_DATA_MAP = new ConcurrentHashMap<>(); + private static final Map CONTROLLER_DATA_MAP = new ConcurrentHashMap<>(); - private final static Map ZK_CONFIG_MAP = new ConcurrentHashMap<>(); + private static final Map ZK_CONFIG_MAP = new ConcurrentHashMap<>(); - private final static Map> TOPIC_METADATA_MAP = new ConcurrentHashMap<>(); + private static final Map> TOPIC_METADATA_MAP = new ConcurrentHashMap<>(); - private final static Map> TOPIC_PROPERTIES_MAP = new ConcurrentHashMap<>(); + private static final Map> TOPIC_PROPERTIES_MAP = new ConcurrentHashMap<>(); - private final static Map> BROKER_METADATA_MAP = new ConcurrentHashMap<>(); + private static final Map> BROKER_METADATA_MAP = new ConcurrentHashMap<>(); /** * JXM连接, 延迟连接 */ - private final static Map> JMX_CONNECTOR_MAP = new ConcurrentHashMap<>(); + private static final Map> JMX_CONNECTOR_MAP = new ConcurrentHashMap<>(); /** * KafkaBroker版本, 延迟获取 @@ -398,7 +398,7 @@ public class PhysicalClusterMetadataManager { KafkaBrokerRoleEnum roleEnum) { BrokerMetadata brokerMetadata = PhysicalClusterMetadataManager.getBrokerMetadata(clusterId, brokerId); - if (ValidateUtils.isNull(brokerMetadata)) { + if (brokerMetadata == null) { return; } String hostname = brokerMetadata.getHost().replace(KafkaConstant.BROKER_HOST_NAME_SUFFIX, ""); @@ -438,7 +438,7 @@ public class PhysicalClusterMetadataManager { KafkaBrokerRoleEnum roleEnum) { BrokerMetadata brokerMetadata = PhysicalClusterMetadataManager.getBrokerMetadata(clusterId, brokerId); - if (ValidateUtils.isNull(brokerMetadata)) { + if (brokerMetadata == null) { return; } From fb4a9f9056353c4ddd7c1ad3b8a7727b6e55b709 Mon Sep 17 00:00:00 2001 From: EricZeng Date: Mon, 26 Jul 2021 09:28:16 +0800 Subject: [PATCH 14/21] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84=E2=80=98=E5=9C=A8=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除多余的‘在’ --- docs/开源版与商业版特性对比.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/开源版与商业版特性对比.md b/docs/开源版与商业版特性对比.md index e9d9dbd4..9d2ce50f 100644 --- a/docs/开源版与商业版特性对比.md +++ b/docs/开源版与商业版特性对比.md @@ -49,7 +49,7 @@ **总结** -Logi-KafkaManager的商业特性体现在在滴滴Kafka Gateway、滴滴Kafka引擎、内部沉淀出的资源治理专家经验、可定制化的健康分算法。 +Logi-KafkaManager的商业特性体现在滴滴Kafka Gateway、滴滴Kafka引擎、内部沉淀出的资源治理专家经验、可定制化的健康分算法。 从场景来看,滴滴Logi-KafkaManager的开源版本在kafka集群运维、的Topic管理、监控告警、资源治理等kafka核心场景都充分开源用户的使用需求并且有着出色的表现。而商业版相较于开源版在安全管控、流量管控、更丰富的指标监控、资源治理专家经验的具有明显提升,更加符合企业业务需求。 除此之外,商业版还可根据企业实际需求对平台源码进行定制化改造,并提供运维保障,稳定性保障,运营保障等服务。 From 69736a63b63744eab2012230c86223fcffd9844c Mon Sep 17 00:00:00 2001 From: ZHAOYINRUI <51046167+ZHAOYINRUI@users.noreply.github.com> Date: Mon, 2 Aug 2021 22:10:15 +0800 Subject: [PATCH 15/21] =?UTF-8?q?Update=20=E5=BC=80=E6=BA=90=E7=89=88?= =?UTF-8?q?=E4=B8=8E=E5=95=86=E4=B8=9A=E7=89=88=E7=89=B9=E6=80=A7=E5=AF=B9?= =?UTF-8?q?=E6=AF=94.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充优化 --- docs/开源版与商业版特性对比.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/开源版与商业版特性对比.md b/docs/开源版与商业版特性对比.md index 9d2ce50f..853efcdb 100644 --- a/docs/开源版与商业版特性对比.md +++ b/docs/开源版与商业版特性对比.md @@ -19,9 +19,9 @@ | 模块 |对比指标 |底层依赖 |开源版 |商业版 |备注 | | --- | --- | --- | --- | --- | --- | -| 服务发现 | bootstrap地址变更对客户端无影响 | | | 是| | -| 安全管控 | 身份鉴权(appID+password) | | | 是 | | -| | 权限鉴权(Topic+appID) | | | 是 | | +| 服务发现 | bootstrap地址变更对客户端无影响 | Gateway | | 是| | +| 安全管控 | 身份鉴权(appID+password) | Gateway | | 是 | | +| | 权限鉴权(Topic+appID) | Gateway | | 是 | | | 指标监控 | Topic实时流量、历史流量 | | 是 | 是 | | | | Broker实时耗时、历史耗时 | 引擎 | | 是 | | | | 分区落盘 | 引擎 | | 是 | | @@ -49,7 +49,7 @@ **总结** -Logi-KafkaManager的商业特性体现在滴滴Kafka Gateway、滴滴Kafka引擎、内部沉淀出的资源治理专家经验、可定制化的健康分算法。 +滴滴LogiKM的商业特性体现在滴滴Kafka Gateway、滴滴Kafka引擎、内部沉淀出的资源治理专家经验、可定制化的健康分算法。 从场景来看,滴滴Logi-KafkaManager的开源版本在kafka集群运维、的Topic管理、监控告警、资源治理等kafka核心场景都充分开源用户的使用需求并且有着出色的表现。而商业版相较于开源版在安全管控、流量管控、更丰富的指标监控、资源治理专家经验的具有明显提升,更加符合企业业务需求。 除此之外,商业版还可根据企业实际需求对平台源码进行定制化改造,并提供运维保障,稳定性保障,运营保障等服务。 From 757f90aa7a279716a5087ed80b6b764ad46241b2 Mon Sep 17 00:00:00 2001 From: "mike.zhangliang" Date: Wed, 11 Aug 2021 09:08:33 +0800 Subject: [PATCH 16/21] Update README.md --- README.md | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index ad88eada..8afdd265 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ -阅读本README文档,您可以了解到滴滴Logi-KafkaManager的用户群体、产品定位等信息,并通过体验地址,快速体验Kafka集群指标监控与运维管控的全流程。
若滴滴Logi-KafkaManager已在贵司的生产环境进行使用,并想要获得官方更好地支持和指导,可以通过[`OCE认证`](http://obsuite.didiyun.com/open/openAuth),加入官方交流平台。 +阅读本README文档,您可以了解到滴滴Logi-KafkaManager的用户群体、产品定位等信息,并通过体验地址,快速体验Kafka集群指标监控与运维管控的全流程。 ## 1 产品简介 @@ -75,22 +75,19 @@ ![image](https://user-images.githubusercontent.com/5287750/111266722-e531d800-8665-11eb-9242-3484da5a3099.png) 微信加群:关注公众号 云原生可观测性 回复 "Logi加群" -## 4 OCE认证 -OCE是一个认证机制和交流平台,为滴滴Logi-KafkaManager生产用户量身打造,我们会为OCE企业提供更好的技术支持,比如专属的技术沙龙、企业一对一的交流机会、专属的答疑群等,如果贵司Logi-KafkaManager上了生产,[快来加入吧](http://obsuite.didiyun.com/open/openAuth) +## 4 项目成员 -## 5 项目成员 - -### 5.1 内部核心人员 +### 4.1 内部核心人员 `iceyuhui`、`liuyaguang`、`limengmonty`、`zhangliangmike`、`nullhuangyiming`、`zengqiao`、`eilenexuzhe`、`huangjiaweihjw`、`zhaoyinrui`、`marzkonglingxu`、`joysunchao` -### 5.2 外部贡献者 +### 4.2 外部贡献者 `fangjunyu`、`zhoutaiyang` -## 6 协议 +## 5 协议 `kafka-manager`基于`Apache-2.0`协议进行分发和使用,更多信息参见[协议文件](./LICENSE) From b74aefb08f2aef524e18d727fa3f98ee09d36e02 Mon Sep 17 00:00:00 2001 From: "mike.zhangliang" Date: Sun, 15 Aug 2021 15:14:25 +0800 Subject: [PATCH 17/21] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8afdd265..885c2a10 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ ![image](https://user-images.githubusercontent.com/5287750/111266722-e531d800-8665-11eb-9242-3484da5a3099.png) -微信加群:关注公众号 云原生可观测性 回复 "Logi加群" +微信加群:添加mike_zhangliang的微信号备注Logi加群或关注公众号 云原生可观测性 回复 "Logi加群" ## 4 项目成员 From c344fd8ca4d1ba72e52ee53828c911dc6cf7d0df Mon Sep 17 00:00:00 2001 From: zengqiao Date: Tue, 21 Sep 2021 11:00:33 +0800 Subject: [PATCH 18/21] =?UTF-8?q?=E7=99=BD=E5=90=8D=E5=8D=95=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E4=B8=AD=E4=BB=85=E4=BF=9D=E7=95=99=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kafka/manager/account/impl/LoginServiceImpl.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java index 8f079fde..f49f7dca 100644 --- a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java +++ b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java @@ -75,11 +75,7 @@ public class LoginServiceImpl implements LoginService { return false; } - if (classRequestMappingValue.equals(ApiPrefix.API_V1_SSO_PREFIX) - || classRequestMappingValue.equals(ApiPrefix.API_V1_THIRD_PART_PREFIX) - || classRequestMappingValue.equals(ApiPrefix.API_V1_THIRD_PART_OP_PREFIX) - || classRequestMappingValue.equals(ApiPrefix.API_V1_THIRD_PART_NORMAL_PREFIX) - || classRequestMappingValue.equals(ApiPrefix.GATEWAY_API_V1_PREFIX)) { + if (classRequestMappingValue.equals(ApiPrefix.API_V1_SSO_PREFIX)) { // 白名单接口直接true return true; } From 3fd6f4003fc4dd4cb845e692c665f3a32d4734d1 Mon Sep 17 00:00:00 2001 From: ZHAOYINRUI <51046167+ZHAOYINRUI@users.noreply.github.com> Date: Mon, 8 Nov 2021 17:39:08 +0800 Subject: [PATCH 19/21] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E3=80=90Kafka=E4=B8=AD?= =?UTF-8?q?=E6=96=87=E7=A4=BE=E5=8C=BA=E3=80=91=E7=9F=A5=E8=AF=86=E6=98=9F?= =?UTF-8?q?=E7=90=83=E4=BA=8C=E7=BB=B4=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 885c2a10..fc37311a 100644 --- a/README.md +++ b/README.md @@ -75,19 +75,27 @@ ![image](https://user-images.githubusercontent.com/5287750/111266722-e531d800-8665-11eb-9242-3484da5a3099.png) 微信加群:添加mike_zhangliang的微信号备注Logi加群或关注公众号 云原生可观测性 回复 "Logi加群" +## 4 知识星球 -## 4 项目成员 +![image](https://user-images.githubusercontent.com/51046167/140718512-5ab1b336-5c48-46c0-90bd-44b5c7e168c8.png) -### 4.1 内部核心人员 +✅【提问】请去知识星球,有问必答,内测期免费加入~https://z.didi.cn/5gSF9 + +期待大家在星球多多互动,提问~!700+群友一起共建国内最专业最有价值【Kafka中文社区】 +PS:请尽量把问题一次性描述清楚,并告知环境信息情况哦~!如使用版本、操作步骤、报错/警告信息等,方便嘉宾们快速解答~ + +## 5 项目成员 + +### 5.1 内部核心人员 `iceyuhui`、`liuyaguang`、`limengmonty`、`zhangliangmike`、`nullhuangyiming`、`zengqiao`、`eilenexuzhe`、`huangjiaweihjw`、`zhaoyinrui`、`marzkonglingxu`、`joysunchao` -### 4.2 外部贡献者 +### 5.2 外部贡献者 `fangjunyu`、`zhoutaiyang` -## 5 协议 +## 6 协议 `kafka-manager`基于`Apache-2.0`协议进行分发和使用,更多信息参见[协议文件](./LICENSE) From 3668a10af6da4b72fe2fcf5ac7723023205b935d Mon Sep 17 00:00:00 2001 From: ZHAOYINRUI <51046167+ZHAOYINRUI@users.noreply.github.com> Date: Tue, 9 Nov 2021 12:43:09 +0800 Subject: [PATCH 20/21] Update README.md --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index fc37311a..5de2923d 100644 --- a/README.md +++ b/README.md @@ -79,10 +79,11 @@ ![image](https://user-images.githubusercontent.com/51046167/140718512-5ab1b336-5c48-46c0-90bd-44b5c7e168c8.png) -✅【提问】请去知识星球,有问必答,内测期免费加入~https://z.didi.cn/5gSF9 - -期待大家在星球多多互动,提问~!700+群友一起共建国内最专业最有价值【Kafka中文社区】 -PS:请尽量把问题一次性描述清楚,并告知环境信息情况哦~!如使用版本、操作步骤、报错/警告信息等,方便嘉宾们快速解答~ +✅知识星球首个【Kafka中文社区】,内测期免费加入~https://z.didi.cn/5gSF9 +有问必答~! +互动有礼~! +1100+群友一起共建国内最专业的【Kafka中文社区】 +PS:提问请尽量把问题一次性描述清楚,并告知环境信息情况哦~!如使用版本、操作步骤、报错/警告信息等,方便嘉宾们快速解答~ ## 5 项目成员 From 672905da121b4ed128c2baca2d3d4529d0d81d49 Mon Sep 17 00:00:00 2001 From: ZHAOYINRUI <51046167+ZHAOYINRUI@users.noreply.github.com> Date: Thu, 11 Nov 2021 15:19:29 +0800 Subject: [PATCH 21/21] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5de2923d..739b2309 100644 --- a/README.md +++ b/README.md @@ -99,4 +99,4 @@ PS:提问请尽量把问题一次性描述清楚,并告知环境信息情况 ## 6 协议 -`kafka-manager`基于`Apache-2.0`协议进行分发和使用,更多信息参见[协议文件](./LICENSE) +`LogiKM`基于`Apache-2.0`协议进行分发和使用,更多信息参见[协议文件](./LICENSE)