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

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

[复制链接]
gaosmile 发布时间:2020-10-19 16:40
Sampler是一个用于shell命令执行,可视化和告警的工具。其配置使用的是一个简单的YAML文件。
1、为什么我需要它?
你可以直接从终端对任意动态进程进行采样 – 观察数据库中的更改,监控MQ动态消息(in-flight messages),触发部署脚本并在完成后获取通知。
如果有一种方法可以使用shell命令获取指标(metric),那么可以使用Sampler立即对其进行可视化。
2、安装macOSbrew cask install sampler

9 c4 a0 ~  y. `: Y2 H6 R( H
' N1 r% ]2 T4 i% o
sudo curl -Lo /usr/local/bin/sampler https://github.com/sqshq/sampler ... -1.0.3-darwin-amd64# @6 c3 e7 l9 Z
sudo chmod +x /usr/local/bin/sampler
+ x- z8 Y! b7 P0 m: p& ]2 T/ U

$ I2 \6 g3 W- D3 L: B( N% o. z

& N% m- \, l' FLinux
3 b/ s- L% {7 d4 D3 P; Q" H# Q- V2 M, u1 g4 Y8 y  n
) h' c" Q5 U5 [; f
sudo wget https://github.com/sqshq/sampler ... r-1.0.3-linux-amd64 -O /usr/local/bin/sampler
  G  H0 A4 u2 ?' j( s, }sudo 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:7 W! e9 x/ {. j
  - title: Search engine response time0 u% b5 d7 u5 ~* {% l: ]4 D
    rate-ms: 500        # sampling rate, default = 1000
1 V$ t, Z$ X' E* I( p    scale: 2            # number of digits after sample decimal point, default = 1
0 v" H5 {3 }4 F! y& n; s/ \    legend:+ Z+ |$ j. Z& ]: a* k8 Z( V: @  l: [
      enabled: true     # enables item labels, default = true8 A7 E3 F/ n* p6 T: N
      details: false    # enables item statistics: cur/min/max/dlt values, default = true  w( z  d, D; d8 k* r
    items:
# p" L7 x9 A8 i. M9 L1 a' e$ b# U      - label: GOOGLE
' U' \  a3 B: r        sample: curl -o /dev/null -s -w '%{time_total}'  https://www.google.com$ u4 t  x5 n7 ^1 n) ?: E+ c
        color: 178      # 8-bit color number, default one is chosen from a pre-defined palette
- g' d1 {5 v7 T& G- I& m4 |7 V/ C      - label: YAHOO
2 e+ D; g4 X7 \' d6 A" P' v8 T# @        sample: curl -o /dev/null -s -w '%{time_total}'  https://search.yahoo.com$ E$ U" R8 S2 h; l- \6 s7 }, _
      - label: BING
" N, {) k1 ?2 X3 a) G        sample: curl -o /dev/null -s -w '%{time_total}'  https://www.bing.com
- t  |6 g0 w( J

- a$ w4 _+ N% X- o; v. r! l

+ \( S# i/ I9 O  S& K" e3 _- x( CSparkline
微信图片_20201019164122.jpg
sparklines:* y* q% G% R2 h& f
  - title: CPU usage
% S8 n( K+ m# n, Q    rate-ms: 200
; @/ g& M: q3 j7 S6 c    scale: 0
  Z' t9 @+ o3 f4 z6 t8 t1 ~" r    sample: ps -A -o %cpu | awk '{s+=$1} END {print s}'2 d" H. o( a4 m4 [% ^& Z% N5 |
  - title: Free memory pages
3 X6 k1 R! X9 i& b) m5 n( v    rate-ms: 200
) j4 t: V+ ^8 s3 O) _4 z6 N    scale: 0" p( w/ F3 Y5 e" I0 |* n4 I
    sample: memory_pressure | grep 'Pages free' | awk '{print $3}'

( K/ K% a8 m$ R1 U
. x' v/ G; _: L7 }. G
8 m! X3 p4 p+ [
Barchart
微信图片_20201019164126.jpg
barcharts:$ V1 v) V0 J2 m- ~
  - title: Local network activity* \3 L7 X! S- h5 y7 _7 d' {1 w
    rate-ms: 500        # sampling rate, default = 1000  [: X: A4 M8 |/ s; u9 o/ D
    scale: 0            # number of digits after sample decimal point, default = 1
6 S4 {. t6 O/ q2 f! V& u# w4 U    items:
* `- o. V: h* {4 Q  D7 E      - label: UDP bytes in
; K) C- J5 Q  G6 C$ I5 E0 l, C        sample: nettop -J bytes_in -l 1 -m udp | awk '{sum += $4} END {print sum}'
2 g4 J/ j  N; \% \% U      - label: UDP bytes out
4 |/ U% I" x9 Q% J( [  l        sample: nettop -J bytes_out -l 1 -m udp | awk '{sum += $4} END {print sum}'
5 S3 d2 `2 j& |% o      - label: TCP bytes in: ], @5 M% D# L: B: E
        sample: nettop -J bytes_in -l 1 -m tcp | awk '{sum += $4} END {print sum}'6 @9 F4 O- B. s
      - label: TCP bytes out5 v3 b# e) V# Q, o, \7 P
        sample: nettop -J bytes_out -l 1 -m tcp | awk '{sum += $4} END {print sum}'

* L0 x" }  B" w! T6 M9 Q  V3 k5 q4 l% G8 O& k8 M+ O

/ j& n$ E; M" _9 \' |5 U# PGauge
微信图片_20201019164129.jpg
gauges:
: a, T- s6 d& J1 |) x  - title: Minute progress7 B$ ~( Y. m  K" r* M3 b) S( Q
    rate-ms: 500        # sampling rate, default = 1000
" d5 i  {7 M. }  D    scale: 2            # number of digits after sample decimal point, default = 1
$ Q6 k& ]: Q9 o4 j. h) o" L    percent-only: false # toggle display of the current value, default = false
, {8 g- D: c) J) Y5 I& p8 K  ]    color: 178          # 8-bit color number, default one is chosen from a pre-defined palette1 m, @7 c3 u* _( G" x5 y
    cur:
# ?* U% ?& }6 ^! e# L      sample: date +%S  # sample script for current value
' ^* A+ e# }% f$ m8 [2 w    max:
. v+ R7 T5 x1 t! ?9 ?3 s# ^( ]      sample: echo 60   # sample script for max value
7 c4 E2 K9 @- t& E, O- j  |$ j9 h    min:
$ N1 k9 c2 x  w2 o. e1 k      sample: echo 0    # sample script for min value, H( [) u4 a. x( i$ f, l
  - title: Year progress
7 M/ [7 T2 K7 a9 L2 ^/ S    cur:3 T7 y& p. r+ n) ?$ W& z% o3 O! [0 Q$ {
      sample: date +%j
' w7 b) G4 M8 ]  Q" v, B8 u    max:5 ?: v5 @- r, ]0 I* ]
      sample: echo 3659 {, t* |+ U; J; Z! v0 D
    min:
, Z' J$ K2 }; h8 o7 M3 b& @      sample: echo 0
Textbox
微信图片_20201019164132.jpg
textboxes:* u) [6 y! `$ y; w! u% S
  - title: Local weather# T8 k1 U5 d2 i) U- Z0 p
    rate-ms: 10000      # sampling rate, default = 1000
