in source/device_defender.c [759:805]
static void s_serialize_and_publish_defender_report(
struct aws_iotdevice_defender_task *defender_task,
struct aws_iotdevice_metric_network_transfer *totals,
struct aws_iotdevice_metric_network_transfer *delta_xfer,
struct aws_array_list *net_conns,
const size_t custom_metrics_len,
struct defender_custom_metric_data *custom_metric_data) {
uint64_t report_id = s_defender_report_id_epoch_time_ms(defender_task);
struct aws_byte_buf json_report_buf;
AWS_ZERO_STRUCT(json_report_buf);
if (AWS_OP_SUCCESS == s_get_metric_report_json(
&json_report_buf,
defender_task,
report_id,
delta_xfer,
net_conns,
custom_metrics_len,
custom_metric_data)) {
defender_task->previous_net_xfer.bytes_in = totals->bytes_in;
defender_task->previous_net_xfer.bytes_out = totals->bytes_out;
defender_task->previous_net_xfer.packets_in = totals->packets_in;
defender_task->previous_net_xfer.packets_out = totals->packets_out;
struct aws_byte_cursor report = aws_byte_cursor_from_buf(&json_report_buf);
AWS_LOGF_TRACE(
AWS_LS_IOTDEVICE_DEFENDER_TASK,
"id=%p: Full report: " PRInSTR,
(void *)defender_task,
AWS_BYTE_CURSOR_PRI(report));
void *userdata = defender_task->connection ? defender_task : defender_task->config.callback_userdata;
if (AWS_OP_ERR == defender_task->publish_fn(report, userdata)) {
s_invoke_failure_callback(&defender_task->config, false, AWS_ERROR_IOTDEVICE_DEFENDER_PUBLISH_FAILURE);
AWS_LOGF_DEBUG(
AWS_LS_IOTDEVICE_DEFENDER_TASK,
"id=%p: Failed to publish report: %s",
(void *)defender_task,
aws_error_name(aws_last_error()));
} else {
AWS_LOGF_DEBUG(
AWS_LS_IOTDEVICE_DEFENDER_TASK, "id=%p: Successfully published report", (void *)defender_task);
}
aws_byte_buf_clean_up(&json_report_buf);
}
}