mirror of
https://github.com/emqx/neuron.git
synced 2026-10-22 01:05:56 +08:00
Merge pull request #1632 from hxy7yx/v2.6-1
log api supports independent core log
This commit is contained in:
@@ -602,6 +602,7 @@ typedef struct neu_req_get_node_state {
|
||||
typedef struct neu_resp_get_node_state {
|
||||
neu_node_state_t state;
|
||||
uint16_t rtt; // round trip time in milliseconds
|
||||
char core_level[NEU_LOG_LEVEL_LEN];
|
||||
} neu_resp_get_node_state_t;
|
||||
|
||||
typedef struct neu_req_get_nodes_state {
|
||||
@@ -621,6 +622,7 @@ inline static UT_icd neu_nodes_state_t_icd()
|
||||
}
|
||||
typedef struct {
|
||||
UT_array *states; // array of neu_nodes_state_t
|
||||
char core_level[NEU_LOG_LEVEL_LEN];
|
||||
} neu_resp_get_nodes_state_t, neu_reqresp_nodes_state_t;
|
||||
|
||||
typedef struct {
|
||||
@@ -1063,6 +1065,7 @@ typedef struct {
|
||||
typedef struct neu_req_update_log_level {
|
||||
char node[NEU_NODE_NAME_LEN];
|
||||
char log_level[NEU_LOG_LEVEL_LEN];
|
||||
bool core;
|
||||
} neu_req_update_log_level_t;
|
||||
|
||||
void neu_msg_gen(neu_reqresp_head_t *header, void *data);
|
||||
|
||||
@@ -334,6 +334,7 @@ void handle_get_node_state_resp(nng_aio *aio, neu_resp_get_node_state_t *state)
|
||||
res.running = state->state.running;
|
||||
res.rtt = state->rtt;
|
||||
res.log_level = state->state.log_level;
|
||||
strcpy(res.core_level, state->core_level);
|
||||
|
||||
neu_json_encode_by_fn(&res, neu_json_encode_get_node_state_resp, &result);
|
||||
|
||||
@@ -361,6 +362,8 @@ void handle_get_nodes_state_resp(nng_aio * aio,
|
||||
states_res.nodes[index].log_level = state->state.log_level;
|
||||
}
|
||||
|
||||
strcpy(states_res.core_level, states->core_level);
|
||||
|
||||
neu_json_encode_by_fn(&states_res, neu_json_encode_get_nodes_state_resp,
|
||||
&result);
|
||||
|
||||
|
||||
@@ -116,10 +116,7 @@ void handle_log_level(nng_aio *aio)
|
||||
int ret = 0;
|
||||
neu_reqresp_head_t header = { 0 };
|
||||
neu_req_update_log_level_t cmd = { 0 };
|
||||
zlog_category_t * ct = zlog_get_category(req->node_name);
|
||||
zlog_category_t * neuron = zlog_get_category("neuron");
|
||||
int log_level;
|
||||
static int log_level_neuron = 60;
|
||||
|
||||
if (0 == strcmp(req->log_level, NEU_LOG_LEVEL_DEBUG)) {
|
||||
log_level = ZLOG_LEVEL_DEBUG;
|
||||
@@ -149,36 +146,39 @@ void handle_log_level(nng_aio *aio)
|
||||
});
|
||||
goto end;
|
||||
}
|
||||
|
||||
ret = zlog_level_switch(ct, log_level);
|
||||
if (ret != 0) {
|
||||
nlog_error(
|
||||
"Failed to modify log_level of the node, node_name:%s, "
|
||||
"ret: %d,",
|
||||
req->node_name, ret);
|
||||
NEU_JSON_RESPONSE_ERROR(NEU_ERR_EINTERNAL, {
|
||||
neu_http_response(aio, error_code.error, result_error);
|
||||
});
|
||||
if (req->core) {
|
||||
zlog_category_t *neuron = zlog_get_category("neuron");
|
||||
ret = zlog_level_switch(neuron, log_level);
|
||||
if (ret != 0) {
|
||||
nlog_error(
|
||||
"Failed to modify log_level of the core, ret: %d", ret);
|
||||
NEU_JSON_RESPONSE_ERROR(NEU_ERR_EINTERNAL, {
|
||||
neu_http_response(aio, error_code.error, result_error);
|
||||
});
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
|
||||
if (log_level > log_level_neuron) {
|
||||
log_level_neuron = log_level;
|
||||
}
|
||||
|
||||
ret = zlog_level_switch(neuron, log_level_neuron);
|
||||
if (ret != 0) {
|
||||
nlog_error("Failed to modify log_level of the node, ret: %d",
|
||||
ret);
|
||||
NEU_JSON_RESPONSE_ERROR(NEU_ERR_EINTERNAL, {
|
||||
neu_http_response(aio, error_code.error, result_error);
|
||||
});
|
||||
if (req->node_name) {
|
||||
zlog_category_t *ct = zlog_get_category(req->node_name);
|
||||
strcpy(cmd.node, req->node_name);
|
||||
ret = zlog_level_switch(ct, log_level);
|
||||
if (ret != 0) {
|
||||
nlog_error(
|
||||
"Failed to modify log_level of the node, node_name:%s, "
|
||||
"ret: %d,",
|
||||
req->node_name, ret);
|
||||
NEU_JSON_RESPONSE_ERROR(0, {
|
||||
neu_http_response(aio, error_code.error, result_error);
|
||||
});
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
|
||||
header.ctx = aio;
|
||||
header.type = NEU_REQ_UPDATE_LOG_LEVEL;
|
||||
strcpy(cmd.node, req->node_name);
|
||||
|
||||
ret = neu_plugin_op(plugin, header, &cmd);
|
||||
cmd.core = req->core;
|
||||
ret = neu_plugin_op(plugin, header, &cmd);
|
||||
if (ret != 0) {
|
||||
NEU_JSON_RESPONSE_ERROR(NEU_ERR_IS_BUSY, {
|
||||
neu_http_response(aio, NEU_ERR_IS_BUSY, result_error);
|
||||
|
||||
@@ -471,7 +471,9 @@ static int adapter_command(neu_adapter_t *adapter, neu_reqresp_head_t header,
|
||||
}
|
||||
case NEU_REQ_UPDATE_LOG_LEVEL: {
|
||||
neu_req_update_log_level_t *cmd = (neu_req_update_log_level_t *) data;
|
||||
strcpy(pheader->receiver, cmd->node);
|
||||
if (cmd->node != NULL) {
|
||||
strcpy(pheader->receiver, cmd->node);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -758,17 +760,18 @@ static int adapter_loop(enum neu_event_io_type type, int fd, void *usr_data)
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_GET_NODE_STATE: {
|
||||
neu_resp_get_node_state_t resp = { 0 };
|
||||
neu_resp_get_node_state_t *resp =
|
||||
(neu_resp_get_node_state_t *) &header[1];
|
||||
|
||||
neu_metric_entry_t *e = NULL;
|
||||
if (NULL != adapter->metrics) {
|
||||
HASH_FIND_STR(adapter->metrics->entries, NEU_METRIC_LAST_RTT_MS, e);
|
||||
}
|
||||
resp.rtt = NULL != e ? e->value : 0;
|
||||
resp.state = neu_adapter_get_state(adapter);
|
||||
resp->rtt = NULL != e ? e->value : 0;
|
||||
resp->state = neu_adapter_get_state(adapter);
|
||||
header->type = NEU_RESP_GET_NODE_STATE;
|
||||
neu_msg_exchange(header);
|
||||
reply(adapter, header, &resp);
|
||||
reply(adapter, header, resp);
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_GET_GROUP: {
|
||||
|
||||
+83
-16
@@ -787,6 +787,10 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data)
|
||||
neu_resp_get_nodes_state_t resp = { 0 };
|
||||
UT_array *states = neu_node_manager_get_state(manager->node_manager);
|
||||
|
||||
neu_adapter_t *adapter_core =
|
||||
neu_node_manager_find(manager->node_manager, "default-dashboard");
|
||||
strcpy(resp.core_level,
|
||||
neu_plugin_to_plugin_common(adapter_core->plugin)->log_level);
|
||||
resp.states = utarray_clone(states);
|
||||
|
||||
strcpy(header->receiver, header->sender);
|
||||
@@ -812,7 +816,6 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data)
|
||||
|
||||
case NEU_REQ_GET_GROUP:
|
||||
case NEU_REQ_GET_NODE_SETTING:
|
||||
case NEU_REQ_GET_NODE_STATE:
|
||||
case NEU_REQ_READ_GROUP:
|
||||
case NEU_REQ_WRITE_TAG:
|
||||
case NEU_REQ_WRITE_TAGS:
|
||||
@@ -834,6 +837,27 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data)
|
||||
break;
|
||||
}
|
||||
|
||||
case NEU_REQ_GET_NODE_STATE: {
|
||||
if (neu_node_manager_find(manager->node_manager, header->receiver) ==
|
||||
NULL) {
|
||||
neu_resp_error_t e = { .error = NEU_ERR_NODE_NOT_EXIST };
|
||||
header->type = NEU_RESP_ERROR;
|
||||
neu_msg_exchange(header);
|
||||
reply(manager, header, &e);
|
||||
} else {
|
||||
neu_resp_get_node_state_t *resp =
|
||||
(neu_resp_get_node_state_t *) &header[1];
|
||||
neu_adapter_t *adapter_core = neu_node_manager_find(
|
||||
manager->node_manager, "default-dashboard");
|
||||
strcpy(
|
||||
resp->core_level,
|
||||
neu_plugin_to_plugin_common(adapter_core->plugin)->log_level);
|
||||
forward_msg(manager, header, header->receiver);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case NEU_RESP_NODE_RENAME: {
|
||||
neu_resp_node_rename_t *resp = (neu_resp_node_rename_t *) &header[1];
|
||||
if (0 == resp->error) {
|
||||
@@ -1088,25 +1112,68 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NEU_REQ_UPDATE_LOG_LEVEL:
|
||||
if (neu_node_manager_find(manager->node_manager, header->receiver) ==
|
||||
NULL) {
|
||||
neu_resp_error_t e = { .error = NEU_ERR_NODE_NOT_EXIST };
|
||||
header->type = NEU_RESP_ERROR;
|
||||
neu_msg_exchange(header);
|
||||
reply(manager, header, &e);
|
||||
} else {
|
||||
neu_req_update_log_level_t *cmd =
|
||||
(neu_req_update_log_level_t *) &header[1];
|
||||
neu_adapter_t *adapter_log =
|
||||
neu_node_manager_find(manager->node_manager, header->receiver);
|
||||
strcpy(neu_plugin_to_plugin_common(adapter_log->plugin)->log_level,
|
||||
cmd->log_level);
|
||||
case NEU_REQ_UPDATE_LOG_LEVEL: {
|
||||
neu_req_update_log_level_t *cmd =
|
||||
(neu_req_update_log_level_t *) &header[1];
|
||||
|
||||
forward_msg(manager, header, header->receiver);
|
||||
if (cmd->core) {
|
||||
if (strcmp(header->receiver, "") == 0) {
|
||||
neu_adapter_t *adapter_core = neu_node_manager_find(
|
||||
manager->node_manager, "default-dashboard");
|
||||
strcpy(neu_plugin_to_plugin_common(adapter_core->plugin)
|
||||
->log_level,
|
||||
cmd->log_level);
|
||||
neu_resp_error_t error = { 0 };
|
||||
neu_msg_exchange(header);
|
||||
header->type = NEU_RESP_ERROR;
|
||||
reply(manager, header, &error);
|
||||
} else {
|
||||
if (neu_node_manager_find(manager->node_manager,
|
||||
header->receiver) == NULL) {
|
||||
neu_resp_error_t e = { .error = NEU_ERR_NODE_NOT_EXIST };
|
||||
header->type = NEU_RESP_ERROR;
|
||||
neu_msg_exchange(header);
|
||||
reply(manager, header, &e);
|
||||
} else {
|
||||
neu_adapter_t *adapter_core = neu_node_manager_find(
|
||||
manager->node_manager, "default-dashboard");
|
||||
strcpy(neu_plugin_to_plugin_common(adapter_core->plugin)
|
||||
->log_level,
|
||||
cmd->log_level);
|
||||
neu_adapter_t *adapter_log = neu_node_manager_find(
|
||||
manager->node_manager, header->receiver);
|
||||
strcpy(neu_plugin_to_plugin_common(adapter_log->plugin)
|
||||
->log_level,
|
||||
cmd->log_level);
|
||||
forward_msg(manager, header, header->receiver);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (strcmp(header->receiver, "") == 0) {
|
||||
neu_resp_error_t e = { .error = NEU_ERR_PARAM_IS_WRONG };
|
||||
header->type = NEU_RESP_ERROR;
|
||||
neu_msg_exchange(header);
|
||||
reply(manager, header, &e);
|
||||
} else {
|
||||
if (neu_node_manager_find(manager->node_manager,
|
||||
header->receiver) == NULL) {
|
||||
neu_resp_error_t e = { .error = NEU_ERR_NODE_NOT_EXIST };
|
||||
header->type = NEU_RESP_ERROR;
|
||||
neu_msg_exchange(header);
|
||||
reply(manager, header, &e);
|
||||
} else {
|
||||
neu_adapter_t *adapter_log = neu_node_manager_find(
|
||||
manager->node_manager, header->receiver);
|
||||
strcpy(neu_plugin_to_plugin_common(adapter_log->plugin)
|
||||
->log_level,
|
||||
cmd->log_level);
|
||||
forward_msg(manager, header, header->receiver);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
assert(false);
|
||||
break;
|
||||
|
||||
@@ -42,14 +42,24 @@ int neu_json_decode_update_log_level_req(
|
||||
return -1;
|
||||
}
|
||||
|
||||
neu_json_elem_t req_elems[] = { {
|
||||
.name = "node",
|
||||
.t = NEU_JSON_STR,
|
||||
},
|
||||
{
|
||||
.name = "level",
|
||||
.t = NEU_JSON_STR,
|
||||
} };
|
||||
req->node_name = NULL;
|
||||
req->core = true;
|
||||
|
||||
neu_json_elem_t req_elems[] = {
|
||||
{
|
||||
.name = "node",
|
||||
.t = NEU_JSON_STR,
|
||||
.attribute = NEU_JSON_ATTRIBUTE_OPTIONAL,
|
||||
},
|
||||
{
|
||||
.name = "level",
|
||||
.t = NEU_JSON_STR,
|
||||
},
|
||||
{
|
||||
.name = "core",
|
||||
.attribute = NEU_JSON_ATTRIBUTE_OPTIONAL,
|
||||
}
|
||||
};
|
||||
|
||||
ret = neu_json_decode_by_json(json_obj, NEU_JSON_ELEM_SIZE(req_elems),
|
||||
req_elems);
|
||||
@@ -57,8 +67,13 @@ int neu_json_decode_update_log_level_req(
|
||||
goto decode_fail;
|
||||
}
|
||||
|
||||
req->node_name = req_elems[0].v.val_str;
|
||||
if (req_elems[0].v.val_str != NULL) {
|
||||
req->node_name = req_elems[0].v.val_str;
|
||||
}
|
||||
req->log_level = req_elems[1].v.val_str;
|
||||
if (req_elems[2].t == NEU_JSON_BOOL) {
|
||||
req->core = req_elems[2].v.val_bool;
|
||||
}
|
||||
|
||||
*result = req;
|
||||
goto decode_exit;
|
||||
|
||||
@@ -36,6 +36,7 @@ typedef char *neu_json_get_log_resp_row_t;
|
||||
typedef struct {
|
||||
char *node_name;
|
||||
char *log_level;
|
||||
bool core;
|
||||
} neu_json_update_log_level_req_t;
|
||||
|
||||
typedef struct {
|
||||
|
||||
@@ -189,6 +189,11 @@ int neu_json_encode_get_node_state_resp(void *json_object, void *param)
|
||||
.name = "log_level",
|
||||
.t = NEU_JSON_STR,
|
||||
.v.val_str = resp->log_level,
|
||||
},
|
||||
{
|
||||
.name = "neuron_core",
|
||||
.t = NEU_JSON_STR,
|
||||
.v.val_str = resp->core_level,
|
||||
} };
|
||||
ret = neu_json_encode_field(json_object, resp_elems,
|
||||
NEU_JSON_ELEM_SIZE(resp_elems));
|
||||
@@ -236,10 +241,15 @@ int neu_json_encode_get_nodes_state_resp(void *json_object, void *param)
|
||||
}
|
||||
|
||||
neu_json_elem_t resp_elems[] = { {
|
||||
.name = "states",
|
||||
.t = NEU_JSON_OBJECT,
|
||||
.v.val_object = node_array,
|
||||
} };
|
||||
.name = "states",
|
||||
.t = NEU_JSON_OBJECT,
|
||||
.v.val_object = node_array,
|
||||
},
|
||||
{
|
||||
.name = "neuron_core",
|
||||
.t = NEU_JSON_STR,
|
||||
.v.val_str = resp->core_level,
|
||||
} };
|
||||
ret = neu_json_encode_field(json_object, resp_elems,
|
||||
NEU_JSON_ELEM_SIZE(resp_elems));
|
||||
|
||||
|
||||
@@ -54,6 +54,7 @@ typedef struct {
|
||||
int64_t link;
|
||||
int64_t rtt;
|
||||
char * log_level;
|
||||
char core_level[NEU_LOG_LEVEL_LEN];
|
||||
} neu_json_get_node_state_resp_t;
|
||||
|
||||
int neu_json_encode_get_node_state_resp(void *json_object, void *param);
|
||||
@@ -69,6 +70,7 @@ typedef struct {
|
||||
typedef struct {
|
||||
uint16_t n_node;
|
||||
neu_json_get_nodes_state_t *nodes;
|
||||
char core_level[NEU_LOG_LEVEL_LEN];
|
||||
} neu_json_get_nodes_state_resp_t;
|
||||
|
||||
int neu_json_encode_get_nodes_state_resp(void *json_object, void *param);
|
||||
|
||||
Reference in New Issue
Block a user