Error sending to RabbitMQ with priority from event - cannot convert instance of class org.jruby.specialized.RubyArrayOneObject to class java.lang.Integer

I am trying to send a logstash event to RabbitMq with a priority from the event, and getting an error. The same code works correctly when I don't send priority.

The code that fails:

    rabbitmq {
        arguments => {
            "x-ha-policy" => "all"
            "x-max-priority" => 20
        }
        durable => true
        key => "key"
        exchange => "exchange"
        exchange_type => "direct"
        host => "rabbitmq"
        message_properties => {"priority" => [priority]}
        password => "secret"
        user => "user"
    }

If I comment out the message_properties line, everything works.

[priority] is an integer - I have previously run

 mutate {
    convert => { "priority" => "integer" }
}

The error I get is:

org.jruby.exceptions.TypeError: (TypeError) cannot convert instance of class org.jruby.specialized.RubyArrayOneObject to class java.lang.Integer
at usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.march_hare_minus_3_dot_1_dot_1_minus_java.lib.march_hare.metadata.build_properties_from(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/march_hare-3.1.1-java/lib/march_hare/metadata.rb:103) ~[?:?]
at usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.march_hare_minus_3_dot_1_dot_1_minus_java.lib.march_hare.channel.basic_publish(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/march_hare-3.1.1-java/lib/march_hare/channel.rb:607) ~[?:?]
at usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.march_hare_minus_3_dot_1_dot_1_minus_java.lib.march_hare.channel.converting_rjc_exceptions_to_ruby(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/march_hare-3.1.1-java/lib/march_hare/channel.rb:978) ~[?:?]
at usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.march_hare_minus_3_dot_1_dot_1_minus_java.lib.march_hare.channel.basic_publish(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/march_hare-3.1.1-java/lib/march_hare/channel.rb:606) ~[?:?]
at usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.march_hare_minus_3_dot_1_dot_1_minus_java.lib.march_hare.exchange.publish(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/march_hare-3.1.1-java/lib/march_hare/exchange.rb:77) ~[?:?]
at RUBY.publish(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-output-rabbitmq-5.1.1-java/lib/logstash/outputs/rabbitmq.rb:66) ~[?:?]
at usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.logstash_minus_output_minus_rabbitmq_minus_5_dot_1_dot_1_minus_java.lib.logstash.outputs.rabbitmq.multi_receive_encoded(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-output-rabbitmq-5.1.1-java/lib/logstash/outputs/rabbitmq.rb:60) ~[?:?]
at org.jruby.RubyArray.each(org/jruby/RubyArray.java:1792) ~[jruby-complete-9.2.7.0.jar:?]
at usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.logstash_minus_output_minus_rabbitmq_minus_5_dot_1_dot_1_minus_java.lib.logstash.outputs.rabbitmq.multi_receive_encoded(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-output-rabbitmq-5.1.1-java/lib/logstash/outputs/rabbitmq.rb:59) ~[?:?]
at usr.share.logstash.logstash_minus_core.lib.logstash.outputs.base.multi_receive(/usr/share/logstash/logstash-core/lib/logstash/outputs/base.rb:87) ~[?:?]
at org.logstash.config.ir.compiler.OutputStrategyExt$AbstractOutputStrategyExt.multi_receive(org/logstash/config/ir/compiler/OutputStrategyExt.java:118) ~[logstash-core.jar:?]
at org.logstash.config.ir.compiler.AbstractOutputDelegatorExt.multi_receive(org/logstash/config/ir/compiler/AbstractOutputDelegatorExt.java:101) ~[logstash-core.jar:?]
at usr.share.logstash.logstash_minus_core.lib.logstash.java_pipeline.start_workers(/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:239) ~[?:?]

Looking at the appropriate line in march_hare metadata.rb (v3.1.1) it does look like it's priority related

Does it work any better if you use

message_properties => {"priority" => "%{[priority]}" }

No - then I get a different error - this time it's complaining that it is trying to convert a RubyString to an integer, instead of a RubyArrayOneObject

    org.jruby.exceptions.TypeError: (TypeError) cannot convert instance of class org.jruby.RubyString to class java.lang.Integer
at usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.march_hare_minus_3_dot_1_dot_1_minus_java.lib.march_hare.metadata.build_properties_from(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/march_hare-3.1.1-java/lib/march_hare/metadata.rb:103) ~[?:?]
at usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.march_hare_minus_3_dot_1_dot_1_minus_java.lib.march_hare.channel.basic_publish(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/march_hare-3.1.1-java/lib/march_hare/channel.rb:607) ~[?:?]
at usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.march_hare_minus_3_dot_1_dot_1_minus_java.lib.march_hare.channel.converting_rjc_exceptions_to_ruby(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/march_hare-3.1.1-java/lib/march_hare/channel.rb:978) ~[?:?]
at usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.march_hare_minus_3_dot_1_dot_1_minus_java.lib.march_hare.channel.basic_publish(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/march_hare-3.1.1-java/lib/march_hare/channel.rb:606) ~[?:?]
at usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.march_hare_minus_3_dot_1_dot_1_minus_java.lib.march_hare.exchange.publish(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/march_hare-3.1.1-java/lib/march_hare/exchange.rb:77) ~[?:?]
at usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.logstash_minus_output_minus_rabbitmq_minus_5_dot_1_dot_1_minus_java.lib.logstash.outputs.rabbitmq.publish(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-output-rabbitmq-5.1.1-java/lib/logstash/outputs/rabbitmq.rb:66) ~[?:?]
at usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.logstash_minus_output_minus_rabbitmq_minus_5_dot_1_dot_1_minus_java.lib.logstash.outputs.rabbitmq.multi_receive_encoded(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-output-rabbitmq-5.1.1-java/lib/logstash/outputs/rabbitmq.rb:60) ~[?:?]
at org.jruby.RubyArray.each(org/jruby/RubyArray.java:1792) ~[jruby-complete-9.2.7.0.jar:?]
at usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.logstash_minus_output_minus_rabbitmq_minus_5_dot_1_dot_1_minus_java.lib.logstash.outputs.rabbitmq.multi_receive_encoded(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-output-rabbitmq-5.1.1-java/lib/logstash/outputs/rabbitmq.rb:59) ~[?:?]
at usr.share.logstash.logstash_minus_core.lib.logstash.outputs.base.multi_receive(/usr/share/logstash/logstash-core/lib/logstash/outputs/base.rb:87) ~[?:?]
at org.logstash.config.ir.compiler.OutputStrategyExt$AbstractOutputStrategyExt.multi_receive(org/logstash/config/ir/compiler/OutputStrategyExt.java:118) ~[logstash-core.jar:?]
at org.logstash.config.ir.compiler.AbstractOutputDelegatorExt.multi_receive(org/logstash/config/ir/compiler/AbstractOutputDelegatorExt.java:101) ~[logstash-core.jar:?]
at usr.share.logstash.logstash_minus_core.lib.logstash.java_pipeline.start_workers(/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:239) ~[?:?]

Is this the correct place to raise this as a bug, or should I be posting this elsewhere?

I think you are out of luck. The rabbitmq code needs priority to be an integer, but a sprintf reference will always be a string.

That's... frustrating. I will see if I can make the necessary modification to the plugin.

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.