fio: allow to combine terse output with any selected output type
[fio.git] / stat.c
diff --git a/stat.c b/stat.c
index fec363964f29270a374bc0732423d13e8194bbc6..77275d94efe4de77f3fb3bc6a39fa6b70121c07a 100644 (file)
--- a/stat.c
+++ b/stat.c
@@ -497,7 +497,7 @@ static void show_latencies(struct thread_stat *ts)
        show_lat_m(io_u_lat_m);
 }
 
-void show_thread_status(struct thread_stat *ts, struct group_run_stats *rs)
+void show_thread_status_normal(struct thread_stat *ts, struct group_run_stats *rs)
 {
        double usr_cpu, sys_cpu;
        unsigned long runtime;
@@ -586,6 +586,13 @@ void show_thread_status(struct thread_stat *ts, struct group_run_stats *rs)
                                        ts->first_error,
                                        strerror(ts->first_error));
        }
+       if (ts->latency_depth) {
+               log_info("     latency   : target=%llu, window=%llu, percentile=%.2f%%, depth=%u\n",
+                                       (unsigned long long)ts->latency_target,
+                                       (unsigned long long)ts->latency_window,
+                                       ts->latency_percentile.u.f,
+                                       ts->latency_depth);
+       }
 }
 
 static void show_ddir_status_terse(struct thread_stat *ts,
@@ -883,7 +890,8 @@ static void show_thread_status_terse_v3_v4(struct thread_stat *ts,
                log_info(";%3.2f%%", io_u_lat_m[i]);
 
        /* disk util stats, if any */
-       show_disk_util(1, NULL);
+       if (is_backend)
+               show_disk_util(1, NULL);
 
        /* Additional output if continue_on_error set - default off*/
        if (ts->continue_on_error)
@@ -970,7 +978,14 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts,
        /* Additional output if continue_on_error set - default off*/
        if (ts->continue_on_error) {
                json_object_add_value_int(root, "total_err", ts->total_err_count);
-               json_object_add_value_int(root, "total_err", ts->first_error);
+               json_object_add_value_int(root, "first_error", ts->first_error);
+       }
+
+       if (ts->latency_depth) {
+               json_object_add_value_int(root, "latency_depth", ts->latency_depth);
+               json_object_add_value_int(root, "latency_target", ts->latency_target);
+               json_object_add_value_float(root, "latency_percentile", ts->latency_percentile.u.f);
+               json_object_add_value_int(root, "latency_window", ts->latency_window);
        }
 
        /* Additional output if description is set */
@@ -991,6 +1006,18 @@ static void show_thread_status_terse(struct thread_stat *ts,
                log_err("fio: bad terse version!? %d\n", terse_version);
 }
 
+struct json_object *show_thread_status(struct thread_stat *ts,
+                                      struct group_run_stats *rs)
+{
+       if (output_format == FIO_OUTPUT_TERSE)
+               show_thread_status_terse(ts, rs);
+       else if (output_format == FIO_OUTPUT_JSON)
+               return(show_thread_status_json(ts, rs));
+       else
+               show_thread_status_normal(ts, rs);
+       return NULL;
+}
+
 static void sum_stat(struct io_stat *dst, struct io_stat *src, int nr)
 {
        double mean, S;
@@ -1251,6 +1278,11 @@ static void __show_run_stats(void)
                        }
                }
 
+               ts->latency_depth = td->latency_qd;
+               ts->latency_target = td->o.latency_target;
+               ts->latency_percentile = td->o.latency_percentile;
+               ts->latency_window = td->o.latency_window;
+
                sum_thread_stats(ts, &td->ts, idx);
        }
 
@@ -1324,7 +1356,7 @@ static void __show_run_stats(void)
                        struct json_object *tmp = show_thread_status_json(ts, rs);
                        json_array_add_value_object(array, tmp);
                } else
-                       show_thread_status(ts, rs);
+                       show_thread_status_normal(ts, rs);
        }
        if (output_format == FIO_OUTPUT_JSON) {
                /* disk util stats, if any */
@@ -1354,6 +1386,16 @@ static void __show_run_stats(void)
                show_idle_prof_stats(FIO_OUTPUT_NORMAL, NULL);
        }
 
+       if ( !(output_format == FIO_OUTPUT_TERSE) && append_terse_output) {
+               log_info("\nAdditional Terse Output:\n");
+
+               for (i = 0; i < nr_ts; i++) {
+                       ts = &threadstats[i];
+                       rs = &runstats[ts->groupid];
+                       show_thread_status_terse(ts, rs);
+               }
+       }
+
        log_info_flush();
        free(runstats);
        free(threadstats);