summaryrefslogtreecommitdiffstats
path: root/library/cpp/monlib/encode
diff options
context:
space:
mode:
authoralexnadtochiy <[email protected]>2025-12-12 16:20:28 +0300
committeralexnadtochiy <[email protected]>2025-12-12 17:14:17 +0300
commit3d4e0b44c9bb86ca521b20e125f1625846670605 (patch)
tree49b05c34297cdf350c57a9f37c516ca5a9527021 /library/cpp/monlib/encode
parent0f01c3cec912301670d5791b06740e6234d192e5 (diff)
Fix prometheus nan parsing
commit_hash:ea34eba995ae4c386785fe89df58c439a2e3ea63
Diffstat (limited to 'library/cpp/monlib/encode')
-rw-r--r--library/cpp/monlib/encode/prometheus/prometheus_decoder.cpp2
-rw-r--r--library/cpp/monlib/encode/prometheus/prometheus_decoder_ut.cpp25
2 files changed, 23 insertions, 4 deletions
diff --git a/library/cpp/monlib/encode/prometheus/prometheus_decoder.cpp b/library/cpp/monlib/encode/prometheus/prometheus_decoder.cpp
index 16a08f47819..5ccc854cab2 100644
--- a/library/cpp/monlib/encode/prometheus/prometheus_decoder.cpp
+++ b/library/cpp/monlib/encode/prometheus/prometheus_decoder.cpp
@@ -576,7 +576,7 @@ namespace NMonitoring {
return std::numeric_limits<double>::infinity();
} else if (str == TStringBuf("-Inf")) {
return -std::numeric_limits<double>::infinity();
- } else if (str == TStringBuf("NaN")) {
+ } else if (str == TStringBuf("NaN") || str == TStringBuf("Nan")) {
return NAN;
}
diff --git a/library/cpp/monlib/encode/prometheus/prometheus_decoder_ut.cpp b/library/cpp/monlib/encode/prometheus/prometheus_decoder_ut.cpp
index 72e13a39dda..4dbb4b574bb 100644
--- a/library/cpp/monlib/encode/prometheus/prometheus_decoder_ut.cpp
+++ b/library/cpp/monlib/encode/prometheus/prometheus_decoder_ut.cpp
@@ -111,12 +111,13 @@ Y_UNIT_TEST_SUITE(TPrometheusDecoderTest) {
"#\n"
"# TYPE name counter\n"
"name{labelname=\"val1\",basename=\"basevalue\"} NaN\n"
- "name {labelname=\"val2\",basename=\"basevalue\"} 2.3 1234567890\n"
+ "name{labelname=\"val2\",basename=\"basevalue\"} Nan\n"
+ "name {labelname=\"val3\",basename=\"basevalue\"} 2.3 1234567890\n"
"# HELP name two-line\\n doc str\\\\ing\n";
{
auto samples = Decode(inputMetrics);
- UNIT_ASSERT_EQUAL(samples.SamplesSize(), 2);
+ UNIT_ASSERT_EQUAL(samples.SamplesSize(), 3);
{
auto& s = samples.GetSamples(0);
@@ -134,6 +135,15 @@ Y_UNIT_TEST_SUITE(TPrometheusDecoderTest) {
ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "name");
ASSERT_LABEL_EQUAL(s.GetLabels(1), "basename", "basevalue");
ASSERT_LABEL_EQUAL(s.GetLabels(2), "labelname", "val2");
+ ASSERT_UINT_POINT(s, TInstant::Zero(), ui64(0));
+ }
+ {
+ auto& s = samples.GetSamples(2);
+ UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::RATE);
+ UNIT_ASSERT_EQUAL(s.LabelsSize(), 3);
+ ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "name");
+ ASSERT_LABEL_EQUAL(s.GetLabels(1), "basename", "basevalue");
+ ASSERT_LABEL_EQUAL(s.GetLabels(2), "labelname", "val3");
ASSERT_UINT_POINT(s, TInstant::MilliSeconds(1234567890), i64(2));
}
}
@@ -141,7 +151,7 @@ Y_UNIT_TEST_SUITE(TPrometheusDecoderTest) {
TPrometheusDecodeSettings settings;
settings.Mode = EPrometheusDecodeMode::RAW;
auto samples = Decode(inputMetrics, settings);
- UNIT_ASSERT_EQUAL(samples.SamplesSize(), 2);
+ UNIT_ASSERT_EQUAL(samples.SamplesSize(), 3);
{
auto& s = samples.GetSamples(0);
@@ -159,6 +169,15 @@ Y_UNIT_TEST_SUITE(TPrometheusDecoderTest) {
ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "name");
ASSERT_LABEL_EQUAL(s.GetLabels(1), "basename", "basevalue");
ASSERT_LABEL_EQUAL(s.GetLabels(2), "labelname", "val2");
+ ASSERT_DOUBLE_POINT(s, TInstant::MilliSeconds(0), NAN);
+ }
+ {
+ auto& s = samples.GetSamples(2);
+ UNIT_ASSERT_EQUAL(s.GetMetricType(), NProto::EMetricType::GAUGE);
+ UNIT_ASSERT_EQUAL(s.LabelsSize(), 3);
+ ASSERT_LABEL_EQUAL(s.GetLabels(0), "sensor", "name");
+ ASSERT_LABEL_EQUAL(s.GetLabels(1), "basename", "basevalue");
+ ASSERT_LABEL_EQUAL(s.GetLabels(2), "labelname", "val3");
ASSERT_DOUBLE_POINT(s, TInstant::MilliSeconds(1234567890), 2.3);
}
}