Home | History | Annotate | Download | only in iowatcher
      1 /*
      2  * Copyright (C) 2012 Fusion-io
      3  *
      4  *  This program is free software; you can redistribute it and/or
      5  *  modify it under the terms of the GNU General Public
      6  *  License v2 as published by the Free Software Foundation.
      7  *
      8  *  This program is distributed in the hope that it will be useful,
      9  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     10  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11  *  GNU General Public License for more details.
     12  *
     13  *  You should have received a copy of the GNU General Public License
     14  *  along with this program; if not, write to the Free Software
     15  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     16  *
     17  */
     18 #ifndef __IOWATCH_PLOT__
     19 #define __IOWATCH_PLOT__
     20 #define MAX_TICKS 10
     21 
     22 #include "list.h"
     23 
     24 typedef __u64 u64;
     25 typedef __u32 u32;
     26 typedef __u16 u16;
     27 
     28 
     29 /* values for the plot direction field */
     30 #define PLOT_DOWN 0
     31 #define PLOT_ACROSS 1
     32 
     33 struct plot {
     34 	int fd;
     35 
     36 	/* svg style y = 0 is the top of the graph */
     37 	int start_y_offset;
     38 
     39 	/* abs coords of the start of X start of the plot */
     40 	int start_x_offset;
     41 
     42 	int add_xlabel;
     43 	int no_legend;
     44 
     45 	/*
     46 	 * these two are for anyone that wants
     47 	 * to add a plot after this one, it tells
     48 	 * them how much space we took up
     49 	 */
     50 	int total_height;
     51 	int total_width;
     52 	char **legend_lines;
     53 	int legend_index;
     54 	int num_legend_lines;
     55 	int direction;
     56 
     57 	/*
     58 	 * timeline is a vertical line through line graphs that
     59 	 * is used by the movie mode to show where in the graph
     60 	 * our current frame lives
     61 	 */
     62 	int timeline;
     63 };
     64 
     65 struct graph_line_pair {
     66 	u64 count;
     67 	u64 sum;
     68 };
     69 
     70 struct graph_line_data {
     71 	/* beginning of an interval displayed by this graph */
     72 	unsigned int min_seconds;
     73 
     74 	/* end of an interval displayed by this graph */
     75 	unsigned int max_seconds;
     76 
     77 	unsigned int stop_seconds;
     78 
     79 	/* Y max */
     80 	u64 max;
     81 
     82 	/* label for this graph */
     83 	char *label;
     84 	struct graph_line_pair data[];
     85 };
     86 
     87 struct graph_dot_data {
     88 	u64 min_offset;
     89 	u64 max_offset;
     90 	u64 max_bank;
     91 	u64 max_bank_offset;
     92 	u64 total_ios;
     93 	u64 total_bank_ios;
     94 
     95 	int add_bank_ios;
     96 
     97 	/* in pixels, number of rows in our bitmap */
     98 	int rows;
     99 	/* in pixels, number of cols in our bitmap */
    100 	int cols;
    101 
    102 	/* beginning of an interval displayed by this graph */
    103 	int min_seconds;
    104 
    105 	/* end of an interval displayed by this graph */
    106 	unsigned int max_seconds;
    107 	unsigned int stop_seconds;
    108 
    109 	/* label for the legend */
    110 	char *label;
    111 
    112 	/* color for plotting data */
    113 	char *color;
    114 
    115 	/* bitmap, one bit for each cell to light up */
    116 	unsigned char data[];
    117 };
    118 
    119 struct pid_plot_history {
    120 	double history_max;
    121 	int history_len;
    122 	int num_used;
    123 	char *color;
    124 	double *history;
    125 };
    126 
    127 struct plot_history {
    128 	struct list_head list;
    129 	int pid_history_count;
    130 	int col;
    131 	struct pid_plot_history **read_pid_history;
    132 	struct pid_plot_history **write_pid_history;
    133 };
    134 
    135 char *pick_color(void);
    136 char *pick_fio_color(void);
    137 char *pick_cpu_color(void);
    138 void reset_cpu_color(void);
    139 int svg_io_graph(struct plot *plot, struct graph_dot_data *gdd);
    140 double line_graph_roll_avg_max(struct graph_line_data *gld);
    141 int svg_line_graph(struct plot *plot, struct graph_line_data *gld, char *color, int thresh1, int thresh2);
    142 struct graph_line_data *alloc_line_data(unsigned int min_seconds, unsigned int max_seconds, unsigned int stop_seconds);
    143 struct graph_dot_data *alloc_dot_data(unsigned int min_seconds, unsigned int max_seconds, u64 min_offset, u64 max_offset, unsigned int stop_seconds, char *color, char *label);
    144 void set_gdd_bit(struct graph_dot_data *gdd, u64 offset, double bytes, double time);
    145 void write_svg_header(int fd);
    146 struct plot *alloc_plot(void);
    147 int close_plot(struct plot *plot);
    148 int close_plot_no_height(struct plot *plot);
    149 void setup_axis(struct plot *plot);
    150 void set_xticks(struct plot *plot, int num_ticks, int first, int last);
    151 void set_yticks(struct plot *plot, int num_ticks, int first, int last, char *units);
    152 void set_plot_title(struct plot *plot, char *title);
    153 void set_plot_label(struct plot *plot, char *label);
    154 void set_xlabel(struct plot *plot, char *label);
    155 void set_ylabel(struct plot *plot, char *label);
    156 void scale_line_graph_bytes(u64 *max, char **units, u64 factor);
    157 void scale_line_graph_time(u64 *max, char **units);
    158 void write_drop_shadow_line(struct plot *plot);
    159 void svg_write_legend(struct plot *plot);
    160 void svg_add_legend(struct plot *plot, char *text, char *extra, char *color);
    161 void svg_alloc_legend(struct plot *plot, int num_lines);
    162 void set_legend_width(int longest_str);
    163 void set_rolling_avg(int rolling);
    164 void svg_free_legend(struct plot *plot);
    165 void set_io_graph_scale(int scale);
    166 void set_plot_output(struct plot *plot, char *filename);
    167 void set_graph_size(int width, int height);
    168 void get_graph_size(int *width, int *height);
    169 int svg_io_graph_movie(struct graph_dot_data *gdd, struct pid_plot_history *ph, int col);
    170 int svg_io_graph_movie_array(struct plot *plot, struct pid_plot_history *ph);
    171 void svg_write_time_line(struct plot *plot, int col);
    172 void set_graph_height(int h);
    173 void set_graph_width(int w);
    174 int close_plot_file(struct plot *plot);
    175 int svg_io_graph_movie_array_spindle(struct plot *plot, struct pid_plot_history *ph);
    176 void rewind_spindle_steps(int num);
    177 void setup_axis_spindle(struct plot *plot);
    178 int close_plot_col(struct plot *plot);
    179 
    180 #endif
    181