Giter VIP home page Giter VIP logo

xenit-eu / alfred-telemetry Goto Github PK

View Code? Open in Web Editor NEW
6.0 6.0 4.0 993 KB

Integrates Micrometer with various components of the Alfresco ecosystem, allowing export of metrics to numerous monitoring systems.

License: GNU Lesser General Public License v3.0

Java 98.72% FreeMarker 0.99% JavaScript 0.07% Shell 0.22%
alfresco alfresco-module micrometer solr solr-plugin alfresco-addon monitoring metrics

alfred-telemetry's Introduction

Alfred Telemetry

CI License: LGPL v3

Xenit Logo

Alfred Telemetry is a part of the Xenit Open Source Tooling around Alfresco. Xenit is company with a big expertise and a strong team around Alfresco. If you'd like to learn more about our tools, services and products, please visit our website.

Alfred Telemetry integrates various components of the Alfresco ecosystem with Micrometer , an application metrics facade that supports numerous monitoring systems.

Alfred Telemetry for Alfresco

Maven Central

alfred-telemetry-platform

Alfred Telemetry for Solr

Solr 4 Search Services

alfred-telemetry-solr

License

This project is licensed under the GNU Lesser General Public License v3.0 - see the LICENSE.txt file for details.

alfred-telemetry's People

Contributors

anghelutar avatar bartvl-xenit avatar hechmi-dammak-xenit avatar joostdecupere avatar kerkhofsd avatar tgeens avatar thijslemmens avatar todorinskiz avatar tomverschuerenxenit avatar verschuerentom avatar vierbergenlars avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

alfred-telemetry's Issues

Possibility to expose metrics in Dynamic Extensions bundles

Dynamic Extensions for Alfresco integrates an OSGI container into Alfresco. Extensions build on top of this framework have their own Spring context, which is a child of the main Alfresco context. Furthermore DE bundles can be hot-deployed.

In Alfred Telemetry, the MeterBinderRegistrar bean scans the Spring context for relevant beans and registers them. (E.g. MeterBinder implementations.) Since Alfred Telemetry scans the main Alfresco context, any beans in the Dynamic Extensions extension won't be processed. Therefore the "auto-configure" functionalities of Alfred Telemetry won't be available for Dynamic Extension bundles.
Furthermore, the hot-deploy functionality is a concern as well. What happens to meter references if a bundle is re-deployed?

Side note: what is possible in DE bundles at this point, is injecting the MeterRegistry to register and maintain metrics manually.

Is it possible to improve support to expose metrics in Dynamic Extensions bundles?

Alfresco 6.1.1: unable to start if OOTB Alfresco metrics are disabled

Steps to reproduce:
Start an Alfresco 6.1.1 with Alfred Telemetry installed

Expected behavior:
It works like a charm

Actual behavior:
Alfresco fails to start. Stacktrace:

 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'alfred-telemetry.MeterBinderRegistrar' defined in class path resource [alfresco/module/alfred-telemetry-platform/context/binder-context.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1778)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:845)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
	at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:400)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:291)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103)
	at org.alfresco.web.app.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:70)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4701)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5167)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:743)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:719)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
	at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1125)
	at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1859)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.NullPointerException
	at io.micrometer.core.instrument.Gauge$Builder.register(Gauge.java:147)
	at io.micrometer.core.instrument.composite.CompositeGauge.registerNewMeter(CompositeGauge.java:58)
	at io.micrometer.core.instrument.composite.CompositeGauge.registerNewMeter(CompositeGauge.java:27)
	at io.micrometer.core.instrument.composite.AbstractCompositeMeter.add(AbstractCompositeMeter.java:66)
	at java.base/java.lang.Iterable.forEach(Iterable.java:75)
	at java.base/java.util.Collections$SetFromMap.forEach(Collections.java:5581)
	at io.micrometer.core.instrument.composite.CompositeMeterRegistry.lambda$null$0(CompositeMeterRegistry.java:59)
	at io.micrometer.core.instrument.composite.CompositeMeterRegistry.lock(CompositeMeterRegistry.java:176)
	at io.micrometer.core.instrument.composite.CompositeMeterRegistry.lambda$new$1(CompositeMeterRegistry.java:59)
	at io.micrometer.core.instrument.MeterRegistry.getOrCreateMeter(MeterRegistry.java:569)
	at io.micrometer.core.instrument.MeterRegistry.registerMeterIfNecessary(MeterRegistry.java:528)
	at io.micrometer.core.instrument.MeterRegistry.registerMeterIfNecessary(MeterRegistry.java:514)
	at io.micrometer.core.instrument.MeterRegistry.gauge(MeterRegistry.java:244)
	at io.micrometer.core.instrument.Gauge$Builder.register(Gauge.java:147)
	at io.micrometer.core.instrument.binder.jvm.JvmGcMetrics.bindTo(JvmGcMetrics.java:110)
	at eu.xenit.alfred.telemetry.binder.JvmMetrics.bindTo(JvmMetrics.java:15)
	at eu.xenit.alfred.telemetry.binder.MeterBinderRegistrar.lambda$addBinders$0(MeterBinderRegistrar.java:57)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
	at eu.xenit.alfred.telemetry.binder.MeterBinderRegistrar.addBinders(MeterBinderRegistrar.java:56)
	at eu.xenit.alfred.telemetry.binder.MeterBinderRegistrar.afterPropertiesSet(MeterBinderRegistrar.java:49)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1837)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774)
	... 26 more

