aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/monlib/dynamic_counters/page.cpp
diff options
context:
space:
mode:
authorxenoxeno <xenoxeno@yandex-team.com>2025-04-17 08:44:00 +0300
committerxenoxeno <xenoxeno@yandex-team.com>2025-04-17 08:57:11 +0300
commit178e735a3bd3caf1caa42d4a64fa0935ce51ce4f (patch)
tree22761e49cdbc1afcefa4b5a81cf40d3a65ec94dc /library/cpp/monlib/dynamic_counters/page.cpp
parenta2a5a3ce98cd881dd0f1d0d205a353dfa49cbbbb (diff)
downloadydb-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.cpp91
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>";
}
});
}