JAVAFICATION: Port Loggable Module to Java

Fixes #9587
This commit is contained in:
Armin 2018-05-16 11:57:08 +02:00 committed by Armin Braun
parent bd8f80eb70
commit c0abde28a6
44 changed files with 134 additions and 95 deletions

View file

@ -1,6 +1,5 @@
# encoding: utf-8
require "logstash/instrument/collector"
require "logstash/util/loggable"
module LogStash
module Api

View file

@ -1,5 +1,4 @@
# encoding: utf-8
require "logstash/logging"
module LogStash module BootstrapCheck
class DefaultConfig

View file

@ -1,7 +1,6 @@
# encoding: utf-8
require "logstash/event"
require "logstash/plugin"
require "logstash/logging"
# This is the base class for logstash codecs.
module LogStash::Codecs; class Base < LogStash::Plugin

View file

@ -1,4 +1,3 @@
require 'logstash/util/loggable'
require 'logstash/compiler/lscl/lscl_grammar'
java_import org.logstash.config.ir.PipelineIR
@ -15,10 +14,10 @@ module LogStash; class Compiler
input_graph = Graph.combine(*graph_sections.map {|s| s[:input] }).graph
output_graph = Graph.combine(*graph_sections.map {|s| s[:output] }).graph
filter_graph = graph_sections.reduce(nil) do |acc, s|
filter_graph = graph_sections.reduce(nil) do |acc, s|
filter_section = s[:filter]
if acc.nil?
if acc.nil?
filter_section
else
acc.chain(filter_section)

View file

@ -1,6 +1,5 @@
# encoding: utf-8
require "logstash/plugins/registry"
require "logstash/logging"
require "logstash/util/password"
require "logstash/util/safe_uri"
require "logstash/version"

View file

@ -1,5 +1,4 @@
# encoding: utf-8
require "logstash/util/loggable"
require "logstash/elasticsearch_client"
require "logstash/modules/kibana_client"
require "logstash/modules/elasticsearch_importer"

View file

@ -1,7 +1,6 @@
# encoding: utf-8
require "logstash/config/source/base"
require "logstash/config/pipeline_config"
require "logstash/util/loggable"
require "uri"
module LogStash module Config module Source

View file

@ -2,7 +2,6 @@
require "logstash/config/source/base"
require "logstash/config/modules_common"
require "logstash/config/pipeline_config"
require "logstash/util/loggable"
module LogStash module Config module Source
class Modules < Base

View file

@ -1,6 +1,5 @@
# encoding: utf-8
require "logstash/config/source/local"
require "logstash/util/loggable"
require "logstash/pipeline_settings"
module LogStash module Config module Source

View file

@ -1,5 +1,4 @@
# encoding: utf-8
require "logstash/logging"
require "elasticsearch"
require "elasticsearch/transport/transport/http/manticore"

View file

@ -1,6 +1,5 @@
# encoding: utf-8
require "logstash/event"
require "logstash/logging"
require "logstash/plugin"
require "logstash/config/mixin"
require "logstash/util/decorators"

View file

@ -1,7 +1,6 @@
# encoding: utf-8
require "logstash/event"
require "logstash/plugin"
require "logstash/logging"
require "logstash/config/mixin"
require "logstash/codecs/base"
require "logstash/util/decorators"

View file

@ -1,7 +1,6 @@
# encoding: utf-8
require "logstash/instrument/snapshot"
require "logstash/instrument/metric_store"
require "logstash/util/loggable"
require "concurrent/timer_task"
require "observer"
require "singleton"

View file

@ -1,5 +1,4 @@
# encoding: utf-8
require "logstash/util/loggable"
require "logstash/util"
require "concurrent"

View file

@ -1,6 +1,5 @@
# encoding: utf-8
require "pathname"
require "logstash/util/loggable"
# Logic from elasticsearch/core/src/main/java/org/elasticsearch/monitor/os/OsProbe.java
# Move to ruby to remove any existing dependency

View file

@ -1,5 +1,4 @@
# encoding: utf-8
require "logstash/util/loggable"
module LogStash module Instrument
class Snapshot

View file

@ -1,6 +1,4 @@
# encoding: utf-8
require "logstash/logging"
module LogStash module Modules class CLIParser
include LogStash::Util::Loggable

