class Fluent::Plugin::NodeExporter::CMetricsDataSchemaParser

Public Instance Methods

parse(metrics) click to toggle source
# File lib/fluent/plugin/node_exporter/cmetrics_dataschema_parser.rb, line 23
def parse(metrics)
  data = []
  begin
    metrics.each do |metric|
      next if metric["values"].empty?
      data << to_readable_hash(metric)
    end
  rescue => e
    raise Fluent::Plugin::Parser::ParserError.new(e.message)
  end
  data.flatten
end
to_readable_hash(metrics) click to toggle source

Parsed CMetrics Data Schema Format {

"name" => metrics name
"time" => Fluent::EventTime
"labels" => {"key" => value, ...}
"value" => ...

}

“labels” field is optional. It is available when {“meta”=>“label_dictionary”…} and “labels” in “values” => [{“ts”=>…, “labels”=>}]..

# File lib/fluent/plugin/node_exporter/cmetrics_dataschema_parser.rb, line 47
def to_readable_hash(metrics)
  opts = metrics["meta"]["opts"]

  metric_name = if opts["ss"].size.zero?
                  "#{opts['ns']}_#{opts['name']}"
                else
                  "#{opts['ns']}_#{opts['ss']}_#{opts['name']}"
                end
  cmetrics = []
  labels = []
  unless metrics["meta"]["labels"].empty?
    metrics["meta"]["labels"].each do |v|
      labels << metrics["meta"]["label_dictionary"][v]
    end
  end
  metrics["values"].each do |entry|
    cmetric = {
      "name" => metric_name,
      "value" => entry["value"],
      "desc" => opts["desc"],
      "ts" => entry["ts"]
    }
    unless metrics["meta"]["labels"].empty?
      params = {}
      entry["labels"].each_with_index do |v, index|
        label = labels[index]
        params[label] = metrics["meta"]["label_dictionary"][v]
      end
      cmetric["labels"] = params
    end
    cmetrics << cmetric
  end
  cmetrics
end