org.elasticsearch.xpack.esql.stats.Metrics Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of x-pack-esql Show documentation
Show all versions of x-pack-esql Show documentation
The plugin that powers ESQL for Elasticsearch
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
package org.elasticsearch.xpack.esql.stats;
import org.elasticsearch.common.metrics.CounterMetric;
import org.elasticsearch.common.util.Maps;
import org.elasticsearch.xpack.core.watcher.common.stats.Counters;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
/**
* Class encapsulating the metrics collected for ESQL
*/
public class Metrics {
private enum OperationType {
FAILED,
TOTAL;
@Override
public String toString() {
return this.name().toLowerCase(Locale.ROOT);
}
}
// map that holds total/failed counters for each client type (rest, kibana)
private final Map> opsByTypeMetrics;
// map that holds one counter per esql query "feature" (eval, sort, limit, where....)
private final Map featuresMetrics;
protected static String QPREFIX = "queries.";
protected static String FPREFIX = "features.";
public Metrics() {
Map> qMap = new LinkedHashMap<>();
for (QueryMetric metric : QueryMetric.values()) {
Map metricsMap = Maps.newLinkedHashMapWithExpectedSize(OperationType.values().length);
for (OperationType type : OperationType.values()) {
metricsMap.put(type, new CounterMetric());
}
qMap.put(metric, Collections.unmodifiableMap(metricsMap));
}
opsByTypeMetrics = Collections.unmodifiableMap(qMap);
Map fMap = Maps.newLinkedHashMapWithExpectedSize(FeatureMetric.values().length);
for (FeatureMetric featureMetric : FeatureMetric.values()) {
fMap.put(featureMetric, new CounterMetric());
}
featuresMetrics = Collections.unmodifiableMap(fMap);
}
/**
* Increments the "total" counter for a metric
* This method should be called only once per query.
*/
public void total(QueryMetric metric) {
inc(metric, OperationType.TOTAL);
}
/**
* Increments the "failed" counter for a metric
*/
public void failed(QueryMetric metric) {
inc(metric, OperationType.FAILED);
}
private void inc(QueryMetric metric, OperationType op) {
this.opsByTypeMetrics.get(metric).get(op).inc();
}
public void inc(FeatureMetric metric) {
this.featuresMetrics.get(metric).inc();
}
public Counters stats() {
Counters counters = new Counters();
// queries metrics
for (Entry> entry : opsByTypeMetrics.entrySet()) {
String metricName = entry.getKey().toString();
for (OperationType type : OperationType.values()) {
long metricCounter = entry.getValue().get(type).count();
String operationTypeName = type.toString();
counters.inc(QPREFIX + metricName + "." + operationTypeName, metricCounter);
counters.inc(QPREFIX + "_all." + operationTypeName, metricCounter);
}
}
// features metrics
for (Entry entry : featuresMetrics.entrySet()) {
counters.inc(FPREFIX + entry.getKey().toString(), entry.getValue().count());
}
return counters;
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy