|
collectd是一个守护(daemon)进程,用来收集系统性能和提供各种存储方式来存储不同值的机制。6 W5 P, n2 ~+ ?) b. {" [9 J2 A9 u
influxdb 是一个时序数据库。* `+ r- @2 I( Y8 b6 \
grafana是一个前端展示工具。 可以使用collectd 的virt插件通过Libvirtd 的API 收集虚拟机的数据,然后保存到时序数据库influxdb。最后通过grafana将influxdb中存储的数据以图标的形式展示出来。 一、部署 collectd influxdb grafana prometheus
' e' k# t! o8 D6 ?; X/ D" i( k1.修改全局配置globals.yml文件,设置部署监控相关文件。 vim /etc/kolla/globals.yml & f& ?1 C! y3 m: W/ Z% m; F3 P
7 Z3 c% s4 \* f2 a
enable_collectd: "yes"
1 N; u( B0 }# y# {- Penable_grafana: "yes"
7 }8 E0 o* x2 _enable_influxdb: "yes" & s4 U8 ~+ o ~/ \
enable_prometheus: "yes" * |. t$ {2 F6 Q# a: ?2 F0 j
prometheus_cmdline_extras: "-storage.local.retention 720h" % X5 b8 Q9 W, Q1 b# @" y4 N
/ z: w) }9 U6 N5 X) ]prometheus-server 数据保存30天 单位d无法识别。可以附加的参数 可参考 https://blog.csdn.net/dengxiangbao3167/article/details/102365367相应的prometheus的exporter包含 #enable_prometheus_haproxy_exporter: "{{ enable_haproxy | bool }}"
/ d! M' ]+ |& \: o. m#enable_prometheus_mysqld_exporter: "{{ enable_mariadb | bool }}"
6 | a) d3 e3 X% F. _8 x; r; V#enable_prometheus_node_exporter: "{{ enable_prometheus | bool }}"
4 L& z* E" B' l! e#enable_prometheus_cadvisor: "{{ enable_prometheus | bool }}"
" }- O5 b; k7 U. v/ p' n#enable_prometheus_memcached: "{{ enable_prometheus | bool }}"
; h# R% C5 _0 [( M- P* `8 Y#enable_prometheus_alertmanager: "{{ enable_prometheus | bool }}"
0 M# u' H1 i, _1 X9 x#enable_prometheus_ceph_mgr_exporter: "{{ enable_prometheus | bool and enable_ceph | bool }}"
7 }/ b5 y0 o0 g/ M3 K/ f#enable_prometheus_openstack_exporter: "{{ enable_prometheus | bool }}"
* t* l6 d# t8 h#enable_prometheus_elasticsearch_exporter: "{{ enable_prometheus | bool and enable_elasticsearch | bool }}"
( T y% S7 E4 u2 |( u#enable_prometheus_blackbox_exporter: "{{ enable_prometheus | bool }}"
3 ?1 C3 W- q" Z. a/ {' P) @/ I5 L# | v% e' r: E- X3 v
2.安装部署相应的容器组件 kolla-ansible deploy -i /etc/kolla/all-in-one C& E, o( O0 v% f: E6 u# I( l
11 |! _- b* z2 H1 J% f* Y! w& K% c
3.完成后查看相关组件docker容器是否部署完成 docker ps -a | grep -e collectd -e influxdb -e grafana -e prometheus
# E4 f8 j6 }4 R/ a9 X L; F1 ( F) a: ^' G0 F* x6 j
二、修改相应配置文件,通过libvirt监控虚拟机
/ B+ W$ E7 p( I3 p y4 M# O2 d) T自定义的配置文件位置,该位置的配置文件会取代默认配置文件。 # The directory to merge custom config files the kolla's config files( e& J( D9 s1 T7 X9 m7 `* [" c
node_custom_config: "/etc/kolla/config", h2 ?! e! r% O
9 b5 B, ^0 e1 |: _8 e, N% Tmkdir /etc/kolla/config
$ q4 H A6 S1 Q$ D- J' t1 P, Y; e+ t& ^1 [" j" \) c% l( ]
使用kolla部署完成后。默认配置文件是/etc/kolla/<< service name >>/<< config file >>。/ [3 n" V' m! ?8 i6 F. ^1 [
自定义配置文件路径是/etc/kolla/config/,且自定义配置文件一旦设置,就会覆盖且替换原配置文件。
/ h! q) v; A) U* U: a9 I路径可以是 /etc/kolla/config/<< config file >>,
9 v; `! [4 {+ m/etc/kolla/config/<< service name >>/<< config file >>,
# G! i# @* _ I! Q/etc/kolla/config/<< service name >>/<< hostname >>/<< config file >>
) H( W* U# j2 f% N' f I# R3 O4 e! H! V: Y% Q1 B( q
1.collectd 配置4 o0 r( g% r3 k1 V$ J" `. Y$ L8 n
libvirt有不同的虚拟机库, 通过API可以访问控制虚拟机。OpenStack也是通过libvirt的API也控制底层的虚拟机的。 cp /etc/kolla/collectd/collectd.conf /etc/kolla/config/" T; q; U* b2 ~/ ` ?. ?5 ?! ~
vim /etc/kolla/config/collectd.conf
8 T; G; @9 M3 c' ~1
N* y( \" ~$ L3 }5 i5 c. j1 u2
7 V- I2 N( g7 R8 vFQDNLookup false3 u% p+ g2 B8 u) H5 M
LoadPlugin syslog0 g$ o7 `3 a) D( w
LoadPlugin cpu' d Z# X5 W8 m( }7 z
LoadPlugin interface
# T3 ~& I2 x8 n7 wLoadPlugin load: X7 F/ H, i' w
LoadPlugin memory LoadPlugin network LoadPlugin logfile
" H1 [/ N# X9 D: h- bLoadPlugin virt
7 |! A8 K0 U- K; o# a) `2 y<Plugin network>
4 Y' r9 |; i$ `* H Server "192.168.199.90" "25826"
- J2 K, V1 b5 ^2 F' ]: c) [, J</Plugin>
7 `* c$ p9 s1 _! Y( H$ j6 L
<Plugin logfile>
- f1 V1 {& U# _ LogLevel info
1 g( r% u8 N& Y* L" U2 ? File "/var/log/kolla/collectd/collectd.log"
7 A! _: e2 N& U* O( c& m. Z Timestamp true
y+ Z) d/ v5 ^- c" v7 }# l& ` PrintSeverity false
# G% b) {( c) W l% t* }# R</Plugin>
3 i5 w) ]) l$ X9 f9 R" B u/ [<Plugin virt>; J; h- p0 d5 Y3 {
Connection "qemu+tcp://192.168.199.90/system" O1 a5 o4 D/ [. C
HostnameFormat hostname! t5 U( n1 g. N. u4 B& N
PluginInstanceFormat uuid G; f9 K% W$ g6 U3 z, }
BlockDeviceFormat target
# B0 S' r# c1 }" ` InterfaceFormat name
' f- W/ c: V j& q4 i! g ExtraStats "cpu_util"
* h0 n3 Q1 e5 U; i6 d</Plugin>
5 O) V2 k7 m& a4 n+ `8 p5 i0 `. v6 T" e+ W7 x B
启用了插件 logfile virt network。logfile是日志插件,virt就是与libvirtd的API通信的插件,network网络插件将收集的数据通过网络发送出去。
network插件设置。 Server "192.168.199.90" "25826"
4 _( q/ E7 _9 _% U1
c7 K# k: f3 |/ |3 G表示将数据发送到192.168.199.90主机的25826端口。就是下一步设置的influxdb收集collectd数据的主机 端口。 LoadPlugin cpu
$ q+ y, {7 v: D/ O: P1 BLoadPlugin interface
' z) m. b$ D7 M! e! x0 RLoadPlugin load9 x) T* O3 A8 z, r1 h7 X
LoadPlugin memory) U' L! g& o. w5 K9 i$ X/ d
8 @5 O( ^1 d; N" r7 d
这四个插件是用来收集宿主机的信息的。interface可能还会监听了虚拟机虚拟网卡的信息,如果不希望通过interface插件收集虚拟网卡信息(virt插件会收集)。可以设置interface只监听想要监听的网卡名。 <Plugin "interface">
! `+ @2 c* ^" ` Interface "ens33"' l. y* h( y A# X. e& `
Interface "ens34"
: [* S/ N% k# j. P+ z</Plugin>* S2 i# l! _9 l. q% B6 y
/ `; u8 z0 D$ Z( j6 q- G) u/ Evirt 插件设置 <Plugin virt> ( G- |4 ^ v# ?. J/ M0 a! N
Connection "qemu+tcp://192.168.199.90/system" - E: G( d; U* Z: N: E- y: {/ I
HostnameFormat hostname " Q5 ~6 q( B4 a7 J
PluginInstanceFormat uuid
5 J8 n* ]' G, b6 B) x3 `0 ]+ { BlockDeviceFormat source
# J! E1 I9 |" v- D% ~; w BlockDeviceFormatBasename false }4 j: a T" A$ j
InterfaceFormat name
* t' M# a3 l6 l+ T! K3 B ExtraStats "cpu_util"
1 o# d( T" f: O% |</Plugin>
; }3 c5 W1 `8 V$ W0 z% o# l. m4 b) X9 e6 }
具体参数详情可以看官网 - o Q0 X3 y) m+ K) v
https://collectd.org/documentati ... 5.shtml#plugin_virtConnection 表示连接的libvirt API服务。
/ n4 X. h. ^8 `5 ` 就像使用qemu+kvm创建虚拟机时使用virsh管理时使用virsh -c qemu+tcp://192.168.199.90:16509/system 8 |* ?: M1 G( d! E$ U( h9 u1 B
即可连接到libvirtd服务控制虚拟机相关。由于16509是默认端口号,可以省略" J( |* @+ H3 T- N( l: s7 i
由于是ALLInOne 所以collectd设置只有一个,多个主机部署时,需要每个计算节点上安装collectd指向本机的libvirt。
% K, {* v1 Q5 w 因此每个collectd设置文件都不相同。 HostnameFormat name|uuid|hostname|...
6 P) J/ r- H! X, _8 e% g( m 当virt插件记录数据时,会根据此设置设置所收集数据的主机名。4 |9 ^/ V% a0 K; m
默认的做法是使用hypervisor提供的来宾名称,这等于设置为虚拟机name。8 l& a! ]! Z/ |5 p
UUID 意味着使用虚拟机的UUID。如果您想跨迁移跟踪同一个客户,这是很有用的。 a, X7 w7 K9 _$ r
hostname 意味着使用“全局主机名”设置,这本身可能并不有用,因为所有来宾似乎都有相同的名称。
" z9 t9 {+ u' }" m0 @ \* G hostname就是宿主机名。。。这个其实挺重要的(在有多个宿主机的虚拟机数剧都保存到一个数据库时,可以通过hostname来确定不同虚拟机在哪一个主机。)
3 y- V& x" a( N3 Q ]( r" h7 c 至于实例的 名称或UUID 可以使用PluginInstanceFormat来设置 PluginInstanceFormat name|uuid|none. v9 ^. f2 T% j7 O
当virt插件记录数据时,它会根据此设置设置所收集数据的plugin_instance。默认情况是不设置plugin_instance。(只有一个宿主机时可以直接设置HostnameFormat name来代替PluginInstanceForma的设置)
. @) [; Y0 w3 o$ a$ W! Q! R; k name是指使用管理程序提供的虚拟机名称。UUID意味着使用虚拟机的UUID。
) \. g6 r! x B+ S4 n0 ~ OpenStack中是根据uuid来管理虚拟机的,虚拟机在libvirtd中的name和OpenStack中设置的并不一致。libvirtd底层管理是自动生成的,OpenStack中创建时手动命名的。6 o+ }) [* q. K3 b5 W B- ]+ x
HostnameFormat和PluginInstanceFormat都可以使用多个fields。如name uuid。会同时显示名称和uuid中间使用 : 分隔。如foo:1234-1234-1234-1234 BlockDeviceFormat target|source
?7 p z: \( f( [ w* v3 x 挂载到虚拟机中的磁盘设备名设置。
0 O7 P: X% j0 \- U virsh # domblklist instance-0000000a
5 B& e. \: p; \/ C+ @7 m Target Source2 |$ N0 p, \ B3 r7 j7 J$ P
------------------------------------------------! h( P' ~2 l7 _
vda /var/lib/nova/instances/86862558-141c-45b7-bfcf-b4e497f91bda/disk
7 ^+ f- @, j+ ` vdb /dev/sdc2 F; \, C0 @ U- J' u% m7 {
target 是映射到实例中的磁盘名 vda vdb。即实例中可以通过lsblk看到的。7 a. x& S O; p! U- |2 @3 `7 v0 @- Q
source 虚拟磁盘对应的路径及磁盘文件名。/var/lib/nova/instances/86862558-141c-45b7-bfcf-b4e497f91bda/disk /dev/sdc, p! W% o% X' j' S
如果设置BlockDeviceFormatBasename设置为true,则只显示文件名 不显示前面的路径。 默认未设置BlockDeviceFormatBasename,是false即显示前面路径
+ M$ w9 }" v, _1 V4 {InterfaceFormat name|address) q* G8 {& g" }* J8 J' j4 \( v
虚拟机的网卡显示 name或者address。name网卡名,address网卡mac地址。
+ `$ z" k( ?6 P( f" b5 d: _6 c o5 ~9 y: C# u
ExtraStats "cpu_util"
5 l; `- Y ~( x virt额外记录的数据。此处只设置了一个cpu_util 即CPU的利用率。* ^/ q* X+ C! v: o) g; f
virsh # domiflist instance-00000002
$ J$ r) ^8 F% `/ Z% t- }. ] Interface Type Source Model MAC' A1 N; N& t( I0 H) Q/ V) T
------------------------------------------------------- l( M* @* D4 S. q
tap97caffeb-9a bridge qbr97caffeb-9a virtio fa:16:3e:64:5f:c02 r+ A4 o5 _, M
interface就是name ,MAC就是address
8 w5 k. K0 S# |' `$ a7 D
这是单个主机ALLinOne下设置配置文件的情况,如果多个计算节点,每个计算节点的collectd的配置文件是不同的,需要单独设置(主要不同就是连接的libvirtd API的IP不同),每个计算节点需要一个collectd收集本计算节点的相应libvirt 数据。 很奇怪的一点,似乎使用kolla部署的collectd容器收集虚拟机数据时无法收集虚拟机的内存信息,只能获取虚拟机全部内存。 直接使用yum安装的collectd却可以收集used,availble 等。。。不知道原因 2.influxdb 配置7 y _( a7 U0 C7 T/ O
cp /etc/kolla/influxdb/influxdb.conf /etc/kolla/config/# S- W- ^1 y1 R$ X; S
vim /etc/kolla/config/influxdb.conf
5 c* [4 \$ K; L1
1 K2 ]7 @: f) {. n- T! [ V. n2
8 Z' z: N' s+ G; L h8 [+ B) R7 qreporting-disabled = true
$ N' S( s- L2 L) w, P2 f- T- C[logging]
" d1 g* T- i; X! t, M level = "info"
. v1 ^4 ~& Z+ A% G file = "/var/log/kolla/influxdb/influxdb.log"
! V& i" E* Q- E" r( _[meta]' u% z& p% I% a- e
dir = "/var/lib/influxdb/meta"( g/ O8 [9 s9 g. u- _1 X
retention-autocreate = true/ m3 z+ u* r% p0 t7 G
logging-enabled = true
: Z5 J( i( z: E* A, O[data]
% {, C4 Y( `' L0 A; J: v dir = "/var/lib/influxdb/data"
* `4 j, d) b u" p/ t+ G* ^8 [ wal-dir = "/var/lib/influxdb/wal"
( u/ i3 J( k) E0 a. @% Q$ | wal-logging-enabled = true0 @% R2 S1 Z( Q7 u
data-logging-enabled = true5 |& z @ ]* {: v7 R
index-version = "tsi1"
3 V6 a. |3 Q, b; k[coordinator]3 o6 j1 G& k8 p& @
write-timeout = "10s"
3 \; b2 l8 Q6 o max-concurrent-queries = 0
' h0 @% l/ r3 t* E) z2 A query-timeout = "0s"
{6 t1 |' B) B6 @. ^ max-select-point = 0) H; \1 g8 {% D" ?! P1 Z+ c
max-select-series = 0
4 l; E% B$ r* [3 h7 M* \! [ max-select-buckets = 0
3 F% H- i5 ~& c+ K' C$ A8 U# L# B9 j[retention]7 G3 R2 Q% P7 e4 n
enabled = true
# Y6 B0 {4 k+ b3 F | check-interval = "30m"
1 e5 O+ c/ H9 v5 b& x[shard-precreation]' c: f* t" {( o/ B
enabled = true
8 d! o' J2 b, q8 V5 V1 X check-interval = "10m"/ `4 ~) Z( b2 W3 z1 }5 h, H- y( y
advance-period = "30m"
! z0 L# i2 K& e E3 w[monitor]
R# M6 `1 l$ l% j) m store-enabled = true
* X3 S( B- _& f5 O( H store-database = "_internal"# M6 z' {* B$ m3 ~+ x% _
store-interval = "10s"
& d8 r. e/ Y7 D4 g6 h[http]
# i. N) d- K/ x5 A. b- z# D1 }6 Z enabled = true
: @/ f. u/ [0 a3 l- k bind-address = "192.168.199.90:8086": P4 s* i0 M+ e. P8 h, G
auth-enabled = false2 c, t, K8 S7 V
log-enabled = true
+ N; L8 n3 l7 s$ J0 }3 p$ ~- a write-tracing = false
' R9 K' f* e5 W, k$ x/ | pprof-enabled = false
& t8 {( ~/ B7 Z" Y* r7 I: b) C https-enabled = false
+ r1 C7 s2 P2 \9 e7 B! ^[[graphite]]
; V5 X) j3 G$ C p) K' A# ~ enabled = false
1 `0 v4 V5 P; o8 }[[opentsdb]]
0 Y% f2 z( _8 j' A! U0 s9 g( h enabled = false
$ L3 Y4 d3 P" b5 n[[udp]]! Q. C" T3 P6 H
enabled = false: l6 ^' [4 D" z% h. i
[continuous_queries]6 o# a9 ^4 Q1 H4 p* y3 _5 x
log-enabled = true
4 n$ Y. s( n4 c3 P enabled = true [[collectd]]
. f" r. H# d, c" g enabled = true ( ^) D) _. ]5 o' a% K
bind-address = "192.168.199.90:25826"
/ f' @0 V' c: }$ c! r. n database = "collectd"
, n* s* H& e& X typesdb = "/var/lib/influxdb/types.db" ! ]( G* k" U1 u; j
+ u" V4 U% q7 i* \8 u
主要是添加了 末尾一段。influxdb是可以作为collectd的network Server,可以将collectd发送的数据保存起来。前提是有对应的type.db数据格式。
- j5 C; n) q( F3 Chttps://download.csdn.net/download/dandanfengyun/14989445[[collectd]]
g; D7 h( C' ~5 P. ?3 ^ enabled = true4 X" ^8 y4 Z2 [4 {
bind-address = "192.168.199.90:25826") v: s6 b6 T/ Z/ Y6 P6 `' V4 u# p
database = "collectd"
. _- s: a4 L7 b, n; t1 ~7 g1 k: q typesdb = "/var/lib/influxdb/types.db"
4 {" d+ } U; r, d. i0 l" e# _# L6 m
bind-address = "192.168.199.90:25826"表示监听192.168.199.90主机25827端口的数据。然后保存到库collectd中。数据格式typesdb = “/var/lib/influxdb/types.db” 数据格式文件需要手动添加。部署OpenStack时,对于一些特别的需要存储数据的组件docker,都有相应的docker volume附加卷。直接映射到容器内。 influxdb容器附加卷在宿主机中对应位置 {% |1 [, u" u' w7 Y" I
"Type": "volume",
. I$ z0 p+ I1 q5 t5 ^0 a "Name": "influxdb",3 Z6 X4 |3 }2 `3 j1 g5 R! O E0 p
"Source": "/var/lib/docker/volumes/influxdb/_data",
0 Z1 y2 _+ L0 |" ?( @; D2 v8 z "Destination": "/var/lib/influxdb",
' R' V. b D( X' [$ m c "Driver": "local",. h* l/ ~- i" u) E- h
"Mode": "rw",8 _% P S( `* ~8 \) P g/ L
"RW": true,
: a1 ]; e: i( m' j& i" b3 X, X "Propagation": ""% ]/ ^! J0 T; T
},
' X; L4 O3 G1 ]3 w0 D将文件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
. Q/ Z7 q# y* ?) x! _$ ~, P$ X1: D2 q* p$ @9 ~5 c3 g
[root@ALLInOne-Kolla ~]# ls /var/lib/docker/volumes/influxdb/_data/2 w( |& B# j( _3 b7 O( }% f# l3 `: k
data meta types.db wal6 q6 U7 w% A* L9 F8 W2 K% ^* \$ _
1( O. i% i$ V. I- S0 e5 K
2+ y* y( @3 J- R( c! W: Q
3.加载个人配置。
" \0 o, @! S/ b9 c; T/ Fkolla-ansible reconfigure -i /etc/kolla/all-in-one
/ \' k1 N- ]8 T' p1 ?) O! J, k( \5 f1 z# M0 A! h& C
完成后,会使用个人配置替代默认配置。并重启相应的组件容器加载新的配置。 新配置生效之后,最好将influxdb数据库原数据清除一下,因为原数据中会包含一些不符合新配置的数据。 删除库 collectd 创建库collectd (如果有数据存入,该库会被自动创建的) curl -i -XPOST http://192.168.199.90:8086/query --data-urlencode 'q=CREATE DATABASE collectd'
0 i$ a, a3 [$ Q8 @; {; v, P) v+ s1
( R ?( ], E3 ]9 w查看存储策略 一般是永久保存 curl -i -XPOST http://192.168.199.90:8086/query --data-urlencode 'q=SHOW RETENTION POLICIES ON collectd'
( [+ L9 x9 ^8 m9 `4 f: E/ q% y2 y1 7 R9 q' w, {7 P( l; y9 U+ D& a X
设置新的保存策略 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' % ]& k1 F C& w
1 0 ~- l+ u8 C5 |3 e( C5 R
删除旧策略 11 d9 A& S" u" G8 L6 d8 \( l, v
2
4 \' z8 l8 I, p4.influxdb一些其它的api。
. n1 p) \+ M4 k5 a8 t! s0 v+ `1 X删除数据库 curl -G 'http://192.168.199.90:8086/query?q=SHOW+DATABASES'
$ R+ L" z! w% _" J z6 N1* O$ `; M4 K+ _+ B
查看库measurements 可以理解为表 curl -G 'http://192.168.199.90:8086/query' --data-urlencode "db=collectd" --data-urlencode 'q=show measurements'
( N( [) g/ ]0 w# C' v% j12 C9 R) L+ ]! W2 ^* G
查看具体数据 curl -G 'http://192.168.199.90:8086/query' --data-urlencode "db=collectd" --data-urlencode 'q=select * from virt_rx limit 10'
# c# j: m2 C8 j" f3 a3 Z/ D: g6 q1
9 S1 R7 Z$ f) r7 d5 T _prometheus和grafana等暂不需额外配置文件。 不过由于直接通过libvirt的API监控虚拟机状态。没有经过OpenStack,所以虚拟机的名称无法对应。需要通过虚拟机的UUID来确定。
/ Z7 H) P8 B* \( H8 K连接的是libvirt,也就是计算节点的libvirt。一个collectd只能监听一个计算节点livirtd,多节点部署多个计算节点,需要在每个计算节点安装collectd连接本节点libvirtd。
/ {8 @0 s" X/ R& ^7 U3 H对OpenStack的整体信息,如虚拟机数量等也无法统计。且虚拟机移除后,数据不会随之消失,只是无有新的数据统计。保存策略是永久。 所以需要配合prometheus使用。prometheus_openstack_exporter会获取OpenStack的整体信息。如vm数量,cinder数量,glance的镜像数量等。但是没有具体虚拟机的具体信息 。 用户 admin。密码可在grafana /etc/kolla/passwords.yml 中找grafana_admin_password egrep grafana /etc/kolla/passwords.yml
3 ~; B1 Q$ k5 J/ q8 k4 J4 k1" g# f/ X |, X+ T
登录成功后设置数据源 1.influxdb的collectd数据源 Name:collectd (这个是自定义的grafana数据源名)" l9 F3 e9 u# ^8 I$ o+ G: p
URL : 192.168.199.90:8086
4 ?2 L5 `6 v2 D' n! zDatabase:collectd 完成点Save & Test 即可,成功的话是 Data source is working9 f' y8 p1 i4 k m3 k
失败查看一下influxdb组件docker容器是否启动,IP端口对不对等。。。 2.prometheus数据源
/ A& a/ U5 h+ H8 C2.设置dashboard的变量; y& f4 U2 H( O4 q2 Y+ A1 a
基本上不可能只有一个 虚拟机,且把多个虚拟机的信息一起展示也不合理。所以设置一些变量来确定当前展示的数据是哪一个虚拟机的。
( j0 v" @% d9 R* O6 D9 zhost SHOW TAG VALUES WITH KEY=host+ L3 ^7 E5 a% @5 t2 \" j3 _
instance_uuid SHOW TAG VALUES WITH KEY=instance WHERE host='$host': a1 W7 G: u$ q5 Q$ w$ \7 } F0 q
virt_interface SHOW TAG VALUES FROM virt_rx,virt_tx WITH KEY=type_instance WHERE instance='$instance_uuid'
& V0 P8 j& d/ q4 ]9 \virt_disk SHOW TAG VALUES FROM virt_read,virt_write WITH KEY=type_instance WHERE instance='$instance_uuid'
! t% W6 n' d8 W1 e8 j6 Hinstance_name label_values(openstack_nova_server_status{id="$instance_uuid"}, name)& m6 _6 X& ^& x5 B
- ?! S7 k+ X4 i' s3 J
分别设置宿主机名 虚拟实例uuid 虚拟网卡 虚拟磁盘 以及实例名# X. C2 m" V* P, h2 f9 j
宿主机变量
虚拟机实例uuid变量 : |3 ?7 m" Q- T5 Z
虚拟网卡变量
% y- T' x$ c) R4 K/ c6 X虚拟磁盘变量
实例名
" j: j% V7 i2 `( q/ y5 ohost 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。! }, |1 j4 O/ C) n
这个根据influxdb查询语句和grafana使用个人创建即可。
+ e/ \" t9 k A2 V创建数据源 略。 点击import导入模板 2 g) [# l! s. g$ c
选择模板文件 & X) {9 ?" A1 b
最终导入
& [' G, l7 f, ?7 V T8 t5 D附5 f+ X- j7 R% Y7 z9 @+ o
如果Prometheus和influxdb中collectd数据 实例 基本一致,可以设置更多的变量信息。
9 B* _" h8 Y# O, `+ l如 实例不同状态根据Prometheus数据库查询。+ @) h4 r8 s4 E4 W
uuid也使用Prometheus 数据库根据实例状态查询。
+ j7 @2 Z: C4 k ~其他的数据根据uuid在influxdb的collectd库中查询。
. N; [$ d! X7 B, c" i一致的是,实例名依然只能作为一个展示数据,而不能作为真正变量影响数据展示。 结合了prometheus展示了虚拟机的状态,根据状态查询实例uuid,选择ACTIVE可以避免查询到已经废弃的实例,也可选择SHUTOFF查询已停止运行实例的状态 不好的是也会查到状态是BUILD的实例 不过实例状态查询 重要的就是查询最近一段时间内 活动实例 的状态,因此状态变量选择基本是ACTIVE,只用于筛选出活动的变量即可。& w7 P- d |2 @$ h g+ G
且BUILD 状态的实例BUILD状态只会存在很短的时间,最终会转化成ACTIVE。 grafana变量设置 host 宿主机名(influxdb)7 q1 s/ Y+ I7 W6 M R
SHOW TAG VALUES WITH KEY=host instance_status 实例状态(prometheus)% R$ b8 I) g4 S5 k
label_values(openstack_nova_server_status{hypervisor_hostname="$host"}, status) instance_uuid 实例uuid(prometheus)因为此处使用prometheus查询uuid可以根据实例状态查询7 i) J4 b5 l5 K4 T
label_values(openstack_nova_server_status{hypervisor_hostname="$host",status="$instance_status"}, uuid) virt_interface 实例虚拟网卡(influxdb)
' a' ?5 H. H4 _' ]7 G+ Y SHOW TAG VALUES FROM virt_rx,virt_tx WITH KEY=type_instance WHERE instance='$instance_uuid' virt_disk 实例虚拟磁盘(influxdb)$ A; C# Q) U/ B1 Q- \1 S2 Q. Z
SHOW TAG VALUES FROM virt_read,virt_write WITH KEY=type_instance WHERE instance='$instance_uuid' instance_name 实例名(prometheus)& {9 A V* o/ l$ K2 r f, p3 G' i
label_values(openstack_nova_server_status{id="$instance_uuid"}, name), R3 A/ L1 z8 C) n
& d& J. i9 o0 Opanel都不用改变。。。。。。 https://download.csdn.net/download/dandanfengyun/15137036 这里有一个问题 不知道理解的对不对。。。1 t% P. v0 K0 C: |; i, @$ a" q
prometheus和collectd都是时序数据库。% A; k; m; F# d6 E# ^1 ^
Prometheus记录的实例信息也是按时间存放多个的。(隔一段时间存放当时的实例状态信息) grafana变量也是和时间相关的(也就是grafana变量不仅和其他变量相关,也和时间相关)6 I% S1 a2 e' K0 }
也就是说,一个实例的状态信息选择时间段不同,是可能有多个不同的变量的。
, F0 g7 J/ u7 U( ]2 l0 R如变量为实例运行状态 15分钟前关闭了该实例。假设只有两个实例,一个运行 一个15分钟前关闭。 那么选择5分钟前到现在的时间段,变量就有active和shutoff。active的实例只有一个,shutoff的实例也只有一个。 被删除的实例则没有ACTIVE或SHUT OFF状态,但是prometheus和influxdb中都记录了被删除前虚拟实例的运行状况。 但是当选择30分钟前到现在的时间段,变量就有active和shutoff。shutoff的实例还是只有一个,但是active的实例有两个(这个听起来有点那啥),只要记住 prometheus是时序数据库,不能把该变量当成真正的纯粹记录当前实例状态的布尔值。 30前到15分钟前,该实例是active的,15分钟前到现在,该实例是shutoff的,所以该实例有两个运行状态。。。 问题 P6 K6 q9 t9 c( N/ V
collectd 无法通过OpenStack获取用户等信息。如果要使用grafana展示可能要通过prometheus。
4 {8 y! ]! S6 S3 a' f G) z9 Y Bgrafana需要通过prometheus和influxdb两个数据源才能展示实例的状态信息。 collectd也无法收集实例 内空间使用占用情况。# Q+ ?0 L6 ^9 u3 i
|