Skip to content

Commit aa4e3d5

Browse files
committed
Added log settings flags
1 parent df2c912 commit aa4e3d5

File tree

5 files changed

+124
-40
lines changed

5 files changed

+124
-40
lines changed

ydb/tests/tools/kqprun/kqprun.cpp

Lines changed: 80 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
#include "src/kqp_runner.h"
22

3-
#include <cstdio>
4-
53
#include <contrib/libs/protobuf/src/google/protobuf/text_format.h>
64

75
#include <library/cpp/colorizer/colors.h>
@@ -15,11 +13,13 @@
1513

1614
#include <ydb/library/aclib/aclib.h>
1715
#include <ydb/library/yaml_config/yaml_config.h>
16+
1817
#include <yql/essentials/minikql/invoke_builtins/mkql_builtins.h>
18+
#include <yql/essentials/public/udf/udf_static_registry.h>
19+
1920
#include <yt/yql/providers/yt/gateway/file/yql_yt_file.h>
2021
#include <yt/yql/providers/yt/gateway/file/yql_yt_file_comp_nodes.h>
2122
#include <yt/yql/providers/yt/lib/yt_download/yt_download.h>
22-
#include <yql/essentials/public/udf/udf_static_registry.h>
2323

2424

2525
namespace NKqpRun {
@@ -135,7 +135,7 @@ struct TExecutionOptions {
135135
void ValidateOptionsSizes(const TRunnerOptions& runnerOptions) const {
136136
const auto checker = [numberQueries = ScriptQueries.size()](size_t checkSize, const TString& optionName) {
137137
if (checkSize > numberQueries) {
138-
ythrow yexception() << "Too many " << optionName << ". Specified " << checkSize << ", when number of queries is " << numberQueries;
138+
ythrow yexception() << "Too many " << optionName << ". Specified " << checkSize << ", when number of script queries is " << numberQueries;
139139
}
140140
};
141141

@@ -431,6 +431,9 @@ class TMain : public TMainClassArgs {
431431
bool ExcludeLinkedUdfs = false;
432432
bool EmulateYt = false;
433433

434+
std::optional<NActors::NLog::EPriority> DefaultLogPriority;
435+
std::unordered_map<NKikimrServices::EServiceKikimr, NActors::NLog::EPriority> LogPriorities;
436+
434437
static TString LoadFile(const TString& file) {
435438
return TFileInput(file).ReadAll();
436439
}
@@ -466,6 +469,10 @@ class TMain : public TMainClassArgs {
466469
return choices;
467470
}
468471

472+
bool Contains(const TString& choice) const {
473+
return ChoicesMap.contains(choice);
474+
}
475+
469476
private:
470477
const std::map<TString, TResult> ChoicesMap;
471478
};
@@ -483,11 +490,13 @@ class TMain : public TMainClassArgs {
483490
.Handler1([this](const NLastGetopt::TOptsParser* option) {
484491
ExecutionOptions.SchemeQuery = LoadFile(option->CurVal());
485492
});
493+
486494
options.AddLongOption('p', "script-query", "Script query to execute (typically DML query)")
487495
.RequiredArgument("file")
488496
.Handler1([this](const NLastGetopt::TOptsParser* option) {
489497
ExecutionOptions.ScriptQueries.emplace_back(LoadFile(option->CurVal()));
490498
});
499+
491500
options.AddLongOption("templates", "Enable templates for -s and -p queries, such as ${YQL_TOKEN} and ${QUERY_ID}")
492501
.NoArgument()
493502
.SetFlag(&ExecutionOptions.UseTemplates);
@@ -499,10 +508,10 @@ class TMain : public TMainClassArgs {
499508
TStringBuf filePath;
500509
TStringBuf(option->CurVal()).Split('@', tableName, filePath);
501510
if (tableName.empty() || filePath.empty()) {
502-
ythrow yexception() << "Incorrect table mapping, expected form table@file, e.g. yt.Root/plato.Input@input.txt";
511+
ythrow yexception() << "Incorrect table mapping, expected form table@file, e. g. yt.Root/plato.Input@input.txt";
503512
}
504513
if (TablesMapping.contains(tableName)) {
505-
ythrow yexception() << "Got duplicate table name: " << tableName;
514+
ythrow yexception() << "Got duplicated table name: " << tableName;
506515
}
507516
TablesMapping[tableName] = filePath;
508517
});
@@ -523,9 +532,11 @@ class TMain : public TMainClassArgs {
523532
options.AddLongOption('u', "udf", "Load shared library with UDF by given path")
524533
.RequiredArgument("file")
525534
.EmplaceTo(&UdfsPaths);
535+
526536
options.AddLongOption("udfs-dir", "Load all shared libraries with UDFs found in given directory")
527537
.RequiredArgument("directory")
528538
.StoreResult(&UdfsDirectory);
539+
529540
options.AddLongOption("exclude-linked-udfs", "Exclude linked udfs when same udf passed from -u or --udfs-dir")
530541
.NoArgument()
531542
.SetFlag(&ExcludeLinkedUdfs);
@@ -540,13 +551,51 @@ class TMain : public TMainClassArgs {
540551
std::remove(file.c_str());
541552
}
542553
});
554+
555+
TChoices<NActors::NLog::EPriority> logPriority({
556+
{"emerg", NActors::NLog::EPriority::PRI_EMERG},
557+
{"alert", NActors::NLog::EPriority::PRI_ALERT},
558+
{"crit", NActors::NLog::EPriority::PRI_CRIT},
559+
{"error", NActors::NLog::EPriority::PRI_ERROR},
560+
{"warn", NActors::NLog::EPriority::PRI_WARN},
561+
{"notice", NActors::NLog::EPriority::PRI_NOTICE},
562+
{"info", NActors::NLog::EPriority::PRI_INFO},
563+
{"debug", NActors::NLog::EPriority::PRI_DEBUG},
564+
{"trace", NActors::NLog::EPriority::PRI_TRACE},
565+
});
566+
options.AddLongOption("log-default", "Default log priority")
567+
.RequiredArgument("priority")
568+
.Choices(logPriority.GetChoices())
569+
.StoreMappedResultT<TString>(&DefaultLogPriority, logPriority);
570+
571+
options.AddLongOption("log", "Component log priority in format <component>=<priority> (e. g. KQP_YQL=trace)")
572+
.RequiredArgument("component priority")
573+
.Handler1([this, logPriority](const NLastGetopt::TOptsParser* option) {
574+
TStringBuf component;
575+
TStringBuf priority;
576+
TStringBuf(option->CurVal()).Split('=', component, priority);
577+
if (component.empty() || priority.empty()) {
578+
ythrow yexception() << "Incorrect log setting, expected form component=priority, e. g. KQP_YQL=trace";
579+
}
580+
581+
const auto service = GetLogService(TString(component));
582+
if (LogPriorities.contains(service)) {
583+
ythrow yexception() << "Got duplicated log service name: " << component;
584+
}
585+
586+
if (!logPriority.Contains(TString(priority))) {
587+
ythrow yexception() << "Incorrect log priority: " << priority;
588+
}
589+
LogPriorities[service] = logPriority(TString(priority));
590+
});
591+
543592
TChoices<TRunnerOptions::ETraceOptType> traceOpt({
544593
{"all", TRunnerOptions::ETraceOptType::All},
545594
{"scheme", TRunnerOptions::ETraceOptType::Scheme},
546595
{"script", TRunnerOptions::ETraceOptType::Script},
547596
{"disabled", TRunnerOptions::ETraceOptType::Disabled}
548597
});
549-
options.AddLongOption('T', "trace-opt", "print AST in the begin of each transformation (use script@<query id> for tracing one -p query)")
598+
options.AddLongOption('T', "trace-opt", "Print AST in the begin of each transformation (use script@<query id> for tracing one -p query)")
550599
.RequiredArgument("trace-opt-query")
551600
.DefaultValue("disabled")
552601
.Choices(traceOpt.GetChoices())
@@ -555,9 +604,11 @@ class TMain : public TMainClassArgs {
555604
RunnerOptions.YdbSettings.TraceOptEnabled = traceOptType != NKqpRun::TRunnerOptions::ETraceOptType::Disabled;
556605
return traceOptType;
557606
});
558-
options.AddLongOption('I', "trace-opt-index", "index of -p query to use --trace-opt, starts from zero")
607+
608+
options.AddLongOption('I', "trace-opt-index", "Index of -p query to use --trace-opt, starts from zero")
559609
.RequiredArgument("uint")
560610
.StoreResult(&RunnerOptions.TraceOptScriptId);
611+
561612
options.AddLongOption("trace-id", "Trace id for -p queries")
562613
.RequiredArgument("id")
563614
.EmplaceTo(&ExecutionOptions.TraceIds);
@@ -566,10 +617,12 @@ class TMain : public TMainClassArgs {
566617
.RequiredArgument("file")
567618
.DefaultValue("-")
568619
.StoreMappedResultT<TString>(&RunnerOptions.ResultOutput, &GetDefaultOutput);
620+
569621
options.AddLongOption('L', "result-rows-limit", "Rows limit for script execution results")
570622
.RequiredArgument("uint")
571623
.DefaultValue(0)
572624
.StoreResult(&ExecutionOptions.ResultsRowsLimit);
625+
573626
TChoices<TRunnerOptions::EResultOutputFormat> resultFormat({
574627
{"rows", TRunnerOptions::EResultOutputFormat::RowsJson},
575628
{"full-json", TRunnerOptions::EResultOutputFormat::FullJson},
@@ -596,6 +649,7 @@ class TMain : public TMainClassArgs {
596649
.Handler1([this](const NLastGetopt::TOptsParser* option) {
597650
RunnerOptions.ScriptQueryPlanOutputs.emplace_back(GetDefaultOutput(TString(option->CurValOrDef())));
598651
});
652+
599653
options.AddLongOption("script-statistics", "File with script inprogress statistics")
600654
.RequiredArgument("file")
601655
.Handler1([this](const NLastGetopt::TOptsParser* option) {
@@ -605,6 +659,7 @@ class TMain : public TMainClassArgs {
605659
}
606660
RunnerOptions.InProgressStatisticsOutputFiles.emplace_back(file);
607661
});
662+
608663
TChoices<NYdb::NConsoleClient::EDataFormat> planFormat({
609664
{"pretty", NYdb::NConsoleClient::EDataFormat::Pretty},
610665
{"table", NYdb::NConsoleClient::EDataFormat::PrettyTable},
@@ -641,19 +696,21 @@ class TMain : public TMainClassArgs {
641696
TString choice(option->CurValOrDef());
642697
ExecutionOptions.ExecutionCases.emplace_back(executionCase(choice));
643698
});
699+
644700
options.AddLongOption("inflight-limit", "In flight limit for async queries (use 0 for unlimited)")
645701
.RequiredArgument("uint")
646702
.DefaultValue(0)
647703
.StoreResult(&RunnerOptions.YdbSettings.AsyncQueriesSettings.InFlightLimit);
648-
TChoices<TAsyncQueriesSettings::EVerbose> verbose({
649-
{"each-query", TAsyncQueriesSettings::EVerbose::EachQuery},
650-
{"final", TAsyncQueriesSettings::EVerbose::Final}
651-
});
652704

653705
options.AddLongOption("verbose", "Common verbose level (max level 2)")
654706
.RequiredArgument("uint")
655707
.DefaultValue(1)
656708
.StoreResult(&RunnerOptions.YdbSettings.VerboseLevel);
709+
710+
TChoices<TAsyncQueriesSettings::EVerbose> verbose({
711+
{"each-query", TAsyncQueriesSettings::EVerbose::EachQuery},
712+
{"final", TAsyncQueriesSettings::EVerbose::Final}
713+
});
657714
options.AddLongOption("async-verbose", "Verbose type for async queries")
658715
.RequiredArgument("type")
659716
.DefaultValue("each-query")
@@ -690,10 +747,12 @@ class TMain : public TMainClassArgs {
690747
.RequiredArgument("uint")
691748
.DefaultValue(ExecutionOptions.LoopCount)
692749
.StoreResult(&ExecutionOptions.LoopCount);
750+
693751
options.AddLongOption("loop-delay", "Delay in milliseconds between loop steps")
694752
.RequiredArgument("uint")
695753
.DefaultValue(0)
696754
.StoreMappedResultT<ui64>(&ExecutionOptions.LoopDelay, &TDuration::MilliSeconds<ui64>);
755+
697756
options.AddLongOption("continue-after-fail", "Don't not stop requests execution after fails")
698757
.NoArgument()
699758
.SetFlag(&ExecutionOptions.ContinueAfterFail);
@@ -803,12 +862,19 @@ class TMain : public TMainClassArgs {
803862

804863
RunnerOptions.YdbSettings.YqlToken = YqlToken;
805864
RunnerOptions.YdbSettings.FunctionRegistry = CreateFunctionRegistry(UdfsDirectory, UdfsPaths, ExcludeLinkedUdfs).Get();
865+
866+
auto& appConfig = RunnerOptions.YdbSettings.AppConfig;
806867
if (ExecutionOptions.ResultsRowsLimit) {
807-
RunnerOptions.YdbSettings.AppConfig.MutableQueryServiceConfig()->SetScriptResultRowsLimit(ExecutionOptions.ResultsRowsLimit);
868+
appConfig.MutableQueryServiceConfig()->SetScriptResultRowsLimit(ExecutionOptions.ResultsRowsLimit);
869+
}
870+
871+
if (DefaultLogPriority) {
872+
appConfig.MutableLogConfig()->SetDefaultLevel(*DefaultLogPriority);
808873
}
874+
ModifyLogPriorities(LogPriorities, *appConfig.MutableLogConfig());
809875

810876
if (EmulateYt) {
811-
const auto& fileStorageConfig = RunnerOptions.YdbSettings.AppConfig.GetQueryServiceConfig().GetFileStorage();
877+
const auto& fileStorageConfig = appConfig.GetQueryServiceConfig().GetFileStorage();
812878
auto fileStorage = WithAsync(CreateFileStorage(fileStorageConfig, {MakeYtDownloader(fileStorageConfig)}));
813879
auto ytFileServices = NYql::NFile::TYtFileServices::Make(RunnerOptions.YdbSettings.FunctionRegistry.Get(), TablesMapping, fileStorage);
814880
RunnerOptions.YdbSettings.YtGateway = NYql::CreateYtFileGateway(ytFileServices);

ydb/tests/tools/kqprun/src/common.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#include "common.h"
2+
3+
4+
namespace NKqpRun {
5+
6+
NKikimrServices::EServiceKikimr GetLogService(const TString& serviceName) {
7+
NKikimrServices::EServiceKikimr service;
8+
if (!NKikimrServices::EServiceKikimr_Parse(serviceName, &service)) {
9+
ythrow yexception() << "Invalid kikimr service name " << serviceName;
10+
}
11+
return service;
12+
}
13+
14+
void ModifyLogPriorities(std::unordered_map<NKikimrServices::EServiceKikimr, NActors::NLog::EPriority> logPriorities, NKikimrConfig::TLogConfig& logConfig) {
15+
for (auto& entry : *logConfig.MutableEntry()) {
16+
const auto it = logPriorities.find(GetLogService(entry.GetComponent()));
17+
if (it != logPriorities.end()) {
18+
entry.SetLevel(it->second);
19+
logPriorities.erase(it);
20+
}
21+
}
22+
for (const auto& [service, priority] : logPriorities) {
23+
auto* entry = logConfig.AddEntry();
24+
entry->SetComponent(NKikimrServices::EServiceKikimr_Name(service));
25+
entry->SetLevel(priority);
26+
}
27+
}
28+
29+
} // namespace NKqpRun

ydb/tests/tools/kqprun/src/common.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
#pragma once
22

33
#include <ydb/core/protos/config.pb.h>
4-
#include <ydb/public/api/protos/ydb_cms.pb.h>
54
#include <ydb/core/protos/kqp.pb.h>
65

6+
#include <ydb/library/actors/core/log_iface.h>
7+
#include <ydb/library/services/services.pb.h>
8+
9+
#include <ydb/public/api/protos/ydb_cms.pb.h>
10+
#include <ydb/public/lib/ydb_cli/common/formats.h>
11+
712
#include <yql/essentials/minikql/computation/mkql_computation_node.h>
813
#include <yql/essentials/minikql/mkql_function_registry.h>
9-
#include <yt/yql/providers/yt/provider/yql_yt_gateway.h>
1014

11-
#include <ydb/public/lib/ydb_cli/common/formats.h>
15+
#include <yt/yql/providers/yt/provider/yql_yt_gateway.h>
1216

1317

1418
namespace NKqpRun {
@@ -101,11 +105,14 @@ struct TRequestOptions {
101105
};
102106

103107
template <typename TValue>
104-
static TValue GetValue(size_t index, const std::vector<TValue>& values, TValue defaultValue) {
108+
TValue GetValue(size_t index, const std::vector<TValue>& values, TValue defaultValue) {
105109
if (values.empty()) {
106110
return defaultValue;
107111
}
108112
return values[std::min(index, values.size() - 1)];
109113
}
110114

115+
NKikimrServices::EServiceKikimr GetLogService(const TString& serviceName);
116+
void ModifyLogPriorities(std::unordered_map<NKikimrServices::EServiceKikimr, NActors::NLog::EPriority> logPriorities, NKikimrConfig::TLogConfig& logConfig);
117+
111118
} // namespace NKqpRun

ydb/tests/tools/kqprun/src/ya.make

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ LIBRARY()
22

33
SRCS(
44
actors.cpp
5+
common.cpp
56
kqp_runner.cpp
67
ydb_setup.cpp
78
)

ydb/tests/tools/kqprun/src/ydb_setup.cpp

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,8 @@ class TYdbSetup::TImpl {
150150
}
151151
}
152152

153-
for (auto setting : Settings_.AppConfig.GetLogConfig().get_arr_entry()) {
154-
NKikimrServices::EServiceKikimr service;
155-
if (!NKikimrServices::EServiceKikimr_Parse(setting.GetComponent(), &service)) {
156-
ythrow yexception() << "Invalid kikimr service name " << setting.GetComponent();
157-
}
158-
159-
runtime.SetLogPriority(service, NActors::NLog::EPriority(setting.GetLevel()));
153+
for (const auto& setting : Settings_.AppConfig.GetLogConfig().get_arr_entry()) {
154+
runtime.SetLogPriority(GetLogService(setting.GetComponent()), NActors::NLog::EPriority(setting.GetLevel()));
160155
}
161156

162157
runtime.SetLogBackendFactory([this]() { return CreateLogBackend(); });
@@ -316,21 +311,7 @@ class TYdbSetup::TImpl {
316311
return;
317312
}
318313

319-
bool found = false;
320-
for (auto& entry : *Settings_.AppConfig.MutableLogConfig()->MutableEntry()) {
321-
if (entry.GetComponent() == "KQP_YQL") {
322-
entry.SetLevel(NActors::NLog::PRI_TRACE);
323-
found = true;
324-
break;
325-
}
326-
}
327-
328-
if (!found) {
329-
auto entry = Settings_.AppConfig.MutableLogConfig()->AddEntry();
330-
entry->SetComponent("KQP_YQL");
331-
entry->SetLevel(NActors::NLog::PRI_TRACE);
332-
}
333-
314+
ModifyLogPriorities({{NKikimrServices::EServiceKikimr::KQP_YQL, NActors::NLog::PRI_TRACE}}, *Settings_.AppConfig.MutableLogConfig());
334315
NYql::NLog::InitLogger(NActors::CreateNullBackend());
335316
}
336317

0 commit comments

Comments
 (0)