From 4fe9047d116bc0a2afabd587d3979a475f3eb134 Mon Sep 17 00:00:00 2001
From: xuekang <914468783@qq.com>
Date: 星期五, 10 五月 2024 20:44:48 +0800
Subject: [PATCH] 初始化
---
ruoyi-visual/ruoyi-monitor/src/main/resources/logback-plus.xml | 28 ++++
ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/RuoYiMonitorApplication.java | 17 ++
ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/notifier/CustomNotifier.java | 43 ++++++
ruoyi-visual/ruoyi-monitor/src/main/resources/application.yml | 31 ++++
ruoyi-visual/ruoyi-monitor/src/main/resources/banner.txt | 10 +
ruoyi-visual/ruoyi-monitor/Dockerfile | 17 ++
ruoyi-visual/ruoyi-monitor/pom.xml | 74 ++++++++++
ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/config/AdminServerConfig.java | 31 ++++
ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/config/WebSecurityConfigurer.java | 56 ++++++++
ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/controller/PrometheusController.java | 67 +++++++++
10 files changed, 374 insertions(+), 0 deletions(-)
diff --git a/ruoyi-visual/ruoyi-monitor/Dockerfile b/ruoyi-visual/ruoyi-monitor/Dockerfile
new file mode 100644
index 0000000..b335488
--- /dev/null
+++ b/ruoyi-visual/ruoyi-monitor/Dockerfile
@@ -0,0 +1,17 @@
+#FROM findepi/graalvm:java17-native
+FROM openjdk:17.0.2-oraclelinux8
+
+MAINTAINER Lion Li
+
+RUN mkdir -p /ruoyi/monitor/logs
+
+WORKDIR /ruoyi/monitor
+
+ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
+
+EXPOSE 9100
+
+ADD ./target/ruoyi-monitor.jar ./app.jar
+
+ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar app.jar \
+ -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS}
diff --git a/ruoyi-visual/ruoyi-monitor/pom.xml b/ruoyi-visual/ruoyi-monitor/pom.xml
new file mode 100644
index 0000000..7591c53
--- /dev/null
+++ b/ruoyi-visual/ruoyi-monitor/pom.xml
@@ -0,0 +1,74 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>org.dromara</groupId>
+ <artifactId>ruoyi-visual</artifactId>
+ <version>${revision}</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <artifactId>ruoyi-monitor</artifactId>
+
+ <description>
+ ruoyi-monitor鐩戞帶涓績
+ </description>
+
+ <dependencies>
+
+ <!-- SpringBoot Admin -->
+ <dependency>
+ <groupId>de.codecentric</groupId>
+ <artifactId>spring-boot-admin-starter-server</artifactId>
+ <version>${spring-boot-admin.version}</version>
+ </dependency>
+
+ <!-- SpringCloud Alibaba Nacos -->
+ <dependency>
+ <groupId>com.alibaba.cloud</groupId>
+ <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+ </dependency>
+
+ <!-- SpringCloud Alibaba Nacos Config -->
+ <dependency>
+ <groupId>com.alibaba.cloud</groupId>
+ <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.dromara</groupId>
+ <artifactId>ruoyi-common-web</artifactId>
+ </dependency>
+
+ <!-- Spring Security -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-security</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.projectlombok</groupId>
+ <artifactId>lombok</artifactId>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <finalName>${project.artifactId}</finalName>
+ <plugins>
+ <plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ <version>${spring-boot.version}</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>repackage</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
diff --git a/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/RuoYiMonitorApplication.java b/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/RuoYiMonitorApplication.java
new file mode 100644
index 0000000..088098a
--- /dev/null
+++ b/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/RuoYiMonitorApplication.java
@@ -0,0 +1,17 @@
+package org.dromara.modules.monitor;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * 鐩戞帶涓績
+ *
+ * @author ruoyi
+ */
+@SpringBootApplication
+public class RuoYiMonitorApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(RuoYiMonitorApplication.class, args);
+ System.out.println("(鈾モ棤鈥库棤)锞夛緸 鐩戞帶涓績鍚姩鎴愬姛 醿�(麓凇`醿�)锞� ");
+ }
+}
diff --git a/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/config/AdminServerConfig.java b/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/config/AdminServerConfig.java
new file mode 100644
index 0000000..6d68c5e
--- /dev/null
+++ b/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/config/AdminServerConfig.java
@@ -0,0 +1,31 @@
+package org.dromara.modules.monitor.config;
+
+import de.codecentric.boot.admin.server.config.EnableAdminServer;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration;
+import org.springframework.boot.task.TaskExecutorBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+
+/**
+ * springboot-admin server閰嶇疆绫�
+ *
+ * @author Lion Li
+ */
+@Configuration
+@EnableAdminServer
+public class AdminServerConfig {
+
+ @Lazy
+ @Bean(name = TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME)
+ @ConditionalOnMissingBean(Executor.class)
+ public ThreadPoolTaskExecutor applicationTaskExecutor(TaskExecutorBuilder builder) {
+ return builder.build();
+ }
+
+
+}
diff --git a/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/config/WebSecurityConfigurer.java b/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/config/WebSecurityConfigurer.java
new file mode 100644
index 0000000..686200b
--- /dev/null
+++ b/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/config/WebSecurityConfigurer.java
@@ -0,0 +1,56 @@
+package org.dromara.modules.monitor.config;
+
+import de.codecentric.boot.admin.server.config.AdminServerProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.Customizer;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
+import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer;
+import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
+
+/**
+ * admin 鐩戞帶 瀹夊叏閰嶇疆
+ *
+ * @author Lion Li
+ */
+@EnableWebSecurity
+@Configuration
+public class WebSecurityConfigurer {
+
+ private final String adminContextPath;
+
+ public WebSecurityConfigurer(AdminServerProperties adminServerProperties) {
+ this.adminContextPath = adminServerProperties.getContextPath();
+ }
+
+ @Bean
+ public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
+ SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
+ successHandler.setTargetUrlParameter("redirectTo");
+ successHandler.setDefaultTargetUrl(adminContextPath + "/");
+
+ return httpSecurity
+ .headers((header) ->
+ header.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable))
+ .authorizeHttpRequests((authorize) ->
+ authorize.requestMatchers(
+ new AntPathRequestMatcher(adminContextPath + "/assets/**"),
+ new AntPathRequestMatcher(adminContextPath + "/login"),
+ new AntPathRequestMatcher("/actuator"),
+ new AntPathRequestMatcher("/actuator/**")
+ ).permitAll()
+ .anyRequest().authenticated())
+ .formLogin((formLogin) ->
+ formLogin.loginPage(adminContextPath + "/login").successHandler(successHandler))
+ .logout((logout) ->
+ logout.logoutUrl(adminContextPath + "/logout"))
+ .httpBasic(Customizer.withDefaults())
+ .csrf(AbstractHttpConfigurer::disable)
+ .build();
+ }
+
+}
diff --git a/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/controller/PrometheusController.java b/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/controller/PrometheusController.java
new file mode 100644
index 0000000..300b5df
--- /dev/null
+++ b/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/controller/PrometheusController.java
@@ -0,0 +1,67 @@
+package org.dromara.modules.monitor.controller;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.client.ServiceInstance;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 瀵规帴 prometheus
+ *
+ * @author Lion Li
+ */
+@Slf4j
+@RestController
+@RequestMapping("/actuator/prometheus")
+public class PrometheusController {
+
+ @Autowired
+ private DiscoveryClient discoveryClient;
+
+ /**
+ * 浠庢敞鍐屼腑蹇冭幏鍙栨墍鏈夋湇鍔$粍瑁呮垚 prometheus 鐨勬暟鎹粨鏋�
+ */
+ @GetMapping("/sd")
+ public List<Map<String, Object>> sd() {
+ List<String> services = discoveryClient.getServices();
+ if (services == null || services.isEmpty()) {
+ return new ArrayList<>(0);
+ }
+ List<Map<String, Object>> list = new ArrayList<>();
+ for (String service : services) {
+ List<ServiceInstance> instances = discoveryClient.getInstances(service);
+ List<String> targets = instances.stream().map(i -> i.getHost() + ":" + i.getPort()).collect(Collectors.toList());
+
+ Map<String, String> labels = new HashMap<>(2);
+ // 鏁版嵁鏉ユ簮(鍖哄垎寮傚湴浣跨敤)
+ // labels.put("__meta_datacenter", "beijing");
+ // 鏈嶅姟鍚�
+ labels.put("__meta_prometheus_job", service);
+ Map<String, Object> group = new HashMap<>(2);
+ group.put("targets", targets);
+ group.put("labels", labels);
+ list.add(group);
+ }
+ return list;
+ }
+
+ /**
+ * 鎺ユ敹 prometheus 鎶ヨ娑堟伅
+ *
+ * @param message 娑堟伅浣�
+ */
+ @PostMapping("/alerts")
+ public ResponseEntity<Void> alerts(@RequestBody String message) {
+ log.info("[prometheus] alert =>" + message);
+ return ResponseEntity.ok().build();
+ }
+
+}
diff --git a/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/notifier/CustomNotifier.java b/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/notifier/CustomNotifier.java
new file mode 100644
index 0000000..165e28e
--- /dev/null
+++ b/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/notifier/CustomNotifier.java
@@ -0,0 +1,43 @@
+package org.dromara.modules.monitor.notifier;
+
+import de.codecentric.boot.admin.server.domain.entities.Instance;
+import de.codecentric.boot.admin.server.domain.entities.InstanceRepository;
+import de.codecentric.boot.admin.server.domain.events.InstanceEvent;
+import de.codecentric.boot.admin.server.domain.events.InstanceStatusChangedEvent;
+import de.codecentric.boot.admin.server.domain.values.InstanceId;
+import de.codecentric.boot.admin.server.notify.AbstractEventNotifier;
+import io.micrometer.core.lang.NonNullApi;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import reactor.core.publisher.Mono;
+
+/**
+ * 鑷畾涔変簨浠堕�氱煡澶勭悊
+ *
+ * @author Lion Li
+ */
+@Slf4j
+@Component
+public class CustomNotifier extends AbstractEventNotifier {
+
+ protected CustomNotifier(InstanceRepository repository) {
+ super(repository);
+ }
+
+ @Override
+ @SuppressWarnings("all")
+ protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
+ return Mono.fromRunnable(() -> {
+ // 瀹炰緥鐘舵�佹敼鍙樹簨浠�
+ if (event instanceof InstanceStatusChangedEvent) {
+ String registName = instance.getRegistration().getName();
+ String instanceId = event.getInstance().getValue();
+ String status = ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus();
+ log.info("Instance Status Change: [{}],[{}],[{}]", registName, instanceId, status);
+ }
+
+ });
+ }
+
+}
diff --git a/ruoyi-visual/ruoyi-monitor/src/main/resources/application.yml b/ruoyi-visual/ruoyi-monitor/src/main/resources/application.yml
new file mode 100644
index 0000000..fe8b357
--- /dev/null
+++ b/ruoyi-visual/ruoyi-monitor/src/main/resources/application.yml
@@ -0,0 +1,31 @@
+# Tomcat
+server:
+ port: 9100
+
+# Spring
+spring:
+ application:
+ # 搴旂敤鍚嶇О
+ name: ruoyi-monitor
+ profiles:
+ # 鐜閰嶇疆
+ active: @profiles.active@
+
+--- # nacos 閰嶇疆
+spring:
+ cloud:
+ nacos:
+ # nacos 鏈嶅姟鍦板潃
+ server-addr: @nacos.server@
+ discovery:
+ # 娉ㄥ唽缁�
+ group: @nacos.discovery.group@
+ namespace: ${spring.profiles.active}
+ config:
+ # 閰嶇疆缁�
+ group: @nacos.config.group@
+ namespace: ${spring.profiles.active}
+ config:
+ import:
+ - optional:nacos:application-common.yml
+ - optional:nacos:${spring.application.name}.yml
diff --git a/ruoyi-visual/ruoyi-monitor/src/main/resources/banner.txt b/ruoyi-visual/ruoyi-monitor/src/main/resources/banner.txt
new file mode 100644
index 0000000..ecaf8a4
--- /dev/null
+++ b/ruoyi-visual/ruoyi-monitor/src/main/resources/banner.txt
@@ -0,0 +1,10 @@
+Spring Boot Version: ${spring-boot.version}
+Spring Application Name: ${spring.application.name}
+ _ _ _
+ (_) (_)| |
+ _ __ _ _ ___ _ _ _ ______ _ __ ___ ___ _ __ _ | |_ ___ _ __
+| '__|| | | | / _ \ | | | || ||______|| '_ ` _ \ / _ \ | '_ \ | || __| / _ \ | '__|
+| | | |_| || (_) || |_| || | | | | | | || (_) || | | || || |_ | (_) || |
+|_| \__,_| \___/ \__, ||_| |_| |_| |_| \___/ |_| |_||_| \__| \___/ |_|
+ __/ |
+ |___/
\ No newline at end of file
diff --git a/ruoyi-visual/ruoyi-monitor/src/main/resources/logback-plus.xml b/ruoyi-visual/ruoyi-monitor/src/main/resources/logback-plus.xml
new file mode 100644
index 0000000..caaa345
--- /dev/null
+++ b/ruoyi-visual/ruoyi-monitor/src/main/resources/logback-plus.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+ <!-- 鏃ュ織瀛樻斁璺緞 -->
+ <property name="log.path" value="logs/${project.artifactId}" />
+ <!-- 鏃ュ織杈撳嚭鏍煎紡 -->
+ <property name="console.log.pattern"
+ value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
+
+ <!-- 鎺у埗鍙拌緭鍑� -->
+ <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+ <encoder>
+ <pattern>${console.log.pattern}</pattern>
+ <charset>utf-8</charset>
+ </encoder>
+ </appender>
+
+ <include resource="logback-common.xml" />
+
+ <include resource="logback-logstash.xml" />
+
+ <!-- 寮�鍚� skywalking 鏃ュ織鏀堕泦 -->
+ <include resource="logback-skylog.xml" />
+
+ <!--绯荤粺鎿嶄綔鏃ュ織-->
+ <root level="info">
+ <appender-ref ref="console" />
+ </root>
+</configuration>
--
Gitblit v1.9.1