Skip to content

Commit 6548944

Browse files
authored
YQ-2628: Print stats on final status log (#563)
1 parent 8288f5c commit 6548944

File tree

7 files changed

+206
-5
lines changed

7 files changed

+206
-5
lines changed

ydb/core/fq/libs/control_plane_storage/events/events.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -795,11 +795,15 @@ struct TEvControlPlaneStorage {
795795
};
796796

797797
struct TEvFinalStatusReport : NActors::TEventLocal<TEvFinalStatusReport, EvFinalStatusReport> {
798-
TEvFinalStatusReport(const TString& queryId, const TString& jobId, const TString& cloudId, const TString& scope, FederatedQuery::QueryMeta::ComputeStatus status, const NYql::TIssues& issues, const NYql::TIssues& transientIssues)
798+
TEvFinalStatusReport(
799+
const TString& queryId, const TString& jobId, const TString& cloudId, const TString& scope,
800+
std::vector<std::pair<TString, ui64>>&& statistics, FederatedQuery::QueryMeta::ComputeStatus status,
801+
const NYql::TIssues& issues, const NYql::TIssues& transientIssues)
799802
: QueryId(queryId)
800803
, JobId(jobId)
801804
, CloudId(cloudId)
802805
, Scope(scope)
806+
, Statistics(std::move(statistics))
803807
, Status(status)
804808
, Issues(issues)
805809
, TransientIssues(transientIssues)
@@ -809,6 +813,7 @@ struct TEvControlPlaneStorage {
809813
TString JobId;
810814
TString CloudId;
811815
TString Scope;
816+
std::vector<std::pair<TString, ui64>> Statistics;
812817
FederatedQuery::QueryMeta::ComputeStatus Status = FederatedQuery::QueryMeta::COMPUTE_STATUS_UNSPECIFIED;
813818
NYql::TIssues Issues;
814819
NYql::TIssues TransientIssues;

ydb/core/fq/libs/control_plane_storage/internal/task_ping.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ TPingTaskParams ConstructHardPingTask(
5151
const TString& tablePathPrefix, const TDuration& automaticQueriesTtl, const TDuration& taskLeaseTtl,
5252
const THashMap<ui64, TRetryPolicyItem>& retryPolicies, ::NMonitoring::TDynamicCounterPtr rootCounters,
5353
uint64_t maxRequestSize, bool dumpRawStatistics, const std::shared_ptr<TFinalStatus>& finalStatus,
54-
const TRequestCommonCountersPtr& commonCounters) {
54+
const TRequestCommonCountersPtr& commonCounters, const std::shared_ptr<StatsValuesList>& finalStatistics) {
5555

5656
auto scope = request.scope();
5757
auto query_id = request.query_id().value();
@@ -253,10 +253,14 @@ TPingTaskParams ConstructHardPingTask(
253253

254254
if (request.statistics()) {
255255
TString statistics = request.statistics();
256+
internal.clear_statistics();
257+
PackStatisticsToProtobuf(*internal.mutable_statistics(), statistics);
258+
256259
if (!dumpRawStatistics) {
257260
try {
258261
statistics = GetPrettyStatistics(statistics);
259262
} catch (const std::exception&) {
263+
// LOG_AS?
260264
CPS_LOG_E("Error on statistics prettification: " << CurrentExceptionMessage());
261265
}
262266
}
@@ -482,6 +486,7 @@ TPingTaskParams ConstructHardPingTask(
482486
// YQv2 may not provide statistics with terminal status, use saved one
483487
statistics = query.statistics().json();
484488
}
489+
*finalStatistics = ExtractStatisticsFromProtobuf(internal.statistics());
485490
auto records = GetMeteringRecords(statistics, isBillable, jobId, request.scope(), HostName());
486491
meteringRecords->swap(records);
487492
} catch (const std::exception&) {
@@ -597,11 +602,12 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvPingTaskReq
597602

598603
std::shared_ptr<Fq::Private::PingTaskResult> response = std::make_shared<Fq::Private::PingTaskResult>();
599604
std::shared_ptr<TFinalStatus> finalStatus = std::make_shared<TFinalStatus>();
605+
std::shared_ptr finalStatistics = std::make_shared<StatsValuesList>();
600606

601607
auto pingTaskParams = DoesPingTaskUpdateQueriesTable(request) ?
602608
ConstructHardPingTask(request, response, YdbConnection->TablePathPrefix, Config->AutomaticQueriesTtl,
603609
Config->TaskLeaseTtl, Config->RetryPolicies, Counters.Counters, Config->Proto.GetMaxRequestSize(),
604-
Config->Proto.GetDumpRawStatistics(), finalStatus, requestCounters.Common) :
610+
Config->Proto.GetDumpRawStatistics(), finalStatus, requestCounters.Common, finalStatistics) :
605611
ConstructSoftPingTask(request, response, YdbConnection->TablePathPrefix, Config->TaskLeaseTtl, requestCounters.Common);
606612
auto debugInfo = Config->Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{};
607613
auto result = ReadModifyWrite(pingTaskParams.Query, pingTaskParams.Params, pingTaskParams.Prepare, requestCounters, debugInfo);
@@ -628,7 +634,9 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvPingTaskReq
628634
}
629635

630636
if (success) {
631-
actorSystem->Send(ControlPlaneStorageServiceActorId(), new TEvControlPlaneStorage::TEvFinalStatusReport(request.query_id().value(), request.job_id().value(), cloudId, scope, finalStatus->Status, finalStatus->Issues, finalStatus->TransientIssues));
637+
actorSystem->Send(ControlPlaneStorageServiceActorId(), new TEvControlPlaneStorage::TEvFinalStatusReport(
638+
request.query_id().value(), request.job_id().value(), cloudId, scope, std::move(*finalStatistics),
639+
finalStatus->Status, finalStatus->Issues, finalStatus->TransientIssues));
632640
}
633641
});
634642
}
@@ -644,7 +652,11 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvFinalStatus
644652
}
645653

