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