1*14675a02SAndroid Build Coastguard Worker // Copyright 2019 Google LLC 2*14675a02SAndroid Build Coastguard Worker // 3*14675a02SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 4*14675a02SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 5*14675a02SAndroid Build Coastguard Worker // You may obtain a copy of the License at 6*14675a02SAndroid Build Coastguard Worker // 7*14675a02SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0 8*14675a02SAndroid Build Coastguard Worker // 9*14675a02SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*14675a02SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 11*14675a02SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*14675a02SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 13*14675a02SAndroid Build Coastguard Worker // limitations under the License. 14*14675a02SAndroid Build Coastguard Worker 15*14675a02SAndroid Build Coastguard Worker #ifndef FCP_TRACING_TRACING_TRAITS_H_ 16*14675a02SAndroid Build Coastguard Worker #define FCP_TRACING_TRACING_TRAITS_H_ 17*14675a02SAndroid Build Coastguard Worker 18*14675a02SAndroid Build Coastguard Worker #include <memory> 19*14675a02SAndroid Build Coastguard Worker #include <string> 20*14675a02SAndroid Build Coastguard Worker 21*14675a02SAndroid Build Coastguard Worker #include "absl/base/attributes.h" 22*14675a02SAndroid Build Coastguard Worker #include "fcp/tracing/tracing_severity.h" 23*14675a02SAndroid Build Coastguard Worker #include "fcp/tracing/tracing_tag.h" 24*14675a02SAndroid Build Coastguard Worker #include "flatbuffers/flatbuffers.h" 25*14675a02SAndroid Build Coastguard Worker 26*14675a02SAndroid Build Coastguard Worker namespace fcp { 27*14675a02SAndroid Build Coastguard Worker 28*14675a02SAndroid Build Coastguard Worker // Base class for tracing traits, allows working with generated tracing traits 29*14675a02SAndroid Build Coastguard Worker // (see below) in polymorphic way at runtime without knowledge of a type. 30*14675a02SAndroid Build Coastguard Worker class TracingTraitsBase { 31*14675a02SAndroid Build Coastguard Worker public: 32*14675a02SAndroid Build Coastguard Worker // Returns printable name of the FlatBuffers table 33*14675a02SAndroid Build Coastguard Worker ABSL_MUST_USE_RESULT virtual const char* Name() const = 0; 34*14675a02SAndroid Build Coastguard Worker // Returns printable severity of the event represented by this table. 35*14675a02SAndroid Build Coastguard Worker ABSL_MUST_USE_RESULT virtual TracingSeverity Severity() const = 0; 36*14675a02SAndroid Build Coastguard Worker // Formats a serialized flatbuffer into human readable format. 37*14675a02SAndroid Build Coastguard Worker ABSL_MUST_USE_RESULT virtual std::string TextFormat( 38*14675a02SAndroid Build Coastguard Worker const flatbuffers::DetachedBuffer& buf) const = 0; 39*14675a02SAndroid Build Coastguard Worker // Formats a serialized flatbuffer into a Json string. 40*14675a02SAndroid Build Coastguard Worker ABSL_MUST_USE_RESULT virtual std::string JsonStringFormat( 41*14675a02SAndroid Build Coastguard Worker const uint8_t* flatbuf_bytes) const = 0; 42*14675a02SAndroid Build Coastguard Worker 43*14675a02SAndroid Build Coastguard Worker // Allows to lookup FlatBuffers table traits by its 4-character tag. 44*14675a02SAndroid Build Coastguard Worker // For unknown tag returns a stub. 45*14675a02SAndroid Build Coastguard Worker static TracingTraitsBase const* Lookup(TracingTag tag); 46*14675a02SAndroid Build Coastguard Worker 47*14675a02SAndroid Build Coastguard Worker // Registers runtime trait information (to be used for generated code only). 48*14675a02SAndroid Build Coastguard Worker // Multiple compilation units are allowed to register the same traits, 49*14675a02SAndroid Build Coastguard Worker // last registration wins. 50*14675a02SAndroid Build Coastguard Worker static void Register(TracingTag tag, 51*14675a02SAndroid Build Coastguard Worker std::unique_ptr<TracingTraitsBase> trait); 52*14675a02SAndroid Build Coastguard Worker SeverityString(const TracingSeverity tracing_severity)53*14675a02SAndroid Build Coastguard Worker static std::string SeverityString(const TracingSeverity tracing_severity) { 54*14675a02SAndroid Build Coastguard Worker switch (tracing_severity) { 55*14675a02SAndroid Build Coastguard Worker case TracingSeverity::kInfo: 56*14675a02SAndroid Build Coastguard Worker return "INFO"; 57*14675a02SAndroid Build Coastguard Worker case TracingSeverity::kWarning: 58*14675a02SAndroid Build Coastguard Worker return "WARNING"; 59*14675a02SAndroid Build Coastguard Worker case TracingSeverity::kError: 60*14675a02SAndroid Build Coastguard Worker return "ERROR"; 61*14675a02SAndroid Build Coastguard Worker } 62*14675a02SAndroid Build Coastguard Worker } 63*14675a02SAndroid Build Coastguard Worker 64*14675a02SAndroid Build Coastguard Worker virtual ~TracingTraitsBase() = default; 65*14675a02SAndroid Build Coastguard Worker }; 66*14675a02SAndroid Build Coastguard Worker 67*14675a02SAndroid Build Coastguard Worker // Specializations of TracingTraits used by TracingSpan are typically included 68*14675a02SAndroid Build Coastguard Worker // into user code together with the definitions of concrete FlatBufferTable via 69*14675a02SAndroid Build Coastguard Worker // "tracing_schema.h" header. The latter is auto-generated by 70*14675a02SAndroid Build Coastguard Worker // tracing_traits_generator tool from "tracing_schema.fbs". 71*14675a02SAndroid Build Coastguard Worker template <class FlatBufferTable> 72*14675a02SAndroid Build Coastguard Worker class TracingTraits; 73*14675a02SAndroid Build Coastguard Worker 74*14675a02SAndroid Build Coastguard Worker namespace internal { 75*14675a02SAndroid Build Coastguard Worker 76*14675a02SAndroid Build Coastguard Worker // Helper class to for automatic registration of traits for runtime use. 77*14675a02SAndroid Build Coastguard Worker // This is intended to be used from autogenerated code only. 78*14675a02SAndroid Build Coastguard Worker template<class FlatBufferTable> 79*14675a02SAndroid Build Coastguard Worker struct TracingTraitsRegistrar { TracingTraitsRegistrarTracingTraitsRegistrar80*14675a02SAndroid Build Coastguard Worker TracingTraitsRegistrar() { 81*14675a02SAndroid Build Coastguard Worker TracingTraitsBase::Register( 82*14675a02SAndroid Build Coastguard Worker TracingTraits<FlatBufferTable>::kTag, 83*14675a02SAndroid Build Coastguard Worker std::make_unique<TracingTraits<FlatBufferTable>>()); 84*14675a02SAndroid Build Coastguard Worker } 85*14675a02SAndroid Build Coastguard Worker }; 86*14675a02SAndroid Build Coastguard Worker 87*14675a02SAndroid Build Coastguard Worker } // namespace internal 88*14675a02SAndroid Build Coastguard Worker 89*14675a02SAndroid Build Coastguard Worker } // namespace fcp 90*14675a02SAndroid Build Coastguard Worker 91*14675a02SAndroid Build Coastguard Worker #endif // FCP_TRACING_TRACING_TRAITS_H_ 92