" Z6 @2 q) G$ n    sample: curl wttr.in?0ATQF% L/ U$ K" E" M
    border: false       # border around the item, default = true; ?, o' s; V( O
    color: 178          # 8-bit color number, default is white' k7 {& d) h  E& ~2 p  q2 M
  - title: Docker containers stats
: j9 c7 h: Q: L& d    rate-ms: 500- |0 l7 D& X  z" s
    sample: docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.PIDs}}"
: w: ~; M- c2 E* r1 s" ^, w& U

/ _, x& L( D/ s9 o/ Y6 I' p

4 L: O; N& R6 [0 _: OAsciibox
微信图片_20201019164135.jpg
asciiboxes:7 S8 T# E- R& ?0 w3 \7 A
  - title: UTC time, i' u: j5 X' O  t5 S. @# ^* G& i
    rate-ms: 500        # sampling rate, default = 1000
4 Z& b8 m1 @2 c0 M    font: 3d            # font type, default = 2d
0 L. N6 ^5 i* u- e) i    border: false       # border around the item, default = true    1 d) m; P0 ?) f) E! V2 s5 \( B
    color: 43           # 8-bit color number, default is white
, S: _6 C- i2 }    sample: env TZ=UTC date +%r
5 o* k  Z( \( x. i4 z8 J
5、额外功能9 l1 w+ m6 p, K! |/ w
Triggers
+ M7 n; O) _; [; N
触发器允许执行条件操作,如视觉/声音告警或任意shell命令。以下示例说明了此概念。
Clock gauge,从开始的每分钟显示时间进度和当前时间
gauges:4 \# y2 T- C. Z( H5 o8 x( U
  - title: MINUTE PROGRESS2 ~5 s; D1 W; r( v& A
    position: [[0, 18], [80, 0]]  
# i( K) R: X# N6 p' Z5 y    cur:3 N6 l. ^0 G6 C
      sample: date +%S
- _7 g3 Y5 S. n    max:
) K( R* U( s" ^4 q      sample: echo 60" B! Y* S4 z- v8 J' p
    min:8 e; @* G  ^6 N6 \" ^0 a& B, N
      sample: echo 0
: g/ o9 h, o' e3 E' l- ?) J    triggers:8 x% b/ o, _3 n3 n
      - title: CLOCK BELL EVERY MINUTE
0 q4 A! b1 K' K4 X( F9 U+ [        condition: '[ $label == "cur" ] && [ $cur -eq 0 ] && echo 1 || echo 0'  # expects "1" as TRUE indicator3 N0 R7 n/ o; @! i
        actions:
6 N5 w, o0 D9 u          terminal-bell: true  # standard terminal bell, default = false
. \' u0 N6 d0 D! ~# Y! ^) m          sound: true    # NASA quindar tone, default = false
, o; J' Z' W% {' t          visual: false  # notification with current value on top of the component area, default = false7 u: R* g: w4 u3 n8 A) E
          script: say -v samantha `date +%I:%M%p`  # an arbitrary script, which can use $cur, $prev and $label variables
: n3 s* J- ~8 l7 g" L
搜索引擎延迟图表,在延迟超过阈值时向用户发出告警
runcharts:
; z, u: X3 y- _; t# z0 a3 }  - title: SEARCH ENGINE RESPONSE TIME (sec)
& ?4 }& l/ y- b9 S8 O    rate-ms: 200/ _9 f, V. D5 X
    items:  d# K9 l0 B2 x5 F; H6 ^3 m
      - label: GOOGLE
0 q& u! H; ]$ t' M        sample: curl -o /dev/null -s -w '%{time_total}'  https://www.google.com
) o. K- q3 c* L0 X0 G      - label: YAHOO
8 X& K  _1 w# _7 N/ `' L1 ^        sample: curl -o /dev/null -s -w '%{time_total}'  https://search.yahoo.com     % s: |& z- |& g* T; h
    triggers:
2 C, K- V& K9 K: W% d. q; ^8 V) i      - title: Latency threshold exceeded, K5 }5 }* b! p4 `! G
        condition: echo "$prev < 0.3 && $cur > 0.3" |bc -l  # expects "1" as TRUE indicator
" Y+ p1 \$ ]2 s4 G/ [        actions:7 L$ a0 i4 l1 O9 S; z
          terminal-bell: true  # standard terminal bell, default = false
  b* V, c; W) i8 E2 ^          sound: true   # NASA quindar tone, default = false
' R4 S( G" t& s& W          visual: true  # visual notification on top of the component area, default = false# Q* Q+ V4 i7 W6 c
          script: 'say alert: ${label} latency exceeded ${cur} second' # an arbitrary script, which can use $cur, $prev and $label variables
7 k/ s( M& E; K0 ]
  u* t& x# ^- u: G* R

. ]+ Q* u3 a) Z2 m交互式 shell 支持
除了sample命令之外,还可以指定init命令(在采样前仅执行一次)和transform命令(后处理采样命令输出)。这包括交互式shell用例,例如仅建立与数据库的连接一次,然后在交互式shell会话中执行轮询。
Basic mode
7 S% z/ k- X0 r7 {textboxes:
: L, D* f+ _0 @5 U  - title: MongoDB polling
& e7 ^0 v2 h; j$ z# W    rate-ms: 500
4 x4 K4 n( R, \7 B( c& K    init: mongo --quiet --host=localhost test # executes only once to start the interactive session
" Y* P1 s; K. \9 U% D8 R& k# d    sample: Date.now();                       # executes with a required rate, in scope of the interactive session
& k1 d5 a; w8 z4 a' M* ?    transform: echo result = $sample          # executes in scope of local session, $sample variable is available for transformation
) S+ r& h5 y, {! _1 u+ C
PTY mode
在某些情况下,交互式shell将无法工作,因为它的stdin不是终端。这种情况下我们可以使用PTY模式:
textboxes:& q: O! ^( g. O
  - title: Neo4j polling
' ?5 U/ W- d( {9 S/ v( f' K* n# |    pty: true  # enables pseudo-terminal mode, default = false
3 c% j/ `3 x0 Y3 _    init: cypher-shell -u neo4j -p pwd --format plain
& e- p7 H* x& c6 L* b    sample: RETURN rand();
, D/ \% K6 N# n- w( k% }    transform: echo "$sample" | tail -n 1
& M8 m3 t- B1 S  {% H6 E  - title: Top on a remote server
2 S* _. u# f8 }1 C# U- a! D    pty: true  # enables pseudo-terminal mode, default = false
; A! D) w6 D; h. b5 u7 C    init: ssh -i ~/user.pem ec2-user@1.2.3.4" i$ q) g& B/ X! ^$ Y% T
    sample: top
