1
#pragma once
2

            
3
#include <vector>
4

            
5
#include "envoy/extensions/access_loggers/grpc/v3/als.pb.h"
6
#include "envoy/grpc/async_client.h"
7
#include "envoy/grpc/async_client_manager.h"
8
#include "envoy/local_info/local_info.h"
9
#include "envoy/singleton/instance.h"
10
#include "envoy/thread_local/thread_local.h"
11

            
12
#include "source/common/grpc/typed_async_client.h"
13
#include "source/extensions/access_loggers/common/access_log_base.h"
14
#include "source/extensions/access_loggers/grpc/grpc_access_log_impl.h"
15
#include "source/extensions/access_loggers/grpc/grpc_access_log_utils.h"
16

            
17
namespace Envoy {
18
namespace Extensions {
19
namespace AccessLoggers {
20
namespace TcpGrpc {
21

            
22
// TODO(mattklein123): Stats
23

            
24
using envoy::extensions::access_loggers::grpc::v3::TcpGrpcAccessLogConfig;
25
using TcpGrpcAccessLogConfigConstSharedPtr = std::shared_ptr<const TcpGrpcAccessLogConfig>;
26

            
27
/**
28
 * Access log Instance that streams TCP logs over gRPC.
29
 */
30
class TcpGrpcAccessLog : public Common::ImplBase {
31
public:
32
  TcpGrpcAccessLog(AccessLog::FilterPtr&& filter, const TcpGrpcAccessLogConfig config,
33
                   ThreadLocal::SlotAllocator& tls,
34
                   GrpcCommon::GrpcAccessLoggerCacheSharedPtr access_logger_cache,
35
                   const Formatter::CommandParserPtrVector& command_parsers = {});
36

            
37
private:
38
  /**
39
   * Per-thread cached logger.
40
   */
41
  struct ThreadLocalLogger : public ThreadLocal::ThreadLocalObject {
42
    ThreadLocalLogger(GrpcCommon::GrpcAccessLoggerSharedPtr logger);
43

            
44
    const GrpcCommon::GrpcAccessLoggerSharedPtr logger_;
45
  };
46

            
47
  // Common::ImplBase
48
  void emitLog(const Formatter::Context& context, const StreamInfo::StreamInfo& info) override;
49

            
50
  const TcpGrpcAccessLogConfigConstSharedPtr config_;
51
  const ThreadLocal::SlotPtr tls_slot_;
52
  const GrpcCommon::GrpcAccessLoggerCacheSharedPtr access_logger_cache_;
53
  const GrpcCommon::CommonPropertiesConfig common_properties_config_;
54
};
55

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