Skip to content

Commit c7b3a80

Browse files
authored
struct logs: add raw key for JSON blobs (#263)
The raw field in slogs allows us to add debugging information in JSON. In this case, add the FR ControllerConfig as a JSON object. Refactor the TraceTx/TraceRx to use less helper templates und use more constexpr-ifs. SILKIT-1827
1 parent 1b2ea0a commit c7b3a80

File tree

9 files changed

+107
-120
lines changed

9 files changed

+107
-120
lines changed

SilKit/source/config/YamlParser.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
#include "YamlWriter.hpp"
1414
#include "rapidyaml.hpp"
1515

16-
1716
namespace VSilKit {
1817

1918
// Utility for parsing key-value lists for protocol capabilities

SilKit/source/config/YamlWriter.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,4 +630,13 @@ void YamlWriter::Write(const SilKitRegistry::Config::V1::RegistryConfiguration&
630630
NonDefaultWrite(obj.experimental, "Experimental", defaultObject.experimental);
631631
}
632632

633+
void YamlWriter::Write(const SilKit::Services::Flexray::FlexrayControllerConfig& obj)
634+
{
635+
// Parse parameters as an int value; uint8_t would be interpreted as a character
636+
MakeMap();
637+
WriteKeyValue("clusterParams", obj.clusterParams);
638+
WriteKeyValue("nodeParams", obj.nodeParams);
639+
OptionalWrite(obj.bufferConfigs, "bufferConfigs");
640+
}
641+
633642
} // namespace VSilKit

SilKit/source/config/YamlWriter.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,9 @@ struct YamlWriter : BasicYamlWriter<YamlWriter>
187187
void Write(const SilKit::Config::HealthCheck& obj);
188188
void Write(const SilKitRegistry::Config::V1::Experimental& obj);
189189
void Write(const SilKitRegistry::Config::V1::RegistryConfiguration& obj);
190+
191+
// used for debug logging
192+
void Write(const SilKit::Services::Flexray::FlexrayControllerConfig& obj);
190193
};
191194

192195
} // namespace VSilKit

SilKit/source/core/internal/ServiceDescriptor.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class ServiceDescriptor
5454
inline bool operator==(const ServiceDescriptor& rhs) const;
5555
inline bool operator!=(const ServiceDescriptor& rhs) const;
5656
inline std::string to_string() const;
57-
inline std::vector<std::pair<std::string, std::string>> to_keyValues() const;
57+
inline std::vector<std::pair<std::string_view, std::string>> to_keyValues() const;
5858

5959
inline Core::EndpointAddress to_endpointAddress() const;
6060

@@ -291,11 +291,11 @@ std::string ServiceDescriptor::to_string() const
291291
}
292292

293293

294-
std::vector<std::pair<std::string, std::string>> ServiceDescriptor::to_keyValues() const
294+
std::vector<std::pair<std::string_view, std::string>> ServiceDescriptor::to_keyValues() const
295295
{
296296
namespace Keys = SilKit::Services::Logging::Keys;
297297

298-
std::vector<std::pair<std::string, std::string>> kv;
298+
std::vector<std::pair<std::string_view, std::string>> kv;
299299
std::string controllerTypeName;
300300
std::stringstream ss;
301301

SilKit/source/dashboard/DashboardInstance.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace Log = SilKit::Services::Logging;
1515
namespace {
1616

1717

18-
uint64_t GetCurrentTime()
18+
uint64_t GetCurrentSystemTime()
1919
{
2020
auto now = std::chrono::system_clock::now().time_since_epoch();
2121
return std::chrono::duration_cast<std::chrono::milliseconds>(now).count();
@@ -324,7 +324,7 @@ void DashboardInstance::OnParticipantConnected(const std::string& simulationName
324324
const auto connectUri{
325325
SilKit::Core::Uri::MakeSilKit(_registryUri->Host(), _registryUri->Port(), simulationName)};
326326
_silKitEventQueue.Enqueue(
327-
SilKitEvent{simulationName, SimulationStart{connectUri.EncodedString(), GetCurrentTime()}});
327+
SilKitEvent{simulationName, SimulationStart{connectUri.EncodedString(), GetCurrentSystemTime()}});
328328
}
329329

330330
_silKitEventQueue.Enqueue(SilKitEvent{
@@ -352,7 +352,7 @@ void DashboardInstance::OnParticipantDisconnected(const std::string& simulationN
352352

353353
if (isEmpty)
354354
{
355-
_silKitEventQueue.Enqueue(SilKitEvent{simulationName, SimulationEnd{GetCurrentTime()}});
355+
_silKitEventQueue.Enqueue(SilKitEvent{simulationName, SimulationEnd{GetCurrentSystemTime()}});
356356
RemoveSimulationData(simulationName);
357357
}
358358
}

SilKit/source/services/logging/Logger.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,18 @@ std::string KeyValuesToJsonString(const std::vector<std::pair<std::string, std::
104104
{
105105
result.append(",");
106106
}
107-
result.append("\"" + SilKit::Util::EscapeString(it->first) + "\"" + ":" + "\""
108-
+ SilKit::Util::EscapeString(it->second) + "\"");
107+
108+
109+
if(it->first == SilKit::Services::Logging::Keys::raw)
110+
{
111+
result.append("\"" + SilKit::Util::EscapeString(it->first) + "\"" + ":"
112+
+ it->second);
113+
}
114+
else
115+
{
116+
result.append("\"" + SilKit::Util::EscapeString(it->first) + "\"" + ":" + "\""
117+
+ SilKit::Util::EscapeString(it->second) + "\"");
118+
}
109119
++it;
110120
}
111121
result.append("}");

SilKit/source/services/logging/MessageTracing.hpp

Lines changed: 46 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -9,107 +9,73 @@
99
#include "ServiceDescriptor.hpp"
1010
#include "traits/SilKitMsgTraits.hpp"
1111

12+
#include "YamlParser.hpp"
13+
1214

1315
namespace SilKit {
1416
namespace Services {
1517

16-
17-
template <typename MsgT>
18-
std::chrono::nanoseconds GetTimestamp(MsgT& msg,
19-
std::enable_if_t<Core::HasTimestamp<MsgT>::value, bool> = true)
18+
namespace Detail {
19+
template <class SilKitMessageT>
20+
void TraceMessageCommon(Logging::ILoggerInternal* logger,
21+
const char* messageString,
22+
const Core::IServiceEndpoint* addr,
23+
const SilKitMessageT& msg,
24+
std::string_view keyString = {},
25+
std::string_view valueString = {})
2026
{
21-
return msg.timestamp;
22-
}
2327

24-
template <typename MsgT>
25-
std::chrono::nanoseconds GetTimestamp(MsgT& /*msg*/,
26-
std::enable_if_t<!Core::HasTimestamp<MsgT>::value, bool> = false)
27-
{
28-
return std::chrono::nanoseconds::duration::min();
28+
if constexpr (std::is_same_v<SilKitMessageT, SilKit::Services::Logging::LogMsg>)
29+
{
30+
// Don't trace LogMessages - this could cause cycles!
31+
return;
32+
}
33+
else
34+
{
35+
if (logger->GetLogLevel() == Logging::Level::Trace)
36+
{
37+
Logging::LoggerMessage lm{logger, Logging::Level::Trace};
38+
lm.SetMessage(messageString);
39+
lm.SetKeyValue(addr->GetServiceDescriptor());
40+
lm.FormatKeyValue(Logging::Keys::msg, "{}", msg);
41+
42+
if (!keyString.empty() && ! valueString.empty())
43+
{
44+
lm.SetKeyValue(keyString, valueString);
45+
}
46+
47+
if constexpr (Core::HasTimestamp<SilKitMessageT>::value)
48+
{
49+
lm.FormatKeyValue(Logging::Keys::virtualTimeNS, "{}", msg.timestamp.count());
50+
}
51+
52+
// Turn the Raw-logging into a trait when we have enough types that implement it
53+
if constexpr (std::is_same_v<SilKitMessageT, SilKit::Services::Flexray::FlexrayControllerConfig>)
54+
{
55+
lm.SetKeyValue(Logging::Keys::raw, SilKit::Config::SerializeAsJson(msg));
56+
}
57+
lm.Dispatch();
58+
}
59+
}
2960
}
30-
31-
32-
33-
61+
} // namespace Detail
3462
template <class SilKitMessageT>
3563
void TraceRx(Logging::ILoggerInternal* logger, const Core::IServiceEndpoint* addr, const SilKitMessageT& msg,
3664
const Core::ServiceDescriptor& from)
3765
{
38-
if (logger->GetLogLevel() == Logging::Level::Trace)
39-
{
40-
Logging::LoggerMessage lm{logger, Logging::Level::Trace};
41-
lm.SetMessage("Recv message");
42-
lm.SetKeyValue(addr->GetServiceDescriptor());
43-
lm.SetKeyValue(Logging::Keys::from, from.GetParticipantName());
44-
lm.FormatKeyValue(Logging::Keys::msg, "{}", msg);
45-
46-
auto virtualTimeStamp = GetTimestamp(msg);
47-
if (virtualTimeStamp != std::chrono::nanoseconds::duration::min())
48-
{
49-
lm.FormatKeyValue(Logging::Keys::virtualTimeNS, "{}", virtualTimeStamp.count());
50-
}
51-
lm.Dispatch();
52-
}
66+
Detail::TraceMessageCommon(logger, "Recv message", addr, msg, Logging::Keys::from, from.GetParticipantName());
5367
}
5468

5569
template <class SilKitMessageT>
5670
void TraceTx(Logging::ILoggerInternal* logger, const Core::IServiceEndpoint* addr, const SilKitMessageT& msg)
5771
{
58-
if (logger->GetLogLevel() == Logging::Level::Trace)
59-
{
60-
Logging::LoggerMessage lm{logger, Logging::Level::Trace};
61-
lm.SetMessage("Send message");
62-
lm.SetKeyValue(addr->GetServiceDescriptor());
63-
lm.FormatKeyValue(Logging::Keys::msg, "{}", msg);
64-
65-
auto virtualTimeStamp = GetTimestamp(msg);
66-
if (virtualTimeStamp != std::chrono::nanoseconds::duration::min())
67-
{
68-
lm.FormatKeyValue(Logging::Keys::virtualTimeNS, "{}", virtualTimeStamp.count());
69-
}
70-
lm.Dispatch();
71-
}
72+
Detail::TraceMessageCommon(logger, "Send message", addr, msg);
7273
}
7374

74-
// targeted messages
7575
template <class SilKitMessageT>
7676
void TraceTx(Logging::ILoggerInternal* logger, const Core::IServiceEndpoint* addr, const std::string_view target, const SilKitMessageT& msg)
7777
{
78-
if (logger->GetLogLevel() == Logging::Level::Trace)
79-
{
80-
Logging::LoggerMessage lm{logger, Logging::Level::Trace};
81-
lm.SetMessage("Send message");
82-
lm.SetKeyValue(addr->GetServiceDescriptor());
83-
lm.FormatKeyValue(Logging::Keys::msg, "{}", msg);
84-
lm.FormatKeyValue(Logging::Keys::to, "{}", target);
85-
86-
auto virtualTimeStamp = GetTimestamp(msg);
87-
if (virtualTimeStamp != std::chrono::nanoseconds::duration::min())
88-
{
89-
lm.FormatKeyValue(Logging::Keys::virtualTimeNS, "{}", virtualTimeStamp.count());
90-
}
91-
lm.Dispatch();
92-
}
93-
}
94-
// Don't trace LogMessages - this could cause cycles!
95-
inline void TraceRx(Logging::ILoggerInternal* /*logger*/, Core::IServiceEndpoint* /*addr*/,
96-
const Logging::LogMsg& /*msg*/)
97-
{
98-
}
99-
inline void TraceTx(Logging::ILoggerInternal* /*logger*/, const Core::IServiceEndpoint* /*addr*/,
100-
const std::string_view /*target*/, const Logging::LogMsg& /*msg*/)
101-
{
102-
}
103-
inline void TraceTx(Logging::ILoggerInternal* /*logger*/, Core::IServiceEndpoint* /*addr*/,
104-
const Logging::LogMsg& /*msg*/)
105-
{
106-
}
107-
108-
inline void TraceRx(Logging::ILoggerInternal* /*logger*/, Core::IServiceEndpoint* /*addr*/, Logging::LogMsg&& /*msg*/)
109-
{
110-
}
111-
inline void TraceTx(Logging::ILoggerInternal* /*logger*/, Core::IServiceEndpoint* /*addr*/, Logging::LogMsg&& /*msg*/)
112-
{
78+
Detail::TraceMessageCommon(logger, "Send targetted message", addr, msg, Logging::Keys::to, target);
11379
}
11480
} // namespace Services
11581
} // namespace SilKit

SilKit/source/services/logging/SilKitFmtFormatters.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
#include "TestDataTypes.hpp" // for operator<<
3838
#include "IServiceEndpoint.hpp" // for operator<<(... ServiceDescriptor)
3939

40-
4140
#define MAKE_FORMATTER(TYPE) \
4241
template <> \
4342
struct fmt::formatter<TYPE> : ostream_formatter \

SilKit/source/services/logging/StructuredLoggingKeys.hpp

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -13,37 +13,38 @@ namespace Services {
1313
namespace Logging {
1414
namespace Keys {
1515

16-
const std::string virtualTimeNS{"VirtualTimeNS"};
17-
const std::string msg{"Msg"};
18-
const std::string from{"From"};
16+
constexpr std::string_view virtualTimeNS{"VirtualTimeNS"};
17+
constexpr std::string_view msg{"Msg"};
18+
constexpr std::string_view from{"From"};
1919
constexpr std::string_view to{"To"};
20-
21-
const std::string waitingTime{"WaitingTime"};
22-
const std::string executionTime{"ExecutionTime"};
23-
24-
const std::string participantName{"ParticipantName"};
25-
const std::string registryUri{"RegistryUri"};
26-
const std::string silKitVersion{"SilKitVersion"};
27-
28-
const std::string newParticipantState{"NewParticipantState"};
29-
const std::string oldParticipantState{"OldParticipantState"};
30-
const std::string enterTime{"EnterTime"};
31-
const std::string enterReason{"EnterReason"};
32-
33-
const std::string serviceType{"ServiceType"};
34-
const std::string serviceName{"ServiceName"};
35-
const std::string networkType{"NetworkType"};
36-
const std::string networkName{"NetworkName"};
37-
const std::string controllerTypeName{"ControllerTypeName"};
38-
39-
40-
const std::string controllerName{"ControllerName"};
41-
const std::string controllerType{"ControllerType"};
42-
const std::string pubSubTopic{"PubSubTopic"};
43-
const std::string controllerFuncName{"ControllerFuncName"};
44-
const std::string mediaType{"MediaType"};
45-
const std::string network{"Network"};
46-
const std::string label{"Label"};
20+
constexpr std::string_view raw{"Raw"};
21+
22+
constexpr std::string_view waitingTime{"WaitingTime"};
23+
constexpr std::string_view executionTime{"ExecutionTime"};
24+
25+
constexpr std::string_view participantName{"ParticipantName"};
26+
constexpr std::string_view registryUri{"RegistryUri"};
27+
constexpr std::string_view silKitVersion{"SilKitVersion"};
28+
29+
constexpr std::string_view newParticipantState{"NewParticipantState"};
30+
constexpr std::string_view oldParticipantState{"OldParticipantState"};
31+
constexpr std::string_view enterTime{"EnterTime"};
32+
constexpr std::string_view enterReason{"EnterReason"};
33+
34+
constexpr std::string_view serviceType{"ServiceType"};
35+
constexpr std::string_view serviceName{"ServiceName"};
36+
constexpr std::string_view networkType{"NetworkType"};
37+
constexpr std::string_view networkName{"NetworkName"};
38+
constexpr std::string_view controllerTypeName{"ControllerTypeName"};
39+
40+
41+
constexpr std::string_view controllerName{"ControllerName"};
42+
constexpr std::string_view controllerType{"ControllerType"};
43+
constexpr std::string_view pubSubTopic{"PubSubTopic"};
44+
constexpr std::string_view controllerFuncName{"ControllerFuncName"};
45+
constexpr std::string_view mediaType{"MediaType"};
46+
constexpr std::string_view network{"Network"};
47+
constexpr std::string_view label{"Label"};
4748

4849

4950
} // namespace Keys

0 commit comments

Comments
 (0)