马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
collectd是一个守护(daemon)进程,用来收集系统性能和提供各种存储方式来存储不同值的机制。7 H9 g) @. y. q* x
influxdb 是一个时序数据库。
' P2 d) F1 ]% X6 }: [grafana是一个前端展示工具。 可以使用collectd 的virt插件通过Libvirtd 的API 收集虚拟机的数据,然后保存到时序数据库influxdb。最后通过grafana将influxdb中存储的数据以图标的形式展示出来。 一、部署 collectd influxdb grafana prometheus# R/ i$ W4 P' Y7 m( b' l8 E$ D
1.修改全局配置globals.yml文件,设置部署监控相关文件。 vim /etc/kolla/globals.yml # l( J+ A. d4 v* h; i' z2 x1 g7 h
& c! W. ] F9 F. benable_collectd: "yes" 2 E' Q! U3 {7 L4 F1 k
enable_grafana: "yes" / H) g* b2 U. o3 }! b3 l& I
enable_influxdb: "yes" % J3 W/ z8 I( Y9 l( n9 o) ~
enable_prometheus: "yes" " _* j8 N* d" }
prometheus_cmdline_extras: "-storage.local.retention 720h" , P! e3 x: N; }4 X3 a9 L
H7 ~7 C. g& V n, R$ e$ P
prometheus-server 数据保存30天 单位d无法识别。可以附加的参数 可参考 https://blog.csdn.net/dengxiangbao3167/article/details/102365367相应的prometheus的exporter包含 #enable_prometheus_haproxy_exporter: "{{ enable_haproxy | bool }}"
% A0 v' z, z( b+ A; k4 _% A" n% H" }8 U#enable_prometheus_mysqld_exporter: "{{ enable_mariadb | bool }}" ?3 ?5 ^, _1 d4 u1 S ~
#enable_prometheus_node_exporter: "{{ enable_prometheus | bool }}" ! u/ Q3 ^% }3 P- L
#enable_prometheus_cadvisor: "{{ enable_prometheus | bool }}" : a$ \' T( Z( d. X! s5 C! r1 ~. x
#enable_prometheus_memcached: "{{ enable_prometheus | bool }}" % Z% h( b/ z+ j' h& Z/ J0 S
#enable_prometheus_alertmanager: "{{ enable_prometheus | bool }}"
1 e) Y& d3 d) R R0 G/ u#enable_prometheus_ceph_mgr_exporter: "{{ enable_prometheus | bool and enable_ceph | bool }}"
2 [: Y: B3 f& ^+ T#enable_prometheus_ openstack_exporter: "{{ enable_prometheus | bool }}"
+ N: V1 @& b5 Y5 ?& U1 e, a#enable_prometheus_elasticsearch_exporter: "{{ enable_prometheus | bool and enable_elasticsearch | bool }}"
' e% o# h; Y* v. M, C. j \#enable_prometheus_blackbox_exporter: "{{ enable_prometheus | bool }}" # T, t8 L" e8 B6 T$ L2 ~
/ H7 p) o3 O, Y8 |% q1 e# h2.安装部署相应的容器组件 kolla-ansible deploy -i /etc/kolla/all-in-one - E) n/ m$ F! L( G9 Z
1
, `4 w( I0 A% M- z9 ?) v a3.完成后查看相关组件docker容器是否部署完成 docker ps -a | grep -e collectd -e influxdb -e grafana -e prometheus
9 [+ [8 N! |: Y9 w7 B0 R1 / ]. u% b( @$ G+ L# Y/ d
二、修改相应配置文件,通过libvirt监控虚拟机
, n o6 _5 t2 s& r1 z自定义的配置文件位置,该位置的配置文件会取代默认配置文件。 # The directory to merge custom config files the kolla's config files9 A7 B+ I) H' J5 j; L& }
node_custom_config: "/etc/kolla/config"* R" I5 g( [: Z) }3 ?0 W
& G. @9 Q7 h: x9 i+ J# I& r8 K2 \
mkdir /etc/kolla/config
: k& N: h( G5 y9 O2 K( b+ O1! U: P" S$ M& ?# s6 h) @
使用kolla部署完成后。默认配置文件是/etc/kolla/<< service name >>/<< config file >>。
5 ]# l1 u* v# \% V6 D自定义配置文件路径是/etc/kolla/config/,且自定义配置文件一旦设置,就会覆盖且替换原配置文件。
4 @* i1 S' l2 F1 P( y- j路径可以是 /etc/kolla/config/<< config file >>,
4 a. s. h& T" D! R5 m/etc/kolla/config/<< service name >>/<< config file >>,
, }" I1 ]4 ?8 |7 Q5 ~/etc/kolla/config/<< service name >>/<< hostname >>/<< config file >>6 w5 N. ]& O% j) D1 o
: f8 K, T7 Z" y j5 E" o8 t
1.collectd 配置, A' D1 F" P4 b$ s2 g
libvirt有不同的虚拟机库, 通过API可以访问控制虚拟机。OpenStack也是通过libvirt的API也控制底层的虚拟机的。 cp /etc/kolla/collectd/collectd.conf /etc/kolla/config/; p! M, t# ]! Q/ F6 Z
vim /etc/kolla/config/collectd.conf ) a/ O5 q9 q/ J1 `; q7 |8 x) a
1
e# X1 W( }4 i0 F D2 f( h2 c23 W1 W, C6 s; m0 c3 b
FQDNLookup false! w# A; ` C2 B8 Y+ i9 E+ c
LoadPlugin syslog7 s& \, g2 g9 t& D6 [+ R5 U4 v3 }
LoadPlugin cpu: a v. T: `7 E( C3 n: E
LoadPlugin interface a* B; C J( }4 {+ j, s! l
LoadPlugin load
7 R4 N: _% {& z- o+ rLoadPlugin memory LoadPlugin network LoadPlugin logfile
3 D' F2 J. L; M# c( xLoadPlugin virt
4 w B2 M. Y/ h7 Q<Plugin network>0 ]& ^/ C- {' J1 S
Server "192.168.199.90" "25826"; S; @" K _0 E
</Plugin>
& t' H# t2 A. B
<Plugin logfile>+ A2 K$ w& E1 R V
LogLevel info, l3 Q1 g, d2 o. X! t; ~# M
File "/var/log/kolla/collectd/collectd.log"( `; N. F: B2 t' A( V' ^" U k- F
Timestamp true" r3 u; u' Z, n* c$ j0 ^7 d
PrintSeverity false- s9 t. P' U, Y. h
</Plugin>
( z) f) T3 {5 E7 o2 U<Plugin virt>! H6 g5 I% X P: z) ^3 O
Connection "qemu+tcp://192.168.199.90/system"; V ]2 }* n6 @. o) Z: h
HostnameFormat hostname0 R" n* j2 M& s! P
PluginInstanceFormat uuid7 w s0 E, B. F1 _0 ?
BlockDeviceFormat target N( R& q( ^" k7 s' i) {6 G/ {
InterfaceFormat name. b( s9 o2 a4 c, d* i
ExtraStats "cpu_util"
! ] @1 w8 M/ I8 n# [0 u8 \</Plugin> . {9 k* t0 |! n) ^8 H7 f
4 D! B' P p' j$ F# F启用了插件 logfile virt network。logfile是日志插件,virt就是与libvirtd的API通信的插件,network网络插件将收集的数据通过网络发送出去。
network插件设置。 Server "192.168.199.90" "25826"; j2 R% V8 ~9 q0 e' x; Q
1
6 ?, [7 ?- n! X4 c9 a表示将数据发送到192.168.199.90主机的25826端口。就是下一步设置的influxdb收集collectd数据的主机 端口。 LoadPlugin cpu. k6 T; w* |* c7 X3 w* \$ }/ I- R0 o
LoadPlugin interface
5 ^ B2 ~/ V+ f' }& r& RLoadPlugin load
8 o4 \! _# m8 W# HLoadPlugin memory
5 G& w+ y& ^$ B8 ?2 \# H0 R* O
0 v' j+ p! J7 h6 H5 R) Y+ S+ V这四个插件是用来收集宿主机的信息的。interface可能还会监听了虚拟机虚拟网卡的信息,如果不希望通过interface插件收集虚拟网卡信息(virt插件会收集)。可以设置interface只监听想要监听的网卡名。 <Plugin "interface">' R3 Q* ] q/ \& n6 D
Interface "ens33"6 I, z U4 y) }8 r5 e
Interface "ens34"
& [, G% W; e3 d( m/ a</Plugin>
& @4 h: |% R6 l7 D) n% n8 z( }6 d8 F
/ p1 [) H: N; I; Lvirt 插件设置 <Plugin virt>
. y4 |/ t; R2 @& u; }+ X Connection "qemu+tcp://192.168.199.90/system"
$ x; d R- v9 l5 t HostnameFormat hostname - B& ?+ K, z) J- U+ A
PluginInstanceFormat uuid
& @2 x3 Z( E" u" ?; t BlockDeviceFormat source / ^/ y+ h' i: x$ v* ]
BlockDeviceFormatBasename false
/ [' Y, Q) U2 g( _- s InterfaceFormat name 1 R4 g, c# | R% }
ExtraStats "cpu_util"
6 q& i! ^+ X6 U1 J+ Q</Plugin> & L/ u+ _' U0 s6 T$ i' D
! P, Y7 }0 z! k% c( U7 h/ v$ N* S具体参数详情可以看官网 2 e3 R( B7 L' e6 v5 e/ i
https://collectd.org/documentati ... 5.shtml#plugin_virtConnection 表示连接的libvirt API服务。
; @, F6 ]- X9 q6 s3 [4 S5 G3 n2 x 就像使用qemu+kvm创建虚拟机时使用virsh管理时使用virsh -c qemu+tcp://192.168.199.90:16509/system
& g3 m2 \$ ]: R! u: ^1 a" b, H% F 即可连接到libvirtd服务控制虚拟机相关。由于16509是默认端口号,可以省略: @$ C ?9 C8 j9 |( ?4 K& Y
由于是ALLInOne 所以collectd设置只有一个,多个主机部署时,需要每个计算节点上安装collectd指向本机的libvirt。
$ o* y+ [5 m; _$ p1 H3 ^* N 因此每个collectd设置文件都不相同。 HostnameFormat name|uuid|hostname|...
G- O4 B1 ?7 N 当virt插件记录数据时,会根据此设置设置所收集数据的主机名。
' O! |9 Z3 n: d( G* u7 r' @ 默认的做法是使用hypervisor提供的来宾名称,这等于设置为虚拟机name。 y `: q; i' u4 |& j
UUID 意味着使用虚拟机的UUID。如果您想跨迁移跟踪同一个客户,这是很有用的。) [1 c8 M% U+ W8 \" t6 e! a2 w3 A' L
hostname 意味着使用“全局主机名”设置,这本身可能并不有用,因为所有来宾似乎都有相同的名称。4 V7 o+ N' e/ \- v6 k
hostname就是宿主机名。。。这个其实挺重要的(在有多个宿主机的虚拟机数剧都保存到一个数据库时,可以通过hostname来确定不同虚拟机在哪一个主机。)
8 D+ V8 x: a3 s8 U 至于实例的 名称或UUID 可以使用PluginInstanceFormat来设置 PluginInstanceFormat name|uuid|none0 L. K5 A6 X7 S- ]$ C6 {
当virt插件记录数据时,它会根据此设置设置所收集数据的plugin_instance。默认情况是不设置plugin_instance。(只有一个宿主机时可以直接设置HostnameFormat name来代替PluginInstanceForma的设置)
5 q" G9 k+ G& @ name是指使用管理程序提供的虚拟机名称。UUID意味着使用虚拟机的UUID。* _6 b' a1 q7 G: K+ K7 g& W, k
OpenStack中是根据uuid来管理虚拟机的,虚拟机在libvirtd中的name和OpenStack中设置的并不一致。libvirtd底层管理是自动生成的,OpenStack中创建时手动命名的。" w5 F: G e$ D3 q" R
HostnameFormat和PluginInstanceFormat都可以使用多个fields。如name uuid。会同时显示名称和uuid中间使用 : 分隔。如foo:1234-1234-1234-1234 BlockDeviceFormat target|source* ]1 T* q$ I N4 ?( _% A3 u
挂载到虚拟机中的磁盘设备名设置。
; p7 W1 ^- N/ U7 Z virsh # domblklist instance-0000000a: f8 V( ^% F7 A: f
Target Source
) a6 X p, J" S# ~- r2 w ------------------------------------------------
( B0 Y7 S5 I. R( V0 C2 ]/ J vda /var/lib/nova/instances/86862558-141c-45b7-bfcf-b4e497f91bda/disk
! H7 v1 |/ C3 ]3 A9 u- m vdb /dev/sdc
" \2 [8 }! D( K6 {: B target 是映射到实例中的磁盘名 vda vdb。即实例中可以通过lsblk看到的。; R) l' n: e5 f) H1 B
source 虚拟磁盘对应的路径及磁盘文件名。/var/lib/nova/instances/86862558-141c-45b7-bfcf-b4e497f91bda/disk /dev/sdc, l2 }; k1 {- t1 S0 U- d
如果设置BlockDeviceFormatBasename设置为true,则只显示文件名 不显示前面的路径。 默认未设置BlockDeviceFormatBasename,是false即显示前面路径
5 p; P/ c# z/ @/ j3 D1 I+ y* F* GInterfaceFormat name|address
; R1 Z6 O6 R9 V 虚拟机的网卡显示 name或者address。name网卡名,address网卡mac地址。& i3 H; }6 m& H6 T, \9 S
' e2 Q8 n9 H2 b0 J* j9 ~' Y1 C
ExtraStats "cpu_util"' i/ b! x, N+ \$ ~: R0 N7 o
virt额外记录的数据。此处只设置了一个cpu_util 即CPU的利用率。
0 Y, U: M$ g# g* P* X, Q virsh # domiflist instance-00000002
/ m6 ~9 m: ~8 K1 y( r Interface Type Source Model MAC. C1 p$ e" d! u% ]
-------------------------------------------------------$ \* S( W$ S3 H0 G/ m
tap97caffeb-9a bridge qbr97caffeb-9a virtio fa:16:3e:64:5f:c0
3 A5 _1 C# b8 l _: D0 \) V interface就是name ,MAC就是address
' F, }( V7 B2 `$ {1 N& r
这是单个主机ALLinOne下设置配置文件的情况,如果多个计算节点,每个计算节点的collectd的配置文件是不同的,需要单独设置(主要不同就是连接的libvirtd API的IP不同),每个计算节点需要一个collectd收集本计算节点的相应libvirt 数据。 很奇怪的一点,似乎使用kolla部署的collectd容器收集虚拟机数据时无法收集虚拟机的内存信息,只能获取虚拟机全部内存。 直接使用yum安装的collectd却可以收集used,availble 等。。。不知道原因 2.influxdb 配置
8 N9 G9 [+ D1 v8 {6 C; `8 ^cp /etc/kolla/influxdb/influxdb.conf /etc/kolla/config/; M& y b, D) G0 E+ ?) v
vim /etc/kolla/config/influxdb.conf ( S+ h+ r/ {( z3 O4 l, W( M. l
1
4 j. t5 A# o( D5 V- m% D: i6 c2! ]' I P4 q7 O- g% p7 {8 @+ ~: ] j: E
reporting-disabled = true" J; e9 b4 i8 u4 X. l& x
[logging]% J; g0 q: a3 Z
level = "info"3 i% |2 V% P: h1 x I! c2 }, G
file = "/var/log/kolla/influxdb/influxdb.log"
7 K3 J, b1 `; {" d" k[meta]: u. I m1 E7 \! F/ M: E
dir = "/var/lib/influxdb/meta"( Y+ X* }4 Y# ^. Q
retention-autocreate = true
$ l; ~! o6 F2 M7 ~6 P9 u; R3 B2 b) l logging-enabled = true
6 |" k4 u% M" T8 K9 a" g3 X# r[data]
+ _% }: ]' O3 {- K t dir = "/var/lib/influxdb/data"5 T- d/ Q+ p5 }- [& h
wal-dir = "/var/lib/influxdb/wal"
$ w7 p1 T& x0 R$ S$ J wal-logging-enabled = true, h' M) t9 c) }; B3 W3 P
data-logging-enabled = true
. ] V% F% ]; I5 l- J) F3 R index-version = "tsi1"# v" e4 y# s* p3 ]. x" g! T3 @
[coordinator]
' q) S1 u! Y% \4 u/ e. } write-timeout = "10s"# b, f- n4 l3 j, B* r, S2 Z9 J- s4 y
max-concurrent-queries = 0
# C8 w/ ]/ h, T, V query-timeout = "0s"; n0 {( O. J" E/ {! M( t
max-select-point = 0
1 C9 d, V3 a# ]) O, k max-select-series = 0) O9 @8 J. S( n. ]
max-select-buckets = 0
, D0 N) _; h3 p1 E; i; c[retention]
4 \, c3 i! K N+ L; C enabled = true: Y5 d" K" x4 s6 E
check-interval = "30m"
. q5 o' ^1 m) Q0 n9 a, a. G[shard-precreation]
& X( p8 B2 c3 [+ ]* X" _' y/ ~& n enabled = true& Q# f2 ?2 U8 s7 C( q
check-interval = "10m", j5 ?" w2 W" {: {$ W( u& b! i T
advance-period = "30m"/ x9 X! A" W' B7 c* L
[monitor]
8 b e5 D8 }: D* K# i7 i store-enabled = true, x. N* r) V# a
store-database = "_internal"' {: U/ a: H1 R& ^: T0 h9 [/ k
store-interval = "10s"
; R) H! y s7 f- P, o" _[http]2 \% P; \% M0 J" e) z
enabled = true! l i6 G) S* @/ y G" c. B
bind-address = "192.168.199.90:8086"' W$ a5 X& U. d2 ?
auth-enabled = false F9 [ T$ T: J/ t M" `
log-enabled = true s5 X: [2 y2 V {) i9 }. F) @
write-tracing = false2 p7 N: K4 b' r; ^) B" d
pprof-enabled = false
8 G% d/ x8 e/ |1 _ https-enabled = false
* [1 {4 k$ b1 s' k' @[[graphite]]
/ I' Z7 \- h3 k* K enabled = false
7 Z% m& ~9 Q8 A: A% w8 y0 o8 N0 u[[opentsdb]]$ n8 L. F' R; A0 A
enabled = false9 k5 L5 m3 P6 R" E
[[udp]]
! d/ |! U9 H5 x enabled = false' {& `# {# f3 }4 ~5 r
[continuous_queries]5 d2 E2 |& s) E/ ]1 y
log-enabled = true# n; G4 v* r, D7 ]( w6 i' x4 L
enabled = true [[collectd]] 6 h4 y7 `. \$ r, k, D
enabled = true * ?/ j' ~8 P4 d: V/ y6 ?! e% x
bind-address = "192.168.199.90:25826" + L3 Z' j% f* R) O+ o, f5 h8 ]' p! \; }
database = "collectd"
1 M1 U0 }! ^/ [/ L5 ^ typesdb = "/var/lib/influxdb/types.db"
; Z& ^3 f9 w7 P0 l% z1 g; x* Q+ b. ~+ E; ?2 p
主要是添加了 末尾一段。influxdb是可以作为collectd的network Server,可以将collectd发送的数据保存起来。前提是有对应的type.db数据格式。 ) k3 J$ @5 G8 n% H8 F
https://download.csdn.net/download/dandanfengyun/14989445[[collectd]]* \9 i, D2 W4 c. \: k8 e
enabled = true
4 T; c& ^( `. f4 V9 w bind-address = "192.168.199.90:25826"
0 o0 W" p# h: q database = "collectd"
" p. a. c0 s2 C+ M typesdb = "/var/lib/influxdb/types.db"; ~9 g/ z1 Z p+ d9 }: ~' h9 T
: V% U" n) ~+ i" ^5 A1 Kbind-address = "192.168.199.90:25826"表示监听192.168.199.90主机25827端口的数据。然后保存到库collectd中。数据格式typesdb = “/var/lib/influxdb/types.db” 数据格式文件需要手动添加。部署OpenStack时,对于一些特别的需要存储数据的组件docker,都有相应的docker volume附加卷。直接映射到容器内。 influxdb容器附加卷在宿主机中对应位置 {
i3 D) z6 P5 w "Type": "volume",9 b8 z. @ u& V
"Name": "influxdb",! J! D- }6 a4 `; Q* E
"Source": "/var/lib/docker/volumes/influxdb/_data",
# w5 H- C8 }+ n( v "Destination": "/var/lib/influxdb",7 f! h, P" q; x; C0 D. G4 j& V. F
"Driver": "local",
4 x! s. _4 ]( G. ^ I; O "Mode": "rw",4 }% x9 h j% {8 E; b: [. K# q
"RW": true,
: B% F9 j! D$ l "Propagation": ""
9 Y: P/ Z2 K9 E! `: L },
+ F4 g# y: K: h8 @& a将文件types.db保存到/var/lib/docker/volumes/influxdb/_data,容器内即可在/var/lib/influxdb位置找到该文件。
docker exec collectd cat /usr/share/collectd/types.db > /var/lib/docker/volumes/influxdb/_data/types.db
- y' X3 I; S6 F8 e3 q1
' j# m9 ~$ |" b4 C$ H" V[root@ALLInOne-Kolla ~]# ls /var/lib/docker/volumes/influxdb/_data/, K7 |" c1 t0 n& V$ m% t
data meta types.db wal
U/ p; _8 l" K7 ^1
1 \; W! V" y8 |: m! V6 d. E; h o2+ A& O+ p3 ?* u, G0 f
3.加载个人配置。8 i4 w+ ~" ^# z5 p9 F
kolla-ansible reconfigure -i /etc/kolla/all-in-one
+ }' V+ r3 C8 L6 h- s/ k1
! ]0 r1 i1 E9 h4 ~完成后,会使用个人配置替代默认配置。并重启相应的组件容器加载新的配置。 新配置生效之后,最好将influxdb数据库原数据清除一下,因为原数据中会包含一些不符合新配置的数据。 删除库 collectd 创建库collectd (如果有数据存入,该库会被自动创建的) curl -i -XPOST http://192.168.199.90:8086/query --data-urlencode 'q=SHOW RETENTION POLICIES ON collectd'
& j: A T4 e$ [' R, G1 2 `* [$ t1 q. u' z/ r# V
设置新的保存策略 30天 并设置为默认策略 curl -i -XPOST http://192.168.199.90:8086/query --data-urlencode 'q=CREATE RETENTION POLICY "train" ON "collectd" DURATION 720h REPLICATION 1 DEFAULT'
4 B9 U# a- f3 f9 R5 J1 8 [! w" `) |0 {" Y( Y% E' s3 C
删除旧策略 1
4 F* e# o) c8 i$ q8 S2 j. H2 E2/ s5 M2 l6 Y" ^: J9 }% Y- o
4.influxdb一些其它的api。
, v! d/ U- B R删除数据库 curl -G 'http://192.168.199.90:8086/query?q=SHOW+DATABASES' B. f0 E/ @% g4 s; y6 B9 P
18 `+ y' \) ]0 V" ^% ]# U3 m6 e
查看库measurements 可以理解为表 curl -G 'http://192.168.199.90:8086/query' --data-urlencode "db=collectd" --data-urlencode 'q=show measurements'6 g0 e9 s) O* U2 O
1
; v9 a. @: d, E查看具体数据 curl -G 'http://192.168.199.90:8086/query' --data-urlencode "db=collectd" --data-urlencode 'q=select * from virt_rx limit 10'! _: r! i9 t* |# T3 ]% s
1+ S: V7 W0 J/ X
prometheus和grafana等暂不需额外配置文件。 不过由于直接通过libvirt的API监控虚拟机状态。没有经过OpenStack,所以虚拟机的名称无法对应。需要通过虚拟机的UUID来确定。
8 x U4 p2 j: ]5 I连接的是libvirt,也就是计算节点的libvirt。一个collectd只能监听一个计算节点livirtd,多节点部署多个计算节点,需要在每个计算节点安装collectd连接本节点libvirtd。
2 ^4 j' Q! n8 C: F, J2 `对OpenStack的整体信息,如虚拟机数量等也无法统计。且虚拟机移除后,数据不会随之消失,只是无有新的数据统计。保存策略是永久。 所以需要配合prometheus使用。prometheus_openstack_exporter会获取OpenStack的整体信息。如vm数量,cinder数量,glance的镜像数量等。但是没有具体虚拟机的具体信息 。 用户 admin。密码可在grafana /etc/kolla/passwords.yml 中找grafana_admin_password egrep grafana /etc/kolla/passwords.yml
. u0 ?8 n9 l9 p* ?0 {8 R1 Y$ \1. r* }' v1 N3 N7 Q3 o* D
登录成功后设置数据源 1.influxdb的collectd数据源 Name:collectd (这个是自定义的grafana数据源名)
/ ?' _0 m8 a! ~) v/ OURL : 192.168.199.90:8086$ s" F# i, I3 X/ @: [4 ?1 Y P
Database:collectd 完成点Save & Test 即可,成功的话是 Data source is working i- i' O D# _: @ w
失败查看一下influxdb组件docker容器是否启动,IP端口对不对等。。。 2.prometheus数据源
' {& K) I$ r& h* L5 N' U2.设置dashboard的变量
E* ]2 n7 T2 g& ?& E( X基本上不可能只有一个 虚拟机,且把多个虚拟机的信息一起展示也不合理。所以设置一些变量来确定当前展示的数据是哪一个虚拟机的。 - ] Y( P, J; ?
host SHOW TAG VALUES WITH KEY=host* M% K( w# j, a& L8 Z
instance_uuid SHOW TAG VALUES WITH KEY=instance WHERE host='$host'
& s3 W: {2 m R, D+ O) Cvirt_interface SHOW TAG VALUES FROM virt_rx,virt_tx WITH KEY=type_instance WHERE instance='$instance_uuid'
! F' l& ?0 X* [& q$ B& f8 Pvirt_disk SHOW TAG VALUES FROM virt_read,virt_write WITH KEY=type_instance WHERE instance='$instance_uuid'. `2 s9 J# Q' z* y! z' f
instance_name label_values(openstack_nova_server_status{id="$instance_uuid"}, name)
! B7 g& F0 H7 T# v. T8 v9 w9 p- {' y- P' l! @
分别设置宿主机名 虚拟实例uuid 虚拟网卡 虚拟磁盘 以及实例名; H: s* `- b' x& K
宿主机变量 虚拟机实例uuid变量 k6 k' t; }8 v$ k3 ?4 v+ o* d+ i6 p
虚拟网卡变量
0 n# d4 ?6 p3 c1 u虚拟磁盘变量
实例名 5 \- o5 H, x- A2 C) E
host instance_uuid virt_interface virt_disk都是根据collectd库中数据查询产生 最后一个比较特殊,不应该称之为变量。而应该作为一个展示的文字。是根据host_uuid根据prometheus查询而来。(一个dashboard当然可以使用多个数据源) 由于Libvirtd 的API中显示的实例名是类似于instance-000001这种的,与OpenStack创建时设置的实例名并不一致(UUID一致),所以通过collectd收集的数据 上没有真实的OpenStack的实例名,可以通过Prometheus来获取对应uuid的实例名, 仅在此处使用一次Prometheus数据源。 因此最后一个变量并不能称为变量,实际上是根据uuid通过prometheus查询出的一个值。 3.设置panel。& W( v+ R# r' @& ~9 K" L7 @3 U
这个根据influxdb查询语句和grafana使用个人创建即可。 ! H5 B$ \) y3 ~/ i
创建数据源 略。 点击import导入模板 6 O( {- B8 k+ {: E& w
选择模板文件 & @. [' f+ W8 m2 e6 u( q
最终导入 5 B( g! ]( `/ y: E; a+ D( G
附) W( E) P+ I+ X; n3 b
如果Prometheus和influxdb中collectd数据 实例 基本一致,可以设置更多的变量信息。
# \4 h( f9 V' c7 M/ l) O2 ~/ M如 实例不同状态根据Prometheus数据库查询。% R; f7 {9 ~* Q
uuid也使用Prometheus 数据库根据实例状态查询。
! J6 \. l( M+ {* ?( Z9 [ F$ G其他的数据根据uuid在influxdb的collectd库中查询。1 W# z" I: T- |( r% P6 w, R+ y
一致的是,实例名依然只能作为一个展示数据,而不能作为真正变量影响数据展示。 结合了prometheus展示了虚拟机的状态,根据状态查询实例uuid,选择ACTIVE可以避免查询到已经废弃的实例,也可选择SHUTOFF查询已停止运行实例的状态 不好的是也会查到状态是BUILD的实例 不过实例状态查询 重要的就是查询最近一段时间内 活动实例 的状态,因此状态变量选择基本是ACTIVE,只用于筛选出活动的变量即可。0 U! K) P5 \7 G( A' w [: f
且BUILD 状态的实例BUILD状态只会存在很短的时间,最终会转化成ACTIVE。 grafana变量设置 host 宿主机名(influxdb)' R) o# S1 b$ U- B2 ?
SHOW TAG VALUES WITH KEY=host instance_status 实例状态(prometheus)
3 @% Y ?9 h# l/ m5 `; i L label_values(openstack_nova_server_status{hypervisor_hostname="$host"}, status) instance_uuid 实例uuid(prometheus)因为此处使用prometheus查询uuid可以根据实例状态查询' g, w' j( ^+ k& P
label_values(openstack_nova_server_status{hypervisor_hostname="$host",status="$instance_status"}, uuid) virt_interface 实例虚拟网卡(influxdb)6 `. r; l% C4 B: C- O o5 N' j- d5 T
SHOW TAG VALUES FROM virt_rx,virt_tx WITH KEY=type_instance WHERE instance='$instance_uuid' virt_disk 实例虚拟磁盘(influxdb)/ H* y3 B4 E/ g
SHOW TAG VALUES FROM virt_read,virt_write WITH KEY=type_instance WHERE instance='$instance_uuid' instance_name 实例名(prometheus)( K1 J& g( H, |/ ^/ y; ~7 ` c
label_values(openstack_nova_server_status{id="$instance_uuid"}, name)7 P) t* ~$ s w6 |- Q
# O# z+ O) ~7 w5 ]: m7 ^) hpanel都不用改变。。。。。。 https://download.csdn.net/download/dandanfengyun/15137036 这里有一个问题 不知道理解的对不对。。。6 M, S$ i4 ^6 ` _9 L
prometheus和collectd都是时序数据库。- u; K5 f4 a5 Z# Q! N
Prometheus记录的实例信息也是按时间存放多个的。(隔一段时间存放当时的实例状态信息) grafana变量也是和时间相关的(也就是grafana变量不仅和其他变量相关,也和时间相关)
; }% v7 F j2 A f; S也就是说,一个实例的状态信息选择时间段不同,是可能有多个不同的变量的。
& Z/ p! }- i; g; l. K8 z: y6 z+ T' O如变量为实例运行状态 15分钟前关闭了该实例。假设只有两个实例,一个运行 一个15分钟前关闭。 那么选择5分钟前到现在的时间段,变量就有active和shutoff。active的实例只有一个,shutoff的实例也只有一个。 被删除的实例则没有ACTIVE或SHUT OFF状态,但是prometheus和influxdb中都记录了被删除前虚拟实例的运行状况。 但是当选择30分钟前到现在的时间段,变量就有active和shutoff。shutoff的实例还是只有一个,但是active的实例有两个(这个听起来有点那啥),只要记住 prometheus是时序数据库,不能把该变量当成真正的纯粹记录当前实例状态的布尔值。 30前到15分钟前,该实例是active的,15分钟前到现在,该实例是shutoff的,所以该实例有两个运行状态。。。 问题
9 c' w1 O& }6 z! ?1 rcollectd 无法通过OpenStack获取用户等信息。如果要使用grafana展示可能要通过prometheus。3 q3 C5 u J1 [/ Y. G* t
grafana需要通过prometheus和influxdb两个数据源才能展示实例的状态信息。 collectd也无法收集实例 内空间使用占用情况。- k: I# C) z! L; a0 j
|