struct TSDB_metric_t * TSDB_create(struct TSDB_create_opts_t *opts) { int fd, write_len,len; int size = sizeof(unsigned long long); int version = 1; assert(opts->magic == TSDB_create_opts_magic); assert(opts->columns > 0); if(!opts->created_time) opts->created_time = time(NULL); if(!opts->resolution) opts->resolution = 60; fd = open(opts->filename, O_CREAT | O_RDWR | O_EXCL, 0755); if(fd == -1) printf("Cannot open %s (%s)\n", opts->filename, strerror(errno)); assert(fd != -1); write_len = write(fd, &size, 4); assert(write_len == 4); write_len = write(fd, &version, 4); assert(write_len == 4); write_len = write(fd, &opts->resolution, 4); assert(write_len == 4); write_len = write(fd, &opts->columns, 4); assert(write_len == 4); write_len = write(fd, &opts->created_time, size); assert(write_len == size); len = strlen(opts->name) + 1; write_len = write(fd, &opts->flags, 4); assert(write_len == 4); write_len = write(fd, &len, 4); assert(write_len == 4); write_len = write(fd, opts->name, strlen(opts->name)+1); assert(write_len == strlen(opts->name)+1); int i; for(i = 0; i < opts->columns; i++) { len = strlen(opts->col_names[i]) + 1; write_len = write(fd, &opts->col_flags[i], 4); assert(write_len == 4); write_len = write(fd, &len, 4); assert(write_len == 4); write_len = write(fd, opts->col_names[i], len); assert(write_len == len); } close(fd); return TSDB_open(opts->filename); }
int agg_main(int argc, char * const *argv) { int o, start, end, interval, column, difference; char *filename = 0; difference = column = start = end = interval = 0; while ((o = getopt(argc, argv, "f:s:e:i:h:c:d")) != -1) { switch(o) { case 'd': difference = 1; break; case 'c': column = atoi(optarg); break; case 'f': filename = malloc(strlen(optarg)+1); memcpy(filename, optarg, strlen(optarg)+1); break; case 's': start = atoi(optarg); break; case 'e': end = atoi(optarg); break; case 'i': interval = atoi(optarg); break; } } if(!filename || !start || !end || !interval) { WARN("Usage: ngr agg [options]\n"); return agg_usage(); } int flags; if (difference) flags = TSDB_COUNTER; else flags = TSDB_GAUGE; struct TSDB_metric_t *metric = TSDB_open(filename); struct TSDB_range_t *range = TSDB_timespan(metric, start, end); struct TSDB_range_t *aggregate = TSDB_aggregate(range, interval, flags); int rows = aggregate->rows; int i = 0; while(rows--) { int offset = ((i * aggregate->columns) + column); printf("AVG: %.4f MAX: %llu MIN: %llu STDDEV: %f\n", aggregate->agg[offset].avg, aggregate->agg[offset].max, aggregate->agg[offset].min, aggregate->agg[offset].stddev); i++; } return 0; }