自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

不會(huì)還有人不知道 Arthas 可以條件過濾進(jìn)行 Watch 吧?

開發(fā) 前端
Arthas 的 watch 指令一直是我排查線上問題時(shí)使用最多的指令,沒有之一。而按照條件進(jìn)行 watch 也是很常見的一個(gè)需求,例如線上一個(gè)方法會(huì)有大量的調(diào)用,而我們可以按照指定的條件,watch 到我們希望觀察的那一次調(diào)用。

[[416078]]

 前言

Arthas 的 watch 指令一直是我排查線上問題時(shí)使用最多的指令,沒有之一。而按照條件進(jìn)行 watch 也是很常見的一個(gè)需求,例如線上一個(gè)方法會(huì)有大量的調(diào)用,而我們可以按照指定的條件,watch 到我們希望觀察的那一次調(diào)用。

說實(shí)話,我對 Arthas 也沒有什么研究,一開始還真不清楚原來 Arthas watch 可以按條件過濾,翻看一下官方文檔:https://arthas.aliyun.com/doc/watch#id6

條件表達(dá)式的例子

  1. $ watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0" 
  2. Press Ctrl+C to abort. 
  3. Affect(class-cnt:1 , method-cnt:1) cost in 68 ms. 
  4. ts=2018-12-03 19:36:04; [cost=0.530255ms] result=@ArrayList[ 
  5.     @Integer[-18178089], 
  6.     @MathGame[demo.MathGame@41cf53f9], 

喏,這不是這么明顯的例子嗎?但是上面的例子,貌似只給出了一些簡單的訊息

  • 可以直接用 watch 命令的參數(shù)項(xiàng)中增加條件表達(dá)式進(jìn)行過濾
  • 可以進(jìn)行數(shù)值類型的過濾

但是,這個(gè)簡單的示例,并沒有解答我內(nèi)心其他的疑惑:

  • 我可以進(jìn)行字符串、集合等復(fù)雜類型的判斷嗎?
  • 這個(gè)表達(dá)式是 el、ognl 或者其他類型的表達(dá)式嗎?

帶著這些疑問,我記錄下了這篇文章,給不了解 Arthas watch 條件表達(dá)式的讀者們一些參考。

一些條件表達(dá)式的示例

有一些讀者可能僅僅是想知道“我該怎么實(shí)現(xiàn)使用 Arthas 條件 Watch”,為此,我在本文的第二節(jié)先介紹下我平時(shí)積累的一些實(shí)踐命令。

示例方法

  1. public void methodForWatch(int id, User user) { 

User 結(jié)構(gòu)

  1. @Data 
  2. public class User { 
  3.     private String name
  4.     private int age; 
  5.     private List<String> hobbies; 

另外準(zhǔn)備一些請求,我會(huì)在每個(gè)示例中執(zhí)行相同的調(diào)用。示例請求:

  1. 1, new User("hanmeimei", 16, Arrays.asList("pubg""lol")); 
  2. 2, new User("liming", 17, Collections.singletonList("pubg")); 
  3. 3, new User("tom", 18, Collections.singletonList("running")); 
  4. 4, new User("jacky", 19, Collections.singletonList("food")); 

示例 1:過濾 int 類型;過濾 id > 0 的請求

這其實(shí)就是官方的示例,我拿過來再貼一遍

  1. watch moe.cnkirito.arthas.WatchDemo methodForWatch "{params,returnObj}" "params[0]>0" -x 2 

示例 2:過濾對象中的字符串類型;過濾 User 中 name = haimeimei 的請求

  1. watch moe.cnkirito.arthas.WatchDemo methodForWatch "{params,returnObj}" "params[1].getName().equals('liming')" -x 2 

這里有三個(gè)注意點(diǎn)

  • 使用 params[1] 這種數(shù)組訪問的方式,對應(yīng)到 methodForWatch 方法的第二個(gè)參數(shù) User user
  • 使用 getName() 這種方法調(diào)用的方式拿到 name 字段,并且使用 String 的 equals 方法進(jìn)行字符串比對
  • 由于 condition 表達(dá)式整體使用了雙引號(hào) "",在 hanmeimei 該字面量上需要使用單引號(hào) ''

示例 3:過濾集合中的元素;過濾對 pubg 感興趣的 User 相關(guān)的請求

  1. watch moe.cnkirito.arthas.WatchDemo methodForWatch {params,returnObj} "params[1].getHobbies().contains('pubg')" -x 2 

示例 4:多個(gè)條件表達(dá)式

增加請求示例

  1. 5, new User("kirito", 20, null); 

按照示例 3 的 watch 語句執(zhí)行,會(huì)發(fā)現(xiàn) Arthas 直接拋了一個(gè)空指針:

  1. watch failed, condition is: params[1].getHobbies().contains('pubg'), express is: {params,returnObj}, java.lang.NullPointerException: target is null for method contains, visit /Users/xujingfeng/logs/arthas/arthas.log for more details. 

需要增加空指針的判斷:

  1. watch moe.cnkirito.actuator.demo.HelloController methodForWatch {params,returnObj} "params[1].getHobbies() != null && params[1].getHobbies().contains('pubg')" -x 2 

吶,很簡單,可以直接使用 && 增加判斷條件。

ognl 實(shí)現(xiàn)條件過濾

可能有人要說了,Kirito 啊!你的公眾號(hào)最近是不是廣告發(fā)的太多了,深感愧疚,寫了一篇沒啥深度的原創(chuàng)文章來充數(shù)啊!那我當(dāng)然要反駁啦,其實(shí)我看 Arthas 文檔的時(shí)候也是踩了坑的,索性我將這個(gè)過程也分享一下。

可能大家看了上面的示例會(huì)覺得這個(gè) condition 表達(dá)式不就是跟 Java 里面的表達(dá)式差不多嗎?但其實(shí)我作為一個(gè)不太了解 Arthas 的弱雞,上面的用法純粹是我摸索出來的,在最開始的時(shí)候,參考 github 中的 issue,我使用的其實(shí)是其他的方式來實(shí)現(xiàn)的條件查詢,參考 issue:https://github.com/alibaba/arthas/issues/71。

看下 github 中的 Arthas 開源作者提供的按條件過濾的示例,可以發(fā)現(xiàn)跟上文中我介紹的過濾方式好像,有那么一點(diǎn)點(diǎn)的不同。注意上文的示例

  1. $ watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0" 

watch 后的參數(shù)是由 4 部分組成的,分別是類名表達(dá)式,方法名表達(dá)式,觀察表達(dá)式,條件表達(dá)式。

而 issue 中給出的表達(dá)式

  1. $ watch com.taobao.container.Test test "params[0].{? #this.name == null }" -x 2 

沒有第四部分:條件表達(dá)式。過濾條件被放到了觀察表達(dá)式的對象后,并且不是 Java 里面的表達(dá)式,而是 ognl 表達(dá)式。

  1. ognl 表達(dá)式官方參考文檔:https://commons.apache.org/proper/commons-ognl/language-guide.html 

例如使用 ognl 表達(dá)式實(shí)現(xiàn)上面的示例 2,需要這么寫

示例 5:使用 ognl 表達(dá)式過濾對象中的字符串類型;過濾 User 中 name = haimeimei 的請求

  1. watch moe.cnkirito.actuator.demo.HelloController methodForWatch "params[1].{? #this.name == 'hanmeimei'}" -x 2 

示例 2 和示例 5 的對比

聊到這里,如果你對 Arthas 比較熟悉,應(yīng)該已經(jīng)意識(shí)到示例 5 ognl 過濾和示例 2 直接使用條件過濾表達(dá)式的區(qū)別了。ognl 這種過濾的方式,是針對對象的屬性的過濾,無論是否匹配,都會(huì)被算進(jìn) watch 的匹配次數(shù)中,只不過沒有匹配到的對象沒有輸出;而示例 2 中直接使用條件過濾表達(dá)式這種方式,更匹配我文首提出的需求,只有被條件表示式命中的請求,才會(huì)被算進(jìn) watch 次數(shù)中。你可以使用 -n 1 來限定 watch 匹配次數(shù),直觀地觀察到這兩個(gè)匹配方式的差異。

總結(jié)

本文簡單介紹了使用 Arthas 條件表達(dá)式使用中可能踩到的一些坑,示例 1~4 可以參考,用于過濾一些指定的請求,讓線上問題的定位變得更加高效。

責(zé)任編輯:武曉燕 來源: Kirito的技術(shù)分享
相關(guān)推薦

2021-09-07 11:20:02

binlogMySQL數(shù)據(jù)庫

2021-08-04 08:31:10

MySQL數(shù)據(jù)庫日志

2021-11-02 19:14:58

Spring數(shù)據(jù)

2021-09-10 22:25:37

iOS蘋果安卓

2020-07-08 12:44:00

大數(shù)據(jù)IT互聯(lián)網(wǎng)

2020-06-29 08:28:36

v-for 解構(gòu)函數(shù)

2021-01-21 05:52:11

斷言assert程序員

2010-10-20 09:10:29

私有云

2021-06-07 17:51:27

反斜杠引號(hào)Python

2021-01-12 12:33:20

Pandas技巧代碼

2022-06-23 13:13:36

GitHub開發(fā)技巧

2025-04-16 07:06:43

2023-11-02 08:25:25

組件ReactUI

2021-08-24 00:13:23

Windows 10Windows微軟

2021-01-15 05:39:13

HashMapHashTableTreeMap

2025-04-17 02:30:00

2020-07-07 08:35:53

VueKey組件

2019-01-07 09:27:39

2015-05-19 09:39:05

密碼Apple Watch

2023-10-11 08:16:42

客戶端服務(wù)器內(nèi)容
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)