Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions online/src/main/scala/ai/chronon/online/metrics/Metrics.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down