-
Notifications
You must be signed in to change notification settings - Fork 185
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
4e03fcf
commit a54ec95
Showing
9 changed files
with
1,004 additions
and
0 deletions.
There are no files selected for viewing
30 changes: 30 additions & 0 deletions
30
labs/otel/comunicacao-ms/.docker/otel-collector-config.yaml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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'] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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"] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
) |
Oops, something went wrong.