View file

@ -1,6 +1,4 @@
# encoding: utf-8
require "logstash/logging"
require_relative "elasticsearch_resource"
module LogStash module Modules class ElasticsearchConfig

View file

@ -1,6 +1,4 @@
# encoding: utf-8
require "logstash/logging"
module LogStash module Modules class ElasticsearchImporter
include LogStash::Util::Loggable

View file

@ -1,5 +1,4 @@
# encoding: utf-8
require "logstash/logging"
require "logstash/json"
module LogStash module Modules class FileReader

View file

@ -1,5 +1,4 @@
# encoding: utf-8
require "logstash/logging"
require "logstash/json"
require "manticore"

View file

@ -1,6 +1,4 @@
# encoding: utf-8
require "logstash/logging"
require_relative "file_reader"
require_relative "kibana_settings"
require_relative "kibana_dashboards"

View file

@ -1,5 +1,4 @@
# encoding: utf-8
require "logstash/logging"
require_relative "kibana_base"
module LogStash module Modules class KibanaDashboards < KibanaBase

View file

@ -1,6 +1,4 @@
# encoding: utf-8
require "logstash/logging"
module LogStash module Modules class KibanaImporter
include LogStash::Util::Loggable

View file

@ -1,5 +1,4 @@
# encoding: utf-8
require "logstash/logging"
require_relative "kibana_base"
module LogStash module Modules class KibanaSettings < KibanaBase

View file

@ -1,6 +1,4 @@
# encoding: utf-8
require "logstash/logging"
require "logstash/util/loggable"
require "erb"
require_relative "elasticsearch_config"

View file

@ -1,6 +1,5 @@
# encoding: utf-8
require "logstash/util"
require "logstash/util/loggable"
module LogStash module Modules module SettingsMerger
include LogStash::Util::Loggable

View file

@ -1,6 +1,5 @@
# encoding: utf-8
require "logstash/event"
require "logstash/logging"
require "logstash/plugin"
require "logstash/config/mixin"
require "concurrent/atomic/atomic_fixnum"

View file

@ -3,7 +3,6 @@ require "logstash/pipeline_action/base"
require "logstash/pipeline"
require "logstash/java_pipeline"
require "logstash/converge_result"
require "logstash/util/loggable"
module LogStash module PipelineAction
class Create < Base

View file

@ -2,7 +2,6 @@
require "logstash/pipeline_action/base"
require "logstash/pipeline_action/create"
require "logstash/pipeline_action/stop"
require "logstash/util/loggable"
require "logstash/converge_result"
module LogStash module PipelineAction

View file

@ -1,5 +1,4 @@
# encoding: utf-8
require "logstash/logging"
require "logstash/config/mixin"
require "concurrent"
require "securerandom"

View file

@ -1,6 +1,5 @@
# encoding: utf-8
require "rubygems/package"
require "logstash/util/loggable"
require "logstash/plugin"
require "logstash/plugins/hooks_registry"
require "logstash/modules/scaffold"

View file

@ -1,5 +1,4 @@
# encoding: utf-8
require "logstash/util/loggable"
require "fileutils"
require "logstash/util/byte_value"
require "logstash/util/substitution_variables"
@ -10,7 +9,7 @@ module LogStash
include LogStash::Util::SubstitutionVariables
include LogStash::Util::Loggable
def initialize
@settings = {}
# Theses settings were loaded from the yaml file
@ -119,7 +118,7 @@ module LogStash
self.merge(deep_replace(flatten_hash(settings)), true)
self
end
def post_process
if @post_process_callbacks
@post_process_callbacks.each do |callback|
@ -127,7 +126,7 @@ module LogStash
end
end
end
def on_post_process(&block)
@post_process_callbacks ||= []
@post_process_callbacks << block
@ -439,7 +438,7 @@ module LogStash
def initialize(name, default=nil, strict=false)
super(name, ::String, default, strict)
end
def validate(path)
super(path)

View file

