你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Sampler——shell命令执行可视化和告警的工具

[复制链接]
gaosmile 发布时间:2020-10-7 21:45
Sampler是一个用于shell命令执行,可视化和告警的工具。其配置使用的是一个简单的YAML文件。
微信图片_20201007214222.jpg
为什么我需要它?
你可以直接从终端对任意动态进程进行采样 – 观察数据库中的更改,监控MQ动态消息(in-flight messages),触发部署脚本并在完成后获取通知。
如果有一种方法可以使用shell命令获取指标(metric),那么可以使用Sampler立即对其进行可视化。
安装macOS% }( t: ~5 a/ y7 X
brew cask install sampler
5 `" l0 ^, }2 O0 J. i
或
2 ]  e9 y* Y$ }$ }' S
sudo curl -Lo /usr/local/bin/sampler https://github.com/sqshq/sampler ... -1.0.3-darwin-amd64' u, j( w( u+ I; T- e, j5 h
sudo chmod +x /usr/local/bin/sampler

5 d% Q/ ?* k" ?
! s% D, D( R' o. l

. ^3 J) U2 S. d, Z! `Linux
* f' h' |& Y3 k$ Nsudo wget https://github.com/sqshq/sampler ... r-1.0.3-linux-amd64 -O /usr/local/bin/sampler! L4 _  K* V# f8 e( [
sudo chmod +x /usr/local/bin/sampler
注意:需要为Sampler安装libasound2-dev系统库用以播放触发器声音。通常库已安装在相应位置,但如果没有 – 你可以使用你习惯的包管理器进行安装,例如apt install libasound2-dev
Windows(实验)
建议在高级控制台模拟器下使用,如Cmder
Download .exe
使用
指定shell命令,Sampler会相应的速率执行这些命令。输出用于可视化。
使用Sampler基本上的三步过程:
在YAML配置文件中定义shell命令
运行sampler -c config.yml
在UI上调整组件大小和位置
市面早已有许多监控系统
Sampler绝不是监控系统的替代品,而是易于设置的开发工具。
如果spinning up和使用Grafana配置Prometheus是完全多余的任务,那么Sampler可能是正确的解决方案。没有服务器,没有数据库,不需要部署 – 你指定了shell命令,它就可以工作了。
我监控的每台服务器上都需要安装吗?
不,你可以在本地运行Sampler,但仍然可以从多台远程计算机上收集遥测数据。任何可视化都可能具有init命令,你可以在其中ssh到远程服务器。请参阅SSH example
组件
以下是每种组件类型的配置示例列表,其中包含与macOS兼容的采样脚本。
Runchart
微信图片_20201007214228.jpg
runcharts:, @$ i: T) x( s  h5 \  O, ]
  - title: Search engine response time
4 f6 h3 p+ ~, L) C+ Q! @0 n    rate-ms: 500        # sampling rate, default = 1000
" H9 [% i; u! B# k3 L    scale: 2            # number of digits after sample decimal point, default = 1) u( G2 E- `8 F1 m
    legend:
8 H! U9 \; W# v& U  v+ ~# }      enabled: true     # enables item labels, default = true3 g" ?% i/ J4 ?
      details: false    # enables item statistics: cur/min/max/dlt values, default = true
