Skip to content
This repository was archived by the owner on Dec 23, 2023. It is now read-only.

Commit 8781dbb

Browse files
author
Bogdan Drutu
authored
Add a new artifact for gRPC utility classes for instrumentation. (#577)
* Add a new artifact for gRPC utility classes for instrumentation. * Add code conversion and fix readme. * Enable exporting to maven for grpc_util. * Use Code for gRPC not CanonicalCode.
1 parent 8b19f6e commit 8781dbb

File tree

7 files changed

+311
-4
lines changed

7 files changed

+311
-4
lines changed

all/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def subprojects = [
2222
project(':opencensus-impl-lite'),
2323
project(':opencensus-testing'),
2424
project(':opencensus-contrib-agent'),
25+
project(':opencensus-contrib-grpc-util'),
2526
project(':opencensus-contrib-zpages'),
2627
project(':opencensus-exporter-trace-logging'),
2728
project(':opencensus-exporter-trace-stackdriver'),
@@ -31,7 +32,7 @@ def subprojects = [
3132
def subprojects_javadoc = [
3233
project(':opencensus-api'),
3334
project(':opencensus-testing'),
34-
project(':opencensus-contrib-agent'),
35+
project(':opencensus-contrib-grpc-util'),
3536
project(':opencensus-contrib-zpages'),
3637
project(':opencensus-exporter-trace-logging'),
3738
project(':opencensus-exporter-trace-stackdriver'),

build.gradle

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ subprojects {
104104
ext {
105105
autoValueVersion = '1.4'
106106
findBugsVersion = '3.0.1'
107-
grpcContextVersion = '1.6.0'
107+
grpcVersion = '1.6.1'
108108
guavaVersion = '19.0'
109109

110110
libraries = [
@@ -114,9 +114,10 @@ subprojects {
114114
disruptor: 'com.lmax:disruptor:3.3.6',
115115
errorprone: 'com.google.errorprone:error_prone_annotations:2.0.19',
116116
findbugs_annotations: "com.google.code.findbugs:annotations:${findBugsVersion}",
117-
google_auth : 'com.google.auth:google-auth-library-credentials:0.7.0',
117+
google_auth: 'com.google.auth:google-auth-library-credentials:0.7.0',
118118
google_cloud_trace: 'com.google.cloud:google-cloud-trace:0.22.0-alpha',
119-
grpc_context: "io.grpc:grpc-context:${grpcContextVersion}",
119+
grpc_context: "io.grpc:grpc-context:${grpcVersion}",
120+
grpc_core: "io.grpc:grpc-core:${grpcVersion}",
120121
guava: "com.google.guava:guava:${guavaVersion}",
121122
jsr305: "com.google.code.findbugs:jsr305:${findBugsVersion}",
122123

@@ -248,6 +249,7 @@ subprojects {
248249
uploadArchives.onlyIf {
249250
name in ['opencensus-api',
250251
'opencensus-contrib-agent',
252+
'opencensus-contrib-grpc-util',
251253
'opencensus-contrib-zpages',
252254
'opencensus-exporter-trace-logging',
253255
'opencensus-exporter-trace-stackdriver',

contrib/grpc_util/README.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# OpenCensus gRPC Util
2+
[![Build Status][travis-image]][travis-url] [![Build status][appveyor-image]][appveyor-url] [![Maven Central][maven-image]][maven-url]
3+
4+
The *OpenCensus gRPC Util for Java* is a collection of utilities for trace instrumentation when
5+
working with [gRPC][grpc-url].
6+
7+
## Quickstart
8+
9+
### Add the dependencies to your project
10+
11+
For Maven add to your `pom.xml`:
12+
```xml
13+
<dependencies>
14+
<dependency>
15+
<groupId>io.opencensus</groupId>
16+
<artifactId>opencensus-contrib-grpc-util</artifactId>
17+
<version>0.6.0</version>
18+
</dependency>
19+
</dependencies>
20+
```
21+
22+
For Gradle add to your dependencies:
23+
```gradle
24+
compile 'io.opencensus:opencensus-contrib-grpc-util:0.6.0'
25+
```
26+
27+
[travis-image]: https://travis-ci.org/census-instrumentation/opencensus-java.svg?branch=master
28+
[travis-url]: https://travis-ci.org/census-instrumentation/opencensus-java
29+
[appveyor-image]: https://ci.appveyor.com/api/projects/status/hxthmpkxar4jq4be/branch/master?svg=true
30+
[appveyor-url]: https://ci.appveyor.com/project/instrumentationjavateam/opencensus-java/branch/master
31+
[maven-image]: https://maven-badges.herokuapp.com/maven-central/io.opencensus/opencensus-contrib-grpc-util/badge.svg
32+
[maven-url]: https://maven-badges.herokuapp.com/maven-central/io.opencensus/opencensus-contrib-grpc-util
33+
[grpc-url]: https://github.com/grpc/grpc-java

contrib/grpc_util/build.gradle

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
description = 'OpenCensus gRPC Util'
2+
3+
apply plugin: 'java'
4+
5+
[compileJava, compileTestJava].each() {
6+
it.sourceCompatibility = 1.6
7+
it.targetCompatibility = 1.6
8+
}
9+
10+
dependencies {
11+
compile project(':opencensus-api'),
12+
libraries.grpc_core
13+
14+
signature "org.codehaus.mojo.signature:java16:+@signature"
15+
}
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
/*
2+
* Copyright 2017, OpenCensus Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package io.opencensus.contrib.grpc.util;
18+
19+
/**
20+
* Utility class to convert between {@link io.opencensus.trace.Status} and {@link io.grpc.Status}
21+
*/
22+
public final class StatusConverter {
23+
24+
/**
25+
* Returns a {@link io.opencensus.trace.Status.CanonicalCode} from a {@link io.grpc.Status.Code}.
26+
*
27+
* @param grpcCode the given {@code io.grpc.Status.Code}.
28+
* @return a {@code io.opencensus.trace.Status.CanonicalCode} from a {@code io.grpc.Status.Code}.
29+
*/
30+
public static io.opencensus.trace.Status.CanonicalCode fromGrpcCode(
31+
io.grpc.Status.Code grpcCode) {
32+
return opencensusStatusFromGrpcCode(grpcCode).getCanonicalCode();
33+
}
34+
35+
/**
36+
* Returns a {@link io.opencensus.trace.Status} from a {@link io.grpc.Status}.
37+
*
38+
* @param grpcStatus the given {@code io.grpc.Status}.
39+
* @return a {@code io.opencensus.trace.Status} from a {@code io.grpc.Status}.
40+
*/
41+
public static io.opencensus.trace.Status fromGrpcStatus(io.grpc.Status grpcStatus) {
42+
io.opencensus.trace.Status status = opencensusStatusFromGrpcCode(grpcStatus.getCode());
43+
if (grpcStatus.getDescription() != null) {
44+
status = status.withDescription(grpcStatus.getDescription());
45+
}
46+
return status;
47+
}
48+
49+
/**
50+
* Returns a {@link io.grpc.Status.Code} from a {@link io.opencensus.trace.Status.CanonicalCode}.
51+
*
52+
* @param opencensusCanonicalCode the given {@code io.opencensus.trace.Status.CanonicalCode}.
53+
* @return a {@code io.grpc.Status.Code} from a {@code io.opencensus.trace.Status.CanonicalCode}.
54+
*/
55+
public static io.grpc.Status.Code toGrpcCode(io.opencensus.trace.Status.CanonicalCode
56+
opencensusCanonicalCode) {
57+
return grpcStatusFromOpencensusCanonicalCode(opencensusCanonicalCode).getCode();
58+
}
59+
60+
/**
61+
* Returns a {@link io.grpc.Status} from a {@link io.opencensus.trace.Status}.
62+
*
63+
* @param opencensusStatus the given {@code io.opencensus.trace.Status}.
64+
* @return a {@code io.grpc.Status} from a {@code io.opencensus.trace.Status}.
65+
*/
66+
public static io.grpc.Status toGrpcStatus(io.opencensus.trace.Status opencensusStatus) {
67+
io.grpc.Status status = grpcStatusFromOpencensusCanonicalCode(opencensusStatus
68+
.getCanonicalCode());
69+
if (opencensusStatus.getDescription() != null) {
70+
status = status.withDescription(opencensusStatus.getDescription());
71+
}
72+
return status;
73+
}
74+
75+
private static io.opencensus.trace.Status opencensusStatusFromGrpcCode(io.grpc.Status.Code
76+
grpcCanonicaleCode) {
77+
switch (grpcCanonicaleCode) {
78+
case OK:
79+
return io.opencensus.trace.Status.OK;
80+
case CANCELLED:
81+
return io.opencensus.trace.Status.CANCELLED;
82+
case UNKNOWN:
83+
return io.opencensus.trace.Status.UNKNOWN;
84+
case INVALID_ARGUMENT:
85+
return io.opencensus.trace.Status.INVALID_ARGUMENT;
86+
case DEADLINE_EXCEEDED:
87+
return io.opencensus.trace.Status.DEADLINE_EXCEEDED;
88+
case NOT_FOUND:
89+
return io.opencensus.trace.Status.NOT_FOUND;
90+
case ALREADY_EXISTS:
91+
return io.opencensus.trace.Status.ALREADY_EXISTS;
92+
case PERMISSION_DENIED:
93+
return io.opencensus.trace.Status.PERMISSION_DENIED;
94+
case RESOURCE_EXHAUSTED:
95+
return io.opencensus.trace.Status.RESOURCE_EXHAUSTED;
96+
case FAILED_PRECONDITION:
97+
return io.opencensus.trace.Status.FAILED_PRECONDITION;
98+
case ABORTED:
99+
return io.opencensus.trace.Status.ABORTED;
100+
case OUT_OF_RANGE:
101+
return io.opencensus.trace.Status.OUT_OF_RANGE;
102+
case UNIMPLEMENTED:
103+
return io.opencensus.trace.Status.UNIMPLEMENTED;
104+
case INTERNAL:
105+
return io.opencensus.trace.Status.INTERNAL;
106+
case UNAVAILABLE:
107+
return io.opencensus.trace.Status.UNAVAILABLE;
108+
case DATA_LOSS:
109+
return io.opencensus.trace.Status.DATA_LOSS;
110+
case UNAUTHENTICATED:
111+
return io.opencensus.trace.Status.UNAUTHENTICATED;
112+
}
113+
throw new AssertionError("Unhandled status code " + grpcCanonicaleCode);
114+
}
115+
116+
private static io.grpc.Status grpcStatusFromOpencensusCanonicalCode(io.opencensus.trace.Status
117+
.CanonicalCode opencensusCanonicalCode) {
118+
switch (opencensusCanonicalCode) {
119+
case OK:
120+
return io.grpc.Status.OK;
121+
case CANCELLED:
122+
return io.grpc.Status.CANCELLED;
123+
case UNKNOWN:
124+
return io.grpc.Status.UNKNOWN;
125+
case INVALID_ARGUMENT:
126+
return io.grpc.Status.INVALID_ARGUMENT;
127+
case DEADLINE_EXCEEDED:
128+
return io.grpc.Status.DEADLINE_EXCEEDED;
129+
case NOT_FOUND:
130+
return io.grpc.Status.NOT_FOUND;
131+
case ALREADY_EXISTS:
132+
return io.grpc.Status.ALREADY_EXISTS;
133+
case PERMISSION_DENIED:
134+
return io.grpc.Status.PERMISSION_DENIED;
135+
case RESOURCE_EXHAUSTED:
136+
return io.grpc.Status.RESOURCE_EXHAUSTED;
137+
case FAILED_PRECONDITION:
138+
return io.grpc.Status.FAILED_PRECONDITION;
139+
case ABORTED:
140+
return io.grpc.Status.ABORTED;
141+
case OUT_OF_RANGE:
142+
return io.grpc.Status.OUT_OF_RANGE;
143+
case UNIMPLEMENTED:
144+
return io.grpc.Status.UNIMPLEMENTED;
145+
case INTERNAL:
146+
return io.grpc.Status.INTERNAL;
147+
case UNAVAILABLE:
148+
return io.grpc.Status.UNAVAILABLE;
149+
case DATA_LOSS:
150+
return io.grpc.Status.DATA_LOSS;
151+
case UNAUTHENTICATED:
152+
return io.grpc.Status.UNAUTHENTICATED;
153+
}
154+
throw new AssertionError("Unhandled status code " + opencensusCanonicalCode);
155+
}
156+
157+
private StatusConverter() {
158+
}
159+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
/*
2+
* Copyright 2017, OpenCensus Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package io.opencensus.contrib.grpc.util;
18+
19+
import static com.google.common.truth.Truth.assertThat;
20+
21+
import org.junit.Test;
22+
import org.junit.runner.RunWith;
23+
import org.junit.runners.JUnit4;
24+
25+
/**
26+
* Unit tests for {@link StatusConverter}.
27+
*/
28+
@RunWith(JUnit4.class)
29+
public class StatusConverterTest {
30+
31+
@Test
32+
public void convertFromGrpcCode() {
33+
for (io.grpc.Status.Code grpcCanonicalCode : io.grpc.Status.Code.values()) {
34+
io.opencensus.trace.Status.CanonicalCode opencensusCanonicalCode = StatusConverter
35+
.fromGrpcCode(grpcCanonicalCode);
36+
assertThat(opencensusCanonicalCode.toString()).isEqualTo(grpcCanonicalCode.toString());
37+
}
38+
}
39+
40+
@Test
41+
public void convertFromGrpcStatus() {
42+
// Without description
43+
for (io.grpc.Status.Code grpcCanonicalCode : io.grpc.Status.Code.values()) {
44+
io.grpc.Status grpcStatus = io.grpc.Status.fromCode(grpcCanonicalCode);
45+
io.opencensus.trace.Status opencensusStatus = StatusConverter.fromGrpcStatus(grpcStatus);
46+
assertThat(opencensusStatus.getCanonicalCode().toString())
47+
.isEqualTo(grpcStatus.getCode().toString());
48+
assertThat(opencensusStatus.getDescription()).isNull();
49+
}
50+
51+
// With description
52+
for (io.grpc.Status.Code grpcCanonicalCode : io.grpc.Status.Code.values()) {
53+
io.grpc.Status grpcStatus =
54+
io.grpc.Status.fromCode(grpcCanonicalCode).withDescription("This is my description");
55+
io.opencensus.trace.Status opencensusStatus = StatusConverter.fromGrpcStatus(grpcStatus);
56+
assertThat(opencensusStatus.getCanonicalCode().toString())
57+
.isEqualTo(grpcStatus.getCode().toString());
58+
assertThat(opencensusStatus.getDescription()).isEqualTo(grpcStatus.getDescription());
59+
}
60+
}
61+
62+
@Test
63+
public void convertToGrpcCode() {
64+
for (io.opencensus.trace.Status.CanonicalCode opencensusCanonicalCode :
65+
io.opencensus.trace.Status.CanonicalCode.values()) {
66+
io.grpc.Status.Code grpcCanonicalCode = StatusConverter
67+
.toGrpcCode(opencensusCanonicalCode);
68+
assertThat(grpcCanonicalCode.toString()).isEqualTo(opencensusCanonicalCode.toString());
69+
}
70+
}
71+
72+
@Test
73+
public void convertToGrpcStatus() {
74+
// Without description
75+
for (io.opencensus.trace.Status.CanonicalCode opencensusCanonicalCode :
76+
io.opencensus.trace.Status.CanonicalCode.values()) {
77+
io.opencensus.trace.Status opencensusStatus = opencensusCanonicalCode.toStatus();
78+
io.grpc.Status grpcStatus = StatusConverter.toGrpcStatus(opencensusStatus);
79+
assertThat(grpcStatus.getCode().toString())
80+
.isEqualTo(opencensusStatus.getCanonicalCode().toString());
81+
assertThat(grpcStatus.getDescription()).isNull();
82+
}
83+
84+
// With description
85+
for (io.opencensus.trace.Status.CanonicalCode opencensusCanonicalCode :
86+
io.opencensus.trace.Status.CanonicalCode.values()) {
87+
io.opencensus.trace.Status opencensusStatus =
88+
opencensusCanonicalCode.toStatus().withDescription("This is my description");
89+
io.grpc.Status grpcStatus = StatusConverter.toGrpcStatus(opencensusStatus);
90+
assertThat(grpcStatus.getCode().toString())
91+
.isEqualTo(opencensusStatus.getCanonicalCode().toString());
92+
assertThat(grpcStatus.getDescription()).isEqualTo(opencensusStatus.getDescription());
93+
}
94+
}
95+
}

settings.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ include ":core_impl"
1212
include ":core_impl_java"
1313
include ":core_impl_android"
1414
include ":opencensus-contrib-agent"
15+
include ":opencensus-contrib-grpc-util"
1516

1617
project(':opencensus-api').projectDir = "$rootDir/api" as File
1718
project(':opencensus-impl-core').projectDir = "$rootDir/impl_core" as File
1819
project(':opencensus-impl-lite').projectDir = "$rootDir/impl_lite" as File
1920
project(':opencensus-impl').projectDir = "$rootDir/impl" as File
2021
project(':opencensus-testing').projectDir = "$rootDir/testing" as File
2122
project(':opencensus-contrib-agent').projectDir = "$rootDir/contrib/agent" as File
23+
project(':opencensus-contrib-grpc-util').projectDir = "$rootDir/contrib/grpc_util" as File
2224
project(':opencensus-exporter-trace-logging').projectDir = "$rootDir/exporters/trace_logging" as File
2325
project(':opencensus-exporter-trace-stackdriver').projectDir = "$rootDir/exporters/trace_stackdriver" as File
2426

0 commit comments

Comments
 (0)