Pepper Metrics项目从核心概念上来说,基于Tom Wilkie的RED理论,即对每个服务 (这里的服务特指进程中的某种调用,比如调用一次数据库查询)进行RED指标收集,并持久化到数据库,并通过dashboard进行展示,辅助进行性能趋势分析。
各个组件说明
- Profiler, 核心部分,用于启动定期调度任务,并通过ExtensionLoad加载所有的ScheduledRun扩展,按照指定周期发起调度。同时内部维护Stats的构造器Profiler.Builder
- Scheduler, 虚拟概念,在Profiler作为一个定时任务存在
- ExtensionLoader, 非常重要的组件,通过Java SPI机制加载插件,使项目的各个模块可以灵活插拔,也是项目架构的基石
- ScheduledRun, 扩展点:pepper metrics core会定时调度,传递所有的Stats,实现插件可以使用Stats当中收集到的性能数据,目前已实现的为scheduled printer组件
- Pepper Metrics X, 具体的集成,我们的目标是度量一切,目前计划实现的为:jedis,motan,dubbo,servlet,mybatis等最常用组件
以Mybatis集成为例,更多其他请参考:User Guide
<dependencies> <!-- pepper metrics dependencies --> <dependency> <groupId>top.zrbcool</groupId> <artifactId>pepper-metrics-mybatis</artifactId> <version>1.0.11</version> </dependency> <!-- pepper-metrics datasource use prometheus by default --> <dependency> <groupId>top.zrbcool</groupId> <artifactId>pepper-metrics-ds-prometheus</artifactId> <version>1.0.11</version> </dependency> </dependencies>
<configuration> <typeAliases> ... </typeAliases> <!-- 加入如下配置 --> <plugins> <plugin interceptor="com.pepper.metrics.integration.mybatis.MybatisProfilerPlugin" /> </plugins> <mappers> ... </mappers> </configuration>
18:27:28 [perf-mybatis:20190822182728] --------------------------------------------------------------------------------------------------------------------------------------------------------- 18:27:28 [perf-mybatis:20190822182728] | Metrics Concurrent Count(Err/Sum) P90(ms) P99(ms) P999(ms) Max(ms) Qps | 18:27:28 [perf-mybatis:20190822182728] | com.pepper.metrics.sample.mybatis.mapper.HotelMapper.selectByCityId 0 0/1950 0.6 1.4 2.5 3.5 32.5 | 18:27:28 [perf-mybatis:20190822182728] | sample.mybatis.mapper.CityMapper.selectCityById 0 0/1950 0.8 2.4 56.6 56.6 32.5 | 18:27:28 [perf-mybatis:20190822182728] ---------------------------------------------------------------------------------------------------------------------------------------------------------
✗ curl localhost:9146/metrics # HELP app_mapper_summary_seconds_max # TYPE app_mapper_summary_seconds_max gauge app_mapper_summary_seconds_max{class="com/pepper/metrics/sample/mybatis/mapper/CityMapper.xml",operation="sample.mybatis.mapper.CityMapper.selectCityById",} 0.051129036 app_mapper_summary_seconds_max{class="com/pepper/metrics/sample/mybatis/mapper/HotelMapper.xml",operation="com.pepper.metrics.sample.mybatis.mapper.HotelMapper.selectByCityId",} 0.011559611 # HELP app_mapper_summary_seconds # TYPE app_mapper_summary_seconds summary app_mapper_summary_seconds{class="com/pepper/metrics/sample/mybatis/mapper/CityMapper.xml",operation="sample.mybatis.mapper.CityMapper.selectCityById",quantile="0.9",} 5.5296E-4 app_mapper_summary_seconds{class="com/pepper/metrics/sample/mybatis/mapper/CityMapper.xml",operation="sample.mybatis.mapper.CityMapper.selectCityById",quantile="0.99",} 0.001765376 app_mapper_summary_seconds{class="com/pepper/metrics/sample/mybatis/mapper/CityMapper.xml",operation="sample.mybatis.mapper.CityMapper.selectCityById",quantile="0.999",} 0.052424704 app_mapper_summary_seconds{class="com/pepper/metrics/sample/mybatis/mapper/CityMapper.xml",operation="sample.mybatis.mapper.CityMapper.selectCityById",quantile="0.99999",} 0.052424704 app_mapper_summary_seconds_count{class="com/pepper/metrics/sample/mybatis/mapper/CityMapper.xml",operation="sample.mybatis.mapper.CityMapper.selectCityById",} 3040.0 app_mapper_summary_seconds_sum{class="com/pepper/metrics/sample/mybatis/mapper/CityMapper.xml",operation="sample.mybatis.mapper.CityMapper.selectCityById",} 1.45711331 app_mapper_summary_seconds{class="com/pepper/metrics/sample/mybatis/mapper/HotelMapper.xml",operation="com.pepper.metrics.sample.mybatis.mapper.HotelMapper.selectByCityId",quantile="0.9",} 4.4032E-4 app_mapper_summary_seconds{class="com/pepper/metrics/sample/mybatis/mapper/HotelMapper.xml",operation="com.pepper.metrics.sample.mybatis.mapper.HotelMapper.selectByCityId",quantile="0.99",} 0.001308672 app_mapper_summary_seconds{class="com/pepper/metrics/sample/mybatis/mapper/HotelMapper.xml",operation="com.pepper.metrics.sample.mybatis.mapper.HotelMapper.selectByCityId",quantile="0.999",} 0.002881536 app_mapper_summary_seconds{class="com/pepper/metrics/sample/mybatis/mapper/HotelMapper.xml",operation="com.pepper.metrics.sample.mybatis.mapper.HotelMapper.selectByCityId",quantile="0.99999",} 0.012056576 app_mapper_summary_seconds_count{class="com/pepper/metrics/sample/mybatis/mapper/HotelMapper.xml",operation="com.pepper.metrics.sample.mybatis.mapper.HotelMapper.selectByCityId",} 3040.0 app_mapper_summary_seconds_sum{class="com/pepper/metrics/sample/mybatis/mapper/HotelMapper.xml",operation="com.pepper.metrics.sample.mybatis.mapper.HotelMapper.selectByCityId",} 0.772147736 # HELP app_mapper_concurrent_gauge # TYPE app_mapper_concurrent_gauge gauge app_mapper_concurrent_gauge{class="com/pepper/metrics/sample/mybatis/mapper/CityMapper.xml",operation="sample.mybatis.mapper.CityMapper.selectCityById",} 0.0 app_mapper_concurrent_gauge{class="com/pepper/metrics/sample/mybatis/mapper/HotelMapper.xml",operation="com.pepper.metrics.sample.mybatis.mapper.HotelMapper.selectByCityId",} 0.0
以Mybatis为例,更多其他请参考:User Guide
<dependencies> <!-- pepper metrics dependencies --> <dependency> <groupId>top.zrbcool</groupId> <artifactId>pepper-metrics-mybatis</artifactId> <version>1.0.11</version> </dependency> <!-- pepper-metrics datasource use prometheus by default --> <dependency> <groupId>top.zrbcool</groupId> <artifactId>pepper-metrics-ds-prometheus</artifactId> <version>1.0.11</version> </dependency> </dependencies>
mvn clean package install
从Chromium的内容模块收集跟踪数据,以发现性能瓶颈和缓慢的操作 进程: 主进程 这个模块不具备web接口,需要我们在chrome浏览器中添加 chrome://tracing/ 来加载生成结果文件. 注意该模块应当在 ready事件之后使用. 1 const {contentTracing} = require('electron') 2 const options = { 3 categ
用户期望页面的交互性和流畅。但是在传输到显示器的过程中每个阶段都可能出现闪烁卡顿。 接下来我们将了解用于识别和解决运行时性能降低的常见问题的工具和策略。 TL;DR 不要编写强制浏览器重新计算布局的JavaScript。分离读写函数,并首先执行读取。 不要使您的CSS过于复杂。使用更少的CSS和保持你的CSS选择器简单。尽可能多避免layout。 总是选择不触发layout的CSS。 绘画可能占用
问题内容: 我对可以控制CMS收集器启动时间的两个参数感到困惑: (默认为70%) (默认情况下超过90%) 这些参数的确切含义是什么?收集器什么时候开始(标记阶段)并收集(清扫阶段)? 问题答案: 决定何时启动CMS(为了使此选项生效,您还必须设置)。是确定世代空间大小的选项。 参见例如… http://java.sun.com/docs/hotspot/gc1.4.2/faq.html 通常无
我有一个企业级Java应用程序,每天为几千个用户提供服务。这是weblogic 10.3.6(Java1.6 JVM)上的JAXB Web服务,使用Hibernate访问Oracle数据库。它还调用其他Web服务。 我们在生产系统上调整了以下GC设置: 这种GC分级的效果是什么?硬件有足够的容量来处理它。 我知道这将堆大小和perm-gen设置在一个稳定的水平。但当你最终不得不进行垃圾收集时,这会
从方法1开始,我一直在研究Leetcode问题的不同算法。如果阵列值是墙的高度,则需要计算总水域面积(列宽=1)。 第一种方法是找出每根立柱左右两侧最大墙高的最小高度,如果立柱高度小于最小值,则向给定立柱顶部加水。取最小值,因为这是收集的水能够达到的最高值。要计算每侧的最大值,需要对左侧和右侧进行n-1次遍历。 我用Python编写代码,但下面是根据Leetcode上给出的解决方案用C编写的代码。
问题内容: 您可以简单地通过调用Java来进行垃圾回收,但有时这会使应用程序“停滞”。这样垃圾收集并避免停顿是一个坏主意: 还是可能导致更多问题? 问题答案: 是的,在大多数情况下,调用System.gc()是一个非常糟糕的主意。有例外,但例外很少,最好花一些时间来确保自己不会在GC环境中做会损害性能的事情,并且学习并确保自己了解gc的工作方式比尝试自己处理它要好得多。显式调用System.gc(
如果“运行APP出错:即时运行需要启用‘工具Android启用ADB集成’。”问题发生在使用最新的Gradle插件和最新的Android SDK。您可以使用截图中提到的以下解决方案 在你的分级文件中,只需根据图表启用3个选项(默认情况下,所有选项都将启用)。 这个解决方案奇怪地对我起作用了。我不知道这是工作室发行或其他与Gradle插件。但有人有更好的解决方案或确切的解决方案,请大家分享。