1
1
package com .ojr .core ;
2
2
3
+ import com .ojr .core .metric .OjrPrometheusHttpServer ;
3
4
import com .ojr .core .metric .RawMetric ;
4
5
import com .ojr .core .resources .ContainerResource ;
5
6
import io .opentelemetry .api .OpenTelemetry ;
17
18
import io .opentelemetry .exporter .otlp .metrics .OtlpGrpcMetricExporterBuilder ;
18
19
import io .opentelemetry .exporter .otlp .trace .OtlpGrpcSpanExporter ;
19
20
import io .opentelemetry .exporter .otlp .trace .OtlpGrpcSpanExporterBuilder ;
20
- import io .opentelemetry .exporter .prometheus .PrometheusHttpServer ;
21
- import io .opentelemetry .exporter .prometheus .PrometheusHttpServerBuilder ;
21
+ import io .opentelemetry .exporter .prometheus .PrometheusMetricReader ;
22
22
import io .opentelemetry .sdk .OpenTelemetrySdk ;
23
23
import io .opentelemetry .sdk .OpenTelemetrySdkBuilder ;
24
+ import io .opentelemetry .sdk .common .export .MemoryMode ;
24
25
import io .opentelemetry .sdk .logs .SdkLoggerProvider ;
25
26
import io .opentelemetry .sdk .logs .export .BatchLogRecordProcessor ;
26
27
import io .opentelemetry .sdk .logs .export .LogRecordExporter ;
27
28
import io .opentelemetry .sdk .metrics .SdkMeterProvider ;
28
29
import io .opentelemetry .sdk .metrics .SdkMeterProviderBuilder ;
29
30
import io .opentelemetry .sdk .metrics .export .MetricExporter ;
30
- import io .opentelemetry .sdk .metrics .export .MetricReader ;
31
31
import io .opentelemetry .sdk .metrics .export .PeriodicMetricReader ;
32
32
import io .opentelemetry .sdk .resources .Resource ;
33
33
import io .opentelemetry .sdk .trace .SdkTracerProvider ;
@@ -69,7 +69,7 @@ public abstract class AbstractDc<Cfg extends BasicDcConfig> implements IDc<Cfg>
69
69
private String transport = DcUtil .DEFAULT_OTEL_TRANSPORT ;
70
70
71
71
private int prometheusPort = DcUtil .DEFAULT_PROMETHEUS_PORT ;
72
- private String prometheusHost = null ;
72
+ private String prometheusHost = DcUtil . DEFAULT_PROMETHEUS_HOST ;
73
73
74
74
private String serviceName = DcUtil .DEFAULT_OTEL_SERVICE_NAME ;
75
75
private String serviceInstanceId = null ;
@@ -420,14 +420,10 @@ public LogRecordExporter createOtlpHttpLogRecordExporter(Map<String, String> hea
420
420
return builder .build ();
421
421
}
422
422
423
- private static MetricReader prometheusMetricReader = null ;
423
+ // private static MetricReader prometheusMetricReader = null;
424
424
425
- private static Predicate <String > dftResAttrsFilterForPrometheus = (String key ) -> {
426
- if (DcUtil .OJR_PLUGIN .equals (key ) || HostIncubatingAttributes .HOST_NAME .getKey ().equals (key )) {
427
- return true ;
428
- }
429
- return false ;
430
- };
425
+ private static final Predicate <String > dftResAttrsFilterForPrometheus =
426
+ (String key ) -> DcUtil .OJR_PLUGIN .equals (key ) || HostIncubatingAttributes .HOST_NAME .getKey ().equals (key );
431
427
432
428
/**
433
429
* Returns the filter for resource attributes used when exporting metrics to Prometheus.
@@ -440,15 +436,8 @@ public Predicate<String> updateResAttrsFilterForPrometheus(Predicate<String> res
440
436
return resAttrsFilter ;
441
437
}
442
438
443
- /**
444
- * Creates and configures a Prometheus metric reader.
445
- * <p>
446
- * This method sets up a Prometheus HTTP server with a specified port.
447
- * Optionally, if a host is provided and not empty, it sets the host as well.
448
- *
449
- * @return A configured MetricReader instance for Prometheus metrics.
450
- */
451
- public synchronized MetricReader createPrometheusMetricReader () {
439
+ /*
440
+ private synchronized MetricReader createPrometheusMetricReader0() {
452
441
if (prometheusMetricReader != null) {
453
442
return prometheusMetricReader;
454
443
}
@@ -461,6 +450,44 @@ public synchronized MetricReader createPrometheusMetricReader() {
461
450
462
451
return prometheusMetricReader = builder.build();
463
452
}
453
+ */
454
+
455
+ private static OjrPrometheusHttpServer prometheusHttpServer = null ;
456
+
457
+
458
+ public synchronized OjrPrometheusHttpServer createPrometheusHttpServerIfNotExist () {
459
+ if (prometheusHttpServer != null ) {
460
+ return prometheusHttpServer ; // Return early if the server is already created
461
+ }
462
+ prometheusHttpServer = new OjrPrometheusHttpServer (prometheusHost , prometheusPort , null , MemoryMode .REUSABLE_DATA );
463
+ return prometheusHttpServer ;
464
+ }
465
+
466
+ /**
467
+ * Creates and configures a Prometheus metric reader.
468
+ * <p>
469
+ * This method sets up a Prometheus HTTP server with a specified port.
470
+ * Optionally, if a host is provided and not empty, it sets the host as well.
471
+ *
472
+ * @return A configured PrometheusMetricReader instance for Prometheus metrics.
473
+ */
474
+ public PrometheusMetricReader createPrometheusMetricReader () {
475
+ return new PrometheusMetricReader (false , updateResAttrsFilterForPrometheus (dftResAttrsFilterForPrometheus ));
476
+ }
477
+
478
+
479
+ /**
480
+ * Initializes Prometheus for the OpenTelemetry Meter Provider.
481
+ *
482
+ * @param builder The SdkMeterProviderBuilder instance to configure Prometheus.
483
+ * @return The updated SdkMeterProviderBuilder instance.
484
+ */
485
+ public SdkMeterProviderBuilder initPrometheus (SdkMeterProviderBuilder builder ) {
486
+ PrometheusMetricReader reader = createPrometheusMetricReader ();
487
+ builder .registerMetricReader (reader );
488
+ createPrometheusHttpServerIfNotExist ().registerReader (reader ).start ();
489
+ return builder ;
490
+ }
464
491
465
492
/**
466
493
* Creates a default SDK meter provider with the specified configuration.
@@ -476,17 +503,17 @@ public SdkMeterProvider getDefaultSdkMeterProvider(Resource resource) {
476
503
if (transport .contains (DcUtil .GRPC )) {
477
504
SdkMeterProviderBuilder builder = SdkMeterProvider .builder ().setResource (resource ).registerMetricReader (PeriodicMetricReader .builder (createOtlpGrpcMetricExporter (headers , cert )).setInterval (Duration .ofSeconds (callbackInterval )).build ());
478
505
if (transport .contains (DcUtil .PROMETHEUS )) {
479
- builder . registerMetricReader ( createPrometheusMetricReader () );
506
+ initPrometheus ( builder );
480
507
}
481
508
return builder .build ();
482
509
} else if (transport .contains (DcUtil .HTTP )) {
483
510
SdkMeterProviderBuilder builder = SdkMeterProvider .builder ().setResource (resource ).registerMetricReader (PeriodicMetricReader .builder (createOtlpHttpMetricExporter (headers , cert )).setInterval (Duration .ofSeconds (callbackInterval )).build ());
484
511
if (transport .contains (DcUtil .PROMETHEUS )) {
485
- builder . registerMetricReader ( createPrometheusMetricReader () );
512
+ initPrometheus ( builder );
486
513
}
487
514
return builder .build ();
488
515
} else if (transport .contains (DcUtil .PROMETHEUS )) {
489
- return SdkMeterProvider .builder ().setResource (resource ). registerMetricReader ( createPrometheusMetricReader ( )).build ();
516
+ return initPrometheus ( SdkMeterProvider .builder ().setResource (resource )).build ();
490
517
} else {
491
518
return SdkMeterProvider .builder ().build ();
492
519
}
0 commit comments