class Fluent::CloudWatchYaOutput

Constants

METRIC_DATA_MAX_NUM

Public Instance Methods

configure(conf) click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_cloudwatch_ya.rb, line 14
def configure(conf)
    super
    instance_id = Net::HTTP.get('169.254.169.254', '/1.0/meta-data/instance-id')
    @metric_list = []
    conf.elements.select {|element|
        element.name == 'metric'
    }.each do |metric|
        dimensions_list = []
        if not metric['outcast_no_dimension_metric'] == 'yes' then
            dimensions_list << []
        end
        metric.elements.select {|element|
            element.name == 'dimensions'
        }.each do |dimensions|
            dimension_list = []
            dimensions.each do |dimension, value|
                if    dimension.start_with?("dimension") then
                    name_and_value = value.split("=")
                    dimension_list << { 'name' => name_and_value[0], 'value' => name_and_value[1] }
                elsif dimension == 'instance_id' and value == 'yes' then
                    dimension_list << { 'name' => 'InstanceId', 'value' => instance_id }
                elsif dimension == 'fluent_tag' and value == 'yes' then
                    dimension_list << { 'name' => 'FluentTag', 'value' => nil }
                end
            end
            dimensions_list << dimension_list
        end
        @metric_list << {
            'metric_name'     => metric['metric_name'],
            'value_key'       => metric['value_key'],
            'unit'            => metric['unit'],
            'dimensions_list' => dimensions_list
        }
    end
    $log.debug(@metric_list.inspect)
end
format(tag, time, record) click to toggle source
# File lib/fluent/plugin/out_cloudwatch_ya.rb, line 51
def format(tag, time, record)
    record["tag"]       =  tag
    record["timestamp"] =  Time.at(time).iso8601
    record.to_msgpack
end
write(chunk) click to toggle source
# File lib/fluent/plugin/out_cloudwatch_ya.rb, line 57
def write(chunk)
    metric_data = []
    chunk.msgpack_each do |record|
        @metric_list.each do |metric|
            value = JsonPath.new(metric['value_key']).first(record)
            if not value.nil? then
                metric['dimensions_list'].each do |dimensions|
                    dimensions.each do |dimension_list|
                        if dimension_list['name'] == 'FluentTag' then
                            dimension_list['value'] = record['tag'];
                        end
                    end
                    metric_data << {
                        :metric_name => metric['metric_name'],
                        :timestamp   => record['timestamp'],
                        :value       => value,
                        :unit        => metric['unit'],
                        :dimensions  => dimensions
                    }
                end
            end
        end
    end
    AWS.config(
        :access_key_id        => @aws_key_id,
        :secret_access_key    => @aws_sec_key,
        :cloud_watch_endpoint => @cloud_watch_endpoint
    )
    cloud_watch = AWS::CloudWatch.new
    until metric_data.length <= 0 do
        $log.debug(metric_data.slice(0, METRIC_DATA_MAX_NUM).inspect)
        cloud_watch.put_metric_data(
            :namespace   => @namespace,
            :metric_data => metric_data.slice!(0, METRIC_DATA_MAX_NUM)
        )
    end
end