aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/lwtrace/control.cpp
blob: ffed9399229fb6de7ae9f61abee05dfecc096c1d (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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include "probes.h" 
 
#include <library/cpp/lwtrace/protos/lwtrace.pb.h> 
 
#include <util/generic/string.h> 
 
namespace NLWTrace { 
 
LWTRACE_USING(LWTRACE_INTERNAL_PROVIDER); 
 
TProbeMap TManager::GetProbesMap() { 
    class TProbeReader 
    { 
    private: 
        TProbeMap& Result; 
 
    public: 
        TProbeReader(TProbeMap& result) 
            : Result(result) 
        {} 
 
        void Push(NLWTrace::TProbe* probe) 
        { 
            Result[std::make_pair(probe->Event.Name, probe->Event.GetProvider())] = probe; 
        } 
    }; 
 
    TProbeMap result; 
 
    auto reader = TProbeReader(result); 
    ReadProbes(reader); 
    return result; 
} 
 
void TManager::CreateTraceRequest(TTraceRequest& msg, TOrbit& orbit) 
{ 
    msg.SetIsTraced(orbit.HasShuttles()); 
} 
 
bool TManager::HandleTraceRequest( 
    const TTraceRequest& msg, 
    TOrbit& orbit) 
{ 
    if (!msg.GetIsTraced()) { 
        return false; 
    } 
    TParams params; 
    SerializingExecutor->Execute(orbit, params); 
    return true; 
} 
 
TTraceDeserializeStatus TManager::HandleTraceResponse( 
    const TTraceResponse& msg, 
    const TProbeMap& probesMap, 
    TOrbit& orbit, 
    i64 timeOffset, 
    double timeScale) 
{ 
    TTraceDeserializeStatus result; 
    if (!msg.GetTrace().GetEvents().size()) { 
        return result; 
    } 
 
    ui64 prev = EpochNanosecondsToCycles( 
        msg.GetTrace().GetEvents()[0].GetTimestampNanosec()); 
 
    for (auto& v : msg.GetTrace().GetEvents()) { 
        auto it = probesMap.find(std::make_pair(v.GetName(), v.GetProvider())); 
        if (it != probesMap.end()) { 
            TProbe* probe = it->second; 
            TParams params; 
            if(!probe->Event.Signature.DeserializeFromPb(params, v.GetParams())) { 
                LWTRACK(DeserializationError, orbit, probe->Event.Name, probe->Event.GetProvider()); 
                result.AddFailedEventName(v.GetName()); 
            } else { 
                ui64 timestamp = EpochNanosecondsToCycles(v.GetTimestampNanosec()); 
                orbit.AddProbe( 
                    probe, 
                    params, 
                    prev + (timestamp-prev)*timeScale + timeOffset); 
                probe->Event.Signature.DestroyParams(params); 
                prev = timestamp; 
            } 
        } else { 
            result.AddFailedEventName(v.GetName()); 
        } 
    } 
    return result; 
} 
 
void TManager::CreateTraceResponse(TTraceResponse& msg, TOrbit& orbit) 
{ 
    orbit.Serialize(0, *msg.MutableTrace()); 
} 
 
}