Search in sources :

Example 6 with MetricStat

use of com.amazonaws.services.cloudwatch.model.MetricStat in project aws-athena-query-federation by awslabs.

the class MetricUtilsTest method makeGetMetricDataRequest.

@Test
public void makeGetMetricDataRequest() {
    String schema = "schema";
    String table = "table";
    Integer period = 60;
    String statistic = "p90";
    String metricName = "metricName";
    String namespace = "namespace";
    List<Dimension> dimensions = new ArrayList<>();
    dimensions.add(new Dimension().withName("dim_name1").withValue("dim_value1"));
    dimensions.add(new Dimension().withName("dim_name2").withValue("dim_value2"));
    List<MetricStat> metricStats = new ArrayList<>();
    metricStats.add(new MetricStat().withMetric(new Metric().withNamespace(namespace).withMetricName(metricName).withDimensions(dimensions)).withPeriod(60).withStat(statistic));
    Split split = Split.newBuilder(null, null).add(NAMESPACE_FIELD, namespace).add(METRIC_NAME_FIELD, metricName).add(PERIOD_FIELD, String.valueOf(period)).add(STATISTIC_FIELD, statistic).add(SERIALIZED_METRIC_STATS_FIELD_NAME, MetricStatSerDe.serialize(metricStats)).build();
    Schema schemaForRead = SchemaBuilder.newBuilder().addStringField(METRIC_NAME_FIELD).build();
    Map<String, ValueSet> constraintsMap = new HashMap<>();
    constraintsMap.put(TIMESTAMP_FIELD, SortedRangeSet.copyOf(Types.MinorType.BIGINT.getType(), ImmutableList.of(Range.greaterThan(allocator, Types.MinorType.BIGINT.getType(), 1L)), false));
    ReadRecordsRequest request = new ReadRecordsRequest(identity, catalog, "queryId-" + System.currentTimeMillis(), new TableName(schema, table), schemaForRead, split, new Constraints(constraintsMap), // 100GB don't expect this to spill
    100_000_000_000L, 100_000_000_000L);
    GetMetricDataRequest actual = MetricUtils.makeGetMetricDataRequest(request);
    assertEquals(1, actual.getMetricDataQueries().size());
    assertNotNull(actual.getMetricDataQueries().get(0).getId());
    MetricStat metricStat = actual.getMetricDataQueries().get(0).getMetricStat();
    assertNotNull(metricStat);
    assertEquals(metricName, metricStat.getMetric().getMetricName());
    assertEquals(namespace, metricStat.getMetric().getNamespace());
    assertEquals(statistic, metricStat.getStat());
    assertEquals(period, metricStat.getPeriod());
    assertEquals(2, metricStat.getMetric().getDimensions().size());
    assertEquals(1000L, actual.getStartTime().getTime());
    assertTrue(actual.getStartTime().getTime() <= System.currentTimeMillis() + 1_000);
}
Also used : HashMap(java.util.HashMap) Schema(org.apache.arrow.vector.types.pojo.Schema) ArrayList(java.util.ArrayList) MetricStat(com.amazonaws.services.cloudwatch.model.MetricStat) Dimension(com.amazonaws.services.cloudwatch.model.Dimension) TableName(com.amazonaws.athena.connector.lambda.domain.TableName) ReadRecordsRequest(com.amazonaws.athena.connector.lambda.records.ReadRecordsRequest) Constraints(com.amazonaws.athena.connector.lambda.domain.predicate.Constraints) GetMetricDataRequest(com.amazonaws.services.cloudwatch.model.GetMetricDataRequest) Metric(com.amazonaws.services.cloudwatch.model.Metric) Split(com.amazonaws.athena.connector.lambda.domain.Split) ValueSet(com.amazonaws.athena.connector.lambda.domain.predicate.ValueSet) Test(org.junit.Test)

Example 7 with MetricStat

use of com.amazonaws.services.cloudwatch.model.MetricStat in project aws-athena-query-federation by awslabs.

the class MetricUtils method makeGetMetricDataRequest.

/**
 * Creates a Cloudwatch Metrics sample data request from the provided inputs
 *
 * @param readRecordsRequest The RecordReadRequest to make into a Cloudwatch Metrics Data request.
 * @return The Cloudwatch Metrics Data request that matches the requested read operation.
 */
