From fce052ee7986d7c2c562093f6c44728dcb077d33 Mon Sep 17 00:00:00 2001 From: Vladimir Kobal Date: Mon, 10 Jan 2022 15:19:55 +0200 Subject: Fix unit tests for Prometheus remote write exporting connector (#11883) --- .../remote_write/remote_write_request.cc | 40 +++++++++++ .../prometheus/remote_write/remote_write_request.h | 6 ++ exporting/tests/test_exporting_engine.c | 78 ++++++++++++++++------ 3 files changed, 104 insertions(+), 20 deletions(-) diff --git a/exporting/prometheus/remote_write/remote_write_request.cc b/exporting/prometheus/remote_write/remote_write_request.cc index 48d19efd62..cfd61271e6 100644 --- a/exporting/prometheus/remote_write/remote_write_request.cc +++ b/exporting/prometheus/remote_write/remote_write_request.cc @@ -177,6 +177,46 @@ int pack_and_clear_write_request(void *write_request_p, char *buffer, size_t *si return 0; } +/** + * Writes an unpacked write request into a text buffer + * + * @param write_request_p the write request + * @param buffer a buffer, where text is written + * @param size the size of the buffer + * @return Returns 0 on success, 1 on failure + */ +int convert_write_request_to_string( + const char *compressed_write_request, + size_t compressed_size, + char *buffer, + size_t size) +{ + size_t uncompressed_size = 0; + + snappy::GetUncompressedLength(compressed_write_request, compressed_size, &uncompressed_size); + if (size < uncompressed_size) + return 1; + char *uncompressed_write_request = (char *)malloc(size); + + if (snappy::RawUncompress(compressed_write_request, compressed_size, uncompressed_write_request) == false) { + free(uncompressed_write_request); + return 1; + } + + WriteRequest *write_request = google::protobuf::Arena::CreateMessage(&arena); + if (write_request->ParseFromString(std::string(uncompressed_write_request, uncompressed_size)) == false) { + free(uncompressed_write_request); + return 1; + } + + std::string text_write_request(write_request->DebugString()); + text_write_request.copy(buffer, size); + + free(uncompressed_write_request); + + return 0; +} + /** * Shuts down the Protobuf library */ diff --git a/exporting/prometheus/remote_write/remote_write_request.h b/exporting/prometheus/remote_write/remote_write_request.h index e1dfacaf86..5f242b9418 100644 --- a/exporting/prometheus/remote_write/remote_write_request.h +++ b/exporting/prometheus/remote_write/remote_write_request.h @@ -24,6 +24,12 @@ size_t get_write_request_size(void *write_request_p); int pack_and_clear_write_request(void *write_request_p, char *buffer, size_t *size); +int convert_write_request_to_string( + const char *compressed_write_request, + size_t compressed_size, + char *buffer, + size_t size); + void protocol_buffers_shutdown(); #ifdef __cplusplus diff --git a/exporting/tests/test_exporting_engine.c b/exporting/tests/test_exporting_engine.c index 7188c6eeeb..fb08ff43b5 100644 --- a/exporting/tests/test_exporting_engine.c +++ b/exporting/tests/test_exporting_engine.c @@ -1309,27 +1309,65 @@ static void test_format_batch_prometheus_remote_write(void **state) assert_int_equal(format_batch_prometheus_remote_write(instance), 0); BUFFER *buffer = instance->buffer; - assert_int_equal(buffer_strlen(buffer), 192); - - BUFFER *escaped_buffer = buffer_create(850); - size_t len = buffer_strlen(buffer); - char *ch = (char *)buffer_tostring(buffer); - for (; len > 0; ch++, len--) - buffer_sprintf(escaped_buffer, "\\%03o", (unsigned int)*ch); + char *write_request_string = calloc(1, 1000); + convert_write_request_to_string(buffer_tostring(buffer), buffer_strlen(buffer), write_request_string, 999); + assert_int_equal(strlen(write_request_string), 753); assert_string_equal( - buffer_tostring(escaped_buffer), - "\\37777777641\\002\\120\\012\\37777777622\\001\\012\\025\\012\\010\\137\\137\\156\\141\\155\\145\\137\\137" - "\\022\\011\\164\\145\\163\\164\\005\\015\\064\\012\\031\\012\\010\\151\\156\\163\\164\\141\\156\\143\\145\\022" - "\\015\\005\\027\\021\\017\\100\\012\\037\\012\\013\\141\\160\\160\\154\\151\\143\\141\\164\\151\\157\\156\\022" - "\\020\\005\\036\\035\\022\\034\\012\\027\\012\\007\\166\\145\\162\\163\\001\\035\\000\\014\\005\\035\\015\\016" - "\\014\\012\\026\\012\\010\\005\\020\\020\\153\\145\\171\\022\\012\\005\\012\\040\\166\\141\\154\\165\\145\\022" - "\\014\\011\\000\\005\\001\\030\\37777777760\\077\\020\\37777777713\\165\\012\\37777777611\\142\\37777777625" - "\\000\\034\\023\\012\\005\\143\\150\\141\\162\\164\\011\\075\\000\\040\\005\\014\\054\\012\\025\\012\\006\\146" - "\\141\\155\\151\\154\\171\\022\\013\\005\\123\\011\\015\\040\\012\\033\\012\\011\\144\\151\\155\\145\\156\\005" - "\\37777777607\\000\\016\\005\\032\\025\\020\\000\\012\\146\\37777777736\\000\\064\\022\\014\\011\\000\\000\\000" - "\\004\\130\\123\\37777777635\\101\\020\\37777777714\\165"); - - buffer_free(escaped_buffer); + write_request_string, + "timeseries {\n" + " labels {\n" + " name: \"__name__\"\n" + " value: \"test_name\"\n" + " }\n" + " labels {\n" + " name: \"instance\"\n" + " value: \"test_instance\"\n" + " }\n" + " labels {\n" + " name: \"application\"\n" + " value: \"test_application\"\n" + " }\n" + " labels {\n" + " name: \"version\"\n" + " value: \"test_version\"\n" + " }\n" + " labels {\n" + " name: \"test_key\"\n" + " value: \"test_value\"\n" + " }\n" + " samples {\n" + " value: 1\n" + " timestamp: 15051\n" + " }\n" + "}\n" + "timeseries {\n" + " labels {\n" + " name: \"__name__\"\n" + " value: \"test_name\"\n" + " }\n" + " labels {\n" + " name: \"chart\"\n" + " value: \"test chart\"\n" + " }\n" + " labels {\n" + " name: \"family\"\n" + " value: \"test_family\"\n" + " }\n" + " labels {\n" + " name: \"dimension\"\n" + " value: \"test_dimension\"\n" + " }\n" + " labels {\n" + " name: \"instance\"\n" + " value: \"test_instance\"\n" + " }\n" + " samples {\n" + " value: 123000321\n" + " timestamp: 15052\n" + " }\n" + "}\n"); + free(write_request_string); + protocol_buffers_shutdown(); } #endif // ENABLE_PROMETHEUS_REMOTE_WRITE -- cgit v1.2.3