From e7a406cf45d19a03bbe1e5f6badf73f2d51dfdb7 Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Wed, 24 Jun 2026 16:55:50 +0900 Subject: [PATCH 1/7] filter_kubernetes: Implement injecting mechanism for internal lobs Signed-off-by: Hiroshi Hatake --- plugins/filter_kubernetes/kube_meta.c | 192 ++++++++++++++++++++++--- plugins/filter_kubernetes/kube_meta.h | 7 + plugins/filter_kubernetes/kubernetes.c | 11 ++ 3 files changed, 191 insertions(+), 19 deletions(-) diff --git a/plugins/filter_kubernetes/kube_meta.c b/plugins/filter_kubernetes/kube_meta.c index df21a9270d0..68c86d45f71 100644 --- a/plugins/filter_kubernetes/kube_meta.c +++ b/plugins/filter_kubernetes/kube_meta.c @@ -1951,6 +1951,83 @@ static inline int extract_pod_meta(struct flb_kube *ctx, return 0; } +static int set_local_namespace_meta(struct flb_kube *ctx, + struct flb_kube_meta *meta) +{ + int n; + + memset(meta, '\0', sizeof(struct flb_kube_meta)); + + if (ctx->namespace == NULL) { + return -1; + } + + meta->namespace = flb_strndup(ctx->namespace, ctx->namespace_len); + if (meta->namespace == NULL) { + flb_errno(); + return -1; + } + meta->namespace_len = ctx->namespace_len; + + n = meta->namespace_len + 1; + meta->cache_key = flb_malloc(n); + if (meta->cache_key == NULL) { + flb_errno(); + return -1; + } + + memcpy(meta->cache_key, meta->namespace, meta->namespace_len); + meta->cache_key[meta->namespace_len] = '\0'; + meta->cache_key_len = meta->namespace_len; + + return 0; +} + +static int set_local_pod_meta(struct flb_kube *ctx, struct flb_kube_meta *meta) +{ + int n; + size_t off = 0; + + memset(meta, '\0', sizeof(struct flb_kube_meta)); + + if (ctx->namespace == NULL || ctx->podname == NULL) { + return -1; + } + + meta->namespace = flb_strndup(ctx->namespace, ctx->namespace_len); + if (meta->namespace == NULL) { + flb_errno(); + return -1; + } + meta->namespace_len = ctx->namespace_len; + + meta->podname = flb_strndup(ctx->podname, ctx->podname_len); + if (meta->podname == NULL) { + flb_errno(); + return -1; + } + meta->podname_len = ctx->podname_len; + + n = meta->namespace_len + 1 + meta->podname_len + 1; + meta->cache_key = flb_malloc(n); + if (meta->cache_key == NULL) { + flb_errno(); + return -1; + } + + memcpy(meta->cache_key, meta->namespace, meta->namespace_len); + off = meta->namespace_len; + + meta->cache_key[off++] = ':'; + memcpy(meta->cache_key + off, meta->podname, meta->podname_len); + off += meta->podname_len; + + meta->cache_key[off] = '\0'; + meta->cache_key_len = off; + + return 0; +} + /* * Given a fixed meta data (namespace), get API server information * and merge buffers. @@ -2314,12 +2391,10 @@ int flb_kube_dummy_meta_get(char **out_buf, size_t *out_size) return 0; } -static inline int flb_kube_pod_meta_get(struct flb_kube *ctx, - const char *tag, int tag_len, - const char *data, size_t data_size, - const char **out_buf, size_t *out_size, - struct flb_kube_meta *meta, - struct flb_kube_props *props) +static inline int lookup_pod_meta(struct flb_kube *ctx, + const char **out_buf, size_t *out_size, + struct flb_kube_meta *meta, + struct flb_kube_props *props) { int id; int ret; @@ -2329,12 +2404,6 @@ static inline int flb_kube_pod_meta_get(struct flb_kube *ctx, size_t hash_meta_size; msgpack_unpacked result; - /* Get metadata from tag or record (cache key is the important one) */ - ret = extract_pod_meta(ctx, tag, tag_len, data, data_size, meta); - if (ret != 0) { - return -1; - } - /* Check if we have some data associated to the cache key */ ret = flb_hash_table_get(ctx->hash_table, meta->cache_key, meta->cache_key_len, @@ -2394,9 +2463,40 @@ static inline int flb_kube_pod_meta_get(struct flb_kube *ctx, return 0; } -static inline int flb_kube_namespace_meta_get(struct flb_kube *ctx, +static inline int flb_kube_pod_meta_get(struct flb_kube *ctx, const char *tag, int tag_len, const char *data, size_t data_size, + const char **out_buf, size_t *out_size, + struct flb_kube_meta *meta, + struct flb_kube_props *props) +{ + int ret; + + /* Get metadata from tag or record (cache key is the important one) */ + ret = extract_pod_meta(ctx, tag, tag_len, data, data_size, meta); + if (ret != 0) { + return -1; + } + + return lookup_pod_meta(ctx, out_buf, out_size, meta, props); +} + +static inline int flb_kube_local_pod_meta_get(struct flb_kube *ctx, + const char **out_buf, size_t *out_size, + struct flb_kube_meta *meta, + struct flb_kube_props *props) +{ + int ret; + + ret = set_local_pod_meta(ctx, meta); + if (ret != 0) { + return -1; + } + + return lookup_pod_meta(ctx, out_buf, out_size, meta, props); +} + +static inline int lookup_namespace_meta(struct flb_kube *ctx, const char **out_buf, size_t *out_size, struct flb_kube_meta *meta) { @@ -2408,12 +2508,6 @@ static inline int flb_kube_namespace_meta_get(struct flb_kube *ctx, size_t hash_meta_size; msgpack_unpacked result; - /* Get metadata from tag or record (cache key is the important one) */ - ret = extract_namespace_meta(ctx, tag, tag_len, data, data_size, meta); - if (ret != 0) { - return -1; - } - /* Check if we have some data associated to the cache key */ ret = flb_hash_table_get(ctx->namespace_hash_table, meta->cache_key, meta->cache_key_len, @@ -2463,6 +2557,37 @@ static inline int flb_kube_namespace_meta_get(struct flb_kube *ctx, return 0; } +static inline int flb_kube_namespace_meta_get(struct flb_kube *ctx, + const char *tag, int tag_len, + const char *data, size_t data_size, + const char **out_buf, size_t *out_size, + struct flb_kube_meta *meta) +{ + int ret; + + /* Get metadata from tag or record (cache key is the important one) */ + ret = extract_namespace_meta(ctx, tag, tag_len, data, data_size, meta); + if (ret != 0) { + return -1; + } + + return lookup_namespace_meta(ctx, out_buf, out_size, meta); +} + +static inline int flb_kube_local_namespace_meta_get(struct flb_kube *ctx, + const char **out_buf, size_t *out_size, + struct flb_kube_meta *meta) +{ + int ret; + + ret = set_local_namespace_meta(ctx, meta); + if (ret != 0) { + return -1; + } + + return lookup_namespace_meta(ctx, out_buf, out_size, meta); +} + int flb_kube_meta_get(struct flb_kube *ctx, const char *tag, int tag_len, const char *data, size_t data_size, @@ -2495,6 +2620,35 @@ int flb_kube_meta_get(struct flb_kube *ctx, return -1; } +int flb_kube_meta_get_local(struct flb_kube *ctx, + const char **out_buf, size_t *out_size, + const char **namespace_out_buf, + size_t *namespace_out_size, + struct flb_kube_meta *meta, + struct flb_kube_props *props, + struct flb_kube_meta *namespace_meta) +{ + int ret_namespace_meta = -1; + int ret_pod_meta = -1; + + if (ctx->namespace_labels == FLB_TRUE || ctx->namespace_annotations == FLB_TRUE) { + ret_namespace_meta = flb_kube_local_namespace_meta_get(ctx, namespace_out_buf, + namespace_out_size, + namespace_meta); + } + + if (ctx->namespace_metadata_only == FLB_FALSE) { + ret_pod_meta = flb_kube_local_pod_meta_get(ctx, out_buf, out_size, + meta, props); + } + + if (ret_pod_meta == 0 || ret_namespace_meta == 0) { + return 0; + } + + return -1; +} + int flb_kube_meta_release(struct flb_kube_meta *meta) { int r = 0; diff --git a/plugins/filter_kubernetes/kube_meta.h b/plugins/filter_kubernetes/kube_meta.h index c5517ce919e..8a19e090692 100644 --- a/plugins/filter_kubernetes/kube_meta.h +++ b/plugins/filter_kubernetes/kube_meta.h @@ -77,6 +77,13 @@ int flb_kube_meta_get(struct flb_kube *ctx, struct flb_kube_meta *meta, struct flb_kube_props *props, struct flb_kube_meta *namespace_meta); +int flb_kube_meta_get_local(struct flb_kube *ctx, + const char **out_buf, size_t *out_size, + const char **namespace_out_buf, + size_t *namespace_out_size, + struct flb_kube_meta *meta, + struct flb_kube_props *props, + struct flb_kube_meta *namespace_meta); int flb_kube_meta_release(struct flb_kube_meta *meta); int flb_kube_pod_association_init(struct flb_kube *ctx, struct flb_config *config); int get_api_server_configmap(struct flb_kube *ctx, const char *namespace, const char *configmap, char **out_buf, size_t *out_size); diff --git a/plugins/filter_kubernetes/kubernetes.c b/plugins/filter_kubernetes/kubernetes.c index 83190a6b9f5..a116dcc903e 100644 --- a/plugins/filter_kubernetes/kubernetes.c +++ b/plugins/filter_kubernetes/kubernetes.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -41,6 +42,7 @@ #define MERGE_NONE 0 /* merge unescaped string in temporary buffer */ #define MERGE_PARSED 1 /* merge parsed string (log_buf) */ #define MERGE_MAP 2 /* merge direct binary object (v) */ +#define FLB_KUBE_LOCAL_LOGS_INPUT "fluentbit_logs" struct task_args { struct flb_kube *ctx; @@ -624,6 +626,15 @@ static int cb_kube_filter(const void *data, size_t bytes, ret = flb_kube_dummy_meta_get(&dummy_cache_buf, &cache_size); cache_buf = dummy_cache_buf; } + else if (i_ins != NULL && i_ins->p != NULL && + strcmp(i_ins->p->name, FLB_KUBE_LOCAL_LOGS_INPUT) == 0) { + ret = flb_kube_meta_get_local(ctx, + &cache_buf, &cache_size, + &namespace_cache_buf, + &namespace_cache_size, + &meta, &props, + &namespace_meta); + } else { /* Check if we have some cached metadata for the incoming events */ ret = flb_kube_meta_get(ctx, From 259a938eb60b9445bbf3882beffe106791843399 Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Wed, 24 Jun 2026 16:58:16 +0900 Subject: [PATCH 2/7] filter_kubernetes: Add a capability to handle custom name of metadata files Signed-off-by: Hiroshi Hatake --- plugins/filter_kubernetes/kube_conf.h | 1 + plugins/filter_kubernetes/kube_meta.c | 9 +++++++-- plugins/filter_kubernetes/kubernetes.c | 7 +++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/plugins/filter_kubernetes/kube_conf.h b/plugins/filter_kubernetes/kube_conf.h index b59ed009f28..781053c9274 100644 --- a/plugins/filter_kubernetes/kube_conf.h +++ b/plugins/filter_kubernetes/kube_conf.h @@ -174,6 +174,7 @@ struct flb_kube { size_t podname_len; /* Kubernetes Token from FLB_KUBE_TOKEN file */ + char *namespace_file; char *token_file; char *token; size_t token_len; diff --git a/plugins/filter_kubernetes/kube_meta.c b/plugins/filter_kubernetes/kube_meta.c index 68c86d45f71..abcd7506feb 100644 --- a/plugins/filter_kubernetes/kube_meta.c +++ b/plugins/filter_kubernetes/kube_meta.c @@ -280,17 +280,20 @@ static int get_local_pod_info(struct flb_kube *ctx) char *hostname; /* Get the namespace name */ - ret = file_to_buffer(FLB_KUBE_NAMESPACE, &ns, &ns_size); + ret = file_to_buffer(ctx->namespace_file, &ns, &ns_size); if (ret == -1) { /* * If it fails, it's just informational, as likely the caller * wanted to connect using the Proxy instead from inside a POD. */ - flb_plg_warn(ctx->ins, "cannot open %s", FLB_KUBE_NAMESPACE); + flb_plg_warn(ctx->ins, "cannot open %s", ctx->namespace_file); return FLB_FALSE; } /* Namespace */ + while (ns_size > 0 && (ns[ns_size - 1] == '\n' || ns[ns_size - 1] == '\r')) { + ns[--ns_size] = '\0'; + } ctx->namespace = ns; ctx->namespace_len = ns_size; @@ -2000,6 +2003,7 @@ static int set_local_pod_meta(struct flb_kube *ctx, struct flb_kube_meta *meta) return -1; } meta->namespace_len = ctx->namespace_len; + meta->fields++; meta->podname = flb_strndup(ctx->podname, ctx->podname_len); if (meta->podname == NULL) { @@ -2007,6 +2011,7 @@ static int set_local_pod_meta(struct flb_kube *ctx, struct flb_kube_meta *meta) return -1; } meta->podname_len = ctx->podname_len; + meta->fields++; n = meta->namespace_len + 1 + meta->podname_len + 1; meta->cache_key = flb_malloc(n); diff --git a/plugins/filter_kubernetes/kubernetes.c b/plugins/filter_kubernetes/kubernetes.c index a116dcc903e..24548e5fa68 100644 --- a/plugins/filter_kubernetes/kubernetes.c +++ b/plugins/filter_kubernetes/kubernetes.c @@ -954,6 +954,13 @@ static struct flb_config_map config_map[] = { "prefix used in tag by the input plugin" }, + /* Kubernetes Namespace file */ + { + FLB_CONFIG_MAP_STR, "kube_namespace_file", FLB_KUBE_NAMESPACE, + 0, FLB_TRUE, offsetof(struct flb_kube, namespace_file), + "Kubernetes namespace file" + }, + /* Kubernetes Token file */ { FLB_CONFIG_MAP_STR, "kube_token_file", FLB_KUBE_TOKEN, From 17fd1a49df1b7d611ca8d5c71ccbe6c8336d5357 Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Wed, 24 Jun 2026 17:08:23 +0900 Subject: [PATCH 3/7] tests: runtime: Add a test case for local metadata Signed-off-by: Hiroshi Hatake --- tests/runtime/data/kubernetes/local/namespace | 1 + tests/runtime/data/kubernetes/local/token | 1 + tests/runtime/filter_kubernetes.c | 120 ++++++++++++++++++ 3 files changed, 122 insertions(+) create mode 100644 tests/runtime/data/kubernetes/local/namespace create mode 100644 tests/runtime/data/kubernetes/local/token diff --git a/tests/runtime/data/kubernetes/local/namespace b/tests/runtime/data/kubernetes/local/namespace new file mode 100644 index 00000000000..4ad96d51599 --- /dev/null +++ b/tests/runtime/data/kubernetes/local/namespace @@ -0,0 +1 @@ +default diff --git a/tests/runtime/data/kubernetes/local/token b/tests/runtime/data/kubernetes/local/token new file mode 100644 index 00000000000..2096ea15c05 --- /dev/null +++ b/tests/runtime/data/kubernetes/local/token @@ -0,0 +1 @@ +test-token diff --git a/tests/runtime/filter_kubernetes.c b/tests/runtime/filter_kubernetes.c index a0a97b4a7b3..8088d4a7664 100644 --- a/tests/runtime/filter_kubernetes.c +++ b/tests/runtime/filter_kubernetes.c @@ -26,6 +26,10 @@ struct kube_test_result { int nMatched; }; +struct local_logs_result { + int nMatched; +}; + void wait_with_timeout(uint32_t timeout_ms, struct kube_test_result *result, int nExpected) { struct flb_time start_time; @@ -377,6 +381,121 @@ static void kube_test(const char *target, int type, const char *suffix, int nExp } } +static int cb_check_local_logs_result(void *record, size_t size, void *data) +{ + struct local_logs_result *result; + char *out; + + result = (struct local_logs_result *) data; + out = (char *) record; + + if (strstr(out, "[input:fluentbit_logs:fluentbit_logs.0] storage_strategy") != NULL && + strstr(out, "\"kubernetes\":") != NULL && + strstr(out, "\"pod_name\":\"kairosdb-914055854-b63vq\"") != NULL && + strstr(out, "\"namespace_name\":\"default\"") != NULL && + strstr(out, "\"pod_id\":\"d6c53deb-05a4-11e8-a8c4-080027435fb7\"") != NULL && + strstr(out, "\"labels\":{\"name\":\"kairosdb\"") != NULL) { + result->nMatched++; + } + + if (size > 0) { + flb_free(record); + } + + return 0; +} + +static void flb_test_local_fluentbit_logs() +{ + int ret; + int in_ffd; + int filter_ffd; + int out_ffd; + char *old_hostname; + struct kube_test ctx; + struct flb_lib_out_cb cb_data; + struct local_logs_result result = {0}; + + ctx.flb = flb_create(); + TEST_CHECK_(ctx.flb != NULL, "initialising service"); + if (!ctx.flb) { + return; + } + + old_hostname = getenv("HOSTNAME"); + if (old_hostname != NULL) { + old_hostname = flb_strdup(old_hostname); + } + + ret = setenv("HOSTNAME", "kairosdb-914055854-b63vq", 1); + TEST_CHECK_(ret == 0, "setting HOSTNAME"); + + ret = flb_service_set(ctx.flb, + "Flush", "1", + "Grace", "1", + "Log_Level", "info", + NULL); + TEST_CHECK_(ret == 0, "setting service options"); + + in_ffd = flb_input(ctx.flb, "fluentbit_logs", NULL); + TEST_CHECK_(in_ffd >= 0, "initialising input"); + ret = flb_input_set(ctx.flb, in_ffd, + "Tag", "fluentbit.internal", + NULL); + TEST_CHECK_(ret == 0, "setting input options"); + + filter_ffd = flb_filter(ctx.flb, "kubernetes", NULL); + TEST_CHECK_(filter_ffd >= 0, "initialising filter"); + ret = flb_filter_set(ctx.flb, filter_ffd, + "Match", "fluentbit.internal", + "Kube_Url", KUBE_URL, + "Kube_Meta_Preload_Cache_Dir", DPATH "/meta", + "Kube_Namespace_File", DPATH "/local/namespace", + "Kube_Token_File", DPATH "/local/token", + NULL); + TEST_CHECK_(ret == 0, "setting filter options"); + + cb_data.cb = cb_check_local_logs_result; + cb_data.data = &result; + + out_ffd = flb_output(ctx.flb, "lib", (void *) &cb_data); + TEST_CHECK_(out_ffd >= 0, "initialising output"); + ret = flb_output_set(ctx.flb, out_ffd, + "Match", "fluentbit.internal", + "format", "json", + NULL); + TEST_CHECK_(ret == 0, "setting output options"); + + ret = flb_start(ctx.flb); + TEST_CHECK_(ret == 0, "starting engine"); + if (ret == -1) { + goto exit; + } + + for (ret = 0; ret < 5000 && result.nMatched == 0; ret++) { + usleep(1000); + } + + TEST_CHECK(result.nMatched == 1); + TEST_MSG("result.nMatched: %i\nnExpected: 1", result.nMatched); + + flb_log_set_level(ctx.flb->config, FLB_LOG_ERROR); + + ret = flb_stop(ctx.flb); + TEST_CHECK_(ret == 0, "stopping engine"); + +exit: + if (old_hostname != NULL) { + setenv("HOSTNAME", old_hostname, 1); + flb_free(old_hostname); + } + else { + unsetenv("HOSTNAME"); + } + + flb_destroy(ctx.flb); +} + #define flb_test_core(target, suffix, nExpected) \ kube_test("core/" target, KUBE_TAIL, suffix, nExpected, NULL); @@ -1036,6 +1155,7 @@ TEST_LIST = { {"kube_core_unescaping_json", flb_test_core_unescaping_json}, {"kube_core_base_with_namespace_labels_and_annotations", flb_test_core_base_with_namespace_labels_and_annotations}, {"kube_core_base_with_owner_references", flb_test_core_base_with_owner_references}, + {"kube_local_fluentbit_logs", flb_test_local_fluentbit_logs}, {"kube_options_use-kubelet_enabled_json", flb_test_options_use_kubelet_enabled_json}, {"kube_options_use-kubelet_disabled_json", flb_test_options_use_kubelet_disabled_json}, {"kube_options_merge_log_enabled_text", flb_test_options_merge_log_enabled_text}, From 8e6f2ca107e98cb4e3f99ede040d02f5b0c8a7c8 Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Wed, 24 Jun 2026 17:09:16 +0900 Subject: [PATCH 4/7] in_fluentbit_logs: Cleanup fd on shutdown Signed-off-by: Hiroshi Hatake --- plugins/in_fluentbit_logs/fluentbit_logs.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/in_fluentbit_logs/fluentbit_logs.c b/plugins/in_fluentbit_logs/fluentbit_logs.c index 21bf9e0d8eb..c1033e9f9a6 100644 --- a/plugins/in_fluentbit_logs/fluentbit_logs.c +++ b/plugins/in_fluentbit_logs/fluentbit_logs.c @@ -130,6 +130,7 @@ static int in_fluentbit_logs_init(struct flb_input_instance *in, } ctx->ins = in; + ctx->coll_fd = -1; ctx->log_encoder = flb_log_event_encoder_create(FLB_LOG_EVENT_FORMAT_DEFAULT); if (ctx->log_encoder == NULL) { flb_plg_error(in, "could not initialize event encoder"); @@ -172,6 +173,11 @@ static int in_fluentbit_logs_exit(void *data, struct flb_config *config) return 0; } + if (ctx->coll_fd >= 0) { + flb_input_collector_delete(ctx->coll_fd, ctx->ins); + ctx->coll_fd = -1; + } + flb_log_pipeline_disable(config); if (ctx->log_encoder != NULL) { From a2b315d857860cc913096ae49b9845e2918e271c Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Wed, 24 Jun 2026 20:09:27 +0900 Subject: [PATCH 5/7] filter_kubernetes: Confirm return values and add NULL checks Signed-off-by: Hiroshi Hatake --- plugins/filter_kubernetes/kube_meta.c | 48 ++++++++++++++++++++--- plugins/filter_kubernetes/kube_property.c | 8 +++- 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/plugins/filter_kubernetes/kube_meta.c b/plugins/filter_kubernetes/kube_meta.c index abcd7506feb..63426e9467c 100644 --- a/plugins/filter_kubernetes/kube_meta.c +++ b/plugins/filter_kubernetes/kube_meta.c @@ -2433,8 +2433,20 @@ static inline int lookup_pod_meta(struct flb_kube *ctx, * the outgoing buffer and size. */ flb_free(tmp_hash_meta_buf); - flb_hash_table_get_by_id(ctx->hash_table, id, meta->cache_key, - &hash_meta_buf, &hash_meta_size); + ret = flb_hash_table_get_by_id(ctx->hash_table, id, + meta->cache_key, + &hash_meta_buf, &hash_meta_size); + if (ret == -1) { + *out_buf = NULL; + *out_size = 0; + return 0; + } + } + else { + flb_free(tmp_hash_meta_buf); + *out_buf = NULL; + *out_size = 0; + return 0; } } @@ -2449,7 +2461,13 @@ static inline int lookup_pod_meta(struct flb_kube *ctx, msgpack_unpacked_init(&result); /* Unpack to get the offset/bytes of the first item */ - msgpack_unpack_next(&result, hash_meta_buf, hash_meta_size, &off); + ret = msgpack_unpack_next(&result, hash_meta_buf, hash_meta_size, &off); + if (ret != MSGPACK_UNPACK_SUCCESS) { + msgpack_unpacked_destroy(&result); + *out_buf = NULL; + *out_size = 0; + return 0; + } /* Set the pointer and proper size for the caller */ *out_buf = hash_meta_buf; @@ -2537,8 +2555,20 @@ static inline int lookup_namespace_meta(struct flb_kube *ctx, * the outgoing buffer and size. */ flb_free(tmp_hash_meta_buf); - flb_hash_table_get_by_id(ctx->namespace_hash_table, id, meta->cache_key, - &hash_meta_buf, &hash_meta_size); + ret = flb_hash_table_get_by_id(ctx->namespace_hash_table, id, + meta->cache_key, + &hash_meta_buf, &hash_meta_size); + if (ret == -1) { + *out_buf = NULL; + *out_size = 0; + return 0; + } + } + else { + flb_free(tmp_hash_meta_buf); + *out_buf = NULL; + *out_size = 0; + return 0; } } @@ -2551,7 +2581,13 @@ static inline int lookup_namespace_meta(struct flb_kube *ctx, msgpack_unpacked_init(&result); /* Unpack to get the offset/bytes of the first item */ - msgpack_unpack_next(&result, hash_meta_buf, hash_meta_size, &off); + ret = msgpack_unpack_next(&result, hash_meta_buf, hash_meta_size, &off); + if (ret != MSGPACK_UNPACK_SUCCESS) { + msgpack_unpacked_destroy(&result); + *out_buf = NULL; + *out_size = 0; + return 0; + } /* Set the pointer and proper size for the caller */ *out_buf = hash_meta_buf; diff --git a/plugins/filter_kubernetes/kube_property.c b/plugins/filter_kubernetes/kube_property.c index 64a1151dd20..d93ee131fcc 100644 --- a/plugins/filter_kubernetes/kube_property.c +++ b/plugins/filter_kubernetes/kube_property.c @@ -236,8 +236,12 @@ int flb_kube_prop_set(struct flb_kube *ctx, struct flb_kube_meta *meta, /* If the property is for a specific container, and this is not * that container, bail out */ - if (container && strncmp(container, meta->container_name, container_len)) { - return 0; + if (container) { + if (meta->container_name == NULL || + container_len != (size_t) meta->container_name_len || + strncmp(container, meta->container_name, container_len) != 0) { + return 0; + } } return function(ctx, meta, From b3b2fa6e45ae012fdb0933f34f4e6190d9a0e4af Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Wed, 24 Jun 2026 20:10:30 +0900 Subject: [PATCH 6/7] tests: runtime: Add exclude enrichment metadata to confirm plugging SEGV paths Signed-off-by: Hiroshi Hatake --- .../kubernetes/meta/default_kairosdb-914055854-b63vq.meta | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/runtime/data/kubernetes/meta/default_kairosdb-914055854-b63vq.meta b/tests/runtime/data/kubernetes/meta/default_kairosdb-914055854-b63vq.meta index 90109bfec5a..f7f09ef0898 100644 --- a/tests/runtime/data/kubernetes/meta/default_kairosdb-914055854-b63vq.meta +++ b/tests/runtime/data/kubernetes/meta/default_kairosdb-914055854-b63vq.meta @@ -13,9 +13,10 @@ "name": "kairosdb", "pod-template-hash": "914055854" }, - "annotations": { - "kubernetes.io/created-by": "{\"kind\":\"SerializedReference\",\"apiVersion\":\"v1\",\"reference\":{\"kind\":\"ReplicaSet\",\"namespace\":\"default\",\"name\":\"kairosdb-914055854\",\"uid\":\"d6c2f841-05a4-11e8-a8c4-080027435fb7\",\"apiVersion\":\"extensions\",\"resourceVersion\":\"1592\"}}\n" - }, + "annotations": { + "kubernetes.io/created-by": "{\"kind\":\"SerializedReference\",\"apiVersion\":\"v1\",\"reference\":{\"kind\":\"ReplicaSet\",\"namespace\":\"default\",\"name\":\"kairosdb-914055854\",\"uid\":\"d6c2f841-05a4-11e8-a8c4-080027435fb7\",\"apiVersion\":\"extensions\",\"resourceVersion\":\"1592\"}}\n", + "fluentbit.io/exclude-kairosdb": "true" + }, "ownerReferences": [ { "apiVersion": "extensions/v1beta1", From 82d89b702ab0248b358dfccf55c38c086ce4978d Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Thu, 25 Jun 2026 08:59:05 +0900 Subject: [PATCH 7/7] tests: runtime: Follow the change of annotation structure Signed-off-by: Hiroshi Hatake --- tests/runtime/data/kubernetes/out/kairosdb-914055854-b63vq.out | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/runtime/data/kubernetes/out/kairosdb-914055854-b63vq.out b/tests/runtime/data/kubernetes/out/kairosdb-914055854-b63vq.out index cec200b8d54..2ee5c24c462 100644 --- a/tests/runtime/data/kubernetes/out/kairosdb-914055854-b63vq.out +++ b/tests/runtime/data/kubernetes/out/kairosdb-914055854-b63vq.out @@ -1 +1 @@ -[1541358747.464754,{"_UID":"1000","_GID":"1000","_CAP_EFFECTIVE":"0","_SELINUX_CONTEXT":"unconfined\n","_AUDIT_LOGINUID":"1000","_SYSTEMD_OWNER_UID":"1000","_SYSTEMD_SLICE":"user-1000.slice","_SYSTEMD_USER_SLICE":"-.slice","_BOOT_ID":"e3abb4093a904a169e2ac21af241392f","_MACHINE_ID":"28d81df105e641e9b7d85e9d41433662","_HOSTNAME":"cube","PRIORITY":"6","CODE_FILE":"filter_kubernetes.c","CODE_LINE":"456","CODE_FUNC":"flb_test_systemd_logs","CONTAINER_NAME":"k8s_kairosdb_kairosdb-914055854-b63vq_default_d6c53deb-05a4-11e8-a8c4-080027435fb7_23","CONTAINER_TAG":"","CONTAINER_ID":"56e257661383","CONTAINER_ID_FULL":"56e257661383836fac4cd90a23ee8a7a02ee1538c8f35657d1a90f3de1065a22","MESSAGE":"08:58:45.839 [qtp151442075-47] DEBUG [HttpParser.java:281] - filled 157/157","KUBE_TEST":"2018","SYSLOG_IDENTIFIER":"flb-rt-filter_kubernetes","_TRANSPORT":"journal","_PID":"32318","_COMM":"flb-rt-filter_k","_EXE":"build/bin/flb-rt-filter_kubernetes","_CMDLINE":"bin/flb-rt-filter_kubernetes","_AUDIT_SESSION":"7417","_SYSTEMD_CGROUP":"/user.slice/user-1000.slice/session-7417.scope","_SYSTEMD_SESSION":"7417","_SYSTEMD_UNIT":"session-7417.scope","_SYSTEMD_INVOCATION_ID":"899c0f7241ae4db0af3cb4088dca76b0","_SOURCE_REALTIME_TIMESTAMP":"1541358747464738","kubernetes":{"pod_name":"kairosdb-914055854-b63vq","namespace_name":"default","pod_id":"d6c53deb-05a4-11e8-a8c4-080027435fb7","labels":{"name":"kairosdb","pod-template-hash":"914055854"},"annotations":{"kubernetes.io/created-by":"{\"kind\":\"SerializedReference\",\"apiVersion\":\"v1\",\"reference\":{\"kind\":\"ReplicaSet\",\"namespace\":\"default\",\"name\":\"kairosdb-914055854\",\"uid\":\"d6c2f841-05a4-11e8-a8c4-080027435fb7\",\"apiVersion\":\"extensions\",\"resourceVersion\":\"1592\"}}\n"},"host":"192.168.10.169","pod_ip":"10.2.39.12","container_name":"kairosdb","docker_id":"02d45318f220ad01109d13df31fbbb0668b87fdd06ef6607abfdecf5eba4b311","container_hash":"davradocker/docker-kairosdb@sha256:2ee07e3f3ba61b96597c78ab0aa7b837d771b375888b020da7a7316bb524b6e8","container_image":"davradocker/docker-kairosdb:1.1.1_9"}}] +[1541358747.464754,{"_UID":"1000","_GID":"1000","_CAP_EFFECTIVE":"0","_SELINUX_CONTEXT":"unconfined\n","_AUDIT_LOGINUID":"1000","_SYSTEMD_OWNER_UID":"1000","_SYSTEMD_SLICE":"user-1000.slice","_SYSTEMD_USER_SLICE":"-.slice","_BOOT_ID":"e3abb4093a904a169e2ac21af241392f","_MACHINE_ID":"28d81df105e641e9b7d85e9d41433662","_HOSTNAME":"cube","PRIORITY":"6","CODE_FILE":"filter_kubernetes.c","CODE_LINE":"456","CODE_FUNC":"flb_test_systemd_logs","CONTAINER_NAME":"k8s_kairosdb_kairosdb-914055854-b63vq_default_d6c53deb-05a4-11e8-a8c4-080027435fb7_23","CONTAINER_TAG":"","CONTAINER_ID":"56e257661383","CONTAINER_ID_FULL":"56e257661383836fac4cd90a23ee8a7a02ee1538c8f35657d1a90f3de1065a22","MESSAGE":"08:58:45.839 [qtp151442075-47] DEBUG [HttpParser.java:281] - filled 157/157","KUBE_TEST":"2018","SYSLOG_IDENTIFIER":"flb-rt-filter_kubernetes","_TRANSPORT":"journal","_PID":"32318","_COMM":"flb-rt-filter_k","_EXE":"build/bin/flb-rt-filter_kubernetes","_CMDLINE":"bin/flb-rt-filter_kubernetes","_AUDIT_SESSION":"7417","_SYSTEMD_CGROUP":"/user.slice/user-1000.slice/session-7417.scope","_SYSTEMD_SESSION":"7417","_SYSTEMD_UNIT":"session-7417.scope","_SYSTEMD_INVOCATION_ID":"899c0f7241ae4db0af3cb4088dca76b0","_SOURCE_REALTIME_TIMESTAMP":"1541358747464738","kubernetes":{"pod_name":"kairosdb-914055854-b63vq","namespace_name":"default","pod_id":"d6c53deb-05a4-11e8-a8c4-080027435fb7","labels":{"name":"kairosdb","pod-template-hash":"914055854"},"annotations":{"kubernetes.io/created-by":"{\"kind\":\"SerializedReference\",\"apiVersion\":\"v1\",\"reference\":{\"kind\":\"ReplicaSet\",\"namespace\":\"default\",\"name\":\"kairosdb-914055854\",\"uid\":\"d6c2f841-05a4-11e8-a8c4-080027435fb7\",\"apiVersion\":\"extensions\",\"resourceVersion\":\"1592\"}}\n","fluentbit.io/exclude-kairosdb":"true"},"host":"192.168.10.169","pod_ip":"10.2.39.12","container_name":"kairosdb","docker_id":"02d45318f220ad01109d13df31fbbb0668b87fdd06ef6607abfdecf5eba4b311","container_hash":"davradocker/docker-kairosdb@sha256:2ee07e3f3ba61b96597c78ab0aa7b837d771b375888b020da7a7316bb524b6e8","container_image":"davradocker/docker-kairosdb:1.1.1_9"}}]