.NET程序性能監(jiān)控系統(tǒng)Elastic?AMP的使用方法
什么是Elastic AMP
Elastic APM 是一個(gè)應(yīng)用程序性能監(jiān)控系統(tǒng)。它可以請(qǐng)求的響應(yīng)時(shí)間、數(shù)據(jù)庫查詢、對(duì)緩存的調(diào)用、外部 HTTP 請(qǐng)求等的詳細(xì)性能信息,可以實(shí)時(shí)監(jiān)控軟件服務(wù)和應(yīng)用程序。這可以幫助我們快速查明和修復(fù)性能問題。
Elastic APM 還會(huì)自動(dòng)收集未處理的錯(cuò)誤和異常。因此我們可以在出現(xiàn)新錯(cuò)誤時(shí)識(shí)別它們并密切關(guān)注特定錯(cuò)誤發(fā)生的次數(shù)。
服務(wù)器指標(biāo)是另一個(gè)重要的信息來源。Elastic APM 代理會(huì)自動(dòng)獲取基本的主機(jī)級(jí)別指標(biāo)和特定于代理的指標(biāo)。
Elastic APM 目前支持 Node.js, Python, Ruby, PHP, Java, Go, RUM (JS), 和.NET.
工作原理
- Elastic AMP 通過Agent收集應(yīng)用程序的指標(biāo)信息
- Agent將收集的信息上傳至AMP Server
- AMP Server對(duì)數(shù)據(jù)進(jìn)行聚合后,存儲(chǔ)至Elasticsearch
- 通過Kibana查看指標(biāo)信息

環(huán)境安裝
我們通過Docker搭建一個(gè)單機(jī)的環(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新建一個(gè)Web項(xiàng)目來演示
1.新增Web項(xiàng)目

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é)點(diǎn)
<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.啟動(dòng)網(wǎng)站
直接啟動(dòng)網(wǎng)站即可在Kibana中看到對(duì)應(yīng)的Service:TestFromworkSite

Elastic APM核心模塊
1.Transaction:我們通過Transaction可以看其中Api的調(diào)用信息

2. Dependencies:通過Dependencies看到服務(wù)依賴關(guān)系

3. Error: 能通過Error看到程序中的錯(cuò)誤信息

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;//超時(shí)時(shí)間,單位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");
}
啟動(dòng)程序即可看到MSSql與Redis的相關(guān)數(shù)據(jù)

Elastic APM Api的深入使用
1.StartTransaction與StartSpan開啟自定義transaction與span
一些定時(shí)任務(wù)同樣可以使用Elastic APM的Agent.Tracer.StartTransaction和來監(jiān)控,并且我們可以通過StartSpan來新增一個(gè)自定義節(jié)點(diǎn),這種方式需要我們自己處理異常信息。我們新增一個(gè)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中啟動(dòng)Testjob
Task.Run(() => new TestJob().Run());
啟動(dòng)程序即可看到對(duì)應(yīng)的TestJob監(jiān)控

2.CaptureTransaction與CaptureSpan開啟自定義transaction與span
CaptureTransaction與CaptureSpan相對(duì)于StartTransaction與StartSpan可以幫助我們結(jié)束Transaction與Span,也可以自動(dòng)捕獲異常,新增一個(gè)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中啟動(dòng)Testjob2
Task.Run(() => new TestJob2().Run());
啟動(dòng)程序即可看到對(duì)應(yīng)的TestJob2監(jiān)控

3.Agent全局?jǐn)r截
我們可以通過過濾器攔截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使用方法的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
用Html5與Asp.net MVC上傳多個(gè)文件的實(shí)現(xiàn)代碼
Html 5 的有一些File API,對(duì)Form表單增強(qiáng)的特性,讓我們輕松支持多文件上傳,看下面的Html片斷代碼2012-08-08
asp.net 身份驗(yàn)證機(jī)制實(shí)例代碼
對(duì)于ASP.NET驗(yàn)證機(jī)制在項(xiàng)目開發(fā)中運(yùn)用,會(huì)使項(xiàng)目非常方便快捷的實(shí)現(xiàn)頁面的訪問權(quán)限問題,而且省去了一些沒必要的安全問題2012-06-06
Asp.net把圖片存入數(shù)據(jù)庫和讀取圖片的方法
網(wǎng)上關(guān)于ASP.NET上傳圖片到數(shù)據(jù)庫的資料非常多,常用的如下:存儲(chǔ)圖片類型數(shù)據(jù)有以下幾種方式2013-07-07
asp.net5中用戶認(rèn)證與授權(quán)(2)
ASP.NET5主要提供了兩種應(yīng)用程序,其一就是ASP.NET5控制臺(tái)程序,另外一個(gè)是ASP.NET Web 應(yīng)用程序。本文給大家介紹asp.net5中用戶認(rèn)證與授權(quán)(2),需要的童鞋可以參考下2015-10-10
基于ASP.NET+easyUI框架實(shí)現(xiàn)圖片上傳功能(表單)
這篇文章主要介紹了基于ASP.NET+easyUI框架實(shí)現(xiàn)圖片上傳功能的相關(guān)資料,需要的朋友可以參考下2016-06-06
使用母版頁時(shí)內(nèi)容頁如何使用css和javascript
由于網(wǎng)站的主要頻道頁和列表頁的頭部和底部都是一樣的,如果將每個(gè)頁面放在單獨(dú)的頁面中,當(dāng)頭部和底部需要更改時(shí)維護(hù)量太大。于是想把頭部和底部做成母版頁,頻道頁和列表頁的具體內(nèi)容放到內(nèi)容頁中。這樣當(dāng)頭和底需要改動(dòng)時(shí),只要修改一下母版頁就可以了。2009-08-08
關(guān)于Asp.net頁面Page_Load被執(zhí)行兩次的問題分享
這篇文章介紹了關(guān)于Asp.net頁面Page_Load被執(zhí)行兩次的問題,有需要的朋友可以參考一下2013-09-09
VB.NET驗(yàn)證郵件地址的合法性實(shí)現(xiàn)代碼
現(xiàn)在,對(duì)于用戶在Web頁面上或電話中給出的Email地址,我們?cè)絹碓讲桓铱隙ㄋ欠裾娴挠行АT诮裉爝@個(gè)垃圾郵件泛濫成災(zāi)的年代,人們完全有理由舍不得輕易透露Email地址。2011-04-04

