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

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

開發 前端
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 命令的參數項中增加條件表達式進行過濾
  • 可以進行數值類型的過濾

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

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

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

一些條件表達式的示例

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

示例方法

  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; 

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

  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] 這種數組訪問的方式,對應到 methodForWatch 方法的第二個參數 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 語句執行,會發現 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 實現條件過濾

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

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

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

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

watch 后的參數是由 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 表達式實現上面的示例 2,需要這么寫

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

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

示例 2 和示例 5 的對比

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

總結

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

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

2021-09-07 11:20:02

binlogMySQL數據庫

2021-08-04 08:31:10

MySQL數據庫日志

2021-11-02 19:14:58

Spring數據

2021-09-10 22:25:37

iOS蘋果安卓

2020-07-08 12:44:00

大數據IT互聯網

2020-06-29 08:28:36

v-for 解構函數

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技巧代碼

2025-04-16 07:06:43

2022-06-23 13:13:36

GitHub開發技巧

2021-01-15 05:39:13

HashMapHashTableTreeMap

2023-11-02 08:25:25

組件ReactUI

2021-08-24 00:13:23

Windows 10Windows微軟

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技術棧公眾號

主站蜘蛛池模板: 亚洲va国产日韩欧美精品色婷婷 | 亚洲一区二区精品视频 | 中文字幕成人网 | 国产精品国产精品 | 激情av网站 | 国产精品视频免费观看 | 久久久久久久久久久丰满 | 日韩成人影院在线观看 | 国产精品毛片在线 | 国产自产c区 | 国产在线精品一区二区 | 亚洲男人网 | 在线国产一区二区 | 色欧美片视频在线观看 | 在线欧美亚洲 | 欧美欧美欧美 | 精品免费视频 | 先锋影音资源网站 | 91麻豆精品国产91久久久资源速度 | 99久久精品国产一区二区三区 | 夜夜骑综合 | 九九福利 | 9久9久9久女女女九九九一九 | 国产精品一区在线观看 | 天堂成人国产精品一区 | 一级黄色毛片 | av网站在线免费观看 | 一区二区福利视频 | 香蕉久久av | 成人超碰 | 激情免费视频 | 最新一级毛片 | 精品久久久久久国产 | 巨大黑人极品videos精品 | 美女天堂| 精品国产免费一区二区三区演员表 | 午夜精品久久 | 91精品国产综合久久久久久 | 在线成人| 国产精品欧美一区二区三区不卡 | 国产精品永久免费观看 |