探究springboot中的TomcatMetricsBinder
序
本文主要研究一下springboot的TomcatMetricsBinder
TomcatMetricsAutoConfiguration
org/springframework/boot/actuate/autoconfigure/metrics/web/tomcat/TomcatMetricsAutoConfiguration.java
@Configuration(proxyBeanMethods = false) @ConditionalOnWebApplication @ConditionalOnClass({ TomcatMetrics.class, Manager.class }) @AutoConfigureAfter(CompositeMeterRegistryAutoConfiguration.class) public class TomcatMetricsAutoConfiguration { @Bean @ConditionalOnBean(MeterRegistry.class) @ConditionalOnMissingBean({ TomcatMetrics.class, TomcatMetricsBinder.class }) public TomcatMetricsBinder tomcatMetricsBinder(MeterRegistry meterRegistry) { return new TomcatMetricsBinder(meterRegistry); } }
TomcatMetricsAutoConfiguration在CompositeMeterRegistryAutoConfiguration之后自動(dòng)配置,它會(huì)創(chuàng)建TomcatMetricsBinder
TomcatMetricsBinder
org/springframework/boot/actuate/metrics/web/tomcat/TomcatMetricsBinder.java
public class TomcatMetricsBinder implements ApplicationListener<ApplicationStartedEvent>, DisposableBean { private final MeterRegistry meterRegistry; private final Iterable<Tag> tags; private volatile TomcatMetrics tomcatMetrics; public TomcatMetricsBinder(MeterRegistry meterRegistry) { this(meterRegistry, Collections.emptyList()); } public TomcatMetricsBinder(MeterRegistry meterRegistry, Iterable<Tag> tags) { this.meterRegistry = meterRegistry; this.tags = tags; } @Override public void onApplicationEvent(ApplicationStartedEvent event) { ApplicationContext applicationContext = event.getApplicationContext(); Manager manager = findManager(applicationContext); this.tomcatMetrics = new TomcatMetrics(manager, this.tags); this.tomcatMetrics.bindTo(this.meterRegistry); } private Manager findManager(ApplicationContext applicationContext) { if (applicationContext instanceof WebServerApplicationContext) { WebServer webServer = ((WebServerApplicationContext) applicationContext).getWebServer(); if (webServer instanceof TomcatWebServer) { Context context = findContext((TomcatWebServer) webServer); return context.getManager(); } } return null; } private Context findContext(TomcatWebServer tomcatWebServer) { for (Container container : tomcatWebServer.getTomcat().getHost().findChildren()) { if (container instanceof Context) { return (Context) container; } } return null; } @Override public void destroy() { if (this.tomcatMetrics != null) { this.tomcatMetrics.close(); } } }
TomcatMetricsBinder實(shí)現(xiàn)了ApplicationListener監(jiān)聽ApplicationStartedEvent,同時(shí)也實(shí)現(xiàn)了DisposableBean接口;其onApplicationEvent方法會(huì)獲取applicationContext再獲取tomcat的Manager,最后創(chuàng)建tomcatMetrics,然后執(zhí)行bindTo方法;其close方法主要是執(zhí)行tomcatMetrics的close方法
TomcatMetrics
io/micrometer/core/instrument/binder/tomcat/TomcatMetrics.java
@NonNullApi @NonNullFields public class TomcatMetrics implements MeterBinder { private static final String JMX_DOMAIN_EMBEDDED = "Tomcat"; private static final String JMX_DOMAIN_STANDALONE = "Catalina"; private static final String OBJECT_NAME_SERVER_SUFFIX = ":type=Server"; private static final String OBJECT_NAME_SERVER_EMBEDDED = JMX_DOMAIN_EMBEDDED + OBJECT_NAME_SERVER_SUFFIX; private static final String OBJECT_NAME_SERVER_STANDALONE = JMX_DOMAIN_STANDALONE + OBJECT_NAME_SERVER_SUFFIX; @Nullable private final Manager manager; private final MBeanServer mBeanServer; private final Iterable<Tag> tags; private volatile String jmxDomain; @Override public void bindTo(MeterRegistry registry) { registerGlobalRequestMetrics(registry); registerServletMetrics(registry); registerCacheMetrics(registry); registerThreadPoolMetrics(registry); registerSessionMetrics(registry); } //...... }
TomcatMetrics實(shí)現(xiàn)了MeterBinder接口,其bindTo方法主要是執(zhí)行了registerGlobalRequestMetrics、registerServletMetrics、registerCacheMetrics、registerThreadPoolMetrics、registerSessionMetrics
registerGlobalRequestMetrics
private void registerGlobalRequestMetrics(MeterRegistry registry) { registerMetricsEventually("type", "GlobalRequestProcessor", (name, allTags) -> { FunctionCounter.builder("tomcat.global.sent", mBeanServer, s -> safeDouble(() -> s.getAttribute(name, "bytesSent"))) .tags(allTags) .baseUnit(BaseUnits.BYTES) .register(registry); FunctionCounter.builder("tomcat.global.received", mBeanServer, s -> safeDouble(() -> s.getAttribute(name, "bytesReceived"))) .tags(allTags) .baseUnit(BaseUnits.BYTES) .register(registry); FunctionCounter.builder("tomcat.global.error", mBeanServer, s -> safeDouble(() -> s.getAttribute(name, "errorCount"))) .tags(allTags) .register(registry); FunctionTimer.builder("tomcat.global.request", mBeanServer, s -> safeLong(() -> s.getAttribute(name, "requestCount")), s -> safeDouble(() -> s.getAttribute(name, "processingTime")), TimeUnit.MILLISECONDS) .tags(allTags) .register(registry); TimeGauge.builder("tomcat.global.request.max", mBeanServer, TimeUnit.MILLISECONDS, s -> safeDouble(() -> s.getAttribute(name, "maxTime"))) .tags(allTags) .register(registry); }); }
registerGlobalRequestMetrics主要是注冊(cè)了請(qǐng)求相關(guān)的指標(biāo)
registerServletMetrics
private void registerServletMetrics(MeterRegistry registry) { registerMetricsEventually("j2eeType", "Servlet", (name, allTags) -> { FunctionCounter.builder("tomcat.servlet.error", mBeanServer, s -> safeDouble(() -> s.getAttribute(name, "errorCount"))) .tags(allTags) .register(registry); FunctionTimer.builder("tomcat.servlet.request", mBeanServer, s -> safeLong(() -> s.getAttribute(name, "requestCount")), s -> safeDouble(() -> s.getAttribute(name, "processingTime")), TimeUnit.MILLISECONDS) .tags(allTags) .register(registry); TimeGauge.builder("tomcat.servlet.request.max", mBeanServer, TimeUnit.MILLISECONDS, s -> safeDouble(() -> s.getAttribute(name, "maxTime"))) .tags(allTags) .register(registry); }); }
registerServletMetrics主要是注冊(cè)了servlet相關(guān)的errorCount、requestCount及maxTime
registerCacheMetrics
private void registerCacheMetrics(MeterRegistry registry) { registerMetricsEventually("type", "StringCache", (name, allTags) -> { FunctionCounter.builder("tomcat.cache.access", mBeanServer, s -> safeDouble(() -> s.getAttribute(name, "accessCount"))) .tags(allTags) .register(registry); FunctionCounter.builder("tomcat.cache.hit", mBeanServer, s -> safeDouble(() -> s.getAttribute(name, "hitCount"))) .tags(allTags) .register(registry); }); }
registerCacheMetrics主要是注冊(cè)了tomcat內(nèi)部cache的accessCount、hitCount
registerThreadPoolMetrics
private void registerThreadPoolMetrics(MeterRegistry registry) { registerMetricsEventually("type", "ThreadPool", (name, allTags) -> { Gauge.builder("tomcat.threads.config.max", mBeanServer, s -> safeDouble(() -> s.getAttribute(name, "maxThreads"))) .tags(allTags) .baseUnit(BaseUnits.THREADS) .register(registry); Gauge.builder("tomcat.threads.busy", mBeanServer, s -> safeDouble(() -> s.getAttribute(name, "currentThreadsBusy"))) .tags(allTags) .baseUnit(BaseUnits.THREADS) .register(registry); Gauge.builder("tomcat.threads.current", mBeanServer, s -> safeDouble(() -> s.getAttribute(name, "currentThreadCount"))) .tags(allTags) .baseUnit(BaseUnits.THREADS) .register(registry); }); }
registerThreadPoolMetrics主要是注冊(cè)了tomcat線程池的相關(guān)指標(biāo)
registerSessionMetrics
private void registerSessionMetrics(MeterRegistry registry) { if (manager == null) { // If the binder is created but unable to find the session manager don't register those metrics return; } Gauge.builder("tomcat.sessions.active.max", manager, Manager::getMaxActive) .tags(tags) .baseUnit("sessions") .register(registry); Gauge.builder("tomcat.sessions.active.current", manager, Manager::getActiveSessions) .tags(tags) .baseUnit("sessions") .register(registry); FunctionCounter.builder("tomcat.sessions.created", manager, Manager::getSessionCounter) .tags(tags) .baseUnit("sessions") .register(registry); FunctionCounter.builder("tomcat.sessions.expired", manager, Manager::getExpiredSessions) .tags(tags) .baseUnit("sessions") .register(registry); FunctionCounter.builder("tomcat.sessions.rejected", manager, Manager::getRejectedSessions) .tags(tags) .baseUnit("sessions") .register(registry); TimeGauge.builder("tomcat.sessions.alive.max", manager, TimeUnit.SECONDS, Manager::getSessionMaxAliveTime) .tags(tags) .register(registry); }
registerSessionMetrics主要是注冊(cè)了tomcat的session相關(guān)指標(biāo)
小結(jié)
springboot的TomcatMetricsBinder主要是接收ApplicationStartedEvent然后創(chuàng)建TomcatMetrics執(zhí)行bindTo進(jìn)行注冊(cè),TomcatMetrics主要注冊(cè)了globalRequest、servlet、cache、threadPool、session相關(guān)的指標(biāo)。
到此這篇關(guān)于springboot的TomcatMetricsBinder的文章就介紹到這了,更多相關(guān)springboot TomcatMetricsBinder內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java 圖片驗(yàn)證碼的實(shí)現(xiàn)代碼
java 圖片驗(yàn)證碼的實(shí)現(xiàn)代碼,需要的朋友可以參考一下2013-05-05SpringBoot集成JWT的工具類與攔截器實(shí)現(xiàn)方式
這篇文章主要介紹了SpringBoot集成JWT的工具類與攔截器實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01Java類加載器與雙親委派機(jī)制和線程上下文類加載器專項(xiàng)解讀分析
類加載器負(fù)責(zé)讀取Java字節(jié)代碼,并轉(zhuǎn)換成java.lang.Class類的一個(gè)實(shí)例的代碼模塊。本文主要和大家聊聊JVM類加載器ClassLoader的使用,需要的可以了解一下2022-12-12Java實(shí)現(xiàn)PDF文件的分割與加密功能
這篇文章主要為大家分享了如何利用Java語言實(shí)現(xiàn)PDF文件的分割與加密以及封面圖的生成,文中的示例代碼簡潔易懂,感興趣的可以了解一下2022-04-04Springboot配置過濾器實(shí)現(xiàn)過程解析
這篇文章主要介紹了Springboot配置過濾器實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08java實(shí)現(xiàn)雷霆戰(zhàn)機(jī)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)雷霆戰(zhàn)機(jī),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06