metrix 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/metrix +2 -65
- data/lib/metrix/base.rb +26 -33
- data/lib/metrix/cli.rb +141 -0
- data/lib/metrix/elastic_search.rb +6 -2
- data/lib/metrix/graphite.rb +31 -30
- data/lib/metrix/json.rb +26 -0
- data/lib/metrix/load.rb +38 -0
- data/lib/metrix/metric.rb +37 -0
- data/lib/metrix/mongodb.rb +33 -2
- data/lib/metrix/opentsdb.rb +33 -0
- data/lib/metrix/process.rb +94 -0
- data/lib/metrix/reporter/stdout.rb +17 -0
- data/lib/metrix/system.rb +72 -0
- data/lib/metrix/version.rb +1 -1
- data/lib/metrix.rb +4 -0
- data/spec/fixtures/ec2metadata.txt +25 -0
- data/spec/fixtures/loadavg.txt +1 -0
- data/spec/fixtures/mongo_server_status.json +110 -48
- data/spec/fixtures/proc.26928.txt +3 -0
- data/spec/fixtures/proc.stat.txt +18 -0
- data/spec/lib/metrix/elastic_search_spec.rb +24 -23
- data/spec/lib/metrix/graphite_spec.rb +25 -0
- data/spec/lib/metrix/load_spec.rb +29 -0
- data/spec/lib/metrix/metric_spec.rb +23 -0
- data/spec/lib/metrix/mongodb_spec.rb +39 -16
- data/spec/lib/metrix/opentsdb_spec.rb +27 -0
- data/spec/lib/metrix/process_spec.rb +49 -0
- data/spec/lib/metrix/system_spec.rb +38 -0
- data/spec/spec_helper.rb +13 -0
- metadata +30 -2
@@ -0,0 +1,72 @@
|
|
1
|
+
require "metrix/base"
|
2
|
+
|
3
|
+
module Metrix
|
4
|
+
class System < Base
|
5
|
+
class Cpu
|
6
|
+
def initialize(values)
|
7
|
+
@values = values
|
8
|
+
end
|
9
|
+
|
10
|
+
{
|
11
|
+
user: 0,
|
12
|
+
nice: 1,
|
13
|
+
system: 2,
|
14
|
+
idle: 3,
|
15
|
+
iowait: 4,
|
16
|
+
irq: 5,
|
17
|
+
softirq: 6,
|
18
|
+
}.each do |k, v|
|
19
|
+
define_method(k) do
|
20
|
+
@values.at(v)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize(raw = File.read("/proc/stat"), time = Time.now)
|
26
|
+
@raw = raw
|
27
|
+
@time = time
|
28
|
+
end
|
29
|
+
|
30
|
+
[:processes, :procs_running, :procs_blocked, :ctxt].each do |m|
|
31
|
+
define_method(m) do
|
32
|
+
cast_int(@raw[/^#{m} (\d+)/, 1])
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def unfiltered_metrics
|
37
|
+
{
|
38
|
+
"processes" => processes,
|
39
|
+
"procs_running" => procs_running,
|
40
|
+
"procs_blocked" => procs_blocked,
|
41
|
+
"ctxt" => ctxt,
|
42
|
+
"cpu.user" => cpu.user,
|
43
|
+
"cpu.nice" => cpu.nice,
|
44
|
+
"cpu.system" => cpu.system,
|
45
|
+
"cpu.idle" => cpu.idle,
|
46
|
+
"cpu.iowait" => cpu.iowait,
|
47
|
+
"cpu.irq" => cpu.irq,
|
48
|
+
"cpu.softirq" => cpu.softirq,
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
def load1
|
53
|
+
loadavg.split(" ").first.to_f
|
54
|
+
end
|
55
|
+
|
56
|
+
def loadavg
|
57
|
+
@loadavg ||= File.read("/proc/loadavg")
|
58
|
+
end
|
59
|
+
|
60
|
+
def prefix
|
61
|
+
"system"
|
62
|
+
end
|
63
|
+
|
64
|
+
def cpu
|
65
|
+
Cpu.new(@raw[/^cpu (.*)/, 1].split(" ").map(&:to_i))
|
66
|
+
end
|
67
|
+
|
68
|
+
def cast_int(value)
|
69
|
+
value.to_i if value
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/metrix/version.rb
CHANGED
data/lib/metrix.rb
CHANGED
@@ -0,0 +1,25 @@
|
|
1
|
+
ami-id: ami-12345
|
2
|
+
ami-launch-index: 0
|
3
|
+
ami-manifest-path: (unknown)
|
4
|
+
ancestor-ami-ids: unavailable
|
5
|
+
availability-zone: eu-west-1a
|
6
|
+
block-device-mapping: ami
|
7
|
+
ephemeral0
|
8
|
+
root
|
9
|
+
swap
|
10
|
+
instance-action: none
|
11
|
+
instance-id: i-252535
|
12
|
+
instance-type: m1.small
|
13
|
+
local-hostname: ip-1-2-3-4.eu-west-1.compute.internal
|
14
|
+
local-ipv4: 1.2.3.4
|
15
|
+
kernel-id: aki-71665e05
|
16
|
+
mac: unavailable
|
17
|
+
profile: default-paravirtual
|
18
|
+
product-codes: unavailable
|
19
|
+
public-hostname: ec2-2-4-6-8.eu-west-1.compute.amazonaws.com
|
20
|
+
public-ipv4: 2.4.6.8
|
21
|
+
public-keys: ['some.ssh.key']
|
22
|
+
ramdisk-id: unavailable
|
23
|
+
reserveration-id: unavailable
|
24
|
+
security-groups: default
|
25
|
+
user-data: unavailable
|
@@ -0,0 +1 @@
|
|
1
|
+
0.04 0.23 0.26 1/84 8512
|
@@ -1,63 +1,125 @@
|
|
1
|
-
{ "host" : "tobias
|
2
|
-
"version" : "2.
|
1
|
+
{ "host" : "mbp-tobias.local",
|
2
|
+
"version" : "2.4.3",
|
3
3
|
"process" : "mongod",
|
4
|
-
"
|
5
|
-
"
|
6
|
-
"
|
7
|
-
"
|
8
|
-
|
9
|
-
"ratio" : 9.634026114207743e-06,
|
10
|
-
"currentQueue" : { "total" : 0,
|
11
|
-
"readers" : 0,
|
12
|
-
"writers" : 0 },
|
13
|
-
"activeClients" : { "total" : 0,
|
14
|
-
"readers" : 0,
|
15
|
-
"writers" : 0 } },
|
16
|
-
"mem" : { "bits" : 64,
|
17
|
-
"resident" : 14,
|
18
|
-
"virtual" : 2414,
|
19
|
-
"supported" : true,
|
20
|
-
"mapped" : 0,
|
21
|
-
"mappedWithJournal" : 0 },
|
22
|
-
"connections" : { "current" : 0,
|
23
|
-
"available" : 2048 },
|
24
|
-
"extra_info" : { "note" : "fields vary by platform" },
|
25
|
-
"indexCounters" : { "btree" : { "accesses" : 0,
|
26
|
-
"hits" : 0,
|
27
|
-
"misses" : 0,
|
28
|
-
"resets" : 0,
|
29
|
-
"missRatio" : 0 } },
|
30
|
-
"backgroundFlushing" : { "flushes" : 0,
|
31
|
-
"total_ms" : 0,
|
32
|
-
"average_ms" : 0,
|
33
|
-
"last_ms" : 0,
|
34
|
-
"last_finished" : { "$date" : 0 } },
|
35
|
-
"cursors" : { "totalOpen" : 0,
|
36
|
-
"clientCursors_size" : 0,
|
37
|
-
"timedOut" : 0 },
|
38
|
-
"network" : { "bytesIn" : 0,
|
39
|
-
"bytesOut" : 0,
|
40
|
-
"numRequests" : 0 },
|
41
|
-
"opcounters" : { "insert" : 0,
|
42
|
-
"query" : 1,
|
43
|
-
"update" : 0,
|
44
|
-
"delete" : 0,
|
45
|
-
"getmore" : 0,
|
46
|
-
"command" : 0 },
|
4
|
+
"pid" : 83257,
|
5
|
+
"uptime" : 475,
|
6
|
+
"uptimeMillis" : 474819,
|
7
|
+
"uptimeEstimate" : 440,
|
8
|
+
"localTime" : { "$date" : "Sat Jun 1 16:32:41 2013" },
|
47
9
|
"asserts" : { "regular" : 0,
|
48
10
|
"warning" : 0,
|
49
11
|
"msg" : 0,
|
50
12
|
"user" : 0,
|
51
13
|
"rollovers" : 0 },
|
52
|
-
"
|
14
|
+
"backgroundFlushing" : { "flushes" : 7,
|
15
|
+
"total_ms" : 803,
|
16
|
+
"average_ms" : 114.7142857142857,
|
17
|
+
"last_ms" : 2,
|
18
|
+
"last_finished" : { "$date" : "Sat Jun 1 16:31:46 2013" } },
|
19
|
+
"connections" : { "current" : 0,
|
20
|
+
"available" : 2048,
|
21
|
+
"totalCreated" : 11 },
|
22
|
+
"cursors" : { "totalOpen" : 0,
|
23
|
+
"clientCursors_size" : 0,
|
24
|
+
"timedOut" : 0 },
|
53
25
|
"dur" : { "commits" : 29,
|
54
26
|
"journaledMB" : 0,
|
55
27
|
"writeToDataFilesMB" : 0,
|
56
28
|
"compression" : 0,
|
57
29
|
"commitsInWriteLock" : 0,
|
58
30
|
"earlyCommits" : 0,
|
59
|
-
"timeMs" : { "dt" :
|
31
|
+
"timeMs" : { "dt" : 3024,
|
60
32
|
"prepLogBuffer" : 0,
|
61
33
|
"writeToJournal" : 0,
|
62
34
|
"writeToDataFiles" : 0,
|
63
|
-
"remapPrivateView" : 0 } }
|
35
|
+
"remapPrivateView" : 0 } },
|
36
|
+
"extra_info" : { "note" : "fields vary by platform",
|
37
|
+
"page_faults" : 1176 },
|
38
|
+
"globalLock" : { "totalTime" : 474819000,
|
39
|
+
"lockTime" : 1060706,
|
40
|
+
"currentQueue" : { "total" : 0,
|
41
|
+
"readers" : 0,
|
42
|
+
"writers" : 0 },
|
43
|
+
"activeClients" : { "total" : 0,
|
44
|
+
"readers" : 0,
|
45
|
+
"writers" : 0 } },
|
46
|
+
"indexCounters" : { "accesses" : 3,
|
47
|
+
"hits" : 3,
|
48
|
+
"misses" : 0,
|
49
|
+
"resets" : 0,
|
50
|
+
"missRatio" : 0 },
|
51
|
+
"locks" : { "." : { "timeLockedMicros" : { "R" : 23926,
|
52
|
+
"W" : 1060706 },
|
53
|
+
"timeAcquiringMicros" : { "R" : 946700,
|
54
|
+
"W" : 1234045 } },
|
55
|
+
"admin" : { "timeLockedMicros" : {},
|
56
|
+
"timeAcquiringMicros" : {} },
|
57
|
+
"local" : { "timeLockedMicros" : { "r" : 897017,
|
58
|
+
"w" : 0 },
|
59
|
+
"timeAcquiringMicros" : { "r" : 87,
|
60
|
+
"w" : 0 } },
|
61
|
+
"opentsdb" : { "timeLockedMicros" : { "r" : 12800,
|
62
|
+
"w" : 670009 },
|
63
|
+
"timeAcquiringMicros" : { "r" : 168,
|
64
|
+
"w" : 28 } } },
|
65
|
+
"network" : { "bytesIn" : 2963,
|
66
|
+
"bytesOut" : 3099,
|
67
|
+
"numRequests" : 37 },
|
68
|
+
"opcounters" : { "insert" : 4,
|
69
|
+
"query" : 18,
|
70
|
+
"update" : 0,
|
71
|
+
"delete" : 0,
|
72
|
+
"getmore" : 0,
|
73
|
+
"command" : 31 },
|
74
|
+
"opcountersRepl" : { "insert" : 0,
|
75
|
+
"query" : 0,
|
76
|
+
"update" : 0,
|
77
|
+
"delete" : 0,
|
78
|
+
"getmore" : 0,
|
79
|
+
"command" : 0 },
|
80
|
+
"recordStats" : { "accessesNotInMemory" : 0,
|
81
|
+
"pageFaultExceptionsThrown" : 0,
|
82
|
+
"local" : { "accessesNotInMemory" : 0,
|
83
|
+
"pageFaultExceptionsThrown" : 0 },
|
84
|
+
"opentsdb" : { "accessesNotInMemory" : 0,
|
85
|
+
"pageFaultExceptionsThrown" : 0 } },
|
86
|
+
"writeBacksQueued" : false,
|
87
|
+
"mem" : { "bits" : 64,
|
88
|
+
"resident" : 9,
|
89
|
+
"virtual" : 2814,
|
90
|
+
"supported" : true,
|
91
|
+
"mapped" : 160,
|
92
|
+
"mappedWithJournal" : 320 },
|
93
|
+
"metrics" : { "document" : { "deleted" : 0,
|
94
|
+
"inserted" : 4,
|
95
|
+
"returned" : 5,
|
96
|
+
"updated" : 0 },
|
97
|
+
"getLastError" : { "wtime" : { "num" : 3,
|
98
|
+
"totalMillis" : 0 },
|
99
|
+
"wtimeouts" : 0 },
|
100
|
+
"operation" : { "fastmod" : 0,
|
101
|
+
"idhack" : 0,
|
102
|
+
"scanAndOrder" : 0 },
|
103
|
+
"queryExecutor" : { "scanned" : 12 },
|
104
|
+
"record" : { "moves" : 0 },
|
105
|
+
"repl" : { "apply" : { "batches" : { "num" : 0,
|
106
|
+
"totalMillis" : 0 },
|
107
|
+
"ops" : 0 },
|
108
|
+
"buffer" : { "count" : 0,
|
109
|
+
"maxSizeBytes" : 268435456,
|
110
|
+
"sizeBytes" : 0 },
|
111
|
+
"network" : { "bytes" : 0,
|
112
|
+
"getmores" : { "num" : 0,
|
113
|
+
"totalMillis" : 0 },
|
114
|
+
"ops" : 0,
|
115
|
+
"readersCreated" : 0 },
|
116
|
+
"oplog" : { "insert" : { "num" : 0,
|
117
|
+
"totalMillis" : 0 },
|
118
|
+
"insertBytes" : 0 },
|
119
|
+
"preload" : { "docs" : { "num" : 0,
|
120
|
+
"totalMillis" : 0 },
|
121
|
+
"indexes" : { "num" : 0,
|
122
|
+
"totalMillis" : 0 } } },
|
123
|
+
"ttl" : { "deletedDocuments" : 0,
|
124
|
+
"passes" : 7 } },
|
125
|
+
"ok" : 1 }
|
@@ -0,0 +1,3 @@
|
|
1
|
+
26928 (java) S 1 26852 26723 34816 28475 4218880 332517 9459 13 0 32337 34740 2 16 20 0 125 0 2630432 1688936448 289510
|
2
|
+
18446744073709551615 4194304 4196484 140734482110432 140734482092992 140087191929368 0 0 3 16800972 18446744073709551615 0 0 17
|
3
|
+
0 0 0 0 0 0 6293640 6294276 39821312 140734482113510 140734482117905 140734482117905 140734482120657 0
|
@@ -0,0 +1,18 @@
|
|
1
|
+
cpu 79833 8300 84916 5887890 54619 93 19796 0 0 0
|
2
|
+
cpu0 38333 6351 41352 2933041 23957 69 17322 0 0 0
|
3
|
+
cpu1 41500 1948 43563 2954849 30662 23 2474 0 0 0
|
4
|
+
intr 5525124 60 9 0 0 0 0 0 0 0 0 0 0 150 0 0 0 1780060 0 0 338428 24852 406960 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
5
|
+
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
6
|
+
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
7
|
+
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
8
|
+
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
9
|
+
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
10
|
+
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
11
|
+
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
12
|
+
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
13
|
+
ctxt 9201101
|
14
|
+
btime 1370038650
|
15
|
+
processes 28467
|
16
|
+
procs_running 1
|
17
|
+
procs_blocked 0
|
18
|
+
softirq 4015410 0 661828 12899 1839122 396522 0 78 248229 10294 846438
|
@@ -1,40 +1,41 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
require "metrix/elastic_search"
|
3
3
|
|
4
|
-
describe "Metrox::ElasticSearch"
|
4
|
+
describe "Metrox::ElasticSearch" do
|
5
5
|
let(:payload) { FIXTURES_PATH.join("es_status.json").read }
|
6
|
-
subject(:es_status) { Metrix::ElasticSearch.
|
6
|
+
subject(:es_status) { Metrix::ElasticSearch.new(payload) }
|
7
7
|
it { should_not be_nil }
|
8
8
|
it { subject.attributes.should be_kind_of(Hash) }
|
9
|
+
it { subject.time.should_not be_nil }
|
9
10
|
|
10
11
|
describe "#metrics" do
|
11
|
-
subject(:metrics) { es_status.metrics }
|
12
|
+
subject(:metrics) { hash_metrics(es_status.metrics) }
|
12
13
|
it { should be_kind_of(Hash) }
|
13
14
|
it { should_not be_empty }
|
14
15
|
|
15
16
|
{
|
16
|
-
"_shards.total"=>10,
|
17
|
-
"_shards.successful"=>5,
|
18
|
-
"_shards.failed"=>0,
|
19
|
-
"indices.search.index.primary_size_in_bytes"=>2008,
|
20
|
-
"indices.search.index.size_in_bytes"=>2008,
|
21
|
-
"indices.search.translog.operations"=>1,
|
22
|
-
"indices.search.docs.num_docs"=>1,
|
23
|
-
"indices.search.docs.max_doc"=>1,
|
24
|
-
"indices.search.docs.deleted_docs"=>0,
|
25
|
-
"indices.search.merges.current"=>0,
|
26
|
-
"indices.search.merges.current_docs"=>0,
|
27
|
-
"indices.search.merges.current_size_in_bytes"=>0,
|
28
|
-
"indices.search.merges.total"=>0,
|
29
|
-
"indices.search.merges.total_time_in_millis"=>0,
|
30
|
-
"indices.search.merges.total_docs"=>0,
|
31
|
-
"indices.search.merges.total_size_in_bytes"=>0,
|
32
|
-
"indices.search.refresh.total"=>6,
|
33
|
-
"indices.search.refresh.total_time_in_millis"=>124,
|
34
|
-
"indices.search.flush.total"=>0,
|
17
|
+
"elasticsearch._shards.total"=>10,
|
18
|
+
"elasticsearch._shards.successful"=>5,
|
19
|
+
"elasticsearch._shards.failed"=>0,
|
20
|
+
"elasticsearch.indices.search.index.primary_size_in_bytes"=>2008,
|
21
|
+
"elasticsearch.indices.search.index.size_in_bytes"=>2008,
|
22
|
+
"elasticsearch.indices.search.translog.operations"=>1,
|
23
|
+
"elasticsearch.indices.search.docs.num_docs"=>1,
|
24
|
+
"elasticsearch.indices.search.docs.max_doc"=>1,
|
25
|
+
"elasticsearch.indices.search.docs.deleted_docs"=>0,
|
26
|
+
"elasticsearch.indices.search.merges.current"=>0,
|
27
|
+
"elasticsearch.indices.search.merges.current_docs"=>0,
|
28
|
+
"elasticsearch.indices.search.merges.current_size_in_bytes"=>0,
|
29
|
+
"elasticsearch.indices.search.merges.total"=>0,
|
30
|
+
"elasticsearch.indices.search.merges.total_time_in_millis"=>0,
|
31
|
+
"elasticsearch.indices.search.merges.total_docs"=>0,
|
32
|
+
"elasticsearch.indices.search.merges.total_size_in_bytes"=>0,
|
33
|
+
"elasticsearch.indices.search.refresh.total"=>6,
|
34
|
+
"elasticsearch.indices.search.refresh.total_time_in_millis"=>124,
|
35
|
+
"elasticsearch.indices.search.flush.total"=>0,
|
35
36
|
}.each do |k, v|
|
36
37
|
it "should set attributes #{k.inspect} to #{v.inspect}" do
|
37
|
-
subject[k].should eq(v)
|
38
|
+
subject[k].value.should eq(v)
|
38
39
|
end
|
39
40
|
end
|
40
41
|
it { subject.keys.count.should eq(20) }
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "metrix/graphite"
|
3
|
+
|
4
|
+
describe "Metrix::Graphite" do
|
5
|
+
let(:data) { FIXTURES_PATH.join("proc.26928.txt").read }
|
6
|
+
let(:metric) { Metrix::Process.new(data, Time.at(1370091027)) }
|
7
|
+
subject(:client) { Metrix::Graphite.new("128.0.0.1") }
|
8
|
+
|
9
|
+
it { should_not be_nil }
|
10
|
+
it { subject.port.should eq(2003) }
|
11
|
+
|
12
|
+
describe "#<<" do
|
13
|
+
before do
|
14
|
+
client << metric
|
15
|
+
end
|
16
|
+
|
17
|
+
it { should_not be_nil }
|
18
|
+
it { client.buffers.count.should eq(11) }
|
19
|
+
describe "first line" do
|
20
|
+
subject(:line) { client.buffers.first }
|
21
|
+
it { should eq("metrix.test.host.system.process.minflt 332517 1370091027") }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "metrix/load"
|
3
|
+
|
4
|
+
describe "Metrix::Load" do
|
5
|
+
let(:data) {FIXTURES_PATH.join("loadavg.txt").read }
|
6
|
+
subject(:loadavg) { Metrix::Load.new(data) }
|
7
|
+
|
8
|
+
it { should_not be_nil }
|
9
|
+
it { loadavg.load1.should eq(0.04) }
|
10
|
+
it { loadavg.load5.should eq(0.23) }
|
11
|
+
it { loadavg.load15.should eq(0.26) }
|
12
|
+
|
13
|
+
describe "#metrics" do
|
14
|
+
subject(:metrics) { loadavg.extract(1) }
|
15
|
+
it { should be_kind_of(Hash) }
|
16
|
+
it { subject.count.should eq(3) }
|
17
|
+
|
18
|
+
{
|
19
|
+
load1: 0.04,
|
20
|
+
load5: 0.23,
|
21
|
+
load15: 0.26,
|
22
|
+
}.each do |k, v|
|
23
|
+
it "should return #{k.inspect} with #{v.inspect}" do
|
24
|
+
subject[k].should eq(v)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "metrix/metric"
|
3
|
+
|
4
|
+
describe "Metrix::Metric" do
|
5
|
+
subject(:metric) do
|
6
|
+
Metrix::Metric.new("recordStats.pageFaultExceptionsThrown", 10, Time.at(12), database: "opentsdb")
|
7
|
+
end
|
8
|
+
|
9
|
+
it { should_not be_nil }
|
10
|
+
|
11
|
+
describe "#to_graphite" do
|
12
|
+
subject(:string) { metric.to_graphite }
|
13
|
+
it { should be_kind_of(String) }
|
14
|
+
it { should eq("metrix.test.host.databases.opentsdb.recordStats.pageFaultExceptionsThrown 10 12") }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#to_opentsdb" do
|
18
|
+
subject(:string) { metric.to_opentsdb }
|
19
|
+
it { should be_kind_of(String) }
|
20
|
+
it { should eq("put recordStats.pageFaultExceptionsThrown 12 10 database=opentsdb hostname=test.host") }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -1,37 +1,60 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
require "metrix/mongodb"
|
3
3
|
|
4
|
-
describe "Metrix::Mongodb"
|
4
|
+
describe "Metrix::Mongodb" do
|
5
5
|
let(:payload) { FIXTURES_PATH.join("mongo_server_status.json").read }
|
6
6
|
|
7
|
-
subject(:status) { Metrix::Mongodb.
|
7
|
+
subject(:status) { Metrix::Mongodb.new(payload) }
|
8
8
|
it { should_not be_nil }
|
9
9
|
|
10
|
+
describe "tagged_metrics" do
|
11
|
+
subject(:tagged_metrics) { status.tagged_metrics }
|
12
|
+
it { should be_kind_of(Array) }
|
13
|
+
it { should_not be_empty }
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "ignore_metric?" do
|
17
|
+
%w(
|
18
|
+
locks...timeAcquiringMicros.W
|
19
|
+
recordStats.opentsdb.pageFaultExceptionsThrown
|
20
|
+
).each do |m|
|
21
|
+
it "should ignore #{m}" do
|
22
|
+
status.should be_ignore_metric(m)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
10
27
|
describe "#metrics" do
|
11
|
-
subject(:metrics) { status.metrics }
|
28
|
+
subject(:metrics) { hash_metrics(status.metrics) }
|
12
29
|
it { should be_kind_of(Hash) }
|
13
30
|
|
14
|
-
%w(
|
31
|
+
%w(
|
32
|
+
mongodb.ok mongodb.mem.bits mongodb.pid mongodb.uptime
|
33
|
+
mongodb.uptimeMillis mongodb.uptimeEstimate
|
34
|
+
mongodb.recordStats.opentsdb.pageFaultExceptionsThrown
|
35
|
+
mongodb.locks.local.timeLockedMicros.r
|
36
|
+
).each do |name|
|
15
37
|
it "should not have key #{name.inspect}" do
|
16
38
|
subject.should_not have_key(name)
|
17
39
|
end
|
18
40
|
end
|
19
41
|
|
20
42
|
{
|
21
|
-
"globalLock.totalTime"=>
|
22
|
-
"globalLock.lockTime"=>
|
23
|
-
"globalLock.
|
24
|
-
"globalLock.currentQueue.
|
25
|
-
"globalLock.currentQueue.
|
26
|
-
"globalLock.
|
27
|
-
"globalLock.activeClients.
|
28
|
-
"globalLock.activeClients.
|
29
|
-
"
|
30
|
-
"mem.
|
31
|
-
"
|
43
|
+
"mongodb.globalLock.totalTime"=>474819000,
|
44
|
+
"mongodb.globalLock.lockTime"=>1060706,
|
45
|
+
"mongodb.globalLock.currentQueue.total"=>0,
|
46
|
+
"mongodb.globalLock.currentQueue.readers"=>0,
|
47
|
+
"mongodb.globalLock.currentQueue.writers"=>0,
|
48
|
+
"mongodb.globalLock.activeClients.total"=>0,
|
49
|
+
"mongodb.globalLock.activeClients.readers"=>0,
|
50
|
+
"mongodb.globalLock.activeClients.writers"=>0,
|
51
|
+
"mongodb.mem.resident"=>9,
|
52
|
+
"mongodb.mem.virtual"=>2814,
|
53
|
+
"mongodb.recordStats.accessesNotInMemory" => 0,
|
54
|
+
"mongodb.recordStats.pageFaultExceptionsThrown" => 0,
|
32
55
|
}.each do |k, v|
|
33
56
|
it "should set #{k} to #{v}" do
|
34
|
-
subject[k].should eq(v)
|
57
|
+
subject[k].value.should eq(v)
|
35
58
|
end
|
36
59
|
end
|
37
60
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "metrix/opentsdb"
|
3
|
+
|
4
|
+
describe "Metrix::OpenTSDB" do
|
5
|
+
let(:data) { FIXTURES_PATH.join("proc.26928.txt").read }
|
6
|
+
subject(:client) { Metrix::OpenTSDB.new("127.0.0.1", 1234) }
|
7
|
+
let(:metric) { Metrix::Process.new(data) }
|
8
|
+
|
9
|
+
it { should_not be_nil }
|
10
|
+
|
11
|
+
describe "adding a metric" do
|
12
|
+
before do
|
13
|
+
client << metric
|
14
|
+
end
|
15
|
+
|
16
|
+
it { should_not be_nil }
|
17
|
+
it { subject.buffers.count.should eq(11) }
|
18
|
+
|
19
|
+
describe "first in buffer" do
|
20
|
+
subject(:line) { client.buffers.first }
|
21
|
+
it { should be_kind_of(String) }
|
22
|
+
it { should include("pid=26928") }
|
23
|
+
it { should include("332517 name=java") }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "metrix/process"
|
3
|
+
|
4
|
+
describe "Metrix::Process" do
|
5
|
+
let(:data) { FIXTURES_PATH.join("proc.26928.txt").read }
|
6
|
+
subject(:process) { Metrix::Process.new(data) }
|
7
|
+
|
8
|
+
it { should_not be_nil }
|
9
|
+
it { subject.time.should be_kind_of(Time) }
|
10
|
+
|
11
|
+
it { subject.name.should eq("java") }
|
12
|
+
it { subject.state.should eq("S") }
|
13
|
+
it { subject.utime.should eq(32337) }
|
14
|
+
it { subject.stime.should eq(34740) }
|
15
|
+
|
16
|
+
describe "#metrics" do
|
17
|
+
subject(:metrics) do
|
18
|
+
hash_metrics(process.metrics)
|
19
|
+
end
|
20
|
+
|
21
|
+
it { should be_kind_of(Hash) }
|
22
|
+
|
23
|
+
{
|
24
|
+
"system.process.minflt" => 332517,
|
25
|
+
"system.process.cminflt" => 9459,
|
26
|
+
"system.process.majflt" => 13,
|
27
|
+
"system.process.cmajflt" => 0,
|
28
|
+
"system.process.utime" => 32337,
|
29
|
+
"system.process.stime" => 34740,
|
30
|
+
"system.process.cutime" => 2,
|
31
|
+
"system.process.sctime" => 16,
|
32
|
+
"system.process.num_threads" => 125,
|
33
|
+
"system.process.vsize" => 1688936448,
|
34
|
+
"system.process.rss" => 289510,
|
35
|
+
}.each do |k, v|
|
36
|
+
it "should set #{k.inspect} to #{v.inspect}" do
|
37
|
+
subject[k].value.should eq(v)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#tags" do
|
43
|
+
subject(:tags) { process.tags }
|
44
|
+
it { should be_kind_of(Hash) }
|
45
|
+
it { subject[:name].should eq("java") }
|
46
|
+
it { subject[:pid].should eq(26928) }
|
47
|
+
it { subject[:ppid].should eq(1) }
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "metrix/system"
|
3
|
+
|
4
|
+
describe "Metrix::System" do
|
5
|
+
let(:data) {FIXTURES_PATH.join("proc.stat.txt").read }
|
6
|
+
subject(:system) { Metrix::System.new(data) }
|
7
|
+
|
8
|
+
it { should_not be_nil }
|
9
|
+
it { subject.processes.should eq(28467) }
|
10
|
+
it { subject.procs_running.should eq(1) }
|
11
|
+
it { subject.procs_blocked.should eq(0) }
|
12
|
+
|
13
|
+
describe "#metrics" do
|
14
|
+
subject(:metrics) { hash_metrics(system.metrics) }
|
15
|
+
|
16
|
+
{
|
17
|
+
"system.processes" => 28467,
|
18
|
+
"system.procs_running"=>1,
|
19
|
+
"system.procs_blocked"=>0
|
20
|
+
}.each do |k, v|
|
21
|
+
it "should set #{k.inspect} to #{v.inspect}" do
|
22
|
+
subject[k].value.should eq(v)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#cpu" do
|
28
|
+
subject(:cpu) { system.cpu }
|
29
|
+
it { subject.user.should eq(79833) }
|
30
|
+
it { subject.nice.should eq(8300) }
|
31
|
+
it { subject.system.should eq(84916) }
|
32
|
+
it { subject.idle.should eq(5887890) }
|
33
|
+
it { subject.iowait.should eq(54619) }
|
34
|
+
it { subject.irq.should eq(93) }
|
35
|
+
it { subject.softirq.should eq(19796) }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
data/spec/spec_helper.rb
CHANGED
@@ -5,6 +5,19 @@ RSpec.configure do |c|
|
|
5
5
|
c.treat_symbols_as_metadata_keys_with_true_values = true
|
6
6
|
c.filter_run :focus => true
|
7
7
|
c.run_all_when_everything_filtered = true
|
8
|
+
|
9
|
+
c.before do
|
10
|
+
require "metrix"
|
11
|
+
Metrix.stub(:hostname) { "test.host" }
|
12
|
+
Metrix.logger.level = Logger::ERROR
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def hash_metrics(metrics)
|
17
|
+
metrics.inject({}) do |hash, m|
|
18
|
+
hash[m.key] = m
|
19
|
+
hash
|
20
|
+
end
|
8
21
|
end
|
9
22
|
|
10
23
|
require "pathname"
|