Как я могу перезагрузить настройку программы Fluent-Bit с помощью C API во время выполнения?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как я могу перезагрузить настройку программы Fluent-Bit с помощью C API во время выполнения?

Сообщение Anonymous »

Моя проблема заключается в том, что я не знаю, как правильно изменить конфигурацию бегемота в моем приложении C ++ во время выполнения программы. Существует необходимость в любое время изменить читаемые файлы для плагина Tail. Файл конфигурации YAML выглядит следующим образом: < /p>
service:
flush: 1
log_level: info

pipeline:
inputs:
- name: tail
tag: test
path: /path/to/file

outputs:
- name: lib
match: test
format: json
< /code>
Я не нашел никакой информации об этом в документации, и в автоттестах недостаточно (это станет ясно, почему). Был аналогичный пример в аутотестатах с использованием функции flb_reload: < /p>
/* data/reload/yaml/processor.yaml */
void test_reload_yaml()
{
struct flb_cf *cf = NULL;
struct flb_cf *cf_opts;
struct flb_cf_section *section;
struct cfl_variant *ret;
flb_ctx_t *ctx;
int status;

/* create context */
cf_opts = flb_cf_create();
TEST_CHECK(cf_opts != NULL);

/* add a valid section (input) */
section = flb_cf_section_create(cf_opts, "INPUT", 5);
TEST_CHECK(section != NULL);

/* add property to the section recently created */
ret = flb_cf_section_property_add(cf_opts, section->properties, "name", 0, "dummy", 0);
TEST_CHECK(ret != NULL);

TEST_CHECK(mk_list_size(&cf_opts->inputs) == 1);

ctx = flb_create();
if (!TEST_CHECK(ctx != NULL)) {
TEST_MSG("flb_create failed");
exit(EXIT_FAILURE);
}

cf = ctx->config->cf_main;

status = flb_reload_reconstruct_cf(cf_opts, cf);
TEST_CHECK(status == 0);

/* Mimic operation like as service_configure() */
cf = flb_cf_create_from_file(cf, FLB_YAML);
TEST_CHECK(cf != NULL);

ctx->config->conf_path_file = flb_sds_create(FLB_YAML);
ctx->config->enable_hot_reload = FLB_TRUE;

status = flb_config_load_config_format(ctx->config, cf);
TEST_CHECK(status == 0);

/* Start the engine */
status = flb_start(ctx);
TEST_CHECK(status == 0);
TEST_CHECK(mk_list_size(&ctx->config->inputs) == 2);

sleep(2);

status = flb_reload(ctx, cf_opts);
TEST_CHECK(status == 0);

sleep(2);

/* flb context should be replaced with flb_reload() */
ctx = flb_context_get();

TEST_CHECK(mk_list_size(&ctx->config->cf_opts->inputs) == 1);
TEST_CHECK(mk_list_size(&ctx->config->inputs) == 2);
TEST_CHECK(mk_list_size(&ctx->config->filters) == 0);
TEST_CHECK(mk_list_size(&ctx->config->outputs) == 1);

flb_cf_destroy(cf_opts);

flb_stop(ctx);
flb_destroy(ctx);
}
< /code>
Проблема в том, что после вызова flb_reload в терминале выходит следующее сообщение (это неудивительно): < /p>
[2025/02/21 18:03:09] [error] [output:lib:lib.0] Callback is not set
[2025/02/21 18:03:09] [error] [output] failed to initialize 'lib' plugin
[2025/02/21 18:03:09] [error] [engine] output initialization failed
[2025/02/21 18:03:10] [ info] [input] pausing tail.0
[2025/02/21 18:03:10] [ info] [input] pausing tail.1
[2025/02/21 18:03:10] [error] [reload] loaded configuration contains error(s).
< /code>
Я не знаю, как передать этот обратный вызов в плагин LIB, не вызывая flb_output. Мой тестовый код выглядит так: < /p>
#include
#include
#include
#include

#include
#include
#include

extern "C"
{
#include
}

// Callback for lib plugin
int cb_record_getting(void* record, size_t size, void* data);

// Func taken from fluent-bit-bin
static int flb_service_conf_path_set(struct flb_config *config, char *file);

// Func taken from fluent-bit-bin
static struct flb_cf *service_configure(struct flb_cf *cf,
struct flb_config *config, char *file);

void flb_test();

const char* yaml_path = "/home/kuzmin/rep/fluent_test/conf2.yaml";

int ret;
int in_ffd;
int out_ffd;
flb_ctx_t *ctx;
struct flb_config *config;

int main()
{
flb_test();
return 0;
}

void flb_test()
{
ctx = flb_create();

in_ffd = flb_input(ctx, "tail", NULL);
flb_input_set(ctx, in_ffd, "tag", "audit_log", "path", "/var/log/audit/audit.log", NULL);

flb_lib_out_cb cb;
cb.cb = cb_record_getting;
cb.data = NULL;
out_ffd = flb_output(ctx, "lib", &cb); //transfer callback
flb_output_set(ctx, out_ffd, "match", "*", "format", "json", NULL);

ret = flb_start(ctx);

// we receive records from audit.log within 5 seconds
std::this_thread::sleep_for(std::chrono::seconds(5));

ctx = flb_context_get();
struct flb_cf* cf = NULL;
cf = service_configure(cf, ctx->config, (char*)yaml_path);
ctx->config->enable_hot_reload = true;

ctx = flb_context_get();

/* The code doesn't work. The callback is still not being installed.
This segment of the code does not work even if I remove the "lib"
section from the yaml file. If you remove "lib" from the yaml file,
there will be no "callback not installed" error, but the callback is
not called.*/

// cb.cb = cb_record_getting;
// cb.data = NULL;
// out_ffd = flb_output(ctx, "lib", &cb); //transfer callback
// flb_output_set(ctx, out_ffd, "match", "*", "format", "json", NULL);

flb_reload(ctx, cf);

ctx = flb_context_get();

// we should receive records from path within 10 seconds
std::this_thread::sleep_for(std::chrono::seconds(10));

flb_stop(ctx);

/* Stop the engine (5 seconds to flush remaining data) */
std::this_thread::sleep_for(std::chrono::seconds(5));

flb_destroy(ctx);
}

int cb_record_getting(void* record, size_t size, void* data)
{
std::string record_(static_cast(record), size);
std::cout cf_main = cf;
return cf;
}

< /code>
Это мой первый раз, когда я разработал приложение с использованием C-API Fluent-Bit, так что я не знаю, пожалуйста, помогите. < /p>
Я попытался использовать различные функции из библиотеки бегемота, но для некоторых из них есть только документация. Это было не тривиальное решение для меня.

Подробнее здесь: https://stackoverflow.com/questions/794 ... in-runtime
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»