README.md
1 # OpenCensus Stackdriver Log Correlation
2
3 This subproject is currently experimental, so it may be redesigned or removed in the future. It
4 will remain experimental until we have a specification for a log correlation feature in
5 [opencensus-specs](https://github.com/census-instrumentation/opencensus-specs/)
6 (issue [#123](https://github.com/census-instrumentation/opencensus-specs/issues/123)).
7
8 The `opencensus-contrib-log-correlation-stackdriver` artifact provides a
9 [Stackdriver Logging](https://cloud.google.com/logging/)
10 [`LoggingEnhancer`](http://googlecloudplatform.github.io/google-cloud-java/google-cloud-clients/apidocs/com/google/cloud/logging/LoggingEnhancer.html)
11 that automatically adds tracing data to log entries. The class name is
12 `OpenCensusTraceLoggingEnhancer`. `OpenCensusTraceLoggingEnhancer` adds the current trace and span
13 ID to each log entry, which allows Stackdriver to display the log entries associated with each
14 trace, or filter logs based on trace or span ID. It currently also adds the sampling decision using
15 the label "`opencensusTraceSampled`".
16
17 ## Instructions
18
19 ### Prerequisites
20
21 This log correlation feature requires a project that is using the
22 [`com.google.cloud:google-cloud-logging`](https://github.com/GoogleCloudPlatform/google-cloud-java/tree/master/google-cloud-clients/google-cloud-logging)
23 library to export logs to Stackdriver. `google-cloud-logging` must be version `1.33.0` or later.
24 The application can run on Google Cloud Platform, on-premise, or on
25 another cloud platform. See https://cloud.google.com/logging/docs/setup/java for instructions for
26 setting up `google-cloud-logging`.
27
28 **Note that this artifact does not support logging done through the Stackdriver Logging agent.**
29
30 ### Add the dependencies to your project
31
32 For Maven add to your `pom.xml`:
33 ```xml
34 <dependencies>
35 <dependency>
36 <groupId>io.opencensus</groupId>
37 <artifactId>opencensus-contrib-log-correlation-stackdriver</artifactId>
38 <version>0.16.1</version>
39 <scope>runtime</scope>
40 </dependency>
41 </dependencies>
42 ```
43
44 For Gradle add to your dependencies:
45 ```groovy
46 runtime 'io.opencensus:opencensus-contrib-log-correlation-stackdriver:0.16.1'
47 ```
48
49 ### Configure the `OpenCensusTraceLoggingEnhancer`
50
51 #### Setting the project ID
52
53 By default, `OpenCensusTraceLoggingEnhancer` looks up the project ID from `google-cloud-java`. See
54 [here](https://github.com/GoogleCloudPlatform/google-cloud-java#specifying-a-project-id) for
55 instructions for configuring the project ID with `google-cloud-java`.
56
57 To override the project ID, set the following property as a system property or as a
58 `java.util.logging` property:
59
60 `io.opencensus.contrib.logcorrelation.stackdriver.OpenCensusTraceLoggingEnhancer.projectId`
61
62 #### Choosing when to add tracing data to log entries
63
64 The following property controls the decision to add tracing data from the current span to a log
65 entry:
66
67 `io.opencensus.contrib.logcorrelation.stackdriver.OpenCensusTraceLoggingEnhancer.spanSelection`
68
69 The allowed values are:
70
71 * `ALL_SPANS`: adds tracing data to all log entries (default)
72
73 * `NO_SPANS`: disables the log correlation feature
74
75 * `SAMPLED_SPANS`: adds tracing data to log entries when the current span is sampled
76
77 Other aspects of configuring the `OpenCensusTraceLoggingEnhancer` depend on the logging
78 implementation and `google-cloud-logging` adapter in use.
79
80 #### Logback with `google-cloud-logging-logback` `LoggingAppender`
81
82 The `LoggingAppender` should already be configured in `logback.xml` as described in
83 https://cloud.google.com/logging/docs/setup/java#logback_appender. Add
84 "`io.opencensus.contrib.logcorrelation.stackdriver.OpenCensusTraceLoggingEnhancer`" to the list of
85 enhancers. Optionally, set the `spanSelection` and `projectId` properties described above as system
86 properties.
87
88 Here is an example `logback.xml`, based on the
89 [`google-cloud-logging-logback` example](https://github.com/GoogleCloudPlatform/java-docs-samples/blob/a2b04b20d81ee631439a9368fb99b44849519e28/logging/logback/src/main/resources/logback.xml).
90 It specifies the `LoggingEnhancer` class and sets both optional properties:
91
92 ```xml
93 <configuration>
94 <property scope="system" name="io.opencensus.contrib.logcorrelation.stackdriver.OpenCensusTraceLoggingEnhancer.spanSelection" value="SAMPLED_SPANS" />
95 <property scope="system" name="io.opencensus.contrib.logcorrelation.stackdriver.OpenCensusTraceLoggingEnhancer.projectId" value="my-project-id" />
96 <appender name="CLOUD" class="com.google.cloud.logging.logback.LoggingAppender">
97 <enhancer>io.opencensus.contrib.logcorrelation.stackdriver.OpenCensusTraceLoggingEnhancer</enhancer>
98 </appender>
99
100 <root level="info">
101 <appender-ref ref="CLOUD" />
102 </root>
103 </configuration>
104 ```
105
106 See
107 https://github.com/census-ecosystem/opencensus-experiments/tree/master/java/log_correlation/stackdriver/logback
108 for a full example.
109
110 #### `java.util.logging` with `google-cloud-logging` `LoggingHandler`
111
112 The `LoggingHandler` should already be configured in a logging `.properties` file, as described in
113 https://cloud.google.com/logging/docs/setup/java#jul_handler. Add
114 "`io.opencensus.contrib.logcorrelation.stackdriver.OpenCensusTraceLoggingEnhancer`" to the list of
115 enhancers. Optionally, set the `spanSelection` and `projectId` properties described above in the
116 properties file.
117
118 Here is an example `.properties` file, based on the
119 [`google-cloud-logging` example](https://github.com/GoogleCloudPlatform/java-docs-samples/blob/a2b04b20d81ee631439a9368fb99b44849519e28/logging/jul/src/main/resources/logging.properties).
120 It specifies the `LoggingEnhancer` class and sets both optional properties:
121
122 ```properties
123 .level = INFO
124
125 com.example.MyClass.handlers=com.google.cloud.logging.LoggingHandler
126
127 com.google.cloud.logging.LoggingHandler.enhancers=io.opencensus.contrib.logcorrelation.stackdriver.OpenCensusTraceLoggingEnhancer
128 io.opencensus.contrib.logcorrelation.stackdriver.OpenCensusTraceLoggingEnhancer.spanSelection=SAMPLED_SPANS
129 io.opencensus.contrib.logcorrelation.stackdriver.OpenCensusTraceLoggingEnhancer.projectId=my-project-id
130 ```
131
132 See
133 https://github.com/census-ecosystem/opencensus-experiments/tree/master/java/log_correlation/stackdriver/java_util_logging
134 for a full example.
135
136 #### Custom `google-cloud-logging` adapter
137
138 The `google-cloud-logging` adapter needs to instantiate the `OpenCensusTraceLoggingEnhancer`,
139 possibly by looking up the class name of the `LoggingEnhancer` in a configuration file and
140 instantiating it with reflection. Then the adapter needs to call the `LoggingEnhancer`'s
141 `enhanceLogEntry` method on all `LogEntry`s that will be passed to `google-cloud-logging`'s
142 `Logging.write` method. `enhanceLogEntry` must be called in the same thread that executed the log
143 statement, in order to provide the current trace and span ID.
144
145 #### Java Versions
146
147 Java 7 or above is required for using this artifact.
148