Java tutorial
/* * Copyright 2013 Rackspace * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.rackspacecloud.blueflood.tools.ops; import com.rackspacecloud.blueflood.io.AstyanaxReader; import com.rackspacecloud.blueflood.outputs.formats.MetricData; import com.rackspacecloud.blueflood.rollup.Granularity; import com.rackspacecloud.blueflood.types.Locator; import com.rackspacecloud.blueflood.types.Points; import com.rackspacecloud.blueflood.types.Range; import com.rackspacecloud.blueflood.utils.TimeValue; import org.apache.commons.cli.*; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; /** * Usage: * * $JAVA -cp $CLASSPATH GetPoints -tenantId ${tenantId} -metric ${metName} -from ${startTime} \ * -to ${endTime} -resolution ${res} * * tenantId - Tenant ID * metric - Name of the metric * from - Start time for the range for which you want metrics (specified as milli-seconds since epoch) * to - End time for the range for which you want metrics (specified as milli-seconds since epoch) * resolution - Resolution of data at which you want the points (one of full, 5m, 20m, 60m, 240m, 1440m) */ public class GetPoints { private static final TimeValue DEFAULT_RANGE = new TimeValue(7, TimeUnit.DAYS); private static final Options cliOptions = new Options(); private static final GnuParser parser = new GnuParser(); private static final HelpFormatter helpFormatter = new HelpFormatter(); private static final String TENANT_ID = "tenantId"; private static final String METRIC = "metric"; private static final String FROM = "from"; private static final String TO = "to"; private static final String RES = "resolution"; static { cliOptions .addOption(OptionBuilder.isRequired().hasArg(true).withDescription("Tenant ID").create(TENANT_ID)); cliOptions.addOption(OptionBuilder.isRequired().hasArg(true).withDescription("Metric name").create(METRIC)); cliOptions.addOption(OptionBuilder.isRequired(false).hasArg(true) .withDescription("Start timestamp (millis since epoch)").create(FROM)); cliOptions.addOption(OptionBuilder.isRequired(false).hasArg(true) .withDescription("End timestamp (millis since epoch)").create(TO)); cliOptions.addOption(OptionBuilder.isRequired(false).hasArg(true) .withDescription("Resolution to use: one of 'full, '5m', '30m', '60m', '240m', '1440m'") .create(RES)); } public static void main(String args[]) { Map<String, Object> options = parseOptions(args); Locator locator = Locator.createLocatorFromPathComponents((String) options.get(TENANT_ID), (String) options.get(METRIC)); AstyanaxReader reader = AstyanaxReader.getInstance(); Long from = (Long) options.get(FROM); Long to = (Long) options.get(TO); if (from == null || to == null) { System.out.println("Either start time or end time is null."); to = System.currentTimeMillis(); from = to - DEFAULT_RANGE.toMillis(); System.out.println("Using range: " + from + " - " + to); } if (from >= to) { System.err.println("End time " + to + " has to be greater than start time " + from); System.exit(2); } Granularity gran = Granularity.FULL; String res = (String) options.get("resolution"); try { gran = Granularity.fromString(res.toLowerCase()); } catch (Exception ex) { System.out.println("Exception mapping resolution to Granularity. Using FULL resolution instead."); gran = Granularity.FULL; } finally { if (gran == null) { gran = Granularity.FULL; } } System.out.println( "Locator: " + locator + ", from: " + from + ", to: " + to + ", resolution: " + gran.shortName()); MetricData data = reader.getDatapointsForRange(locator, new Range(from, to), gran); Map<Long, Points.Point> points = data.getData().getPoints(); for (Map.Entry<Long, Points.Point> item : points.entrySet()) { String output = String.format("Timestamp: %d, Data: %s, Unit: %s", item.getKey(), item.getValue().getData().toString(), data.getUnit()); System.out.println(output); } } private static Map<String, Object> parseOptions(String[] args) { CommandLine line; final Map<String, Object> options = new HashMap<String, Object>(); long now = System.currentTimeMillis(); options.put(TO, now); options.put(FROM, now - DEFAULT_RANGE.toMillis()); options.put(RES, "full"); try { line = parser.parse(cliOptions, args); if (line.hasOption(TENANT_ID)) { options.put(TENANT_ID, line.getOptionValue(TENANT_ID)); } if (line.hasOption(METRIC)) { options.put(METRIC, line.getOptionValue(METRIC)); } if (line.hasOption(FROM)) { options.put(FROM, new Long(line.getOptionValue(FROM))); } if (line.hasOption(TO)) { options.put(TO, new Long(line.getOptionValue(TO))); } if (line.hasOption(RES)) { options.put(RES, line.getOptionValue(RES).toLowerCase()); } } catch (ParseException ex) { System.err.println("Parse exception " + ex.getMessage()); helpFormatter.printHelp("GetPoints", cliOptions); System.exit(2); } return options; } }