45
45
% % See https://www.w3.org/TR/trace-context/#tracestate-header
46
46
% % for the limits and string requirements that make up the regexes
47
47
-define (MAX_MEMBERS , 32 ).
48
- % % re:compile("^(([a-z][_0-9a-z\-\*\/]{0,255})|([a-z0-9][_0-9a-z-*/]{0,240}@[a-z][_0-9a-z-*/]{0,13}))$")
49
- -define (KEY_MP , {re_pattern ,3 ,0 ,0 ,
50
- <<69 ,82 ,67 ,80 ,59 ,1 ,0 ,0 ,16 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,255 ,255 ,255 ,255 ,
51
- 255 ,255 ,255 ,255 ,0 ,0 ,0 ,0 ,0 ,0 ,3 ,0 ,0 ,0 ,64 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
52
- 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,131 ,0 ,247 ,
53
- 27 ,133 ,0 ,84 ,0 ,1 ,133 ,0 ,76 ,0 ,2 ,110 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
54
- 0 ,0 ,254 ,255 ,255 ,7 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,110 ,
55
- 0 ,0 ,0 ,0 ,0 ,164 ,255 ,3 ,0 ,0 ,0 ,128 ,254 ,255 ,255 ,7 ,0 ,0 ,0 ,0 ,0 ,
56
- 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,104 ,0 ,0 ,0 ,255 ,120 ,0 ,76 ,119 ,0 ,
57
- 155 ,133 ,0 ,149 ,0 ,3 ,110 ,0 ,0 ,0 ,0 ,0 ,0 ,255 ,3 ,0 ,0 ,0 ,0 ,254 ,
58
- 255 ,255 ,7 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,110 ,0 ,0 ,0 ,0 ,
59
- 0 ,164 ,255 ,3 ,0 ,0 ,0 ,128 ,254 ,255 ,255 ,7 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
60
- 0 ,0 ,0 ,0 ,0 ,0 ,0 ,109 ,0 ,0 ,0 ,240 ,29 ,64 ,110 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
61
- 0 ,0 ,0 ,0 ,254 ,255 ,255 ,7 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
62
- 110 ,0 ,0 ,0 ,0 ,0 ,164 ,255 ,3 ,0 ,0 ,0 ,128 ,254 ,255 ,255 ,7 ,0 ,0 ,0 ,
63
- 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,104 ,0 ,0 ,0 ,13 ,120 ,0 ,149 ,120 ,
64
- 0 ,239 ,25 ,120 ,0 ,247 ,0 >>}).
65
- % % re:compile("^([ -+--<>-~]{0,255}[!-+--<>-~])$")
66
- -define (VALUE_MP , {re_pattern ,1 ,0 ,0 ,
67
- <<69 ,82 ,67 ,80 ,152 ,0 ,0 ,0 ,16 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,255 ,255 ,255 ,
68
- 255 ,255 ,255 ,255 ,255 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,64 ,0 ,0 ,0 ,0 ,0 ,
69
- 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,131 ,0 ,
70
- 84 ,27 ,133 ,0 ,76 ,0 ,1 ,110 ,0 ,0 ,0 ,0 ,255 ,239 ,255 ,223 ,255 ,
71
- 255 ,255 ,255 ,255 ,255 ,255 ,127 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
72
- 0 ,0 ,0 ,104 ,0 ,0 ,0 ,255 ,110 ,0 ,0 ,0 ,0 ,254 ,239 ,255 ,223 ,255 ,
73
- 255 ,255 ,255 ,255 ,255 ,255 ,127 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
74
- 0 ,0 ,0 ,120 ,0 ,76 ,25 ,120 ,0 ,84 ,0 >>}).
48
+ % %
49
+ -define (KEY_MP , persistent_term :get ({otel_tracestate , key_mp })).
50
+ -define (VALUE_MP , persistent_term :get ({otel_tracestate , value_mp })).
75
51
76
52
-define (IS_STRING , (is_atom (Key ) orelse is_string (Key ) orelse is_binary (Key ))).
77
53
78
54
-spec new () -> t ().
79
55
new () ->
56
+ % % api had no setup so we have to ensure the persistent term for tracestate
57
+ % % regexes are setup each time `new' is called
58
+ ensure_regex_pterms (),
59
+
80
60
# tracestate {members = []}.
81
61
82
62
-spec new ([{unicode :latin1_chardata (), unicode :latin1_chardata ()}]) -> t ().
83
63
new (List ) ->
64
+ ensure_regex_pterms (),
84
65
Members = [Element || {Key , Value }= Element <- List , is_valid (Key , Value )],
85
66
# tracestate {members = Members }.
86
67
@@ -119,6 +100,7 @@ update(Key, Value, Tracestate=#tracestate{members=TracestateList}) ->
119
100
decode_header (undefined ) ->
120
101
new ();
121
102
decode_header (Value ) ->
103
+ ensure_regex_pterms (),
122
104
# tracestate {members = parse_pairs (string :lexemes (Value , [$, ]))}.
123
105
124
106
-spec encode_header (t ()) -> unicode :latin1_binary ().
@@ -130,6 +112,18 @@ encode_header(_) ->
130
112
131
113
% %
132
114
115
+ ensure_regex_pterms () ->
116
+ try
117
+ _ = ? KEY_MP
118
+ catch
119
+ error :badarg ->
120
+ {ok , KeyMP } = re :compile (" ^(([a-z][_0-9a-z\-\*\/ ]{0,255})|([a-z0-9][_0-9a-z-*/]{0,240}@[a-z][_0-9a-z-*/]{0,13}))$" ),
121
+ {ok , ValueMP } = re :compile (" ^([ -+--<>-~] {0,255}[!-+--<>-~] )$" ),
122
+
123
+ persistent_term :put ({otel_tracestate , key_mp }, KeyMP ),
124
+ persistent_term :put ({otel_tracestate , value_mp }, ValueMP )
125
+ end .
126
+
133
127
is_valid (Key , Value ) ->
134
128
try
135
129
re :run (Key , ? KEY_MP , [{capture , none }]) =:= match
0 commit comments