@Override public void run() { for (RequestRate requestRate : requestRates) { double rate = convertRate(requestRate.sumThenReset()); report(createMeasurement(service, requestRate.statementType, requestRate.consistencyLevel, rate)); } } }
private Set<RequestRate> initRequestRates(RequestRateConfiguration config) { final Set<RequestRate> requestRates = new HashSet<>(); for (String requestToReport : config.requestsToReport()) { requestRates.add(new RequestRate(requestToReport)); } return requestRates; }
/** * Constructor. * * @param configuration Module configuration * @param reporters Reporter list * @param globalConfiguration Global diagnostics configuration * @throws ConfigurationException in case the provided module configuration is not valid */ public RequestRateModule(ModuleConfiguration configuration, List<Reporter> reporters, final GlobalConfiguration globalConfiguration) throws ConfigurationException { super(configuration, reporters, globalConfiguration); RequestRateConfiguration config = RequestRateConfiguration.create(configuration.options); service = configuration.getMeasurementOrDefault(DEFAULT_MEASUREMENT_NAME); period = config.period(); timeunit = config.timeunit(); rateFactor = timeunit.toSeconds(period); requestRates = initRequestRates(config); logger.info("RequestRate module initialized with {} {} reporting period and requests to report: {}.", period, timeunit.name(), config.requestsToReport()); timer = new Timer(REQUEST_RATE_THREAD_NAME); timer.schedule(new RequestRateTask(), 0, config.reportingRateInMillis()); }
@Override public void process(Query query) { final String statementType = query.statementType().name(); final String consistencyLevel = query.consistencyLevel().name(); for (RequestRate requestRate : requestRates) { if (statementMatches(statementType, requestRate) && consistencyLevelMatches(consistencyLevel, requestRate)) { requestRate.increment(); } } }
/** * Create typed configuration for request rate module out of generic module configuration. * * @param options Module configuration options. * @return types request rate module configuration from a generic one * @throws ConfigurationException in case the provided options are not valid */ public static RequestRateConfiguration create(Map<String, Object> options) throws ConfigurationException { RequestRateConfiguration conf = new RequestRateConfiguration(); Yaml yaml = new Yaml(); String str = yaml.dumpAsMap(options); try { conf.values = yaml.loadAs(str, RequestRateConfiguration.Values.class); } catch (Exception e) { throw new ConfigurationException("Unable to load configuration.", e); } validateRequestsToReport(conf); return conf; }
private static void validateRequestsToReport(RequestRateConfiguration conf) throws ConfigurationException { for (String requestToReport : conf.requestsToReport()) { String[] requestMeta = requestToReport.split(REQUEST_META_DELIMITER); if (requestMeta.length != 2) { throw new ConfigurationException( "Only two configuration parameters supported, statement type and consistency level."); } String statementType = requestMeta[0]; String consistencyLevel = requestMeta[1]; try { if (!statementType.equals(ALL_STATEMENT_TYPES)) { Query.StatementType.valueOf(statementType); } } catch (IllegalArgumentException ex) { throw new ConfigurationException("Illegal statement type configured: " + statementType); } try { if (!consistencyLevel.equals(ALL_CONSISTENCY_LEVELS)) { Query.ConsistencyLevel.valueOf(consistencyLevel); } } catch (IllegalArgumentException ex) { throw new ConfigurationException("Illegal consistency level configured: " + consistencyLevel); } } }