Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

out_parseable: Plugin for sending logs to Parseable #9622

Closed
wants to merge 100 commits into from

Conversation

AdheipSingh
Copy link

@AdheipSingh AdheipSingh commented Nov 20, 2024

Send kubernetes logs to https://www.parseable.com/


Enter [N/A] in the box, if an item is not applicable to your change.

Testing
Before we can approve your change; please submit the following in a comment:

  • Example configuration file for the change
  • Debug log output from testing the change
  • Attached Valgrind output that shows no leaks or memory corruption was found

If this is a change to packaging of containers or native binaries then please confirm it works for all targets.

  • Run local packaging test showing all targets (including any new ones) build.
  • Set ok-package-test label to test for all targets (requires maintainer to do).

Documentation

  • Documentation required for this feature

Backporting

  • Backport to latest stable release.

Fluent Bit is licensed under Apache 2.0, by submitting this pull request I understand that this code will be released under the terms of that license.

@edsiper
Copy link
Member

edsiper commented Nov 21, 2024

can you please provide the link to the API spec ?

@AdheipSingh
Copy link
Author

AdheipSingh commented Nov 22, 2024

  • Here is the API doc for ingesting into parseable.
https://www.postman.com/parseable/parseable/request/au1fn5d/send-logs-to-a-log-stream-with-http-header
  • Here is the sample config i am using.
      inputs: |
      [INPUT]
          Name tail
          Path /var/log/containers/*.log
          multiline.parser docker, cri
          Tag kube.*
          Mem_Buf_Limit 5MB
          Skip_Long_Lines On

      [INPUT]
          name kubernetes_events
          tag k8s_events

      [INPUT]
          Name systemd
          Tag host.*
          Systemd_Filter _SYSTEMD_UNIT=kubelet.service
          Read_From_Tail On

    ## https://docs.fluentbit.io/manual/pipeline/filters
    filters: |
      [FILTER]
          Name                kubernetes
          Match               kube.*
          Merge_Log           On
          Keep_Log            Off
          K8S-Logging.Parser  On
          K8S-Logging.Exclude On

    ## https://docs.fluentbit.io/manual/pipeline/outputs
    outputs: |
      [OUTPUT]
          Name parseable
          Match kube.*
          Server_Host parseable.parseable.svc.cluster.local
          Username admin
          Password admin
          Server_Port 80
          Stream $NAMESPACE
          Exclude_Namespaces kube-system, default

      [OUTPUT]
          Name parseable
          Match k8s_events
          Server_Host parseable.parseable.svc.cluster.local
          Server_Port 80
          Username admin
          Password admin
          Stream k8s-events 

Copy link
Contributor

@patrick-stephens patrick-stephens left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this build for all targets and do we need any extra dependencies? We probably need some unit tests at least too.

I think at the moment you've not actually enabled it to build, only for the container but then we don't test or exercise that in unit tests or builds.

CMakeLists.txt Outdated Show resolved Hide resolved
@@ -75,6 +75,7 @@ RUN cmake -DFLB_RELEASE=On \
-DFLB_IN_SYSTEMD=On \
-DFLB_OUT_KAFKA=On \
-DFLB_OUT_PGSQL=On \
-DFLB_OUT_PARSEABLE=On \
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this what should be used in the cmake config? It's already defaulting to on

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

feel free to suggest the best practice here. I tried to build without it but was not able to run the plugin.

plugins/out_parseable/parseable.c Outdated Show resolved Hide resolved
@AdheipSingh
Copy link
Author

Does this build for all targets and do we need any extra dependencies? We probably need some unit tests at least too.

I think at the moment you've not actually enabled it to build, only for the container but then we don't test or exercise that in unit tests or builds.

Please suggest some examples on unit tests and what can be done on building the ideal way. I'll implement this. ( i am not an expert in C codebase, so whatever is the best practice, ill will try to adhere to it ).

edsiper and others added 9 commits December 5, 2024 00:49
Signed-off-by: Eduardo Silva <[email protected]>
Signed-off-by: AdheipSingh <[email protected]>
Signed-off-by: AdheipSingh <[email protected]>
Signed-off-by: AdheipSingh <[email protected]>
Signed-off-by: AdheipSingh <[email protected]>
Signed-off-by: AdheipSingh <[email protected]>
Signed-off-by: AdheipSingh <[email protected]>
Signed-off-by: AdheipSingh <[email protected]>
Signed-off-by: AdheipSingh <[email protected]>
Signed-off-by: AdheipSingh <[email protected]>
Signed-off-by: AdheipSingh <[email protected]>
Signed-off-by: AdheipSingh <[email protected]>
Signed-off-by: AdheipSingh <[email protected]>
Signed-off-by: AdheipSingh <[email protected]>
@AdheipSingh
Copy link
Author

Hi @patrick-stephens review comments have been addressed. Over to you :)
cc @nitisht

@nitisht
Copy link

nitisht commented Dec 15, 2024

@edsiper @patrick-stephens would be great to have a next round of review please

Copy link
Member

@edsiper edsiper left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Before merging this, it needs some refactor. I added some comments , as well need to follow the coding style described in the contrib guide: https://github.com/fluent/fluent-bit/blob/master/CONTRIBUTING.md#coding-style

size_t b_sent;

msgpack_unpacked_init(&result);
while (msgpack_unpack_next(&result,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


/* Pack original key-value pairs */
msgpack_pack_map(&pk, p->via.map.size + 1);
for (int i = 0; i < p->via.map.size; i++) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do not declare variables inside the for loop

}


flb_sds_t namespace_name = flb_sds_create_size(256); // Dynamic string
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

declare the variable on top

}


flb_sds_t namespace_name = flb_sds_create_size(256); // Dynamic string
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

validate if namespace_name is null

msgpack_sbuffer_destroy(&sbuf);

/* Determine the value of the X-P-Stream header */
if (ctx->stream && strcmp(ctx->stream, "$NAMESPACE") == 0) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it seems you are trying to accomplish what our record accessor API does, use the existing API

entry = mk_list_entry(head, struct flb_slist_entry, _head);
flb_plg_info(ctx->ins, "Checking against exclude namespace: %s", entry->str);
// flb_plg_info(ctx->ins, "namespace_name: %s %d", namespace_name,flb_sds_len(namespace_name));
if (flb_sds_cmp(entry->str, namespace_name, flb_sds_len(namespace_name)) == 0) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

too many nested levels, refactor this in more clear functions

flb_sds_t username;
flb_sds_t password;
flb_sds_t stream;
struct mk_list *exclude_namespaces; // Use mk_list for namespace exclusion
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use cfl_list

@@ -29,6 +29,9 @@
#ifndef CPROF_HAVE_GMTIME_R
#define CPROF_HAVE_GMTIME_R
#endif
#ifndef CPROF_HAVE_CLOCK_GET_TIME
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do not touch this file

@edsiper
Copy link
Member

edsiper commented Jan 9, 2025

note: there are 81 commits in this PR, it should be only one.

@AdheipSingh
Copy link
Author

@edsiper i have to close this PR due to many commits/ conflicts coming when trying to squash. I have moved all the changes you requested to #9826.
cc @nitisht

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
docs-required ok-package-test Run PR packaging tests
Projects
None yet
Development

Successfully merging this pull request may close these issues.