Skip to content

Instantly share code, notes, and snippets.

@jacoyutorius
Last active February 25, 2017 07:01
Show Gist options
  • Select an option

  • Save jacoyutorius/f71f1ec420fca478b792be254afc5b09 to your computer and use it in GitHub Desktop.

Select an option

Save jacoyutorius/f71f1ec420fca478b792be254afc5b09 to your computer and use it in GitHub Desktop.
td-agentのin_execプラグインで読み取るためにuptimeをrubyで出力
module Monitoring
module Command
class Uptime
def exec
parsed = parse_uptime
# only over v2.4
# puts parsed.named_captures.to_json
# ~v2.3
ret = {}
parsed.names.each{|name| ret[name] = parsed[name]}
# uptimeでは時間しか取得できないので日付も含めた値をセットする
ret["time"] = now
ret
rescue => ex
puts ex
end
private
def uptime
`uptime`.chomp
end
def uname
`uname`.chomp
end
def now
Time.now
end
def parse_uptime
if uname === "Darwin"
# for Mac
mac_regexp.match(uptime)
else
# for Linux
linux_regexp.match(uptime)
end
end
def mac_regexp
/(?<users>\d*)\susers,\sload averages: (?<loadaverage_per_1_minutes>\d{1,}.\d{2})\s(?<loadaverage_per_5_minutes>\d{1,}.\d{2})\s(?<loadaverage_per_15_minutes>\d{1,}.\d{2})/
end
def linux_regexp
/(?<users>\d*)\s(user|users),\s*load average: (?<loadaverage_per_1_minutes>\d{1,}.\d{2}),\s(?<loadaverage_per_5_minutes>\d{1,}.\d{2}),\s(?<loadaverage_per_15_minutes>\d{1,}.\d{2})/
end
end
end
end
if $0 == __FILE__
require "json"
uptime = Monitoring::Command::Uptime.new().exec
puts uptime.to_json
end
require "test/unit"
require "./uptime"
require "json"
require "pp"
class UptimeTest < Test::Unit::TestCase
def test_exec_darwin_1
command = Monitoring::Command::Uptime.new
command.define_singleton_method(:uname) do
"Darwin"
end
command.define_singleton_method(:uptime) do
" 8:02 up 3 days, 22:46, 4 users, load averages: 3.09 2.85 2.80"
end
ret = command.exec
assert_equal "4", ret["users"]
assert_equal "3.09", ret["loadaverage_per_1_minutes"]
assert_equal "2.85", ret["loadaverage_per_5_minutes"]
assert_equal "2.80", ret["loadaverage_per_15_minutes"]
end
def test_exec_linux_1
command = Monitoring::Command::Uptime.new
command.define_singleton_method(:uname) do
"Linux"
end
command.define_singleton_method(:uptime) do
" 22:44:59 up 7:18, 2 users, load average: 0.57, 0.30, 0.17"
end
ret = command.exec
assert_equal "2", ret["users"]
assert_equal "0.57", ret["loadaverage_per_1_minutes"]
assert_equal "0.30", ret["loadaverage_per_5_minutes"]
assert_equal "0.17", ret["loadaverage_per_15_minutes"]
end
def test_exec_linux_2
command = Monitoring::Command::Uptime.new
command.define_singleton_method(:uname) do
"Linux"
end
command.define_singleton_method(:uptime) do
" 05:50:13 up 28 min, 2 users, load average: 1.34, 1.46, 1.12"
end
ret = command.exec
assert_equal "2", ret["users"]
assert_equal "1.34", ret["loadaverage_per_1_minutes"]
assert_equal "1.46", ret["loadaverage_per_5_minutes"]
assert_equal "1.12", ret["loadaverage_per_15_minutes"]
end
def test_exec_linux_3
command = Monitoring::Command::Uptime.new
command.define_singleton_method(:uname) do
"Linux"
end
command.define_singleton_method(:uptime) do
" 11:02:16 up 68 days, 14:21, 1 user, load average: 0.02, 0.02, 0.00"
end
ret = command.exec
assert_equal "1", ret["users"]
assert_equal "0.02", ret["loadaverage_per_1_minutes"]
assert_equal "0.02", ret["loadaverage_per_5_minutes"]
assert_equal "0.00", ret["loadaverage_per_15_minutes"]
end
end
@jacoyutorius
Copy link
Author

uptime.rbではloadaverageの値がStringとなってしまうので、templateを作成してfloatに変更する必要がある.

tempalte-uptime-*

{
  "template": "uptime-*",
  "mappings": {
     "uptime":{
      "properties":{
        "loadaverage_per_1_minutes":{
          "type":"float"
        },
        "loadaverage_per_5_minutes":{
          "type":"float"
        },
        "loadaverage_per_15_minutes":{
          "type":"float"
        }
      }
    }
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment