diff --git a/assembly/assembly-wsmaster-war/pom.xml b/assembly/assembly-wsmaster-war/pom.xml index 89c76d424f..9e8843738e 100644 --- a/assembly/assembly-wsmaster-war/pom.xml +++ b/assembly/assembly-wsmaster-war/pom.xml @@ -249,6 +249,10 @@ org.eclipse.che.core che-core-tracing-core + + org.eclipse.che.core + che-core-tracing-metrics + org.eclipse.che.core che-core-tracing-web diff --git a/assembly/assembly-wsmaster-war/src/main/java/org/eclipse/che/api/deploy/WsMasterModule.java b/assembly/assembly-wsmaster-war/src/main/java/org/eclipse/che/api/deploy/WsMasterModule.java index 12fd5a9ad7..c4176cc6ab 100644 --- a/assembly/assembly-wsmaster-war/src/main/java/org/eclipse/che/api/deploy/WsMasterModule.java +++ b/assembly/assembly-wsmaster-war/src/main/java/org/eclipse/che/api/deploy/WsMasterModule.java @@ -78,6 +78,7 @@ import org.eclipse.che.commons.auth.token.ChainedTokenExtractor; import org.eclipse.che.commons.auth.token.RequestTokenExtractor; import org.eclipse.che.core.db.DBTermination; import org.eclipse.che.core.db.schema.SchemaInitializer; +import org.eclipse.che.core.tracing.metrics.TracingMetricsModule; import org.eclipse.che.inject.DynaModule; import org.eclipse.che.mail.template.ST.STTemplateProcessorImpl; import org.eclipse.che.mail.template.TemplateProcessor; @@ -293,6 +294,10 @@ public class WsMasterModule extends AbstractModule { install(new WsMasterMetricsModule()); install(new MetricsOverrideBinding()); } + if (Boolean.valueOf(System.getenv("CHE_TRACING_ENABLED")) + && Boolean.valueOf(System.getenv("CHE_METRICS_ENABLED"))) { + install(new TracingMetricsModule()); + } } private void configureSingleUserMode(Map persistenceProperties) { diff --git a/core/che-core-tracing-core/src/main/java/org/eclipse/che/core/tracing/TracerProvider.java b/core/che-core-tracing-core/src/main/java/org/eclipse/che/core/tracing/TracerProvider.java index e997823c40..6fbd101e8c 100644 --- a/core/che-core-tracing-core/src/main/java/org/eclipse/che/core/tracing/TracerProvider.java +++ b/core/che-core-tracing-core/src/main/java/org/eclipse/che/core/tracing/TracerProvider.java @@ -29,7 +29,11 @@ public class TracerProvider implements Provider { private final Tracer tracer; public TracerProvider() { - this.tracer = TracerResolver.resolveTracer(); + this(TracerResolver.resolveTracer()); + } + + public TracerProvider(Tracer tracer) { + this.tracer = tracer; GlobalTracer.register(tracer); } diff --git a/core/che-core-tracing-core/src/main/java/org/eclipse/che/core/tracing/TracingInterceptor.java b/core/che-core-tracing-core/src/main/java/org/eclipse/che/core/tracing/TracingInterceptor.java index f98c192b11..b24ca37d62 100644 --- a/core/che-core-tracing-core/src/main/java/org/eclipse/che/core/tracing/TracingInterceptor.java +++ b/core/che-core-tracing-core/src/main/java/org/eclipse/che/core/tracing/TracingInterceptor.java @@ -15,6 +15,7 @@ import com.google.common.annotations.Beta; import com.google.inject.Inject; import io.opentracing.Scope; import io.opentracing.Tracer; +import io.opentracing.tag.Tags; import java.lang.reflect.Method; import java.util.Map; import java.util.WeakHashMap; @@ -47,7 +48,11 @@ public class TracingInterceptor implements MethodInterceptor { public Object invoke(MethodInvocation invocation) throws Throwable { String spanName = getSpanName(invocation); try (Scope scope = - tracer.buildSpan(spanName).asChildOf(tracer.activeSpan()).startActive(true)) { + tracer + .buildSpan(spanName) + .asChildOf(tracer.activeSpan()) + .withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_SERVER) + .startActive(true)) { Traced.TagsStack.push(); diff --git a/core/che-core-tracing-metrics/pom.xml b/core/che-core-tracing-metrics/pom.xml new file mode 100644 index 0000000000..30223ef1db --- /dev/null +++ b/core/che-core-tracing-metrics/pom.xml @@ -0,0 +1,58 @@ + + + + 4.0.0 + + che-core-parent + org.eclipse.che.core + 7.0.0-beta-2.0-SNAPSHOT + + che-core-tracing-metrics + Che Core :: Tracing :: Metrics + + + com.google.inject + guice + + + io.jaegertracing + jaeger-core + + + io.jaegertracing + jaeger-micrometer + + + io.opentracing + opentracing-api + + + io.opentracing.contrib + opentracing-metrics + + + io.opentracing.contrib + opentracing-metrics-micrometer + + + javax.inject + javax.inject + + + org.eclipse.che.core + che-core-tracing-core + + + diff --git a/core/che-core-tracing-metrics/src/main/java/org/eclipse/che/core/tracing/metrics/MeteredTracerProvider.java b/core/che-core-tracing-metrics/src/main/java/org/eclipse/che/core/tracing/metrics/MeteredTracerProvider.java new file mode 100644 index 0000000000..521d20a003 --- /dev/null +++ b/core/che-core-tracing-metrics/src/main/java/org/eclipse/che/core/tracing/metrics/MeteredTracerProvider.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2012-2018 Red Hat, Inc. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.che.core.tracing.metrics; + +import io.jaegertracing.Configuration; +import io.jaegertracing.micrometer.MicrometerMetricsFactory; +import io.opentracing.Tracer; +import io.opentracing.contrib.metrics.Metrics; +import io.opentracing.contrib.metrics.MetricsReporter; +import java.util.Set; +import javax.inject.Inject; +import javax.inject.Provider; +import javax.inject.Singleton; +import org.eclipse.che.core.tracing.TracerProvider; + +/** + * Provider of {@link Tracer}, that is integrated with metrics. + * + *

Tracer instance is created with custom metrics factory, so it would expose internal metrics to + * prometheus server + * + *

Tracer is also wrapped in custom metrics reporter, which would report data about traced spans + * and expose them as prometheus metrics + */ +@Singleton +public class MeteredTracerProvider implements Provider { + private TracerProvider tracerProvider; + + @Inject + public MeteredTracerProvider(Set metricsReporter) { + MicrometerMetricsFactory internalMetricsFactory = new MicrometerMetricsFactory(); + Configuration configuration = Configuration.fromEnv(); + Tracer tracer = + configuration.getTracerBuilder().withMetricsFactory(internalMetricsFactory).build(); + + this.tracerProvider = new TracerProvider(Metrics.decorate(tracer, metricsReporter)); + } + + @Override + public TracerProvider get() { + return tracerProvider; + } +} diff --git a/core/che-core-tracing-metrics/src/main/java/org/eclipse/che/core/tracing/metrics/MicrometerMetricsReporterProvider.java b/core/che-core-tracing-metrics/src/main/java/org/eclipse/che/core/tracing/metrics/MicrometerMetricsReporterProvider.java new file mode 100644 index 0000000000..6f003e5bc5 --- /dev/null +++ b/core/che-core-tracing-metrics/src/main/java/org/eclipse/che/core/tracing/metrics/MicrometerMetricsReporterProvider.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2012-2018 Red Hat, Inc. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.che.core.tracing.metrics; + +import io.opentracing.contrib.metrics.micrometer.MicrometerMetricsReporter; +import io.opentracing.tag.Tags; +import javax.inject.Provider; +import javax.inject.Singleton; + +/** + * Provider of {@link MicrometerMetricsReporter}, which is responsible for reporting metrics of + * traced spans to prometheus server. Here is also specified configuration as for metrics name and + * tags. + * + *

This reporter is configured to report all spans with "span.kind" server, as well as provide + * additional label "http.status_code", if such tag is available in the span. + * + *

When defining tags , if "Default value" will be null, then the spans which don't have such + * tag, then will not be reported. + * + *

Visit https://github.com/opentracing-contrib/java-metrics to find out about how to configure + * reporter. + */ +@Singleton +public class MicrometerMetricsReporterProvider implements Provider { + + private static final String TRACING_METRIC_NAME = "che_server_api_tracing_span"; + + private final MicrometerMetricsReporter micrometerMetricsReporter; + + public MicrometerMetricsReporterProvider() { + micrometerMetricsReporter = + MicrometerMetricsReporter.newMetricsReporter() + .withName(TRACING_METRIC_NAME) + .withTagLabel(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_SERVER) + .withTagLabel(Tags.HTTP_STATUS.getKey(), "undefined") + .build(); + } + + @Override + public MicrometerMetricsReporter get() { + return micrometerMetricsReporter; + } +} diff --git a/core/che-core-tracing-metrics/src/main/java/org/eclipse/che/core/tracing/metrics/TracingMetricsModule.java b/core/che-core-tracing-metrics/src/main/java/org/eclipse/che/core/tracing/metrics/TracingMetricsModule.java new file mode 100644 index 0000000000..09c2c50285 --- /dev/null +++ b/core/che-core-tracing-metrics/src/main/java/org/eclipse/che/core/tracing/metrics/TracingMetricsModule.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2012-2018 Red Hat, Inc. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.che.core.tracing.metrics; + +import com.google.inject.AbstractModule; +import com.google.inject.multibindings.Multibinder; +import io.opentracing.contrib.metrics.MetricsReporter; +import org.eclipse.che.core.tracing.TracerProvider; + +public class TracingMetricsModule extends AbstractModule { + @Override + protected void configure() { + + bind(TracerProvider.class).toProvider(MeteredTracerProvider.class); + + Multibinder metricsReporterBinder = + Multibinder.newSetBinder(binder(), MetricsReporter.class); + metricsReporterBinder.addBinding().toProvider(MicrometerMetricsReporterProvider.class); + } +} diff --git a/core/pom.xml b/core/pom.xml index 6ba14dd071..2c87b7f932 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -40,5 +40,6 @@ che-core-tracing-core che-core-tracing-web che-core-metrics-core + che-core-tracing-metrics diff --git a/pom.xml b/pom.xml index 721ea4cfc5..9bd1e55577 100644 --- a/pom.xml +++ b/pom.xml @@ -783,6 +783,11 @@ che-core-tracing-core ${che.version} + + org.eclipse.che.core + che-core-tracing-metrics + ${che.version} + org.eclipse.che.core che-core-tracing-web