Sha256: e0aa06a8143a58ec2a35ba609b7727b67352d920c47b2377b11fbac5cca13e61

Contents?: true

Size: 1.93 KB

Versions: 352

Compression:

Stored size: 1.93 KB

Contents

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 << " #{@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)
      return if values.nil?
      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

Version data entries

352 entries across 352 versions & 2 rubygems

Version Path
zuora_connect-3.2.11 lib/metrics/influx/point_value.rb
zuora_connect-3.2.10 lib/metrics/influx/point_value.rb
zuora_connect-3.2.9 lib/metrics/influx/point_value.rb
zuora_connect-3.2.8 lib/metrics/influx/point_value.rb
zuora_connect-3.2.7 lib/metrics/influx/point_value.rb
zuora_connect-3.2.6 lib/metrics/influx/point_value.rb
zuora_connect-3.2.5 lib/metrics/influx/point_value.rb
zuora_connect-3.2.4 lib/metrics/influx/point_value.rb
zuora_connect-3.2.3 lib/metrics/influx/point_value.rb
zuora_connect-3.2.2 lib/metrics/influx/point_value.rb
zuora_connect-3.2.0 lib/metrics/influx/point_value.rb
zuora_connect-3.1.5.pre.g lib/metrics/influx/point_value.rb
zuora_connect-3.1.5.pre.f lib/metrics/influx/point_value.rb
zuora_connect-3.1.5.pre.e lib/metrics/influx/point_value.rb
zuora_connect-3.1.5.pre.d lib/metrics/influx/point_value.rb
zuora_connect-3.1.5.pre.c lib/metrics/influx/point_value.rb
zuora_connect-3.1.5.pre.b lib/metrics/influx/point_value.rb
zuora_connect-3.1.5.pre.a lib/metrics/influx/point_value.rb
zuora_connect-3.1.5 lib/metrics/influx/point_value.rb
zuora_connect-3.1.4 lib/metrics/influx/point_value.rb