diff --git a/src/facade/dragonfly_connection.cc b/src/facade/dragonfly_connection.cc index e730af0b7..bca4cedab 100644 --- a/src/facade/dragonfly_connection.cc +++ b/src/facade/dragonfly_connection.cc @@ -451,7 +451,8 @@ io::Result Connection::CheckForHttpProto(FiberSocketBase* peer) { void Connection::ConnectionFlow(FiberSocketBase* peer) { auto dispatch_fb = fibers::fiber(fibers::launch::dispatch, [&] { DispatchFiber(peer); }); ConnectionStats* stats = service_->GetThreadLocalConnectionStats(); - stats->num_conns++; + ++stats->num_conns; + ++stats->conn_received_cnt; stats->read_buf_capacity += io_buf_.Capacity(); ParserStatus parse_status = OK; diff --git a/src/facade/facade.cc b/src/facade/facade.cc index d5fef083b..d7c3b001a 100644 --- a/src/facade/facade.cc +++ b/src/facade/facade.cc @@ -21,7 +21,7 @@ constexpr size_t kSizeConnStats = sizeof(ConnectionStats); ConnectionStats& ConnectionStats::operator+=(const ConnectionStats& o) { // To break this code deliberately if we add/remove a field to this struct. - static_assert(kSizeConnStats == 168); + static_assert(kSizeConnStats == 176); ADD(read_buf_capacity); ADD(io_read_cnt); @@ -32,7 +32,7 @@ ConnectionStats& ConnectionStats::operator+=(const ConnectionStats& o) { ADD(pipelined_cmd_cnt); ADD(parser_err_cnt); ADD(async_writes_cnt); - + ADD(conn_received_cnt); ADD(num_conns); ADD(num_replicas); ADD(num_blocked_clients); diff --git a/src/facade/facade_types.h b/src/facade/facade_types.h index bf8dfb861..63abf3479 100644 --- a/src/facade/facade_types.h +++ b/src/facade/facade_types.h @@ -40,8 +40,9 @@ struct ConnectionStats { size_t pipelined_cmd_cnt = 0; size_t parser_err_cnt = 0; - // Writes count that happened via SendRawMessageAsync call. - size_t async_writes_cnt = 0; + // Writes count that happened via DispatchOperations call. + uint64_t async_writes_cnt = 0; + uint64_t conn_received_cnt = 0; uint32_t num_conns = 0; uint32_t num_replicas = 0; diff --git a/src/server/main_service.cc b/src/server/main_service.cc index e621a2bd1..527f3ba10 100644 --- a/src/server/main_service.cc +++ b/src/server/main_service.cc @@ -525,7 +525,13 @@ void Service::DispatchCommand(CmdArgList args, facade::ConnectionContext* cntx) ToUpper(&args[0]); - VLOG(2) << "Got: " << args; + ConnectionContext* dfly_cntx = static_cast(cntx); + bool under_script = dfly_cntx->conn_state.script_info.has_value(); + + if (VLOG_IS_ON(2)) { + const char* lua = under_script ? "LUA " : ""; + LOG(INFO) << "Got (" << cntx->owner()->GetClientId() << "): " << lua << args; + } string_view cmd_str = ArgS(args, 0); bool is_trans_cmd = (cmd_str == "EXEC" || cmd_str == "MULTI" || cmd_str == "DISCARD"); @@ -534,7 +540,6 @@ void Service::DispatchCommand(CmdArgList args, facade::ConnectionContext* cntx) etl.RecordCmd(); - ConnectionContext* dfly_cntx = static_cast(cntx); absl::Cleanup multi_error([dfly_cntx] { MultiSetError(dfly_cntx); }); if (cid == nullptr) { @@ -567,8 +572,6 @@ void Service::DispatchCommand(CmdArgList args, facade::ConnectionContext* cntx) return (*cntx)->SendError("Replica can't interact with the keyspace"); } - bool under_script = dfly_cntx->conn_state.script_info.has_value(); - if (under_script && (cid->opt_mask() & CO::NOSCRIPT)) { return (*cntx)->SendError("This Redis command is not allowed from script"); } diff --git a/src/server/server_family.cc b/src/server/server_family.cc index b90a6d3d1..15d50f344 100644 --- a/src/server/server_family.cc +++ b/src/server/server_family.cc @@ -676,6 +676,9 @@ void PrintPrometheusMetrics(const Metrics& m, StringResponse* resp) { } // Stats metrics + AppendMetricWithoutLabels("connections_received_total", "", m.conn_stats.conn_received_cnt, + MetricType::COUNTER, &resp->body()); + AppendMetricWithoutLabels("commands_processed_total", "", m.conn_stats.command_cnt, MetricType::COUNTER, &resp->body()); AppendMetricWithoutLabels("keyspace_hits_total", "", m.events.hits, MetricType::COUNTER, @@ -1308,8 +1311,9 @@ void ServerFamily::Info(CmdArgList args, ConnectionContext* cntx) { if (should_enter("STATS")) { ADD_HEADER("# Stats"); - append("instantaneous_ops_per_sec", m.qps); + append("total_connections_received", m.conn_stats.conn_received_cnt); append("total_commands_processed", m.conn_stats.command_cnt); + append("instantaneous_ops_per_sec", m.qps); append("total_pipelined_commands", m.conn_stats.pipelined_cmd_cnt); append("total_net_input_bytes", m.conn_stats.io_read_bytes); append("total_net_output_bytes", m.conn_stats.io_write_bytes); @@ -1403,13 +1407,23 @@ void ServerFamily::Info(CmdArgList args, ConnectionContext* cntx) { auto unknown_cmd = service_.UknownCmdMap(); - for (const auto& k_v : unknown_cmd) { - append(StrCat("unknown_", k_v.first), k_v.second); - } + auto append_sorted = [&append](string_view prefix, const auto& map) { + vector> display; + display.reserve(map.size()); - for (const auto& k_v : m.conn_stats.cmd_count_map) { - append(StrCat("cmd_", k_v.first), k_v.second); - } + for (const auto& k_v : map) { + display.push_back(k_v); + }; + + sort(display.begin(), display.end()); + + for (const auto& k_v : display) { + append(StrCat(prefix, k_v.first), k_v.second); + } + }; + + append_sorted("unknown_", unknown_cmd); + append_sorted("cmd_", m.conn_stats.cmd_count_map); } if (should_enter("ERRORSTATS", true)) {