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.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中新增以下节点
<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 server
Environment.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;//超时时间,单位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的监控
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程序性能的更多相关文章
- javaMelody监控javaWeb程序性能
JavaMelody应用监控使用指南 原文:<JavaMelody应用监控使用指南> 前言 本文参考JavaMelody的UserGuide编写,部分文字均来自文档,添加有个人理解.并进行 ...
- 使用Metrics监控应用程序的性能
在编写应用程序的时候,通常会记录日志以便事后分析,在很多情况下是产生了问题之后,再去查看日志,是一种事后的静态分析.在很多时候,我们可能需要了解整个系统在当前,或者某一时刻运行的情况,比如当前系统中对 ...
- timeSeries db之:使用Metrics监控应用程序的性能 (zz)
在编写应用程序的时候,通常会记录日志以便事后分析,在很多情况下是产生了问题之后,再去查看日志,是一种事后的静态分析.在很多时候,我们可能需要了解整个系统在当前,或者某一时刻运行的情况,比如当前系统中对 ...
- Metrics.NET step by step使用Metrics监控应用程序的性能
使用Metrics监控应用程序的性能 在编写应用程序的时候,通常会记录日志以便事后分析,在很多情况下是产生了问题之后,再去查看日志,是一种事后的静态分析.在很多时候,我们可能需要了解整个系统在当前,或 ...
- JVM-Java程序性能监控-初级篇
前篇 - 小伙们都知道,java程序的性能监控主要是针对jvm中heap的监控~ 那么在做压力测试时如何对heap.线程等一系列的指标进行的监控的呢? 首先-你若不懂命令,那么就需要了解一套Java程 ...
- [原创小工具]软件内存、CPU使用率监视,应用程序性能监测器 v3.0 绿色版
应用程序性能监测器 V3.0 更新内容: 1.对一些代码进行了修改,软件本身的性能有所提升. 应用程序性能监测器 V2.0 更新内容: 1.鼠标移动到曲线区域,显示相关的曲线值 ...
- Java程序性能优化——让你的java程序更快、更稳定
1.Java性能调优概述 1.1.Web服务器,响应时间.吞吐量是两个重要的性能参数. 1.2.程序性能的几个表现: 执行速度:程序的反映是否迅速,响应时间是否足够短 内存分配:分配是否合理,是否过多 ...
- 在 NetBeans IDE 6.0 中分析 Java 应用程序性能
NetBeans IDE 6.0 包含一个强大的性能分析工具,可提供与应用程序运行时行为有关的重要信息.通过 NetBeans 性能分析工具,我们可以方便地在 IDE 中监控应用程序的线程状态.CPU ...
- zabbix如何监控WEB应用性能
HTTP服务目前最流行的互联网应用之一,如何监控服务的健康状态对系统运维来说至关重要. Zabbix本身提供了对WEB应用程序的监控,比如监控WEB程序的Download Speed,Respon ...
随机推荐
- 2020.3.28-ICPC训练联盟周赛,选用试题:UCF Local Programming Contest 2016
A.Majestic 10 签到题. #include<iostream> #include<cstdio> #include<cstring> #include& ...
- NXOpen.CAM.CAMSetup.CopyObjects的使用
复制CAM对象 Public Function CopyObjects(ByVal view As NXOpen.CAM.CAMSetup.View, ByVal objectsToBeMoved() ...
- 【HMS Core 6.0全球上线】华为钥匙环服务,打造跨应用跨形态无缝登录体验
华为钥匙环服务(Keyring),是HMS Core在安全领域开放的全新服务,为全球开发者提供用户认证凭据(以下简称"凭据")本地存储和跨应用.跨形态共享能力,帮助您在安卓应用.快 ...
- 对比7种分布式事务方案,还是偏爱阿里开源的Seata,真香!(原理+实战)
前言 这是<Spring Cloud 进阶>专栏的第六篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得了? 阿里面 ...
- Java中的函数式编程(七)流Stream的Map-Reduce操作
写在前面 Stream 的 Map-Reduce 操作是Java 函数式编程的精华所在,同时也是最为复杂的部分.但一旦你啃下了这块硬骨头,那你就真正熟悉Java的函数式编程了. 如果你有大数据的编程经 ...
- 欧姆龙PLC HostLink协议整理
欧姆龙PLC HostLink协议整理 1.常用的存储器功能区 CIO: 输入继电器 272 点(17 CH) 0.00-16.15 输出继电器 272 点(17 CH) 100.00-116.1 ...
- 回应:Alpha深度评测
零.说明 本篇博客是针对博客沉舟侧畔千帆过,病树前头万木春--对[题士]产品的深度测评与解析的回应,用以说明『题士』开发团队的观点.改进计划等 感谢HansBug.CookieLau助教及各位老师.测 ...
- 2020BUAA软工个人博客作业
2020BUAA软工个人博客作业 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 我在这个课程的目标是 学 ...
- 热身训练2 GCD
题目描述 简要题意: n个数字,a1,a2,...,an m次询问(l,r),每次询问需回答 1.gcd(al,al+1,al+2,...,ar);2.gcd(ax,ax+1,ax+2,...,ay ...
- 关于麦克风的参数介绍 - 驻极体麦克风(ECM)和硅麦(MEMS)
1.麦克风的分类1.1.动圈式麦克风(Dynamic Micphone)原理:基本构造包含线圈.振膜.永久磁铁三部分.当声波进入麦克风,振膜受到声波的压力而产生振动,与振膜在一起的线圈则开始在磁场中移 ...