本文介绍SpringCloud使用Prometheus,基于Eureka服务发现。

1.Prometheus介绍

在之前写过两篇有关Prometheus使用的文章,如下:

《SpringBoot使用prometheus监控》

《SpringBoot使用SOFA-Lookout监控》

但是如果使用微服务的话,一个服务一个服务的配置似乎太麻烦,Prometheus提供了很多服务发现的机制去统一配置服务,具体可以查看官网介绍:https://prometheus.io/docs/prometheus/latest/configuration/configuration/

包含如下这些配置:

16966a08701cbbd7.png

从图中可以看出,这里提供了Consul的服务发现机制,没有Eureka的服务发现机制。但是如果Eureka想要使用的话可以通过配置一个适配器的方式,使用consul_sd_config配置的方式使用Prometheus服务发现。

tips:

官方文档还没有更新,但是看github源码master提交记录,prometheus已经支持eurake动态服务发现。这篇文章也是网上2019年写的

源码地址:https://github.com/prometheus/prometheus

7.Prometheus SpringCloud - 图2

坐等官方文档更新后再改造

2.Eureka Server

创建一个Eureka Server,这里使用的Eureka最新版本Greenwich.SR1,也就是现在Idea默认创建的,在配置中加入eureka-consul-adapter依赖,pom文件完整内容如下所示。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.1.3.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.dalaoyang</groupId>
  12. <artifactId>springcloud_prometheus_server</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>springcloud_prometheus_server</name>
  15. <description>springcloud_prometheus_server</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-test</artifactId>
  28. <scope>test</scope>
  29. </dependency>
  30. <dependency>
  31. <groupId>at.twinformatics</groupId>
  32. <artifactId>eureka-consul-adapter</artifactId>
  33. <version>1.4.0</version>
  34. </dependency>
  35. </dependencies>
  36. <dependencyManagement>
  37. <dependencies>
  38. <dependency>
  39. <groupId>org.springframework.cloud</groupId>
  40. <artifactId>spring-cloud-dependencies</artifactId>
  41. <version>${spring-cloud.version}</version>
  42. <type>pom</type>
  43. <scope>import</scope>
  44. </dependency>
  45. </dependencies>
  46. </dependencyManagement>
  47. <build>
  48. <plugins>
  49. <plugin>
  50. <groupId>org.springframework.boot</groupId>
  51. <artifactId>spring-boot-maven-plugin</artifactId>
  52. </plugin>
  53. </plugins>
  54. </build>
  55. <repositories>
  56. <repository>
  57. <id>spring-milestones</id>
  58. <name>Spring Milestones</name>
  59. <url>https://repo.spring.io/milestone</url>
  60. </repository>
  61. </repositories>
  62. </project>

这里需要注意一下SpringCloud版本与eureka-consul-adapter的对照,如下所示。

7.Prometheus SpringCloud - 图3

注意了!!!网上用的都是1.1.0版本,这个版本我这里不成功,应该是跟prometheus的版本不一致造成的。所以查了一下,用了最新的1.4.0版本

  1. <dependency>
  2. <groupId>at.twinformatics</groupId>
  3. <artifactId>eureka-consul-adapter</artifactId>
  4. <version>1.4.0</version>
  5. </dependency>

我用的prometheus版本是:prometheus-2.20.1.linux-amd64.tar.gz

剩下的就是一些简单地配置,如配置文件:

  1. server.port=8761
  2. eureka.instance.hostname=localhost
  3. eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
  4. ##禁止自己向自己注册
  5. eureka.client.register-with-eureka=false
  6. eureka.client.fetch-registry=false

启动类加入注解启动注册中心,如下:

  1. @SpringBootApplication
  2. @EnableEurekaServer //启动服务注册中心
  3. public class SpringcloudPrometheusServerApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(SpringcloudPrometheusServerApplication.class, args);
  6. }
  7. }

3.Eureka Client

其实这个也没什么好说的,和普通使用Prometheus一样,当然,也可以使用SOFA-Lookout的模式,这里根据情况自行选择即可,这里以使用micrometer-registry-prometheus依赖为例,完整pom如下所示。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.1.3.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.dalaoyang</groupId>
  12. <artifactId>springcloud_prometheus_client</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>springcloud_prometheus_client</name>
  15. <description>springcloud_prometheus_client</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-actuator</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-web</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.cloud</groupId>
  31. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-starter-test</artifactId>
  36. <scope>test</scope>
  37. </dependency>
  38. <dependency>
  39. <groupId>io.micrometer</groupId>
  40. <artifactId>micrometer-registry-prometheus</artifactId>
  41. <version>1.1.3</version>
  42. </dependency>
  43. </dependencies>
  44. <dependencyManagement>
  45. <dependencies>
  46. <dependency>
  47. <groupId>org.springframework.cloud</groupId>
  48. <artifactId>spring-cloud-dependencies</artifactId>
  49. <version>${spring-cloud.version}</version>
  50. <type>pom</type>
  51. <scope>import</scope>
  52. </dependency>
  53. </dependencies>
  54. </dependencyManagement>
  55. <build>
  56. <plugins>
  57. <plugin>
  58. <groupId>org.springframework.boot</groupId>
  59. <artifactId>spring-boot-maven-plugin</artifactId>
  60. </plugin>
  61. </plugins>
  62. </build>
  63. <repositories>
  64. <repository>
  65. <id>spring-milestones</id>
  66. <name>Spring Milestones</name>
  67. <url>https://repo.spring.io/milestone</url>
  68. </repository>
  69. </repositories>
  70. </project>

配置文件如下,端口号8888,如下:

  1. ##端口号
  2. server.port=8888
  3. spring.application.name=springboot_prometheus_client
  4. eureka.client.service-url.defaultZone=http://server1:8761/eureka/
  5. management.endpoints.web.exposure.include=*
  6. management.metrics.tags.application=${spring.application.name}

启动类如下:

  1. @SpringBootApplication
  2. public class SpringcloudPrometheusClientApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(SpringcloudPrometheusClientApplication.class, args);
  5. }
  6. @Bean
  7. MeterRegistryCustomizer<MeterRegistry> configurer(
  8. @Value("${spring.application.name}") String applicationName) {
  9. return (registry) -> registry.config().commonTags("application", applicationName);
  10. }
  11. }

4.Prometheus配置

在Prometheus中配置eureka地址(server),以及需要收集的服务(services)。

  1. - job_name: 'consul-prometheus'
  2. scheme: http
  3. metrics_path: '/actuator/prometheus'
  4. consul_sd_configs:
  5. #consul 地址
  6. - server: '127.0.0.1:8761'
  7. scheme: http
  8. services: [SPRINGBOOT_PROMETHEUS_CLIENT]

5.测试

分别启动Eureka-Server和Eureka-Client,首先查看Eureka界面,如下:
16966a9f4eae8662.png

接下来查看一下Prometheus,如下:
16966ac10eceed45.png

从上图可以看到,服务以及被收集了,接下来查看grafana控制台,如图:

7.Prometheus SpringCloud - 图6