国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java agent 實戰(zhàn) 監(jiān)控Elasticsearch(只需依賴一個jar 完全無侵入式)解決jar啟動問題

這篇具有很好參考價值的文章主要介紹了java agent 實戰(zhàn) 監(jiān)控Elasticsearch(只需依賴一個jar 完全無侵入式)解決jar啟動問題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

需求背景

agent是什么大家應(yīng)該很熟悉了,今天我們來實戰(zhàn)下,效果就是為項目所有elasticsearch請求方法增加耗時告警!

學(xué)會Java Agent你能做什么?

  • 自動添加getter/setter方法的工具lombok就使用了這一技術(shù)
  • btrace、Arthas和housemd等動態(tài)診斷工具也是用了instrument技術(shù)
  • Intellij idea 的 HotSwap、Jrebel 等也是該技術(shù)的實現(xiàn)之一
  • pinpoint、skywalking、newrelic、聽云的 APM 產(chǎn)品等都基于 Instrumentation 實現(xiàn)

使用方法

依賴maven

   <dependency>
		   	<groupId>com.uc.agent</groupId>
			<artifactId>neighbour-agent-elasticsearch-starter</artifactId>
			<version>0.0.56</version>
	</dependency>

到此我們的agent就已經(jīng)集成了,不需要加任何啟動參數(shù),完全是無侵入式!?。。?/h4>

解決了jar -jar方式啟動的問題:

  • springboot自定義類加載器LaunchedURLClassLoader ,與agent的類加載器不同的沖突問題。
  • VirtualMachine綁定agent時,loadAgent方法找不到agentjar問題。
  • AgentLoader 加載之前 (agent動態(tài)綁定之前) 被JVM加載過的class是不會回調(diào)addTransformer方法的。 springboot擴展點和import方式導(dǎo)入的組件class優(yōu)先AgentLoader 加載了,所以會造成agent攔截不到。
  • springboot本地可以,打包到線上jar啟動方式agent無效等問題。

當(dāng)es執(zhí)行 search方法時,會自動打印方法耗時:

java agent 實戰(zhàn) 監(jiān)控Elasticsearch(只需依賴一個jar 完全無侵入式)解決jar啟動問題,java,elasticsearch,jar

neighbour-agent-elasticsearch-starter 的下載地址 在github上面

https://github.com/HadLuo/neighbour-agent-elasticsearch-starter.git文章來源地址http://www.zghlxwxcb.cn/news/detail-595122.html

下面我們看下簡單的agent使用,但是沒有解決上面 jar啟動的問題,要了解實現(xiàn)請下載源碼?。。?/h4>

開場實例:

比如我們業(yè)務(wù)代碼的網(wǎng)絡(luò)請求框架代碼(模擬):

public class HttpClient {

