- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
之前我有写过一篇记录生产环境事故的文章,获得了不少好评.
后续,我们团队有做过一些讨论,为了支撑运营维护,搭建了更好的日志平台Granfa+Loki,也引入了SkyWalking做链路追踪.
但过程中也遇到了一些问题,我会在下面讲述出来,然后将这个简单的小技巧分享出来,希望对大家有所帮助.
如果暂时没时间看,可以先收藏起来,等闲下来慢慢看,以后如果遇到类似的情况说不定能直接翻出来照搬.
前面说了,我们团队有搭建日志平台和链路追踪,但实际上也带来一些困难,大体如下:
1)、对于中小企业来说,这样的平台搭建起来对资源有一定要求( 要钱 ),项目维护期也经常会出现资源紧张的情况,增加了维护成本,因为成本不是控制在你手上,是老板手上; 。
2)、对于团队成员来说,要有一定能力熟悉和使用这样的平台,掌握一些常用的命令,而中小企业人员流动还挺频繁,并不是每个入职的成员都能上手,这无形中加大了人力成本; 。
3)、在线上排查问题过程中,方便了许多,但也麻烦了许多,方便是因为有平台能直接定位了,麻烦是因为平台越来越多,有成员反应地址太多有点晕了( 笑 ).
综上所述,考虑到我们公司的规模和经济能力,最终我们团队还是决定用最简单的办法来定位接口耗时的问题,也就是SpringAOP对第三方接口做切面来完成耗时统计.
先把最终在线上呈现的效果展示出来,大家能一目了然.
我们项目使用的是微服务+K8s,下图是Granfa+Loki搭建的收集k8s日志的平台,通过关键字进行搜索就能直接定位到调用第三方接口耗时的情况.
我们来模拟一下场景,实现AOP切面统计第三方接口的耗时.
实体类 。
用map来模拟存放用户、获取用户、删除用户.
这里就是简单的用线程睡眠来模拟调用第三方接口的耗时,假装几个接口分别耗费了这么多时间.
OK,没有问题.
引入依赖 。
编写切面类,这里简单说明一下,主要明确几点.
1)、Pointcut切面要指向第三方接口调用的类,也就是本篇场景中的RemoteClient; 。
2)、使用环绕切面,其中方法名是之后线上检索日志定位的关键字; 。
3)、计时直接使用StopWatch即可,省得引入其他依赖; 。
4)、StopWatch的start和stop方法包裹的jointPoint.proceed()就是第三方接口的执行操作,这样StopWatch就可以统计出该方法的耗时; 。
5)、最后打印日志也挺重要,可以参考我这样,把类名.方法()都打印出来便于以后检索,同时耗时最好用ms单位,这样一目了然.
我们手动执行模拟场景中的几个接口后,来观察日志打印的情况.
可以看到,方法对应的耗时都统计出来了.
这样,最终k8s的日志也会像这样被日志平台收集起来,我们最终只需要通过关键字检索就能一次定位到所有第三方接口的耗时情况.
最后,我把我们某一次生产环境定位到的第三方接口超时的日志展示出来给大家看看,正是这样的统计帮助我们定位到了其他厂家的接口问题,之前他们一直都是说我们的问题,靠这个截图才让他们 低头认罪 ,之后他们就修复了这个问题.
这是在Granfa中我们根据类名.方法名直接定位第三方接口的命令 。
这是检索到的某一段时间内他们接口一直超时的统计,也是最后发给他们的证据.
最后,我把这种方式的好处再总结一遍,如果和我所在公司情况类似的同行可以参考下.
1)、节约了维护成本,不需要额外搭建什么链路追踪等用来定位的中间件或基础设施,很多中小企业其实用不上,大体还是习惯通过日志来定位问题,一个链路追踪的平台搭建简单,但是使用过程中我们明显发现会造成资源紧张,也要进行定期的维护,这个成本会在日积月累中逐渐变多; 。
2)、团队成员不需要再额外学习多余的技能,尤其是这种快节奏的互联网行业团队,人员变更挺频繁,每次都要培训和指导是一件比较耗费心力的事情,往往一个人掌握了没多久他又跳槽了,对于公司而言又要重来; 。
3)、平台变复杂不是好事,光是环境地址就能积累几个Excel,规模不大的团队还是倾向于最简单的方式来处理问题,综合考虑之下,人力完全可以替代平台( 老板们其实就喜欢这样的员工 ).
另外稍微提一点,这种方式既可以应用于单体架构,也可以应用于分布式架构,但对于分布式架构要注意一点,第三方服务最好能独立出来,这样你使用AOP切面就完美适配了,否则你需要每个服务都引入一遍.
源码会在评论区分享出来,有兴趣的可以去下载来自己试试,里面还有我整理的logback配置,有彩色日志的配置,还有每个配置很详细的注释,AOP部分的代码就是线上运行了半年多的代码,可以直接拿去使用,只需要修改一下你的切面指向及类名方法名的日志打印即可.
原创文章纯手打,一个一个字敲出来的, 键盘上全是血 ,如果觉得有帮助麻烦点个 推荐 吧~ 。
本人致力于分享工作中的经验及趣事,喜欢的话可以进主页 关注一下 哦~ 。
最后此篇关于别再背锅了!这个小技巧统计第三方接口耗时很安逸的文章就讲到这里了,如果你想了解更多关于别再背锅了!这个小技巧统计第三方接口耗时很安逸的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我目前正在学习数据挖掘,有以下问题。 机器学习和数据挖掘之间有什么关系? 我发现许多数据挖掘技术都与统计相关,而我“听说”数据挖掘与机器学习有很多关系。所以我的问题是:机器学习与统计学密切相关吗? 如
我有很多表的数据,例如: event_id player finish 1 a 1 1 b 2 1 c
我对 http_status_module 提供的统计数据感兴趣 特别是上游部分的统计数据。 http://nginx.org/en/docs/http/ngx_http_status_module.
除了 Cluster MBean 之外,是否有任何可以在 Akka (Java) 中启用的内置 JMX 公开监控/统计信息?我看过 Typesafe Console,但由于它需要许可证才能用于从多个节
我正在尝试在我的程序中使用“usage”统计信息来获取类似于 time 的数据工具。但是,我很确定我做错了什么。这些值似乎是正确的,但有时可能有点奇怪。我没有在网上找到好的资源。有人知道如何做得更好吗
我有一个带有统计表的 MySQL 数据库。我想以年历、月度的形式输出数据。对于没有点击率的几个月,我想花费一个“空”DIV。有两个ID。 $query = mysqli_query($db,"SELE
设置: 问题是经典概率问题的复杂形式: 70 colored balls are placed in an urn, 10 for each of the seven rainbow colors.
有哪些 Ruby gem 可以执行数据处理? 最佳答案 我知道有 3 种从 Ruby 访问 R 的方法: RinRuby RSRuby 通过 Rserve-Ruby-Client 预约 RinRuby
背景 图像领域内的一个国内会议快要召开了,要发各种邀请邮件,之后要录入、统计邮件回复(参会还是不参会等)。如此重要的任务,老师就托付给我了。ps: 统计回复邮件的时候,能知道谁参会或谁不参会。
我正在添加用户输入的几个数字并将它们添加到数组列表中。 到目前为止我的代码: package project143; import java.util.*; /** * @author -- */
正如标题所示,我需要做的是在各种 iO/Android/Windows 应用程序中跟踪各种用户事件 - 例如点击、滑动、在页面上花费的时间等。 这些应用程序基于响应式 HTML/CSS/JS,并具有简
我希望计算 HTML 表中每个唯一值的实例数,并在其自己的表中返回结果。该表是根据用户的文本输入生成的。例如,用户输入可能如下所示: Report 46 Bob Marley 4/20/2
如何使用 PHP 计算数字数组的 z 分数?我需要计算 z 分数,然后找到百分位数 (CDF)!我可以使用哪些 PHP 函数?谢谢! 最佳答案 以下代码将给出 CDF 的良好近似值(Abramowit
我只是想知道是否可以计算 GitHub 上空存储库的总数。 如果不适合所有用户,可以为自己做吗? 编辑 我已经尝试过size:0搜索,但似乎返回了很多包含数据的存储库。采用 size:0..1 之类的
public class Scanner { private HtmlProcessor hp; private String baseUrl; private int ste
我正在使用 Mule ESB 3.4。我想开发一个自定义 Java 组件来计算流收到的请求数量。流程将例如像这样: http inbound-endpoint -> counter -> vm-out
我喜欢借助 GitHub API 来统计存储库中所有开放的拉取请求和问题。我发现 API 端点 /repos/:owner/:repo 结果包含 open_issues 属性。然而,这是问题和拉取请求
如何使用 PHP 计算数字数组的 z 分数?我需要计算 z 分数,然后找到百分位数 (CDF)!我可以使用哪些 PHP 函数?谢谢! 最佳答案 以下代码将给出 CDF 的良好近似值(Abramowit
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在尝试以编程方式获取搜索字词列表的 Google 新闻搜索结果计数(即有多少个结果),但仅限于过去 1 年。使用用户界面搜索时,结果计数仅出现在常规搜索中,但在“工具 > 最近 > 过去一年”下时
我是一名优秀的程序员,十分优秀!