From 5cfeaac0b70aa40900aaa455a2766efe5e90bfbc Mon Sep 17 00:00:00 2001 From: shuigedeng <981376577@qq.com> Date: Thu, 16 Sep 2021 07:57:24 +0800 Subject: [PATCH] [taotao-cloud-project-1233] update collect --- config/k8s/install.sh | 68 +++++++- config/rancher/install.sh | 1 - settings.gradle | 13 -- .../RouterFunctionConfiguration.java | 3 - .../taotao/cloud/core/model/Collector.java | 7 +- .../cloud/common/utils/ReflectionUtil.java | 25 +++ .../taotao-cloud-starter-health/build.gradle | 6 +- .../collect/AsyncThreadPoolCollectTask.java | 130 +++++++------- .../cloud/health/collect/CpuCollectTask.java | 26 +-- .../health/collect/DataSourceCollectTask.java | 162 +++++++++++------- .../health/collect/DoubtApiCollectTask.java | 61 +++---- .../cloud/health/collect/ElkCollectTask.java | 51 ++++-- .../health/collect/HealthCheckProvider.java | 41 ++--- .../health/collect/HttpPoolCollectTask.java | 19 +- .../collect/LogStatisticCollectTask.java | 44 ++--- .../health/collect/MemoryCollectTask.java | 4 +- .../collect/MonitorThreadPoolCollectTask.java | 67 ++++---- .../health/collect/MybatisCollectTask.java | 19 +- .../health/collect/NacosCollectTask.java | 11 +- .../health/collect/NetworkCollectTask.java | 2 +- .../health/collect/ThreadCollectTask.java | 4 +- .../health/collect/TomcatCollectTask.java | 2 +- .../configuration/HealthConfiguration.java | 2 - .../cloud/health/warn/DingdingWarn.java | 63 +++++-- .../taotao/cloud/health/warn/MailWarn.java | 31 +++- .../com/taotao/cloud/health/warn/SmsWarn.java | 44 +++-- .../cloud/health/warn/WarnProvider.java | 10 +- .../service/impl/SysResourceServiceImpl.java | 6 + 28 files changed, 565 insertions(+), 357 deletions(-) diff --git a/config/k8s/install.sh b/config/k8s/install.sh index 2da8e3b654..52ed28f7c2 100644 --- a/config/k8s/install.sh +++ b/config/k8s/install.sh @@ -104,10 +104,73 @@ mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config +kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml + +# 当创建单机版的 k8s 时,这个时候 master 节点是默认不允许调度 pod 将master标记为可调度 +kubectl taint nodes --all node-role.kubernetes.io/master- + kubectl get node kubectl get pod --all-namespaces +kubectl describe pod coredns-7f6cbbb7b8-h55vx +kubectl describe pod coredns-7f6cbbb7b8-6rc9d -n kube-system + +#校验集群 +kubectl create deployment nginx --image=nginx +kubectl expose deployment nginx --port=80 --type=NodePort +kubectl get pod,svc + +# 部署Dashboard +https://github.com/kubernetes/dashboard/blob/master/aio/deploy/recommended.yaml + +# 编辑文件 +# 暴露端口的修改如下: +kind: Service +apiVersion: v1 +metadata: + labels: + k8s-app: kubernetes-dashboard + name: kubernetes-dashboard + namespace: kubernetes-dashboard +spec: + #添加 + type: NodePort + ports: + - port: 443 + targetPort: 8443 + # 添加 + nodePort: 30001 + selector: + k8s-app: kubernetes-dashboard + +docker pull kubernetesui/dashboard:v2.3.1 +docker pull kubernetesui/metrics-scraper:v1.0.6 + +kubectl apply -f recommended.yaml -kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml +kubectl get pod --all-namespaces +kubectl get pods -n kube-system -o wide +kubectl get services -n kube-system +netstat -ntlp|grep 30001 + +kubectl create serviceaccount dashboard-admin -n kube-system +kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin +kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}') + +``` +Name: dashboard-admin-token-4xpzq +Namespace: kube-system +Labels: +Annotations: kubernetes.io/service-account.name: dashboard-admin + kubernetes.io/service-account.uid: 3d66d156-bdae-480b-bcdf-0915b2802877 + +Type: kubernetes.io/service-account-token + +Data +==== +ca.crt: 1099 bytes +namespace: 11 bytes +token: eyJhbGciOiJSUzI1NiIsImtpZCI6IncycWZ1aTk1RnBPRHBXeXFXNlRzRWFja2lKUnpNMkE4MWNHMERqZi1UWEkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tNHhwenEiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiM2Q2NmQxNTYtYmRhZS00ODBiLWJjZGYtMDkxNWIyODAyODc3Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.bKM-c4wKlxFwTcEREoxgHnabCCRAVHw_0T02KaM_-xfORY4MtMEudiMavPv9n2jPFzo2UYSppmYM5R4Q_HuPLDf6MVG500VBknzVW2UftTk_Rd-gpNTXHDtbReJYSeR-MPWpWbZ5OfNGp5puAOxqcPBhYNvo2qzlOR5Qsp9SgNONgA3wHr5bguFlC6eiw-mpoqiLZiTbjpYK8o5q6STx23v_TBcgImJ0P6FK2yxmbvC0OpS-QGxnfCOvYVZ1DkPf0MILmBr22JtcPN1BoIbtQeLOi00sLx0Wn01DpEyMygFcU96au_pMD2hqn05Rjwrp5juPxUBLAQ3ri8LLF4uvZQ +``` # error execution phase upload-config/kubelet: Error writing Crisocket information for the control-... swapoff -a @@ -117,3 +180,6 @@ systemctl restart kubelet iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X +docker pull registry.aliyuncs.com/google_containers/coredns:1.8.0 +docker tag registry.aliyuncs.com/google_containers/coredns:1.8.0 registry.aliyuncs.com/google_containers/coredns:v1.8.4 +docker rmi registry.aliyuncs.com/google_containers/coredns:1.8.0 diff --git a/config/rancher/install.sh b/config/rancher/install.sh index bb80f97a3a..c1abd5b388 100644 --- a/config/rancher/install.sh +++ b/config/rancher/install.sh @@ -50,7 +50,6 @@ https://127.0.0.1:2443 ### docker rm `docker ps -a -q` ### docker rmi $(docker images -q) - swapoff -a kubeadm reset systemctl daemon-reload diff --git a/settings.gradle b/settings.gradle index 8c0ca018e4..95a0a39fe4 100644 --- a/settings.gradle +++ b/settings.gradle @@ -46,16 +46,3 @@ for (project in threeLayerProjects) { } } } - -//// gradle生命周期中的钩子方法 -//gradle.settingsEvaluated { -// println 'init phase: settingsEvaluated' -//} -// -//gradle.projectsLoaded { -// println 'init phase: projectsLoaded' -//} -// -//gradle.beforeProject { -// println 'init phase: projectsLoaded' -//} diff --git a/taotao-cloud-microservice/taotao-cloud-gateway/src/main/java/com/taotao/cloud/gateway/configuration/RouterFunctionConfiguration.java b/taotao-cloud-microservice/taotao-cloud-gateway/src/main/java/com/taotao/cloud/gateway/configuration/RouterFunctionConfiguration.java index 0821b94a62..cde276242a 100644 --- a/taotao-cloud-microservice/taotao-cloud-gateway/src/main/java/com/taotao/cloud/gateway/configuration/RouterFunctionConfiguration.java +++ b/taotao-cloud-microservice/taotao-cloud-gateway/src/main/java/com/taotao/cloud/gateway/configuration/RouterFunctionConfiguration.java @@ -74,9 +74,6 @@ public RouterFunction routerFunction( .and(RequestPredicates.accept(MediaType.IMAGE_PNG)), faviconHandler); } - public class HealthReport(){ - - } /** * Hystrix 降级处理 diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-cloud/src/main/java/com/taotao/cloud/core/model/Collector.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-cloud/src/main/java/com/taotao/cloud/core/model/Collector.java index 441234e4bf..af35f33f30 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-cloud/src/main/java/com/taotao/cloud/core/model/Collector.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-cloud/src/main/java/com/taotao/cloud/core/model/Collector.java @@ -16,6 +16,7 @@ package com.taotao.cloud.core.model; import com.taotao.cloud.common.exception.BaseException; +import com.taotao.cloud.common.utils.ContextUtil; import com.taotao.cloud.common.utils.LogUtil; import com.taotao.cloud.common.utils.NumberUtil; import com.taotao.cloud.core.model.Callable.Func0; @@ -41,7 +42,11 @@ */ public class Collector { - private CoreProperties coreProperties; + private final CoreProperties coreProperties; + + public static Collector getCollector() { + return ContextUtil.getBean(Collector.class, true); + } /** * map diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-common/src/main/java/com/taotao/cloud/common/utils/ReflectionUtil.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-common/src/main/java/com/taotao/cloud/common/utils/ReflectionUtil.java index 18d0078c45..fe7d33198a 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-common/src/main/java/com/taotao/cloud/common/utils/ReflectionUtil.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-common/src/main/java/com/taotao/cloud/common/utils/ReflectionUtil.java @@ -17,6 +17,7 @@ import com.taotao.cloud.common.exception.BaseException; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** @@ -90,6 +91,30 @@ public static Method findMethod(Class cls, String methodName) { return find; } + /** + * 通过枚举名称获取枚举对象 + * + * @param cls 枚举类 + * @param methodName 方法名称 + * @param name name 枚举名称 区分大小写 必须完全一样 + * @return {@link java.lang.Object } + * @author shuigedeng + * @since 2021-09-15 15:56:01 + */ + public static Object findEnumObjByName(Class cls, String methodName, String name) + throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Object[] objects = cls.getEnumConstants(); + Method method = cls.getMethod(methodName); + for (Object object : objects) { + Object invoke = method.invoke(object); + if (invoke.equals(name)) { + return object; + } + } + return null; + } + + /** * 获取类中方法 * diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/build.gradle b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/build.gradle index 87b97b04eb..e32f8d0260 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/build.gradle +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/build.gradle @@ -1,8 +1,8 @@ dependencies { api project(':taotao-cloud-microservice:taotao-cloud-starter:taotao-cloud-starter-cloud') - api project(':taotao-cloud-microservice:taotao-cloud-starter:taotao-cloud-starter-dingtalk') - api project(':taotao-cloud-microservice:taotao-cloud-starter:taotao-cloud-starter-mail') - api project(':taotao-cloud-microservice:taotao-cloud-starter:taotao-cloud-starter-sms') +// api project(':taotao-cloud-microservice:taotao-cloud-starter:taotao-cloud-starter-dingtalk') +// api project(':taotao-cloud-microservice:taotao-cloud-starter:taotao-cloud-starter-mail') +// api project(':taotao-cloud-microservice:taotao-cloud-starter:taotao-cloud-starter-sms') // api 'com.dianping.cat:cat-client:3.0.0' api 'net.logstash.logback:logstash-logback-encoder' diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/AsyncThreadPoolCollectTask.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/AsyncThreadPoolCollectTask.java index 9664b6f1c9..2ff69676a7 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/AsyncThreadPoolCollectTask.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/AsyncThreadPoolCollectTask.java @@ -24,6 +24,7 @@ import com.taotao.cloud.health.annotation.FieldReport; import com.taotao.cloud.health.model.CollectInfo; import com.taotao.cloud.health.properties.CollectTaskProperties; +import java.util.Objects; /** * MonitorThreadPoolCollectTask @@ -36,11 +37,9 @@ public class AsyncThreadPoolCollectTask extends AbstractCollectTask { private static final String TASK_NAME = "taotao.cloud.health.collect.executor.async"; - private CollectTaskProperties properties; - private Collector collector; + private final CollectTaskProperties properties; - public AsyncThreadPoolCollectTask(Collector collector, CollectTaskProperties properties) { - this.collector = collector; + public AsyncThreadPoolCollectTask(CollectTaskProperties properties) { this.properties = properties; } @@ -51,7 +50,7 @@ public int getTimeSpan() { @Override public String getDesc() { - return this.getClass().getName(); + return getClass().getName(); } @Override @@ -67,71 +66,74 @@ public boolean getEnabled() { @Override protected CollectInfo getData() { try { + Collector collector = Collector.getCollector(); AsyncThreadPoolProperties asyncThreadPoolProperties = ContextUtil.getBean( - AsyncThreadPoolProperties.class, false); - String threadNamePrefix = asyncThreadPoolProperties.getThreadNamePrefix(); - String asyncThreadName = threadNamePrefix.replace("-", "."); - - AsyncThreadPoolInfo info = new AsyncThreadPoolInfo(); - info.systemActiveCount = - (Integer) this.collector.call(asyncThreadName + ".active.count").run(); - info.systemCorePoolSize = - (Integer) this.collector.call(asyncThreadName + ".core.poolSize").run(); - info.systemPoolSizeLargest = - (Integer) this.collector.call(asyncThreadName + ".poolSize.largest").run(); - info.systemPoolSizeMax = - (Integer) this.collector.call(asyncThreadName + ".poolSize.max").run(); - info.systemPoolSizeCount = - (Integer) this.collector.call(asyncThreadName + ".poolSize.count").run(); - info.systemQueueSize = - (Integer) this.collector.call(asyncThreadName + ".queue.size").run(); - info.systemTaskCount = - (Long) this.collector.call(asyncThreadName + ".task.count").run(); - info.systemTaskCompleted = - (Long) this.collector.call(asyncThreadName + ".task.completed").run(); - - Hook hook = this.collector.hook(asyncThreadName + ".hook"); - info.systemTaskHookCurrent = hook.getCurrent(); - info.systemTaskHookError = hook.getLastErrorPerSecond(); - info.systemTaskHookSuccess = hook.getLastSuccessPerSecond(); - info.systemTaskHookList = hook.getMaxTimeSpanList().toText(); - info.systemTaskHookListPerMinute = hook.getMaxTimeSpanListPerMinute().toText(); - return info; + AsyncThreadPoolProperties.class, true); + + if (Objects.nonNull(collector) && Objects.nonNull(asyncThreadPoolProperties)) { + + String asyncThreadName = asyncThreadPoolProperties. + getThreadNamePrefix().replace("-", "."); + + AsyncExecutorCollectInfo info = new AsyncExecutorCollectInfo(); + info.asyncExecutorActiveCount = + (Integer) collector.call(asyncThreadName + ".active.count").run(); + info.asyncExecutorCorePoolSize = + (Integer) collector.call(asyncThreadName + ".core.poolSize").run(); + info.asyncExecutorPoolSizeLargest = + (Integer) collector.call(asyncThreadName + ".poolSize.largest").run(); + info.asyncExecutorPoolSizeMax = + (Integer) collector.call(asyncThreadName + ".poolSize.max").run(); + info.asyncExecutorPoolSizeCount = + (Integer) collector.call(asyncThreadName + ".poolSize.count").run(); + info.asyncExecutorQueueSize = + (Integer) collector.call(asyncThreadName + ".queue.size").run(); + info.asyncExecutorTaskCount = + (Long) collector.call(asyncThreadName + ".task.count").run(); + info.asyncExecutorTaskCompleted = + (Long) collector.call(asyncThreadName + ".task.completed").run(); + + Hook hook = collector.hook(asyncThreadName + ".hook"); + info.asyncExecutorTaskHookCurrent = hook.getCurrent(); + info.asyncExecutorTaskHookError = hook.getLastErrorPerSecond(); + info.asyncExecutorTaskHookSuccess = hook.getLastSuccessPerSecond(); + info.asyncExecutorTaskHookList = hook.getMaxTimeSpanList().toText(); + info.asyncExecutorTaskHookListPerMinute = hook.getMaxTimeSpanListPerMinute().toText(); + return info; + } } catch (Exception e) { LogUtil.error(e); } return null; } - - private static class AsyncThreadPoolInfo implements CollectInfo { - - @FieldReport(name = TASK_NAME + ".active.count", desc = "系统线程池活动线程数") - private Integer systemActiveCount = 0; - @FieldReport(name = TASK_NAME + ".core.poolSize", desc = "系统线程池核心线程数") - private Integer systemCorePoolSize = 0; - @FieldReport(name = TASK_NAME + ".poolSize.largest", desc = "线程池历史最大线程数") - private Integer systemPoolSizeLargest = 0; - @FieldReport(name = TASK_NAME + ".poolSize.max", desc = "线程池最大线程数") - private Integer systemPoolSizeMax = 0; - @FieldReport(name = TASK_NAME + ".poolSize.count", desc = "线程池当前线程数") - private Integer systemPoolSizeCount = 0; - @FieldReport(name = TASK_NAME + ".queue.size", desc = "线程池当前排队等待任务数") - private Integer systemQueueSize = 0; - @FieldReport(name = TASK_NAME + ".task.count", desc = "线程池历史任务数") - private Long systemTaskCount = 0L; - @FieldReport(name = TASK_NAME + ".task.completed", desc = "线程池已完成任务数") - private Long systemTaskCompleted = 0L; - @FieldReport(name = TASK_NAME + ".task.hook.error", desc = "线程池拦截上一次每秒出错次数") - private Long systemTaskHookError = 0L; - @FieldReport(name = TASK_NAME + ".task.hook.success", desc = "线程池拦截上一次每秒成功次数") - private Long systemTaskHookSuccess = 0L; - @FieldReport(name = TASK_NAME + ".task.hook.current", desc = "线程池拦截当前执行任务数") - private Long systemTaskHookCurrent = 0L; - @FieldReport(name = TASK_NAME + ".task.hook.list.detail", desc = "线程池拦截历史最大耗时任务列表") - private String systemTaskHookList = ""; - @FieldReport(name = TASK_NAME - + ".task.hook.list.minute.detail", desc = "线程池拦截历史最大耗时任务列表(每分钟)") - private String systemTaskHookListPerMinute = ""; + private static class AsyncExecutorCollectInfo implements CollectInfo { + + @FieldReport(name = TASK_NAME + ".active.count", desc = "异步核心线程池活动线程数") + private Integer asyncExecutorActiveCount = 0; + @FieldReport(name = TASK_NAME + ".core.poolSize", desc = "异步核心线程池核心线程数") + private Integer asyncExecutorCorePoolSize = 0; + @FieldReport(name = TASK_NAME + ".poolSize.largest", desc = "异步核心线程池历史最大线程数") + private Integer asyncExecutorPoolSizeLargest = 0; + @FieldReport(name = TASK_NAME + ".poolSize.max", desc = "异步核心线程池最大线程数") + private Integer asyncExecutorPoolSizeMax = 0; + @FieldReport(name = TASK_NAME + ".poolSize.count", desc = "异步核心线程池当前线程数") + private Integer asyncExecutorPoolSizeCount = 0; + @FieldReport(name = TASK_NAME + ".queue.size", desc = "异步核心线程池当前排队等待任务数") + private Integer asyncExecutorQueueSize = 0; + @FieldReport(name = TASK_NAME + ".task.count", desc = "异步核心线程池历史任务数") + private Long asyncExecutorTaskCount = 0L; + @FieldReport(name = TASK_NAME + ".task.completed", desc = "异步核心线程池已完成任务数") + private Long asyncExecutorTaskCompleted = 0L; + @FieldReport(name = TASK_NAME + ".task.hook.error", desc = "异步核心线程池拦截上一次每秒出错次数") + private Long asyncExecutorTaskHookError = 0L; + @FieldReport(name = TASK_NAME + ".task.hook.success", desc = "异步核心线程池拦截上一次每秒成功次数") + private Long asyncExecutorTaskHookSuccess = 0L; + @FieldReport(name = TASK_NAME + ".task.hook.current", desc = "异步核心线程池拦截当前执行任务数") + private Long asyncExecutorTaskHookCurrent = 0L; + @FieldReport(name = TASK_NAME + ".task.hook.list.detail", desc = "异步核心线程池拦截历史最大耗时任务列表") + private String asyncExecutorTaskHookList = ""; + @FieldReport(name = TASK_NAME + ".task.hook.list.minute.detail", desc = "异步核心线程池拦截历史最大耗时任务列表(每分钟)") + private String asyncExecutorTaskHookListPerMinute = ""; } } diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/CpuCollectTask.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/CpuCollectTask.java index 8028334ab6..f17032f3a0 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/CpuCollectTask.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/CpuCollectTask.java @@ -33,11 +33,11 @@ public class CpuCollectTask extends AbstractCollectTask { private static final String TASK_NAME = "taotao.cloud.health.collect.cpu"; - private OperatingSystemMXBean sysembean; - private CollectTaskProperties properties; + private final OperatingSystemMXBean systemBean; + private final CollectTaskProperties properties; public CpuCollectTask(CollectTaskProperties properties) { - this.sysembean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); + this.systemBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); this.properties = properties; } @@ -65,15 +65,15 @@ public boolean getEnabled() { protected CollectInfo getData() { try { CpuInfo info = new CpuInfo(); - info.processCpuLoad = sysembean.getProcessCpuLoad(); - info.systemCpuLoad = sysembean.getSystemCpuLoad(); + info.processCpuLoad = systemBean.getProcessCpuLoad(); + info.systemCpuLoad = systemBean.getSystemCpuLoad(); - info.committedVirtualMemorySize = sysembean.getCommittedVirtualMemorySize(); - info.totalSwapSpaceSize = sysembean.getTotalSwapSpaceSize(); - info.freeSwapSpaceSize = sysembean.getFreeSwapSpaceSize(); - info.processCpuTime = sysembean.getProcessCpuTime(); - info.freePhysicalMemorySize = sysembean.getFreePhysicalMemorySize(); - info.totalPhysicalMemorySize = sysembean.getTotalPhysicalMemorySize(); + info.committedVirtualMemorySize = systemBean.getCommittedVirtualMemorySize(); + info.totalSwapSpaceSize = systemBean.getTotalSwapSpaceSize(); + info.freeSwapSpaceSize = systemBean.getFreeSwapSpaceSize(); + info.processCpuTime = systemBean.getProcessCpuTime(); + info.freePhysicalMemorySize = systemBean.getFreePhysicalMemorySize(); + info.totalPhysicalMemorySize = systemBean.getTotalPhysicalMemorySize(); info.cpuCoreNumber = Runtime.getRuntime().availableProcessors(); return info; @@ -83,10 +83,10 @@ protected CollectInfo getData() { return null; } - private static class CpuInfo implements CollectInfo{ + private static class CpuInfo implements CollectInfo { @FieldReport(name = TASK_NAME + ".process", desc = "进程cpu负载") - private Double processCpuLoad=0.0; + private Double processCpuLoad = 0.0; @FieldReport(name = TASK_NAME + ".system", desc = "系统cpu负载") private Double systemCpuLoad = 0.0; @FieldReport(name = TASK_NAME + ".committed.virtual.memory.size", desc = "已提交的虚拟内存大小") diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/DataSourceCollectTask.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/DataSourceCollectTask.java index 6847db9b0d..6b7aba1b59 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/DataSourceCollectTask.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/DataSourceCollectTask.java @@ -36,7 +36,7 @@ public class DataSourceCollectTask extends AbstractCollectTask { private static final String TASK_NAME = "taotao.cloud.health.collect.datasource"; - private CollectTaskProperties properties; + private final CollectTaskProperties properties; public DataSourceCollectTask(CollectTaskProperties properties) { this.properties = properties; @@ -66,71 +66,71 @@ public boolean getEnabled() { protected CollectInfo getData() { try { DataSourceInfo info = new DataSourceInfo(); - String[] names = ContextUtil.getApplicationContext() - .getBeanNamesForType(DataSource.class); + String[] names = ContextUtil.getApplicationContext().getBeanNamesForType(DataSource.class); int index = 0; for (String name : names) { - DataSource dataSource = ContextUtil.getApplicationContext() - .getBean(name, DataSource.class); + DataSource dataSource = ContextUtil.getApplicationContext().getBean(name, DataSource.class); - Class druidCls = ReflectionUtil.tryClassForName( - "com.alibaba.druid.pool.DruidDataSource"); + Class druidCls = ReflectionUtil.tryClassForName("com.alibaba.druid.pool.DruidDataSource"); if (druidCls != null && druidCls.isAssignableFrom(dataSource.getClass())) { Field field = ReflectionUtil.findField(info.getClass(), "druid" + index++); if (field != null) { DruidDataSourceInfo druid = new DruidDataSourceInfo(); - druid.active = (Integer) ReflectionUtil.callMethod(dataSource, - "getActiveCount", - null); - druid.connect = (Long) ReflectionUtil.callMethod(dataSource, - "getConnectCount", - null); - druid.poolingCount = (Integer) ReflectionUtil.callMethod(dataSource, - "getPoolingCount", null); - druid.lockQueueLength = (Integer) ReflectionUtil.callMethod(dataSource, - "getLockQueueLength", null); - druid.waitThreadCount = (Integer) ReflectionUtil.callMethod(dataSource, - "getWaitThreadCount", null); - druid.initialSize = (Integer) ReflectionUtil.callMethod(dataSource, - "getInitialSize", null); - druid.maxActive = (Integer) ReflectionUtil.callMethod(dataSource, - "getMaxActive", null); - druid.minIdle = (Integer) ReflectionUtil.callMethod(dataSource, - "getMinIdle", - null); - druid.connectErrorCount = (Long) ReflectionUtil.callMethod(dataSource, - "getConnectErrorCount", null); - druid.createTimeSpan = (Long) ReflectionUtil.callMethod(dataSource, - "getCreateTimespanMillis", null); - druid.closeCount = (Long) ReflectionUtil.callMethod(dataSource, - "getCloseCount", - null); - druid.createCount = (Long) ReflectionUtil.callMethod(dataSource, - "getCreateCount", null); - druid.destroyCount = (Long) ReflectionUtil.callMethod(dataSource, - "getDestroyCount", null); - druid.isSharePreparedStatements = ReflectionUtil.callMethod(dataSource, - "isSharePreparedStatements", null).toString(); - druid.isRemoveAbandoned = ReflectionUtil.callMethod(dataSource, - "isRemoveAbandoned", null).toString(); - druid.removeAbandonedTimeout = (Integer) ReflectionUtil.callMethod( - dataSource, - "getRemoveAbandonedTimeout", null); - druid.removeAbandonedCount = (Long) ReflectionUtil.callMethod(dataSource, - "getRemoveAbandonedCount", null); - druid.rollbackCount = (Long) ReflectionUtil.callMethod(dataSource, - "getRollbackCount", null); - druid.commitCount = (Long) ReflectionUtil.callMethod(dataSource, - "getCommitCount", null); - druid.startTransactionCount = (Long) ReflectionUtil.callMethod(dataSource, - "getStartTransactionCount", null); + druid.active = (Integer) ReflectionUtil.callMethod(dataSource, "getActiveCount", null); + druid.connect = (Long) ReflectionUtil.callMethod(dataSource, "getConnectCount", null); + druid.poolingCount = (Integer) ReflectionUtil.callMethod(dataSource, "getPoolingCount", null); + druid.lockQueueLength = (Integer) ReflectionUtil.callMethod(dataSource, "getLockQueueLength", null); + druid.waitThreadCount = (Integer) ReflectionUtil.callMethod(dataSource, "getWaitThreadCount", null); + druid.initialSize = (Integer) ReflectionUtil.callMethod(dataSource, "getInitialSize", null); + druid.maxActive = (Integer) ReflectionUtil.callMethod(dataSource, "getMaxActive", null); + druid.minIdle = (Integer) ReflectionUtil.callMethod(dataSource, "getMinIdle", null); + druid.connectErrorCount = (Long) ReflectionUtil.callMethod(dataSource, "getConnectErrorCount", null); + druid.createTimeSpan = (Long) ReflectionUtil.callMethod(dataSource, "getCreateTimespanMillis", null); + druid.closeCount = (Long) ReflectionUtil.callMethod(dataSource, "getCloseCount", null); + druid.createCount = (Long) ReflectionUtil.callMethod(dataSource, "getCreateCount", null); + druid.destroyCount = (Long) ReflectionUtil.callMethod(dataSource, "getDestroyCount", null); + druid.isSharePreparedStatements = ReflectionUtil.callMethod(dataSource, "isSharePreparedStatements", null).toString(); + druid.isRemoveAbandoned = ReflectionUtil.callMethod(dataSource, "isRemoveAbandoned", null).toString(); + druid.removeAbandonedTimeout = (Integer) ReflectionUtil.callMethod(dataSource, "getRemoveAbandonedTimeout", null); + druid.removeAbandonedCount = (Long) ReflectionUtil.callMethod(dataSource, "getRemoveAbandonedCount", null); + druid.rollbackCount = (Long) ReflectionUtil.callMethod(dataSource, "getRollbackCount", null); + druid.commitCount = (Long) ReflectionUtil.callMethod(dataSource, "getCommitCount", null); + druid.startTransactionCount = (Long) ReflectionUtil.callMethod(dataSource, "getStartTransactionCount", null); + field.setAccessible(true); ReflectionUtil.setFieldValue(field, info, druid); } } - } + Class hikariCls = ReflectionUtil.tryClassForName("com.zaxxer.hikari.HikariDataSource"); + if (hikariCls != null && hikariCls.isAssignableFrom(dataSource.getClass())) { + Field field = ReflectionUtil.findField(info.getClass(), "hikari"+ index++); + if (field != null) { + HikariDataSourceInfo hikari = new HikariDataSourceInfo(); + Object hikariPoolMXBean = ReflectionUtil.callMethod(dataSource, "getHikariPoolMXBean", null); + Object hikariConfigMXBean = ReflectionUtil.callMethod(dataSource, "getHikariConfigMXBean", null); + + hikari.activeConnections = (Integer)ReflectionUtil.callMethod(hikariPoolMXBean, "getActiveConnections", null); + hikari.idleConnections = (Integer)ReflectionUtil.callMethod(hikariPoolMXBean, "getIdleConnections", null); + hikari.threadsAwaitingConnection = (Integer)ReflectionUtil.callMethod(hikariPoolMXBean, "getThreadsAwaitingConnection", null); + hikari.totalConnections = (Integer)ReflectionUtil.callMethod(hikariPoolMXBean, "getTotalConnections", null); + + hikari.catalog = (String) ReflectionUtil.callMethod(hikariConfigMXBean, "getCatalog", null); + hikari.connectionTimeout = (Long) ReflectionUtil.callMethod(hikariConfigMXBean, "getConnectionTimeout", null); + hikari.idleTimeout = (Long) ReflectionUtil.callMethod(hikariConfigMXBean, "getIdleTimeout", null); + hikari.maxLifetime = (Long) ReflectionUtil.callMethod(hikariConfigMXBean, "getMaxLifetime", null); + hikari.validationTimeout = (Long) ReflectionUtil.callMethod(hikariConfigMXBean, "getValidationTimeout", null); + hikari.leakDetectionThreshold = (Long) ReflectionUtil.callMethod(hikariConfigMXBean, "getLeakDetectionThreshold", null); + hikari.maximumPoolSize = (Integer) ReflectionUtil.callMethod(hikariConfigMXBean, "getMaximumPoolSize", null); + hikari.minimumIdle = (Integer) ReflectionUtil.callMethod(hikariConfigMXBean, "getMinimumIdle", null); + hikari.poolName = (String) ReflectionUtil.callMethod(hikariConfigMXBean, "getPoolName", null); + + field.setAccessible(true); + ReflectionUtil.setFieldValue(field, info, hikari); + } + } + } return info; } catch (Exception e) { LogUtil.error(e); @@ -138,6 +138,34 @@ protected CollectInfo getData() { return null; } + private static class HikariDataSourceInfo implements CollectInfo{ + @FieldReport(name = TASK_NAME + ".hikari.pool.active.connections", desc = "hikari当前活动连接的数量。") + private Integer activeConnections = 0; + @FieldReport(name = TASK_NAME + ".hikari.pool.idle.connections", desc = "hikari当前空闲的连接数。") + private Integer idleConnections = 0; + @FieldReport(name = TASK_NAME + ".hikari.pool.threads.awaiting.connection", desc = "hikari等待连接的线程数") + private Integer threadsAwaitingConnection = 0; + @FieldReport(name = TASK_NAME + ".hikari.pool.total.connections", desc = "hikari连接池中的连接总数") + private Integer totalConnections = 0; + @FieldReport(name = TASK_NAME + ".hikari.pool.catalog", desc = "hikari设置的默认目录名称") + private String catalog = ""; + @FieldReport(name = TASK_NAME + ".hikari.pool.connection.timeout", desc = "hikari等待池中连接的最大毫秒数") + private Long connectionTimeout = 0L; + @FieldReport(name = TASK_NAME + ".hikari.pool.idle.timeout", desc = "hikari允许连接停留的最长时间(以毫秒为单位)") + private Long idleTimeout = 0L; + @FieldReport(name = TASK_NAME + ".hikari.pool.max.lifetime", desc = "hikari连接池中连接的最长生命周期") + private Long maxLifetime = 0L; + @FieldReport(name = TASK_NAME + ".hikari.pool.validation.timeout", desc = "hikari等待连接被验证为的最大毫秒数") + private Long validationTimeout = 0L; + @FieldReport(name = TASK_NAME + ".hikari.pool.leak.detection.threshold", desc = "hikari消息发送之前连接可以离开池的时间量.记录表明可能的连接泄漏") + private Long leakDetectionThreshold = 0L; + @FieldReport(name = TASK_NAME + ".hikari.pool.maximum.pool.size", desc = "hikari HikariCP 将保留在池中的最大连接数,包括空闲和使用中的连接。") + private Integer maximumPoolSize = 0; + @FieldReport(name = TASK_NAME + ".hikari.pool.minimum.idle", desc = "hikari尝试在池中维护的最小空闲连接数。包括空闲和使用中的连接") + private Integer minimumIdle = 0; + @FieldReport(name = TASK_NAME + ".hikari.pool.name", desc = "hikari线程池名称") + private String poolName = ""; + } private static class DataSourceInfo implements CollectInfo { @@ -161,27 +189,39 @@ private static class DataSourceInfo implements CollectInfo { private DruidDataSourceInfo druid8; @FieldReport(name = TASK_NAME + ".druid9.info", desc = "druid9信息") private DruidDataSourceInfo druid9; + + @FieldReport(name = TASK_NAME + ".hikari.info", desc = "hikari0信息") + private HikariDataSourceInfo hikari0; + @FieldReport(name = TASK_NAME + ".hikari.info", desc = "hikari1信息") + private HikariDataSourceInfo hikari1; + @FieldReport(name = TASK_NAME + ".hikari.info", desc = "hikari2信息") + private HikariDataSourceInfo hikari2; + @FieldReport(name = TASK_NAME + ".hikari.info", desc = "hikari3信息") + private HikariDataSourceInfo hikari3; + @FieldReport(name = TASK_NAME + ".hikari.info", desc = "hikari4信息") + private HikariDataSourceInfo hikari4; + @FieldReport(name = TASK_NAME + ".hikari.info", desc = "hikari5信息") + private HikariDataSourceInfo hikari5; + @FieldReport(name = TASK_NAME + ".hikari.info", desc = "hikari6信息") + private HikariDataSourceInfo hikari6; } + private static class DruidDataSourceInfo implements CollectInfo { - @FieldReport(name = TASK_NAME - + ".druid.pool.startTransaction.count", desc = "druid sql 开启事务次数") + @FieldReport(name = TASK_NAME + ".druid.pool.startTransaction.count", desc = "druid sql 开启事务次数") private Long startTransactionCount = 0L; @FieldReport(name = TASK_NAME + ".druid.pool.commit.count", desc = "druid sql commit次数") private Long commitCount = 0L; @FieldReport(name = TASK_NAME + ".druid.pool.rollback.count", desc = "druid sql回滚次数") private Long rollbackCount = 0L; - @FieldReport(name = TASK_NAME - + ".druid.pool.removeAbandoned.count", desc = "druid 连接超时回收次数") + @FieldReport(name = TASK_NAME + ".druid.pool.removeAbandoned.count", desc = "druid 连接超时回收次数") private Long removeAbandonedCount = 0L; - @FieldReport(name = TASK_NAME - + ".druid.pool.removeAbandoned.timeout", desc = "druid 连接超时回收周期(秒)") + @FieldReport(name = TASK_NAME + ".druid.pool.removeAbandoned.timeout", desc = "druid 连接超时回收周期(秒)") private Integer removeAbandonedTimeout = 0; @FieldReport(name = TASK_NAME + ".druid.pool.isRemoveAbandoned", desc = "druid 是否开启连接超时回收") private String isRemoveAbandoned = ""; - @FieldReport(name = TASK_NAME - + ".druid.pool.isSharePreparedStatements", desc = "druid preparedStatement是否缓存") + @FieldReport(name = TASK_NAME + ".druid.pool.isSharePreparedStatements", desc = "druid preparedStatement是否缓存") private String isSharePreparedStatements = ""; @FieldReport(name = TASK_NAME + ".druid.pool.destroy.count", desc = "druid销毁连接次数") private Long destroyCount = 0L; diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/DoubtApiCollectTask.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/DoubtApiCollectTask.java index 1591a838b3..e822ec0ddd 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/DoubtApiCollectTask.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/DoubtApiCollectTask.java @@ -19,11 +19,11 @@ import com.taotao.cloud.core.model.Collector; import com.taotao.cloud.health.annotation.FieldReport; import com.taotao.cloud.health.interceptor.DoubtApiInterceptor; -import com.taotao.cloud.health.interceptor.DoubtApiInterceptor.DoubtApiInfo; import com.taotao.cloud.health.model.CollectInfo; import com.taotao.cloud.health.properties.CollectTaskProperties; import java.util.Arrays; import java.util.Map; +import java.util.Objects; /** * 可疑API采集 @@ -36,11 +36,9 @@ public class DoubtApiCollectTask extends AbstractCollectTask { private static final String TASK_NAME = "taotao.cloud.health.collect.doubtApi"; - private CollectTaskProperties properties; - private Collector collector; + private final CollectTaskProperties properties; - public DoubtApiCollectTask(Collector collector, CollectTaskProperties properties) { - this.collector = collector; + public DoubtApiCollectTask(CollectTaskProperties properties) { this.properties = properties; } @@ -67,39 +65,44 @@ public String getName() { @Override protected CollectInfo getData() { try { - ApiUsedMemoryTopInfo info = new ApiUsedMemoryTopInfo(); - Map map = (Map) collector.value( - "taotao.cloud.health.doubtapi.info").get(); - if (map != null && map.size() > 0) { - DoubtApiInfo[] copy = map.values().toArray(new DoubtApiInfo[map.values().size()]); - Arrays.sort(copy); - - int detailLen = Math.min(copy.length, 5); - StringBuilder sb = new StringBuilder(); - - for (int i = 0; i < detailLen; i++) { - DoubtApiInfo o = copy[i]; - - long avg; - if (o.getCount() > 0) { - avg = o.getTotalIncreMem() / 1024 / 1024 / o.getCount(); - } else { - avg = o.getTotalIncreMem() / 1024 / 1024; + DoubtApiInfo info = new DoubtApiInfo(); + Collector collector = Collector.getCollector(); + if (Objects.nonNull(collector)) { + Object doubtApiInfo = collector.value("taotao.cloud.health.doubtapi.info").get(); + + Map map = (Map) doubtApiInfo; + if (map != null && map.size() > 0) { + DoubtApiInterceptor.DoubtApiInfo[] copy = map.values().toArray(new DoubtApiInterceptor.DoubtApiInfo[map.values().size()]); + Arrays.sort(copy); + + int detailLen = Math.min(copy.length, 5); + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < detailLen; i++) { + DoubtApiInterceptor.DoubtApiInfo o = copy[i]; + + long avg; + if (o.getCount() > 0) { + avg = o.getTotalIncreMem() / 1024 / 1024 / o.getCount(); + } else { + avg = o.getTotalIncreMem() / 1024 / 1024; + } + sb.append(String.format("url:%s,方法:%s,平均内存增量:%s(M),调用次数:%s\r\n", + o.getUri(), + o.getMethod(), + avg, o.getCount())); } - sb.append(String.format("url:%s,方法:%s,平均内存增量:%s(M),调用次数:%s\r\n", o.getUri(), - o.getMethod(), - avg, o.getCount())); + info.detail = sb.toString(); } - info.detail = sb.toString(); + return info; } - return info; } catch (Exception exp) { LogUtil.error(exp); } return null; } - public static class ApiUsedMemoryTopInfo implements CollectInfo{ + public static class DoubtApiInfo implements CollectInfo { @FieldReport(name = TASK_NAME + ".detail", desc = "可疑内存增长api分析报告") String detail = ""; diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/ElkCollectTask.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/ElkCollectTask.java index d8bf638f4a..b1bf69adaa 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/ElkCollectTask.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/ElkCollectTask.java @@ -22,6 +22,7 @@ import com.taotao.cloud.health.annotation.FieldReport; import com.taotao.cloud.health.model.CollectInfo; import com.taotao.cloud.health.properties.CollectTaskProperties; +import java.util.Objects; /** * ELK性能采集 @@ -32,9 +33,11 @@ */ public class ElkCollectTask extends AbstractCollectTask { + private final static String CLASS = "net.logstash.logback.appender.LogstashTcpSocketAppender"; + private static final String TASK_NAME = "taotao.cloud.health.collect.elk"; - private CollectTaskProperties properties; + private final CollectTaskProperties properties; public ElkCollectTask(CollectTaskProperties properties) { this.properties = properties; @@ -63,28 +66,48 @@ public String getName() { @Override protected CollectInfo getData() { try { - Object appender = ContextUtil.getBean(ReflectionUtil.tryClassForName( - "net.logstash.logback.appender.LogstashTcpSocketAppender"), false); - if (appender == null) { - return null; + ElkInfo info = new ElkInfo(); + Object appender = ContextUtil.getBean(ReflectionUtil.tryClassForName(CLASS), true); + if (Objects.nonNull(appender)) { + info.queueSize = ReflectionUtil.tryGetValue(appender, "getQueueSize"); + info.consecutiveDropped = ReflectionUtil.tryGetValue(appender, "consecutiveDroppedCount.get"); + info.getDroppedWarnFrequency = ReflectionUtil.tryGetValue(appender, "getDroppedWarnFrequency"); + info.getKeepAliveDuration = ReflectionUtil.tryGetValue(appender, "getKeepAliveDuration.getMilliseconds"); + info.getProducerType = ReflectionUtil.tryGetValue(appender, "getProducerType.name"); + info.getReconnectionDelay = ReflectionUtil.tryGetValue(appender, "getReconnectionDelay.getMilliseconds"); + info.getRingBufferSize = ReflectionUtil.tryGetValue(appender, "getRingBufferSize"); + info.getSecondaryConnectionTTL = ReflectionUtil.tryGetValue(appender, "getSecondaryConnectionTTL.getMilliseconds"); + info.getWriteTimeout = ReflectionUtil.tryGetValue(appender, "getWriteTimeout.getMilliseconds"); + info.getWriteBufferSize = ReflectionUtil.tryGetValue(appender, "getWriteBufferSize"); + return info; } - - ElkInfo data = new ElkInfo(); - data.queueSize = ReflectionUtil.tryGetValue(appender, "getQueueSize"); - data.consecutiveDropped = ReflectionUtil.tryGetValue(appender, - "consecutiveDroppedCount.get"); - return data; } catch (Exception e) { LogUtil.error(e); } return null; } - private static class ElkInfo implements CollectInfo{ + private static class ElkInfo implements CollectInfo { @FieldReport(name = TASK_NAME + ".queue.size", desc = "ELK消息队列大小") - private Integer queueSize = 0; - @FieldReport(name = TASK_NAME + ".consecutiveDropped", desc = "ELK消息连续丢弃数量") + private Integer queueSize = 0; + @FieldReport(name = TASK_NAME + ".consecutive.dropped", desc = "ELK消息连续丢弃数量") private Long consecutiveDropped = 0L; + @FieldReport(name = TASK_NAME + ".dropped.warn.frequency", desc = "ELK下降警告频率") + private Integer getDroppedWarnFrequency = 0; + @FieldReport(name = TASK_NAME + ".keep.alive.duration", desc = "ELK保持活动持续时间") + private Long getKeepAliveDuration = 0L; + @FieldReport(name = TASK_NAME + ".producer.type", desc = "ELK生产者类型") + private String getProducerType = ""; + @FieldReport(name = TASK_NAME + ".reconnection.delay", desc = "ELK在与目标的连接失败后,在尝试重新连接到该目标之前等待的时间段") + private Long getReconnectionDelay = 0L; + @FieldReport(name = TASK_NAME + ".ring.buffer.size", desc = "ELK RingBuffer大小") + private Integer getRingBufferSize = 0; + @FieldReport(name = TASK_NAME + ".secondary.connection.ttL", desc = "ELK辅助连接 TTL大小") + private Long getSecondaryConnectionTTL = 0L; + @FieldReport(name = TASK_NAME + ".write.timeout", desc = "ELK在超时之前等待写入完成的时间段.并尝试重新连接到该目的地。") + private Long getWriteTimeout = 0L; + @FieldReport(name = TASK_NAME + ".write.buffer.size", desc = "ELK消写入缓冲区中可用的字节数") + private Integer getWriteBufferSize = 0; } } diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/HealthCheckProvider.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/HealthCheckProvider.java index 8ef0748bb4..1a96fe4c4f 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/HealthCheckProvider.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/HealthCheckProvider.java @@ -19,7 +19,6 @@ import com.taotao.cloud.common.utils.LogUtil; import com.taotao.cloud.common.utils.StringUtil; import com.taotao.cloud.core.http.DefaultHttpClient; -import com.taotao.cloud.core.model.Collector; import com.taotao.cloud.core.monitor.MonitorThreadPool; import com.taotao.cloud.health.enums.WarnTypeEnum; import com.taotao.cloud.health.model.Report; @@ -40,11 +39,10 @@ public class HealthCheckProvider implements AutoCloseable { protected List checkTasks = new ArrayList<>(); protected DefaultWarnStrategy strategy; - private boolean isclose; + private boolean close; private CollectTaskProperties properties; private HealthProperties healthProperties; private MonitorThreadPool monitorThreadPool; - private Collector collector; private DefaultHttpClient defaultHttpClient; public void registerCollectTask(AbstractCollectTask task) { @@ -54,13 +52,11 @@ public void registerCollectTask(AbstractCollectTask task) { public HealthCheckProvider( DefaultWarnStrategy strategy, DefaultHttpClient defaultHttpClient, - Collector collector, CollectTaskProperties properties, HealthProperties healthProperties, MonitorThreadPool monitorThreadPool) { this.strategy = strategy; - this.collector = collector; - this.isclose = false; + this.close = false; this.properties = properties; this.healthProperties = healthProperties; this.monitorThreadPool = monitorThreadPool; @@ -71,10 +67,10 @@ public HealthCheckProvider( registerCollectTask(new MemoryCollectTask(properties)); registerCollectTask(new ThreadCollectTask(properties)); registerCollectTask(new UnCatchExceptionCollectTask(properties)); - registerCollectTask(new MonitorThreadPoolCollectTask(collector, properties)); - registerCollectTask(new AsyncThreadPoolCollectTask(collector, properties)); + registerCollectTask(new MonitorThreadPoolCollectTask(properties)); + registerCollectTask(new AsyncThreadPoolCollectTask(properties)); //registerCollectTask(new BsfEurekaCollectTask()); - registerCollectTask(new MybatisCollectTask(collector, properties)); + registerCollectTask(new MybatisCollectTask(properties)); registerCollectTask(new DataSourceCollectTask(properties)); registerCollectTask(new TomcatCollectTask(properties)); //registerCollectTask(new JedisCollectTask(properties)); @@ -86,12 +82,12 @@ public HealthCheckProvider( //registerCollectTask(new CatCollectTask()); //registerCollectTask(new ElasticSearchCollectTask()); registerCollectTask(new ElkCollectTask(properties)); - registerCollectTask(new DoubtApiCollectTask(collector, properties)); - registerCollectTask(new LogStatisticCollectTask(collector, properties)); - registerCollectTask(new NacosCollectTask(collector, properties)); + registerCollectTask(new DoubtApiCollectTask(properties)); + registerCollectTask(new LogStatisticCollectTask(properties)); + registerCollectTask(new NacosCollectTask(properties)); monitorThreadPool.monitorSubmit("系统任务: HealthCheckProvider 采集任务", () -> { - while (!monitorThreadPool.monitorIsShutdown() && !isclose) { + while (!monitorThreadPool.monitorIsShutdown() && !close) { try { Report report = getReport(false); String text = strategy.analyseText(report); @@ -152,7 +148,7 @@ public Report getReport(boolean isAnalyse) { @Override public void close() { - isclose = true; + close = true; for (AbstractCollectTask task : checkTasks) { try { task.close(); @@ -180,12 +176,12 @@ public void setStrategy(DefaultWarnStrategy strategy) { this.strategy = strategy; } - public boolean isIsclose() { - return isclose; + public boolean isClose() { + return close; } - public void setIsclose(boolean isclose) { - this.isclose = isclose; + public void setClose(boolean close) { + this.close = close; } public CollectTaskProperties getProperties() { @@ -212,15 +208,6 @@ public void setMonitorThreadPool(MonitorThreadPool monitorThreadPool) { this.monitorThreadPool = monitorThreadPool; } - public Collector getCollector() { - return collector; - } - - public void setCollector(Collector collector) { - this.collector = collector; - } - - public DefaultHttpClient getDefaultHttpClient() { return defaultHttpClient; } diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/HttpPoolCollectTask.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/HttpPoolCollectTask.java index 0818143c70..6bfb8cc661 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/HttpPoolCollectTask.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/HttpPoolCollectTask.java @@ -35,9 +35,10 @@ * @since 2021-09-10 17:44:20 */ public class HttpPoolCollectTask extends AbstractCollectTask { + private static final String TASK_NAME = "taotao.cloud.health.collect.httpPool"; - private CollectTaskProperties properties; + private final CollectTaskProperties properties; public HttpPoolCollectTask(CollectTaskProperties properties) { this.properties = properties; @@ -67,22 +68,22 @@ public String getName() { protected CollectInfo getData() { try { HttpClientManager httpClientManager = ContextUtil.getBean(HttpClientManager.class, - false); + true); ConcurrentHashMap pool = httpClientManager.getPool(); if (pool == null || pool.isEmpty()) { return null; } - HttpPoolInfo data = new HttpPoolInfo(); + HttpPoolInfo info = new HttpPoolInfo(); StringBuilder detail = new StringBuilder(); pool.forEach((id, client) -> { PoolingHttpClientConnectionManager manager = ReflectionUtil.getFieldValue(client, "manager"); PoolStats stats = manager.getTotalStats(); - data.availableCount += stats.getAvailable(); - data.pendingCount += stats.getPending(); - data.leasedCount += stats.getLeased(); + info.availableCount += stats.getAvailable(); + info.pendingCount += stats.getPending(); + info.leasedCount += stats.getLeased(); detail.append(String.format("[Client连接池:%s]\r\n", id)); detail.append(String.format("路由数:%s\r\n", manager.getRoutes())); @@ -92,15 +93,15 @@ protected CollectInfo getData() { detail.append(String.format("等待的连接数:%s\r\n", stats.getPending())); detail.append(String.format("使用中的连接数:%s\r\n", stats.getLeased())); }); - data.poolDetail = detail.toString(); - return data; + info.poolDetail = detail.toString(); + return info; } catch (Exception e) { LogUtil.error(e); } return null; } - private static class HttpPoolInfo implements CollectInfo{ + private static class HttpPoolInfo implements CollectInfo { @FieldReport(name = TASK_NAME + ".available", desc = "HttpPool可用的连接数") private Integer availableCount = 0; diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/LogStatisticCollectTask.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/LogStatisticCollectTask.java index c7b405e0eb..ec916ffd03 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/LogStatisticCollectTask.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/LogStatisticCollectTask.java @@ -4,6 +4,7 @@ import com.taotao.cloud.health.annotation.FieldReport; import com.taotao.cloud.health.model.CollectInfo; import com.taotao.cloud.health.properties.CollectTaskProperties; +import java.util.Objects; import java.util.concurrent.atomic.AtomicLong; /** @@ -17,11 +18,9 @@ public class LogStatisticCollectTask extends AbstractCollectTask { private static final String TASK_NAME = "taotao.cloud.health.collect.logStatistic"; - private CollectTaskProperties properties; - private Collector collector; + private final CollectTaskProperties properties; - public LogStatisticCollectTask(Collector collector, CollectTaskProperties properties) { - this.collector = collector; + public LogStatisticCollectTask(CollectTaskProperties properties) { this.properties = properties; } @@ -48,30 +47,35 @@ public String getName() { @Override protected CollectInfo getData() { try { - LogErrorInfo data = new LogErrorInfo(); - data.logerrorCount = - this.collector.value("taotao.cloud.health.collect.log.error.count").get() == null - ? 0 - : ((AtomicLong) (this.collector.value( - "taotao.cloud.health.collect.log.error.count") - .get())).intValue(); - data.logIncreCount = - this.collector.value("taotao.cloud.health.collect.log.incre.count").get() == null - ? 0 - : ((AtomicLong) (this.collector.value( - "taotao.cloud.health.collect.log.incre.count") - .get())).intValue(); - return data; + LogErrorInfo info = new LogErrorInfo(); + Collector collector = Collector.getCollector(); + if (Objects.nonNull(collector)) { + info.logerrorCount = + collector.value("taotao.cloud.health.collect.log.error.count").get() + == null + ? 0 + : ((AtomicLong) (collector.value( + "taotao.cloud.health.collect.log.error.count") + .get())).intValue(); + info.logIncreCount = + collector.value("taotao.cloud.health.collect.log.incre.count").get() + == null + ? 0 + : ((AtomicLong) (collector.value( + "taotao.cloud.health.collect.log.incre.count") + .get())).intValue(); + return info; + } } catch (Exception e) { e.printStackTrace(); } return null; } - private static class LogErrorInfo implements CollectInfo{ + private static class LogErrorInfo implements CollectInfo { @FieldReport(name = TASK_NAME + ".error.count", desc = "最近1分钟错误日志数量") - private Integer logerrorCount = 0; + private Integer logerrorCount = 0; @FieldReport(name = TASK_NAME + ".incre.count", desc = "最近1分钟日志条数增量") private Integer logIncreCount = 0; } diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/MemoryCollectTask.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/MemoryCollectTask.java index b2e5f4cec1..8cd359a3eb 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/MemoryCollectTask.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/MemoryCollectTask.java @@ -37,8 +37,8 @@ public class MemoryCollectTask extends AbstractCollectTask { private static final String TASK_NAME = "taotao.cloud.health.collect.memory"; - private OperatingSystemMXBean systemMXBean; - private CollectTaskProperties properties; + private final OperatingSystemMXBean systemMXBean; + private final CollectTaskProperties properties; public MemoryCollectTask(CollectTaskProperties properties) { this.systemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/MonitorThreadPoolCollectTask.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/MonitorThreadPoolCollectTask.java index dd46067da7..6aa190daee 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/MonitorThreadPoolCollectTask.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/MonitorThreadPoolCollectTask.java @@ -24,6 +24,7 @@ import com.taotao.cloud.health.annotation.FieldReport; import com.taotao.cloud.health.model.CollectInfo; import com.taotao.cloud.health.properties.CollectTaskProperties; +import java.util.Objects; /** * MonitorThreadPoolCollectTask @@ -36,11 +37,9 @@ public class MonitorThreadPoolCollectTask extends AbstractCollectTask { private static final String TASK_NAME = "taotao.cloud.health.collect.executor.monitor"; - private CollectTaskProperties properties; - private Collector collector; + private final CollectTaskProperties properties; - public MonitorThreadPoolCollectTask(Collector collector, CollectTaskProperties properties) { - this.collector = collector; + public MonitorThreadPoolCollectTask(CollectTaskProperties properties) { this.properties = properties; } @@ -67,36 +66,40 @@ public boolean getEnabled() { @Override protected CollectInfo getData() { try { + Collector collector = Collector.getCollector(); MonitorThreadPoolProperties monitorThreadPoolProperties = ContextUtil.getBean( MonitorThreadPoolProperties.class, false); - String threadNamePrefix = monitorThreadPoolProperties.getThreadNamePrefix(); - String monitorThreadName = threadNamePrefix.replace("-", "."); - - MonitorThreadPoolInfo info = new MonitorThreadPoolInfo(); - info.systemActiveCount = - (Integer) collector.call(monitorThreadName + ".active.count").run(); - info.systemCorePoolSize = - (Integer) collector.call(monitorThreadName + ".core.poolSize").run(); - info.systemPoolSizeLargest = - (Integer) collector.call(monitorThreadName + ".poolSize.largest").run(); - info.systemPoolSizeMax = - (Integer) collector.call(monitorThreadName + ".poolSize.max").run(); - info.systemPoolSizeCount = - (Integer) collector.call(monitorThreadName + ".poolSize.count").run(); - info.systemQueueSize = - (Integer) collector.call(monitorThreadName + ".queue.size").run(); - info.systemTaskCount = - (Long) collector.call(monitorThreadName + ".task.count").run(); - info.systemTaskCompleted = - (Long) collector.call(monitorThreadName + ".task.completed").run(); - - Hook hook = this.collector.hook(monitorThreadName + ".hook"); - info.systemTaskHookCurrent = hook.getCurrent(); - info.systemTaskHookError = hook.getLastErrorPerSecond(); - info.systemTaskHookSuccess = hook.getLastSuccessPerSecond(); - info.systemTaskHookList = hook.getMaxTimeSpanList().toText(); - info.systemTaskHookListPerMinute = hook.getMaxTimeSpanListPerMinute().toText(); - return info; + + if(Objects.nonNull(collector) && Objects.nonNull(monitorThreadPoolProperties)){ + String threadNamePrefix = monitorThreadPoolProperties.getThreadNamePrefix(); + String monitorThreadName = threadNamePrefix.replace("-", "."); + + MonitorThreadPoolInfo info = new MonitorThreadPoolInfo(); + info.systemActiveCount = + (Integer) collector.call(monitorThreadName + ".active.count").run(); + info.systemCorePoolSize = + (Integer) collector.call(monitorThreadName + ".core.poolSize").run(); + info.systemPoolSizeLargest = + (Integer) collector.call(monitorThreadName + ".poolSize.largest").run(); + info.systemPoolSizeMax = + (Integer) collector.call(monitorThreadName + ".poolSize.max").run(); + info.systemPoolSizeCount = + (Integer) collector.call(monitorThreadName + ".poolSize.count").run(); + info.systemQueueSize = + (Integer) collector.call(monitorThreadName + ".queue.size").run(); + info.systemTaskCount = + (Long) collector.call(monitorThreadName + ".task.count").run(); + info.systemTaskCompleted = + (Long) collector.call(monitorThreadName + ".task.completed").run(); + + Hook hook = collector.hook(monitorThreadName + ".hook"); + info.systemTaskHookCurrent = hook.getCurrent(); + info.systemTaskHookError = hook.getLastErrorPerSecond(); + info.systemTaskHookSuccess = hook.getLastSuccessPerSecond(); + info.systemTaskHookList = hook.getMaxTimeSpanList().toText(); + info.systemTaskHookListPerMinute = hook.getMaxTimeSpanListPerMinute().toText(); + return info; + } } catch (Exception e) { LogUtil.error(e); } diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/MybatisCollectTask.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/MybatisCollectTask.java index 97ca54499c..5aca22e66f 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/MybatisCollectTask.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/MybatisCollectTask.java @@ -22,6 +22,7 @@ import com.taotao.cloud.health.annotation.FieldReport; import com.taotao.cloud.health.model.CollectInfo; import com.taotao.cloud.health.properties.CollectTaskProperties; +import java.util.Objects; /** * MybatisCollectTask @@ -34,11 +35,9 @@ public class MybatisCollectTask extends AbstractCollectTask { private static final String TASK_NAME = "taotao.cloud.health.collect.mybatis"; - private CollectTaskProperties properties; - private Collector collector; + private final CollectTaskProperties properties; - public MybatisCollectTask(Collector collector, CollectTaskProperties properties) { - this.collector = collector; + public MybatisCollectTask(CollectTaskProperties properties) { this.properties = properties; } @@ -67,22 +66,23 @@ protected CollectInfo getData() { try { SqlMybatisInfo info = new SqlMybatisInfo(); - Hook hook = this.collector.hook("taotao.cloud.health.collect.mybatis.sql.hook"); - if (hook != null) { + Collector collector = Collector.getCollector(); + if (Objects.nonNull(collector)) { + Hook hook = collector.hook("taotao.cloud.health.collect.mybatis.sql.hook"); info.hookCurrent = hook.getCurrent(); info.hookError = hook.getLastErrorPerSecond(); info.hookSuccess = hook.getLastSuccessPerSecond(); info.hookList = hook.getMaxTimeSpanList().toText(); info.hookListPerMinute = hook.getMaxTimeSpanListPerMinute().toText(); + return info; } - return info; } catch (Exception e) { LogUtil.error(e); } return null; } - private static class SqlMybatisInfo implements CollectInfo{ + private static class SqlMybatisInfo implements CollectInfo { @FieldReport(name = TASK_NAME + ".sql.hook.error", desc = "mybatis 拦截上一次每秒出错次数") private Long hookError = 0L; @@ -92,7 +92,8 @@ private static class SqlMybatisInfo implements CollectInfo{ private Long hookCurrent = 0L; @FieldReport(name = TASK_NAME + ".sql.hook.list.detail", desc = "mybatis 拦截历史最大耗时任务列表") private String hookList = ""; - @FieldReport(name = TASK_NAME + ".sql.hook.list.minute.detail", desc = "mybatis 拦截历史最大耗时任务列表(每分钟)") + @FieldReport(name = TASK_NAME + + ".sql.hook.list.minute.detail", desc = "mybatis 拦截历史最大耗时任务列表(每分钟)") private String hookListPerMinute = ""; } diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/NacosCollectTask.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/NacosCollectTask.java index 9fa2a2d0a2..55ac2a6f61 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/NacosCollectTask.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/NacosCollectTask.java @@ -32,13 +32,9 @@ public class NacosCollectTask extends AbstractCollectTask { private static final String TASK_NAME = "taotao.cloud.health.collect.nacos"; - private Collector collector; - private CollectTaskProperties collectTaskProperties; + private final CollectTaskProperties collectTaskProperties; - public NacosCollectTask( - Collector collector, - CollectTaskProperties collectTaskProperties) { - this.collector = collector; + public NacosCollectTask(CollectTaskProperties collectTaskProperties) { this.collectTaskProperties = collectTaskProperties; } @@ -65,9 +61,10 @@ public boolean getEnabled() { @Override protected CollectInfo getData() { try { + Collector collector = Collector.getCollector(); NacosServiceManager nacosServiceManager = ContextUtil.getBean(NacosServiceManager.class, false); - if (Objects.nonNull(nacosServiceManager)) { + if (Objects.nonNull(collector) && Objects.nonNull(nacosServiceManager)) { NacosClientInfo info = new NacosClientInfo(); NamingService namingService = ReflectionUtil.getFieldValue(nacosServiceManager, diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/NetworkCollectTask.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/NetworkCollectTask.java index 8cb9ba8a48..b83eef3598 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/NetworkCollectTask.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/NetworkCollectTask.java @@ -36,7 +36,7 @@ public class NetworkCollectTask extends AbstractCollectTask { private static final String TASK_NAME = "taotao.cloud.health.collect.network"; - private CollectTaskProperties properties; + private final CollectTaskProperties properties; public NetworkCollectTask(CollectTaskProperties properties) { this.properties = properties; diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/ThreadCollectTask.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/ThreadCollectTask.java index 957119f95c..f2af1a9662 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/ThreadCollectTask.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/ThreadCollectTask.java @@ -36,8 +36,8 @@ public class ThreadCollectTask extends AbstractCollectTask { private static final String TASK_NAME = "taotao.cloud.health.collect.thread"; - private ThreadMXBean threadMXBean; - private CollectTaskProperties properties; + private final ThreadMXBean threadMXBean; + private final CollectTaskProperties properties; private HashMap lastThreadUserTime = new HashMap<>(); public ThreadCollectTask(CollectTaskProperties properties) { diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/TomcatCollectTask.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/TomcatCollectTask.java index a729a86897..7cb029ef54 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/TomcatCollectTask.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/collect/TomcatCollectTask.java @@ -37,7 +37,7 @@ public class TomcatCollectTask extends AbstractCollectTask { private static final String TASK_NAME = "taotao.cloud.health.collect.tomcat"; - private CollectTaskProperties collectTaskProperties; + private final CollectTaskProperties collectTaskProperties; public TomcatCollectTask(CollectTaskProperties collectTaskProperties) { this.collectTaskProperties = collectTaskProperties; diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/configuration/HealthConfiguration.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/configuration/HealthConfiguration.java index 217bd690b8..8f552cd142 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/configuration/HealthConfiguration.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/configuration/HealthConfiguration.java @@ -105,7 +105,6 @@ public WarnProvider getWarnProvider(WarnProperties warnProperties, public HealthCheckProvider getHealthCheckProvider( DefaultWarnStrategy strategy, DefaultHttpClient defaultHttpClient, - Collector collector, CollectTaskProperties collectTaskProperties, HealthProperties healthProperties, MonitorThreadPool monitorThreadPool) { @@ -113,7 +112,6 @@ public HealthCheckProvider getHealthCheckProvider( return new HealthCheckProvider( strategy, defaultHttpClient, - collector, collectTaskProperties, healthProperties, monitorThreadPool); diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/warn/DingdingWarn.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/warn/DingdingWarn.java index 7ac4dd2883..ffea1dd3a3 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/warn/DingdingWarn.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/warn/DingdingWarn.java @@ -16,13 +16,15 @@ package com.taotao.cloud.health.warn; import com.taotao.cloud.common.utils.ContextUtil; +import com.taotao.cloud.common.utils.LogUtil; +import com.taotao.cloud.common.utils.ReflectionUtil; import com.taotao.cloud.common.utils.StringUtil; import com.taotao.cloud.core.utils.RequestUtil; -import com.taotao.cloud.dingtalk.entity.DingerRequest; -import com.taotao.cloud.dingtalk.enums.MessageSubType; -import com.taotao.cloud.dingtalk.model.DingerRobot; import com.taotao.cloud.health.model.Message; import com.taotao.cloud.health.properties.WarnProperties; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; /** * DingdingWarn @@ -33,31 +35,60 @@ */ public class DingdingWarn extends AbstractWarn { - private final WarnProperties warnProperties; + private final static String CLASS = "com.taotao.cloud.dingtalk.model.DingerRobot"; + private final static String MESSAGE_SUB_TYPE = "com.taotao.cloud.dingtalk.enums.MessageSubType"; + private final static String DINGER_REQUEST = "com.taotao.cloud.dingtalk.entity.DingerRequest"; - public DingdingWarn(WarnProperties warnProperties) { - this.warnProperties = warnProperties; + private final boolean driverExist; + + public DingdingWarn() { + this.driverExist = ReflectionUtil.tryClassForName(CLASS) != null; } @Override public void notify(Message message) { - DingerRobot dingerRobot = ContextUtil.getBean(DingerRobot.class, true); + if (!driverExist) { + LogUtil.error("未找到DingerRobot, 不支持钉钉预警"); + return; + } + + WarnProperties warnProperties = ContextUtil.getBean(WarnProperties.class, true); + Object dingerRobot = ContextUtil.getBean(ReflectionUtil.tryClassForName(CLASS), true); + if (dingerRobot != null) { String ip = RequestUtil.getIpAddress(); String dingDingFilterIP = warnProperties.getDingdingFilterIP(); if (!StringUtil.isEmpty(ip) && !dingDingFilterIP.contains(ip)) { - String title = - "[" + message.getWarnType().getDescription() + "]" + StringUtil.subString3( - message.getTitle(), 100); + String title = "[" + + message.getWarnType().getDescription() + + "]" + + StringUtil.subString3(message.getTitle(), 100); + + String context = StringUtil.subString3(message.getTitle(), 100) + + "\n" + + "详情: " + + RequestUtil.getBaseUrl() + "/health/\n" + + StringUtil.subString3(message.getContent(), 500); - String context = StringUtil.subString3(message.getTitle(), 100) + "\n" + - "详情: " + RequestUtil.getBaseUrl() + "/health/\n" + - StringUtil.subString3(message.getContent(), 500); + try { + Object messageSubType = ReflectionUtil.findEnumObjByName( + Objects.requireNonNull(ReflectionUtil.tryClassForName(MESSAGE_SUB_TYPE)), + "name", "TEXT"); - MessageSubType messageSubType = MessageSubType.TEXT; - DingerRequest request = DingerRequest.request(context, title); + List requestParam = new ArrayList<>(); + requestParam.add(context); + requestParam.add(title); + Object request = ReflectionUtil.callMethod( + ReflectionUtil.tryClassForName(DINGER_REQUEST), "request", + requestParam.toArray()); - dingerRobot.send(messageSubType, request); + List param = new ArrayList<>(); + param.add(messageSubType); + param.add(request); + ReflectionUtil.callMethod(dingerRobot, "send", param.toArray()); + } catch (Exception e) { + LogUtil.error(e); + } } } } diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/warn/MailWarn.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/warn/MailWarn.java index 5bb1d13c56..212d8dff08 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/warn/MailWarn.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/warn/MailWarn.java @@ -15,14 +15,16 @@ */ package com.taotao.cloud.health.warn; - import com.taotao.cloud.common.utils.ContextUtil; import com.taotao.cloud.common.utils.LogUtil; +import com.taotao.cloud.common.utils.ReflectionUtil; import com.taotao.cloud.common.utils.StringUtil; import com.taotao.cloud.core.utils.RequestUtil; import com.taotao.cloud.health.model.Message; import com.taotao.cloud.health.properties.WarnProperties; -import com.taotao.cloud.mail.template.MailTemplate; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; /** * MailWarn @@ -33,16 +35,25 @@ */ public class MailWarn extends AbstractWarn { - private final WarnProperties warnProperties; + private final static String CLASS = "com.taotao.cloud.mail.template.MailTemplate"; + + private final boolean driverExist; - public MailWarn(WarnProperties warnProperties) { - this.warnProperties = warnProperties; + public MailWarn() { + this.driverExist = ReflectionUtil.tryClassForName(CLASS) != null; } @Override public void notify(Message message) { - MailTemplate mailTemplate = ContextUtil.getBean(MailTemplate.class, false); - if (mailTemplate != null) { + if (!driverExist) { + LogUtil.error("未找到MailTemplate, 不支持邮件预警"); + return; + } + + WarnProperties warnProperties = ContextUtil.getBean(WarnProperties.class, true); + Object mailTemplate = ContextUtil.getBean(ReflectionUtil.tryClassForName(CLASS), true); + + if (Objects.nonNull(mailTemplate) && Objects.nonNull(warnProperties)) { String ip = RequestUtil.getIpAddress(); String dingDingFilterIP = warnProperties.getDingdingFilterIP(); @@ -55,7 +66,11 @@ public void notify(Message message) { + StringUtil.subString3(message.getContent(), 500); try { - mailTemplate.sendSimpleMail("981376577@qq.com", "服务状态预警", context); + List param = new ArrayList<>(); + param.add("981376577@qq.com"); + param.add("服务状态预警"); + param.add(context); + ReflectionUtil.callMethod(mailTemplate, "sendSimpleMail", param.toArray()); } catch (Exception e) { LogUtil.error(e); } diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/warn/SmsWarn.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/warn/SmsWarn.java index 5e26ad781d..39dfd38417 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/warn/SmsWarn.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/warn/SmsWarn.java @@ -15,14 +15,16 @@ */ package com.taotao.cloud.health.warn; - import com.taotao.cloud.common.utils.ContextUtil; import com.taotao.cloud.common.utils.LogUtil; +import com.taotao.cloud.common.utils.ReflectionUtil; import com.taotao.cloud.common.utils.StringUtil; import com.taotao.cloud.core.utils.RequestUtil; import com.taotao.cloud.health.model.Message; import com.taotao.cloud.health.properties.WarnProperties; -import com.taotao.cloud.sms.service.SmsService; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; /** * SmsWarn @@ -33,30 +35,50 @@ */ public class SmsWarn extends AbstractWarn { - private final WarnProperties warnProperties; + private final static String CLASS = "com.taotao.cloud.sms.service.SmsService"; + + private final boolean driverExist; - public SmsWarn(WarnProperties warnProperties) { - this.warnProperties = warnProperties; + public SmsWarn() { + this.driverExist = ReflectionUtil.tryClassForName(CLASS) != null; } @Override public void notify(Message message) { - SmsService smsService = ContextUtil.getBean(SmsService.class, false); - if (smsService != null) { + if (!driverExist) { + LogUtil.error("未找到SmsService, 不支持短信预警"); + return; + } + + WarnProperties warnProperties = ContextUtil.getBean(WarnProperties.class, true); + Object smsService = ContextUtil.getBean(ReflectionUtil.tryClassForName(CLASS), true); + + if (Objects.nonNull(warnProperties) && Objects.nonNull(smsService)) { String ip = RequestUtil.getIpAddress(); String dingDingFilterIP = warnProperties.getDingdingFilterIP(); if (!StringUtil.isEmpty(ip) && !dingDingFilterIP.contains(ip)) { - String context = StringUtil.subString3(message.getTitle(), 100) + "\n" + - "详情: " + RequestUtil.getBaseUrl() + "/taotao/cloud/health/\n" + - StringUtil.subString3(message.getContent(), 500); + String context = StringUtil.subString3(message.getTitle(), 100) + + "\n" + + "详情: " + + RequestUtil.getBaseUrl() + + "/taotao/cloud/health/\n" + + StringUtil.subString3(message.getContent(), 500); try { - smsService.sendSms("", "", "", ""); + List param = new ArrayList<>(); + param.add("phoneNumber"); + param.add("signName"); + param.add("templateCode"); + // templateParam + param.add(context); + ReflectionUtil.callMethod(smsService, "sendSms", param.toArray()); } catch (Exception e) { LogUtil.error(e); } } } } + + } diff --git a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/warn/WarnProvider.java b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/warn/WarnProvider.java index d7920e1ede..bcf4e7a0bf 100644 --- a/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/warn/WarnProvider.java +++ b/taotao-cloud-microservice/taotao-cloud-starter/taotao-cloud-starter-health/src/main/java/com/taotao/cloud/health/warn/WarnProvider.java @@ -16,7 +16,6 @@ package com.taotao.cloud.health.warn; import com.taotao.cloud.common.constant.StarterNameConstant; -import com.taotao.cloud.common.utils.ContextUtil; import com.taotao.cloud.common.utils.LogUtil; import com.taotao.cloud.common.utils.StringUtil; import com.taotao.cloud.core.monitor.MonitorThreadPool; @@ -27,12 +26,10 @@ import com.taotao.cloud.health.model.Message; import com.taotao.cloud.health.properties.WarnProperties; import com.taotao.cloud.health.utils.ExceptionUtils; -import com.taotao.cloud.sms.service.SmsService; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; -import java.util.Objects; import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; @@ -95,16 +92,15 @@ public WarnProvider( */ public void registerWarn() { if (warnProperties.isDingDingWarnEnabled()) { - warns.add(new DingdingWarn(warnProperties)); + warns.add(new DingdingWarn()); } if (warnProperties.isEmailWarnEnabled()) { - warns.add(new MailWarn(warnProperties)); + warns.add(new MailWarn()); } - if (warnProperties.isSmsWarnEnabled()) { - warns.add(new SmsWarn(warnProperties)); + warns.add(new SmsWarn()); } } diff --git a/taotao-cloud-microservice/taotao-cloud-uc/taotao-cloud-uc-biz/src/main/java/com/taotao/cloud/uc/biz/service/impl/SysResourceServiceImpl.java b/taotao-cloud-microservice/taotao-cloud-uc/taotao-cloud-uc-biz/src/main/java/com/taotao/cloud/uc/biz/service/impl/SysResourceServiceImpl.java index 6dc2cf200a..396b44a8dd 100644 --- a/taotao-cloud-microservice/taotao-cloud-uc/taotao-cloud-uc-biz/src/main/java/com/taotao/cloud/uc/biz/service/impl/SysResourceServiceImpl.java +++ b/taotao-cloud-microservice/taotao-cloud-uc/taotao-cloud-uc-biz/src/main/java/com/taotao/cloud/uc/biz/service/impl/SysResourceServiceImpl.java @@ -23,6 +23,7 @@ import com.taotao.cloud.uc.biz.service.ISysResourceService; import com.taotao.cloud.uc.biz.service.ISysRoleService; import com.taotao.cloud.uc.biz.utils.TreeUtil; +import com.zaxxer.hikari.HikariDataSource; import io.seata.spring.annotation.GlobalTransactional; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -35,6 +36,7 @@ import java.util.TreeSet; import java.util.concurrent.Future; import java.util.stream.Collectors; +import net.logstash.logback.appender.LogstashTcpSocketAppender; import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboService; import org.apache.skywalking.apm.toolkit.trace.TraceContext; @@ -226,6 +228,10 @@ public List findCurrentUserResourceTree(List resourceV @Transactional(rollbackFor = Exception.class) @GlobalTransactional(name = "testSeata", rollbackFor = Exception.class) public Boolean testSeata() { + LogstashTcpSocketAppender appender = new LogstashTcpSocketAppender(); + appender.getWriteBufferSize() + + //try { LogUtil.info("1.添加资源信息"); SysResource sysResource = SysResource.builder()