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查看指标信息

4ebe4e583ee9f88e3cbae152ac10c9b7.png

环境安装

我们通过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项目

36f191b8e3ac5a772c8048fd682a29dc.png

 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

fbdf31c43040ee9aac61b93cf7a81a49.png

Elastic APM核心模块

1.Transaction:我们通过Transaction可以看其中Api的调用信息

70e3fe36dad0e10fcc1649ad48d975fc.png

 2. Dependencies:通过Dependencies看到服务依赖关系

e797815e5f98e7539d7d9f0f7ee8eb63.png

3. Error: 能通过Error看到程序中的错误信息

175ca378be1cffe4322f838df897557f.png

 4. Matrics: 可以通过Matrics看到服务气的内存与CPU信息

d3bbd4facf5fc78f352854197958308a.png

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的相关数据

235fd706c58676cc76aa17fb9b5c1be1.png

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监控

c3f80a32e99d2403d3642274b397f477.png

 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监控

0480eba2f5333e006c6edf2d9e98459f.png

 3.Agent全局拦截

我们可以通过过滤器拦截Transaction与Span,并为其添加例如label等附加内容

Agent.AddFilter((ITransaction t) =>
{//t.SetLabel("foo", "bar");return t;
});
Agent.AddFilter((ISpan span) =>
{// ..return span;
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295158.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java分页的工具类,java分页工具类

PageBean-分页package com.soyea.util;import java.io.Serializable;import java.util.List;/*** 分页工具类*/public class PageBean implements Serializable {private static final long serialVersionUID -8741766802354222579L;private int pageSize5; // 每页显示多少条…

xxx定律-poj-3782

xxx定律 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1639 Accepted Submission(s): 1303 Problem Description 对于一个数n&#xff0c;如果是偶数&#xff0c;就把n砍掉一半&#xff1b;如果是奇数&#x…

asp.net 检测访问者是iphone,android,web(摘录)

aps.net 可以使用WebFormViewEngine来实现。 参考文章&#xff1a;http://www.hanselman.com/blog/MixMobileWebSitesWithASPNETMVCAndTheMobileBrowserDefinitionFile.aspx 源代码 C#代码 public class MobileCapableWebFormViewEngine : WebFormViewEngine { public…

在Android NDK中使用OpenSSL

从 6.0 开始&#xff0c;Google 要求不要使用系统的 OpenSSL&#xff0c;请见&#xff1a;https://developer.android.com...。因此&#xff0c;请不要再使用本文介绍的方法&#xff0c;请自行交叉编译 OpenSSL 或者使用别人编译好的版本。2017年3月注 由于Java较为容易被反编译…

字符串之数字子串求和

题目:给定一个字符串str,求其中全部数字串所代表的数字之和 要求: 1、忽略小数点字符,例如“A1.3”,其中包括2个数字1和3 2、如果是紧贴数字子串的左侧出现字符“-”,当连续出现的数量为奇数时,则数字视为负,连续出现的数量为偶数的则 数字视为正,例如,“A-1…

买的情侣裤衩寄前男友家了,怎么办?

1 那你是要和别人一起去吗&#xff01;▼2 我马上想到我一老师了&#xff01;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 当代父母对孩子的期望变化&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 这个小象打破我的观念&#xff1f;▼5 小个子买…

ctf php sql注入,CTF—攻防练习之HTTP—SQL注入(SSI注入)

主机&#xff1a;192.168.32.152靶机&#xff1a;192.168.32.161ssI是赋予html静态页面的动态效果&#xff0c;通过ssi执行命令&#xff0c;返回对应的结果&#xff0c;若在网站目录中发现了.stm .shtm .shtml等&#xff0c;且对应SSL输入没有过滤该网站可能存在SSI注入漏洞ssi…

OAuth 2.1 带来了哪些变化

OAuth 2.1 是 OAuth 2.0 的下一个版本, OAuth 2.1 根据最佳安全实践(BCP), 目前是第18个版本&#xff0c;对 OAuth 2.0 协议进行整合和精简, 移除不安全的授权流程, 并发布了 OAuth 2.1 规范草案, 下面列出了和 OAuth 2.0 相比的主要区别。⚡ 推荐使用 Authorization Code PKC…

转仁兄:Binary search and its variation

http://fihopzz.blogspot.com/2013/07/enter-post-title-here-binary-search-and.html转载于:https://www.cnblogs.com/kwill/p/3230655.html

生孩子要趁早 3

说到猝死&#xff0c;前两天又有报道说哪个搞IT的年纪轻轻的嗝儿屁了&#xff1b;我想&#xff1a;其实哪个行业都有这么几个倒霉孩子&#xff1b;这也就是搞网络报道的公司的身边的事儿&#xff0c;才被程序员们通过网络转来转去&#xff1b;那些搬砖、运煤的就没有年纪轻轻累…

使用OClint进行iOS项目的静态代码扫描

使用OClint进行iOS项目的静态代码扫描 原文链接&#xff1a;http://blog.yourtion.com/static-code-analysis-ios-using-oclint.html 最近需要一个静态分析代码工具&#xff0c;帮助我们发布运行应用前找到代码潜在的问题。 其实对于iOS开发&#xff0c;我们的日常开发上已经用…

Linux命令常用大全

系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 cat /proc/cpuinfo…

54个站在人类智商巅峰的男人!告诉你2400年的物理学史里都有什么……

全世界只有3.14 % 的人关注了爆炸吧知识一沙见世界 一花窥天堂手心握无限 须臾纳永恒杨振宁曾说读上面的四句诗可以感受到物理的美但物理的美不至于此物理还有一种庄严美一种神秘美一种初窥宇宙奥秘的畏惧美物理就是如此的迷人任何语言在它的面前都很贫瘠数学让人摆脱了愚昧而…

C#实现ByteBuffer类 .

在写网络程序的时候,经常需要往一个数组里面压数据或者取数据,而Java中再Java.nio中有个ByteBuffer能很方便的实现,Delphi中也有个Stream类有着同样的功能,这里我就模仿JAVA用C#做个最基础的ByteBuffer类 下面是代码 usingSystem;namespaceSystem.ByteBuffer...{ /**//// &l…

mysql中如何删除表中int约束,MySQL中的约束,添加约束,删除约束,以及其他修饰

一.NOT NULL(非空约束)添加非空约束1)建表时直接添加CREATE TABLE t_user(user_id INT(10) NOT NULL);2)通过ALTER 语句ALTER TABLE t_user MODIFY user_id INT(10) NOT NULL;ALTER TABLE t_user CHANGE user_id user_id INT(10) NOT NULL;删除非空约束1)ALTER TABLE t_user MO…

