172 lines
7.7 KiB
Markdown
172 lines
7.7 KiB
Markdown
|
# OpenCensus Stackdriver Stats Exporter
|
||
|
|
||
|
The *OpenCensus Stackdriver Stats Exporter* is a stats exporter that exports data to
|
||
|
Stackdriver Monitoring. [Stackdriver Monitoring][stackdriver-monitoring] provides visibility into
|
||
|
the performance, uptime, and overall health of cloud-powered applications. Stackdriver ingests that
|
||
|
data and generates insights via dashboards, charts, and alerts.
|
||
|
|
||
|
## Quickstart
|
||
|
|
||
|
### Prerequisites
|
||
|
|
||
|
To use this exporter, you must have an application that you'd like to monitor. The app can be on
|
||
|
Google Cloud Platform, on-premise, or another cloud platform.
|
||
|
|
||
|
In order to be able to push your stats to [Stackdriver Monitoring][stackdriver-monitoring], you must:
|
||
|
|
||
|
1. [Create a Cloud project](https://support.google.com/cloud/answer/6251787?hl=en).
|
||
|
2. [Enable billing](https://support.google.com/cloud/answer/6288653#new-billing).
|
||
|
3. [Enable the Stackdriver Monitoring API](https://console.cloud.google.com/apis/dashboard).
|
||
|
|
||
|
These steps enable the API but don't require that your app is hosted on Google Cloud Platform.
|
||
|
|
||
|
### Hello "Stackdriver Stats"
|
||
|
|
||
|
#### Add the dependencies to your project
|
||
|
|
||
|
For Maven add to your `pom.xml`:
|
||
|
```xml
|
||
|
<dependencies>
|
||
|
<dependency>
|
||
|
<groupId>io.opencensus</groupId>
|
||
|
<artifactId>opencensus-api</artifactId>
|
||
|
<version>0.16.1</version>
|
||
|
</dependency>
|
||
|
<dependency>
|
||
|
<groupId>io.opencensus</groupId>
|
||
|
<artifactId>opencensus-exporter-stats-stackdriver</artifactId>
|
||
|
<version>0.16.1</version>
|
||
|
</dependency>
|
||
|
<dependency>
|
||
|
<groupId>io.opencensus</groupId>
|
||
|
<artifactId>opencensus-impl</artifactId>
|
||
|
<version>0.16.1</version>
|
||
|
<scope>runtime</scope>
|
||
|
</dependency>
|
||
|
</dependencies>
|
||
|
```
|
||
|
|
||
|
For Gradle add to your dependencies:
|
||
|
```groovy
|
||
|
compile 'io.opencensus:opencensus-api:0.16.1'
|
||
|
compile 'io.opencensus:opencensus-exporter-stats-stackdriver:0.16.1'
|
||
|
runtime 'io.opencensus:opencensus-impl:0.16.1'
|
||
|
```
|
||
|
|
||
|
#### Register the exporter
|
||
|
|
||
|
This uses the default configuration for authentication and a given project ID.
|
||
|
|
||
|
```java
|
||
|
public class MyMainClass {
|
||
|
public static void main(String[] args) {
|
||
|
StackdriverStatsExporter.createAndRegister(
|
||
|
StackdriverStatsConfiguration.builder().build());
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
#### Set Monitored Resource for exporter
|
||
|
|
||
|
By default, Stackdriver Stats Exporter will try to automatically detect the environment if your
|
||
|
application is running on GCE, GKE or AWS EC2, and generate a corresponding Stackdriver GCE/GKE/EC2
|
||
|
monitored resource. For GKE particularly, you may want to set up some environment variables so that
|
||
|
Exporter can correctly identify your pod, cluster and container. Follow the Kubernetes instruction
|
||
|
[here](https://cloud.google.com/kubernetes-engine/docs/tutorials/custom-metrics-autoscaling#exporting_metrics_from_the_application)
|
||
|
and [here](https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/).
|
||
|
|
||
|
Otherwise, Exporter will use [a global Stackdriver monitored resource with a project_id label](https://cloud.google.com/monitoring/api/resources#tag_global),
|
||
|
and it works fine when you have only one exporter running.
|
||
|
|
||
|
If you want to have multiple processes exporting stats for the same metric concurrently, and your
|
||
|
application is running on some different environment than GCE, GKE or AWS EC2 (for example DataFlow),
|
||
|
please associate a unique monitored resource with each exporter if possible.
|
||
|
Please note that there is also an "opencensus_task" metric label that uniquely identifies the
|
||
|
uploaded stats.
|
||
|
|
||
|
To set a custom MonitoredResource:
|
||
|
|
||
|
```java
|
||
|
public class MyMainClass {
|
||
|
public static void main(String[] args) {
|
||
|
// A sample DataFlow monitored resource.
|
||
|
MonitoredResource myResource = MonitoredResource.newBuilder()
|
||
|
.setType("dataflow_job")
|
||
|
.putLabels("project_id", "my_project")
|
||
|
.putLabels("job_name", "my_job")
|
||
|
.putLabels("region", "us-east1")
|
||
|
.build();
|
||
|
|
||
|
// Set a custom MonitoredResource. Please make sure each Stackdriver Stats Exporter has a
|
||
|
// unique MonitoredResource.
|
||
|
StackdriverStatsExporter.createAndRegister(
|
||
|
StackdriverStatsConfiguration.builder().setMonitoredResource(myResource).build());
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
For a complete list of valid Stackdriver monitored resources, please refer to [Stackdriver
|
||
|
Documentation](https://cloud.google.com/monitoring/custom-metrics/creating-metrics#which-resource).
|
||
|
Please also note that although there are a lot of monitored resources available on [Stackdriver](https://cloud.google.com/monitoring/api/resources),
|
||
|
only [a small subset of them](https://cloud.google.com/monitoring/custom-metrics/creating-metrics#which-resource)
|
||
|
are compatible with the Opencensus Stackdriver Stats Exporter.
|
||
|
|
||
|
#### Authentication
|
||
|
|
||
|
This exporter uses [google-cloud-java](https://github.com/GoogleCloudPlatform/google-cloud-java),
|
||
|
for details about how to configure the authentication see [here](https://github.com/GoogleCloudPlatform/google-cloud-java#authentication).
|
||
|
|
||
|
If you prefer to manually set the credentials use:
|
||
|
```
|
||
|
StackdriverStatsExporter.createAndRegister(
|
||
|
StackdriverStatsConfiguration.builder()
|
||
|
.setCredentials(new GoogleCredentials(new AccessToken(accessToken, expirationTime)))
|
||
|
.setProjectId("MyStackdriverProjectId")
|
||
|
.setExportInterval(Duration.create(10, 0))
|
||
|
.build());
|
||
|
```
|
||
|
|
||
|
#### Specifying a Project ID
|
||
|
|
||
|
This exporter uses [google-cloud-java](https://github.com/GoogleCloudPlatform/google-cloud-java),
|
||
|
for details about how to configure the project ID see [here](https://github.com/GoogleCloudPlatform/google-cloud-java#specifying-a-project-id).
|
||
|
|
||
|
If you prefer to manually set the project ID use:
|
||
|
```
|
||
|
StackdriverStatsExporter.createAndRegister(
|
||
|
StackdriverStatsConfiguration.builder().setProjectId("MyStackdriverProjectId").build());
|
||
|
```
|
||
|
|
||
|
#### Java Versions
|
||
|
|
||
|
Java 7 or above is required for using this exporter.
|
||
|
|
||
|
## FAQ
|
||
|
### Why did I get a PERMISSION_DENIED error from Stackdriver when using this exporter?
|
||
|
To use our Stackdriver Stats exporter, you need to set up billing for your cloud project, since
|
||
|
creating and uploading custom metrics to Stackdriver Monitoring is
|
||
|
[not free](https://cloud.google.com/stackdriver/pricing_v2#monitoring-costs).
|
||
|
|
||
|
To enable billing, follow the instructions [here](https://support.google.com/cloud/answer/6288653#new-billing).
|
||
|
|
||
|
### What is "opencensus_task" metric label ?
|
||
|
Stackdriver requires that each Timeseries to be updated only by one task at a time. A
|
||
|
`Timeseries` is uniquely identified by the `MonitoredResource` and the `Metric`'s labels.
|
||
|
Stackdriver exporter adds a new `Metric` label for each custom `Metric` to ensure the uniqueness
|
||
|
of the `Timeseries`. The format of the label is: `{LANGUAGE}-{PID}@{HOSTNAME}`, if `{PID}` is not
|
||
|
available a random number will be used.
|
||
|
|
||
|
### Why did I get an error "java.lang.NoSuchMethodError: com.google.common...", like "java.lang.NoSuchMethodError:com.google.common.base.Throwables.throwIfInstanceOf"?
|
||
|
This is probably because there is a version conflict on Guava in the dependency tree.
|
||
|
|
||
|
For example, `com.google.common.base.Throwables.throwIfInstanceOf` is introduced to Guava 20.0.
|
||
|
If your application has a dependency that bundles a Guava with version 19.0 or below
|
||
|
(for example, gRPC 1.10.0), it might cause a `NoSuchMethodError` since
|
||
|
`com.google.common.base.Throwables.throwIfInstanceOf` doesn't exist before Guava 20.0.
|
||
|
|
||
|
In this case, please either add an explicit dependency on a newer version of Guava that has the
|
||
|
new method (20.0 in the previous example), or if possible, upgrade the dependency that depends on
|
||
|
Guava to a newer version that depends on the newer Guava (for example, upgrade to gRPC 1.12.0).
|
||
|
|
||
|
[stackdriver-monitoring]: https://cloud.google.com/monitoring/
|