summaryrefslogtreecommitdiffstats
path: root/addons/ot/include/parser.h
blob: 53e414b355db6e57736b23ea95654ee2cd48fc0d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/***
 * Copyright 2020 HAProxy Technologies
 *
 * This file is part of the HAProxy OpenTracing filter.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
#ifndef _OPENTRACING_PARSER_H_
#define _OPENTRACING_PARSER_H_

#define FLT_OT_SCOPE                        "OT"

/*
 * filter FLT_OT_OPT_NAME FLT_OT_OPT_FILTER_ID <FLT_OT_OPT_FILTER_ID_DEFAULT> FLT_OT_OPT_CONFIG <file>
 */
#define FLT_OT_OPT_NAME                     "opentracing"
#define FLT_OT_OPT_FILTER_ID                "id"
#define FLT_OT_OPT_FILTER_ID_DEFAULT        "ot-filter"
#define FLT_OT_OPT_CONFIG                   "config"

#define FLT_OT_PARSE_SECTION_TRACER_ID      "ot-tracer"
#define FLT_OT_PARSE_SECTION_GROUP_ID       "ot-group"
#define FLT_OT_PARSE_SECTION_SCOPE_ID       "ot-scope"

#define FLT_OT_PARSE_SPAN_ROOT              "root"
#define FLT_OT_PARSE_SPAN_REF_CHILD         "child-of"
#define FLT_OT_PARSE_SPAN_REF_FOLLOWS       "follows-from"
#define FLT_OT_PARSE_CTX_AUTONAME           "-"
#define FLT_OT_PARSE_CTX_IGNORE_NAME        '-'
#define FLT_OT_PARSE_CTX_USE_HEADERS        "use-headers"
#define FLT_OT_PARSE_CTX_USE_VARS           "use-vars"
#define FLT_OT_PARSE_OPTION_HARDERR         "hard-errors"
#define FLT_OT_PARSE_OPTION_DISABLED        "disabled"
#define FLT_OT_PARSE_OPTION_NOLOGNORM       "dontlog-normal"

/*
 * A description of the macro arguments can be found in the structure
 * flt_ot_parse_data definition
 */
#define FLT_OT_PARSE_TRACER_DEFINES                                                                                                                          \
	FLT_OT_PARSE_TRACER_DEF(         ID, 0, CHAR, 2, 2, "ot-tracer",   " <name>")                                                                           \
	FLT_OT_PARSE_TRACER_DEF(        ACL, 0, CHAR, 3, 0, "acl",         " <name> <criterion> [flags] [operator] <value> ...")                                \
	FLT_OT_PARSE_TRACER_DEF(        LOG, 0, CHAR, 2, 0, "log",         " { global | <addr> [len <len>] [format <fmt>] <facility> [<level> [<minlevel>]] }") \
	FLT_OT_PARSE_TRACER_DEF(     CONFIG, 0, NONE, 2, 2, "config",      " <file>")                                                                           \
	FLT_OT_PARSE_TRACER_DEF(     PLUGIN, 0, NONE, 2, 2, "plugin",      " <file>")                                                                           \
	FLT_OT_PARSE_TRACER_DEF(     GROUPS, 0, NONE, 2, 0, "groups",      " <name> ...")                                                                       \
	FLT_OT_PARSE_TRACER_DEF(     SCOPES, 0, NONE, 2, 0, "scopes",      " <name> ...")                                                                       \
	FLT_OT_PARSE_TRACER_DEF( RATE_LIMIT, 0, NONE, 2, 2, "rate-limit",  " <value>")                                                                          \
	FLT_OT_PARSE_TRACER_DEF(     OPTION, 0, NONE, 2, 2, "option",      " { disabled | dontlog-normal | hard-errors }")                                      \
	FLT_OT_PARSE_TRACER_DEF(DEBUG_LEVEL, 0, NONE, 2, 2, "debug-level", " <value>")

#define FLT_OT_PARSE_GROUP_DEFINES                                        \
	FLT_OT_PARSE_GROUP_DEF(    ID, 0, CHAR, 2, 2, "ot-group", " <name>") \
	FLT_OT_PARSE_GROUP_DEF(SCOPES, 0, NONE, 2, 0, "scopes",   " <name> ...")

