一种异常监控方法及装置与流程

文档序号:24527400发布日期:2021-04-02 10:04阅读:61来源:国知局
一种异常监控方法及装置与流程

本申请涉及计算机技术领域,尤其涉及一种异常监控方法及装置。



背景技术:

为了对网络系统的工作情况进行监控,目前可以采用对服务器日志进行监控的方法,例如可以对服务器日志的数量进行分析,或对出现异常的服务器日志特定字段的值进行分析。如果网络系统出现故障,监控系统可以根据服务器日志确定故障发生并通知对应的技术人员,以便技术人员及时进行故障排除。

但是,传统的监控方法只能将出现故障的环节定位到服务器或模块,即只能确定网络系统中哪个服务器出现了故障或哪个模块出现了故障,并不能确定出现问题的具体程序或函数。技术人员还查看系统的错误日志,或者亲自前往出现故障的服务器所在的位置查看情况,才能找到原因解决问题。如此,会将大量时间消耗在故障定位上,增加了故障排除的时间,导致系统从出现故障到恢复正常运行所需的时间教程,影响系统的正常运行。



技术实现要素:

有鉴于此,本申请实施例提供了一种异常监控方法及装置,旨在根据进程中各个线程的运行时间找到程序中出现异常的函数。

第一方面,本申请实施例提供了一种异常监控方法,所述方法包括:

获取目标线程,所述目标线程为执行时间长于第一时间阈值的线程,所述目标线程包括至少一个函数;

确定所述目标线程的目标函数,所述目标函数为所述目标线程正在调用的函数;

获取所述目标线程的函数调用时间,所述函数调用时间包括所述目标线程调用所述目标函数的时间;

判断所述函数调用时间是否大于第二时间阈值,若是,则确定所述目标函数为异常函数。

可选地,所述确定所述目标线程的目标函数包括:

获取所述目标线程的方法栈,所述方法栈包括至少一个函数信息,所述函数信息为所述目标线程待调用的函数的相关信息;

将所述方法栈栈顶的函数信息对应的函数确定为目标函数。

可选地,所述获取所述目标线程的函数调用时间包括:

将所述方法栈栈顶的函数信息保持不变的时间确定为所述函数调用时间。

可选地,所述将所述方法栈栈顶的函数信息保持不变的时间确定为所述函数调用时间包括:

周期扫描所述方法栈栈顶的函数信息;

响应于所述方法栈栈顶的函数信息发生变更,将第一时间与第二时间之间的间隔时间确定为所述函数调用时间;

其中,所述第一时间为所述方法栈栈顶的函数信息变更为所述目标函数的函数信息的时间,所述第二信息为所述方法栈栈顶的函数信息变更为非目标函数的函数信息的时间。

可选地,所述获取目标线程包括:

获取线程列表,所述线程列表包括至少一个正在执行的线程;

响应于所述至少一个正在执行的线程中任意一个线程的执行时间大于第一阈值,将所述执行时间大于第一阈值的线程确定为目标线程。

可选地,所述确定所述目标函数为异常函数包括:

获取函数与代码标识的对应关系,所述代码标识为代码所在行数的标识;

根据所述代码标识与函数的对应关系,获取所述目标函数对应的代码标识。

第二方面,本申请实施例提供了一种异常监控装置,所述装置包括:线程获取模块,用于获取目标线程,所述目标线程为执行时间长于第一时间阈值的线程,所述目标线程包括至少一个函数;确定模块,用于确定所述目标线程的目标函数,所述目标函数为所述目标线程正在调用的函数;时间获取模块,用于获取所述目标线程的函数调用时间,所述函数调用时间包括所述目标线程调用所述目标函数的时间;判断模块,用于判断所述函数调用时间是否大于第二时间阈值,若是,则确定所述目标函数为异常函数。

可选地,所述确定模块,用于获取所述目标线程的方法栈,所述方法栈包括至少一个函数信息,所述函数信息为所述目标线程待调用的函数的相关信息;将所述方法栈栈顶的函数信息对应的函数确定为目标函数。

可选地,在确定模块利用目标线程的方法栈确定目标函数时,所述确定模块,用于将所述方法栈栈顶的函数信息保持不变的时间确定为所述函数调用时间。

可选地,所述确定模块,用于周期扫描所述方法栈栈顶的函数信息;响应于所述方法栈栈顶的函数信息发生变更,将第一时间与第二时间之间的间隔时间确定为所述函数调用时间;其中,所述第一时间为所述方法栈栈顶的函数信息变更为所述目标函数的函数信息的时间,所述第二信息为所述方法栈栈顶的函数信息变更为非目标函数的函数信息的时间。

