C#監控-程序池資源監控:CPU佔用率、GC監控及郵件預警

實現對程序池資源監控:CPU佔用率、GC監控及郵件預警,幫助做性能分析,錯誤報警


頁面展示如下:


1. 展示當前各個程序池的CPU佔用率

wKiom1YYxPjw_GiFAAP7cFOHInE600.jpg


2. 展示監控的程序池的cpu佔用率圖表

wKioL1YYxRKg8wMEAAQil3910vs495.jpg


3. 程序池配置list

wKiom1YYxPnCTZxNAAJSASG64Cc105.jpg


4. 程序池監控配置詳情頁:

wKioL1YYxRTgsr-sAAGCMVJ4HcA248.jpg


5. 超出閾值預警郵件

wKiom1YYxPqSkKkfAAHjvYFtjLw510.jpg


數據庫表如下:


wKiom1YYxiChCFDyAAAunmOP5z0881.jpg

wKioL1YYxjqCcj0CAAGGBeYUGzk130.jpg

wKiom1YYxiHgVHiHAAC2Kp5d1EI290.jpg


核心代碼如下:


  1. 獲取進程

    每個程序池就是一個映像名稱爲w3wp的進程,如圖


wKioL1YYx9XgwhHHAAKND7-GFTI529.jpg


所以需要根據映像名稱跟用戶名得到Process


2. 進程的CPU佔用率

根據Process的ID與PerformanceCounter("Process", "ID Process", instance)得到instance,

在生成 PerformanceCounter("Process""% Processor Time", instance1) 就能獲取cpu的佔用率。

