File: point_value.rb

package info (click to toggle)
ruby-influxdb 0.8.1-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 424 kB
  • sloc: ruby: 3,530; sh: 61; makefile: 7
file content (83 lines) | stat: -rw-r--r-- 2,133 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
module InfluxDB
  # Convert data point to string using Line protocol
  class PointValue
    attr_reader :series, :values, :tags, :timestamp

    def initialize(data)
      @series    = escape data[:series], :measurement
      @values    = escape_values data[:values]
      @tags      = escape_tags data[:tags]
      @timestamp = data[:timestamp]
    end

    def dump
      dump =  @series.dup
      dump << ",#{@tags}" if @tags
      dump << " ".freeze if dump[-1] == "\\"
      dump << " #{@values}"
      dump << " #{@timestamp}" if @timestamp
      dump
    end

    private

    ESCAPES = {
      measurement: [' '.freeze, ','.freeze],
      tag_key:     ['='.freeze, ' '.freeze, ','.freeze],
      tag_value:   ['='.freeze, ' '.freeze, ','.freeze],
      field_key:   ['='.freeze, ' '.freeze, ','.freeze, '"'.freeze],
      field_value: ["\\".freeze, '"'.freeze],
    }.freeze

    private_constant :ESCAPES

    def escape(str, type)
      # rubocop:disable Layout/AlignParameters
      str = str.encode "UTF-8".freeze, "UTF-8".freeze,
        invalid: :replace,
        undef:   :replace,
        replace: "".freeze
      # rubocop:enable Layout/AlignParameters

      ESCAPES[type].each do |ch|
        str = str.gsub(ch) { "\\#{ch}" }
      end
      str
    end

    def escape_values(values)
      if values.nil? || values.empty?
        raise InfluxDB::LineProtocolError, "Cannot create point with empty values".freeze
      end

      values.map do |k, v|
        key = escape(k.to_s, :field_key)
        val = escape_value(v)
        "#{key}=#{val}"
      end.join(",".freeze)
    end

    def escape_value(value)
      if value.is_a?(String)
        '"'.freeze + escape(value, :field_value) + '"'.freeze
      elsif value.is_a?(Integer)
        "#{value}i"
      else
        value.to_s
      end
    end

    def escape_tags(tags)
      return if tags.nil?

      tags = tags.map do |k, v|
        key = escape(k.to_s, :tag_key)
        val = escape(v.to_s, :tag_value)

        "#{key}=#{val}" unless key == "".freeze || val == "".freeze
      end.compact

      tags.join(",") unless tags.empty?
    end
  end
end