X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fwrite_kafka.c;h=0f28ed0d91a71acf64a7edb9db43248c883505db;hb=893f08e3e00a142fc7f0670c7992ff72b54f30fb;hp=81ca128f327a5b8fbb40700aefcf8a5d190fd215;hpb=6743e8a4e1bd0b627fee3a3e51226c07c3facbcb;p=collectd.git diff --git a/src/write_kafka.c b/src/write_kafka.c index 81ca128f..0f28ed0d 100644 --- a/src/write_kafka.c +++ b/src/write_kafka.c @@ -78,6 +78,15 @@ static uint32_t kafka_hash(const char *keydata, size_t keylen) return hash; } +/* 31 bit -> 4 byte -> 8 byte hex string + null byte */ +#define KAFKA_RANDOM_KEY_SIZE 9 +#define KAFKA_RANDOM_KEY_BUFFER (char[KAFKA_RANDOM_KEY_SIZE]) {""} +static char *kafka_random_key(char buffer[static KAFKA_RANDOM_KEY_SIZE]) +{ + ssnprintf(buffer, KAFKA_RANDOM_KEY_SIZE, "%08lX", (unsigned long) mrand48()); + return buffer; +} + static int32_t kafka_partition(const rd_kafka_topic_t *rkt, const void *keydata, size_t keylen, int32_t partition_cnt, void *p, void *m) @@ -203,11 +212,10 @@ static int kafka_write(const data_set_t *ds, /* {{{ */ return -1; } - key = ctx->key; - if (key != NULL) - keylen = strlen (key); - else - keylen = 0; + key = (ctx->key != NULL) + ? ctx->key + : kafka_random_key(KAFKA_RANDOM_KEY_BUFFER); + keylen = strlen (key); rd_kafka_produce(ctx->topic, RD_KAFKA_PARTITION_UA, RD_KAFKA_MSG_F_COPY, buffer, blen, @@ -245,7 +253,6 @@ static void kafka_config_topic(rd_kafka_conf_t *conf, oconfig_item_t *ci) /* {{{ char *val; char callback_name[DATA_MAX_NAME_LEN]; char errbuf[1024]; - user_data_t ud; oconfig_item_t *child; rd_kafka_conf_res_t ret; @@ -320,8 +327,12 @@ static void kafka_config_topic(rd_kafka_conf_t *conf, oconfig_item_t *ci) /* {{{ } } else if (strcasecmp ("Key", child->key) == 0) { - cf_util_get_string (child, &tctx->key); - assert (tctx->key != NULL); + if (cf_util_get_string (child, &tctx->key) != 0) + continue; + if (strcasecmp ("Random", tctx->key) == 0) { + sfree(tctx->key); + tctx->key = strdup (kafka_random_key (KAFKA_RANDOM_KEY_BUFFER)); + } } else if (strcasecmp ("Format", child->key) == 0) { status = cf_util_get_string(child, &key); if (status != 0) @@ -384,8 +395,10 @@ static void kafka_config_topic(rd_kafka_conf_t *conf, oconfig_item_t *ci) /* {{{ ssnprintf(callback_name, sizeof(callback_name), "write_kafka/%s", tctx->topic_name); - ud.data = tctx; - ud.free_func = kafka_topic_context_free; + user_data_t ud = { + .data = tctx, + .free_func = kafka_topic_context_free + }; status = plugin_register_write (callback_name, kafka_write, &ud); if (status != 0) {