前言
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客戶端了,具體有以下兩種實現:
- 方案一:應用中將newrelic客戶端依賴進來,同時通過maven將newrelic客戶端的源碼加入應用的jar包中;
- 方案二:應用中將newrelic客戶端依賴進來,同時通過maven將newrelic客戶端的jar包復制到target/目錄下;
以上兩種的最大區別是:
- 方案一:優點:部署簡單;缺點:對應用的侵入性大(newrelic客戶端的源碼全部放入應用的jar包中),風險較大;
- 方案二:優點:應用與newrelic相互獨立隔離;缺點:部署時要額外處理newrelic客戶端的jar包,需要將它上傳至應用服務器(使用jenkins);
- 上面的兩種實現方案,都要額外處理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包。
其它說明
- 以上兩種實現方案,最大好處就是,newrelic代理依賴是你構建過程的一部分,不用在每台應用服務器部署newrelic.jar包(除了 newrelic.yml)。推薦使用第一種方案,第二種方案對應用的侵入性太大;
- 以上兩種實現方案,都要額外處理newrelic.yml配置文件。如不想在打包的時候處理newrelic.yml文件(運維不肯給license_key),則需要運維在部署時自己提供newrelic.yml(放到跟jar包同一目錄下,或由-Dnewrelic.config.file指定路徑);
- 還可以使用-Dnewrelic.config.app_name指定應用名稱;
- 上面提到了,使用jenkins將newrelic-agent.jar、newrelic.yml上傳至服務器,下面給出參考配置:
- 下面是一些參考網站:
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請求的調用。
引用:
- https://blog.csdn.net/xiaolyuh123/article/details/75645047
- https://blog.csdn.net/yiyihuazi/article/details/107974539
- https://zhuanlan.zhihu.com/p/35758235
- https://www.jianshu.com/p/595636f30d77
- https://docs.newrelic.com/docs/agents/java-agent/custom-instrumentation/java-custom-instrumentation/
- https://www.pianshen.com/article/98981676110/