Skip to content

Commit

Permalink
Remove google.golang.org/grpc/codes dependency from API by adding an …
Browse files Browse the repository at this point in the history
…equivalent codes package (#1046)

* Add otel/codes package to replace google.golang.org/grpc/codes

* Replace google.golang.org/grpc/codes with otel/codes

* Update opentracing bridge to use OTel codes

* Update semconv to use OTel codes

* Update SDK to convert from OTel codes to gRPC

* go mod tidy

* Add change to CHANGELOG

* Fix word from feedback
  • Loading branch information
MrAlias authored Aug 10, 2020
1 parent 2dfa5e4 commit efd4e3a
Show file tree
Hide file tree
Showing 17 changed files with 159 additions and 33 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
- Renamed `go.opentelemetry.io/otel/api/standard` package to `go.opentelemetry.io/otel/semconv` to avoid the ambiguous and generic name `standard` and better describe the package as containing OpenTelemetry semantic conventions. (#1016)
- The environment variable used for resource detection has been changed from `OTEL_RESOURCE_LABELS` to `OTEL_RESOURCE_ATTRIBUTES` (#1042)
- Replace `WithSyncer` with `WithBatcher` in examples. (#1044)
- Replace the `google.golang.org/grpc/codes` dependency in the API with an equivalent `go.opentelemetry.io/otel/codes` package. (#1046)

### Removed

Expand Down
4 changes: 1 addition & 3 deletions api/testharness/harness.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,8 @@ import (
"time"

"go.opentelemetry.io/otel/api/kv"

"google.golang.org/grpc/codes"

"go.opentelemetry.io/otel/api/trace"
"go.opentelemetry.io/otel/codes"
"go.opentelemetry.io/otel/internal/matchers"
)

Expand Down
3 changes: 1 addition & 2 deletions api/trace/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,8 @@ import (
"context"
"time"

"google.golang.org/grpc/codes"

"go.opentelemetry.io/otel/api/kv"
"go.opentelemetry.io/otel/codes"
)

type Provider interface {
Expand Down
3 changes: 1 addition & 2 deletions api/trace/context_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,9 @@ import (
"testing"
"time"

"google.golang.org/grpc/codes"

"go.opentelemetry.io/otel/api/kv"
"go.opentelemetry.io/otel/api/trace"
"go.opentelemetry.io/otel/codes"
)

func TestSetCurrentSpanOverridesPreviouslySetSpan(t *testing.T) {
Expand Down
3 changes: 1 addition & 2 deletions api/trace/noop_span.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,8 @@ import (
"context"
"time"

"google.golang.org/grpc/codes"

"go.opentelemetry.io/otel/api/kv"
"go.opentelemetry.io/otel/codes"
)

type NoopSpan struct {
Expand Down
3 changes: 1 addition & 2 deletions api/trace/testtrace/span.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,9 @@ import (
"sync"
"time"

"google.golang.org/grpc/codes"

"go.opentelemetry.io/otel/api/kv"
"go.opentelemetry.io/otel/api/trace"
"go.opentelemetry.io/otel/codes"
)

const (
Expand Down
3 changes: 1 addition & 2 deletions api/trace/testtrace/span_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,10 @@ import (
"testing"
"time"

"google.golang.org/grpc/codes"

"go.opentelemetry.io/otel/api/kv"
"go.opentelemetry.io/otel/api/trace"
"go.opentelemetry.io/otel/api/trace/testtrace"
"go.opentelemetry.io/otel/codes"
"go.opentelemetry.io/otel/internal/matchers"
ottest "go.opentelemetry.io/otel/internal/testing"
)
Expand Down
3 changes: 1 addition & 2 deletions bridge/opentracing/bridge.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@ import (
"strings"
"sync"

"google.golang.org/grpc/codes"

ot "github.com/opentracing/opentracing-go"
otext "github.com/opentracing/opentracing-go/ext"
otlog "github.com/opentracing/opentracing-go/log"
Expand All @@ -32,6 +30,7 @@ import (
otelcore "go.opentelemetry.io/otel/api/kv"
otelpropagation "go.opentelemetry.io/otel/api/propagation"
oteltrace "go.opentelemetry.io/otel/api/trace"
"go.opentelemetry.io/otel/codes"
otelparent "go.opentelemetry.io/otel/internal/trace/parent"

"go.opentelemetry.io/otel/bridge/opentracing/migration"
Expand Down
1 change: 0 additions & 1 deletion bridge/opentracing/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,4 @@ replace go.opentelemetry.io/otel => ../..
require (
github.com/opentracing/opentracing-go v1.2.0
go.opentelemetry.io/otel v0.10.0
google.golang.org/grpc v1.31.0
)
3 changes: 1 addition & 2 deletions bridge/opentracing/internal/mock.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,10 @@ import (
"sync"
"time"

"google.golang.org/grpc/codes"

otelcorrelation "go.opentelemetry.io/otel/api/correlation"
otelcore "go.opentelemetry.io/otel/api/kv"
oteltrace "go.opentelemetry.io/otel/api/trace"
"go.opentelemetry.io/otel/codes"
otelparent "go.opentelemetry.io/otel/internal/trace/parent"

"go.opentelemetry.io/otel/bridge/opentracing/migration"
Expand Down
89 changes: 89 additions & 0 deletions codes/codes.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Package codes defines the canonical error codes used by OpenTelemetry.
//
// It conforms to [the OpenTelemetry
// specification](https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/trace/api.md#statuscanonicalcode).
// This also means that it follows gRPC codes and is based on
// [google.golang.org/grpc/codes](https://godoc.org/google.golang.org/grpc/codes).
//
// This package was added to this project, instead of using that existing
// package, to avoid the large package size it includes and not impose that
// burden on projects using this package.
package codes

// Code is an 32-bit representation of a status state.
type Code uint32

// WARNING: any changes here must be propagated to the
// otel/sdk/internal/codes.go file.
const (
// OK means success.
OK Code = 0
// Canceled indicates the operation was canceled (typically by the
// caller).
Canceled Code = 1
// Unknown error. An example of where this error may be returned is if an
// error is raised by a dependant API that does not contain enough
// information to convert it into a more appropriate error.
Unknown Code = 2
// InvalidArgument indicates a client specified an invalid argument. Note
// that this differs from FailedPrecondition. InvalidArgument indicates
// arguments that are problematic regardless of the state of the system.
InvalidArgument Code = 3
// DeadlineExceeded means a deadline expired before the operation could
// complete. For operations that change the state of the system, this error
// may be returned even if the operation has completed successfully.
DeadlineExceeded Code = 4
// NotFound means some requested entity (e.g., file or directory) was not
// found.
NotFound Code = 5
// AlreadyExists means some entity that we attempted to create (e.g., file
// or directory) already exists.
AlreadyExists Code = 6
// PermissionDenied means the caller does not have permission to execute
// the specified operation. PermissionDenied must not be used if the caller
// cannot be identified (use Unauthenticated instead for those errors).
PermissionDenied Code = 7
// ResourceExhausted means some resource has been exhausted, perhaps a
// per-user quota, or perhaps the entire file system is out of space.
ResourceExhausted Code = 8
// FailedPrecondition means the operation was rejected because the system
// is not in a state required for the operation's execution.
FailedPrecondition Code = 9
// Aborted means the operation was aborted, typically due to a concurrency
// issue like sequencer check failures, transaction aborts, etc.
Aborted Code = 10
// OutOfRange means the operation was attempted past the valid range.
// E.g., seeking or reading past end of file. Unlike InvalidArgument, this
// error indicates a problem that may be fixed if the system state
// changes.
OutOfRange Code = 11
// Unimplemented means the operation is not implemented or not
// supported/enabled in this service.
Unimplemented Code = 12
// Internal means an internal errors. It means some invariants expected by
// underlying system has been broken.
Internal Code = 13
// Unavailable means the service is currently unavailable. This is most
// likely a transient condition and may be corrected by retrying with a
// backoff.
Unavailable Code = 14
// DataLoss means unrecoverable data loss or corruption has occurred.
DataLoss Code = 15
// Unauthenticated means the request does not have valid authentication
// credentials for the operation.
Unauthenticated Code = 16
)
3 changes: 1 addition & 2 deletions internal/trace/mock_span.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,9 @@ import (
"context"
"time"

"google.golang.org/grpc/codes"

"go.opentelemetry.io/otel/api/kv"
apitrace "go.opentelemetry.io/otel/api/trace"
"go.opentelemetry.io/otel/codes"
)

// MockSpan is a mock span used in association with MockTracer for testing purpose only.
Expand Down
49 changes: 49 additions & 0 deletions sdk/internal/codes.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package internal

import (
grpccodes "google.golang.org/grpc/codes"

otelcodes "go.opentelemetry.io/otel/codes"
)

// conversions are the equivalence mapping from OpenTelemetry to gRPC codes.
// Even though the underlying value should be the same all mappings are
// explicit here to avoid any error.
var conversions = map[otelcodes.Code]grpccodes.Code{
otelcodes.OK: grpccodes.OK,
otelcodes.Canceled: grpccodes.Canceled,
otelcodes.Unknown: grpccodes.Unknown,
otelcodes.InvalidArgument: grpccodes.InvalidArgument,
otelcodes.DeadlineExceeded: grpccodes.DeadlineExceeded,
otelcodes.NotFound: grpccodes.NotFound,
otelcodes.AlreadyExists: grpccodes.AlreadyExists,
otelcodes.PermissionDenied: grpccodes.PermissionDenied,
otelcodes.ResourceExhausted: grpccodes.ResourceExhausted,
otelcodes.FailedPrecondition: grpccodes.FailedPrecondition,
otelcodes.Aborted: grpccodes.Aborted,
otelcodes.OutOfRange: grpccodes.OutOfRange,
otelcodes.Unimplemented: grpccodes.Unimplemented,
otelcodes.Internal: grpccodes.Internal,
otelcodes.Unavailable: grpccodes.Unavailable,
otelcodes.DataLoss: grpccodes.DataLoss,
otelcodes.Unauthenticated: grpccodes.Unauthenticated,
}

// ConvertCode converts an OpenTelemetry Code into the equivalent gRPC code.
func ConvertCode(code otelcodes.Code) grpccodes.Code {
return conversions[code]
}
5 changes: 2 additions & 3 deletions sdk/trace/span.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,10 @@ import (
"sync"
"time"

"google.golang.org/grpc/codes"

"go.opentelemetry.io/otel/api/global"
"go.opentelemetry.io/otel/api/kv"
apitrace "go.opentelemetry.io/otel/api/trace"
"go.opentelemetry.io/otel/codes"
export "go.opentelemetry.io/otel/sdk/export/trace"
"go.opentelemetry.io/otel/sdk/internal"
)
Expand Down Expand Up @@ -90,7 +89,7 @@ func (s *span) SetStatus(code codes.Code, msg string) {
return
}
s.mu.Lock()
s.data.StatusCode = code
s.data.StatusCode = internal.ConvertCode(code)
s.data.StatusMessage = msg
s.mu.Unlock()
}
Expand Down
13 changes: 7 additions & 6 deletions sdk/trace/trace_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,13 @@ import (
"github.com/google/go-cmp/cmp"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"google.golang.org/grpc/codes"
grpccodes "google.golang.org/grpc/codes"

"go.opentelemetry.io/otel/api/kv"
"go.opentelemetry.io/otel/api/testharness"
"go.opentelemetry.io/otel/api/trace"
apitrace "go.opentelemetry.io/otel/api/trace"
otelcodes "go.opentelemetry.io/otel/codes"
ottest "go.opentelemetry.io/otel/internal/testing"
export "go.opentelemetry.io/otel/sdk/export/trace"
"go.opentelemetry.io/otel/sdk/instrumentation"
Expand Down Expand Up @@ -592,7 +593,7 @@ func TestSetSpanStatus(t *testing.T) {
tp, _ := NewProvider(WithSyncer(te))

span := startSpan(tp, "SpanStatus")
span.SetStatus(codes.Canceled, "canceled")
span.SetStatus(otelcodes.Canceled, "canceled")
got, err := endSpan(te, span)
if err != nil {
t.Fatal(err)
Expand All @@ -606,7 +607,7 @@ func TestSetSpanStatus(t *testing.T) {
ParentSpanID: sid,
Name: "span0",
SpanKind: apitrace.SpanKindInternal,
StatusCode: codes.Canceled,
StatusCode: grpccodes.Canceled,
StatusMessage: "canceled",
HasRemoteParent: true,
InstrumentationLibrary: instrumentation.Library{Name: "SpanStatus"},
Expand Down Expand Up @@ -976,7 +977,7 @@ func TestRecordErrorWithStatus(t *testing.T) {

testErr := ottest.NewTestError("test error")
errTime := time.Now()
testStatus := codes.Unknown
testStatus := otelcodes.Unknown
span.RecordError(context.Background(), testErr,
apitrace.WithErrorTime(errTime),
apitrace.WithErrorStatus(testStatus),
Expand All @@ -995,7 +996,7 @@ func TestRecordErrorWithStatus(t *testing.T) {
ParentSpanID: sid,
Name: "span0",
SpanKind: apitrace.SpanKindInternal,
StatusCode: codes.Unknown,
StatusCode: grpccodes.Unknown,
StatusMessage: "",
HasRemoteParent: true,
MessageEvents: []export.Event{
Expand Down Expand Up @@ -1036,7 +1037,7 @@ func TestRecordErrorNil(t *testing.T) {
Name: "span0",
SpanKind: apitrace.SpanKindInternal,
HasRemoteParent: true,
StatusCode: codes.OK,
StatusCode: grpccodes.OK,
StatusMessage: "",
InstrumentationLibrary: instrumentation.Library{Name: "RecordErrorNil"},
}
Expand Down
3 changes: 1 addition & 2 deletions semconv/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,8 @@ import (
"strconv"
"strings"

"google.golang.org/grpc/codes"

"go.opentelemetry.io/otel/api/kv"
"go.opentelemetry.io/otel/codes"
)

// NetAttributesFromHTTPRequest generates attributes of the net
Expand Down
3 changes: 1 addition & 2 deletions semconv/http_test.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
Expand All @@ -22,9 +21,9 @@ import (
"testing"

"github.com/stretchr/testify/assert"
"google.golang.org/grpc/codes"

otelkv "go.opentelemetry.io/otel/api/kv"
"go.opentelemetry.io/otel/codes"
)

type tlsOption int
Expand Down

0 comments on commit efd4e3a

Please sign in to comment.