可选地,所述线程获取模块,用于获取线程列表,所述线程列表包括至少一个正在执行的线程;响应于所述至少一个正在执行的线程中任意一个线程的执行时间大于第一阈值,将所述执行时间大于第一阈值的线程确定为目标线程。

可选地,所述判断模块,用于获取函数与代码标识的对应关系,所述代码标识为代码所在行数的标识;根据所述代码标识与函数的对应关系,获取所述目标函数对应的代码标识。

第三方面,本申请实施例提供了一种计算机可读存储介质,所述计算机可读存储介质用于存储计算机程序,可以使得所述计算机执行前述第一方面所述的异常监控的方法。

本申请实施例提供了一种异常监控方法及装置。在对网络系统或应用程序等进程进行监控时,可以先获取目标线程,该目标线程为进程的一个或多个线程中执行时间长于第一时间阈值的线程包括至少一个函数。在确定执行视角较长的目标线程后,可以确定目标线程的目标函数,该目标函数为目标线程正在调用的函数。在确定目标函数后,可以获取目标线程的函数调用时间,该函数调用时间为目标线程调用该目标函数的时间。接着,可以判断目标线程的函数调用时间是否大于第二时间阈值。如果函数调用时间大于第二时间阈值,则说明目标线程调用目标函数的时间较长,该目标函数可能出现了问题。因此,可以将目标函数确定为异常函数。这样,根据进程中执行时间较长的目标线程调用各个函数的时间,并比较目标线程调用各个函数的时间。而调用时间长往往说明该函数存在异常,因此将调用时间较长的函数确定为异常函数,可以直接定位到出现异常的函数。如此,对程序执行缓慢或者响应时间不稳定等情况,能快速定位并可以精确到程序中的具体函数,提升了异常监控的效率,降低了技术人员的工作压力。

附图说明

为更清楚地说明本实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本申请实施例提供的异常监控方法的方法流程图;

图2为本申请实施例提供的异常监控装置的一种结构示意图。

具体实施方式

目前,在对运行于多个服务器的网络系统进行监控时,可以分别针对每个服务器进行监控。例如,传统的监控系统可以实时获取多个服务器产生的服务器日志的数量。并在多个服务器中任意一个服务器的服务器日志的数量超过阈值后对该服务器的数据库进行扫描,从而找到服务器在运行过程中产生的异常日志,进而确定服务器在运行过程中产生的异常。如此,即使网络系统由多个服务器组成,在系统故障时技术人员可以快速从多个服务器中找到出现故障的服务器。

传统的监控系统只能确定故障服务器或出现故障的软件模块,并不能确定具体是程序中那部分出现了故障。为了确定出现故障的具体位置,目前可以采用埋点的方式进行监控。埋点指的是在应用程序中插入输出语句。程序在运行到该输出语句时,可以输出预设字符。如果检测到预设字符,则说明输出语句前的程序并无问题。如此,可以确定程序中出现故障的位置。

但是,埋点这种技术方案仅能两个埋点之间的程序是否出现故障。为了确定程序中各个函数的运行情况,需要在任意两个函数之间进行埋点。那么,当网络系统的体量较大时,需要埋点的数量大幅度增加,对代码的修改量较大,也会给服务器带来额外的负担。

为了给出能够自动确定故障函数的方法,本申请实施例提供了一种异常监控方法及装置。以下结合说明书附图,从异常监控系统的角度对本申请实施例提供的异常监控方法进行说明。本申请实施例提供的异常监控系统可以运行于独立的服务器或服务器集群,用于对基于面向对象(objectoriented)设计方法设计的程序进行异常监控。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

在介绍具体地技术方案前,首先对本申请实施例涉及的一些专业术语进行介绍。

