From 197ff473b57b5725e4ba55b79c48bc8049c44e49 Mon Sep 17 00:00:00 2001 From: Gregor Jasny Date: Tue, 25 Jun 2019 18:10:38 +0200 Subject: [PATCH] Serialize floating values locale-independent Closes: #281 --- core/src/text_serializer.cc | 9 ++++++++- core/tests/CMakeLists.txt | 1 + core/tests/serializer_test.cc | 30 ++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 core/tests/serializer_test.cc diff --git a/core/src/text_serializer.cc b/core/src/text_serializer.cc index 432379b8..51eef6c0 100644 --- a/core/src/text_serializer.cc +++ b/core/src/text_serializer.cc @@ -2,7 +2,9 @@ #include #include +#include #include +#include namespace prometheus { @@ -16,7 +18,12 @@ std::string ToString(double v) { if (std::isinf(v)) { return (v < 0 ? "-Inf" : "+Inf"); } - return std::to_string(v); + std::ostringstream ss; + ss.imbue(std::locale::classic()); + ss.setf(std::ios::fixed, std::ios::floatfield); + ss.precision(6); + ss << v; + return ss.str(); } const std::string& EscapeLabelValue(const std::string& value, diff --git a/core/tests/CMakeLists.txt b/core/tests/CMakeLists.txt index ee94919b..cd220cb8 100644 --- a/core/tests/CMakeLists.txt +++ b/core/tests/CMakeLists.txt @@ -7,6 +7,7 @@ add_executable(prometheus_test gauge_test.cc histogram_test.cc registry_test.cc + serializer_test.cc summary_test.cc utils_test.cc ) diff --git a/core/tests/serializer_test.cc b/core/tests/serializer_test.cc new file mode 100644 index 00000000..69e121f2 --- /dev/null +++ b/core/tests/serializer_test.cc @@ -0,0 +1,30 @@ +#include "prometheus/counter.h" +#include "prometheus/family.h" +#include "prometheus/text_serializer.h" + +#include +#include + +namespace prometheus { +namespace { + +TEST(SerializerTest, shouldSerializeLocaleIndependent) { + Family family{"requests_total", "", {}}; + auto& counter = family.Add({}); + counter.Increment(); + const auto collected = family.Collect(); + + // save and change locale + const std::locale oldLocale = std::locale::classic(); + std::locale::global(std::locale("de_DE.UTF-8")); + + TextSerializer textSerializer; + const auto serialized = textSerializer.Serialize(collected); + EXPECT_THAT(serialized, testing::HasSubstr("1.0")); + + // restore locale + std::locale::global(oldLocale); +} + +} // namespace +} // namespace prometheus