metrico 0.2.4 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/metrico/point.rb +69 -24
- data/lib/metrico/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9f00801969093cb02daa9a4c40f50a4150b18dcb
|
4
|
+
data.tar.gz: 8439b128901cd4a7778f2c4498923d79ce966805
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f1a0ba8797abf643b0e0317088e3a36af901487ac6b1dba557025e0563a6899f18c085713636878c9b3d7ddc0b81d5aa3ada2bed4580144d3b794872b216bdd
|
7
|
+
data.tar.gz: 741ee8a853e5f9db5460ce91ed16c2f76e9c105fb05ab34c3d2f22b1e3160ca158b6d809ed80f59643c598fbbe4070bf9c54da12d223cbea4cf0a3d74ad7daf0
|
data/lib/metrico/point.rb
CHANGED
@@ -3,47 +3,92 @@ module Metrico
|
|
3
3
|
attr_accessor :name, :tags, :fields
|
4
4
|
|
5
5
|
def initialize(name, fields, tags = {})
|
6
|
-
@name = name
|
7
|
-
@fields = fields
|
6
|
+
@name = measurement(name)
|
7
|
+
@fields = escape_fields(fields)
|
8
8
|
tags = { hostname: Metrico.config.hostname }.merge(tags)
|
9
|
-
@tags = tags
|
9
|
+
@tags = escape_tags(tags)
|
10
10
|
end
|
11
11
|
|
12
|
-
# https://docs.influxdata.com/influxdb/v1.
|
12
|
+
# https://docs.influxdata.com/influxdb/v1.3/write_protocols/line_protocol_tutorial/
|
13
13
|
# InfluxDB Line Protocol
|
14
|
+
# weather,location=us-midwest temperature=82 1465839830100400200
|
15
|
+
# | -------------------- -------------- |
|
16
|
+
# | | | |
|
17
|
+
# | | | |
|
18
|
+
# +-----------+--------+-+---------+-+---------+
|
19
|
+
# |measurement|,tag_set| |field_set| |timestamp|
|
20
|
+
# +-----------+--------+-+---------+-+---------+
|
14
21
|
def to_s
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
22
|
+
str = "#{name}"
|
23
|
+
str << ",#{tags}" if tags
|
24
|
+
str << " #{fields}"
|
25
|
+
str << " #{timestamp}"
|
26
|
+
str
|
19
27
|
end
|
20
28
|
|
21
|
-
private def
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
private def metric_props
|
26
|
-
[
|
27
|
-
comma_equal_flatten_tags(tags),
|
28
|
-
comma_equal_flatten_fields(fields),
|
29
|
-
timestamp
|
30
|
-
].join(' ')
|
29
|
+
private def measurement(name)
|
30
|
+
escape("#{Metrico.config.app_name}:#{name}", :measurement)
|
31
31
|
end
|
32
32
|
|
33
33
|
private def timestamp
|
34
34
|
(Time.now.to_f * 1_000_000_000).to_i
|
35
35
|
end
|
36
36
|
|
37
|
-
private def
|
38
|
-
|
37
|
+
private def escape_tags(tags)
|
38
|
+
return if tags.nil?
|
39
|
+
|
40
|
+
tags = tags.map do |k, v|
|
41
|
+
key = escape(k.to_s, :tag_key)
|
42
|
+
val = escape(v.to_s, :tag_value)
|
43
|
+
|
44
|
+
"#{key}=#{val}" unless key == "".freeze || val == "".freeze
|
45
|
+
end.compact
|
46
|
+
|
47
|
+
tags.join(",") unless tags.empty?
|
39
48
|
end
|
40
49
|
|
41
|
-
private def
|
42
|
-
|
50
|
+
private def escape_fields(fields)
|
51
|
+
return if fields.nil?
|
52
|
+
fields.map do |k, v|
|
53
|
+
key = escape(k.to_s, :field_key)
|
54
|
+
val = escape_value(v)
|
55
|
+
"#{key}=#{val}"
|
56
|
+
end.join(",".freeze)
|
43
57
|
end
|
44
58
|
|
45
|
-
private def
|
46
|
-
|
59
|
+
private def escape_value(value)
|
60
|
+
if value.is_a?(String)
|
61
|
+
'"'.freeze + escape(value, :field_value) + '"'.freeze
|
62
|
+
elsif value.is_a?(Integer)
|
63
|
+
"#{value}i"
|
64
|
+
else
|
65
|
+
value.to_s
|
66
|
+
end
|
47
67
|
end
|
68
|
+
|
69
|
+
private def escape(string, type)
|
70
|
+
# rubocop:disable Layout/AlignParameters
|
71
|
+
string = string.encode(
|
72
|
+
'UTF-8'.freeze,
|
73
|
+
'UTF-8'.freeze,
|
74
|
+
invalid: :replace,
|
75
|
+
undef: :replace,
|
76
|
+
replace: ''.freeze
|
77
|
+
)
|
78
|
+
|
79
|
+
ESCAPES[type].each do |char|
|
80
|
+
string = string.gsub(char) { "\\#{char}" }
|
81
|
+
end
|
82
|
+
string
|
83
|
+
end
|
84
|
+
|
85
|
+
ESCAPES = {
|
86
|
+
measurement: [' '.freeze, ','.freeze],
|
87
|
+
tag_key: ['='.freeze, ' '.freeze, ','.freeze],
|
88
|
+
tag_value: ['='.freeze, ' '.freeze, ','.freeze],
|
89
|
+
field_key: ['='.freeze, ' '.freeze, ','.freeze, '"'.freeze],
|
90
|
+
field_value: ["\\".freeze, '"'.freeze],
|
91
|
+
}.freeze
|
92
|
+
|
48
93
|
end
|
49
94
|
end
|
data/lib/metrico/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: metrico
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ivan Shamatov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nats-pure
|
@@ -109,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
109
109
|
version: '0'
|
110
110
|
requirements: []
|
111
111
|
rubyforge_project:
|
112
|
-
rubygems_version: 2.
|
112
|
+
rubygems_version: 2.5.2
|
113
113
|
signing_key:
|
114
114
|
specification_version: 4
|
115
115
|
summary: NATS ruby client to write metrics
|