A high-performance, test-driven microservice (Hexagonal Architecture) for event ingestion and analytics.
Event Metrics Service is a lightweight and scalable backend service designed to:
- Ingest user events (
POST /events) - Support bulk ingestion (
POST /events/bulk) - Provide analytical metrics (
GET /metrics) - Guarantee idempotent event writes
- Perform efficient time-range analytics
- Run fully containerized with Docker Compose
- Serve complete API documentation via Swagger (
/docs) - Maintain high test coverage following TDD principles
Technologies used: Go (Fiber), PostgreSQL, Hexagonal Architecture, Docker, Swagger (swaggo/fiber-swagger).
internal/
events/
core/
domain/
ports/
usecase/
adapters/
http/fiber/
postgres/
metrics/
core/
domain/
ports/
usecase/
adapters/
http/fiber/
postgres/
cmd/api/main.go
migrations/
Dockerfile
docker-compose.yml
docs/ (Swagger auto-generated)
Reasons for using Hexagonal Architecture:
- Domain rules are isolated from frameworks
- HTTP / DB adapters can be replaced independently
- Testability increases drastically
- Dependencies always point to the core (domain → ports → usecases)
- Reject empty required fields
- Reject future timestamps
- Dedupe key generation
- Duplicate handling via
ON CONFLICT DO NOTHING - Repository error propagation
- Metadata & tags validation
- Required parameter validation
- Time range validation
group_byandintervalvalidation- Repository error propagation
- Correct aggregation mapping
Swagger UI is automatically generated via swaggo/swag and served with fiber-swagger.
After starting the service via docker:
👉 http://localhost:8080/docs/index.html
Swagger includes:
- Full endpoint documentation (
/events,/events/bulk,/metrics) - Request & response models
- Error models (
ErrorResponse) - Example payloads
POST /events
Request:
{
"event_name": "product_view",
"channel": "web",
"campaign_id": "cmp_1",
"user_id": "user_123",
"timestamp": 1700000000,
"tags": ["electronics"],
"metadata": { "product_id": "p1" }
}Responses:
{ "status": "created" }{ "status": "duplicate" }POST /events/bulk
Request:
{
"events": [
{ "...": "..." },
{ "...": "..." }
]
}Response:
{
"created": 10,
"duplicates": 2
}GET /metrics?event_name=...&from=...&to=...&group_by=channel
Example response (current implementation):
{
"buckets": [
{
"key": "web",
"count": 1200,
"unique_users": 345
}
]
}Start the service:
docker compose up --buildRun migration:
docker compose exec postgres psql -U user -d eventdb -f /migrations/001_create_events_table.sqlService URL:
👉 http://localhost:8080
Swagger:
👉 http://localhost:8080/docs
Event Metrics Service, kullanıcı event’lerini toplayıp anlamlı metriklere dönüştürmek için tasarlanmış, yüksek performanslı ve ölçeklenebilir bir mikroservistir.
Sunulan özellikler:
- Tekil event oluşturma (
POST /events) - Toplu event yükleme (
POST /events/bulk) - Metrik sorgulama (
GET /metrics) - Idempotent event yazımı (duplicate engelleme)
- PostgreSQL üzerinde verimli saklama
- TDD yaklaşımı ile yüksek test coverage
- Swagger ile otomatik API dokümantasyonu (
/docs) - Docker Compose ile tamamen container üzerinde çalıştırma
Kullanılan teknolojiler:
Go (Fiber), PostgreSQL, Hexagonal Architecture, Docker, Swagger.
internal/
events/
core/
domain/
ports/
usecase/
adapters/
http/fiber/
postgres/
metrics/
core/
domain/
ports/
usecase/
adapters/
http/fiber/
postgres/
cmd/api/main.go
migrations/
Dockerfile
docker-compose.yml
docs/ (Swagger tarafından üretilir)
Hexagonal mimarinin avantajları:
- Domain tamamen bağımsızdır
- HTTP ve veritabanı adapter’leri değiştirilebilir
- Test yazımı kolay ve hızlıdır
- Bağımlılık yönü tek taraflıdır (core merkezde)
- Zorunlu alan doğrulaması
- Gelecek zaman reddi
- Idempotency için dedupe key üretimi
- Duplicate event kontrolü (
ON CONFLICT DO NOTHING) - Repository hatalarının doğru yönetimi
- Tags & metadata kontrolü
- Parametre doğrulaması
- Zaman aralığı doğrulaması
group_byveintervalkuralları- Repository hata kontrolü
- Aggregation mapping doğrulama
Swagger UI otomatik olarak oluşturulur.
Servis çalıştıktan sonra:
👉 http://localhost:8080/docs/index.html
Swagger içerisinde:
- Tüm endpointlerin açıklamaları
- Request/response modelleri
- Error modelleri (
ErrorResponse) - Örnek kullanım senaryoları
POST /events
Yanıtlar:
{ "status": "created" }{ "status": "duplicate" }POST /events/bulk
Yanıt:
{
"created": X,
"duplicates": Y
}GET /metrics?...
Örnek yanıt:
{
"buckets": [
{
"key": "web",
"count": 1200,
"unique_users": 345
}
]
}Servisi başlat:
docker compose up --buildMigration çalıştırma:
docker compose exec postgres psql -U user -d eventdb -f migrations/001_create_events_table.sql