@@ -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,30 @@ 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_HISTO && carbon -> namespacing .histo ) {
77+ memcpy (ptr , carbon -> namespacing .histo , carbon -> namespacing .histo_len );
78+ ptr += carbon -> namespacing .histo_len ;
79+ * ptr ++ = '.' ;
80+ } else if (type == BRUBECK_MT_GAUGE && carbon -> namespacing .gauge ) {
81+ memcpy (ptr , carbon -> namespacing .gauge , carbon -> namespacing .gauge_len );
82+ ptr += carbon -> namespacing .gauge_len ;
83+ * ptr ++ = '.' ;
84+ }
85+
6186 memcpy (ptr , key , key_len );
6287 ptr += key_len ;
6388 * ptr ++ = ' ' ;
@@ -103,18 +128,61 @@ static inline size_t pickle1_double(char *ptr, void *_src)
103128}
104129
105130static void pickle1_push (
106- struct pickler * buf ,
131+ struct brubeck_carbon * carbon ,
132+ uint8_t type ,
107133 const char * key ,
108134 uint8_t key_len ,
109- uint32_t timestamp ,
110135 value_t value )
111136{
137+ uint8_t namespaced_key_len = 0 ;
138+ char * type_namespace = NULL ;
139+ size_t type_namespace_len = 0 ;
140+ struct pickler * buf = & carbon -> pickler ;
112141 char * ptr = buf -> ptr + buf -> pos ;
113142
143+ if (carbon -> namespacing .global ) {
144+ // the global namespace plus the "." character
145+ namespaced_key_len += carbon -> namespacing .global_len + 1 ;
146+ }
147+
148+ if ((type == BRUBECK_MT_COUNTER || type == BRUBECK_MT_METER ) && carbon -> namespacing .counter ) {
149+ type_namespace = carbon -> namespacing .counter ;
150+ type_namespace_len = carbon -> namespacing .counter_len ;
151+ // the counter namespace plus the "." character
152+ namespaced_key_len += carbon -> namespacing .counter_len + 1 ;
153+ } else if (type == BRUBECK_MT_TIMER && carbon -> namespacing .timer ) {
154+ type_namespace = carbon -> namespacing .timer ;
155+ type_namespace_len = carbon -> namespacing .timer_len ;
156+ // the counter namespace plus the "." character
157+ namespaced_key_len += carbon -> namespacing .timer_len + 1 ;
158+ } else if (type == BRUBECK_MT_HISTO && carbon -> namespacing .histo ) {
159+ type_namespace = carbon -> namespacing .histo ;
160+ type_namespace_len = carbon -> namespacing .histo_len ;
161+ // the counter namespace plus the "." character
162+ namespaced_key_len += carbon -> namespacing .histo_len + 1 ;
163+ } else if (type == BRUBECK_MT_GAUGE && carbon -> namespacing .gauge ) {
164+ type_namespace = carbon -> namespacing .gauge ;
165+ type_namespace_len = carbon -> namespacing .gauge_len ;
166+ // the counter namespace plus the "." character
167+ namespaced_key_len += carbon -> namespacing .gauge_len + 1 ;
168+ }
169+
170+ namespaced_key_len += key_len ;
171+
114172 * ptr ++ = '(' ;
115173
116174 * ptr ++ = 'U' ;
117- * ptr ++ = key_len ;
175+ * ptr ++ = namespaced_key_len ;
176+ if (carbon -> namespacing .global ) {
177+ memcpy (ptr , carbon -> namespacing .global , carbon -> namespacing .global_len );
178+ ptr += carbon -> namespacing .global_len ;
179+ * ptr ++ = '.' ;
180+ }
181+ if (type_namespace ) {
182+ memcpy (ptr , type_namespace , type_namespace_len );
183+ ptr += type_namespace_len ;
184+ * ptr ++ = '.' ;
185+ }
118186 memcpy (ptr , key , key_len );
119187 ptr += key_len ;
120188
@@ -123,7 +191,7 @@ static void pickle1_push(
123191
124192 * ptr ++ = '(' ;
125193
126- ptr += pickle1_int32 (ptr , & timestamp );
194+ ptr += pickle1_int32 (ptr , & carbon -> backend . tick_time );
127195 ptr += pickle1_double (ptr , & value );
128196
129197 * ptr ++ = 't' ;
@@ -177,6 +245,7 @@ static void pickle1_flush(void *backend)
177245}
178246
179247static void pickle1_each (
248+ uint8_t type ,
180249 const char * key ,
181250 value_t value ,
182251 void * backend )
@@ -192,23 +261,32 @@ static void pickle1_each(
192261 if (!carbon_is_connected (carbon ))
193262 return ;
194263
195- pickle1_push (& carbon -> pickler , key , key_len ,
196- carbon -> backend .tick_time , value );
264+ pickle1_push (carbon , type , key , key_len , value );
197265}
198266
199267struct brubeck_backend *
200268brubeck_carbon_new (struct brubeck_server * server , json_t * settings , int shard_n )
201269{
202270 struct brubeck_carbon * carbon = xcalloc (1 , sizeof (struct brubeck_carbon ));
203271 char * address ;
272+ char * global_prefix = NULL ,
273+ * prefix_counter = NULL ,
274+ * prefix_timer = NULL ,
275+ * prefix_histo = NULL ,
276+ * prefix_gauge = NULL ;
204277 int port , frequency , pickle = 0 ;
205278
206279 json_unpack_or_die (settings ,
207- "{s:s, s:i, s?:b, s:i}" ,
280+ "{s:s, s:i, s?:b, s:i, s?:s, s?:s, s?:s, s?:s, s?:s }" ,
208281 "address" , & address ,
209282 "port" , & port ,
210283 "pickle" , & pickle ,
211- "frequency" , & frequency );
284+ "frequency" , & frequency ,
285+ "global_prefix" , & global_prefix ,
286+ "prefix_counter" , & prefix_counter ,
287+ "prefix_timer" , & prefix_timer ,
288+ "prefix_histo" , & prefix_histo ,
289+ "prefix_gauge" , & prefix_gauge );
212290
213291 carbon -> backend .type = BRUBECK_BACKEND_CARBON ;
214292 carbon -> backend .shard_n = shard_n ;
@@ -225,6 +303,31 @@ brubeck_carbon_new(struct brubeck_server *server, json_t *settings, int shard_n)
225303 carbon -> backend .flush = NULL ;
226304 }
227305
306+ if (global_prefix ) {
307+ carbon -> namespacing .global = global_prefix ;
308+ carbon -> namespacing .global_len = strlen (global_prefix );
309+ }
310+
311+ if (prefix_counter ) {
312+ carbon -> namespacing .counter = prefix_counter ;
313+ carbon -> namespacing .counter_len = strlen (prefix_counter );
314+ }
315+
316+ if (prefix_timer ) {
317+ carbon -> namespacing .timer = prefix_timer ;
318+ carbon -> namespacing .timer_len = strlen (prefix_timer );
319+ }
320+
321+ if (prefix_histo ) {
322+ carbon -> namespacing .histo = prefix_histo ;
323+ carbon -> namespacing .histo_len = strlen (prefix_histo );
324+ }
325+
326+ if (prefix_gauge ) {
327+ carbon -> namespacing .gauge = prefix_gauge ;
328+ carbon -> namespacing .gauge_len = strlen (prefix_gauge );
329+ }
330+
228331 carbon -> backend .sample_freq = frequency ;
229332 carbon -> backend .server = server ;
230333 carbon -> out_sock = -1 ;
0 commit comments