1
#pragma once
2

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

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

            
14
#include "source/common/grpc/typed_async_client.h"
15
#include "source/common/tracing/custom_tag_impl.h"
16
#include "source/extensions/access_loggers/common/access_log_base.h"
17
#include "source/extensions/access_loggers/open_telemetry/grpc_access_log_impl.h"
18
#include "source/extensions/access_loggers/open_telemetry/substitution_formatter.h"
19

            
20
#include "opentelemetry/proto/collector/logs/v1/logs_service.pb.h"
21
#include "opentelemetry/proto/common/v1/common.pb.h"
22
#include "opentelemetry/proto/logs/v1/logs.pb.h"
23
#include "opentelemetry/proto/resource/v1/resource.pb.h"
24

            
25
namespace Envoy {
26
namespace Extensions {
27
namespace AccessLoggers {
28
namespace OpenTelemetry {
29

            
30
// TODO(mattklein123): Stats
31

            
32
/**
33
 * Access log Instance that streams logs over gRPC.
34
 */
35
class AccessLog : public Common::ImplBase {
36
public:
37
  AccessLog(
38
      ::Envoy::AccessLog::FilterPtr&& filter,
39
      envoy::extensions::access_loggers::open_telemetry::v3::OpenTelemetryAccessLogConfig config,
40
      ThreadLocal::SlotAllocator& tls, GrpcAccessLoggerCacheSharedPtr access_logger_cache,
41
      const std::vector<Formatter::CommandParserPtr>& commands);
42

            
43
private:
44
  /**
45
   * Per-thread cached logger.
46
   */
47
  struct ThreadLocalLogger : public ThreadLocal::ThreadLocalObject {
48
    ThreadLocalLogger(GrpcAccessLoggerSharedPtr logger);
49

            
50
    const GrpcAccessLoggerSharedPtr logger_;
51
  };
52

            
53
  // Common::ImplBase
54
  void emitLog(const Formatter::Context& context, const StreamInfo::StreamInfo& info) override;
55

            
56
  const ThreadLocal::SlotPtr tls_slot_;
57
  const GrpcAccessLoggerCacheSharedPtr access_logger_cache_;
58
  std::unique_ptr<OpenTelemetryFormatter> body_formatter_;
59
  std::unique_ptr<OpenTelemetryFormatter> attributes_formatter_;
60
  const std::vector<std::string> filter_state_objects_to_log_;
61
  const std::vector<Tracing::CustomTagConstSharedPtr> custom_tags_;
62
};
63

            
64
using AccessLogPtr = std::unique_ptr<AccessLog>;
65

            
66
} // namespace OpenTelemetry
67
} // namespace AccessLoggers
68
} // namespace Extensions
69
} // namespace Envoy