Go - Samples Quickstart
          Beginner 10/10
          Teacher 10/10
          Architect 10/10
        
        
        
        
Prerequisites
- Go 1.22+
- Docker and Docker Compose
- Optional: golang-migrate CLI, grpcurl, protoc + plugins
1) Sample REST API
# run the server
go run ./cmd/api
# test endpoints
curl -s localhost:8080/health | jq
curl -s -X POST localhost:8080/echo -d '{"message":"hello"}' -H 'Content-Type: application/json' | jq
2) Sample CRUD API (with Migrations)
# start postgres
make compose-up
# run migrations
make migrate-up
# run the API
make run
# test endpoints
curl -s localhost:8080/users | jq
curl -s -X POST localhost:8080/users -d '{"name":"Ada","email":"[email protected]"}' -H 'Content-Type: application/json' | jq
3) Sample gRPC Streaming Service
# generate stubs (if not generated)
protoc -I proto --go_out=./ --go-grpc_out=./ proto/echo.proto
# run server
go run ./cmd/srv
# test stream with grpcurl
grpcurl -plaintext -d '{"msg":"hi"}' localhost:50051 echo.Echo/Stream
4) Observability (OpenTelemetry)
# start local Jaeger + OTel collector
docker compose -f docker-compose.observability.yml up -d
# run your service with OTEL exporter envs
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
# ...run your service...
# view: http://localhost:16686
5) One-command demo (stack)
This compose file starts Postgres, Jaeger, OTel Collector, Prometheus, Grafana; and example service stubs you can wire to your sample REST/CRUD images.
docker-compose.stack.yml
version: "3.9"
services:
  db:
    image: postgres:16
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: app
    ports: ["5432:5432"]
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user -d app"]
      interval: 5s
      timeout: 3s
      retries: 5
  jaeger:
    image: jaegertracing/all-in-one:1.57
    ports: ["16686:16686", "14250:14250"]
  otel-collector:
    image: otel/opentelemetry-collector:0.98.0
    command: ["--config=/etc/otelcol-config.yaml"]
    volumes:
      - ./otelcol-config.yaml:/etc/otelcol-config.yaml:ro
    ports: ["4317:4317", "4318:4318"]
    depends_on: ["jaeger"]
  prometheus:
    image: prom/prometheus:v2.54.1
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
    ports: ["9090:9090"]
  grafana:
    image: grafana/grafana:11.1.0
    ports: ["3000:3000"]
    environment:
      GF_SECURITY_ADMIN_PASSWORD: admin
    depends_on: ["prometheus"]
  rest:
    # example: build your REST sample into an image and use it here
    image: yourorg/sample-rest:latest
    environment:
      OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4318
    depends_on: ["db", "otel-collector"]
    # ports: ["8080:8080"] # if you expose it
  crud:
    image: yourorg/sample-crud:latest
    environment:
      DSN: postgres://user:pass@db:5432/app?sslmode=disable
      OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4318
    depends_on: ["db", "otel-collector"]
otelcol-config.yaml (with Prometheus exporter)
receivers:
  otlp:
    protocols: { grpc: {}, http: {} }
exporters:
  jaeger: { endpoint: jaeger:14250, tls: { insecure: true } }
  prometheus:
    endpoint: 0.0.0.0:9464
service:
  pipelines:
    traces: { receivers: [otlp], exporters: [jaeger] }
    metrics: { receivers: [otlp], exporters: [prometheus] }
prometheus.yml
global: { scrape_interval: 15s }
scrape_configs:
  - job_name: otel-collector
    static_configs:
      - targets: ["otel-collector:9464"]
Makefile (stack)
stack-up:
	docker compose -f docker-compose.stack.yml up -d
stack-down:
	docker compose -f docker-compose.stack.yml down -v