Skip to content

Commit

Permalink
out_opentelemetry: enhancements for log body and attributes handling (f…
Browse files Browse the repository at this point in the history
…ix #8359)

The following patch fix and enhance the OpenTelemetry output connector when
handling log records.

In Fluent Bit world, we deal with ton of unstructured log records which comes
from variety of sources, or just simply raw text files. When converting those
lines to structured messages, there was no option to define what will be the
log body and log attributes and everything is packaged inside log body by
default.

This patch enhance the previous behavior by allowing the following:

- log body: optionally define multiple record accessor patterns that tries
            to match a key or sub-key from the record structure.
            For the first matched key, it's value is used as part of
            the body content.

            If no matches exists, the whole record is set inside the body.

- log attributes: if the log record contains native metadata, the keys
                  are added as OpenTelemetry Attributes.

                  if the log body was populated by using a record accessor
                  pattern as described above, the remaining keys that were
                  not used are added as attributes.

To achieve the desired new behavior, the configuration needs to use the new
configuration property called 'logs_body_key', which can be used to define
multiple record accessor patterns. e.g:

  pipeline:
    inputs:
      - name: dummy
        metadata: '{"meta": "data"}'
        dummy: '{"name": "bill", "lastname": "gates", "log": {"abc": {"def":123}, "saveme": true}}'

    outputs:
      - name: opentelemetry
        match: '*'
        host: localhost
        port: 4318
        logs_body_key: $name
        logs_body_key: $log['abc']['def']

In the example above, the dummy input plugin will generate a record with
metadata, in the output side, the plugin will lookup in order for $name and
then $log['abc']['def']. $name will match so 'bill' will become the value of
the body and the remaining content as attributes. Here is the output of the
vanilla Otel Collector when inspecting the content it receives:

  Body: Str(bill)
  Attributes:
       -> meta: Str(data)
       -> lastname: Str(gates)
       -> log: Map({"abc":{"def":123},"saveme":true})

Signed-off-by: Eduardo Silva <[email protected]>
  • Loading branch information
edsiper committed Feb 19, 2024
1 parent 57ea449 commit ee7bbc0
Show file tree
Hide file tree
Showing 3 changed files with 397 additions and 81 deletions.
Loading

0 comments on commit ee7bbc0

Please sign in to comment.