實施外部工具可以定期通過暴露終端訪問應(yīng)用程序中的功能檢查。這個模式可以幫助驗證的應(yīng)用和服務(wù)被正確執(zhí)行。
它是很好的做法,并且通常是一個業(yè)務(wù)需求,并監(jiān)控web應(yīng)用程序,和中間層和共享服務(wù),以確保它們是可用的,并執(zhí)行正確的。然而,它更難以監(jiān)測在云中運行比它要監(jiān)控本地服務(wù)的服務(wù)。舉例來說,你不必完全控制主機環(huán)境,而服務(wù)通常依賴于平臺,供應(yīng)商和其他公司提供其他服務(wù)。
也有一些影響云托管的應(yīng)用,如網(wǎng)絡(luò)延遲,性能和下面的計算和存儲系統(tǒng)的可用性,以及它們之間的網(wǎng)絡(luò)帶寬的因素很多。由于任何這些因素的服務(wù)可能完全或部分失敗。因此,您必須定期驗證服務(wù)正在執(zhí)行正確,以確??捎眯?,這可能是您的服務(wù)級別協(xié)議(SLA)的一部分所要求的水平。
通過將請求發(fā)送到應(yīng)用程序的端點實施健康監(jiān)測。該應(yīng)用程序應(yīng)該執(zhí)行必要的檢查,并返回其狀態(tài)的指示。
一種保健監(jiān)測檢查通常結(jié)合了兩個因素:檢查(如果有的話)的應(yīng)用程序或服務(wù)響應(yīng)于所述請求發(fā)送到健康驗證端點執(zhí)行,并且結(jié)果由工具或框架正在執(zhí)行健康檢查驗證的分析。的響應(yīng)代碼表示的應(yīng)用程序的狀態(tài)和任選的任何組件或服務(wù),它使用。的延遲或響應(yīng)時間檢查由監(jiān)測工具或框架進行。圖1示出了該模式的執(zhí)行的概述。
圖1 - 模式概述
附加的檢查,可能如下進行:在該應(yīng)用程序的運行狀況監(jiān)視代碼包括:
幾個現(xiàn)有的服務(wù)和工具可用于監(jiān)視 web 應(yīng)用程序通過提交一個請求到一組可配置的端點,并評價針對一組可配置的規(guī)則的結(jié)果。它相對容易地創(chuàng)建一個服務(wù)端點,其唯一的目的是要在系統(tǒng)上執(zhí)行一些功能測試。
這可以通過監(jiān)控工具來執(zhí)行典型的檢查包括:
它也是有用的,在可能情況下,以內(nèi)部部署和托管的位置運行,從這些不同的檢查,以測量和來自不同地方比較的響應(yīng)時間。理想情況下,你應(yīng)該監(jiān)視那些貼近客戶,以得到每個位置的性能進行精確的視圖位置的應(yīng)用程序。除了提供一個更為堅固的檢查機制,其結(jié)果可能會影響部署位置的選擇的應(yīng)用程序,以及是否在一個以上的數(shù)據(jù)中心部署。
試驗還應(yīng)該對所有客戶使用,以確保應(yīng)用程序正常工作的所有顧客的服務(wù)實例運行。例如,如果客戶的存儲空間分布在多個存儲賬戶,在監(jiān)測過程中,必須檢查所有的這些。
在決定如何實現(xiàn)這個模式時,請考慮以下幾點:
確保應(yīng)用程序不會正確地當(dāng)目標(biāo)資源是發(fā)現(xiàn)和處理僅返回200狀態(tài)碼。在某些情況下,使用母版頁來承載目標(biāo)網(wǎng)頁的時候,例如,服務(wù)器可能會返回一個 200 OK 狀態(tài)碼,而不是一個 404 未找到的代碼,即使沒有找到目標(biāo)內(nèi)容頁面。
DoS 攻擊是可能對一個單獨的端點,它執(zhí)行基本功能測試,而不會影響應(yīng)用程序的動作的影響較小。理想情況下,應(yīng)避免使用測試可能暴露敏感信息。如果你必須返回,可能是對攻擊者有用的信息,考慮如何將保護端點免受未經(jīng)授權(quán)的訪問數(shù)據(jù)。在這種情況下,僅僅依靠默默無聞是不夠的。還應(yīng)該考慮使用 HTTPS 連接和加密的任何敏感數(shù)據(jù),盡管這會增加服務(wù)器上的負載。
還要確保監(jiān)控系統(tǒng)進行自身檢查,如自檢和內(nèi)置的測試,以避免它在發(fā)出假陽性結(jié)果。
這種模式非常適合于:
下面的代碼示例,從 HealthCheckController 類的 HealthEndpointMonitoring.Web 項目采取包括可以下載本指南的樣品,演示露出一個端點進行一系列健康檢查。
該 CoreServices 方法,如下所示,執(zhí)行在應(yīng)用程序中使用的服務(wù)的一系列檢查。如果所有的測試中沒有錯誤執(zhí)行,該方法返回一個 200(OK)狀態(tài)碼。如果有任何的測試引發(fā)了異常,該方法返回一個 500(內(nèi)部錯誤)狀態(tài)碼。當(dāng)發(fā)生錯誤時的方法,可任選地返回附加信息,如果該監(jiān)控工具或框架能夠利用它。
public ActionResult CoreServices()
{
try
{
// Run a simple check to ensure the database is available.
DataStore.Instance.CoreHealthCheck();
?
// Run a simple check on our external service.
MyExternalService.Instance.CoreHealthCheck();
}
catch (Exception ex)
{
Trace.TraceError("Exception in basic health check: {0}", ex.Message);
?
// This can optionally return different status codes based on the exception.
// Optionally it could return more details about the exception.
// The additional information could be used by administrators who access the
// endpoint with a browser, or using a ping utility that can display the
// additional information.
return new HttpStatusCodeResult((int)HttpStatusCode.InternalServerError);
}
return new HttpStatusCodeResult((int)HttpStatusCode.OK);
}
該 ObscurePath 方法顯示了如何讀取應(yīng)用程序配置的路徑,并用它作為測試端點。這個例子也說明了如何接受一個 ID 作為參數(shù),并用它來檢查有效的請求。
public ActionResult ObscurePath(string id)
{
// The id could be used as a simple way to obscure or hide the endpoint.
// The id to match could be retrieved from configuration and, if matched,
// perform a specific set of tests and return the result. It not matched it
// could return a 404 Not Found status.
?
// The obscure path can be set through configuration in order to hide the endpoint.
var hiddenPathKey = CloudConfigurationManager.GetSetting("Test.ObscurePath");
?
// If the value passed does not match that in configuration, return 403 "Not Found".
if (!string.Equals(id, hiddenPathKey))
{
return new HttpStatusCodeResult((int)HttpStatusCode.NotFound);
}
?
// Else continue and run the tests...
// Return results from the core services test.
return this.CoreServices();
}
該 TestResponseFromConfig 方法顯示了如何可以公開執(zhí)行一個指定的配置設(shè)定值檢查的端點。
public ActionResult TestResponseFromConfig()
{
// Health check that returns a response code set in configuration for testing.
var returnStatusCodeSetting = CloudConfigurationManager.GetSetting(
"Test.ReturnStatusCode");
?
int returnStatusCode;
?
if (!int.TryParse(returnStatusCodeSetting, out returnStatusCode))
{
returnStatusCode = (int)HttpStatusCode.OK;
}
?
return new HttpStatusCodeResult(returnStatusCode);
}
在Azure應(yīng)用程序監(jiān)控終端的一些選項包括:
注意: 盡管 Azure 提供一個合理的全面的監(jiān)控選項,您可以決定使用額外的服務(wù)和工具,以提供額外的信息。
Azure 管理服務(wù)提供了各地的警報規(guī)則建立了一個全面的內(nèi)置監(jiān)控機制。管理服務(wù)網(wǎng)頁中的 Azure 管理門戶 Alerts 部分,可以配置高達每認購10警報規(guī)則為您服務(wù)。這些規(guī)則指定一條件和用于服務(wù)諸如 CPU 負載的閾值,或每秒請求或錯誤的數(shù)量,并且該服務(wù)可以自動發(fā)送電子郵件通知給你在每個規(guī)則定義的地址。
您可以監(jiān)視具體費用取決于您選擇適合您的應(yīng)用程序的托管機制的條件下(如網(wǎng)站,云服務(wù),虛擬機,或移動服務(wù)),但所有這些,包括創(chuàng)建使用網(wǎng)絡(luò)端點警報規(guī)則的能力您在為您服務(wù)的設(shè)置指定。此端點應(yīng)該及時地作出反應(yīng),以使警報系統(tǒng)可以檢測到該應(yīng)用程序是否正常運行。
注意: 有關(guān)創(chuàng)建監(jiān)視警報的詳細信息,請參閱 MSDN 上的管理服務(wù)。
如果你的主機在 Azure 云服務(wù)網(wǎng)絡(luò)和工作角色或虛擬機應(yīng)用程序時,您可以采取的內(nèi)置服務(wù)在Azure中所謂的流量管理器中的一個優(yōu)勢。流量管理器是一個路由和負載平衡服務(wù),可以將請求分發(fā)到您的云服務(wù)托管的應(yīng)用程序基于一系列的規(guī)則和設(shè)置的具體實例。
除了請求路由,流量管理坪的 URL,端口和相對你定期指定的路徑來確定其規(guī)則中定義的應(yīng)用程序的實例是活動的,并響應(yīng)請求。如果它檢測到一個狀態(tài)代碼 200(OK)它標(biāo)志著應(yīng)用程序可用,其他狀態(tài)的代碼會導(dǎo)致流量管理器來標(biāo)記應(yīng)用程序離線。您可以查看流量管理器控制臺的狀態(tài)和配置規(guī)則來重新路由請求被響應(yīng)的應(yīng)用程序的其他實例。
但是,請記住,流量管理器將只等待10秒鐘,以接收來自監(jiān)控URL的響應(yīng)。因此,你應(yīng)該確保你的健康驗證碼這個時間范圍內(nèi)執(zhí)行,允許網(wǎng)絡(luò)延遲從流量管理器往返于您的應(yīng)用程序,然后再返回。
注意: 有關(guān)使用 Windows 流量管理器來監(jiān)視你的應(yīng)用程序的更多信息,請參閱 MSDN 上微軟 Azure Traffic Manager 的。流量管理器在多個數(shù)據(jù)中心部署指南進行了討論。
更多建議: