共用方式為


監視應用程式登入健康狀態以獲取復原能力

若要提高基礎結構復原能力,請為您的關鍵應用程式設定應用程式登入健康情況的監視。 您可以在發生影響事件時收到警示。 此文章將逐步解說如何設定應用程式登入健康情況活頁簿,以監視使用者的登入中斷。

您可以根據登入健康情況活頁簿來設定警示。 此活頁簿可讓管理員監視其租用戶中應用程式的驗證要求。 它提供下列重要功能:

  • 設定活頁簿,以近即時資料來監視所有或個別的應用程式。
  • 設定驗證模式變更的警示,以便可調查並回應。
  • 比較一段時間的趨勢。 每週是活頁簿的預設設定。

注意

如需查看所有可用的活頁簿及使用的必要條件,請參閱如何使用 Azure 監視器活頁簿來建立報告

在影響事件期間,可能會發生兩件事:

  • 當使用者無法登入時,應用程式的登入次數可能急遽下降。
  • 登入失敗的次數可能會增加。

必要條件

設定應用程式登入健康情況活頁簿

若要在 Azure 入口網站中存取活頁簿,請選取 [Microsoft Entra ID],並選取 [活頁簿]

[使用方式]、[條件式存取] 及 [疑難排解] 下會顯示活頁簿。 應用程式登入健康情況活頁簿會出現在 [健康情況] 區段中。 當您使用活頁簿之後,該活頁簿可能會出現在 [最近修改的活頁簿] 區段中。

您可使用應用程式登入健康情況活頁簿以視覺化方式呈現登入所發生的情況。如同下列螢幕擷取畫面所示,活頁簿會顯示兩個圖表。

顯示登入健康情況圖表的螢幕擷取畫面。

在上述螢幕擷取畫面中,有兩個圖表:

  • 每小時使用量 (成功的使用者數)。 將目前的成功使用者數目與一般使用期限進行比較,可協助您找出可能需要調查的使用方式下降。 成功使用率的下降,有助於偵測失敗率無法偵測到的效能和使用量問題。 例如,當使用者無法觸達您的應用程式來嘗試登入時,會出現使用方式下降,但不會發生失敗。 如需此資料的範例查詢,請參閱本文的下一節。
  • 每小時失敗率。 失敗率的尖峰可能表示您的驗證機制有問題。 只有在使用者可嘗試進行驗證時,才會顯示失敗率測量。 當使用者無法獲得進行嘗試的存取權,將不會發生失敗。

設定查詢和警示

您可以在 Azure 監視器中建立警示規則,而且可以定期自動執行已儲存的查詢或自訂記錄搜尋。 您可以設定警示,在使用方式或失敗率超過指定的閾值時通知特定群組。

使用下列指示,根據圖表中反映的查詢來建立電子郵件警示。 範例指令碼將在符合下列情況時傳送電子郵件通知:

  • 相較於兩天前的同一個小時,成功使用方式下降了 90%,如同上述每小時使用方式圖表範例所示。
  • 相較於兩天前的同一個小時,失敗率提高了 90%,如同上述每小時失敗率圖表範例所示。

