16 #ifndef TENSORFLOW_SERVING_CORE_SERVER_REQUEST_LOGGER_H_
17 #define TENSORFLOW_SERVING_CORE_SERVER_REQUEST_LOGGER_H_
23 #include <unordered_map>
26 #include "google/protobuf/message.h"
27 #include "tensorflow/core/lib/core/status.h"
28 #include "tensorflow_serving/apis/logging.pb.h"
29 #include "tensorflow_serving/config/logging_config.pb.h"
30 #include "tensorflow_serving/core/request_logger.h"
31 #include "tensorflow_serving/util/fast_read_dynamic_ptr.h"
33 namespace tensorflow {
42 using LoggerCreator = std::function<Status(
43 const LoggingConfig& logging_config, std::shared_ptr<RequestLogger>*)>;
50 LoggerCreator request_logger_creator,
51 std::unique_ptr<ServerRequestLogger>* server_request_logger);
60 virtual Status Update(
61 const std::map<
string, std::vector<LoggingConfig>>& logging_config_map);
67 virtual Status Log(
const google::protobuf::Message& request,
68 const google::protobuf::Message& response,
69 const LogMetadata& log_metadata);
76 template <
typename Request,
typename Response>
77 using CreateStreamLoggerFn =
78 std::function<std::unique_ptr<StreamLogger<Request, Response>>()>;
79 template <
typename Request,
typename Response>
80 std::unique_ptr<StreamLogger<Request, Response>> StartLoggingStream(
81 const LogMetadata& log_metadata,
82 CreateStreamLoggerFn<Request, Response> create_stream_logger_fn);
88 using StringToRequestLoggersMap =
89 std::unordered_map<string, std::vector<std::shared_ptr<RequestLogger>>>;
90 using StringToUniqueRequestLoggerMap =
91 std::unordered_map<string, std::shared_ptr<RequestLogger>>;
99 Status FindOrCreateLogger(
100 const LoggingConfig& config,
101 StringToUniqueRequestLoggerMap* new_config_to_logger_map,
102 std::shared_ptr<RequestLogger>* result);
105 void InvokeLoggerForModel(
106 const LogMetadata& log_metadata,
107 std::function<
void(
const std::shared_ptr<RequestLogger>&)> fn);
110 mutable mutex update_mu_;
115 StringToUniqueRequestLoggerMap config_to_logger_map_;
121 LoggerCreator request_logger_creator_;
125 template <
typename Request,
typename Response>
126 std::unique_ptr<StreamLogger<Request, Response>>
127 ServerRequestLogger::StartLoggingStream(
128 const LogMetadata& log_metadata,
129 CreateStreamLoggerFn<Request, Response> create_stream_logger_fn) {
131 InvokeLoggerForModel(
132 log_metadata, [create_stream_logger_fn, &stream_logger, &log_metadata](
133 const std::shared_ptr<RequestLogger>& request_logger) {
134 RequestLogger::GetStreamLoggerFn<Request, Response> create_logger =
135 [&create_stream_logger_fn, &stream_logger]() {
136 stream_logger = create_stream_logger_fn().release();
137 return stream_logger;
139 RequestLogger::GetStreamLoggerFn<Request, Response> get_logger =
140 [stream_logger]() {
return stream_logger; };
141 request_logger->MaybeStartLoggingStream(
142 log_metadata, stream_logger ==
nullptr ? std::move(create_logger)
143 : std::move(get_logger));
146 return absl::WrapUnique(stream_logger);