16 #ifndef THIRD_PARTY_TENSORFLOW_SERVING_CORE_STREAM_LOGGER_H_
17 #define THIRD_PARTY_TENSORFLOW_SERVING_CORE_STREAM_LOGGER_H_
21 #include <type_traits>
25 #include "absl/status/status.h"
26 #include "tensorflow/core/lib/core/errors.h"
27 #include "tensorflow_serving/apis/logging.pb.h"
29 namespace tensorflow {
38 template <
typename Request,
typename Response>
42 static_assert((std::is_base_of<google::protobuf::Message, Request>::value),
43 "Request must be a proto type.");
44 static_assert((std::is_base_of<google::protobuf::Message, Response>::value),
45 "Response must be a proto type.");
50 virtual void LogStreamRequest(Request request) = 0;
51 virtual void LogStreamResponse(Response response) = 0;
53 using LogMessageFn = std::function<absl::Status(
const google::protobuf::Message&)>;
55 void AddLogCallback(
const LogMetadata& log_metadata,
56 LogMessageFn log_message_fn);
63 absl::Status LogMessage();
66 virtual absl::Status CreateLogMessage(
67 const LogMetadata& log_metadata,
68 std::unique_ptr<google::protobuf::Message>* log) = 0;
70 struct StreamLogCallback {
71 LogMetadata log_metadata;
72 LogMessageFn log_message_fn;
75 std::vector<StreamLogCallback> callbacks_;
80 template <
typename Request,
typename Response>
83 for (
const auto& callback : callbacks_) {
84 std::unique_ptr<google::protobuf::Message> log;
85 absl::Status create_status = CreateLogMessage(callback.log_metadata, &log);
86 if (create_status.ok()) {
87 status.Update(callback.log_message_fn(*log));
89 LOG_EVERY_N_SEC(ERROR, 30)
90 <<
"Failed creating log message for streaming request. Log metadata: "
91 << callback.log_metadata.DebugString()
92 <<
", error: " << create_status;
93 status.Update(create_status);
99 template <
typename Request,
typename Response>
100 void StreamLogger<Request, Response>::AddLogCallback(
101 const LogMetadata& log_metadata, LogMessageFn log_message_fn) {
102 StreamLogCallback callback;
103 callback.log_metadata = log_metadata;
104 callback.log_message_fn = std::move(log_message_fn);
105 callbacks_.push_back(std::move(callback));