diff --git a/Makefile b/Makefile index d0a7862b6..38412275c 100644 --- a/Makefile +++ b/Makefile @@ -107,6 +107,7 @@ # OT_INC : force the include path to libopentracing-c-wrapper # OT_LIB : force the lib path to libopentracing-c-wrapper # OT_RUNPATH : add RUNPATH for libopentracing-c-wrapper to haproxy executable +# OT_USE_VARS : allows the use of variables for the OpenTracing context # IGNOREGIT : ignore GIT commit versions if set. # VERSION : force haproxy version reporting. # SUBVERS : add a sub-version (eg: platform, model, ...). diff --git a/addons/ot/Makefile b/addons/ot/Makefile index ef48ce49d..0cc8c6aad 100644 --- a/addons/ot/Makefile +++ b/addons/ot/Makefile @@ -3,6 +3,7 @@ # OT_INC : force the include path to libopentracing-c-wrapper # OT_LIB : force the lib path to libopentracing-c-wrapper # OT_RUNPATH : add libopentracing-c-wrapper RUNPATH to haproxy executable +# OT_USE_VARS : allows the use of variables for the OpenTracing context OT_DEFINE = OT_CFLAGS = @@ -61,8 +62,13 @@ OPTIONS_OBJS += \ addons/ot/src/parser.o \ addons/ot/src/pool.o \ addons/ot/src/scope.o \ - addons/ot/src/util.o \ + addons/ot/src/util.o + +ifneq ($(OT_USE_VARS),) +OT_DEFINE = -DUSE_OT_VARS +OPTIONS_OBJS += \ addons/ot/src/vars.o +endif OPTIONS_CFLAGS += $(OT_CFLAGS) -Iaddons/ot/include OPTIONS_LDFLAGS += $(OT_LDFLAGS) diff --git a/addons/ot/include/filter.h b/addons/ot/include/filter.h index 0b36354e5..c97a0cc59 100644 --- a/addons/ot/include/filter.h +++ b/addons/ot/include/filter.h @@ -22,7 +22,7 @@ #define FLT_OT_FMT_NAME "'" FLT_OT_OPT_NAME "' : " #define FLT_OT_FMT_TYPE "'filter' : " -#define FTL_OT_VAR_UUID "sess", "ot", "uuid" +#define FLT_OT_VAR_UUID "sess", "ot", "uuid" #define FLT_OT_ALERT(f, ...) ha_alert(FLT_OT_FMT_TYPE FLT_OT_FMT_NAME f "\n", ##__VA_ARGS__) #define FLT_OT_CONDITION_IF "if" diff --git a/addons/ot/include/parser.h b/addons/ot/include/parser.h index 75a39cc0c..96939916d 100644 --- a/addons/ot/include/parser.h +++ b/addons/ot/include/parser.h @@ -65,14 +65,29 @@ FLT_OT_PARSE_GROUP_DEF( ID, 0, 1, 2, 2, "ot-group", " ") \ FLT_OT_PARSE_GROUP_DEF(SCOPES, 0, 0, 2, 0, "scopes", " ...") +#ifdef USE_OT_VARS +# define FLT_OT_PARSE_SCOPE_INJECT_HELP " [use-vars] [use-headers]" +# define FLT_OT_PARSE_SCOPE_EXTRACT_HELP " [use-vars | use-headers]" +#else +# define FLT_OT_PARSE_SCOPE_INJECT_HELP " [use-headers]" +# define FLT_OT_PARSE_SCOPE_EXTRACT_HELP " [use-headers]" +#endif + +/* + * In case the possibility of working with OpenTracing context via HAProxyu + * variables is not used, args_max member of the structure flt_ot_parse_data + * should be reduced for 'inject' keyword. However, this is not critical + * because in this case the 'use-vars' argument cannot be entered anyway, + * so I will not complicate it here with additional definitions. + */ #define FLT_OT_PARSE_SCOPE_DEFINES \ FLT_OT_PARSE_SCOPE_DEF( ID, 0, 1, 2, 2, "ot-scope", " ") \ FLT_OT_PARSE_SCOPE_DEF( SPAN, 0, 0, 2, 5, "span", " [] [root]") \ FLT_OT_PARSE_SCOPE_DEF( TAG, 1, 0, 3, 0, "tag", " ...") \ FLT_OT_PARSE_SCOPE_DEF( LOG, 1, 0, 3, 0, "log", " ...") \ FLT_OT_PARSE_SCOPE_DEF(BAGGAGE, 1, 4, 3, 0, "baggage", " ...") \ - FLT_OT_PARSE_SCOPE_DEF( INJECT, 1, 3, 2, 4, "inject", " [use-vars] [use-headers]") \ - FLT_OT_PARSE_SCOPE_DEF(EXTRACT, 0, 3, 2, 3, "extract", " [use-vars | use-headers]") \ + FLT_OT_PARSE_SCOPE_DEF( INJECT, 1, 3, 2, 4, "inject", FLT_OT_PARSE_SCOPE_INJECT_HELP) \ + FLT_OT_PARSE_SCOPE_DEF(EXTRACT, 0, 3, 2, 3, "extract", FLT_OT_PARSE_SCOPE_EXTRACT_HELP) \ FLT_OT_PARSE_SCOPE_DEF( FINISH, 0, 0, 2, 0, "finish", " ...") \ FLT_OT_PARSE_SCOPE_DEF( ACL, 0, 1, 3, 0, "acl", " [flags] [operator] ...") \ FLT_OT_PARSE_SCOPE_DEF( EVENT, 0, 0, 2, 0, "event", " [{ if | unless } ]") diff --git a/addons/ot/src/event.c b/addons/ot/src/event.c index 90b582876..0cb6b1d72 100644 --- a/addons/ot/src/event.c +++ b/addons/ot/src/event.c @@ -85,12 +85,14 @@ static int flt_ot_scope_run_span(struct stream *s, struct filter *f, struct chan if (conf_span->ctx_flags & (FLT_OT_CTX_USE_VARS | FLT_OT_CTX_USE_HEADERS)) { for (text_map = &(writer.text_map); i < text_map->count; i++) { +#ifdef USE_OT_VARS if (!(conf_span->ctx_flags & FLT_OT_CTX_USE_VARS)) /* Do nothing. */; else if (flt_ot_var_register(FLT_OT_VARS_SCOPE, conf_span->ctx_id, text_map->key[i], err) == -1) retval = FLT_OT_RET_ERROR; else if (flt_ot_var_set(s, FLT_OT_VARS_SCOPE, conf_span->ctx_id, text_map->key[i], text_map->value[i], dir, err) == -1) retval = FLT_OT_RET_ERROR; +#endif if (!(conf_span->ctx_flags & FLT_OT_CTX_USE_HEADERS)) /* Do nothing. */; @@ -184,7 +186,7 @@ int flt_ot_scope_run(struct stream *s, struct filter *f, struct channel *chn, st } list_for_each_entry(conf_ctx, &(conf_scope->contexts), list) { - struct otc_text_map *text_map; + struct otc_text_map *text_map = NULL; FLT_OT_DBG(3, "run context '%s' -> '%s'", conf_scope->id, conf_ctx->id); FLT_OT_DBG_CONF_CONTEXT("run context ", conf_ctx); @@ -195,8 +197,10 @@ int flt_ot_scope_run(struct stream *s, struct filter *f, struct channel *chn, st */ if (conf_ctx->flags & FLT_OT_CTX_USE_HEADERS) text_map = flt_ot_http_headers_get(chn, conf_ctx->id, conf_ctx->id_len, err); +#ifdef USE_OT_VARS else text_map = flt_ot_vars_get(s, FLT_OT_VARS_SCOPE, conf_ctx->id, dir, err); +#endif if (text_map != NULL) { if (flt_ot_scope_context_init(f->ctx, conf->tracer->tracer, conf_ctx->id, conf_ctx->id_len, text_map, dir, err) == NULL) @@ -314,7 +318,9 @@ int flt_ot_event_run(struct stream *s, struct filter *f, struct channel *chn, in retval = FLT_OT_RET_ERROR; } +#ifdef USE_OT_VARS flt_ot_vars_dump(s); +#endif flt_ot_http_headers_dump(chn); FLT_OT_DBG(3, "event = %d, chn = %p, s->req = %p, s->res = %p", event, chn, &(s->req), &(s->res)); diff --git a/addons/ot/src/filter.c b/addons/ot/src/filter.c index 04c4a67f1..bd71186a6 100644 --- a/addons/ot/src/filter.c +++ b/addons/ot/src/filter.c @@ -560,7 +560,9 @@ static int flt_ot_attach(struct stream *s, struct filter *f) FLT_OT_LOG(LOG_INFO, "%08x %08x", f->pre_analyzers, f->post_analyzers); +#ifdef USE_OT_VARS flt_ot_vars_dump(s); +#endif flt_ot_http_headers_dump(&(s->req)); FLT_OT_RETURN(FLT_OT_RET_OK); diff --git a/addons/ot/src/parser.c b/addons/ot/src/parser.c index e26ca18ee..ae09e027e 100644 --- a/addons/ot/src/parser.c +++ b/addons/ot/src/parser.c @@ -720,8 +720,10 @@ static int flt_ot_parse_cfg_scope_ctx(char **args, int cur_arg, char **err) if (strcmp(args[cur_arg], FLT_OT_PARSE_CTX_USE_HEADERS) == 0) flags = FLT_OT_CTX_USE_HEADERS; +#ifdef USE_OT_VARS else if (strcmp(args[cur_arg], FLT_OT_PARSE_CTX_USE_VARS) == 0) flags = FLT_OT_CTX_USE_VARS; +#endif else FLT_OT_PARSE_ERR(err, "'%s' : invalid context storage type", args[0]); @@ -939,8 +941,10 @@ static int flt_ot_parse_cfg_scope(const char *file, int linenum, char **args, in conf_ctx->flags = FLT_OT_CTX_USE_HEADERS; else if (strcmp(args[2], FLT_OT_PARSE_CTX_USE_HEADERS) == 0) conf_ctx->flags = FLT_OT_CTX_USE_HEADERS; +#ifdef USE_OT_VARS else if (strcmp(args[2], FLT_OT_PARSE_CTX_USE_VARS) == 0) conf_ctx->flags = FLT_OT_CTX_USE_VARS; +#endif else FLT_OT_PARSE_ERR(&err, "'%s' : invalid context storage type", args[2]); } diff --git a/addons/ot/src/scope.c b/addons/ot/src/scope.c index 8d70a08d6..112f9d545 100644 --- a/addons/ot/src/scope.c +++ b/addons/ot/src/scope.c @@ -120,8 +120,14 @@ struct flt_ot_runtime_context *flt_ot_runtime_context_init(struct stream *s, str (uint16_t)(retptr->uuid.clock_seq | UINT16_C(0x8000)), (uint64_t)retptr->uuid.node); - if (flt_ot_var_register(FTL_OT_VAR_UUID, err) != -1) - (void)flt_ot_var_set(s, FTL_OT_VAR_UUID, retptr->uuid.s, SMP_OPT_DIR_REQ, err); +#ifdef USE_OT_VARS + /* + * The HAProxy variable 'sess.ot.uuid' is registered here, + * after which its value is set to runtime context UUID. + */ + if (flt_ot_var_register(FLT_OT_VAR_UUID, err) != -1) + (void)flt_ot_var_set(s, FLT_OT_VAR_UUID, retptr->uuid.s, SMP_OPT_DIR_REQ, err); +#endif FLT_OT_DBG_RUNTIME_CONTEXT("session context: ", retptr); @@ -610,7 +616,9 @@ void flt_ot_scope_free_unused(struct flt_ot_runtime_context *rt_ctx, struct chan * the context in question should be deleted. */ (void)flt_ot_http_headers_remove(chn, ctx->id, NULL); +#ifdef USE_OT_VARS (void)flt_ot_vars_unset(rt_ctx->stream, FLT_OT_VARS_SCOPE, ctx->id, ctx->smp_opt_dir, NULL); +#endif flt_ot_scope_context_free(&ctx); }