4040 * environment variable OTEL_JMX_ENABLED_CONFIG. This flag is disabled by default.
4141 */
4242public class OtelJMXMetricsCustomizerProvider implements AutoConfigurationCustomizerProvider {
43- private static final Duration DEFAULT_METRIC_EXPORT_INTERVAL = Duration .ofMinutes (1 );
44- private static final Logger logger =
45- Logger .getLogger (OtelJMXMetricsCustomizerProvider .class .getName ());
43+ private static final Duration DEFAULT_METRIC_EXPORT_INTERVAL = Duration .ofMinutes (1 );
44+ private static final Logger logger =
45+ Logger .getLogger (OtelJMXMetricsCustomizerProvider .class .getName ());
4646
47- private static final String OTEL_JMX_ENABLED_CONFIG = "otel.jmx.enabled" ;
48- private static final String OTEL_JMX_ENDPOINT_CONFIG = "otel.jmx.exporter.metrics.endpoint" ;
47+ private static final String OTEL_JMX_ENABLED_CONFIG = "otel.jmx.enabled" ;
48+ private static final String OTEL_JMX_ENDPOINT_CONFIG = "otel.jmx.exporter.metrics.endpoint" ;
4949
50- public void customize (AutoConfigurationCustomizer autoConfiguration ) {
51- autoConfiguration .addMeterProviderCustomizer (this ::customizeMeterProvider );
52- }
50+ public void customize (AutoConfigurationCustomizer autoConfiguration ) {
51+ autoConfiguration .addMeterProviderCustomizer (this ::customizeMeterProvider );
52+ }
5353
54- private boolean isOtelJMXEnabled (ConfigProperties configProps ) {
55- return configProps .getBoolean (OTEL_JMX_ENABLED_CONFIG );
56- }
54+ private boolean isOtelJMXEnabled (ConfigProperties configProps ) {
55+ return configProps .getBoolean (OTEL_JMX_ENABLED_CONFIG )
56+ && configProps .getString (OTEL_JMX_ENDPOINT_CONFIG , "" ) != "" ;
57+ }
5758
58- private SdkMeterProviderBuilder customizeMeterProvider (
59- SdkMeterProviderBuilder sdkMeterProviderBuilder , ConfigProperties configProps ) {
59+ private SdkMeterProviderBuilder customizeMeterProvider (
60+ SdkMeterProviderBuilder sdkMeterProviderBuilder , ConfigProperties configProps ) {
6061
61- if (isOtelJMXEnabled (configProps )) {
62- Set <String > registeredScopeNames = new HashSet <>(1 );
63- String jmxRuntimeScopeName = "io.opentelemetry.jmx" ;
64- registeredScopeNames .add (jmxRuntimeScopeName );
62+ if (isOtelJMXEnabled (configProps )) {
63+ Set <String > registeredScopeNames = new HashSet <>(1 );
64+ String jmxRuntimeScopeName = "io.opentelemetry.jmx" ;
65+ registeredScopeNames .add (jmxRuntimeScopeName );
6566
66- configureMetricFilter (configProps , sdkMeterProviderBuilder , registeredScopeNames );
67+ configureMetricFilter (configProps , sdkMeterProviderBuilder , registeredScopeNames );
6768
68- MetricExporter metricsExporter = JMXExporterProvider .INSTANCE .createExporter (configProps );
69- MetricReader metricReader =
70- ScopeBasedPeriodicMetricReader .create (metricsExporter , registeredScopeNames )
71- .setInterval (getMetricExportInterval (configProps ))
72- .build ();
73- sdkMeterProviderBuilder .registerMetricReader (metricReader );
69+ MetricExporter metricsExporter = JMXExporterProvider .INSTANCE .createExporter (configProps );
70+ MetricReader metricReader =
71+ ScopeBasedPeriodicMetricReader .create (metricsExporter , registeredScopeNames )
72+ .setInterval (getMetricExportInterval (configProps ))
73+ .build ();
74+ sdkMeterProviderBuilder .registerMetricReader (metricReader );
7475
75- logger .info ("Otel JMX metric collection enabled" );
76- }
77- return sdkMeterProviderBuilder ;
76+ logger .info ("Otel JMX metric collection enabled" );
7877 }
79-
80- private static void configureMetricFilter (
81- ConfigProperties configProps ,
82- SdkMeterProviderBuilder sdkMeterProviderBuilder ,
83- Set <String > registeredScopeNames ) {
84- Set <String > exporterNames =
85- DefaultConfigProperties .getSet (configProps , "otel.metrics.exporter" );
86- if (exporterNames .contains ("none" )) {
87- for (String scope : registeredScopeNames ) {
88- sdkMeterProviderBuilder .registerView (
89- InstrumentSelector .builder ().setMeterName (scope ).build (),
90- View .builder ().setAggregation (Aggregation .defaultAggregation ()).build ());
91-
92- logger .log (Level .FINE , "Registered scope {0}" , scope );
93- }
94- sdkMeterProviderBuilder .registerView (
95- InstrumentSelector .builder ().setName ("*" ).build (),
96- View .builder ().setAggregation (Aggregation .drop ()).build ());
97- }
78+ return sdkMeterProviderBuilder ;
79+ }
80+
81+ private static void configureMetricFilter (
82+ ConfigProperties configProps ,
83+ SdkMeterProviderBuilder sdkMeterProviderBuilder ,
84+ Set <String > registeredScopeNames ) {
85+ Set <String > exporterNames =
86+ DefaultConfigProperties .getSet (configProps , "otel.metrics.exporter" );
87+ if (exporterNames .contains ("none" )) {
88+ for (String scope : registeredScopeNames ) {
89+ sdkMeterProviderBuilder .registerView (
90+ InstrumentSelector .builder ().setMeterName (scope ).build (),
91+ View .builder ().setAggregation (Aggregation .defaultAggregation ()).build ());
92+
93+ logger .log (Level .FINE , "Registered scope {0}" , scope );
94+ }
95+ sdkMeterProviderBuilder .registerView (
96+ InstrumentSelector .builder ().setName ("*" ).build (),
97+ View .builder ().setAggregation (Aggregation .drop ()).build ());
9898 }
99-
100- private static Duration getMetricExportInterval (ConfigProperties configProps ) {
101- Duration exportInterval =
102- configProps .getDuration ("otel.metric.export.interval" , DEFAULT_METRIC_EXPORT_INTERVAL );
103- logger .log (Level .FINE , String .format ("Otel JMX Metrics export interval: %s" , exportInterval ));
104- // Cap export interval to 60 seconds. This is currently required for metrics-trace correlation
105- // to work correctly.
106- if (exportInterval .compareTo (DEFAULT_METRIC_EXPORT_INTERVAL ) > 0 ) {
107- exportInterval = DEFAULT_METRIC_EXPORT_INTERVAL ;
108- logger .log (
109- Level .INFO ,
110- String .format ("Otel JMX Metrics export interval capped to %s" , exportInterval ));
111- }
112- return exportInterval ;
99+ }
100+
101+ private static Duration getMetricExportInterval (ConfigProperties configProps ) {
102+ Duration exportInterval =
103+ configProps .getDuration ("otel.metric.export.interval" , DEFAULT_METRIC_EXPORT_INTERVAL );
104+ logger .log (Level .FINE , String .format ("Otel JMX Metrics export interval: %s" , exportInterval ));
105+ // Cap export interval to 60 seconds. This is currently required for metrics-trace correlation
106+ // to work correctly.
107+ if (exportInterval .compareTo (DEFAULT_METRIC_EXPORT_INTERVAL ) > 0 ) {
108+ exportInterval = DEFAULT_METRIC_EXPORT_INTERVAL ;
109+ logger .log (
110+ Level .INFO ,
111+ String .format ("Otel JMX Metrics export interval capped to %s" , exportInterval ));
112+ }
113+ return exportInterval ;
114+ }
115+
116+ private enum JMXExporterProvider {
117+ INSTANCE ;
118+
119+ public MetricExporter createExporter (ConfigProperties configProps ) {
120+ String protocol =
121+ OtlpConfigUtil .getOtlpProtocol (OtlpConfigUtil .DATA_TYPE_METRICS , configProps );
122+ logger .log (Level .FINE , String .format ("Otel JMX metrics export protocol: %s" , protocol ));
123+
124+ String otelJMXEndpoint ;
125+ if (protocol .equals (OtlpConfigUtil .PROTOCOL_HTTP_PROTOBUF )) {
126+ otelJMXEndpoint = configProps .getString (OTEL_JMX_ENDPOINT_CONFIG , "http://localhost:4314" );
127+ logger .log (
128+ Level .FINE , String .format ("Otel JMX metrics export endpoint: %s" , otelJMXEndpoint ));
129+ return OtlpHttpMetricExporter .builder ()
130+ .setEndpoint (otelJMXEndpoint )
131+ .setDefaultAggregationSelector (this ::getAggregation )
132+ .build ();
133+ }
134+ throw new ConfigurationException ("Unsupported Otel JMX metrics export protocol: " + protocol );
113135 }
114136
115- private enum JMXExporterProvider {
116- INSTANCE ;
117-
118- public MetricExporter createExporter (ConfigProperties configProps ) {
119- String protocol =
120- OtlpConfigUtil .getOtlpProtocol (OtlpConfigUtil .DATA_TYPE_METRICS , configProps );
121- logger .log (Level .FINE , String .format ("Otel JMX metrics export protocol: %s" , protocol ));
122-
123- String otelJMXEndpoint ;
124- if (protocol .equals (OtlpConfigUtil .PROTOCOL_HTTP_PROTOBUF )) {
125- otelJMXEndpoint = configProps .getString (OTEL_JMX_ENDPOINT_CONFIG , "http://localhost:4314" );
126- logger .log (
127- Level .FINE , String .format ("Otel JMX metrics export endpoint: %s" , otelJMXEndpoint ));
128- return OtlpHttpMetricExporter .builder ()
129- .setEndpoint (otelJMXEndpoint )
130- .setDefaultAggregationSelector (this ::getAggregation )
131- .setAggregationTemporalitySelector (CloudWatchTemporalitySelector .alwaysDelta ())
132- .build ();
133- }
134- throw new ConfigurationException ("Unsupported Otel JMX metrics export protocol: " + protocol );
135- }
136-
137- private Aggregation getAggregation (InstrumentType instrumentType ) {
138- if (instrumentType == InstrumentType .HISTOGRAM ) {
139- return Aggregation .base2ExponentialBucketHistogram ();
140- }
141- return Aggregation .defaultAggregation ();
142- }
137+ private Aggregation getAggregation (InstrumentType instrumentType ) {
138+ if (instrumentType == InstrumentType .HISTOGRAM ) {
139+ return Aggregation .base2ExponentialBucketHistogram ();
140+ }
141+ return Aggregation .defaultAggregation ();
143142 }
144- }
143+ }
144+ }
0 commit comments