3-ftransform-forecasting #5
@ -10,6 +10,7 @@ import ru.ulstu.datamodel.ts.TimeSeries;
|
|||||||
import ru.ulstu.db.DbService;
|
import ru.ulstu.db.DbService;
|
||||||
import ru.ulstu.db.model.TimeSeriesSet;
|
import ru.ulstu.db.model.TimeSeriesSet;
|
||||||
import ru.ulstu.estimate.CompressionMetricService;
|
import ru.ulstu.estimate.CompressionMetricService;
|
||||||
|
import ru.ulstu.service.PrometheusService;
|
||||||
import ru.ulstu.service.UtilService;
|
import ru.ulstu.service.UtilService;
|
||||||
import ru.ulstu.target.AnomalyDifferenceSmoothed;
|
import ru.ulstu.target.AnomalyDifferenceSmoothed;
|
||||||
import ru.ulstu.target.Target;
|
import ru.ulstu.target.Target;
|
||||||
@ -24,21 +25,39 @@ public class CompressionMetricController {
|
|||||||
|
|
||||||
private final UtilService utilService;
|
private final UtilService utilService;
|
||||||
private final DbService dbService;
|
private final DbService dbService;
|
||||||
|
private final PrometheusService prometheusService;
|
||||||
private final CompressionMetricService compressionMetricService;
|
private final CompressionMetricService compressionMetricService;
|
||||||
private final Target target;
|
private final Target target;
|
||||||
|
|
||||||
public CompressionMetricController(UtilService utilService, DbService dbService, CompressionMetricService compressionMetricService, AnomalyDifferenceSmoothed anomalyDifferenceSmoothed) {
|
public CompressionMetricController(UtilService utilService, DbService dbService, PrometheusService prometheusService, CompressionMetricService compressionMetricService, AnomalyDifferenceSmoothed anomalyDifferenceSmoothed) {
|
||||||
this.utilService = utilService;
|
this.utilService = utilService;
|
||||||
this.dbService = dbService;
|
this.dbService = dbService;
|
||||||
|
this.prometheusService = prometheusService;
|
||||||
this.compressionMetricService = compressionMetricService;
|
this.compressionMetricService = compressionMetricService;
|
||||||
this.target = anomalyDifferenceSmoothed;
|
this.target = anomalyDifferenceSmoothed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("getMetricOfTimeSeries")
|
@GetMapping("getMetricAtAnomaly")
|
||||||
@Operation(description = "Получить метрику сжатия")
|
@Operation(description = "Получить метрику сжатия")
|
||||||
public ResponseEntity<TimeSeries> getRandomTimeSeries(@RequestParam("setKey") String setKey, @RequestParam("timeSeriesKey") String timeSeriesKey) throws ModelingException, ExecutionException, InterruptedException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException, IOException {
|
public ResponseEntity<TimeSeries> getMetricAtAnomaly(@RequestParam("setKey") String setKey, @RequestParam("timeSeriesKey") String timeSeriesKey) throws ModelingException, ExecutionException, InterruptedException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException, IOException {
|
||||||
var timeSeries = dbService.getTimeSeries(new TimeSeriesSet(setKey), timeSeriesKey);
|
var timeSeries = dbService.getTimeSeries(new TimeSeriesSet(setKey), timeSeriesKey);
|
||||||
var timeSeriesResult = compressionMetricService.getCompressionTimeSeries(timeSeries);
|
var timeSeriesResult = compressionMetricService.getCompressionTimeSeries(timeSeries);
|
||||||
return new ResponseEntity<>(timeSeriesResult, HttpStatus.OK);
|
return new ResponseEntity<>(timeSeriesResult, HttpStatus.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("getMetricAtAnomalyOfRandom")
|
||||||
|
@Operation(description = "Получить метрику сжатия")
|
||||||
|
public ResponseEntity<TimeSeries> getMetricAtAnomalyOfRandom(@RequestParam("lenght") int len) throws ModelingException, ExecutionException, InterruptedException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
|
||||||
|
var timeSeries = utilService.getRandomTimeSeries(len);
|
||||||
|
var timeSeriesResult = compressionMetricService.getCompressionTimeSeries(timeSeries);
|
||||||
|
return new ResponseEntity<>(timeSeriesResult, HttpStatus.OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("getMetricAtAnomalyOfPrometheus")
|
||||||
|
@Operation(description = "Получить метрику сжатия")
|
||||||
|
public ResponseEntity<TimeSeries> getMetricAtAnomalyOfPrometheus(@RequestParam("query") String query) throws ModelingException, ExecutionException, InterruptedException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
|
||||||
|
var timeSeries = prometheusService.executionQueryRange(query);
|
||||||
|
var timeSeriesResult = compressionMetricService.getCompressionTimeSeries(timeSeries);
|
||||||
|
return new ResponseEntity<>(timeSeriesResult, HttpStatus.OK);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,8 @@ import ru.ulstu.method.ftransform.FTransform;
|
|||||||
import ru.ulstu.score.ScoreMethod;
|
import ru.ulstu.score.ScoreMethod;
|
||||||
import ru.ulstu.service.MethodParamBruteForce;
|
import ru.ulstu.service.MethodParamBruteForce;
|
||||||
import ru.ulstu.service.TimeSeriesService;
|
import ru.ulstu.service.TimeSeriesService;
|
||||||
|
import ru.ulstu.service.UtilService;
|
||||||
|
import ru.ulstu.target.AnomalyDifferenceSmoothed;
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
@ -22,31 +24,40 @@ import java.util.stream.Collectors;
|
|||||||
@Service
|
@Service
|
||||||
public class CompressionMetricService {
|
public class CompressionMetricService {
|
||||||
|
|
||||||
private final int DEFAULT_THREAD_COUNT = 50;
|
private final int DEFAULT_THREAD_COUNT = 10;
|
||||||
private final TimeSeriesService timeSeriesService;
|
private final TimeSeriesService timeSeriesService;
|
||||||
private final FTransform fTransform;
|
private final FTransform fTransform;
|
||||||
private final MethodParamBruteForce methodParamBruteForce;
|
private final MethodParamBruteForce methodParamBruteForce;
|
||||||
|
private final UtilService utilService;
|
||||||
private final ScoreMethod scoreMethod;
|
private final ScoreMethod scoreMethod;
|
||||||
|
|
||||||
|
private final AnomalyDifferenceSmoothed anomalyDifferenceSmoothed;
|
||||||
private final ExecutorService executors = Executors.newFixedThreadPool(DEFAULT_THREAD_COUNT);
|
private final ExecutorService executors = Executors.newFixedThreadPool(DEFAULT_THREAD_COUNT);
|
||||||
|
|
||||||
public CompressionMetricService(TimeSeriesService timeSeriesService, FTransform fTransform, MethodParamBruteForce methodParamBruteForce, ScoreMethod scoreMethod) {
|
public CompressionMetricService(TimeSeriesService timeSeriesService, FTransform fTransform, MethodParamBruteForce methodParamBruteForce, UtilService utilService, ScoreMethod scoreMethod, AnomalyDifferenceSmoothed anomalyDifferenceSmoothed) {
|
||||||
this.timeSeriesService = timeSeriesService;
|
this.timeSeriesService = timeSeriesService;
|
||||||
this.fTransform = fTransform;
|
this.fTransform = fTransform;
|
||||||
this.methodParamBruteForce = methodParamBruteForce;
|
this.methodParamBruteForce = methodParamBruteForce;
|
||||||
|
this.utilService = utilService;
|
||||||
this.scoreMethod = scoreMethod;
|
this.scoreMethod = scoreMethod;
|
||||||
}
|
this.anomalyDifferenceSmoothed = anomalyDifferenceSmoothed;
|
||||||
|
|
||||||
public void getCompressionMetric() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void getCompressionMetricForAnomaly() {
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public TimeSeries getCompressionTimeSeries(TimeSeries ts) throws ModelingException, ExecutionException, InterruptedException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
|
public TimeSeries getCompressionTimeSeries(TimeSeries ts) throws ModelingException, ExecutionException, InterruptedException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
|
||||||
ModelingResult modelingResult = timeSeriesService.smoothTimeSeries(ts, "FTransform");
|
//ModelingResult modelingResult = timeSeriesService.smoothTimeSeries(ts, "FTransform");
|
||||||
|
ModelingResult modelingResult = getCompressionTimeSeriesWithFTransform(ts);
|
||||||
//var ts1 = fTransform.getForecast(ts, )
|
//var ts1 = fTransform.getForecast(ts, )
|
||||||
|
var timeSeriesAnomalyResult = anomalyDifferenceSmoothed.calculate(modelingResult.getTimeSeries());
|
||||||
|
var timeSeriesAnomaly = anomalyDifferenceSmoothed.calculate(ts);
|
||||||
|
System.out.println(ts.getLength()+"\t"
|
||||||
|
+timeSeriesAnomaly.getLength()+"\t"
|
||||||
|
+Math.abs(timeSeriesAnomaly.getLength() - timeSeriesAnomalyResult.getLength())+"\t"
|
||||||
|
+(double)modelingResult.getTimeSeries().getLength()/ts.getLength()+"\t"
|
||||||
|
+modelingResult.getScore().getDoubleValue());
|
||||||
|
System.out.println(timeSeriesAnomaly);
|
||||||
|
System.out.println(timeSeriesAnomalyResult);
|
||||||
|
System.out.println(utilService.getTimeSeriesToString(ts));
|
||||||
|
System.out.println(utilService.getTimeSeriesToString(modelingResult.getTimeSeries()));
|
||||||
return modelingResult.getTimeSeries();
|
return modelingResult.getTimeSeries();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
11
src/main/java/ru/ulstu/http/HttpClientService.java
Normal file
11
src/main/java/ru/ulstu/http/HttpClientService.java
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
package ru.ulstu.http;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class HttpClientService {
|
||||||
|
|
||||||
|
public void get(){
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -13,11 +13,11 @@ import java.time.Duration;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class HttpService {
|
public class WebClientService {
|
||||||
private final Logger log = LoggerFactory.getLogger(HttpService.class);
|
private final Logger log = LoggerFactory.getLogger(WebClientService.class);
|
||||||
private final WebClient client;
|
private final WebClient client;
|
||||||
|
|
||||||
public HttpService(WebClient client) {
|
public WebClientService(WebClient client) {
|
||||||
this.client = client;
|
this.client = client;
|
||||||
}
|
}
|
||||||
|
|
@ -27,6 +27,6 @@ public class AnomalyCompressionScore extends ScoreMethod {
|
|||||||
var timeSeriesAnomalyResult = anomalyDifferenceSmoothed.calculate(model);
|
var timeSeriesAnomalyResult = anomalyDifferenceSmoothed.calculate(model);
|
||||||
var timeSeriesAnomaly = anomalyDifferenceSmoothed.calculate(tsValues);
|
var timeSeriesAnomaly = anomalyDifferenceSmoothed.calculate(tsValues);
|
||||||
// туду: добавить сравнение аномальных точек
|
// туду: добавить сравнение аномальных точек
|
||||||
return model.getLength()/tsValues.size() + Math.abs(timeSeriesAnomaly.getLength() - timeSeriesAnomalyResult.getLength());
|
return (double)model.getLength()/tsValues.size() + Math.abs(timeSeriesAnomaly.getLength() - timeSeriesAnomalyResult.getLength());
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -2,21 +2,34 @@ package ru.ulstu.service;
|
|||||||
|
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.util.UriComponentsBuilder;
|
||||||
import ru.ulstu.datamodel.ts.TimeSeries;
|
import ru.ulstu.datamodel.ts.TimeSeries;
|
||||||
import ru.ulstu.http.HttpService;
|
import ru.ulstu.datamodel.ts.TimeSeriesValue;
|
||||||
|
import ru.ulstu.http.WebClientService;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.ZoneId;
|
||||||
|
import java.time.temporal.ChronoUnit;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class PrometheusService {
|
public class PrometheusService {
|
||||||
|
|
||||||
private static final String PROMETHEUS_API_URL = "http://prometheus.athene.tech/api/v1/";
|
private static final String PROMETHEUS_API_URL = "http://prometheus.athene.tech/api/v1/";
|
||||||
private final HttpService httpService;
|
private final WebClientService httpService;
|
||||||
|
|
||||||
public PrometheusService(HttpService httpService) {
|
public PrometheusService(WebClientService httpService) {
|
||||||
this.httpService = httpService;
|
this.httpService = httpService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TimeSeries executionQuery(String query){ // example: pve_cpu_usage_ratio{id="lxc/111"}[5h]
|
public TimeSeries executionQuery(String query){ // example: pve_cpu_usage_ratio{id="lxc/111"}[5h]
|
||||||
var timeSeries = new TimeSeries();
|
var timeSeries = new TimeSeries();
|
||||||
|
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(PROMETHEUS_API_URL + "query")
|
||||||
|
.queryParam("query",
|
||||||
|
"pve_cpu_usage_ratio{id='lxc/111'}[1h]");
|
||||||
|
|
||||||
var response = httpService.get(PROMETHEUS_API_URL + "query?query=" + query);
|
var response = httpService.get(PROMETHEUS_API_URL + "query?query=" + query);
|
||||||
if (response.getJSONObject(0).getString("status").equals("success")){
|
if (response.getJSONObject(0).getString("status").equals("success")){
|
||||||
|
|
||||||
@ -36,12 +49,20 @@ public class PrometheusService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public TimeSeries executionQueryRange(String query){
|
public TimeSeries executionQueryRange(String query){
|
||||||
|
int numberTimeSeries = 14;
|
||||||
|
var nowDateTime = LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS);
|
||||||
var timeSeries = new TimeSeries();
|
var timeSeries = new TimeSeries();
|
||||||
var response = httpService.get(PROMETHEUS_API_URL + "query_range?query=" + query +
|
var response = httpService.get(PROMETHEUS_API_URL + "query_range?query=" + query +
|
||||||
"&start=2023-04-06T00:00:00.004Z&end=2023-04-07T00:00:00.004Z&step=15s");
|
"&start=" + nowDateTime.minusHours(10).minusMinutes(100).toString()+".004Z" +
|
||||||
if (response.getJSONObject(0).getString("status").equals("success")){
|
"&end=" + nowDateTime.minusHours(10).toString()+".004Z" +
|
||||||
var array = response.getJSONObject(0).getJSONObject("data").getJSONArray("result");
|
"&step=15s");
|
||||||
int a = 5;
|
var array = response.getJSONObject(0).getJSONObject("data").getJSONArray("result").getJSONObject(numberTimeSeries).getJSONArray("values").toList();
|
||||||
|
for (int i = 0; i < array.size(); i++) {
|
||||||
|
BigDecimal seconds = (BigDecimal)(((ArrayList) array.get(i)).get(0));
|
||||||
|
Double value = Double.parseDouble((String)(((ArrayList) array.get(i)).get(1)));
|
||||||
|
LocalDateTime dateTime =
|
||||||
|
LocalDateTime.ofInstant(Instant.ofEpochSecond(seconds.longValue()), ZoneId.systemDefault());
|
||||||
|
timeSeries.addValue(new TimeSeriesValue(dateTime, value));
|
||||||
}
|
}
|
||||||
return timeSeries;
|
return timeSeries;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user