...
An API to expose internals read-noly metrics was already proposed. Might be joined with the custom metrics.
To give an user the ability to register additional metrics, we could either:
These two approaches are shown below.
...
An API to expose internals read-only metrics was already proposed. Might be joined with the custom metrics.
To give an user the ability to register additional metrics, we could either:
These two approaches are shown below.
package org.apache.ignite;
public interface Ignite {
public IgniteMetrics metrics();
}
Instead of #4, we could create interfaces for the existing metrics implementations.
package org.apache.ignite.metric;
/**
* Allows to manage custom metrics and to obtain read-only internal metrics.
*
* Note: Names of custom metric registries are required to start with 'custom.' (lower case) and may have additional
* dot-separated qualifiers. The prefix is automatically added if missed. For example, if provided custom registry name
* is "a.b.c.mname", it is automatically extended to "custom.a.b.c.mname".
*
* Any custom name or dot-separated name part cannot have spaces and must not be empty. Spaces are removed.
*
* Examples of custom metric registry names: "custom", "custom.admin", "custom.admin.sessions", "custom.processes", etc.
*
* @see ReadOnlyMetricRegistry
* @see IgniteMetricRegistry
*/
@IgniteExperimental
public interface IgniteMetrics extends Iterable<ReadOnlyMetricRegistry> {
...
public interface Ignite {
public IgniteMetrics metrics();
}
Instead of #4, we could create interfaces for the existing metrics implementations.
package org.apache.ignite.metric;
/**
* Allows to manage custom metrics and to obtain read-only internal metrics.
*
* Note: Names of custom metric registries are required to start with 'custom.' (lower case) and may have additional
* dot-separated qualifiers. The prefix is automatically added if missed. For example, if provided custom registry name
* is "a.b.c.mname", it is automatically extended to "custom.a.b.c.mname".
*
* Any custom name or dot-separated name part cannot have spaces and must not be empty. Spaces are removed.
*
* Examples of custom metric registry names: "custom", "custom.admin", "custom.admin.sessions", "custom.processes", etc.
*
* @see ReadOnlyMetricRegistry
* @see IgniteMetricRegistry
*/
@IgniteExperimental
public interface IgniteMetrics extends Iterable<ReadOnlyMetricRegistry> {
/**
* Gets or creates custom metric registry named "custom." + {@code registryName}.
*
* @return {@link IgniteMetricRegistry} registry.
*/
IgniteMetricRegistry customRegistry(String registryName);
/**
* Gets or creates custom metric registry named "custom." + {@code registryName}.
*
* @return {@link IgniteMetricRegistry} registry.
*/
default IgniteMetricRegistry customRegistry(String registryName) {;
/**
* Gets or return customRegistry(null);
}
creates custom metric registry named "custom.".
/**
* Gets metric registry including the Ignite's internal registries@return {@link IgniteMetricRegistry} registry.
*/
default * @return Certain read-only metric registry.
IgniteMetricRegistry customRegistry() {
*/return customRegistry(null);
@Nullable ReadOnlyMetricRegistry findRegistry(String registryName);}
/** */
void removeCustomRegistry(String registryName);* Gets metric registry including the Ignite's internal registries.
/** Removes custom *
* @return Certain read-only metric registry.
with name '.custom'.*/
default@Nullable voidReadOnlyMetricRegistry removeCustomRegistryfindRegistry(String registryName);
{
/** */
void removeCustomRegistry(String registryName);
/** Removes custom metric registry with name '.custom'./
default void removeCustomRegistry() {
removeCustomRegistry(null);
}
}
Probably should be named "MetricRegistry" with renaming of internal "MetricRegistry" to "MetricRegistryImpl".
...
/**
* Metric registry. Allows to get, add or remove metrics.
*
* @see IgniteMetrics
* @see ReadOnlyMetricRegistry
*/
@IgniteExperimental
public interface IgniteMetricRegistry extends ReadOnlyMetricRegistry {
/**
* Registers an int metric which value will be queried from the specified supplier.
*
* @return {@code True} if new metric was added. {@code False} is other metric already exists with the same name.
*/
boolean gauge(String name, IntSupplier supplier, @Nullable String desc);
/**
* Registers a long which value will be queried from the specified supplier.
*
* @return {@code True} if new metric was added. {@code False} is other metric already exists with the same name.
*/
boolean gauge(String name, LongSupplier supplier, @Nullable String desc);
/**
* Registers a double metric which value will be queried from the specified supplier.
*
* @return {@code True} if new metric was added. {@code False} is other metric already exists with the same name.
*/
boolean gauge(String name, DoubleSupplier supplier, @Nullable String desc);
/**
* Registers an object metric which value will be queried from the specified supplier.
*
* @return {@code True} if new metric was added. {@code False} is other metric already exists with the same name.
*/
<T> boolean gauge(String name, Supplier<T> supplier, Class<T> type, @Nullable String desc);
/**
* Registers a boolean metric which value will be queried from the specified supplier.
*
* @return {@code True} if new metric was added. {@code False} is other metric already exists with the same name.
*/
boolean gauge(String name, BooleanSupplier supplier, @Nullable String desc);
/**
* Registers an updatable int metric.
*
* @return New {@link IntValueMetric} or previous one with the same name. {@code Null} if previous metric exists and
* is not a {@link IntValueMetric}.
*/
@Nullable IntValueMetric intMetric(String name, @Nullable String desc);
/**
* Registers an updatable long metric.
*
* @return New {@link LongValueMetric} or previous one with the same name. {@code Null} if previous metric exists and
* is not a {@link LongValueMetric}.
*/
@Nullable LongValueMetric longMetric(String name, @Nullable String desc);
/**
* Registers an updatable long adder metric.
*
* @return New {@link LongValueMetric} or previous one with the same name. {@code Null} if previous metric exists and
* is not a {@link LongValueMetric}.
*/
@Nullable LongSumMetric longAdderMetric(String name, @Nullable String desc);
/**
* Registers an updatable double metric.
*
* @return New {@link DoubleValueMetric} or previous one with the same name. {@code Null} if previous metric exists and
* is not a {@link DoubleValueMetric}.
*/
@Nullable DoubleValueMetric doubleMetric(String name, @Nullable String desc);
/**
* Registers an updatable double metric.
*
* @param <T> Metric value type.
* @return New {@link CustomMetric} or previous one with the same name. {@code Null} if previous metric exists and
* is not a {@link CustomMetric}.
*/
@Nullable <T> AnyValueMetric<T> objectMetric(String name, Class<T> type, @Nullable String desc);
/**
* Removes metrics with the {@code name}.
*
* @param name Metric name..
*/
void remove(String name);
/** Resets all metrics of this metric registry. */
void reset();
}
To the package "org.apache.ignite.metric" we add:
...
Names like "LongMetric" or "ObjectMetric" we already have in the package "org.apache.ignite.spi.metric".
...
package org.apache.ignite.metric;
...
/** Updatable simple long value metric. */
@IgniteExperimental
public interface LongValueMetric extends LongSumMetric {
/** Sets long metric value. */
void value(long value);
}
Instead of #3, we could bring only a minimal interface.
...
package org.apache.ignite;
/**
* ManagesAllows to manage custom metrics. Providesand to obtain read-only internal metrics.
* <p>
* Metrics are grouped into registries (groups). Every metric has full name which is the conjunction of registry name
* and the metric short name. Within a registry metric has only its own short name.
* <p>
* Full names and registry namesNote: Names of custom metric metricsregistries are alwaysrequired to prefixedstart with "'custom.".' For (lower case) and may have additional
* dot-separated qualifiers. The prefix is automatically added if missed. For example, if provided custom registry name
* is "a.b.c.mname",
* it is automatically convertedextended to "custom.a.b.c.mname". If the
* <p>
* Any custom name is "custom.a.b.c.mname", it is used as is.
* Where "custom.a.b.c" is a registry name and "mname" is a metric name.
*or dot-separated name part cannot have spaces and must not be empty. Spaces are removed.
* <p>
* Examples of custom metric registry names: "custom", "custom.admin", "custom.admin.sessions", "custom.processes", etc.
*
* @see ReadOnlyMetricRegistry
* @see IgniteMetricRegistry
*/
@IgniteExperimental
public interface IgniteMetrics extends Iterable<ReadOnlyMetricRegistry> {
/**
* Adds a long value custom metric.
*
* @return New or previously registered long value metric. {@code Null} if previous metric is not a {@link LongConsumer}.
*/
@Nullable LongConsumer longMetric(String registryName, String metricName, @Nullable String description);
/**
* Adds a double value custom metric.
*
* @return New or previously registered long value metric. {@code Null} if previous metric is not a {@link DoubleConsumer}.
*/
@Nullable DoubleConsumer doubleMetric(String registryName, String metricName, @Nullable String description);
/**
* Adds a int value custom metric.
*
* @return New or previously registered long value metric. {@code Null} if previous metric is not an {@link IntConsumer}.
*/
@Nullable IntConsumer booleanMetric(String registryName, String metricName, @Nullable String description);
/**
* Adds a long value custom metric.
*
* @return {@code True} if {@code supplier} has been registered as a new int metric. {@code False}, if a previous
* value supplier already exists.
*/
boolean longMetric(String registryName, String metricName, LongSupplier supplier, @Nullable String description);
/**
* Adds a double value custom metric.
*
* @return {@code True} if {@code supplier} has been registered as a new int metric. {@code False}, if a previous
* value supplier already exists.
*/
boolean doubleMetric(String registryName, String metricName, DoubleSupplier supplier, @Nullable String description);
/**
* Adds a int value custom metric.
*
* @return {@code True} if {@code supplier} has been registered as a new int metric. {@code False}, if a previous
* value supplier already exists.
*/
boolean intMetric(String registryName, String metricName, BooleanSupplier supplier, @Nullable String description);
/** Removes certain custom metric. */
void removeCustomMetric(String registryName, String metricName);
/** Removes entire custom metric registry. */
void removeCustomRegistry(String registryName);
/** Provides custom or internal read-only metric registry. */
@Nullable ReadOnlyMetricRegistry findRegistry(String registryName);
}
...
We already have implementations of more complex and useful metrics. We could also store custom metrics. Thus, the development stages might be:
...