Skip to content

Commit d2d2f96

Browse files
Merge pull request #162 from intelops/refactoring-otel
refactoring: added opentel config for rest in a separate file
2 parents 824a27c + 72bf4ea commit d2d2f96

File tree

239 files changed

+42073
-10
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

239 files changed

+42073
-10
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
apiVersion: v1
2+
kind: ConfigMap
3+
metadata:
4+
name: core-open-telemetry-data
5+
labels:
6+
{{- include "compage.core.labels" . | nindent 4 }}
7+
data:
8+
OTEL_EXPORTER_OTLP_ENDPOINT: {{.Values.core.open-telemetry.otelExporterOtlpEndpoint}}

charts/compage/templates/deployments/core.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,16 @@ spec:
4242
port: grpc
4343
initialDelaySeconds: 15
4444
periodSeconds: 30
45+
env:
46+
- name: SERVICE_NAME
47+
value: Core
48+
- name: INSECURE_MODE
49+
value: "true"
50+
- name: OTEL_EXPORTER_OTLP_ENDPOINT
51+
valueFrom:
52+
configMapKeyRef:
53+
name: core-open-telemetry-data
54+
key: OTEL_EXPORTER_OTLP_ENDPOINT
4555
resources:
4656
{{- toYaml .Values.core.resources | nindent 12 }}
4757
{{- with .Values.core.nodeSelector }}

charts/compage/values.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ core:
8787
type: ClusterIP
8888
port: 50051
8989

90+
open-telemetry:
91+
otelExporterOtlpEndpoint: "http://localhost:4317"
92+
9093
resources:
9194
limits:
9295
cpu: 100m

core/config/grpc-opentel-config.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package config
2+
3+
import (
4+
"context"
5+
log "github.com/sirupsen/logrus"
6+
"go.opentelemetry.io/otel"
7+
"go.opentelemetry.io/otel/attribute"
8+
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
9+
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
10+
"go.opentelemetry.io/otel/propagation"
11+
"go.opentelemetry.io/otel/sdk/resource"
12+
sdktrace "go.opentelemetry.io/otel/sdk/trace"
13+
"google.golang.org/grpc/credentials"
14+
"os"
15+
)
16+
17+
// InitGrpcTracer configures an OpenTelemetry exporter and trace provider
18+
func InitGrpcTracer(serviceName, collectorURL, insecure string) *sdktrace.TracerProvider {
19+
secureOption := otlptracegrpc.WithTLSCredentials(credentials.NewClientTLSFromCert(nil, ""))
20+
if len(insecure) > 0 {
21+
secureOption = otlptracegrpc.WithInsecure()
22+
}
23+
24+
exporter, err := otlptrace.New(
25+
context.Background(),
26+
otlptracegrpc.NewClient(
27+
secureOption,
28+
otlptracegrpc.WithEndpoint(collectorURL),
29+
),
30+
)
31+
32+
if err != nil {
33+
log.Debugf("error while configuring opentel, %v", err)
34+
os.Exit(1)
35+
}
36+
37+
resources, err := resource.New(
38+
context.Background(),
39+
resource.WithAttributes(
40+
attribute.String("service.name", serviceName),
41+
attribute.String("library.language", "go"),
42+
),
43+
)
44+
if err != nil {
45+
log.Errorf("Could not set resources: %v", err)
46+
os.Exit(1)
47+
}
48+
49+
traceProvider := sdktrace.NewTracerProvider(
50+
sdktrace.WithSampler(sdktrace.AlwaysSample()),
51+
sdktrace.WithBatcher(exporter),
52+
sdktrace.WithResource(resources),
53+
)
54+
55+
otel.SetTracerProvider(traceProvider)
56+
otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
57+
58+
return traceProvider
59+
}

core/go.mod

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,27 @@ require (
66
github.com/gertd/go-pluralize v0.2.1
77
github.com/iancoleman/strcase v0.2.0
88
github.com/sirupsen/logrus v1.9.0
9+
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0
10+
go.opentelemetry.io/otel v1.16.0
11+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0
12+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0
13+
go.opentelemetry.io/otel/sdk v1.16.0
914
golang.org/x/exp v0.0.0-20230321023759-10a507213a29
1015
golang.org/x/text v0.9.0
1116
google.golang.org/grpc v1.56.0
1217
google.golang.org/protobuf v1.31.0
1318
)
1419

