1*a24ffb47SSadaf Ebrahimi# How to submit a bug report 2*a24ffb47SSadaf Ebrahimi 3*a24ffb47SSadaf EbrahimiIf you received an error message, please include it and any exceptions. 4*a24ffb47SSadaf Ebrahimi 5*a24ffb47SSadaf EbrahimiWe commonly need to know what platform you are on: 6*a24ffb47SSadaf Ebrahimi 7*a24ffb47SSadaf Ebrahimi* JDK/JRE version (i.e., `java -version`) 8*a24ffb47SSadaf Ebrahimi* Operating system (i.e., `uname -a`) 9*a24ffb47SSadaf Ebrahimi 10*a24ffb47SSadaf Ebrahimi# How to contribute 11*a24ffb47SSadaf Ebrahimi 12*a24ffb47SSadaf EbrahimiWe definitely welcome patches and contributions to OpenCensus! Here are 13*a24ffb47SSadaf Ebrahimisome guidelines and information about how to do so. 14*a24ffb47SSadaf Ebrahimi 15*a24ffb47SSadaf Ebrahimi## Before getting started 16*a24ffb47SSadaf Ebrahimi 17*a24ffb47SSadaf EbrahimiIn order to protect both you and ourselves, you will need to sign the 18*a24ffb47SSadaf Ebrahimi[Contributor License Agreement](https://cla.developers.google.com/clas). 19*a24ffb47SSadaf Ebrahimi 20*a24ffb47SSadaf Ebrahimi[Eclipse](https://google-styleguide.googlecode.com/svn/trunk/eclipse-java-google-style.xml) 21*a24ffb47SSadaf Ebrahimiand 22*a24ffb47SSadaf Ebrahimi[IntelliJ](https://google-styleguide.googlecode.com/svn/trunk/intellij-java-google-style.xml) 23*a24ffb47SSadaf Ebrahimistyle configurations are commonly useful. For IntelliJ 14, copy the style to 24*a24ffb47SSadaf Ebrahimi`~/.IdeaIC14/config/codestyles/`, start IntelliJ, go to File > Settings > Code 25*a24ffb47SSadaf EbrahimiStyle, and set the Scheme to `GoogleStyle`. 26*a24ffb47SSadaf Ebrahimi 27*a24ffb47SSadaf Ebrahimi## Style 28*a24ffb47SSadaf EbrahimiWe follow the [Google Java Style 29*a24ffb47SSadaf EbrahimiGuide](https://google.github.io/styleguide/javaguide.html). Our 30*a24ffb47SSadaf Ebrahimibuild automatically will provide warnings for simple style issues. 31*a24ffb47SSadaf Ebrahimi 32*a24ffb47SSadaf EbrahimiRun the following command to format all files. This formatter uses 33*a24ffb47SSadaf Ebrahimi[google-java-format](https://github.com/google/google-java-format): 34*a24ffb47SSadaf Ebrahimi 35*a24ffb47SSadaf Ebrahimi### OS X or Linux 36*a24ffb47SSadaf Ebrahimi 37*a24ffb47SSadaf Ebrahimi`./gradlew goJF` 38*a24ffb47SSadaf Ebrahimi 39*a24ffb47SSadaf Ebrahimi### Windows 40*a24ffb47SSadaf Ebrahimi 41*a24ffb47SSadaf Ebrahimi`gradlew.bat goJF` 42*a24ffb47SSadaf Ebrahimi 43*a24ffb47SSadaf EbrahimiWe also follow these project-specific guidelines: 44*a24ffb47SSadaf Ebrahimi 45*a24ffb47SSadaf Ebrahimi### Javadoc 46*a24ffb47SSadaf Ebrahimi 47*a24ffb47SSadaf Ebrahimi* All public classes and their public and protected methods MUST have javadoc. 48*a24ffb47SSadaf Ebrahimi It MUST be complete (all params documented etc.) Everything else 49*a24ffb47SSadaf Ebrahimi (package-protected classes, private) MAY have javadoc, at the code writer's 50*a24ffb47SSadaf Ebrahimi whim. It does not have to be complete, and reviewers are not allowed to 51*a24ffb47SSadaf Ebrahimi require or disallow it. 52*a24ffb47SSadaf Ebrahimi* Each API element should have a `@since` tag specifying the minor version when 53*a24ffb47SSadaf Ebrahimi it was released (or the next minor version). 54*a24ffb47SSadaf Ebrahimi* There MUST be NO javadoc errors. 55*a24ffb47SSadaf Ebrahimi* See 56*a24ffb47SSadaf Ebrahimi [section 7.3.1](https://google.github.io/styleguide/javaguide.html#s7.3.1-javadoc-exception-self-explanatory) 57*a24ffb47SSadaf Ebrahimi in the guide for exceptions to the Javadoc requirement. 58*a24ffb47SSadaf Ebrahimi* Reviewers may request documentation for any element that doesn't require 59*a24ffb47SSadaf Ebrahimi Javadoc, though the style of documentation is up to the author. 60*a24ffb47SSadaf Ebrahimi* Try to do the least amount of change when modifying existing documentation. 61*a24ffb47SSadaf Ebrahimi Don't change the style unless you have a good reason. 62*a24ffb47SSadaf Ebrahimi 63*a24ffb47SSadaf Ebrahimi### AutoValue 64*a24ffb47SSadaf Ebrahimi 65*a24ffb47SSadaf Ebrahimi* Use [AutoValue](https://github.com/google/auto/tree/master/value), when 66*a24ffb47SSadaf Ebrahimi possible, for any new value classes. Remember to add package-private 67*a24ffb47SSadaf Ebrahimi constructors to all AutoValue classes to prevent classes in other packages 68*a24ffb47SSadaf Ebrahimi from extending them. 69*a24ffb47SSadaf Ebrahimi 70*a24ffb47SSadaf Ebrahimi## Building opencensus-java 71*a24ffb47SSadaf Ebrahimi 72*a24ffb47SSadaf EbrahimiContinuous integration builds the project, runs the tests, and runs multiple 73*a24ffb47SSadaf Ebrahimitypes of static analysis. 74*a24ffb47SSadaf Ebrahimi 75*a24ffb47SSadaf EbrahimiRun the following commands to build, run tests and most static analysis, and 76*a24ffb47SSadaf Ebrahimicheck formatting: 77*a24ffb47SSadaf Ebrahimi 78*a24ffb47SSadaf Ebrahimi### OS X or Linux 79*a24ffb47SSadaf Ebrahimi 80*a24ffb47SSadaf Ebrahimi`./gradlew clean assemble check verGJF` 81*a24ffb47SSadaf Ebrahimi 82*a24ffb47SSadaf Ebrahimi### Windows 83*a24ffb47SSadaf Ebrahimi 84*a24ffb47SSadaf Ebrahimi`gradlew.bat clean assemble check verGJF` 85*a24ffb47SSadaf Ebrahimi 86*a24ffb47SSadaf EbrahimiUse these commands to run Checker Framework null analysis: 87*a24ffb47SSadaf Ebrahimi 88*a24ffb47SSadaf Ebrahimi### OS X or Linux 89*a24ffb47SSadaf Ebrahimi 90*a24ffb47SSadaf Ebrahimi`./gradlew clean assemble -PcheckerFramework` 91*a24ffb47SSadaf Ebrahimi 92*a24ffb47SSadaf Ebrahimi### Windows 93*a24ffb47SSadaf Ebrahimi 94*a24ffb47SSadaf Ebrahimi`gradlew.bat clean assemble -PcheckerFramework` 95*a24ffb47SSadaf Ebrahimi 96*a24ffb47SSadaf EbrahimiRun the following command to install a local snapshot of OpenCensus. This 97*a24ffb47SSadaf Ebrahimican be a very useful tool for testing changes locally against another 98*a24ffb47SSadaf Ebrahimiproject that uses OpenCensus. 99*a24ffb47SSadaf Ebrahimi 100*a24ffb47SSadaf Ebrahimi### OS X or Linux 101*a24ffb47SSadaf Ebrahimi 102*a24ffb47SSadaf Ebrahimi`./gradlew install` 103*a24ffb47SSadaf Ebrahimi 104*a24ffb47SSadaf Ebrahimi### Windows 105*a24ffb47SSadaf Ebrahimi 106*a24ffb47SSadaf Ebrahimi`gradlew.bat install` 107*a24ffb47SSadaf Ebrahimi 108*a24ffb47SSadaf Ebrahimi### Checker Framework null analysis 109*a24ffb47SSadaf Ebrahimi 110*a24ffb47SSadaf EbrahimiOpenCensus uses the [Checker Framework](https://checkerframework.org/) to 111*a24ffb47SSadaf Ebrahimiprevent NullPointerExceptions. Since the project uses Java 6, and Java 6 doesn't 112*a24ffb47SSadaf Ebrahimiallow annotations on types, all Checker Framework type annotations must be 113*a24ffb47SSadaf Ebrahimi[put in comments](https://checkerframework.org/manual/#backward-compatibility). 114*a24ffb47SSadaf EbrahimiPutting all Checker Framework annotations and imports in comments also avoids a 115*a24ffb47SSadaf Ebrahimidependency on the Checker Framework library. 116*a24ffb47SSadaf Ebrahimi 117*a24ffb47SSadaf EbrahimiOpenCensus uses `org.checkerframework.checker.nullness.qual.Nullable` for all 118*a24ffb47SSadaf Ebrahiminullable annotations on types, since `javax.annotation.Nullable` cannot be 119*a24ffb47SSadaf Ebrahimiapplied to types. However, it uses `javax.annotation.Nullable` in API method 120*a24ffb47SSadaf Ebrahimisignatures whenever possible, so that the annotations can be uncommented and 121*a24ffb47SSadaf Ebrahimibe included in .class files and Javadocs. 122*a24ffb47SSadaf Ebrahimi 123*a24ffb47SSadaf Ebrahimi### Checkstyle import control 124*a24ffb47SSadaf Ebrahimi 125*a24ffb47SSadaf EbrahimiThis project uses Checkstyle to specify the allowed dependencies between 126*a24ffb47SSadaf Ebrahimipackages, using its ImportControl feature 127*a24ffb47SSadaf Ebrahimi(http://checkstyle.sourceforge.net/config_imports.html#ImportControl). 128*a24ffb47SSadaf Ebrahimi`buildscripts/import-control.xml` specifies the allowed imports and contains 129*a24ffb47SSadaf Ebrahimisome guidelines on OpenCensus' inter-package dependencies. An error messsage 130*a24ffb47SSadaf Ebrahimisuch as 131*a24ffb47SSadaf Ebrahimi`Disallowed import - edu.umd.cs.findbugs.annotations.SuppressFBWarnings. [ImportControl]` 132*a24ffb47SSadaf Ebrahimicould mean that `import-control.xml` needs to be updated. 133*a24ffb47SSadaf Ebrahimi 134*a24ffb47SSadaf Ebrahimi## Benchmarks 135*a24ffb47SSadaf Ebrahimi 136*a24ffb47SSadaf Ebrahimi### Invoke all benchmarks on a sub-project 137*a24ffb47SSadaf Ebrahimi 138*a24ffb47SSadaf Ebrahimi```bash 139*a24ffb47SSadaf Ebrahimi$ ./gradlew clean :opencensus-impl-core:jmh 140*a24ffb47SSadaf Ebrahimi``` 141*a24ffb47SSadaf Ebrahimi 142*a24ffb47SSadaf Ebrahimi### Invoke on a single benchmark class 143*a24ffb47SSadaf Ebrahimi 144*a24ffb47SSadaf Ebrahimi```bash 145*a24ffb47SSadaf Ebrahimi./gradlew -PjmhIncludeSingleClass=BinaryFormatImplBenchmark clean :opencensus-impl-core:jmh 146*a24ffb47SSadaf Ebrahimi``` 147*a24ffb47SSadaf Ebrahimi 148*a24ffb47SSadaf Ebrahimi### Debug compilation errors 149*a24ffb47SSadaf EbrahimiWhen you make incompatible changes in the Benchmarks classes you may get compilation errors which 150*a24ffb47SSadaf Ebrahimiare related to the old code not being compatible with the new code. Some of the reasons are: 151*a24ffb47SSadaf Ebrahimi* Any plugin cannot delete the generated code (jmh generates code) because if the user configured 152*a24ffb47SSadaf Ebrahimithe directory as the same as source code the plugin will delete users source code. 153*a24ffb47SSadaf Ebrahimi* After you run jmh, a gradle daemon will stay alive which may cache the generated code in memory 154*a24ffb47SSadaf Ebrahimiand use use that generated code even if the files were changed. This is an issue for classes 155*a24ffb47SSadaf Ebrahimigenerated with auto-value. 156*a24ffb47SSadaf Ebrahimi 157*a24ffb47SSadaf EbrahimiRun this commands to clean the Gradle's cache: 158*a24ffb47SSadaf Ebrahimi```bash 159*a24ffb47SSadaf Ebrahimi./gradlew --stop 160*a24ffb47SSadaf Ebrahimirm -fr .gradle/ 161*a24ffb47SSadaf Ebrahimirm -fr benchmarks/build 162*a24ffb47SSadaf Ebrahimi``` 163*a24ffb47SSadaf Ebrahimi 164*a24ffb47SSadaf Ebrahimi## Proposing changes 165*a24ffb47SSadaf Ebrahimi 166*a24ffb47SSadaf EbrahimiCreate a Pull Request with your changes. Please add any user-visible changes to 167*a24ffb47SSadaf EbrahimiCHANGELOG.md. The continuous integration build will run the tests and static 168*a24ffb47SSadaf Ebrahimianalysis. It will also check that the pull request branch has no merge commits. 169*a24ffb47SSadaf EbrahimiWhen the changes are accepted, they will be merged or cherry-picked by an 170*a24ffb47SSadaf EbrahimiOpenCensus core developer. 171