Skip to content

Commit c67bd63

Browse files
committed
Add opentelemetry
1 parent 725787f commit c67bd63

File tree

26 files changed

+281
-242
lines changed

26 files changed

+281
-242
lines changed

README.md

+5-4
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,11 @@ Packages which use in this example project
4545
10. [gqlgen](https://github.com/99designs/gqlgen) - graphql server library
4646
11. [protobuf](https://pkg.go.dev/google.golang.org/protobuf) - Google's data interchange format
4747
12. [grpc](google.golang.org/grpc) - RPC framework
48-
13. [jaeger](https://github.com/uber/jaeger-client-go) - Jaeger Bindings for Go OpenTracing API
49-
14. [casbin](https://github.com/casbin/casbin) - Supports access control
50-
15. [dataloaden](https://github.com/vektah/dataloaden) - DataLoader for graphql
51-
16. [nats](https://github.com/nats-io/nats.go) - Golang client for NATS, the cloud native messaging system
48+
13. [opentelemetry](https://github.com/open-telemetry/opentelemetry-go) - OpenTelemetry
49+
14. [jaeger](https://github.com/uber/jaeger-client-go) - Jaeger Bindings for Go OpenTelemetry API
50+
15. [casbin](https://github.com/casbin/casbin) - Supports access control
51+
16. [dataloaden](https://github.com/vektah/dataloaden) - DataLoader for graphql
52+
17. [nats](https://github.com/nats-io/nats.go) - Golang client for NATS, the cloud native messaging system
5253

5354
# Installing
5455

app/common/jaeger.go

+26-27
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,38 @@
11
package common
22

33
import (
4-
"log"
4+
"github.com/aristat/golang-example-app/app/tracing"
5+
"go.opentelemetry.io/otel/exporters/jaeger"
6+
"go.opentelemetry.io/otel/sdk/resource"
7+
tracesdk "go.opentelemetry.io/otel/sdk/trace"
8+
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
59

610
"github.com/spf13/viper"
7-
8-
"github.com/opentracing/opentracing-go"
9-
"github.com/uber/jaeger-client-go"
10-
11-
jaegerConfig "github.com/uber/jaeger-client-go/config"
1211
)
1312

14-
func GenerateTracerForTestClient(serviceName string, cfg *viper.Viper) opentracing.Tracer {
15-
jaegerCfg := jaegerConfig.Configuration{
16-
Sampler: &jaegerConfig.SamplerConfig{
17-
Type: "const",
18-
Param: 1,
19-
},
20-
Reporter: &jaegerConfig.ReporterConfig{
21-
LogSpans: false,
22-
},
13+
func GenerateTracerForTestClient(serviceName string, cfg *viper.Viper) (*tracesdk.TracerProvider, error) {
14+
configuration := tracing.Configuration{}
15+
err := cfg.UnmarshalKey("tracing.jaeger", &configuration)
16+
if err != nil {
17+
return nil, err
2318
}
2419

25-
e := cfg.UnmarshalKey("tracing.jaeger", &jaegerCfg)
26-
if e != nil {
27-
log.Fatal("Jaeger initialize config error")
28-
}
29-
30-
// redefine for test services
31-
jaegerCfg.ServiceName = serviceName
32-
33-
tracer, _, e := jaegerCfg.NewTracer(jaegerConfig.Logger(jaeger.StdLogger))
34-
if e != nil {
35-
log.Fatal("Jaeger initialize client error")
20+
exp, err := jaeger.New(
21+
jaeger.WithAgentEndpoint(
22+
jaeger.WithAgentHost(configuration.AgentHost),
23+
jaeger.WithAgentPort(configuration.AgentPort),
24+
),
25+
)
26+
if err != nil {
27+
return nil, err
3628
}
3729

38-
return tracer
30+
tp := tracesdk.NewTracerProvider(
31+
tracesdk.WithBatcher(exp),
32+
tracesdk.WithResource(resource.NewWithAttributes(
33+
semconv.SchemaURL,
34+
semconv.ServiceNameKey.String(serviceName),
35+
)),
36+
)
37+
return tp, nil
3938
}

app/config/wire_gen.go

+2-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/db/provider.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ func Cfg(cfg *viper.Viper) (Config, func(), error) {
1818
c := Config{LogLevel: logger.LevelDebug}
1919
e := cfg.UnmarshalKey("db", &c)
2020
if e != nil {
21-
return c, func() {}, nil
21+
return c, func() {}, e
2222
}
2323
return c, func() {}, nil
2424
}

app/db/wire_gen.go

+2-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/graphql/graphql.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616
gqlgen "github.com/99designs/gqlgen/graphql"
1717
"github.com/aristat/golang-example-app/app/logger"
1818
"github.com/aristat/golang-example-app/generated/graphql"
19-
"github.com/go-chi/chi"
19+
"github.com/go-chi/chi/v5"
2020
"github.com/vektah/gqlparser/v2/gqlerror"
2121
)
2222

app/graphql_resolver/wire_gen.go

+7-6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/grpc/manager.go

+19-13
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@ import (
44
"context"
55
"errors"
66

7-
grpc_opentracing "github.com/grpc-ecosystem/go-grpc-middleware/tracing/opentracing"
7+
"go.opentelemetry.io/otel/propagation"
8+
9+
"go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
10+
tracesdk "go.opentelemetry.io/otel/sdk/trace"
11+
12+
"google.golang.org/grpc/credentials/insecure"
813

914
"github.com/aristat/golang-example-app/app/logger"
10-
"github.com/aristat/golang-example-app/app/tracing"
11-
grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware"
1215
"google.golang.org/grpc"
1316
"google.golang.org/grpc/keepalive"
1417
)
@@ -20,7 +23,7 @@ var errCfgInvalid = errors.New("cfg is not present or invalid")
2023
// PoolManager
2124
type PoolManager struct {
2225
ctx context.Context
23-
tracing tracing.Tracer
26+
tracing *tracesdk.TracerProvider
2427
cfg *Config
2528
logger logger.Logger
2629
}
@@ -34,7 +37,7 @@ func (p *PoolManager) NewPool(service string) (_ *Pool, loaded bool, _ error) {
3437
}
3538

3639
var opts []grpc.DialOption
37-
opts = append(opts, grpc.WithInsecure())
40+
opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials()))
3841

3942
cl := s.ClientParameters
4043
if cl == nil {
@@ -47,14 +50,17 @@ func (p *PoolManager) NewPool(service string) (_ *Pool, loaded bool, _ error) {
4750

4851
opts = append(opts, grpc.WithKeepaliveParams(*cl))
4952
opts = append(opts,
50-
grpc.WithUnaryInterceptor(grpc_middleware.ChainUnaryClient(
53+
grpc.WithChainUnaryInterceptor(
5154
logger.UnaryClientInterceptor(p.logger, true),
52-
grpc_opentracing.UnaryClientInterceptor(grpc_opentracing.WithTracer(p.tracing)),
53-
)))
54-
opts = append(opts, grpc.WithStreamInterceptor(grpc_middleware.ChainStreamClient(
55-
logger.StreamClientInterceptor(p.logger, true),
56-
grpc_opentracing.StreamClientInterceptor(grpc_opentracing.WithTracer(p.tracing)),
57-
)))
55+
otelgrpc.UnaryClientInterceptor(otelgrpc.WithTracerProvider(p.tracing), otelgrpc.WithPropagators(propagation.TraceContext{})),
56+
),
57+
)
58+
opts = append(opts,
59+
grpc.WithChainStreamInterceptor(
60+
logger.StreamClientInterceptor(p.logger, true),
61+
otelgrpc.StreamClientInterceptor(otelgrpc.WithTracerProvider(p.tracing), otelgrpc.WithPropagators(propagation.TraceContext{})),
62+
),
63+
)
5864

5965
pool, l := NewPool(p.ctx, service, s.Target,
6066
MaxConn(s.MaxConn),
@@ -68,6 +74,6 @@ func (p *PoolManager) NewPool(service string) (_ *Pool, loaded bool, _ error) {
6874
}
6975

7076
// NewPoolManager
71-
func NewPoolManager(ctx context.Context, tracing tracing.Tracer, logger logger.Logger, cfg *Config) *PoolManager {
77+
func NewPoolManager(ctx context.Context, tracing *tracesdk.TracerProvider, logger logger.Logger, cfg *Config) *PoolManager {
7278
return &PoolManager{ctx: ctx, tracing: tracing, cfg: cfg, logger: logger}
7379
}

app/grpc/provider.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ import (
55
"sync"
66
"time"
77

8+
tracesdk "go.opentelemetry.io/otel/sdk/trace"
9+
810
"github.com/aristat/golang-example-app/app/logger"
911

10-
"github.com/aristat/golang-example-app/app/tracing"
1112
"github.com/google/wire"
1213
"github.com/spf13/viper"
1314
"google.golang.org/grpc/keepalive"
@@ -50,7 +51,7 @@ type Config struct {
5051
}
5152

5253
// Provider
53-
func Provider(ctx context.Context, tracing tracing.Tracer, logger logger.Logger, cfg *Config) (*PoolManager, func(), error) {
54+
func Provider(ctx context.Context, tracing *tracesdk.TracerProvider, logger logger.Logger, cfg *Config) (*PoolManager, func(), error) {
5455
mutexPM.Lock()
5556
defer mutexPM.Unlock()
5657
if pm != nil {

app/http/http.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"net/http"
66
"sync"
77

8-
"github.com/go-chi/chi"
8+
"github.com/go-chi/chi/v5"
99

1010
"github.com/go-session/session"
1111

app/http/logger.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"time"
66

77
"github.com/aristat/golang-example-app/app/logger"
8-
"github.com/go-chi/chi/middleware"
8+
"github.com/go-chi/chi/v5/middleware"
99
)
1010

1111
func Logger(l logger.Logger) func(next http.Handler) http.Handler {

app/http/provider.go

+17-16
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,32 @@ package http
33
import (
44
"context"
55

6+
"github.com/riandyrn/otelchi"
7+
68
"github.com/aristat/golang-example-app/app/dataloader"
79

810
products_router "github.com/aristat/golang-example-app/app/http_routers/products-router"
911

1012
"github.com/aristat/golang-example-app/app/auth"
1113

1214
"github.com/aristat/golang-example-app/app/graphql"
13-
"github.com/go-chi/chi"
14-
"github.com/go-chi/chi/middleware"
15-
"github.com/opentracing/opentracing-go"
15+
"github.com/go-chi/chi/v5"
16+
"github.com/go-chi/chi/v5/middleware"
1617

1718
"github.com/aristat/golang-example-app/app/logger"
1819

1920
"github.com/google/wire"
2021
"github.com/spf13/viper"
2122
)
2223

23-
var mux *chi.Mux
24+
var muxRouter *chi.Mux
2425

2526
// Cfg
2627
func Cfg(cfg *viper.Viper) (Config, func(), error) {
2728
c := Config{}
2829
e := cfg.UnmarshalKey("http", &c)
2930
if e != nil {
30-
return c, func() {}, nil
31+
return c, func() {}, e
3132
}
3233
c.Debug = cfg.GetBool("debug")
3334
return c, func() {}, nil
@@ -39,21 +40,21 @@ func CfgTest() (Config, func(), error) {
3940
}
4041

4142
// Mux
42-
func Mux(managers Managers, log logger.Logger, tracer opentracing.Tracer) (*chi.Mux, func(), error) {
43-
if mux != nil {
44-
return mux, func() {}, nil
43+
func Mux(managers Managers, log logger.Logger) (*chi.Mux, func(), error) {
44+
if muxRouter != nil {
45+
return muxRouter, func() {}, nil
4546
}
4647

47-
mux = chi.NewRouter()
48-
mux.Use(middleware.RequestID)
49-
mux.Use(Logger(log))
50-
mux.Use(Tracer(tracer))
51-
mux.Use(dataloader.LoaderMiddleware)
48+
muxRouter = chi.NewRouter()
49+
muxRouter.Use(middleware.RequestID)
50+
muxRouter.Use(Logger(log))
51+
muxRouter.Use(otelchi.Middleware("http-server", otelchi.WithChiRoutes(muxRouter)))
52+
muxRouter.Use(dataloader.LoaderMiddleware)
5253

53-
managers.products.Router.Run(mux)
54-
managers.graphql.Routers(mux.With(managers.authMiddleware.JWTHandler))
54+
managers.products.Router.Run(muxRouter)
55+
managers.graphql.Routers(muxRouter.With(managers.authMiddleware.JWTHandler))
5556

56-
return mux, func() {}, nil
57+
return muxRouter, func() {}, nil
5758
}
5859

5960
// ServiceManagers

app/http/tracer.go

-20
This file was deleted.

0 commit comments

Comments
 (0)