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

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

[复制链接]
gaosmile 发布时间:2020-10-19 16:40
Sampler是一个用于shell命令执行,可视化和告警的工具。其配置使用的是一个简单的YAML文件。
1、为什么我需要它?
你可以直接从终端对任意动态进程进行采样 – 观察数据库中的更改,监控MQ动态消息(in-flight messages),触发部署脚本并在完成后获取通知。
如果有一种方法可以使用shell命令获取指标(metric),那么可以使用Sampler立即对其进行可视化。
2、安装macOSbrew cask install sampler
! W+ u) Q, y4 [! ~
或' {4 ^3 g) k8 Q7 M3 i
sudo curl -Lo /usr/local/bin/sampler https://github.com/sqshq/sampler ... -1.0.3-darwin-amd64
  e. Z3 g' G6 K9 `sudo chmod +x /usr/local/bin/sampler
4 f2 i% B: h8 e7 U
2 Z$ M  D# ?5 L  ?
% V% R$ ?  \' U9 [2 I
Linux8 X* v& }6 c0 n, w# H9 `
  l2 Z& |* p) E

8 v4 b  o* N$ x' wsudo wget https://github.com/sqshq/sampler ... r-1.0.3-linux-amd64 -O /usr/local/bin/sampler
6 Q- w' K* h# F7 vsudo chmod +x /usr/local/bin/sampler
注意:需要为Sampler安装libasound2-dev系统库用以播放触发器声音。通常库已安装在相应位置,但如果没有 – 你可以使用你习惯的包管理器进行安装,例如apt install libasound2-dev
Windows(实验)
建议在高级控制台模拟器下使用,如Cmder
Download .exe
3、使用
指定shell命令,Sampler会相应的速率执行这些命令。输出用于可视化。
使用Sampler基本上的三步过程:
在YAML配置文件中定义shell命令
运行sampler -c config.yml
在UI上调整组件大小和位置
市面早已有许多监控系统
Sampler绝不是监控系统的替代品,而是易于设置的开发工具。
如果spinning up和使用Grafana配置Prometheus是完全多余的任务,那么Sampler可能是正确的解决方案。没有服务器,没有数据库,不需要部署 – 你指定了shell命令,它就可以工作了。
我监控的每台服务器上都需要安装吗?
不,你可以在本地运行Sampler,但仍然可以从多台远程计算机上收集遥测数据。任何可视化都可能具有init命令,你可以在其中ssh到远程服务器。请参阅SSH example
4、组件
以下是每种组件类型的配置示例列表,其中包含与macOS兼容的采样脚本。
Runchart
微信图片_20201019164119.jpg
runcharts:. u# w2 h5 R% V5 p; s0 @, u' Q' @
  - title: Search engine response time
/ E1 W1 N6 q6 `. X7 E7 G( W    rate-ms: 500        # sampling rate, default = 1000( j, |& R2 b. {* A9 g
    scale: 2            # number of digits after sample decimal point, default = 1, y. _# D4 B  O2 ?  Z$ u
    legend:
* v3 @% n" V1 G* j( R' p! j      enabled: true     # enables item labels, default = true
. I- D$ A9 q0 k( Z  `      details: false    # enables item statistics: cur/min/max/dlt values, default = true
' K# i. @3 \# o) v    items:
  x3 m( G$ D1 n7 S; w( d      - label: GOOGLE3 x* ^) w  p9 I6 e
        sample: curl -o /dev/null -s -w '%{time_total}'  https://www.google.com1 g' A3 b2 w: U+ w# X
        color: 178      # 8-bit color number, default one is chosen from a pre-defined palette
1 }+ N" x2 X' m: B      - label: YAHOO8 R3 Y) B: p* |; h( {" a
        sample: curl -o /dev/null -s -w '%{time_total}'  https://search.yahoo.com  ^! o9 q2 F% m% R* `# \
      - label: BING
