应用性能监控——NewRelice

 

前言

New Relic 是一个很强大的服务器性能监控工具,New Relic目前专注于SaaS和App性能管理业务,它支持支持agent和API传送数据,能够对部署在本地或在云中的web应用程序进行监控、故障修复、诊断、线程分析以及容量计划。

New Relic APM将你没有发现的问题暴漏出来,帮助团队减少问题解决的时间,从而集中精力写出更多的代码,而不是一直在停留在故障排除。

  • 端对端事务跟踪:跟踪一个关键事务的性能,这个事务贯穿在整个面向服务应用程序环境。
  • 代码级的可见性:深入洞察特定代码段和SQL语句对性能的影响。
  • 关键事务:标记你的最关键的事务,当响应时间、调用、错误率等这些表现不佳的时候可以迅速的发现。
  • X光会话:通过展示事务跟踪长期分析的结果,来获得对一个关键事务性能更深入的了解。

New Relic 特点:

  • 可一直免费试用,当然高级版功能更加强大;
  • 非侵入式安装,无需在代码里埋点,只需简单的安装即可,大部分语言都支持;
  • 功能强大,报表丰富,让性能低下的地方无所遁形,error 也可直观的统计到,对你的应用性能了如指掌。

注:需要FQ工具才能正常访问,不用FQ也是可以访问的,但是很慢很慢。

 

简单工作原理

RPM拥有两种基本的组件:作为应用程序插件运行的代理,以及放置在New Relic数据中心中的服务。

  • 程序插件代理:会收集性能数据,每分钟都会通过HTTPS或者HTTP协议异步地发送给RPM服务,New Relic那里会存储并处理这些数据。
  • New Relic数据中心:会完成以下的工作:数据存储、聚集、修正和可视化。我们可以通过浏览器访问性能数据。

New Relic不提供在本地运行服务的方案,服务只运行在他们的数据中心上

 

NewRelic相关产品

主要产品:

  • APM:应用性能监控
  • Browser:浏览器监控:如果非常注重Web前端体验的话,这个是个不错的东东
  • Synthetics:合并监控:通过创建一个新的监视器来监控世界各地的网站,关键业务交易和API终端
  • Mobile:移动端监控:移动APP性能监控(iOS、Android、Titanium、Unity、tvOS)
  • Plugins:插件监控:貌似也是非常强大,比如:Nginx、Mysql、Memcached、Redis、MongoDB……
  • Infrastructure:基础设施监控:主机的网络IO、CPU、内存、磁盘、系统负载等

 

安装 APM(以java监控Tomcate为例)

