什么是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程序性能的更多相关文章

  1. javaMelody监控javaWeb程序性能

    JavaMelody应用监控使用指南 原文:<JavaMelody应用监控使用指南> 前言 本文参考JavaMelody的UserGuide编写,部分文字均来自文档,添加有个人理解.并进行 ...

  2. 使用Metrics监控应用程序的性能

    在编写应用程序的时候,通常会记录日志以便事后分析,在很多情况下是产生了问题之后,再去查看日志,是一种事后的静态分析.在很多时候,我们可能需要了解整个系统在当前,或者某一时刻运行的情况,比如当前系统中对 ...

  3. timeSeries db之:使用Metrics监控应用程序的性能 (zz)

    在编写应用程序的时候,通常会记录日志以便事后分析,在很多情况下是产生了问题之后,再去查看日志,是一种事后的静态分析.在很多时候,我们可能需要了解整个系统在当前,或者某一时刻运行的情况,比如当前系统中对 ...

  4. Metrics.NET step by step使用Metrics监控应用程序的性能

    使用Metrics监控应用程序的性能 在编写应用程序的时候,通常会记录日志以便事后分析,在很多情况下是产生了问题之后,再去查看日志,是一种事后的静态分析.在很多时候,我们可能需要了解整个系统在当前,或 ...

  5. JVM-Java程序性能监控-初级篇

    前篇 - 小伙们都知道,java程序的性能监控主要是针对jvm中heap的监控~ 那么在做压力测试时如何对heap.线程等一系列的指标进行的监控的呢? 首先-你若不懂命令,那么就需要了解一套Java程 ...

  6. [原创小工具]软件内存、CPU使用率监视,应用程序性能监测器 v3.0 绿色版

    应用程序性能监测器 V3.0 更新内容:    1.对一些代码进行了修改,软件本身的性能有所提升. 应用程序性能监测器 V2.0 更新内容:     1.鼠标移动到曲线区域,显示相关的曲线值      ...

  7. Java程序性能优化——让你的java程序更快、更稳定

    1.Java性能调优概述 1.1.Web服务器,响应时间.吞吐量是两个重要的性能参数. 1.2.程序性能的几个表现: 执行速度:程序的反映是否迅速,响应时间是否足够短 内存分配:分配是否合理,是否过多 ...

  8. 在 NetBeans IDE 6.0 中分析 Java 应用程序性能

    NetBeans IDE 6.0 包含一个强大的性能分析工具,可提供与应用程序运行时行为有关的重要信息.通过 NetBeans 性能分析工具,我们可以方便地在 IDE 中监控应用程序的线程状态.CPU ...

  9. zabbix如何监控WEB应用性能

    HTTP服务目前最流行的互联网应用之一,如何监控服务的健康状态对系统运维来说至关重要.   Zabbix本身提供了对WEB应用程序的监控,比如监控WEB程序的Download Speed,Respon ...

随机推荐

  1. Java数据类型详解!Java秘诀,Java入门基础

    Java的基本数据类型算是Java学习的基础之一,经常会听到大家提起.那么你到底有没有真正理解和掌握数据类型呢? Java 语言支持的数据类型分为两种:基本数据类型和引用数据类型!本文主要针对这两大数 ...

  2. 阿里P8面试官:如何设计一个扛住千万级并发的架构?

    大家先思考一个问题,这也是在面试过程中经常遇到的问题. 如果你们公司现在的产品能够支持10W用户访问,你们老板突然和你说,融到钱了,会大量投放广告,预计在1个月后用户量会达到1000W,如果这个任务交 ...

  3. windows右键菜单自动打包发布nuget,没有CI/CD一样方便!

    构建现代的 .Net 应用离不开 Nuget 的支持,而快速打包 Nuget 成了提高生产率的有效方法.没有CI/CD?来试试使用windows右键菜单吧 先看右键效果图 有时候我们可能没有CI/CD ...

  4. 2020BUAA软工个人博客作业-软件案例分析

    2020BUAA软工个人博客作业-软件案例分析 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件案例分 ...

  5. 使用cerebro可视化ElasticSearch集群信息

    使用cerebro可视化ElasticSearch集群信息 一.背景 二.安装步骤 1.下载并解压 2.配置cerebro 3.启动 cerebro 4.启动界面 三.注意事项 四.参考文档 一.背景 ...

  6. 晶振在电路设计时关于负载电容CL大小取值特别需要注意什么?

    在无源晶体的设计中,经常遇到负载电容CL的大小取值.晶振设计与精度的提高.KHz无源晶振的停止.音叉晶体谐振器的精度漂移以及精度和无源晶振在高温下的精度是否等于低温的精度烦忧的问题等. 无源晶体振荡器 ...

  7. Relocations in generic ELF (EM: 40)

    最近在搞机器上的wifi热点,需要移植一大堆东西,如hostapd\wpa_suppliant.dhcp等,这些玩意又依赖其他的一大堆库的移植,比如libnl,openssl等,今天在移植编译libn ...

  8. JAVA笔记3__字符串String类/对象一对一关联

    import java.lang.String; import java.util.Scanner; public class Main { public static void main(Strin ...

  9. RabbitMQ的安装及入门使(Windows)

    1.安装Erlang所以在安装rabbitMQ之前,需要先安装Erlang .点击下载Erlang 执行下载下来的Erlang,全部点击"下一步"就行.安装完成设置一下环境变量. ...

  10. properties 文件解析

    1.提供properties文件 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/future?useUn ...