diff options
author | xenoxeno <xenoxeno@yandex-team.com> | 2025-04-17 08:44:00 +0300 |
---|---|---|
committer | xenoxeno <xenoxeno@yandex-team.com> | 2025-04-17 08:57:11 +0300 |
commit | 178e735a3bd3caf1caa42d4a64fa0935ce51ce4f (patch) | |
tree | 22761e49cdbc1afcefa4b5a81cf40d3a65ec94dc /library/cpp/monlib/dynamic_counters/page.cpp | |
parent | a2a5a3ce98cd881dd0f1d0d205a353dfa49cbbbb (diff) | |
download | ydb-178e735a3bd3caf1caa42d4a64fa0935ce51ce4f.tar.gz |
refactor counters page to better support ic-proxy
commit_hash:d6538967a151a3aba3c806d3d1ba3f4c7ef1ae47
Diffstat (limited to 'library/cpp/monlib/dynamic_counters/page.cpp')
-rw-r--r-- | library/cpp/monlib/dynamic_counters/page.cpp | 91 |
1 files changed, 68 insertions, 23 deletions
diff --git a/library/cpp/monlib/dynamic_counters/page.cpp b/library/cpp/monlib/dynamic_counters/page.cpp index 5cd750026fb..73b1309d814 100644 --- a/library/cpp/monlib/dynamic_counters/page.cpp +++ b/library/cpp/monlib/dynamic_counters/page.cpp @@ -4,6 +4,7 @@ #include <library/cpp/monlib/service/pages/templates.h> #include <library/cpp/string_utils/quote/quote.h> +#include <util/string/builder.h> #include <util/string/split.h> #include <util/system/tls.h> @@ -26,6 +27,19 @@ TMaybe<EFormat> ParseFormat(TStringBuf str) { } } +namespace { + +TStringBuf GetParams(NMonitoring::IMonHttpRequest& request) { + TStringBuf uri = request.GetUri(); + TStringBuf params = uri.After('?'); + if (params.Size() == uri.Size()) { + params.Clear(); + } + return params; +} + +} + void TDynamicCountersPage::Output(NMonitoring::IMonHttpRequest& request) { if (OutputCallback) { OutputCallback(); @@ -37,28 +51,51 @@ void TDynamicCountersPage::Output(NMonitoring::IMonHttpRequest& request) { }; TVector<TStringBuf> parts; - StringSplitter(request.GetPathInfo()) - .Split('/') - .SkipEmpty() - .Collect(&parts); - - TMaybe<EFormat> format = !parts.empty() ? ParseFormat(parts.back()) : Nothing(); - if (format) { - parts.pop_back(); - } + TMaybe<EFormat> format; + TStringBuf params = GetParams(request); + + if (request.GetPathInfo().empty() && !params.empty()) { + StringSplitter(params).Split('&').SkipEmpty().Consume([&](TStringBuf part) { + TStringBuf name; + TStringBuf value; + part.Split('=', name, value); + if (name.StartsWith("@")) { + if (name == "@format") { + format = ParseFormat(value); + } else if (name == "@name_label") { + nameLabel = value; + } else if (name == "@private") { + visibility = TCountableBase::EVisibility::Private; + } + } else { + parts.push_back(part); + } + return true; + }); + } else { + StringSplitter(request.GetPathInfo()) + .Split('/') + .SkipEmpty() + .Collect(&parts); + + format = !parts.empty() ? ParseFormat(parts.back()) : Nothing(); + if (format) { + parts.pop_back(); + } - if (!parts.empty() && parts.back().StartsWith(TStringBuf("name_label="))) { - TVector<TString> labels; - StringSplitter(parts.back()).Split('=').SkipEmpty().Collect(&labels); - if (labels.size() == 2U) { - nameLabel = labels.back(); + if (!parts.empty() && parts.back().StartsWith(TStringBuf("name_label="))) { + TVector<TString> labels; + StringSplitter(parts.back()).Split('=').SkipEmpty().Collect(&labels); + if (labels.size() == 2U) { + nameLabel = labels.back(); + } + parts.pop_back(); } - parts.pop_back(); - } - if (!parts.empty() && parts.back() == TStringBuf("private")) { - visibility = TCountableBase::EVisibility::Private; - parts.pop_back(); + if (!parts.empty() && parts.back() == TStringBuf("private")) { + visibility = TCountableBase::EVisibility::Private; + parts.pop_back(); + } } auto counters = Counters; @@ -121,9 +158,15 @@ void TDynamicCountersPage::HandleAbsentSubgroup(IMonHttpRequest& request) { void TDynamicCountersPage::BeforePre(IMonHttpRequest& request) { IOutputStream& out = request.Output(); + TStringBuf params = GetParams(request); + TStringBuilder base; + base << Path << '?'; + if (!params.empty()) { + base << params << '&'; + } HTML(out) { DIV() { - out << "<a href='" << request.GetPath() << "/json'>Counters as JSON</a>"; + out << "<a href='" << base << "@format=json'>Counters as JSON</a>"; out << " for Solomon"; } @@ -133,9 +176,11 @@ void TDynamicCountersPage::BeforePre(IMonHttpRequest& request) { UL() { currentCounters->EnumerateSubgroups([&](const TString& name, const TString& value) { LI() { - TString pathPart = name + "=" + value; - Quote(pathPart, ""); - out << "\n<a href='" << request.GetPath() << "/" << pathPart << "'>" << name << " " << value << "</a>"; + auto escName = name; + auto escValue = value; + Quote(escName); + Quote(escValue); + out << "\n<a href='" << base << escName << '=' << escValue << "'>" << name << " " << value << "</a>"; } }); } |