詳情參考:上篇博文中寫出瞭如何監控Process的CPU佔用率以及GC (http://4453154.blog.51cto.com/4443154/1701525


3. 進程的GC

根據Process的ID與PerformanceCounter(".NET CLR Memory""Process ID", instance)得到instance,

在生成 PerformanceCounter(".NET CLR Memory""% Time in GC", instance1) 就能獲取進程的gc。

詳情參考:上篇博文中寫出瞭如何監控Process的CPU佔用率以及GC (http://4453154.blog.51cto.com/4443154/1701525


4. 由於每臺服務器上有很多程序池,每個程序池CPU監控器創建的時候都有個捨棄第一個無效樣本,等待最小時間片(測試出來大多機器是200ms,保險起見取1000ms),這樣個耗時操作,所以採用多線程來批量創建程序池的監控。


核心代碼如下:


AppPoolMonitorUtil.cs

using NLog;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
namespace xxxx.xxx.QA.Platform.Core.ServerUtils
{
    public class AppPoolMonitorUtil
    {
        private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
        private static Hashtable monitorHT = new Hashtable(); //創建一個Hashtable實例
        #region 初始化
        /// <summary>
        /// 初始化程序池監控
        /// </summary>
        /// <param name="configs"></param>
        public static void InitAppPoolMonitor(List<string> poolNames)
        {
            Logger.Info("初始化程序池監控信息-start");
            int counter = ProcessorCountMonitor.getValue();
            //Logger.Info("counter:" + counter);
            List<AppPoolMonitorInfo> poolMonitors = new List<AppPoolMonitorInfo>();
            ArrayList listThread = new ArrayList();        
            DateTime d2 = DateTime.Now;
            // 獲取所有程序池名稱
            DateTime d3 = DateTime.Now;
            Process[] ps = Process.GetProcessesByName("w3wp");
            DateTime d4 = DateTime.Now;
            Logger.Info("需監控pool如下:");
            foreach (string name in poolNames)
            {
                Logger.Info(name);
            }
            foreach (Process p in ps)
            {
                string name = MachineMonitor.GetProcessUserName(p.Id);
                //Logger.Info("Process Name:"+name);
                if (poolNames.IndexOf(name) >= 0 && !monitorHT.ContainsKey(name))
                {
                    Logger.Info("Name:" + name+"未生成監控,新建線程生成監控");
                    Thread parameterThread = new Thread(delegate() { GetSingleAppPoolMonitor(name, p, counter, ref monitorHT); });
                    parameterThread.Name = name;
                    parameterThread.Start();
                    //Logger.Info("Thread " + name+" start");
                    listThread.Add(parameterThread);
                }
            }
            foreach (Thread thread in listThread)
            {
                thread.Join();
            }
            Logger.Info("實例化的監控信息如下:");
            int n = monitorHT.Count;
            foreach (DictionaryEntry de  in monitorHT) //ht爲一個Hashtable實例
            {
                Logger.Info("key:" + de.Key);//de.Key對應於keyvalue鍵值對key
                Logger.Info("Value:" + de.Value);//de.Key對應於keyvalue鍵值對value
            }
                Logger.Info("初始化程序池監控信息-Finish");
        }
        public static void GetSingleAppPoolMonitor(string name, Process p, int counter, ref  Hashtable ht)
        {
             try
            {
            //Logger.Info("in GetAppPoolInfo()");
            AppPoolMonitor info = new AppPoolMonitor();
            info.name = name;
            info.count = counter;
            info.process = p;
            //Logger.Info("p.ProcessName:" + p.ProcessName);
            //Logger.Info("p.ProcessName:" + p.Id);
            // 獲取CPU佔用率 PerformanceCounter         
            string instance1 = GetInstanceName("Process", "ID Process", p);
            if (instance1 != null)
            {
                PerformanceCounter cpucounter = new PerformanceCounter("Process", "% Processor Time", instance1);
                if (cpucounter != null)
                {
                    cpucounter.NextValue();
                    System.Threading.Thread.Sleep(200); //等200ms(是測出能換取下個樣本的最小時間間隔),讓後系統獲取下一個樣本
                    info.cpuCounter = cpucounter;
                    //Logger.Info("Name:" + name + "生成CPU監控成功" + instance1);
                }
                else
                {
                    //Logger.Info("Name:" + name + "生成CPU監控失敗" + instance1);
                }               
            }
            else
            {
                //Logger.Info("Name:" + name + "獲取cpu監控實例失敗" + instance1);
            }
            // 獲取GC佔用率 PerformanceCounter            
            string instance2 = GetInstanceName(".NET CLR Memory", "Process ID", p);
            if (instance2 != null)
            {
                PerformanceCounter gccounter = new PerformanceCounter(".NET CLR Memory", "% Time in GC", instance2);
                if (gccounter != null)
                {
                    gccounter.NextValue();
                    info.gcCounter = gccounter;
                    //Logger.Info("Name:" + name + "生成GC監控成功" + instance2);
                }
                else
                {
                    //Logger.Info("Name:" + name + "生成GC監控失敗" + instance2);
                }
            }
            else
            {
                //Logger.Info("Name:" + name + "獲取GC監控實例失敗" + instance2);
            }
            lock (ht)
            {
                // Access thread-sensitive resources.
                if (info != null)
                {
                    ht.Add(name,info);
                    //Logger.Info("Add name:" + name + " into hashtable");
                }
            }
            }
             catch (Exception ex)
             {
                 Logger.Info("Exception:" + ex.ToString());
             }
        }
        public static string GetInstanceName(string categoryName, string counterName, Process p)
        {
            try
            {
                PerformanceCounterCategory processcounter = new PerformanceCounterCategory(categoryName);
                string[] instances = processcounter.GetInstanceNames();
                foreach (string instance in instances)
                {
                    PerformanceCounter counter = new PerformanceCounter(categoryName, counterName, instance);
                    //Logger.Info("對比in mothod GetInstanceName," + counter.NextValue() + ":" + p.Id);
                    if (counter.NextValue() == p.Id)
                    {
                        return instance;
                    }
                }
            }
            catch (Exception ex)
            {
            }
            return null;
        }     
        #endregion
        public static float GetAppPoolMonitorCpu(string poolName)
        {
            Logger.Info("In Method GetAppPoolMonitorCpu(string poolName) and poolName is " + poolName);
            PerformanceCounter cpuCounter = ((AppPoolMonitor)monitorHT[poolName]).cpuCounter ;
            if (cpuCounter != null)
            {
                return cpuCounter.NextValue() / ((AppPoolMonitor)monitorHT[poolName]).count;
            }
            return 0;
        }
        public static float GetAppPoolMonitorMemory(string poolName)
        {
            Process process = ((AppPoolMonitor)monitorHT[poolName]).process;
            return process.WorkingSet64 / (1024 * 1024);
        }
        public static float GetAppPoolMonitorGC(string poolName)
        {
            PerformanceCounter gcCounter = ((AppPoolMonitor)monitorHT[poolName]).gcCounter;
            if (gcCounter != null)
            {
                return gcCounter.NextValue() ;
            }
            return 0;
        }
    }
    public class AppPoolMonitor
    {
        public string name { get; set; } //程序池名
        public int count { get; set; } //核數
        public PerformanceCounter cpuCounter { get; set; }//cpu佔用率:( cpuCounter.NextValue()/count).ToString("F");
        public PerformanceCounter gcCounter { get; set; }
        public Process process { get; set; }//內存:(process.WorkingSet64 / (1024 * 1024)).ToString("F");
    }
}


創建Task

MonitorTask.cs

using FluentScheduler;
using NLog;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace xxx.xxx.QA.Platform.EnvAgent.Services.Tasks
{
    public class MonitorTask : ITask
    {
        private static readonly object Locker = new object();
        private static bool _isRunning;
        private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
        public void Execute()
        {
            if (_isRunning)
            {
                return;
            }
            ChangeState(true);
            try
            {
                Logger.Info("Monitor  start");
                EnvMachine envMachine = EnvMachineBiz.GetCurrentMachine();
              
                #region 程序池監控
                IEnumerable<EnvAppPoolMonitorConfig> currentAppPoolMonitorConfigs = EnvAppPoolMonitorConfigBiz.GetCurrentAppPoolMonitorConfig();
                // 每分鐘插入下數據庫
                Hashtable poolMonitor = new Hashtable(); 
                foreach (EnvAppPoolMonitorConfig config in currentAppPoolMonitorConfigs)
                {
                    //Logger.Info("監控信息:" + config.PoolName+"("+config.TurnOn+")");
                    if (!poolMonitor.ContainsKey(config.PoolName))
                    {
                        //Logger.Info("插入hashtable");
                        poolMonitor.Add(config.PoolName, config.TurnOn);
                    }
                    else
                    {
                        //Logger.Info("已存在");
                        if (config.TurnOn == 1 && (int)poolMonitor[config.PoolName] == 0)
                        {
                           // Logger.Info("TurnON設成1");
                            poolMonitor[config.PoolName] = 1;
                        }
                    }
                }
                //Logger.Info("監控程序池的hashtable如下:");
                List<string> poolNames = new List<string>();
                foreach (DictionaryEntry de in poolMonitor) //ht爲一個Hashtable實例
                {
                    //Logger.Info("key:" + de.Key);//de.Key對應於keyvalue鍵值對key
                   // Logger.Info("Value:" + de.Value);//de.Key對應於keyvalue鍵值對value
                    if ((int)de.Value == 1)
                    {
                        poolNames.Add(de.Key.ToString());
                        //Logger.Info("進入監控池");
                    }
                }
                AppPoolMonitorUtil.InitAppPoolMonitor(poolNames);
                foreach (DictionaryEntry de in poolMonitor) //ht爲一個Hashtable實例
                {
                    if ((int)de.Value == 1)
                    {
                        string poolName = de.Key.ToString();
                        // CPU佔用率
                        int apppoolcpu = (int)AppPoolMonitorUtil.GetAppPoolMonitorCpu(poolName);
                        // 內存佔用MB
                        int apppoolMemory = (int)AppPoolMonitorUtil.GetAppPoolMonitorMemory(poolName);
                        // GC
                        int apppoolgc = (int)AppPoolMonitorUtil.GetAppPoolMonitorGC(poolName);
                        // 存入數據庫
                        DateTime dt = DateTime.Now.ToLocalTime();
                        Logger.Info("Add Pool Monitor info (" + envMachine.Id + ", " + poolName + ", " + apppoolcpu + ", " + apppoolMemory + ", " + apppoolgc + ", " + dt + ")");
                        EnvAppPoolMonitor newInfo2 = EnvAppPoolMonitorBiz.AddEnvAppPoolMonitorInfo(envMachine.Id, poolName, apppoolcpu, apppoolMemory, apppoolgc, dt);
                        //Logger.Info("存程序池監控信息Result: success, return EnvAppPoolMonitor id is " + newInfo2.Id);
                    }
                }
                #endregion
                #region 程序池監控郵件
                // 每十五分鐘監控下發郵件
                DateTime dn2 = DateTime.Now.ToLocalTime();
                if (EmailSendTime.GetTimeSpanSecond2(dn2) > 15)
                {
                    foreach (EnvAppPoolMonitorConfig config in currentAppPoolMonitorConfigs)
                    {
                        if (config.TurnOn == 1 && config.EmailOn == 1)
                        {
                            string reciever = config.Reciever;
                            string body = "";
                            bool flag = false;
                            body += "<h3>"+config.DomainName+" : "+config.NodeName+"</h3>";
                            // 未設置情況默認爲該賬戶
                            if (reciever == null || reciever.Equals(""))
                            {
                                reciever = "[email protected]";
                            }
                            // 檢查CPU佔用率
                            int apppoolcpu = (int)AppPoolMonitorUtil.GetAppPoolMonitorCpu(config.PoolName);
                            if (config.Cpu != null && apppoolcpu > config.Cpu || apppoolcpu > 95)
                            {
                                body += "<h3>CPU佔用率超標</h3>CPU佔用率: " + apppoolcpu + "(閾值:" + config.Cpu + ")<br/><br/>";
                                flag = true;
                            }
                            // 檢查內存佔用MB
                            int apppoolMemory = (int)AppPoolMonitorUtil.GetAppPoolMonitorMemory(config.PoolName);
                            if (config.Memory != null && apppoolMemory > config.Memory)
                            {
                                body += "<h3>內存佔用超標</h3>內存: " + apppoolMemory + "MB(閾值:" + config.Memory + ")<br/><br/>";
                                flag = true;
                            }
                            // 檢查GC
                            int apppoolgc = (int)AppPoolMonitorUtil.GetAppPoolMonitorGC(config.PoolName);
                            if (config.GC != null && apppoolgc > config.GC || apppoolgc > 95)
                            {
                                body += "<h3>GC佔用超標</h3>GC: " + apppoolgc + "(閾值:" + config.GC + ")<br/><br/>";
                                flag = true;
                            }
                            // 發送郵件


註冊Task

   Logger.Info("每1分鐘執行下機器監控");
   Schedule<MonitorTask>().ToRunNow().AndEvery(1).Minutes();


頁面代碼:

  1. 顯示頁

getAppPoolMonitorInfo: function () {
        var container = $("#machinemonitor");
        container.empty();
        var machine = pagefind.currentMachine();
        container.append('<div id="container1"></div><div id="container2" style="min-width: 310px; height: 400px; margin: 0 auto"></div>');
        var container1 = $("#container1");
        var container2 = $("#container2");
       
        if (machine == null) {
            $.note(null, '請先選擇環境&機器', 'error');
            return;
        }
        chcoreui.attachLoader(container1, pageid.loader, 410, 100);
        var url = 'http://' + machine.IP + ':8167/MachineMonitor/GetAppPoolMonitorInfo';
        var pack = new Object();
        pack.Token = $.readCookie('accessToken');
        var submitData = JSON.stringify(pack);
        $.ajax({
            type: "POST",
            url: url,
            data: submitData,
            dataType: "json",
            contentType: "application/json",
            crossDomain: true,
            success: function (results) {
                if (results.StateCode == 0) {
                    var bodyContent = '';
                    $.each(results.Data, function (idx, item) {
                        bodyContent += '<tr><td style="text-align:left;">' + item.PoolName + '</td><td><div class="progressbar_3"><div class="text">' + item.CpuUsage + '%</div><div class="bar" style="width:' + item.CpuUsage + '%;"></div></div></div></td><td>' + item.MemoryUsage + 'MB</td><td><button class="warning" id="AppPoolRestBtn" style="width:160px" id="' + item.PoolName + '" onclick="informationpage.AppPoolReset(id)">重啓程序池</button></td></tr>';
                    });                    
                    container1.html('<table class="table bordered striped hovered dataTable" cellspacing="0" id="machineMonitortable" style="text-align:center"><thead><tr><th>程序池名稱</th><th>佔用CPU百分比</th><th>專用內存</th><th>Action</th></tr></thead><tbody>' + bodyContent + '</tbody></table>');
                    $('#machineMonitortable').dataTable({
                        "paging": false,
                        "searching": true,
                        "ordering": true,
                        "info": false,
                        "striped": false,
                        //"scrollY": "450px",
                        "scrollCollapse": true
                    });
                }
            },
            error: function (xhr, status, error) {
                $.note('Error', '獲取機器監控信息失敗,請聯繫管理員(qyli).', 'error');
            }
        });
        
        //chcoreui.attachLoader(container2, pageid.loader, 410, 100);
        var url2 = '/AppPoolMonitor/GetMonitorInfos?ip=' + machine.IP;
        var pack = new Object();
        pack.Token = $.readCookie('accessToken');
        var submitData = JSON.stringify(pack);
        $.ajax({
            type: "POST",
            url: url2,
            data: submitData,
            dataType: "json",
            contentType: "application/json",
            crossDomain: true,
            success: function (results) {
                if (results.StateCode == 0) {
                    $.apppoolmonitorchart(container2, results.Data);
                }
                else {
                    $.note('獲取數據庫中程序池監控信息失敗.' + results.Message, 'error');
                }
            },
            error: function (xhr, status, error) {
                $.note('Error', '獲取數據庫中機器監控信息失敗', error);
            }
        });
    }

2. 圖表

(function ($){ 
    $.apppoolmonitorchart = function (container, monitorinfo) {
        $.each(monitorinfo, function (index, value) {
            var time = new Array();
            var i = 0;
            $.each(value.timeList, function (index, value) {
                time[i] = $.convertToDateStr(value);
                i++;
            });
            container.append('<br/><div id="newContain'+index+'" style="min-width: 310px; height: 400px; margin: 0 auto"></div>')
            $("#newContain"+index+"").highcharts({
                title: {
                    text: '程序池CPU資源監控',
                    x: -20 //center
                },
                subtitle: {
                    text: value.poolName+'的CPU佔用率',
                    x: -20
                },
                xAxis: {
                    categories: time
                },
                yAxis: {
                    title: {
                        text: '百分比(%)'
                    },
                    plotLines: [{
                        value: 0,
                        width: 1,
                        color: '#808080'
                    }]
                },
                tooltip: {
                    valueSuffix: '%'
                },
                legend: {
                    layout: 'vertical',
                    align: 'right',
                    verticalAlign: 'middle',
                    borderWidth: 0
                },
                series: [{
                    name: 'CPU',
                    data: value.dataList
                }]
            });
        });
        
    }
})(jQuery);

3. 配置

monitorapppoolconfigpage = {
    render: function () {
        var container = $(pageid.mainContent);
        container.empty();
        chcoreui.attachLoader(container, pageid.loader, 410, 100);
        var url = '/AppPoolMonitor/AppPoolMonitorConfig';
        $.getJSON(url, function (results) {
            if (results.StateCode == 0) {
                // 成功
                var bodyContent = '';
                $.each(results.Data, function (idx, item) {
                    bodyContent += '<tr><td style="text-align:center;"><button class="link invokebtn"><i class="icon-play"></i></button></td><td>' + item.Name + '</td><td>' + item.DomainName + '</td><td>' + item.NodeName + '</td><td>' + item.MachineName + '</td><td style="text-align:center;">' + item.Ip + '</td><td  style="text-align:center;"><input  class="turnonckbox" id="' + item.Id + '" type="checkbox"';
                    if (item.TurnOn == 1) {
                        bodyContent += " checked "
                    }
                    bodyContent += ' data-size="mini" data-on-color="success"></td><td><button class="link apppoolmonitorconfigbtn" id="' + item.Id + '" ><span class="mif-loop2"></span>配置</button></td></tr>';
                });
                container.empty();
                container.html('<div style="margin-left:30px;"><button class="refreshbtn primary" style="width:100px" ><i class="icon-cycle on-left"></i>刷新</button>&nbsp;<button class="addapppoolmonitorbtn success"  style="width:100px" ><i class="icon-plus on-left"></i>新建</button></div><table class="table bordered striped hovered dataTable" cellspacing="0" id="apppooltable"><thead><tr><th><button class="invokeallbtn warning"><i class="icon-play on-left"></i>喚醒</button></th><th>監控器名</th><th>站點名</th><th>字站點名</th><th>機器名</th><th>ip</th><th>開啓</th><th>Action</th></tr></thead><tbody>' + bodyContent + '</tbody></table>');
                $('#apppooltable').dataTable({
                    "paging": false,
                    "searching": true,
                    "ordering": true,
                    // "scrollY": "450px",
                    "scrollCollapse": true,
                    "dom": '<"tool1bar">fr1tip'
                });
                $(".turnonckbox").change(function () {
                    var id = this.id;
                    if ($('#' + id + '').is(':checked')) {
                        monitorapppoolconfigpage.postTurnOn(id);
                    }
                    else {
                        monitorapppoolconfigpage.postTurnOff(id);
                    }
                });
                $(".refreshbtn").click(function () {
                    monitorapppoolconfigpage.render();
                });
                $(".addapppoolmonitorbtn").click(function () {
                    monitorapppoolconfigpage.getConfigSetingDialog(0);
                });
                $(".invokebtn").click(function () {
                    monitorapppoolconfigpage.startInvoke($(this));
                });
                $(".invokeallbtn").click(function () {
                    if (!$(this).hasClass('disabled')) {
                        var syncbtns = $('.invokebtn');
                        $(this).addClass('disabled');
                        $.each(syncbtns, function (idx, item) {
                            item.click();
                        });
                    }
                });
                $(".apppoolmonitorconfigbtn").click(function () {
                    var id = this.id;
                    monitorapppoolconfigpage.getConfigSetingDialog(id);
                });
            }
        });
    },
    getConfigSetingDialog: function (id) {
        $.setting("settingDiv", "程序池監控配置框:" + name, "620px", "470px");
        chcoreui.attachLoader($("#settingDiv"), pageid.loader, 410, 100);
        
        $("#settingDiv").empty();
        $("#AppPoolMonitorSettingTemplate").tmpl().appendTo("#settingDiv");
        var domainSelect = $("#domain");
        var templateSelect = $("#template");
        var nodeSelect = $("#node");
        // 綁定數據
        if (id != 0) {
            $.getJSON('/AppPoolMonitor/GetMonitorSetting?id=' + id, null, function (data) {
                if (data) {
                    domainSelect.append("<option value=" + data.Data.SubId + " select disabled=true>" + data.Data.SubName + "</option>");
                    templateSelect.append("<option value=" + data.Data.DomainId + " select disabled=true>" + data.Data.DomainName + "</option>");
                    nodeSelect.append("<option value=" + data.Data.NodeId + " select disabled=true>" + data.Data.NodeName + "</option>");
                    $("#ipAndPoolInfoDiv").removeAttr("style");
                    $("#ip").html(data.Data.Ip);
                    $("#apppool").html(data.Data.PoolName);
                    if (data.Data.TurnOn == 1) {
                        $("#turnOn").attr("checked", true);
                    }
                    else {
                        $("#turnOn").attr("checked", false);
                    }
                    if (data.Data.EmailOn == 1) {
                        $("#emailOn").attr("checked", true);
                    }
                    else {
                        $("#emailOn").attr("checked", false);
                    }
                    $("#monitorName").val(data.Data.Name);
                    $("#cpu").val(data.Data.Cpu);
                    $("#Memory").val(data.Data.Memory);
                    $("#GC").val(data.Data.GC);
                    $("#recievers").val(data.Data.Reciever);
                }
            });
        }
        else {
            // 綁定環境         
            domainSelect.empty();
            $.getJSON('/env/GetAllEnvSubs', null, function (data) {
                if (data.StateCode == 0) {
                    var content = "<option select>請選擇環境</option>";
                    $.each(data.Data, function (idx, item) {
                        content += "<option value=" + item.EnvSubId + ">" + item.EnvSubName + "</option>"
                    });
                    domainSelect.append(content);
                }
            });
            // 綁定站點           
            templateSelect.empty();
            $.getJSON('/DomainTemplate/GetAllEnvDomainTemplates', null, function (data) {
                if (data.StateCode == 0) {
                    var content = "<option select>請選擇站點</option>";
                    $.each(data.Data, function (idx, item) {
                        content += "<option value=" + item.Id + ">" + item.DomainName + "</option>"
                    });
                    templateSelect.append(content);
                }
            });
            //綁定onchange事件
            templateSelect.change(function () {
                // 綁定子站點
                monitorapppoolconfigpage.bingDomainNode(templateSelect.val(), 0);
            });
        }         
            $('#comitSettingBtn').click(function () {
                monitorapppoolconfigpage.commitMonitorConfig();
                $.Dialog.close();
            });
            $('#cancelCommitBtn').click(function () {
                monitorapppoolconfigpage.getConfigSetingDialog(id);
            });
            $('#closeCommitBtn').click(function () {
                $.Dialog.close();
            });
       
    },
    bingDomainNode: function (templateid, nodeid) {
        var nodeSelect = $("#node");
        nodeSelect.empty();
        $.getJSON('/DomainTemplate/GetDomainNodeTemplate?id='+templateid, null, function (data) {
            if (data.StateCode == 0) {
                var content = "<option select>請選擇子站點</option><option>全部</option>";
                $.each(data.Data, function (idx, item) {
                    content += "<option value=" + item.Id + ">" + item.NodeName + "</option>"
                });
                nodeSelect.append(content);
                if (nodeid != 0) {
                    $("#node option[@value='" + nodeid + "']").attr("selected", "true")
                }
                else {
                    $("#monitorName").text = $("#domain").val() + "-" + $("#template").val();
                }
            }
        });
    },
    commitMonitorConfig: function () {        
        
        var config = new Object();
        config.Name = $("#monitorName").val();
        config.Cpu = $("#cpu").val();
        config.Memory = $("#Memory").val();
        config.GC = $("#GC").val();
        config.SubId = $("#domain").val();
        config.SubName = $("#domain").find("option:selected").text();
        config.DomainId = $("#template").val();
        config.DomainName = $("#template").find("option:selected").text();
        config.NodeId = $("#node").val();
        config.NodeName = $("#node").find("option:selected").text();
        if ($("#turnOn").is(':checked')) {
            config.TurnOn = "1";
        }
        else {
            config.TurnOn = "0";
        }
        if ($("#emailOn").is(':checked')) {
            config.EmailOn = "1";
        }
        else {
            config.EmailOn = "0";
        }
        config.Reciever = $("#recievers").val();
        if (config.NodeName == "全部")
        {
            $("#node option").each(function () { //遍歷全部option
                var txt = $(this).text(); //獲取option的內容
                if (txt != "全部" && txt != "請選擇子站點") //如果不是“全部”和"請選擇子站點"
                {
                    config.NodeName = txt;
                    monitorapppoolconfigpage.postMonitorConfig(config);
                }
            });
        }
        else
        {
            monitorapppoolconfigpage.postMonitorConfig(config);
        }
    },
    postMonitorConfig: function (postData) {
        var url = '/AppPoolMonitor/CommitMonitorConfig';
        var pack = new Object();
        pack.Token = $.readCookie('accessToken');
        pack.config = config;
        var submitData = JSON.stringify(pack);
        $.ajax({
            type: "POST",
            url: url,
            data: submitData,
            dataType: "json",
            contentType: "application/json",
            crossDomain: true,
            success: function (results) {
                if (results.Data == "0") {
                    $.note(null, "修改" + name + "監控配置成功!");
                    monitorapppoolconfigpage.render();
                }
                else {
                    $.note(null, "修改" + name + "監控配置失敗!" + results.Message, 'error');
                }
            },
            error: function (xhr, status, error) {
                $.note(null, "發送修改" + name + "監控配置請求失敗!", 'error');
            }
        });
    },
    postTurnOn: function (id) {
        token = $.readCookie('accessToken');
        $.post("/AppPoolMonitor/TurnOnMonitor", { "id": id, "alis": token }, function (data) {
            if (data.StateCode == 0) {
                $.note(null, '開啓監控成功.');
            }
            else {
                $.note(null, '開啓監控失敗.',"error");
            }
        });
    },
    postTurnOff: function (id) {
        token = $.readCookie('accessToken');
        $.post("/AppPoolMonitor/TurnOffMonitor", { "id": id, "alis": token }, function (data) {
            if (data.StateCode == 0) {
                $.note(null, '關閉監控成功.');
            }
            else {
                $.note(null, '關閉監控失敗.', "error");
            }
        });
    },
    startInvoke: function (sender) {
        var parentObj = sender.parent();
        parentObj.empty();
        parentObj.append('<img src="../img/loading.jpg" style="width:30px;" id="iloader" />');
        var ip = parentObj.next().next().next().next().next().text();
        var url = 'http://' + ip + ':8167/Monitor/Ping';
        $.ajax({
            type: "POST",
            url: url,
            data: null,
            dataType: "json",
            contentType: "application/json",
            crossDomain: true,
            success: function (results) {
                parentObj.empty();
                var reg = /\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}/;
                if (reg.test(results)) {
                    $.note(null, '喚醒' + ip + '監控成功!');
                    parentObj.append('<button class="link invokesuccessbtn" style="margin-left:30px;"><i class="icon-checkmark fg-green" style="margin-left:45px;"></i></button>');
                    $('.invokesuccessbtn').click(function () {
                        monitorconfigpage.startInvoke($(this));
                    });
                } else {
                    $.note('Error', '喚醒' + ip + '失敗!', 'error');
                    parentObj.append('<button class="link invokefailbtn" style="margin-left:30px;"><i class="icon-cancel-2 fg-red"></i></button>');
                    $('.invokefailbtn').click(function () {
                        monitorconfigpage.startInvoke($(this));
                    });
                }
            },
            error: function (xhr, status, error) {
                $.note('Error', '喚醒' + ip + '失敗!' + error, 'error');
                parentObj.empty();
                parentObj.append('<button class="link invokefailbtn" style="margin-left:30px;"><i class="icon-cancel-2 fg-red"></i></button>');
                $('.invokefailbtn').click(function () {
                    monitorconfigpage.startInvoke($(this));
                });
            }
        });
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章