class Fluent::AliyunSlsOutput

Public Class Methods

new() click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_aliyun_sls.rb, line 17
def initialize
    super
    require "aliyun_sls_sdk/protobuf"
    require "aliyun_sls_sdk"
end

Public Instance Methods

client() click to toggle source
# File lib/fluent/plugin/out_aliyun_sls.rb, line 40
def client
    @_sls_con ||= AliyunSlsSdk::LogClient.new(@region_endpoint, @access_key_id, @access_key_secret, @ssl_verify)
end
configure(conf) click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_aliyun_sls.rb, line 23
def configure(conf)
    super
end
createLogStore(logstore_name) click to toggle source
# File lib/fluent/plugin/out_aliyun_sls.rb, line 44
def createLogStore(logstore_name)
    retries = 2
    begin
        createLogStoreResp = client.create_logstore(@project, logstore_name, @create_logstore_ttl, @create_logstore_shard_count)
    rescue AliyunSlsSdk::LogException => e
        if e.errorCode == "LogStoreAlreadyExist"
            log.warn "logstore #{logstore_name} already exist"
        else
            raise
        end
    rescue => e
        if retries > 0
            log.warn "Error caught when creating logs store: #{e}"
            retries -= 1
            retry
        end
    end
end
format(tag, time, record) click to toggle source
# File lib/fluent/plugin/out_aliyun_sls.rb, line 36
def format(tag, time, record)
    [tag, time, record].to_msgpack
end
getLogItem(record) click to toggle source
# File lib/fluent/plugin/out_aliyun_sls.rb, line 63
def getLogItem(record)
    contents = {}
    record.each { |k, v|
        contents[k] = v
    }
    AliyunSlsSdk::LogItem.new(nil, contents)
end
shutdown() click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_aliyun_sls.rb, line 32
def shutdown
    super
end
start() click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_aliyun_sls.rb, line 28
def start
    super
end
write(chunk) click to toggle source
# File lib/fluent/plugin/out_aliyun_sls.rb, line 71
def write(chunk)
    log_itemlist = []
    chunk.each do |tag, time, record|
        log_itemlist << getLogItem(record)
    end

    log_itemlist.each_slice(4096) do |items|
        putLogRequest = AliyunSlsSdk::PutLogsRequest.new(@project, @logstore, nil, nil, items, nil, true)
        retries = 0
        begin
            client.put_logs(putLogRequest)
        rescue  => e
            if e.instance_of?(AliyunSlsSdk::LogException) && e.errorCode == "LogStoreNotExist" && @need_create_logstore
                createLogStore(@logstore)
                # wait up to 60 seconds to create the logstore
                if retries < 3
                    retries += 1
                    sleep(10 * retries)
                    retry
                end
            else
                log.warn "\tCaught in puts logs: #{e.message}"
                if retries < 3
                    client.http.shutdown
                    @_sls_con = nil
                    retries += 1
                    sleep(1 * retries)
                    retry
                end
                log.error "Could not puts logs to aliyun sls: #{e.message}"
            end
        end
    end
end