快速进行服务接口监控,接口监控平台

4747 605 2022-08-30


本文描述了api监控,API监控管理系统,api监控平台。

1. 背景

在一些业务中,可能会出现以下几种情况:

    1.接口的不稳定导致APP/WEB端上的超时、抛错,而资源级监控不能达到业务健康状况监控的目的。

    2.接口众多,服务部署后不知道是否每个接口都正常。

    3.不同服务同一接口的响应时间。

    5.依赖的其他接口异常导致不可用。

    6.重要的接口不能等用户触发异常,需要在用户请求前就发现异常并处理掉

为了保证线上服务的稳定运行,除了线上关键服务的资源类监控外,各服务接口也非常重要。对于接口异常这类问题的排查往往比服务异常更耗时费力,那么如何对线上关键接口进行监控呢?

2. 解决思路

获取到服务的所有接口定时对这些进行模拟请求,检测接口返回状态以及返回数据。

3. JPower是什么

JPower是一个完全开源的微服务快速开发框架,包含用户管理、系统管理、统一授权等基础模块。用户在此框架上可快速进入业务开发。

这里给大家推荐一款JPower里的小工具jpower-log,jpower-log模块就对此实现了对各类接口的健康状态监控。

实现功能:

支持单个服务的所有API检测。

自动回滚接口请求产生的数据,不会在数据库保留下任何垃圾数据;

支持HTTP,请求类型可以是GET,POST,HEADER,PUT,DELETE等所有类型

支持任何形式的HTTP接口鉴权配置,只需要简单的配置登录接口以及登录参数

调用API可以设置请求头部,请求参数,并针对单个接口进行定制化配置

可以自定义检测结果判定,比如接口返回状态码为200,返回内容包括/不包括exception等;

可以自定义监控频率,比如30分钟/次,1小时/次等

监控日志汇总,导出

虽然这块小工具是基于JPower开发,但是检测对象不局限于JPower,任何第三方服务的HTTP接口都可进行配置监控

使用文档:

https://www.kancloud.cn/guodingzhi/jpower/2251824

使用技术:

技术框架:maven、Spring Boot、Mybatis、SpringMVC

技术组件:OKHttp、fastjson

UI技术:vue、Echarts

运行环境:

jdk8

tomcat

mysql

截图预览:

image.png

image.png

异常捕获是改善软件质量的跟踪手段之一,常见的方式是记录日志,从日志分析异常问题进而跟进。对于前端项目来说,异常可能是后端接口数据导致,可能是前端本身业务逻辑问题导致,不管是什么导致的异常,只要能够精准的捕获到就能够分析出问题所在。可能有小伙说有测试阶段,全面的测试机制的确能够降低异常的出现,但是测试大部份情况是在非生产环境上进行的,覆盖面有限。

日志是收集异常的最佳方式,一个异常监控平台就需要包括异常采集、异常存储、异常统计与分析、异常报告、异常告警,而对于一个通用平台来说,就需要项目管理、版本管理、团队管理、仓库管理等等。本文主要介绍一下异常采集需要考虑的问题,并跟大家分享两种现成的解决方案。

异常介绍

异常,是每种编程语言都需要考虑的一种结构,如何友好的跟踪异常而不影响生产环境上的业务,这就需要从项目开发到上线整个过程做一定的规范。下面就来谈谈前端的异常及处理方式。

异常分类

先来说说JavaScript的错误类型,ECMA-262 定义了 7 种错误类型,说明如下:

  • Error:普通异常,通常与 throw 语句和try/catch 语句一起使用,利用属性 name 可以声明或了解异常的类型,利用message 属性可以设置和读取异常的详细信息。

  • EvalError:Eval 函数执行异常。

  • SyntaxError:语法解析不合理,即语法错误。

  • RangeError:在数字超出合法范围时抛出,比如数组下标越界就会报这种错误。

  • ReferenceError:在读取不存在的变量时抛出,比如没定义变量 a,后面却使用这个变量 a,就会报这种错。

  • TypeError:当一个值的类型错误时抛出该异常,比如传递给函数的参数与预期的不符,就会报这种错误。

  • URIError:以一种错误的方式使用全局 URI 处理函数而产生的错误

异常处理

前端捕获异常分为全局捕获和单点捕获。全局捕获代码集中,易于管理;单点捕获作为补充,对某些特殊情况进行捕获,但分散,不利于管理,容易遗漏。在项目开发过程中,定义一个错误捕获模块,将项目所有的异常(全局异常和单点异常)都交给错误模块来统一处理,这就需要项目约定。

try-catch

try-catch 语句,是 JavaScript 处理异常的一种标准方式。基本语法如下:

