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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9c641a0627db7ea79be5da4122ea5cc48dc6a041
4
- data.tar.gz: 656117477721f6d8f6e0779c3e4b2b35dcaf0c1b
3
+ metadata.gz: 9f00801969093cb02daa9a4c40f50a4150b18dcb
4
+ data.tar.gz: 8439b128901cd4a7778f2c4498923d79ce966805
5
5
  SHA512:
6
- metadata.gz: 1129dac0ac3d9b74c6a1f060209266392cb721019aabd528cadf45336618a1fa7892300add9053ee9644a8531aa5fb57ca5bb32eb276b683ecbcfa10c80f1109
7
- data.tar.gz: 9e2517320375f5b0445e300a0ac78af3c08496087f2c667e7a4cb9acd62eb87abcc4991d49863b96dcca9e8e8e624bc15077a20cb3ba9c36604d358c802f9508
6
+ metadata.gz: 4f1a0ba8797abf643b0e0317088e3a36af901487ac6b1dba557025e0563a6899f18c085713636878c9b3d7ddc0b81d5aa3ada2bed4580144d3b794872b216bdd
7
+ data.tar.gz: 741ee8a853e5f9db5460ce91ed16c2f76e9c105fb05ab34c3d2f22b1e3160ca158b6d809ed80f59643c598fbbe4070bf9c54da12d223cbea4cf0a3d74ad7daf0
@@ -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.2/write_protocols/line_protocol_tutorial/
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
- metric_name,
17
- metric_props
18
- ].join(',')
22
+ str = "#{name}"
23
+ str << ",#{tags}" if tags
24
+ str << " #{fields}"
25
+ str << " #{timestamp}"
26
+ str
19
27
  end
20
28
 
21
- private def metric_name
22
- [Metrico.config.app_name, name].join(':')
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 comma_equal_flatten_tags(hash)
38
- compact(hash).map { |k, v| [k, v].join('=') }.join(',')
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 comma_equal_flatten_fields(hash)
42
- compact(hash).map { |k, v| [k, v.inspect].join('=') }.join(',')
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 compact(hash)
46
- hash.reject { |_, value| value.nil? }
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
@@ -1,3 +1,3 @@
1
1
  module Metrico
2
- VERSION = '0.2.4'.freeze
2
+ VERSION = '0.3.0'.freeze
3
3
  end
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.2.4
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-08-15 00:00:00.000000000 Z
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.6.11
112
+ rubygems_version: 2.5.2
113
113
  signing_key:
114
114
  specification_version: 4
115
115
  summary: NATS ruby client to write metrics