16 #include "tensorflow_serving/core/request_logger.h"
23 #include "tensorflow/core/lib/core/errors.h"
24 #include "tensorflow/core/lib/monitoring/counter.h"
25 #include "tensorflow/core/lib/random/random.h"
26 #include "tensorflow/core/platform/status.h"
27 #include "tensorflow/core/protobuf/error_codes.pb.h"
28 #include "tensorflow_serving/apis/model.pb.h"
30 namespace tensorflow {
34 auto* request_log_count = monitoring::Counter<2>::New(
35 "/tensorflow/serving/request_log_count",
36 "The total number of requests logged from the model server sliced "
37 "down by model_name and status code.",
38 "model_name",
"status_code");
41 RequestLogger::RequestLogger(
const LoggingConfig& logging_config,
42 const std::vector<string>& saved_model_tags,
43 std::unique_ptr<LogCollector> log_collector)
44 : logging_config_(logging_config),
45 saved_model_tags_(saved_model_tags),
46 log_collector_(std::move(log_collector)),
49 Status RequestLogger::Log(
const google::protobuf::Message& request,
50 const google::protobuf::Message& response,
51 const LogMetadata& log_metadata) {
52 const double sampling_rate =
53 logging_config_.sampling_config().sampling_rate();
54 LogMetadata log_metadata_with_config = log_metadata;
55 *log_metadata_with_config.mutable_sampling_config() =
56 logging_config_.sampling_config();
57 if (!saved_model_tags_.empty()) {
58 *log_metadata_with_config.mutable_saved_model_tags() = {
59 saved_model_tags_.begin(), saved_model_tags_.end()};
61 if (uniform_sampler_.Sample(sampling_rate)) {
62 const auto status = [&]() {
63 std::unique_ptr<google::protobuf::Message> log;
65 CreateLogMessage(request, response, log_metadata_with_config, &log));
69 ->GetCell(log_metadata.model_spec().name(),
70 error::Code_Name(
static_cast<error::Code
>(status.code())))
77 Status RequestLogger::Log(
const google::protobuf::Message& log) {
78 return log_collector_->CollectMessage(log);