若要設定基礎查詢並設定檢視,請使用範例查詢作為設定的基礎來完成下列步驟。 此區段結尾會顯示查詢結構說明。 如需了解如何使用 Azure 監視器來建立、檢視和管理記錄警示,請參閱管理記錄警示

  1. 在活頁簿中,選取 [編輯],如同下列螢幕擷取畫面所示。 選取圖表右上角的 [查詢圖示]

    顯示編輯活頁簿的螢幕擷取畫面。

  2. 檢視查詢記錄,如下列螢幕擷取畫面所示。

    顯示查詢記錄的螢幕擷取畫面。

  3. 針對新的 Kusto 查詢複製下列其中一個範例指令碼。

  4. 在視窗中貼上查詢。 選取執行。 尋找已完成訊息和查詢結果,如下列螢幕擷取畫面所示。

    顯示執行查詢結果的螢幕擷取畫面。

  5. 醒目提示查詢。 選取 [+ 新增警示規則]

    顯示新警示規則畫面的螢幕擷取畫面。

  6. 設定警示條件。 如同下列範例螢幕擷取畫面所示,在 [條件] 區段的 [測量] 下,針對 [測量] 選取 [資料表資料列]。 在 [彙總類型] 選取 [計數]。 針對 [彙總細微性],選取 [2 天]

    顯示設定警示畫面的螢幕擷取畫面。

    • 資料表資料列。 您可以使用傳回的資料列數目以使用 Windows 事件記錄、Syslog 和應用程式例外狀況等事件。
    • 彙總類型。 使用 [計數] 套用的資料點。
    • 彙總細微性。 此值將定義評估頻率適用的期間。
  7. 在 [警示邏輯] 中,設定參數,如範例螢幕擷取畫面所示。

    顯示警示邏輯畫面的螢幕擷取畫面。

    • 閾值:0。 此值會對任何結果發出警示。
    • 評估頻率:1 小時。 此值會針對前一個小時,將評估期設定為每小時一次。
  8. 在 [動作] 區段中,進行設定,如範例螢幕擷取畫面所示。

    顯示建立警示規則畫面的螢幕擷取畫面。

    • 選取 [選取動作群組],然後新增您想要警示通知的群組。
    • 在 [自訂動作] 底下,選取 [電子郵件警示]
    • 新增主旨列
  9. 在 [詳細資料] 區段中,進行設定,如範例螢幕擷取畫面所示。

    顯示 [詳細資料] 區段的螢幕擷取畫面。

    • 新增 [訂閱帳戶] 名稱和說明。
    • 選取您要新增警示的 [資源群組]
    • 選取預設的 [嚴重性]
    • 如果您要立即上線,請選取 [建立時啟用]。 否則,請選取 [靜音動作]
  10. 在 [檢閱 + 建立] 區段中,進行設定,如範例螢幕擷取畫面所示。

    顯示 [檢閱 + 建立] 區段的螢幕擷取畫面。

  11. 選取 [儲存]。 輸入查詢的名稱。 針對 [另存新檔],選取 [查詢]。 針對 [類別],選取 [警示]。 再次選取 [儲存]

    顯示儲存查詢按鈕的螢幕擷取畫面。

精簡您的查詢和警示

若要修改您的查詢和警示以獲取最大效益:

  • 一律測試警示。
  • 修改警示敏感度和頻率,以便能接收重要通知。 如果管理員因為遇到太多問題而遺漏了重要事項,則其可能會對警示變得不敏感。
  • 在管理員的電子郵件用戶端中,將發出警示的電子郵件新增至允許的寄件者清單。 此方法可防止因電子郵件用戶端上的垃圾郵件篩選而遺漏通知。
  • 依設計,Azure 監視器中的警示查詢只能包含過去 48 小時的結果。

範例指令碼

對於失敗率增加的 Kusto 查詢

在下列查詢中,我們偵測到增加的失敗率。 您可以視需要於底部調整比例。 這代表與昨天同一時間的流量相比,過去一小時的流量百分比變更。 0.5 結果表示流量中有 50% 的差異。

let today = SigninLogs
| where TimeGenerated > ago(1h) // Query failure rate in the last hour
| project TimeGenerated, UserPrincipalName, AppDisplayName, status = case(Status.errorCode == "0", "success", "failure")
// Optionally filter by a specific application
//| where AppDisplayName == **APP NAME**
| summarize success = countif(status == "success"), failure = countif(status == "failure") by bin(TimeGenerated, 1h) // hourly failure rate
| project TimeGenerated, failureRate = (failure * 1.0) / ((failure + success) * 1.0)
| sort by TimeGenerated desc
| serialize rowNumber = row_number();
let yesterday = SigninLogs
| where TimeGenerated between((ago(1h) – totimespan(1d))..(now() – totimespan(1d))) // Query failure rate at the same time yesterday
| project TimeGenerated, UserPrincipalName, AppDisplayName, status = case(Status.errorCode == "0", "success", "failure")
// Optionally filter by a specific application
//| where AppDisplayName == **APP NAME**
| summarize success = countif(status == "success"), failure = countif(status == "failure") by bin(TimeGenerated, 1h) // hourly failure rate at same time yesterday
| project TimeGenerated, failureRateYesterday = (failure * 1.0) / ((failure + success) * 1.0)
| sort by TimeGenerated desc
| serialize rowNumber = row_number();
today
| join (yesterday) on rowNumber // join data from same time today and yesterday
| project TimeGenerated, failureRate, failureRateYesterday
// Set threshold to be the percent difference in failure rate in the last hour as compared to the same time yesterday
// Day variable is the number of days since the previous Sunday. Optionally ignore results on Sat, Sun, and Mon because large variability in traffic is expected.
| extend day = dayofweek(now())
| where day != time(6.00:00:00) // exclude Sat
| where day != time(0.00:00:00) // exclude Sun
| where day != time(1.00:00:00) // exclude Mon
| where abs(failureRate – failureRateYesterday) > 0.5

對於使用方式下降的 Kusto 查詢

在下列查詢中,我們將比較過去一小時的流量與昨天同一時間的流量。 我們排除星期六、星期日和禮拜一,因為我們預期前一天同一時間的流量有很大的變化。

您可以視需要於底部調整比例。 這代表與昨天同一時間的流量相比,過去一小時的流量百分比變更。 0.5 結果表示流量中有 50% 的差異。 調整這些值,以符合您的商務營運模式。

Let today = SigninLogs // Query traffic in the last hour
| where TimeGenerated > ago(1h)
| project TimeGenerated, AppDisplayName, UserPrincipalName
// Optionally filter by AppDisplayName to scope query to a single application
//| where AppDisplayName contains "Office 365 Exchange Online"
| summarize users = dcount(UserPrincipalName) by bin(TimeGenerated, 1hr) // Count distinct users in the last hour
| sort by TimeGenerated desc
| serialize rn = row_number();
let yesterday = SigninLogs // Query traffic at the same hour yesterday
| where TimeGenerated between((ago(1h) – totimespan(1d))..(now() – totimespan(1d))) // Count distinct users in the same hour yesterday
| project TimeGenerated, AppDisplayName, UserPrincipalName
// Optionally filter by AppDisplayName to scope query to a single application
//| where AppDisplayName contains "Office 365 Exchange Online"
| summarize usersYesterday = dcount(UserPrincipalName) by bin(TimeGenerated, 1hr)
| sort by TimeGenerated desc
| serialize rn = row_number();
today
| join // Join data from today and yesterday together
(
yesterday
)
on rn
// Calculate the difference in number of users in the last hour compared to the same time yesterday
| project TimeGenerated, users, usersYesterday, difference = abs(users – usersYesterday), max = max_of(users, usersYesterday)
| extend ratio = (difference * 1.0) / max // Ratio is the percent difference in traffic in the last hour as compared to the same time yesterday
// Day variable is the number of days since the previous Sunday. Optionally ignore results on Sat, Sun, and Mon because large variability in traffic is expected.
| extend day = dayofweek(now())
| where day != time(6.00:00:00) // exclude Sat
| where day != time(0.00:00:00) // exclude Sun
| where day != time(1.00:00:00) // exclude Mon
| where ratio > 0.7 // Threshold percent difference in sign-in traffic as compared to same hour yesterday

建立管理警示的流程

設定查詢和警示後,請建立商務流程來管理警示。

  • 誰監視活頁簿及何時監視?
  • 當發生警示時,調查警示的人員為何?
  • 通訊需要什麼? 建立和接收通訊的人員為何?
  • 當發生中斷時,需要套用哪些商務流程?

下一步

深入了解活頁簿