one2influx 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/one2influx +1 -0
- data/bin/one2influx.log +83 -0
- data/lib/one2influx/config.rb +44 -29
- data/lib/one2influx/data.rb +6 -7
- data/lib/one2influx/influx.rb +1 -1
- data/lib/one2influx/one_object/cluster.rb +96 -17
- data/lib/one2influx/one_object/datastore.rb +13 -0
- data/lib/one2influx/one_object/host.rb +65 -0
- data/lib/one2influx/one_object/one_object.rb +9 -3
- data/lib/one2influx/one_object/virtual_machine.rb +4 -3
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6353b4846f2c96cbc78ea02b0a811f790eba52c5
|
|
4
|
+
data.tar.gz: 3f70ee245cc8f705ada540f0c9278695884e95d3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 92362846a7b6bbda1c22208fab6bdc80029155a84120829c1a6c48eae2095ae9cff2466268525e5b021d7cd128b47c8b260eeaa346eaa84f7381d3c348a66733
|
|
7
|
+
data.tar.gz: b3245161ecf2eb9d4f1c675dd2f4834f4dfac6607dc8396c1835d3b2fb31ac22b862de6df9938043930889b9811ca12f1a5bd26f4754f5891a0e37e03c770e13
|
data/bin/one2influx
CHANGED
data/bin/one2influx.log
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Logfile created on 2015-05-17 16:56:57 +0200 by logger.rb/47272
|
|
2
|
+
I, [2015-05-17T16:56:57.070366 #7964] INFO -- : Connection with ONE verified.
|
|
3
|
+
I, [2015-05-17T16:56:57.084159 #7964] INFO -- : Connection to InfluxDB database 'test' with retention policy 'ten_hours' verified.
|
|
4
|
+
E, [2015-05-17T16:56:57.130222 #7964] ERROR -- : Unable to get metric 'HOST_MEM_ALOC'. MAX_MEM is 0.
|
|
5
|
+
E, [2015-05-17T16:56:57.130323 #7964] ERROR -- : Unable to get metric 'HOST_MEM_LOAD'. MAX_MEM is 0.
|
|
6
|
+
E, [2015-05-17T16:56:57.130367 #7964] ERROR -- : Unable to get metric 'HOST_MEM_WASTE'. HOST_MEM_ALOC is missing.
|
|
7
|
+
E, [2015-05-17T16:56:57.130404 #7964] ERROR -- : Unable to get metric 'HOST_CPU_ALOC'. MAX_CPU is 0.
|
|
8
|
+
E, [2015-05-17T16:56:57.130439 #7964] ERROR -- : Unable to get metric 'HOST_CPU_LOAD'. MAX_CPU is 0.
|
|
9
|
+
E, [2015-05-17T16:56:57.130474 #7964] ERROR -- : Unable to get metric 'HOST_CPU_WASTE'. HOST_CPU_ALOC is missing.
|
|
10
|
+
I, [2015-05-17T16:56:57.146043 #7964] INFO -- : Fetched data for 3 VMs, 2 hosts, 4 datastores and 1 clusters.
|
|
11
|
+
I, [2015-05-17T16:56:57.146134 #7964] INFO -- : Successfully fetched data from ONE.
|
|
12
|
+
I, [2015-05-17T16:56:57.320825 #7964] INFO -- : Successfully stored 75 data points.
|
|
13
|
+
I, [2015-05-17T16:56:57.321001 #7964] INFO -- : Successfully stored 75 data points.
|
|
14
|
+
E, [2015-05-17T16:57:12.370386 #7964] ERROR -- : Unable to get metric 'HOST_MEM_ALOC'. MAX_MEM is 0.
|
|
15
|
+
E, [2015-05-17T16:57:12.370507 #7964] ERROR -- : Unable to get metric 'HOST_MEM_LOAD'. MAX_MEM is 0.
|
|
16
|
+
E, [2015-05-17T16:57:12.370574 #7964] ERROR -- : Unable to get metric 'HOST_MEM_WASTE'. HOST_MEM_ALOC is missing.
|
|
17
|
+
E, [2015-05-17T16:57:12.370630 #7964] ERROR -- : Unable to get metric 'HOST_CPU_ALOC'. MAX_CPU is 0.
|
|
18
|
+
E, [2015-05-17T16:57:12.370711 #7964] ERROR -- : Unable to get metric 'HOST_CPU_LOAD'. MAX_CPU is 0.
|
|
19
|
+
E, [2015-05-17T16:57:12.370765 #7964] ERROR -- : Unable to get metric 'HOST_CPU_WASTE'. HOST_CPU_ALOC is missing.
|
|
20
|
+
I, [2015-05-17T16:57:12.385202 #7964] INFO -- : Fetched data for 3 VMs, 2 hosts, 4 datastores and 1 clusters.
|
|
21
|
+
I, [2015-05-17T16:57:12.385300 #7964] INFO -- : Successfully fetched data from ONE.
|
|
22
|
+
I, [2015-05-17T16:57:12.412689 #7964] INFO -- : Successfully stored 75 data points.
|
|
23
|
+
I, [2015-05-17T16:57:12.412788 #7964] INFO -- : Successfully stored 75 data points.
|
|
24
|
+
E, [2015-05-17T16:57:27.461425 #7964] ERROR -- : Unable to get metric 'HOST_MEM_ALOC'. MAX_MEM is 0.
|
|
25
|
+
E, [2015-05-17T16:57:27.461550 #7964] ERROR -- : Unable to get metric 'HOST_MEM_LOAD'. MAX_MEM is 0.
|
|
26
|
+
E, [2015-05-17T16:57:27.461623 #7964] ERROR -- : Unable to get metric 'HOST_MEM_WASTE'. HOST_MEM_ALOC is missing.
|
|
27
|
+
E, [2015-05-17T16:57:27.461684 #7964] ERROR -- : Unable to get metric 'HOST_CPU_ALOC'. MAX_CPU is 0.
|
|
28
|
+
E, [2015-05-17T16:57:27.461760 #7964] ERROR -- : Unable to get metric 'HOST_CPU_LOAD'. MAX_CPU is 0.
|
|
29
|
+
E, [2015-05-17T16:57:27.461833 #7964] ERROR -- : Unable to get metric 'HOST_CPU_WASTE'. HOST_CPU_ALOC is missing.
|
|
30
|
+
I, [2015-05-17T16:57:27.477837 #7964] INFO -- : Fetched data for 3 VMs, 2 hosts, 4 datastores and 1 clusters.
|
|
31
|
+
I, [2015-05-17T16:57:27.477929 #7964] INFO -- : Successfully fetched data from ONE.
|
|
32
|
+
I, [2015-05-17T16:57:27.505904 #7964] INFO -- : Successfully stored 75 data points.
|
|
33
|
+
I, [2015-05-17T16:57:27.506016 #7964] INFO -- : Successfully stored 75 data points.
|
|
34
|
+
E, [2015-05-17T16:57:43.226372 #7964] ERROR -- : Unable to get metric 'HOST_MEM_ALOC'. MAX_MEM is 0.
|
|
35
|
+
E, [2015-05-17T16:57:43.226558 #7964] ERROR -- : Unable to get metric 'HOST_MEM_LOAD'. MAX_MEM is 0.
|
|
36
|
+
E, [2015-05-17T16:57:43.226812 #7964] ERROR -- : Unable to get metric 'HOST_MEM_WASTE'. HOST_MEM_ALOC is missing.
|
|
37
|
+
E, [2015-05-17T16:57:43.226968 #7964] ERROR -- : Unable to get metric 'HOST_CPU_ALOC'. MAX_CPU is 0.
|
|
38
|
+
E, [2015-05-17T16:57:43.227776 #7964] ERROR -- : Unable to get metric 'HOST_CPU_LOAD'. MAX_CPU is 0.
|
|
39
|
+
E, [2015-05-17T16:57:43.228383 #7964] ERROR -- : Unable to get metric 'HOST_CPU_WASTE'. HOST_CPU_ALOC is missing.
|
|
40
|
+
I, [2015-05-17T16:57:43.251970 #7964] INFO -- : Fetched data for 3 VMs, 2 hosts, 4 datastores and 1 clusters.
|
|
41
|
+
I, [2015-05-17T16:57:43.252067 #7964] INFO -- : Successfully fetched data from ONE.
|
|
42
|
+
I, [2015-05-17T16:57:43.278282 #7964] INFO -- : Successfully stored 75 data points.
|
|
43
|
+
I, [2015-05-17T16:57:43.278375 #7964] INFO -- : Successfully stored 75 data points.
|
|
44
|
+
E, [2015-05-17T16:57:58.340411 #7964] ERROR -- : Unable to get metric 'HOST_MEM_ALOC'. MAX_MEM is 0.
|
|
45
|
+
E, [2015-05-17T16:57:58.340546 #7964] ERROR -- : Unable to get metric 'HOST_MEM_LOAD'. MAX_MEM is 0.
|
|
46
|
+
E, [2015-05-17T16:57:58.340606 #7964] ERROR -- : Unable to get metric 'HOST_MEM_WASTE'. HOST_MEM_ALOC is missing.
|
|
47
|
+
E, [2015-05-17T16:57:58.340807 #7964] ERROR -- : Unable to get metric 'HOST_CPU_ALOC'. MAX_CPU is 0.
|
|
48
|
+
E, [2015-05-17T16:57:58.340855 #7964] ERROR -- : Unable to get metric 'HOST_CPU_LOAD'. MAX_CPU is 0.
|
|
49
|
+
E, [2015-05-17T16:57:58.340899 #7964] ERROR -- : Unable to get metric 'HOST_CPU_WASTE'. HOST_CPU_ALOC is missing.
|
|
50
|
+
I, [2015-05-17T16:57:58.355678 #7964] INFO -- : Fetched data for 3 VMs, 2 hosts, 4 datastores and 1 clusters.
|
|
51
|
+
I, [2015-05-17T16:57:58.355776 #7964] INFO -- : Successfully fetched data from ONE.
|
|
52
|
+
I, [2015-05-17T16:57:58.377838 #7964] INFO -- : Successfully stored 75 data points.
|
|
53
|
+
I, [2015-05-17T16:57:58.377966 #7964] INFO -- : Successfully stored 75 data points.
|
|
54
|
+
E, [2015-05-17T16:58:13.453706 #7964] ERROR -- : Unable to get metric 'HOST_MEM_ALOC'. MAX_MEM is 0.
|
|
55
|
+
E, [2015-05-17T16:58:13.453885 #7964] ERROR -- : Unable to get metric 'HOST_MEM_LOAD'. MAX_MEM is 0.
|
|
56
|
+
E, [2015-05-17T16:58:13.453980 #7964] ERROR -- : Unable to get metric 'HOST_MEM_WASTE'. HOST_MEM_ALOC is missing.
|
|
57
|
+
E, [2015-05-17T16:58:13.454058 #7964] ERROR -- : Unable to get metric 'HOST_CPU_ALOC'. MAX_CPU is 0.
|
|
58
|
+
E, [2015-05-17T16:58:13.454151 #7964] ERROR -- : Unable to get metric 'HOST_CPU_LOAD'. MAX_CPU is 0.
|
|
59
|
+
E, [2015-05-17T16:58:13.454203 #7964] ERROR -- : Unable to get metric 'HOST_CPU_WASTE'. HOST_CPU_ALOC is missing.
|
|
60
|
+
I, [2015-05-17T16:58:13.474496 #7964] INFO -- : Fetched data for 3 VMs, 2 hosts, 4 datastores and 1 clusters.
|
|
61
|
+
I, [2015-05-17T16:58:13.474604 #7964] INFO -- : Successfully fetched data from ONE.
|
|
62
|
+
I, [2015-05-17T16:58:13.497888 #7964] INFO -- : Successfully stored 75 data points.
|
|
63
|
+
I, [2015-05-17T16:58:13.498017 #7964] INFO -- : Successfully stored 75 data points.
|
|
64
|
+
E, [2015-05-17T16:58:28.554575 #7964] ERROR -- : Unable to get metric 'HOST_MEM_ALOC'. MAX_MEM is 0.
|
|
65
|
+
E, [2015-05-17T16:58:28.554771 #7964] ERROR -- : Unable to get metric 'HOST_MEM_LOAD'. MAX_MEM is 0.
|
|
66
|
+
E, [2015-05-17T16:58:28.554848 #7964] ERROR -- : Unable to get metric 'HOST_MEM_WASTE'. HOST_MEM_ALOC is missing.
|
|
67
|
+
E, [2015-05-17T16:58:28.554898 #7964] ERROR -- : Unable to get metric 'HOST_CPU_ALOC'. MAX_CPU is 0.
|
|
68
|
+
E, [2015-05-17T16:58:28.555085 #7964] ERROR -- : Unable to get metric 'HOST_CPU_LOAD'. MAX_CPU is 0.
|
|
69
|
+
E, [2015-05-17T16:58:28.555137 #7964] ERROR -- : Unable to get metric 'HOST_CPU_WASTE'. HOST_CPU_ALOC is missing.
|
|
70
|
+
I, [2015-05-17T16:58:28.570603 #7964] INFO -- : Fetched data for 3 VMs, 2 hosts, 4 datastores and 1 clusters.
|
|
71
|
+
I, [2015-05-17T16:58:28.570708 #7964] INFO -- : Successfully fetched data from ONE.
|
|
72
|
+
I, [2015-05-17T16:58:28.595736 #7964] INFO -- : Successfully stored 75 data points.
|
|
73
|
+
I, [2015-05-17T16:58:28.595837 #7964] INFO -- : Successfully stored 75 data points.
|
|
74
|
+
E, [2015-05-17T16:58:43.651964 #7964] ERROR -- : Unable to get metric 'HOST_MEM_ALOC'. MAX_MEM is 0.
|
|
75
|
+
E, [2015-05-17T16:58:43.652090 #7964] ERROR -- : Unable to get metric 'HOST_MEM_LOAD'. MAX_MEM is 0.
|
|
76
|
+
E, [2015-05-17T16:58:43.652144 #7964] ERROR -- : Unable to get metric 'HOST_MEM_WASTE'. HOST_MEM_ALOC is missing.
|
|
77
|
+
E, [2015-05-17T16:58:43.652197 #7964] ERROR -- : Unable to get metric 'HOST_CPU_ALOC'. MAX_CPU is 0.
|
|
78
|
+
E, [2015-05-17T16:58:43.652238 #7964] ERROR -- : Unable to get metric 'HOST_CPU_LOAD'. MAX_CPU is 0.
|
|
79
|
+
E, [2015-05-17T16:58:43.652317 #7964] ERROR -- : Unable to get metric 'HOST_CPU_WASTE'. HOST_CPU_ALOC is missing.
|
|
80
|
+
I, [2015-05-17T16:58:43.670538 #7964] INFO -- : Fetched data for 3 VMs, 2 hosts, 4 datastores and 1 clusters.
|
|
81
|
+
I, [2015-05-17T16:58:43.670634 #7964] INFO -- : Successfully fetched data from ONE.
|
|
82
|
+
I, [2015-05-17T16:58:43.692999 #7964] INFO -- : Successfully stored 75 data points.
|
|
83
|
+
I, [2015-05-17T16:58:43.693108 #7964] INFO -- : Successfully stored 75 data points.
|
data/lib/one2influx/config.rb
CHANGED
|
@@ -6,7 +6,7 @@ class One2Influx::Config
|
|
|
6
6
|
## EDIT THIS PART IF NECESSARY ##
|
|
7
7
|
##############################################################################
|
|
8
8
|
|
|
9
|
-
# Allowed values are number of seconds, minutes, hours
|
|
9
|
+
# Data fetch interval. Allowed values are number of seconds, minutes, hours
|
|
10
10
|
# separated by space
|
|
11
11
|
@@fetch_interval = '30 seconds'
|
|
12
12
|
|
|
@@ -14,7 +14,7 @@ class One2Influx::Config
|
|
|
14
14
|
#####################################
|
|
15
15
|
@@one = {
|
|
16
16
|
# Login credentials separated by semicolon
|
|
17
|
-
credentials: '
|
|
17
|
+
credentials: 'oneadmin:opennebula',
|
|
18
18
|
|
|
19
19
|
# XML_RPC endpoint where OpenNebula is listening
|
|
20
20
|
endpoint: 'http://localhost:2633/RPC2'
|
|
@@ -36,8 +36,6 @@ class One2Influx::Config
|
|
|
36
36
|
database: 'test',
|
|
37
37
|
|
|
38
38
|
# Retention policy for records with the smallest granularity
|
|
39
|
-
# you have to create retention policy manually if you want to change
|
|
40
|
-
# this one
|
|
41
39
|
policy: 'ten_hours'
|
|
42
40
|
}
|
|
43
41
|
|
|
@@ -47,7 +45,8 @@ class One2Influx::Config
|
|
|
47
45
|
# Level to use. Logger::INFO, Logger::WARN, Logger::ERROR are supported
|
|
48
46
|
level: Logger::INFO,
|
|
49
47
|
|
|
50
|
-
# Path to log file
|
|
48
|
+
# Path to log file, when empty, one2influx.log is written into directory
|
|
49
|
+
# where the binary is run from
|
|
51
50
|
path: ''
|
|
52
51
|
}
|
|
53
52
|
|
|
@@ -62,22 +61,33 @@ class One2Influx::Config
|
|
|
62
61
|
HOST_NAME: 'NAME',
|
|
63
62
|
CLUSTER_ID: 'CLUSTER_ID',
|
|
64
63
|
CLUSTER_NAME: 'CLUSTER',
|
|
64
|
+
#HOST_STATE: 'STATE', # [int] host state
|
|
65
|
+
#IM_MAD: 'IM_MAD', # [string] monitoring manager driver
|
|
66
|
+
#VM_MAD: 'VM_MAD', # [string] virtualization manager driver
|
|
67
|
+
#VN_MAD: 'VN_MAD', # [string] virtual network manager driver
|
|
65
68
|
DSS_IDS: '' # [string] IDs of datastores that this host uses
|
|
66
69
|
# encoded in form ,,ID_1,,ID_2...,,
|
|
67
70
|
},
|
|
68
71
|
metrics: [
|
|
69
72
|
'MEM_USAGE', # [kB] memory requested by VMs
|
|
70
73
|
'MAX_MEM', # [kB] total memory available in host
|
|
71
|
-
'FREE_MEM', # [kB] free memory
|
|
72
|
-
'USED_MEM', # [kB]
|
|
73
|
-
'CPU_USAGE', # [%] usage of CPU calculated by ONE as the
|
|
74
|
+
'FREE_MEM', # [kB] free memory in host, MAX_MEM - USED_MEM
|
|
75
|
+
'USED_MEM', # [kB] used memory in host -(buffers+cache)
|
|
76
|
+
'CPU_USAGE', # [%] usage of CPU calculated by ONE as the sum of
|
|
74
77
|
# CPU requested by all VMs running in the host
|
|
75
78
|
'MAX_CPU', # [%] total CPU in the host (number of cores * 100)
|
|
76
79
|
'FREE_CPU', # [%] free CPU as returned by the probes
|
|
77
80
|
'USED_CPU' # [%] CPU used by all host processes over a total
|
|
78
81
|
# of # cores * 100
|
|
79
82
|
],
|
|
80
|
-
cust_metrics: [
|
|
83
|
+
cust_metrics: [
|
|
84
|
+
#'HOST_MEM_ALOC', # [%] MEM_USAGE / MAX_MEM
|
|
85
|
+
#'HOST_MEM_LOAD', # [%] USED_MEM / MAX_MEM
|
|
86
|
+
#'HOST_MEM_WASTE', # [] HOST_MEM_ALOC / HOST_MEM_LOAD
|
|
87
|
+
#'HOST_CPU_ALOC', # [%] CPU_USAGE / MAX_CPU
|
|
88
|
+
#'HOST_CPU_LOAD', # [%] USED_CPU / MAX_CPU
|
|
89
|
+
#'HOST_CPU_WASTE', # [] HOST_CPU_ALOC / HOST_CPU_LOAD
|
|
90
|
+
]
|
|
81
91
|
},
|
|
82
92
|
# Virtual machine
|
|
83
93
|
vm: {
|
|
@@ -87,10 +97,12 @@ class One2Influx::Config
|
|
|
87
97
|
HOST_ID: 'HOST_ID',
|
|
88
98
|
HOST_NAME: 'HOST_NAME',
|
|
89
99
|
VM_NAME: 'NAME',
|
|
90
|
-
UID: 'UID',
|
|
91
|
-
GID: 'GID',
|
|
92
|
-
UNAME: 'UNAME',
|
|
93
|
-
GNAME: 'GNAME'
|
|
100
|
+
UID: 'UID', # [int] user's ID
|
|
101
|
+
GID: 'GID', # [int] group's ID
|
|
102
|
+
UNAME: 'UNAME', # [string] user's name
|
|
103
|
+
GNAME: 'GNAME', # [string] group's name
|
|
104
|
+
#VM_STATE: 'STATE', # [int] virtual machine state
|
|
105
|
+
#LCM_STATE: 'LCM_STATE' # [int] substates for ACTIVE state
|
|
94
106
|
},
|
|
95
107
|
metrics: [
|
|
96
108
|
'MEMORY', # [kB] memory consumption
|
|
@@ -124,7 +136,9 @@ class One2Influx::Config
|
|
|
124
136
|
'FREE_MB', # [MB] free space
|
|
125
137
|
'USED_MB' # [MB] used space
|
|
126
138
|
],
|
|
127
|
-
cust_metrics: [
|
|
139
|
+
cust_metrics: [
|
|
140
|
+
#'DS_LOAD' # [%] USED_MB / TOTAL_MB
|
|
141
|
+
]
|
|
128
142
|
},
|
|
129
143
|
# Cluster
|
|
130
144
|
cluster: {
|
|
@@ -132,22 +146,23 @@ class One2Influx::Config
|
|
|
132
146
|
CLUSTER_NAME: 'NAME'
|
|
133
147
|
},
|
|
134
148
|
metrics: [
|
|
135
|
-
'CLUSTER_MEM_USAGE', # [kB]
|
|
136
|
-
'CLUSTER_MAX_MEM', # [kB]
|
|
137
|
-
'CLUSTER_FREE_MEM', # [kB]
|
|
138
|
-
|
|
139
|
-
'
|
|
140
|
-
|
|
141
|
-
'
|
|
142
|
-
|
|
143
|
-
# in the cluster
|
|
144
|
-
'CLUSTER_MAX_CPU', # [%] total CPU in the cluster
|
|
145
|
-
# (number of cores * 100)
|
|
146
|
-
'CLUSTER_FREE_CPU', # [%] free CPU as returned by the probes
|
|
147
|
-
'CLUSTER_USED_CPU' # [%] CPU used by all processes of all hosts
|
|
148
|
-
# over a total of # cores * 100
|
|
149
|
+
'CLUSTER_MEM_USAGE', # [kB] sum of MEM_USAGE for whole cluster
|
|
150
|
+
'CLUSTER_MAX_MEM', # [kB] sum of MAX_MEM for whole cluster
|
|
151
|
+
'CLUSTER_FREE_MEM', # [kB] sum of FREE_MEM for whole cluster
|
|
152
|
+
'CLUSTER_USED_MEM', # [kB] sum of USED_MEM for whole cluster
|
|
153
|
+
'CLUSTER_CPU_USAGE', # [%] sum of CPU_USAGE for whole cluster
|
|
154
|
+
'CLUSTER_MAX_CPU', # [%] sum of MAX_CPU for whole cluster
|
|
155
|
+
'CLUSTER_FREE_CPU', # [%] sum of FREE_CPU for whole cluster
|
|
156
|
+
'CLUSTER_USED_CPU' # [%] sum of USED_CPU for whole cluster
|
|
149
157
|
],
|
|
150
|
-
cust_metrics: [
|
|
158
|
+
cust_metrics: [
|
|
159
|
+
#'CLUSTER_MEM_ALOC', # [%] CLUSTER_MEM_USAGE / CLUSTER_MAX_MEM
|
|
160
|
+
#'CLUSTER_MEM_LOAD', # [%]CLUSTER_USED_MEM / CLUSTER_MAX_MEM
|
|
161
|
+
#'CLUSTER_MEM_WASTE', # [] CLUSTER_MEM_ALOC / CLUSTER_MEM_LOAD
|
|
162
|
+
#'CLUSTER_CPU_ALOC', # [%] CLUSTER_CPU_USAGE / CLUSTER_MAX_CPU
|
|
163
|
+
#'CLUSTER_CPU_LOAD', # [%] CLUSTER_USED_CPU / CLUSTER_MAX_CPU
|
|
164
|
+
#'CLUSTER_CPU_WASTE', # [] CLUSTER_CPU_ALOC / CLUSTER_CPU_LOAD
|
|
165
|
+
]
|
|
151
166
|
}
|
|
152
167
|
}
|
|
153
168
|
|
data/lib/one2influx/data.rb
CHANGED
|
@@ -17,8 +17,8 @@ class One2Influx::Data
|
|
|
17
17
|
raise rc.message if OpenNebula.is_error?(rc)
|
|
18
18
|
|
|
19
19
|
# Get data from all hosts in the pool
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
oo_hosts = {} # hash of all instances of OneObject::Host
|
|
21
|
+
# in form {ID => host}
|
|
22
22
|
host_pool.each do |one_host|
|
|
23
23
|
host = ::One2Influx::Host.new(one_host.to_xml, @client)
|
|
24
24
|
# Get data from all VMs belonging to current host
|
|
@@ -31,8 +31,7 @@ class One2Influx::Data
|
|
|
31
31
|
@points += vm.serialize_as_points
|
|
32
32
|
counter[:vms] += 1
|
|
33
33
|
end
|
|
34
|
-
|
|
35
|
-
oo_hosts << host
|
|
34
|
+
oo_hosts[host.tags[:HOST_ID].to_sym] = host
|
|
36
35
|
@points += host.serialize_as_points
|
|
37
36
|
counter[:hosts] += 1
|
|
38
37
|
end
|
|
@@ -41,10 +40,10 @@ class One2Influx::Data
|
|
|
41
40
|
cluster_pool = OpenNebula::ClusterPool.new(@client)
|
|
42
41
|
rc = cluster_pool.info
|
|
43
42
|
raise rc.message if OpenNebula.is_error?(rc)
|
|
44
|
-
|
|
43
|
+
|
|
45
44
|
# Get data from all clusters in the pool
|
|
46
45
|
cluster_pool.each do |one_cluster|
|
|
47
|
-
cluster = ::One2Influx::Cluster.new(one_cluster.to_xml, @client,
|
|
46
|
+
cluster = ::One2Influx::Cluster.new(one_cluster.to_xml, @client, oo_hosts)
|
|
48
47
|
@points += cluster.serialize_as_points
|
|
49
48
|
counter[:clusters] += 1
|
|
50
49
|
end
|
|
@@ -58,7 +57,7 @@ class One2Influx::Data
|
|
|
58
57
|
# It has form {DS_ID_1: [HOST_ID_1, HOST_ID_2, ...], ...}
|
|
59
58
|
ds_has_hosts = {}
|
|
60
59
|
if $CFG.storage[:ds][:tags].has_key? :HOSTS_IDS
|
|
61
|
-
oo_hosts.each do |host|
|
|
60
|
+
oo_hosts.each do |id, host|
|
|
62
61
|
host.datastores.each do |ds|
|
|
63
62
|
ds_has_hosts[ds] ||= []
|
|
64
63
|
ds_has_hosts[ds] << host.tags[:HOST_ID]
|
data/lib/one2influx/influx.rb
CHANGED
|
@@ -43,7 +43,7 @@ class One2Influx::Influx
|
|
|
43
43
|
req.body = payload.to_json
|
|
44
44
|
response = make_request(req)
|
|
45
45
|
|
|
46
|
-
if (not response.nil?) && (response.code != '
|
|
46
|
+
if (not response.nil?) && (response.code != '204')
|
|
47
47
|
raise 'Failed to store data to InfluxDB. Received HTTP code ' +
|
|
48
48
|
"#{response.code}, body: #{response.body}"
|
|
49
49
|
end
|
|
@@ -4,19 +4,29 @@ class One2Influx::Cluster < ::One2Influx::OneObject
|
|
|
4
4
|
#
|
|
5
5
|
# @param [string] xml representation of cluster
|
|
6
6
|
# @param [OpenNebula::Client] client connection link to ONE API
|
|
7
|
-
# @param [hash]
|
|
8
|
-
|
|
9
|
-
def initialize(xml, client, hosts_xml)
|
|
7
|
+
# @param [hash] oo_hosts hash in form {ID => OneObject::Host} of all hosts
|
|
8
|
+
def initialize(xml, client, oo_hosts)
|
|
10
9
|
# Load configuration
|
|
11
10
|
@tag_names = $CFG.storage[:cluster][:tags]
|
|
12
11
|
@metric_names = $CFG.storage[:cluster][:metrics]
|
|
13
12
|
@custom_metric_names = $CFG.storage[:cluster][:cust_metrics]
|
|
14
|
-
@
|
|
13
|
+
@hosts = oo_hosts
|
|
15
14
|
|
|
16
15
|
super(xml, client)
|
|
17
16
|
end
|
|
18
17
|
|
|
19
|
-
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
# @param [OneObject::Host] host host to fetch metric from
|
|
21
|
+
# @param [string] metric metric to fetch
|
|
22
|
+
# @raise [Exception] fetch error
|
|
23
|
+
# @return metric from host
|
|
24
|
+
def fetch_host_metric(host, metric)
|
|
25
|
+
ni_element = host.doc.css(metric).first
|
|
26
|
+
raise if ni_element.nil?
|
|
27
|
+
|
|
28
|
+
ni_element.content.to_i
|
|
29
|
+
end
|
|
20
30
|
|
|
21
31
|
# Overrides OneObject init_metrics because cluster itself doesn't
|
|
22
32
|
# have any own metrics, so they are gathered as sum of metrics of
|
|
@@ -28,26 +38,95 @@ class One2Influx::Cluster < ::One2Influx::OneObject
|
|
|
28
38
|
|
|
29
39
|
host_ids = @doc.xpath('//HOSTS/ID').map { |node| node.content }
|
|
30
40
|
host_ids.each do |id|
|
|
31
|
-
|
|
41
|
+
host = @hosts[id.to_sym]
|
|
42
|
+
|
|
32
43
|
@metric_names.each do |metric|
|
|
44
|
+
@metrics[metric.to_sym] ||= 0
|
|
33
45
|
host_metric = metric.split('CLUSTER_')[1]
|
|
34
|
-
|
|
35
|
-
|
|
46
|
+
next if host_metric.nil?
|
|
47
|
+
|
|
48
|
+
if host.metrics.has_key? host_metric.to_sym
|
|
49
|
+
@metrics[metric.to_sym] += host.metrics[host_metric.to_sym].to_i
|
|
50
|
+
else
|
|
51
|
+
ni_element = host.doc.css(host_metric).first
|
|
36
52
|
if ni_element.nil?
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
@
|
|
53
|
+
# Calculation of this metric would be misleading without this
|
|
54
|
+
# value, so I rather remove whole metric and log failure
|
|
55
|
+
@metric_names = @metric_names.delete(metric)
|
|
56
|
+
@metrics = @metrics.delete(metric.to_sym)
|
|
57
|
+
$LOG.error "Unable to get metric '#{metric}' in #{self.class}." +
|
|
58
|
+
"XML parsing error in host ID=#{id}."
|
|
59
|
+
next
|
|
40
60
|
end
|
|
61
|
+
|
|
62
|
+
@metrics[metric.to_sym] += ni_element.content.to_i
|
|
41
63
|
end
|
|
42
64
|
end
|
|
43
65
|
end
|
|
66
|
+
end
|
|
44
67
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
68
|
+
# @raise [Exception] calculation error
|
|
69
|
+
# @return [float] CLUSTER_MEM_USAGE / CLUSTER_MAX_MEM
|
|
70
|
+
def get_CLUSTER_MEM_ALOC
|
|
71
|
+
raise 'CLUSTER_MEM_USAGE is missing.' unless @metrics.has_key? :CLUSTER_MEM_USAGE
|
|
72
|
+
raise 'CLUSTER_MAX_MEM is missing.' unless @metrics.has_key? :CLUSTER_MAX_MEM
|
|
73
|
+
raise 'CLUSTER_MAX_MEM is 0.' if @metrics[:CLUSTER_MAX_MEM] == '0'
|
|
74
|
+
|
|
75
|
+
(@metrics[:CLUSTER_MEM_USAGE].to_f / @metrics[:CLUSTER_MAX_MEM].to_f).round(4)*100
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# @raise [Exception] calculation error
|
|
79
|
+
# @return [float] CLUSTER_USED_MEM / CLUSTER_MAX_MEM
|
|
80
|
+
def get_CLUSTER_MEM_LOAD
|
|
81
|
+
raise 'CLUSTER_USED_MEM is missing.' unless @metrics.has_key? :CLUSTER_USED_MEM
|
|
82
|
+
raise 'CLUSTER_MAX_MEM is missing.' unless @metrics.has_key? :CLUSTER_MAX_MEM
|
|
83
|
+
raise 'CLUSTER_MAX_MEM is 0.' if @metrics[:CLUSTER_MAX_MEM] == '0'
|
|
84
|
+
|
|
85
|
+
(@metrics[:CLUSTER_USED_MEM].to_f / @metrics[:CLUSTER_MAX_MEM].to_f).round(4)*100
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# @raise [Exception] calculation error
|
|
89
|
+
# @return [float] CLUSTER_MEM_ALOC / CLUSTER_MEM_LOAD
|
|
90
|
+
def get_CLUSTER_MEM_WASTE
|
|
91
|
+
raise 'CLUSTER_MEM_ALOC is missing.' unless @metrics.has_key? :CLUSTER_MEM_ALOC
|
|
92
|
+
raise 'CLUSTER_MEM_LOAD is missing.' unless @metrics.has_key? :CLUSTER_MEM_LOAD
|
|
93
|
+
|
|
94
|
+
mem_load = @metrics[:CLUSTER_MEM_LOAD] == 0 ? 0.001 : @metrics[:CLUSTER_MEM_LOAD]
|
|
95
|
+
|
|
96
|
+
(@metrics[:CLUSTER_MEM_ALOC] / mem_load).round(2)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# @raise [Exception] calculation error
|
|
100
|
+
# @return [float] CLUSTER_CPU_USAGE / CLUSTER_MAX_CPU
|
|
101
|
+
def get_CLUSTER_CPU_ALOC
|
|
102
|
+
raise 'CLUSTER_CPU_USAGE is missing.' unless @metrics.has_key? :CLUSTER_CPU_USAGE
|
|
103
|
+
raise 'CLUSTER_MAX_CPU is missing.' unless @metrics.has_key? :CLUSTER_MAX_CPU
|
|
104
|
+
raise 'CLUSTER_MAX_CPU is 0.' if @metrics[:CLUSTER_MAX_CPU] == '0'
|
|
105
|
+
|
|
106
|
+
(@metrics[:CLUSTER_CPU_USAGE].to_f / @metrics[:CLUSTER_MAX_CPU].to_f).round(4)*100
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# @raise [Exception] calculation error
|
|
110
|
+
# @return [float] CLUSTER_USED_CPU / CLUSTER_MAX_CPU
|
|
111
|
+
def get_CLUSTER_CPU_LOAD
|
|
112
|
+
raise 'CLUSTER_USED_CPU is missing.' unless @metrics.has_key? :CLUSTER_USED_CPU
|
|
113
|
+
raise 'CLUSTER_MAX_CPU is missing.' unless @metrics.has_key? :CLUSTER_MAX_CPU
|
|
114
|
+
raise 'CLUSTER_MAX_CPU is 0.' if @metrics[:CLUSTER_MAX_CPU] == '0'
|
|
115
|
+
|
|
116
|
+
(@metrics[:CLUSTER_USED_CPU].to_f / @metrics[:CLUSTER_MAX_CPU].to_f).round(4)*100
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# @raise [Exception] calculation error
|
|
120
|
+
# @return [float] CLUSTER_CPU_ALOC / CLUSTER_CPU_LOAD
|
|
121
|
+
def get_CLUSTER_CPU_WASTE
|
|
122
|
+
raise 'CLUSTER_CPU_ALOC is missing.' unless @metrics.has_key? :CLUSTER_CPU_ALOC
|
|
123
|
+
raise 'CLUSTER_CPU_LOAD is missing.' unless @metrics.has_key? :CLUSTER_CPU_LOAD
|
|
124
|
+
|
|
125
|
+
cpu_load = @metrics[:CLUSTER_CPU_LOAD]
|
|
126
|
+
if @metrics[:CLUSTER_CPU_LOAD] == 0
|
|
127
|
+
cpu_load = 0.001
|
|
51
128
|
end
|
|
129
|
+
|
|
130
|
+
(@metrics[:CLUSTER_CPU_ALOC] / cpu_load).round(2)
|
|
52
131
|
end
|
|
53
132
|
end
|
|
@@ -27,4 +27,17 @@ class One2Influx::Datastore < ::One2Influx::OneObject
|
|
|
27
27
|
@tags[:HOSTS_IDS] = ',,' + hosts.join(',,') + ',,'
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
# @raise [Exception] calculation error
|
|
34
|
+
# @return [float] USED_MB / TOTAL_MB
|
|
35
|
+
def get_DS_LOAD
|
|
36
|
+
raise 'USED_MB is missing.' unless @metrics.has_key? :USED_MB
|
|
37
|
+
raise 'TOTAL_MB is missing.' unless @metrics.has_key? :TOTAL_MB
|
|
38
|
+
raise 'TOTAL_MB is 0.' if @metrics[:TOTAL_MB] == '0'
|
|
39
|
+
|
|
40
|
+
(@metrics[:USED_MB].to_f / @metrics[:TOTAL_MB].to_f).round(2)
|
|
41
|
+
end
|
|
42
|
+
|
|
30
43
|
end
|
|
@@ -44,4 +44,69 @@ class One2Influx::Host < ::One2Influx::OneObject
|
|
|
44
44
|
@datastores << ds.content
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
|
+
|
|
48
|
+
# @raise [Exception] calculation error
|
|
49
|
+
# @return [float] MEM_USAGE / MAX_MEM
|
|
50
|
+
def get_HOST_MEM_ALOC
|
|
51
|
+
raise 'MEM_USAGE is missing.' unless @metrics.has_key? :MEM_USAGE
|
|
52
|
+
raise 'MAX_MEM is missing.' unless @metrics.has_key? :MAX_MEM
|
|
53
|
+
raise 'MAX_MEM is 0.' if @metrics[:MAX_MEM] == '0'
|
|
54
|
+
|
|
55
|
+
(@metrics[:MEM_USAGE].to_f / @metrics[:MAX_MEM].to_f).round(4)*100
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# @raise [Exception] calculation error
|
|
59
|
+
# @return [float] USED_MEM / MAX_MEM
|
|
60
|
+
def get_HOST_MEM_LOAD
|
|
61
|
+
raise 'USED_MEM is missing.' unless @metrics.has_key? :USED_MEM
|
|
62
|
+
raise 'MAX_MEM is missing.' unless @metrics.has_key? :MAX_MEM
|
|
63
|
+
raise 'MAX_MEM is 0.' if @metrics[:MAX_MEM] == '0'
|
|
64
|
+
|
|
65
|
+
(@metrics[:USED_MEM].to_f / @metrics[:MAX_MEM].to_f).round(4)*100
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# @raise [Exception] calculation error
|
|
69
|
+
# @return [float] HOST_MEM_ALOC / HOST_MEM_LOAD
|
|
70
|
+
def get_HOST_MEM_WASTE
|
|
71
|
+
raise 'HOST_MEM_ALOC is missing.' unless @metrics.has_key? :HOST_MEM_ALOC
|
|
72
|
+
raise 'HOST_MEM_LOAD is missing.' unless @metrics.has_key? :HOST_MEM_LOAD
|
|
73
|
+
|
|
74
|
+
mem_load = @metrics[:HOST_MEM_LOAD] == 0 ? 0.001 : @metrics[:HOST_MEM_LOAD]
|
|
75
|
+
|
|
76
|
+
(@metrics[:HOST_MEM_ALOC] / mem_load).round(4)*100
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# @raise [Exception] calculation error
|
|
80
|
+
# @return [float] CPU_USAGE / MAX_CPU
|
|
81
|
+
def get_HOST_CPU_ALOC
|
|
82
|
+
raise 'CPU_USAGE is missing.' unless @metrics.has_key? :CPU_USAGE
|
|
83
|
+
raise 'MAX_CPU is missing.' unless @metrics.has_key? :MAX_CPU
|
|
84
|
+
raise 'MAX_CPU is 0.' if @metrics[:MAX_CPU] == '0'
|
|
85
|
+
|
|
86
|
+
(@metrics[:CPU_USAGE].to_f / @metrics[:MAX_CPU].to_f).round(4)*100
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# @raise [Exception] calculation error
|
|
90
|
+
# @return [float] USED_CPU / MAX_CPU
|
|
91
|
+
def get_HOST_CPU_LOAD
|
|
92
|
+
raise 'USED_CPU is missing.' unless @metrics.has_key? :USED_CPU
|
|
93
|
+
raise 'MAX_CPU is missing.' unless @metrics.has_key? :MAX_CPU
|
|
94
|
+
raise 'MAX_CPU is 0.' if @metrics[:MAX_CPU] == '0'
|
|
95
|
+
|
|
96
|
+
(@metrics[:USED_CPU].to_f / @metrics[:MAX_CPU].to_f).round(4)*100
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# @raise [Exception] calculation error
|
|
100
|
+
# @return [float] HOST_CPU_ALOC / HOST_CPU_LOAD
|
|
101
|
+
def get_HOST_CPU_WASTE
|
|
102
|
+
raise 'HOST_CPU_ALOC is missing.' unless @metrics.has_key? :HOST_CPU_ALOC
|
|
103
|
+
raise 'HOST_CPU_LOAD is missing.' unless @metrics.has_key? :HOST_CPU_LOAD
|
|
104
|
+
|
|
105
|
+
cpu_load = @metrics[:HOST_CPU_LOAD]
|
|
106
|
+
if @metrics[:HOST_CPU_LOAD] == 0
|
|
107
|
+
cpu_load = 0.001
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
(@metrics[:HOST_CPU_ALOC] / cpu_load).round(2)
|
|
111
|
+
end
|
|
47
112
|
end
|
|
@@ -47,7 +47,8 @@ class One2Influx::OneObject
|
|
|
47
47
|
@tag_names.each do |influx_name, one_name|
|
|
48
48
|
ni_element = @doc.css(one_name).first
|
|
49
49
|
if ni_element.nil?
|
|
50
|
-
$LOG.error "Unable to get tag '#{one_name}' in #{self.class}."
|
|
50
|
+
$LOG.error "Unable to get tag '#{one_name}' in #{self.class}." +
|
|
51
|
+
'XML parsing error.'
|
|
51
52
|
else
|
|
52
53
|
@tags[influx_name.to_sym] = ni_element.content
|
|
53
54
|
end
|
|
@@ -58,7 +59,8 @@ class One2Influx::OneObject
|
|
|
58
59
|
@metric_names.each do |metric|
|
|
59
60
|
ni_element = @doc.css(metric).first
|
|
60
61
|
if ni_element.nil?
|
|
61
|
-
$LOG.error "Unable to get metric '#{metric}' in #{self.class}."
|
|
62
|
+
$LOG.error "Unable to get metric '#{metric}' in #{self.class}." +
|
|
63
|
+
'XML parsing error.'
|
|
62
64
|
else
|
|
63
65
|
@metrics[metric.to_sym] = ni_element.content
|
|
64
66
|
end
|
|
@@ -67,7 +69,11 @@ class One2Influx::OneObject
|
|
|
67
69
|
|
|
68
70
|
def init_custom_metrics
|
|
69
71
|
@custom_metric_names.each do |metric|
|
|
70
|
-
|
|
72
|
+
begin
|
|
73
|
+
@metrics[metric.to_sym] = self.send("get_#{metric.to_s}")
|
|
74
|
+
rescue Exception => e
|
|
75
|
+
$LOG.error "Unable to get metric '#{metric}'. #{e.message}"
|
|
76
|
+
end
|
|
71
77
|
end
|
|
72
78
|
end
|
|
73
79
|
end
|
|
@@ -19,6 +19,8 @@ class One2Influx::VirtualMachine < ::One2Influx::OneObject
|
|
|
19
19
|
super(xml, client)
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
+
private
|
|
23
|
+
|
|
22
24
|
# Computes percentage usage of memory for virtual machine.
|
|
23
25
|
# Values might go over 1.0 as there is an overhead
|
|
24
26
|
# @return [float] current usage over max usage
|
|
@@ -35,10 +37,9 @@ class One2Influx::VirtualMachine < ::One2Influx::OneObject
|
|
|
35
37
|
|
|
36
38
|
doc = Nokogiri::XML(template.to_xml)
|
|
37
39
|
ni_element = doc.xpath('//TEMPLATE/MEMORY').first
|
|
38
|
-
|
|
40
|
+
|
|
39
41
|
if ni_element.nil? || @metrics[:MEMORY].nil?
|
|
40
|
-
|
|
41
|
-
return
|
|
42
|
+
raise 'Unable to parse VM template.'
|
|
42
43
|
end
|
|
43
44
|
|
|
44
45
|
# Convert //TEMPLATE/MEMORY from MB to kB as //VM/CPU is in kB
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: one2influx
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Matej Zidek
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-05-
|
|
11
|
+
date: 2015-05-17 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: json
|
|
@@ -85,10 +85,12 @@ description: One2influx is small ruby daemon for getting monitoring data from Op
|
|
|
85
85
|
email: zidek.matej@gmail.com
|
|
86
86
|
executables:
|
|
87
87
|
- one2influx
|
|
88
|
+
- one2influx.log
|
|
88
89
|
extensions: []
|
|
89
90
|
extra_rdoc_files: []
|
|
90
91
|
files:
|
|
91
92
|
- bin/one2influx
|
|
93
|
+
- bin/one2influx.log
|
|
92
94
|
- lib/one2influx.rb
|
|
93
95
|
- lib/one2influx/config.rb
|
|
94
96
|
- lib/one2influx/data.rb
|