From 8b8b4a128fe3f8731bfbbbd8611262c62cf50919 Mon Sep 17 00:00:00 2001 From: narasimha Date: Tue, 24 May 2022 11:30:17 +0530 Subject: [PATCH 01/10] Set span status according to http semantics --- .../include/core/sdkwrapper/IScopedSpan.h | 12 ++++++- .../include/core/sdkwrapper/ScopedSpan.h | 7 ++-- .../include/core/sdkwrapper/ServerSpan.h | 2 ++ .../src/core/api/RequestProcessingEngine.cpp | 36 +++++++++++++++++-- .../src/core/sdkwrapper/ScopedSpan.cpp | 11 ++++++ .../src/core/sdkwrapper/ServerSpan.cpp | 6 ++++ 6 files changed, 69 insertions(+), 5 deletions(-) diff --git a/instrumentation/otel-webserver-module/include/core/sdkwrapper/IScopedSpan.h b/instrumentation/otel-webserver-module/include/core/sdkwrapper/IScopedSpan.h index 40673c427..bcf1bf015 100644 --- a/instrumentation/otel-webserver-module/include/core/sdkwrapper/IScopedSpan.h +++ b/instrumentation/otel-webserver-module/include/core/sdkwrapper/IScopedSpan.h @@ -21,6 +21,7 @@ #include #include + namespace appd { namespace core { namespace sdkwrapper { @@ -31,7 +32,14 @@ using namespace opentelemetry; enum class StatusCode { Ok, - Error + Error, + Unset +}; + +enum class SpanType { + INTERNAL, + SERVER, + CLIENT }; class IScopedSpan { @@ -48,6 +56,8 @@ class IScopedSpan { const SpanAttributeValue& value) = 0; virtual void SetStatus(const StatusCode status, const std::string& desc = "") = 0; + + virtual SpanType GetSpanKind() = 0; }; } //sdkwrapper diff --git a/instrumentation/otel-webserver-module/include/core/sdkwrapper/ScopedSpan.h b/instrumentation/otel-webserver-module/include/core/sdkwrapper/ScopedSpan.h index 8c92ad3df..4a1c7a734 100644 --- a/instrumentation/otel-webserver-module/include/core/sdkwrapper/ScopedSpan.h +++ b/instrumentation/otel-webserver-module/include/core/sdkwrapper/ScopedSpan.h @@ -46,12 +46,15 @@ class ScopedSpan : public IScopedSpan { void AddAttribute(const std::string& key, const SpanAttributeValue& value) override; - void SetStatus(const StatusCode status, const std::string& desc) override; + void SetStatus(const StatusCode status, const std::string& desc) override; + + SpanType GetSpanKind(); private: opentelemetry::nostd::shared_ptr mSpan; std::unique_ptr mScope; - const AgentLogger& mLogger; + const AgentLogger& mLogger; + trace::SpanKind mSpanKind; }; } //sdkwrapper diff --git a/instrumentation/otel-webserver-module/include/core/sdkwrapper/ServerSpan.h b/instrumentation/otel-webserver-module/include/core/sdkwrapper/ServerSpan.h index 33b875931..5a3701317 100644 --- a/instrumentation/otel-webserver-module/include/core/sdkwrapper/ServerSpan.h +++ b/instrumentation/otel-webserver-module/include/core/sdkwrapper/ServerSpan.h @@ -51,6 +51,8 @@ class ServerSpan : public IScopedSpan { void SetStatus(const StatusCode status, const std::string& desc) override; + SpanType GetSpanKind(); + private: std::unique_ptr mScopedSpan; nostd::unique_ptr mToken; diff --git a/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp b/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp index f0097610a..8ca22bf86 100644 --- a/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp +++ b/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp @@ -19,6 +19,7 @@ #include "api/ApiUtils.h" #include "api/Payload.h" #include "sdkwrapper/SdkWrapper.h" +#include "sdkwrapper/IScopedSpan.h" #include #include #include @@ -99,8 +100,24 @@ APPD_SDK_STATUS_CODE RequestProcessingEngine::endRequest( // check for error and set attribute in the scopedSpan. if (error) { - rootSpan->SetStatus(sdkwrapper::StatusCode::Error, error); LOG4CXX_TRACE(mLogger, "Setting status as error[" << error <<"] on root Span"); + if (error >= 100 && error < 400 ) + { + rootSpan->SetStatus(sdkwrapper::StatusCode::Unset, error); + } + else if (error >= 400 && error < 500 ) + { + if (rootSpan->GetSpanKind() == sdkwrapper::SpanType::SERVER) + rootSpan->SetStatus(sdkwrapper::StatusCode::Unset, error); + else + rootSpan->SetStatus(sdkwrapper::StatusCode::Error, error); + + } + else + { + rootSpan->SetStatus(sdkwrapper::StatusCode::Error, error); + } + } else { rootSpan->SetStatus(sdkwrapper::StatusCode::Ok); } @@ -177,7 +194,22 @@ APPD_SDK_API APPD_SDK_STATUS_CODE RequestProcessingEngine::endInteraction( // If errorCode is 0 or errMsg is empty, there is no error. bool isError = payload->errorCode != 0 && !payload->errorMsg.empty(); if (isError) { - interactionSpan->SetStatus(sdkwrapper::StatusCode::Error, payload->errorMsg); + if (payload->errorCode >= 100 && payload->errorCode < 400 ) + { + interactionSpan->SetStatus(sdkwrapper::StatusCode::Unset, payload->errorMsg); + } + else if (payload->errorCode >= 400 && payload->errorCode < 500 ) + { + if (interactionSpan->GetSpanKind() == sdkwrapper::SpanType::SERVER) + interactionSpan->SetStatus(sdkwrapper::StatusCode::Unset, payload->errorMsg); + else + interactionSpan->SetStatus(sdkwrapper::StatusCode::Error, payload->errorMsg); + + } + else + { + interactionSpan->SetStatus(sdkwrapper::StatusCode::Error, payload->errorMsg); + } interactionSpan->AddAttribute("error_code", payload->errorCode); LOG4CXX_TRACE(mLogger, "Span updated with error Code: " << payload->errorCode); } else { diff --git a/instrumentation/otel-webserver-module/src/core/sdkwrapper/ScopedSpan.cpp b/instrumentation/otel-webserver-module/src/core/sdkwrapper/ScopedSpan.cpp index d9d001ab3..a292e077d 100644 --- a/instrumentation/otel-webserver-module/src/core/sdkwrapper/ScopedSpan.cpp +++ b/instrumentation/otel-webserver-module/src/core/sdkwrapper/ScopedSpan.cpp @@ -32,6 +32,7 @@ ScopedSpan::ScopedSpan( options.kind = kind; mSpan = sdkHelperFactory->GetTracer()->StartSpan(name, attributes, options); mScope.reset(new trace::Scope(mSpan)); + mSpanKind = kind; } void ScopedSpan::End() @@ -68,6 +69,16 @@ void ScopedSpan::SetStatus(const StatusCode status, const std::string& desc) mSpan->SetStatus(otelStatus, desc); } +SpanType ScopedSpan::GetSpanKind() +{ + if (mSpanKind == trace::SpanKind::kServer) + return SpanType::SERVER; + else if (mSpanKind == SpanKind::kClient) + return SpanType::CLIENT; + else + return SpanType::INTERNAL; +} + } //sdkwrapper } //core } //appd diff --git a/instrumentation/otel-webserver-module/src/core/sdkwrapper/ServerSpan.cpp b/instrumentation/otel-webserver-module/src/core/sdkwrapper/ServerSpan.cpp index 8e8112e45..9b2edc120 100644 --- a/instrumentation/otel-webserver-module/src/core/sdkwrapper/ServerSpan.cpp +++ b/instrumentation/otel-webserver-module/src/core/sdkwrapper/ServerSpan.cpp @@ -68,6 +68,12 @@ void ServerSpan::SetStatus(const StatusCode status, const std::string& desc) mScopedSpan->SetStatus(status, desc); } +SpanType ServerSpan::GetSpanKind() +{ + return SpanType::SERVER; +} + + } //sdkwrapper } //core } //appd From 4a37f8cac18ba190d6eda24e2aa47902a6318054 Mon Sep 17 00:00:00 2001 From: narasimha Date: Tue, 24 May 2022 15:51:52 +0530 Subject: [PATCH 02/10] Set span status changes part-2 --- .../src/core/api/RequestProcessingEngine.cpp | 42 ++++++++++--------- .../src/core/sdkwrapper/ScopedSpan.cpp | 8 ++-- .../src/core/sdkwrapper/ServerSpan.cpp | 2 +- 3 files changed, 28 insertions(+), 24 deletions(-) diff --git a/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp b/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp index 8ca22bf86..fb657022e 100644 --- a/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp +++ b/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp @@ -26,11 +26,16 @@ #include #include #include +#include namespace appd { namespace core { +#define HTTP_ERROR_1XX 100 +#define HTTP_ERROR_4XX 400 +#define HTTP_ERROR_5XX 500 + RequestProcessingEngine::RequestProcessingEngine() : mLogger(getLogger(std::string(LogContext::AGENT) + ".RequestProcessingEngine")) { @@ -100,24 +105,27 @@ APPD_SDK_STATUS_CODE RequestProcessingEngine::endRequest( // check for error and set attribute in the scopedSpan. if (error) { - LOG4CXX_TRACE(mLogger, "Setting status as error[" << error <<"] on root Span"); - if (error >= 100 && error < 400 ) - { - rootSpan->SetStatus(sdkwrapper::StatusCode::Unset, error); + std::stringstream strValue; + strValue << error; + + unsigned int errorValue; + strValue >> errorValue; + + if (errorValue >= HTTP_ERROR_1XX && errorValue < HTTP_ERROR_4XX ) { + rootSpan->SetStatus(sdkwrapper::StatusCode::Unset); } - else if (error >= 400 && error < 500 ) - { + else if (errorValue >= HTTP_ERROR_4XX && errorValue < HTTP_ERROR_5XX ) { if (rootSpan->GetSpanKind() == sdkwrapper::SpanType::SERVER) - rootSpan->SetStatus(sdkwrapper::StatusCode::Unset, error); + rootSpan->SetStatus(sdkwrapper::StatusCode::Unset); else rootSpan->SetStatus(sdkwrapper::StatusCode::Error, error); - } - else - { + } else { rootSpan->SetStatus(sdkwrapper::StatusCode::Error, error); } + LOG4CXX_TRACE(mLogger, "Setting status as error[" << error <<"] on root Span"); + } else { rootSpan->SetStatus(sdkwrapper::StatusCode::Ok); } @@ -194,20 +202,16 @@ APPD_SDK_API APPD_SDK_STATUS_CODE RequestProcessingEngine::endInteraction( // If errorCode is 0 or errMsg is empty, there is no error. bool isError = payload->errorCode != 0 && !payload->errorMsg.empty(); if (isError) { - if (payload->errorCode >= 100 && payload->errorCode < 400 ) - { - interactionSpan->SetStatus(sdkwrapper::StatusCode::Unset, payload->errorMsg); + if (payload->errorCode >= HTTP_ERROR_1XX && payload->errorCode < HTTP_ERROR_4XX ) { + interactionSpan->SetStatus(sdkwrapper::StatusCode::Unset); } - else if (payload->errorCode >= 400 && payload->errorCode < 500 ) - { + else if (payload->errorCode >= HTTP_ERROR_4XX && payload->errorCode < HTTP_ERROR_5XX ) { if (interactionSpan->GetSpanKind() == sdkwrapper::SpanType::SERVER) - interactionSpan->SetStatus(sdkwrapper::StatusCode::Unset, payload->errorMsg); + interactionSpan->SetStatus(sdkwrapper::StatusCode::Unset); else interactionSpan->SetStatus(sdkwrapper::StatusCode::Error, payload->errorMsg); - } - else - { + } else { interactionSpan->SetStatus(sdkwrapper::StatusCode::Error, payload->errorMsg); } interactionSpan->AddAttribute("error_code", payload->errorCode); diff --git a/instrumentation/otel-webserver-module/src/core/sdkwrapper/ScopedSpan.cpp b/instrumentation/otel-webserver-module/src/core/sdkwrapper/ScopedSpan.cpp index a292e077d..555ea949b 100644 --- a/instrumentation/otel-webserver-module/src/core/sdkwrapper/ScopedSpan.cpp +++ b/instrumentation/otel-webserver-module/src/core/sdkwrapper/ScopedSpan.cpp @@ -72,11 +72,11 @@ void ScopedSpan::SetStatus(const StatusCode status, const std::string& desc) SpanType ScopedSpan::GetSpanKind() { if (mSpanKind == trace::SpanKind::kServer) - return SpanType::SERVER; - else if (mSpanKind == SpanKind::kClient) - return SpanType::CLIENT; + return SpanType::SERVER; + else if (mSpanKind == trace::SpanKind::kClient) + return SpanType::CLIENT; else - return SpanType::INTERNAL; + return SpanType::INTERNAL; } } //sdkwrapper diff --git a/instrumentation/otel-webserver-module/src/core/sdkwrapper/ServerSpan.cpp b/instrumentation/otel-webserver-module/src/core/sdkwrapper/ServerSpan.cpp index 9b2edc120..228270dcf 100644 --- a/instrumentation/otel-webserver-module/src/core/sdkwrapper/ServerSpan.cpp +++ b/instrumentation/otel-webserver-module/src/core/sdkwrapper/ServerSpan.cpp @@ -70,7 +70,7 @@ void ServerSpan::SetStatus(const StatusCode status, const std::string& desc) SpanType ServerSpan::GetSpanKind() { - return SpanType::SERVER; + return SpanType::SERVER; } From 5b030f2c5fb60f77b0501917b1a57b2d19196849 Mon Sep 17 00:00:00 2001 From: narasimha Date: Tue, 24 May 2022 15:56:16 +0530 Subject: [PATCH 03/10] Set span status according to http semantics spaces --- .../include/core/sdkwrapper/IScopedSpan.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/instrumentation/otel-webserver-module/include/core/sdkwrapper/IScopedSpan.h b/instrumentation/otel-webserver-module/include/core/sdkwrapper/IScopedSpan.h index bcf1bf015..70243382a 100644 --- a/instrumentation/otel-webserver-module/include/core/sdkwrapper/IScopedSpan.h +++ b/instrumentation/otel-webserver-module/include/core/sdkwrapper/IScopedSpan.h @@ -37,7 +37,7 @@ enum class StatusCode { }; enum class SpanType { - INTERNAL, + INTERNAL, SERVER, CLIENT }; @@ -53,11 +53,11 @@ class IScopedSpan { const OtelKeyValueMap& attributes) = 0; virtual void AddAttribute(const std::string& key, - const SpanAttributeValue& value) = 0; + const SpanAttributeValue& value) = 0; - virtual void SetStatus(const StatusCode status, const std::string& desc = "") = 0; + virtual void SetStatus(const StatusCode status, const std::string& desc = "") = 0; - virtual SpanType GetSpanKind() = 0; + virtual SpanType GetSpanKind() = 0; }; } //sdkwrapper From 490a33e102bc9543efebed43949805980afd3afa Mon Sep 17 00:00:00 2001 From: narasimha Date: Fri, 27 May 2022 14:15:30 +0530 Subject: [PATCH 04/10] Review comments addressed for span status --- .../include/core/sdkwrapper/IScopedSpan.h | 15 +------- .../include/core/sdkwrapper/ISdkWrapper.h | 7 +--- .../include/core/sdkwrapper/ScopedSpan.h | 2 +- .../include/core/sdkwrapper/SdkConstants.h | 4 ++ .../include/core/sdkwrapper/SdkEnums.h | 37 +++++++++++++++++++ .../include/core/sdkwrapper/ServerSpan.h | 2 +- .../src/core/api/RequestProcessingEngine.cpp | 33 +++++++++-------- .../src/core/sdkwrapper/ScopedSpan.cpp | 8 ++-- .../src/core/sdkwrapper/ServerSpan.cpp | 4 +- 9 files changed, 69 insertions(+), 43 deletions(-) create mode 100644 instrumentation/otel-webserver-module/include/core/sdkwrapper/SdkEnums.h diff --git a/instrumentation/otel-webserver-module/include/core/sdkwrapper/IScopedSpan.h b/instrumentation/otel-webserver-module/include/core/sdkwrapper/IScopedSpan.h index 70243382a..d0f992c18 100644 --- a/instrumentation/otel-webserver-module/include/core/sdkwrapper/IScopedSpan.h +++ b/instrumentation/otel-webserver-module/include/core/sdkwrapper/IScopedSpan.h @@ -17,6 +17,7 @@ #ifndef __ISCOPEDSPAN_H #define __ISCOPEDSPAN_H +#include "sdkwrapper/SdkEnums.h" #include #include #include @@ -30,18 +31,6 @@ using SpanAttributeValue = opentelemetry::common::AttributeValue; using OtelKeyValueMap = std::unordered_map; using namespace opentelemetry; -enum class StatusCode { - Ok, - Error, - Unset -}; - -enum class SpanType { - INTERNAL, - SERVER, - CLIENT -}; - class IScopedSpan { public: virtual ~IScopedSpan() = default; @@ -57,7 +46,7 @@ class IScopedSpan { virtual void SetStatus(const StatusCode status, const std::string& desc = "") = 0; - virtual SpanType GetSpanKind() = 0; + virtual SpanKind GetSpanKind() = 0; }; } //sdkwrapper diff --git a/instrumentation/otel-webserver-module/include/core/sdkwrapper/ISdkWrapper.h b/instrumentation/otel-webserver-module/include/core/sdkwrapper/ISdkWrapper.h index 3b465219e..4caf8fed7 100644 --- a/instrumentation/otel-webserver-module/include/core/sdkwrapper/ISdkWrapper.h +++ b/instrumentation/otel-webserver-module/include/core/sdkwrapper/ISdkWrapper.h @@ -19,6 +19,7 @@ #include #include +#include "sdkwrapper/SdkEnums.h" #include "sdkwrapper/IScopedSpan.h" #include "api/TenantConfig.h" @@ -26,12 +27,6 @@ namespace appd { namespace core { namespace sdkwrapper { -enum class SpanKind { - INTERNAL, - SERVER, - CLIENT -}; - class ISdkWrapper { public: virtual ~ISdkWrapper() = default; diff --git a/instrumentation/otel-webserver-module/include/core/sdkwrapper/ScopedSpan.h b/instrumentation/otel-webserver-module/include/core/sdkwrapper/ScopedSpan.h index 4a1c7a734..6f76331c8 100644 --- a/instrumentation/otel-webserver-module/include/core/sdkwrapper/ScopedSpan.h +++ b/instrumentation/otel-webserver-module/include/core/sdkwrapper/ScopedSpan.h @@ -48,7 +48,7 @@ class ScopedSpan : public IScopedSpan { void SetStatus(const StatusCode status, const std::string& desc) override; - SpanType GetSpanKind(); + SpanKind GetSpanKind(); private: opentelemetry::nostd::shared_ptr mSpan; diff --git a/instrumentation/otel-webserver-module/include/core/sdkwrapper/SdkConstants.h b/instrumentation/otel-webserver-module/include/core/sdkwrapper/SdkConstants.h index 64f58cd33..75d9acb92 100644 --- a/instrumentation/otel-webserver-module/include/core/sdkwrapper/SdkConstants.h +++ b/instrumentation/otel-webserver-module/include/core/sdkwrapper/SdkConstants.h @@ -24,6 +24,10 @@ const std::string kServiceNamespace = "service.namespace"; const std::string kServiceInstanceId = "service.instance.id"; const std::string kOtelLibraryName = "telemetry.sdk.language"; const std::string kOtelLibraryVersion = "telemetry.sdk.version"; +constexpr int HTTP_ERROR_1XX = 100; +constexpr int HTTP_ERROR_4XX = 400; +constexpr int HTTP_ERROR_5XX = 500; + } // sdkwrapper } // core } // appd diff --git a/instrumentation/otel-webserver-module/include/core/sdkwrapper/SdkEnums.h b/instrumentation/otel-webserver-module/include/core/sdkwrapper/SdkEnums.h new file mode 100644 index 000000000..cfcb9c518 --- /dev/null +++ b/instrumentation/otel-webserver-module/include/core/sdkwrapper/SdkEnums.h @@ -0,0 +1,37 @@ +/* +* Copyright 2021 AppDynamics LLC. +* +* 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. +*/ + +#pragma once + +namespace appd { +namespace core { +namespace sdkwrapper { + +enum class StatusCode { + Ok, + Error, + Unset +}; + +enum class SpanKind { + INTERNAL, + SERVER, + CLIENT +}; + +} // sdkwrapper +} // core +} // appd \ No newline at end of file diff --git a/instrumentation/otel-webserver-module/include/core/sdkwrapper/ServerSpan.h b/instrumentation/otel-webserver-module/include/core/sdkwrapper/ServerSpan.h index 5a3701317..9c2a95c3a 100644 --- a/instrumentation/otel-webserver-module/include/core/sdkwrapper/ServerSpan.h +++ b/instrumentation/otel-webserver-module/include/core/sdkwrapper/ServerSpan.h @@ -51,7 +51,7 @@ class ServerSpan : public IScopedSpan { void SetStatus(const StatusCode status, const std::string& desc) override; - SpanType GetSpanKind(); + SpanKind GetSpanKind(); private: std::unique_ptr mScopedSpan; diff --git a/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp b/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp index fb657022e..6822adf6f 100644 --- a/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp +++ b/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp @@ -20,6 +20,7 @@ #include "api/Payload.h" #include "sdkwrapper/SdkWrapper.h" #include "sdkwrapper/IScopedSpan.h" +#include "sdkwrapper/SdkConstants.h" #include #include #include @@ -32,9 +33,7 @@ namespace appd { namespace core { -#define HTTP_ERROR_1XX 100 -#define HTTP_ERROR_4XX 400 -#define HTTP_ERROR_5XX 500 +using namespace sdkwrapper; RequestProcessingEngine::RequestProcessingEngine() : mLogger(getLogger(std::string(LogContext::AGENT) + ".RequestProcessingEngine")) @@ -105,6 +104,8 @@ APPD_SDK_STATUS_CODE RequestProcessingEngine::endRequest( // check for error and set attribute in the scopedSpan. if (error) { + // Todo : Error is currently coming like eg HTTP Error code:403 + // Please change it to only erro code std::stringstream strValue; strValue << error; @@ -112,22 +113,22 @@ APPD_SDK_STATUS_CODE RequestProcessingEngine::endRequest( strValue >> errorValue; if (errorValue >= HTTP_ERROR_1XX && errorValue < HTTP_ERROR_4XX ) { - rootSpan->SetStatus(sdkwrapper::StatusCode::Unset); + rootSpan->SetStatus(StatusCode::Unset); } else if (errorValue >= HTTP_ERROR_4XX && errorValue < HTTP_ERROR_5XX ) { - if (rootSpan->GetSpanKind() == sdkwrapper::SpanType::SERVER) - rootSpan->SetStatus(sdkwrapper::StatusCode::Unset); + if (rootSpan->GetSpanKind() == SpanKind::SERVER) + rootSpan->SetStatus(StatusCode::Unset); else - rootSpan->SetStatus(sdkwrapper::StatusCode::Error, error); + rootSpan->SetStatus(StatusCode::Error, error); } else { - rootSpan->SetStatus(sdkwrapper::StatusCode::Error, error); + rootSpan->SetStatus(StatusCode::Error, error); } LOG4CXX_TRACE(mLogger, "Setting status as error[" << error <<"] on root Span"); } else { - rootSpan->SetStatus(sdkwrapper::StatusCode::Ok); + rootSpan->SetStatus(StatusCode::Ok); } LOG4CXX_TRACE(mLogger, "Ending root span with id: " << rootSpan.get()); @@ -162,7 +163,7 @@ APPD_SDK_STATUS_CODE RequestProcessingEngine::startInteraction( // TODO : confirm and update name later std::string spanName = payload->moduleName + "_" + payload->phaseName; keyValueMap["interactionType"] = "EXIT_CALL"; - auto interactionSpan = m_sdkWrapper->CreateSpan(spanName, sdkwrapper::SpanKind::CLIENT, keyValueMap); + auto interactionSpan = m_sdkWrapper->CreateSpan(spanName, SpanKind::CLIENT, keyValueMap); LOG4CXX_TRACE(mLogger, "Client Span started with SpanName: " << spanName << " Span Id: " << interactionSpan.get()); m_sdkWrapper->PopulatePropagationHeaders(propagationHeaders); @@ -203,21 +204,21 @@ APPD_SDK_API APPD_SDK_STATUS_CODE RequestProcessingEngine::endInteraction( bool isError = payload->errorCode != 0 && !payload->errorMsg.empty(); if (isError) { if (payload->errorCode >= HTTP_ERROR_1XX && payload->errorCode < HTTP_ERROR_4XX ) { - interactionSpan->SetStatus(sdkwrapper::StatusCode::Unset); + interactionSpan->SetStatus(StatusCode::Unset); } else if (payload->errorCode >= HTTP_ERROR_4XX && payload->errorCode < HTTP_ERROR_5XX ) { - if (interactionSpan->GetSpanKind() == sdkwrapper::SpanType::SERVER) - interactionSpan->SetStatus(sdkwrapper::StatusCode::Unset); + if (interactionSpan->GetSpanKind() == SpanKind::SERVER) + interactionSpan->SetStatus(StatusCode::Unset); else - interactionSpan->SetStatus(sdkwrapper::StatusCode::Error, payload->errorMsg); + interactionSpan->SetStatus(StatusCode::Error, payload->errorMsg); } else { - interactionSpan->SetStatus(sdkwrapper::StatusCode::Error, payload->errorMsg); + interactionSpan->SetStatus(StatusCode::Error, payload->errorMsg); } interactionSpan->AddAttribute("error_code", payload->errorCode); LOG4CXX_TRACE(mLogger, "Span updated with error Code: " << payload->errorCode); } else { - interactionSpan->SetStatus(sdkwrapper::StatusCode::Ok); + interactionSpan->SetStatus(StatusCode::Ok); } if (!payload->backendName.empty()) { diff --git a/instrumentation/otel-webserver-module/src/core/sdkwrapper/ScopedSpan.cpp b/instrumentation/otel-webserver-module/src/core/sdkwrapper/ScopedSpan.cpp index 555ea949b..d697dd09b 100644 --- a/instrumentation/otel-webserver-module/src/core/sdkwrapper/ScopedSpan.cpp +++ b/instrumentation/otel-webserver-module/src/core/sdkwrapper/ScopedSpan.cpp @@ -69,14 +69,14 @@ void ScopedSpan::SetStatus(const StatusCode status, const std::string& desc) mSpan->SetStatus(otelStatus, desc); } -SpanType ScopedSpan::GetSpanKind() +SpanKind ScopedSpan::GetSpanKind() { if (mSpanKind == trace::SpanKind::kServer) - return SpanType::SERVER; + return SpanKind::SERVER; else if (mSpanKind == trace::SpanKind::kClient) - return SpanType::CLIENT; + return SpanKind::CLIENT; else - return SpanType::INTERNAL; + return SpanKind::INTERNAL; } } //sdkwrapper diff --git a/instrumentation/otel-webserver-module/src/core/sdkwrapper/ServerSpan.cpp b/instrumentation/otel-webserver-module/src/core/sdkwrapper/ServerSpan.cpp index 228270dcf..240e7615c 100644 --- a/instrumentation/otel-webserver-module/src/core/sdkwrapper/ServerSpan.cpp +++ b/instrumentation/otel-webserver-module/src/core/sdkwrapper/ServerSpan.cpp @@ -68,9 +68,9 @@ void ServerSpan::SetStatus(const StatusCode status, const std::string& desc) mScopedSpan->SetStatus(status, desc); } -SpanType ServerSpan::GetSpanKind() +SpanKind ServerSpan::GetSpanKind() { - return SpanType::SERVER; + return SpanKind::SERVER; } From 2f7b6f51ad264d64d2c3b83180234a0517f32e88 Mon Sep 17 00:00:00 2001 From: narasimha Date: Mon, 30 May 2022 16:23:19 +0530 Subject: [PATCH 05/10] Moved error status from Apache hooks to Request processing engine --- .../include/core/sdkwrapper/SdkConstants.h | 1 + .../include/core/sdkwrapper/SdkEnums.h | 2 +- .../src/apache/ApacheHooks.cpp | 2 +- .../src/core/api/RequestProcessingEngine.cpp | 16 +++++++++------- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/instrumentation/otel-webserver-module/include/core/sdkwrapper/SdkConstants.h b/instrumentation/otel-webserver-module/include/core/sdkwrapper/SdkConstants.h index 75d9acb92..b7c436379 100644 --- a/instrumentation/otel-webserver-module/include/core/sdkwrapper/SdkConstants.h +++ b/instrumentation/otel-webserver-module/include/core/sdkwrapper/SdkConstants.h @@ -24,6 +24,7 @@ const std::string kServiceNamespace = "service.namespace"; const std::string kServiceInstanceId = "service.instance.id"; const std::string kOtelLibraryName = "telemetry.sdk.language"; const std::string kOtelLibraryVersion = "telemetry.sdk.version"; +const std::string kHttpErrorCode = "HTTP ERROR CODE:"; constexpr int HTTP_ERROR_1XX = 100; constexpr int HTTP_ERROR_4XX = 400; constexpr int HTTP_ERROR_5XX = 500; diff --git a/instrumentation/otel-webserver-module/include/core/sdkwrapper/SdkEnums.h b/instrumentation/otel-webserver-module/include/core/sdkwrapper/SdkEnums.h index cfcb9c518..bf75a055c 100644 --- a/instrumentation/otel-webserver-module/include/core/sdkwrapper/SdkEnums.h +++ b/instrumentation/otel-webserver-module/include/core/sdkwrapper/SdkEnums.h @@ -34,4 +34,4 @@ enum class SpanKind { } // sdkwrapper } // core -} // appd \ No newline at end of file +} // appd diff --git a/instrumentation/otel-webserver-module/src/apache/ApacheHooks.cpp b/instrumentation/otel-webserver-module/src/apache/ApacheHooks.cpp index 1cebd8c0d..efd004efb 100644 --- a/instrumentation/otel-webserver-module/src/apache/ApacheHooks.cpp +++ b/instrumentation/otel-webserver-module/src/apache/ApacheHooks.cpp @@ -634,7 +634,7 @@ int ApacheHooks::appd_hook_log_transaction_end(request_rec* r) if (appd_requestHasErrors(r)) { std::ostringstream oss; - oss << "HTTP ERROR CODE:" << r->status; + oss << r->status; res = wsAgent.endRequest(reqHandle, oss.str().c_str()); } else diff --git a/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp b/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp index 6822adf6f..0807e0659 100644 --- a/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp +++ b/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp @@ -104,14 +104,16 @@ APPD_SDK_STATUS_CODE RequestProcessingEngine::endRequest( // check for error and set attribute in the scopedSpan. if (error) { - // Todo : Error is currently coming like eg HTTP Error code:403 - // Please change it to only erro code + std::string errorStatus; std::stringstream strValue; - strValue << error; - unsigned int errorValue; + + strValue << error; strValue >> errorValue; + strValue << kHttpErrorCode + error; // This is status message eg: HTTP ERROR CODE:403 + strValue >> errorStatus; + if (errorValue >= HTTP_ERROR_1XX && errorValue < HTTP_ERROR_4XX ) { rootSpan->SetStatus(StatusCode::Unset); } @@ -119,13 +121,13 @@ APPD_SDK_STATUS_CODE RequestProcessingEngine::endRequest( if (rootSpan->GetSpanKind() == SpanKind::SERVER) rootSpan->SetStatus(StatusCode::Unset); else - rootSpan->SetStatus(StatusCode::Error, error); + rootSpan->SetStatus(StatusCode::Error, errorStatus); } else { - rootSpan->SetStatus(StatusCode::Error, error); + rootSpan->SetStatus(StatusCode::Error, errorStatus); } - LOG4CXX_TRACE(mLogger, "Setting status as error[" << error <<"] on root Span"); + LOG4CXX_TRACE(mLogger, "Setting status as error[" << errorStatus <<"] on root Span"); } else { rootSpan->SetStatus(StatusCode::Ok); From 180b502a43d0af94818f0b7321018fd2ef5bc01d Mon Sep 17 00:00:00 2001 From: narasimha Date: Thu, 2 Jun 2022 12:55:58 +0530 Subject: [PATCH 06/10] Fixed unit test failure --- .../src/core/api/RequestProcessingEngine.cpp | 4 +--- .../test/unit/RequestProcessingEngine_test.cpp | 6 +++--- .../otel-webserver-module/test/unit/mocks/mock_sdkwrapper.h | 4 ++++ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp b/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp index 0807e0659..24652d3e4 100644 --- a/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp +++ b/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp @@ -104,15 +104,13 @@ APPD_SDK_STATUS_CODE RequestProcessingEngine::endRequest( // check for error and set attribute in the scopedSpan. if (error) { - std::string errorStatus; std::stringstream strValue; unsigned int errorValue; strValue << error; strValue >> errorValue; - strValue << kHttpErrorCode + error; // This is status message eg: HTTP ERROR CODE:403 - strValue >> errorStatus; + std::string errorStatus (kHttpErrorCode + error); // This is status message eg: HTTP ERROR CODE:403 if (errorValue >= HTTP_ERROR_1XX && errorValue < HTTP_ERROR_4XX ) { rootSpan->SetStatus(StatusCode::Unset); diff --git a/instrumentation/otel-webserver-module/test/unit/RequestProcessingEngine_test.cpp b/instrumentation/otel-webserver-module/test/unit/RequestProcessingEngine_test.cpp index 3eeda9e8b..c8207fbba 100644 --- a/instrumentation/otel-webserver-module/test/unit/RequestProcessingEngine_test.cpp +++ b/instrumentation/otel-webserver-module/test/unit/RequestProcessingEngine_test.cpp @@ -208,12 +208,12 @@ TEST(TestRequestProcessingEngine, EndRequest) EXPECT_CALL(*getMockSpan(interactionSpan1), End()). Times(1); - EXPECT_CALL(*getMockSpan(rootSpan), SetStatus(appd::core::sdkwrapper::StatusCode::Error, "error_msg")).Times(1); + EXPECT_CALL(*getMockSpan(rootSpan), SetStatus(appd::core::sdkwrapper::StatusCode::Error, "HTTP ERROR CODE:403")).Times(1); EXPECT_CALL(*getMockSpan(rootSpan), End()). Times(1); - auto res = engine.endRequest(rContext, "error_msg"); + auto res = engine.endRequest(rContext, "403"); EXPECT_EQ(res, APPD_SUCCESS); } @@ -225,7 +225,7 @@ TEST(TestRequestProcessingEngine, EndRequestInvalidParams) engine.init(config,spanNamer); auto* sdkWrapper = engine.getMockSdkWrapper(); ASSERT_TRUE(sdkWrapper); - auto res = engine.endRequest(nullptr, "error msg"); + auto res = engine.endRequest(nullptr, "403"); EXPECT_EQ(res, APPD_STATUS(fail)); } diff --git a/instrumentation/otel-webserver-module/test/unit/mocks/mock_sdkwrapper.h b/instrumentation/otel-webserver-module/test/unit/mocks/mock_sdkwrapper.h index 51443d232..7f9ee9dc5 100644 --- a/instrumentation/otel-webserver-module/test/unit/mocks/mock_sdkwrapper.h +++ b/instrumentation/otel-webserver-module/test/unit/mocks/mock_sdkwrapper.h @@ -41,6 +41,10 @@ class MockScopedSpan : public appd::core::sdkwrapper::IScopedSpan (const appd::core::sdkwrapper::StatusCode code, const std::string& desc), (override)); + + MOCK_METHOD(appd::core::sdkwrapper::SpanKind, GetSpanKind, + (), + (override)); }; // TODO : General MOCK_METHOD command is giving some unexpected errors. Revisit later From 8a4d1b0085bb7e5c685089548f2de0a9c78ac7ed Mon Sep 17 00:00:00 2001 From: narasimha Date: Fri, 8 Jul 2022 10:38:33 +0530 Subject: [PATCH 07/10] Setting client span attributes --- .../otel-webserver-module/include/core/api/Payload.h | 7 ++++++- .../otel-webserver-module/src/apache/ApacheHooks.cpp | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/instrumentation/otel-webserver-module/include/core/api/Payload.h b/instrumentation/otel-webserver-module/include/core/api/Payload.h index 028cc18fc..c1de325e1 100644 --- a/instrumentation/otel-webserver-module/include/core/api/Payload.h +++ b/instrumentation/otel-webserver-module/include/core/api/Payload.h @@ -65,9 +65,14 @@ struct InteractionPayload std::string phaseName; bool resolveBackends; + std::string target; + std::string scheme; + long port; + InteractionPayload() {} - InteractionPayload(std::string module, std::string phase, bool b) : moduleName(module), phaseName(phase), resolveBackends(b) + InteractionPayload(std::string module, std::string phase, bool b, std::string aTarget, std::string aScheme, long aPort) + : moduleName(module), phaseName(phase), resolveBackends(b), target(aTarget), scheme(aScheme), port(aPort) {} }; diff --git a/instrumentation/otel-webserver-module/src/apache/ApacheHooks.cpp b/instrumentation/otel-webserver-module/src/apache/ApacheHooks.cpp index efd004efb..5110f0a6e 100644 --- a/instrumentation/otel-webserver-module/src/apache/ApacheHooks.cpp +++ b/instrumentation/otel-webserver-module/src/apache/ApacheHooks.cpp @@ -252,7 +252,7 @@ APPD_SDK_STATUS_CODE ApacheHooks::appd_startInteraction( } std::unique_ptr payload(new - appd::core::InteractionPayload(module, stage, resolveBackends)); + appd::core::InteractionPayload(module, stage, resolveBackends, r->server->server_hostname, r->unparsed_uri, ap_default_port(r))); // Create propagationHeaders to be populated in startInteraction. std::unordered_map propagationHeaders; From eb4b9868b7590d4c9c8d8c09477bdc606d69cc8b Mon Sep 17 00:00:00 2001 From: narasimha Date: Wed, 13 Jul 2022 09:28:41 +0530 Subject: [PATCH 08/10] Set client span attributes --- .../otel-webserver-module/include/core/api/Payload.h | 6 +++--- .../otel-webserver-module/src/apache/ApacheHooks.cpp | 2 +- .../src/core/api/RequestProcessingEngine.cpp | 3 +++ 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/instrumentation/otel-webserver-module/include/core/api/Payload.h b/instrumentation/otel-webserver-module/include/core/api/Payload.h index c1de325e1..8ca9df6f9 100644 --- a/instrumentation/otel-webserver-module/include/core/api/Payload.h +++ b/instrumentation/otel-webserver-module/include/core/api/Payload.h @@ -67,12 +67,12 @@ struct InteractionPayload std::string target; std::string scheme; - long port; + std::string host; InteractionPayload() {} - InteractionPayload(std::string module, std::string phase, bool b, std::string aTarget, std::string aScheme, long aPort) - : moduleName(module), phaseName(phase), resolveBackends(b), target(aTarget), scheme(aScheme), port(aPort) + InteractionPayload(std::string module, std::string phase, bool b, std::string aTarget, std::string aScheme, std::string aHost) + : moduleName(module), phaseName(phase), resolveBackends(b), target(aTarget), scheme(aScheme), host(aHost) {} }; diff --git a/instrumentation/otel-webserver-module/src/apache/ApacheHooks.cpp b/instrumentation/otel-webserver-module/src/apache/ApacheHooks.cpp index 5110f0a6e..5b99ed095 100644 --- a/instrumentation/otel-webserver-module/src/apache/ApacheHooks.cpp +++ b/instrumentation/otel-webserver-module/src/apache/ApacheHooks.cpp @@ -252,7 +252,7 @@ APPD_SDK_STATUS_CODE ApacheHooks::appd_startInteraction( } std::unique_ptr payload(new - appd::core::InteractionPayload(module, stage, resolveBackends, r->server->server_hostname, r->unparsed_uri, ap_default_port(r))); + appd::core::InteractionPayload(module, stage, resolveBackends, r->server->server_hostname, ap_run_http_scheme(r), r->hostname)); // Create propagationHeaders to be populated in startInteraction. std::unordered_map propagationHeaders; diff --git a/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp b/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp index 24652d3e4..07ca158ff 100644 --- a/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp +++ b/instrumentation/otel-webserver-module/src/core/api/RequestProcessingEngine.cpp @@ -164,6 +164,9 @@ APPD_SDK_STATUS_CODE RequestProcessingEngine::startInteraction( std::string spanName = payload->moduleName + "_" + payload->phaseName; keyValueMap["interactionType"] = "EXIT_CALL"; auto interactionSpan = m_sdkWrapper->CreateSpan(spanName, SpanKind::CLIENT, keyValueMap); + interactionSpan->AddAttribute("http.target", payload->target); + interactionSpan->AddAttribute("http.scheme", payload->scheme); + interactionSpan->AddAttribute("http.host", payload->host); LOG4CXX_TRACE(mLogger, "Client Span started with SpanName: " << spanName << " Span Id: " << interactionSpan.get()); m_sdkWrapper->PopulatePropagationHeaders(propagationHeaders); From 86e588210c827aeb9ead6836ea98cec256d761cb Mon Sep 17 00:00:00 2001 From: narasimha Date: Fri, 15 Jul 2022 12:01:49 +0530 Subject: [PATCH 09/10] Set client span attributes in Ngnix --- .../include/core/api/opentelemetry_ngx_api.h | 2 +- .../src/core/api/opentelemetry_ngx_api.cpp | 5 ++--- .../src/nginx/ngx_http_opentelemetry_module.c | 3 ++- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/instrumentation/otel-webserver-module/include/core/api/opentelemetry_ngx_api.h b/instrumentation/otel-webserver-module/include/core/api/opentelemetry_ngx_api.h index d279757df..ea22ffb84 100644 --- a/instrumentation/otel-webserver-module/include/core/api/opentelemetry_ngx_api.h +++ b/instrumentation/otel-webserver-module/include/core/api/opentelemetry_ngx_api.h @@ -62,7 +62,7 @@ void initDependency(); void populatePayload(request_payload* req_payload, void* payload, int count); APPD_SDK_STATUS_CODE opentelemetry_core_init(APPD_SDK_ENV_RECORD* env, unsigned numberOfRecords, struct cNode *rootCN); APPD_SDK_STATUS_CODE startRequest(const char* wscontext, request_payload* req_payload, APPD_SDK_HANDLE_REQ* reqHandle, int count); -APPD_SDK_STATUS_CODE startModuleInteraction(const char* req_handle_key, const char* module_name, const char* stage, bool resolveBackends, APPD_SDK_ENV_RECORD* propagationHeaders, int* ix); +APPD_SDK_STATUS_CODE startModuleInteraction(const char* req_handle_key, const char* module_name, const char* stage, bool resolveBackends, APPD_SDK_ENV_RECORD* propagationHeaders, int* ix, const char* target, const char* scheme, const char* host); APPD_SDK_STATUS_CODE stopModuleInteraction(const char* req_handle_key, const char* backendName, const char* backendType, unsigned int err_code, const char* msg); APPD_SDK_STATUS_CODE endRequest(APPD_SDK_HANDLE_REQ req_handle_key, const char* errMsg); diff --git a/instrumentation/otel-webserver-module/src/core/api/opentelemetry_ngx_api.cpp b/instrumentation/otel-webserver-module/src/core/api/opentelemetry_ngx_api.cpp index e85a32902..822897487 100644 --- a/instrumentation/otel-webserver-module/src/core/api/opentelemetry_ngx_api.cpp +++ b/instrumentation/otel-webserver-module/src/core/api/opentelemetry_ngx_api.cpp @@ -78,14 +78,13 @@ APPD_SDK_STATUS_CODE endRequest(APPD_SDK_HANDLE_REQ req_handle_key, const char* return res; } -APPD_SDK_STATUS_CODE startModuleInteraction(const char* req_handle_key, const char* module_name, const char* stage, bool resolveBackends, APPD_SDK_ENV_RECORD* propagationHeaders, int *ix) +APPD_SDK_STATUS_CODE startModuleInteraction(const char* req_handle_key, const char* module_name, const char* stage, bool resolveBackends, APPD_SDK_ENV_RECORD* propagationHeaders, int *ix, const char* target, const char* scheme, const char* host) { APPD_SDK_STATUS_CODE res = APPD_SUCCESS; std::unordered_map pHeaders; std::string module(module_name); std::string m_stage(stage); - - std::unique_ptr payload(new appd::core::InteractionPayload(module, m_stage, resolveBackends)); + std::unique_ptr payload(new appd::core::InteractionPayload(module, m_stage, resolveBackends, target, scheme, host)); res = wsAgent.startInteraction((APPD_SDK_HANDLE_REQ)req_handle_key, payload.get(), pHeaders); if (APPD_ISSUCCESS(res)) diff --git a/instrumentation/otel-webserver-module/src/nginx/ngx_http_opentelemetry_module.c b/instrumentation/otel-webserver-module/src/nginx/ngx_http_opentelemetry_module.c index 891411acd..e8a75bac1 100644 --- a/instrumentation/otel-webserver-module/src/nginx/ngx_http_opentelemetry_module.c +++ b/instrumentation/otel-webserver-module/src/nginx/ngx_http_opentelemetry_module.c @@ -675,7 +675,8 @@ static APPD_SDK_STATUS_CODE otel_startInteraction(ngx_http_request_t* r, const c } ngx_writeTrace(r->connection->log, __func__, "Starting a new module interaction for: %s", module_name); int ix = 0; - res = startModuleInteraction(ctx->otel_req_handle_key, module_name, "", resolveBackends, propagationHeaders, &ix); + // Todo : In the below line $scheme is Ngnix variable, need to findn correct way to retrieve this + res = startModuleInteraction(ctx->otel_req_handle_key, module_name, "", resolveBackends, propagationHeaders, &ix, FromNgxString(r->unparsed_uri), "$scheme", FromNgxString(r->headers_in.host->value)); if (APPD_ISSUCCESS(res)) { From 0b71f09678d89a374dd0bce34f2ec179d1c085d0 Mon Sep 17 00:00:00 2001 From: narasimha Date: Fri, 29 Jul 2022 11:04:45 +0530 Subject: [PATCH 10/10] Adding changes to client span attributes --- .../src/nginx/ngx_http_opentelemetry_module.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/otel-webserver-module/src/nginx/ngx_http_opentelemetry_module.c b/instrumentation/otel-webserver-module/src/nginx/ngx_http_opentelemetry_module.c index e8a75bac1..c1d352bea 100644 --- a/instrumentation/otel-webserver-module/src/nginx/ngx_http_opentelemetry_module.c +++ b/instrumentation/otel-webserver-module/src/nginx/ngx_http_opentelemetry_module.c @@ -676,7 +676,7 @@ static APPD_SDK_STATUS_CODE otel_startInteraction(ngx_http_request_t* r, const c ngx_writeTrace(r->connection->log, __func__, "Starting a new module interaction for: %s", module_name); int ix = 0; // Todo : In the below line $scheme is Ngnix variable, need to findn correct way to retrieve this - res = startModuleInteraction(ctx->otel_req_handle_key, module_name, "", resolveBackends, propagationHeaders, &ix, FromNgxString(r->unparsed_uri), "$scheme", FromNgxString(r->headers_in.host->value)); + res = startModuleInteraction(ctx->otel_req_handle_key, module_name, "", resolveBackends, propagationHeaders, &ix, (const char*)(r->unparsed_uri.data), "$scheme", (const char*)(r->headers_in.host->value.data)); if (APPD_ISSUCCESS(res)) {