Alfresco integration can be confusing

Since Alfresco Enterprise Edition 6.1, Alfresco records metrics using a Micrometer PrometheusMeterRegistry

As you can see in the docs, Alfred Telemetry integrates with this out of the box Alfresco metrics:
https://github.com/xenit-eu/alfred-telemetry/tree/master/alfred-telemetry-platform/docs#alfred-telemetry-alfresco-integration
Due to this integration, it is possible to 1) expose Alfresco metrics to monitoring systems configured in Alfred Telemetry and 2) expose Alfred Telemetry metrics in the default Alfresco Prometheus endpoint.

However in practice the integration can be quite confusing for administrators.
Should we entirely remove the integration of Alfred Telemetry with OOTB (Out Of The Box) Alfresco Micrometer metrics?

Prometheus scraping: max number of requests reached during Alfresco startup

Follows PR #100 (issue #70)
Relates to Alfred Telemetry Platform

In PR #100 we introduced a semaphore to limit the number of concurrent requests to the /prometheus endpoint, with a default of maximum one concurrent requests.

During ACS startup, Prometheus requests are not immediately processed and stack up. Because we allow a maximum of one request by default, we see following error message in the logs:

2021-06-09 12:01:20,344  ERROR [extensions.webscripts.AbstractRuntime] [http-nio-8080-exec-24] Exception from executeScript: 05090018 Max number of active requests (1) reached
org.springframework.extensions.webscripts.WebScriptException: 05090018 Max number of active requests (1) reached
        at eu.xenit.alfred.telemetry.webscripts.PrometheusWebScript.execute(PrometheusWebScript.java:44)

Possible solutions:

  • Increase the default number of maximum allowed concurrent /prometheus requests

AEE multiple versions of Micrometer on the classpath can cause troubles