	public void post() {
		System.out.println("HttpClient pos 請求");
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

我們要實現(xiàn)的就是監(jiān)聽當(dāng)網(wǎng)絡(luò)請求超過1秒就釘釘告警出來。比如:

java agent 實戰(zhàn) 監(jiān)控Elasticsearch(只需依賴一個jar 完全無侵入式)解決jar啟動問題,java,elasticsearch,jar

實現(xiàn)過程

AgentLoader

我們先實現(xiàn)一個AgentLoader 用來加載agent:

@Configuration
public class AgentLoader implements InitializingBean{
	@Override
	public void afterPropertiesSet() throws Exception {
		  // 動態(tài)獲取SpringBoot啟動類名稱
                StartAppClassName = getMainClassName();
		// 加載agent jar包 得到路徑
		File file = FileLoads.loadFile("agent-client-0.0.1-SNAPSHOT-jar-with-dependencies.jar");
		String jar = file.getAbsolutePath();
		try {
			for (VirtualMachineDescriptor virtualMachineDescriptor : VirtualMachine.list()) {
				// 針對指定名稱的JVM實例
				if (virtualMachineDescriptor.displayName().equals(StartAppClassName)) {
					System.out.println(
							"將對該進程的vm進行增強:org.example.agent.AgentTest的vm進程, pid=" + virtualMachineDescriptor.id());
					// attach到新JVM
					VirtualMachine vm = VirtualMachine.attach(virtualMachineDescriptor);
					// 加載agentmain所在的jar包
					vm.loadAgent(jar);
					// detach
					vm.detach();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}    

當(dāng)前放到SpringBoot初始化 Import 這個類 加載就行。

agent-client-0.0.1-SNAPSHOT-jar-with-dependencies.jar 為下面要制作的 agent jar名稱,需要放到項目的resource目錄下。

這里我們其實就是用到了agent的動態(tài)綁定方式去綁定。

agent jar制作:

agentmain方法:

JDK 1.6 引入了新的 agentmain 用于支持在類加載后再次加載該類,也就是重定義類,在重定義的時候可以修改類。但是這種方式對類的修改有較大的限制,修改后的類要兼容原來的舊類,具體的要求在 Java 官方文檔 Instrumentation#retransformClasses()方法介紹 中可以找到: 轉(zhuǎn)換類時禁止添加、刪除、重命名成員變量和方法,禁止修改方法的簽名,禁止改變類的繼承關(guān)系。

public static void agentmain(String args, Instrumentation instrumentation) {
		instrumentation.addTransformer(new ClassFileTransformer() {
			public byte[] transform(ClassLoader l, String className, Class<?> c, ProtectionDomain pd, byte[] b) {
				try {
					if (className == null) {
						return null;
					}
//					System.err.println(className);
					className = className.replace("/", ".");
					if (className.equals("com.uc.riskcontroller.trace.HttpClient")) {
						final ClassPool classPool = ClassPool.getDefault();
						final CtClass clazz = classPool.get("com.uc.riskcontroller.trace.HttpClient");
						for (CtMethod method : clazz.getMethods()) {
							if (Modifier.isNative(method.getModifiers())) {
								continue;
							}
							method.addLocalVariable("s", classPool.get("long"));
							method.insertBefore("s = System.currentTimeMillis();");
							method.insertAfter("System.out.println(System.currentTimeMillis() - s);", false);
							method.insertAfter("com.uc.framework.alert.AlertContext.robot(com.uc.framework.env.EnvironmentServer.UnkownExceptionWebwork).alert(\"http客戶端請求耗時:\" + (System.currentTimeMillis() - s ));", false);
						}

						return clazz.toBytecode();
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
				return null;
			}
		}, true);
		Class<?>[] classes = instrumentation.getAllLoadedClasses();
		if (classes != null) {
			for (Class<?> c : classes) {
				if (c.isInterface() || c.isAnnotation() || c.isArray() || c.isEnum()) {
					continue;
				}
				if (c.getName().equals("com.uc.riskcontroller.trace.HttpClient")) {
					try {
						System.out.println("retransformClasses start, class: " + c.getName());
						instrumentation.retransformClasses(c);
						System.out.println("retransformClasses end, class: " + c.getName());
					} catch (UnmodifiableClassException e) {
						System.out.println("retransformClasses error, class: " + c.getName() + ", ex:" + e);
						e.printStackTrace();
					}
				}
			}
		}
	}

核心就在于Instrumentation的兩個方法:

void addTransformer(ClassFileTransformer transformer, boolean canRetransform);

 void retransformClasses(Class<?>... classes) throws UnmodifiableClassException;
  • addTransformer()用來注冊類的修改器;JVM每裝載一個類,transform?都會被回調(diào)執(zhí)行。
  • retransformClasses()會讓類重新加載,從而使得注冊的類修改器能夠重新修改類的字節(jié)碼。

在利用javaassit進行字節(jié)碼修改,達到了增加耗時告警目的。

到此我們實例已經(jīng)制作完畢。

但是上面會有一個問題,在線上 我們用jar -jar 啟動時,會有各種問題, 但是在文章的前面實現(xiàn)的案例都已經(jīng)解決了,需要讀者自行下載。

下載地址在github上面

https://github.com/HadLuo/neighbour-agent-elasticsearch-starter.git

到了這里,關(guān)于java agent 實戰(zhàn) 監(jiān)控Elasticsearch(只需依賴一個jar 完全無侵入式)解決jar啟動問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • flume系列之:監(jiān)控Systemctl托管的flume agent組

    flume接kafka集群,一個kafka集群對應(yīng)一個flume agent組,會把一組flume agent用systemctl托管 每接一個kafka集群會自動化部署一組flume agent 現(xiàn)在對每個flume agent組設(shè)置監(jiān)控,確保所有的flume agent組都處于運行狀態(tài) 不在運行中的flume agent組發(fā)出告警信息或者自動拉起服務(wù) flume系列之:監(jiān)控

    2024年02月13日
    瀏覽(15)
  • Zabbix6 通過zabbix-agent2監(jiān)控MySQL

    Zabbix6 通過zabbix-agent2監(jiān)控MySQL

    ? ? ?Zabbix6 自帶mysql模版,無須再使用第三方,也不用自己寫監(jiān)控腳本,而且zabbix-agent2比zabbix-agent,功能更強大,應(yīng)用也更簡單。 1、登錄要被監(jiān)控的mysql, 創(chuàng)建監(jiān)控用戶 2、登錄Zabbix Server WEB,【配置】--【模版】- 【MySQL by Zabbix agent 2】,修改此【宏】 3、【配置】-【主機】

    2024年02月11日
    瀏覽(34)
  • 只需三步,教你搭建一個進銷存管理系統(tǒng)!

    只需三步,教你搭建一個進銷存管理系統(tǒng)!

    如果你常常面臨: 進銷存軟件功能不全、功能冗余、價格昂貴,性價比不高的情況—— 可以考慮使用【零代碼搭建】了! 在簡道云可以根據(jù)自身需求快速搭建出進銷存管理系統(tǒng)。相比較其他標(biāo)準(zhǔn)進銷存軟件,用簡道云搭建進銷存具備以下優(yōu)勢: 功能靈活: 可以對進銷存模

    2024年02月06日
    瀏覽(23)
  • 【python】只需一段代碼,剪輯一個視頻——Moviepy詳解

    【python】只需一段代碼,剪輯一個視頻——Moviepy詳解

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 知道嗎,用moviepy一行代碼就能夠快速剪輯視頻中某個區(qū)間的片段: clip = VideoFileClip(“videoplayback.mp4”).subclip(50,60) 這一段代碼,能夠在3秒內(nèi)將videoplayback.mp4的50秒-60秒的視頻片段提取出來,非常方便。

    2023年04月16日
    瀏覽(19)
  • 安裝及配置zabbix_agent代理端(監(jiān)控FTP服務(wù)器)

    安裝及配置zabbix_agent代理端(監(jiān)控FTP服務(wù)器)

    監(jiān)控agent的linux主機我們在之前的文章里已經(jīng)做好了 現(xiàn)在直接安裝ftp服務(wù)即可 ? ? ? ? ? ? 監(jiān)控成功

    2024年02月16日
    瀏覽(27)
  • Java實戰(zhàn)場景下的ElasticSearch

    ES官方提供了各種不同語言的客戶端 ,用來操作ES。這些客戶端的本質(zhì)就是組裝DSL語句,通過http請求發(fā)送給ES,其中的Java Rest Client又包括兩種: Java Low Level Rest Client Java High Level Rest Client 本文介紹的是Java HighLevel Rest Client客戶端API; 在elasticsearch提供的API中,與elasticsearch一切交

    2024年02月11日
    瀏覽(16)
  • 狂收 3K Star!一個高性能、無侵入的 Java 性能監(jiān)控和統(tǒng)計工具,十分強悍!

    狂收 3K Star!一個高性能、無侵入的 Java 性能監(jiān)控和統(tǒng)計工具,十分強悍!

    隨著所在公司的發(fā)展,應(yīng)用服務(wù)的規(guī)模不斷擴大,原有的垂直應(yīng)用架構(gòu)已無法滿足產(chǎn)品的發(fā)展,幾十個工程師在一個項目里并行開發(fā)不同的功能,開發(fā)效率不斷降低。 于是公司開始全面推進服務(wù)化進程,把團隊內(nèi)的大部分工程師主要精力全部都集中到服務(wù)化中。服務(wù)化可以讓

    2024年02月11日
    瀏覽(35)
  • Java實戰(zhàn):SpringBoot+ElasticSearch 實現(xiàn)模糊查詢

    本文將詳細介紹如何使用SpringBoot整合ElasticSearch,實現(xiàn)模糊查詢、批量CRUD、排序、分頁和高亮功能。我們將深入探討ElasticSearch的相關(guān)概念和技術(shù)細節(jié),以及如何使用SpringData Elasticsearch庫簡化開發(fā)過程。 ElasticSearch是一個基于Lucene構(gòu)建的開源搜索引擎,它提供了一個分布式、多

    2024年04月25日
    瀏覽(22)
  • Langchain+ElasticSearch+文心千帆 構(gòu)建檢索增強LLM Agent

    Langchain+ElasticSearch+文心千帆 構(gòu)建檢索增強LLM Agent

    很早就開始做檢索增強的大語言模型Agent了,通過外接知識庫為LLM提供外部知識能增強它回答的準(zhǔn)確性。這里我們使用ElasticSearch作為數(shù)據(jù)庫存儲相關(guān)知識,使用百度文心千帆的embedding API提供向量嵌入;借助langchain搭建LLM Agent. 需要安裝的環(huán)境有: Python, ElasticSearch, langchain, q

    2024年02月04日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包