From what I can tell (and it's not very clear), it looks like you've got one Heka instance running that has only a TcpInput, nothing else. That will accept data, but it's not going to do anything with that data.

Then you've got a separate Heka config that contains no inputs, but only a TcpOutput (pointing at the input that's specified in the other config) and a FileOutput. These outputs might conceivably send data somewhere, but there are no inputs, so it's not clear where that data would come from.

Drop the TcpOutput altogether, and combine the TcpInput and the FileOutput into a single config:

[hekad]
maxprocs = 1
share_dir = "/Users/egu/heka/share/heka"

[tcp_in:3242]
type = "TcpInput"
splitter = "HekaFramingSplitter"
decoder = "ProtobufDecoder"
address = ":3242"

[tcp_heka_output_log]
type = "FileOutput"
message_matcher = "TRUE"
path = "/tmp/output.log"
perm = "664"
encoder = "tcp_heka_output_encoder"

[tcp_heka_output_encoder]
type = "PayloadEncoder"
append_newlines = false


Once you've done that, you should be able to use `heka-inject` to send a message into your running Heka:

$ heka-inject -heka 127.0.0.1:3242 -payload "1212 this is just a test"

If you want to send custom data in through that TcpInput, then you'll have to switch to using a different splitter and a different decoder, the default setup you're using will only know how to handle Heka protobuf streams.

-r



On 01/07/2016 03:48 PM, Emily Gu wrote:
Thanks you both Rob and David very much!

Not sure where I need to define "base_dir"?

I'm going to write a Heka plugin to pass our metrics data into Heka.

For now, I have a hard time to see the data I send in through
TCP programmatically through TcpInput in the output.log file.
I don't see any output.  The configs are:

tcp_input.toml
============

[hekad]

maxprocs = 1

share_dir = "/Users/egu/heka/share/heka"


[tcp_in:3242]

type = "TcpInput"

splitter = "HekaFramingSplitter"

decoder = "ProtobufDecoder"

address = ":3242"


tcp_output.toml

==============

[hekad]

maxprocs = 1

share_dir = "/Users/egu/heka/share/heka"


[tcp_out:3242]

type = "TcpOutput"

message_matcher = "TRUE"

address = "127.0.0.1:3242 <http://127.0.0.1:3242>"


[tcp_heka_output_log]

type = "FileOutput"

message_matcher = "TRUE"

path = "/tmp/output.log"

perm = "664"

encoder = "tcp_heka_output_encoder"


[tcp_heka_output_encoder]

type = "PayloadEncoder"

append_newlines = false


The client:

package main


import (

     "fmt"

     "github.com/mozilla-services/heka/client
<http://github.com/mozilla-services/heka/client>"

)



func main() {

     message_bytes := []byte {100}


     sender, err := client.NewNetworkSender("tcp", "127.0.0.1:3242
<http://127.0.0.1:3242>")

     if err != nil {

         fmt.Println("Could not connect to", "127.0.0.1:3242
<http://127.0.0.1:3242>")

         return

     }

     fmt.Println("Connected")

     var i int

     for i = 0; i < 10; i++ {

fmt.Println("message byte:", string(message_bytes))

         err = sender.SendMessage(message_bytes)

         if err != nil {

             break

         }

     }

     fmt.Println("sent", i, "messages")

}



Please let me know what else I need to change.

Thanks,

Emily






On Thu, Jan 7, 2016 at 3:28 PM, David Birdsong <[email protected]
<mailto:[email protected]>> wrote:



    On Thu, Jan 7, 2016 at 3:22 PM, Rob Miller <[email protected]
    <mailto:[email protected]>> wrote:

        On 01/07/2016 03:09 PM, Emily Gu wrote:

            Thanks David for all the help! I'll give it a try.

            Please bear with me as some parts I still not understand.

            1. Why do I have to run two Heka instances where one for
            input and
            another for output?


        Because if you send the output from a Heka instance back into
        itself, then you're likely setting up an infinite loop of
        traffic that will spin out of control.

            2. Did you mean I need to specify different share_dirs in
            input and
            output Toml configs?


        If you're running multiple Heka instances on a single machine,
        it *should* be fine for them to use the same share_dir, which is
        read-only. It's very important that each specifies a unique
        base_dir, however, since that's used by Heka for internal
        bookkeeping data. Two Heka's using the same base_dir is asking
        for trouble.

            3. Do I need both TcpOutput and FileOutput in order for me
            to see
            messages inside an output file? What if I didn't specify
            TcpOutput?


        Um, TcpOutput sends output data over a TCP connection. It
        expects that there is a listener on the other side which will
        accept that TCP connection, and will know how to correctly
        handle the data that Heka is sending over the TCP connection.

        FileOutput sends data to a file on the local file system.

        It's of course fine to specify a FileOutput without specifying a
        TcpOutput.

        -r


    whoops, yes I meant base_dir for where heka writes various internal
    state information to.

    Emily,

    Maybe you could share what data you're trying to read into heka and
    what you would like to do with it and we could help get you going.

    Heka intended to a uni-directional pipeline. It can read data in
    from many places into various formats, aggregate into interesting
    new formats, and finally emit data somewhere else.


_______________________________________________
Heka mailing list
[email protected]
https://mail.mozilla.org/listinfo/heka

Reply via email to