Sha256: d06e2d1fcef39acbde3240d42f19c1ad85d5d5c0e0db1ea502e7d53f0927badf

Contents?: true

Size: 1.7 KB

Versions: 1

Compression:

Stored size: 1.7 KB

Contents

# encoding: utf-8
require "logstash/codecs/base"
require "logstash/codecs/line"
require 'json'

class LogStash::Codecs::Prometheus < LogStash::Codecs::Base
  config_name "prometheus"

  # create individual events for each metric
  config :multi_event, :validate => :boolean, :default => false

  public
  def register
    @lines = LogStash::Codecs::Line.new
  end

  public
  def decode(data)
    events = []
    @lines.decode(data) do |event|
      unless event.get("message").start_with?("#")
        metric_name, metric_value = event.get("message").split(" ")
        unless metric_name.match(/^.+{.+}$/)
          events << {metric_name => metric_value.to_f}
        else
          outside, inside = metric_name.match(/^(.+){(.+)}$/).captures
          vars = inside.split(",")
          labels = {}
          keys = []
          vars.each do |var|
            key, value = var.split("=")
            keys << key.downcase
            labels[key.downcase] = value.gsub!(/^\"|\"?$/, "")
          end
          custom_metric_name = keys.unshift(outside.downcase).join('_')
          events << {custom_metric_name => {outside.downcase => metric_value.to_f, "labels" => labels}}
        end
      end
    end
    unless events.empty?
      if @multi_event
        events.each do |event|
          yield LogStash::Event.new(event)
        end
      else
        hash = {}
        events.each do |event|
          event.to_h.each do |metric_name, metric_value|
            hash[metric_name] = metric_value
          end
        end
        yield LogStash::Event.new(hash)
      end
    end
  end

  public
  def encode(event)
    @on_event.call(event, event.to_json)
  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
logstash-codec-prometheus-0.4.0 lib/logstash/codecs/prometheus.rb