1520
require (
21+
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
22+
github.com/go-logr/logr v1.2.4 // indirect
23+
github.com/go-logr/stdr v1.2.2 // indirect
1624
github.com/golang/protobuf v1.5.3 // indirect
17-
github.com/stretchr/testify v1.8.3 // indirect
25+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
26+
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect
27+
go.opentelemetry.io/otel/metric v1.16.0 // indirect
28+
go.opentelemetry.io/otel/trace v1.16.0 // indirect
29+
go.opentelemetry.io/proto/otlp v0.19.0 // indirect
1830
golang.org/x/net v0.10.0 // indirect
1931
golang.org/x/sys v0.8.0 // indirect
2032
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect

core/go.sum

Lines changed: 424 additions & 1 deletion
Large diffs are not rendered by default.

core/internal/languages/golang/frameworks/go-gin-server/copier.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121

2222
const RestServerPath = "/pkg/rest/server"
2323
const RestClientPath = "/pkg/rest/client"
24+
const ConfigPath = "/config"
2425

2526
const ControllersPath = RestServerPath + "/controllers"
2627
const ServicesPath = RestServerPath + "/services"
@@ -53,6 +54,7 @@ const MySQLGORMDBConfigFile = "mysql-gorm.go.tmpl"
5354
const SQLiteGORMDBConfigFile = "sqlite-gorm.go.tmpl"
5455

5556
const ClientFile = "client.go.tmpl"
57+
const ConfigFile = "rest-opentel-config.go.tmpl"
5658

5759
// MongoDB nosql databases
5860
const MongoDB = "MongoDB"
@@ -155,10 +157,15 @@ func (c *Copier) createRestClientDirectories() error {
155157

156158
// createRestServerDirectories creates rest server directories.
157159
func (c *Copier) createRestServerDirectories() error {
160+
configDirectory := c.NodeDirectoryName + ConfigPath
158161
controllersDirectory := c.NodeDirectoryName + ControllersPath
159162
modelsDirectory := c.NodeDirectoryName + ModelsPath
160163
servicesDirectory := c.NodeDirectoryName + ServicesPath
161164
daosDirectory := c.NodeDirectoryName + DaosPath
165+
if err := utils.CreateDirectories(configDirectory); err != nil {
166+
log.Debugf("error creating config directory: %v", err)
167+
return err
168+
}
162169
if err := utils.CreateDirectories(controllersDirectory); err != nil {
163170
log.Debugf("error creating controllers directory: %v", err)
164171
return err
@@ -624,6 +631,22 @@ func (c *Copier) CreateRestServer() error {
624631
return err
625632
}
626633
}
634+
// copy opentel config file
635+
var filePaths []string
636+
// client files
637+
targetOpenTelConfigFileName := c.NodeDirectoryName + ConfigPath + "/" + ConfigFile
638+
_, err := utils.CopyFile(targetOpenTelConfigFileName, c.TemplatesRootPath+ConfigPath+"/"+ConfigFile)
639+
if err != nil {
640+
log.Debugf("error copying opentel config file: %v", err)
641+
return err
642+
}
643+
filePaths = append(filePaths, targetOpenTelConfigFileName)
644+
err = executor.Execute(filePaths, c.Data)
645+
if err != nil {
646+
log.Debugf("error executing opentel config file: %v", err)
647+
return err
648+
}
649+
627650
if c.IsSQLDB {
628651
// create sql db config file (common to all resources for specific database)
629652
// No vars in config file as of now but in future they may be there.

core/internal/languages/golang/frameworks/go-grpc-server/copier.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ const MySQLGORMDBConfigFile = "mysql-gorm.go.tmpl"
5454
const SQLiteGORMDBConfigFile = "sqlite-gorm.go.tmpl"
5555

5656
const ClientFile = "client.go.tmpl"
57-
const ConfigFile = "opentel-config.go.tmpl"
57+
const ConfigFile = "grpc-opentel-config.go.tmpl"
5858

5959
// MongoDB nosql databases
6060
const MongoDB = "MongoDB"
@@ -165,21 +165,27 @@ func (c *Copier) createGrpcServerDirectories() error {
165165
servicesDirectory := c.NodeDirectoryName + ServicesPath
166166
daosDirectory := c.NodeDirectoryName + DaosPath
167167
if err := utils.CreateDirectories(configDirectory); err != nil {
168+
log.Debugf("error creating config directory: %v", err)
168169
return err
169170
}
170171
if err := utils.CreateDirectories(apiDirectory); err != nil {
172+
log.Debugf("error creating api directory: %v", err)
171173
return err
172174
}
173175
if err := utils.CreateDirectories(controllersDirectory); err != nil {
176+
log.Debugf("error creating controllers directory: %v", err)
174177
return err
175178
}
176179
if err := utils.CreateDirectories(modelsDirectory); err != nil {
180+
log.Debugf("error creating models directory: %v", err)
177181
return err
178182
}
179183
if err := utils.CreateDirectories(servicesDirectory); err != nil {
184+
log.Debugf("error creating services directory: %v", err)
180185
return err
181186
}
182187
if err := utils.CreateDirectories(daosDirectory); err != nil {
188+
log.Debugf("error creating daos directory: %v", err)
183189
return err
184190
}
185191
if c.IsSQLDB {

core/internal/languages/utils/common.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ func GetDefaultValueForDataType(value string) interface{} {
131131
} else if value == "bool" {
132132
return true
133133
} else if value == "float32" ||
134-
value == "float64 " ||
134+
value == "float64" ||
135135
value == "complex64" ||
136136
value == "complex128" {
137137
return 1.0

core/main.go

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,45 @@
11
package main
22

33
import (
4+
"context"
45
server "github.com/intelops/compage/core/cmd/grpc"
6+
"github.com/intelops/compage/core/config"
57
project "github.com/intelops/compage/core/gen/api/v1"
68
log "github.com/sirupsen/logrus"
9+
"go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
10+
sdktrace "go.opentelemetry.io/otel/sdk/trace"
711
"golang.org/x/exp/slices"
812
"google.golang.org/grpc"
913
"google.golang.org/grpc/reflection"
14+
1015
"net"
1116
"os"
1217
"os/signal"
1318
"syscall"
1419
)
1520

21+
var (
22+
serviceName = os.Getenv("SERVICE_NAME")
23+
collectorURL = os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT")
24+
insecure = os.Getenv("INSECURE_MODE")
25+
)
26+
1627
func main() {
28+
// grpc server configuration
29+
// Initialize the exporter
30+
var grpcTraceProvider *sdktrace.TracerProvider
31+
if len(serviceName) > 0 && len(collectorURL) > 0 {
32+
// add opentel
33+
grpcTraceProvider = config.InitGrpcTracer(serviceName, collectorURL, insecure)
34+
}
35+
defer func() {
36+
if grpcTraceProvider != nil {
37+
if err := grpcTraceProvider.Shutdown(context.Background()); err != nil {
38+
log.Printf("Error shutting down tracer provider: %v", err)
39+
}
40+
}
41+
}()
42+
1743
// check if the git submodules have been pulled (mainly need to check this on developer's machine)
1844
if checkIfGitSubmodulesExist() {
1945
log.Println("starting gRPC server...")
@@ -56,9 +82,9 @@ func startGrpcServer() {
5682
if err != nil {
5783
log.Fatalf("failed to serve: %v", err)
5884
}
59-
var opts []grpc.ServerOption
6085

61-
grpcServer := grpc.NewServer(opts...)
86+
grpcServer := grpc.NewServer(grpc.UnaryInterceptor(otelgrpc.UnaryServerInterceptor()),
87+
grpc.StreamInterceptor(otelgrpc.StreamServerInterceptor()))
6288
impl := server.New()
6389
project.RegisterProjectServiceServer(grpcServer, impl)
6490
reflection.Register(grpcServer)

0 commit comments

Comments
 (0)