@@ -365,6 +365,8 @@ void TCommandExecuteQuery::Config(TConfig& config) {
365
365
config.Opts ->AddLongOption (' q' , " query" , " Text of query to execute" ).RequiredArgument (" [String]" ).StoreResult (&Query);
366
366
config.Opts ->AddLongOption (' f' , " file" , " Path to file with query text to execute" )
367
367
.RequiredArgument (" PATH" ).StoreResult (&QueryFile);
368
+ config.Opts ->AddLongOption (" collect-diagnostics" , " Collects diagnostics and saves it to file" )
369
+ .StoreTrue (&CollectFullDiagnostics);
368
370
369
371
AddOutputFormats (config, {
370
372
EDataFormat::Pretty,
@@ -432,6 +434,9 @@ int TCommandExecuteQuery::ExecuteDataQuery(TConfig& config) {
432
434
NTable::TExecDataQuerySettings settings;
433
435
settings.KeepInQueryCache (true );
434
436
settings.CollectQueryStats (ParseQueryStatsModeOrThrow (CollectStatsMode, defaultStatsMode));
437
+ if (CollectFullDiagnostics) {
438
+ settings.CollectFullDiagnostics (true );
439
+ }
435
440
436
441
NTable::TTxSettings txSettings;
437
442
if (TxMode) {
@@ -516,6 +521,11 @@ void TCommandExecuteQuery::PrintDataQueryResponse(NTable::TDataQueryResult& resu
516
521
{
517
522
Cout << Endl << " Flame graph is available for full or profile stats only" << Endl;
518
523
}
524
+ if (CollectFullDiagnostics)
525
+ {
526
+ TFileOutput file (TStringBuilder () << " diagnostics_" << TGUID::Create ().AsGuidString () << " .txt" );
527
+ file << result.GetDiagnostics ();
528
+ }
519
529
}
520
530
521
531
int TCommandExecuteQuery::ExecuteSchemeQuery (TConfig& config) {
@@ -548,7 +558,7 @@ namespace {
548
558
NQuery::TExecuteQuerySettings>;
549
559
550
560
template <typename TClient>
551
- auto GetSettings (const TString& collectStatsMode, const bool basicStats, std::optional<TDuration> timeout) {
561
+ auto GetSettings (const TString& collectStatsMode, const bool basicStats, std::optional<TDuration> timeout, bool collectFullDiagnostics ) {
552
562
if constexpr (std::is_same_v<TClient, NTable::TTableClient>) {
553
563
const auto defaultStatsMode = basicStats
554
564
? NTable::ECollectQueryStatsMode::Basic
@@ -558,6 +568,9 @@ namespace {
558
568
if (timeout.has_value ()) {
559
569
settings.ClientTimeout (*timeout);
560
570
}
571
+ if (collectFullDiagnostics) {
572
+ settings.CollectFullDiagnostics (true );
573
+ }
561
574
return settings;
562
575
} else if constexpr (std::is_same_v<TClient, NQuery::TQueryClient>) {
563
576
const auto defaultStatsMode = basicStats
@@ -568,6 +581,9 @@ namespace {
568
581
if (timeout.has_value ()) {
569
582
settings.ClientTimeout (*timeout);
570
583
}
584
+ if (collectFullDiagnostics) {
585
+ settings.CollectFullDiagnostics (true );
586
+ }
571
587
return settings;
572
588
}
573
589
Y_UNREACHABLE ();
@@ -674,7 +690,7 @@ int TCommandExecuteQuery::ExecuteQueryImpl(TConfig& config) {
674
690
if (OperationTimeout) {
675
691
optTimeout = TDuration::MilliSeconds (FromString<ui64>(OperationTimeout));
676
692
}
677
- const auto settings = GetSettings<TClient>(CollectStatsMode, BasicStats, optTimeout);
693
+ const auto settings = GetSettings<TClient>(CollectStatsMode, BasicStats, optTimeout, CollectFullDiagnostics );
678
694
679
695
TAsyncPartIterator<TClient> asyncResult;
680
696
SetInterruptHandlers ();
@@ -732,6 +748,7 @@ template <typename TIterator>
732
748
bool TCommandExecuteQuery::PrintQueryResponse (TIterator& result) {
733
749
TMaybe<TString> stats;
734
750
TMaybe<TString> fullStats;
751
+ TString diagnostics;
735
752
{
736
753
TResultSetPrinter printer (OutputFormat, &IsInterrupted);
737
754
@@ -753,6 +770,8 @@ bool TCommandExecuteQuery::PrintQueryResponse(TIterator& result) {
753
770
fullStats = queryStats.GetPlan ();
754
771
}
755
772
}
773
+
774
+ diagnostics = streamPart.GetDiagnostics ();
756
775
}
757
776
} // TResultSetPrinter destructor should be called before printing stats
758
777
@@ -767,6 +786,12 @@ bool TCommandExecuteQuery::PrintQueryResponse(TIterator& result) {
767
786
queryPlanPrinter.Print (*fullStats);
768
787
}
769
788
789
+ if (CollectFullDiagnostics)
790
+ {
791
+ TFileOutput file (TStringBuilder () << " diagnostics_" << TGUID::Create ().AsGuidString () << " .txt" );
792
+ file << diagnostics;
793
+ }
794
+
770
795
PrintFlameGraph (fullStats);
771
796
772
797
if (IsInterrupted ()) {
0 commit comments