Skip to content

Commit

Permalink
Comunicacao MS - Otel
Browse files Browse the repository at this point in the history
  • Loading branch information
wesleywillians committed May 22, 2024
1 parent 4e03fcf commit a54ec95
Show file tree
Hide file tree
Showing 9 changed files with 1,004 additions and 0 deletions.
30 changes: 30 additions & 0 deletions labs/otel/comunicacao-ms/.docker/otel-collector-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
receivers:
otlp:
protocols:
grpc:

exporters:
prometheus:
endpoint: "0.0.0.0:8889"

logging:

otlp:
endpoint: jaeger-all-in-one:4317
tls:
insecure: true

processors:
batch:


service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [logging, otlp]
metrics:
receivers: [otlp]
processors: [batch]
exporters: [logging, prometheus]
11 changes: 11 additions & 0 deletions labs/otel/comunicacao-ms/.docker/prometheus.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
scrape_configs:
- job_name: 'otel-collector'
scrape_interval: 10s
static_configs:
- targets: ['otel-collector:8889']
- targets: ['otel-collector:8888']

- job_name: 'goapp'
scrape_interval: 10s
static_configs:
- targets: ['goapp:8080']
9 changes: 9 additions & 0 deletions labs/otel/comunicacao-ms/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
FROM golang:latest as builder
WORKDIR /app
COPY . .

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build --ldflags="-w -s" -o ms cmd/microservice/main.go

FROM alpine:latest
COPY --from=builder /app/ms /app/ms
CMD ["/app/ms"]
119 changes: 119 additions & 0 deletions labs/otel/comunicacao-ms/cmd/microservice/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
package main

import (
"context"
"fmt"
"log"
"net/http"
"os"
"os/signal"
"time"

"github.com/devfullcycle/microservices-demo/internal/web"
"github.com/spf13/viper"

"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"

"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.21.0"
)

func initProvider(serviceName, collectorURL string) (func(context.Context) error, error) {
ctx := context.Background()

res, err := resource.New(ctx,
resource.WithAttributes(
semconv.ServiceName(serviceName),
),
)
if err != nil {
return nil, fmt.Errorf("failed to create resource: %w", err)
}

ctx, cancel := context.WithTimeout(ctx, time.Second)
defer cancel()
conn, err := grpc.DialContext(ctx, collectorURL,
grpc.WithTransportCredentials(insecure.NewCredentials()),
grpc.WithBlock(),
)
if err != nil {
return nil, fmt.Errorf("failed to create gRPC connection to collector: %w", err)
}

traceExporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithGRPCConn(conn))
if err != nil {
return nil, fmt.Errorf("failed to create trace exporter: %w", err)
}

bsp := sdktrace.NewBatchSpanProcessor(traceExporter)
tracerProvider := sdktrace.NewTracerProvider(
sdktrace.WithSampler(sdktrace.AlwaysSample()),
sdktrace.WithResource(res),
sdktrace.WithSpanProcessor(bsp),
)
otel.SetTracerProvider(tracerProvider)

otel.SetTextMapPropagator(propagation.TraceContext{})

return tracerProvider.Shutdown, nil
}

// load env vars cfg
func init() {
viper.AutomaticEnv()
}

func main() {
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, os.Interrupt)

ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
defer cancel()

shutdown, err := initProvider(viper.GetString("OTEL_SERVICE_NAME"), viper.GetString("OTEL_EXPORTER_OTLP_ENDPOINT"))
if err != nil {
log.Fatal(err)
}
defer func() {
if err := shutdown(ctx); err != nil {
log.Fatal("failed to shutdown TracerProvider: %w", err)
}
}()

tracer := otel.Tracer("microservice-tracer")

templateData := &web.TemplateData{
Title: viper.GetString("TITLE"),
BackgroundColor: viper.GetString("BACKGROUND_COLOR"),
ResponseTime: time.Duration(viper.GetInt("RESPONSE_TIME")),
ExternalCallURL: viper.GetString("EXTERNAL_CALL_URL"),
ExternalCallMethod: viper.GetString("EXTERNAL_CALL_METHOD"),
RequestNameOTEL: viper.GetString("REQUEST_NAME_OTEL"),
OTELTracer: tracer,
}
server := web.NewServer(templateData)
router := server.CreateServer()

go func() {
log.Println("Starting server on port", viper.GetString("HTTP_PORT"))
if err := http.ListenAndServe(viper.GetString("HTTP_PORT"), router); err != nil {
log.Fatal(err)
}
}()

