This stack provides a production-ready API Gateway using KrakenD with observability via Prometheus and Grafana.
flowchart LR
Client([Client]) -->|:8080| KrakenD[KrakenD Gateway]
KrakenD --> Backend[Backend Services]
KrakenD -->|:9091 /metrics| Prometheus[Prometheus :9090]
Prometheus --> Grafana[Grafana :3000]
- KrakenD runs as a stateless API Gateway
- Routes requests to backend services
- Exposes metrics at
/metricson port9091 - Prometheus scrapes metrics from KrakenD
- Grafana visualizes collected metrics
KrakenD (8080)
|
|--> Metrics (/metrics:9091)
|
Prometheus (9090)
|
Grafana (3000)
- KrakenD API Gateway
- Prometheus Metrics Collector
- Grafana Dashboard
| Service | URL |
|---|---|
| KrakenD API | http://localhost:8080 |
| Metrics | http://localhost:9091/metrics |
| Prometheus | http://localhost:9090 |
| Grafana | http://localhost:3000 |
Metrics are exposed using OpenTelemetry Prometheus exporter:
"extra_config": {
"telemetry/logging": {
"level": "INFO",
"prefix": "[KRAKEND]",
"stdout": true
},
"telemetry/opentelemetry": {
"service_name": "krakend-gateway",
"exporters": {
"prometheus": [
{
"name": "local_prometheus",
"port": 9091,
"process_metrics": true,
"go_metrics": true
}
]
}
}
}global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["prometheus:9090"]
- job_name: "krakend"
static_configs:
- targets: ["krakend:9091"]version: "3.9"
services:
krakend:
image: devopsfaith/krakend:latest
container_name: krakend
restart: unless-stopped
ports:
- "8080:8080"
- "9091:9091"
volumes:
- ./data/krakend.json:/etc/krakend/krakend.json:ro
command: ["run", "-c", "/etc/krakend/krakend.json"]
networks:
- monitoring
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: always
ports:
- "9090:9090"
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus_data:/prometheus
command:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus"
networks:
- monitoring
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: always
ports:
- "3000:3000"
environment:
GF_SECURITY_ADMIN_USER: admin
GF_SECURITY_ADMIN_PASSWORD: admin
volumes:
- grafana_data:/var/lib/grafana
depends_on:
- prometheus
networks:
- monitoring
volumes:
prometheus_data:
grafana_data:
networks:
monitoring:
driver: bridgehttp://localhost:8080/github/user
http://localhost:9091/metrics
curl http://localhost:8080/github/usercurl http://localhost:9091/metricshttp://localhost:9090/targets
/metricsis exposed by KrakenD via OpenTelemetry Prometheus exporter- No need for json-exporter anymore
- Prometheus scrapes directly from KrakenD
- Ensure port
9091is exposed in Docker
- Add Alertmanager for alerting
- Add Loki for logs
- Add distributed tracing via OTEL Collector
- Add Kubernetes Helm deployment
✔ Direct Prometheus scraping from KrakenD ✔ No JSON exporter required ✔ OpenTelemetry-based metrics pipeline ✔ Simplified architecture