这里主要介绍metrics与spring集成的使用方式。
1 添加maven依赖
<dependency> <groupId>com.ryantenney.metrics</groupId> <artifactId>metrics-spring</artifactId> <version>3.1.2</version> </dependency> <dependency> <groupId>io.dropwizard.metrics</groupId> <artifactId>metrics-jvm</artifactId> <version>3.1.2</version> </dependency>
2 spring配置文件
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:metrics="http://www.ryantenney.com/schema/metrics" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.ryantenney.com/schema/metrics http://www.ryantenney.com/schema/metrics/metrics-3.0.xsd"> <!-- Registry 声明 --> <metrics:metric-registry id="metrics" /> <!-- 使用注解 --> <metrics:annotation-driven metric-registry="metrics" /> <!-- 采用log的方式输出metrics --> <metrics:reporter type="slf4j" metric-registry="metrics" period="5m" /> <!-- 通过metrics监控jvm状态--> <metrics:register metric-registry="metrics"> <bean metrics:name="jvm.gc" class="com.codahale.metrics.jvm.GarbageCollectorMetricSet" /> <bean metrics:name="jvm.memory" class="com.codahale.metrics.jvm.MemoryUsageGaugeSet" /> <bean metrics:name="jvm.thread-states" class="com.codahale.metrics.jvm.ThreadStatesGaugeSet" /> <bean metrics:name="jvm.fd.usage" class="com.codahale.metrics.jvm.FileDescriptorRatioGauge" /> </metrics:register> <!-- Beans and other Spring config --> </beans>
3 配置log
查看Slf4jReporter的Builder方法发现,它是通过"metrics"这个字符串获取的Logger。源码如下
因此需要在logback文件中添加一个名为”metrics"的logger
<appender name="metricsFILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>/data/logs/pname/pname_metrics_%d{yyyyMMdd}.log</fileNamePattern> </rollingPolicy> <encoder charset="UTF-8"> <pattern>%d{HH:mm:ss} %-5p %c:%L - %m%n</pattern> </encoder> </appender> <logger name="metrics" level="INFO" additivity="false"> <appender-ref ref="metricsFILE" /> </logger>
4 对需要监控的方法,使用如下注解@Timed
, @Metered
,@ExceptionMetered 。。等等(具体含义,参考官方文档)
比如,我要监控bar()方法的每秒请求量,方法平均执行时间,方法调用次数等,就可以使用@Timed注解。
@Timed public void bar() { /* … */ }
需要注意的是,由于spring AOP的限制,这些注解只有用于 public方法中。
5 效果如下所示,每个方法的执行时间,每秒请求量,jvm状态等等数据,一目了然。也可以将这些metercs数据存入时间序列数据库(opentsdb,influxdb等)