try {} catch (error) {
    // 错误处理}

try 块中的代码发生了错误,就会立即退出代码执行过程,然后执行 catch 块。catch 块会接收到一个包含错误信息的对象。一般是error.message

finally

finally 在 try-catch 语句中是可选的,如果 finally 子句已经使用,则其代码无论如何都会执行。无论 try 或 catch 语句块中包含什么代码——甚至 return 语句,都不会阻止 finally 子句的执行。只要代码中包含 finally 子句,那么无论 try 还是 catch 语句块中的 return 语句都将被忽略。因此,在使用 finally 子句之前,一定要非常清楚想让代码怎么样。看下面这个函数:

const errorHelper = () => {
    try {
        return devpoint;
    } catch (error) {
        return "error";
    } finally {
        return "不管有无错误,我都执行了!";
    }};console.log(errorHelper());  // 函数本身是发生了异常,但是最终打印的结果为:不管有无错误,我都执行了!

上面的函数代码实际上是有异常的,因为变量 devpoint 并没有定义,不过最终执行了 finally 子句输出了 不管有无错误,我都执行了!

throw

与 try-catch 语句相配的 throw 操作符,用于随时的主动抛出自定义错误。

const errorHelper = () => {
    try {
        return devpoint;
    } catch (error) {
        return "error";
    } finally {
        throw new Error("devpoint变量未定义");
    }};console.log(errorHelper());

window.onerror

window.onerror,是全局异常捕获,对于单点异常捕获不到的异常就到这里了。

异常采集

触发异常有很多原因,为了更好的分析,除了捕获程序的错误信息外,还需要采集执行程序的外部环境,对于前端项目,外部环境就包括系统(Window、IOS、Android)和系统版本、浏览器(Chrome、IE、火狐等)和版本、IP地址、用户信息、运行的页面、网络环境、API接口数据。针对这些信息就需要设计采集的日志结构。

在采集异常日志的时候,有个原则需要注意:采集日志行为不影响用户体验及应用本身的性能。

下面是一个参考的日志结构:

  • projectId:项目信息

  • eventId:事件ID,日志的唯一标志

  • stack:错误stack信息

  • requestId:开发者定义的异常标志

  • level:异常级别,可以是 error、info、warn

  • browser:浏览器信息

  • device:设备信息

  • os:操作系统信息

  • release:应用版本信息

  • url:异常触发页面url

  • user:用户信息,可以是iP

  • createAt:异常产生时间

  • network:网络信息

  • eventKey:触发的键

  • dataRes:API响应数据

  • screenWidth:屏幕宽度

  • screenHeight:屏幕高度

  • message:异常详细信息

异常上报

收集到异常数据如何上报呢?即需要将异常日志收集到云端存储,供项目开发跟进分析,一种方式是直接通过API异步上报,在捕获信息比较多的情况下,还是会占用网络请求,影响应用本身。可以考虑将采集的异常日志存储在本地,最佳的选择是IndexedDB,容量大,支持异步操作,可以自定义查询。

IndexedDB 是WEB离线存储的一种方式,因此存储只是暂时的,还需要设计一个同步机制,将本地存储的日志同步到云端服务器上。为了更好的同步,就需要设计暂存区、归档区,新产生的日志存储在暂存区,已成功同步的日志存储在归档区。有了本地存储,同步的过程批量同步。

后端存储,可以考虑使用leveldb,在性能方面,基本可以碾压了mongodbsqlite

第三方平台

上面简单介绍实现异常监控平台的几个关键点,现在就跟大家分享两个可以用于前端异常跟踪的工具Google Analytics 和 Sentry 。

Google Analytics

没错,Google Analytics一般想到的是用于网站流量统计分析。可以借助Google Analytics的事件统计来跟踪异常,下面是简单的方法:

function postEvents(error) {
    var category = error.level || "warn",
        action = error.action || "",
        label = error.message || "";
    ga("send", "event", category, action, label);}

缺点就是无法方便的确定触发异常的环境条件,后续也无法跟踪版本等等。

Sentry

sentry 是一个实时事件日志记录和聚合平台。它专门用于监视错误和提取执行适当的事后操作所需的所有信息, 而无需使用标准用户反馈循环的任何麻烦。

这是一个比较专业的异常监控工具,基本支持所有主流编程语言,这里只是简单介绍一个前端的使用。

首先在页面上加入以下脚本:

<script src="https://cdn.ravenjs.com/3.20.1/raven.min.js" crossorigin="anonymous"></script><script type="text/javascript">
  try {
    if ((typeof Raven) != "undefined"){
      Raven.config('https://ffd39f4582184540a7214fb82bb3e888@sentry.io/248888',{
        release: 'release_0.0.5',
        allowSecretKey: true
      }).install()
    }
  } catch (error) {
  }</script>

然后项目中可以写一个统一的入口:

function ExceptionJs() {
    const ravenJs = typeof Raven != "undefined" ? Raven : {};
    this.capture = function (error) {
        try {
            if (!(error instanceof Error)) {
                if (typeof error === "object") {
                    error = JSON.stringify(error);
                }
            }
            if (typeof ravenJs.captureException === "function") {
                ravenJs.captureException(error);
            }
        } catch (e) {
            // 这里是确保异常跟踪脚本出错了不至于影响应用程序        }
    };}

在需要的位置加入以下代码:

const exceptionHelper = new ExceptionJs(),try {} catch (error) {
    exceptionHelper.capture(error);}

现在来看看收集上来的异常信息,下面这个是异常的统计、异常列表、异常详情。

上文是小编为大家整理的API接口监控产品全新改版,免费开放全部功能,API监控管理系统。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:1行Python代码,获取对方的IP地址(Python获取ip地址)
下一篇:Mybatis错误引起的程序启动卡死问题及解决
相关文章

 发表评论

评论列表

2022-10-18 16:17:09

作者说到的一些业务遇到的问题,我们有很多都遇到了,可见进行api监测还是非常有必要的,感谢作者分享。

2022-10-18 16:17:39

关于api监测的内容虽然有些复杂,但是仔细看还是可以看懂的,很不错的文章!

2022-10-19 17:09:36

文章写的真好,先收藏,感谢作者分享。

2022-10-20 14:09:23

正好在找关于接口监控相关的内容,学习到了,感谢作者的分享!

2022-10-20 14:10:14

感谢作者分享的关于接口监控的内容~~太有帮助了!