# OpenCensus - A stats collection and distributed tracing framework [![Gitter chat][gitter-image]][gitter-url] [![Maven Central][maven-image]][maven-url] [![Javadocs][javadoc-image]][javadoc-url] [![Build Status][travis-image]][travis-url] [![Windows Build Status][appveyor-image]][appveyor-url] [![Coverage Status][codecov-image]][codecov-url] OpenCensus is a toolkit for collecting application performance and behavior data. It currently includes 3 apis: stats, tracing and tags. The library is in alpha stage and the API is subject to change. Please join [gitter](https://gitter.im/census-instrumentation/Lobby) for help or feedback on this project. ## OpenCensus Quickstart Integrating OpenCensus with a new library means recording stats or traces and propagating context. The full quick start example can also be found on the [OpenCensus website](https://opencensus.io/java.html). ### Add the dependencies to your project For Maven add to your `pom.xml`: ```xml io.opencensus opencensus-api 0.13.0 ``` For Gradle add to your dependencies: ```gradle compile 'io.opencensus:opencensus-api:0.13.0' ``` ### Hello "OpenCensus" trace events Here's an example of creating a Span and record some trace annotations. Notice that recording the annotations is possible because we propagate scope. 3rd parties libraries like SLF4J can integrate the same way. ```java public final class MyClassWithTracing { private static final Tracer tracer = Tracing.getTracer(); public static void doWork() { // Create a child Span of the current Span. Always record events for this span and force it to // be sampled. This makes it easier to try out the example, but unless you have a clear use // case, you don't need to explicitly set record events or sampler. try (Scope ss = tracer.spanBuilder("MyChildWorkSpan") .setRecordEvents(true) .setSampler(Samplers.alwaysSample()) .startScopedSpan()) { doInitialWork(); tracer.getCurrentSpan().addAnnotation("Finished initial work"); doFinalWork(); } } private static void doInitialWork() { // ... tracer.getCurrentSpan().addAnnotation("Important."); // ... } private static void doFinalWork() { // ... tracer.getCurrentSpan().addAnnotation("More important."); // ... } } ``` ### Hello "OpenCensus" stats events Here's an example on * defining TagKey, Measure and View, * registering a view, * putting TagKey and TagValue into a scoped TagContext, * recording stats against current TagContext, * getting ViewData. For the complete example, see [here](https://github.com/census-instrumentation/opencensus-java/blob/master/examples/src/main/java/io/opencensus/examples/helloworld/QuickStart.java). ```java public final class QuickStart { private static final Tagger tagger = Tags.getTagger(); private static final ViewManager viewManager = Stats.getViewManager(); private static final StatsRecorder statsRecorder = Stats.getStatsRecorder(); // frontendKey allows us to break down the recorded data private static final TagKey FRONTEND_KEY = TagKey.create("myorg_keys_frontend"); // videoSize will measure the size of processed videos. private static final MeasureLong VIDEO_SIZE = MeasureLong.create( "my.org/measure/video_size", "size of processed videos", "By"); // Create view to see the processed video size distribution broken down by frontend. // The view has bucket boundaries (0, 256, 65536) that will group measure values into // histogram buckets. private static final View.Name VIDEO_SIZE_VIEW_NAME = View.Name.create("my.org/views/video_size"); private static final View VIDEO_SIZE_VIEW = View.create( VIDEO_SIZE_VIEW_NAME, "processed video size over time", VIDEO_SIZE, Aggregation.Distribution.create(BucketBoundaries.create(Arrays.asList(0.0, 256.0, 65536.0))), Collections.singletonList(FRONTEND_KEY), Cumulative.create()); private static void initialize() { // ... viewManager.registerView(VIDEO_SIZE_VIEW); } private static void processVideo() { try (Scope scopedTags = tagger .currentBuilder() .put(FRONTEND_KEY, TagValue.create("mobile-ios9.3.5")) .buildScoped()) { // Processing video. // ... // Record the processed video size. statsRecorder.newMeasureMap().put(VIDEO_SIZE, 25648).record(); } } private static void printStats() { ViewData viewData = viewManager.getView(VIDEO_SIZE_VIEW_NAME); System.out.println( String.format("Recorded stats for %s:\n %s", VIDEO_SIZE_VIEW_NAME.asString(), viewData)); } } ``` ## Quickstart for Applications Besides recording tracing/stats events the application also need to link the implementation, setup exporters, and debugging [Z-Pages](https://github.com/census-instrumentation/opencensus-java/tree/master/contrib/zpages). ### Add the dependencies to your project For Maven add to your `pom.xml`: ```xml io.opencensus opencensus-api 0.13.0 io.opencensus opencensus-impl 0.13.0 runtime ``` For Gradle add to your dependencies: ```gradle compile 'io.opencensus:opencensus-api:0.13.0' runtime 'io.opencensus:opencensus-impl:0.13.0' ``` ### How to setup exporters? #### Trace exporters * [Instana][TraceExporterInstana] * [Jaeger][TraceExporterJaeger] * [Logging][TraceExporterLogging] * [Stackdriver][TraceExporterStackdriver] * [Zipkin][TraceExporterZipkin] #### Stats exporters * [Stackdriver][StatsExporterStackdriver] * [SignalFx][StatsExporterSignalFx] * [Prometheus][StatsExporterPrometheus] ### How to setup debugging Z-Pages? If the application owner wants to export in-process tracing and stats data via HTML debugging pages see this [link](https://github.com/census-instrumentation/opencensus-java/tree/master/contrib/zpages#quickstart). [travis-image]: https://travis-ci.org/census-instrumentation/opencensus-java.svg?branch=master [travis-url]: https://travis-ci.org/census-instrumentation/opencensus-java [appveyor-image]: https://ci.appveyor.com/api/projects/status/hxthmpkxar4jq4be/branch/master?svg=true [appveyor-url]: https://ci.appveyor.com/project/opencensusjavateam/opencensus-java/branch/master [javadoc-image]: https://www.javadoc.io/badge/io.opencensus/opencensus-api.svg [javadoc-url]: https://www.javadoc.io/doc/io.opencensus/opencensus-api [maven-image]: https://maven-badges.herokuapp.com/maven-central/io.opencensus/opencensus-api/badge.svg [maven-url]: https://maven-badges.herokuapp.com/maven-central/io.opencensus/opencensus-api [gitter-image]: https://badges.gitter.im/census-instrumentation/lobby.svg [gitter-url]: https://gitter.im/census-instrumentation/lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge [codecov-image]: https://codecov.io/gh/census-instrumentation/opencensus-java/branch/master/graph/badge.svg [codecov-url]: https://codecov.io/gh/census-instrumentation/opencensus-java/branch/master/ [TraceExporterInstana]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/trace/instana#quickstart [TraceExporterJaeger]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/trace/jaeger#quickstart [TraceExporterLogging]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/trace/logging#quickstart [TraceExporterStackdriver]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/trace/stackdriver#quickstart [TraceExporterZipkin]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/trace/zipkin#quickstart [StatsExporterStackdriver]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/stats/stackdriver#quickstart [StatsExporterSignalFx]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/stats/signalfx#quickstart [StatsExporterPrometheus]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/stats/prometheus#quickstart