blob: d4b6f9cc34f4da7744a7be00d98e59a7ad9be03f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.skywalking.oap.query.graphql.resolver;
import graphql.kickstart.tools.GraphQLQueryResolver;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.oap.query.graphql.type.BatchMetricConditions;
import org.apache.skywalking.oap.server.core.query.input.Duration;
import org.apache.skywalking.oap.server.core.query.input.Entity;
import org.apache.skywalking.oap.server.core.query.input.MetricCondition;
import org.apache.skywalking.oap.server.core.query.input.MetricsCondition;
import org.apache.skywalking.oap.server.core.query.type.Bucket;
import org.apache.skywalking.oap.server.core.query.type.HeatMap;
import org.apache.skywalking.oap.server.core.query.type.IntValues;
import org.apache.skywalking.oap.server.core.query.type.KVInt;
import org.apache.skywalking.oap.server.core.query.type.MetricsValues;
import org.apache.skywalking.oap.server.core.query.type.Thermodynamic;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
/**
* @since 8.0.0 This query is replaced by {@link MetricsQuery}
*/
@Deprecated
@Slf4j
public class MetricQuery implements GraphQLQueryResolver {
private MetricsQuery query;
public MetricQuery(ModuleManager moduleManager) {
query = new MetricsQuery(moduleManager);
}
public IntValues getValues(final BatchMetricConditions metrics, final Duration duration) throws IOException {
IntValues values = new IntValues();
if (metrics.getIds().size() == 0) {
KVInt kv = new KVInt();
MetricsCondition condition = new MetricsCondition();
condition.setName(metrics.getName());
condition.setEntity(new MockEntity(null));
kv.setValue(query.readMetricsValue(condition, duration));
values.addKVInt(kv);
} else {
List<KVInt> ints = metrics.getIds().parallelStream().map(id -> {
MetricsCondition condition = new MetricsCondition();
condition.setName(metrics.getName());
condition.setEntity(new MockEntity(id));
try {
KVInt kv = new KVInt();
kv.setId(id);
kv.setValue(query.readMetricsValue(condition, duration));
return kv;
} catch (IOException e) {
throw new RuntimeException(e);
}
}).collect(Collectors.toList());
ints.forEach(v -> values.addKVInt(v));
}
return values;
}
public IntValues getLinearIntValues(final MetricCondition metrics,
final Duration duration) throws IOException {
MetricsCondition condition = new MetricsCondition();
condition.setName(metrics.getName());
condition.setEntity(new MockEntity(metrics.getId()));
final MetricsValues metricsValues = query.readMetricsValues(condition, duration);
return metricsValues.getValues();
}
public List<IntValues> getMultipleLinearIntValues(final MetricCondition metrics, final int numOfLinear,
final Duration duration) throws IOException {
MetricsCondition condition = new MetricsCondition();
condition.setName(metrics.getName());
condition.setEntity(new MockEntity(metrics.getId()));
List<String> labels = new ArrayList<>(numOfLinear);
for (int i = 0; i < numOfLinear; i++) {
labels.add(String.valueOf(i));
}
final List<MetricsValues> metricsValues = query.readLabeledMetricsValues(condition, labels, duration);
List<IntValues> response = new ArrayList<>(metricsValues.size());
labels.forEach(l -> metricsValues.stream()
.filter(m -> m.getLabel().equals(l))
.findAny()
.ifPresent(values -> response.add(values.getValues())));
return response;
}
public List<IntValues> getSubsetOfMultipleLinearIntValues(final MetricCondition metrics,
final List<Integer> linearIndex,
final Duration duration) throws IOException {
MetricsCondition condition = new MetricsCondition();
condition.setName(metrics.getName());
condition.setEntity(new MockEntity(metrics.getId()));
List<String> labels = new ArrayList<>(linearIndex.size());
linearIndex.forEach(i -> labels.add(String.valueOf(i)));
final List<MetricsValues> metricsValues = query.readLabeledMetricsValues(condition, labels, duration);
List<IntValues> response = new ArrayList<>(metricsValues.size());
labels.forEach(l -> metricsValues.stream()
.filter(m -> m.getLabel().equals(l))
.findAny()
.ifPresent(values -> response.add(values.getValues())));
return response;
}
public Thermodynamic getThermodynamic(final MetricCondition metrics,
final Duration duration) throws IOException {
MetricsCondition condition = new MetricsCondition();
condition.setName(metrics.getName());
condition.setEntity(new MockEntity(metrics.getId()));
final HeatMap heatMap = query.readHeatMap(condition, duration);
Thermodynamic thermodynamic = new Thermodynamic();
final List<Bucket> buckets = heatMap.getBuckets();
if (buckets.size() > 1) {
// Use the first bucket size as the axis Y step, because in the previous(before 8.x),
// We only use equilong bucket.
// Use 1 to avoid `infinite-` as bucket#min
thermodynamic.setAxisYStep(buckets.get(1).duration());
} else {
// Used to be a static config.
thermodynamic.setAxisYStep(200);
}
for (int x = 0; x < heatMap.getValues().size(); x++) {
final HeatMap.HeatMapColumn heatMapColumn = heatMap.getValues().get(x);
for (int y = 0; y < heatMapColumn.getValues().size(); y++) {
thermodynamic.addNodeValue(x, y, heatMapColumn.getValues().get(y));
}
}
return thermodynamic;
}
@RequiredArgsConstructor
private static class MockEntity extends Entity {
private final String id;
@Override
public boolean isValid() {
return true;
}
@Override
public String buildId() {
return id;
}
}
}