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