6 p( o: ^: P; {9 J2 ?* q    items:1 z1 N4 E, X2 ?" r0 z$ I4 g
      - label: GOOGLE. O" K4 U, c8 e2 V0 H  k; g5 a1 G4 W0 }4 R
        sample: curl -o /dev/null -s -w '%{time_total}'  https://www.google.com
5 P$ ?2 {+ ?/ p        color: 178      # 8-bit color number, default one is chosen from a pre-defined palette1 P+ O" E& z3 B
      - label: YAHOO0 E" Q' L' Z3 [
        sample: curl -o /dev/null -s -w '%{time_total}'  https://search.yahoo.com
/ Q! V! r8 p* I2 }7 w      - label: BING
$ T( O* l) y* q4 ]3 E0 P6 g" r        sample: curl -o /dev/null -s -w '%{time_total}'  https://www.bing.com

; ?* g& w  z8 ~4 s  u* Y4 w; \& V8 h+ b* U

! `4 Q( `! c# q& g7 z/ ^0 A" lSparkline
微信图片_20201007214231.jpg
sparklines:! _: E' Q$ @* m, C
  - title: CPU usage0 i% c; b; A  r8 o. k
    rate-ms: 200
# z+ Z+ I7 t+ ~, D4 ^    scale: 0& s8 g9 L; \) t4 ]) l
    sample: ps -A -o %cpu | awk '{s+=$1} END {print s}'
% N6 u1 u& ?5 [3 G! y  - title: Free memory pages7 q3 Y$ C* \+ u& P
    rate-ms: 2003 k# e  |4 r# ?2 O- ?
    scale: 0: j& _1 U5 N" F; a7 @
    sample: memory_pressure | grep 'Pages free' | awk '{print $3}'
/ [7 j9 R# Q- U9 v7 {
$ \3 ~. B2 Z$ J4 @4 j: j9 K
2 j  E& p; O% e' X, v# k0 o
Barchart
微信图片_20201007214234.jpg
barcharts:. b. s# Y! m9 q
  - title: Local network activity1 l0 ~7 q5 A$ q$ W; R# {0 D
    rate-ms: 500        # sampling rate, default = 1000! V# Z/ m* I, f+ t2 X
    scale: 0            # number of digits after sample decimal point, default = 1% p4 L) A7 q/ A; g/ j
    items:
  b! A* q7 H9 b" t) C      - label: UDP bytes in9 S( J- r6 w0 M& \  A, z' b. B; U
        sample: nettop -J bytes_in -l 1 -m udp | awk '{sum += $4} END {print sum}'
# N( F( k( `( e- R! l      - label: UDP bytes out* V0 I6 E( @: G4 s/ g8 e& F. i* a
        sample: nettop -J bytes_out -l 1 -m udp | awk '{sum += $4} END {print sum}'
+ m$ K% G5 G0 ^+ V$ l: A( E0 w      - label: TCP bytes in2 r' B1 p$ k. N+ {' L; p
        sample: nettop -J bytes_in -l 1 -m tcp | awk '{sum += $4} END {print sum}'
0 \5 x- F1 y3 j, H+ C      - label: TCP bytes out
1 K- k/ u% _: B        sample: nettop -J bytes_out -l 1 -m tcp | awk '{sum += $4} END {print sum}'
# ]+ d7 r! }- k3 t2 K5 h5 g
9 z: l8 S' J7 L) }& ]
: v! ^) u% P! U
Gauge
微信图片_20201007214238.jpg
gauges:
8 V& Z  h: E- w+ w# `( h6 {; x, y  - title: Minute progress3 r0 v0 G6 x. v: v3 j
    rate-ms: 500        # sampling rate, default = 1000
8 L- L' _/ L  b5 Y  O# r3 \    scale: 2            # number of digits after sample decimal point, default = 13 p& u3 {# u& q6 o7 k8 F
    percent-only: false # toggle display of the current value, default = false
3 B7 U0 {. H3 h" y6 U3 M! A: Q    color: 178          # 8-bit color number, default one is chosen from a pre-defined palette% z, R' P) Q# a7 e  H3 f8 B  U  {) B
    cur:# ]( W. q2 s, @( }
      sample: date +%S  # sample script for current value2 C9 H$ ?, X0 j
    max:
& z3 |+ L" g$ d$ X      sample: echo 60   # sample script for max value
7 F2 P# q% t8 l+ k; V    min:
/ s" Q) S- q: E      sample: echo 0    # sample script for min value
' F' c9 z& U) q8 V/ |! l  - title: Year progress' z( b- R6 M1 r8 K1 Q; R- E( a
    cur:
( e, E" n. O' f- r& z      sample: date +%j! \1 E% S% F+ C% @8 W! E
    max:$ z* f4 A& @+ @; \) d' B2 o
      sample: echo 365
& Q2 f% M$ @/ ]( d8 L! N* S    min:
! S- F. @9 B& T, ?      sample: echo 0

. C5 {) ~0 i+ M1 F4 L4 A
* X# k) L( J: k& N" H; K# x
1 ~; Q5 N+ z# L, q2 l# e
Textbox
微信图片_20201007214241.jpg
textboxes:
- ]* G# w& M" U% A, F  - title: Local weather
; x* i- ^7 S8 N+ ?- \* D) H- n    rate-ms: 10000      # sampling rate, default = 1000
8 P5 t8 k% e8 u/ j6 Q5 V' b% C    sample: curl wttr.in?0ATQF0 u$ N+ o" j; C/ W2 T0 x
    border: false       # border around the item, default = true4 A- d$ h- u5 o; e( B' {1 _8 N- x
    color: 178          # 8-bit color number, default is white, n+ _" w0 B8 Y" l1 l# d8 w7 T) h
  - title: Docker containers stats) A3 i) u3 N1 _9 k( r' w
    rate-ms: 500; T6 e5 ^: G2 k0 n$ M& s% s9 A
    sample: docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.PIDs}}"

