1
#include "source/extensions/access_loggers/grpc/tcp_grpc_access_log_impl.h"
2

            
3
#include "envoy/data/accesslog/v3/accesslog.pb.h"
4
#include "envoy/extensions/access_loggers/grpc/v3/als.pb.h"
5

            
6
#include "source/common/common/assert.h"
7
#include "source/common/config/utility.h"
8
#include "source/common/http/header_map_impl.h"
9
#include "source/common/network/utility.h"
10
#include "source/common/stream_info/utility.h"
11
#include "source/extensions/access_loggers/grpc/grpc_access_log_utils.h"
12

            
13
namespace Envoy {
14
namespace Extensions {
15
namespace AccessLoggers {
16
namespace TcpGrpc {
17

            
18
TcpGrpcAccessLog::ThreadLocalLogger::ThreadLocalLogger(GrpcCommon::GrpcAccessLoggerSharedPtr logger)
19
47
    : logger_(std::move(logger)) {}
20

            
21
TcpGrpcAccessLog::TcpGrpcAccessLog(AccessLog::FilterPtr&& filter,
22
                                   const TcpGrpcAccessLogConfig config,
23
                                   ThreadLocal::SlotAllocator& tls,
24
                                   GrpcCommon::GrpcAccessLoggerCacheSharedPtr access_logger_cache,
25
                                   const Formatter::CommandParserPtrVector& command_parsers)
26
25
    : Common::ImplBase(std::move(filter)),
27
25
      config_(std::make_shared<const TcpGrpcAccessLogConfig>(std::move(config))),
28
25
      tls_slot_(tls.allocateSlot()), access_logger_cache_(std::move(access_logger_cache)),
29
25
      common_properties_config_(config.common_config(), command_parsers) {
30
25
  THROW_IF_NOT_OK(Config::Utility::checkTransportVersion(config_->common_config()));
31
25
  tls_slot_->set(
32
47
      [config = config_, access_logger_cache = access_logger_cache_](Event::Dispatcher&) {
33
47
        return std::make_shared<ThreadLocalLogger>(access_logger_cache->getOrCreateLogger(
34
47
            config->common_config(), Common::GrpcAccessLoggerType::TCP));
35
47
      });
36
25
}
37

            
38
void TcpGrpcAccessLog::emitLog(const Formatter::Context& context,
39
25
                               const StreamInfo::StreamInfo& stream_info) {
40
  // Common log properties.
41
25
  envoy::data::accesslog::v3::TCPAccessLogEntry log_entry;
42
25
  GrpcCommon::Utility::extractCommonAccessLogProperties(
43
25
      *log_entry.mutable_common_properties(), common_properties_config_,
44
25
      context.requestHeaders().value_or(*Http::StaticEmptyHeaders::get().request_headers),
45
25
      stream_info, context);
46

            
47
25
  envoy::data::accesslog::v3::ConnectionProperties& connection_properties =
48
25
      *log_entry.mutable_connection_properties();
49
25
  connection_properties.set_received_bytes(stream_info.bytesReceived());
50
25
  connection_properties.set_sent_bytes(stream_info.bytesSent());
51

            
52
  // request_properties->set_request_body_bytes(stream_info.bytesReceived());
53
25
  tls_slot_->getTyped<ThreadLocalLogger>().logger_->log(std::move(log_entry));
54
25
}
55

            
56
} // namespace TcpGrpc
57
} // namespace AccessLoggers
58
} // namespace Extensions
59
} // namespace Envoy