在 Spring Boot 中使用 prometheus 自定义指标
Posted
技术标签:
【中文标题】在 Spring Boot 中使用 prometheus 自定义指标【英文标题】:Using prometheus custom metrics with SpringBoot 【发布时间】:2020-08-22 22:11:49 【问题描述】:我不确定这是一个错误,但我在过去一天尝试实现这个库,但没有任何结果。我认为这可能与依赖版本有冲突,但我尝试了一切。
所以我有一个非常简单的 Spring Boot 项目,它为 /test
端点提供服务,我进行了配置
-
计数器
直方图
现在我在/actuator/prometheus
下有了普罗米修斯指标。
期望的结果是指标将包含以下附加指标:
requests_test_total
requests_latency_seconds
我正在触发 /test
端点,但这些指标未显示在 prometheus 指标中。
我错过了什么吗?
这些是我的依赖:
dependencies
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.boot:spring-boot-starter-actuator')
compile('io.micrometer:micrometer-registry-prometheus')
compile "io.prometheus:simpleclient:0.8.1"
compile "io.prometheus:simpleclient_hotspot:0.8.1"
compile "io.prometheus:simpleclient_httpserver:0.8.1"
compile "io.prometheus:simpleclient_pushgateway:0.8.1"
compile group: 'io.prometheus', name: 'simpleclient_spring_boot', version: '0.8.1'
compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.30'
compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
compile group: 'ch.qos.logback.contrib', name: 'logback-json-classic', version: '0.1.5'
compile group: 'ch.qos.logback.contrib', name: 'logback-jackson', version: '0.1.5'
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.3'
compile group: 'net.logstash.logback', name: 'logstash-logback-encoder', version: '6.3'
这是端点类的实现:
package prometheus.prometheusclientexample;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.prometheus.client.Counter;
import io.prometheus.client.Histogram;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SimpleEndpoint
private static final Logger logger = LoggerFactory.getLogger("MainLogger");
static final Counter test_requests = Counter.build().name("requests_test_total").help("Total /test requests.").register();
static final Histogram requestLatency = Histogram.build()
.name("requests_latency_seconds").help("Request latency in seconds.").register();
@RequestMapping("/test")
public String test2() throws InterruptedException
Histogram.Timer requestTimer = requestLatency.startTimer();
try
logger.info("Before");
test_requests.inc();
logger.info("This is a simple endpint");
finally
requestTimer.observeDuration();
return "OK NEW";
/actuator/prometheus
回复:
# HELP jvm_gc_memory_allocated_bytes_total Incremented for an increase in the size of the young generation memory pool after one GC to before the next
# TYPE jvm_gc_memory_allocated_bytes_total counter
jvm_gc_memory_allocated_bytes_total 0.0
# HELP jvm_gc_max_data_size_bytes Max size of old generation memory pool
# TYPE jvm_gc_max_data_size_bytes gauge
jvm_gc_max_data_size_bytes 4.294967296E9
# HELP logback_events_total Number of error level events that made it to the logs
# TYPE logback_events_total counter
logback_events_totallevel="warn", 0.0
logback_events_totallevel="debug", 368.0
logback_events_totallevel="error", 0.0
logback_events_totallevel="trace", 0.0
logback_events_totallevel="info", 12.0
# HELP jvm_memory_max_bytes The maximum amount of memory in bytes that can be used for memory management
# TYPE jvm_memory_max_bytes gauge
jvm_memory_max_bytesarea="heap",id="G1 Survivor Space", -1.0
jvm_memory_max_bytesarea="heap",id="G1 Old Gen", 4.294967296E9
jvm_memory_max_bytesarea="nonheap",id="Metaspace", -1.0
jvm_memory_max_bytesarea="nonheap",id="CodeHeap 'non-nmethods'", 6975488.0
jvm_memory_max_bytesarea="heap",id="G1 Eden Space", -1.0
jvm_memory_max_bytesarea="nonheap",id="Compressed Class Space", 1.073741824E9
jvm_memory_max_bytesarea="nonheap",id="CodeHeap 'non-profiled nmethods'", 2.44682752E8
# HELP tomcat_sessions_alive_max_seconds
# TYPE tomcat_sessions_alive_max_seconds gauge
tomcat_sessions_alive_max_seconds 0.0
# HELP jvm_gc_live_data_size_bytes Size of old generation memory pool after a full GC
# TYPE jvm_gc_live_data_size_bytes gauge
jvm_gc_live_data_size_bytes 0.0
# HELP process_start_time_seconds Start time of the process since unix epoch.
# TYPE process_start_time_seconds gauge
process_start_time_seconds 1.588860975956E9
# HELP tomcat_sessions_active_max_sessions
# TYPE tomcat_sessions_active_max_sessions gauge
tomcat_sessions_active_max_sessions 0.0
# HELP tomcat_sessions_created_sessions_total
# TYPE tomcat_sessions_created_sessions_total counter
tomcat_sessions_created_sessions_total 0.0
# HELP jvm_classes_unloaded_classes_total The total number of classes unloaded since the Java virtual machine has started execution
# TYPE jvm_classes_unloaded_classes_total counter
jvm_classes_unloaded_classes_total 0.0
# HELP jvm_threads_live_threads The current number of live threads including both daemon and non-daemon threads
# TYPE jvm_threads_live_threads gauge
jvm_threads_live_threads 24.0
# HELP process_files_max_files The maximum file descriptor count
# TYPE process_files_max_files gauge
process_files_max_files 10240.0
# HELP http_server_requests_seconds
# TYPE http_server_requests_seconds summary
http_server_requests_seconds_countexception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/prometheus", 1.0
http_server_requests_seconds_sumexception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/prometheus", 0.144024648
http_server_requests_seconds_countexception="None",method="GET",outcome="SUCCESS",status="200",uri="/test", 2.0
http_server_requests_seconds_sumexception="None",method="GET",outcome="SUCCESS",status="200",uri="/test", 0.029707973
# HELP http_server_requests_seconds_max
# TYPE http_server_requests_seconds_max gauge
http_server_requests_seconds_maxexception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/prometheus", 0.144024648
http_server_requests_seconds_maxexception="None",method="GET",outcome="SUCCESS",status="200",uri="/test", 0.022717086
# HELP jvm_memory_used_bytes The amount of used memory
# TYPE jvm_memory_used_bytes gauge
jvm_memory_used_bytesarea="heap",id="G1 Survivor Space", 7340032.0
jvm_memory_used_bytesarea="heap",id="G1 Old Gen", 4369520.0
jvm_memory_used_bytesarea="nonheap",id="Metaspace", 4.1996312E7
jvm_memory_used_bytesarea="nonheap",id="CodeHeap 'non-nmethods'", 1204864.0
jvm_memory_used_bytesarea="heap",id="G1 Eden Space", 7.9691776E7
jvm_memory_used_bytesarea="nonheap",id="Compressed Class Space", 5303144.0
jvm_memory_used_bytesarea="nonheap",id="CodeHeap 'non-profiled nmethods'", 6563328.0
# HELP process_uptime_seconds The uptime of the Java virtual machine
# TYPE process_uptime_seconds gauge
process_uptime_seconds 15.703
# HELP jvm_threads_peak_threads The peak live thread count since the Java virtual machine started or peak was reset
# TYPE jvm_threads_peak_threads gauge
jvm_threads_peak_threads 24.0
# HELP process_files_open_files The open file descriptor count
# TYPE process_files_open_files gauge
process_files_open_files 83.0
# HELP tomcat_sessions_expired_sessions_total
# TYPE tomcat_sessions_expired_sessions_total counter
tomcat_sessions_expired_sessions_total 0.0
# HELP process_cpu_usage The "recent cpu usage" for the Java Virtual Machine process
# TYPE process_cpu_usage gauge
process_cpu_usage 0.002284847603487466
# HELP system_load_average_1m The sum of the number of runnable entities queued to available processors and the number of runnable entities running on the available processors averaged over a period of time
# TYPE system_load_average_1m gauge
system_load_average_1m 11.57421875
# HELP jvm_buffer_memory_used_bytes An estimate of the memory that the Java virtual machine is using for this buffer pool
# TYPE jvm_buffer_memory_used_bytes gauge
jvm_buffer_memory_used_bytesid="mapped", 0.0
jvm_buffer_memory_used_bytesid="direct", 32768.0
# HELP jvm_buffer_total_capacity_bytes An estimate of the total capacity of the buffers in this pool
# TYPE jvm_buffer_total_capacity_bytes gauge
jvm_buffer_total_capacity_bytesid="mapped", 0.0
jvm_buffer_total_capacity_bytesid="direct", 32768.0
# HELP jvm_gc_memory_promoted_bytes_total Count of positive increases in the size of the old generation memory pool before GC to after GC
# TYPE jvm_gc_memory_promoted_bytes_total counter
jvm_gc_memory_promoted_bytes_total 0.0
# HELP jvm_memory_committed_bytes The amount of memory in bytes that is committed for the Java virtual machine to use
# TYPE jvm_memory_committed_bytes gauge
jvm_memory_committed_bytesarea="heap",id="G1 Survivor Space", 7340032.0
jvm_memory_committed_bytesarea="heap",id="G1 Old Gen", 1.90840832E8
jvm_memory_committed_bytesarea="nonheap",id="Metaspace", 4.3646976E7
jvm_memory_committed_bytesarea="nonheap",id="CodeHeap 'non-nmethods'", 2555904.0
jvm_memory_committed_bytesarea="heap",id="G1 Eden Space", 1.24780544E8
jvm_memory_committed_bytesarea="nonheap",id="Compressed Class Space", 5898240.0
jvm_memory_committed_bytesarea="nonheap",id="CodeHeap 'non-profiled nmethods'", 6619136.0
# HELP jvm_threads_daemon_threads The current number of live daemon threads
# TYPE jvm_threads_daemon_threads gauge
jvm_threads_daemon_threads 20.0
# HELP jvm_buffer_count_buffers An estimate of the number of buffers in the pool
# TYPE jvm_buffer_count_buffers gauge
jvm_buffer_count_buffersid="mapped", 0.0
jvm_buffer_count_buffersid="direct", 4.0
# HELP jvm_threads_states_threads The current number of threads having NEW state
# TYPE jvm_threads_states_threads gauge
jvm_threads_states_threadsstate="runnable", 10.0
jvm_threads_states_threadsstate="blocked", 0.0
jvm_threads_states_threadsstate="waiting", 11.0
jvm_threads_states_threadsstate="timed-waiting", 3.0
jvm_threads_states_threadsstate="new", 0.0
jvm_threads_states_threadsstate="terminated", 0.0
# HELP tomcat_sessions_active_current_sessions
# TYPE tomcat_sessions_active_current_sessions gauge
tomcat_sessions_active_current_sessions 0.0
# HELP system_cpu_count The number of processors available to the Java virtual machine
# TYPE system_cpu_count gauge
system_cpu_count 4.0
# HELP jvm_classes_loaded_classes The number of classes that are currently loaded in the Java virtual machine
# TYPE jvm_classes_loaded_classes gauge
jvm_classes_loaded_classes 7680.0
# HELP system_cpu_usage The "recent cpu usage" for the whole system
# TYPE system_cpu_usage gauge
system_cpu_usage 0.5317742755465176
# HELP tomcat_sessions_rejected_sessions_total
# TYPE tomcat_sessions_rejected_sessions_total counter
tomcat_sessions_rejected_sessions_total 0.0
【问题讨论】:
“我正在尝试实现你的库”——“你”是谁?你指的是哪个图书馆? 你是什么意思我是谁?如果你没有什么有用的话就不要说 您在帖子中的第一句话是“我正在尝试实现 your 库” - 我在问您的意思。 doh,实施 -> 利用)) 【参考方案1】:有关 csutom 指标注入的 Prometheus 手册是针对非 DI(依赖注入)环境编写的。在您的情况下,自动装配 CollectorRegistry bean 并像这样注册指标:
Histogram().bulid().name(someName).register(collectorRegistry);
不要使用静态对象(通过 register()),它没用。
【讨论】:
【参考方案2】:这是因为springboot创建的PrometheusMeterRegistry有自己专属的CollectorRegistry。你可以添加下面的代码来解决这个问题。
@Bean
public CollectorRegistry collectorRegistry()
return CollectorRegistry.defaultRegistry;
【讨论】:
【参考方案3】:如果你使用 SpringBoot Micrometer Prometheus 插件,我建议使用内置的MeterRegistry
,它以 Prometheus 格式收集和导出指标。
您避免了创建计数器/直方图的需要(如果直接使用 io.prometheus Simpleclient 库,则必须这样做)
@Autowired
private MeterRegistry meterRegistry;
@GetMapping(value = "/main/test", produces = "text/plain")
public String test()
meterRegistry.counter("requests_test_total").increment();
return "ok";
在 application.properties 中启用 Prometheus 端点
management.endpoints.web.exposure.include=health,info,loggers,prometheus
【讨论】:
谢谢 Beppe,我考虑过了,但仪表注册表没有直方图。虽然我更喜欢使用官方的prometheus客户端 我明白了,我不会使用 spring-boot-starter-actuator(和千分尺),而只是导入并使用简单的客户端 感谢 Beppe 的建议,我是 Java 世界的初学者。您知道如何使用 prometheus 客户端公开 /metrics 吗?我在网上找不到一个例子 当然 :-) 我在答案中添加了属性文件配置以上是关于在 Spring Boot 中使用 prometheus 自定义指标的主要内容,如果未能解决你的问题,请参考以下文章
spring-boot实战12:Spring Boot中使用JavaMailSender发送邮件
Spring Boot:在Spring Boot中使用Mysql和JPA
在 spring-boot 项目中使用 spring mvc xml 项目
Spring boot在Spring boot中Redis的使用