@@ -45,6 +45,7 @@ static void carbon_disconnect(struct brubeck_carbon *self)
4545}
4646
4747static void plaintext_each (
48+ uint8_t type ,
4849 const char * key ,
4950 value_t value ,
5051 void * backend )
@@ -58,6 +59,26 @@ static void plaintext_each(
5859 if (!carbon_is_connected (carbon ))
5960 return ;
6061
62+ if (carbon -> namespacing .global ) {
63+ memcpy (ptr , carbon -> namespacing .global , carbon -> namespacing .global_len );
64+ ptr += carbon -> namespacing .global_len ;
65+ * ptr ++ = '.' ;
66+ }
67+
68+ if ((type == BRUBECK_MT_COUNTER || type == BRUBECK_MT_METER ) && carbon -> namespacing .counter ) {
69+ memcpy (ptr , carbon -> namespacing .counter , carbon -> namespacing .counter_len );
70+ ptr += carbon -> namespacing .counter_len ;
71+ * ptr ++ = '.' ;
72+ } else if (type == BRUBECK_MT_TIMER && carbon -> namespacing .timer ) {
73+ memcpy (ptr , carbon -> namespacing .timer , carbon -> namespacing .timer_len );
74+ ptr += carbon -> namespacing .timer_len ;
75+ * ptr ++ = '.' ;
76+ } else if (type == BRUBECK_MT_GAUGE && carbon -> namespacing .gauge ) {
77+ memcpy (ptr , carbon -> namespacing .gauge , carbon -> namespacing .gauge_len );
78+ ptr += carbon -> namespacing .gauge_len ;
79+ * ptr ++ = '.' ;
80+ }
81+
6182 memcpy (ptr , key , key_len );
6283 ptr += key_len ;
6384 * ptr ++ = ' ' ;
@@ -103,18 +124,56 @@ static inline size_t pickle1_double(char *ptr, void *_src)
103124}
104125
105126static void pickle1_push (
106- struct pickler * buf ,
127+ struct brubeck_carbon * carbon ,
128+ uint8_t type ,
107129 const char * key ,
108130 uint8_t key_len ,
109- uint32_t timestamp ,
110131 value_t value )
111132{
133+ uint8_t namespaced_key_len = 0 ;
134+ char * type_namespace = NULL ;
135+ size_t type_namespace_len = 0 ;
136+ struct pickler * buf = & carbon -> pickler ;
112137 char * ptr = buf -> ptr + buf -> pos ;
113138
139+ if (carbon -> namespacing .global ) {
140+ // the global namespace plus the "." character
141+ namespaced_key_len += carbon -> namespacing .global_len + 1 ;
142+ }
143+
144+ if ((type == BRUBECK_MT_COUNTER || type == BRUBECK_MT_METER ) && carbon -> namespacing .counter ) {
145+ type_namespace = carbon -> namespacing .counter ;
146+ type_namespace_len = carbon -> namespacing .counter_len ;
147+ // the counter namespace plus the "." character
148+ namespaced_key_len += carbon -> namespacing .counter_len + 1 ;
149+ } else if (type == BRUBECK_MT_TIMER && carbon -> namespacing .timer ) {
150+ type_namespace = carbon -> namespacing .timer ;
151+ type_namespace_len = carbon -> namespacing .timer_len ;
152+ // the counter namespace plus the "." character
153+ namespaced_key_len += carbon -> namespacing .timer_len + 1 ;
154+ } else if (type == BRUBECK_MT_GAUGE && carbon -> namespacing .gauge ) {
155+ type_namespace = carbon -> namespacing .gauge ;
156+ type_namespace_len = carbon -> namespacing .gauge_len ;
157+ // the counter namespace plus the "." character
158+ namespaced_key_len += carbon -> namespacing .gauge_len + 1 ;
159+ }
160+
161+ namespaced_key_len += key_len ;
162+
114163 * ptr ++ = '(' ;
115164
116165 * ptr ++ = 'U' ;
117- * ptr ++ = key_len ;
166+ * ptr ++ = namespaced_key_len ;
167+ if (carbon -> namespacing .global ) {
168+ memcpy (ptr , carbon -> namespacing .global , carbon -> namespacing .global_len );
169+ ptr += carbon -> namespacing .global_len ;
170+ * ptr ++ = '.' ;
171+ }
172+ if (type_namespace ) {
173+ memcpy (ptr , type_namespace , type_namespace_len );
174+ ptr += type_namespace_len ;
175+ * ptr ++ = '.' ;
176+ }
118177 memcpy (ptr , key , key_len );
119178 ptr += key_len ;
120179
@@ -123,7 +182,7 @@ static void pickle1_push(
123182
124183 * ptr ++ = '(' ;
125184
126- ptr += pickle1_int32 (ptr , & timestamp );
185+ ptr += pickle1_int32 (ptr , & carbon -> backend . tick_time );
127186 ptr += pickle1_double (ptr , & value );
128187
129188 * ptr ++ = 't' ;
@@ -177,6 +236,7 @@ static void pickle1_flush(void *backend)
177236}
178237
179238static void pickle1_each (
239+ uint8_t type ,
180240 const char * key ,
181241 value_t value ,
182242 void * backend )
@@ -192,23 +252,27 @@ static void pickle1_each(
192252 if (!carbon_is_connected (carbon ))
193253 return ;
194254
195- pickle1_push (& carbon -> pickler , key , key_len ,
196- carbon -> backend .tick_time , value );
255+ pickle1_push (carbon , type , key , key_len , value );
197256}
198257
199258struct brubeck_backend *
200259brubeck_carbon_new (struct brubeck_server * server , json_t * settings , int shard_n )
201260{
202261 struct brubeck_carbon * carbon = xcalloc (1 , sizeof (struct brubeck_carbon ));
203262 char * address ;
263+ char * global_prefix = NULL , * prefix_counter = NULL , * prefix_timer = NULL , * prefix_gauge = NULL ;
204264 int port , frequency , pickle = 0 ;
205265
206266 json_unpack_or_die (settings ,
207- "{s:s, s:i, s?:b, s:i}" ,
267+ "{s:s, s:i, s?:b, s:i, s?:s, s?:s, s?:s, s?:s }" ,
208268 "address" , & address ,
209269 "port" , & port ,
210270 "pickle" , & pickle ,
211- "frequency" , & frequency );
271+ "frequency" , & frequency ,
272+ "global_prefix" , & global_prefix ,
273+ "prefix_counter" , & prefix_counter ,
274+ "prefix_timer" , & prefix_timer ,
275+ "prefix_gauge" , & prefix_gauge );
212276
213277 carbon -> backend .type = BRUBECK_BACKEND_CARBON ;
214278 carbon -> backend .shard_n = shard_n ;
@@ -225,6 +289,26 @@ brubeck_carbon_new(struct brubeck_server *server, json_t *settings, int shard_n)
225289 carbon -> backend .flush = NULL ;
226290 }
227291
292+ if (global_prefix ) {
293+ carbon -> namespacing .global = global_prefix ;
294+ carbon -> namespacing .global_len = strlen (global_prefix );
295+ }
296+
297+ if (prefix_counter ) {
298+ carbon -> namespacing .counter = prefix_counter ;
299+ carbon -> namespacing .counter_len = strlen (prefix_counter );
300+ }
301+
302+ if (prefix_timer ) {
303+ carbon -> namespacing .timer = prefix_timer ;
304+ carbon -> namespacing .timer_len = strlen (prefix_timer );
305+ }
306+
307+ if (prefix_gauge ) {
308+ carbon -> namespacing .gauge = prefix_gauge ;
309+ carbon -> namespacing .gauge_len = strlen (prefix_gauge );
310+ }
311+
228312 carbon -> backend .sample_freq = frequency ;
229313 carbon -> backend .server = server ;
230314 carbon -> out_sock = -1 ;
0 commit comments