11package eu .xenit .alfred .telemetry .solr .monitoring .binder ;
22
33import io .micrometer .core .instrument .Gauge ;
4- import io .micrometer .core .instrument .MeterRegistry ;
54import io .micrometer .core .instrument .Tags ;
65import io .micrometer .core .instrument .binder .MeterBinder ;
7- import java .io .IOException ;
8- import java .util .Map .Entry ;
96import org .alfresco .solr .AlfrescoCoreAdminHandler ;
107import org .alfresco .solr .SolrInformationServer ;
118import org .alfresco .solr .tracker .TrackerRegistry ;
129import org .slf4j .Logger ;
1310import org .slf4j .LoggerFactory ;
1411
15- public class SolrCoreStatsMetrics implements MeterBinder {
12+ import java .io .IOException ;
13+ import java .util .Map .Entry ;
14+
15+ public class SolrCoreStatsMetrics extends AbstractSolrMetrics implements MeterBinder {
1616
1717 private static final String METER_ALFRESCO_NODES = "alfresco.nodes" ;
1818 private static final String TAG_STATE = "state" ;
1919 private static final String TAG_VALUE_INDEXED = "Indexed" ;
2020
21- private final AlfrescoCoreAdminHandler coreAdminHandler ;
22- private MeterRegistry registry ;
2321
2422 private static final Logger logger = LoggerFactory .getLogger (SolrCoreStatsMetrics .class );
2523
2624 public SolrCoreStatsMetrics (AlfrescoCoreAdminHandler coreAdminHandler ) {
27- this . coreAdminHandler = coreAdminHandler ;
25+ super ( coreAdminHandler ) ;
2826 }
2927
30- private void registerCoreStats () {
31- TrackerRegistry trackerRegistry = coreAdminHandler .getTrackerRegistry ();
32-
33- while (trackerRegistry .getCoreNames ().size () == 0 ) {
34- logger .error ("Solr did not start tracking yet, waiting 10sec" );
35- try {
36- Thread .currentThread ().sleep (10_000 );
37- trackerRegistry = coreAdminHandler .getTrackerRegistry ();
38- } catch (InterruptedException e ) {
39- logger .error ("Fail to wait 10 sec" , e );
40- }
41- }
28+ @ Override
29+ protected void registerMetrics () {
30+ TrackerRegistry trackerRegistry = getTrackerRegistryWhenAvailable ();
4231
4332 for (String coreName : trackerRegistry .getCoreNames ()) {
44- SolrInformationServer server = (SolrInformationServer ) coreAdminHandler .getInformationServers ()
45- .get (coreName );
46-
4733 Tags tags = Tags .of ("core" , coreName , TAG_STATE , TAG_VALUE_INDEXED );
48- Gauge .builder (METER_ALFRESCO_NODES , server ,
49- x -> getCoreStat (server , "Alfresco Nodes in Index" ))
34+ Gauge .builder (METER_ALFRESCO_NODES , coreAdminHandler ,
35+ x -> getCoreStat (x , coreName , "Alfresco Nodes in Index" ))
5036 .tags (tags )
5137 .register (registry );
5238
5339 tags = Tags .of ("core" , coreName , TAG_STATE , "Unindexed" );
54- Gauge .builder (METER_ALFRESCO_NODES , server ,
55- x -> getCoreStat (server , "Alfresco Unindexed Nodes" ))
40+ Gauge .builder (METER_ALFRESCO_NODES , coreAdminHandler ,
41+ x -> getCoreStat (x , coreName , "Alfresco Unindexed Nodes" ))
5642 .tags (tags )
5743 .register (registry );
5844
5945 tags = Tags .of ("core" , coreName , TAG_STATE , "Error" );
60- Gauge .builder (METER_ALFRESCO_NODES , trackerRegistry ,
61- x -> getCoreStat (server , "Alfresco Error Nodes in Index" ))
46+ Gauge .builder (METER_ALFRESCO_NODES , coreAdminHandler ,
47+ x -> getCoreStat (x , coreName , "Alfresco Error Nodes in Index" ))
6248 .tags (tags )
6349 .register (registry );
6450
6551 tags = Tags .of ("core" , coreName , TAG_STATE , TAG_VALUE_INDEXED );
66- Gauge .builder ("alfresco.acls" , trackerRegistry ,
67- x -> getCoreStat (server , "Alfresco Acls in Index" ))
52+ Gauge .builder ("alfresco.acls" , coreAdminHandler ,
53+ x -> getCoreStat (x , coreName , "Alfresco Acls in Index" ))
6854 .tags (tags )
6955 .register (registry );
7056
7157 tags = Tags .of ("core" , coreName , TAG_STATE , "States" );
72- Gauge .builder ("alfresco.states" , trackerRegistry ,
73- x -> getCoreStat (server , "Alfresco States in Index" ))
58+ Gauge .builder ("alfresco.states" , coreAdminHandler ,
59+ x -> getCoreStat (x , coreName , "Alfresco States in Index" ))
7460 .tags (tags )
7561 .register (registry );
7662
7763 // technically these metrics are not per core, but in order to filter in grafana the core is added as a tag
7864 tags = Tags .of ("core" , coreName , TAG_STATE , TAG_VALUE_INDEXED );
79- Gauge .builder ("alfresco.transactions.nodes" , trackerRegistry ,
80- x -> getCoreStat (server , "Alfresco Transactions in Index" ))
65+ Gauge .builder ("alfresco.transactions.nodes" , coreAdminHandler ,
66+ x -> getCoreStat (x , coreName , "Alfresco Transactions in Index" ))
8167 .tags (tags )
8268 .register (registry );
8369
8470 tags = Tags .of ("core" , coreName , TAG_STATE , TAG_VALUE_INDEXED );
85- Gauge .builder ("alfresco.transactions.acls" , trackerRegistry ,
86- x -> getCoreStat (server , "Alfresco Acl Transactions in Index" ))
71+ Gauge .builder ("alfresco.transactions.acls" , coreAdminHandler ,
72+ x -> getCoreStat (x , coreName , "Alfresco Acl Transactions in Index" ))
8773 .tags (tags )
8874 .register (registry );
8975
9076 }
9177 }
9278
9379
94- private long getCoreStat (SolrInformationServer server , String key ) {
80+ private static long getCoreStat (AlfrescoCoreAdminHandler coreAdminHandler , String coreName , String key ) {
81+ SolrInformationServer server = (SolrInformationServer ) coreAdminHandler .getInformationServers ()
82+ .get (coreName );
9583 try {
9684 for (Entry <String , Object > entry : server .getCoreStats ()) {
9785 if (key .equals (entry .getKey ())) {
@@ -104,9 +92,4 @@ private long getCoreStat(SolrInformationServer server, String key) {
10492 return -1 ;
10593 }
10694
107- @ Override
108- public void bindTo (MeterRegistry registry ) {
109- this .registry = registry ;
110- registerCoreStats ();
111- }
11295}
0 commit comments