本文分享的这个应用监控小工具,本来是我在五年多以前开发实现的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. 通过配置web.config使WCF向外提供HTTPS的Restful Service

    如何通过WCF向外提供Restful的Service请看如下链接 http://www.cnblogs.com/mingmingruyuedlut/p/4223116.html 那么如何通过对web. ...

  2. JavaScript isNaN() 函数

    定义与用法: isNaN() 函数用于检查其参数是否是非数字值. 语法: isNaN(x) 描述:     x是要检测的值. 返回值: 如果 x 是特殊的非数字值 NaN(或者能被转换为这样的值),返 ...

  3. Linux service命令

    service命令(其实与其说是命令,不如说是脚本),因为service本身就是一个脚本,这个脚本在/sbin路径下,待后续shell脚本功底好了将去认真去看看这个脚本的内容(可不能被人忽悠了.) s ...

  4. EditText获取和失去焦点,软键盘的关闭,和软键盘的显示和隐藏的监听

    软键盘显示和隐藏的监听: 注: mReplayRelativeLayout是EditText的父布局 //监听软键盘是否显示或隐藏 mReplayRelativeLayout.getViewTreeO ...

  5. BZOJ 3144 [Hnoi2013]切糕 ——网络流

    [题目分析] 网络流好题! 从割的方面来考虑问题往往会得到简化. 当割掉i,j,k时,必定附近的要割在k-D到k+D上. 所以只需要建两条inf的边来强制,如果割不掉强制范围内的时候,原来的边一定会换 ...

  6. Hdu4311 || 4312Meeting point-1/-2 n个点中任意选一个点使得其余点到该点曼哈顿距离之和最小

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  7. oracle(sql)基础篇系列(一)——基础select语句、常用sql函数、组函数、分组函数

        花点时间整理下sql基础,温故而知新.文章的demo来自oracle自带的dept,emp,salgrade三张表.解锁scott用户,使用scott用户登录就可以看到自带的表. #使用ora ...

  8. React-webpack开发需要的那些坑

    nvariant Violation: _registerComponent(...): Target container is not a DOM element. 就是一个找不到DOM节点的问题, ...

  9. android 5.0以上通知栏、状态栏图标变成白色

    在5.0以上的系统上发现,平常的自定义notification出来的icon,居然在状态栏上变成了纯白色的icon. 看源代码会发现: protected void applyColorsAndBac ...

  10. 【生活没有希望】NOIP2010初赛 烽火传递 smartoj1475

    整天初赛题做做,生活没有希望 用单调队列优化的dp 因为满足后来的总比先来的(在某些方面)更优 所以能用单调队列 n2变成n #include <cstdio> ],b[],c[]; in ...