/*
* Copyright (C) 2015 Jörg Prante
*
* 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 org.xbib.elasticsearch.common.metrics;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.xbib.elasticsearch.common.util.FormatUtil;
import java.text.NumberFormat;
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
public class MetricsLogger {
private final static Logger plainsourcelogger = LogManager.getLogger("metrics.source.plain");
private final static Logger plainsinklogger = LogManager.getLogger("metrics.sink.plain");
private final static Logger jsonsourcelogger = LogManager.getLogger("metrics.source.json");
private final static Logger jsonsinklogger = LogManager.getLogger("metrics.sink.json");
private final static NumberFormat formatter = NumberFormat.getNumberInstance();
public void writeMetrics(Settings settings, SinkMetric metric) throws Exception {
long submitted = metric.getSubmitted().getCount();
long succeeded = metric.getSucceeded().getCount();
long failed = metric.getFailed().getCount();
long elapsed = metric.elapsed() / 1000000;
long bytes = metric.getTotalIngestSizeInBytes().getCount();
double dps = submitted * 1000.0 / elapsed;
double avg = bytes / (submitted + 1); // avoid div by zero
double mbps = (bytes * 1024.0 / elapsed) / 1048576.0;
if (settings.getAsBoolean("metrics.logger.json", false)) {
XContentBuilder builder = jsonBuilder();
builder.startObject()
.field("elapsed", elapsed)
.field("submitted", submitted)
.field("succeeded", succeeded)
.field("failed", failed)
.field("bytes", bytes)
.field("avg", avg)
.field("dps", dps)
.field("mbps", mbps)
.endObject();
jsonsinklogger.info(builder.string());
}
if (settings.getAsBoolean("metrics.logger.plain", true)) {
plainsinklogger.info("{} = {} ms, submitted = {}, succeeded = {}, failed = {}, {} = {} bytes, {} = {} avg size, {} dps, {} MB/s",
FormatUtil.formatDurationWords(elapsed, true, true),
elapsed,
submitted,
succeeded,
failed,
bytes,
FormatUtil.convertFileSize(bytes),
FormatUtil.convertFileSize(avg),
formatter.format(avg),
formatter.format(dps),
formatter.format(mbps));
}
}
public void writeMetrics(Settings settings, SourceMetric metric) throws Exception {
long totalrows = metric.getTotalRows().count();
long elapsed = metric.elapsed() / 1000000;
long bytes = metric.getTotalSizeInBytes().count();
double dps = totalrows * 1000.0 / elapsed;
double avg = bytes / (totalrows + 1); // avoid div by zero
double mbps = (bytes * 1024.0 / elapsed) / 1048576.0;
if (settings.getAsBoolean("metrics.logger.json", false)) {
XContentBuilder builder = jsonBuilder();
builder.startObject()
.field("totalrows", totalrows)
.field("elapsed", elapsed)
.field("bytes", bytes)
.field("avg", avg)
.field("dps", dps)
.field("mbps", mbps)
.endObject();
jsonsourcelogger.info(builder.string());
}
if (settings.getAsBoolean("metrics.logger.plain", true)) {
plainsourcelogger.info("totalrows = {}, {} = {} ms, {} = {} bytes, {} = {} avg size, {} dps, {} MB/s",
totalrows,
FormatUtil.formatDurationWords(elapsed, true, true),
elapsed,
bytes,
FormatUtil.convertFileSize(bytes),
FormatUtil.convertFileSize(avg),
formatter.format(avg),
formatter.format(dps),
formatter.format(mbps));
}
}
}