.NET程序性能監(jiān)控系統(tǒng)Elastic?AMP的使用方法
什么是Elastic AMP
Elastic APM 是一個應(yīng)用程序性能監(jiān)控系統(tǒng)。它可以請求的響應(yīng)時間、數(shù)據(jù)庫查詢、對緩存的調(diào)用、外部 HTTP 請求等的詳細性能信息,可以實時監(jiān)控軟件服務(wù)和應(yīng)用程序。這可以幫助我們快速查明和修復(fù)性能問題。
Elastic APM 還會自動收集未處理的錯誤和異常。因此我們可以在出現(xiàn)新錯誤時識別它們并密切關(guān)注特定錯誤發(fā)生的次數(shù)。
服務(wù)器指標是另一個重要的信息來源。Elastic APM 代理會自動獲取基本的主機級別指標和特定于代理的指標。
Elastic APM 目前支持 Node.js, Python, Ruby, PHP, Java, Go, RUM (JS), 和.NET.
工作原理
- Elastic AMP 通過Agent收集應(yīng)用程序的指標信息
- Agent將收集的信息上傳至AMP Server
- AMP Server對數(shù)據(jù)進行聚合后,存儲至Elasticsearch
- 通過Kibana查看指標信息
環(huán)境安裝
我們通過Docker搭建一個單機的環(huán)境來演示Elastic APM的功能。
1.安裝ElasticSearch
docker network create elastic docker pull docker.elastic.co/elasticsearch/elasticsearch:7.15.2 docker run -d --name es01-test --net elastic -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.15.2
2.安裝Kibana
docker pull docker.elastic.co/kibana/kibana:7.15.2 docker run -d --name kib01-test --net elastic -p 5601:5601 -e "ELASTICSEARCH_HOSTS=http://es01-test:9200" docker.elastic.co/kibana/kibana:7.15.2
3.安裝ElasticAPM
docker run -d -p 8200:8200 --name=apm-server --net elastic --user=apm-server docker.elastic.co/apm/apm-server:7.15.2 --strict.perms=false -e -E output.elasticsearch.hosts=["es01-test:9200"]
代碼演示
Elastic AMP支持.NET Framwork4.6.1+和.NET Core2.1+,支持的組件有:
GRPC,HttpClient,EF6,EFCore,ElasticSearch,Mysql,Mongo,Redis,Kafka,RabbitMQ等,具體詳見https://www.elastic.co/guide/en/apm/agent/dotnet/master/supported-technologies.html。我們這次使用.NET Framwork新建一個Web項目來演示
1.新增Web項目
2.新增Nuget包
<package id="Elastic.Apm" version="1.12.1" targetFramework="net472" /> <package id="Elastic.Apm.AspNetFullFramework" version="1.12.1" targetFramework="net472" /> <package id="Elastic.Apm.SqlClient" version="1.12.1" targetFramework="net472" /> <package id="Elastic.Apm.StackExchange.Redis" version="1.12.1" targetFramework="net472" /> <package id="StackExchange.Redis" version="2.2.88" targetFramework="net472" />
3.配置HttpModule
web.config中的system.webServer中新增以下節(jié)點
<modules> <add name="ElasticApmModule" type="Elastic.Apm.AspNetFullFramework.ElasticApmModule, Elastic.Apm.AspNetFullFramework" /> </modules>
4.配置Agent
我們可以通過環(huán)境變量配置Agent的信息
protected void Application_Start() { Environment.SetEnvironmentVariable("ELASTIC_APM_SERVICE_NAME", "TestFromworkSite"); //服務(wù)名 Environment.SetEnvironmentVariable("ELASTIC_APM_ENVIRONMENT", "Dev"); //環(huán)境 Environment.SetEnvironmentVariable("ELASTIC_APM_SERVER_URL", "http://localhost:8200"); // APM server Environment.SetEnvironmentVariable("ELASTIC_APM_FLUSH_INTERVAL", "5s"); //上傳數(shù)據(jù)的周期 Environment.SetEnvironmentVariable("ELASTIC_APM_LOG_LEVEL", "Trace"); //.......... }
5.啟動網(wǎng)站
直接啟動網(wǎng)站即可在Kibana中看到對應(yīng)的Service:TestFromworkSite
Elastic APM核心模塊
1.Transaction:我們通過Transaction可以看其中Api的調(diào)用信息
2. Dependencies:通過Dependencies看到服務(wù)依賴關(guān)系
3. Error: 能通過Error看到程序中的錯誤信息
4. Matrics: 可以通過Matrics看到服務(wù)氣的內(nèi)存與CPU信息
Elastic監(jiān)控MSSql與Redis等組件
新增MSSqlHelper
public class MSSqlHelper { public static DataSet SqlExecuteReader(string _sql, SqlParameter[] _parameters, CommandType _type = CommandType.Text, string _constring = @"Data Source=.\SQLEXPRESS;Initial Catalog=dev;Integrated Security=True;") { DataSet ds = new DataSet(); try { using (SqlConnection conn = new SqlConnection(_constring)) { SqlCommand cmd = new SqlCommand(_sql, conn); if (_parameters != null) { foreach (SqlParameter p in _parameters) { cmd.Parameters.Add(p); } } cmd.CommandType = _type; cmd.CommandTimeout = 10;//超時時間,單位S conn.Open(); using (SqlDataAdapter sda = new SqlDataAdapter()) { sda.SelectCommand = cmd; sda.Fill(ds);//填充dataset } } return ds; } catch (Exception ex) { throw; } } }
新增RedisHelper
public class RedisHelper { private static IDatabase database; public static void UseApmForRedis() { var connection = ConnectionMultiplexer.Connect("127.0.0.1:6379"); connection.UseElasticApm(); database = connection.GetDatabase(); } public static void StringSet(string key,string value) { database.StringSet(key,value); } }
在Application_Start()中開啟SqlServer與Redis的監(jiān)控
Agent.Subscribe(new SqlClientDiagnosticSubscriber()); RedisHelper.UseApmForRedis();
HomeController.Index接口中新增sqlserver與Redis的調(diào)用
public ActionResult Index() { MSSqlHelper.SqlExecuteReader("select * from S_dev.UserObject", null); RedisHelper.StringSet("a", "a"); }
啟動程序即可看到MSSql與Redis的相關(guān)數(shù)據(jù)
Elastic APM Api的深入使用
1.StartTransaction與StartSpan開啟自定義transaction與span
一些定時任務(wù)同樣可以使用Elastic APM的Agent.Tracer.StartTransaction和來監(jiān)控,并且我們可以通過StartSpan來新增一個自定義節(jié)點,這種方式需要我們自己處理異常信息。我們新增一個Job
public class TestJob { public void Run() { while (true) { var trans = Agent.Tracer.StartTransaction("TestJob", ApiConstants.TypeRequest); try { MSSqlHelper.SqlExecuteReader("select * from S_dev.UserObject", null); RedisHelper.StringSet("a", "a"); trans.SetLabel("name", "chester"); var span = trans.StartSpan("自定義Span", ApiConstants.TypeExternal, ApiConstants.SubtypeHttp, ApiConstants.ActionQuery); try { //Http request } catch (Exception e) { span.CaptureException(e); } finally { span.End(); } Thread.Sleep(1000); } catch (Exception ex) { trans.CaptureException(ex); throw; } finally { trans.End(); } } } }
Application_start中啟動Testjob
Task.Run(() => new TestJob().Run());
啟動程序即可看到對應(yīng)的TestJob監(jiān)控
2.CaptureTransaction與CaptureSpan開啟自定義transaction與span
CaptureTransaction與CaptureSpan相對于StartTransaction與StartSpan可以幫助我們結(jié)束Transaction與Span,也可以自動捕獲異常,新增一個TestJob2
public class TestJob2 { public void Run() { while (true) { Agent.Tracer.CaptureTransaction("TestJob2", ApiConstants.TypeRequest, (trans) => { MSSqlHelper.SqlExecuteReader("select * from S_dev.UserObject", null); RedisHelper.StringSet("a", "a"); trans.SetLabel("name", "chester"); trans.CaptureSpan("自定義Span2", ApiConstants.TypeDb, (s) => { //execute db query }, ApiConstants.SubtypeMssql, ApiConstants.ActionQuery); Thread.Sleep(1000); }); } } }
Application_start中啟動Testjob2
Task.Run(() => new TestJob2().Run());
啟動程序即可看到對應(yīng)的TestJob2監(jiān)控
3.Agent全局攔截
我們可以通過過濾器攔截Transaction與Span,并為其添加例如label等附加內(nèi)容
Agent.AddFilter((ITransaction t) => { //t.SetLabel("foo", "bar"); return t; }); Agent.AddFilter((ISpan span) => { // .. return span; });
到此這篇介紹.NET程序性能監(jiān)控系統(tǒng)Elastic AMP使用方法的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
獲取asp.net服務(wù)器控件的客戶端ID和Name的實現(xiàn)方法
下面小編就為大家?guī)硪黄@取asp.net服務(wù)器控件的客戶端ID和Name的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-05-05完美解決在ModalPopupExtender中使用CalendarExtender時被層遮擋的問題
ASP.NET AJAX Control Toolkit是一組非常不錯的基于asp.net的ajax控件,它建立在asp.net 3.0的ScriptManager組件之上,提供了很多非常實用的效果和功能。2009-11-11asp.net core應(yīng)用docke部署到centos7的全過程
這篇文章主要給大家介紹了關(guān)于asp.net core應(yīng)用docke部署到centos7的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08.net indexOf(String.indexOf 方法)
字符串的IndexOf()方法搜索在該字符串上是否出現(xiàn)了作為參數(shù)傳遞的字符串,如果找到字符串,則返回字符的起始位置 (0表示第一個字符,1表示第二個字符依此類推)如果說沒有找到則返回 -12012-10-10一個Asp.Net的顯示分頁方法 附加實體轉(zhuǎn)換和存儲過程 帶源碼下載
現(xiàn)在自己寫的webform都不用服務(wù)器控件了,所以自己仿照aspnetpager寫了一個精簡實用的返回分頁顯示的html方法,其他話不說了,直接上代碼2012-10-10