select {
case <-sigCh:
log.Println("Shutting down gracefully, CTRL+C pressed...")
case <-ctx.Done():
log.Println("Shutting down due to other reason...")
}

// Create a timeout context for the graceful shutdown
_, shutdownCancel := context.WithTimeout(context.Background(), 10*time.Second)
defer shutdownCancel()
}
102 changes: 102 additions & 0 deletions labs/otel/comunicacao-ms/docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
version: '3'
services:
jaeger-all-in-one:
image: jaegertracing/all-in-one:latest
restart: always
ports:
- "16686:16686"
- "14268"
- "14250"

prometheus:
container_name: prometheus
image: prom/prometheus:latest
restart: always
volumes:
- ./.docker/prometheus.yaml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"

otel-collector:
image: otel/opentelemetry-collector:latest
restart: always
command: ["--config=/etc/otel-collector-config.yaml"]
volumes:
- ./.docker/otel-collector-config.yaml:/etc/otel-collector-config.yaml
ports:
- "8888:8888" # Prometheus metrics exposed by the collector
- "8889:8889" # Prometheus exporter metrics
- "4317:4317" # OTLP gRPC receiver

grafana:
container_name: grafana
image: grafana/grafana:latest
restart: always
ports:
- "3001:3000"
depends_on:
- prometheus

goapp:
container_name: goapp
build:
context: .
environment:
- TITLE=Microservice Demo
- CONTENT=This is a demo of a microservice
- BACKGROUND_COLOR=green
- RESPONSE_TIME=1000
- EXTERNAL_CALL_URL=http://goapp2:8181
- EXTERNAL_CALL_METHOD=GET
- REQUEST_NAME_OTEL=microservice-demo-request
- OTEL_SERVICE_NAME=microservice-demo
- OTEL_EXPORTER_OTLP_ENDPOINT=otel-collector:4317
- HTTP_PORT=:8080
ports:
- "8080:8080"
depends_on:
- jaeger-all-in-one
- prometheus
- otel-collector

goapp2:
container_name: goapp2
build:
context: .
environment:
- TITLE=Microservice Demo 2
- CONTENT=This is a demo of a microservice
- BACKGROUND_COLOR=blue
- EXTERNAL_CALL_URL=http://goapp3:8282
- EXTERNAL_CALL_METHOD=GET
- RESPONSE_TIME=2000
- REQUEST_NAME_OTEL=microservice-demo2-request
- OTEL_SERVICE_NAME=microservice-demo2
- OTEL_EXPORTER_OTLP_ENDPOINT=otel-collector:4317
- HTTP_PORT=:8181
ports:
- "8181:8181"
depends_on:
- jaeger-all-in-one
- prometheus
- otel-collector

goapp3:
container_name: goapp3
build:
context: .
environment:
- TITLE=Microservice Demo 3
- CONTENT=This is a demo of a microservice
- BACKGROUND_COLOR=green
- RESPONSE_TIME=2000
- REQUEST_NAME_OTEL=microservice-demo3-request
- OTEL_SERVICE_NAME=microservice-demo3
- OTEL_EXPORTER_OTLP_ENDPOINT=otel-collector:4317
- HTTP_PORT=:8282
ports:
- "8282:8282"
depends_on:
- jaeger-all-in-one
- prometheus
- otel-collector
53 changes: 53 additions & 0 deletions labs/otel/comunicacao-ms/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
module github.com/devfullcycle/microservices-demo

go 1.21.1

require (
github.com/go-chi/chi v1.5.5
github.com/go-chi/chi/v5 v5.0.10
github.com/prometheus/client_golang v1.16.0
github.com/spf13/viper v1.16.0
go.opentelemetry.io/otel v1.18.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.18.0
google.golang.org/grpc v1.58.0
)

require (
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/pelletier/go-toml/v2 v2.0.8 // indirect
github.com/spf13/afero v1.9.5 // indirect
github.com/spf13/cast v1.5.1 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/subosito/gotenv v1.4.2 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.18.0 // indirect
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
golang.org/x/net v0.12.0 // indirect
golang.org/x/text v0.11.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/go-logr/logr v1.2.4 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/prometheus/client_model v0.3.0 // indirect
github.com/prometheus/common v0.42.0 // indirect
github.com/prometheus/procfs v0.10.1 // indirect
go.opentelemetry.io/otel/metric v1.18.0 // indirect
go.opentelemetry.io/otel/sdk v1.18.0
go.opentelemetry.io/otel/trace v1.18.0
golang.org/x/sys v0.12.0 // indirect
google.golang.org/protobuf v1.31.0 // indirect
)
Loading

0 comments on commit a54ec95

Please sign in to comment.