7 S* c8 V9 P# N8 j
% Y$ d2 {  y1 w  ~7 V' A) X% v
$ k5 q1 K/ B$ O% P, r& O: E
Asciibox
微信图片_20201007214245.jpg
asciiboxes:
, a: x+ u+ l' p  - title: UTC time/ x; n# N/ e3 N8 Y- T
    rate-ms: 500        # sampling rate, default = 10007 A' L* |/ \* X- ]) o$ u! ?
    font: 3d            # font type, default = 2d
3 e( K% j) Q8 o4 U4 d; v- y! g    border: false       # border around the item, default = true    $ I: g7 l; P; s* P( m% m, w- g7 Q
    color: 43           # 8-bit color number, default is white
" E& w8 f7 q; ]4 Z8 k    sample: env TZ=UTC date +%r
额外功能
* y2 \9 j. [/ s$ _- g3 {, h% V) b5 U4 I1 t* ^6 `
8 }, _" H1 q6 ^
Triggers9 h* G' G% c2 w$ [% o4 b# u6 x
触发器允许执行条件操作,如视觉/声音告警或任意shell命令。以下示例说明了此概念。
Clock gauge,从开始的每分钟显示时间进度和当前时间
gauges:* M1 E, ~  u1 h6 q) c
  - title: MINUTE PROGRESS
. l2 U% Y6 v8 \; L2 ?/ x    position: [[0, 18], [80, 0]]  
, W) ?! @; G9 C. \, J$ Z* w) B! F    cur:
$ m- f; j( d: f5 w7 i9 t& G      sample: date +%S
, K2 K4 D$ f, O) g5 O' c! P1 @2 ?    max:& |# D" R1 F% y7 U4 i
      sample: echo 601 G5 @" W& p: e# r) I& x
    min:# g' S7 Y# k8 ?& v5 Y8 j
      sample: echo 0
( Q4 [$ `4 b! N- p6 z    triggers:, v: N/ ^! O9 b
      - title: CLOCK BELL EVERY MINUTE% d. K* N; x# h& N
        condition: '[ $label == "cur" ] && [ $cur -eq 0 ] && echo 1 || echo 0'  # expects "1" as TRUE indicator
; z( [7 Q6 T% F" ^        actions:+ l! g+ ~3 R  v5 |
          terminal-bell: true  # standard terminal bell, default = false
2 B0 S; f+ s  H          sound: true    # NASA quindar tone, default = false
' f) w  v, o8 i. p9 }; k          visual: false  # notification with current value on top of the component area, default = false
1 J2 k5 A! u, p/ p          script: say -v samantha `date +%I:%M%p`  # an arbitrary script, which can use $cur, $prev and $label variables
9 c9 V/ ]/ F% g3 j2 r
搜索引擎延迟图表,在延迟超过阈值时向用户发出告警
runcharts:* c; {; L& N3 n" m( H, N
  - title: SEARCH ENGINE RESPONSE TIME (sec)' }  `5 P* j4 Z! X7 v- j& i
    rate-ms: 200
- B) G* |( G+ x0 D    items:4 x+ _: S( I3 u& v' Y
      - label: GOOGLE7 H0 M2 t1 U  l# C* F% B
        sample: curl -o /dev/null -s -w '%{time_total}'  https://www.google.com
, l. Y  w- d6 U/ W8 h# {2 y; G0 d      - label: YAHOO
& c0 n2 h4 }6 I1 b2 y; a        sample: curl -o /dev/null -s -w '%{time_total}'  https://search.yahoo.com     
- w( h5 Q% ^5 E+ c0 _% ~" k' F; H9 h    triggers:
5 ~+ \# ~: s' ]3 J2 [$ c      - title: Latency threshold exceeded
& h+ F0 S( \9 m        condition: echo "$prev < 0.3 && $cur > 0.3" |bc -l  # expects "1" as TRUE indicator
! B4 f* t" P; L3 w: R/ K        actions:8 p$ [7 k# b, r# A% _. W( H) n
          terminal-bell: true  # standard terminal bell, default = false8 I# F5 i; s2 o' q- C
          sound: true   # NASA quindar tone, default = false3 Y" m" }3 U! D) A4 ^
          visual: true  # visual notification on top of the component area, default = false& i2 J# u; s* ]4 v7 u/ Q
          script: 'say alert: ${label} latency exceeded ${cur} second' # an arbitrary script, which can use $cur, $prev and $label variables

  _) w; H+ C: C6 o
  {* `2 M6 v4 [" j$ t% p& O
3 y- F' W6 X2 N( Q$ V& j
交互式 shell 支持
除了sample命令之外,还可以指定init命令(在采样前仅执行一次)和transform命令(后处理采样命令输出)。这包括交互式shell用例,例如仅建立与数据库的连接一次,然后在交互式shell会话中执行轮询。
$ z- h9 h( N  {$ Q2 r5 g0 D1 F
Basic mode
9 Z8 _" n5 V8 |5 D% Xtextboxes:' C3 }- Z) s. Z, x7 ^2 i( {
  - title: MongoDB polling6 I! s4 N( Q+ j4 `/ }: f0 _
    rate-ms: 500
+ F- `' P( i$ j    init: mongo --quiet --host=localhost test # executes only once to start the interactive session
$ c  d- X/ m) u2 _' g: Z    sample: Date.now();                       # executes with a required rate, in scope of the interactive session7 q0 P; z7 U; {* c9 n# W! O: u
    transform: echo result = $sample          # executes in scope of local session, $sample variable is available for transformation
- T7 J( @5 @2 k: t8 n
' |& m5 t3 U( R2 K* }4 E
1 |0 N" i7 L1 F2 r0 K* J6 D
PTY mode
在某些情况下,交互式shell将无法工作,因为它的stdin不是终端。这种情况下我们可以使用PTY模式:
textboxes:
+ `: s# T0 p1 V2 p  - title: Neo4j polling: C) w2 A; S9 F$ h' W/ I( X, v6 p. A
    pty: true  # enables pseudo-terminal mode, default = false2 ?& f& ^1 {! d, {
    init: cypher-shell -u neo4j -p pwd --format plain7 K) y8 Q, j) z
    sample: RETURN rand();
; K1 u! i& B: |    transform: echo "$sample" | tail -n 1' H# Z9 F! W9 A
  - title: Top on a remote server
4 L& n7 [3 C6 u  h5 i7 s2 X: S) Z    pty: true  # enables pseudo-terminal mode, default = false( D. b7 t  A" E3 d
    init: ssh -i ~/user.pem ec2-user@1.2.3.4
. a$ m4 d! \# @% c    sample: top
. u5 e. g; u+ z2 j$ q

' k+ \$ D- \" G; b) K1 A0 @# s
- U/ X9 Z* r6 F+ T% l
init 命令逐步执行
在开始采样之前,还可以逐个执行多个init命令。
textboxes:
) o$ E8 H; s( N0 R, W) u  - title: Java application uptime
8 p4 R7 A  Q2 L, B: ^, F; V) l+ f    multistep-init:7 I% _+ @- E9 N
      - java -jar jmxterm-1.0.0-uber.jar
, a1 m, u3 f8 _4 M1 a- _. P( D      - open host:port # or local PID- K9 b/ h) d! E+ Z: z+ ~' X( m
      - bean java.lang:type=Runtime8 x( G; F! v& G- b8 X7 I- X( p4 s
    sample: get Uptime

6 a( Q" |: Q: b6 N& r6 u- Q2 q/ Z( f. d6 ~* t8 w: n* U
7 D" I: @$ x% g
变量
如果配置文件包含重复的模式,则可以将它们提取到变量部分。此外,还可以在启动时使用-v/–variable标志指定变量,并且任意的系统环境变量也可以在脚本中使用。
variables:
4 M4 m: f6 t+ ^; r; r; [1 ~    mongoconnection: mongo --quiet --host=localhost test* s! O& ~1 m* V$ F2 W* m
barcharts:
3 I  S* e% _- Y8 T" T4 S" M  - title: MongoDB documents by status* Z: Y4 ^$ c5 W/ h: {- W
    items:
+ B+ L" N) E' o# y( L      - label: IN_PROGRESS
% C$ ~3 N" s& Y5 b        init: $mongoconnection
6 C/ C& {# ?' m+ ]        sample: db.getCollection('events').find({status:'IN_PROGRESS'}).count()3 u0 w. \3 Q' a1 O' A4 y
      - label: SUCCESS
" d7 v6 s9 M. w* e        init: $mongoconnection
( v9 T$ I4 y5 p% x+ m4 ?  Z        sample: db.getCollection('events').find({status:'SUCCESS'}).count()- b; ]5 ^8 [( o/ i
      - label: FAIL  n, S% J" P% L0 T
        init: $mongoconnection. P. `& {3 e) x/ t" W/ p! E* C
        sample: db.getCollection('events').find({status:'FAIL'}).count()

; a9 G2 B' Z2 O: c4 W9 N5 v! w
% i4 x; S# i8 A
/ x3 Y4 t6 K( ]& v/ n! Z
颜色主题
微信图片_20201007214247.jpg
theme: light # default = dark& o% ^2 A: N% v6 H2 r4 J& U
sparklines:! F! ~" U: o! }- R
  - title: CPU usage
# p" X" G' L# P5 S; C; v    sample: ps -A -o %cpu | awk '{s+=$1} END {print s}'
真实场景
6 o1 f2 I! j* C8 [$ \- G/ c
; l! z3 D6 h  r+ @% d  d  _
5 E- @# n% H' o  W4 d# v
数据库
以下是不同的数据库连接示例。建议使用交互式shell(init脚本)仅建立一次连接,然后在采样期间重用即可。

( V) X; J5 H& e. i* B9 r
MySQL) M6 g. R  p8 k0 x& c6 [
# prerequisite: installed mysql shell
) g! B0 X3 W+ E+ c( avariables:
0 Q4 A8 D' `2 N9 A, G7 R  mysql_connection: mysql -u root -s --database mysql --skip-column-names3 z. k- T8 ^% f
sparklines:  
3 v. u" k; K) m  e  - title: MySQL (random number example)
1 ^0 c3 l$ E+ W9 d* @! x8 q    pty: true
! `& ^/ F0 ?8 Z: N# B    init: $mysql_connection/ g" h% Z# T: J- }) \' Y. N
    sample: select rand();

1 o  g0 C' I& J' }' A% K1 G! l- h- G
6 |4 S' j2 Q* M& t
PostgreSQL
5 R: R4 l4 X7 t# prerequisite: installed psql shell$ i, `, S7 Z8 _0 z
variables:+ Q4 D7 _- u7 y6 B% D
  PGPASSWORD: pwd
; ]5 Z2 [2 U' r3 B  postgres_connection: psql -h localhost -U postgres --no-align --tuples-only
: k( k- r4 U% c7 g: tsparklines:* x) m0 o0 D5 ]" C! V9 ^' Z- U  N
  - title: PostgreSQL (random number example)
/ B# |' `1 l& ]    init: $postgres_connection
. S1 K2 A8 B8 ~8 K/ `& x! }    sample: select random();
9 O* V7 w/ I! h( g( g
3 s, Q. h$ M  v
0 U, {/ w4 W8 w
MongoDB
& J; i- a) u# @* Z  s* e; G8 q# prerequisite: installed mongo shell- T% ?: z  e  N3 i% q
variables:& m; X9 k% m2 k9 F1 n" a
  mongo_connection: mongo --quiet --host=localhost test
+ l% [9 Y+ O" l2 Y" A& r3 [: fsparklines:7 _; O9 f. h( S2 }5 V/ Q
  - title: MongoDB (random number example); P2 y) [3 N4 q' _' a3 ~3 ~
    init: $mongo_connection
# d) W& N3 Z0 z+ p    sample: Math.random();

9 d  S/ u# x6 q- X0 \( ^* r: B( ?
2 k0 E5 H( r8 _! R  q4 v

7 V0 ?; u8 Q% u5 s" V6 e8 WNeo4j
; L" `( i& F: n/ J# prerequisite: installed cypher shell
9 [* D8 K  x& t5 \- g+ evariables:
" X1 \: n. q3 U9 F  `7 K# |+ }9 h  neo4j_connection: cypher-shell -u neo4j -p pwd --format plain
4 z/ S8 a, g" }+ j- U+ ?0 M/ asparklines:
$ s* }! R1 N# S* d" c4 a  - title: Neo4j (random number example)# f3 U3 C/ M+ `0 n5 \/ Q" a
    pty: true; V, [- D, _8 v' R5 ]- {2 T$ v9 |
    init: $neo4j_connection
: A# M2 U3 J7 Z& f/ V    sample: RETURN rand();9 w! n/ u9 m3 c# [, t
    transform: echo "$sample" | tail -n 1
/ A; I* R% I. r

' ^& t2 R5 o) c& d, K3 y* G5 o  s

/ f; R4 v- ?% ~" a6 w( tKafka
检查kafka lag值,计算每个队列lag值的和,高于阈值报警,多consumergroup,多topic。
variables:4 D5 L4 I  H; D3 x6 B7 P  w* D. p
  kafka_connection: $KAFKA_HOME/bin/kafka-consumer-groups --bootstrap-server localhost:9092
$ v9 N: ^2 l( r. Mruncharts:$ l% [7 o% U/ o
  - title: Kafka lag per consumer group
( W" i* ~6 S4 V& s    rate-ms: 5000$ \. o( \" Y# d0 Z5 ~, k) P3 N
    scale: 0! Z3 A( k- X) v: U
    items:3 O& |; a3 @, {4 u5 b
      - label: A->B
" ~- f! P# l; Y* v8 ~5 L        sample: $kafka_connection --group group_a --describe | awk 'NR>1 {sum += $5} END {print sum}'
, i' N1 e- b' F, L9 C/ [      - label: B->C
1 @0 i4 d! B9 \0 x5 `1 C        sample: $kafka_connection --group group_b --describe | awk 'NR>1 {sum += $5} END {print sum}'2 r' p3 Z, ?! H* ?1 W
      - label: C->D
$ R( Z% s+ u2 T# Q! @        sample: $kafka_connection --group group_c --describe | awk 'NR>1 {sum += $5} END {print sum}'
3 l6 {/ L; Z  e4 [7 p0 A% ~0 |

  M' ?# p' n, A' L7 w8 _' h/ n0 [

/ a" D, R+ `( ADocker
Docker容器统计信息(CPU,MEM,O/I)
textboxes:
( {+ V, v% z. P1 l0 X; B5 N2 R  - title: Docker containers stats% s: Q4 ]: p" Z( y; x$ P( T9 |
    sample: docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}\t{{.PIDs}}"
; B& _. h5 n$ P0 w6 r" N# B( n# u
) S  ^9 N+ E- d0 T3 M
% R1 ^$ }6 Y4 s, i" o: Q5 \
SSH
远程服务器上的TOP命令
variables:  N9 M! N, e: Z2 b2 U) M) E2 I
  sshconnection: ssh -i ~/my-key-pair.pem ec2-user@1.2.3.4
) ?! r: L9 J' }- P2 f5 stextboxes:
, [. s$ x  V" A; [  - title: SSH( ~% P% Y! }' M  m+ ~1 k
    pty: true. z) q) P! O. A: s0 D
    init: $sshconnection$ K8 w3 |3 x' Y1 b' {
    sample: top
& X- u( J; s- v" d+ i# c# H; G

9 d8 }# |: u2 ~
9 I, E3 q0 G& r) a
JMX
Java应用程序的正常运行示例
# prerequisite: download [jmxterm jar file](https://docs.cyclopsgroup.org/jmxterm)1 v6 G& w3 [( ^2 }7 U
textboxes:  B4 f* I8 z4 J7 m
  - title: Java application uptime
: r9 k$ \. z, H) s8 D) n    multistep-init:
' w* `2 R+ E$ P+ P0 v  d) A      - java -jar jmxterm-1.0.0-uber.jar
! _  N7 k4 H1 i      - open host:port # or local PID
! D" t: f! g. [* g: P- b$ y( @2 o      - bean java.lang:type=Runtime
/ Q2 s3 X  q3 J* I/ [9 s: k    sample: get Uptime
9 ?& e+ `+ x4 Y7 u. v    transform: echo $sample | tr -dc '0-9' | awk '{printf "%.1f min", $1/1000/60}'

6 B' P7 ~9 d. G5 s' A0 d4 k9 C5 V, _+ o8 V7 H2 Q
赞 收藏 评论0 发布时间:2020-10-7 21:45

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版