diff options
Diffstat (limited to 'iowatcher/plot.h')
-rw-r--r-- | iowatcher/plot.h | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/iowatcher/plot.h b/iowatcher/plot.h new file mode 100644 index 0000000..d65bbcf --- /dev/null +++ b/iowatcher/plot.h @@ -0,0 +1,180 @@ +/* + * Copyright (C) 2012 Fusion-io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License v2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ +#ifndef __IOWATCH_PLOT__ +#define __IOWATCH_PLOT__ +#define MAX_TICKS 10 + +#include "list.h" + +typedef __u64 u64; +typedef __u32 u32; +typedef __u16 u16; + + +/* values for the plot direction field */ +#define PLOT_DOWN 0 +#define PLOT_ACROSS 1 + +struct plot { + int fd; + + /* svg style y = 0 is the top of the graph */ + int start_y_offset; + + /* abs coords of the start of X start of the plot */ + int start_x_offset; + + int add_xlabel; + int no_legend; + + /* + * these two are for anyone that wants + * to add a plot after this one, it tells + * them how much space we took up + */ + int total_height; + int total_width; + char **legend_lines; + int legend_index; + int num_legend_lines; + int direction; + + /* + * timeline is a vertical line through line graphs that + * is used by the movie mode to show where in the graph + * our current frame lives + */ + int timeline; +}; + +struct graph_line_pair { + u64 count; + u64 sum; +}; + +struct graph_line_data { + /* beginning of an interval displayed by this graph */ + unsigned int min_seconds; + + /* end of an interval displayed by this graph */ + unsigned int max_seconds; + + unsigned int stop_seconds; + + /* Y max */ + u64 max; + + /* label for this graph */ + char *label; + struct graph_line_pair data[]; +}; + +struct graph_dot_data { + u64 min_offset; + u64 max_offset; + u64 max_bank; + u64 max_bank_offset; + u64 total_ios; + u64 total_bank_ios; + + int add_bank_ios; + + /* in pixels, number of rows in our bitmap */ + int rows; + /* in pixels, number of cols in our bitmap */ + int cols; + + /* beginning of an interval displayed by this graph */ + int min_seconds; + + /* end of an interval displayed by this graph */ + unsigned int max_seconds; + unsigned int stop_seconds; + + /* label for the legend */ + char *label; + + /* color for plotting data */ + char *color; + + /* bitmap, one bit for each cell to light up */ + unsigned char data[]; +}; + +struct pid_plot_history { + double history_max; + int history_len; + int num_used; + char *color; + double *history; +}; + +struct plot_history { + struct list_head list; + int pid_history_count; + int col; + struct pid_plot_history **read_pid_history; + struct pid_plot_history **write_pid_history; +}; + +char *pick_color(void); +char *pick_fio_color(void); +char *pick_cpu_color(void); +void reset_cpu_color(void); +int svg_io_graph(struct plot *plot, struct graph_dot_data *gdd); +double line_graph_roll_avg_max(struct graph_line_data *gld); +int svg_line_graph(struct plot *plot, struct graph_line_data *gld, char *color, int thresh1, int thresh2); +struct graph_line_data *alloc_line_data(unsigned int min_seconds, unsigned int max_seconds, unsigned int stop_seconds); +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); +void set_gdd_bit(struct graph_dot_data *gdd, u64 offset, double bytes, double time); +void write_svg_header(int fd); +struct plot *alloc_plot(void); +int close_plot(struct plot *plot); +int close_plot_no_height(struct plot *plot); +void setup_axis(struct plot *plot); +void set_xticks(struct plot *plot, int num_ticks, int first, int last); +void set_yticks(struct plot *plot, int num_ticks, int first, int last, char *units); +void set_plot_title(struct plot *plot, char *title); +void set_plot_label(struct plot *plot, char *label); +void set_xlabel(struct plot *plot, char *label); +void set_ylabel(struct plot *plot, char *label); +void scale_line_graph_bytes(u64 *max, char **units, u64 factor); +void scale_line_graph_time(u64 *max, char **units); +void write_drop_shadow_line(struct plot *plot); +void svg_write_legend(struct plot *plot); +void svg_add_legend(struct plot *plot, char *text, char *extra, char *color); +void svg_alloc_legend(struct plot *plot, int num_lines); +void set_legend_width(int longest_str); +void set_rolling_avg(int rolling); +void svg_free_legend(struct plot *plot); +void set_io_graph_scale(int scale); +void set_plot_output(struct plot *plot, char *filename); +void set_graph_size(int width, int height); +void get_graph_size(int *width, int *height); +int svg_io_graph_movie(struct graph_dot_data *gdd, struct pid_plot_history *ph, int col); +int svg_io_graph_movie_array(struct plot *plot, struct pid_plot_history *ph); +void svg_write_time_line(struct plot *plot, int col); +void set_graph_height(int h); +void set_graph_width(int w); +int close_plot_file(struct plot *plot); +int svg_io_graph_movie_array_spindle(struct plot *plot, struct pid_plot_history *ph); +void rewind_spindle_steps(int num); +void setup_axis_spindle(struct plot *plot); +int close_plot_col(struct plot *plot); + +#endif |