如何用Prometheus监控禁用了Actuator的SpringBoot?
需求来源
prometheus监控微服务一般都是使用micrometer结合actuator来做:
添加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId><version>1.9.14</version>
</dependency>
添加配置
server:port: 8081
management:server:port: 8082endpoints:enabled-by-default: trueweb:base-path: /statexposure:include: "prometheus"metrics:tags:application: ${spring.application.name}export:prometheus:enabled: true
prometheus中加上job,grafana中添加上dashboard,一个漂亮的监控页面就出来了。
问题是,actuator有安全风险,安全漏洞扫描会通不过,虽然改了端口号,改了访问路径,领导还是不同意啊,难不成自己写那么多的监控指标?
换一个思路,还是照常引用actuator,但是把访问路径给禁用了,然后自己写一个controller,把actuator的内容原样输出出来不就行了,同时给这个接口加上权限认证,巧了,prometheus就支持抓取接口上加basic认证。
如何禁用actuator的访问路径?
management:server:port: -1
这一个配置就足够了
如何输出指标数据?
public static String getMetricsData(CollectorRegistry collectorRegistry){try {Writer writer = new StringWriter();TextFormat.write004(writer, collectorRegistry.metricFamilySamples());return writer.toString();} catch (IOException exception) {logger.error("获取监控数据异常:{}", getStackTrace(exception));return "";}
}
代码来自org.springframework.boot.actuate.metrics.export.prometheus.TextOutputFormat#write
如何给接口加basic认证?
String authHeader= request.getHeader("Authorization");
public static boolean isBasicValid(String authHeader, String name, String pass){if((authHeader== null) || (authHeader.length() <= 6)){return false;}authHeader= authHeader.substring(6, authHeader.length());authHeader= new String(Base64.getDecoder().decode(authHeader));String authServer = name + ":" + pass;return Objects.equals(authHeader, authServer);
}
现在只需要再在配置文件中添加basic认证的name和pass就ok了。
完整的源码下载:https://github.com/xjs1919/enumdemo/tree/master/actuator-demo