Module: LogStash::Util
- Defined in:
- lib/logstash/util.rb,
lib/logstash/util/password.rb,
lib/logstash/util/byte_value.rb,
lib/logstash/util/decorators.rb,
lib/logstash/util/time_value.rb,
lib/logstash/util/thread_dump.rb,
lib/logstash/util/plugin_version.rb,
lib/logstash/util/cloud_setting_id.rb,
lib/logstash/util/cloud_setting_auth.rb,
lib/logstash/util/modules_setting_array.rb,
lib/logstash/util/manticore_ssl_config_helper.rb,
lib/logstash/util/worker_threads_default_printer.rb
Defined Under Namespace
Modules: ByteValue, Decorators, DurationFormatter, FileTools, JavaVersion, ManticoreSSLConfigHelper, SettingsHelper, SocketPeer, SubstitutionVariables, UnicodeTrimmer Classes: Charset, CloudSettingAuth, CloudSettingId, ModulesSettingArray, Password, PluginVersion, SafeURI, ThreadDump, TimeValue, WorkerThreadsDefaultPrinter
Constant Summary collapse
- UNAME =
case RbConfig::CONFIG["host_os"] when /^linux/; "linux" else; RbConfig::CONFIG["host_os"] end
- PR_SET_NAME =
15
Class Method Summary collapse
-
.class_name(instance) ⇒ String
Take a instance reference and return the name of the class stripping all the modules.
- .deep_clone(o) ⇒ Object
-
.hash_merge(dst, src) ⇒ Object
Merge hash ‘src’ into ‘dst’ nondestructively.
-
.hash_merge_many(*hashes) ⇒ Object
def self.hash_merge.
-
.hash_merge_with_dups(dst, src) ⇒ Object
Merge hash ‘src’ into ‘dst’ nondestructively.
-
.normalize(o) ⇒ Object
recursively convert any Java LinkedHashMap and ArrayList to pure Ruby.
- .set_thread_name(name) ⇒ Object
-
.set_thread_plugin(plugin) ⇒ Object
def set_thread_name.
- .stringify_symbols(o) ⇒ Object
- .thread_info(thread) ⇒ Object
Class Method Details
.class_name(instance) ⇒ String
Take a instance reference and return the name of the class stripping all the modules.
184 185 186 |
# File 'lib/logstash/util.rb', line 184 def self.class_name(instance) instance.class.name.split("::").last end |
.deep_clone(o) ⇒ Object
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 |
# File 'lib/logstash/util.rb', line 188 def self.deep_clone(o) case o when Hash o.inject({}) {|h, (k,v)| h[k] = deep_clone(v); h } when Array o.map {|v| deep_clone(v) } when Integer, Symbol, IO, TrueClass, FalseClass, NilClass o when LogStash::Codecs::Base o.clone when String o.clone #need to keep internal state e.g. frozen when LogStash::Timestamp o.clone else Marshal.load(Marshal.dump(o)) end end |
.hash_merge(dst, src) ⇒ Object
Merge hash ‘src’ into ‘dst’ nondestructively
Duplicate keys will become array values
- src, dst[“foo”
-
]
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/logstash/util.rb', line 67 def self.hash_merge(dst, src) src.each do |name, svalue| if dst.include?(name) dvalue = dst[name] if dvalue.is_a?(Hash) && svalue.is_a?(Hash) dvalue = hash_merge(dvalue, svalue) elsif svalue.is_a?(Array) if dvalue.is_a?(Array) # merge arrays without duplicates. dvalue |= svalue else dvalue = [dvalue] | svalue end else if dvalue.is_a?(Array) dvalue << svalue unless dvalue.include?(svalue) else dvalue = [dvalue, svalue] unless dvalue == svalue end end dst[name] = dvalue else # dst doesn't have this key, just set it. dst[name] = svalue end end return dst end |
.hash_merge_many(*hashes) ⇒ Object
def self.hash_merge
135 136 137 138 139 140 141 |
# File 'lib/logstash/util.rb', line 135 def self.hash_merge_many(*hashes) dst = {} hashes.each do |hash| hash_merge_with_dups(dst, hash) end return dst end |
.hash_merge_with_dups(dst, src) ⇒ Object
Merge hash ‘src’ into ‘dst’ nondestructively
Duplicate keys will become array values Arrays merged will simply be appended.
- src, dst[“foo”
-
]
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/logstash/util.rb', line 104 def self.hash_merge_with_dups(dst, src) src.each do |name, svalue| if dst.include?(name) dvalue = dst[name] if dvalue.is_a?(Hash) && svalue.is_a?(Hash) dvalue = hash_merge(dvalue, svalue) elsif svalue.is_a?(Array) if dvalue.is_a?(Array) # merge arrays without duplicates. dvalue += svalue else dvalue = [dvalue] + svalue end else if dvalue.is_a?(Array) dvalue << svalue unless dvalue.include?(svalue) else dvalue = [dvalue, svalue] unless dvalue == svalue end end dst[name] = dvalue else # dst doesn't have this key, just set it. dst[name] = svalue end end return dst end |
.normalize(o) ⇒ Object
recursively convert any Java LinkedHashMap and ArrayList to pure Ruby. will not recurse into pure Ruby objects. Pure Ruby object should never contain LinkedHashMap and ArrayList since these are only created at initial deserialization, anything after (deeper) will be pure Ruby.
155 156 157 158 159 160 161 162 163 164 |
# File 'lib/logstash/util.rb', line 155 def self.normalize(o) case o when Java::JavaUtil::LinkedHashMap o.inject({}){|r, (k, v)| r[k] = normalize(v); r} when Java::JavaUtil::ArrayList o.map{|i| normalize(i)} else o end end |
.set_thread_name(name) ⇒ Object
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/logstash/util.rb', line 11 def self.set_thread_name(name) previous_name = Java::java.lang.Thread.currentThread.getName() if block_given? # Keep java and ruby thread names in sync. Java::java.lang.Thread.currentThread.setName(name) Thread.current[:name] = name if UNAME == "linux" require "logstash/util/prctl" # prctl PR_SET_NAME allows up to 16 bytes for a process name # since MRI 1.9, JRuby, and Rubinius use system threads for this. LibC.prctl(PR_SET_NAME, name[0..16], 0, 0, 0) end if block_given? begin yield ensure set_thread_name(previous_name) end end end |
.set_thread_plugin(plugin) ⇒ Object
def set_thread_name
34 35 36 |
# File 'lib/logstash/util.rb', line 34 def self.set_thread_plugin(plugin) Thread.current[:plugin] = plugin end |
.stringify_symbols(o) ⇒ Object
166 167 168 169 170 171 172 173 174 175 176 177 |
# File 'lib/logstash/util.rb', line 166 def self.stringify_symbols(o) case o when Hash o.inject({}){|r, (k, v)| r[k.is_a?(Symbol) ? k.to_s : k] = stringify_symbols(v); r} when Array o.map{|i| stringify_symbols(i)} when Symbol o.to_s else o end end |
.thread_info(thread) ⇒ Object
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/logstash/util.rb', line 38 def self.thread_info(thread) # When the `thread` is dead, `Thread#backtrace` returns `nil`; fall back to an empty array. backtrace = (thread.backtrace || []).map do |line| line.sub(LogStash::Environment::LOGSTASH_HOME, "[...]") end blocked_on = case backtrace.first when /in `push'/ then "blocked_on_push" when /(?:pipeline|base).*pop/ then "waiting_for_events" else nil end { "thread_id" => get_thread_id(thread), # might be nil for dead threads "name" => thread[:name], "plugin" => (thread[:plugin] ? thread[:plugin].debug_info : nil), "backtrace" => backtrace, "blocked_on" => blocked_on, "status" => thread.status, "current_call" => backtrace.first } end |