[Relates to #20]

AS-IS:

  • Alfred Telemetry ships with e specific version of Micrometer (1.0.6 at the moment of this writing)
  • Alfresco Enterprise Edition >= 6.1 includes a version of Micrometer as well

If there are incompatible changes between those two Micrometer versions, this might cause issues.

  • A specific example: when starting AEE 6.2.2 with Alfred Telemetry 0.5.0 installed, we observer following error:

    Caused by: java.lang.NoSuchMethodError: 'io.micrometer.core.instrument.MeterRegistry$Config 
    io.micrometer.core.instrument.MeterRegistry$Config.onMeterRemoved(java.util.function.Consumer)'
    

    In this particular case, the out of box Alfresco metrics fail to start because of an incompatibility with the Micrometer version
    that is actually used in the classpath. In this particular example we can disable Alfresco out of the box metrics as a
    workaround (metrics.enabled=false). Please note that Alfred Telemetry metrics will still be initialized and available.

  • Another example is #20.
    In that case, Alfred Telemetry failed to start because we were using Micrometer API that was removed in the version shipped with Alfresco. We worked around the problem by refactoring / removing usage of the missing Micrometer API.

To conclude, the main problem here is that the behavior of the out of box Alfresco (enterprise) metrics and Alfred Telemetry is nondeterministic since it might depend on the Micrometer version that is actually used by the classloader. As long as both Alfresco and Alfred Telemetry put different versions on the classpath, there might be incompatibilities and problems in either Alfresco OOTB metrics or Alfred Telemetry metrics.

Error creating bean with name 'eu.xenit.alfred.telemetry.binder.solr.sharding.SolrShardingMetrics'

When I clicked on revert for the mbean "Alfresco:Category=Search,Type=Configuration,id1=managed,id2=solr4" on the Alfresco admin-console, jmx settings, it generates an HTTP 500 with the following exception:

10050214 Wrapped Exception (with status template): 10055569 Failed to execute script 'classpath*:alfresco/enterprise/webscripts/org/alfresco/enterprise/repository/admin/support-tools/admin-jmx-settings.post.js': java.lang.RuntimeException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'eu.xenit.alfred.telemetry.binder.solr.sharding.SolrShardingMetrics': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [eu.xenit.alfred.telemetry.binder.solr.sharding.SolrShardingMetricsFactory]: Constructor threw exception; nested exception is org.quartz.ObjectAlreadyExistsException: Unable to store Job : 'DEFAULT.SolrShardingMetricsJob', because one already exists with this identification.

Missing labels on metrics after restarting alfresco

Happening on Alfred telemetry version 0.1.1

When restarting Alfresco the Alfred telemetry metrics who are being scraped by Prometheus are sometimes missing the default micrometer labels:

  • application
  • host

I have to restart Alfresco multiple times before the metrics again have the correct labels.

In the screenshot below you see an example of multiple Alfresco restart and therefore metrics with missing labels (the time serie in green).

missing-labels-on-alfred-telemetry-metrics

Re-integrate Alfresco Tomcat Servlet Metrics

It will be beneficial to use the provided servlet metrics from Alfresco Content Services Enterprise.
To do that, we need to fix this: https://github.com/xenit-eu/alfred-telemetry/blob/master/alfred-telemetry-platform/docs/README.md#known-limitations

2019-05-02 15:08:21,829 WARN [app.servlet.ServletMetricsFilter] [localhost-startStop-1] Could not initialize the application server metrics reporter: io.micrometer.core.instrument.composite.CompositeMeterRegistry cannot be cast to io.micrometer.prometheus.PrometheusMeterRegistry java.lang.ClassCastException: io.micrometer.core.instrument.composite.CompositeMeterRegistry cannot be cast to io.micrometer.prometheus.PrometheusMeterRegistry at org.alfresco.web.app.servlet.ServletMetricsFilter.initServletMetrics(ServletMetricsFilter.java:129)

Sharding metrics

Currently sharding metrics are enabled by default. This is not the case in most setups and - depending on configuration - Alfresco's logs might be polluted with errors.

Caused by: java.lang.NoSuchMethodError: 'java.util.HashMap org.alfresco.repo.index.shard.ShardRegistry.getFlocs()'

Proposal: by default have the sharding metrics disabled:

alfred.telemetry.binder.solr.sharding.cronexpression=0/10 * * * * ? 2099
alfred.telemetry.binder.solr.sharding.enabled=false
alfred.telemetry.binder.solr.sharding.floc.id.enabled=false

Instrument RetryingTransactionHelper

RetryingTransactionHelper can be used to hide many underlying concurrency issues.
We would like to instrument it to get more insights on:

  • How long does a transaction take
  • How many transactions failed
  • How many transactions were retried (would be hard to sniff out)
  • How many exceptions of each type were thrown (only the last exception is available, would be hard to sniff out all of the thrown exceptions)

https://github.com/Alfresco/alfresco-repository/blob/master/src/main/java/org/alfresco/repo/transaction/RetryingTransactionHelper.java

Switching solr subsystem from the admin console fails because of duplicate quartz job name

Environment

  • Alfred Telemetry 0.7.1
  • Alfresco Enterprise 6.2.1

Steps to reproduce

  1. Install Alfred Telemetry in a standard Alfresco Enterprise war
  2. Start up Alfresco
  3. Navigate to admin console, select Search Services and switch Search service in use to a different value. Click save

Expected behavior

  1. Changes to search subsystem are saved and the selected subsystem is started. The other subsystem is shut down.
  2. Metrics are now only collected from the new subsystem, gathering metrics from the old subsystem is shut down.

Actual behavior

Tomcat HTTP 400 error page, changes made are NOT saved.
This error page is due to a redirect by the admin page that contains the "message" in the URL.

The actual error, from the logs is:

2021-09-10 13:18:20,244  INFO  [management.subsystems.ChildApplicationContextFactory] [http-nio-8080-exec-4] Starting 'Search' subsystem, ID: [Search, managed, solr6]
2021-09-10 13:18:20,767  INFO  [binder.solr.SolrMetricsBeanPostProcessor] [http-nio-8080-exec-4] Registered SolrTrackingMetrics bean
2021-09-10 13:18:20,769  INFO  [binder.solr.SolrMetricsBeanPostProcessor] [http-nio-8080-exec-4] Registered SolrShardingMetricsFactory bean
2021-09-10 13:18:21,660  INFO  [solr.tracking.SolrTrackingMetrics] [http-nio-8080-exec-4] Registering Solr metrics
2021-09-10 13:18:21,679  INFO  [management.subsystems.ChildApplicationContextFactory] [http-nio-8080-exec-4] Startup of 'Search' subsystem, ID: [Search, managed, solr6] complete
Debugger failed to attach: handshake failed - connection prematurally closed
2021-09-10 13:19:33,267  INFO  [management.subsystems.ChildApplicationContextFactory] [http-nio-8080-exec-9] Starting 'Search' subsystem, ID: [Search, managed, noindex]
2021-09-10 13:19:33,351  INFO  [binder.solr.SolrMetricsBeanPostProcessor] [http-nio-8080-exec-9] Registered SolrTrackingMetrics bean
2021-09-10 13:19:33,352  INFO  [binder.solr.SolrMetricsBeanPostProcessor] [http-nio-8080-exec-9] Registered SolrShardingMetricsFactory bean
2021-09-10 13:19:33,386  INFO  [solr.tracking.SolrTrackingMetrics] [http-nio-8080-exec-9] Registering Solr metrics
2021-09-10 13:19:33,389  WARN  [management.subsystems.ChildApplicationContextFactory$ChildApplicationContext] [http-nio-8080-exec-9] Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'eu.xenit.alfred.telemetry.binder.solr.sharding.SolrShardingMetrics': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [eu.xenit.alfred.telemetry.binder.solr.sharding.SolrShardingMetricsFactory]: Constructor threw exception; nested exception is org.quartz.ObjectAlreadyExistsException: Unable to store Job : 'DEFAULT.SolrShardingMetricsJob', because one already exists with this identification.
2021-09-10 13:19:33,391  WARN  [management.subsystems.ChildApplicationContextFactory] [http-nio-8080-exec-9] Startup of 'Search' subsystem, ID: [Search, managed, noindex] failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'eu.xenit.alfred.telemetry.binder.solr.sharding.SolrShardingMetrics': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [eu.xenit.alfred.telemetry.binder.solr.sharding.SolrShardingMetricsFactory]: Constructor threw exception; nested exception is org.quartz.ObjectAlreadyExistsException: Unable to store Job : 'DEFAULT.SolrShardingMetricsJob', because one already exists with this identification.
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:304)
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:285)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1340)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1186)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:860)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
	at org.alfresco.repo.management.subsystems.ChildApplicationContextFactory$ApplicationContextState.start(ChildApplicationContextFactory.java:824)
	at org.alfresco.repo.management.subsystems.AbstractPropertyBackedBean.start(AbstractPropertyBackedBean.java:1098)
	at org.alfresco.repo.management.subsystems.AbstractPropertyBackedBean.setPropertiesInternal(AbstractPropertyBackedBean.java:748)
	at org.alfresco.repo.management.subsystems.AbstractPropertyBackedBean.setProperties(AbstractPropertyBackedBean.java:903)
	at org.alfresco.enterprise.repo.management.subsystems.PropertyBackedBeanAdapter$5.execute(PropertyBackedBeanAdapter.java:585)
	at org.alfresco.enterprise.repo.management.subsystems.PropertyBackedBeanAdapter$5.execute(PropertyBackedBeanAdapter.java:550)
	at org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransaction(RetryingTransactionHelper.java:450)
	at org.alfresco.enterprise.repo.management.MBeanSupport$2.doWork(MBeanSupport.java:120)
	at org.alfresco.repo.security.authentication.AuthenticationUtil.runAs(AuthenticationUtil.java:602)
	at org.alfresco.enterprise.repo.management.MBeanSupport.doWork(MBeanSupport.java:108)
	at org.alfresco.enterprise.repo.management.subsystems.PropertyBackedBeanAdapter.setAttributes(PropertyBackedBeanAdapter.java:549)
	at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.setAttributes(DefaultMBeanServerInterceptor.java:792)
	at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.setAttributes(JmxMBeanServer.java:768)
	at org.alfresco.enterprise.repo.management.script.ScriptMBean.saveImpl(ScriptMBean.java:210)
	at org.alfresco.enterprise.repo.management.script.JmxScriptImpl.save(JmxScriptImpl.java:108)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at net.sf.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:80)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
	at com.sun.proxy.$Proxy184.save(Unknown Source)
	at org.alfresco.enterprise.repo.management.script.JmxScriptProcessorExtension.save(JmxScriptProcessorExtension.java:45)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.mozilla.javascript.MemberBox.invoke(MemberBox.java:138)
	at org.mozilla.javascript.NativeJavaMethod.call(NativeJavaMethod.java:226)
	at org.mozilla.javascript.optimizer.OptRuntime.call1(OptRuntime.java:45)
	at org.mozilla.javascript.gen.classpath__alfresco_enterprise_webscripts_org_alfresco_enterprise_repository_admin_repository_services_admin_searchservice_post_js_2._c_main_17(classpath*:alfresco/enterprise/webscripts/org/alfresco/enterprise/repository/admin/repository-services/admin-searchservice.post.js:509)
	at org.mozilla.javascript.gen.classpath__alfresco_enterprise_webscripts_org_alfresco_enterprise_repository_admin_repository_services_admin_searchservice_post_js_2.call(classpath*:alfresco/enterprise/webscripts/org/alfresco/enterprise/repository/admin/repository-services/admin-searchservice.post.js)
	at org.mozilla.javascript.optimizer.OptRuntime.callName0(OptRuntime.java:87)
	at org.mozilla.javascript.gen.classpath__alfresco_enterprise_webscripts_org_alfresco_enterprise_repository_admin_repository_services_admin_searchservice_post_js_2._c_script_0(classpath*:alfresco/enterprise/webscripts/org/alfresco/enterprise/repository/admin/repository-services/admin-searchservice.post.js:525)
	at org.mozilla.javascript.gen.classpath__alfresco_enterprise_webscripts_org_alfresco_enterprise_repository_admin_repository_services_admin_searchservice_post_js_2.call(classpath*:alfresco/enterprise/webscripts/org/alfresco/enterprise/repository/admin/repository-services/admin-searchservice.post.js)
	at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:412)
	at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3545)
	at org.mozilla.javascript.gen.classpath__alfresco_enterprise_webscripts_org_alfresco_enterprise_repository_admin_repository_services_admin_searchservice_post_js_2.call(classpath*:alfresco/enterprise/webscripts/org/alfresco/enterprise/repository/admin/repository-services/admin-searchservice.post.js)
	at org.mozilla.javascript.gen.classpath__alfresco_enterprise_webscripts_org_alfresco_enterprise_repository_admin_repository_services_admin_searchservice_post_js_2.exec(classpath*:alfresco/enterprise/webscripts/org/alfresco/enterprise/repository/admin/repository-services/admin-searchservice.post.js)
	at org.alfresco.repo.jscript.RhinoScriptProcessor.executeScriptImpl(RhinoScriptProcessor.java:513)
	at org.alfresco.repo.jscript.RhinoScriptProcessor.execute(RhinoScriptProcessor.java:210)
	at org.alfresco.repo.processor.ScriptServiceImpl.execute(ScriptServiceImpl.java:219)
	at org.alfresco.repo.processor.ScriptServiceImpl.executeScript(ScriptServiceImpl.java:181)
	at org.alfresco.repo.web.scripts.RepositoryScriptProcessor.executeScript(RepositoryScriptProcessor.java:109)
	at org.springframework.extensions.webscripts.AbstractWebScript.executeScript(AbstractWebScript.java:1376)
	at org.springframework.extensions.webscripts.DeclarativeWebScript.execute(DeclarativeWebScript.java:86)
	at org.alfresco.repo.web.scripts.RepositoryContainer$3.execute(RepositoryContainer.java:527)
	at org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransaction(RetryingTransactionHelper.java:450)
	at org.alfresco.repo.web.scripts.RepositoryContainer.transactionedExecute(RepositoryContainer.java:595)
	at org.alfresco.repo.web.scripts.RepositoryContainer.transactionedExecuteAs(RepositoryContainer.java:664)
	at org.alfresco.repo.web.scripts.RepositoryContainer.executeScriptInternal(RepositoryContainer.java:435)
	at org.alfresco.repo.web.scripts.RepositoryContainer.executeScript(RepositoryContainer.java:315)
	at org.springframework.extensions.webscripts.AbstractRuntime.executeScript(AbstractRuntime.java:399)
	at org.springframework.extensions.webscripts.AbstractRuntime.executeScript(AbstractRuntime.java:210)
	at org.springframework.extensions.webscripts.servlet.WebScriptServlet.service(WebScriptServlet.java:132)
	at org.alfresco.repo.web.scripts.AlfrescoWebScriptServlet.service(AlfrescoWebScriptServlet.java:43)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.alfresco.web.app.servlet.ServletMetricsFilter.doFilter(ServletMetricsFilter.java:161)
	at org.alfresco.repo.web.filter.beans.BeanProxyFilter.doFilter(BeanProxyFilter.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.extensions.webscripts.servlet.CSRFFilter.doFilter(CSRFFilter.java:349)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.alfresco.web.app.servlet.GlobalLocalizationFilter.doFilter(GlobalLocalizationFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.alfresco.web.app.servlet.ClearSecurityContextFilter.doFilter(ClearSecurityContextFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:544)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
	at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:747)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:616)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:818)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1626)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [eu.xenit.alfred.telemetry.binder.solr.sharding.SolrShardingMetricsFactory]: Constructor threw exception; nested exception is org.quartz.ObjectAlreadyExistsException: Unable to store Job : 'DEFAULT.SolrShardingMetricsJob', because one already exists with this identification.
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:184)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:117)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:300)
	... 109 more
Caused by: org.quartz.ObjectAlreadyExistsException: Unable to store Job : 'DEFAULT.SolrShardingMetricsJob', because one already exists with this identification.
	at org.quartz.simpl.RAMJobStore.storeJob(RAMJobStore.java:279)
	at org.quartz.simpl.RAMJobStore.storeJobAndTrigger(RAMJobStore.java:251)
	at org.quartz.core.QuartzScheduler.scheduleJob(QuartzScheduler.java:855)
	at org.quartz.impl.StdScheduler.scheduleJob(StdScheduler.java:249)
	at eu.xenit.alfred.telemetry.binder.solr.sharding.SolrShardingMetricsFactory.<init>(SolrShardingMetricsFactory.java:35)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:172)
	... 111 more

Prevent Alfred Telemetry Prometheus endpoint threads from stacking up

A client had an issue where fetching some metrics was getting very slow, slower then the scraping frequency of Prometheus. After a while the http threads where being exausted.

Possible solution: Wrap the the fetching of metrics in a separate thread that gets killed when taking too long, returning an error message.

Option to define prefix/namespace for metrics when using Prometheus

There doesn't seem to be an way to define a prefix/namespace for the Alfred Telemetry metrics when using Prometheus?

This option would make it easier to identify the metrics provided by Alfred Telemetry (for Alfresco) in Prometheus.