2 K5 b& ^3 N! L$ i: h
: d7 G6 V5 A$ a5 V

& S$ v5 B  D& j& u0 A& s* rinit 命令逐步执行
在开始采样之前,还可以逐个执行多个init命令。
textboxes:
5 w* M9 `7 D+ C5 D- U: B  - title: Java application uptime
4 A' h% E7 u- X" P    multistep-init:4 L% ]3 v- i) t0 V
      - java -jar jmxterm-1.0.0-uber.jar
5 e. r9 o; e6 X3 g4 o: l4 s4 y' }      - open host:port # or local PID
$ s- R% Y$ w, h1 ?  P+ J      - bean java.lang:type=Runtime
1 K5 }! t+ g9 `* w' u/ X. J7 Q    sample: get Uptime
8 b2 g+ ?, Q& H  u- _

1 c' O" N  F  H4 j/ ]

3 a" Q  c' F# x; T- Z变量
如果配置文件包含重复的模式,则可以将它们提取到变量部分。此外,还可以在启动时使用-v/–variable标志指定变量,并且任意的系统环境变量也可以在脚本中使用。
variables:
! Y" {- r1 Q2 u- H$ v* P( O4 Y    mongoconnection: mongo --quiet --host=localhost test
& X9 S2 p& i  G: \4 R+ ?! T" gbarcharts:& Z" z1 u* c: {+ L) p; i7 C6 |
  - title: MongoDB documents by status
