当前位置: 首页 > 科技观察

SpringBoot默认的指标数据从何而来?

时间:2023-03-20 14:50:50 科技观察

您是否注意到SpringBoot和Micrometer为您的应用程序生成的所有默认指标?如果没有-您可以将执行器依赖项添加到您的项目,然后点击/actuator/metrics端点,在那里您将找到有关JVM、进程、Tomcat、流量等的有用信息。然后,添加一些缓存、数据源或JPA依赖项等等指标将出现。如果您想知道它们是如何结束的,我们在哪里可以找到有关它们描述的参数的解释,那么本文适合您。显示指标为了让事情井井有条,让我们从如何在SpringBoot应用程序中显示指标开始。如果您已经知道,可以跳过这部分。SpringBoot中的指标由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":"ThenumberofprocessorsavailabletotheJavavirtualmachine","baseUnit":null,"measurements":[{"statistic":"VALUE","value":8}],"availableTags":[]}通过提供特定的仪表注册表,这些指标可以定期发送到您选择的指标系统(Prometheus、NewRelic、CloudWatch、Graphite,ETC。)。让我们使用最简单的注册表-LoggingMeterRegistry来完成它,它只是定期记录所有指标。@ConfigurationclassMetricsConfig{@BeanLoggingMeterRegistryloggingMeterRegistry(){returnnewLoggingMeterRegistry();}}现在,指标也显示在日志中:2019-07-1711:07:09.406INFO91283---[trics-publisher]i.m.c.i.logging.LoggingMeter.loggingMetercount{id=direct}value=0buffers2019-07-1711:07:09.406INFO91283---[trics-publisher]i.m.c.i.logging.LoggingMeterRegistry:jvm.buffer.count{id=mapped}value=0buffers2019-07-1711:07:09.406INFO91283---[trics-publisher]i.m.c.i.logging.LoggingMeterRegistry:jvm.buffer.memory.used{id=direct}value=0B2019-07-1711:07:09.406INFO91283---[trics-publisher]i.m.c.i.logging.LoggingMeterRegistry:jvm.buffer.memory.used{id=mapped}value=0B2019-07-1711:07:09.408INFO91283---[trics-publisher]i.m.c.i.logging.LoggingMeterRegistry:jvm.classes.loaded{}value=8530classes2019-07-1711:07:09.408INFO91283---[trics-publisher]i.m.c.i.logging.LoggingMeterRegistry:jvm.gc.live.data.size{}值=0B2019-07-1711:07:09.408INFO91283---[trics-发布者]i.m.c.i.logging.LoggingMeterRegistry:jvm.gc.max.data.size{}value=0B2019-07-1711:07:09.410INFO91283---[trics-publisher]i.m.c.i.logging.LoggingMeterRegistry:jvm.memory.committed{area=nonheap,id=CompressedClassSpace}value=6.25MiB2019-07-1711:07:09.410INFO91283---[trics-publisher]i.m.c.i.logging.LoggingMeterRegistry:jvm.memory.committed{area=heap,id=G1EdenSpace}value=168MiB...公制供应那么如何提供这些指标呢?一个示例可能是WebMvcMetricsFilter,它向所有SpringWebMVC端点添加性能指标(http.server.requests指标),但这个示例很简单。当所有请求都由Spring框架处理时,无需添加调用以在内部生成指标(只需检查WebMvcMetricsFilter.record()方法)。但是,如果您使用纯ehcache或hibernate或其他一些数据源然后生成指标怎么办?cache.*指标呢,即使我@Autowiredpurenet.sf.ehcache.Cache?hibernate.*指标怎么样,即使我@Autowired是一个纯org.hibernate.SessionFactory?那么jvm.*、process.*、tomcat.*等是如何自动生成的呢?它似乎比人们想象的要简单,因为这些统计信息是由受监视组件本身提供的。有时,它会直接提供,例如cache.getStatistics()为EhCache提供StatisticsGateway*,*或sessionFactory.getStatistics()为HibernateSessionFactory等提供统计信息。有时这可以通过其他方式实现,例如托管bean。例如,将RuntimeMXBean用于JVMprocess.*指标和(例如GlobalRequestProcessor、Servlet等)Tomcatmbeans用于tomcat.*指标为了访问这些统计信息并将它们转换为特定指标,Micrometer引入了MeterBinder的概念。检查MeterBinder实现层次结构,您将了解有关可用指标组的更多信息。MicrometerMeterBinders您也可以直接在Micrometerrepo上查看。例如,打开EhCache2Metrics,您将了解Ehcache统计数据映射到特定Micrometer指标的内容和方式。cache.size->统计网关:getSizecache.gets{result=miss}->统计网关:cacheMissCountcache.gets{result=hit}->统计网关:cacheHitCountcache.puts->统计网关:cachePutCountcache.evictions->统计网关:cacheEvictedCountcache.remoteSize->StatisticsGateway::getRemoteSizecache.removals->StatisticsGateway::cacheRemoveCountcache.puts.added{result=added}->StatisticsGateway::cachePutAddedCountcache.puts.added{result=updated}->StatisticsGateway::cachePutAddedCountcache.misses{reason=expired}->StatisticsGateway::cacheMissExpiredCount)cache.misses{reason=notFound}->StatisticsGateway::cacheMissNotFoundCount)cache.xa.commits{result=readOnly}->StatisticsGateway::xaCommitReadOnlyCountcache.xa.commits{result=exception}->统计网关::xaCommitExceptionCountcache.xa.commits{result=committed}->StatisticsGateway::xaCommitCommittedCountcache.xa.rollbacks{result=exception}->StatisticsGateway::xaRollbackExceptionCountcache.xa.rollbacks{result=success}->StatisticsGateway::xaRollbackSuccessCountcache.xa.recoveries{result=nothing}->StatisticsGateway::xaRecoveryNothingCountcache.xa.recoveries{result=success}->local.StatisticsGateway::xaRecoveryRecoveryRecovery.大小->StatisticsGateway::getLocalOffHeapSize)cache.local.heap.size->StatisticsGateway::getLocalHeapSizeInBytescache.local.disk.size->StatisticsGateway::getLocalDiskSizeInBytes注册MeterBinders非常简单,示例可以在micrometer文档中找到你可以做到手动:newClassLoaderMetrics().bindTo(registry);newJvmMemoryMetrics().bindTo(registry);newEhCache2Metrics(cache,Tags.of("name",cache.getName())).bindTo(registry)newTomcatMetrics(manager,tags).bindTo(registry)...或者,您可以使用SpringBoot,它将在后台为您执行此操作。正如我之前提到的,执行器将提供许多AutoConfiguration和MetricsBinders,并且一旦添加了给定的依赖项,它就会注册MeterBinders。例如,TomcatMetricsBinder将注册TomcatMetrics(用于您的嵌入式容器)。MeterRegistryConfigurer将注册JVM、运行时和其他系统指标。现在,假设您想在您的应用程序中使用Ehcache。可以添加两个依赖:implementation("org.springframework.boot:spring-boot-starter-cache")implementation("net.sf.ehcache:ehcache")然后注册缓存(也可以传ehcache.xml给实际)@BeanCacheplayCache(EhCacheCacheManagercacheManager){CacheConfigurationcacheConfiguration=newCacheConfiguration().name(CACHE_NAME).maxEntriesLocalHeap(MAX_ELEMENTS_IN_MEMORY);Cachecache=newCache(cacheConfiguration);cacheManager.getCacheManager().addCache(cache);cacheManager.initializeCaches();returncache;现在CacheMetricsRegistrarConfiguration会为每个缓存管理器向Spring缓存管理器注册EhCache2Metrics,如果你不想使用Spring缓存管理器,你也可以自己注册EhCache2Metrics,现在启动应用程序,你会看到其他的ehcache指标。2019-07-1713:08:45.113INFO93052---[trics-publisher]i.m.c.i.logging.LoggingMeterRegistry:cache.gets{cache=playCache,cacheManagercacheManager=cacheManager,name=playCache,result=hit}吞吐量=12.95/s2019-07-1713:08:45.124INFO93052---[Thread-4]i.m.c.i.logging.LoggingMeterRegistry:cache.misses{cache=playCache,cacheManagercacheManager=cacheManager,name=playCache,reason=notFound}throughput=3.7/s2019-07-1713:08:45.124INFO93052---[trics-publisher]i.m.c.i.logging.LoggingMeterRegistry:cache.gets{cache=playCache,cacheManagercacheManager=cacheManager,name=playCache,result=miss}吞吐量=3.7/s2019-07-1713:08:48.840INFO93052---[Thread-4]i.m.c.i.logging.LoggingMeterRegistry:cache.puts{cache=playCache,cacheManagercacheManager=cacheManager,name=playCache}吞吐量=16.65/s2019-07-1713:08:48.840INFO93052---[trics-出版商]i.m.c.i.logging.LoggingMeterRegistry:cache.misses{cache=playCache,cacheManagercacheManager=cacheManager,name=playCache,reason=notFound}通过put=3.7/s2019-07-1713:08:48.841INFO93052---[trics-publisher]i.m.c.i.logging.LoggingMeterRegistry:cache.puts{cache=playCache,cacheManagercacheManager=cacheManager,name=playCache}吞吐量=16.65/s2019-07-1713:08:48.841INFO93052---[Thread-4]i.m.c.i.logging.LoggingMeterRegistry:cache.puts.added{cache=playCache,cacheManagercacheManager=cacheManager,name=playCache,result=updated}吞吐量=0.116667/s2019-07-1713:08:48.841INFO93052---[trics-publisher]i.m.c.i.logging.LoggingMeterRegistry:cache.puts.added{cache=playCache,cacheManagercacheManager=cacheManager,name=playCache,result=updated}吞吐量=0.116667/s2019-07-1713:08:48.841INFO93052---[Thread-4]i.m.c.i.logging.LoggingMeterRegistry:cache.puts.added{cache=playCache,cacheManagercacheManager=cacheManager,name=playCache,result=added}吞吐量=0.116667/s2019-07-1713:08:48.842INFO93052---[trics-publisher]i.m.c.i.logging.LoggingMeterRegistry:cache.puts.added{cache=playCache,cacheManagercacheManager=缓存管理器,name=playCache,result=added}throughput=0.116667/s2019-07-1713:08:48.847INFO93052---[trics-publisher]i.m.c.i.logging.LoggingMeterRegistry:cache.local.disk.size{cache=playCache,cacheManagercacheManager=cacheManager,name=playCache}value=0B2019-07-1713:08:48.847INFO93052---[线程4]i.m.c.i.logging.LoggingMeterRegistry:cache.local.disk.size{cache=playCache,cacheManagercacheManager=cacheManager,name=playCache}value=0B2019-07-1713:08:48.908INFO93052---[Thread-4]i.m.c.i.logging.LoggingMeterRegistry:cache.local.heap.size{cache=playCache,cacheManagercacheManager=cacheManager,name=playCache}value=1.039062KiB2019-07-1713:08:48.908INFO93052---[trics-publisher]i.m.c.i.logging.LoggingMeterRegistry:cache.local.heap.size{cache=playCache,cacheManagercacheManager=cacheManager,name=playCache}value=1.039062KiB2019-07-1713:08:48.909INFO93052---[trics-publisher]i.m.c.i.logging.LoggingMeterRegistry:cache.local.offheap.size{cache=playCache,cacheManagercacheManager=cacheManager,name=playCache}value=0B2019-07-1713:08:48.909INFO93052---[Thread-4]i.m.c.i.logging.LoggingMeterRegistry:cache.local.offheap.size{cache=playCache,cacheManagercacheManager=cacheManager,名称=playCache}value=0B2019-07-1713:08:48.909INFO93052---[Thread-4]i.m.c.i.logging.LoggingMeterRegistry:cache.remoteSize{}value=02019-07-1713:08:48.909INFO93052---[trics-publisher]i.m.c.i.logging.LoggingMeterRegistry:cache.remoteSize{}值=02019-07-1713:08:48.909INFO93052---[Thread-4]i.m.c.i.logging.LoggingMeterRegistry:cache.size{cache=playCache,cacheManagercacheManager,=cacheManagername=playCache}value=72019-07-1713:08:48.909INFO93052---[trics-publisher]i.m.c.i.logging.LoggingMeterRegistry:cache.size{cache=playCache,cacheManagercacheManager=cacheManager,name=playCache}value=7这里在在这种情况下,度量上下文中每个组件的职责可以概括为:EhcacheMetricsArchitecture您可以在此处提供的示例应用程序中看到所有这些概念