您好,登錄后才能下訂單哦!
Spring Boot 默認指標從哪來,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
您是否注意到 Spring Boot 和 Micrometer 為您的應用生成的所有默認指標? 如果沒有 - 您可以將 actuator 依賴項添加到項目中,然后點擊 / actuator / metrics 端點,在那里您將找到有關 JVM 、進程、Tomcat、流量等的有用信息。 然后,添加一些緩存,數據源 或 JPA 依賴項,甚至會出現更多指標。如果您想知道它們是如何結束的,我們可以在哪里找到關于它們所描述的參數的解釋,那么這篇文章就是為您準備的。
為了讓它井然有序,讓我們從如何在 Spring Boot 應用程序中顯示指標開始。如果您已經知道了,可以跳過這一部分。
Spring Boot中的指標由 micrometer.io 處理。但是,如果您使用 actuator ,則不需要向項目添加 micrometer 依賴項,因為 actuator 已經依賴于它。即使您對它提供的端點不感興趣,也希望您使用 actuator ,因為這是通過其 AutoConfigurations
注冊許多指標的模塊。稍后我們會詳細討論。
因此,首先,只需將執行器依賴項添加到項目中(這里是 build.gradle.kts )
dependencies { implementation("org.springframework.boot:spring-boot-starter-actuator") }
并在執行器端點中顯示指標名稱,點擊 http://localhost:8080/actuator/metrics.
{ "names": [ "jvm.threads.states", "process.files.max", "jvm.memory.used", "jvm.gc.memory.promoted", "jvm.memory.max", "system.load.average.1m", ... ] }
然后,要查看詳細信息,請在 URL 路徑中添加指標名稱,例如: http://localhost:8080/actuator/metrics/system.cpu.count.
{ "name": "system.cpu.count", "description": "The number of processors available to the Java virtual machine", "baseUnit": null, "measurements": [ { "statistic": "VALUE", "value": 8 } ], "availableTags": [ ] }
通過提供特定的儀表注冊表,可以定期將這些指標發送到您選擇的指標系統( Prometheus,New Relic,CloudWatch,Graphite 等)。 讓我們用最簡單的注冊表來做 - LoggingMeterRegistry,它只是定期記錄所有指標。
@Configuration class MetricsConfig { @Bean LoggingMeterRegistry loggingMeterRegistry() { return new LoggingMeterRegistry(); } }
現在,指標也顯示在日志中:
2019-07-17 11:07:09.406 INFO 91283 --- [trics-publisher] i.m.c.i.logging.LoggingMeterRegistry : jvm.buffer.count{id=direct} value=0 buffers 2019-07-17 11:07:09.406 INFO 91283 --- [trics-publisher] i.m.c.i.logging.LoggingMeterRegistry : jvm.buffer.count{id=mapped} value=0 buffers 2019-07-17 11:07:09.406 INFO 91283 --- [trics-publisher] i.m.c.i.logging.LoggingMeterRegistry : jvm.buffer.memory.used{id=direct} value=0 B 2019-07-17 11:07:09.406 INFO 91283 --- [trics-publisher] i.m.c.i.logging.LoggingMeterRegistry : jvm.buffer.memory.used{id=mapped} value=0 B 2019-07-17 11:07:09.408 INFO 91283 --- [trics-publisher] i.m.c.i.logging.LoggingMeterRegistry : jvm.classes.loaded{} value=8530 classes 2019-07-17 11:07:09.408 INFO 91283 --- [trics-publisher] i.m.c.i.logging.LoggingMeterRegistry : jvm.gc.live.data.size{} value=0 B 2019-07-17 11:07:09.408 INFO 91283 --- [trics-publisher] i.m.c.i.logging.LoggingMeterRegistry : jvm.gc.max.data.size{} value=0 B 2019-07-17 11:07:09.410 INFO 91283 --- [trics-publisher] i.m.c.i.logging.LoggingMeterRegistry : jvm.memory.committed{area=nonheap,id=Compressed Class Space} value=6.25 MiB 2019-07-17 11:07:09.410 INFO 91283 --- [trics-publisher] i.m.c.i.logging.LoggingMeterRegistry : jvm.memory.committed{area=heap,id=G1 Eden Space} value=168 MiB ...
那么,如何提供這些指標呢?一個示例可能是 WebMvcMetricsFilter ,向所有 Spring Web MVC 端點添加性能指標 (http.server.requests metric) 。
但是這個例子很簡單。當所有請求都由 Spring 框架處理時,在內部添加調用生成指標是沒有必要的(只檢查 WebMvcMetricsFilter.record() 方法)。
但是,如果您使用純 ehcache 或 hibernate 或其他數據源,然后生成指標,情況又會如何呢?
那么 cache. * 指標呢,即使我 @Autowired
純 net.sf.ehcache.Cache
也會生成?
那么 hibernate. * 指標呢,即使我 @Autowired
純 org.hibernate.SessionFactory
也會生成?
然后, jvm.*
, process.*
, tomcat.*
等如何自動生成?
它似乎比人們想象的更簡單,因為這些統計數據是由受監控的組件本身提供的。 有時,它將直接提供,例如cache.getStatistics()
為 EhCache 提供 StatisticsGateway *,*或 sessionFactory.getStatistics()
為 Hibernate SessionFactory 提供 statistics 等等。
有時,這可以通過其他方式實現,比如托管 bean 。例如,將 RuntimeMXBean 用于 JVM process.*
指標以及 將(如GlobalRequestProcessor
, Servlet
等) Tomcat mbeans
用于 tomcat. * 指標
為了訪問這些統計數據并將其轉換為特定指標,Micrometer 引入了 MeterBinder 的概念。
檢查 MeterBinder
implementation 層次結構,您將了解更多關于可用的指標組的信息。
您也可以直接在 micrometer repo 上檢查。
打開,例如, EhCache2Metrics ,您將找到 Ehcache 統計信息映射到特定 Micrometer 指標的內容和方式。
cache.size -> StatisticsGateway:getSize cache.gets{result=miss} -> StatisticsGateway:cacheMissCount cache.gets{result=hit} -> StatisticsGateway:cacheHitCount cache.puts -> StatisticsGateway:cachePutCount cache.evictions -> StatisticsGateway:cacheEvictedCount cache.remoteSize -> StatisticsGateway::getRemoteSize cache.removals -> StatisticsGateway::cacheRemoveCount cache.puts.added{result=added} -> StatisticsGateway::cachePutAddedCount cache.puts.added{result=updated} -> StatisticsGateway::cachePutAddedCount cache.misses{reason=expired} -> StatisticsGateway::cacheMissExpiredCount) cache.misses{reason=notFound} -> StatisticsGateway::cacheMissNotFoundCount) cache.xa.commits{result=readOnly} -> StatisticsGateway::xaCommitReadOnlyCount cache.xa.commits{result=exception} -> StatisticsGateway::xaCommitExceptionCount cache.xa.commits{result=committed} -> StatisticsGateway::xaCommitCommittedCount cache.xa.rollbacks{result=exception} -> StatisticsGateway::xaRollbackExceptionCount cache.xa.rollbacks{result=success} -> StatisticsGateway::xaRollbackSuccessCount cache.xa.recoveries{result=nothing} -> StatisticsGateway::xaRecoveryNothingCount cache.xa.recoveries{result=success} -> StatisticsGateway::xaRecoveryRecoveredCount cache.local.offheap.size -> StatisticsGateway::getLocalOffHeapSize) cache.local.heap.size -> StatisticsGateway::getLocalHeapSizeInBytes cache.local.disk.size -> StatisticsGateway::getLocalDiskSizeInBytes
注冊 MeterBinders
是非常簡單的,示例可以在 micrometer 文檔 中被找到。
記住,您可以手動操作:
new ClassLoaderMetrics().bindTo(registry); new JvmMemoryMetrics().bindTo(registry); new EhCache2Metrics(cache, Tags.of("name", cache.getName())).bindTo(registry) new TomcatMetrics(manager, tags).bindTo(registry) ...
或者,您可以使用 Spring Boot ,它會在引擎下為您做這件事。
正如我之前提到的,actuator 將提供許多 AutoConfiguration
s 和 MetricsBinders
,只要添加給定的依賴項,它就會注冊 MeterBinders
。
例如, TomcatMetricsBinder 將注冊 TomcatMetrics (為您的嵌入式容器)。MeterRegistryConfigurer 將注冊 JVM 、運行時間 和其他系統指標。
現在,假設您想在您的應用程序中使用 Ehcache 。 您可以添加兩個依賴項:
implementation("org.springframework.boot:spring-boot-starter-cache") implementation("net.sf.ehcache:ehcache")
然后注冊緩存(您也可以通過 ehcache.xml 來實現)
@Bean Cache playCache(EhCacheCacheManager cacheManager) { CacheConfiguration cacheConfiguration = new CacheConfiguration() .name(CACHE_NAME) .maxEntriesLocalHeap(MAX_ELEMENTS_IN_MEMORY); Cache cache = new Cache(cacheConfiguration); cacheManager.getCacheManager().addCache(cache); cacheManager.initializeCaches(); return cache; }
現在, CacheMetricsRegistrarConfiguration 將通過 Spring 緩存管理器為每一個緩存管理注冊 EhCache2Metrics 。
如果您不想使用 Spring 緩存管理,您也可以自己注冊 EhCache2Metrics
。
現在,啟動應用程序,您將看到其他 ehcache 指標。
2019-07-17 13:08:45.113 INFO 93052 --- [trics-publisher] i.m.c.i.logging.LoggingMeterRegistry : cache.gets{cache=playCache,cacheManager=cacheManager,name=playCache,result=hit} throughput=12.95/s 2019-07-17 13:08:45.124 INFO 93052 --- [ Thread-4] i.m.c.i.logging.LoggingMeterRegistry : cache.misses{cache=playCache,cacheManager=cacheManager,name=playCache,reason=notFound} throughput=3.7/s 2019-07-17 13:08:45.124 INFO 93052 --- [trics-publisher] i.m.c.i.logging.LoggingMeterRegistry : cache.gets{cache=playCache,cacheManager=cacheManager,name=playCache,result=miss} throughput=3.7/s 2019-07-17 13:08:48.840 INFO 93052 --- [ Thread-4] i.m.c.i.logging.LoggingMeterRegistry : cache.puts{cache=playCache,cacheManager=cacheManager,name=playCache} throughput=16.65/s 2019-07-17 13:08:48.840 INFO 93052 --- [trics-publisher] i.m.c.i.logging.LoggingMeterRegistry : cache.misses{cache=playCache,cacheManager=cacheManager,name=playCache,reason=notFound} throughput=3.7/s 2019-07-17 13:08:48.841 INFO 93052 --- [trics-publisher] i.m.c.i.logging.LoggingMeterRegistry : cache.puts{cache=playCache,cacheManager=cacheManager,name=playCache} throughput=16.65/s 2019-07-17 13:08:48.841 INFO 93052 --- [ Thread-4] i.m.c.i.logging.LoggingMeterRegistry : cache.puts.added{cache=playCache,cacheManager=cacheManager,name=playCache,result=updated} throughput=0.116667/s 2019-07-17 13:08:48.841 INFO 93052 --- [trics-publisher] i.m.c.i.logging.LoggingMeterRegistry : cache.puts.added{cache=playCache,cacheManager=cacheManager,name=playCache,result=updated} throughput=0.116667/s 2019-07-17 13:08:48.841 INFO 93052 --- [ Thread-4] i.m.c.i.logging.LoggingMeterRegistry : cache.puts.added{cache=playCache,cacheManager=cacheManager,name=playCache,result=added} throughput=0.116667/s 2019-07-17 13:08:48.842 INFO 93052 --- [trics-publisher] i.m.c.i.logging.LoggingMeterRegistry : cache.puts.added{cache=playCache,cacheManager=cacheManager,name=playCache,result=added} throughput=0.116667/s 2019-07-17 13:08:48.847 INFO 93052 --- [trics-publisher] i.m.c.i.logging.LoggingMeterRegistry : cache.local.disk.size{cache=playCache,cacheManager=cacheManager,name=playCache} value=0 B 2019-07-17 13:08:48.847 INFO 93052 --- [ Thread-4] i.m.c.i.logging.LoggingMeterRegistry : cache.local.disk.size{cache=playCache,cacheManager=cacheManager,name=playCache} value=0 B 2019-07-17 13:08:48.908 INFO 93052 --- [ Thread-4] i.m.c.i.logging.LoggingMeterRegistry : cache.local.heap.size{cache=playCache,cacheManager=cacheManager,name=playCache} value=1.039062 KiB 2019-07-17 13:08:48.908 INFO 93052 --- [trics-publisher] i.m.c.i.logging.LoggingMeterRegistry : cache.local.heap.size{cache=playCache,cacheManager=cacheManager,name=playCache} value=1.039062 KiB 2019-07-17 13:08:48.909 INFO 93052 --- [trics-publisher] i.m.c.i.logging.LoggingMeterRegistry : cache.local.offheap.size{cache=playCache,cacheManager=cacheManager,name=playCache} value=0 B 2019-07-17 13:08:48.909 INFO 93052 --- [ Thread-4] i.m.c.i.logging.LoggingMeterRegistry : cache.local.offheap.size{cache=playCache,cacheManager=cacheManager,name=playCache} value=0 B 2019-07-17 13:08:48.909 INFO 93052 --- [ Thread-4] i.m.c.i.logging.LoggingMeterRegistry : cache.remoteSize{} value=0 2019-07-17 13:08:48.909 INFO 93052 --- [trics-publisher] i.m.c.i.logging.LoggingMeterRegistry : cache.remoteSize{} value=0 2019-07-17 13:08:48.909 INFO 93052 --- [ Thread-4] i.m.c.i.logging.LoggingMeterRegistry : cache.size{cache=playCache,cacheManager=cacheManager,name=playCache} value=7 2019-07-17 13:08:48.909 INFO 93052 --- [trics-publisher] i.m.c.i.logging.LoggingMeterRegistry : cache.size{cache=playCache,cacheManager=cacheManager,name=playCache} value=7
在這種情況下,指標上下文中每個組件的職責可歸納為:
您可以在 此處 提供的示例應用中查看所有這些概念。
看完上述內容,你們掌握Spring Boot 默認指標從哪來的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。