1、注册一个New Relic账号(https://newrelic.com/signup)。

2、登录网站选择APM(Application Performance Management,应用性能管理),选择Get Started,假如已经有了applications,就选择[+Add more],如图:

选择java: 

 

3、按照提示步骤进行处理,选择账号、输入应用名称、下载配置文件(里面包含license_key)、下载Java Agent:

第2步下载配置文件,如:newrelic.yml

第3步下载代理包,如:newrelic-java.zip

4、JAVA代理安装

解压下载的JAVA代理到指定目录,如:/home/mppay/下

unzip newrelic-java.zip -d /home/mppay/

5、替换配置文件

将 newrelic.yml(/home/mppay/newrelic/newrelic.yml) 文件替换为您下载的自定义配置文件(newrelic)

也可以直接修改,主要修改以下2个属性:

license_key: cf1e0a1f56b12a40a6d2bcb6da4c6f1df509NRAL
app_name: appName

6、应用运行配置newrelic

在启动命令中,增加以下配置:

-javaagent:/home/mppay/newrelic/newrelic.jar

7、重启tomcate服务,并查看日志

tomcat日志:

2021-08-03T16:04:25,510+0800 [3914 1] com.newrelic INFO: New Relic Agent: Loading configuration file "/home/mppay/newrelic/./newrelic.yml"
2021-08-03T16:04:25,641+0800 [3914 1] com.newrelic INFO: Using default collector host: collector.newrelic.com
2021-08-03T16:04:25,642+0800 [3914 1] com.newrelic INFO: Using default metric ingest URI: https://metric-api.newrelic.com/metric/v1
2021-08-03T16:04:25,642+0800 [3914 1] com.newrelic INFO: Using default event ingest URI: https://insights-collector.newrelic.com/v1/accounts/events
2021-08-03T16:04:25,771+0800 [3914 1] com.newrelic INFO: New Relic Agent: Writing to log file: /home/mppay/newrelic/logs/newrelic_agent.log

agent日志:

2021-08-03T16:41:42,354+0800 [9179 1] com.newrelic INFO: Writing to New Relic log file: /home/mppay/newrelic_mmc/logs/newrelic_agent.log
2021-08-03T16:41:42,355+0800 [9179 1] com.newrelic INFO: JRE vendor Oracle Corporation version 1.8.0_191
2021-08-03T16:41:42,355+0800 [9179 1] com.newrelic INFO: JVM vendor Oracle Corporation Java HotSpot(TM) 64-Bit Server VM version 25.191-b12
2021-08-03T16:41:42,355+0800 [9179 1] com.newrelic INFO: OS Linux version 2.6.32-431.el6.x86_64 arch amd64
2021-08-03T16:41:42,355+0800 [9179 1] com.newrelic INFO: Agent Host: localhost.localdomain IP: 127.0.0.1
2021-08-03T16:41:42,355+0800 [9179 1] com.newrelic INFO: New Relic Agent v7.1.1 is initializing...
2021-08-03T16:41:43,357+0800 [9179 8] com.newrelic INFO: Instrumentation com.newrelic.instrumentation.jdbc-resultset is disabled. Skipping.
2021-08-03T16:41:46,552+0800 [9179 1] com.newrelic.agent.RPMServiceManagerImpl INFO: Configured to connect to New Relic at collector.newrelic.com:443
2021-08-03T16:41:47,587+0800 [9179 1] com.newrelic INFO: Setting audit_mode to false
2021-08-03T16:41:48,044+0800 [9179 1] com.newrelic.agent.config.ConfigServiceImpl INFO: Configuration file is /home/mppay/newrelic_mmc/./newrelic.yml
2021-08-03T16:41:48,062+0800 [9179 1] com.newrelic INFO: New Relic Agent v7.1.1 has started
2021-08-03T16:41:48,063+0800 [9179 1] com.newrelic INFO: Agent class loader: com.newrelic.bootstrap.BootstrapAgent$JVMAgentClassLoader@3b95a09c
2021-08-03T16:41:48,063+0800 [9179 1] com.newrelic INFO: Premain startup complete in 6,707ms
2021-08-03T16:42:05,329+0800 [9179 1] com.newrelic INFO: Server Info: Apache Tomcat/9.0.41
2021-08-03T16:42:23,060+0800 [9179 30] com.newrelic INFO: Host name is localhost.localdomain, display host localhost.localdomain for application SIT_NEW_MMC1
2021-08-03T16:42:23,060+0800 [9179 30] com.newrelic INFO: New Relic JFR Monitor is disabled: JFR config has not been enabled in the Java agent.
2021-08-03T16:42:23,665+0800 [9179 30] com.newrelic INFO: Collector redirection to collector-004.newrelic.com:443
2021-08-03T16:42:24,628+0800 [9179 30] com.newrelic INFO: Max payload size is 1,000,000 bytes
2021-08-03T16:42:24,634+0800 [9179 30] com.newrelic INFO: Agent run id: BeMBvI7bvdxwAC9Ppjzb-xFhCQHQAAIBAAAnIQEAACPbAgQ82_sQAwAFNy4xLjEAFWxvY2FsaG9zdC5sb2NhbGRvbWFpbgAMU0lUX05FV19NTUMx
2021-08-03T16:42:24,634+0800 [9179 30] com.newrelic INFO: Agent 9179@localhost.localdomain/SIT_NEW_MMC1 connected to collector.newrelic.com:443
2021-08-03T16:42:24,634+0800 [9179 30] com.newrelic INFO: Reporting to: https://rpm.newrelic.com/accounts/3100582/applications/1021049616
2021-08-03T16:42:24,636+0800 [9179 30] com.newrelic INFO: Using default collector host: collector.newrelic.com
2021-08-03T16:42:24,636+0800 [9179 30] com.newrelic INFO: Using default metric ingest URI: https://metric-api.newrelic.com/metric/v1
2021-08-03T16:42:24,636+0800 [9179 30] com.newrelic INFO: Using default event ingest URI: https://insights-collector.newrelic.com/v1/accounts/events
2021-08-03T16:42:24,644+0800 [9179 30] com.newrelic INFO: Using default collector host: collector.newrelic.com
2021-08-03T16:42:24,644+0800 [9179 30] com.newrelic INFO: Using default metric ingest URI: https://metric-api.newrelic.com/metric/v1
2021-08-03T16:42:24,644+0800 [9179 30] com.newrelic INFO: Using default event ingest URI: https://insights-collector.newrelic.com/v1/accounts/events
2021-08-03T16:42:25,240+0800 [9179 30] com.newrelic INFO: Real user monitoring is enabled for application SIT_NEW_MMC1. Auto instrumentation is enabled.
2021-08-03T16:42:25,240+0800 [9179 30] com.newrelic WARN: Not starting JFR Service. Core JFR APIs do not exist in this JVM.

从日志中可以看到,Agent已经成功装数据发往newrelic.com的个人账号。

8、打开NewRelic,检查是否有该应用的监控数据

 

使用Maven集成Newrelic

使用newrelic监控应用,需要在应用服务器上部署newrelic客户端(如:newrelic.jar),并对newrelic.yml进行配置(license_key、app_name),然后在启动命令中加入-javaagent:newrelic.jar。

除上述方法外,还可以在应用中使用maven集成newrelic,这样就不需要在部署newrelic客户端了,具体有以下两种实现:

  1. 方案一:应用中将newrelic客户端依赖进来,同时通过maven将newrelic客户端的源码加入应用的jar包中;  
  2. 方案二:应用中将newrelic客户端依赖进来,同时通过maven将newrelic客户端的jar包复制到target/目录下; 

以上两种的最大区别是:

  1. 方案一:优点:部署简单;缺点:对应用的侵入性大(newrelic客户端的源码全部放入应用的jar包中),风险较大;
  2. 方案二:优点:应用与newrelic相互独立隔离;缺点:部署时要额外处理newrelic客户端的jar包,需要将它上传至应用服务器(使用jenkins);
  3. 上面的两种实现方案,都要额外处理newrelic.yml配置文件。我这里的处理方式是,在应用中按环境内置一个newrelic.yml,在maven打包时把它复制到newrelic客户端.jar包同一目录下;

方案一 实现步骤:

1、添加了 NewRelic 依赖项:

<dependency>
    <groupId>com.newrelic.agent.java</groupId>
    <artifactId>newrelic-agent</artifactId>
    <version>6.4.2</version>
    <scope>provided</scope>
</dependency>

2、配置maven-dependency-plugin插件

作用:复制newrelic-agent.jar包到指定目录(target/)下。

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <includeArtifactIds>newrelic-agent</includeArtifactIds>
                            <outputDirectory>${project.build.directory}</outputDirectory>
                            <stripVersion>true</stripVersion>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

3、配置maven-antrun-plugin插件

作用:将应用中默认的newrelic.yml配置文件,复制到指定目录(target/)下(跟newrelic-agetn.jar同目录)。

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <id>id.newrelic</id>
                        <phase>package</phase>
                        <configuration>
                            <target>
                                <copy todir="${basedir}/target/">
                                    <fileset dir="${basedir}/src/main/resources/conf_${spring.profiles.active}">
                                        <include name="newrelic.yml"/>
                                    </fileset>
                                </copy>
                            </target>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

4、应用中按环境添加默认的newrelic.yml配置文件

5、使用mavent打包

打包结果如下,除了应用的jar包外,还有newrelic-agent.jar、newrelic.yml。

6、发布运行

将上述3个包一起上传(一般使用jenkins)到应用服务器,放置在同一个目录,然后使用以下命令运行:

java -javaagent:newrelic-agent.jar -jar umpg.jar

 

方案二 实现步骤:

1、添加了 NewRelic 依赖项:

<dependency>
    <groupId>com.newrelic.agent.java</groupId>
    <artifactId>newrelic-agent</artifactId>
    <version>6.4.2</version>
    <scope>provided</scope>
</dependency>

2、配置maven-antrun-plugin插件

作用:解压newrelic-agent.ar中包含的所有文件 到 应用的jar包中,复制依赖jar包到指定目录(target/)下

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <id>addExtractedJarOnRootLevel</id>
                        <phase>package</phase>
                        <configuration>
                            <target>
                                <zip destfile="${project.build.directory}/${project.artifactId}.jar" update="yes" compress="false">
                                <zipfileset src="${com.newrelic.agent.java:newrelic-agent:jar}" />
                                </zip>
                            </target>
                        </configuration>
                        <goals>
                        <goal>run</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>id.newrelic</id>
                        <phase>package</phase>
                        <configuration>
                            <target>
                                <copy todir="${basedir}/target/">
                                    <fileset dir="${basedir}/src/main/resources/conf_${spring.profiles.active}">
                                        <include name="newrelic.yml"/>
                                    </fileset>
                                </copy>
                            </target>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

3、应用中按环境添加默认的newrelic.yml配置文件

4、使用mavent打包

打包结果如下,除了应用的jar包外,还有newrelic.yml。

注意:这里并没有newrelic-agent.jar包,而是将它里面的内容,复制到umpg.jar包中了:

上图右边框中的部分,都是newrelic-agent.jar包中的内容。

5、发布运行

将上述2个包一起上传(一般使用jenkins)到应用服务器,放置在同一个目录,然后使用以下命令运行:

java -javaagent:umpg.jar -jar umpg.jar

注:这里-javaagent指定的jar包就是应用jar包。

 

其它说明

  1. 以上两种实现方案,最大好处就是,newrelic代理依赖是你构建过程的一部分,不用在每台应用服务器部署newrelic.jar包(除了 newrelic.yml)。推荐使用第一种方案,第二种方案对应用的侵入性太大;
  2. 以上两种实现方案,都要额外处理newrelic.yml配置文件。如不想在打包的时候处理newrelic.yml文件(运维不肯给license_key),则需要运维在部署时自己提供newrelic.yml(放到跟jar包同一目录下,或由-Dnewrelic.config.file指定路径);
  3. 还可以使用-Dnewrelic.config.app_name指定应用名称;
  4. 上面提到了,使用jenkins将newrelic-agent.jar、newrelic.yml上传至服务器,下面给出参考配置:
  5. 下面是一些参考网站:

 

Newrelic自定义检测

某些场景下NewRelic无法自动识别Transactions,则要进行自定义检测处理,需要在应用中植入代码,具体方法如下。

添加依赖

添加newrelic-api 的依赖,version要跟应用服务器上newrelic客户端的保持一致。

<dependency>
    <groupId>com.newrelic.agent.java</groupId>
    <artifactId>newrelic-api</artifactId>
    <version>6.4.2</version>
    <scope>compile</scope>
</dependency>

添加注解

在需要监控的方法头上,增加 @Trace(dispatcher=true) 注解。

注意:在增加了@Trace注解方法的调用链路中,如果有异步场景,则异步中处理的逻辑监控不到。

 

图表的简单说明

Summary介绍:

  • Web transactions time:JVM、Mysql、Web external、Response time 整体耗时报表
  • Apdex score:apm 综合打分,满分1.0
  • Throughtput:整体吞吐量,单位分钟
  • Transactions:请求调用等,Top5
  • Error rate:错误率,如果检测到系统错误,这里会提现处理,如果达到一定错误率,会有系统报警(邮件),报表背景将会是:淡红色
  • Host:JVM 报表,每个 jvm 具体情况,比如:
  • Recent events:近期历史事件,常见的就是报警了

Transactions介绍

  • Type:Web、Non-Web(Java/Job/SpringController等,定时任务之类的)
  • 排序
    • Most Time consuming:耗时最多的
    • Slowest average response time:响应最慢的
    • Adpex most dissatisfying:Adpex打分最不满意的
    • Highest throughput:吞吐量最高的
  • Top 5 web Transactions:耗时最多的5个web请求百分比,可以选择不同的报表展示方式
  • Transaction traces:一般是有问题的请求事件会出现在这里,点进去可以看到堆栈的东西,查询sql之类的等
    • Summary:汇总
    • Trace details:跟踪详情
    • Database queries:数据库查询

 附上 Transaction traces 3张截图:

 

 

DataBases介绍

  • SORT BY:排序
    • Most time consuming:秏时最多的
    • Slowest query time:查询最慢的
    • Throughtput:吞吐量最大的(频率最高的)
  • MySQL overview:根据排序来展现的详细报表,仅第一个根据排序变化
    • Top database operations by time consumed:耗时最多的5个查询
    • Top database operations by query time:整体增删改查耗时
    • Top database operations by throughput:整体增删改查吞吐量

External services介绍

比如嵌入了第三方的API,调用时也会被记录下来,比如:吞吐量、平均响应时长等信息。

JVMs介绍

 

Service map介绍

显示服务之间的拓扑图。

Dependencies介绍

显示服务之间的依赖关系,包括数据库和中间件。

 

Distributed tracing介绍

分布式调用链路。

注:目前发现只支持http请求的调用。

 

 

引用:

posted on 2021-05-22 18:36  曹伟雄  阅读(5267)  评论(0编辑  收藏  举报

导航