1
#include "source/extensions/access_loggers/dynamic_modules/access_log_config.h"
2

            
3
#include "source/common/common/assert.h"
4
#include "source/common/config/utility.h"
5
#include "source/common/protobuf/utility.h"
6

            
7
#include "absl/strings/str_cat.h"
8

            
9
namespace Envoy {
10
namespace Extensions {
11
namespace AccessLoggers {
12
namespace DynamicModules {
13

            
14
DynamicModuleAccessLogConfig::DynamicModuleAccessLogConfig(
15
    const absl::string_view logger_name, const absl::string_view logger_config,
16
    const absl::string_view metrics_namespace,
17
    Extensions::DynamicModules::DynamicModulePtr dynamic_module, Stats::Scope& stats_scope)
18
20
    : stats_scope_(stats_scope.createScope(absl::StrCat(metrics_namespace, "."))),
19
20
      stat_name_pool_(stats_scope_->symbolTable()), logger_name_(logger_name),
20
20
      logger_config_(logger_config), dynamic_module_(std::move(dynamic_module)) {}
21

            
22
20
DynamicModuleAccessLogConfig::~DynamicModuleAccessLogConfig() {
23
20
  if (in_module_config_ != nullptr && on_config_destroy_ != nullptr) {
24
19
    on_config_destroy_(in_module_config_);
25
19
  }
26
20
}
27

            
28
absl::StatusOr<DynamicModuleAccessLogConfigSharedPtr> newDynamicModuleAccessLogConfig(
29
    const absl::string_view logger_name, const absl::string_view logger_config,
30
    const absl::string_view metrics_namespace,
31
26
    Extensions::DynamicModules::DynamicModulePtr dynamic_module, Stats::Scope& stats_scope) {
32
26
  ASSERT_IS_MAIN_OR_TEST_THREAD();
33

            
34
  // Resolve the symbols for the access logger using graceful error handling.
35
26
  auto on_config_new = dynamic_module->getFunctionPointer<OnAccessLoggerConfigNewType>(
36
26
      "envoy_dynamic_module_on_access_logger_config_new");
37
26
  RETURN_IF_NOT_OK_REF(on_config_new.status());
38

            
39
24
  auto on_config_destroy = dynamic_module->getFunctionPointer<OnAccessLoggerConfigDestroyType>(
40
24
      "envoy_dynamic_module_on_access_logger_config_destroy");
41
24
  RETURN_IF_NOT_OK_REF(on_config_destroy.status());
42

            
43
23
  auto on_logger_new = dynamic_module->getFunctionPointer<OnAccessLoggerNewType>(
44
23
      "envoy_dynamic_module_on_access_logger_new");
45
23
  RETURN_IF_NOT_OK_REF(on_logger_new.status());
46

            
47
22
  auto on_logger_log = dynamic_module->getFunctionPointer<OnAccessLoggerLogType>(
48
22
      "envoy_dynamic_module_on_access_logger_log");
49
22
  RETURN_IF_NOT_OK_REF(on_logger_log.status());
50

            
51
21
  auto on_logger_destroy = dynamic_module->getFunctionPointer<OnAccessLoggerDestroyType>(
52
21
      "envoy_dynamic_module_on_access_logger_destroy");
53
21
  RETURN_IF_NOT_OK_REF(on_logger_destroy.status());
54

            
55
  // Flush is optional - module may not implement it.
56
20
  auto on_logger_flush = dynamic_module->getFunctionPointer<OnAccessLoggerFlushType>(
57
20
      "envoy_dynamic_module_on_access_logger_flush");
58

            
59
20
  auto config = std::make_shared<DynamicModuleAccessLogConfig>(
60
20
      logger_name, logger_config, metrics_namespace, std::move(dynamic_module), stats_scope);
61

            
62
  // Store the resolved function pointers.
63
20
  config->on_config_destroy_ = on_config_destroy.value();
64
20
  config->on_logger_new_ = on_logger_new.value();
65
20
  config->on_logger_log_ = on_logger_log.value();
66
20
  config->on_logger_destroy_ = on_logger_destroy.value();
67
20
  config->on_logger_flush_ = on_logger_flush.ok() ? on_logger_flush.value() : nullptr;
68

            
69
  // Create the in-module configuration.
70
20
  envoy_dynamic_module_type_envoy_buffer name_buf = {.ptr = config->logger_name_.data(),
71
20
                                                     .length = config->logger_name_.size()};
72
20
  envoy_dynamic_module_type_envoy_buffer config_buf = {.ptr = config->logger_config_.data(),
73
20
                                                       .length = config->logger_config_.size()};
74
20
  config->in_module_config_ =
75
20
      (*on_config_new.value())(static_cast<void*>(config.get()), name_buf, config_buf);
76

            
77
20
  if (config->in_module_config_ == nullptr) {
78
1
    return absl::InvalidArgumentError("Failed to initialize dynamic module access logger config");
79
1
  }
80
19
  return config;
81
20
}
82

            
83
} // namespace DynamicModules
84
} // namespace AccessLoggers
85
} // namespace Extensions
86
} // namespace Envoy