spring maven项目 实时接口请求次数及时间发送到grafana监控_亲测成功

spring maven项目 实时接口请求次数及时间发送到grafana监控_亲测成功

说明: spring项目使用aop方式拿到请求接口uri,算出从请求到响应的耗时, 然后使用statsd包发送udp数据给grafana去展示.

完全不影响代码性能和稳定性,因为使用udp协议发送,就算grafana那边挂了,也不影响项目正常运行

UDP简单介绍

UDP提供不可靠服务

UDP是一个非连接的协议,传输数据之前源端和终端不建立连接, 当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。 在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、 计算机的能力和传输带宽的限制; 在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。

maven项目pom.xml引入依赖包

		<dependency>
			<groupId>com.timgroup</groupId>
			<artifactId>java-statsd-client</artifactId>
			<version>3.1.0</version>
		</dependency>    

配置监控udp地址

statsd:
    prefix: dev
    host: 192.168.1.53
    port: 8125

初始化配置

package com.beyond.app.config;

import com.timgroup.statsd.NonBlockingStatsDClient;
import com.timgroup.statsd.StatsDClient;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class StatsdConfig {

    private static final Logger logger = LogManager.getLogger(StatsdConfig.class);

    @Value("${spring.statsd.prefix}")
    private String prefix;

    @Value("${spring.statsd.host}")
    private String host;

    @Value("${spring.statsd.port}")
    private int port;

    @Bean(name = "statsDClient")
    public StatsDClient statsDClient() {
        logger.info("StatsdConfig Configuring Statsd {}-{}:{}", prefix, host, port);
        return new NonBlockingStatsDClient(prefix, host, port);
    }

}

定义service

package com.beyond.app.service;

import com.timgroup.statsd.StatsDClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

/**
 * Created by liang.
 */
@Service
public class StatsdService {

    @Autowired
    private StatsDClient statsDClient;

    @Async
    public void statsd (String uri, long time) {
        statsDClient.time("manage." + uri, time);
        //dev.manage.uri:10|ms
        //dev开发环境, manage功能, uri接口, 10ms接口耗时
    }

}

spring aop环绕通知发送接口数据

package com.beyond.app.aop;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.PropertyFilter;
import com.beyond.app.service.StatsdService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;

/**
 * Created by liang.
 */

@Component
@Aspect
public class LogAspect {
    private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);

    @Autowired
    private StatsdService statsdService;

    /**
     * 定义一个切入点.
     * 解释下:
     *
     * ~ 第一个 * 代表任意修饰符及任意返回值.
     * ~ 第二个 * 定义在web包或者子包
     * ~ 第三个 * 任意方法
     * ~ .. 匹配任意数量的参数.
     */
    @Pointcut("execution(* com.beyond.app.api..*.*(..))")
    public void logPointCut(){

    }

    @Around("logPointCut()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable{
        long start = System.currentTimeMillis();
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        long end = System.currentTimeMillis();
        try {
            Object result = joinPoint.proceed();
            end = System.currentTimeMillis();
            logger.info("+++++around " + joinPoint + "\tUse time : " + (end - start) + " ms!");
            return result;
        } catch (Throwable e) {
            end = System.currentTimeMillis();
            logger.error("+++++around " + joinPoint + "\tUse time : " + (end - start) + " ms with exception : " + e.getMessage());
            throw e;
        } finally {
            statsdService.statsd(request.getRequestURI(), end - start);
        }

    }
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

beyond阿亮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值