/* * Copyright 2019 AT&T Intellectual Property * Copyright 2019 Nokia * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * This source code is part of the near-RT RIC (RAN Intelligent Controller) * platform project (RICP). */ // // Created by adi ENZEL on 8/21/19. // #ifndef E2_OPENTRACING_H #define E2_OPENTRACING_H #include #include #include #include #include #include // use nlohmann json library as an example struct RICCarrierWriter : opentracing::TextMapWriter { explicit RICCarrierWriter( std::unordered_map& data_) : data{data_} {} opentracing::expected Set( opentracing::string_view key, opentracing::string_view value) const override { // OpenTracing uses opentracing::expected for error handling. This closely // follows the expected proposal for the C++ Standard Library. See // http://open-std.org/JTC1/SC22/WG21/docs/papers/2017/p0323r3.pdf // for more background. opentracing::expected result; auto was_successful = data.emplace(key, value); if (was_successful.second) { // Use a default constructed opentracing::expected to indicate // success. return result; } else { // `key` clashes with existing data, so the span context can't be encoded // successfully; set opentracing::expected to an std::error_code. return opentracing::make_unexpected( std::make_error_code(std::errc::not_supported)); } } std::unordered_map& data; }; struct RICCarrierReader : opentracing::TextMapReader { explicit RICCarrierReader( const std::unordered_map& data_) : data{data_} {} using F = std::function( opentracing::string_view, opentracing::string_view)>; opentracing::expected ForeachKey(F f) const override { // Iterate through all key-value pairs, the tracer will use the relevant keys // to extract a span context. for (auto& key_value : data) { auto was_successful = f(key_value.first, key_value.second); if (!was_successful) { // If the callback returns and unexpected value, bail out of the loop. return was_successful; } } // Indicate successful iteration. return {}; } // Optional, define TextMapReader::LookupKey to allow for faster extraction. opentracing::expected LookupKey( opentracing::string_view key) const override { auto iter = data.find(key); if (iter != data.end()) { return opentracing::make_unexpected(opentracing::key_not_found_error); } return opentracing::string_view{iter->second}; } const std::unordered_map& data; }; #endif //E2_OPENTRACING_H