X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fwrite_kafka.c;h=614ce0f084df7f9ba09181b21983a2fdbec277a5;hb=ea9db2c32ef7f8a3135dc1413fbf8ee46a25f680;hp=736fddb12a993f8aeaebea16a8a7e513351bda6a;hpb=130bf8ce428a7bbdec766d35c76bd616358e5431;p=collectd.git diff --git a/src/write_kafka.c b/src/write_kafka.c index 736fddb1..614ce0f0 100644 --- a/src/write_kafka.c +++ b/src/write_kafka.c @@ -36,7 +36,6 @@ #include #include -#include #include #include @@ -51,8 +50,7 @@ struct kafka_topic_context { rd_kafka_topic_t *topic; rd_kafka_conf_t *kafka_conf; rd_kafka_t *kafka; - int has_key; - uint32_t key; + char *key; char *prefix; char *postfix; char escape_char; @@ -75,11 +73,19 @@ static void kafka_log(const rd_kafka_t *rkt, int level, } #endif +static uint32_t kafka_hash(const char *keydata, size_t keylen) +{ + uint32_t hash = 5381; + for (; keylen > 0; keylen--) + hash = ((hash << 5) + hash) + keydata[keylen - 1]; + return hash; +} + 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) { - uint32_t key = *((uint32_t *)keydata ); + uint32_t key = kafka_hash(keydata, keylen); uint32_t target = key % partition_cnt; int32_t i = partition_cnt; @@ -115,7 +121,7 @@ static int kafka_handle(struct kafka_topic_context *ctx) /* {{{ */ INFO ("write_kafka plugin: created KAFKA handle : %s", rd_kafka_name(ctx->kafka)); -#ifdef HAVE_LIBRDKAFKA_LOGGER +#if defined(HAVE_LIBRDKAFKA_LOGGER) && !defined(HAVE_LIBRDKAFKA_LOG_CB) rd_kafka_set_logger(ctx->kafka, kafka_log); #endif } @@ -148,7 +154,8 @@ static int kafka_write(const data_set_t *ds, /* {{{ */ user_data_t *ud) { int status = 0; - uint32_t key; + void *key; + size_t keylen = 0; char buffer[8192]; size_t bfree = sizeof(buffer); size_t bfill = 0; @@ -199,17 +206,15 @@ static int kafka_write(const data_set_t *ds, /* {{{ */ return -1; } - /* - * We partition our stream by metric name - */ - if (ctx->has_key) - key = ctx->key; + key = ctx->key; + if (key != NULL) + keylen = strlen (key); else - key = rand(); + keylen = 0; rd_kafka_produce(ctx->topic, RD_KAFKA_PARTITION_UA, RD_KAFKA_MSG_F_COPY, buffer, blen, - &key, sizeof(key), NULL); + key, keylen, NULL); return status; } /* }}} int kafka_write */ @@ -256,6 +261,7 @@ static void kafka_config_topic(rd_kafka_conf_t *conf, oconfig_item_t *ci) /* {{{ tctx->escape_char = '.'; tctx->store_rates = 1; tctx->format = KAFKA_FORMAT_JSON; + tctx->key = NULL; if ((tctx->kafka_conf = rd_kafka_conf_dup(conf)) == NULL) { sfree(tctx); @@ -318,19 +324,8 @@ static void kafka_config_topic(rd_kafka_conf_t *conf, oconfig_item_t *ci) /* {{{ } } else if (strcasecmp ("Key", child->key) == 0) { - char *tmp_buf = NULL; - status = cf_util_get_string(child, &tmp_buf); - if (status != 0) { - WARNING("write_kafka plugin: invalid key supplied"); - break; - } - - if (strcasecmp(tmp_buf, "Random") != 0) { - tctx->has_key = 1; - tctx->key = crc32_buffer((u_char *)tmp_buf, strlen(tmp_buf)); - } - sfree(tmp_buf); - + cf_util_get_string (child, &tctx->key); + assert (tctx->key != NULL); } else if (strcasecmp ("Format", child->key) == 0) { status = cf_util_get_string(child, &key); if (status != 0) @@ -485,4 +480,3 @@ void module_register(void) { plugin_register_complex_config ("write_kafka", kafka_config); } -