You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ma...@apache.org on 2020/07/14 16:36:11 UTC
[lucene-solr] branch reference_impl updated: #146 - Try and improve
metrics speed a bit.
This is an automated email from the ASF dual-hosted git repository.
markrmiller pushed a commit to branch reference_impl
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git
The following commit(s) were added to refs/heads/reference_impl by this push:
new 28f1bd3 #146 - Try and improve metrics speed a bit.
28f1bd3 is described below
commit 28f1bd35cf840be0e700f6c91c1e944861f560e3
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Tue Jul 14 11:35:54 2020 -0500
#146 - Try and improve metrics speed a bit.
---
.../solr/handler/admin/MetricsHistoryHandler.java | 99 ++++++++++++----------
1 file changed, 53 insertions(+), 46 deletions(-)
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/MetricsHistoryHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/MetricsHistoryHandler.java
index ddb80e5..edda4ab 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/MetricsHistoryHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/MetricsHistoryHandler.java
@@ -165,18 +165,18 @@ public class MetricsHistoryHandler extends RequestHandlerBase implements Permiss
private final SolrCloudManager cloudManager;
private final TimeSource timeSource;
private final int collectPeriod;
- private final Map<String, List<String>> counters = new ConcurrentHashMap<>();
- private final Map<String, List<String>> gauges = new ConcurrentHashMap<>();
+ private final Map<String, List<String>> counters = new ConcurrentHashMap<>(512, 0.75f, 2048);
+ private final Map<String, List<String>> gauges = new ConcurrentHashMap<>(512, 0.75f, 2048);
private final String overseerUrlScheme;
- private final Map<String, RrdDb> knownDbs = new ConcurrentHashMap<>();
+ private final Map<String, RrdDb> knownDbs = new ConcurrentHashMap<>(512, 0.75f, 2048);
private ScheduledThreadPoolExecutor collectService;
private boolean logMissingCollection = true;
private boolean enable;
private boolean enableReplicas;
private boolean enableNodes;
- private String versionString;
+ private volatile String versionString;
public MetricsHistoryHandler(String nodeName, MetricsHandler metricsHandler,
SolrClient solrClient, SolrCloudManager cloudManager, Map<String, Object> pluginArgs) {
@@ -354,17 +354,6 @@ public class MetricsHistoryHandler extends RequestHandlerBase implements Permiss
return nodeName;
}
- private boolean amIOverseerLeader(String leader) {
- if (leader == null) {
- leader = getOverseerLeader();
- }
- if (leader == null) {
- return false;
- } else {
- return nodeName.equals(leader);
- }
- }
-
private void collectMetrics() {
log.debug("-- collectMetrics");
// Make sure we are a solr server thread, so we can use PKI auth, SOLR-12860
@@ -411,37 +400,55 @@ public class MetricsHistoryHandler extends RequestHandlerBase implements Permiss
});
NamedList nl = (NamedList)result.get();
if (nl != null) {
- for (Iterator<Map.Entry<String, Object>> it = nl.iterator(); it.hasNext(); ) {
- Map.Entry<String, Object> entry = it.next();
- String registry = entry.getKey();
- if (group != Group.core) { // add nodeName suffix
- registry = registry + "." + nodeName;
- }
+ try (ParWork worker = new ParWork(this)) {
+ for (Iterator<Map.Entry<String, Object>> it = nl.iterator(); it.hasNext(); ) {
+ Map.Entry<String, Object> entry = it.next();
+ String key = entry.getKey();
+
+ worker.collect(() -> {
+ String registry = key;
+ if (group != Group.core) { // add nodeName suffix
+ registry = registry + "." + nodeName;
+ }
+ RrdDb db = getOrCreateDb(registry, group);
+ if (db == null) {
+ return;
+ }
+ // set the timestamp
+ Sample s = null;
+ try {
+ s = db.createSample(TimeUnit.SECONDS.convert(timeSource.getEpochTimeNs(), TimeUnit.NANOSECONDS));
+ } catch (IOException e) {
+ log.warn("Exception retrieving local metrics for group {}: {}", group, e);
+ return;
+ }
+ NamedList<Object> values = (NamedList<Object>) entry.getValue();
+ AtomicBoolean dirty = new AtomicBoolean(false);
+ Sample finalS = s;
+ counters.get(group.toString()).forEach(c -> {
+ Number val = (Number) values.get(c);
+ if (val != null) {
+ dirty.set(true);
+ finalS.setValue(c, val.doubleValue());
+ }
+ });
+ Sample finalS1 = s;
+ gauges.get(group.toString()).forEach(c -> {
+ Number val = (Number) values.get(c);
+ if (val != null) {
+ dirty.set(true);
+ finalS1.setValue(c, val.doubleValue());
+ }
+ });
+ if (dirty.get()) {
+ try {
+ s.update();
+ } catch (IOException e) {
+ log.warn("Exception retrieving local metrics for group {}: {}", group, e);
+ }
+ }
+ });
- RrdDb db = getOrCreateDb(registry, group);
- if (db == null) {
- continue;
- }
- // set the timestamp
- Sample s = db.createSample(TimeUnit.SECONDS.convert(timeSource.getEpochTimeNs(), TimeUnit.NANOSECONDS));
- NamedList<Object> values = (NamedList<Object>)entry.getValue();
- AtomicBoolean dirty = new AtomicBoolean(false);
- counters.get(group.toString()).forEach(c -> {
- Number val = (Number)values.get(c);
- if (val != null) {
- dirty.set(true);
- s.setValue(c, val.doubleValue());
- }
- });
- gauges.get(group.toString()).forEach(c -> {
- Number val = (Number)values.get(c);
- if (val != null) {
- dirty.set(true);
- s.setValue(c, val.doubleValue());
- }
- });
- if (dirty.get()) {
- s.update();
}
}
}
@@ -645,7 +652,7 @@ public class MetricsHistoryHandler extends RequestHandlerBase implements Permiss
try {
RrdDb newDb = RrdDb.getBuilder().setRrdDef(def).setBackendFactory(factory).setUsePool(true).build();
return newDb;
- } catch (IOException e) {
+ } catch (Exception e) {
log.warn("Can't create RrdDb for registry {}, group {}: {}", registry, group, e);
return null;
}