#ifndef STATS_SETTINGS_H #define STATS_SETTINGS_H #define STATS_METRIC_SETTINGS_DEFAULT_EXPORTER_INCLUDE \ "name hostname timestamps categories fields" /* */ /* * We allow a selection of a timestamp format. * * The 'time-unix' format generates a number with the number of seconds * since 1970-01-01 00:00 UTC. * * The 'time-rfc3339' format uses the YYYY-MM-DDTHH:MM:SS.uuuuuuZ format as * defined by RFC 3339. * * The special native format (not explicitly selectable in the config, but * default if no time-* token is used) uses the format's native timestamp * format. Note that not all formats have a timestamp data format. * * The native format and the rules below try to address the question: can a * parser that doesn't have any knowledge of fields' values' types losslessly * reconstruct the fields? * * For example, JSON only has strings and numbers, so it cannot represent a * timestamp in a "context-free lossless" way. Therefore, when making a * JSON blob, we need to decide which way to serialize timestamps. No * matter how we do it, we incur some loss. If a decoder sees 1557232304 in * a field, it cannot be certain if the field is an integer that just * happens to be a reasonable timestamp, or if it actually is a timestamp. * Same goes with RFC3339 - it could just be that the user supplied a string * that looks like a timestamp, and that string made it into an event field. * * Other common serialization formats, such as CBOR, have a lossless way of * encoding timestamps. * * Note that there are two concepts at play: native and default. * * The rules for how the format's timestamp formats are used: * * 1. The default time format is the native format. * 2. The native time format may or may not exist for a given format (e.g., * in JSON) * 3. If the native format doesn't exist and no time format was specified in * the config, it is a config error. * * We went with these rules because: * * 1. It prevents type information loss by default. * 2. It completely isolates the policy from the algorithm. * 3. It defers the decision whether each format without a native timestamp * type should have a default acting as native until after we've had some * operational experience. * 4. A future decision to add a default (via 3. point) will be 100% compatible. */ enum event_exporter_time_fmt { EVENT_EXPORTER_TIME_FMT_NATIVE = 0, EVENT_EXPORTER_TIME_FMT_UNIX, EVENT_EXPORTER_TIME_FMT_RFC3339, }; /* */ struct stats_exporter_settings { const char *name; const char *transport; const char *transport_args; unsigned int transport_timeout; const char *format; const char *format_args; /* parsed values */ enum event_exporter_time_fmt parsed_time_format; }; /* */ enum stats_metric_group_by_func { STATS_METRIC_GROUPBY_DISCRETE = 0, STATS_METRIC_GROUPBY_QUANTIZED, }; /* * A range covering a stats bucket. The the interval is half closed - the * minimum is excluded and the maximum is included. In other words: (min, max]. * Because we don't have a +Inf and -Inf, we use INTMAX_MIN and INTMAX_MAX * respectively. */ struct stats_metric_settings_bucket_range { intmax_t min; intmax_t max; }; struct stats_metric_settings_group_by { const char *field; enum stats_metric_group_by_func func; unsigned int num_ranges; struct stats_metric_settings_bucket_range *ranges; }; /* */ struct stats_metric_settings { const char *metric_name; const char *description; const char *fields; const char *group_by; const char *filter; ARRAY(struct stats_metric_settings_group_by) parsed_group_by; struct event_filter *parsed_filter; /* exporter related fields */ const char *exporter; const char *exporter_include; }; struct stats_settings { const char *stats_http_rawlog_dir; ARRAY(struct stats_exporter_settings *) exporters; ARRAY(struct stats_metric_settings *) metrics; }; extern const struct setting_parser_info stats_setting_parser_info; extern const struct setting_parser_info stats_metric_setting_parser_info; #endif