Elastic AMP监控.NET程序性能
什么是Elastic AMP
Elastic APM 是一個應用程序性能監控系統。它可以請求的響應時間、數據庫查詢、對緩存的調用、外部 HTTP 請求等的詳細性能信息,可以實時監控軟件服務和應用程序。這可以幫助我們快速查明和修復性能問題。
Elastic APM 還會自動收集未處理的錯誤和異常。因此我們可以在出現新錯誤時識別它們并密切關注特定錯誤發生的次數。
服務器指標是另一個重要的信息來源。Elastic APM 代理會自動獲取基本的主機級別指標和特定于代理的指標。
Elastic APM 目前支持 Node.js, Python, Ruby, PHP, Java, Go, RUM (JS), 和.NET.
工作原理
Elastic AMP 通過Agent收集應用程序的指標信息
Agent將收集的信息上傳至AMP Server
AMP Server對數據進行聚合后,存儲至Elasticsearch
通過Kibana查看指標信息
環境安裝
我們通過Docker搭建一個單機的環境來演示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.22.安裝Kibanadocker 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.23.安裝ElasticAPM
代碼演示
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中新增以下節點
<modules><add name="ElasticApmModule" type="Elastic.Apm.AspNetFullFramework.ElasticApmModule, Elastic.Apm.AspNetFullFramework" /> </modules>4.配置Agent
我們可以通過環境變量配置Agent的信息
protected void Application_Start() {Environment.SetEnvironmentVariable("ELASTIC_APM_SERVICE_NAME", "TestFromworkSite"); //服務名Environment.SetEnvironmentVariable("ELASTIC_APM_ENVIRONMENT", "Dev"); //環境Environment.SetEnvironmentVariable("ELASTIC_APM_SERVER_URL", "http://localhost:8200"); // APM serverEnvironment.SetEnvironmentVariable("ELASTIC_APM_FLUSH_INTERVAL", "5s"); //上傳數據的周期Environment.SetEnvironmentVariable("ELASTIC_APM_LOG_LEVEL", "Trace");//.......... }5.啟動網站
直接啟動網站即可在Kibana中看到對應的Service:TestFromworkSite
Elastic APM核心模塊
1.Transaction:我們通過Transaction可以看其中Api的調用信息
?2. Dependencies:通過Dependencies看到服務依賴關系
3. Error: 能通過Error看到程序中的錯誤信息
?4. Matrics: 可以通過Matrics看到服務氣的內存與CPU信息
Elastic監控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;//超時時間,單位Sconn.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的監控
Agent.Subscribe(new SqlClientDiagnosticSubscriber()); RedisHelper.UseApmForRedis();HomeController.Index接口中新增sqlserver與Redis的調用
public ActionResult Index() {MSSqlHelper.SqlExecuteReader("select * from S_dev.UserObject", null);RedisHelper.StringSet("a", "a"); }啟動程序即可看到MSSql與Redis的相關數據
Elastic APM Api的深入使用
1.StartTransaction與StartSpan開啟自定義transaction與span
一些定時任務同樣可以使用Elastic APM的Agent.Tracer.StartTransaction和來監控,并且我們可以通過StartSpan來新增一個自定義節點,這種方式需要我們自己處理異常信息。我們新增一個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());啟動程序即可看到對應的TestJob監控
?2.CaptureTransaction與CaptureSpan開啟自定義transaction與span
CaptureTransaction與CaptureSpan相對于StartTransaction與StartSpan可以幫助我們結束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());啟動程序即可看到對應的TestJob2監控
?3.Agent全局攔截
我們可以通過過濾器攔截Transaction與Span,并為其添加例如label等附加內容
Agent.AddFilter((ITransaction t) => {//t.SetLabel("foo", "bar");return t; }); Agent.AddFilter((ISpan span) => {// ..return span; });總結
以上是生活随笔為你收集整理的Elastic AMP监控.NET程序性能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单元测试 | 如何在Mock时匹配匿名类
- 下一篇: OAuth 2.1 带来了哪些变化