5 q! d  @0 v) V# [, x. ^- @    items:
& J5 k; M9 W7 r: n7 |9 P/ |      - label: IN_PROGRESS
' q7 G% W9 E1 I4 T5 i3 L# y, B& N0 E0 R        init: $mongoconnection
* Z- C5 ^/ K7 T8 F6 O        sample: db.getCollection('events').find({status:'IN_PROGRESS'}).count()
# C, |7 F; y* ^" g      - label: SUCCESS/ \, U- `1 Q: G% F
        init: $mongoconnection
4 v) l* Z& P7 H& p' e1 ]" b        sample: db.getCollection('events').find({status:'SUCCESS'}).count()( b6 N5 Y0 j3 Y* V; T) E
      - label: FAIL+ L* ?7 R! L: L9 {
        init: $mongoconnection' L. J+ t' Q" [1 U0 f2 i9 v
        sample: db.getCollection('events').find({status:'FAIL'}).count()
: J/ j. L% R' A9 D
" y# c5 k7 p8 J( {
6 r# N9 M5 U! l8 ^  a; _' c
颜色主题
微信图片_20201019164138.jpg
theme: light # default = dark" P5 `) }5 X  N" A, Z: q- X* B
sparklines:
6 x* ?# m% {# Q  - title: CPU usage
5 s; }7 g, q8 H' W' o, ^' e* o    sample: ps -A -o %cpu | awk '{s+=$1} END {print s}'
! K5 C! u5 n: t' s$ N
6、真实场景数据库
以下是不同的数据库连接示例。建议使用交互式shell(init脚本)仅建立一次连接,然后在采样期间重用即可。
MySQL1 F# q6 Q$ C6 y7 ]2 U
# prerequisite: installed mysql shell
# [6 r: m* i" Z1 Wvariables:  {  X. L3 H; o# h0 ^; U
  mysql_connection: mysql -u root -s --database mysql --skip-column-names1 b. [% _3 }1 X/ Y& h
