aboutsummaryrefslogtreecommitdiffstats
path: root/yql/essentials/providers/common/udf_resolve/yql_udf_resolver_logger.cpp
blob: d09d7cfafceb4d85d64270bface449aaeb45bae4 (plain) (blame)
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);
}
}