.NET程序性能监控系统Elastic AMP的使用方法

目录
  • 什么是Elastic AMP
  • 工作原理
  • 代码演示
    • 1.新增Web项目
    • 2.新增Nuget包
    • 3.配置HttpModule
    • 4.配置Agent
    • 5.启动网站
  • Elastic APM核心模块
    • 1.Transaction:我们通过Transaction可以看其中Api的调用信息
    • 2. Dependencies:通过Dependencies看到服务依赖关系
    • 3. Error: 能通过Error看到程序中的错误信息
    • 4. Matrics: 可以通过Matrics看到服务气的内存与CPU信息
  • Elastic监控MSSql与Redis等组件
  • Elastic APM Api的深入使用
    • 1.StartTransaction与StartSpan开启自定义transaction与span
    • 2.CaptureTransaction与CaptureSpan开启自定义transaction与span
    • 3.Agent全局拦截

什么是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;
            });

到此这篇介绍.NET程序性能监控系统Elastic AMP使用方法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Redis性能监控的实现

    目录 1.redis_exporter 2.prometheus 3.grafana redis_exporter + prometheus +grafana监控Redis服务指标 本文使用 redis_exporter + prometheus +grafana 实现对Redis服务进行监控,原因:成本低,人工干预少,直接下载对应的组件,只需添加配置即可互相通信,可视化指标也比较全面. 下面是在安装了redis的Linux机器上 1.redis_exporter 下载程序压缩文件 wget h

  • c#实现服务器性能监控并发送邮件保存日志

    客户端代码 复制代码 代码如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Diagnostics;using System.ServiceProcess;using System.Text;using System.Threading;using System.Management;using System.Configurat

  • .NET程序性能监控系统Elastic AMP的使用方法

    目录 什么是Elastic AMP 工作原理 代码演示 1.新增Web项目 2.新增Nuget包 3.配置HttpModule 4.配置Agent 5.启动网站 Elastic APM核心模块 1.Transaction:我们通过Transaction可以看其中Api的调用信息 2. Dependencies:通过Dependencies看到服务依赖关系 3. Error: 能通过Error看到程序中的错误信息 4. Matrics: 可以通过Matrics看到服务气的内存与CPU信息 Elas

  • Spring Boot 项目做性能监控的操作流程

    Spring Boot特别适合团队构建各种可快速迭代的微服务,同时为了减少程序本身监控系统的开发量,Spring Boot 提供了 actuator 模块,可以很方便的对你的 Spring Boot 程序做监控. 1. actuator接口说明 Spring Boot 应用中加入监控很简单,只需要在pom.xml文件中加入以下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifact

  • 两种iOS调用系统发短信的方法

    一.程序外调用系统发短信 这个方法其实很简单,直接调用openURL即可: NSURL *url = [NSURL URLWithString:@"sms://15888888888"]; [[UIApplication sharedApplication]openURL:url]; 二.程序内调用系统发短信 这种方法有一个好处就是用户发短信之后还可以回到App. 首先要导入MessageUI.framework,并引入头文件: #import <MessageUI/Messag

  • 基于python的Linux系统指定进程性能监控思路详解

    监控Linux服务器的工具.组件和程序网上有很多,但是一台服务器上会有很多进程同时运行,特别是做性能测试的时候,可能一台服务器上部署多个服务,如果只监控整个服务器的CPU和内存,当某个服务出现性能问题时,并不能有效准确的定位出(当然通过其他工具也可以实现),因此,很有必要只监控指定的进程.需求明确了,于是动手撸了一个性能监控脚本. 一.整体思路 1.为了方便的启动监控和停止监控,在想查看监控结果的时候随时查看监控结果,用flask开启了一个服务,通过发送get请求可以随时启停监控和查看监控结果.

  • Ubuntu上使用Netdata设置实时性能监控的详细流程

    介绍 Netdata通过可扩展的Web仪表板提供准确的性能监控,可以显示Linux系统上的流程和服务.它监控有关CPU,内存,磁盘,网络,进程等的指标. Netdata一旦安装就不需要额外的配置,但提供了重要的定制.该应用程序的效率和速度旨在与本机控制台管理工具(如vmstat,iostat和htop)相媲美. 本教程中的步骤涵盖了使用其内置Web服务器或可选地使用Nginx成功设置运行Netdata的一台Ubuntu 16.04服务器所需的一切. 准备 要学习本教程,您需要: 一个Ubuntu

  • eBay 打造基于 Apache Druid 的大数据实时监控系统

    首先需要注意的是,本文即将提到的 Druid,并非阿里巴巴的 Druid 数据库连接池,而是另一个大数据场景下的解决方案:Apache Druid. Apache Druid 是一个用于大数据实时查询和分析的高容错.高性能开源分布式时序数据库系统,旨在快速处理大规模的数据,并能够实现快速查询和分析.尤其是当发生代码部署.机器故障以及其他产品系统遇到宕机等情况时,Druid 仍能够保持 100% 正常运行.创建 Druid 的最初意图主要是为了解决查询延迟问题,当时试图使用 Hadoop 来实现交

  • web项目中golang性能监控解析

    目录 性能监控 一.web项目(如gin中) 二.单个的go文件如果查看gc 性能监控 一.web项目(如gin中) 1.使用ginpprof import "github.com/DeanThompson/ginpprof" router := gin.Default() ginpprof.Wrap(router) 2.使用pprof 只需要在main.go中引入:_ “net/http/pprof” 访问:127.0.0.1:8080/debug/pprof /debug/ppro

  • JavaScript架构前端不能没有监控系统原因

    目录 监控系统 前端监控具体能解决什么问题? 异常报错问题 性能检测问题 运营反馈工具 为什么要选择自研? 自研前端监控的技术栈 监控系统 提到监控系统,大部分同学首先想到的是后端监控.很明显,比如检测服务器性能,数据库性能,API 的访问流量,以及各种服务的运行情况等等,都与后端息息相关.而前端更多承担的是 UI 展现的角色,主要关注页面怎么排版设计,好像没什么需要监测的地方,因此一直以来都没有涉及到监控的概念. 于是呢大家就一致认为:只要后端稳定可控,应用就是稳定可控的,可实际情况真的是这样

  • GoLang日志监控系统实现

    目录 日志监控系统 项目简答介绍 系统架构 读取模块具体实现 日志解析模块 日志监控系统 Nginx(日志文件) -> log_process (实时读取解析写入) -> influxdb(存储) ->grafana(前端日志展示器) influxdb 属于GO语言编写的开源的时序型数据,着力于高性能 查询与存储时序型数据,influxdb 广泛的应用于存储系统的监控数据,IOT行业的实时数据. 目前市面上流行 TSDB(时序型处理数据库):influxDB, TimescaleDB,

  • shell脚本监控系统负载、CPU和内存使用情况

    在没有nagios监控软件的情况下,只要服务器能上互联网,就可通过发邮件的方式来提醒管理员系统负载与CPU占用的使用情况. 一.安装linux下面的一个邮件客户端msmtp软件(类似于一个foxmail的工具) 1.下载安装:  http://downloads.sourceforge.net/msmtp/msmtp-1.4.16.tar.bz2?modtime=1217206451&big_mirror=0 复制代码 代码如下: # tar jxvf msmtp-1.4.16.tar.bz2

随机推荐