26namespace kcenon {
namespace monitoring {
65 virtual common::VoidResult
connect(
const std::string&
host, uint16_t port) = 0;
72 virtual common::VoidResult
send(std::span<const uint8_t> data) = 0;
79 common::VoidResult
send(
const std::string& data) {
80 return send(std::span<const uint8_t>(
81 reinterpret_cast<const uint8_t*
>(data.data()),
106 virtual std::string
name()
const = 0;
150 common::VoidResult
connect(
const std::string&
host, uint16_t port)
override {
154 "Simulated connection failure",
156 ).to_common_error());
164 common::VoidResult
send(std::span<const uint8_t> data)
override {
171 ).to_common_error());
178 "Simulated send failure",
180 ).to_common_error());
184 bytes_sent_.fetch_add(data.size(), std::memory_order_relaxed);
202 std::string
name()
const override {
227#ifdef MONITORING_HAS_COMMON_TRANSPORT_INTERFACES
228#include <kcenon/common/interfaces/transport.h>
230namespace kcenon {
namespace monitoring {
239class common_udp_transport :
public udp_transport {
241 std::shared_ptr<::kcenon::common::interfaces::IUdpClient> client_;
242 mutable std::atomic<std::size_t> packets_sent_{0};
243 mutable std::atomic<std::size_t> bytes_sent_{0};
244 mutable std::atomic<std::size_t> send_failures_{0};
247 explicit common_udp_transport(std::shared_ptr<::kcenon::common::interfaces::IUdpClient> client)
248 : client_(std::move(
client)) {}
250 common::VoidResult connect(
const std::string& host, uint16_t port)
override {
252 return common::VoidResult::err(error_info(
253 monitoring_error_code::dependency_missing,
254 "UDP client not available",
255 "common_udp_transport"
256 ).to_common_error());
259 auto result = client_->connect(host, port);
260 if (result.is_err()) {
261 return common::VoidResult::err(error_info(
262 monitoring_error_code::network_error,
263 "Connection failed: " + result.error().message,
264 "common_udp_transport"
265 ).to_common_error());
270 common::VoidResult send(std::span<const uint8_t> data)
override {
272 send_failures_.fetch_add(1, std::memory_order_relaxed);
273 return common::VoidResult::err(error_info(
274 monitoring_error_code::dependency_missing,
275 "UDP client not available",
276 "common_udp_transport"
277 ).to_common_error());
280 if (!client_->is_connected()) {
281 send_failures_.fetch_add(1, std::memory_order_relaxed);
282 return common::VoidResult::err(error_info(
283 monitoring_error_code::network_error,
285 "common_udp_transport"
286 ).to_common_error());
289 auto result = client_->send(data);
290 if (result.is_err()) {
291 send_failures_.fetch_add(1, std::memory_order_relaxed);
292 return common::VoidResult::err(error_info(
293 monitoring_error_code::network_error,
294 "Send failed: " + result.error().message,
295 "common_udp_transport"
296 ).to_common_error());
299 packets_sent_.fetch_add(1, std::memory_order_relaxed);
300 bytes_sent_.fetch_add(data.size(), std::memory_order_relaxed);
304 bool is_connected()
const override {
305 return client_ && client_->is_connected();
308 void disconnect()
override {
310 client_->disconnect();
314 bool is_available()
const override {
315 return client_ !=
nullptr;
318 std::string name()
const override {
320 return "common:" + client_->get_implementation_name();
322 return "common:unavailable";
325 udp_statistics get_statistics()
const override {
327 packets_sent_.load(std::memory_order_relaxed),
328 bytes_sent_.load(std::memory_order_relaxed),
329 send_failures_.load(std::memory_order_relaxed)
333 void reset_statistics()
override {
334 packets_sent_.store(0, std::memory_order_relaxed);
335 bytes_sent_.store(0, std::memory_order_relaxed);
336 send_failures_.store(0, std::memory_order_relaxed);
344#ifdef MONITORING_HAS_NETWORK_SYSTEM
345#include <kcenon/network/udp/udp_client.h>
347namespace kcenon {
namespace monitoring {
356class network_udp_transport :
public udp_transport {
358 std::unique_ptr<network_system::udp::udp_client> client_;
361 bool connected_{
false};
362 mutable std::atomic<std::size_t> packets_sent_{0};
363 mutable std::atomic<std::size_t> bytes_sent_{0};
364 mutable std::atomic<std::size_t> send_failures_{0};
367 network_udp_transport() =
default;
369 common::VoidResult connect(
const std::string& host, uint16_t port)
override {
371 client_ = std::make_unique<network_system::udp::udp_client>(host, port);
376 }
catch (
const std::exception& e) {
377 return common::VoidResult::err(error_info(
378 monitoring_error_code::network_error,
379 std::string(
"Connection failed: ") + e.what(),
380 "network_udp_transport"
381 ).to_common_error());
385 common::VoidResult send(std::span<const uint8_t> data)
override {
386 if (!connected_ || !client_) {
387 send_failures_.fetch_add(1, std::memory_order_relaxed);
388 return common::VoidResult::err(error_info(
389 monitoring_error_code::network_error,
391 "network_udp_transport"
392 ).to_common_error());
396 auto result = client_->send(data);
398 send_failures_.fetch_add(1, std::memory_order_relaxed);
399 return common::VoidResult::err(error_info(
400 monitoring_error_code::network_error,
401 "Send failed: " + result.error().message,
402 "network_udp_transport"
403 ).to_common_error());
406 packets_sent_.fetch_add(1, std::memory_order_relaxed);
407 bytes_sent_.fetch_add(data.size(), std::memory_order_relaxed);
409 }
catch (
const std::exception& e) {
410 send_failures_.fetch_add(1, std::memory_order_relaxed);
411 return common::VoidResult::err(error_info(
412 monitoring_error_code::network_error,
413 std::string(
"Send failed: ") + e.what(),
414 "network_udp_transport"
415 ).to_common_error());
419 bool is_connected()
const override {
420 return connected_ && client_ !=
nullptr;
423 void disconnect()
override {
430 bool is_available()
const override {
434 std::string name()
const override {
435 return "network_system";
438 udp_statistics get_statistics()
const override {
440 packets_sent_.load(std::memory_order_relaxed),
441 bytes_sent_.load(std::memory_order_relaxed),
442 send_failures_.load(std::memory_order_relaxed)
446 void reset_statistics()
override {
447 packets_sent_.store(0, std::memory_order_relaxed);
448 bytes_sent_.store(0, std::memory_order_relaxed);
449 send_failures_.store(0, std::memory_order_relaxed);
457namespace kcenon {
namespace monitoring {
467#ifdef MONITORING_HAS_NETWORK_SYSTEM
468 return std::make_unique<network_udp_transport>();
470 return std::make_unique<stub_udp_transport>();
478 return std::make_unique<stub_udp_transport>();
481#ifdef MONITORING_HAS_COMMON_TRANSPORT_INTERFACES
486inline std::unique_ptr<common_udp_transport> create_common_udp_transport(
487 std::shared_ptr<::kcenon::common::interfaces::IUdpClient>
client) {
488 return std::make_unique<common_udp_transport>(std::move(
client));
492#ifdef MONITORING_HAS_NETWORK_SYSTEM
496inline std::unique_ptr<network_udp_transport> create_network_udp_transport() {
497 return std::make_unique<network_udp_transport>();
Stub UDP transport for testing.
bool is_available() const override
Check if transport is available.
uint16_t get_port() const
bool is_connected() const override
Check if connected to an endpoint.
std::string get_host() const
void disconnect() override
Disconnect from the current endpoint.
std::string name() const override
Get transport name.
std::atomic< std::size_t > packets_sent_
void set_simulate_success(bool success)
Set whether to simulate success or failure.
std::atomic< std::size_t > bytes_sent_
udp_statistics get_statistics() const override
Get transport statistics.
void reset_statistics() override
Reset statistics.
stub_udp_transport()=default
std::atomic< std::size_t > send_failures_
common::VoidResult connect(const std::string &host, uint16_t port) override
Connect to a remote UDP endpoint.
common::VoidResult send(std::span< const uint8_t > data) override
Send data to the connected endpoint.
Abstract UDP transport interface.
virtual bool is_connected() const =0
Check if connected to an endpoint.
virtual common::VoidResult connect(const std::string &host, uint16_t port)=0
Connect to a remote UDP endpoint.
virtual udp_statistics get_statistics() const =0
Get transport statistics.
virtual bool is_available() const =0
Check if transport is available.
common::VoidResult send(const std::string &data)
Send string data to the connected endpoint.
virtual common::VoidResult send(std::span< const uint8_t > data)=0
Send data to the connected endpoint.
virtual void reset_statistics()=0
Reset statistics.
virtual ~udp_transport()=default
virtual std::string name() const =0
Get transport name.
virtual void disconnect()=0
Disconnect from the current endpoint.
Monitoring system specific error codes.
std::unique_ptr< stub_udp_transport > create_stub_udp_transport()
Create stub UDP transport for testing.
std::unique_ptr< udp_transport > create_default_udp_transport()
Create default UDP transport.
Result pattern type definitions for monitoring system.
Extended error information with context.
Result of a UDP send operation.
std::chrono::milliseconds elapsed
Statistics for UDP transport operations.
std::size_t send_failures