Hi Rob,
Thanks for your promptly response. This is the problem I'm trying to
solve. I'm reading the memstat every 10 seconds and if the free memory is
below 5 mb for three consecutive reads I would like to push a message to
kafka with the latest read.
As a start I'm trying first to make the filter work and then add more
logic to it.
I just tried to modify my configuration to do not mach the message type
for a quick test and I still get the same issue
[StatFilter]
type = "SandboxFilter"
filename = "%ENV[HOME]/heka/config/lua/stat_filter.lua"
message_matcher = "Type != 'counter.stats'"
--[[
--]]
require "math"
require "string"
require "table"
counter_msg = 0;
local msg = {
Type = "counter.stats",
Payload = nil,
Fields = {}
}
function process_message ()
msg.Payload = read_message("Payload")
msg.Fields = read_message("Fields")
counter_msg = counter_msg + 1
msg.Fields["Count_MemFree"] = counter_msg
inject_msg(msg)
return 0
end
Best,
Adriano
On Thu, Apr 30, 2015 at 3:57 PM, Rob Miller <[email protected]> wrote:
> The error message is fairly clear here, I think:
>
> "Plugin 'MemStatFilter' error: attempted to Inject a message to itself"
>
> The issue is that the message that you're trying to inject will be matched
> by the message_matcher of the filter doing the injecting. This is
> explicitly not allowed because it likely leads to an infinite loop. Try
> constructing the message you generate in such a way that it will not match
> the filter that is doing the injecting and you'll have better luck.
>
> Other notes on your implementation:
>
> - You almost certainly don't want to use the separate `timer_event`
> version. You might get thousands of messages between each ticker interval,
> so in that version the count will be right but you'll only get the payload
> and other data of the last message that came through before each tick.
>
> - You'll get much less GC churn if you define the `local msg = {...}`
> table outside of the process_message function, and only overwrite the
> individual values you want to change each time, rather than creating a new
> table.
>
> - This whole thing smells a bit weird to me, I suspect it's not the best
> approach. What is the problem you're trying to solve?
>
> -r
>
>
> On 04/30/2015 01:38 PM, Adriano Santos wrote:
>
>> I also tried this code before and I got the same error:
>>
>> --[[
>>
>> --]]
>>
>> require "math"
>> require "string"
>> require "table"
>>
>> counter_msg = 0;
>> payload = nil
>> fields = nil
>>
>> function process_message ()
>>
>> local msg = {
>> Timestamp = nil,
>> Type = "counter.stats",
>> Payload = read_message("Payload"),
>> Fields = read_message("Fields")
>> }
>> counter_msg = counter_msg + 1
>> msg.Fields["Count_MemFree"] = counter_msg
>>
>> inject_msg(msg)
>> return 0
>> end
>>
>> On Thu, Apr 30, 2015 at 3:18 PM, Adriano Santos
>> <[email protected] <mailto:[email protected]>> wrote:
>>
>> Hi Guys,
>>
>> I wrote a lua sandbox filter plugin to count a field in the
>> message matcher. I'm trying also to include the content of the
>> message into the new message that is being injected.
>>
>> --[[
>>
>> --]]
>>
>> require "math"
>> require "string"
>> require "table"
>>
>> counter_msg = 0;
>> payload = nil
>> fields = nil
>> local floor = math.floor
>>
>>
>> function process_message ()
>>
>> counter_msg = counter_msg + 1
>> payload = read_message("Payload")
>> fields = read_message("Fields")
>> return 0
>> end
>>
>> function timer_event(ns)
>> local msg = {
>> Timestamp = nil,
>> Type = "counter.stats",
>> Payload = nil,
>> Fields = nil
>> }
>> msg.Payload = payload
>> msg.Fields = fields
>> msg.Fields["Count_MemFree"] = counter_msg
>> inject_msg(msg)
>> end
>>
>>
>> When the timer event is triggered I got the following error:
>>
>>
>> 2015/04/30 13:01:45 Plugin 'MemStatFilter' error: attempted to
>> Inject a message to itself
>> 2015/04/30 13:01:45 Plugin 'MemStatFilter': stopped
>> 2015/04/30 13:01:45 Plugin 'MemStatFilter': has stopped, exiting
>> plugin without shutting down.
>> 2015/04/30 13:01:45
>> :Timestamp: 2015-04-30 20:01:45.283326565 +0000 UTC
>> :Type: heka.terminated
>> :Hostname: slc01hza
>> :Pid: 26170
>> :Uuid: cc72c845-93b5-428f-a186-a2f186981efb
>> :Logger: hekad
>> :Payload: MemStatFilter (type SandboxFilter) terminated. Error:
>> Filter unloaded.
>> :EnvVersion:
>> :Severity: 7
>> :Fields:
>> | name:"plugin" type:string value:"MemStatFilter"
>>
>> 2015/04/30 13:01:45 Plugin 'MemStatFilter' error: Lost/Droppe
>>
>>
>> I know that modify the message inside a filter is not allowed. I
>> thought create a new message using inject_message or inject_payload
>> was available. I tried both.
>> Am I doing something wrong?
>>
>> Best,
>> Adriano
>>
>>
>>
>>
>>
>> _______________________________________________
>> Heka mailing list
>> [email protected]
>> https://mail.mozilla.org/listinfo/heka
>>
>>
>
_______________________________________________
Heka mailing list
[email protected]
https://mail.mozilla.org/listinfo/heka