diff --git a/exporters/logging/build.gradle b/exporters/logging/build.gradle new file mode 100644 index 0000000000..5152e9a04b --- /dev/null +++ b/exporters/logging/build.gradle @@ -0,0 +1,21 @@ +description = 'OpenTelemetry - Logging Exporter' + +buildscript { + repositories { + maven { url "https://plugins.gradle.org/m2/" } + } +} + +dependencies { + api project(':opentelemetry-sdk') + + signature "org.codehaus.mojo.signature:java17:1.0@signature" + signature "net.sf.androidscents.signature:android-api-level-14:4.0_r4@signature" +} + +animalsniffer { + // Don't check sourceSets.jmh and sourceSets.test + sourceSets = [ + sourceSets.main + ] +} diff --git a/exporters/logging/src/main/java/io/opentelemetry/exporters/logging/LoggingExporter.java b/exporters/logging/src/main/java/io/opentelemetry/exporters/logging/LoggingExporter.java new file mode 100644 index 0000000000..137ce2aca5 --- /dev/null +++ b/exporters/logging/src/main/java/io/opentelemetry/exporters/logging/LoggingExporter.java @@ -0,0 +1,38 @@ +/* + * Copyright 2019, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.opentelemetry.exporters.logging; + +import io.opentelemetry.sdk.trace.SpanData; +import io.opentelemetry.sdk.trace.export.SpanExporter; +import java.util.List; +import java.util.logging.Logger; + +/** A Span Exporter that logs every span at INFO level using java.util.logging. */ +public class LoggingExporter implements SpanExporter { + private static final Logger logger = Logger.getLogger(LoggingExporter.class.getName()); + + @Override + public ResultCode export(List spans) { + for (SpanData span : spans) { + logger.info("span: " + span); + } + return ResultCode.SUCCESS; + } + + @Override + public void shutdown() {} +} diff --git a/exporters/logging/src/test/java/io/opentelemetry/exporters/logging/LoggingExporterTest.java b/exporters/logging/src/test/java/io/opentelemetry/exporters/logging/LoggingExporterTest.java new file mode 100644 index 0000000000..4ad701fdb6 --- /dev/null +++ b/exporters/logging/src/test/java/io/opentelemetry/exporters/logging/LoggingExporterTest.java @@ -0,0 +1,60 @@ +/* + * Copyright 2019, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.opentelemetry.exporters.logging; + +import static java.util.Collections.singletonList; +import static java.util.Collections.singletonMap; +import static org.junit.Assert.assertEquals; + +import io.opentelemetry.common.Timestamp; +import io.opentelemetry.sdk.trace.SpanData; +import io.opentelemetry.sdk.trace.export.SpanExporter.ResultCode; +import io.opentelemetry.trace.AttributeValue; +import io.opentelemetry.trace.Span.Kind; +import io.opentelemetry.trace.SpanId; +import io.opentelemetry.trace.Status; +import io.opentelemetry.trace.TraceId; +import io.opentelemetry.trace.util.Events; +import org.junit.Test; + +public class LoggingExporterTest { + @Test + public void returnCode() throws Exception { + LoggingExporter exporter = new LoggingExporter(); + long startTimeSecondsSinceEpoch = System.currentTimeMillis() / 1000; + SpanData spanData = + SpanData.newBuilder() + .setTraceId(new TraceId(1234L, 6789L)) + .setSpanId(new SpanId(9876L)) + .setStartTimestamp(Timestamp.create(startTimeSecondsSinceEpoch, 0)) + .setEndTimestamp(Timestamp.create(startTimeSecondsSinceEpoch, 100)) + .setStatus(Status.OK) + .setName("testSpan") + .setKind(Kind.INTERNAL) + .setTimedEvents( + singletonList( + SpanData.TimedEvent.create( + Timestamp.create(startTimeSecondsSinceEpoch, 50), + Events.create( + "somethingHappenedHere", + singletonMap( + "important", AttributeValue.booleanAttributeValue(true)))))) + .build(); + ResultCode resultCode = exporter.export(singletonList(spanData)); + assertEquals(ResultCode.SUCCESS, resultCode); + } +} diff --git a/settings.gradle b/settings.gradle index 7b84835e3e..9981e31838 100644 --- a/settings.gradle +++ b/settings.gradle @@ -5,6 +5,7 @@ include ":opentelemetry-api" include ":opentelemetry-contrib-runtime-metrics" include ":opentelemetry-contrib-trace-utils" include ":opentelemetry-exporters-jaeger" +include ":opentelemetry-exporters-logging" include ":opentelemetry-opentracing-shim" include ":opentelemetry-proto" include ":opentelemetry-sdk" @@ -19,6 +20,7 @@ project(':opentelemetry-contrib-runtime-metrics').projectDir = "$rootDir/contrib/runtime_metrics" as File project(':opentelemetry-contrib-trace-utils').projectDir = "$rootDir/contrib/trace_utils" as File project(':opentelemetry-exporters-jaeger').projectDir = "$rootDir/exporters/jaeger" as File +project(':opentelemetry-exporters-logging').projectDir = "$rootDir/exporters/logging" as File project(':opentelemetry-opentracing-shim').projectDir = "$rootDir/opentracing_shim" as File project(':opentelemetry-sdk').projectDir = "$rootDir/sdk" as File project(':opentelemetry-sdk-contrib-async-processor').projectDir =