xref: /aosp_15_r20/external/opencensus-java/contrib/spring/README.md (revision a24ffb47c3166327784aa05b149974e82e8f71b8)
1*a24ffb47SSadaf Ebrahimi# spring
2*a24ffb47SSadaf Ebrahimi[![Build Status][travis-image]][travis-url]
3*a24ffb47SSadaf Ebrahimi[![Windows Build Status][appveyor-image]][appveyor-url]
4*a24ffb47SSadaf Ebrahimi[![Maven Central][maven-image]][maven-url]
5*a24ffb47SSadaf Ebrahimi
6*a24ffb47SSadaf EbrahimiProvides annotation support for projects that use Spring.
7*a24ffb47SSadaf Ebrahimi
8*a24ffb47SSadaf Ebrahimi## Quickstart
9*a24ffb47SSadaf Ebrahimi
10*a24ffb47SSadaf Ebrahimi### Add the dependencies to your project.
11*a24ffb47SSadaf Ebrahimi
12*a24ffb47SSadaf EbrahimiReplace `SPRING_VERSION` with the version of spring you're using.
13*a24ffb47SSadaf Ebrahimi
14*a24ffb47SSadaf EbrahimiFor Maven add to your `pom.xml`:
15*a24ffb47SSadaf Ebrahimi```xml
16*a24ffb47SSadaf Ebrahimi<dependencies>
17*a24ffb47SSadaf Ebrahimi  <!-- census -->
18*a24ffb47SSadaf Ebrahimi  <dependency>
19*a24ffb47SSadaf Ebrahimi    <groupId>io.opencensus</groupId>
20*a24ffb47SSadaf Ebrahimi    <artifactId>opencensus-api</artifactId>
21*a24ffb47SSadaf Ebrahimi    <version>0.28.3</version>
22*a24ffb47SSadaf Ebrahimi  </dependency>
23*a24ffb47SSadaf Ebrahimi  <dependency>
24*a24ffb47SSadaf Ebrahimi    <groupId>io.opencensus</groupId>
25*a24ffb47SSadaf Ebrahimi    <artifactId>opencensus-contrib-spring</artifactId>
26*a24ffb47SSadaf Ebrahimi    <version>0.28.3</version>
27*a24ffb47SSadaf Ebrahimi  </dependency>
28*a24ffb47SSadaf Ebrahimi  <dependency>
29*a24ffb47SSadaf Ebrahimi    <groupId>io.opencensus</groupId>
30*a24ffb47SSadaf Ebrahimi    <artifactId>opencensus-impl</artifactId>
31*a24ffb47SSadaf Ebrahimi    <version>0.28.3</version>
32*a24ffb47SSadaf Ebrahimi    <scope>runtime</scope>
33*a24ffb47SSadaf Ebrahimi  </dependency>
34*a24ffb47SSadaf Ebrahimi
35*a24ffb47SSadaf Ebrahimi  <!-- spring aspects -->
36*a24ffb47SSadaf Ebrahimi  <dependency>
37*a24ffb47SSadaf Ebrahimi    <groupId>org.springframework</groupId>
38*a24ffb47SSadaf Ebrahimi    <artifactId>spring-aspects</artifactId>
39*a24ffb47SSadaf Ebrahimi    <version>SPRING_VERSION</version>
40*a24ffb47SSadaf Ebrahimi    <scope>runtime</scope>
41*a24ffb47SSadaf Ebrahimi  </dependency>
42*a24ffb47SSadaf Ebrahimi
43*a24ffb47SSadaf Ebrahimi</dependencies>
44*a24ffb47SSadaf Ebrahimi```
45*a24ffb47SSadaf Ebrahimi
46*a24ffb47SSadaf EbrahimiFor Gradle add to your dependencies:
47*a24ffb47SSadaf Ebrahimi```groovy
48*a24ffb47SSadaf Ebrahimicompile 'io.opencensus:opencensus-api:0.28.3'
49*a24ffb47SSadaf Ebrahimicompile 'io.opencensus:opencensus-contrib-spring:0.28.3'
50*a24ffb47SSadaf Ebrahimiruntime 'io.opencensus:opencensus-impl:0.28.3'
51*a24ffb47SSadaf Ebrahimiruntime 'org.springframework:spring-aspects:SPRING_VERSION'
52*a24ffb47SSadaf Ebrahimi```
53*a24ffb47SSadaf Ebrahimi
54*a24ffb47SSadaf Ebrahimi### Features
55*a24ffb47SSadaf Ebrahimi
56*a24ffb47SSadaf Ebrahimi#### Traced Annotation
57*a24ffb47SSadaf Ebrahimi
58*a24ffb47SSadaf EbrahimiThe `opencensus-contrib-spring` package provides support for a `@Traced` annotation
59*a24ffb47SSadaf Ebrahimithat can be applied to methods.  When applied, the method will be wrapped in a
60*a24ffb47SSadaf EbrahimiSpan, [https://github.com/census-instrumentation/opencensus-specs/blob/master/trace/Span.md](https://github.com/census-instrumentation/opencensus-specs/blob/master/trace/Span.md)
61*a24ffb47SSadaf Ebrahimi
62*a24ffb47SSadaf EbrahimiIf the method throws an exception, the `Span` will be marked with a status of `Status.UNKNOWN`
63*a24ffb47SSadaf Ebrahimiand the stack trace will be added to the span as an annotation.
64*a24ffb47SSadaf Ebrahimi
65*a24ffb47SSadaf EbrahimiTo enable the `@Traced` annotation, include the `CensusSpringAspect` bean.
66*a24ffb47SSadaf Ebrahimi
67*a24ffb47SSadaf Ebrahimi```xml
68*a24ffb47SSadaf Ebrahimi  <!-- traces explicit calls to Traced -->
69*a24ffb47SSadaf Ebrahimi  <bean id="censusAspect" class="io.opencensus.contrib.spring.aop.CensusSpringAspect">
70*a24ffb47SSadaf Ebrahimi    <constructor-arg ref="tracer"/>
71*a24ffb47SSadaf Ebrahimi  </bean>
72*a24ffb47SSadaf Ebrahimi```
73*a24ffb47SSadaf Ebrahimi
74*a24ffb47SSadaf Ebrahimi#### Database Support
75*a24ffb47SSadaf Ebrahimi
76*a24ffb47SSadaf EbrahimiThe `opencensus-contrib-spring` package also includes support for tracing database
77*a24ffb47SSadaf Ebrahimicalls.  When database support is included, all calls to `java.sql.PreparedStatement.execute*`
78*a24ffb47SSadaf Ebrahimiwill be wrapped in a Span in the same way that `@Traced` wraps methods.
79*a24ffb47SSadaf Ebrahimi
80*a24ffb47SSadaf EbrahimiTo enable database support, include the `CensusSpringSqlAspect` bean.
81*a24ffb47SSadaf Ebrahimi
82*a24ffb47SSadaf Ebrahimi```xml
83*a24ffb47SSadaf Ebrahimi  <!-- traces all SQL calls -->
84*a24ffb47SSadaf Ebrahimi  <bean id="censusSQLAspect" class="io.opencensus.contrib.spring.aop.CensusSpringSqlAspect">
85*a24ffb47SSadaf Ebrahimi    <constructor-arg ref="tracer"/>
86*a24ffb47SSadaf Ebrahimi  </bean>
87*a24ffb47SSadaf Ebrahimi```
88*a24ffb47SSadaf Ebrahimi
89*a24ffb47SSadaf Ebrahimi#### Complete Spring XML configuration
90*a24ffb47SSadaf Ebrahimi
91*a24ffb47SSadaf EbrahimiThe following contains a complete spring xml file to configure `opencensus-contrib-spring`
92*a24ffb47SSadaf Ebrahimiwith support for both `@Traced` and database connection tracing.
93*a24ffb47SSadaf Ebrahimi
94*a24ffb47SSadaf Ebrahimi**Note:** This example does not include the configuration of any exporters. That will
95*a24ffb47SSadaf Ebrahimineed to be done separately.
96*a24ffb47SSadaf Ebrahimi
97*a24ffb47SSadaf Ebrahimi**TBD:*** Include examples of spring with exporters.
98*a24ffb47SSadaf Ebrahimi
99*a24ffb47SSadaf Ebrahimi```xml
100*a24ffb47SSadaf Ebrahimi<beans xmlns="http://www.springframework.org/schema/beans"
101*a24ffb47SSadaf Ebrahimi       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
102*a24ffb47SSadaf Ebrahimi       xmlns:aop="http://www.springframework.org/schema/aop"
103*a24ffb47SSadaf Ebrahimi       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
104*a24ffb47SSadaf Ebrahimi
105*a24ffb47SSadaf Ebrahimi  <aop:aspectj-autoproxy/>
106*a24ffb47SSadaf Ebrahimi
107*a24ffb47SSadaf Ebrahimi  <!-- traces explicit calls to Traced -->
108*a24ffb47SSadaf Ebrahimi  <bean id="censusAspect" class="io.opencensus.contrib.spring.aop.CensusSpringAspect">
109*a24ffb47SSadaf Ebrahimi    <constructor-arg ref="tracer"/>
110*a24ffb47SSadaf Ebrahimi  </bean>
111*a24ffb47SSadaf Ebrahimi
112*a24ffb47SSadaf Ebrahimi  <!-- traces all SQL calls -->
113*a24ffb47SSadaf Ebrahimi  <bean id="censusSQLAspect" class="io.opencensus.contrib.spring.aop.CensusSpringSqlAspect">
114*a24ffb47SSadaf Ebrahimi    <constructor-arg ref="tracer"/>
115*a24ffb47SSadaf Ebrahimi  </bean>
116*a24ffb47SSadaf Ebrahimi
117*a24ffb47SSadaf Ebrahimi  <!-- global tracer -->
118*a24ffb47SSadaf Ebrahimi  <bean id="tracer" class="io.opencensus.trace.Tracing" factory-method="getTracer"/>
119*a24ffb47SSadaf Ebrahimi</beans>
120*a24ffb47SSadaf Ebrahimi```
121*a24ffb47SSadaf Ebrahimi
122*a24ffb47SSadaf Ebrahimi### Traced Usage
123*a24ffb47SSadaf Ebrahimi
124*a24ffb47SSadaf EbrahimiOnce configured, you can use the `@Traced` annotation to indicate that a method should
125*a24ffb47SSadaf Ebrahimibe wrapped with a `Span`.  By default, `@Traced` will use the name of the method as the
126*a24ffb47SSadaf Ebrahimispan name.  However, `@Traced` supports an optional name attribute to allow a custom
127*a24ffb47SSadaf Ebrahimispan name to be specified.
128*a24ffb47SSadaf Ebrahimi
129*a24ffb47SSadaf Ebrahimi```java
130*a24ffb47SSadaf Ebrahimi  @Traced()
131*a24ffb47SSadaf Ebrahimi  void example1() {
132*a24ffb47SSadaf Ebrahimi    // do work
133*a24ffb47SSadaf Ebrahimi  }
134*a24ffb47SSadaf Ebrahimi
135*a24ffb47SSadaf Ebrahimi  // a custom span name can also be provided to Traced
136*a24ffb47SSadaf Ebrahimi  @Traced(name = "custom-span-name")
137*a24ffb47SSadaf Ebrahimi  void example2() {
138*a24ffb47SSadaf Ebrahimi    // do moar work
139*a24ffb47SSadaf Ebrahimi  }
140*a24ffb47SSadaf Ebrahimi```
141*a24ffb47SSadaf Ebrahimi
142*a24ffb47SSadaf Ebrahimi#### Notes
143*a24ffb47SSadaf Ebrahimi
144*a24ffb47SSadaf Ebrahimi`opencensus-contrib-spring` support only enables annotations.  You will still need to configure opencensus and register exporters / views.
145*a24ffb47SSadaf Ebrahimi
146*a24ffb47SSadaf Ebrahimi[travis-image]: https://travis-ci.org/census-instrumentation/opencensus-java.svg?branch=master
147*a24ffb47SSadaf Ebrahimi[travis-url]: https://travis-ci.org/census-instrumentation/opencensus-java
148*a24ffb47SSadaf Ebrahimi[appveyor-image]: https://ci.appveyor.com/api/projects/status/hxthmpkxar4jq4be/branch/master?svg=true
149*a24ffb47SSadaf Ebrahimi[appveyor-url]: https://ci.appveyor.com/project/opencensusjavateam/opencensus-java/branch/master
150*a24ffb47SSadaf Ebrahimi[maven-image]: https://maven-badges.herokuapp.com/maven-central/io.opencensus/opencensus-contrib-spring/badge.svg
151*a24ffb47SSadaf Ebrahimi[maven-url]: https://maven-badges.herokuapp.com/maven-central/io.opencensus/opencensus-contrib-spring
152*a24ffb47SSadaf Ebrahimi
153*a24ffb47SSadaf Ebrahimi#### Java Versions
154*a24ffb47SSadaf Ebrahimi
155*a24ffb47SSadaf EbrahimiJava 6 or above is required for using this artifact.
156*a24ffb47SSadaf Ebrahimi
157*a24ffb47SSadaf Ebrahimi#### About the `aop` package
158*a24ffb47SSadaf Ebrahimi
159*a24ffb47SSadaf Ebrahimi`opencensus-contrib-spring` makes heavy use of Aspect Oriented Programming [AOP](https://en.wikipedia.org/wiki/Aspect-oriented_programming) to
160*a24ffb47SSadaf Ebrahimiadd behavior to annotations.  Fortunately, Spring supports this natively so we can leverage the capabilities they've already built in.
161