1fb726d48Sopenharmony_ci/*
2fb726d48Sopenharmony_ci * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved.
3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb726d48Sopenharmony_ci * You may obtain a copy of the License at
6fb726d48Sopenharmony_ci *
7fb726d48Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8fb726d48Sopenharmony_ci *
9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and
13fb726d48Sopenharmony_ci * limitations under the License.
14fb726d48Sopenharmony_ci */
15fb726d48Sopenharmony_ci
16fb726d48Sopenharmony_ci#ifndef METRICS_H
17fb726d48Sopenharmony_ci#define METRICS_H
18fb726d48Sopenharmony_ci#include <functional>
19fb726d48Sopenharmony_ci#include <map>
20fb726d48Sopenharmony_ci#include <string>
21fb726d48Sopenharmony_ci#include <vector>
22fb726d48Sopenharmony_ci#include "json.hpp"
23fb726d48Sopenharmony_ci#include "memAggStrategy.h"
24fb726d48Sopenharmony_ci#include "memStrategy.h"
25fb726d48Sopenharmony_ci#include "metaDataStrategy.h"
26fb726d48Sopenharmony_ci#include "sysCallStrategy.h"
27fb726d48Sopenharmony_ci#include "traceStateStrategy.h"
28fb726d48Sopenharmony_ci#include "traceTaskStrategy.h"
29fb726d48Sopenharmony_ci#include "ts_common.h"
30fb726d48Sopenharmony_ci
31fb726d48Sopenharmony_cienum METRICS_INDEX {
32fb726d48Sopenharmony_ci    METRICS_TRACE_MEM,
33fb726d48Sopenharmony_ci    METRICS_TRACE_MEM_TOP_TEN,
34fb726d48Sopenharmony_ci    METRICS_TRACE_MEM_UNAGG,
35fb726d48Sopenharmony_ci    METRICS_TRACE_TASK_NAMES,
36fb726d48Sopenharmony_ci    METRICS_TRACE_STATS,
37fb726d48Sopenharmony_ci    METRICS_TRACE_METADATA,
38fb726d48Sopenharmony_ci    METRICS_SYS_CALLS,
39fb726d48Sopenharmony_ci};
40fb726d48Sopenharmony_ci
41fb726d48Sopenharmony_cinamespace SysTuning {
42fb726d48Sopenharmony_cinamespace TraceStreamer {
43fb726d48Sopenharmony_ciconst std::string TRACE_MEM = "trace_mem";
44fb726d48Sopenharmony_ciconst std::string TRACE_MEM_TOP_TEN = "trace_mem_top10";
45fb726d48Sopenharmony_ciconst std::string TRACE_MEM_UNAGG = "trace_mem_unagg";
46fb726d48Sopenharmony_ciconst std::string TRACE_TASK_NAMES = "trace_task_names";
47fb726d48Sopenharmony_ciconst std::string TRACE_STATS = "trace_stats";
48fb726d48Sopenharmony_ciconst std::string TRACE_METADATA = "trace_metadata";
49fb726d48Sopenharmony_ciconst std::string SYS_CALLS = "sys_calls";
50fb726d48Sopenharmony_ciconst std::string PROCESS_METRICES = "process_metrics:{";
51fb726d48Sopenharmony_ciconst std::string PROCESS_NAME = "process_name:";
52fb726d48Sopenharmony_ciconst std::string OVERALL_COUNTERS = "overall_counters:{";
53fb726d48Sopenharmony_ciconst std::string ANON_RSS = "anon_rss:{";
54fb726d48Sopenharmony_ciconst std::string MIN = "min:";
55fb726d48Sopenharmony_ciconst std::string MAX = "max:";
56fb726d48Sopenharmony_ciconst std::string AVG = "avg:";
57fb726d48Sopenharmony_ciconst std::string PROCESS_VALUES = "process_value:{";
58fb726d48Sopenharmony_ciconst std::string TS = "ts:";
59fb726d48Sopenharmony_ciconst std::string OOM_SCORE = "oom_score:";
60fb726d48Sopenharmony_ciconst std::string VALUE = "value:";
61fb726d48Sopenharmony_ciconst std::string FILE_RSS = "file_rss:{";
62fb726d48Sopenharmony_ciconst std::string SWAP = "swap:{";
63fb726d48Sopenharmony_ciconst std::string ANON_AND_SWAP = "anon_and_swap:{";
64fb726d48Sopenharmony_ciconst std::string PROCESS = "process:{";
65fb726d48Sopenharmony_ciconst std::string PID = "pid:";
66fb726d48Sopenharmony_ciconst std::string THREAD_NAME = "thread_name:";
67fb726d48Sopenharmony_ciconst std::string STAT = "stat:{";
68fb726d48Sopenharmony_ciconst std::string NAME = "name:";
69fb726d48Sopenharmony_ciconst std::string COUNT = "count:";
70fb726d48Sopenharmony_ciconst std::string SOURCE = "source:";
71fb726d48Sopenharmony_ciconst std::string SEVERITY = "severity:";
72fb726d48Sopenharmony_ciconst std::string FUNCTION = "function:{";
73fb726d48Sopenharmony_ciconst std::string FUNCTION_NAME = "function_name:";
74fb726d48Sopenharmony_ciconst std::string DUR_MAX = "dur_max:";
75fb726d48Sopenharmony_ciconst std::string DUR_MIN = "dur_min:";
76fb726d48Sopenharmony_ciconst std::string DUR_AVG = "dur_avg:";
77fb726d48Sopenharmony_ciusing json = nlohmann::json;
78fb726d48Sopenharmony_ciclass Metrics {
79fb726d48Sopenharmony_cipublic:
80fb726d48Sopenharmony_ci    Metrics();
81fb726d48Sopenharmony_ci    ~Metrics() {}
82fb726d48Sopenharmony_ci    using ResultCallBack = std::function<void(const std::string /* json result */, int32_t)>;
83fb726d48Sopenharmony_ci    void ParserJson(const std::string &metrics, std::string &result);
84fb726d48Sopenharmony_ci    void PrintMetricsResult(uint32_t metricsIndex, ResultCallBack callback);
85fb726d48Sopenharmony_ci    const auto GetMetricsMap()
86fb726d48Sopenharmony_ci    {
87fb726d48Sopenharmony_ci        return initMetricsMap_;
88fb726d48Sopenharmony_ci    }
89fb726d48Sopenharmony_ci
90fb726d48Sopenharmony_ciprivate:
91fb726d48Sopenharmony_ci    using FuncCall = std::function<void(const std::string &result)>;
92fb726d48Sopenharmony_ci    std::map<std::string, FuncCall> metricsFunction_ = {};
93fb726d48Sopenharmony_ci    void InitMemoryStrategy(const std::string &result);
94fb726d48Sopenharmony_ci    void InitMemoryUnAggStrategy(const std::string &result);
95fb726d48Sopenharmony_ci    void InitMemoryTaskNameStrategy(const std::string &result);
96fb726d48Sopenharmony_ci    void InitTraceStatsStrategy(const std::string &result);
97fb726d48Sopenharmony_ci    void InitTraceMetaDataStrategy(const std::string &result);
98fb726d48Sopenharmony_ci    void InitSysCallStrategy(const std::string &result);
99fb726d48Sopenharmony_ci    std::string JsonFormat(std::string json);
100fb726d48Sopenharmony_ci    std::string GetLevelSpace(int level);
101fb726d48Sopenharmony_ci    void UpdataRepeateValueByTraceMem(std::string &repeateValue, std::string &metricsName);
102fb726d48Sopenharmony_ci    void UpdataRepeateValueByTopTen(std::string &repeateValue, std::string &metricsName);
103fb726d48Sopenharmony_ci    void UpdataRepeateValueByMemUnagg(std::string &repeateValue, std::string &metricsName);
104fb726d48Sopenharmony_ci    void UpdataRepeateValueByTaskNames(std::string &repeateValue, std::string &metricsName);
105fb726d48Sopenharmony_ci    void UpdataRepeateValueByStats(std::string &repeateValue, std::string &metricsName);
106fb726d48Sopenharmony_ci    void UpdataRepeateValueByMetadata(std::string &repeateValue, std::string &metricsName);
107fb726d48Sopenharmony_ci    void UpdataRepeateValueBySysCalls(std::string &repeateValue, std::string &metricsName);
108fb726d48Sopenharmony_ci    std::vector<ProcessMetricsItems> memStrategy_ = {};
109fb726d48Sopenharmony_ci    std::vector<ProcessValuesItem> memAggStrategy_ = {};
110fb726d48Sopenharmony_ci    std::vector<TaskProcessItem> taskNameStrategy_ = {};
111fb726d48Sopenharmony_ci    std::vector<StatItem> statStrategy_ = {};
112fb726d48Sopenharmony_ci    std::vector<TraceMetadataItem> metaDataStrategy_ = {};
113fb726d48Sopenharmony_ci    std::vector<FunctionItem> sysCallStrategy_ = {};
114fb726d48Sopenharmony_ci    std::map<int, std::string> initMetricsMap_ = {};
115fb726d48Sopenharmony_ci};
116fb726d48Sopenharmony_ci} // namespace TraceStreamer
117fb726d48Sopenharmony_ci} // namespace SysTuning
118fb726d48Sopenharmony_ci
119fb726d48Sopenharmony_ci#endif // METRICS_H