diff --git a/net/server/cli_server/dap_cli_server.c b/net/server/cli_server/dap_cli_server.c
index 85b7d34b0702007ad8c6d57f9f56f2cc68a112da..5c67c2ba34235d4d91817dda37c8c533cdbbe11d 100644
--- a/net/server/cli_server/dap_cli_server.c
+++ b/net/server/cli_server/dap_cli_server.c
@@ -59,7 +59,9 @@ static atomic_int_fast64_t s_cmd_thread_count = 0;
 static dap_cli_cmd_t *cli_commands = NULL;
 static dap_cli_cmd_aliases_t *s_command_alias = NULL;
 
-static inline dap_cli_cmd_t *s_cmd_add_ex(const char *a_name, dap_cli_server_cmd_callback_ex_t a_func, void *a_arg_func, const char *a_doc, const char *a_doc_ex);
+static dap_cli_server_cmd_stat_callback_t s_stat_callback = NULL;
+
+static inline dap_cli_cmd_t *s_cmd_add_ex(const char *a_name, dap_cli_server_cmd_callback_ex_t a_func, void *a_arg_func, const char *a_doc, const char *a_doc_ex, int16_t a_id);
 
 typedef struct cli_cmd_arg {
     dap_worker_t *worker;
@@ -192,9 +194,9 @@ void dap_cli_server_deinit()
  * @param a_doc
  * @param a_doc_ex
  */
-dap_cli_cmd_t *dap_cli_server_cmd_add(const char * a_name, dap_cli_server_cmd_callback_t a_func, const char *a_doc, const char *a_doc_ex)
+dap_cli_cmd_t *dap_cli_server_cmd_add(const char * a_name, dap_cli_server_cmd_callback_t a_func, const char *a_doc, int16_t a_id, const char *a_doc_ex)
 {
-    return s_cmd_add_ex(a_name, (dap_cli_server_cmd_callback_ex_t)(void *)a_func, NULL, a_doc, a_doc_ex);
+    return s_cmd_add_ex(a_name, (dap_cli_server_cmd_callback_ex_t)(void *)a_func, NULL, a_doc, a_doc_ex, a_id);
 }
 
 /**
@@ -205,7 +207,7 @@ dap_cli_cmd_t *dap_cli_server_cmd_add(const char * a_name, dap_cli_server_cmd_ca
  * @param a_doc
  * @param a_doc_ex
  */
-static inline dap_cli_cmd_t *s_cmd_add_ex(const char * a_name, dap_cli_server_cmd_callback_ex_t a_func, void *a_arg_func, const char *a_doc, const char *a_doc_ex)
+static inline dap_cli_cmd_t *s_cmd_add_ex(const char * a_name, dap_cli_server_cmd_callback_ex_t a_func, void *a_arg_func, const char *a_doc, const char *a_doc_ex, int16_t a_id)
 {
     dap_cli_cmd_t *l_cmd_item = DAP_NEW_Z(dap_cli_cmd_t);
     if (!l_cmd_item) {
@@ -221,6 +223,7 @@ static inline dap_cli_cmd_t *s_cmd_add_ex(const char * a_name, dap_cli_server_cm
     } else {
         l_cmd_item->func = (dap_cli_server_cmd_callback_t )(void *)a_func;
     }
+    l_cmd_item->id = a_id;
     HASH_ADD_STR(cli_commands,name,l_cmd_item);
     log_it(L_DEBUG,"Added command %s",l_cmd_item->name);
     return l_cmd_item;
@@ -241,7 +244,6 @@ int json_commands(const char * a_name) {
             "chain_ca_copy",
             "dag",
             "block",
-            "dag",
             "token",
             "esbocs",
             "global_db",
@@ -508,6 +510,8 @@ char *dap_cli_cmd_exec(char *a_req_str) {
         }
         // Call the command function
         if(l_cmd &&  l_argv && l_cmd->func) {
+            if (s_stat_callback)
+                s_stat_callback(l_cmd->id, true);
             if (json_commands(cmd_name)) {
                 res = l_cmd->func(l_argc, l_argv, (void *)&l_json_arr_reply);
             } else if (l_cmd->arg_func) {
@@ -515,6 +519,8 @@ char *dap_cli_cmd_exec(char *a_req_str) {
             } else {
                 res = l_cmd->func(l_argc, l_argv, (void *)&str_reply);
             }
+            if (s_stat_callback)
+                s_stat_callback(l_cmd->id, false);
         } else if (l_cmd) {
             log_it(L_WARNING,"NULL arguments for input for command \"%s\"", str_cmd);
             dap_json_rpc_error_add(l_json_arr_reply, -1, "NULL arguments for input for command \"%s\"", str_cmd);
@@ -557,4 +563,16 @@ char *dap_cli_cmd_exec(char *a_req_str) {
 DAP_INLINE int64_t dap_cli_get_cmd_thread_count()
 {
     return atomic_load(&s_cmd_thread_count);
+}
+
+/**
+ * @brief dap_cli_server_cmd_add
+ * @param a_callback callback to statistic collect
+ */
+void dap_cli_server_statistic_callback_add(dap_cli_server_cmd_stat_callback_t a_callback)
+{
+    if (a_callback && s_stat_callback)
+        log_it(L_ERROR, "Dap cli server statistic callback already added");
+    else
+    s_stat_callback = a_callback;
 }
\ No newline at end of file
diff --git a/net/server/cli_server/include/dap_cli_server.h b/net/server/cli_server/include/dap_cli_server.h
index ab09ac1445b83718f6f1926bb2dfeeedcdfcb123..187f2e6d648dfb4a84fd05178ae4754349ccbe94 100644
--- a/net/server/cli_server/include/dap_cli_server.h
+++ b/net/server/cli_server/include/dap_cli_server.h
@@ -32,6 +32,7 @@
 
 typedef int (*dap_cli_server_cmd_callback_ex_t)(int argc, char ** argv, void *arg_func, void **a_str_reply);
 typedef int (*dap_cli_server_cmd_callback_t)(int argc, char ** argv, void **a_str_reply);
+typedef void (*dap_cli_server_cmd_stat_callback_t)(int16_t a_cmd_num, bool a_flag);  // use to statistic collect
 
 typedef void (*dap_cli_server_override_log_cmd_callback_t)(const char*);
 
@@ -50,6 +51,7 @@ typedef struct dap_cli_cmd{
     char *doc; /* Documentation for this function.  */
     char *doc_ex; /* Full documentation for this function.  */
     dap_cli_server_cmd_override_t overrides; /* Used to change default behaviour */
+    int16_t id;
     UT_hash_handle hh;
 } dap_cli_cmd_t;
 
@@ -64,7 +66,7 @@ typedef struct dap_cli_cmd_aliases{
 int dap_cli_server_init(bool a_debug_more, const char *a_cfg_section);
 void dap_cli_server_deinit();
 
-dap_cli_cmd_t *dap_cli_server_cmd_add(const char * a_name, dap_cli_server_cmd_callback_t a_func, const char *a_doc, const char *a_doc_ex);
+dap_cli_cmd_t *dap_cli_server_cmd_add(const char * a_name, dap_cli_server_cmd_callback_t a_func, const char *a_doc, int16_t a_id, const char *a_doc_ex);
 DAP_PRINTF_ATTR(2, 3) void dap_cli_server_cmd_set_reply_text(void **a_str_reply, const char *str, ...);
 int dap_cli_server_cmd_find_option_val( char** argv, int arg_start, int arg_end, const char *opt_name, const char **opt_value);
 int dap_cli_server_cmd_check_option( char** argv, int arg_start, int arg_end, const char *opt_name);
@@ -80,3 +82,4 @@ int64_t dap_cli_get_cmd_thread_count();
 //for json
 int json_commands(const char * a_name);
 char *dap_cli_cmd_exec(char *a_req_str);
+void dap_cli_server_statistic_callback_add(dap_cli_server_cmd_stat_callback_t a_callback);
diff --git a/plugin/src/dap_plugin_command.c b/plugin/src/dap_plugin_command.c
index c7d036612f54b225ee2f14a128082aa90a61a4d2..cf0fec07f3ee091b313a9dc5b1ded3741ec186d8 100644
--- a/plugin/src/dap_plugin_command.c
+++ b/plugin/src/dap_plugin_command.c
@@ -22,7 +22,7 @@ void dap_plugin_command_init(void)
 {
     if (!s_l_restart_plugins){
         dap_cli_server_cmd_add("plugin", s_command_handler,
-                                           "Commands for working with plugins:\n",
+                                           "Commands for working with plugins:\n", -1,
                                            "plugin list\n"
                                            "\tShow plugins list\n"
                                            "plugin show <plugin name>\n"