asp.net 6中的mini api和mvc api性能对比

在.net6发布时&#xff0c;带来了一个新的模板框架&#xff0c;mini api&#xff0c;那与之前的mvc api性能对比是什么样的呢&#xff1f;建了基于.net 6的两种模板项目&#xff0c;都实现了一个get /test01的api请求&#xff0c;代码如下&#xff1a;mini api:app.MapGet(&quo…

lsass.exe文件丢失,损坏

有一天因为WSUS下发策略的时候更新了某些补丁&#xff0c;导致了系统在登录的时候提示lsass.exe文件丢失&#xff0c;损坏&#xff0c;一时间用了修复工具和恢复使用前都不行&#xff0c;于是好好研究了下。在一台完好使用的同一个系统的PC上复制了system32里面的lsass.exe&…

利用Guava的Suppliers.memoize实现单例

序 本文主要介绍如何利用Guava的Suppliers.memoize实现单例。 实例 /*** 利用Suppliers.memoize实现单例* Created by xixicat on 15/12/25.*/ public class SuppilerSingletonTest {class HeavyObject{public HeavyObject() {System.out.println("being created");}…

Android之水平ProgressBar多彩背景颜色

ProgressBar多彩的背景颜色 不废话,先爆照,如下图。 activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_wi…

冰箱堪比「垃圾桶」?这根棒除味又保鲜,更能 99% 超强杀菌!

{}▲ 点击查看每天的饭菜、生鲜、零食、饮料、干货&#xff0c;总能把我家冰箱塞得满满当当。各种饭菜干货窜味儿&#xff0c;蔬果开始发烂发臭&#xff0c;每天打开冰箱都是一次「开门杀」……用柚子皮和竹炭包除味根本不行&#xff0c;从根源上改善冰箱环境才是硬道理。跟市面…