1
#pragma once
2

            
3
#include <memory>
4
#include <vector>
5

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

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

            
18
namespace Envoy {
19
namespace Extensions {
20
namespace AccessLoggers {
21
namespace HttpGrpc {
22

            
23
// TODO(mattklein123): Stats
24

            
25
using envoy::extensions::access_loggers::grpc::v3::HttpGrpcAccessLogConfig;
26
using HttpGrpcAccessLogConfigConstSharedPtr = std::shared_ptr<const HttpGrpcAccessLogConfig>;
27

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

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

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

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

            
51
  const HttpGrpcAccessLogConfigConstSharedPtr config_;
52
  const ThreadLocal::SlotPtr tls_slot_;
53
  const GrpcCommon::GrpcAccessLoggerCacheSharedPtr access_logger_cache_;
54
  std::vector<Http::LowerCaseString> request_headers_to_log_;
55
  std::vector<Http::LowerCaseString> response_headers_to_log_;
56
  std::vector<Http::LowerCaseString> response_trailers_to_log_;
57
  const GrpcCommon::CommonPropertiesConfig common_properties_config_;
58
};
59

            
60
using HttpGrpcAccessLogPtr = std::unique_ptr<HttpGrpcAccessLog>;
61

            
62
} // namespace HttpGrpc
63
} // namespace AccessLoggers
64
} // namespace Extensions
65
} // namespace Envoy