Add grpc health check. (#304)

* Add grpc health check.

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>

* fix missing package.

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>

* fix readme..

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>

* fix vet

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
This commit is contained in:
Bo-Yi Wu
2017-11-12 08:44:33 -06:00
committed by GitHub
parent ff4ab7002f
commit 25bfe420b0
22 changed files with 1391 additions and 37 deletions

View File

@@ -28,9 +28,11 @@
package status
import (
"errors"
"fmt"
"github.com/golang/protobuf/proto"
"github.com/golang/protobuf/ptypes"
spb "google.golang.org/genproto/googleapis/rpc/status"
"google.golang.org/grpc/codes"
)
@@ -128,3 +130,39 @@ func FromError(err error) (s *Status, ok bool) {
}
return nil, false
}
// WithDetails returns a new status with the provided details messages appended to the status.
// If any errors are encountered, it returns nil and the first error encountered.
func (s *Status) WithDetails(details ...proto.Message) (*Status, error) {
if s.Code() == codes.OK {
return nil, errors.New("no error details for status with code OK")
}
// s.Code() != OK implies that s.Proto() != nil.
p := s.Proto()
for _, detail := range details {
any, err := ptypes.MarshalAny(detail)
if err != nil {
return nil, err
}
p.Details = append(p.Details, any)
}
return &Status{s: p}, nil
}
// Details returns a slice of details messages attached to the status.
// If a detail cannot be decoded, the error is returned in place of the detail.
func (s *Status) Details() []interface{} {
if s == nil || s.s == nil {
return nil
}
details := make([]interface{}, 0, len(s.s.Details))
for _, any := range s.s.Details {
detail := &ptypes.DynamicAny{}
if err := ptypes.UnmarshalAny(any, detail); err != nil {
details = append(details, err)
continue
}
details = append(details, detail.Message)
}
return details
}