• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #ifndef FRAMEWORK_NATIVE_UNIFIED_COLLECTION_COLLECTOR_TRACE_HANDLER_H
16 #define FRAMEWORK_NATIVE_UNIFIED_COLLECTION_COLLECTOR_TRACE_HANDLER_H
17 #include <string>
18 #include <vector>
19 
20 #include "trace_utils.h"
21 #include "file_util.h"
22 #include "string_util.h"
23 #include "ffrt.h"
24 #include "singleton.h"
25 
26 namespace OHOS::HiviewDFX {
27 using HandleCallback = std::function<void(int64_t)>;
28 using UcollectionTask = std::function<void ()>;
29 
30 class TraceWorker : public DelayedRefSingleton<TraceWorker> {
31 public:
32     void HandleUcollectionTask(UcollectionTask ucollectionTask);
33 
34 private:
35     std::unique_ptr<ffrt::queue> ffrtQueue_ = std::make_unique<ffrt::queue>("dft_trace_worker");
36 };
37 
38 class TraceHandler {
39 public:
TraceHandler(const std::string & tracePath,const std::string & caller,uint32_t cleanThreshold)40     TraceHandler(const std::string& tracePath, const std::string& caller, uint32_t cleanThreshold)
41         : tracePath_(tracePath), caller_(caller), cleanThreshold_(cleanThreshold) {}
42     virtual ~TraceHandler() = default;
43     virtual auto HandleTrace(const std::vector<std::string>& outputFiles, HandleCallback callback = {},
44         std::shared_ptr<AppCallerEvent> appCallerEvent = nullptr) -> std::vector<std::string> = 0;
45     virtual std::string GetTraceFinalPath(const std::string& tracePath, const std::string& prefix) = 0;
46 
47 protected:
48     virtual void DoClean(const std::string& business);
49 
50 protected:
51     std::string tracePath_;
52     std::string caller_;
53     uint32_t cleanThreshold_;
54 };
55 
56 class TraceZipHandler : public TraceHandler, public std::enable_shared_from_this<TraceZipHandler> {
57 public:
TraceZipHandler(const std::string & tracePath,const std::string & caller,uint32_t cleanThreshold)58     TraceZipHandler(const std::string& tracePath, const std::string& caller, uint32_t cleanThreshold)
59         : TraceHandler(tracePath, caller, cleanThreshold) {}
60     auto HandleTrace(const std::vector<std::string>& outputFiles, HandleCallback callback = {},
61         std::shared_ptr<AppCallerEvent> appCallerEvent = nullptr) -> std::vector<std::string> override;
GetTraceFinalPath(const std::string & fileName,const std::string & prefix)62     std::string GetTraceFinalPath(const std::string& fileName, const std::string& prefix) override
63     {
64         auto tempZipName = tracePath_ + StringUtil::ReplaceStr(FileUtil::ExtractFileName(fileName), ".sys", ".zip");
65         return AddVersionInfoToZipName(tempZipName);
66     }
67 
68 private:
69     std::string GetTraceZipTmpPath(const std::string& fileName);
70     void AddZipFile(const std::string& srcPath, const std::string& traceZipFile);
71     void ZipTraceFile(const std::string& srcPath, const std::string& traceZipFile, const std::string& tmpZipFile);
72 };
73 
74 class TraceCopyHandler : public TraceHandler, public std::enable_shared_from_this<TraceCopyHandler> {
75 public:
TraceCopyHandler(const std::string & tracePath,const std::string & caller,uint32_t cleanThreshold)76     TraceCopyHandler(const std::string& tracePath, const std::string& caller, uint32_t cleanThreshold)
77         : TraceHandler(tracePath, caller, cleanThreshold) {}
78     auto HandleTrace(const std::vector<std::string>& outputFiles, HandleCallback callback,
79         std::shared_ptr<AppCallerEvent> appCallerEvent) -> std::vector<std::string> override;
80 
81 protected:
82     void CopyTraceFile(const std::string& src, const std::string& dst);
83 
GetTraceFinalPath(const std::string & tracePath,const std::string & prefix)84     std::string GetTraceFinalPath(const std::string& tracePath, const std::string& prefix) override
85     {
86         return tracePath_ + prefix + "_" + FileUtil::ExtractFileName(tracePath);
87     }
88 };
89 
90 class TraceSyncCopyHandler : public TraceCopyHandler {
91 public:
TraceSyncCopyHandler(const std::string & tracePath,const std::string & caller,uint32_t cleanThreshold)92     TraceSyncCopyHandler(const std::string& tracePath, const std::string& caller, uint32_t cleanThreshold)
93         : TraceCopyHandler(tracePath, caller, cleanThreshold) {}
94     auto HandleTrace(const std::vector<std::string>& outputFiles, HandleCallback callback,
95         std::shared_ptr<AppCallerEvent> appCallerEvent) -> std::vector<std::string> override;
96 };
97 
98 class TraceAppHandler : public TraceHandler {
99 public:
TraceAppHandler(const std::string & tracePath,uint32_t cleanThreshold)100     explicit TraceAppHandler(const std::string& tracePath, uint32_t cleanThreshold)
101         : TraceHandler(tracePath, ClientName::APP, cleanThreshold) {}
102     auto HandleTrace(const std::vector<std::string>& outputFiles, HandleCallback callback,
103         std::shared_ptr<AppCallerEvent> appCallerEvent) -> std::vector<std::string> override;
104 
GetTraceFinalPath(const std::string & tracePath,const std::string & prefix)105     std::string GetTraceFinalPath(const std::string& tracePath, const std::string& prefix) override
106     {
107         return "";
108     }
109 
110 private:
111     std::string MakeTraceFileName(std::shared_ptr<AppCallerEvent> appCallerEvent);
112 };
113 }
114 #endif
115