本文分享的这个应用监控小工具,本来是我在五年多以前开发实现的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. MySQL学习笔记02_数据库和表的基本操作

    02_1 操作数据库 (1)创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification[, create_specifica ...

  2. Python for Infomatics 第14章 数据库和SQL应用一(译)

    14.1 什么是数据库 数据库一种存储结构数据的文件.绝大多数数据库类似字典——映射键和值的关系.最大的区别是数据库是保存在硬盘或其它永久性的存储上,所以在程序结束后它仍然存在.而保存在内存中的字典容 ...

  3. Codeforces Round #260 (Div. 2)

    A. Laptops 题目意思: 给定n台电脑,第i台电脑的价格是ai ,质量是bi ,问是否存在一台电脑价格比某台电脑价格底,但质量确比某台电脑的质量高,即是否存在ai < aj 且 bi & ...

  4. Android RecyclerView 的简单使用

    Android L SDK发布的,新API中最有意思的就是RecyclerView (后面为RV) 和 CardView了, 按照官方的说法, RV 是一个ListView 的一个更高级更灵活的一个版 ...

  5. 中文字符匹配js正则表达式

    普遍使用的正则是[\u4e00-\u9fa5],但这个范围并不完整.例如:  /[\u4e00-\u9fa5]/.test( '⻏' ) // 测试部首⻏,返回false    根据Unicode 5 ...

  6. 用Eclipse搭建ssh框架

    问:ssh是哪三大框架,以及他们的作用是什么? 答:分别是struts,spring,hibernate. struts的作用是:是web层,其核心是mvc模式,他可以自动获取参数,自动类型转换,自动 ...

  7. 为什么要用elasticsearch-理解加深中

    首先的概念 基于Lucene 分布式实时文件存储 实时的分析搜索引擎 能达到实时搜索 优势的地方 1.横向可扩展性:只需要增加一台服务器,做一点儿配置,启动一下ES进程就可以并入集群: 2.分片机制提 ...

  8. Android中获取选择图片与获取拍照返回结果差异

    导语: 如今的安卓应用在选择图片的处理上大多合并使用拍照和从相册中选择这两种方式 今天在写一个这样的功能时遇到一个尴尬的问题,同样是拍照获取图片功能,在不同手机上运行的效果不一样,下面是在某型手机上测 ...

  9. Solve VS2010 Error "Exceptions has been thrown by the target of an invocation"

    Sometimes when you open a VS2010 project, an error window will pop up with the error message "E ...

  10. php+ajax..转

    php+ajax 登录注册页面 主要是登录注册功能,前端后台验证没有什么,这个大家可以自己加上去,比如过滤啊,正则啊等 还是先放图吧 这是登录及注册界面  点击注册切换到注册界面,点击登录切换到登录界 ...