未验证 提交 e61c0b16 编写于 作者: Z zhang-wei 提交者: GitHub

Support TLS with gRPCReporter (#62)

上级 7ba623d0
...@@ -27,7 +27,7 @@ deps: ...@@ -27,7 +27,7 @@ deps:
.PHONY: test .PHONY: test
test: test:
go test -v -race -cover -coverprofile=coverage.txt -covermode=atomic `go list ./... | grep -v github.com/SkyAPM/go2sky/reporter/grpc` go test -v -race -cover -coverprofile=coverage.txt -covermode=atomic `go list ./... | grep -v github.com/SkyAPM/go2sky/reporter/grpc | grep -v github.com/SkyAPM/go2sky/test`
.PHONY: proto-gen .PHONY: proto-gen
proto-gen: proto-gen:
......
...@@ -17,14 +17,15 @@ The API of this project is still evolving. The use of vendoring tool is recommen ...@@ -17,14 +17,15 @@ The API of this project is still evolving. The use of vendoring tool is recommen
# Quickstart # Quickstart
By completing this quickstart, you will learn how to trace local methods. For more details, please view By completing this quickstart, you will learn how to trace local methods. For more details, please view
[the example](example_trace_test.go) [the example](example_trace_test.go).
## Configuration ## Configuration
GO2Sky can export traces to Apache SkyWalking OAP server or local logger. In the following example, we configure GO2Sky to export to OAP server, GO2Sky can export traces to Apache SkyWalking OAP server or local logger. In the following example, we configure GO2Sky to export to OAP server,
which is listening on `oap-skywalking` port `11800`, and all of the spans from this program will be associated with a service name `example`. which is listening on `oap-skywalking` port `11800`, and all the spans from this program will be associated with a service name `example`.
`reporter.GRPCReporter` can also adjust the behavior through `reporter.GRPCReporterOption`, [view all](docs/GRPC-Reporter-Option.md).
```go ```go
r, err := reporter.NewGRPCReporter("oap-skywalking:11800") r, err := reporter.NewGRPCReporter("oap-skywalking:11800")
if err != nil { if err != nil {
log.Fatalf("new reporter error %v \n", err) log.Fatalf("new reporter error %v \n", err)
......
### GRPCReporterOption
`GRPCReporterOption` allows for functional options to adjust behaviour of a `gRPC` reporter to be created by `NewGRPCReporter`.
| Function | Describe |
| ---------- | --- |
| `reporter.WithLogger` | setup logger for gRPC reporter |
| `reporter.WithCheckInterval` | setup service and endpoint registry check interval |
| `reporter.WithInstanceProps` | setup service instance properties eg: org=SkyAPM |
| `reporter.WithTransportCredentials` | setup transport layer security |
| `reporter.WithAuthentication` | used Authentication for gRPC |
\ No newline at end of file
...@@ -30,6 +30,7 @@ import ( ...@@ -30,6 +30,7 @@ import (
managementv3 "github.com/SkyAPM/go2sky/reporter/grpc/management" managementv3 "github.com/SkyAPM/go2sky/reporter/grpc/management"
"google.golang.org/grpc" "google.golang.org/grpc"
"google.golang.org/grpc/connectivity" "google.golang.org/grpc/connectivity"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/metadata" "google.golang.org/grpc/metadata"
) )
...@@ -50,7 +51,16 @@ func NewGRPCReporter(serverAddr string, opts ...GRPCReporterOption) (go2sky.Repo ...@@ -50,7 +51,16 @@ func NewGRPCReporter(serverAddr string, opts ...GRPCReporterOption) (go2sky.Repo
for _, o := range opts { for _, o := range opts {
o(r) o(r)
} }
conn, err := grpc.Dial(serverAddr, grpc.WithInsecure()) //TODO add TLS
var credsDialOption grpc.DialOption
if r.creds != nil {
// use tls
credsDialOption = grpc.WithTransportCredentials(r.creds)
} else {
credsDialOption = grpc.WithInsecure()
}
conn, err := grpc.Dial(serverAddr, credsDialOption)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -92,9 +102,17 @@ func WithInstanceProps(props map[string]string) GRPCReporterOption { ...@@ -92,9 +102,17 @@ func WithInstanceProps(props map[string]string) GRPCReporterOption {
} }
} }
// WithTransportCredentials setup transport layer security
func WithTransportCredentials(creds credentials.TransportCredentials) GRPCReporterOption {
return func(r *gRPCReporter) {
r.creds = creds
}
}
// WithAuthentication used Authentication for gRPC
func WithAuthentication(auth string) GRPCReporterOption { func WithAuthentication(auth string) GRPCReporterOption {
return func(r *gRPCReporter) { return func(r *gRPCReporter) {
r.md = metadata.New( map[string]string{authKey: auth}) r.md = metadata.New(map[string]string{authKey: auth})
} }
} }
...@@ -108,7 +126,9 @@ type gRPCReporter struct { ...@@ -108,7 +126,9 @@ type gRPCReporter struct {
traceClient agentv3.TraceSegmentReportServiceClient traceClient agentv3.TraceSegmentReportServiceClient
managementClient managementv3.ManagementServiceClient managementClient managementv3.ManagementServiceClient
checkInterval time.Duration checkInterval time.Duration
md metadata.MD;
md metadata.MD
creds credentials.TransportCredentials
} }
func (r *gRPCReporter) Boot(service string, serviceInstance string) { func (r *gRPCReporter) Boot(service string, serviceInstance string) {
......
...@@ -32,6 +32,7 @@ import ( ...@@ -32,6 +32,7 @@ import (
managementv3 "github.com/SkyAPM/go2sky/reporter/grpc/management" managementv3 "github.com/SkyAPM/go2sky/reporter/grpc/management"
"github.com/SkyAPM/go2sky/reporter/grpc/management/mock_management" "github.com/SkyAPM/go2sky/reporter/grpc/management/mock_management"
"github.com/golang/mock/gomock" "github.com/golang/mock/gomock"
"google.golang.org/grpc/credentials"
) )
const ( const (
...@@ -126,9 +127,19 @@ func TestGRPCReporter_Close(t *testing.T) { ...@@ -126,9 +127,19 @@ func TestGRPCReporter_Close(t *testing.T) {
} }
func TestGRPCReporterOption(t *testing.T) { func TestGRPCReporterOption(t *testing.T) {
// props
instanceProps := make(map[string]string) instanceProps := make(map[string]string)
instanceProps["org"] = "SkyAPM" instanceProps["org"] = "SkyAPM"
// log
logger := log.New(os.Stderr, "WithLogger", log.LstdFlags) logger := log.New(os.Stderr, "WithLogger", log.LstdFlags)
// tls
creds, err := credentials.NewClientTLSFromFile("../test/test-data/certs/cert.crt", "SkyAPM.org")
if err != nil {
t.Error(err)
}
tests := []struct { tests := []struct {
name string name string
option GRPCReporterOption option GRPCReporterOption
...@@ -184,6 +195,15 @@ func TestGRPCReporterOption(t *testing.T) { ...@@ -184,6 +195,15 @@ func TestGRPCReporterOption(t *testing.T) {
} }
}, },
}, },
{
name: "with tls",
option: WithTransportCredentials(creds),
verifyFunc: func(t *testing.T, reporter *gRPCReporter) {
if reporter.creds != creds {
t.Error("error are not set TransportCredentials")
}
},
},
} }
for _, tt := range tests { for _, tt := range tests {
......
# Self-signed certificates
openssl genrsa -out cert.key 2048
openssl req -new -x509 -sha256 -key cert.key -out cert.crt -days 3650
For the common name, please type the following FQDN:
SkyAPM.org
-----BEGIN CERTIFICATE-----
MIIDlTCCAn2gAwIBAgIUKKpIHrwwKjkL3tfvAyb9Zw/n+A4wDQYJKoZIhvcNAQEL
BQAwWjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDETMBEGA1UEAwwKU2t5QVBNLm9yZzAe
Fw0yMDA2MDkxNjA3MzBaFw0zMDA2MDcxNjA3MzBaMFoxCzAJBgNVBAYTAkFVMRMw
EQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0
eSBMdGQxEzARBgNVBAMMClNreUFQTS5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQCtgxmr32F3f9GSn4ZeK8+X/LkD9Nu3znWWOYF1Jw2wcYm+8S+4
ru/roz5IQSNQZDmoAXZVkOjLhO8OG+qMwKy/ZKBxVFN8wL0n0Q+EPDkDCeY+9dTJ
c7w/5fIHvvnj2dgEppWdq+mAGaC/XJuGVfxRAEfsckn9EBDmf5XqH0P5emZHnLV2
OoBZOP6H2pjXcy8F2O6+ZUMzn+mQE7mGN8QpUq+odcab2D65WgPyyuaThX56ivWA
MeOB76BMkOZ0G5H6zWQ2HcWHd/oKHMaoCIWvgtMZ51Lj3AaM2UeCjZrLvyTQzCtn
Zyp6KgHpoHYxGk4zBU4/xxruiGdKf2Lc5l2fAgMBAAGjUzBRMB0GA1UdDgQWBBTK
JMnMwE46jfvumrMQTxiZ/I/XDjAfBgNVHSMEGDAWgBTKJMnMwE46jfvumrMQTxiZ
/I/XDjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCkuiKAdOaL
440+5VPHsq+xkno6mEA7qfVznj7CeVMWiMMJYYpsw9dMA9KkJCZB7HrUlj3MqH7m
KZaDcD4Sdkd9ysD+Lhm0uurESpAEi3O6tpZI7xrLKq3LY7lWGQvTKkgAaNtUk7mY
8Kc2rxnj/OJM/5e14OVJZN6cjmhsp3wS5lA5zc3XdYVYj0FRjclIQPx5Cx2uDfQo
GlYK+gD1iOrROM6ydAzwktcer6YN78IFjhWe1jsLAblLJwy05RGMPZYdjvfk58m1
J0IMdYcZ4+iyEuSUlauf7WwreUjwWpfYfVUlhQtTLERqhm3UrI68teh5zD/saeVQ
DHXRlcyKcJK0
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEArYMZq99hd3/Rkp+GXivPl/y5A/Tbt851ljmBdScNsHGJvvEv
uK7v66M+SEEjUGQ5qAF2VZDoy4TvDhvqjMCsv2SgcVRTfMC9J9EPhDw5AwnmPvXU
yXO8P+XyB77549nYBKaVnavpgBmgv1ybhlX8UQBH7HJJ/RAQ5n+V6h9D+XpmR5y1
djqAWTj+h9qY13MvBdjuvmVDM5/pkBO5hjfEKVKvqHXGm9g+uVoD8srmk4V+eor1
gDHjge+gTJDmdBuR+s1kNh3Fh3f6ChzGqAiFr4LTGedS49wGjNlHgo2ay78k0Mwr
Z2cqeioB6aB2MRpOMwVOP8ca7ohnSn9i3OZdnwIDAQABAoIBAGt6IKWw6bvOxe8P
t3iPpLhdh/EmdA8n6PhTyJfbyAP6YDuRRGEeo2iPpp21E33Rh1FFDpqz9y9RuY5A
xonHM3oeh6+Lb2eAL+sA+Z6MezghoqhvOA5NDVd7RO99YWa84q0Gzvhqq2l49nRy
lbehfXhjNyoEJUaG9CEC+Mab9UwLerXpgOXLHKfDpmUGTyO7PO79lYSWkTFQkYLy
SvFFddl2Klh+4v/kk+dASJnk971liH/ln3UpUvS0wSouYIm/TBwSsdUUCQAUzJ50
iiKzqc9wtaAWwuS5B5SQ84+53gL/bk7TFTRjDczvuvqqCnbEpvxzoaPW8JfL/YDn
xAH7EZkCgYEA4PF1b4J48KmVR8oHcjNe/OGqncGe+CTcUDOP+50y+oaeQ3QVGYb5
a08EV8oumITwxzY1yQWPsXUVzDVr6nDNaqrZV8ZOzEoTe16JWE6L5/YbwVxyzTDZ
lOxEHeu4jHHuWJeuuYP7pfO+7bT2rOyglDBzNZgu8a46qwbOQXn8HfMCgYEAxXfT
v7d0yW0oXRg9FNT8w5+ydaAUS8CJhsLb7anacnPxufZN5kE/8Un1HOsozyrujfpA
yJi4yJds0GhyY3CmQiFW0rezMCDSCQoF1ZY13RnQk+0qV7SCyryCa22K+pTu87k3
c5Gz4uqQSTgrWjxKEOCR8cLqXBMQzZT25xfwsKUCgYAQTa/jSyOU3dWyBFSR1GNY
FMsW8AejmJhXP8V5yST+v28NGIbG+N9vBaUc78x8xXXmGmm/jiWiCQhxapXNwitB
RezGzdq8N8o9sNZnjhnZ0B6m3xp7AMVkY9N0D7eqhj9uMGA7lfNRTd9Sv0D5u5TP
6MsQ4VzVq3kZGD8uw7agPQKBgQCt9DpoSG+sRenp4MFmSZ6FonguoJ9ggDNmsN/X
ROr4KmWGoZDMRyzSHYm9OPfRUIuoLQ3G6KrXonWsPmaObR05Ym8+368NtcvxRJAR
MOswZF5XAfVsH8ucV2Y4xt5IkszRjZdoyrECNAp5Re8C5duFdJ98r22PQQhrYlAD
EhbpNQKBgFH38OszYe/d57Wg6VQ05QeJuvoeh5OurqqwDgUVAJDmsjyRhJIrMk6K
vrPvsoKW6jou8FBFeaFJxvi6LUpBYF3RDFe+d1UTtkDnTDJ+5AqhWPQMfdIsruQI
h/PE5YYkB3GAKNCPlkT8NmhyK0fkzEyXCWjrqeRWAaATTE/F5yiM
-----END RSA PRIVATE KEY-----
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册