From 53ab7f7325640793d973fd8b2e2cd7bec17c7753 Mon Sep 17 00:00:00 2001 From: Toon Geens Date: Mon, 4 Jan 2021 12:21:56 +0100 Subject: [PATCH 01/10] Removes transitive compile-time dependency on enterprise acs-packaging --- alfred-telemetry-platform/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alfred-telemetry-platform/build.gradle b/alfred-telemetry-platform/build.gradle index 0b9df7a9..90bfc5ee 100644 --- a/alfred-telemetry-platform/build.gradle +++ b/alfred-telemetry-platform/build.gradle @@ -26,7 +26,7 @@ ext { } dependencies { - implementation enforcedPlatform("org.alfresco:acs-packaging:${alfrescoVersion}") + alfrescoProvided enforcedPlatform("org.alfresco:acs-packaging:${alfrescoVersion}") alfrescoProvided('org.alfresco:alfresco-repository') From 5c3a824e3656d53b554e30f718231db85f06a7ec Mon Sep 17 00:00:00 2001 From: anghelutar Date: Thu, 7 Jan 2021 12:17:58 +0100 Subject: [PATCH 02/10] Old classes, not needed. --- .../handler/PrometheusSummaryHandler.java | 363 ------------------ .../solr/writer/PrometheusResponseWriter.java | 131 ------- .../handler/PrometheusSummaryHandler.java | 302 --------------- .../solr/writer/PrometheusResponseWriter.java | 131 ------- 4 files changed, 927 deletions(-) delete mode 100644 alfred-telemetry-solr/alfred-telemetry-solr4/src/main/java/eu/xenit/alfred/telemetry/solr/handler/PrometheusSummaryHandler.java delete mode 100644 alfred-telemetry-solr/alfred-telemetry-solr4/src/main/java/eu/xenit/alfred/telemetry/solr/writer/PrometheusResponseWriter.java delete mode 100644 alfred-telemetry-solr/alfred-telemetry-solr6/src/main/java/eu/xenit/alfred/telemetry/solr/handler/PrometheusSummaryHandler.java delete mode 100644 alfred-telemetry-solr/alfred-telemetry-solr6/src/main/java/eu/xenit/alfred/telemetry/solr/writer/PrometheusResponseWriter.java diff --git a/alfred-telemetry-solr/alfred-telemetry-solr4/src/main/java/eu/xenit/alfred/telemetry/solr/handler/PrometheusSummaryHandler.java b/alfred-telemetry-solr/alfred-telemetry-solr4/src/main/java/eu/xenit/alfred/telemetry/solr/handler/PrometheusSummaryHandler.java deleted file mode 100644 index c65c1232..00000000 --- a/alfred-telemetry-solr/alfred-telemetry-solr4/src/main/java/eu/xenit/alfred/telemetry/solr/handler/PrometheusSummaryHandler.java +++ /dev/null @@ -1,363 +0,0 @@ -package eu.xenit.alfred.telemetry.solr.handler; - -import java.io.IOException; -import java.util.AbstractMap; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.Map; -import java.util.Map.Entry; -import javax.management.AttributeNotFoundException; -import javax.management.InstanceNotFoundException; -import javax.management.IntrospectionException; -import javax.management.MBeanAttributeInfo; -import javax.management.MBeanException; -import javax.management.MBeanInfo; -import javax.management.MBeanServer; -import javax.management.MalformedObjectNameException; -import javax.management.ObjectName; -import javax.management.ReflectionException; -import org.alfresco.service.cmr.repository.datatype.Duration; -import org.alfresco.solr.AlfrescoCoreAdminHandler; -import org.alfresco.solr.SolrInformationServer; -import org.alfresco.solr.TrackerState; -import org.alfresco.solr.tracker.AclTracker; -import org.alfresco.solr.tracker.MetadataTracker; -import org.alfresco.solr.tracker.TrackerRegistry; -import org.apache.solr.common.util.NamedList; -import org.apache.solr.core.JmxMonitoredMap; -import org.apache.solr.handler.RequestHandlerBase; -import org.apache.solr.request.SolrQueryRequest; -import org.apache.solr.response.SolrQueryResponse; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class PrometheusSummaryHandler extends RequestHandlerBase { - - private static final String PROMETHEUS_SEPARATOR = "_"; - AlfrescoCoreAdminHandler coreAdminHandler; - SolrInformationServer server; - String coreName; - boolean enableCoreStats = true; - boolean enableJmxMetrics = true; - boolean enableFTSMetrics = true; - boolean enableTrackerMetrics = true; - boolean enableJmxMetricsOS = true; - boolean enableJmxMetricsMemory = true; - boolean enableJmxMetricsClassLoading = true; - boolean enableJmxMetricsGC = true; - boolean enableJmxMetricsThreading = true; - boolean enableJmxMetricsThreadPool = true; - boolean enableJmxMetricsRequests = true; - boolean enableJmxMetricsSessions = true; - boolean enableJmxMetricsSolr = true; - - Logger logger = LoggerFactory.getLogger(PrometheusSummaryHandler.class); - - ArrayList fieldsToMonitor = new ArrayList(Arrays.asList( - "Alfresco Acls in Index", - "Alfresco Nodes in Index", - "Alfresco Transactions in Index", - "Alfresco Acl Transactions in Index", - "Alfresco Stated in Index", - "Alfresco Unindexed Nodes", - "Alfresco Error Nodes in Index")); - ArrayList beansToMonitorOS = new ArrayList(Arrays.asList( - new AbstractMap.SimpleEntry<>("java.lang:type=OperatingSystem", new ArrayList(Arrays.asList("*"))))); - ArrayList beansToMonitorMemory = new ArrayList(Arrays.asList( - new AbstractMap.SimpleEntry<>("java.lang:type=Memory", new ArrayList(Arrays.asList("*"))))); - ArrayList beansToMonitorClassLoading = new ArrayList(Arrays.asList( - new AbstractMap.SimpleEntry<>("java.lang:type=ClassLoading", new ArrayList(Arrays.asList("*"))))); - ArrayList beansToMonitorThreading = new ArrayList(Arrays.asList( - new AbstractMap.SimpleEntry<>("java.lang:type=Threading", new ArrayList(Arrays.asList("*"))))); - ArrayList beansToMonitorGC = new ArrayList(Arrays.asList( - new AbstractMap.SimpleEntry<>("java.lang:type=GarbageCollector,name=ConcurrentMarkSweep", - new ArrayList(Arrays.asList("*"))))); - ArrayList beansToMonitorThreadPool = new ArrayList(Arrays.asList( - new AbstractMap.SimpleEntry<>("Catalina:type=ThreadPool,name=\"http-bio-8080\"", - new ArrayList(Arrays.asList("*"))))); - ArrayList beansToMonitorRequests = new ArrayList(Arrays.asList( - new AbstractMap.SimpleEntry<>("Catalina:type=GlobalRequestProcessor,name=\"http-bio-8080\"", - new ArrayList(Arrays.asList("*"))))); - ArrayList beansToMonitorSessions = new ArrayList(Arrays.asList( - new AbstractMap.SimpleEntry<>("Catalina:type=Manager,context=/solr4,host=localhost", - new ArrayList(Arrays.asList("*"))))); - ArrayList beansToMonitorSolr = new ArrayList(Arrays.asList( - new AbstractMap.SimpleEntry<>("solr/alfresco:type=searcher,id=org.apache.solr.search.SolrIndexSearcher", - new ArrayList(Arrays.asList("*"))), - new AbstractMap.SimpleEntry<>( - "solr/alfresco:type=/afts,id=org.apache.solr.handler.component.AlfrescoSearchHandler", - new ArrayList(Arrays.asList("*"))), - new AbstractMap.SimpleEntry<>( - "solr/alfresco:type=/cmis,id=org.apache.solr.handler.component.AlfrescoSearchHandler", - new ArrayList(Arrays.asList("*"))))); - - @Override - public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception { - if (req.getOriginalParams().getParams("enableCoreStats") != null) { - enableCoreStats = req.getOriginalParams().getBool("enableCoreStats"); - } - if (req.getOriginalParams().getParams("enableFTSMetrics") != null) { - enableFTSMetrics = req.getOriginalParams().getBool("enableFTSMetrics"); - } - if (req.getOriginalParams().getParams("enableTrackerMetrics") != null) { - enableTrackerMetrics = req.getOriginalParams().getBool("enableTrackerMetrics"); - } - if (req.getOriginalParams().getParams("enableJmxMetrics") != null) { - enableJmxMetrics = req.getOriginalParams().getBool("enableJmxMetrics"); - } - if (req.getOriginalParams().getParams("enableJmxMetricsOS") != null) { - enableJmxMetricsOS = req.getOriginalParams().getBool("enableJmxMetricsOS"); - } - if (req.getOriginalParams().getParams("enableJmxMetricsMemory") != null) { - enableJmxMetricsMemory = req.getOriginalParams().getBool("enableJmxMetricsMemory"); - } - if (req.getOriginalParams().getParams("enableJmxMetricsClassLoading") != null) { - enableJmxMetricsClassLoading = req.getOriginalParams().getBool("enableJmxMetricsClassLoading"); - } - if (req.getOriginalParams().getParams("enableJmxMetricsGC") != null) { - enableJmxMetricsGC = req.getOriginalParams().getBool("enableJmxMetricsGC"); - } - if (req.getOriginalParams().getParams("enableJmxMetricsThreading") != null) { - enableJmxMetricsThreading = req.getOriginalParams().getBool("enableJmxMetricsThreading"); - } - if (req.getOriginalParams().getParams("enableJmxMetricsThreadPool") != null) { - enableJmxMetricsThreadPool = req.getOriginalParams().getBool("enableJmxMetricsThreadPool"); - } - if (req.getOriginalParams().getParams("enableJmxMetricsRequests") != null) { - enableJmxMetricsRequests = req.getOriginalParams().getBool("enableJmxMetricsRequests"); - } - if (req.getOriginalParams().getParams("enableJmxMetricsSessions") != null) { - enableJmxMetricsSessions = req.getOriginalParams().getBool("enableJmxMetricsSessions"); - } - if (req.getOriginalParams().getParams("enableJmxMetricsSolr") != null) { - enableJmxMetricsSolr = req.getOriginalParams().getBool("enableJmxMetricsSolr"); - } - - coreAdminHandler = (AlfrescoCoreAdminHandler) (req.getCore().getCoreDescriptor().getCoreContainer() - .getMultiCoreHandler()); - coreName = req.getCore().getName(); - server = (SolrInformationServer) coreAdminHandler.getInformationServers().get(coreName); - - if (enableCoreStats) { - getCoreStats(req, rsp); - } - if (enableFTSMetrics) { - getFTSMetrics(req, rsp); - } - if (enableTrackerMetrics) { - getTrackerMetrics(req, rsp); - } - if (enableJmxMetrics) { - getJmxMetrics(req, rsp); - } - } - - private void getJmxMetrics(SolrQueryRequest req, SolrQueryResponse rsp) { - Map registry = req.getCore().getInfoRegistry(); - MBeanServer mbeanServer = ((JmxMonitoredMap) registry).getServer(); - if (enableJmxMetricsOS) { - getJmxMetricsPerBeans(mbeanServer, beansToMonitorOS, rsp); - } - if (enableJmxMetricsMemory) { - getJmxMetricsPerBeans(mbeanServer, beansToMonitorMemory, rsp); - } - if (enableJmxMetricsGC) { - getJmxMetricsPerBeans(mbeanServer, beansToMonitorGC, rsp); - } - if (enableJmxMetricsClassLoading) { - getJmxMetricsPerBeans(mbeanServer, beansToMonitorClassLoading, rsp); - } - if (enableJmxMetricsThreading) { - getJmxMetricsPerBeans(mbeanServer, beansToMonitorThreading, rsp); - } - if (enableJmxMetricsThreadPool) { - getJmxMetricsPerBeans(mbeanServer, beansToMonitorThreadPool, rsp); - } - if (enableJmxMetricsRequests) { - getJmxMetricsPerBeans(mbeanServer, beansToMonitorRequests, rsp); - } - if (enableJmxMetricsSessions) { - getJmxMetricsPerBeans(mbeanServer, beansToMonitorSessions, rsp); - } - if (enableJmxMetricsSolr) { - getJmxMetricsPerBeans(mbeanServer, beansToMonitorSolr, rsp); - } - } - - - private void getJmxMetricsPerBeans(MBeanServer mbeanServer, ArrayList beansToMonitor, - SolrQueryResponse rsp) { - for (AbstractMap.SimpleEntry beanToMonitor : beansToMonitor) { - ObjectName objectName = null; - try { - objectName = new ObjectName((String) beanToMonitor.getKey()); - } catch (MalformedObjectNameException e) { - logger.error("Malformed bean name " + beanToMonitor.getKey()); - continue; - } - MBeanInfo mBeanInfo = null; - try { - mBeanInfo = mbeanServer.getMBeanInfo(objectName); - } catch (InstanceNotFoundException | IntrospectionException | ReflectionException e) { - logger.error("Problem with bean " + beanToMonitor.getKey()); - continue; - } - for (MBeanAttributeInfo attributeInfo : mBeanInfo.getAttributes()) { - ArrayList values = (ArrayList) beanToMonitor.getValue(); - if (prometheusAllowedType(attributeInfo.getType()) && ("*".equals(values.get(0)))) { - String resp = String.format("%s_%s{%s}", getPrometheusName(objectName), attributeInfo.getName(), - getPrometheusLabels(objectName)); - try { - rsp.add(resp, mbeanServer.getAttribute(objectName, attributeInfo.getName())); - } catch (MBeanException | AttributeNotFoundException | InstanceNotFoundException | ReflectionException e) { - logger.error("Problem with attributes " + attributeInfo + " checked against " + values); - continue; - } - } - } - } - } - - private String getPrometheusLabels(ObjectName objectName) { - String result = ""; - for (String property : objectName.getKeyPropertyList().keySet()) { - if (!"type".equals(property)) { - result += getPrometheusEscape(property) + "=" + getPrometheusQuoted( - objectName.getKeyPropertyList().get(property)) + ","; - } - } - if (result.length() > 0) { - return result.substring(0, result.length() - 1); - } else { - return result; - } - } - - private String getPrometheusQuoted(String s) { - return (!s.startsWith("\"")) ? "\"" + s + "\"" : s; - } - - private String getPrometheusEscape(String property) { - return property.replace(" ", PROMETHEUS_SEPARATOR).replace(".", PROMETHEUS_SEPARATOR) - .replace("/", PROMETHEUS_SEPARATOR); - } - - private String getPrometheusName(ObjectName objectName) { - String result = getPrometheusEscape(objectName.getDomain()); - result += PROMETHEUS_SEPARATOR + getPrometheusEscape(objectName.getKeyPropertyList().get("type")); - return result; - } - - private boolean prometheusAllowedType(String type) { - return ("int".equals(type) || "double".equals(type) || "long".equals(type) || - "java.lang.Integer".equals(type) || "java.lang.Double".equals(type) || "java.lang.Long".equals(type)); - } - - private void getTrackerMetrics(SolrQueryRequest req, SolrQueryResponse rsp) { - TrackerRegistry trackerRegistry = coreAdminHandler.getTrackerRegistry(); - - if(trackerRegistry==null) { - logger.info("There is no tracker registry yet, solr is not yet tracking"); - return; - } - - MetadataTracker metaTrkr = trackerRegistry.getTrackerForCore(coreName, MetadataTracker.class); - TrackerState metadataTrkrState = metaTrkr.getTrackerState(); - long lastIndexedTxId = metadataTrkrState.getLastIndexedTxId(); - long lastTxCommitTimeOnServer = metadataTrkrState.getLastTxCommitTimeOnServer(); - long lastTxIdOnServer = metadataTrkrState.getLastTxIdOnServer(); - long lastIndexTxCommitTime = metadataTrkrState.getLastIndexedTxCommitTime(); - long transactionsToDo = lastTxIdOnServer - lastIndexedTxId; - Date lastIndexTxCommitDate = new Date(lastIndexTxCommitTime); - Date lastTxOnServerDate = new Date(lastTxCommitTimeOnServer); - if (transactionsToDo < 0) { - transactionsToDo = 0; - } - - AclTracker aclTrkr = trackerRegistry.getTrackerForCore(coreName, AclTracker.class); - TrackerState aclTrkrState = aclTrkr.getTrackerState(); - long lastIndexChangeSetCommitTime = aclTrkrState.getLastIndexedChangeSetCommitTime(); - long lastIndexedChangeSetId = aclTrkrState.getLastIndexedChangeSetId(); - long lastChangeSetCommitTimeOnServer = aclTrkrState.getLastChangeSetCommitTimeOnServer(); - long lastChangeSetIdOnServer = aclTrkrState.getLastChangeSetIdOnServer(); - Date lastIndexChangeSetCommitDate = new Date(lastIndexChangeSetCommitTime); - Date lastChangeSetOnServerDate = new Date(lastChangeSetCommitTimeOnServer); - long changeSetsToDo = lastChangeSetIdOnServer - lastIndexedChangeSetId; - if (changeSetsToDo < 0) { - changeSetsToDo = 0; - } - - Duration txLag = new Duration(lastIndexTxCommitDate, lastTxOnServerDate); - if (lastIndexTxCommitDate.compareTo(lastTxOnServerDate) > 0) { - txLag = new Duration(); - } - long txLagSeconds = (lastTxCommitTimeOnServer - lastIndexTxCommitTime) / 1000; - if (txLagSeconds < 0) { - txLagSeconds = 0; - } - - Duration changeSetLag = new Duration(lastIndexChangeSetCommitDate, lastChangeSetOnServerDate); - if (lastIndexChangeSetCommitDate.compareTo(lastChangeSetOnServerDate) > 0) { - changeSetLag = new Duration(); - } - long changeSetLagSeconds = (lastChangeSetCommitTimeOnServer - lastIndexChangeSetCommitTime) / 1000; - if (changeSetLagSeconds < 0) { - changeSetLagSeconds = 0; - } - - String resp = String - .format("alfresco_summary{core=\"%s\",feature=\"Approx transactions remaining\"}", coreName); - rsp.add(resp, transactionsToDo); - resp = String.format("alfresco_summary{core=\"%s\",feature=\"TX lag\"}", coreName); - rsp.add(resp, txLagSeconds); - resp = String.format("alfresco_summary{core=\"%s\",feature=\"Last Index TX Commit Time\"}", coreName); - rsp.add(resp, lastIndexTxCommitTime); - - resp = String.format("alfresco_summary{core=\"%s\",feature=\"Approx change sets remaining\"}", coreName); - rsp.add(resp, changeSetsToDo); - resp = String.format("alfresco_summary{core=\"%s\",feature=\"Change Set Lag\"}", coreName); - rsp.add(resp, changeSetLagSeconds); - resp = String.format("alfresco_summary{core=\"%s\",feature=\"Last Index Change Set Commit Time\"}", coreName); - rsp.add(resp, lastIndexChangeSetCommitTime); - } - - private void getFTSMetrics(SolrQueryRequest req, SolrQueryResponse rsp) { - if (server == null) { - return; - } - NamedList report = new NamedList(); - // FTS - server.addFTSStatusCounts(report); - for (Entry fts : report) { - String resp = String - .format("alfresco_summary{core=\"%s\",feature=\"%s\"}", req.getCore().getName(), fts.getKey()); - rsp.add(resp, fts.getValue()); - } - } - - private void getCoreStats(SolrQueryRequest req, SolrQueryResponse rsp) throws IOException { - // Core stats - if (server == null) { - return; - } - Iterable> stats = server.getCoreStats(); - for (Entry stat : stats) { - if (fieldsToMonitor.contains(stat.getKey())) { - String resp = String - .format("alfresco_summary{core=\"%s\",feature=\"%s\"}", req.getCore().getName(), stat.getKey()); - rsp.add(resp, stat.getValue()); - } - } - } - - @Override - public String getDescription() { - return null; - } - - @Override - public String getSource() { - return null; - } -} diff --git a/alfred-telemetry-solr/alfred-telemetry-solr4/src/main/java/eu/xenit/alfred/telemetry/solr/writer/PrometheusResponseWriter.java b/alfred-telemetry-solr/alfred-telemetry-solr4/src/main/java/eu/xenit/alfred/telemetry/solr/writer/PrometheusResponseWriter.java deleted file mode 100644 index fc67cab1..00000000 --- a/alfred-telemetry-solr/alfred-telemetry-solr4/src/main/java/eu/xenit/alfred/telemetry/solr/writer/PrometheusResponseWriter.java +++ /dev/null @@ -1,131 +0,0 @@ -package eu.xenit.alfred.telemetry.solr.writer; - -import java.io.IOException; -import java.io.Writer; -import java.util.Iterator; -import java.util.Map; -import org.apache.solr.common.SolrDocument; -import org.apache.solr.common.util.NamedList; -import org.apache.solr.request.SolrQueryRequest; -import org.apache.solr.response.QueryResponseWriter; -import org.apache.solr.response.SolrQueryResponse; -import org.apache.solr.response.TextResponseWriter; -import org.apache.solr.search.ReturnFields; - -/** - * - */ - -public class PrometheusResponseWriter implements QueryResponseWriter { - - @Override - public void init(@SuppressWarnings({"rawtypes"})NamedList n) { - } - - @Override - public void write(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) throws IOException { - PrometheusWriter w = new PrometheusWriter(writer, req, rsp); - try { - w.writeResponse(); - } finally { - w.close(); - } - } - - @Override - public String getContentType(SolrQueryRequest request, SolrQueryResponse response) { - // using the text/plain allows this to be viewed in the browser easily - return CONTENT_TYPE_TEXT_UTF8; - } - -} - -class PrometheusWriter extends TextResponseWriter { - - private static final String RESPONSE_HEADER = "responseHeader"; - - public PrometheusWriter(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) { - super(writer, req, rsp); - } - - public void writeResponse() throws IOException { - writeNamedList(null, rsp.getValues()); - } - - - @Override - public void writeNamedList(String name, NamedList val) throws IOException { - for (int i=0; i beansToMonitorOS = new ArrayList(Arrays.asList( - new AbstractMap.SimpleEntry<>("java.lang:type=OperatingSystem",new ArrayList(Arrays.asList("*"))))); - ArrayList beansToMonitorMemory = new ArrayList(Arrays.asList( - new AbstractMap.SimpleEntry<>("java.lang:type=Memory",new ArrayList(Arrays.asList("*"))))); - ArrayList beansToMonitorClassLoading = new ArrayList(Arrays.asList( - new AbstractMap.SimpleEntry<>("java.lang:type=ClassLoading",new ArrayList(Arrays.asList("*"))))); - ArrayList beansToMonitorThreading = new ArrayList(Arrays.asList( - new AbstractMap.SimpleEntry<>("java.lang:type=Threading",new ArrayList(Arrays.asList("*"))))); - ArrayList beansToMonitorGC = new ArrayList(Arrays.asList( - new AbstractMap.SimpleEntry<>("java.lang:type=GarbageCollector,name=ConcurrentMarkSweep",new ArrayList(Arrays.asList("*"))))); - ArrayList beansToMonitorSolr = new ArrayList(Arrays.asList( - new AbstractMap.SimpleEntry<>("solr/alfresco:type=searcher,id=org.apache.solr.search.SolrIndexSearcher",new ArrayList(Arrays.asList("*"))), - new AbstractMap.SimpleEntry<>("solr/alfresco:type=/afts,id=org.apache.solr.handler.component.AlfrescoSearchHandler",new ArrayList(Arrays.asList("*"))), - new AbstractMap.SimpleEntry<>("solr/alfresco:type=/cmis,id=org.apache.solr.handler.component.AlfrescoSearchHandler",new ArrayList(Arrays.asList("*"))))); - - @Override - public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception { - if(req.getOriginalParams().getParams("enableCoreStats") != null) - enableCoreStats = req.getOriginalParams().getBool("enableCoreStats"); - if(req.getOriginalParams().getParams("enableFTSMetrics") != null) - enableFTSMetrics = req.getOriginalParams().getBool("enableFTSMetrics"); - if(req.getOriginalParams().getParams("enableTrackerMetrics") != null) - enableTrackerMetrics = req.getOriginalParams().getBool("enableTrackerMetrics"); - if(req.getOriginalParams().getParams("enableJmxMetrics") != null) - enableJmxMetrics = req.getOriginalParams().getBool("enableJmxMetrics"); - if(req.getOriginalParams().getParams("enableJmxMetricsOS") != null) - enableJmxMetricsOS = req.getOriginalParams().getBool("enableJmxMetricsOS"); - if(req.getOriginalParams().getParams("enableJmxMetricsMemory") != null) - enableJmxMetricsMemory = req.getOriginalParams().getBool("enableJmxMetricsMemory"); - if(req.getOriginalParams().getParams("enableJmxMetricsClassLoading") != null) - enableJmxMetricsClassLoading = req.getOriginalParams().getBool("enableJmxMetricsClassLoading"); - if(req.getOriginalParams().getParams("enableJmxMetricsGC") != null) - enableJmxMetricsGC = req.getOriginalParams().getBool("enableJmxMetricsGC"); - if(req.getOriginalParams().getParams("enableJmxMetricsThreading") != null) - enableJmxMetricsThreading = req.getOriginalParams().getBool("enableJmxMetricsThreading"); - if(req.getOriginalParams().getParams("enableJmxMetricsSolr") != null) - enableJmxMetricsSolr = req.getOriginalParams().getBool("enableJmxMetricsSolr"); - - - coreAdminHandler = (AlfrescoCoreAdminHandler)(req.getCore().getCoreContainer().getMultiCoreHandler()); - coreName = req.getCore().getName(); - server = (SolrInformationServer) coreAdminHandler.getInformationServers().get(coreName); - - if(enableCoreStats) - getCoreStats(req, rsp); - if(enableFTSMetrics) - getFTSMetrics(req, rsp); - if(enableTrackerMetrics) - getTrackerMetrics(req, rsp); - if(enableJmxMetrics) - getJmxMetrics(req,rsp); - } - - private void getJmxMetrics(SolrQueryRequest req, SolrQueryResponse rsp) { - MBeanServer mbeanServer = JmxUtil.findFirstMBeanServer(); - if(mbeanServer==null) { - logger.error("No mbeanServer found, jmx metrics will not be activated"); - return; - } - if(enableJmxMetricsOS) - getJmxMetricsPerBeans(mbeanServer,beansToMonitorOS,rsp); - if(enableJmxMetricsMemory) - getJmxMetricsPerBeans(mbeanServer,beansToMonitorMemory,rsp); - if(enableJmxMetricsGC) - getJmxMetricsPerBeans(mbeanServer,beansToMonitorGC,rsp); - if(enableJmxMetricsClassLoading) - getJmxMetricsPerBeans(mbeanServer,beansToMonitorClassLoading,rsp); - if(enableJmxMetricsThreading) - getJmxMetricsPerBeans(mbeanServer,beansToMonitorThreading,rsp); - if(enableJmxMetricsSolr) - getJmxMetricsPerBeans(mbeanServer,beansToMonitorSolr,rsp); - } - - - private void getJmxMetricsPerBeans(MBeanServer mbeanServer, ArrayList beansToMonitor, SolrQueryResponse rsp) { - for(AbstractMap.SimpleEntry beanToMonitor : beansToMonitor) { - ObjectName objectName = null; - try { - objectName = new ObjectName((String) beanToMonitor.getKey()); - } catch (MalformedObjectNameException e) { - logger.error("Malformed bean name " + beanToMonitor.getKey()); - continue; - } - MBeanInfo mBeanInfo = null; - try { - mBeanInfo = mbeanServer.getMBeanInfo(objectName); - } catch (InstanceNotFoundException | IntrospectionException | ReflectionException e) { - logger.error("Problem with bean " + beanToMonitor.getKey()); - continue; - } - for (MBeanAttributeInfo attributeInfo : mBeanInfo.getAttributes()) { - ArrayList values = (ArrayList) beanToMonitor.getValue(); - if (prometheusAllowedType(attributeInfo.getType()) && ("*".equals(values.get(0)))) { - String resp = String.format("%s_%s{%s}", getPrometheusName(objectName), attributeInfo.getName(), - getPrometheusLabels(objectName)); - try { - rsp.add(resp, mbeanServer.getAttribute(objectName, attributeInfo.getName())); - } catch (MBeanException | AttributeNotFoundException | InstanceNotFoundException | ReflectionException e) { - logger.error("Problem with attributes " + attributeInfo + " checked against " + values); - continue; - } - } - } - } - } - - private String getPrometheusLabels(ObjectName objectName) { - String result = ""; - for(String property : objectName.getKeyPropertyList().keySet()) { - if(!"type".equals(property)) { - result += getPrometheusEscape(property) + "=" + getPrometheusQuoted(objectName.getKeyPropertyList().get(property)) + ","; - } - } - if(result.length()>0) - return result.substring(0,result.length()-1); - else - return result; - } - - private String getPrometheusQuoted(String s) { - return (!s.startsWith("\"")) ? "\"" + s + "\"" : s; - } - - private String getPrometheusEscape(String property) { - return property.replace(" ",PROMETHEUS_SEPARATOR).replace(".",PROMETHEUS_SEPARATOR).replace("/",PROMETHEUS_SEPARATOR); - } - - private String getPrometheusName(ObjectName objectName) { - String result = getPrometheusEscape(objectName.getDomain()); - result += PROMETHEUS_SEPARATOR + getPrometheusEscape(objectName.getKeyPropertyList().get("type")); - return result; - } - - private boolean prometheusAllowedType(String type) { - return ("int".equals(type) || "double".equals(type) || "long".equals(type) || - "java.lang.Integer".equals(type) || "java.lang.Double".equals(type) || "java.lang.Long".equals(type)); - } - - private void getTrackerMetrics(SolrQueryRequest req, SolrQueryResponse rsp) { - TrackerRegistry trackerRegistry = coreAdminHandler.getTrackerRegistry(); - - MetadataTracker metaTrkr = trackerRegistry.getTrackerForCore(coreName, MetadataTracker.class); - TrackerState metadataTrkrState = metaTrkr.getTrackerState(); - long lastIndexedTxId = metadataTrkrState.getLastIndexedTxId(); - long lastTxCommitTimeOnServer = metadataTrkrState.getLastTxCommitTimeOnServer(); - long lastTxIdOnServer = metadataTrkrState.getLastTxIdOnServer(); - long lastIndexTxCommitTime = metadataTrkrState.getLastIndexedTxCommitTime(); - long transactionsToDo = lastTxIdOnServer - lastIndexedTxId; - Date lastIndexTxCommitDate = new Date(lastIndexTxCommitTime); - Date lastTxOnServerDate = new Date(lastTxCommitTimeOnServer); - if (transactionsToDo < 0) - { - transactionsToDo = 0; - } - - AclTracker aclTrkr = trackerRegistry.getTrackerForCore(coreName, AclTracker.class); - TrackerState aclTrkrState = aclTrkr.getTrackerState(); - long lastIndexChangeSetCommitTime = aclTrkrState.getLastIndexedChangeSetCommitTime(); - long lastIndexedChangeSetId = aclTrkrState.getLastIndexedChangeSetId(); - long lastChangeSetCommitTimeOnServer = aclTrkrState.getLastChangeSetCommitTimeOnServer(); - long lastChangeSetIdOnServer = aclTrkrState.getLastChangeSetIdOnServer(); - Date lastIndexChangeSetCommitDate = new Date(lastIndexChangeSetCommitTime); - Date lastChangeSetOnServerDate = new Date(lastChangeSetCommitTimeOnServer); - long changeSetsToDo = lastChangeSetIdOnServer - lastIndexedChangeSetId; - if (changeSetsToDo < 0) - { - changeSetsToDo = 0; - } - - Duration txLag = new Duration(lastIndexTxCommitDate, lastTxOnServerDate); - if (lastIndexTxCommitDate.compareTo(lastTxOnServerDate) > 0) - { - txLag = new Duration(); - } - long txLagSeconds = (lastTxCommitTimeOnServer - lastIndexTxCommitTime) / 1000; - if (txLagSeconds < 0) - { - txLagSeconds = 0; - } - - Duration changeSetLag = new Duration(lastIndexChangeSetCommitDate, lastChangeSetOnServerDate); - if (lastIndexChangeSetCommitDate.compareTo(lastChangeSetOnServerDate) > 0) - { - changeSetLag = new Duration(); - } - long changeSetLagSeconds = (lastChangeSetCommitTimeOnServer - lastIndexChangeSetCommitTime) / 1000; - if (changeSetLagSeconds < 0) - { - changeSetLagSeconds = 0; - } - - String resp = String.format("alfresco_summary{core=\"%s\",feature=\"Approx transactions remaining\"}",coreName); - rsp.add(resp,transactionsToDo); - resp = String.format("alfresco_summary{core=\"%s\",feature=\"TX lag\"}",coreName); - rsp.add(resp,txLagSeconds); - resp = String.format("alfresco_summary{core=\"%s\",feature=\"Last Index TX Commit Time\"}",coreName); - rsp.add(resp,lastIndexTxCommitTime); - - resp = String.format("alfresco_summary{core=\"%s\",feature=\"Approx change sets remaining\"}",coreName); - rsp.add(resp,changeSetsToDo); - resp = String.format("alfresco_summary{core=\"%s\",feature=\"Change Set Lag\"}",coreName); - rsp.add(resp,changeSetLagSeconds); - resp = String.format("alfresco_summary{core=\"%s\",feature=\"Last Index Change Set Commit Time\"}",coreName); - rsp.add(resp,lastIndexChangeSetCommitTime); - } - - private void getFTSMetrics(SolrQueryRequest req, SolrQueryResponse rsp) { - if(server==null) - return; - NamedList report = new NamedList(); - // FTS - server.addFTSStatusCounts(report); - for(Entry fts : report) { - String resp = String.format("alfresco_summary{core=\"%s\",feature=\"%s\"}",req.getCore().getName(),fts.getKey()); - rsp.add(resp,fts.getValue()); - } - } - - private void getCoreStats(SolrQueryRequest req, SolrQueryResponse rsp) throws IOException { - // Core stats - if(server==null) - return; - Iterable> stats = server.getCoreStats(); - for(Entry stat : stats) { - if(fieldsToMonitor.contains(stat.getKey())) { - String resp = String.format("alfresco_summary{core=\"%s\",feature=\"%s\"}",req.getCore().getName(),stat.getKey()); - rsp.add(resp,stat.getValue()); - } - } - } - - @Override - public String getDescription() { - return null; - } - - @Override - public String getSource() { - return null; - } -} diff --git a/alfred-telemetry-solr/alfred-telemetry-solr6/src/main/java/eu/xenit/alfred/telemetry/solr/writer/PrometheusResponseWriter.java b/alfred-telemetry-solr/alfred-telemetry-solr6/src/main/java/eu/xenit/alfred/telemetry/solr/writer/PrometheusResponseWriter.java deleted file mode 100644 index fc67cab1..00000000 --- a/alfred-telemetry-solr/alfred-telemetry-solr6/src/main/java/eu/xenit/alfred/telemetry/solr/writer/PrometheusResponseWriter.java +++ /dev/null @@ -1,131 +0,0 @@ -package eu.xenit.alfred.telemetry.solr.writer; - -import java.io.IOException; -import java.io.Writer; -import java.util.Iterator; -import java.util.Map; -import org.apache.solr.common.SolrDocument; -import org.apache.solr.common.util.NamedList; -import org.apache.solr.request.SolrQueryRequest; -import org.apache.solr.response.QueryResponseWriter; -import org.apache.solr.response.SolrQueryResponse; -import org.apache.solr.response.TextResponseWriter; -import org.apache.solr.search.ReturnFields; - -/** - * - */ - -public class PrometheusResponseWriter implements QueryResponseWriter { - - @Override - public void init(@SuppressWarnings({"rawtypes"})NamedList n) { - } - - @Override - public void write(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) throws IOException { - PrometheusWriter w = new PrometheusWriter(writer, req, rsp); - try { - w.writeResponse(); - } finally { - w.close(); - } - } - - @Override - public String getContentType(SolrQueryRequest request, SolrQueryResponse response) { - // using the text/plain allows this to be viewed in the browser easily - return CONTENT_TYPE_TEXT_UTF8; - } - -} - -class PrometheusWriter extends TextResponseWriter { - - private static final String RESPONSE_HEADER = "responseHeader"; - - public PrometheusWriter(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) { - super(writer, req, rsp); - } - - public void writeResponse() throws IOException { - writeNamedList(null, rsp.getValues()); - } - - - @Override - public void writeNamedList(String name, NamedList val) throws IOException { - for (int i=0; i Date: Thu, 7 Jan 2021 12:20:04 +0100 Subject: [PATCH 03/10] Make registraar a singleton and getGlobalRegistry a static method. --- .../registry/RegistryRegistraar.java | 19 +++++++++--- .../solr/handler/MicrometerHandler.java | 5 ++- .../solr/handler/MicrometerHandler.java | 31 ++++++++++++++++--- 3 files changed, 42 insertions(+), 13 deletions(-) diff --git a/alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/monitoring/registry/RegistryRegistraar.java b/alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/monitoring/registry/RegistryRegistraar.java index 4fc5c885..3cbeacc3 100644 --- a/alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/monitoring/registry/RegistryRegistraar.java +++ b/alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/monitoring/registry/RegistryRegistraar.java @@ -1,6 +1,7 @@ package eu.xenit.alfred.telemetry.solr.monitoring.registry; import eu.xenit.alfred.telemetry.solr.util.Util; +import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Metrics; import io.micrometer.core.instrument.Tags; import io.micrometer.core.instrument.composite.CompositeMeterRegistry; @@ -14,13 +15,21 @@ import org.slf4j.LoggerFactory; public class RegistryRegistraar { + private static RegistryRegistraar registraar = null; private static final Logger logger = LoggerFactory.getLogger(RegistryRegistraar.class); CompositeMeterRegistry globalMeterRegistry = Metrics.globalRegistry; PrometheusMeterRegistry prometheusMeterRegistry; GraphiteMeterRegistry graphiteMeterRegistry; - public RegistryRegistraar() { + + public static RegistryRegistraar getInstance() { + if(registraar == null) + registraar = new RegistryRegistraar(); + return registraar; + } + + private RegistryRegistraar() { // always register the Prometheus registry prometheusMeterRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT); prometheusMeterRegistry.config().commonTags(Tags.of("application", "solr")); @@ -75,12 +84,12 @@ private String tryToRetrieveHostName() { } } - public CompositeMeterRegistry getGlobalMeterRegistry() { - return globalMeterRegistry; + public static MeterRegistry getGlobalMeterRegistry() { + return getInstance().globalMeterRegistry; } - public PrometheusMeterRegistry getPrometheusMeterRegistry() { - return prometheusMeterRegistry; + public static PrometheusMeterRegistry getPrometheusMeterRegistry() { + return getInstance().prometheusMeterRegistry; } } diff --git a/alfred-telemetry-solr/alfred-telemetry-solr4/src/main/java/eu/xenit/alfred/telemetry/solr/handler/MicrometerHandler.java b/alfred-telemetry-solr/alfred-telemetry-solr4/src/main/java/eu/xenit/alfred/telemetry/solr/handler/MicrometerHandler.java index 275ee7e3..b22ec55a 100644 --- a/alfred-telemetry-solr/alfred-telemetry-solr4/src/main/java/eu/xenit/alfred/telemetry/solr/handler/MicrometerHandler.java +++ b/alfred-telemetry-solr/alfred-telemetry-solr4/src/main/java/eu/xenit/alfred/telemetry/solr/handler/MicrometerHandler.java @@ -21,8 +21,7 @@ public class MicrometerHandler extends RequestHandlerBase { - static RegistryRegistraar registraar = new RegistryRegistraar(); - static MeterRegistry registry = registraar.getGlobalMeterRegistry(); + static MeterRegistry registry = RegistryRegistraar.getInstance().getGlobalMeterRegistry(); static SolrMetrics solrMetrics = null; static MyTomcatMetrics tomcatMetrics = null; @@ -52,7 +51,7 @@ public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throw tomcatMetrics = new MyTomcatMetrics(mbeanServer); tomcatMetrics.bindTo(registry); } - writeTextToResponse(PrometheusRegistryUtil.extractPrometheusScrapeData(registraar.getPrometheusMeterRegistry()), + writeTextToResponse(PrometheusRegistryUtil.extractPrometheusScrapeData(RegistryRegistraar.getInstance().getPrometheusMeterRegistry()), rsp); } diff --git a/alfred-telemetry-solr/alfred-telemetry-solr6/src/main/java/eu/xenit/alfred/telemetry/solr/handler/MicrometerHandler.java b/alfred-telemetry-solr/alfred-telemetry-solr6/src/main/java/eu/xenit/alfred/telemetry/solr/handler/MicrometerHandler.java index 6c6e0198..0fead3f9 100644 --- a/alfred-telemetry-solr/alfred-telemetry-solr6/src/main/java/eu/xenit/alfred/telemetry/solr/handler/MicrometerHandler.java +++ b/alfred-telemetry-solr/alfred-telemetry-solr6/src/main/java/eu/xenit/alfred/telemetry/solr/handler/MicrometerHandler.java @@ -8,8 +8,7 @@ import eu.xenit.alfred.telemetry.solr.util.PrometheusRegistryUtil; import eu.xenit.alfred.telemetry.solr.util.Util; import io.micrometer.core.instrument.MeterRegistry; -import java.io.IOException; -import javax.management.MBeanServer; +import io.micrometer.core.instrument.binder.jetty.TimedHandler; import org.alfresco.solr.AlfrescoCoreAdminHandler; import org.apache.solr.handler.RequestHandlerBase; import org.apache.solr.request.SolrQueryRequest; @@ -18,11 +17,14 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.management.MBeanServer; +import java.io.IOException; + public class MicrometerHandler extends RequestHandlerBase { - static RegistryRegistraar registraar = new RegistryRegistraar(); - static MeterRegistry registry = registraar.getGlobalMeterRegistry(); + static MeterRegistry registry = RegistryRegistraar.getInstance().getGlobalMeterRegistry(); static SolrMetrics solrMetrics = null; + static TimedHandler jettyMetrics = null; static { if( Util.isEnabled("ALFRED_TELEMETRY_JVM_ENABLED")) @@ -42,11 +44,30 @@ public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throw .getMultiCoreHandler(); MBeanServer mbeanServer = JmxUtil.findFirstMBeanServer(); + if(jettyMetrics == null) { + // jettyMetrics = new TimedHandler(registry, Tags.empty()); + /*logger.error("class=" + req.getHttpSolrCall().getReq().getClass()); + Enumeration attributeNames = req.getHttpSolrCall().getReq().getAttributeNames(); + logger.error("attributes=" + attributeNames); + + Server server = (Server) req.getHttpSolrCall().getReq().getAttribute("org.eclipse.jetty.server.Server"); + if(server==null) { + logger.error("There is no jetty server"); + logger.error("attributes=" + req.getHttpSolrCall().getReq().getAttributeNames()); + } else { + logger.error("server=" + server); + StatisticsHandler statisticsHandler = (StatisticsHandler) server.getChildHandlerByClass(StatisticsHandler.class); + + jettyMetrics = new JettyStatisticsMetrics(statisticsHandler, null); + jettyMetrics.bindTo(registry); + }*/ + } + if (solrMetrics == null && Util.isEnabled("METRICS_SOLR_ENABLED")) { solrMetrics = new SolrMetrics(coreAdminHandler, mbeanServer); solrMetrics.bindTo(registry); } - writeTextToResponse(PrometheusRegistryUtil.extractPrometheusScrapeData(registraar.getPrometheusMeterRegistry()), + writeTextToResponse(PrometheusRegistryUtil.extractPrometheusScrapeData(RegistryRegistraar.getInstance().getPrometheusMeterRegistry()), rsp); } From 18949acba4532ef1347d07fc31d4af249b31698f Mon Sep 17 00:00:00 2001 From: anghelutar Date: Fri, 8 Jan 2021 16:24:43 +0100 Subject: [PATCH 04/10] Typo: RegistryRegistraar => RegistryRegistrar --- ...egistryRegistraar.java => RegistryRegistrar.java} | 12 ++++++------ .../telemetry/solr/handler/MicrometerHandler.java | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) rename alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/monitoring/registry/{RegistryRegistraar.java => RegistryRegistrar.java} (93%) diff --git a/alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/monitoring/registry/RegistryRegistraar.java b/alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/monitoring/registry/RegistryRegistrar.java similarity index 93% rename from alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/monitoring/registry/RegistryRegistraar.java rename to alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/monitoring/registry/RegistryRegistrar.java index 3cbeacc3..3fb31b56 100644 --- a/alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/monitoring/registry/RegistryRegistraar.java +++ b/alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/monitoring/registry/RegistryRegistrar.java @@ -14,22 +14,22 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class RegistryRegistraar { - private static RegistryRegistraar registraar = null; +public class RegistryRegistrar { + private static RegistryRegistrar registraar = null; - private static final Logger logger = LoggerFactory.getLogger(RegistryRegistraar.class); + private static final Logger logger = LoggerFactory.getLogger(RegistryRegistrar.class); CompositeMeterRegistry globalMeterRegistry = Metrics.globalRegistry; PrometheusMeterRegistry prometheusMeterRegistry; GraphiteMeterRegistry graphiteMeterRegistry; - public static RegistryRegistraar getInstance() { + public static RegistryRegistrar getInstance() { if(registraar == null) - registraar = new RegistryRegistraar(); + registraar = new RegistryRegistrar(); return registraar; } - private RegistryRegistraar() { + private RegistryRegistrar() { // always register the Prometheus registry prometheusMeterRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT); prometheusMeterRegistry.config().commonTags(Tags.of("application", "solr")); diff --git a/alfred-telemetry-solr/alfred-telemetry-solr4/src/main/java/eu/xenit/alfred/telemetry/solr/handler/MicrometerHandler.java b/alfred-telemetry-solr/alfred-telemetry-solr4/src/main/java/eu/xenit/alfred/telemetry/solr/handler/MicrometerHandler.java index b22ec55a..b6dd1c5c 100644 --- a/alfred-telemetry-solr/alfred-telemetry-solr4/src/main/java/eu/xenit/alfred/telemetry/solr/handler/MicrometerHandler.java +++ b/alfred-telemetry-solr/alfred-telemetry-solr4/src/main/java/eu/xenit/alfred/telemetry/solr/handler/MicrometerHandler.java @@ -5,7 +5,7 @@ import eu.xenit.alfred.telemetry.solr.monitoring.binder.ProcessMetrics; import eu.xenit.alfred.telemetry.solr.monitoring.binder.SolrMetrics; import eu.xenit.alfred.telemetry.solr.monitoring.binder.SystemMetrics; -import eu.xenit.alfred.telemetry.solr.monitoring.registry.RegistryRegistraar; +import eu.xenit.alfred.telemetry.solr.monitoring.registry.RegistryRegistrar; import eu.xenit.alfred.telemetry.solr.util.PrometheusRegistryUtil; import eu.xenit.alfred.telemetry.solr.util.Util; import io.micrometer.core.instrument.MeterRegistry; @@ -21,7 +21,7 @@ public class MicrometerHandler extends RequestHandlerBase { - static MeterRegistry registry = RegistryRegistraar.getInstance().getGlobalMeterRegistry(); + static MeterRegistry registry = RegistryRegistrar.getInstance().getGlobalMeterRegistry(); static SolrMetrics solrMetrics = null; static MyTomcatMetrics tomcatMetrics = null; @@ -51,7 +51,7 @@ public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throw tomcatMetrics = new MyTomcatMetrics(mbeanServer); tomcatMetrics.bindTo(registry); } - writeTextToResponse(PrometheusRegistryUtil.extractPrometheusScrapeData(RegistryRegistraar.getInstance().getPrometheusMeterRegistry()), + writeTextToResponse(PrometheusRegistryUtil.extractPrometheusScrapeData(RegistryRegistrar.getInstance().getPrometheusMeterRegistry()), rsp); } From b9e0badf81267335c1f955df40c103fb7073c826 Mon Sep 17 00:00:00 2001 From: anghelutar Date: Fri, 8 Jan 2021 16:27:44 +0100 Subject: [PATCH 05/10] Metrics. --- .../alfred/telemetry/solr/util/Util.java | 8 +- .../alfred-telemetry-solr6/build.gradle | 2 + .../solr/handler/MicrometerHandler.java | 35 ++- .../resources/compose/docker-compose-solr.yml | 15 +- .../src/test/resources/solr6/jetty.xml | 219 ++++++++++++++++++ .../resources/solr6/solr-jetty-context.xml | 12 + 6 files changed, 262 insertions(+), 29 deletions(-) create mode 100644 integration-tests/src/test/resources/solr6/jetty.xml create mode 100644 integration-tests/src/test/resources/solr6/solr-jetty-context.xml diff --git a/alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/util/Util.java b/alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/util/Util.java index 9bacc774..68c23a6a 100644 --- a/alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/util/Util.java +++ b/alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/util/Util.java @@ -31,10 +31,10 @@ public static boolean isEnabled(String env) { return Boolean.parseBoolean(System.getenv(env)); } - // everything is enabled by default except graphite registry and tomcat metrics + // everything is enabled by default except graphite registry, tomcat and jetty metrics return ("ALFRED_TELEMETRY_EXPORT_GRAPHITE_ENABLED".equals(env)? - false: - ("METRICS_TOMCAT_ENABLED".equals(env) ? false:true)); - + false: + ("METRICS_TOMCAT_ENABLED".equals(env) ? false: + ("METRICS_JETTY_ENABLED".equals(env) ? false:true))); } } diff --git a/alfred-telemetry-solr/alfred-telemetry-solr6/build.gradle b/alfred-telemetry-solr/alfred-telemetry-solr6/build.gradle index 3d69c437..501d2fc0 100644 --- a/alfred-telemetry-solr/alfred-telemetry-solr6/build.gradle +++ b/alfred-telemetry-solr/alfred-telemetry-solr6/build.gradle @@ -21,5 +21,7 @@ createDockerFile { from "${solrBaseImage}" smartCopy "${rootProject.projectDir}/integration-tests/src/test/resources/${solrFlavor}/95-init-solr-micrometer-metrics.sh", "/docker-entrypoint.d/" smartCopy "${rootProject.projectDir}/integration-tests/src/test/resources/${solrFlavor}/solrconfig.xml", "/opt/alfresco-search-services/solrhome/templates/rerank/conf/solrconfig.xml" + smartCopy "${rootProject.projectDir}/integration-tests/src/test/resources/${solrFlavor}/jetty.xml", "/opt/alfresco-search-services/solr/server/etc/jetty.xml" + smartCopy "${rootProject.projectDir}/integration-tests/src/test/resources/${solrFlavor}/solr-jetty-context.xml", "/opt/alfresco-search-services/solr/server/contexts/solr-jetty-context.xml" smartCopy shadowJar.outputs.files, "/opt/alfresco-search-services/solrhome/lib/" } diff --git a/alfred-telemetry-solr/alfred-telemetry-solr6/src/main/java/eu/xenit/alfred/telemetry/solr/handler/MicrometerHandler.java b/alfred-telemetry-solr/alfred-telemetry-solr6/src/main/java/eu/xenit/alfred/telemetry/solr/handler/MicrometerHandler.java index 0fead3f9..78b48aa2 100644 --- a/alfred-telemetry-solr/alfred-telemetry-solr6/src/main/java/eu/xenit/alfred/telemetry/solr/handler/MicrometerHandler.java +++ b/alfred-telemetry-solr/alfred-telemetry-solr6/src/main/java/eu/xenit/alfred/telemetry/solr/handler/MicrometerHandler.java @@ -4,16 +4,19 @@ import eu.xenit.alfred.telemetry.solr.monitoring.binder.ProcessMetrics; import eu.xenit.alfred.telemetry.solr.monitoring.binder.SolrMetrics; import eu.xenit.alfred.telemetry.solr.monitoring.binder.SystemMetrics; -import eu.xenit.alfred.telemetry.solr.monitoring.registry.RegistryRegistraar; +import eu.xenit.alfred.telemetry.solr.monitoring.registry.RegistryRegistrar; import eu.xenit.alfred.telemetry.solr.util.PrometheusRegistryUtil; import eu.xenit.alfred.telemetry.solr.util.Util; import io.micrometer.core.instrument.MeterRegistry; -import io.micrometer.core.instrument.binder.jetty.TimedHandler; +import io.micrometer.core.instrument.Tags; +import io.micrometer.core.instrument.binder.jetty.JettyStatisticsMetrics; import org.alfresco.solr.AlfrescoCoreAdminHandler; import org.apache.solr.handler.RequestHandlerBase; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.response.SolrQueryResponse; import org.apache.solr.util.JmxUtil; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.handler.StatisticsHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,9 +25,9 @@ public class MicrometerHandler extends RequestHandlerBase { - static MeterRegistry registry = RegistryRegistraar.getInstance().getGlobalMeterRegistry(); + static MeterRegistry registry = RegistryRegistrar.getInstance().getGlobalMeterRegistry(); static SolrMetrics solrMetrics = null; - static TimedHandler jettyMetrics = null; + static JettyStatisticsMetrics jettyMetrics = null; static { if( Util.isEnabled("ALFRED_TELEMETRY_JVM_ENABLED")) @@ -44,30 +47,26 @@ public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throw .getMultiCoreHandler(); MBeanServer mbeanServer = JmxUtil.findFirstMBeanServer(); - if(jettyMetrics == null) { - // jettyMetrics = new TimedHandler(registry, Tags.empty()); - /*logger.error("class=" + req.getHttpSolrCall().getReq().getClass()); - Enumeration attributeNames = req.getHttpSolrCall().getReq().getAttributeNames(); - logger.error("attributes=" + attributeNames); - - Server server = (Server) req.getHttpSolrCall().getReq().getAttribute("org.eclipse.jetty.server.Server"); + if(jettyMetrics == null && Util.isEnabled("METRICS_JETTY_ENABLED")) { + Server server = (Server)req.getHttpSolrCall().getReq().getAttribute("org.eclipse.jetty.server.Server"); if(server==null) { logger.error("There is no jetty server"); - logger.error("attributes=" + req.getHttpSolrCall().getReq().getAttributeNames()); } else { - logger.error("server=" + server); StatisticsHandler statisticsHandler = (StatisticsHandler) server.getChildHandlerByClass(StatisticsHandler.class); - - jettyMetrics = new JettyStatisticsMetrics(statisticsHandler, null); - jettyMetrics.bindTo(registry); - }*/ + if(statisticsHandler==null) { + logger.error("There is no StatisticsHandler"); + } else{ + jettyMetrics = new JettyStatisticsMetrics(statisticsHandler, Tags.empty()); + jettyMetrics.bindTo(registry); + } + } } if (solrMetrics == null && Util.isEnabled("METRICS_SOLR_ENABLED")) { solrMetrics = new SolrMetrics(coreAdminHandler, mbeanServer); solrMetrics.bindTo(registry); } - writeTextToResponse(PrometheusRegistryUtil.extractPrometheusScrapeData(RegistryRegistraar.getInstance().getPrometheusMeterRegistry()), + writeTextToResponse(PrometheusRegistryUtil.extractPrometheusScrapeData(RegistryRegistrar.getInstance().getPrometheusMeterRegistry()), rsp); } diff --git a/integration-tests/src/test/resources/compose/docker-compose-solr.yml b/integration-tests/src/test/resources/compose/docker-compose-solr.yml index e704edb7..65b64a52 100644 --- a/integration-tests/src/test/resources/compose/docker-compose-solr.yml +++ b/integration-tests/src/test/resources/compose/docker-compose-solr.yml @@ -13,18 +13,19 @@ services: - SOLR_ENDPOINT - ALFRED_TELEMETRY_EXPORT_GRAPHITE_ENABLED - ALFRED_TELEMETRY_EXPORT_GRAPHITE_HOST - - METRICS_TOMCAT_ENABLED + - METRICS_TOMCAT_ENABLED=true + - METRICS_JETTY_ENABLED=true - DEBUG=true - JMX_ENABLED=true ports: - target: 8080 mode: host -# - target: 8000 -# mode: host -# published: 8001 -# - target: 5000 -# mode: host -# published: 5000 + - target: 8000 + mode: host + published: 8001 + - target: 5000 + mode: host + published: 5000 diff --git a/integration-tests/src/test/resources/solr6/jetty.xml b/integration-tests/src/test/resources/solr6/jetty.xml new file mode 100644 index 00000000..9b039a34 --- /dev/null +++ b/integration-tests/src/test/resources/solr6/jetty.xml @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + solr.jetty + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + https + + + + + + + + + + + + + + + + + true + false + requestedPath + + + + + ^/$ + /solr/ + + + + + + + /v2/* + /solr/____v2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + false + false + + + + + + + + + org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern + .*/servlet-api-[^/]*\.jar$ + + + + + + /contexts + 0 + + + + + + + + + + + + + + + + + + diff --git a/integration-tests/src/test/resources/solr6/solr-jetty-context.xml b/integration-tests/src/test/resources/solr6/solr-jetty-context.xml new file mode 100644 index 00000000..b8c3a06c --- /dev/null +++ b/integration-tests/src/test/resources/solr6/solr-jetty-context.xml @@ -0,0 +1,12 @@ + + + + + /solr-webapp/webapp + /etc/webdefault.xml + false + + + -org.eclipse.jetty.server. + + From ff693fa2d9927d34cbe3c3cf11a2821763d29d37 Mon Sep 17 00:00:00 2001 From: anghelutar Date: Fri, 8 Jan 2021 16:27:59 +0100 Subject: [PATCH 06/10] Jetty dashboard. --- .../prometheus/grafana/dashboards/Jetty.json | 766 ++++++++++++++++++ 1 file changed, 766 insertions(+) create mode 100644 integration-tests/src/test/resources/compose/prometheus/grafana/dashboards/Jetty.json diff --git a/integration-tests/src/test/resources/compose/prometheus/grafana/dashboards/Jetty.json b/integration-tests/src/test/resources/compose/prometheus/grafana/dashboards/Jetty.json new file mode 100644 index 00000000..3e2ed24e --- /dev/null +++ b/integration-tests/src/test/resources/compose/prometheus/grafana/dashboards/Jetty.json @@ -0,0 +1,766 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + }, + { + "datasource": "prometheus", + "enable": true, + "expr": "resets(process_uptime_seconds{application=\"$application\", region=\"$region\", instance=\"$instance\"}[1m]) > 0", + "hide": false, + "iconColor": "rgba(255, 96, 96, 1)", + "limit": 100, + "name": "Restart Detection", + "showIn": 0, + "step": "1m", + "tagKeys": "restart-tag", + "tags": [], + "textFormat": "uptime reset", + "titleFormat": "Restart", + "type": "tags" + } + ] + }, + "description": "Jetty Dashboard", + "editable": true, + "gnetId": 6090, + "graphTooltip": 1, + "iteration": 1610114111843, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 14, + "panels": [], + "title": "Requests", + "type": "row" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "prometheus", + "format": "s", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 0, + "y": 1 + }, + "id": 48, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "jetty_stats_seconds{application=\"$application\",instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": "", + "title": "Time stats have been collected for", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "prometheus", + "format": "s", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 4, + "y": 1 + }, + "id": 49, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "jetty_request_time_max_seconds{application=\"$application\",instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Maximum time spent handling requests", + "refId": "A" + } + ], + "thresholds": "", + "title": "Maximum time spent handling requests", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "prometheus", + "format": "s", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 8, + "y": 1 + }, + "id": 50, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "jetty_dispatched_time_max_seconds{application=\"$application\",instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Maximum time spent handling requests", + "refId": "A" + } + ], + "thresholds": "", + "title": "Maximum time spent in dispatch handling", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "fill": 1, + "gridPos": { + "h": 8, + "w": 7, + "x": 0, + "y": 5 + }, + "id": 42, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(jetty_requests_seconds_sum{application=\"$application\",instance=\"$instance\"}[3m])/rate(jetty_requests_seconds_count{application=\"$application\",instance=\"$instance\"}[3m])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Requests", + "refId": "A" + }, + { + "expr": "rate(jetty_dispatched_seconds_sum{application=\"$application\",instance=\"$instance\"}[3m])/rate(jetty_dispatched_seconds_count{application=\"$application\",instance=\"$instance\"}[3m])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Dispatches", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Duration (average 3 min)", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "fill": 1, + "gridPos": { + "h": 8, + "w": 8, + "x": 7, + "y": 5 + }, + "id": 46, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jetty_responses_size_bytes_total{application=\"$application\",instance=\"$instance\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Total number of bytes across all responses", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Size", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "fill": 1, + "gridPos": { + "h": 8, + "w": 7, + "x": 0, + "y": 13 + }, + "id": 43, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jetty_async_requests_total{application=\"$application\",instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Total number of async requests", + "refId": "A" + }, + { + "expr": "jetty_async_dispatches_total{application=\"$application\",instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Total number of requests that have been asynchronously dispatched", + "refId": "B" + }, + { + "expr": "jetty_async_expires_total{application=\"$application\",instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Total number of async requests that have expired", + "refId": "C" + }, + { + "expr": "jetty_async_requests_waiting{application=\"$application\",instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Currently waiting async requests", + "refId": "D" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Async requests", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "fill": 1, + "gridPos": { + "h": 8, + "w": 8, + "x": 7, + "y": 13 + }, + "id": 45, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jetty_requests_active{application=\"$application\",instance=\"$instance\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Number of requests currently active", + "refId": "A" + }, + { + "expr": "jetty_dispatched_active{application=\"$application\",instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Number of dispatches currently active", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Current requests", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": "5s", + "schemaVersion": 16, + "style": "dark", + "tags": [ + "prometheus", + "micrometer" + ], + "templating": { + "list": [ + { + "allValue": null, + "current": { + "text": "solr", + "value": "solr" + }, + "datasource": "prometheus", + "definition": "", + "hide": 0, + "includeAll": false, + "label": "Application", + "multi": false, + "name": "application", + "options": [], + "query": "label_values(application)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "text": "solr:8080", + "value": "solr:8080" + }, + "datasource": "prometheus", + "definition": "label_values(jetty_responses_total{application=\"solr\"},instance)", + "hide": 0, + "includeAll": true, + "label": "Instance", + "multi": false, + "name": "instance", + "options": [], + "query": "label_values(jetty_responses_total{application=\"solr\"},instance)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-5m", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "Jetty (Alfred Telemetry)", + "uid": "V1R4db7ik", + "version": 1208 +} \ No newline at end of file From 6fed81c8ec3c76d2937315f37b6285d10a4ec6c1 Mon Sep 17 00:00:00 2001 From: anghelutar Date: Fri, 8 Jan 2021 16:28:40 +0100 Subject: [PATCH 07/10] Remove tomcat panels from solr dashboard, they are in a separate dashboard. --- .../prometheus/grafana/dashboards/Solr.json | 1034 +---------------- 1 file changed, 14 insertions(+), 1020 deletions(-) diff --git a/integration-tests/src/test/resources/compose/prometheus/grafana/dashboards/Solr.json b/integration-tests/src/test/resources/compose/prometheus/grafana/dashboards/Solr.json index 745b84fe..3e7d73c6 100644 --- a/integration-tests/src/test/resources/compose/prometheus/grafana/dashboards/Solr.json +++ b/integration-tests/src/test/resources/compose/prometheus/grafana/dashboards/Solr.json @@ -30,7 +30,7 @@ "editable": true, "gnetId": 4701, "graphTooltip": 1, - "iteration": 1605868130601, + "iteration": 1610119350763, "links": [], "panels": [ { @@ -3816,1022 +3816,6 @@ ], "title": "Searcher stats", "type": "row" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 11 - }, - "id": 222, - "panels": [ - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus", - "fill": 1, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 12 - }, - "id": 224, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "tomcat_threads_config_max_threads{instance=\"$instance\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Max threads", - "refId": "A" - }, - { - "expr": "tomcat_threads_current_threads{instance=\"$instance\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Current threads", - "refId": "B" - }, - { - "expr": "tomcat_threads_busy_threads{instance=\"$instance\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Busy threads", - "refId": "C" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Threads", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus", - "fill": 1, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 12 - }, - "id": 226, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "tomcat_connections_config_max_connections{instance=\"$instance\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Max connections", - "refId": "A" - }, - { - "expr": "tomcat_connections_current_connections{instance=\"$instance\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Current connections", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Connections", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "title": "Tomcat threads", - "type": "row" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 12 - }, - "id": 244, - "panels": [], - "title": "Tomcat servlets", - "type": "row" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "prometheus", - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 0, - "y": 13 - }, - "id": 228, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(tomcat_servlet_error_total{instance=~\"$instance\"})", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Servlet total errors", - "refId": "A" - } - ], - "thresholds": "", - "title": "Total Errors", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus", - "fill": 1, - "gridPos": { - "h": 10, - "w": 18, - "x": 6, - "y": 13 - }, - "id": 232, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(tomcat_servlet_request_seconds_sum{instance=~\"$instance\"}[5m]) / rate(tomcat_servlet_request_seconds_count{instance=~\"$instance\"}[5m])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Response time", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Average Processing Time", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "prometheus", - "format": "s", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 0, - "y": 18 - }, - "id": 230, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "max(tomcat_servlet_request_max_seconds{instance=~\"$instance\"})", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Servlet request max seconds", - "refId": "A" - } - ], - "thresholds": "", - "title": "Max time", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 23 - }, - "id": 246, - "panels": [ - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus", - "fill": 1, - "gridPos": { - "h": 9, - "w": 24, - "x": 0, - "y": 14 - }, - "id": 234, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "tomcat_cache_access_total{instance=~\"$instance\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Cache total", - "refId": "A" - }, - { - "expr": "tomcat_cache_hit_total{instance=~\"$instance\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Cache hits", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Cache Hit / Total", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "title": "Tomcat cache", - "type": "row" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 24 - }, - "id": 248, - "panels": [ - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus", - "fill": 1, - "gridPos": { - "h": 9, - "w": 24, - "x": 0, - "y": 15 - }, - "id": 236, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(tomcat_global_sent_bytes_total{instance=~\"$instance\"}[5m])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Bytes sent", - "refId": "A" - }, - { - "expr": "rate(tomcat_global_received_bytes_total{instance=~\"$instance\"}[5m])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Bytes received", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Bytes Sent & Received/sec", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "decbytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "title": "Tomcat misc", - "type": "row" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 25 - }, - "id": 250, - "panels": [ - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "prometheus", - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 0, - "y": 16 - }, - "id": 238, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "Catalina_activeSessions{instance=\"$instance\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Active sessions", - "refId": "A" - } - ], - "thresholds": "", - "title": "Active", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "prometheus", - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 6, - "y": 16 - }, - "id": 240, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "Catalina_maxActiveSessions{instance=\"$instance\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Max Active Sessions", - "refId": "A" - } - ], - "thresholds": "", - "title": "Max Active", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "prometheus", - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 12, - "y": 16 - }, - "id": 241, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "Catalina_rejectedSessions{instance=\"$instance\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Rejected Sessions", - "refId": "A" - } - ], - "thresholds": "", - "title": "Rejected", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "prometheus", - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 18, - "y": 16 - }, - "id": 242, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "Catalina_expiredSessions{instance=\"$instance\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Expired Sessions", - "refId": "A" - } - ], - "thresholds": "", - "title": "Expired", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" - } - ], - "title": "Tomcat sessions", - "type": "row" } ], "refresh": "30s", @@ -4940,8 +3924,18 @@ }, { "selected": false, - "text": "Code Cache", - "value": "Code Cache" + "text": "CodeHeap 'non-nmethods'", + "value": "CodeHeap 'non-nmethods'" + }, + { + "selected": false, + "text": "CodeHeap 'non-profiled nmethods'", + "value": "CodeHeap 'non-profiled nmethods'" + }, + { + "selected": false, + "text": "CodeHeap 'profiled nmethods'", + "value": "CodeHeap 'profiled nmethods'" }, { "selected": false, @@ -5000,5 +3994,5 @@ "timezone": "browser", "title": "Solr (Alfred Telemetry)", "uid": "6BNY5GGZz", - "version": 2 + "version": 1 } \ No newline at end of file From d9c2cb8bee6f84d0bc7ed07851941ee716b9958e Mon Sep 17 00:00:00 2001 From: anghelutar Date: Mon, 11 Jan 2021 08:54:38 +0100 Subject: [PATCH 08/10] Comment out mappings ofdebug and jmx ports for solr. --- .../test/resources/compose/docker-compose-solr.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/integration-tests/src/test/resources/compose/docker-compose-solr.yml b/integration-tests/src/test/resources/compose/docker-compose-solr.yml index 65b64a52..efd6e38b 100644 --- a/integration-tests/src/test/resources/compose/docker-compose-solr.yml +++ b/integration-tests/src/test/resources/compose/docker-compose-solr.yml @@ -20,12 +20,12 @@ services: ports: - target: 8080 mode: host - - target: 8000 - mode: host - published: 8001 - - target: 5000 - mode: host - published: 5000 + # - target: 8000 + # mode: host + # published: 8001 + # - target: 5000 + # mode: host + # published: 5000 From d9df02162b9d6a56aaaa6603d181fa8b645fc84f Mon Sep 17 00:00:00 2001 From: anghelutar Date: Mon, 11 Jan 2021 10:09:21 +0100 Subject: [PATCH 09/10] README and Changelog. --- CHANGELOG.md | 6 ++++++ alfred-telemetry-solr/README.md | 33 ++++++++++++++++++++++++++++----- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87209a16..7fc68efa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,12 @@ Version template: ## [0.4.0] - UNRELEASED +### Added + +* Jetty metrics for alfred-telemetry-solr [#61] + +[#61]: https://github.com/xenit-eu/alfred-telemetry/pull/61 + ## [0.3.1] - 2020-12-11 ### Fixed diff --git a/alfred-telemetry-solr/README.md b/alfred-telemetry-solr/README.md index c5767bc1..810e4d02 100644 --- a/alfred-telemetry-solr/README.md +++ b/alfred-telemetry-solr/README.md @@ -4,7 +4,7 @@ supports numerous monitoring systems. This Solr extension offers: -* flexibility to setup and define custom metrics very easily. +* flexibility to setup and define custom metrics easily * a wide range of out of the box instrumentation @@ -15,7 +15,8 @@ At the moment Alfred Telemetry Solr extension auto-configures a CompositeRegistr * a [`PrometheusMeterRegistry`](https://micrometer.io/docs/registry/prometheus) * a [`GraphiteMeterRegistry`](https://micrometer.io/docs/registry/graphite) -The extension implements a MicrometerHandler which binds all available metrics to the global registry. For graphite the handler needs to be called once in the beginning, which is done via an init script added to the image. +The extension implements a MicrometerHandler which binds all available metrics to the global registry. +For graphite the handler needs to be called once in the beginning, which is done via an init script added to the image. In order to visualize correctly the output, a DummyResponseWriter is also provided, which simply displays verbatim the output of Prometheus scraping. @@ -28,8 +29,6 @@ See examples in integration tests. At the moment only Prometheus and Graphite are supported as monitoring systems. -For Graphite the library offered by micrometer conflicts with the library from inside solr6 and therefore replaces that one. - Disabling and configuring the graphite registry can be done via environment variables: | Variable | Default | @@ -110,10 +109,20 @@ At the moment following metrics are included: See metrics provided by TomcatMetrics [here](https://github.com/micrometer-metrics/micrometer/tree/master/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/tomcat). +## Jetty metrics + +Jetty metrics binding provides several jetty-related metrics. +At the moment following metrics are included: + +* JettyStatisticsMetrics + +See metrics provided by JettyStatisticsMetrics [here](https://github.com/micrometer-metrics/micrometer/tree/master/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jetty/JettyStatisticsMetrics.java). + +Note: JettyStatisticsMetrics has been deprecated in favor of TimedHandler, but that requires a newer version of jetty than the one shipped in solr artifacts. ## Custom metrics -Following custom metrics have been implemented. +Besides metrics offered by micrometer, following custom metrics have been implemented: ### Solr core stats metrics @@ -236,6 +245,20 @@ and the ResponseWriter: + +In case of solr6, add to jetty.xml loading of StatisticsHandler: + + + + + + + +and in solr-jetty-context.xml make sure server classes are available to the webapp: + + + -org.eclipse.jetty.server. + Restart solr. From 05e5b13fb3bf4636511d231e6addc6f3633ada4b Mon Sep 17 00:00:00 2001 From: anghelutar Date: Mon, 11 Jan 2021 11:03:10 +0100 Subject: [PATCH 10/10] Cosmetics. --- .../registry/RegistryRegistrar.java | 8 ++++---- .../alfred/telemetry/solr/util/Util.java | 19 +++++++++++-------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/monitoring/registry/RegistryRegistrar.java b/alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/monitoring/registry/RegistryRegistrar.java index 3fb31b56..8fcc068e 100644 --- a/alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/monitoring/registry/RegistryRegistrar.java +++ b/alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/monitoring/registry/RegistryRegistrar.java @@ -15,7 +15,7 @@ import org.slf4j.LoggerFactory; public class RegistryRegistrar { - private static RegistryRegistrar registraar = null; + private static RegistryRegistrar registrar = null; private static final Logger logger = LoggerFactory.getLogger(RegistryRegistrar.class); CompositeMeterRegistry globalMeterRegistry = Metrics.globalRegistry; @@ -24,9 +24,9 @@ public class RegistryRegistrar { public static RegistryRegistrar getInstance() { - if(registraar == null) - registraar = new RegistryRegistrar(); - return registraar; + if(registrar == null) + registrar = new RegistryRegistrar(); + return registrar; } private RegistryRegistrar() { diff --git a/alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/util/Util.java b/alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/util/Util.java index 68c23a6a..af9c32c4 100644 --- a/alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/util/Util.java +++ b/alfred-telemetry-solr/alfred-telemetry-solr-common/src/main/java/eu/xenit/alfred/telemetry/solr/util/Util.java @@ -1,11 +1,18 @@ package eu.xenit.alfred.telemetry.solr.util; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; public class Util { + // everything is enabled by default except graphite registry, tomcat and jetty metrics + private static final Set DEFAULT_DISABLED_CONFIGS; + static { + Set configs = new HashSet<>(); + configs.add("ALFRED_TELEMETRY_EXPORT_GRAPHITE_ENABLED"); + configs.add("METRICS_TOMCAT_ENABLED"); + configs.add("METRICS_JETTY_ENABLED"); + DEFAULT_DISABLED_CONFIGS = Collections.unmodifiableSet(configs); + } private Util() { // private ctor to hide implicit public one @@ -31,10 +38,6 @@ public static boolean isEnabled(String env) { return Boolean.parseBoolean(System.getenv(env)); } - // everything is enabled by default except graphite registry, tomcat and jetty metrics - return ("ALFRED_TELEMETRY_EXPORT_GRAPHITE_ENABLED".equals(env)? - false: - ("METRICS_TOMCAT_ENABLED".equals(env) ? false: - ("METRICS_JETTY_ENABLED".equals(env) ? false:true))); + return (DEFAULT_DISABLED_CONFIGS.contains(env)?false:true); } }