@ -1,30 +1 @@
# encoding: utf-8
require "logstash/logging/logger"
module LogStash module Util
module Loggable
def self.included(klass)
def klass.log4j_name
ruby_name = self.name || self.class.name || self.class.to_s
ruby_name.gsub('::', '.').downcase
end
def klass.logger
@logger ||= LogStash::Logging::Logger.new(log4j_name)
end
def klass.slow_logger(warn_threshold, info_threshold, debug_threshold, trace_threshold)
@slow_logger ||= LogStash::Logging::SlowLogger.new(log4j_name, warn_threshold, info_threshold, debug_threshold, trace_threshold)
end
def logger
self.class.logger
end
def slow_logger(warn_threshold, info_threshold, debug_threshold, trace_threshold)
self.class.slow_logger(warn_threshold, info_threshold, debug_threshold, trace_threshold)
end
end
end
end; end
# Keeping this file for backwards compatibility with plugins that include it directly.

View file

@ -1,6 +1,4 @@
# encoding: utf-8
require "logstash/logging"
require "logstash/util/loggable"
require "logstash/util/secretstore"
module ::LogStash::Util::SubstitutionVariables

View file

@ -7,7 +7,7 @@ describe LogStash::Config::Mixin do
let(:password) { "sekret" }
let(:double_logger) { double("logger").as_null_object }
subject do
subject do
Class.new(LogStash::Filters::Base) do
include LogStash::Config::Mixin
config_name "test_deprecated"
@ -151,7 +151,7 @@ describe LogStash::Config::Mixin do
it "should raise a configuration error" do
expect { subject.required_strings }.to raise_error(LogStash::ConfigurationError)
end
end
end
context "with no value specified" do
@ -160,7 +160,7 @@ describe LogStash::Config::Mixin do
it "should raise a configuration error" do
expect { subject.required_strings }.to raise_error(LogStash::ConfigurationError)
end
end
end
end
end
@ -208,7 +208,7 @@ describe LogStash::Config::Mixin do
shared_examples("safe URI") do |options|
options ||= {}
subject { klass.new("uri" => uri_str) }
it "should be a SafeURI object" do

View file

@ -1,5 +1,4 @@
require "spec_helper"
require "logstash/logging"
require "logstash/modules/cli_parser"
describe LogStash::Modules::CLIParser do

View file

@ -370,7 +370,7 @@ describe LogStash::Pipeline do
after do
pipeline.shutdown
end
it "should call close of output without output-workers" do
pipeline.run
@ -395,7 +395,7 @@ describe LogStash::Pipeline do
# cause the suite to fail :(
pipeline.close
end
it "should use LIR provided IDs" do
expect(pipeline.inputs.first.id).to eq(pipeline.lir.input_plugin_vertices.first.id)
expect(pipeline.filters.first.id).to eq(pipeline.lir.filter_plugin_vertices.first.id)

View file