e.g. to use "alfresco.jdbc.connection.count" instead of "jdbc.connections.count"

see also the Prometheus docs naming practices:

A metric name...
...should have a (single-word) application prefix relevant to the domain the metric belongs to. The prefix is sometimes referred to as namespace by client libraries. For metrics specific to an application, the prefix is usually the application name itself.

Prometheus endpoint raises ERROR when caching metrics enabled

Alfresco EE 5.2.1
Alfred Telemetry 0.5.2

2021-07-09 08:37:29,691 ERROR [org.springframework.extensions.webscripts.AbstractRuntime] [tomcat-exec-36] Exception from executeScript: com.hazelcast.monitor.LocalMapStats.getPutOperationCount()J

java.lang.NoSuchMethodError: com.hazelcast.monitor.LocalMapStats.getPutOperationCount()J

    at eu.xenit.alfred.telemetry.binder.cache.Hazelcast2CacheMetrics.putCount(Hazelcast2CacheMetrics.java:100)

    at io.micrometer.core.instrument.binder.cache.CacheMeterBinder.lambda$bindTo$3(CacheMeterBinder.java:77)

    at io.micrometer.core.instrument.cumulative.CumulativeFunctionCounter.count(CumulativeFunctionCounter.java:39)

    at io.micrometer.prometheus.PrometheusMeterRegistry.lambda$newFunctionCounter$6(PrometheusMeterRegistry.java:271)

    at io.micrometer.prometheus.MicrometerCollector.lambda$collect$0(MicrometerCollector.java:81)

    at java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:267)

    at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)

    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)

    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)

    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)

    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)

    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)

    at io.micrometer.prometheus.MicrometerCollector.collect(MicrometerCollector.java:82)

    at io.prometheus.client.CollectorRegistry$MetricFamilySamplesEnumeration.findNextElement(CollectorRegistry.java:183)

    at io.prometheus.client.CollectorRegistry$MetricFamilySamplesEnumeration.nextElement(CollectorRegistry.java:216)

   at io.prometheus.client.CollectorRegistry$MetricFamilySamplesEnumeration.nextElement(CollectorRegistry.java:137)

    at io.prometheus.client.exporter.common.TextFormat.write004(TextFormat.java:22)

    at io.micrometer.prometheus.PrometheusMeterRegistry.scrape(PrometheusMeterRegistry.java:75)

    at eu.xenit.alfred.telemetry.util.PrometheusRegistryUtil.extractPrometheusScrapeData(PrometheusRegistryUtil.java:31)

    at eu.xenit.alfred.telemetry.webscripts.PrometheusWebScript.executeInternal(PrometheusWebScript.java:56)

    at eu.xenit.alfred.telemetry.webscripts.PrometheusWebScript.execute(PrometheusWebScript.java:48)

    at org.alfresco.repo.web.scripts.RepositoryContainer.transactionedExecute(RepositoryContainer.java:467)

    at org.alfresco.repo.web.scripts.RepositoryContainer.transactionedExecuteAs(RepositoryContainer.java:656)

    at org.alfresco.repo.web.scripts.RepositoryContainer.executeScriptInternal(RepositoryContainer.java:355)

    at org.alfresco.repo.web.scripts.RepositoryContainer.executeScript(RepositoryContainer.java:308)

    at org.springframework.extensions.webscripts.AbstractRuntime.executeScript(AbstractRuntime.java:399)

    at org.springframework.extensions.webscripts.AbstractRuntime.executeScript(AbstractRuntime.java:210)

    at org.springframework.extensions.webscripts.servlet.WebScriptServlet.service(WebScriptServlet.java:132)

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)

    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)

    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)

    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

    at org.alfresco.module.aosmodule.service.ContextRootFilter.doFilter(ContextRootFilter.java:93)

    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)

    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

    at org.alfresco.web.app.servlet.GlobalLocalizationFilter.doFilter(GlobalLocalizationFilter.java:68)

    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)

    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)

    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)

    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)

    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)

    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)

    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)

    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)

    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1087)

    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)

    at org.apache.tomcat.util.net.AprEndpoint$SocketWithOptionsProcessor.run(AprEndpoint.java:2486)

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

    at java.lang.Thread.run(Thread.java:748)

Job DEFAULT.SolrShardingMetricsJob threw an exception

2020-11-04 10:59:54,098 ERROR [quartz.core.ErrorLogger] [DefaultScheduler_Worker-4] Job (DEFAULT.SolrShardingMetricsJob threw an exception. org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: java.util.NoSuchElementException: No value present] at org.quartz.core.JobRunShell.run(JobRunShell.java:213) at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) Caused by: java.util.NoSuchElementException: No value present at java.base/java.util.Optional.get(Optional.java:148) at eu.xenit.alfred.telemetry.binder.solr.sharding.SolrShardingMetricsContainer.getShardState(SolrShardingMetricsContainer.java:56) at eu.xenit.alfred.telemetry.binder.solr.sharding.SolrShardingMetrics.lambda$updateMetrics$2(SolrShardingMetrics.java:53) at java.base/java.lang.Iterable.forEach(Iterable.java:75) at eu.xenit.alfred.telemetry.binder.solr.sharding.SolrShardingMetrics.lambda$updateMetrics$3(SolrShardingMetrics.java:51) at java.base/java.util.HashMap$KeySet.forEach(HashMap.java:928) at eu.xenit.alfred.telemetry.binder.solr.sharding.SolrShardingMetrics.lambda$updateMetrics$4(SolrShardingMetrics.java:44) at java.base/java.util.HashMap$KeySet.forEach(HashMap.java:928) at eu.xenit.alfred.telemetry.binder.solr.sharding.SolrShardingMetrics.updateMetrics(SolrShardingMetrics.java:38) at eu.xenit.alfred.telemetry.binder.solr.sharding.SolrShardingMetricsScheduledJob.lambda$executeInternal$0(SolrShardingMetricsScheduledJob.java:27) at org.alfresco.repo.security.authentication.AuthenticationUtil.runAs(AuthenticationUtil.java:602) at eu.xenit.alfred.telemetry.binder.solr.sharding.SolrShardingMetricsScheduledJob.executeInternal(SolrShardingMetricsScheduledJob.java:26) at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:75) at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ... 1 more

Alfred telemetry solr not working when (at least) one tracker is disabled

Alfresco 6.2.1 support

Alfred Telemetry currently doesn't work Alfresco EE 6.2.1.

Root cause:
Alfresco has upgraded the versions of the Micrometer libraries. This version (1.3.5) has incompatible API changes in comparison with the version used in Alfred Telemetry (1.0.6).

root@7f786aefcb61:/usr/local/tomcat/webapps/alfresco/WEB-INF/lib# ll | grep micro  
-rw-r--r-- 1 root root   353551 Apr 21 17:46 micrometer-core-1.0.6.jar
-rw-r--r-- 1 root root   473522 May 12 11:39 micrometer-core-1.3.5.jar
-rw-r--r-- 1 root root    16832 May 25 15:16 micrometer-jvm-extras-0.1.2.jar
-rw-r--r-- 1 root root     9561 May 25 15:16 micrometer-registry-graphite-1.0.6.jar
-rw-r--r-- 1 root root     3685 May 25 15:16 micrometer-registry-jmx-1.0.6.jar
-rw-r--r-- 1 root root    24735 May 25 15:16 micrometer-registry-prometheus-1.0.6.jar
-rw-r--r-- 1 root root    25865 May 12 11:39 micrometer-registry-prometheus-1.3.5.jar

Stacktrace (one of the many):

[ALFRESCO] 2020-05-27 06:43:50,612  ERROR [web.context.ContextLoader] [localhost-startStop-1] Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'alfred-telemetry.Care4AlfMeterBinderRegistrar' defined in class path resource [alfresco/module/alfred-telemetry-platform/context/binder-context.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: 'void io.micrometer.core.instrument.Meter$Id.<init>(java.lang.String, java.lang.Iterable, java.lang.String, java.lang.String, io.micrometer.core.instrument.Meter$Type)'

Graphite does not work in Alfresco Docker Image

Graphite does not work with Alfred-Telemetery in an Alfresco Docker Image if you follow the docs. To make it work you have to add the following line in your build.gradle. This isn't documented in the docs. I'll link a pull request which adds this documentation.

alfrescoSM "io.micrometer:micrometer-registry-graphite:${last-version}"

First call to Solr Telemetry endpoint is returning a 500

This makes an integration test fail:
https://github.com/xenit-eu/docker-solr/actions/runs/3756466995/jobs/6382571361

Calling this endpoint:
/solr/alfresco/metrics?wt=dummy

I can reproduce this locally and then I get this stacktrace:
2022-12-22 09:52:13.472 ERROR (qtp2035616217-25) [ x:alfresco] o.a.s.s.HttpSolrCall null:java.lang.ClassCastException: class org.alfresco.solr.handler.AlfrescoReplicationHandler cannot be cast to class org.apache.solr.handler.ReplicationHandler (org.alfresco.solr.handler.AlfrescoReplicationHandler and org.apache.solr.handler.ReplicationHandler are in unnamed module of loader org.eclipse.jetty.webapp.WebAppClassLoader @4426bff1)
at eu.xenit.alfred.telemetry.solr.monitoring.binder.SolrSnapshootMetrics.registerSnapshootMetrics(SolrSnapshootMetrics.java:41)
at eu.xenit.alfred.telemetry.solr.monitoring.binder.SolrSnapshootMetrics.bindTo(SolrSnapshootMetrics.java:96)
at eu.xenit.alfred.telemetry.solr.monitoring.binder.SolrMetrics.bindTo(SolrMetrics.java:26)
at eu.xenit.alfred.telemetry.solr.handler.MicrometerHandler.handleRequestBody(MicrometerHandler.java:70)
at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:173)
at org.apache.solr.core.SolrCore.execute(SolrCore.java:2477)
at org.apache.solr.servlet.HttpSolrCall.execute(HttpSolrCall.java:723)
at org.apache.solr.servlet.HttpSolrCall.call(HttpSolrCall.java:529)
at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:361)
at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:305)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:583)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1180)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:513)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:119)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
at org.eclipse.jetty.rewrite.handler.RewriteHandler.handle(RewriteHandler.java:335)
at org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:169)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
at org.eclipse.jetty.server.Server.handle(Server.java:539)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:333)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:283)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:108)
at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589)
at java.base/java.lang.Thread.run(Thread.java:829)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.