8 C/ |8 T4 {4 P1 E  m1 c6 [8 q1 i        sample: curl -o /dev/null -s -w '%{time_total}'  https://www.bing.com

/ I$ {3 L/ Q4 w5 c, f
; \* `$ L' O( f- F/ o2 i$ [

9 n4 `' [8 @" ^Sparkline
微信图片_20201019164122.jpg
sparklines:. i3 V2 u. i0 z, N& Z* \+ M2 u9 \
  - title: CPU usage
8 @) y' w( _0 a& c! e    rate-ms: 200
, e" H6 D+ l6 Q: F    scale: 05 I" p1 P2 V1 ?
    sample: ps -A -o %cpu | awk '{s+=$1} END {print s}'4 y& K& w3 p" P9 X
  - title: Free memory pages* q6 i2 S" e% X; r* n  c2 s5 p
    rate-ms: 200. i0 A" U3 U: k* y& K
    scale: 0) B: x5 H% `9 z7 P6 M
    sample: memory_pressure | grep 'Pages free' | awk '{print $3}'

+ D+ m: P+ N- M. e0 p2 a6 [" ^+ J0 F) q2 u, X0 H2 |: h! i' ?+ i

. Z1 n+ m4 a8 h4 R9 Y3 gBarchart
微信图片_20201019164126.jpg
barcharts:
. `7 A+ _  q, i3 e0 w* Y  - title: Local network activity
5 r& Z# k+ Q0 o/ Y" t    rate-ms: 500        # sampling rate, default = 1000/ L5 I1 w1 ?3 z- K8 O5 ~3 ]" p2 D8 m
    scale: 0            # number of digits after sample decimal point, default = 1( x5 y$ m1 p* p$ f1 |' ~; K) J5 P# G
    items:$ u! ]8 ?2 ^$ Q+ g) w
      - label: UDP bytes in
# U5 Z5 ?- U) ]" \5 ^9 J1 b        sample: nettop -J bytes_in -l 1 -m udp | awk '{sum += $4} END {print sum}'3 K6 o2 \* T/ [& ~" e( L1 `
      - label: UDP bytes out
# q& r* B1 |* H0 A! P# y( R        sample: nettop -J bytes_out -l 1 -m udp | awk '{sum += $4} END {print sum}'6 v, @& T% _( ^
      - label: TCP bytes in4 R: p; ~2 u- C2 C
        sample: nettop -J bytes_in -l 1 -m tcp | awk '{sum += $4} END {print sum}'
/ `* \6 e! }* J      - label: TCP bytes out
6 A4 I! E" C0 c2 {4 C. R        sample: nettop -J bytes_out -l 1 -m tcp | awk '{sum += $4} END {print sum}'

0 p) r  x  W3 `* s$ v7 [8 e" L& t) i4 ^

- U& p  t* d4 ?8 d3 WGauge
微信图片_20201019164129.jpg
gauges:3 R2 ?' ^8 o; D% D
  - title: Minute progress6 z! }$ O4 v1 Y4 a2 c1 M& L
    rate-ms: 500        # sampling rate, default = 1000
- j% }" d! Z6 [+ M/ j  a    scale: 2            # number of digits after sample decimal point, default = 10 C* C& I* |6 b, U3 m. S5 n3 g
    percent-only: false # toggle display of the current value, default = false8 g1 Q: I% r# `- T* }3 d! W" x
    color: 178          # 8-bit color number, default one is chosen from a pre-defined palette# n, p+ P6 H: H" J( @
    cur:1 R" }1 K3 c; V2 Y
      sample: date +%S  # sample script for current value0 h  q' a! j5 _4 e4 M
    max:
( n3 k* u! P  [7 o* Q      sample: echo 60   # sample script for max value) v4 h+ [# T2 M" q4 N6 _! _, _6 o
    min:
! F: S/ f- O* t2 n1 Q. W0 w7 l' J* v      sample: echo 0    # sample script for min value# n% w& j& \& \5 J; `. A
  - title: Year progress) ~  D4 F- x8 I' V. b% V' d$ o, o
    cur:3 I) O2 z) i# o  Z2 ^
      sample: date +%j, c, x/ `9 i- x/ `3 @
    max:
; ^. e, z  K+ x( W3 ]      sample: echo 365# Z3 k6 a/ j+ e7 _2 o' v) ~. N
    min:
+ z% f" r' S8 g' w( v      sample: echo 0
Textbox
微信图片_20201019164132.jpg
textboxes:
: |/ |6 H* |* s  - title: Local weather
' W# ]3 x. p' P% q& Y6 I6 I, r    rate-ms: 10000      # sampling rate, default = 10008 ^0 `5 y, _/ {2 }& _- n) A
    sample: curl wttr.in?0ATQF# A# D$ G7 [' l3 J
    border: false       # border around the item, default = true
