1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
#include "yql_udf_resolver_logger.h"
#include <yql/essentials/core/yql_user_data_storage.h>
#include <util/stream/file.h>
#include <util/string/builder.h>
#include <util/datetime/cputimer.h>
namespace {
using namespace NYql;
class TUdfResolverWithLoggerDecorator : public IUdfResolver {
public:
TUdfResolverWithLoggerDecorator(IUdfResolver::TPtr underlying, const TString& path, const TString& sessionId)
: Underlying_(underlying), Out_(TFile(path, WrOnly | ForAppend | OpenAlways)), SessionId_(sessionId) {}
TMaybe<TFilePathWithMd5> GetSystemModulePath(const TStringBuf& moduleName) const override {
return Underlying_->GetSystemModulePath(moduleName);
}
bool LoadMetadata(
const TVector<TImport*>& imports, const TVector<TFunction*>& functions,
TExprContext& ctx, NUdf::ELogLevel logLevel, THoldingFileStorage& storage) const override
{
TSimpleTimer t;
auto result = Underlying_->LoadMetadata(imports, functions, ctx, logLevel, storage);
auto runningTime = t.Get().MilliSeconds();
TStringBuilder sb;
sb << SessionId_ << " LoadMetadata with imports (";
for (auto& e: imports) {
if (!e || !e->Block) {
continue;
}
auto frozen = e->Block->Type != EUserDataType::URL ? e->Block->FrozenFile : storage.GetFrozenBlock(*e->Block);
if (!frozen) {
continue;
}
sb << " " << frozen->GetMd5() << ":" << frozen->GetSize();
}
sb << ") took " << runningTime << " ms\n";
Out_ << TString(sb);
return result;
}
TResolveResult LoadRichMetadata(const TVector<TImport>& imports, NUdf::ELogLevel logLevel, THoldingFileStorage& storage) const override {
TSimpleTimer t;
auto result = Underlying_->LoadRichMetadata(imports, logLevel, storage);
auto runningTime = t.Get().MilliSeconds();
TStringBuilder sb;
sb << SessionId_ << " LoadRichMetadata with imports (";
for (auto& e: imports) {
if (!e.Block) {
continue;
}
auto frozen = e.Block->Type != EUserDataType::URL ? e.Block->FrozenFile : storage.GetFrozenBlock(*e.Block);
if (!frozen) {
continue;
}
sb << " " << frozen->GetMd5() << ":" << frozen->GetSize();
}
sb << ") took " << runningTime << " ms\n";
Out_ << TString(sb);
return result;
}
bool ContainsModule(const TStringBuf& moduleName) const override {
return Underlying_->ContainsModule(moduleName);
}
private:
IUdfResolver::TPtr Underlying_;
mutable TUnbufferedFileOutput Out_;
TString SessionId_;
};
}
namespace NYql::NCommon {
IUdfResolver::TPtr CreateUdfResolverDecoratorWithLogger(IUdfResolver::TPtr underlying, const TString& path, const TString& sessionId) {
return new TUdfResolverWithLoggerDecorator(underlying, path, sessionId);
}
}
|