#ifdef USE_OT_VARS
#  define FLT_OT_PARSE_SCOPE_INJECT_HELP    " <name-prefix> [use-vars] [use-headers]"
#  define FLT_OT_PARSE_SCOPE_EXTRACT_HELP   " <name-prefix> [use-vars | use-headers]"
#else
#  define FLT_OT_PARSE_SCOPE_INJECT_HELP    " <name-prefix> [use-headers]"
#  define FLT_OT_PARSE_SCOPE_EXTRACT_HELP   " <name-prefix> [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, CHAR, 2, 2, "ot-scope", " <name>")                                            \
	FLT_OT_PARSE_SCOPE_DEF(   SPAN, 0, NONE, 2, 5, "span",     " <name> [<reference>] [root]")                       \
	FLT_OT_PARSE_SCOPE_DEF(    TAG, 1, NONE, 3, 0, "tag",      " <name> <sample> ...")                               \
	FLT_OT_PARSE_SCOPE_DEF(    LOG, 1, NONE, 3, 0, "log",      " <name> <sample> ...")                               \
	FLT_OT_PARSE_SCOPE_DEF(BAGGAGE, 1,  VAR, 3, 0, "baggage",  " <name> <sample> ...")                               \
	FLT_OT_PARSE_SCOPE_DEF( INJECT, 1,  CTX, 2, 4, "inject",   FLT_OT_PARSE_SCOPE_INJECT_HELP)                       \
	FLT_OT_PARSE_SCOPE_DEF(EXTRACT, 0,  CTX, 2, 3, "extract",  FLT_OT_PARSE_SCOPE_EXTRACT_HELP)                      \
	FLT_OT_PARSE_SCOPE_DEF( FINISH, 0, NONE, 2, 0, "finish",   " <name> ...")                                        \
	FLT_OT_PARSE_SCOPE_DEF(    ACL, 0, CHAR, 3, 0, "acl",      " <name> <criterion> [flags] [operator] <value> ...") \
	FLT_OT_PARSE_SCOPE_DEF(  EVENT, 0, NONE, 2, 0, "event",    " <name> [{ if | unless } <condition>]")

enum FLT_OT_PARSE_INVCHAR_enum {
	FLT_OT_PARSE_INVALID_NONE,
	FLT_OT_PARSE_INVALID_CHAR,
	FLT_OT_PARSE_INVALID_DOM,
	FLT_OT_PARSE_INVALID_CTX,
	FLT_OT_PARSE_INVALID_VAR,
};

enum FLT_OT_PARSE_TRACER_enum {
#define FLT_OT_PARSE_TRACER_DEF(a,b,c,d,e,f,g)   FLT_OT_PARSE_TRACER_##a,
	FLT_OT_PARSE_TRACER_DEFINES
#undef FLT_OT_PARSE_TRACER_DEF
};

enum FLT_OT_PARSE_GROUP_enum {
#define FLT_OT_PARSE_GROUP_DEF(a,b,c,d,e,f,g)   FLT_OT_PARSE_GROUP_##a,
	FLT_OT_PARSE_GROUP_DEFINES
#undef FLT_OT_PARSE_GROUP_DEF
};

enum FLT_OT_PARSE_SCOPE_enum {
#define FLT_OT_PARSE_SCOPE_DEF(a,b,c,d,e,f,g)   FLT_OT_PARSE_SCOPE_##a,
	FLT_OT_PARSE_SCOPE_DEFINES
#undef FLT_OT_PARSE_SCOPE_DEF
};

enum FLT_OT_CTX_USE_enum {
	FLT_OT_CTX_USE_VARS    = 1 << 0,
	FLT_OT_CTX_USE_HEADERS = 1 << 1,
};

struct flt_ot_parse_data {
	int         keyword;       /* Keyword index. */
	bool        flag_check_id; /* Whether the group ID must be defined for the keyword. */
	int         check_name;    /* Checking allowed characters in the name. */
	int         args_min;      /* The minimum number of arguments required. */
	int         args_max;      /* The maximum number of arguments allowed. */
	const char *name;          /* Keyword name. */
	const char *usage;         /* Usage text to be printed in case of an error. */
};

#define FLT_OT_PARSE_WARNING(f, ...) \
	ha_warning("parsing [%s:%d] : " FLT_OT_FMT_TYPE FLT_OT_FMT_NAME "'" f "'\n", ##__VA_ARGS__);
#define FLT_OT_PARSE_ALERT(f, ...)                                                                         \
	do {                                                                                               \
		ha_alert("parsing [%s:%d] : " FLT_OT_FMT_TYPE FLT_OT_FMT_NAME "'" f "'\n", ##__VA_ARGS__); \
                                                                                                           \
		retval |= ERR_ABORT | ERR_ALERT;                                                           \
	} while (0)
#define FLT_OT_POST_PARSE_ALERT(f, ...) \
	FLT_OT_PARSE_ALERT(f, flt_ot_current_config->cfg_file, ##__VA_ARGS__)

#define FLT_OT_PARSE_ERR(e,f, ...)                              \
	do {                                                    \
		if (*(e) == NULL)                               \
			(void)memprintf((e), f, ##__VA_ARGS__); \
                                                                \
		retval |= ERR_ABORT | ERR_ALERT;                \
	} while (0)
#define FLT_OT_PARSE_IFERR_ALERT()                            \
	do {                                                  \
		if (err == NULL)                              \
			break;                                \
                                                              \
		FLT_OT_PARSE_ALERT("%s", file, linenum, err); \
		FLT_OT_ERR_FREE(err);                         \
	} while (0)

#endif /* _OPENTRACING_PARSER_H_ */

/*
 * Local variables:
 *  c-indent-level: 8
 *  c-basic-offset: 8
 * End:
 *
 * vi: noexpandtab shiftwidth=8 tabstop=8
 */