6 w3 T1 n' a+ H- F& `0 ]    color: 178          # 8-bit color number, default is white0 t1 s) t+ H6 T
  - title: Docker containers stats
9 [( Z3 T7 G; \* g! [    rate-ms: 500
* p, y' U( A7 e& L    sample: docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.PIDs}}"
4 o* C9 R! w5 m* O  |2 a8 ]

( L. b/ M1 g' Q! ~8 ]: @& R
6 m* F) }$ T7 u6 t6 ^
Asciibox
微信图片_20201019164135.jpg
asciiboxes:1 l: Y# v8 Q7 m" ]; {2 y. r+ F
  - title: UTC time
5 k$ @8 i2 q# p) v' r$ ?    rate-ms: 500        # sampling rate, default = 1000
  u9 _* Z/ a8 b0 Q3 F" K3 q    font: 3d            # font type, default = 2d
  ~8 C. |( b' S    border: false       # border around the item, default = true   
+ E3 U- `! j  }- H1 d/ j    color: 43           # 8-bit color number, default is white% ^# Q1 ~  `. P( u5 T
    sample: env TZ=UTC date +%r

0 m/ G, y- x) m) A# v
5、额外功能
1 v$ F; d5 ]8 R8 j  ETriggers
2 R; O: a) f" e; U$ U" x4 x) g
触发器允许执行条件操作,如视觉/声音告警或任意shell命令。以下示例说明了此概念。
Clock gauge,从开始的每分钟显示时间进度和当前时间
gauges:, e. Z4 Y0 N0 N& U6 Z
  - title: MINUTE PROGRESS$ ]5 e& A0 j7 g( B6 Q
    position: [[0, 18], [80, 0]]  
& I' a$ j8 E' r# J    cur:
& h! }8 d! O2 J9 K  ?2 t      sample: date +%S
, N) G. U* c# B& R$ I7 ~    max:9 c6 [' E1 D4 E. P' I9 F" v
      sample: echo 60* c5 ^+ Z3 N/ P- s5 z
    min:
% @  q& r+ w: ~( j6 c. \      sample: echo 0% Z8 |3 X" x' B+ B+ }' k
    triggers:
, ]( k+ R; e# |      - title: CLOCK BELL EVERY MINUTE
# r$ Z6 w+ {  W        condition: '[ $label == "cur" ] && [ $cur -eq 0 ] && echo 1 || echo 0'  # expects "1" as TRUE indicator! a- l3 s8 u1 w( m
        actions:
! }! t5 B/ ?/ ^1 v( h0 _          terminal-bell: true  # standard terminal bell, default = false. X/ L$ J& ]7 g2 D: Q
          sound: true    # NASA quindar tone, default = false
4 x  |5 j, y0 b& G7 s! `# Z          visual: false  # notification with current value on top of the component area, default = false
: F" \+ @1 F* V          script: say -v samantha `date +%I:%M%p`  # an arbitrary script, which can use $cur, $prev and $label variables
+ K' C1 g3 l6 v# v1 f) }
搜索引擎延迟图表,在延迟超过阈值时向用户发出告警
runcharts:) ~2 b7 P) J" Q, m
  - title: SEARCH ENGINE RESPONSE TIME (sec)
( l+ k2 m/ B& p/ z6 |5 E7 {) N    rate-ms: 200" v8 f- [. ?; w- n) B" {0 S* e
    items:/ L& e: f4 {. \. V) G8 m$ M
      - label: GOOGLE
4 P8 s- |- |% q. E5 E3 p3 Z+ v        sample: curl -o /dev/null -s -w '%{time_total}'  https://www.google.com
, j9 C# q& t0 @) m, z      - label: YAHOO- G' G9 v5 [. P  ]
        sample: curl -o /dev/null -s -w '%{time_total}'  https://search.yahoo.com     5 {2 R* D6 a  R4 O9 p" ]( _
    triggers:* U+ Q. M2 Y% t0 d) l' D. `) _
      - title: Latency threshold exceeded& K$ S1 c: }7 e2 H$ v( o, p4 T
        condition: echo "$prev < 0.3 && $cur > 0.3" |bc -l  # expects "1" as TRUE indicator
% Y1 c; \& w8 T, Y$ D& E/ D, A        actions:
! H5 l! u" p4 s/ F          terminal-bell: true  # standard terminal bell, default = false
. z5 _8 K: f/ [! O0 {$ ]          sound: true   # NASA quindar tone, default = false
# U. q, M. K4 S5 S          visual: true  # visual notification on top of the component area, default = false
& {( p& ?9 c( M          script: 'say alert: ${label} latency exceeded ${cur} second' # an arbitrary script, which can use $cur, $prev and $label variables
* y+ B2 ~6 p0 a( L: t0 \- [) Q! [

# O7 P, u+ E& a" G

4 Q9 Z7 a7 H  ~% D$ T6 W7 y交互式 shell 支持
除了sample命令之外,还可以指定init命令(在采样前仅执行一次)和transform命令(后处理采样命令输出)。这包括交互式shell用例,例如仅建立与数据库的连接一次,然后在交互式shell会话中执行轮询。
Basic mode/ H( w2 e% b$ t4 d2 q
textboxes:* z" {3 {5 Y% P* {- P0 K* Z
  - title: MongoDB polling# y$ I7 I' \- o" M6 L' V
    rate-ms: 5008 L$ B& Z) F1 [- ]' ?) q9 W
    init: mongo --quiet --host=localhost test # executes only once to start the interactive session# N( J$ C& D  @
    sample: Date.now();                       # executes with a required rate, in scope of the interactive session/ O- L1 D$ d1 D
    transform: echo result = $sample          # executes in scope of local session, $sample variable is available for transformation

# V3 f0 {4 ^' Q8 P) S  D+ zPTY mode
在某些情况下,交互式shell将无法工作,因为它的stdin不是终端。这种情况下我们可以使用PTY模式:
textboxes:  |3 O# |- f, |# l' d! S: e7 x
  - title: Neo4j polling
- x7 b; g) q+ z/ B" j3 U5 m# F9 p    pty: true  # enables pseudo-terminal mode, default = false( X* Q$ x. x( _2 f
    init: cypher-shell -u neo4j -p pwd --format plain
; R2 l8 i. \' \9 H    sample: RETURN rand();
1 ~9 N7 t' ?+ t& o; s4 B9 M+ I0 |! s    transform: echo "$sample" | tail -n 1* h1 H6 x) q' k
  - title: Top on a remote server
0 d& R7 b# \1 u  V$ E: o+ Q    pty: true  # enables pseudo-terminal mode, default = false+ y4 R) [$ n. ~: p5 l# A1 C
    init: ssh -i ~/user.pem ec2-user@1.2.3.4
; Z! d4 I! N& s' I! x, k    sample: top
! b  ]. K5 n5 u. j6 V
8 F; `8 K' _- g: |7 {5 E. o! w
! L- X0 V& k' b( K! R( k
init 命令逐步执行
在开始采样之前,还可以逐个执行多个init命令。
textboxes:& A# @: f" ]" }9 o7 E; V
  - title: Java application uptime
' I! D, B0 U  K" n- R    multistep-init:& v% \; i/ ?$ f. _1 ~' x
      - java -jar jmxterm-1.0.0-uber.jar
- M3 e6 a/ C( d9 X$ T      - open host:port # or local PID
7 R  }0 \) A8 |5 e# W/ ?7 ~0 c      - bean java.lang:type=Runtime1 D$ h* S- N3 C
    sample: get Uptime

  H- D  o7 r6 T4 T: m4 H7 @% ]; E# z8 b' A% H

. F% _4 z$ f7 W3 m) K; E+ d- H: h; x  [变量
如果配置文件包含重复的模式,则可以将它们提取到变量部分。此外,还可以在启动时使用-v/–variable标志指定变量,并且任意的系统环境变量也可以在脚本中使用。
variables:" R. S2 ~: f: I8 G2 Z- ~
    mongoconnection: mongo --quiet --host=localhost test
: m- I2 x, A3 w# C: lbarcharts:& g  }1 p9 o% v' ?4 ?
  - title: MongoDB documents by status
# Z8 I8 {0 {; \2 `) z    items:
1 o; Z1 [6 N7 L! J5 v* N      - label: IN_PROGRESS; D- ~9 d3 K( M/ d
        init: $mongoconnection* p2 x) j$ x. E1 r3 j! b; e
        sample: db.getCollection('events').find({status:'IN_PROGRESS'}).count()0 p  M9 c- G% c' I3 ^
      - label: SUCCESS. l+ t4 K) x, o) X0 `5 u
        init: $mongoconnection8 x3 @6 s5 _) J& F  d" Z* }$ `9 X
        sample: db.getCollection('events').find({status:'SUCCESS'}).count()8 I* b) W- J4 W6 T
      - label: FAIL6 Q4 e; c5 \/ }' j  X
        init: $mongoconnection
7 N, r+ E( Q! j0 o& a  E1 S- I# m2 Q        sample: db.getCollection('events').find({status:'FAIL'}).count()

9 d( R. y; A9 ]: q' v  ~
2 ~  \$ p7 X/ y, X# ]8 q$ k; @

8 b. j8 W  u+ `* u$ w颜色主题
微信图片_20201019164138.jpg
theme: light # default = dark
5 E( {. U  T$ P" n) U) ^9 ysparklines:
& W$ k2 y' l. z! e  - title: CPU usage
3 R0 }* K0 S* z. b( E+ |2 ^1 P0 ^$ u    sample: ps -A -o %cpu | awk '{s+=$1} END {print s}'
% F* A3 ]3 Q. v( O- \6 R
6、真实场景数据库
以下是不同的数据库连接示例。建议使用交互式shell(init脚本)仅建立一次连接,然后在采样期间重用即可。
MySQL0 V$ b+ k, {5 g% @5 L
# prerequisite: installed mysql shell
, ~: }  n7 _. Z/ mvariables:
8 T9 a/ I( s& G$ u0 _% L  mysql_connection: mysql -u root -s --database mysql --skip-column-names$ T1 Y. }! J. i* @0 h' o
sparklines:  & \0 y8 @1 \3 t/ S* B) x4 ~" _
  - title: MySQL (random number example)* G9 f7 Q  d0 w% X( v
    pty: true
% A6 o8 L* [5 ^    init: $mysql_connection
/ t; p1 h# r) \/ t6 o' G. i    sample: select rand();
( S0 R% |& n" Y% f
PostgreSQL
% r$ E' d# @; a4 [7 |3 g* s# prerequisite: installed psql shell
, L9 O3 ~, H2 D& d3 A* N* Yvariables:
. ^( }0 Z6 e7 a  V  ?  PGPASSWORD: pwd9 J! j. j/ M- a( L% o% h7 x# V4 s4 Y
  postgres_connection: psql -h localhost -U postgres --no-align --tuples-only
) M3 N( M9 W. Vsparklines:
5 Z) s7 r4 k! e! ^9 @1 c  - title: PostgreSQL (random number example)
6 _( Z2 i3 q2 p( A    init: $postgres_connection
8 Q+ D% `' C$ ]" Y    sample: select random();
3 A# z, n  }& O2 M
MongoDB
) }+ B+ T; N" ], U; s# A9 E8 D# prerequisite: installed mongo shell0 U9 Z2 ~' V' c1 m* O
variables:
# H& V3 M; r6 i6 X, I8 H  mongo_connection: mongo --quiet --host=localhost test
4 ^. @: F9 h4 p/ {sparklines:3 m, V5 O, s1 f: T9 T% h* c
  - title: MongoDB (random number example)2 C. T" f5 }6 A/ k3 Y
    init: $mongo_connection
# x. C$ h8 w  b) \8 d7 }5 _$ }8 V    sample: Math.random();

6 {3 M* p& W( M& ]Neo4j  \/ [0 A3 y* b5 a+ V
# prerequisite: installed cypher shell
0 u3 c: @5 E: q6 I: ^- Cvariables:
( d& W8 h* V! U  I* S6 T- P  N8 _  neo4j_connection: cypher-shell -u neo4j -p pwd --format plain
% W4 |2 @# C7 l, m. K* C1 g; \3 b0 ~sparklines:9 ?! ?* X% p) N$ S
  - title: Neo4j (random number example)
( q9 y. g; Q6 o4 [    pty: true
7 z5 [) u& @# z8 u    init: $neo4j_connection& k; h, H7 Y# r. Q9 d1 p/ l( Q/ o
    sample: RETURN rand();# `, G9 u- ]" E0 N7 U) N4 f
    transform: echo "$sample" | tail -n 1
. o. a/ n7 D1 a8 e) T! a

9 d( X2 r8 z1 U( K2 w) L: I

4 g" c7 u- X: G5 P4 ^0 v! e! UKafka
检查kafka lag值,计算每个队列lag值的和,高于阈值报警,多consumergroup,多topic。
variables:0 e, p8 x+ ~7 C  W
  kafka_connection: $KAFKA_HOME/bin/kafka-consumer-groups --bootstrap-server localhost:9092
2 P$ N2 \5 [! g. y& ^; xruncharts:" N# m1 b3 T" e8 h/ g8 ?+ u
  - title: Kafka lag per consumer group
/ J: z5 u; _2 E+ f8 l    rate-ms: 50008 [) e( T/ a8 U
    scale: 0
6 k" B7 c1 M5 f; ]: k) o    items:) r, K% k# c  U2 x. P0 n
      - label: A->B
" \# F3 y; `% H1 P        sample: $kafka_connection --group group_a --describe | awk 'NR>1 {sum += $5} END {print sum}'
0 e& j1 y( [' n0 S+ D1 H      - label: B->C; k2 r1 N& Z. h/ S
        sample: $kafka_connection --group group_b --describe | awk 'NR>1 {sum += $5} END {print sum}'9 |0 f3 K) J: M. {0 `% t
      - label: C->D$ `6 J3 m4 E$ t" U3 j
        sample: $kafka_connection --group group_c --describe | awk 'NR>1 {sum += $5} END {print sum}'

/ B; g! K8 R4 X( \3 M
* H/ k0 I6 V6 A9 M6 I: n, V
3 ~& J# M$ O! E# N- @
Docker
Docker容器统计信息(CPU,MEM,O/I)
textboxes:
- N% s( z: @8 k7 w9 \. f2 A7 l  - title: Docker containers stats
& J/ {. |. [5 r% f9 H' o    sample: docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}\t{{.PIDs}}"

; }' a: g+ C" |( ]- |' ?+ H2 i; L0 V, i2 r
7 L+ {+ L$ ^, X0 ]  R8 H" K
SSH
远程服务器上的TOP命令
variables:
+ V8 w1 R+ _1 w: p  sshconnection: ssh -i ~/my-key-pair.pem ec2-user@1.2.3.4
" H, b4 a/ |* H6 c" z( \, ^$ Ttextboxes:
, D; K* N% p( D9 v% X; e. j) I  - title: SSH
* g( d4 e$ G5 o* l1 E: B- }    pty: true
6 t  W6 \& X' \9 l  x) l# O    init: $sshconnection6 |3 m0 s3 \8 z: \+ }7 a
    sample: top
& ~( f- d# |8 v  ^) L" i
6 ?2 y& ]4 {4 @% L' f8 w. ~
8 `. @1 [& D. ?! K
JMX
Java应用程序的正常运行示例
# prerequisite: download [jmxterm jar file](https://docs.cyclopsgroup.org/jmxterm)# I/ `* g7 v" W9 X5 D) l
textboxes:# ^* W' R. C# r5 b8 P
  - title: Java application uptime
8 p: t2 }7 Y; Z    multistep-init:
  |: O# A" G/ j      - java -jar jmxterm-1.0.0-uber.jar, V; O9 D- P! L+ B" c2 f
      - open host:port # or local PID; r5 t8 p7 L' H
      - bean java.lang:type=Runtime
# q* T/ C. N5 D    sample: get Uptime* j2 n  s/ [' E# f% z2 P9 g
    transform: echo $sample | tr -dc '0-9' | awk '{printf "%.1f min", $1/1000/60}'

7 m, |; l# k/ }) _2 \
+ N5 ^& O& N- I* y* h# Q4 H9 u
2 ?5 h  J$ ~/ u* u
赞 收藏 评论0 发布时间:2020-10-19 16:40

举报

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