本文分享的这个应用监控小工具,本来是我在五年多以前开发实现的windows服务监控的一个windows服务。听上去比较拗口吧,是的,这个应用一开始就是个监控windows服务的windows服务。

记得当时写这个程序的直接原因就是,做数据统计结转迁移备份之类的后台定时windows任务实在太多,而且由于历史原因,服务挂掉了也没有人及时知道,最终都会造成用户投诉,但很久才反馈到开发这边,或者用户根本不投诉,而日志系统又做的不好(可以算是没有),很可能就一直不知道某些应用已经发生问题。

这个工具的缺点也很明显,我亲眼看到过某司后台强大的运维监控系统,各种详细的参数和指标,大量日志和完善的日志分析系统,可以直接定位问题至某个集群某台服务器,以及可视化数据监控平台管理后台…必须承认,这个小工具做不到某司统一监控平台系统的任何一点。

后来随着需求改变,监控的类型变多,逐渐完善,在这个过程中,也曾经考虑加入很多特殊应用的内部业务监控逻辑。但是开发组发现统一监控平台不是那么容易实现,抽象改进使监控通用必须统一应用框架,但我们那时候人手不足,只好简单粗暴实现最容易的通用逻辑,且慢慢被改造为基于http的应用的简单心跳检查,目前支持的主要应用类型有windows服务、web服务、web页面、wcf、web api等。

在某些特殊业务场景下,这个神器还能重见天日,还可以占有一席用武之地。

现在,这个应用支持两种表现形式:1、winform程序 2、windows服务

将winform改造为windows服务很简单,只要将Program类文件稍作修改:

Programusing System;
using System.ServiceProcess;
using System.Threading;
using System.Windows.Forms; namespace ServiceMonitor
{
using PowerServiceMonitor.Util; static class Program
{
/// <summary>
/// 应用程序的主入口
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false); MonitorConfig.InitMonitorConfig(); //初始化监控配置文件 ////改造为winform程序
//var isCreate = false;
//var mutex = new Mutex(true, "powerservicemonitor", out isCreate);
//if (isCreate == true)
//{
// Application.Run(new MainForm());
//} //改造为windows服务
var ServicesToRun = new ServiceBase[]
{
new MonitorService()
};
ServiceBase.Run(ServicesToRun);
}
}
}

最后配合我这里介绍的动态安装windows服务或者installutil.exe,可以直接实现监控服务安装。

下面简要概括这个监控系统包括的主要功能模块。

一、应用监控管理模块

这个模块是这个应用程序的核心。

主要实现监控参数配置、监控项定义和业务逻辑实现。

最大亮点是支持动态监控项目配置。你可以通过工具界面及时调整监控项、重新定义时间间隔,同时它可以控制最大最小及隐藏,支持手动暂停和启动,还支持日志功能及时查看等。

通过这个工具,以前靠猜,面向巧合编程,经常需要码农手动一个一个排查windows日志找问题,现在直接通过工具日志就能直接定位排查线上问题了。

还有就是,这个小程序可以很简单的实现windows服务监控并尝试自动修复而减少人工干预,出现问题会根据配置发送邮件和(或)短信通知相关人员,当然,发邮件和短信的这个逻辑要依赖你自己完成,比如黑白名单功能、发送的优先级,要不要自动带上服务器IP,发送的频率控制等等。

1、监控主面板

2、监控项配置

对于监控项目和预警对象(MonitorItemInfo)的抽象非常重要,每一个监控项和提醒策略贯穿整个监控系统的始终。

MonitorItemInfousing System;

namespace PowerServiceMonitor.Model
{
/// <summary>
/// 待监控的项目信息
/// </summary>
[Serializable]
public sealed class MonitorItemInfo
{
/// <summary>
/// 应用类型
/// </summary>
public string AppType { get; set; } /// <summary>
/// 监控的项目名称
/// </summary>
public string SvcName { get; set; } /// <summary>
/// 监控的项目对应值 例如:windows服务对应进程名称 web服务则对应一个url
/// </summary>
public string SvcValue { get; set; } /// <summary>
/// 是否启用
/// </summary>
public bool IsEnabled { get; set; } /// <summary>
/// 是否发送邮件提醒
/// </summary>
public bool IsSendEmail { get; set; } /// <summary>
/// 是否发送短信提醒
/// </summary>
public bool IsSendSMS { get; set; } }
}

如果你曾有过每天都有多个新应用同时上线的工作经历,你一定知道这些抽象多么重要。

实际上,如果应用较少,应用类型很单一,我们完全可以定义一套通用的监控策略,而不用每个应用都有一个配置。

但是,变化是永恒的主题,不同子系统的不同应用肯定会有不同的监控业务逻辑,这里千万不要认为是过度设计,我反而认为至少少了两个抽象,定时时间策略和回调通知报警接口。

监控的应用类型也可以动态扩展,小程序中已经定义了监控接口IServiceMonitor,按照自己的业务要求实现逻辑,然后加上配置即可。

IServiceMonitorusing System.Collections.Generic;

namespace PowerServiceMonitor.Contract
{
using PowerServiceMonitor.Model; /// <summary>
/// 服务监控接口
/// </summary>
public interface IServiceMonitor
{
/// <summary>
/// 开始监控处理
/// </summary>
/// <param name="monitorConfigPath">待监控项配置文件地址</param>
/// <returns></returns>
IList<MonitorResultInfo> Start(string monitorConfigPath);
}
}

其实,目前为止,这个工具的最大的两个不足是:

(1)、监控调度周期不灵活

目前每个监控项的时间间隔定义是一致的,实际上,监控项的定时策略完全可以改造成类似quartz(cron表达式)那样的定时任务调度,每个监控项都有自己的独特的时间策略。

