add method that returns a string representation of the tags in Tags
This commit is contained in:
@@ -225,4 +225,22 @@ public class Tags {
|
|||||||
return new Tags(filename);
|
return new Tags(filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String asString() {
|
||||||
|
|
||||||
|
final StringBuilder result = new StringBuilder();
|
||||||
|
final SortedSet<Tag> tags = toTags();
|
||||||
|
|
||||||
|
for (final Tag tag : tags) {
|
||||||
|
if (result.length() > 0) {
|
||||||
|
result.append(", ");
|
||||||
|
}
|
||||||
|
|
||||||
|
result.append(tag.getKey());
|
||||||
|
result.append(":");
|
||||||
|
result.append(tag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,11 +33,10 @@ import org.slf4j.Logger;
|
|||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
public class ScatterPlot implements ConcretePlotter {
|
public class ScatterPlot implements ConcretePlotter {
|
||||||
|
|
||||||
private static final Logger LOGGER = LoggerFactory.getLogger(ScatterPlot.class);
|
private static final Logger LOGGER = LoggerFactory.getLogger(ScatterPlot.class);
|
||||||
private static final Logger METRICS_LOGGER = LoggerFactory.getLogger("org.lucares.metrics.plotter.scatter");
|
private static final Logger METRICS_LOGGER = LoggerFactory.getLogger("org.lucares.metrics.plotter.scatter");
|
||||||
|
|
||||||
|
|
||||||
private final PerformanceDb db;
|
private final PerformanceDb db;
|
||||||
private final Path tmpBaseDir;
|
private final Path tmpBaseDir;
|
||||||
private final Path outputDir;
|
private final Path outputDir;
|
||||||
@@ -58,12 +57,11 @@ public class ScatterPlot implements ConcretePlotter {
|
|||||||
public Path getOutputDir() {
|
public Path getOutputDir() {
|
||||||
return outputDir;
|
return outputDir;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PlotResult plot(final PlotSettings plotSettings) throws InternalPlottingException {
|
public PlotResult plot(final PlotSettings plotSettings) throws InternalPlottingException {
|
||||||
|
|
||||||
LOGGER.trace("start plot: {}", plotSettings);
|
LOGGER.trace("start plot: {}", plotSettings);
|
||||||
|
|
||||||
|
|
||||||
final String tmpSubDir = ConcretePlotter.uniqueDirectoryName();
|
final String tmpSubDir = ConcretePlotter.uniqueDirectoryName();
|
||||||
final Path tmpDir = tmpBaseDir.resolve(tmpSubDir);
|
final Path tmpDir = tmpBaseDir.resolve(tmpSubDir);
|
||||||
@@ -83,28 +81,28 @@ public class ScatterPlot implements ConcretePlotter {
|
|||||||
final long start = System.nanoTime();
|
final long start = System.nanoTime();
|
||||||
final AtomicInteger idCounter = new AtomicInteger(0);
|
final AtomicInteger idCounter = new AtomicInteger(0);
|
||||||
result.getGroups().stream().parallel().forEach(groupResult -> {
|
result.getGroups().stream().parallel().forEach(groupResult -> {
|
||||||
try{
|
try {
|
||||||
final CsvSummary csvSummary = toCsv(groupResult, tmpDir, dateFrom, dateTo, plotSettings);
|
final CsvSummary csvSummary = toCsv(groupResult, tmpDir, dateFrom, dateTo, plotSettings);
|
||||||
|
|
||||||
final int id = idCounter.incrementAndGet();
|
final int id = idCounter.incrementAndGet();
|
||||||
final String title = ConcretePlotter.title(groupResult.getGroupedBy(), csvSummary.getValues());
|
final String title = ConcretePlotter.title(groupResult.getGroupedBy(), csvSummary.getValues());
|
||||||
final DataSeries dataSerie = new FileBackedDataSeries(id, title, csvSummary, GnuplotLineType.Points);
|
final DataSeries dataSerie = new FileBackedDataSeries(id, title, csvSummary,
|
||||||
|
GnuplotLineType.Points);
|
||||||
if (dataSerie.getValues() > 0) {
|
if (dataSerie.getValues() > 0) {
|
||||||
dataSeries.add(dataSerie);
|
dataSeries.add(dataSerie);
|
||||||
}
|
}
|
||||||
}catch (Exception e){
|
} catch (final Exception e) {
|
||||||
throw new IllegalStateException( e); // TODO handle
|
throw new IllegalStateException(e); // TODO handle
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
METRICS_LOGGER.debug("csv generation took: " + (System.nanoTime() - start) / 1_000_000.0
|
METRICS_LOGGER.debug("csv generation took: " + (System.nanoTime() - start) / 1_000_000.0 + "ms");
|
||||||
+ "ms");
|
|
||||||
|
|
||||||
if (dataSeries.isEmpty()) {
|
if (dataSeries.isEmpty()) {
|
||||||
throw new NoDataPointsException();
|
throw new NoDataPointsException();
|
||||||
}
|
}
|
||||||
|
|
||||||
final Limit limitBy = plotSettings.getLimitBy();
|
final Limit limitBy = plotSettings.getLimitBy();
|
||||||
int limit = plotSettings.getLimit();
|
final int limit = plotSettings.getLimit();
|
||||||
DataSeries.sortAndLimit(dataSeries, limitBy, limit);
|
DataSeries.sortAndLimit(dataSeries, limitBy, limit);
|
||||||
DataSeries.setColors(dataSeries);
|
DataSeries.setColors(dataSeries);
|
||||||
|
|
||||||
@@ -131,7 +129,7 @@ public class ScatterPlot implements ConcretePlotter {
|
|||||||
LOGGER.trace("done plot");
|
LOGGER.trace("done plot");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void defineXAxis(final GnuplotSettings gnuplotSettings, final OffsetDateTime minDate,
|
private void defineXAxis(final GnuplotSettings gnuplotSettings, final OffsetDateTime minDate,
|
||||||
final OffsetDateTime maxDate) {
|
final OffsetDateTime maxDate) {
|
||||||
|
|
||||||
@@ -158,12 +156,8 @@ public class ScatterPlot implements ConcretePlotter {
|
|||||||
gnuplotSettings.getxAxisSettings().setTo(formattedMaxDate);
|
gnuplotSettings.getxAxisSettings().setTo(formattedMaxDate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private static CsvSummary toCsv(final GroupResult groupResult, final Path tmpDir, final OffsetDateTime dateFrom,
|
private static CsvSummary toCsv(final GroupResult groupResult, final Path tmpDir, final OffsetDateTime dateFrom,
|
||||||
final OffsetDateTime dateTo, PlotSettings plotSettings) throws IOException {
|
final OffsetDateTime dateTo, final PlotSettings plotSettings) throws IOException {
|
||||||
|
|
||||||
final File dataFile = File.createTempFile("data", ".dat", tmpDir.toFile());
|
final File dataFile = File.createTempFile("data", ".dat", tmpDir.toFile());
|
||||||
final long start = System.nanoTime();
|
final long start = System.nanoTime();
|
||||||
@@ -173,51 +167,54 @@ public class ScatterPlot implements ConcretePlotter {
|
|||||||
final long toEpochMilli = dateTo.toInstant().toEpochMilli();
|
final long toEpochMilli = dateTo.toInstant().toEpochMilli();
|
||||||
final boolean useMillis = (toEpochMilli - fromEpochMilli) < TimeUnit.MINUTES.toMillis(5);
|
final boolean useMillis = (toEpochMilli - fromEpochMilli) < TimeUnit.MINUTES.toMillis(5);
|
||||||
final CustomAggregator aggregator = plotSettings.getAggregate().createCustomAggregator(tmpDir);
|
final CustomAggregator aggregator = plotSettings.getAggregate().createCustomAggregator(tmpDir);
|
||||||
|
|
||||||
long maxValue = 0;
|
long maxValue = 0;
|
||||||
long ignoredValues = 0;
|
long ignoredValues = 0;
|
||||||
final int separator = ',';
|
final int separator = ',';
|
||||||
final int newline = '\n';
|
final int newline = '\n';
|
||||||
final StringBuilder formattedDateBuilder = new StringBuilder();
|
final StringBuilder formattedDateBuilder = new StringBuilder();
|
||||||
try (final Writer output = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dataFile), StandardCharsets.US_ASCII));
|
try (final Writer output = new BufferedWriter(
|
||||||
|
new OutputStreamWriter(new FileOutputStream(dataFile), StandardCharsets.US_ASCII));
|
||||||
final Formatter formatter = new Formatter(formattedDateBuilder);) {
|
final Formatter formatter = new Formatter(formattedDateBuilder);) {
|
||||||
|
|
||||||
final Iterator<Entry> it = entries.iterator();
|
final Iterator<Entry> it = entries.iterator();
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
final Entry entry = it.next();
|
final Entry entry = it.next();
|
||||||
|
|
||||||
long epochMilli = entry.getEpochMilli();
|
final long epochMilli = entry.getEpochMilli();
|
||||||
if (fromEpochMilli <= epochMilli && epochMilli <= toEpochMilli) {
|
if (fromEpochMilli <= epochMilli && epochMilli <= toEpochMilli) {
|
||||||
|
|
||||||
long value = entry.getValue();
|
final long value = entry.getValue();
|
||||||
final String stringValue = LongUtils.longToString(value);
|
final String stringValue = LongUtils.longToString(value);
|
||||||
final String formattedDate;
|
final String formattedDate;
|
||||||
|
|
||||||
if (useMillis){
|
if (useMillis) {
|
||||||
formattedDateBuilder.delete(0, formattedDateBuilder.length());
|
formattedDateBuilder.delete(0, formattedDateBuilder.length());
|
||||||
formatter.format("%.3f", epochMilli / 1000.0);
|
formatter.format("%.3f", epochMilli / 1000.0);
|
||||||
formattedDate = formattedDateBuilder.toString();
|
formattedDate = formattedDateBuilder.toString();
|
||||||
}else {
|
} else {
|
||||||
formattedDate = String.valueOf(epochMilli / 1000);
|
formattedDate = String.valueOf(epochMilli / 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
output.write(formattedDate);
|
output.write(formattedDate);
|
||||||
output.write(separator);
|
output.write(separator);
|
||||||
output.write(stringValue);
|
output.write(stringValue);
|
||||||
output.write(newline);
|
output.write(newline);
|
||||||
|
|
||||||
aggregator.addValue(epochMilli, value);
|
aggregator.addValue(epochMilli, value);
|
||||||
|
|
||||||
count++;
|
count++;
|
||||||
maxValue = Math.max(maxValue, value);
|
maxValue = Math.max(maxValue, value);
|
||||||
}else {
|
} else {
|
||||||
ignoredValues++;
|
ignoredValues++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
METRICS_LOGGER.debug("wrote {} values to csv in: {}ms (ignored {} values) use millis: {}, grouping={}, file={}", count, (System.nanoTime() - start) / 1_000_000.0, ignoredValues, Boolean.toString(useMillis), groupResult.getGroupedBy(),dataFile);
|
METRICS_LOGGER.debug("wrote {} values to csv in: {}ms (ignored {} values) use millis: {}, grouping={}, file={}",
|
||||||
return new CsvSummary(dataFile, count, maxValue, aggregator.getAggregatedData());
|
count, (System.nanoTime() - start) / 1_000_000.0, ignoredValues, Boolean.toString(useMillis),
|
||||||
|
groupResult.getGroupedBy().asString(), dataFile);
|
||||||
|
return new CsvSummary(dataFile, count, maxValue, aggregator.getAggregatedData());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user