@ -33,6 +33,7 @@ import org.logstash.instrument.metrics.MetricExt;
import org.logstash.instrument.metrics.NamespacedMetricExt;
import org.logstash.instrument.metrics.NullMetricExt;
import org.logstash.instrument.metrics.NullNamespacedMetricExt;
import org.logstash.log.LoggableExt;
import org.logstash.log.LoggerExt;
import org.logstash.log.SlowLoggerExt;
import org.logstash.plugins.PluginFactoryExt;
@ -139,8 +140,12 @@ public final class RubyUtil {
public static final RubyClass LOGGER;
public static final RubyModule LOGGABLE_MODULE;
public static final RubyClass SLOW_LOGGER;
public static final RubyModule UTIL_MODULE;
/**
* Logstash Ruby Module.
*/
@ -229,20 +234,20 @@ public final class RubyUtil {
TIMED_EXECUTION_CLASS.defineAnnotatedMethods(MetricExt.TimedExecution.class);
NULL_TIMED_EXECUTION_CLASS.defineAnnotatedMethods(NullMetricExt.NullTimedExecution.class);
NULL_COUNTER_CLASS.defineAnnotatedMethods(NullNamespacedMetricExt.NullCounter.class);
final RubyModule util = LOGSTASH_MODULE.defineModuleUnder("Util");
ABSTRACT_DLQ_WRITER_CLASS = util.defineClassUnder(
UTIL_MODULE = LOGSTASH_MODULE.defineModuleUnder("Util");
ABSTRACT_DLQ_WRITER_CLASS = UTIL_MODULE.defineClassUnder(
"AbstractDeadLetterQueueWriterExt", RUBY.getObject(),
ObjectAllocator.NOT_ALLOCATABLE_ALLOCATOR
);
ABSTRACT_DLQ_WRITER_CLASS.defineAnnotatedMethods(AbstractDeadLetterQueueWriterExt.class);
DUMMY_DLQ_WRITER_CLASS = util.defineClassUnder(
DUMMY_DLQ_WRITER_CLASS = UTIL_MODULE.defineClassUnder(
"DummyDeadLetterQueueWriter", ABSTRACT_DLQ_WRITER_CLASS,
AbstractDeadLetterQueueWriterExt.DummyDeadLetterQueueWriterExt::new
);
DUMMY_DLQ_WRITER_CLASS.defineAnnotatedMethods(
AbstractDeadLetterQueueWriterExt.DummyDeadLetterQueueWriterExt.class
);
PLUGIN_DLQ_WRITER_CLASS = util.defineClassUnder(
PLUGIN_DLQ_WRITER_CLASS = UTIL_MODULE.defineClassUnder(
"PluginDeadLetterQueueWriter", ABSTRACT_DLQ_WRITER_CLASS,
AbstractDeadLetterQueueWriterExt.PluginDeadLetterQueueWriterExt::new
);
@ -329,14 +334,14 @@ public final class RubyUtil {
FILTER_DELEGATOR_CLASS = setupLogstashClass(
FilterDelegatorExt::new, FilterDelegatorExt.class
);
final RubyModule loggingModule = LOGSTASH_MODULE.defineOrGetModuleUnder("Logging");
LOGGER = loggingModule.defineClassUnder("Logger", RUBY.getObject(), LoggerExt::new);
LOGGER.defineAnnotatedMethods(LoggerExt.class);
SLOW_LOGGER = loggingModule.defineClassUnder(
"SlowLogger", RUBY.getObject(), SlowLoggerExt::new);
SLOW_LOGGER.defineAnnotatedMethods(SlowLoggerExt.class);
LOGGABLE_MODULE = UTIL_MODULE.defineModuleUnder("Loggable");
LOGGABLE_MODULE.defineAnnotatedMethods(LoggableExt.class);
final RubyModule json = LOGSTASH_MODULE.defineOrGetModuleUnder("Json");
final RubyClass stdErr = RUBY.getStandardError();
LOGSTASH_ERROR = LOGSTASH_MODULE.defineClassUnder(

View file

@ -45,7 +45,7 @@ public final class FilterDelegatorExt extends RubyObject {
public IRubyObject init(final ThreadContext context, final IRubyObject filter, final IRubyObject id) {
this.id = (RubyString) id;
this.filter = filter;
this.filterClass = filter.getMetaClass();
this.filterClass = filter.getSingletonClass().getRealClass();
final IRubyObject namespacedMetric = filter.callMethod(context, "metric");
metricEvents = namespacedMetric.callMethod(context, "namespace", RubyUtil.RUBY.newSymbol("events"));
eventMetricOut = LongCounter.fromRubyBase(metricEvents, MetricKeys.OUT_KEY);

View file

@ -0,0 +1,107 @@
package org.logstash.log;
import org.jruby.RubyClass;
import org.jruby.RubyModule;
import org.jruby.RubyString;
import org.jruby.anno.JRubyMethod;
import org.jruby.anno.JRubyModule;
import org.jruby.runtime.Block;
import org.jruby.runtime.ThreadContext;
import org.jruby.runtime.builtin.IRubyObject;
import org.jruby.runtime.builtin.InstanceVariables;
import org.logstash.RubyUtil;
@JRubyModule(name = "Loggable")
public final class LoggableExt {
private LoggableExt() {
// Ruby Module
}
@JRubyMethod(module = true)
public static RubyModule included(final ThreadContext context, final IRubyObject recv,
final IRubyObject clazz) {
final RubyModule klass = (RubyModule) clazz;
klass.defineAnnotatedMethods(LoggableExt.ClassMethods.class);
return klass;
}
@JRubyMethod
public static IRubyObject logger(final ThreadContext context, final IRubyObject self) {
return self.getSingletonClass().callMethod(context, "logger");
}
@JRubyMethod(name = "slow_logger", required = 4)
public static IRubyObject slowLogger(final ThreadContext context, final IRubyObject self,
final IRubyObject[] args) {
return self.getSingletonClass().callMethod(context, "slow_logger", args);
}
private static RubyString log4jName(final ThreadContext context, final RubyModule self) {
IRubyObject name = self.name19();
if (name.isNil()) {
final RubyClass clazz;
if(self instanceof RubyClass) {
clazz = ((RubyClass) self).getRealClass();
} else {
clazz = self.getMetaClass();
}
name = clazz.name19();
if (name.isNil()) {
name = clazz.to_s();
}
}
return ((RubyString) ((RubyString) name).gsub(
context, RubyUtil.RUBY.newString("::"), RubyUtil.RUBY.newString("."),
Block.NULL_BLOCK
)).downcase19(context);
}
/**
* Holds the {@link JRubyMethod}s class methods that the {@link LoggableExt} module binds
* on classes that include it (and hence invoke
* {@link LoggableExt#included(ThreadContext, IRubyObject, IRubyObject)}).
*/
public static final class ClassMethods {
private ClassMethods() {
// Holder for JRuby Methods
}
@JRubyMethod(meta = true)
public static IRubyObject logger(final ThreadContext context, final IRubyObject self) {
final InstanceVariables instanceVariables;
if (self instanceof RubyClass) {
instanceVariables = ((RubyClass) self).getRealClass().getInstanceVariables();
} else {
instanceVariables = self.getInstanceVariables();
}
IRubyObject logger = instanceVariables.getInstanceVariable("logger");
if (logger == null || logger.isNil()) {
logger = RubyUtil.LOGGER.callMethod(context, "new",
LoggableExt.log4jName(context, (RubyModule) self)
);
instanceVariables.setInstanceVariable("logger", logger);
}
return logger;
}
@JRubyMethod(name = "slow_logger", required = 4, meta = true)
public static SlowLoggerExt slowLogger(final ThreadContext context,
final IRubyObject self, final IRubyObject[] args) {
final InstanceVariables instanceVariables = self.getInstanceVariables();
SlowLoggerExt logger =
(SlowLoggerExt) instanceVariables.getInstanceVariable("slow_logger");
if (logger == null || logger.isNil()) {
logger = new SlowLoggerExt(context.runtime, RubyUtil.SLOW_LOGGER).initialize(
context, new IRubyObject[]{
LoggableExt.log4jName(context, (RubyModule) self), args[0], args[1],
args[2], args[3]
}
);
instanceVariables.setInstanceVariable("slow_logger", logger);
}
return logger;
}
}
}

View file

@ -10,7 +10,6 @@ import org.jruby.Ruby;
import org.jruby.RubyBoolean;
import org.jruby.RubyClass;
import org.jruby.RubyObject;
import org.jruby.RubyString;
import org.jruby.anno.JRubyClass;
import org.jruby.anno.JRubyMethod;
import org.jruby.javasupport.JavaUtil;
@ -31,7 +30,7 @@ public class LoggerExt extends RubyObject {
}
@JRubyMethod
public IRubyObject initialize(final ThreadContext context, final IRubyObject loggerName) {
public LoggerExt initialize(final ThreadContext context, final IRubyObject loggerName) {
logger = LogManager.getLogger(loggerName.asJavaString());
return this;
}

View file

@ -34,7 +34,7 @@ public class SlowLoggerExt extends RubyObject {
}
@JRubyMethod(required = 5)
public IRubyObject initialize(final ThreadContext context, final IRubyObject[] args) {
public SlowLoggerExt initialize(final ThreadContext context, final IRubyObject[] args) {
String loggerName = args[0].asJavaString();
slowLogger = LogManager.getLogger("slowlog." + loggerName);
warnThreshold = ((RubyNumeric) args[1]).getLongValue();

View file

@ -2,7 +2,6 @@
# or more contributor license agreements. Licensed under the Elastic License;
# you may not use this file except in compliance with the Elastic License.
require "logstash/util/loggable"
require "concurrent"
module LogStash module Inputs