愛流浪的小風

技術隨手寫

使用Asp.Net MVC打造Web Api (29) - 使用HipChat整合系統通知

| Comments

在昨天的文章之中,介紹了如何透過每日錯誤統計報表來觀察網站的健康狀況,然而除了每天的報表之外,很多時候我們希望可以即時的得知網站目前的情形,但又不希望花費太多的人力在線上網站的觀察上面,這時候我們一樣也可以透過排程工去定期檢查我們希望監控的資料,當有異常時發送出通知給我們的方式來監控線上網站。

安裝並建立HipChat聊天室

其實最早的時候系統通知也是使用發送Email的方式,但長期使用下來發現透過Email通常只會產生大量的郵件,相當的干擾正常郵件的收發,這時候剛好看到XDite大大分享的把公司 Log 搬到 Hipchat,就開始嘗試使用這套軟體來整合系統通知(5人以下免費),而這套工具除了提供Web的介面之外,幾乎各平台都有Client(包含iOS, Android),所以就當作系統通知的選擇,首先我們先來申請並安裝HipChat。

  1. 進入HipChat官網,申請一個帳號

  2. 申請完成之後可以看到聊天室畫面,記得去收驗證信

  3. 建立一個聊天室存放系統通知

  4. 建立聊天室成功

延伸閱讀:

整合Github通知

現在有非常多的版本控制服務,比較出名的有Github、Bitbucket等等,而這兩間也都有提供Service Hook整合HipChat的功能,可以讓我們在推送Branch等行為時發送通知到Hipchat中,接下來就來示範如何啟用通知

  1. 進入HipChat的Group Admin頁面,點選Api頁籤,產生一組新的API Token,並記下Token

  2. 到Github專案頁面點選Settings

  3. 選擇Service Hooks,找到HipChat,並填入Token等資料

  4. 實際操作Branch,可以看到若對Remote有變更時會在HipChat出現資訊

如此一來當多人同時開發時,我們就可以觀察到有沒有人進行新的Commit!

整合TFS建置通知

除了希望在版本控制系統中發送通知之外,我們也希望可以在TFS建置完成時發送通知到HipChat中,這麼一來若建置失敗我們就可以第一時間的處理它。

  1. 進入TFS專案首頁,點選右上角進入Admin頁面

  2. 點選Alerts頁籤,選擇Build Alerts,新增一個Alert

  3. 設定使用SOAP方法通知,並設定通知網址,這邊我們透過HipChat的API來通知,使用SOAP方法,建置成功時觸發通知

  4. 通知網址中包含了我們想要通知訊息的內容以及格式

    https://api.hipchat.com/v1/rooms/message?room_id={roomid{&from=TFS&message=Project+ApiSample+Build+Success!&auth_token={token}&color=green
    
  5. 我們可以同樣的新增建置錯誤通知,但設定不同顏色來做區別

  6. 從Visual Studio觸發一個新的建置

  7. 建置成功後我們可以在HipChat收到訊息

透過CI Server的建置通知,我們可以很快的在第一時間發現版本控制系統中的程式碼有誤,並且馬上排除,這可以讓我們的程式碼一直維持在高可用性的狀態!

延伸閱讀:

偵測Elmah錯誤過多時通知

除了監測版本控制系統和CI Server之外,我們也很常需要觀察線上伺服器的健康狀況,如果線上網站瞬間Exception過多時,一定是網站有潛在的問題存在,這邊就將向大家介紹如何設定一個工作排程來監控線上網站的錯誤狀況

  1. 在原本我們新增排程的Worker Role中使用Nuget安裝HipChat.Net

  2. 增加一個HipChatNotifier,用來發送錯誤訊息到HipChat

    public interface INotifier
    {
        void Notice(string message);
    
        void Alert(string message);
    
        void Error(string message);
    }
    
    public class HipChatNotifier : INotifier
    {
        public string Token { get; set; }
    
        public string RoomId { get; set; }
    
        public string SenderName { get; set; }
    
        public HipChatClient Client { get; set; }
    
        public HipChatNotifier(string token, string roomId, string sender)
        {
            this.Token = token;
            this.RoomId = roomId;
            this.SenderName = sender;
    
            this.Client = new HipChatClient(token, roomId, sender);
        }       
    
        public void Notice(string message)
        {
            this.Client.SendMessage(message, HipChatClient.BackgroundColor.green);
        }
    
        public void Alert(string message)
        {
            this.Client.SendMessage(message, HipChatClient.BackgroundColor.yellow);
        }
    
        public void Error(string message)
        {
            this.Client.SendMessage(message, HipChatClient.BackgroundColor.red);
        }
    }
    
  3. 增加一個排程工作,檢查資料庫中十分鐘內是否有過多錯誤,大家可以依據自己的需求調整參數

    public class ExceptionMonitorJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            var startTime = DateTime.UtcNow.AddMinutes(-10);
            var endTime = DateTime.UtcNow;
    
            var threshold = 10;
            var client = new HipChatNotifier("[token]", "[room id]", "ExceptionMonitor");
    
            using (ExceptionDBContext dbContext = new ExceptionDBContext())
            {
                var errors = dbContext.ELMAH_Error
                                     .Where(
                                        i => i.TimeUtc > startTime &&
                                           i.TimeUtc <= endTime)
                                     .GroupBy(i => i.Application)
                                     .Select(
                                        i =>
                                        new
                                        {
                                            Name = i.Key,
                                            Count = i.Count()
                                        }
                                      );
    
                foreach (var error in errors)
                {
                    if (error.Count > threshold)
                    {
                        client.Alert(string.Format("{0}'s error count is {1} between {2} and {3}", error.Name, error.Count, startTime.ToLocalTime(), endTime.ToLocalTime()));
                    }
                }
            }
        }
    }
    
  4. 新增排程工作到Worker Role中

    var job = JobBuilder.Create<ExceptionMonitorJob>()
                        .WithIdentity("DailyExceptionJob", null)
                        .Build();           
    
    ITrigger trigger = TriggerBuilder.Create()
                                     .WithIdentity("default", null)
                                     .StartAt(runTime)
                                     .WithCronSchedule("1 * * * * ?")
                                     .Build();
    
    scheduler.ScheduleJob(job, trigger);
    
  5. 當錯誤過多時可以看到HipChat收到通知

這麼一來就算沒有時時刻刻觀察線上錯誤訊息,但萬一有錯誤訊息爆增的時候我們也能馬上收到警告並即時處理了!

本日小結

我們在整合了HipChat之後,可以將許多的通知訊息都使用HipChat來接收呈現,它還有一個好處是會保留所有訊息,就算發送訊息時你並未登入,也可以在上線之後檢視訊息內容,不會遺漏,我們還可以再依據自己的使用需求繼續去掛載其它通知到HipChat中,關於今天的內容,歡迎大家一起討論喔^_^

Comments

comments powered by Disqus