mlbiscoc commented on code in PR #3519:
URL: https://github.com/apache/solr/pull/3519#discussion_r2308935183
##########
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:
Yes BUT only if the metric name has no differing attributes on the metric so
then it would just be a single time series. Counter instrument doesn’t hold a
single backing value otherwise. In this case, there are 2 distinct metrics with
2 unique attributes (`type`) differentiated from each under under same metric
name. The AttributedLongCounter is initialized with 2 different sets of
attributes thus creating 2 separate time series on the same metric name.
Thats why in tests we get in a psuedo structure:
```
MetricSnapshot {
Snapshot {
Metric name: solr_executor_tasks <- Shared metric name
Datapoints: { <- Unique time series
solr_executor_tasks{type=submitted} 0
solr_executor_tasks{type=completed} 0
}
}
}
```
[See
here](https://github.com/apache/solr/blob/7ffda2ce9418671eea008d5423b5d16c479c0c20/solr/core/src/java/org/apache/solr/metrics/otel/instruments/AttributedLongCounter.java#L37)
the counter adds not to just the metric itself but the unique sets of
attributes as well that was binded to the AttributedLongCounter.
--
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: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]