西安監控安裝_天津監控安裝_廣州監控安裝
西安監控安裝_天津監控安裝_廣州監控安裝
在應用程序的實際操作和維護過程中,我們需要更多日志和監視,以使我們能夠全面了解應用程序的運行狀態。但是,對于大多數開發人員而言,通常要注意的是如何以更高的成本實現業務,或者如何使應用程序的響應速度更快,以及其他與編碼相關的技術。對于應用程序監視,它可能仍然停留在日志文件的級別,并且在嘗試通過日志查找問題之前,大多數是在車禍中發現的。
本文打算引入的Elastic APM是一組用于監視應用程序的指標,例如系統響應時間,異常,EF執行的SQL記錄等,并且可以將這些記錄組織到一個可跟蹤的鏈接中,方便查詢問題。此外,Elastic APM還可以使用Kibana進行特別漂亮的視覺顯示,這對于我們查找和發現問題很方便。
別胡說八道,開始戰斗吧?
彈性APM簡介
彈性APM由以下四個組成部分組成西安監控安裝,如下所示:
APM代理
APM代理是.NET Core程序中安裝的Nuget程序包。它收集各種數據(例如性能和錯誤),并將收集的數據批量緩存到APM Server。當然,除了.NET Core使用的Nuget程序包之外,它還可以支持許多其他語言,例如Java,Node.Js,Python等。
請參閱此處以獲取受支持的語言列表:
APM服務器
APM Server是部署在服務器上的應用程序,用于接收代理發送的數據包,并基于此數據包手動創建文檔,然后將數據轉儲到Elastic Server。
彈性搜索
我相信您對此太熟悉了。它是基于Lucene的高性能,分布式全文搜索引擎西安監控安裝,可快速,實時地存儲,搜索和分析大量數據。在這里,他提供了數據存儲和搜索功能!
基巴納語
如果您熟悉Elastic Search,那么您將在某種程度上了解Kibana。 Kibana是一個開源分析和可視化平臺。它可以與Elastic Search很好地配合使用,以幫助您快速可視化存儲在Elastic Search中的數據。并制作各種精美的報告,圖形等。
環境規劃
在此實際戰斗過程中,我們需要滿足以下條件:
彈性搜索的安裝:
安裝Kibana:
我的環境是Centos 7,因此我根據此官方網站教程進行了安裝,整個過程非常簡單:
server.host: 0.0.0.0 server.name: 主機IP server.port: 一個你喜歡的端口號 elasticsearch.hosts: ["已安裝好的ES地址,多個之間用逗號隔開"] logging.dest: /var/log/kibana.log //需要提前把這個文件創建好,然后把權限給夠
sudo /bin/systemctl daemon-reload sudo /bin/systemctl enable kibana.service sudo systemctl start kibana.service
在這里您必須注意Elastic Search的版本,并且Kibana必須匹配,否則將報告錯誤。 (我的ES是在一段時間前安裝的,因此會出現此問題。如果一次性安裝所有ES,應該不會有問題)
如果不幸遇到問題,可以通過配置文件中logging.dest中配置的路徑查看日志。
安裝APM服務器
APM Server的安裝類似于Kibana的安裝,過程如下:
output.elasticsearch: hosts: ["已安裝好的ES地址,多個之間用逗號隔開"]
sudo /bin/systemctl daemon-reload sudo /bin/systemctl enable apm-server.service sudo systemctl start apm-server.service
執行上述操作后,嘗試在瀏覽器中打開服務器Ip:8200,最后,如果安裝了APM服務器而沒有問題,瀏覽器將復制類似于以下內容:
{ "build_date": "2019-06-20T14:39:23Z", "build_sha": "9a099b63c53eac8c55707df96193143ec66337e9", "version": "7.2.0" }
這時,我們在瀏覽器中打開Kibana,然后單擊“添加APM”
然后向下滾動到新打開的頁面,然后單擊“檢查APM服務器狀態”按鈕。如果您已經正確設置了APM服務器,則表明安裝完成?
到目前為止,我們的安裝工作已經完成。接下來,讓我們嘗試將.NET Core與Elastic APM集成在一起,讓我們一起繼續?
.NET Core應用程序集成
我們創建了一個演示項目來測試APM的各種功能。
請參考GitHub獲取該項目的地址:
依賴引用的軟件包
我們需要引用Nuget的相關SDK以與我們的應用程序集成。實際上,我們引用了開始時提到的APM代理部分。在Nuget中,我們引用了軟件包Elastic.Apm.NetCoreAll。
盡管依賴此程序包等同于手動依賴以下三個程序包,但是根據需要,您也可以僅依賴其中的一些程序包。
在這里,為了簡單起見,我們將直接打印軟件包Elastic.Apm.NetCoreAll
將代理添加到.NET Core
找到.NET Core的啟動文件,并在上述Configure方法中添加以下代碼:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseAllElasticApm(Configuration); }
然后在application.json中添加以下內容:
{ "ElasticApm": { "LogLevel": "Error", // Log級別,根據自己的需要來定"ServerUrls": "http://localhost:8200", //設置前面安裝好的APM Server URL,默認端口號是8200 "ServiceName" : "MyApp", //應用的名字,跟著實際情況起就行,allowed characters: a-z, A-Z, 0-9, -, _, and space. Default is the entry assembly of the application } }
這時,我們啟動項目,刷新幾次,然后返回到Kibana,在頁面上向下滾動,選擇.NET,然后單擊“檢查代理狀態”按鈕。如果一切順利,它將顯示““從一個或多個代理成功接收到的數據””,如果不幸的是沒有顯示此句子,則可以通過VS的診斷工具中的“事件”對其進行跟蹤,以查看是否沒有配置權限。
查看監控數據
在Kibana的“添加APM”頁面的底部,找到“加載Kibana對象”以創建索引西安監控安裝,然后單擊“ APM儀表板”按鈕進入APM數據查看頁面。
單擊“ APM儀表板”按鈕后,顯示的頁面如下:
此頁面上的功能分為兩個主要功能模塊,服務和跟蹤。首先,讓我們簡要了解這兩個標簽頁中的相應功能。
服務
盡管下面列表中顯示的XianDotnetCommunity是您在配置文件中配置的ServiceName,但是單擊此名稱以輸入,您將看到以下報告,該報告具有三個選項卡頁:“事務”,“錯誤”和“度量”。
其中
事務:顯示當前應用程序請求的概述,包括請求響應時間,請求調用數等。
錯誤:程序中的異常列表
指標:應用程序所在計算機的CPU /內存使用情況
PS:實際上,我覺得我確實需要當前應用程序占用的視頻內存和CPU值,但是實際上,.NET Core版本的代理程序未實現此功能,請耐心等待更新
蹤跡
有一個用于鏈接跟蹤的視圖。主頁包含所有交易的名稱列表和響應時間等。
單擊特定交易進入,您可以查看交易通過的鏈接列表以及一些更詳細的響應信息,這些信息可以幫助您分析整個鏈接的困境。我們將在下面討論更多細節。
探索更多
彈性APM還具有許多其他功能,例如鏈接跟蹤,數據庫調用執行,讓我們一起探索?
Monitor API調用鏈接跟蹤
如果您了解微服務架構,那么您必須了解鏈接跟蹤的概念。那么哪些是鏈接跟蹤?給一個栗子:
有一個服務A,它將依賴于服務B和C,服務B將依賴于服務D和E,服務C將依賴于F和G(省去了無數依賴),然后持續三天,服務A似乎很慢,那么如何找到速度較慢的服務呢?至此西安監控安裝_天津監控安裝_廣州監控安裝,鏈接終于派上用場了!
讓我們簡單地模擬這些嵌套調用:
在一個WebAPI項目Demo1中,有一個帶API A的ConsumerController,它在另一個WEB API項目Demo2中調用套接字B / C / D / E。代碼大致如下:
項目B:
[Route("api/consumer")] [ApiController] public class ConsumerController : ControllerBase { private readonly IHttpClientFactory _httpClientFactory; public ConsumerController(IHttpClientFactory httpClientFactory) { //使用HttpClientFactory時需要先在StartUp中調用services.AddHttpClient(); _httpClientFactory = httpClientFactory; } private const string baseUri = "http://localhost:54597"; [HttpGet("a")] public async TaskA() { //HttpClient client = new HttpClient(); var client = _httpClientFactory.CreateClient(); Thread.Sleep(new Random().Next(1, 1500)); var b = await client.GetStringAsync($"{baseUri}/api/data-source/b"); var c = await client.GetStringAsync($"{baseUri}/api/data-source/c"); var d = await client.GetStringAsync($"{baseUri}/api/data-source/d"); var e = await client.GetStringAsync($"{baseUri}/api/data-source/e"); return $"b={b} & c={c} & d={d} & e={e}"; } }
項目A:
[Route("api/data-source")] [ApiController] public class DataSourceController : ControllerBase { [HttpGet("b")] public async TaskB() { Thread.Sleep(new Random().Next(1, 1500)); return "B"; } [HttpGet("c")] public async Task C() { Thread.Sleep(new Random().Next(1, 1500)); return "C"; } [HttpGet("d")] public async Task D() { Thread.Sleep(new Random().Next(1, 1500)); return "D"; } [HttpGet("e")] public async Task E() { Thread.Sleep(new Random().Next(1, 1500)); return "E"; } }
這時,我們在Demo1中請求API A(xxx / api / consumer / a),然后在Kibana的APM中打開Traces,并找到記錄“ GET Consumer / A”(似乎默認值是,然后單擊以查看詳細信息。
在詳細信息的底部,找到時間線,我們可以看到下圖所示的圖形:
我們可以看到請求API A所花費的時間花在了調用4個API上,并且還看到了調用第三個API所花費的時間更長。單擊紅色條以查看請求的詳細信息。
這里不好的是,默認顯示的名稱是GET localhost。實際上,我們希望將其顯示為api uri,對嗎?我向他們提到了一個公關,每個人都可以關注它:
監控EF執行記錄
這不需要過多解釋。它用于監視EF何時執行數據庫操作,以檢測性能和其他問題。我的代碼大致如下:
[HttpGet("person")] public void TestEfCore() { using (var db = new ApmDbContext()) { var jax = new Person { Name = "西安.NET社區", Age = 26, Remark = "做最好的技術社區~" }; db.Persons.Add(jax); db.SaveChanges(); db.Persons.FirstOrDefault(x => x.Id == jax.Id ); db.Persons.FirstOrDefault(x => x.Name == "西安.NET社區"); jax.Name = ".NET西安社區"; db.SaveChanges(); db.Persons.Remove(jax); db.SaveChanges(); } }
當我們使用Kibana查看此請求時,時間線顯示如下:
我們可以清楚直觀地看到在此請求中執行了哪些SQL語句以及每個語句持續了多長時間,這對于我們的請求分析非常有用。單擊特定的綠色條以查看更多詳細的數據,但是不幸的是,數據中未記錄SQL Params,這對于我們完全重現此請求而言還不夠友好?
自己購買要點
相對而言,當前的彈性APM生態系統還不夠好,組件的支持比空中行走稍差。如果要使用Elastic APM,將不可避免地自己或為第三方做一些性能數據的埋入記錄。當組件和類庫提供支持時,還必須完成一些數據埋入點。接下來,我們將保留一些其他信息,我們希望將其記錄在請求中。示例代碼如下:
[HttpGet] public void RecordMyApmData() { var transaction = Agent.Tracer.CurrentTransaction; var span1 = transaction.StartSpan("Stage 1", "Customize"); Thread.Sleep(300); span1.End(); Thread.Sleep(200); var span2 = transaction.StartSpan("Stage 2", "Customize"); Thread.Sleep(100); span2.End(); Thread.Sleep(100); var span3 = transaction.StartSpan("Stage 3", "Customize"); Thread.Sleep(500); span3.End(); }
最終記錄的功效如下:
該演示實際上非常簡單,但是我相信您已經知道如何使用Elastic Apm Agent類來自定義您需要捕獲的一些監視數據?
異常監視
當我們的程序中發生異常時,Elastic APM可以幫助您記錄它。此功能與日志類似,但可能會略勝于日志。讓我們一起看看吧!
示例代碼如下:
[HttpGet] public void TestException() { try { throw new Exception("捕獲的異常"); } catch (Exception) { } throw new Exception("未捕獲的異常"); }
執行代碼后,我們可以單擊“服務名稱”,然后在“錯誤”選項卡頁面中查看異常
單擊詳細信息,我們可以查看詳細的堆棧調用信息:
此外,我們可以在“事務”選項卡中找到對異常的請求,然后單擊以查看詳細信息。在細節中,我們還可以看到異常的發生:
摘要
本文介紹了如何使用Elastic APM來收集.NET Core應用程序中的性能和異常數據,以及如何使用Kibana進行可視化分析。總體而言,Elastic APM仍然非常強大,可用于性能監視,鏈接跟蹤和異常監視。
目前,Elastic APM支持的組件仍然相對有限。例如,它僅支持EF Core進行數據庫查詢,不支持更多組件。鏈接跟蹤也僅支持HTTP請求跟蹤,而無需支持其他請求。形式。此外,我個人覺得Elastic APM將監視報告(Watcher)放在X-Pack費用包中感到非常難過。盡管異常監視報告仍然非常重要。
歡迎嘗試Elastic APM,并一起說明問題?
評論