55
66package io .opentelemetry .instrumentation .javaagent .jmx ;
77
8- import static java .util .logging .Level .FINE ;
9- import static java .util .logging .Level .INFO ;
10-
118import com .google .auto .service .AutoService ;
129import io .opentelemetry .api .GlobalOpenTelemetry ;
13- import io .opentelemetry .instrumentation .jmx .engine .JmxMetricInsight ;
14- import io .opentelemetry .instrumentation .jmx .engine .MetricConfiguration ;
15- import io .opentelemetry .instrumentation .jmx .yaml .RuleParser ;
10+ import io .opentelemetry .instrumentation .jmx .JmxTelemetry ;
11+ import io .opentelemetry .instrumentation .jmx .JmxTelemetryBuilder ;
1612import io .opentelemetry .javaagent .extension .AgentListener ;
1713import io .opentelemetry .sdk .autoconfigure .AutoConfiguredOpenTelemetrySdk ;
1814import io .opentelemetry .sdk .autoconfigure .internal .AutoConfigureUtil ;
1915import io .opentelemetry .sdk .autoconfigure .spi .ConfigProperties ;
20- import java .io .InputStream ;
21- import java .nio .file .Files ;
22- import java .nio .file .Paths ;
2316import java .time .Duration ;
24- import java .util .List ;
2517
2618/** An {@link AgentListener} that enables JMX metrics during agent startup. */
2719@ AutoService (AgentListener .class )
@@ -32,11 +24,16 @@ public void afterAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredSdk) {
3224 ConfigProperties config = AutoConfigureUtil .getConfig (autoConfiguredSdk );
3325
3426 if (config .getBoolean ("otel.jmx.enabled" , true )) {
35- JmxMetricInsight service =
36- JmxMetricInsight .createService (
37- GlobalOpenTelemetry .get (), beanDiscoveryDelay (config ).toMillis ());
38- MetricConfiguration conf = buildMetricConfiguration (config );
39- service .startLocal (conf );
27+ JmxTelemetryBuilder jmx =
28+ JmxTelemetry .builder (GlobalOpenTelemetry .get ())
29+ .beanDiscoveryDelay (beanDiscoveryDelay (config ).toMillis ());
30+
31+ config .getList ("otel.jmx.config" ).forEach (jmx ::addCustomRules );
32+ config
33+ .getList ("otel.jmx.target.system" )
34+ .forEach (system -> jmx .addClasspathRules (JmxMetricInsightInstaller .class , system ));
35+
36+ jmx .build ().startLocal ();
4037 }
4138 }
4239
@@ -50,58 +47,4 @@ private static Duration beanDiscoveryDelay(ConfigProperties configProperties) {
5047 // It makes sense for both of these values to be similar.
5148 return configProperties .getDuration ("otel.metric.export.interval" , Duration .ofMinutes (1 ));
5249 }
53-
54- private static String resourceFor (String platform ) {
55- return "/jmx/rules/" + platform + ".yaml" ;
56- }
57-
58- private static void addRulesForPlatform (String platform , MetricConfiguration conf ) {
59- String yamlResource = resourceFor (platform );
60- try (InputStream inputStream =
61- JmxMetricInsightInstaller .class .getResourceAsStream (yamlResource )) {
62- if (inputStream != null ) {
63- JmxMetricInsight .getLogger ().log (FINE , "Opened input stream {0}" , yamlResource );
64- RuleParser parserInstance = RuleParser .get ();
65- parserInstance .addMetricDefsTo (conf , inputStream , platform );
66- } else {
67- JmxMetricInsight .getLogger ().log (INFO , "No support found for {0}" , platform );
68- }
69- } catch (Exception e ) {
70- JmxMetricInsight .getLogger ().warning (e .getMessage ());
71- }
72- }
73-
74- private static void buildFromDefaultRules (
75- MetricConfiguration conf , ConfigProperties configProperties ) {
76- List <String > platforms = configProperties .getList ("otel.jmx.target.system" );
77- for (String platform : platforms ) {
78- addRulesForPlatform (platform , conf );
79- }
80- }
81-
82- private static void buildFromUserRules (
83- MetricConfiguration conf , ConfigProperties configProperties ) {
84- List <String > configFiles = configProperties .getList ("otel.jmx.config" );
85- for (String configFile : configFiles ) {
86- JmxMetricInsight .getLogger ().log (FINE , "JMX config file name: {0}" , configFile );
87- RuleParser parserInstance = RuleParser .get ();
88- try (InputStream inputStream = Files .newInputStream (Paths .get (configFile ))) {
89- parserInstance .addMetricDefsTo (conf , inputStream , configFile );
90- } catch (Exception e ) {
91- // yaml parsing errors are caught and logged inside of addMetricDefsTo
92- // only file access related exceptions are expected here
93- JmxMetricInsight .getLogger ().warning (e .toString ());
94- }
95- }
96- }
97-
98- private static MetricConfiguration buildMetricConfiguration (ConfigProperties configProperties ) {
99- MetricConfiguration metricConfiguration = new MetricConfiguration ();
100-
101- buildFromDefaultRules (metricConfiguration , configProperties );
102-
103- buildFromUserRules (metricConfiguration , configProperties );
104-
105- return metricConfiguration ;
106- }
10750}
0 commit comments