grafna监控Java接口_Java Metrics与Docker系统接口监控概览

微服务、Java Metrics、Docker、业务系统接口监控概览

1.记录类AccessMetricsFilter.java

@Log4j2

@Component

@ConditionalOnClass(MetricRegistry.class)

public class AccessMetricsFilter extends OncePerRequestFilter {

private final String METRIC_SUFFIX_TIME = ".url_exec";

@Value("${spring.application.name}")

private String applicationName;

private String[] excludeUrls = {};

@Override

public void afterPropertiesSet() throws ServletException {

excludeUrls = new String[]{applicationName + "/tools/", applicationName + "/admin/tools"};

}

@Override

protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException {

//排除url

String sourceUrl = request.getRequestURI();

for (String excludeUrl : excludeUrls) {

if (sourceUrl.indexOf(excludeUrl) != -1) {

return true;

}

}

return false;

}

@Autowired

private MetricRegistry metricRegistry;

@Override

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

String uri = request.getRequestURI().replaceAll("[/\\.]", "_");

long startTime = System.nanoTime();

long duration = 0L;

try {

filterChain.doFilter(request, response);

duration = System.nanoTime() - startTime;

} finally {

//优先取本次记录的错误码

Integer statusCode = (Integer) request.getAttribute(Constants.SERVER_ERROR_CODE);

if (statusCode == null) {

statusCode = response.getStatus();

}

//记录分析数据

Timer timer = metricRegistry.timer(uri + "." + statusCode + METRIC_SUFFIX_TIME);

timer.update(duration, TimeUnit.NANOSECONDS);

if (log.isInfoEnabled()) {

log.info("req: url={}, time={}ms, status={}", uri, TimeUnit.MILLISECONDS.convert(duration, TimeUnit.NANOSECONDS), statusCode);

}

}

}

}

2.指标上报配置类MetricsConfiguration.java

@Configuration

@ConditionalOnClass(MetricRegistry.class)

@EnableMetrics

@AutoConfigureAfter(MetricsConfig.class)

@Log4j2

public class MetricsConfiguration extends MetricsConfigurerAdapter {

@Value("${spring.application.name}")

private String applicationName;

@Autowired

private MetricsConfig metricsConfig;

@Override

public void configureReporters(MetricRegistry metricRegistry) {

// 采集jvm指标

metricRegistry.register("-.-.jvm.gc", new com.codahale.metrics.jvm.GarbageCollectorMetricSet());

metricRegistry.register("-.-.jvm.memory", new com.codahale.metrics.jvm.MemoryUsageGaugeSet());

metricRegistry.register("-.-.jvm.thread-states", new com.codahale.metrics.jvm.ThreadStatesGaugeSet());

metricRegistry.register("-.-.jvm.fd.usage", new com.codahale.metrics.jvm.FileDescriptorRatioGauge());

// 配置Influxdb

HttpInfluxdbProtocol influxdbProtocol = new HttpInfluxdbProtocol("http", metricsConfig.getHost(), metricsConfig.getPort(), metricsConfig.getUsername(), metricsConfig.getPassword(), metricsConfig.getDb());

InfluxdbReporter.Builder builder = InfluxdbReporter.forRegistry(metricRegistry).protocol(influxdbProtocol);

builder.convertRatesTo(TimeUnit.SECONDS).convertDurationsTo(TimeUnit.MILLISECONDS);

builder.filter(MetricFilter.ALL).skipIdleMetrics(true);

builder.tag("server", applicationName).tag("ip", HttpUtil.getDockerHostIp()).tag("cid", HttpUtil.getLocalHostName());

builder.transformer(new CategoriesMetricMeasurementTransformer("url", "code"));

// 启动上报

ScheduledReporter reporter = builder.build();

reporter.start(metricsConfig.getPeriod(), TimeUnit.SECONDS);

log.debug("grafana上报初始化完成:host={}, port={}, db={}", metricsConfig.getHost(), metricsConfig.getPort(), metricsConfig.getDb());

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值