sparklines:  
8 }" e1 Q" Z( H+ _) W0 m- F1 ~  - title: MySQL (random number example)0 x/ L* j3 G' Z7 N; x- A; C; K. T
    pty: true' j  |  q% I' M- e, @* U
    init: $mysql_connection
7 |2 ~6 b/ e% z4 j8 |, s, y    sample: select rand();
& R. k" N5 J# T/ b# Z/ _+ O/ u7 T
PostgreSQL
: P0 y: O' j  X5 E% {) ]# prerequisite: installed psql shell
0 L1 t: `! J2 i1 W2 Mvariables:! R# a8 b/ d& Z8 J# f- C- w
  PGPASSWORD: pwd* C3 I" e) ]# H7 c7 }
  postgres_connection: psql -h localhost -U postgres --no-align --tuples-only
( K/ {% G4 i% D* a2 \sparklines:' L! D* l" k7 e/ K3 W9 R
  - title: PostgreSQL (random number example)
3 n7 e" {" ~2 S" U( ^    init: $postgres_connection
8 W( r, L# ~0 N    sample: select random();

- _5 h$ [+ E" t7 hMongoDB
  \5 A- k7 B, v! @9 W" I# prerequisite: installed mongo shell
3 V' r' y/ T5 `' h' u4 Hvariables:
( }4 J+ R+ q- K0 ~2 \  mongo_connection: mongo --quiet --host=localhost test
8 b: O% s, z8 Qsparklines:
# b2 ?8 i) l: f0 Z, s% t% x  i  - title: MongoDB (random number example)
3 Z& t# O/ \- j' x& }    init: $mongo_connection) n8 ?. I; v, e/ H8 n$ f, Q% [& w
    sample: Math.random();

0 t+ E5 L- o; n: e: gNeo4j# E' r6 Y- h0 y6 _1 A( D
# prerequisite: installed cypher shell' D' W# t2 `) M
variables:5 I; i: ?0 T% C0 m0 O& v/ p" l
  neo4j_connection: cypher-shell -u neo4j -p pwd --format plain9 [+ |3 S- ^+ P* G
sparklines:
3 N" a+ \# e' J, X" H) @5 D  - title: Neo4j (random number example)
0 N: W9 b( N5 D- j( Y2 M1 S" I; E) ]    pty: true( y0 w: _* [' d* q: k3 c8 a3 Q
    init: $neo4j_connection
, ?1 X5 C9 G: [) o& @9 E2 v    sample: RETURN rand();# T, t! n% D4 F
    transform: echo "$sample" | tail -n 1

) ]8 w- c' K0 Y* T6 o8 x( c
/ v, @" L/ @) `! \
: S9 Z0 I. ~5 z# v8 Y$ Y9 s
Kafka
检查kafka lag值,计算每个队列lag值的和,高于阈值报警,多consumergroup,多topic。
variables:0 u& x6 w' k% j0 _# R8 m5 v7 _& V
  kafka_connection: $KAFKA_HOME/bin/kafka-consumer-groups --bootstrap-server localhost:9092
