成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

不會還有人不知道 Arthas 可以條件過濾進行 Watch 吧?

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

[[416078]]

 前言

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

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

條件表達式的例子

  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ù)項中增加條件表達式進行過濾
  • 可以進行數(shù)值類型的過濾

但是,這個簡單的示例,并沒有解答我內心其他的疑惑:

  • 我可以進行字符串、集合等復雜類型的判斷嗎?
  • 這個表達式是 el、ognl 或者其他類型的表達式嗎?

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

一些條件表達式的示例

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

示例方法

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

User 結構

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

另外準備一些請求,我會在每個示例中執(zhí)行相同的調用。示例請求:

  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 的請求

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

  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 

這里有三個注意點

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

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

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

示例 4:多個條件表達式

增加請求示例

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

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

  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 實現(xiàn)條件過濾

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

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

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

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

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

而 issue 中給出的表達式

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

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

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

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

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

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

示例 2 和示例 5 的對比

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

總結

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

責任編輯:武曉燕 來源: Kirito的技術分享
相關推薦

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 解構函數(shù)

2021-01-21 05:52:11

斷言assert程序員

2021-06-07 17:51:27

反斜杠引號Python

2010-10-20 09:10:29

私有云

2021-01-12 12:33:20

Pandas技巧代碼

2022-06-23 13:13:36

GitHub開發(fā)技巧

2025-04-16 07:06:43

2021-01-15 05:39:13

HashMapHashTableTreeMap

2021-08-24 00:13:23

Windows 10Windows微軟

2023-11-02 08:25:25

組件ReactUI

2020-07-07 08:35:53

VueKey組件

2025-04-17 02:30:00

2019-01-07 09:27:39

2015-05-19 09:39:05

密碼Apple Watch

2023-10-11 08:16:42

客戶端服務器內容
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩久 | 欧洲亚洲一区二区三区 | 日韩av大片免费看 | 国产午夜精品福利 | 九九热精品视频 | 中文字幕在线观看第一页 | 亚洲中午字幕 | 日韩成人中文字幕 | 日韩精品视频在线免费观看 | 日韩欧美不卡 | 免费99视频| 欧美综合一区 | 国产精品免费在线 | 亚洲国产成人在线观看 | 欧美日韩一区二区视频在线观看 | 国产在线一区二区三区 | 国产在线精品一区 | 国产亚洲精品美女久久久久久久久久 | 曰韩三级 | 五月天天色 | 午夜影视大全 | 精品视频免费 | 国产在线小视频 | 国产精品毛片一区二区三区 | 午夜电影网 | 亚洲网站在线观看 | 日韩毛片免费看 | 日本理论片好看理论片 | h小视频| 亚洲不卡在线观看 | 中国三级黄色录像 | 亚洲综合大片69999 | 九九热精品在线 | 国产精品日日夜夜 | www.色综合| 成年人在线观看 | 自拍偷拍小视频 | 久久国产精品99久久久大便 | 欧美视频一区 | 99日韩| 久久久久久亚洲精品 |