VRS
A file format for sensor data.
Loading...
Searching...
No Matches
TelemetryLogger.h
1/*
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#include <atomic>
20#include <memory>
21#include <string>
22
23namespace vrs {
24
25using std::string;
26
29 string operation;
30 string sourceLocation;
31
32 OperationContext() = default;
33 OperationContext(string op, string sourceLoc)
34 : operation{std::move(op)}, sourceLocation{std::move(sourceLoc)} {}
35 OperationContext(const OperationContext& rhs) = default;
36 OperationContext(OperationContext&& rhs) noexcept = default;
37 ~OperationContext() = default;
38
39 OperationContext& operator=(const OperationContext& rhs) = default;
40 OperationContext& operator=(OperationContext&& rhs) noexcept = default;
41
42 bool operator<(const OperationContext& rhs) const {
43 auto tie = [](const OperationContext& oc) { return std::tie(oc.operation, oc.sourceLocation); };
44 return tie(*this) < tie(rhs);
45 }
46};
47
49struct LogEvent {
50 LogEvent() = default;
51 LogEvent(std::string type, OperationContext opContext, std::string message, string serverReply)
52 : type{std::move(type)},
53 operationContext{std::move(opContext)},
54 message{std::move(message)},
55 serverReply{std::move(serverReply)} {}
56 LogEvent(const LogEvent& rhs) = default;
57 LogEvent(LogEvent&& rhs) noexcept = default;
58 ~LogEvent() = default;
59
60 LogEvent& operator=(const LogEvent& rhs) = default;
61 LogEvent& operator=(LogEvent&& rhs) noexcept = default;
62
63 std::string type;
64 OperationContext operationContext;
65 std::string message;
66 std::string serverReply;
67};
68
76 bool isSuccess = false;
77 bool uploadNotDownload = false;
78 int64_t transferStartTime = 0; // start time
79 int64_t totalDurationMs = -1; // overall request duration, including retries
80 int64_t transferDurationMs = -1; // last network transfer duration (last attempt)
81 size_t transferOffset = 0; // offset to read from
82 size_t transferRequestSize = 0; // bytes
83 size_t transferSize = 0; // bytes
84 size_t retryCount = 0;
85 size_t errorCount = 0;
86 size_t error429Count = 0;
87 long httpStatus = -1;
88 string serverName;
89
90 TrafficEvent& setIsSuccess(bool success) {
91 isSuccess = success;
92 return *this;
93 }
94 TrafficEvent& setIsUpload() {
95 uploadNotDownload = true;
96 return *this;
97 }
98 TrafficEvent& setIsDownload() {
99 uploadNotDownload = false;
100 return *this;
101 }
102 TrafficEvent& setAttemptStartTime();
103 TrafficEvent& setTotalDurationMs(int64_t durationMs) {
104 totalDurationMs = durationMs;
105 return *this;
106 }
107 TrafficEvent& setTransferDurationMs(int64_t aTransferDurationMs) {
108 transferDurationMs = aTransferDurationMs;
109 return *this;
110 }
111 TrafficEvent& setTransferOffset(size_t offset) {
112 transferOffset = offset;
113 return *this;
114 }
115 TrafficEvent& setTransferRequestSize(size_t aTransferRequestSize) {
116 transferRequestSize = aTransferRequestSize;
117 return *this;
118 }
119 TrafficEvent& setTransferSize(size_t aTransferSize) {
120 transferSize = aTransferSize;
121 return *this;
122 }
123 TrafficEvent& setRetryCount(size_t aRetryCount) {
124 retryCount = aRetryCount;
125 return *this;
126 }
127 TrafficEvent& setError429Count(size_t anError429Count) {
128 error429Count = anError429Count;
129 return *this;
130 }
131 TrafficEvent& setErrorCount(size_t anErrorCount) {
132 errorCount = anErrorCount;
133 return *this;
134 }
135 TrafficEvent& setHttpStatus(long status) {
136 httpStatus = status;
137 return *this;
138 }
139 TrafficEvent& setUrl(const string& aServerName);
140};
141
148 public:
149 virtual ~TelemetryLogger();
150
151 static constexpr const char* kErrorType = "error";
152 static constexpr const char* kWarningType = "warning";
153 static constexpr const char* kInfoType = "info";
154
158 static void setLogger(std::unique_ptr<TelemetryLogger> telemetryLogger = nullptr);
159
161 static inline void error(
162 const OperationContext& operationContext,
163 const string& message,
164 const string& serverMessage = {}) {
165 getInstance()->logEvent(LogEvent(kErrorType, operationContext, message, serverMessage));
166 }
167 static inline void warning(
168 const OperationContext& operationContext,
169 const string& message,
170 const string& serverMessage = {}) {
171 getInstance()->logEvent(LogEvent(kWarningType, operationContext, message, serverMessage));
172 }
173 static inline void info(
174 const OperationContext& operationContext,
175 const string& message,
176 const string& serverMessage = {}) {
177 getInstance()->logEvent(LogEvent(kInfoType, operationContext, message, serverMessage));
178 }
179 static inline void event(
180 const std::string& eventType,
181 const OperationContext& operationContext,
182 const string& message,
183 const string& serverMessage = {}) {
184 getInstance()->logEvent(LogEvent(eventType, operationContext, message, serverMessage));
185 }
186 static inline void traffic(const OperationContext& operationContext, const TrafficEvent& event) {
187 getInstance()->logTraffic(operationContext, event);
188 }
189 static inline void flush() {
190 getInstance()->flushEvents();
191 }
192
194 virtual void logEvent(LogEvent&& event);
195 virtual void logTraffic(const OperationContext& operationContext, const TrafficEvent& event);
196 virtual void flushEvents() {}
197
199 virtual void start() {}
202 virtual void stop() {}
203
204 private:
205 static TelemetryLogger* getDefaultLogger();
206 static std::atomic<TelemetryLogger*>& getCurrentLogger();
207
208 static inline TelemetryLogger* getInstance() {
209 return getCurrentLogger().load(std::memory_order_relaxed);
210 }
211};
212
213} // namespace vrs
TelemetryLogger to report important events.
Definition TelemetryLogger.h:147
virtual void start()
Start telemetry: background threads should be started, as needed.
Definition TelemetryLogger.h:199
virtual void stop()
Definition TelemetryLogger.h:202
static void setLogger(std::unique_ptr< TelemetryLogger > telemetryLogger=nullptr)
Definition TelemetryLogger.cpp:42
virtual void logEvent(LogEvent &&event)
Actual methods that implement the behaviors.
Definition TelemetryLogger.cpp:59
static void error(const OperationContext &operationContext, const string &message, const string &serverMessage={})
methods for clients to use without having to get an instance, etc
Definition TelemetryLogger.h:161
Definition Compressor.cpp:113
General purpose telemetry event.
Definition TelemetryLogger.h:49
Context description for telemetry events.
Definition TelemetryLogger.h:28
Telemetry event specialized to report cloud traffic.
Definition TelemetryLogger.h:75