真正做到某一类型应用或者某一个应用单独设置时间间隔进行监控才是接近最佳的。

(2)、不支持热插拔

虽然这个工具已经支持监控项及定时调度配置实时改动,但是不支持监控项动态插件式的监控模式。

理想的情况是,有新的监控项目,直接开发搞出一个新的dll至某文件夹,当然有可能还要加上一段配置文件,然后监控不重启即可动态监控。

虽然我之前搞过一个插件式文件处理系统,但是考虑到监控程序应该易用简单不出问题,还是放弃了插件式设计思路。

二、管理员模块

定义了一个简易管理员功能模块,实现了登陆和改密需求,示例代码为了演示需要,被我改变了原来的基于角色的权限控制(RBAC)服务(AdminUserService)。

      

当然,这个模块你可以根据监控需要进行扩展。

对了,这个小程序启动时需要输入用户名和密码,您可以根据如下用户名和密码进行登陆:

用户名admin

密码123456

三、日志管理模块

如你所知,监控系统越高级,监控参数越详细,依赖的日志也越多。

这个工具定义了统一日志接口ILog,示例中模拟支持文本、数据库和NoSQL类型的日志。

但是远远不够,实际监控平台还需要分享大量web请求响应日志、OS日志等。

日志模块可通过配置的方式进行动态管理。

如果你需要开发可视化的管理后台,建议使用RDBMS如MySQL或者MongoDB等NoSQL记录日志,当然你完全可以开发其他类型的日志提供程序与之适配。

最后再重复一次,这个小程序启动时需要输入用户名和密码,您可以根据如下初始用户名和密码进行登陆:

用户名admin

密码123456

demo地址:PowerServiceMonitor

Sharing A Powerful Tool For Application Auto Monitor的更多相关文章

  1. Sharing A Powerful Tool For Calculate Code Lines

    最近正好需要统计下某项目代码行数,然后就找代码行数统计工具.以前找到过一个正则表达式,但是只有在VS2010下有用,VS2012和VS2013下的统计就不好使了. 接着搜索了一下代码行数统计绿色工具免 ...

  2. 推荐一个有趣的软件"Process Monitor"

    同事给的,用起来感觉很不错,官网地址:http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx 以下为官网介绍: Introducti ...

  3. Airbnb/Apache Superset – the open source dashboards and visualization tool – first impressions and link to a demo

    https://assemblinganalytics.com/post/airbnbapache-superset-first-impressions-and-link-to-a-demo/ Tod ...

  4. How use Nmon and "Java Nmon Analyzer" for Monitor Linux Performance

    Nmon is a  resource monitoring tools which can monitor CPU, Memory, Disks, Network and even Filesyst ...

  5. Application Metrics With Spring Boot Actuator

    转自:https://bartcode.co.uk/2015/01/application-metrics-with-spring-boot-actuator Update 12/2017: It w ...

  6. How to create PDF files in a Python/Django application using ReportLab

    https://assist-software.net/blog/how-create-pdf-files-python-django-application-using-reportlab CONT ...

  7. iOS Programming Introduction to Auto Layout 自动布局

    iOS Programming Introduction to Auto Layout   自动布局 A single application that runs natively on both t ...

  8. MAT(memory anlayzer tool)使用方法

    Analyzing and understanding the memory use of an application is challenging. A subtle logic error ca ...

  9. Using Feedback as a Tool

    As a project manager it is important to be able to give and receive feedback effectively. Feedback i ...

随机推荐

  1. C++结构体内存对齐跨平台测试

    测试1,不规则对齐数据. Code: #include <stdio.h> #pragma pack(push) #pragma pack(8) struct Test8 { char a ...

  2. abstract与interface的区别

    abstract的用法: //通过abstract 关键字修饰的类叫抽象类. abstract class Animal { String name; String color; abstract p ...

  3. 安装Kudu

    1.默认安装好yum2.需以root身份安装3.安装ntp yum install ntp -y4.启动ntp /etc/init.d/ntpd start|stop|restart5.添加安装包yu ...

  4. MySql数据库:Host 'localhost' is not allowed to connect to this MySQL server

    修改mysql的root密码后,出现Host 'localhost' is not allowed to connect to this MySQL server 错误. 解决办法: C:\Progr ...

  5. CC countari & 分块+FFT

    题意: 求一个序列中顺序的长度为3的等差数列. SOL: 对于这种计数问题都是用个数的卷积来进行统计.然而对于这个题有顺序的限制,不好直接统计,于是竟然可以分块?惊为天人... 考虑分块以后的序列: ...

  6. SVG文件:从Illustrator导文件到Web

    可缩放矢量图形(SVG)是早在1998年就已经有的一种矢量图像格式.它总是和Web一起发展,但是直到现在才开始赶上Web发展的步伐.如今我们已经不能否认SVG和Web的相关性,所以让我们来学习一下从I ...

  7. 【JBOSS】控制台数据库连接信息

    数据库连接 信息 进入         在这个页面中(IP和端口已自己的为主):ConnectionCount 这个项目代表在服务开启后,总共使用的连接数!ConnectionCreatedCount ...

  8. Ajax完整篇(转载)

    Ajax 完整教程 第 1 页 Ajax 简介Ajax 由 HTML.JavaScript™ 技术.DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用 ...

  9. ubuntu下安装了express2.5.8,如何更新它?

    在ubuntu上通过apt-get install node-express,结果发现它的版本是2.5.8. 想安装express4.0+的版本,一直不能正确安装,所以一时兴起,打算先删掉它,再重新安 ...

  10. Ubuntu创建桌面快捷方式

    默认情况下,ubuntu会将自动安装的软件快捷方式保存在/usr/share/applications目录下,如果我们要创建桌面快捷方式,只需要右键-复制-桌面 就Ok,如图: 上面的方法是通过系统自 ...