Browse Source

intermediate changes
ref:8868513666cce733c1c659c7f2d683ffab1150dd

arcadia-devtools 2 years ago
parent
commit
b93c9c23c9

+ 2 - 0
build/rules/autocheck.blacklist

@@ -1446,3 +1446,5 @@ strm/salt-configs
 divkit/public/client/web
 divkit/public/json-builder/typescript
 data-ui/wf-core
+classifieds/autoru-api
+noc/mondata/temp

+ 6 - 2
library/cpp/monlib/encode/buffered/string_pool.h

@@ -33,7 +33,10 @@ namespace NMonitoring {
         TStringPoolBuilder& Build();
 
         TStringBuf Get(ui32 index) const {
-            Y_ENSURE(IsBuilt_, "Pool must be sorted first");
+            if (RequiresSorting_) {
+                Y_ENSURE(IsBuilt_, "Pool must be sorted first");
+            }
+
             return StrVector_.at(index).first;
         }
 
@@ -43,7 +46,8 @@ namespace NMonitoring {
 
         template <typename TConsumer>
         void ForEach(TConsumer&& c) {
-            Y_ENSURE(IsBuilt_, "Pool must be sorted first");
+            Y_ENSURE(IsBuilt_, "Pool must be built first");
+
             for (const auto& value : StrVector_) {
                 c(value.first, value.second->Index, value.second->Frequency);
             }

+ 1 - 1
library/cpp/monlib/encode/format.cpp

@@ -49,7 +49,7 @@ namespace NMonitoring {
         EFormat result{EFormat::UNKNOWN};
 
         for (const auto& it : StringSplitter(value).Split(',').SkipEmpty()) {
-            TStringBuf token = StripString(it.Token());
+            TStringBuf token = StripString(it.Token()).Before(';');
 
             result = FormatFromHttpMedia(token);
             if (result != EFormat::UNKNOWN) {

+ 4 - 0
library/cpp/monlib/encode/format_ut.cpp

@@ -61,6 +61,10 @@ Y_UNIT_TEST_SUITE(TFormatTest) {
         UNIT_ASSERT_EQUAL(
             FormatFromAcceptHeader("text/plain"),
             EFormat::PROMETHEUS);
+
+        UNIT_ASSERT_EQUAL(
+            FormatFromAcceptHeader("application/openmetrics-text;version=0.0.1;q=0.75,text/plain;version=0.0.4"),
+            EFormat::PROMETHEUS);
     }
 
     Y_UNIT_TEST(FormatToStrFromStr) {

+ 1 - 0
library/cpp/monlib/encode/prometheus/CMakeLists.txt

@@ -12,6 +12,7 @@ target_link_libraries(monlib-encode-prometheus PUBLIC
   contrib-libs-cxxsupp
   yutil
   cpp-monlib-encode
+  monlib-encode-buffered
 )
 target_sources(monlib-encode-prometheus PRIVATE
   ${CMAKE_SOURCE_DIR}/library/cpp/monlib/encode/prometheus/prometheus_decoder.cpp

+ 14 - 0
library/cpp/monlib/encode/prometheus/prometheus_encoder.cpp

@@ -2,6 +2,7 @@
 #include "prometheus_model.h"
 
 #include <library/cpp/monlib/encode/encoder_state.h>
+#include <library/cpp/monlib/encode/buffered/string_pool.h>
 #include <library/cpp/monlib/metrics/labels.h>
 #include <library/cpp/monlib/metrics/metric_value.h>
 
@@ -311,6 +312,16 @@ namespace NMonitoring {
                 }
             }
 
+            void OnLabel(ui32 name, ui32 value) override {
+                OnLabel(LabelNamesPool_.Get(name), LabelValuesPool_.Get(value));
+            }
+
+            std::pair<ui32, ui32> PrepareLabel(TStringBuf name, TStringBuf value) override {
+                auto nameLabel = LabelNamesPool_.PutIfAbsent(name);
+                auto valueLabel = LabelValuesPool_.PutIfAbsent(value);
+                return std::make_pair(nameLabel->Index, valueLabel->Index);
+            }
+
             void OnDouble(TInstant time, double value) override {
                 State_.Expect(TEncoderState::EState::METRIC);
                 MetricState_.Time = time;
@@ -403,6 +414,9 @@ namespace NMonitoring {
             TInstant CommonTime_ = TInstant::Zero();
             TLabels CommonLabels_;
             TMetricState MetricState_;
+
+            TStringPoolBuilder LabelNamesPool_;
+            TStringPoolBuilder LabelValuesPool_;
         };
     }