马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
collectd是一个守护(daemon)进程,用来收集系统性能和提供各种存储方式来存储不同值的机制。
7 ]4 I# ~; r% Hinfluxdb 是一个时序数据库。) L% W5 |9 P0 k; C/ u
grafana是一个前端展示工具。 可以使用collectd 的virt插件通过Libvirtd 的API 收集虚拟机的数据,然后保存到时序数据库influxdb。最后通过grafana将influxdb中存储的数据以图标的形式展示出来。 一、部署 collectd influxdb grafana prometheus' ?5 ^0 F0 p H- L, }
1.修改全局配置globals.yml文件,设置部署监控相关文件。 vim /etc/kolla/globals.yml
* J# J/ Z7 I- x' G" w2 O5 b' f' e% \* a0 B4 {/ d3 S. L
enable_collectd: "yes" . D9 D6 z7 f2 K" ]$ e- P
enable_grafana: "yes" 4 |7 d3 p; a8 S5 g* D7 b
enable_influxdb: "yes"
. n: A3 Z+ X* {, r6 Oenable_prometheus: "yes"
- y4 t5 j, N6 I' T" Nprometheus_cmdline_extras: "-storage.local.retention 720h"
: s! O3 d6 t/ C- v) K1 d7 \$ u# g& U5 x- w) [' X- W
prometheus-server 数据保存30天 单位d无法识别。可以附加的参数 可参考 https://blog.csdn.net/dengxiangbao3167/article/details/102365367相应的prometheus的exporter包含 #enable_prometheus_haproxy_exporter: "{{ enable_haproxy | bool }}"
& [* r) c0 q" o7 ?' r- L6 C#enable_prometheus_mysqld_exporter: "{{ enable_mariadb | bool }}"
) N, `, v- T7 l! w2 v5 h#enable_prometheus_node_exporter: "{{ enable_prometheus | bool }}"
7 k5 d. f6 Y( o# c7 Z- W#enable_prometheus_cadvisor: "{{ enable_prometheus | bool }}"
4 M- S/ z' c1 p5 _! M+ Q* g#enable_prometheus_memcached: "{{ enable_prometheus | bool }}"
; ~+ r/ P' `/ M#enable_prometheus_alertmanager: "{{ enable_prometheus | bool }}"
2 Z- d# X$ [% t+ Y# R7 y" ]+ i4 C#enable_prometheus_ceph_mgr_exporter: "{{ enable_prometheus | bool and enable_ceph | bool }}"
% a2 \; _$ ], M6 u- G, s8 f) L#enable_prometheus_ openstack_exporter: "{{ enable_prometheus | bool }}"
' k! o9 D; S' W k6 d#enable_prometheus_elasticsearch_exporter: "{{ enable_prometheus | bool and enable_elasticsearch | bool }}" + ?5 N0 ?7 S1 }3 J2 E( [
#enable_prometheus_blackbox_exporter: "{{ enable_prometheus | bool }}" . Y' k8 T) v J& |$ f
: y, D$ _6 W1 U3 G6 @, X( O
2.安装部署相应的容器组件 kolla-ansible deploy -i /etc/kolla/all-in-one
, R# m/ y9 o& j; v6 z18 f o5 F3 _8 J/ M
3.完成后查看相关组件docker容器是否部署完成 docker ps -a | grep -e collectd -e influxdb -e grafana -e prometheus
7 {' q( T7 ?' U ?! i1 5 u7 W& F6 m9 H, I4 r+ M, Q0 r5 R
二、修改相应配置文件,通过libvirt监控虚拟机
: H; `! q% C7 P' [4 A' l自定义的配置文件位置,该位置的配置文件会取代默认配置文件。 # The directory to merge custom config files the kolla's config files
2 n% K0 K# k4 R/ P. @node_custom_config: "/etc/kolla/config"* N/ C& _2 d6 f, j; ^4 _
% b2 Y3 w3 N8 I: H7 X6 b0 t3 _- c: P
mkdir /etc/kolla/config
! d9 C# S6 @. r1
. ^6 n! S$ b6 s4 L使用kolla部署完成后。默认配置文件是/etc/kolla/<< service name >>/<< config file >>。
9 ^5 Z+ e* D9 _9 F- x自定义配置文件路径是/etc/kolla/config/,且自定义配置文件一旦设置,就会覆盖且替换原配置文件。
0 Y- t _7 m! O- Q7 h路径可以是 /etc/kolla/config/<< config file >>,
, h2 w7 p1 r' s; I$ ~+ P$ F/etc/kolla/config/<< service name >>/<< config file >>,
; a+ x, Y1 ?% A/etc/kolla/config/<< service name >>/<< hostname >>/<< config file >>" L1 p% V7 |" I& C( O' W f6 x
& R! x$ F' |3 {8 ~# k3 k1.collectd 配置6 [0 [! O0 A' u: w5 Y8 n
libvirt有不同的虚拟机库, 通过API可以访问控制虚拟机。OpenStack也是通过libvirt的API也控制底层的虚拟机的。 cp /etc/kolla/collectd/collectd.conf /etc/kolla/config/
1 T9 k- S' e' u! p& _) c# P4 |vim /etc/kolla/config/collectd.conf 4 |! o, ~% b# J
1
+ {+ U/ k. ^: }2 m7 m: u$ u+ x6 @! C: k- y
FQDNLookup false4 i4 ~# z( T6 e& l. J
LoadPlugin syslog$ H$ E6 u1 K6 \) a# b- D& S- N' v) y
LoadPlugin cpu
' ]' a, ^# S7 C- O; y- ]- ZLoadPlugin interface
: {8 Q1 C; S" XLoadPlugin load
T) |3 ^# z! c" |* x; |# ^: [/ ALoadPlugin memory LoadPlugin network LoadPlugin logfile
3 s2 a/ w% T7 T# ]6 }9 d2 X$ C4 ~6 XLoadPlugin virt / @" T1 d& n# o# e, D
<Plugin network>0 N" E! J" J* [2 {* X1 o: X: B+ f
Server "192.168.199.90" "25826"
( I. @/ a5 L+ U5 o) q/ z: X! u</Plugin>
9 w5 R" M" \( ]$ W<Plugin logfile>
; e, f. ]; @8 ]$ i& j* \ LogLevel info/ ~1 O8 W$ Z! P( m
File "/var/log/kolla/collectd/collectd.log"
6 P8 g+ I" i, y( x& j Timestamp true
9 C) Q+ ^( o; Z PrintSeverity false3 H! w2 l% V E6 W4 n
</Plugin>
5 F# K& Y" K9 L/ p; E/ ]
<Plugin virt>0 P; S2 z8 I6 K7 h1 q* F6 r3 ?' a
Connection "qemu+tcp://192.168.199.90/system"5 \/ }6 b& B* `+ e9 x
HostnameFormat hostname. `0 U* [% f, A/ g4 @
PluginInstanceFormat uuid
) ^8 s" y$ \3 P% R! ~( V( L BlockDeviceFormat target
; s! F ?$ k/ A) c( _; | InterfaceFormat name
% x8 A9 h2 J" I ExtraStats "cpu_util"
# D, w1 V5 H8 w( d" P4 y- `2 [0 P. F</Plugin>
! p2 B7 r; V& C% {" Q+ k7 x$ p% }7 N4 x# G: P9 n
启用了插件 logfile virt network。logfile是日志插件,virt就是与libvirtd的API通信的插件,network网络插件将收集的数据通过网络发送出去。 network插件设置。 Server "192.168.199.90" "25826"
% n9 x# A- y, g% {- G5 M5 ?1+ l& D2 R# \8 W
表示将数据发送到192.168.199.90主机的25826端口。就是下一步设置的influxdb收集collectd数据的主机 端口。 LoadPlugin cpu
' N5 }& s n& d! W; _9 V+ K- y! \LoadPlugin interface% g z% u5 A: W, A
LoadPlugin load
4 G! ?/ Y" l" R7 GLoadPlugin memory( S+ C* [# m. s5 x% p
! u7 C7 {) |6 u$ s1 L- q这四个插件是用来收集宿主机的信息的。interface可能还会监听了虚拟机虚拟网卡的信息,如果不希望通过interface插件收集虚拟网卡信息(virt插件会收集)。可以设置interface只监听想要监听的网卡名。 <Plugin "interface">, B" o8 M( G0 I
Interface "ens33"
+ N% o0 }* Y, f y4 R5 t2 } Interface "ens34"4 ^' P. H/ M4 U( g
</Plugin>$ R" L( E& n& @5 t* o8 r. F. G
I% }: t; ?. B" L+ I5 j6 \: ^1 Gvirt 插件设置 <Plugin virt> * w, a. }" a) `- q4 ]' W$ A& B# U( R
Connection "qemu+tcp://192.168.199.90/system"
9 o% y# Y& y2 [" M- D HostnameFormat hostname
0 \0 o2 M# ^6 _) L PluginInstanceFormat uuid
/ O1 `% _3 E; C% s* W3 O+ Z1 I BlockDeviceFormat source
5 a! y0 s$ \& _4 D: r BlockDeviceFormatBasename false 6 y' |( T- |) W" H
InterfaceFormat name
" d* @/ g1 F+ ~) o ExtraStats "cpu_util" ; t5 t" g2 M; t9 `. L2 v- T8 W
</Plugin> . S0 J' {" S' B$ K# u2 F; O
8 H" V3 l! b$ U! W6 I
具体参数详情可以看官网 , ^ O( m6 Z. I4 c% h9 G3 ?& l( S& l6 Z
https://collectd.org/documentati ... 5.shtml#plugin_virtConnection 表示连接的libvirt API服务。
% ]5 B C. K: v! z/ J8 o& _ 就像使用qemu+kvm创建虚拟机时使用virsh管理时使用virsh -c qemu+tcp://192.168.199.90:16509/system # |. S# b/ a" w6 d. m# v
即可连接到libvirtd服务控制虚拟机相关。由于16509是默认端口号,可以省略* a- _4 i" F" L6 n( `; p" f0 D
由于是ALLInOne 所以collectd设置只有一个,多个主机部署时,需要每个计算节点上安装collectd指向本机的libvirt。# b3 K/ T7 r) j) o* p4 W: \% @
因此每个collectd设置文件都不相同。 HostnameFormat name|uuid|hostname|...9 U- w3 W9 }# `1 i9 _3 z
当virt插件记录数据时,会根据此设置设置所收集数据的主机名。- w2 c9 V. f. K% U$ c4 ^
默认的做法是使用hypervisor提供的来宾名称,这等于设置为虚拟机name。/ ? H5 J* O8 v; `, `( F: F
UUID 意味着使用虚拟机的UUID。如果您想跨迁移跟踪同一个客户,这是很有用的。 A Q9 g3 \4 b
hostname 意味着使用“全局主机名”设置,这本身可能并不有用,因为所有来宾似乎都有相同的名称。4 K* H5 q/ N. ]) _0 t: ^3 ~, C! p
hostname就是宿主机名。。。这个其实挺重要的(在有多个宿主机的虚拟机数剧都保存到一个数据库时,可以通过hostname来确定不同虚拟机在哪一个主机。)
8 v+ @6 B+ W( d 至于实例的 名称或UUID 可以使用PluginInstanceFormat来设置 PluginInstanceFormat name|uuid|none7 k# j0 C, [5 y2 p7 f/ h% d
当virt插件记录数据时,它会根据此设置设置所收集数据的plugin_instance。默认情况是不设置plugin_instance。(只有一个宿主机时可以直接设置HostnameFormat name来代替PluginInstanceForma的设置)
* U2 V4 r' T1 x+ ]4 X* j name是指使用管理程序提供的虚拟机名称。UUID意味着使用虚拟机的UUID。
4 I/ ^% i; d0 c5 x# j OpenStack中是根据uuid来管理虚拟机的,虚拟机在libvirtd中的name和OpenStack中设置的并不一致。libvirtd底层管理是自动生成的,OpenStack中创建时手动命名的。
8 |8 y/ {% d% r6 L HostnameFormat和PluginInstanceFormat都可以使用多个fields。如name uuid。会同时显示名称和uuid中间使用 : 分隔。如foo:1234-1234-1234-1234 BlockDeviceFormat target|source: x# G/ B/ V5 h+ k# h
挂载到虚拟机中的磁盘设备名设置。. G4 ~3 y% w" f I5 K4 Y6 C
virsh # domblklist instance-0000000a+ e$ ^: ]- i* }6 Q& n& D
Target Source
5 w( ~. v9 h) ?9 m8 ^4 t& d7 D ------------------------------------------------! I& E0 e) [" U6 s' p# E
vda /var/lib/nova/instances/86862558-141c-45b7-bfcf-b4e497f91bda/disk+ a) o9 X9 t1 w
vdb /dev/sdc/ `. ~7 e3 \4 M4 F. A
target 是映射到实例中的磁盘名 vda vdb。即实例中可以通过lsblk看到的。! }7 T) k) V" J* a- M$ T
source 虚拟磁盘对应的路径及磁盘文件名。/var/lib/nova/instances/86862558-141c-45b7-bfcf-b4e497f91bda/disk /dev/sdc
& y8 a6 U) \& x, l- v 如果设置BlockDeviceFormatBasename设置为true,则只显示文件名 不显示前面的路径。 默认未设置BlockDeviceFormatBasename,是false即显示前面路径 ' U3 @! H& w3 z# X3 y/ l1 f* @
InterfaceFormat name|address
! K$ ]2 _9 j' f4 j4 s7 i 虚拟机的网卡显示 name或者address。name网卡名,address网卡mac地址。
( M6 n$ Z3 f7 _4 q( H6 _ 0 s; K/ e; F% m& {( P6 ?0 p
ExtraStats "cpu_util"& l" J5 f- I) } o0 r
virt额外记录的数据。此处只设置了一个cpu_util 即CPU的利用率。
; L& |) o5 m5 p virsh # domiflist instance-00000002
5 D% q3 M8 g% E( f Interface Type Source Model MAC
! P; u. P- i9 K# p4 D -------------------------------------------------------
: a# N0 Y2 m6 T4 I4 S) i& s. e3 f tap97caffeb-9a bridge qbr97caffeb-9a virtio fa:16:3e:64:5f:c0; C5 p! M0 S% R1 Y# ^
interface就是name ,MAC就是address
$ z4 E0 K1 M( w这是单个主机ALLinOne下设置配置文件的情况,如果多个计算节点,每个计算节点的collectd的配置文件是不同的,需要单独设置(主要不同就是连接的libvirtd API的IP不同),每个计算节点需要一个collectd收集本计算节点的相应libvirt 数据。
很奇怪的一点,似乎使用kolla部署的collectd容器收集虚拟机数据时无法收集虚拟机的内存信息,只能获取虚拟机全部内存。 直接使用yum安装的collectd却可以收集used,availble 等。。。不知道原因 2.influxdb 配置
# i; [1 @0 n* @cp /etc/kolla/influxdb/influxdb.conf /etc/kolla/config/
; q9 r7 u$ y! Wvim /etc/kolla/config/influxdb.conf . R, y" O( C% P* y" R
1
) m. f9 ~7 E8 i$ y+ l. z1 X: q2
$ T2 ^& ^- F' o9 jreporting-disabled = true) D+ K- z0 V. s9 E. C: X t' \
[logging], p% `5 M5 ^7 I
level = "info") L: N; o7 E9 }* I0 ?/ e
file = "/var/log/kolla/influxdb/influxdb.log"
, M, B* J# R8 n; R1 a[meta]
) A8 ^ n+ e2 d dir = "/var/lib/influxdb/meta"
9 ]- d1 S5 r+ D" f8 {! t retention-autocreate = true
4 S% N# U; r/ ^( k- I( Q+ j logging-enabled = true d/ H, u. u: L: I. d
[data] y6 K6 Z3 Z8 T" w
dir = "/var/lib/influxdb/data"/ Q8 I4 L2 J5 b9 `+ W- y1 J
wal-dir = "/var/lib/influxdb/wal"
: s! H% D/ X; @1 | wal-logging-enabled = true9 l1 I2 J" G& C
data-logging-enabled = true0 A0 ?4 q1 x* h
index-version = "tsi1"
; c; |, q6 Z5 |5 ]7 E' O" ~% i; U[coordinator]) J8 N/ u* v& Q0 a A* b/ t- q: {) ~
write-timeout = "10s"
9 {8 i+ H6 [ M* e x max-concurrent-queries = 0
3 c; `9 \0 q; ?+ N& M, O9 B query-timeout = "0s"* w! \7 q1 @4 }
max-select-point = 0 p( P5 H' e0 N
max-select-series = 02 v5 _% U# A, E+ `8 x! `$ \
max-select-buckets = 0
8 V1 [+ E9 l$ D5 n, }: x[retention]
* P6 ]) g( m3 q- n7 v8 F enabled = true
8 o! t* q/ k2 t9 [' o3 n check-interval = "30m"( _8 X* S# {: k; }! i# X( @
[shard-precreation]
( C( @; r% ]7 U6 k5 I+ G enabled = true5 z, M$ ^5 u2 }- [* u& z
check-interval = "10m"
: v% ~6 H5 B& S- ]4 i2 Z advance-period = "30m"
4 I* n% s0 E+ q. G0 s9 b5 {8 v' ?0 c[monitor]7 ^ e7 ~4 g8 Z: ~
store-enabled = true
4 r* ?2 a* G5 ?% }. n' ? store-database = "_internal"
: x3 F, E/ h: n& n7 ] store-interval = "10s"& _9 _" E$ n( R" b- K
[http]
( X2 _$ g, {3 e4 d# T- ?% j enabled = true
/ J$ H% i9 t) `; l3 K& h' ^ bind-address = "192.168.199.90:8086"
) H6 X& c* S) r! @& X2 ` auth-enabled = false
( z6 d! R) F% j log-enabled = true' l3 @, o7 k; a# l" A Q- X0 b; a: y. {
write-tracing = false8 R2 K; ^% Q- q6 i# _
pprof-enabled = false) u; l+ \$ K! ]
https-enabled = false
0 m/ K t0 o1 U: |6 t# O$ p[[graphite]]
2 H, u: l) E" T# P3 `7 L enabled = false
# x, k/ F3 _/ o[[opentsdb]]
3 o1 I {' D# f0 x enabled = false- A6 J! y# t" I0 b4 [5 F
[[udp]]
+ `$ s5 Z( J7 t# O8 u) e0 Z enabled = false. d" a' S3 f+ ]7 ]: g
[continuous_queries]
2 V! R9 C) L3 r. k log-enabled = true
$ k, f" ]" K$ V: L! m% D% |9 y, ] enabled = true [[collectd]] , U$ Y0 g+ i$ r. C
enabled = true
3 |5 `/ W3 q, U7 v6 L2 T. [ bind-address = "192.168.199.90:25826" 2 b- ~- @7 O) `3 b* Y: @
database = "collectd" 9 m6 E1 [: ?- _# R: v+ h& I/ y
typesdb = "/var/lib/influxdb/types.db"
- V8 X3 K" ?3 v7 E
: l; d" e, y( k3 H0 p( d1 j9 c" a主要是添加了 末尾一段。influxdb是可以作为collectd的network Server,可以将collectd发送的数据保存起来。前提是有对应的type.db数据格式。
' v+ Z7 l: W/ |9 |3 `0 `) Ihttps://download.csdn.net/download/dandanfengyun/14989445[[collectd]]
, T, @" \ ^4 j$ L3 Y enabled = true
2 a% d1 B+ S( z$ {2 \9 Z1 n bind-address = "192.168.199.90:25826"" m/ h) [7 a& _9 V' V6 L
database = "collectd"
1 A+ s/ D+ E6 I& H' @ typesdb = "/var/lib/influxdb/types.db"- C4 k- Y4 j/ p* R4 u$ |, q
/ d2 C- W! E( E% [
bind-address = "192.168.199.90:25826"表示监听192.168.199.90主机25827端口的数据。然后保存到库collectd中。数据格式typesdb = “/var/lib/influxdb/types.db” 数据格式文件需要手动添加。部署OpenStack时,对于一些特别的需要存储数据的组件docker,都有相应的docker volume附加卷。直接映射到容器内。 influxdb容器附加卷在宿主机中对应位置 {& S! {8 c- _% w2 A- b4 f
"Type": "volume",
8 H v0 g3 n$ R0 h3 J! ]* q2 P& U "Name": "influxdb",
O& C2 |/ T1 B/ h "Source": "/var/lib/docker/volumes/influxdb/_data",
2 h0 ]5 |6 u" { "Destination": "/var/lib/influxdb",
- ?2 O6 ^. J4 n6 [! \6 N* k "Driver": "local",) H& k4 z# H. v
"Mode": "rw",: x+ H, ]8 R, G7 O. Q1 g
"RW": true,% K, f/ R0 \7 `+ {
"Propagation": ""
5 ~# [' @7 _% m7 d" I! ]; Q( s }, ; H6 C6 g" y, c- N$ [
将文件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& a9 G; I, P# B; Z
1/ ]- ~4 [8 |) B9 ]2 ~+ U& Y
[root@ALLInOne-Kolla ~]# ls /var/lib/docker/volumes/influxdb/_data/
- E ]3 D5 N. N( y" u: Bdata meta types.db wal
7 Y% M4 g! M( p: J; L1
( V0 |: S4 E$ n- ?& R+ y2
: d* k/ ]( i# B) [6 c3 N* V3.加载个人配置。, E0 h+ w# y' a0 I
kolla-ansible reconfigure -i /etc/kolla/all-in-one : O0 ]) e$ T& \1 L, ?! o" g
1
1 u' A- d! f. p; y完成后,会使用个人配置替代默认配置。并重启相应的组件容器加载新的配置。 新配置生效之后,最好将influxdb数据库原数据清除一下,因为原数据中会包含一些不符合新配置的数据。 删除库 collectd 创建库collectd (如果有数据存入,该库会被自动创建的) curl -i -XPOST http://192.168.199.90:8086/query --data-urlencode 'q=CREATE DATABASE collectd'
0 x5 Q* j" U+ z4 s; X, G1 . s. J' \; r* u( A: R9 O# E2 b
查看存储策略 一般是永久保存 curl -i -XPOST http://192.168.199.90:8086/query --data-urlencode 'q=SHOW RETENTION POLICIES ON collectd'
. i1 v9 i, P# g: @" i$ I2 Z1
4 i R3 z" {7 ~1 i. \设置新的保存策略 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'
) ?7 r( L u8 {: o" ^! o, [1
- m+ {0 `" f4 f1 d7 u1 j删除旧策略 10 Z( U! G# x, {; ^' W* |
2% r3 S# f8 x6 V; ~, W9 @6 H# E! M
4.influxdb一些其它的api。
. K, H! z- F- K3 n" ~删除数据库 curl -G 'http://192.168.199.90:8086/query?q=SHOW+DATABASES'' b# ^# P; E$ B
12 W v9 p! n5 c; j# s* B
查看库measurements 可以理解为表 curl -G 'http://192.168.199.90:8086/query' --data-urlencode "db=collectd" --data-urlencode 'q=show measurements'
$ s, M9 [ j5 R, t5 C9 D0 M1: ]3 r# @) h4 P
查看具体数据 curl -G 'http://192.168.199.90:8086/query' --data-urlencode "db=collectd" --data-urlencode 'q=select * from virt_rx limit 10'
& x% i v8 Z% Y# z+ F1
- {& W5 J& b2 g! ?9 y& _. vprometheus和grafana等暂不需额外配置文件。 不过由于直接通过libvirt的API监控虚拟机状态。没有经过OpenStack,所以虚拟机的名称无法对应。需要通过虚拟机的UUID来确定。
0 j) I0 C) N6 {2 v连接的是libvirt,也就是计算节点的libvirt。一个collectd只能监听一个计算节点livirtd,多节点部署多个计算节点,需要在每个计算节点安装collectd连接本节点libvirtd。
$ v; a+ I$ u2 ] L& m& ]: l4 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
! |. y- K2 h0 h1. }8 @4 E% t* m! T- I" U
登录成功后设置数据源 1.influxdb的collectd数据源 Name:collectd (这个是自定义的grafana数据源名)
0 {. A+ c4 N' A4 iURL : 192.168.199.90:8086
6 m& }5 d3 J$ y, w6 V8 {Database:collectd 完成点Save & Test 即可,成功的话是 Data source is working6 b+ b r& N. V) p/ i% O. N l
失败查看一下influxdb组件docker容器是否启动,IP端口对不对等。。。 2.prometheus数据源
" h9 f2 j2 e2 @. E0 d- [! p2.设置dashboard的变量: q; `6 K& `. F4 K& v& A" E
基本上不可能只有一个 虚拟机,且把多个虚拟机的信息一起展示也不合理。所以设置一些变量来确定当前展示的数据是哪一个虚拟机的。
' J6 O: g, F( n# `6 yhost SHOW TAG VALUES WITH KEY=host
4 l% @, a# x! r" Q7 h& Binstance_uuid SHOW TAG VALUES WITH KEY=instance WHERE host='$host'& c# L0 N {, c6 l0 g! n( U
virt_interface SHOW TAG VALUES FROM virt_rx,virt_tx WITH KEY=type_instance WHERE instance='$instance_uuid'
# G% Y0 ?( R3 X; G2 bvirt_disk SHOW TAG VALUES FROM virt_read,virt_write WITH KEY=type_instance WHERE instance='$instance_uuid'
7 a$ j" o/ O' A# q0 sinstance_name label_values(openstack_nova_server_status{id="$instance_uuid"}, name)
: v! D2 x) r. @
7 j9 ^# X+ }3 T- e- F分别设置宿主机名 虚拟实例uuid 虚拟网卡 虚拟磁盘 以及实例名
9 \3 Z( W( ]& m( E( w' V宿主机变量
虚拟机实例uuid变量 : E. a' n0 m1 G
虚拟网卡变量 $ j4 w. g( `( f5 D. w& _9 l- o5 U
虚拟磁盘变量 实例名 - {9 r! B: W( c/ t" k$ F7 {
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。$ n8 [. G6 v, l/ K9 ~4 M1 W1 n
这个根据influxdb查询语句和grafana使用个人创建即可。
8 v. u1 t, O2 w" N8 \7 o3 c/ u创建数据源 略。 点击import导入模板
0 t: p* x. H0 W选择模板文件
& {! z) B: q6 c9 |' _) _ c最终导入
+ A; E6 o% q8 x! e9 g$ V附
! p, b. H( S. b- C" C如果Prometheus和influxdb中collectd数据 实例 基本一致,可以设置更多的变量信息。8 J* p: u. T3 M9 }" N
如 实例不同状态根据Prometheus数据库查询。
# v$ t* ?/ g+ ~uuid也使用Prometheus 数据库根据实例状态查询。' U u. K: E* ]1 F+ G. u
其他的数据根据uuid在influxdb的collectd库中查询。
" q: t, k# I5 y. ? Q一致的是,实例名依然只能作为一个展示数据,而不能作为真正变量影响数据展示。 结合了prometheus展示了虚拟机的状态,根据状态查询实例uuid,选择ACTIVE可以避免查询到已经废弃的实例,也可选择SHUTOFF查询已停止运行实例的状态 不好的是也会查到状态是BUILD的实例 不过实例状态查询 重要的就是查询最近一段时间内 活动实例 的状态,因此状态变量选择基本是ACTIVE,只用于筛选出活动的变量即可。+ {! p) g! |7 z- o
且BUILD 状态的实例BUILD状态只会存在很短的时间,最终会转化成ACTIVE。 grafana变量设置 host 宿主机名(influxdb)
+ F1 L. A& ~& a/ c U, ` SHOW TAG VALUES WITH KEY=host instance_status 实例状态(prometheus)
8 f/ o" k: g1 J2 ^3 W label_values(openstack_nova_server_status{hypervisor_hostname="$host"}, status) instance_uuid 实例uuid(prometheus)因为此处使用prometheus查询uuid可以根据实例状态查询; Z0 J2 ~3 w: g. a; F% _* |% o4 G
label_values(openstack_nova_server_status{hypervisor_hostname="$host",status="$instance_status"}, uuid) virt_interface 实例虚拟网卡(influxdb)
9 L; f0 y. m# _1 Q6 T SHOW TAG VALUES FROM virt_rx,virt_tx WITH KEY=type_instance WHERE instance='$instance_uuid' virt_disk 实例虚拟磁盘(influxdb) ?% T( _0 B7 X0 Q
SHOW TAG VALUES FROM virt_read,virt_write WITH KEY=type_instance WHERE instance='$instance_uuid' instance_name 实例名(prometheus)
7 {* u* h% V) T7 U" l5 M6 `; p label_values(openstack_nova_server_status{id="$instance_uuid"}, name). E! H( K" k4 l' S. v2 L7 h# ]+ a6 d
* U4 A0 k* i1 P! a% C% I: Ipanel都不用改变。。。。。。 https://download.csdn.net/download/dandanfengyun/15137036 这里有一个问题 不知道理解的对不对。。。
5 J) h9 {5 l% _prometheus和collectd都是时序数据库。
2 J( h0 f( G# oPrometheus记录的实例信息也是按时间存放多个的。(隔一段时间存放当时的实例状态信息) grafana变量也是和时间相关的(也就是grafana变量不仅和其他变量相关,也和时间相关)
: y* k" h S5 z- p+ q: B I: c) a也就是说,一个实例的状态信息选择时间段不同,是可能有多个不同的变量的。* I; ?" X+ r# I, X: d3 ~
如变量为实例运行状态 15分钟前关闭了该实例。假设只有两个实例,一个运行 一个15分钟前关闭。 那么选择5分钟前到现在的时间段,变量就有active和shutoff。active的实例只有一个,shutoff的实例也只有一个。 被删除的实例则没有ACTIVE或SHUT OFF状态,但是prometheus和influxdb中都记录了被删除前虚拟实例的运行状况。 但是当选择30分钟前到现在的时间段,变量就有active和shutoff。shutoff的实例还是只有一个,但是active的实例有两个(这个听起来有点那啥),只要记住 prometheus是时序数据库,不能把该变量当成真正的纯粹记录当前实例状态的布尔值。 30前到15分钟前,该实例是active的,15分钟前到现在,该实例是shutoff的,所以该实例有两个运行状态。。。 问题" H; H6 ~7 j S* f5 R
collectd 无法通过OpenStack获取用户等信息。如果要使用grafana展示可能要通过prometheus。7 R/ k" |3 \+ n/ \0 Z# W" s w! K9 e+ L
grafana需要通过prometheus和influxdb两个数据源才能展示实例的状态信息。 collectd也无法收集实例 内空间使用占用情况。, G$ d' ^* g! f$ ]6 ?& i
|