进程:进程(process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。在面向进程设计的计算机结构中,进程是程序的基本执行实体;在面向线程(即面向对象)设计的计算机结构中,进程是线程的容器,一个进程可以包括多个线程。

线程:线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。在线程运行的过程中,可以调用一个或多个函数。通过调用函数,线程可以实现运算调度的功能。

函数:在面向对象设计的计算机程序中,又称方法,是指一段可以直接被另一段程序或代码引用的程序或代码。

栈:栈(stack)又名堆栈,是一种运算受限的数据结构,例如链表。栈的一段可以插入数据和删除数据,另一端则不能进行修改。其中,可以插入数据的一端称为栈顶,另一端称为栈底。数据从栈顶进入栈的过程称为压栈(或入栈、进栈)。数据从栈顶离开栈的过程称为出站(或推栈)。当新的数据进栈时,原先位于栈顶的元素后移。

参见图1,图1为本申请实施例提供的异常监控方法的方法流程图,包括:

s101:获取目标线程。

对于基于面向对象设计方法设计的软件或系统,可以运行一个或多个进程,每个进程在运行的过程中可以通过一个或多个线程实现该进程的功能。其中,任意一个线程在运行的过程中,可以调用应用程序中任意一个函数实现该线程的功能。

在对基于面向对象设计方法设计的软件或系统进行监控时,监控服务器可以先获取目标线程,该目标线程可以为执行时间长于第一时间阈值的线程。其中,第一时间阈值可以是技术人员预先设置的时间阈值。若线程执行的时间超过第一时间阈值,则说明该线程可能出现了故障。

在一些可能的实现方式中,监控服务器还可以获取线程列表,该线程列表可以包括至少一个正在执行的线程,例如可以是某服务器正在运行的线程列表。监控服务器可以获取线程列表中每个线程的执行时间,当线程列表中任意一个线程的执行时间大于第一阈值,将所述执行时间大于第一阈值的线程确定为目标线程。例如,当进程调用新线程时,监控服务器可以记录新线程的标识和该新线程执行的时间。如果该新线程的执行时间超过第一时间阈值,监控服务器可以将该新线程确定为目标线程。

s102:确定所述目标线程的目标函数。

在得到目标线程后,监控服务器可以确定该目标线程正在执行的目标函数。可选地,对于基于面向对象设计方法设计的软件或系统,在调用函数时,线程可以先将需要调用的函数的相关信息添加到方法栈中,在结束函数的调用后,线程可以将该函数的相关信息出栈。即,方法栈栈顶的函数信息即为线程当前正在调用的函数的相关信息。那么,监控服务器可以将方法栈栈顶的函数信息对应的函数确定为目标函数。

s103:获取所述目标线程的函数调用时间。

在确定目标线程的目标函数后,监控服务器可以获取目标线程的函数调用时间,该函数调用时间为目标线程调用目标函数的时间。可选地,若监控服务器通过目标线程的方法栈确定目标函数,监控服务器可以将所述方法栈栈顶的函数信息保持不变的时间确定为所述函数调用时间。

可选地,监控服务器可以周期性扫描目标线程的方法栈栈顶的函数信息。若目标线程的方法栈栈顶的函数信息在第一时间变更为前述目标函数的相关信息,在第二时间变更为其他函数的相关信息。那么监控服务器可以将第一时间与第二时间之间的间隔时间确定为函数调用时间。例如,监控服务器可以采用线程快照的方式确定方法栈栈顶的函数信息,线程快照可以获取目标线程的相关信息。具体地,监控服务器可以周期性对目标线程进行线程快照。若目标线程方法栈栈顶的函数信息在第x次线程快照时变为目标函数的相关信息,在第x+n次线程快照是变为其他函数信息,监控服务器可以将n次线程快照的总时间确定为目标线程的函数调用时间。其中,x、n为大于1的正整数。如此,通过线程快照,无需对被监控的软件或系统进行修改,即可确定该软件或系统的运行进度。

s104:判断所述函数调用时间是否大于第二时间阈值,若是,则确定所述目标函数为异常函数。

在确定函数调用时间后,监控服务器可以判断该函数调用时间是否大于第二时间阈值,若该函数调用时间大于第二时间阈值,则说明目标线程调用目标函数的时间过长,即目标函数的执行需要消耗较多时间,目标函数可能出现问题。那么,监控服务器可以将目标函数确定为异常函数,从而向技术人员进行告警。

可选地,为了进一步确定出现故障的位置,监控服务器还可以获取函数与代码标识的对应关系。其中,该代码标识为代码所在行数的标识,即程序中每条代码对应的行数标识。那么,根据所述代码标识与函数的对应关系,监控服务器可以获取所述目标函数对应的代码标识。如此,在软件或系统出现故障时,可以直接定位到可能出现故障的位置的代码,进一步提高了异常监控的效率。

本申请实施例提供了一种异常监控方法。在对网络系统或应用程序等进程进行监控时,可以先获取目标线程,该目标线程为进程的一个或多个线程中执行时间长于第一时间阈值的线程包括至少一个函数。在确定执行视角较长的目标线程后,可以确定目标线程的目标函数,该目标函数为目标线程正在调用的函数。在确定目标函数后,可以获取目标线程的函数调用时间,该函数调用时间为目标线程调用该目标函数的时间。接着,可以判断目标线程的函数调用时间是否大于第二时间阈值。如果函数调用时间大于第二时间阈值,则说明目标线程调用目标函数的时间较长,该目标函数可能出现了问题。因此,可以将目标函数确定为异常函数。这样,根据进程中执行时间较长的目标线程调用各个函数的时间,并比较目标线程调用各个函数的时间。而调用时间长往往说明该函数存在异常,因此将调用时间较长的函数确定为异常函数,可以直接定位到出现异常的函数。如此,对程序执行缓慢或者响应时间不稳定等情况,能快速定位并可以精确到程序中的具体函数,提升了异常监控的效率,降低了技术人员的工作压力。

以上为本申请实施例提供异常监控方法的一些具体实现方式,基于此,本申请还提供了对应的装置。下面将从功能模块化的角度对本申请实施例提供的上述装置进行介绍。

参见图2所示的异常监控装置的结构示意图,该装置200包括:

线程获取模块210,用于获取目标线程,所述目标线程为执行时间长于第一时间阈值的线程,所述目标线程包括至少一个函数;

确定模块220,用于确定所述目标线程的目标函数,所述目标函数为所述目标线程正在调用的函数;

时间获取模块230,用于获取所述目标线程的函数调用时间,所述函数调用时间包括所述目标线程调用所述目标函数的时间;

判断模块240,用于判断所述函数调用时间是否大于第二时间阈值,若是,则确定所述目标函数为异常函数。

本申请实施例提供了一种异常监控装置。在对网络系统或应用程序等进程进行监控时,可以先获取目标线程,该目标线程为进程的一个或多个线程中执行时间长于第一时间阈值的线程包括至少一个函数。在确定执行视角较长的目标线程后,可以确定目标线程的目标函数,该目标函数为目标线程正在调用的函数。在确定目标函数后,可以获取目标线程的函数调用时间,该函数调用时间为目标线程调用该目标函数的时间。接着,可以判断目标线程的函数调用时间是否大于第二时间阈值。如果函数调用时间大于第二时间阈值,则说明目标线程调用目标函数的时间较长,该目标函数可能出现了问题。因此,可以将目标函数确定为异常函数。这样,根据进程中执行时间较长的目标线程调用各个函数的时间,并比较目标线程调用各个函数的时间。而调用时间长往往说明该函数存在异常,因此将调用时间较长的函数确定为异常函数,可以直接定位到出现异常的函数。如此,对程序执行缓慢或者响应时间不稳定等情况,能快速定位并可以精确到程序中的具体函数,提升了异常监控的效率,降低了技术人员的工作压力。

可选地,在一些可能的实现方式中,所述确定模块220,用于获取所述目标线程的方法栈,所述方法栈包括至少一个函数信息,所述函数信息为所述目标线程待调用的函数的相关信息;将所述方法栈栈顶的函数信息对应的函数确定为目标函数。

可选地,在一些可能的实现方式中,在确定模块利用目标线程的方法栈确定目标函数时,所述确定模块230,用于将所述方法栈栈顶的函数信息保持不变的时间确定为所述函数调用时间。

可选地,在一些可能的实现方式中,所述确定模块230,用于周期扫描所述方法栈栈顶的函数信息;响应于所述方法栈栈顶的函数信息发生变更,将第一时间与第二时间之间的间隔时间确定为所述函数调用时间;其中,所述第一时间为所述方法栈栈顶的函数信息变更为所述目标函数的函数信息的时间,所述第二信息为所述方法栈栈顶的函数信息变更为非目标函数的函数信息的时间。

可选地,在一些可能的实现方式中,所述线程获取模块210,用于获取线程列表,所述线程列表包括至少一个正在执行的线程;响应于所述至少一个正在执行的线程中任意一个线程的执行时间大于第一阈值,将所述执行时间大于第一阈值的线程确定为目标线程。

可选地,在一些可能的实现方式中,所述判断模块240,用于获取函数与代码标识的对应关系,所述代码标识为代码所在行数的标识;根据所述代码标识与函数的对应关系,获取所述目标函数对应的代码标识。

如此,对程序执行缓慢或者响应时间不稳定等情况,能快速定位并可以精确到程序中的具体函数,提升了异常监控的效率,降低了技术人员的工作压力。

本申请实施例中提到的“第一时间阈值”、“第二时间阈值”等名称中的“第一”、“第二”只是用来做名字标识,并不代表顺序上的第一、第二。

通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到上述实施例方法中的全部或部分步骤可借助软件加通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如只读存储器(英文:read-onlymemory,rom)/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者诸如路由器等网络通信设备)执行本申请各个实施例或者实施例的某些部分所述的方法。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。

以上所述仅是本申请示例性的实施方式,并非用于限定本申请的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1