protected static GetMetricDataRequest makeGetMetricDataRequest(ReadRecordsRequest readRecordsRequest) {
    Split split = readRecordsRequest.getSplit();
    String serializedMetricStats = split.getProperty(MetricStatSerDe.SERIALIZED_METRIC_STATS_FIELD_NAME);
    List<MetricStat> metricStats = MetricStatSerDe.deserialize(serializedMetricStats);
    GetMetricDataRequest dataRequest = new GetMetricDataRequest();
    com.amazonaws.services.cloudwatch.model.Metric metric = new com.amazonaws.services.cloudwatch.model.Metric();
    metric.setNamespace(split.getProperty(NAMESPACE_FIELD));
    metric.setMetricName(split.getProperty(METRIC_NAME_FIELD));
    List<MetricDataQuery> metricDataQueries = new ArrayList<>();
    int metricId = 1;
    for (MetricStat nextMetricStat : metricStats) {
        metricDataQueries.add(new MetricDataQuery().withMetricStat(nextMetricStat).withId("m" + metricId++));
    }
    dataRequest.withMetricDataQueries(metricDataQueries);
    ValueSet timeConstraint = readRecordsRequest.getConstraints().getSummary().get(TIMESTAMP_FIELD);
    if (timeConstraint instanceof SortedRangeSet && !timeConstraint.isNullAllowed()) {
        // SortedRangeSet is how >, <, between is represented which are easiest and most common when
        // searching logs so we attempt to push that down here as an optimization. SQL can represent complex
        // overlapping ranges which Cloudwatch can not support so this is not a replacement for applying
        // constraints using the ConstraintEvaluator.
        Range basicPredicate = ((SortedRangeSet) timeConstraint).getSpan();
        if (!basicPredicate.getLow().isNullValue()) {
            Long lowerBound = (Long) basicPredicate.getLow().getValue();
            // TODO: confirm timezone handling
            logger.info("makeGetMetricsRequest: with startTime " + (lowerBound * 1000) + " " + new Date(lowerBound * 1000));
            dataRequest.withStartTime(new Date(lowerBound * 1000));
        } else {
            // TODO: confirm timezone handling
            dataRequest.withStartTime(new Date(0));
        }
        if (!basicPredicate.getHigh().isNullValue()) {
            Long upperBound = (Long) basicPredicate.getHigh().getValue();
            // TODO: confirm timezone handling
            logger.info("makeGetMetricsRequest: with endTime " + (upperBound * 1000) + " " + new Date(upperBound * 1000));
            dataRequest.withEndTime(new Date(upperBound * 1000));
        } else {
            // TODO: confirm timezone handling
            dataRequest.withEndTime(new Date(System.currentTimeMillis()));
        }
    } else {
        // TODO: confirm timezone handling
        dataRequest.withStartTime(new Date(0));
        dataRequest.withEndTime(new Date(System.currentTimeMillis()));
    }
    return dataRequest;
}
Also used : MetricStat(com.amazonaws.services.cloudwatch.model.MetricStat) ArrayList(java.util.ArrayList) Range(com.amazonaws.athena.connector.lambda.domain.predicate.Range) Date(java.util.Date) SortedRangeSet(com.amazonaws.athena.connector.lambda.domain.predicate.SortedRangeSet) GetMetricDataRequest(com.amazonaws.services.cloudwatch.model.GetMetricDataRequest) Metric(com.amazonaws.services.cloudwatch.model.Metric) Split(com.amazonaws.athena.connector.lambda.domain.Split) MetricDataQuery(com.amazonaws.services.cloudwatch.model.MetricDataQuery) ValueSet(com.amazonaws.athena.connector.lambda.domain.predicate.ValueSet) Metric(com.amazonaws.services.cloudwatch.model.Metric)

Aggregations

MetricStat (com.amazonaws.services.cloudwatch.model.MetricStat)7 ArrayList (java.util.ArrayList)6 GetMetricDataRequest (com.amazonaws.services.cloudwatch.model.GetMetricDataRequest)5 Metric (com.amazonaws.services.cloudwatch.model.Metric)5 Split (com.amazonaws.athena.connector.lambda.domain.Split)4 ValueSet (com.amazonaws.athena.connector.lambda.domain.predicate.ValueSet)4 Dimension (com.amazonaws.services.cloudwatch.model.Dimension)4 MetricDataQuery (com.amazonaws.services.cloudwatch.model.MetricDataQuery)3 Date (java.util.Date)3 HashMap (java.util.HashMap)3 Test (org.junit.Test)3 Constraints (com.amazonaws.athena.connector.lambda.domain.predicate.Constraints)2 ReadRecordsRequest (com.amazonaws.athena.connector.lambda.records.ReadRecordsRequest)2 GetMetricDataResult (com.amazonaws.services.cloudwatch.model.GetMetricDataResult)2 MetricDataResult (com.amazonaws.services.cloudwatch.model.MetricDataResult)2 Matchers.anyString (org.mockito.Matchers.anyString)2 Block (com.amazonaws.athena.connector.lambda.data.Block)1 TableName (com.amazonaws.athena.connector.lambda.domain.TableName)1 ConstraintEvaluator (com.amazonaws.athena.connector.lambda.domain.predicate.ConstraintEvaluator)1 Range (com.amazonaws.athena.connector.lambda.domain.predicate.Range)1