diff --git a/online/src/main/scala/ai/chronon/online/metrics/Metrics.scala b/online/src/main/scala/ai/chronon/online/metrics/Metrics.scala index 5eddd05fee..926fe725fd 100644 --- a/online/src/main/scala/ai/chronon/online/metrics/Metrics.scala +++ b/online/src/main/scala/ai/chronon/online/metrics/Metrics.scala @@ -135,8 +135,12 @@ object Metrics { reporter.toLowerCase match { case "otel" | "opentelemetry" => if (metricsEnabled) { - val metricReader = OtelMetricsReporter.buildOtelMetricReader() - val openTelemetry = OtelMetricsReporter.buildOpenTelemetryClient(metricReader) + val maybeMetricReader = OtelMetricsReporter.buildOtelMetricReader() + val openTelemetry = maybeMetricReader + .map { metricReader => + OtelMetricsReporter.buildOpenTelemetryClient(metricReader) + } + .getOrElse(OpenTelemetry.noop()) new OtelMetricsReporter(openTelemetry) } else { new OtelMetricsReporter(OpenTelemetry.noop()) diff --git a/online/src/main/scala/ai/chronon/online/metrics/OtelMetricsReporter.scala b/online/src/main/scala/ai/chronon/online/metrics/OtelMetricsReporter.scala index 1f75b1e19c..7fef3c36c1 100644 --- a/online/src/main/scala/ai/chronon/online/metrics/OtelMetricsReporter.scala +++ b/online/src/main/scala/ai/chronon/online/metrics/OtelMetricsReporter.scala @@ -87,29 +87,31 @@ object OtelMetricsReporter { val MetricsReaderDefault = "http" val MetricsReaderPrometheus = "prometheus" - val MetricsExporterUrlDefault = "http://localhost:4318" val MetricsExporterInterval = "PT15s" val MetricsExporterPrometheusPortDefault = "8905" - def getExporterUrl: String = { - System.getProperty(MetricsExporterUrlKey, MetricsExporterUrlDefault) + def getExporterUrl: Option[String] = { + Option(System.getProperty(MetricsExporterUrlKey)) } - def buildOtelMetricReader(): MetricReader = { + def buildOtelMetricReader(): Option[MetricReader] = { val metricReader = System.getProperty(MetricsReader, MetricsReaderDefault) metricReader.toLowerCase match { case MetricsReaderDefault => - val exporterUrl = getExporterUrl + "/v1/metrics" + getExporterUrl.map { url => + val exporterUrl = url + "/v1/metrics" + val metricExporter = OtlpHttpMetricExporter.builder.setEndpoint(exporterUrl).build + // Configure periodic metric reader// Configure periodic metric reader + PeriodicMetricReader.builder(metricExporter).setInterval(Duration.parse(MetricsExporterInterval)).build + } - val metricExporter = OtlpHttpMetricExporter.builder.setEndpoint(exporterUrl).build - // Configure periodic metric reader// Configure periodic metric reader - PeriodicMetricReader.builder(metricExporter).setInterval(Duration.parse(MetricsExporterInterval)).build case MetricsReaderPrometheus => val prometheusPort = System.getProperty(MetricsExporterPrometheusPortKey, MetricsExporterPrometheusPortDefault).toInt - PrometheusHttpServer.builder - .setPort(prometheusPort) - .build + Some( + PrometheusHttpServer.builder + .setPort(prometheusPort) + .build) case _ => throw new IllegalArgumentException(s"Unknown metrics reader (only http / prometheus supported): $metricReader") } diff --git a/service_commons/src/main/java/ai/chronon/service/ChrononServiceLauncher.java b/service_commons/src/main/java/ai/chronon/service/ChrononServiceLauncher.java index 5c39d30e68..345f7aa346 100644 --- a/service_commons/src/main/java/ai/chronon/service/ChrononServiceLauncher.java +++ b/service_commons/src/main/java/ai/chronon/service/ChrononServiceLauncher.java @@ -27,15 +27,16 @@ public void beforeStartingVertx(VertxOptions options) { boolean enableMetrics = Optional.ofNullable(System.getProperty(Metrics.MetricsEnabled())) .map(Boolean::parseBoolean) .orElse(false); + boolean isUrlDefined = OtelMetricsReporter.getExporterUrl().isDefined(); - if (enableMetrics) { + if (enableMetrics && isUrlDefined) { initializeMetrics(options); } } private void initializeMetrics(VertxOptions options) { String serviceName = "ai.chronon"; - String exporterUrl = OtelMetricsReporter.getExporterUrl() + "/v1/metrics"; + String exporterUrl = OtelMetricsReporter.getExporterUrl().get() + "/v1/metrics"; String exportInterval = OtelMetricsReporter.MetricsExporterInterval(); // Configure OTLP using Micrometer's built-in registry