README.md
1# OpenCensus - A stats collection and distributed tracing framework
2[![Gitter chat][gitter-image]][gitter-url]
3[![Maven Central][maven-image]][maven-url]
4[![Javadocs][javadoc-image]][javadoc-url]
5[![Build Status][travis-image]][travis-url]
6[![Windows Build Status][appveyor-image]][appveyor-url]
7[![Coverage Status][codecov-image]][codecov-url]
8
9
10OpenCensus is a toolkit for collecting application performance and behavior data. It currently
11includes 3 apis: stats, tracing and tags.
12
13The library is in [Beta](#versioning) stage and APIs are expected to be mostly stable. The
14library is expected to move to [GA](#versioning) stage after v1.0.0 major release.
15
16Please join [gitter](https://gitter.im/census-instrumentation/Lobby) for help or feedback on this
17project.
18
19## OpenCensus Quickstart for Libraries
20
21Integrating OpenCensus with a new library means recording stats or traces and propagating context.
22For application integration please see [Quickstart for Applications](https://github.com/census-instrumentation/opencensus-java#quickstart-for-applications).
23
24The full quick start example can also be found on the [OpenCensus website](https://opencensus.io/java/index.html).
25
26### Add the dependencies to your project
27
28For Maven add to your `pom.xml`:
29```xml
30<dependencies>
31 <dependency>
32 <groupId>io.opencensus</groupId>
33 <artifactId>opencensus-api</artifactId>
34 <version>0.16.1</version>
35 </dependency>
36</dependencies>
37```
38
39For Gradle add to your dependencies:
40```gradle
41compile 'io.opencensus:opencensus-api:0.16.1'
42```
43
44For Bazel add the following lines to the WORKSPACE file:
45```
46maven_jar(
47 name = "io_opencensus_opencensus_api",
48 artifact = "io.opencensus:opencensus-api:0.15.0",
49 sha1 = "9a098392b287d7924660837f4eba0ce252013683",
50)
51```
52Then targets can specify `@io_opencensus_opencensus_api//jar` as a dependency to depend on this jar:
53```bazel
54deps = [
55 "@io_opencensus_opencensus_api//jar",
56]
57```
58You may also need to import the transitive dependencies. See [generate external dependencies from
59Maven projects](https://docs.bazel.build/versions/master/generate-workspace.html).
60
61### Hello "OpenCensus" trace events
62
63Here's an example of creating a Span and record some trace annotations. Notice that recording the
64annotations is possible because we propagate scope. 3rd parties libraries like SLF4J can integrate
65the same way.
66
67```java
68import io.opencensus.common.Scope;
69import io.opencensus.trace.Tracer;
70import io.opencensus.trace.Tracing;
71import io.opencensus.trace.samplers.Samplers;
72
73public final class MyClassWithTracing {
74 private static final Tracer tracer = Tracing.getTracer();
75
76 public static void doWork() {
77 // Create a child Span of the current Span. Always record events for this span and force it to
78 // be sampled. This makes it easier to try out the example, but unless you have a clear use
79 // case, you don't need to explicitly set record events or sampler.
80 try (Scope ss =
81 tracer
82 .spanBuilder("MyChildWorkSpan")
83 .setRecordEvents(true)
84 .setSampler(Samplers.alwaysSample())
85 .startScopedSpan()) {
86 doInitialWork();
87 tracer.getCurrentSpan().addAnnotation("Finished initial work");
88 doFinalWork();
89 }
90 }
91
92 private static void doInitialWork() {
93 // ...
94 tracer.getCurrentSpan().addAnnotation("Important.");
95 // ...
96 }
97
98 private static void doFinalWork() {
99 // ...
100 tracer.getCurrentSpan().addAnnotation("More important.");
101 // ...
102 }
103}
104```
105
106### Hello "OpenCensus" stats events
107
108Here's an example on
109 * defining TagKey, Measure and View,
110 * registering a view,
111 * putting TagKey and TagValue into a scoped TagContext,
112 * recording stats against current TagContext,
113 * getting ViewData.
114
115
116For the complete example, see
117[here](https://github.com/census-instrumentation/opencensus-java/blob/master/examples/src/main/java/io/opencensus/examples/helloworld/QuickStart.java).
118
119```java
120import io.opencensus.common.Scope;
121import io.opencensus.stats.Aggregation;
122import io.opencensus.stats.BucketBoundaries;
123import io.opencensus.stats.Measure.MeasureLong;
124import io.opencensus.stats.Stats;
125import io.opencensus.stats.StatsRecorder;
126import io.opencensus.stats.View;
127import io.opencensus.stats.ViewData;
128import io.opencensus.stats.ViewManager;
129import io.opencensus.tags.TagKey;
130import io.opencensus.tags.TagValue;
131import io.opencensus.tags.Tagger;
132import io.opencensus.tags.Tags;
133import java.util.Arrays;
134import java.util.Collections;
135
136public final class MyClassWithStats {
137 private static final Tagger tagger = Tags.getTagger();
138 private static final ViewManager viewManager = Stats.getViewManager();
139 private static final StatsRecorder statsRecorder = Stats.getStatsRecorder();
140
141 // frontendKey allows us to break down the recorded data
142 private static final TagKey FRONTEND_KEY = TagKey.create("myorg_keys_frontend");
143
144 // videoSize will measure the size of processed videos.
145 private static final MeasureLong VIDEO_SIZE =
146 MeasureLong.create("my.org/measure/video_size", "size of processed videos", "By");
147
148 // Create view to see the processed video size distribution broken down by frontend.
149 // The view has bucket boundaries (0, 256, 65536) that will group measure values into
150 // histogram buckets.
151 private static final View.Name VIDEO_SIZE_VIEW_NAME = View.Name.create("my.org/views/video_size");
152 private static final View VIDEO_SIZE_VIEW =
153 View.create(
154 VIDEO_SIZE_VIEW_NAME,
155 "processed video size over time",
156 VIDEO_SIZE,
157 Aggregation.Distribution.create(
158 BucketBoundaries.create(Arrays.asList(0.0, 256.0, 65536.0))),
159 Collections.singletonList(FRONTEND_KEY));
160
161 public static void initialize() {
162 // ...
163 viewManager.registerView(VIDEO_SIZE_VIEW);
164 }
165
166 public static void processVideo() {
167 try (Scope scopedTags =
168 tagger
169 .currentBuilder()
170 .put(FRONTEND_KEY, TagValue.create("mobile-ios9.3.5"))
171 .buildScoped()) {
172 // Processing video.
173 // ...
174
175 // Record the processed video size.
176 statsRecorder.newMeasureMap().put(VIDEO_SIZE, 25648).record();
177 }
178 }
179
180 public static void printStats() {
181 ViewData viewData = viewManager.getView(VIDEO_SIZE_VIEW_NAME);
182 System.out.println(
183 String.format("Recorded stats for %s:\n %s", VIDEO_SIZE_VIEW_NAME.asString(), viewData));
184 }
185}
186```
187
188## OpenCensus Quickstart for Applications
189
190Besides recording tracing/stats events the application also need to link the implementation,
191setup exporters, and debugging [Z-Pages](https://github.com/census-instrumentation/opencensus-java/tree/master/contrib/zpages).
192
193### Add the dependencies to your project
194
195For Maven add to your `pom.xml`:
196```xml
197<dependencies>
198 <dependency>
199 <groupId>io.opencensus</groupId>
200 <artifactId>opencensus-api</artifactId>
201 <version>0.16.1</version>
202 </dependency>
203 <dependency>
204 <groupId>io.opencensus</groupId>
205 <artifactId>opencensus-impl</artifactId>
206 <version>0.16.1</version>
207 <scope>runtime</scope>
208 </dependency>
209</dependencies>
210```
211
212For Gradle add to your dependencies:
213```gradle
214compile 'io.opencensus:opencensus-api:0.16.1'
215runtime 'io.opencensus:opencensus-impl:0.16.1'
216```
217
218For Bazel add the following lines to the WORKSPACE file:
219```
220maven_jar(
221 name = "io_opencensus_opencensus_api",
222 artifact = "io.opencensus:opencensus-api:0.15.0",
223 sha1 = "9a098392b287d7924660837f4eba0ce252013683",
224)
225
226maven_jar(
227 name = "io_opencensus_opencensus_impl_core",
228 artifact = "io.opencensus:opencensus-impl-core:0.15.0",
229 sha1 = "36c775926ba1e54af7c37d0503cfb99d986f6229",
230)
231
232maven_jar(
233 name = "io_opencensus_opencensus_impl",
234 artifact = "io.opencensus:opencensus-impl:0.15.0",
235 sha1 = "d7bf0d7ee5a0594f840271c11c9f8d6f754f35d6",
236)
237```
238Then add the following lines to BUILD.bazel file:
239```bazel
240deps = [
241 "@io_opencensus_opencensus_api//jar",
242]
243runtime_deps = [
244 "@io_opencensus_opencensus_impl_core//jar",
245 "@io_opencensus_opencensus_impl//jar",
246]
247```
248Again you may need to import the transitive dependencies. See [generate external dependencies from
249Maven projects](https://docs.bazel.build/versions/master/generate-workspace.html).
250
251### How to setup exporters?
252
253#### Trace exporters
254* [Instana][TraceExporterInstana]
255* [Jaeger][TraceExporterJaeger]
256* [Logging][TraceExporterLogging]
257* [Stackdriver][TraceExporterStackdriver]
258* [Zipkin][TraceExporterZipkin]
259
260#### Stats exporters
261* [Stackdriver][StatsExporterStackdriver]
262* [SignalFx][StatsExporterSignalFx]
263* [Prometheus][StatsExporterPrometheus]
264
265### How to setup debugging Z-Pages?
266
267If the application owner wants to export in-process tracing and stats data via HTML debugging pages
268see this [link](https://github.com/census-instrumentation/opencensus-java/tree/master/contrib/zpages#quickstart).
269
270## Versioning
271
272This library follows [Semantic Versioning][semver].
273
274**GA**: Libraries defined at a GA quality level are stable, and will not introduce
275backwards-incompatible changes in any minor or patch releases. We will address issues and requests
276with the highest priority. If we were to make a backwards-incompatible changes on an API, we will
277first mark the existing API as deprecated and keep it for 18 months before removing it.
278
279**Beta**: Libraries defined at a Beta quality level are expected to be mostly stable and we're
280working towards their release candidate. We will address issues and requests with a higher priority.
281There may be backwards incompatible changes in a minor version release, though not in a patch
282release. If an element is part of an API that is only meant to be used by exporters or other
283opencensus libraries, then there is no deprecation period. Otherwise, we will deprecate it for 18
284months before removing it, if possible.
285
286[travis-image]: https://travis-ci.org/census-instrumentation/opencensus-java.svg?branch=master
287[travis-url]: https://travis-ci.org/census-instrumentation/opencensus-java
288[appveyor-image]: https://ci.appveyor.com/api/projects/status/hxthmpkxar4jq4be/branch/master?svg=true
289[appveyor-url]: https://ci.appveyor.com/project/opencensusjavateam/opencensus-java/branch/master
290[javadoc-image]: https://www.javadoc.io/badge/io.opencensus/opencensus-api.svg
291[javadoc-url]: https://www.javadoc.io/doc/io.opencensus/opencensus-api
292[maven-image]: https://maven-badges.herokuapp.com/maven-central/io.opencensus/opencensus-api/badge.svg
293[maven-url]: https://maven-badges.herokuapp.com/maven-central/io.opencensus/opencensus-api
294[gitter-image]: https://badges.gitter.im/census-instrumentation/lobby.svg
295[gitter-url]: https://gitter.im/census-instrumentation/lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
296[codecov-image]: https://codecov.io/gh/census-instrumentation/opencensus-java/branch/master/graph/badge.svg
297[codecov-url]: https://codecov.io/gh/census-instrumentation/opencensus-java/branch/master/
298[semver]: http://semver.org/
299[TraceExporterInstana]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/trace/instana#quickstart
300[TraceExporterJaeger]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/trace/jaeger#quickstart
301[TraceExporterLogging]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/trace/logging#quickstart
302[TraceExporterStackdriver]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/trace/stackdriver#quickstart
303[TraceExporterZipkin]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/trace/zipkin#quickstart
304[StatsExporterStackdriver]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/stats/stackdriver#quickstart
305[StatsExporterSignalFx]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/stats/signalfx#quickstart
306[StatsExporterPrometheus]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/stats/prometheus#quickstart
307