mlbiscoc commented on code in PR #3519:
URL: https://github.com/apache/solr/pull/3519#discussion_r2308436157


##########
solr/core/src/java/org/apache/solr/util/stats/OtelInstrumentedExecutorService.java:
##########
@@ -0,0 +1,283 @@
+package org.apache.solr.util.stats;
+
+import static org.apache.solr.metrics.SolrMetricProducer.CATEGORY_ATTR;
+import static org.apache.solr.metrics.SolrMetricProducer.TYPE_ATTR;
+
+import io.opentelemetry.api.common.AttributeKey;
+import io.opentelemetry.api.common.Attributes;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ForkJoinPool;
+import java.util.concurrent.Future;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import org.apache.solr.core.SolrInfoBean;
+import org.apache.solr.metrics.SolrMetricsContext;
+import org.apache.solr.metrics.otel.OtelUnit;
+import org.apache.solr.metrics.otel.instruments.AttributedLongCounter;
+import org.apache.solr.metrics.otel.instruments.AttributedLongTimer;
+import 
org.apache.solr.metrics.otel.instruments.AttributedLongTimer.MetricTimer;
+import org.apache.solr.metrics.otel.instruments.AttributedLongUpDownCounter;
+
+/**
+ * OTEL instrumentation wrapper around {@link ExecutorService}. Based on {@link
+ * com.codahale.metrics.InstrumentedExecutorService}.
+ */
+public class OtelInstrumentedExecutorService implements ExecutorService {
+  public static final AttributeKey<String> NAME_ATTR = 
AttributeKey.stringKey("executor_name");
+
+  private final ExecutorService delegate;
+  private final AttributedLongCounter submitted;
+  private final AttributedLongUpDownCounter running;
+  private final AttributedLongCounter completed;
+  private final AttributedLongTimer idle;
+  private final AttributedLongTimer duration;
+
+  public OtelInstrumentedExecutorService(
+      ExecutorService delegate,
+      SolrMetricsContext ctx,
+      SolrInfoBean.Category category,
+      String executorName) {
+    this.delegate = delegate;
+
+    Attributes attrs =
+        Attributes.builder()
+            .put(CATEGORY_ATTR, category.toString())
+            .put(NAME_ATTR, executorName)
+            .build();
+
+    // Each metric type needs a separate name to avoid obscuring other types
+    this.submitted =
+        new AttributedLongCounter(
+            ctx.longCounter("solr_executor_tasks", "Number of ExecutorService 
tasks"),
+            attrs.toBuilder().put(TYPE_ATTR, "submitted").build());
+    this.completed =
+        new AttributedLongCounter(
+            ctx.longCounter("solr_executor_tasks", "Number of ExecutorService 
tasks"),
+            attrs.toBuilder().put(TYPE_ATTR, "completed").build());

Review Comment:
   The `submitted` and `completed` metric are sharing a single metric name 
`solr_executor_tasks` and description that is differentiated by attributes. 
Some have their own longCounter but some share names just with different 
attributes. The way it is done here technically works. But the reason I am 
saying initialize it before is so there is one instance of its creation and 
lets say we want to change the description of the metric, we only have to 
change the one instance.
   
   ```
   var tasksCounter =
       ctx.longCounter("solr_executor_tasks", "Number of ExecutorService 
tasks");
       this.submitted =
           new AttributedLongCounter(
               tasksCounter,
               attrs.toBuilder().put(TYPE_ATTR, "submitted").build());
       this.completed =
           new AttributedLongCounter(
              tasksCounter,
               attrs.toBuilder().put(TYPE_ATTR, "completed").build());
   ```
   



-- 
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.

To unsubscribe, e-mail: issues-unsubscr...@solr.apache.org

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


---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@solr.apache.org
For additional commands, e-mail: issues-h...@solr.apache.org

Reply via email to