xref: /aosp_15_r20/external/opencensus-java/README.md (revision a24ffb47c3166327784aa05b149974e82e8f71b8)
1*a24ffb47SSadaf Ebrahimi> **Warning**
2*a24ffb47SSadaf Ebrahimi>
3*a24ffb47SSadaf Ebrahimi> OpenCensus and OpenTracing have merged to form [OpenTelemetry](https://opentelemetry.io), which serves as the next major version of OpenCensus and OpenTracing.
4*a24ffb47SSadaf Ebrahimi>
5*a24ffb47SSadaf Ebrahimi> OpenTelemetry has now reached feature parity with OpenCensus, with tracing and metrics SDKs available in .NET, Golang, Java, NodeJS, and Python. **All OpenCensus Github repositories, except [census-instrumentation/opencensus-python](https://github.com/census-instrumentation/opencensus-python), will be archived on July 31st, 2023**. We encourage users to migrate to OpenTelemetry by this date.
6*a24ffb47SSadaf Ebrahimi>
7*a24ffb47SSadaf Ebrahimi> To help you gradually migrate your instrumentation to OpenTelemetry, bridges are available in Java, Go, Python, and JS. [**Read the full blog post to learn more**](https://opentelemetry.io/blog/2023/sunsetting-opencensus/).
8*a24ffb47SSadaf Ebrahimi
9*a24ffb47SSadaf Ebrahimi# OpenCensus - A stats collection and distributed tracing framework
10*a24ffb47SSadaf Ebrahimi[![Gitter chat][gitter-image]][gitter-url]
11*a24ffb47SSadaf Ebrahimi[![Maven Central][maven-image]][maven-url]
12*a24ffb47SSadaf Ebrahimi[![Javadocs][javadoc-image]][javadoc-url]
13*a24ffb47SSadaf Ebrahimi[![Build Status][travis-image]][travis-url]
14*a24ffb47SSadaf Ebrahimi[![Windows Build Status][appveyor-image]][appveyor-url]
15*a24ffb47SSadaf Ebrahimi[![Coverage Status][codecov-image]][codecov-url]
16*a24ffb47SSadaf Ebrahimi
17*a24ffb47SSadaf Ebrahimi> :exclamation: The [opencensus-contrib-log-correlation-log4j2](https://github.com/census-instrumentation/opencensus-java/tree/master/contrib/log_correlation/stackdriver)
18*a24ffb47SSadaf Ebrahimi> Java client library  is part of the OpenCensus project.
19*a24ffb47SSadaf Ebrahimi> [CVE-2021-44228](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44228)
20*a24ffb47SSadaf Ebrahimi> and [CVE-2021-45046](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-45046) disclosed
21*a24ffb47SSadaf Ebrahimi> security vulnerabilities in the Apache Log4j 2 version 2.15 or below. The recent version
22*a24ffb47SSadaf Ebrahimi> v0.28.3 depends on Log4j 2.11.1. A number of previous versions also depend on vulnerable
23*a24ffb47SSadaf Ebrahimi> Log4j versions.
24*a24ffb47SSadaf Ebrahimi>
25*a24ffb47SSadaf Ebrahimi> :exclamation: We merged several fixes and published a release that depends on a safe version of
26*a24ffb47SSadaf Ebrahimi> Log4j (2.16). **We strongly encourage customers who depend on the
27*a24ffb47SSadaf Ebrahimi> opencensus-contrib-log-correlation-log4j2 library to upgrade to the latest
28*a24ffb47SSadaf Ebrahimi> release [(v0.30.0)](https://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-log-correlation-log4j2/0.30.0/).**
29*a24ffb47SSadaf Ebrahimi
30*a24ffb47SSadaf EbrahimiOpenCensus is a toolkit for collecting application performance and behavior data. It currently
31*a24ffb47SSadaf Ebrahimiincludes 3 apis: stats, tracing and tags.
32*a24ffb47SSadaf Ebrahimi
33*a24ffb47SSadaf EbrahimiThe library is in [Beta](#versioning) stage and APIs are expected to be mostly stable.
34*a24ffb47SSadaf Ebrahimi
35*a24ffb47SSadaf EbrahimiPlease join [gitter](https://gitter.im/census-instrumentation/Lobby) for help or feedback on this
36*a24ffb47SSadaf Ebrahimiproject.
37*a24ffb47SSadaf Ebrahimi
38*a24ffb47SSadaf Ebrahimi**OpenCensus and OpenTracing have merged to form OpenTelemetry, which serves as the next major version of OpenCensus and OpenTracing. OpenTelemetry will offer backwards compatibility with existing OpenCensus integrations, and we will continue to make security patches to existing OpenCensus libraries for two years. Read more about the merger [here](https://medium.com/opentracing/a-roadmap-to-convergence-b074e5815289).**
39*a24ffb47SSadaf Ebrahimi
40*a24ffb47SSadaf Ebrahimi## OpenCensus Quickstart for Libraries
41*a24ffb47SSadaf Ebrahimi
42*a24ffb47SSadaf EbrahimiIntegrating OpenCensus with a new library means recording stats or traces and propagating context.
43*a24ffb47SSadaf EbrahimiFor application integration please see [Quickstart for Applications](https://github.com/census-instrumentation/opencensus-java#quickstart-for-applications).
44*a24ffb47SSadaf Ebrahimi
45*a24ffb47SSadaf EbrahimiThe full quick start example can also be found on the [OpenCensus website](https://opencensus.io/quickstart/java/).
46*a24ffb47SSadaf Ebrahimi
47*a24ffb47SSadaf Ebrahimi### Add the dependencies to your project
48*a24ffb47SSadaf Ebrahimi
49*a24ffb47SSadaf EbrahimiFor Maven add to your `pom.xml`:
50*a24ffb47SSadaf Ebrahimi```xml
51*a24ffb47SSadaf Ebrahimi<dependencies>
52*a24ffb47SSadaf Ebrahimi  <dependency>
53*a24ffb47SSadaf Ebrahimi    <groupId>io.opencensus</groupId>
54*a24ffb47SSadaf Ebrahimi    <artifactId>opencensus-api</artifactId>
55*a24ffb47SSadaf Ebrahimi    <version>0.30.0</version>
56*a24ffb47SSadaf Ebrahimi  </dependency>
57*a24ffb47SSadaf Ebrahimi</dependencies>
58*a24ffb47SSadaf Ebrahimi```
59*a24ffb47SSadaf Ebrahimi
60*a24ffb47SSadaf EbrahimiFor Gradle add to your dependencies:
61*a24ffb47SSadaf Ebrahimi```groovy
62*a24ffb47SSadaf Ebrahimicompile 'io.opencensus:opencensus-api:0.30.0'
63*a24ffb47SSadaf Ebrahimi```
64*a24ffb47SSadaf Ebrahimi
65*a24ffb47SSadaf Ebrahimi### Hello "OpenCensus" trace events
66*a24ffb47SSadaf Ebrahimi
67*a24ffb47SSadaf EbrahimiHere's an example of creating a Span and record some trace annotations. Notice that recording the
68*a24ffb47SSadaf Ebrahimiannotations is possible because we propagate scope. 3rd parties libraries like SLF4J can integrate
69*a24ffb47SSadaf Ebrahimithe same way.
70*a24ffb47SSadaf Ebrahimi
71*a24ffb47SSadaf Ebrahimi```java
72*a24ffb47SSadaf Ebrahimiimport io.opencensus.common.Scope;
73*a24ffb47SSadaf Ebrahimiimport io.opencensus.trace.Tracer;
74*a24ffb47SSadaf Ebrahimiimport io.opencensus.trace.Tracing;
75*a24ffb47SSadaf Ebrahimiimport io.opencensus.trace.samplers.Samplers;
76*a24ffb47SSadaf Ebrahimi
77*a24ffb47SSadaf Ebrahimipublic final class MyClassWithTracing {
78*a24ffb47SSadaf Ebrahimi  private static final Tracer tracer = Tracing.getTracer();
79*a24ffb47SSadaf Ebrahimi
80*a24ffb47SSadaf Ebrahimi  public static void doWork() {
81*a24ffb47SSadaf Ebrahimi    // Create a child Span of the current Span. Always record events for this span and force it to
82*a24ffb47SSadaf Ebrahimi    // be sampled. This makes it easier to try out the example, but unless you have a clear use
83*a24ffb47SSadaf Ebrahimi    // case, you don't need to explicitly set record events or sampler.
84*a24ffb47SSadaf Ebrahimi    try (Scope ss =
85*a24ffb47SSadaf Ebrahimi        tracer
86*a24ffb47SSadaf Ebrahimi            .spanBuilder("MyChildWorkSpan")
87*a24ffb47SSadaf Ebrahimi            .setRecordEvents(true)
88*a24ffb47SSadaf Ebrahimi            .setSampler(Samplers.alwaysSample())
89*a24ffb47SSadaf Ebrahimi            .startScopedSpan()) {
90*a24ffb47SSadaf Ebrahimi      doInitialWork();
91*a24ffb47SSadaf Ebrahimi      tracer.getCurrentSpan().addAnnotation("Finished initial work");
92*a24ffb47SSadaf Ebrahimi      doFinalWork();
93*a24ffb47SSadaf Ebrahimi    }
94*a24ffb47SSadaf Ebrahimi  }
95*a24ffb47SSadaf Ebrahimi
96*a24ffb47SSadaf Ebrahimi  private static void doInitialWork() {
97*a24ffb47SSadaf Ebrahimi    // ...
98*a24ffb47SSadaf Ebrahimi    tracer.getCurrentSpan().addAnnotation("Important.");
99*a24ffb47SSadaf Ebrahimi    // ...
100*a24ffb47SSadaf Ebrahimi  }
101*a24ffb47SSadaf Ebrahimi
102*a24ffb47SSadaf Ebrahimi  private static void doFinalWork() {
103*a24ffb47SSadaf Ebrahimi    // ...
104*a24ffb47SSadaf Ebrahimi    tracer.getCurrentSpan().addAnnotation("More important.");
105*a24ffb47SSadaf Ebrahimi    // ...
106*a24ffb47SSadaf Ebrahimi  }
107*a24ffb47SSadaf Ebrahimi}
108*a24ffb47SSadaf Ebrahimi```
109*a24ffb47SSadaf Ebrahimi
110*a24ffb47SSadaf Ebrahimi### Hello "OpenCensus" stats events
111*a24ffb47SSadaf Ebrahimi
112*a24ffb47SSadaf EbrahimiHere's an example on
113*a24ffb47SSadaf Ebrahimi * defining TagKey, Measure and View,
114*a24ffb47SSadaf Ebrahimi * registering a view,
115*a24ffb47SSadaf Ebrahimi * putting TagKey and TagValue into a scoped TagContext,
116*a24ffb47SSadaf Ebrahimi * recording stats against current TagContext,
117*a24ffb47SSadaf Ebrahimi * getting ViewData.
118*a24ffb47SSadaf Ebrahimi
119*a24ffb47SSadaf Ebrahimi
120*a24ffb47SSadaf EbrahimiFor the complete example, see
121*a24ffb47SSadaf Ebrahimi[here](https://github.com/census-instrumentation/opencensus-java/blob/master/examples/src/main/java/io/opencensus/examples/helloworld/QuickStart.java).
122*a24ffb47SSadaf Ebrahimi
123*a24ffb47SSadaf Ebrahimi```java
124*a24ffb47SSadaf Ebrahimiimport io.opencensus.common.Scope;
125*a24ffb47SSadaf Ebrahimiimport io.opencensus.stats.Aggregation;
126*a24ffb47SSadaf Ebrahimiimport io.opencensus.stats.BucketBoundaries;
127*a24ffb47SSadaf Ebrahimiimport io.opencensus.stats.Measure.MeasureLong;
128*a24ffb47SSadaf Ebrahimiimport io.opencensus.stats.Stats;
129*a24ffb47SSadaf Ebrahimiimport io.opencensus.stats.StatsRecorder;
130*a24ffb47SSadaf Ebrahimiimport io.opencensus.stats.View;
131*a24ffb47SSadaf Ebrahimiimport io.opencensus.stats.ViewData;
132*a24ffb47SSadaf Ebrahimiimport io.opencensus.stats.ViewManager;
133*a24ffb47SSadaf Ebrahimiimport io.opencensus.tags.TagKey;
134*a24ffb47SSadaf Ebrahimiimport io.opencensus.tags.TagValue;
135*a24ffb47SSadaf Ebrahimiimport io.opencensus.tags.Tagger;
136*a24ffb47SSadaf Ebrahimiimport io.opencensus.tags.Tags;
137*a24ffb47SSadaf Ebrahimiimport java.util.Arrays;
138*a24ffb47SSadaf Ebrahimiimport java.util.Collections;
139*a24ffb47SSadaf Ebrahimi
140*a24ffb47SSadaf Ebrahimipublic final class MyClassWithStats {
141*a24ffb47SSadaf Ebrahimi  private static final Tagger tagger = Tags.getTagger();
142*a24ffb47SSadaf Ebrahimi  private static final ViewManager viewManager = Stats.getViewManager();
143*a24ffb47SSadaf Ebrahimi  private static final StatsRecorder statsRecorder = Stats.getStatsRecorder();
144*a24ffb47SSadaf Ebrahimi
145*a24ffb47SSadaf Ebrahimi  // frontendKey allows us to break down the recorded data
146*a24ffb47SSadaf Ebrahimi  private static final TagKey FRONTEND_KEY = TagKey.create("myorg_keys_frontend");
147*a24ffb47SSadaf Ebrahimi
148*a24ffb47SSadaf Ebrahimi  // videoSize will measure the size of processed videos.
149*a24ffb47SSadaf Ebrahimi  private static final MeasureLong VIDEO_SIZE =
150*a24ffb47SSadaf Ebrahimi      MeasureLong.create("my.org/measure/video_size", "size of processed videos", "By");
151*a24ffb47SSadaf Ebrahimi
152*a24ffb47SSadaf Ebrahimi  // Create view to see the processed video size distribution broken down by frontend.
153*a24ffb47SSadaf Ebrahimi  // The view has bucket boundaries (0, 256, 65536) that will group measure values into
154*a24ffb47SSadaf Ebrahimi  // histogram buckets.
155*a24ffb47SSadaf Ebrahimi  private static final View.Name VIDEO_SIZE_VIEW_NAME = View.Name.create("my.org/views/video_size");
156*a24ffb47SSadaf Ebrahimi  private static final View VIDEO_SIZE_VIEW =
157*a24ffb47SSadaf Ebrahimi      View.create(
158*a24ffb47SSadaf Ebrahimi          VIDEO_SIZE_VIEW_NAME,
159*a24ffb47SSadaf Ebrahimi          "processed video size over time",
160*a24ffb47SSadaf Ebrahimi          VIDEO_SIZE,
161*a24ffb47SSadaf Ebrahimi          Aggregation.Distribution.create(
162*a24ffb47SSadaf Ebrahimi              BucketBoundaries.create(Arrays.asList(0.0, 256.0, 65536.0))),
163*a24ffb47SSadaf Ebrahimi          Collections.singletonList(FRONTEND_KEY));
164*a24ffb47SSadaf Ebrahimi
165*a24ffb47SSadaf Ebrahimi  public static void initialize() {
166*a24ffb47SSadaf Ebrahimi    // ...
167*a24ffb47SSadaf Ebrahimi    viewManager.registerView(VIDEO_SIZE_VIEW);
168*a24ffb47SSadaf Ebrahimi  }
169*a24ffb47SSadaf Ebrahimi
170*a24ffb47SSadaf Ebrahimi  public static void processVideo() {
171*a24ffb47SSadaf Ebrahimi    try (Scope scopedTags =
172*a24ffb47SSadaf Ebrahimi        tagger
173*a24ffb47SSadaf Ebrahimi            .currentBuilder()
174*a24ffb47SSadaf Ebrahimi            .put(FRONTEND_KEY, TagValue.create("mobile-ios9.3.5"))
175*a24ffb47SSadaf Ebrahimi            .buildScoped()) {
176*a24ffb47SSadaf Ebrahimi      // Processing video.
177*a24ffb47SSadaf Ebrahimi      // ...
178*a24ffb47SSadaf Ebrahimi
179*a24ffb47SSadaf Ebrahimi      // Record the processed video size.
180*a24ffb47SSadaf Ebrahimi      statsRecorder.newMeasureMap().put(VIDEO_SIZE, 25648).record();
181*a24ffb47SSadaf Ebrahimi    }
182*a24ffb47SSadaf Ebrahimi  }
183*a24ffb47SSadaf Ebrahimi
184*a24ffb47SSadaf Ebrahimi  public static void printStats() {
185*a24ffb47SSadaf Ebrahimi    ViewData viewData = viewManager.getView(VIDEO_SIZE_VIEW_NAME);
186*a24ffb47SSadaf Ebrahimi    System.out.println(
187*a24ffb47SSadaf Ebrahimi        String.format("Recorded stats for %s:\n %s", VIDEO_SIZE_VIEW_NAME.asString(), viewData));
188*a24ffb47SSadaf Ebrahimi  }
189*a24ffb47SSadaf Ebrahimi}
190*a24ffb47SSadaf Ebrahimi```
191*a24ffb47SSadaf Ebrahimi
192*a24ffb47SSadaf Ebrahimi## OpenCensus Quickstart for Applications
193*a24ffb47SSadaf Ebrahimi
194*a24ffb47SSadaf EbrahimiBesides recording tracing/stats events the application also need to link the implementation,
195*a24ffb47SSadaf Ebrahimisetup exporters, and debugging [Z-Pages](https://github.com/census-instrumentation/opencensus-java/tree/master/contrib/zpages).
196*a24ffb47SSadaf Ebrahimi
197*a24ffb47SSadaf Ebrahimi### Add the dependencies to your project
198*a24ffb47SSadaf Ebrahimi
199*a24ffb47SSadaf EbrahimiFor Maven add to your `pom.xml`:
200*a24ffb47SSadaf Ebrahimi```xml
201*a24ffb47SSadaf Ebrahimi<dependencies>
202*a24ffb47SSadaf Ebrahimi  <dependency>
203*a24ffb47SSadaf Ebrahimi    <groupId>io.opencensus</groupId>
204*a24ffb47SSadaf Ebrahimi    <artifactId>opencensus-api</artifactId>
205*a24ffb47SSadaf Ebrahimi    <version>0.30.0</version>
206*a24ffb47SSadaf Ebrahimi  </dependency>
207*a24ffb47SSadaf Ebrahimi  <dependency>
208*a24ffb47SSadaf Ebrahimi    <groupId>io.opencensus</groupId>
209*a24ffb47SSadaf Ebrahimi    <artifactId>opencensus-impl</artifactId>
210*a24ffb47SSadaf Ebrahimi    <version>0.30.0</version>
211*a24ffb47SSadaf Ebrahimi    <scope>runtime</scope>
212*a24ffb47SSadaf Ebrahimi  </dependency>
213*a24ffb47SSadaf Ebrahimi</dependencies>
214*a24ffb47SSadaf Ebrahimi```
215*a24ffb47SSadaf Ebrahimi
216*a24ffb47SSadaf EbrahimiFor Gradle add to your dependencies:
217*a24ffb47SSadaf Ebrahimi```groovy
218*a24ffb47SSadaf Ebrahimicompile 'io.opencensus:opencensus-api:0.30.0'
219*a24ffb47SSadaf Ebrahimiruntime 'io.opencensus:opencensus-impl:0.30.0'
220*a24ffb47SSadaf Ebrahimi```
221*a24ffb47SSadaf Ebrahimi
222*a24ffb47SSadaf Ebrahimi### How to setup exporters?
223*a24ffb47SSadaf Ebrahimi
224*a24ffb47SSadaf Ebrahimi#### Trace exporters
225*a24ffb47SSadaf Ebrahimi* [Instana][TraceExporterInstana]
226*a24ffb47SSadaf Ebrahimi* [Jaeger][TraceExporterJaeger]
227*a24ffb47SSadaf Ebrahimi* [Logging][TraceExporterLogging]
228*a24ffb47SSadaf Ebrahimi* [Stackdriver][TraceExporterStackdriver]
229*a24ffb47SSadaf Ebrahimi* [Zipkin][TraceExporterZipkin]
230*a24ffb47SSadaf Ebrahimi
231*a24ffb47SSadaf Ebrahimi#### Stats exporters
232*a24ffb47SSadaf Ebrahimi* [Stackdriver][StatsExporterStackdriver]
233*a24ffb47SSadaf Ebrahimi* [SignalFx][StatsExporterSignalFx]
234*a24ffb47SSadaf Ebrahimi* [Prometheus][StatsExporterPrometheus]
235*a24ffb47SSadaf Ebrahimi
236*a24ffb47SSadaf Ebrahimi### How to setup debugging Z-Pages?
237*a24ffb47SSadaf Ebrahimi
238*a24ffb47SSadaf EbrahimiIf the application owner wants to export in-process tracing and stats data via HTML debugging pages
239*a24ffb47SSadaf Ebrahimisee this [link](https://github.com/census-instrumentation/opencensus-java/tree/master/contrib/zpages#quickstart).
240*a24ffb47SSadaf Ebrahimi
241*a24ffb47SSadaf Ebrahimi## Versioning
242*a24ffb47SSadaf Ebrahimi
243*a24ffb47SSadaf EbrahimiThis library follows [Semantic Versioning][semver].
244*a24ffb47SSadaf Ebrahimi
245*a24ffb47SSadaf Ebrahimi**GA**: Libraries defined at a GA quality level are stable, and will not introduce
246*a24ffb47SSadaf Ebrahimibackwards-incompatible changes in any minor or patch releases. We will address issues and requests
247*a24ffb47SSadaf Ebrahimiwith the highest priority. If we were to make a backwards-incompatible changes on an API, we will
248*a24ffb47SSadaf Ebrahimifirst mark the existing API as deprecated and keep it for 18 months before removing it.
249*a24ffb47SSadaf Ebrahimi
250*a24ffb47SSadaf Ebrahimi**Beta**: Libraries defined at a Beta quality level are expected to be mostly stable and we're
251*a24ffb47SSadaf Ebrahimiworking towards their release candidate. We will address issues and requests with a higher priority.
252*a24ffb47SSadaf EbrahimiThere may be backwards incompatible changes in a minor version release, though not in a patch
253*a24ffb47SSadaf Ebrahimirelease. If an element is part of an API that is only meant to be used by exporters or other
254*a24ffb47SSadaf Ebrahimiopencensus libraries, then there is no deprecation period. Otherwise, we will deprecate it for 18
255*a24ffb47SSadaf Ebrahimimonths before removing it, if possible.
256*a24ffb47SSadaf Ebrahimi
257*a24ffb47SSadaf Ebrahimi[travis-image]: https://travis-ci.org/census-instrumentation/opencensus-java.svg?branch=master
258*a24ffb47SSadaf Ebrahimi[travis-url]: https://travis-ci.org/census-instrumentation/opencensus-java
259*a24ffb47SSadaf Ebrahimi[appveyor-image]: https://ci.appveyor.com/api/projects/status/hxthmpkxar4jq4be/branch/master?svg=true
260*a24ffb47SSadaf Ebrahimi[appveyor-url]: https://ci.appveyor.com/project/opencensusjavateam/opencensus-java/branch/master
261*a24ffb47SSadaf Ebrahimi[javadoc-image]: https://www.javadoc.io/badge/io.opencensus/opencensus-api.svg
262*a24ffb47SSadaf Ebrahimi[javadoc-url]: https://www.javadoc.io/doc/io.opencensus/opencensus-api
263*a24ffb47SSadaf Ebrahimi[maven-image]: https://maven-badges.herokuapp.com/maven-central/io.opencensus/opencensus-api/badge.svg
264*a24ffb47SSadaf Ebrahimi[maven-url]: https://maven-badges.herokuapp.com/maven-central/io.opencensus/opencensus-api
265*a24ffb47SSadaf Ebrahimi[gitter-image]: https://badges.gitter.im/census-instrumentation/lobby.svg
266*a24ffb47SSadaf Ebrahimi[gitter-url]: https://gitter.im/census-instrumentation/lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
267*a24ffb47SSadaf Ebrahimi[codecov-image]: https://codecov.io/gh/census-instrumentation/opencensus-java/branch/master/graph/badge.svg
268*a24ffb47SSadaf Ebrahimi[codecov-url]: https://codecov.io/gh/census-instrumentation/opencensus-java/branch/master/
269*a24ffb47SSadaf Ebrahimi[semver]: http://semver.org/
270*a24ffb47SSadaf Ebrahimi[TraceExporterInstana]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/trace/instana#quickstart
271*a24ffb47SSadaf Ebrahimi[TraceExporterJaeger]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/trace/jaeger#quickstart
272*a24ffb47SSadaf Ebrahimi[TraceExporterLogging]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/trace/logging#quickstart
273*a24ffb47SSadaf Ebrahimi[TraceExporterStackdriver]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/trace/stackdriver#quickstart
274*a24ffb47SSadaf Ebrahimi[TraceExporterZipkin]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/trace/zipkin#quickstart
275*a24ffb47SSadaf Ebrahimi[StatsExporterStackdriver]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/stats/stackdriver#quickstart
276*a24ffb47SSadaf Ebrahimi[StatsExporterSignalFx]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/stats/signalfx#quickstart
277*a24ffb47SSadaf Ebrahimi[StatsExporterPrometheus]: https://github.com/census-instrumentation/opencensus-java/tree/master/exporters/stats/prometheus#quickstart
278