class SoracomSummary::CLI

Public Class Methods

run(argv) click to toggle source
# File lib/soracom_summary/cli.rb, line 7
def run(argv)
  # ソラコム内では時間はUTCで表現されるため、タイムゾーンをUTCにしておく
  ENV['TZ'] = 'UTC'
  parse!(argv)
end

Private Class Methods

create_parser(options) click to toggle source
# File lib/soracom_summary/cli.rb, line 50
def create_parser(options)
  OptionParser.new do |opt|
    opt.on_head('-v', '--version', 'display version') do
      puts "soracom_summary #{VERSION}"
      exit
    end 
    opt.on('--from from_date', 'set from_date to scrape(default: today)') { |v| options['from'] = v }
    opt.on('--to to_date', 'set to_date to scrape(default: today)') { |v| options['to'] = v }
    opt.on('--tag category_tag', 'select tag to categorize(default: nil)') { |v| options['category_tag'] = v }
    opt.on('--session', 'enable session analyze(default: false)') { |v| options['session'] = v }
  end 
end
get_summary(subscribers, billings, traffics, logs, time) click to toggle source
# File lib/soracom_summary/cli.rb, line 113
def get_summary(subscribers, billings, traffics, logs, time)
  subscribers_summary = Subscriber.summary(subscribers, time, @category_tag, @session_analyze_enable)
  billings_summary = Billing.summary(billings, time)
  traffics_summary = Traffic.summary(traffics, time)
  logs_summary = summary_log(logs, time)
  
  result = subscribers_summary
    .merge(billings_summary)
    .merge(traffics_summary)
    .merge(logs_summary)
  result
end
get_target_months(from, to) click to toggle source
# File lib/soracom_summary/cli.rb, line 126
def get_target_months(from, to)
  target_months = []
  time = from
  loop do
    target_months.push(time.strftime('%Y%m'))
    time += Const::ONE_DAY_SEC
    break if time >= to
  end
  target_months.uniq
end
parse!(argv) click to toggle source
# File lib/soracom_summary/cli.rb, line 15
def parse!(argv)
  options = {}
  parser = create_parser(options)
  parser.order!(argv)

  if options.key?('from')
    @from = Time.parse(options['from'])
  else
    @from = Date.today.to_time - Const::ONE_DAY_SEC
  end

  if options.key?('to')
    @to = Time.parse(options['to']) + Const::ONE_DAY_SEC
  else
    @to = Date.today.to_time
  end

  if @from >= @to
    raise ArgumentError, 'from must be less or equal to'
  end
  
  # 分類に使用するタグの設定
  if options.key?('category_tag')
    @category_tag = options['category_tag']
  end

  # セッション分析を実施するか
  # 取得に時間を要するためオプションとする
  if options.key?('session')
    @session_analyze_enable = options['session']
  end

  scrape
end
scrape() click to toggle source
# File lib/soracom_summary/cli.rb, line 63
def scrape
  raise ArgumentError, 'need SORACOM_AUTH_KEY_ID environment' unless ENV.key?('SORACOM_AUTH_KEY_ID')
  raise ArgumentError, 'need SORACOM_AUTH_KEY environment' unless ENV.key?('SORACOM_AUTH_KEY')
  raise ArgumentError, 'need SORACOM_SUMMARY_DEVICE_ID environment' unless ENV.key?('SORACOM_SUMMARY_DEVICE_ID')
  raise ArgumentError, 'need SORACOM_SUMMARY_DEVICE_SECRET environment' unless ENV.key?('SORACOM_SUMMARY_DEVICE_SECRET')

  client = SoracomSummary::ApiClient.new(
    auth_key_id: ENV['SORACOM_AUTH_KEY_ID'],
    auth_key: ENV['SORACOM_AUTH_KEY'])

  subscribers = client.get_subscribers

  # セッション分析を実行する場合
  if @session_analyze_enable == true
    subscribers.each do |subscriber|
      sessions = client.get_sessions(subscriber.imsi, @from, @to )
      subscriber.sessions = sessions
    end
  end

  target_months = get_target_months(@from, @to)
  billings = client.get_billing(target_months)
  traffics = client.get_traffic(target_months)
  logs = client.get_logs(@from, @to)
  
  time = @from
  loop do
    summary = get_summary(subscribers, billings, traffics, logs, time)
    client.upload_harvest(ENV['SORACOM_SUMMARY_DEVICE_ID'], ENV['SORACOM_SUMMARY_DEVICE_SECRET'], time, summary)

    if @session_analyze_enable == true && ENV.key?('SORACOM_SESSION_DEVICE_ID') && ENV.key?('SORACOM_SESSION_DEVICE_SECRET')
      sessions_count_by_imsi = Subscriber.sessions_count_by_imsi(subscribers, time)
      client.upload_harvest(ENV['SORACOM_SESSION_DEVICE_ID'], ENV['SORACOM_SESSION_DEVICE_SECRET'], time, sessions_count_by_imsi)
    end

    if ENV.key?('SORACOM_BILLING_DEVICE_ID') && ENV.key?('SORACOM_BILLING_DEVICE_SECRET')
      billing_by_origin = Billing.group_by_origin(billings, time)
      client.upload_harvest(ENV['SORACOM_BILLING_DEVICE_ID'], ENV['SORACOM_BILLING_DEVICE_SECRET'], time, billing_by_origin)
    end

    if ENV.key?('SORACOM_TRAFFIC_DEVICE_ID') && ENV.key?('SORACOM_TRAFFIC_DEVICE_SECRET')
      traffic_by_imsi = Traffic.group_by_imsi(traffics, time)
      client.upload_harvest(ENV['SORACOM_TRAFFIC_DEVICE_ID'], ENV['SORACOM_TRAFFIC_DEVICE_SECRET'], time, traffic_by_imsi)
    end

    time += Const::ONE_DAY_SEC
    break if time >= @to
  end
end
summary_log(logs, time) click to toggle source
# File lib/soracom_summary/cli.rb, line 137
def summary_log(logs, time)
  target_logs = logs.select do |log|
    log['time'] >= time.to_i * 1000 && log['time'] < time.to_i * 1000 + Const::ONE_DAY_MSEC
  end
  { 'error-log-count' => target_logs.length }
end