You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by GitBox <gi...@apache.org> on 2021/03/04 00:55:32 UTC

[GitHub] [incubator-pinot] jackjlli commented on a change in pull request #6640: Make Pinot metrics pluggable

jackjlli commented on a change in pull request #6640:
URL: https://github.com/apache/incubator-pinot/pull/6640#discussion_r586927692



##########
File path: pinot-common/src/main/java/org/apache/pinot/common/metrics/PinotMetricUtils.java
##########
@@ -18,82 +18,186 @@
  */
 package org.apache.pinot.common.metrics;
 
+import java.lang.reflect.Constructor;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
-import org.apache.pinot.common.exception.InvalidConfigException;
+import org.apache.pinot.plugin.metrics.yammer.YammerMetricsFactory;
+import org.apache.pinot.spi.annotations.metrics.MetricsFactory;
+import org.apache.pinot.spi.annotations.metrics.PinotMetricsFactory;
 import org.apache.pinot.spi.env.PinotConfiguration;
 import org.apache.pinot.spi.metrics.PinotGauge;
 import org.apache.pinot.spi.metrics.PinotJmxReporter;
+import org.apache.pinot.spi.metrics.PinotMeter;
 import org.apache.pinot.spi.metrics.PinotMetricName;
 import org.apache.pinot.spi.metrics.PinotMetricsRegistry;
-import org.apache.pinot.common.metrics.yammer.YammerGauge;
-import org.apache.pinot.common.metrics.yammer.YammerJmxReporter;
-import org.apache.pinot.common.metrics.yammer.YammerMetricName;
-import org.apache.pinot.common.metrics.yammer.YammerMetricsRegistry;
+import org.apache.pinot.spi.metrics.PinotTimer;
+import org.reflections.Reflections;
+import org.reflections.scanners.TypeAnnotationsScanner;
+import org.reflections.util.ClasspathHelper;
+import org.reflections.util.ConfigurationBuilder;
+import org.reflections.util.FilterBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 
 public class PinotMetricUtils {
   private static final Logger LOGGER = LoggerFactory.getLogger(PinotMetricUtils.class);
-  public static final String LIBRARY_NAME_KEY = "libraryName";
-  public static final String YAMMER_KEY = "yammer";
+  private static final String METRICS_PACKAGE_REGEX_PATTERN = ".*\\.plugin\\.metrics\\..*";
 
-  private static String LIBRARY_TO_USE = YAMMER_KEY;
+  private static PinotMetricsFactory _pinotMetricsFactory = null;
 
-  public static void init(PinotConfiguration metricsConfiguration)
-      throws InvalidConfigException {
-    String libraryName = metricsConfiguration.getProperty(PinotMetricUtils.LIBRARY_NAME_KEY);
-    if (libraryName == null) {
-      return;
-    }
-    switch (libraryName) {
-      case YAMMER_KEY:
-        LIBRARY_TO_USE = YAMMER_KEY;
-        break;
-      // TODO: support more libraries.
-      default:
-        throw new InvalidConfigException("PinotMetricsRegistry for " + libraryName + " cannot be initialized.");
+  private static final Map<PinotMetricsRegistry, Boolean> metricsRegistryMap = new ConcurrentHashMap<>();
+  private static final Map<MetricsRegistryRegistrationListener, Boolean> metricsRegistryRegistrationListenersMap =
+      new ConcurrentHashMap<>();
+
+  public static void init(PinotConfiguration metricsConfiguration) {
+    // Initializes PinotMetricsFactory.
+    initializePinotMetricsFactory(metricsConfiguration);
+
+    // Initializes metrics using the metrics configuration.
+    initializeMetrics(metricsConfiguration);
+    registerMetricsRegistry(getPinotMetricsRegistry());
+  }
+
+  /**
+   * Initializes PinotMetricsFactory with metrics configurations.
+   * @param metricsConfiguration The subset of the configuration containing the metrics-related keys
+   */
+  private static void initializePinotMetricsFactory(PinotConfiguration metricsConfiguration) {
+    Set<Class<?>> classes = getMetricsClasses();
+    for (Class<?> clazz : classes) {
+      MetricsFactory annotation = clazz.getAnnotation(MetricsFactory.class);
+      if (annotation.enabled()) {
+        try {
+          PinotMetricsFactory pinotMetricsFactory = (PinotMetricsFactory) clazz.newInstance();
+          pinotMetricsFactory.init(metricsConfiguration);
+          registerMetricsFactory(pinotMetricsFactory);
+        } catch (Exception e) {
+          LOGGER.error("Caught exception while initializing pinot metrics registry: {}, skipping it", clazz, e);
+        }
+      }
     }
-    LOGGER.info("Setting metric library to: " + LIBRARY_TO_USE);
   }
 
-  public static PinotMetricsRegistry getPinotMetricsRegistry() {
-    switch (LIBRARY_TO_USE) {
-      case YAMMER_KEY:
-        return new YammerMetricsRegistry();
-      //TODO: support more libraries.
-      default:
-        return new YammerMetricsRegistry();
+  private static Set<Class<?>> getMetricsClasses() {

Review comment:
       Added a new util class called `PinotReflectionUtils` here.




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org