1
#include "source/extensions/tracers/xray/daemon_broker.h"
2

            
3
#include "envoy/network/address.h"
4

            
5
#include "source/common/buffer/buffer_impl.h"
6
#include "source/common/network/socket_interface.h"
7
#include "source/common/network/utility.h"
8
#include "source/common/protobuf/utility.h"
9
#include "source/extensions/tracers/xray/daemon.pb.h"
10

            
11
namespace Envoy {
12
namespace Extensions {
13
namespace Tracers {
14
namespace XRay {
15

            
16
namespace {
17
// creates a header JSON for X-Ray daemon.
18
// For example:
19
// { "format": "json", "version": 1}
20
1
std::string createHeader(const std::string& format, uint32_t version) {
21
1
  source::extensions::tracers::xray::daemon::Header header;
22
1
  header.set_format(format);
23
1
  header.set_version(version);
24
1
  return MessageUtil::getJsonStringFromMessageOrError(header, false /* pretty_print  */,
25
1
                                                      false /* always_print_primitive_fields */);
26
1
}
27

            
28
} // namespace
29

            
30
DaemonBrokerImpl::DaemonBrokerImpl(const std::string& daemon_endpoint)
31
    : address_(
32
11
          Network::Utility::parseInternetAddressAndPortNoThrow(daemon_endpoint, false /*v6only*/)),
33
11
      io_handle_(Network::ioHandleForAddr(Network::Socket::Type::Datagram, address_, {})) {
34
11
  if (address_ == nullptr) {
35
    throw EnvoyException(absl::StrCat("malformed IP address: ", daemon_endpoint));
36
  }
37
11
}
38

            
39
1
void DaemonBrokerImpl::send(const std::string& data) const {
40
1
  auto& logger = Logger::Registry::getLog(Logger::Id::tracing);
41
1
  constexpr auto version = 1;
42
1
  constexpr auto format = "json";
43
1
  const std::string payload = absl::StrCat(createHeader(format, version), "\n", data);
44
1
  Buffer::RawSlice buf;
45
1
  buf.mem_ = const_cast<char*>(payload.data());
46
1
  buf.len_ = payload.length();
47
1
  const auto rc = Network::Utility::writeToSocket(*io_handle_, &buf, 1 /*num_slices*/,
48
1
                                                  nullptr /*local_ip*/, *address_);
49

            
50
1
  if (rc.return_value_ != payload.length()) {
51
    // TODO(suniltheta): report this in stats
52
    ENVOY_LOG_TO_LOGGER(logger, debug, "Failed to send trace payload to the X-Ray daemon.");
53
  }
54
1
}
55

            
56
} // namespace XRay
57
} // namespace Tracers
58
} // namespace Extensions
59
} // namespace Envoy