" W" M+ z: M0 a1 |1 fruncharts:
/ e6 d) W- H5 g5 A! Q! F# F  - title: Kafka lag per consumer group* p) N6 z' Q: ]3 m4 }6 V
    rate-ms: 5000+ G  D: {1 u0 q- p" {5 ]7 n6 H5 b
    scale: 0
5 {# ]( G9 q) x/ T0 A    items:
5 J/ P/ i5 W4 x      - label: A->B& v7 R; ~/ }+ C
        sample: $kafka_connection --group group_a --describe | awk 'NR>1 {sum += $5} END {print sum}'& {4 w$ b% }" L
      - label: B->C
! B1 x! H  ^2 d9 x1 B1 G& p  ~        sample: $kafka_connection --group group_b --describe | awk 'NR>1 {sum += $5} END {print sum}'9 b  R5 n# E& R: U, r
      - label: C->D
+ b5 m. P5 i& R6 A, `( o0 P- S) }/ ~! S        sample: $kafka_connection --group group_c --describe | awk 'NR>1 {sum += $5} END {print sum}'
1 u+ K! ^, n9 b* Z

  M- H, G: Z6 `8 c: [9 d4 E

, P/ ]. e5 h) R5 c( b/ S3 m& W6 qDocker
Docker容器统计信息(CPU,MEM,O/I)
textboxes:
7 w3 ?. _! F2 T, ~  a1 x: e. ]7 ~  - title: Docker containers stats
3 K' d/ s3 [0 i! R    sample: docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}\t{{.PIDs}}"

4 o, |8 ?: m; W  ?
- W* _+ l$ |" n9 h. K! @& ~
8 |& E9 z' C. ~4 j' Y
SSH
远程服务器上的TOP命令
variables:9 y/ p! ~5 \3 ~
  sshconnection: ssh -i ~/my-key-pair.pem ec2-user@1.2.3.4$ ]3 Q3 F2 I, y; y: o
textboxes:
8 {' u$ @9 _" Q4 T2 C$ Z( ?  - title: SSH7 X$ v  w( z$ s! l5 I1 J6 B
    pty: true
) _- ^! i: h3 ?2 V, K' c/ O1 [4 u    init: $sshconnection
- l" N# F5 V3 S    sample: top
8 v3 J: ^" l+ y: w
  _# L* s7 K3 m9 a5 e  _) s2 S
# C+ _$ P) S& g. X" h2 D6 [1 l
JMX
Java应用程序的正常运行示例
# prerequisite: download [jmxterm jar file](https://docs.cyclopsgroup.org/jmxterm)
  T" [5 q& t! O  v& mtextboxes:
6 e# X( e2 A! n" c" d  - title: Java application uptime
  F  p& h4 w4 m" D" M" g    multistep-init:0 }! `9 u: j- {  U* ]
      - java -jar jmxterm-1.0.0-uber.jar/ _3 g8 d3 u% M2 h
      - open host:port # or local PID5 J7 |5 K& v% Q) @) r1 g$ o
      - bean java.lang:type=Runtime/ m( i' A# d1 o9 W0 ?! U: X
    sample: get Uptime
" @! Y( i- S' m+ F& g* B    transform: echo $sample | tr -dc '0-9' | awk '{printf "%.1f min", $1/1000/60}'
8 q1 ~7 ?  ?# n

/ N' H/ M9 V' L: P0 r* u6 M. ~- z
: j: v5 B8 R! Z$ H
收藏 评论0 发布时间:2020-10-19 16:40

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版