646654
Counters.GetFinalStatusCounters(event.CloudId, event.Scope)->IncByStatus(event.Status);
647-
LOG_YQ_AUDIT_SERVICE_INFO("FinalStatus: cloud id: [" << event.CloudId << "], scope: [" << event.Scope << "], query id: [" << event.QueryId << "], job id: [" << event.JobId << "], status: " << FederatedQuery::QueryMeta::ComputeStatus_Name(event.Status));
655+
656+
Statistics statistics{event.Statistics};
657+
LOG_YQ_AUDIT_SERVICE_INFO("FinalStatus: cloud id: [" << event.CloudId << "], scope: [" << event.Scope << "], query id: [" <<
658+
event.QueryId << "], job id: [" << event.JobId << "], " << statistics << (statistics ? ", " : "") <<
659+
"status: " << FederatedQuery::QueryMeta::ComputeStatus_Name(event.Status));
648660
}
649661

650662

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#include <library/cpp/testing/unittest/registar.h>
2+
#include <ydb/core/fq/libs/control_plane_storage/internal/utils.h>
3+
#include <ydb/core/fq/libs/control_plane_storage/proto/yq_internal.pb.h>
4+
5+
namespace NFq {
6+
7+
Y_UNIT_TEST_SUITE(ParseStats) {
8+
Y_UNIT_TEST(ParseV2) {
9+
FederatedQuery::Internal::QueryInternal internal;
10+
auto statisticsPtr = internal.mutable_statistics();
11+
PackStatisticsToProtobuf(*statisticsPtr, R"({"ResultSet":{"01_1_Stage-Source":{"SourceCpuTimeUs":{"sum":"828us","count":1,"avg":"828us","max":"828us","min":"828us"},"Output=3":{"Pop":{"Chunks":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"Rows":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"LastMessageMs":{"avg":"11:01:10.88s","sum":"0.00s","count":1,"max":"11:01:10.88s","min":"11:01:10.88s"},"ActiveMessageMs":{"sum":"0.00s","count":1,"max":"11:01:10.88s","min":"11:01:10.88s"},"FirstMessageMs":{"avg":"11:01:10.88s","sum":"0.00s","count":1,"max":"11:01:10.88s","min":"11:01:10.88s"},"Bytes":{"sum":8,"count":1,"avg":8,"max":8,"min":8}},"Push":{"LastMessageMs":{"avg":"11:01:10.88s","sum":"0.00s","count":1,"max":"11:01:10.88s","min":"11:01:10.88s"},"Rows":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"Chunks":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"ResumeMessageMs":{"avg":"11:01:10.88s","sum":"0.00s","count":1,"max":"11:01:10.88s","min":"11:01:10.88s"},"FirstMessageMs":{"avg":"11:01:10.88s","sum":"0.00s","count":1,"max":"11:01:10.88s","min":"11:01:10.88s"},"ActiveMessageMs":{"sum":"0.00s","count":1,"max":"11:01:10.88s","min":"11:01:10.88s"},"PauseMessageMs":{"avg":"11:01:10.81s","sum":"0.00s","count":1,"max":"11:01:10.81s","min":"11:01:10.81s"},"WaitTimeUs":{"sum":"72ms","count":1,"avg":"72ms","max":"72ms","min":"72ms"},"WaitPeriods":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"WaitMessageMs":{"sum":"73ms","count":1,"max":"11:01:10.88s","min":"11:01:10.81s"}}},"MaxMemoryUsage":{"sum":241172480,"count":1,"avg":241172480,"max":241172480,"min":241172480},"TotalDurationMs":{"sum":"00:00:00.09s","count":1},"IngressBytes":{"sum":22,"count":1,"avg":22,"max":22,"min":22},"Tasks":{"sum":1,"count":1},"OutputRows":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"IngressRows":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"CpuTimeUs":{"sum":"1ms","count":1,"avg":"1ms","max":"1ms","min":"1ms"},"OutputBytes":{"sum":8,"count":1,"avg":8,"max":8,"min":8},"Ingress=S3Source":{"Pop":{"Chunks":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"LastMessageMs":{"avg":"11:01:10.88s","sum":"0.00s","count":1,"max":"11:01:10.88s","min":"11:01:10.88s"},"ActiveMessageMs":{"sum":"0.00s","count":1,"max":"11:01:10.88s","min":"11:01:10.88s"},"FirstMessageMs":{"avg":"11:01:10.88s","sum":"0.00s","count":1,"max":"11:01:10.88s","min":"11:01:10.88s"},"Bytes":{"sum":17,"count":1,"avg":17,"max":17,"min":17}},"Ingress":{"Rows":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"LastMessageMs":{"avg":"11:01:10.88s","sum":"0.00s","count":1,"max":"11:01:10.88s","min":"11:01:10.88s"},"Chunks":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"ResumeMessageMs":{"avg":"11:01:10.88s","sum":"0.00s","count":1,"max":"11:01:10.88s","min":"11:01:10.88s"},"FirstMessageMs":{"avg":"11:01:10.88s","sum":"0.00s","count":1,"max":"11:01:10.88s","min":"11:01:10.88s"},"ActiveMessageMs":{"sum":"0.00s","count":1,"max":"11:01:10.88s","min":"11:01:10.88s"},"Bytes":{"sum":22,"count":1,"avg":22,"max":22,"min":22},"Splits":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"PauseMessageMs":{"avg":"11:01:10.80s","sum":"0.00s","count":1,"max":"11:01:10.80s","min":"11:01:10.80s"},"WaitTimeUs":{"sum":"86ms","count":1,"avg":"86ms","max":"86ms","min":"86ms"},"WaitPeriods":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"WaitMessageMs":{"sum":"86ms","count":1,"max":"11:01:10.88s","min":"11:01:10.80s"}},"Push":{"LastMessageMs":{"avg":"11:01:10.88s","sum":"0.00s","count":1,"max":"11:01:10.88s","min":"11:01:10.88s"},"Chunks":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"ResumeMessageMs":{"avg":"11:01:10.88s","sum":"0.00s","count":1,"max":"11:01:10.88s","min":"11:01:10.88s"},"FirstMessageMs":{"avg":"11:01:10.88s","sum":"0.00s","count":1,"max":"11:01:10.88s","min":"11:01:10.88s"},"ActiveMessageMs":{"sum":"0.00s","count":1,"max":"11:01:10.88s","min":"11:01:10.88s"},"Bytes":{"sum":17,"count":1,"avg":17,"max":17,"min":17},"PauseMessageMs":{"avg":"11:01:10.80s","sum":"0.00s","count":1,"max":"11:01:10.80s","min":"11:01:10.80s"},"WaitTimeUs":{"sum":"86ms","count":1,"avg":"86ms","max":"86ms","min":"86ms"},"WaitPeriods":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"WaitMessageMs":{"sum":"86ms","count":1,"max":"11:01:10.88s","min":"11:01:10.80s"}}}},"02_3_Collect":{"Output=RESULT":{"Pop":{"Chunks":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"Rows":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"LastMessageMs":{"avg":"11:01:10.89s","sum":"0.00s","count":1,"max":"11:01:10.89s","min":"11:01:10.89s"},"ActiveMessageMs":{"sum":"0.00s","count":1,"max":"11:01:10.89s","min":"11:01:10.89s"},"FirstMessageMs":{"avg":"11:01:10.89s","sum":"0.00s","count":1,"max":"11:01:10.89s","min":"11:01:10.89s"},"Bytes":{"sum":8,"count":1,"avg":8,"max":8,"min":8}},"Push":{"LastMessageMs":{"avg":"11:01:10.89s","sum":"0.00s","count":1,"max":"11:01:10.89s","min":"11:01:10.89s"},"Rows":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"Chunks":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"ResumeMessageMs":{"avg":"11:01:10.89s","sum":"0.00s","count":1,"max":"11:01:10.89s","min":"11:01:10.89s"},"FirstMessageMs":{"avg":"11:01:10.89s","sum":"0.00s","count":1,"max":"11:01:10.89s","min":"11:01:10.89s"},"ActiveMessageMs":{"sum":"0.00s","count":1,"max":"11:01:10.89s","min":"11:01:10.89s"},"PauseMessageMs":{"avg":"11:01:10.81s","sum":"0.00s","count":1,"max":"11:01:10.81s","min":"11:01:10.81s"},"WaitTimeUs":{"sum":"77ms","count":1,"avg":"77ms","max":"77ms","min":"77ms"},"WaitPeriods":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"WaitMessageMs":{"sum":"77ms","count":1,"max":"11:01:10.89s","min":"11:01:10.81s"}}},"MaxMemoryUsage":{"sum":31457280,"count":1,"avg":31457280,"max":31457280,"min":31457280},"TotalDurationMs":{"sum":"00:00:00.08s","count":1},"InputBytes":{"sum":8,"count":1,"avg":8,"max":8,"min":8},"ResultRows":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"Tasks":{"sum":1,"count":1},"ResultBytes":{"sum":8,"count":1,"avg":8,"max":8,"min":8},"OutputRows":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"InputRows":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"CpuTimeUs":{"sum":"771us","count":1,"avg":"771us","max":"771us","min":"771us"},"OutputBytes":{"sum":8,"count":1,"avg":8,"max":8,"min":8},"Input=1":{"Pop":{"Chunks":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"Rows":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"LastMessageMs":{"avg":"11:01:10.89s","sum":"0.00s","count":1,"max":"11:01:10.89s","min":"11:01:10.89s"},"ActiveMessageMs":{"sum":"0.00s","count":1,"max":"11:01:10.89s","min":"11:01:10.89s"},"FirstMessageMs":{"avg":"11:01:10.89s","sum":"0.00s","count":1,"max":"11:01:10.89s","min":"11:01:10.89s"},"Bytes":{"sum":8,"count":1,"avg":8,"max":8,"min":8}},"Push":{"Rows":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"LastMessageMs":{"avg":"11:01:10.89s","sum":"0.00s","count":1,"max":"11:01:10.89s","min":"11:01:10.89s"},"Chunks":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"ResumeMessageMs":{"avg":"11:01:10.89s","sum":"0.00s","count":1,"max":"11:01:10.89s","min":"11:01:10.89s"},"FirstMessageMs":{"avg":"11:01:10.89s","sum":"0.00s","count":1,"max":"11:01:10.89s","min":"11:01:10.89s"},"ActiveMessageMs":{"sum":"0.00s","count":1,"max":"11:01:10.89s","min":"11:01:10.89s"},"Bytes":{"sum":8,"count":1,"avg":8,"max":8,"min":8},"PauseMessageMs":{"avg":"11:01:10.81s","sum":"0.00s","count":1,"max":"11:01:10.81s","min":"11:01:10.81s"},"WaitTimeUs":{"sum":"77ms","count":1,"avg":"77ms","max":"77ms","min":"77ms"},"WaitPeriods":{"sum":1,"count":1,"avg":1,"max":1,"min":1},"WaitMessageMs":{"sum":"77ms","count":1,"max":"11:01:10.89s","min":"11:01:10.81s"}}}},"MaxMemoryUsage":{"min":31457280,"max":241172480,"avg":136314880,"sum":272629760,"count":2},"CpuTimeUs":{"min":"771us","max":"1ms","avg":"1ms","sum":"2ms","count":2},"SourceCpuTimeUs":{"min":"828us","max":"828us","avg":"828us","sum":"828us","count":1},"InputBytes":{"min":8,"max":8,"avg":8,"sum":8,"count":1},"InputRows":{"min":1,"max":1,"avg":1,"sum":1,"count":1},"OutputBytes":{"min":8,"max":8,"avg":8,"sum":16,"count":2},"OutputRows":{"min":1,"max":1,"avg":1,"sum":2,"count":2},"ResultBytes":{"min":8,"max":8,"avg":8,"sum":8,"count":1},"ResultRows":{"min":1,"max":1,"avg":1,"sum":1,"count":1},"IngressBytes":{"min":22,"max":22,"avg":22,"sum":22,"count":1},"IngressRows":{"min":1,"max":1,"avg":1,"sum":1,"count":1}}})");
12+
13+
std::unordered_map<std::string_view, i64> expected{
14+
{"IngressBytes", 22},
15+
{"InputBytes", 8},
16+
{"OutputBytes", 16},
17+
{"S3Source", 22}};
18+
19+
for (const auto& statsElement : *statisticsPtr) {
20+
const auto& name = statsElement.name();
21+
auto value = statsElement.value();
22+
23+
auto it = expected.find(name);
24+
UNIT_ASSERT(it != expected.end());
25+
UNIT_ASSERT_EQUAL(value, it->second);
26+
}
27+
UNIT_ASSERT_EQUAL(expected.size(), static_cast<size_t>(statisticsPtr->size()));
28+
}
29+
30+
Y_UNIT_TEST(Parse2SourcesV2) {
31+
FederatedQuery::Internal::QueryInternal internal;
32+
auto statisticsPtr = internal.mutable_statistics();
33+
PackStatisticsToProtobuf(*statisticsPtr, R"({"ResultSet": {"01_1_Stage-Source": {"IngressBytes": {"sum": 24,"count": 1,"avg": 24,"max": 24,"min": 24},"OutputBytes": {"sum": 13,"count": 1,"avg": 13,"max": 13,"min": 13},"Ingress=S3Source": {"Ingress": {"Bytes": {"sum": 24,"count": 1,"avg": 24,"max": 24,"min": 24}}}},"02_3_Collect": {"Output=5": {"Pop": {"Bytes": {"sum": 13,"count": 1,"avg": 13,"max": 13,"min": 13}}},"InputBytes": {"sum": 13,"count": 1,"avg": 13,"max": 13,"min": 13},"OutputBytes": {"sum": 13,"count": 1,"avg": 13,"max": 13,"min": 13},"Input=1": {"Pop": {"Bytes": {"sum": 13,"count": 1,"avg": 13,"max": 13,"min": 13}}}},"03_5_InnerJoin (MapJoin)-Source": {"SourceCpuTimeUs": {"sum": "495us","count": 1,"avg": "495us","max": "495us","min": "495us"},"Output=7": {"Pop": {"Bytes": {"sum": 18,"count": 1,"avg": 18,"max": 18,"min": 18}}},"InputBytes": {"sum": 13,"count": 1,"avg": 13,"max": 13,"min": 13},"IngressBytes": {"sum": 22,"count": 1,"avg": 22,"max": 22,"min": 22},"OutputBytes": {"sum": 18,"count": 1,"avg": 18,"max": 18,"min": 18},"Ingress=S3Source": {"Pop": {"Bytes": {"sum": 17,"count": 1,"avg": 17,"max": 17,"min": 17}},"Ingress": {"Bytes": {"sum": 22,"count": 1,"avg": 22,"max": 22,"min": 22}},"Push": {"Bytes": {"sum": 17,"count": 1,"avg": 17,"max": 17,"min": 17}}},"Input=3": {"Pop": {"Bytes": {"sum": 13,"count": 1,"avg": 13,"max": 13,"min": 13}},"Push": {"Bytes": {"sum": 13,"count": 1,"avg": 13,"max": 13,"min": 13}}}},"04_7_Collect": {"Output=RESULT": {"Pop": {"Bytes": {"sum": 18,"count": 1,"avg": 18,"max": 18,"min": 18}},"Push": {"Rows": {"sum": 1,"count": 1,"avg": 1,"max": 1,"min": 1}}},"InputBytes": {"sum": 18,"count": 1,"avg": 18,"max": 18,"min": 18},"OutputBytes": {"sum": 18,"count": 1,"avg": 18,"max": 18,"min": 18},"Input=5": {"Pop": {"Bytes": {"sum": 18,"count": 1,"avg": 18,"max": 18,"min": 18}},"Push": {"Bytes": {"sum": 18,"count": 1,"avg": 18,"max": 18,"min": 18}}}},"InputBytes": {"min": 13,"max": 18,"avg": 14,"sum": 44,"count": 3},"OutputBytes": {"min": 13,"max": 18,"avg": 15,"sum": 62,"count": 4},"IngressBytes": {"min": 22,"max": 24,"avg": 23,"sum": 46,"count": 2}}})");
34+
35+
std::unordered_map<std::string_view, i64> expected{
36+
{"IngressBytes", 46},
37+
{"InputBytes", 44},
38+
{"OutputBytes", 62},
39+
{"S3Source", 46}};
40+
41+
for (const auto& statsElement : *statisticsPtr) {
42+
const auto& name = statsElement.name();
43+
auto value = statsElement.value();
44+
45+
auto it = expected.find(name);
46+
UNIT_ASSERT(it != expected.end());
47+
UNIT_ASSERT_EQUAL(value, it->second);
48+
}
49+
UNIT_ASSERT_EQUAL(expected.size(), static_cast<size_t>(statisticsPtr->size()));
50+
}
51+
}
52+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
UNITTEST_FOR(ydb/core/fq/libs/control_plane_storage/internal)
2+
3+
OWNER(g:yq)
4+
5+
SIZE(MEDIUM)
6+
7+
SRCS(utils_ut.cpp)
8+
9+
PEERDIR(
10+
library/cpp/testing/unittest
11+
library/cpp/json/yson
12+
ydb/library/yql/public/udf/service/stub
13+
)
14+
15+
YQL_LAST_ABI_VERSION()
16+
17+
END()
18+

0 commit comments

Comments
 (0)