Моя проблема заключается в том, что я не знаю, как правильно изменить конфигурацию бегемота в моем приложении 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
Как я могу перезагрузить настройку программы Fluent-Bit с помощью C API во время выполнения? ⇐ C++
Программы на C++. Форум разработчиков
1740256405
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>
Я попытался использовать различные функции из библиотеки бегемота, но для некоторых из них есть только документация. Это было не тривиальное решение для меня.
Подробнее здесь: [url]https://stackoverflow.com/questions/79460262/how-can-i-reload-configure-of-fluent-bit-program-with-c-api-in-runtime[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия