New parameter timestamp-format for changing the timestamp output

pull/323/head
German Service Network 7 months ago committed by Erik Auerswald
parent 652d319803
commit 85b92d3d21

@ -357,6 +357,7 @@ int per_recv_flag, report_all_rtts_flag, name_flag, addr_flag, backoff_flag, rdn
int multif_flag, timeout_flag, fast_reachable; int multif_flag, timeout_flag, fast_reachable;
int outage_flag = 0; int outage_flag = 0;
int timestamp_flag = 0; int timestamp_flag = 0;
int timestamp_format_flag = 0;
int random_data_flag = 0; int random_data_flag = 0;
int cumulative_stats_flag = 0; int cumulative_stats_flag = 0;
#if defined(DEBUG) || defined(_DEBUG) #if defined(DEBUG) || defined(_DEBUG)
@ -400,6 +401,7 @@ void host_add_timeout_event(HOST_ENTRY *h, int index, int64_t ev_time);
struct event *host_get_timeout_event(HOST_ENTRY *h, int index); struct event *host_get_timeout_event(HOST_ENTRY *h, int index);
void stats_add(HOST_ENTRY *h, int index, int success, int64_t latency); void stats_add(HOST_ENTRY *h, int index, int success, int64_t latency);
void update_current_time(); void update_current_time();
void print_timestamp_format(int64_t current_time_ns, int timestamp_format);
/************************************************************ /************************************************************
@ -522,6 +524,7 @@ int main(int argc, char **argv)
{ "vcount", 'C', OPTPARSE_REQUIRED }, { "vcount", 'C', OPTPARSE_REQUIRED },
{ "rdns", 'd', OPTPARSE_NONE }, { "rdns", 'd', OPTPARSE_NONE },
{ "timestamp", 'D', OPTPARSE_NONE }, { "timestamp", 'D', OPTPARSE_NONE },
{ "timestamp-format", '0', OPTPARSE_REQUIRED },
{ "elapsed", 'e', OPTPARSE_NONE }, { "elapsed", 'e', OPTPARSE_NONE },
{ "file", 'f', OPTPARSE_REQUIRED }, { "file", 'f', OPTPARSE_REQUIRED },
{ "generate", 'g', OPTPARSE_NONE }, { "generate", 'g', OPTPARSE_NONE },
@ -562,14 +565,17 @@ int main(int argc, char **argv)
while ((c = optparse_long(&optparse_state, longopts, NULL)) != EOF) { while ((c = optparse_long(&optparse_state, longopts, NULL)) != EOF) {
switch (c) { switch (c) {
case '0': case '0':
/* if(strstr(optparse_state.optlongname, "timestamp-format") != NULL) {
* Use long-option example if(strcmp(optparse_state.optarg, "ctime") == 0) {
* Define "struct optparse_long longopts": { "long-option-name", '0', OPTPARSE_NONE } timestamp_format_flag = 1;
* }else if(strcmp(optparse_state.optarg, "iso") == 0) {
* if(strstr(optparse_state.optlongname, "long-option-name") != NULL) { timestamp_format_flag = 2;
* long_option_flag = 1; }else if(strcmp(optparse_state.optarg, "rfc3339") == 0) {
* } timestamp_format_flag = 3;
*/ }else{
usage(1);
}
}
break; break;
case '4': case '4':
#ifdef IPV6 #ifdef IPV6
@ -1385,7 +1391,7 @@ void main_loop()
if (per_recv_flag) { if (per_recv_flag) {
if (timestamp_flag) { if (timestamp_flag) {
printf("[%.5f] ", (double)current_time_ns / 1e9); print_timestamp_format(current_time_ns, timestamp_format_flag);
} }
printf("%-*s : [%d], timed out", printf("%-*s : [%d], timed out",
max_hostname_len, h->host, event->ping_index); max_hostname_len, h->host, event->ping_index);
@ -2498,7 +2504,7 @@ int wait_for_reply(int64_t wait_time)
/* print received ping (unless --quiet) */ /* print received ping (unless --quiet) */
if (per_recv_flag) { if (per_recv_flag) {
if (timestamp_flag) { if (timestamp_flag) {
printf("[%.5f] ", (double)recv_time / 1e9); print_timestamp_format(recv_time, timestamp_format_flag);
} }
avg = h->total_time / h->num_recv; avg = h->total_time / h->num_recv;
printf("%-*s : [%d], %d bytes, %s ms", printf("%-*s : [%d], %d bytes, %s ms",
@ -2949,6 +2955,40 @@ void ev_remove(struct event_queue *queue, struct event *event)
event->ev_next = NULL; event->ev_next = NULL;
} }
/************************************************************
Function: print_human_readable_time from current_time_ns
*************************************************************/
void print_timestamp_format(int64_t current_time_ns, int timestamp_format)
{
char time_buffer[100];
time_t current_time_s;
struct tm *local_time;
current_time_s = current_time_ns / 1000000000;
local_time = localtime(&current_time_s);
switch(timestamp_format) {
case 1:
// timestamp-format ctime
strftime(time_buffer, sizeof(time_buffer), "%c", local_time);
printf("[%s] ", time_buffer);
break;
case 2:
// timestamp-format iso
strftime(time_buffer, sizeof(time_buffer), "%Y-%m-%dT%T%z", local_time);
printf("[%s] ", time_buffer);
break;
case 3:
// timestamp-format rfc3339
strftime(time_buffer, sizeof(time_buffer), "%Y-%m-%d %H:%M:%S", local_time);
printf("[%s] ", time_buffer);
break;
default:
printf("[%.5f] ", (double)current_time_ns / 1e9);
}
}
/************************************************************ /************************************************************
Function: usage Function: usage
@ -3002,6 +3042,7 @@ void usage(int is_error)
fprintf(out, " -C, --vcount=N same as -c, report results (not stats) in verbose format\n"); fprintf(out, " -C, --vcount=N same as -c, report results (not stats) in verbose format\n");
fprintf(out, " -d, --rdns show targets by name (force reverse-DNS lookup)\n"); fprintf(out, " -d, --rdns show targets by name (force reverse-DNS lookup)\n");
fprintf(out, " -D, --timestamp print timestamp before each output line\n"); fprintf(out, " -D, --timestamp print timestamp before each output line\n");
fprintf(out, " --timestamp-format=FORMAT show timestamp in the given format (-D required): ctime|iso|rfc3339\n");
fprintf(out, " -e, --elapsed show elapsed time on return packets\n"); fprintf(out, " -e, --elapsed show elapsed time on return packets\n");
fprintf(out, " -n, --name show targets by name (reverse-DNS lookup for target IPs)\n"); fprintf(out, " -n, --name show targets by name (reverse-DNS lookup for target IPs)\n");
fprintf(out, " -N, --netdata output compatible for netdata (-l -Q are required)\n"); fprintf(out, " -N, --netdata output compatible for netdata (-l -Q are required)\n");

Loading…
Cancel
Save