diff --git a/app/server/appsmith-server/pom.xml b/app/server/appsmith-server/pom.xml index 033b93315bbb..e50a3e0d5b0f 100644 --- a/app/server/appsmith-server/pom.xml +++ b/app/server/appsmith-server/pom.xml @@ -32,7 +32,7 @@ io.opentelemetry opentelemetry-bom - 1.34.1 + 1.43.0 pom import @@ -40,22 +40,6 @@ - - io.opentelemetry.instrumentation - opentelemetry-micrometer-1.5 - 2.0.0-alpha - - - io.opentelemetry - opentelemetry-sdk - 1.34.1 - - - io.opentelemetry - opentelemetry-exporter-otlp - 1.34.1 - - + io.micrometer - micrometer-tracing-bridge-brave - 1.3.4 + micrometer-tracing-bridge-otel + 1.3.5 - io.zipkin.reporter2 - zipkin-reporter-brave + io.opentelemetry + opentelemetry-exporter-otlp + 1.43.0 - - - - - - - org.junit.jupiter junit-jupiter-engine diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/configurations/MetricsConfig.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/configurations/MetricsConfig.java deleted file mode 100644 index dbddf518c23d..000000000000 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/configurations/MetricsConfig.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.appsmith.server.configurations; - -import com.appsmith.server.annotations.ConditionalOnMicrometerMetricsEnabled; -import io.micrometer.common.KeyValue; -import io.micrometer.core.aop.TimedAspect; -import io.micrometer.core.instrument.MeterRegistry; -import io.micrometer.observation.ObservationFilter; -import io.micrometer.observation.ObservationRegistry; -import io.micrometer.observation.aop.ObservedAspect; -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter; -import io.opentelemetry.instrumentation.micrometer.v1_5.OpenTelemetryMeterRegistry; -import io.opentelemetry.sdk.OpenTelemetrySdk; -import io.opentelemetry.sdk.metrics.Aggregation; -import io.opentelemetry.sdk.metrics.InstrumentType; -import io.opentelemetry.sdk.metrics.SdkMeterProvider; -import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector; -import io.opentelemetry.sdk.metrics.export.DefaultAggregationSelector; -import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; -import io.opentelemetry.sdk.resources.Resource; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.actuate.autoconfigure.observation.ObservationRegistryCustomizer; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.time.Duration; - -/** - * This configuration file configures beans as required by NewRelic - */ -@RequiredArgsConstructor -@Configuration -public class MetricsConfig { - - public static final String NEW_RELIC_MICROMETER_METRICS_ENDPOINT = "https://otlp.nr-data.net:4317"; - public static final String API_KEY = "api-key"; - public static final String DEPLOYMENT_NAME_KEY = "deployment.name"; - public static final String SERVICE_INSTANCE_ID_KEY = "service.instance.id"; - public static final String SERVICE_NAME_KEY = "service.name"; - public static final String SERVICE_NAME = "appsmith-server"; - public static final String INSTRUMENTATION_PROVIDER_KEY = "instrumentation.provider"; - public static final String MICROMETER = "micrometer"; - - @Value("${appsmith.newrelic.licensekey}") - private String newRelicKey; - - @Value("${appsmith.observability.deployment.name}") - private String deploymentName; - - @Value("${appsmith.observability.service.instance.id}") - private String serviceInstanceId; - - private final CommonConfig commonConfig; - - @Bean - @ConditionalOnMicrometerMetricsEnabled - public TimedAspect timedAspect(MeterRegistry registry) { - return new TimedAspect(registry); - } - - @Bean - @ConditionalOnMicrometerMetricsEnabled - public MeterRegistry meterRegistry(OpenTelemetry openTelemetry) { - return OpenTelemetryMeterRegistry.builder(openTelemetry).build(); - } - - @Bean - @ConditionalOnMicrometerMetricsEnabled - public OpenTelemetry openTelemetry() { - return OpenTelemetrySdk.builder() - .setMeterProvider(SdkMeterProvider.builder() - .setResource(Resource.getDefault().toBuilder() - .put(DEPLOYMENT_NAME_KEY, deploymentName) - .put(SERVICE_NAME_KEY, SERVICE_NAME) - // Include instrumentation.provider=micrometer to enable micrometer metrics - // experience in New Relic - .put(INSTRUMENTATION_PROVIDER_KEY, MICROMETER) - .put(SERVICE_INSTANCE_ID_KEY, serviceInstanceId) - .build()) - .registerMetricReader(PeriodicMetricReader.builder(OtlpGrpcMetricExporter.builder() - .setEndpoint(NEW_RELIC_MICROMETER_METRICS_ENDPOINT) - .addHeader(API_KEY, newRelicKey) - // IMPORTANT: New Relic requires metrics to be delta temporality - - .setAggregationTemporalitySelector( - AggregationTemporalitySelector.deltaPreferred()) - // Use exponential histogram aggregation for histogram instruments - // to produce better data and compression - .setDefaultAggregationSelector(DefaultAggregationSelector.getDefault() - .with( - InstrumentType.HISTOGRAM, - Aggregation.base2ExponentialBucketHistogram())) - .build()) - // Match default micrometer collection interval of 60 seconds - .setInterval(Duration.ofMillis(commonConfig.getMetricsIntervalMillis())) - .build()) - .build()) - .build(); - } - - @Bean - @ConditionalOnExpression("${logging.verbose.enabled}") - ObservedAspect observedAspect(ObservationRegistry observationRegistry) { - return new ObservedAspect(observationRegistry); - } - - @Bean - public ObservationRegistryCustomizer observationRegistryCustomizer() { - return registry -> registry.observationConfig().observationFilter(addGlobalTags()); - } - - private ObservationFilter addGlobalTags() { - return (observation) -> { - observation.addLowCardinalityKeyValue(KeyValue.of(DEPLOYMENT_NAME_KEY, deploymentName)); - observation.addLowCardinalityKeyValue(KeyValue.of(SERVICE_NAME_KEY, SERVICE_NAME)); - observation.addLowCardinalityKeyValue(KeyValue.of(SERVICE_INSTANCE_ID_KEY, serviceInstanceId)); - return observation; - }; - } -} diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/configurations/ZipkinMicrometerTraceConfiguration.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/configurations/ZipkinMicrometerTraceConfiguration.java deleted file mode 100644 index 7ac8b9719247..000000000000 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/configurations/ZipkinMicrometerTraceConfiguration.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.appsmith.server.configurations; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.actuate.autoconfigure.tracing.zipkin.ZipkinWebClientBuilderCustomizer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class ZipkinMicrometerTraceConfiguration { - public static final String DATA_FORMAT = "zipkin"; - public static final String DATA_VERSION = "2"; - - @Value("${appsmith.newrelic.licensekey}") - private String newRelicKey; - - @Bean - public ZipkinWebClientBuilderCustomizer zipkinCustomizer() { - return webClientBuilder -> webClientBuilder - .defaultHeader("Api-Key", newRelicKey) - .defaultHeader("Data-Format", DATA_FORMAT) - .defaultHeader("Data-Format-Version", DATA_VERSION); - } -} diff --git a/app/server/appsmith-server/src/main/resources/application.properties b/app/server/appsmith-server/src/main/resources/application.properties index e1794aa238a3..915829656909 100644 --- a/app/server/appsmith-server/src/main/resources/application.properties +++ b/app/server/appsmith-server/src/main/resources/application.properties @@ -91,16 +91,17 @@ github_repo = ${APPSMITH_GITHUB_REPO:} # The following configurations are to help support prometheus scraping for monitoring management.endpoints.web.exposure.include=prometheus,metrics management.tracing.enabled=${APPSMITH_TRACING_ENABLED:false} -management.zipkin.tracing.endpoint=${APPSMITH_TRACING_ENDPOINT:http://localhost:9411/api/v2/spans} +management.otlp.tracing.endpoint=${APPSMITH_NEW_RELIC_OTEL_EXPORTER_OTLP_ENDPOINT:http://localhost:4318}/v1/traces +management.otlp.tracing.headers.api-key=${APPSMITH_NEW_RELIC_OTLP_LICENSE_KEY:} +management.opentelemetry.resource-attributes.service.name=appsmith-server +management.opentelemetry.resource-attributes.service.instance.id=${HOSTNAME:appsmith-0} +management.opentelemetry.resource-attributes.deployment.name=${APPSMITH_DEPLOYMENT_NAME:self-hosted} management.tracing.sampling.probability=${APPSMITH_SAMPLING_PROBABILITY:0.1} management.prometheus.metrics.export.descriptions=true management.metrics.distribution.percentiles-histogram.http.server.requests=true # Observability and Micrometer related configs # Keeping this license key around, until later -appsmith.newrelic.licensekey=${APPSMITH_NEW_RELIC_OTLP_LICENSE_KEY:} -appsmith.observability.deployment.name=${APPSMITH_DEPLOYMENT_NAME:self-hosted} -appsmith.observability.service.instance.id=${HOSTNAME:appsmith-0} appsmith.observability.metrics.enabled=${APPSMITH_MICROMETER_METRICS_ENABLED:false} appsmith.observability.tracing.detail.enabled=${APPSMITH_ENABLE_TRACING_DETAIL:false} appsmith.observability.metrics.detail.enabled=${APPSMITH_ENABLE_METRICS_DETAIL:false}