ginskill-init 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.wrangler/cache/pages.json +4 -0
- package/.wrangler/cache/wrangler-account.json +6 -0
- package/DEVELOPMENT.md +510 -0
- package/README.md +104 -0
- package/agents/developer.md +56 -0
- package/agents/frontend-design.md +69 -0
- package/agents/mobile-reviewer.md +36 -0
- package/agents/review-code.md +49 -0
- package/agents/security-scanner.md +50 -0
- package/agents/tester.md +72 -0
- package/bin/cli.js +461 -0
- package/landing/ai-build-ai.png +0 -0
- package/landing/index.html +1495 -0
- package/landing/logo.png +0 -0
- package/package.json +37 -0
- package/skills/active-life-dev/SKILL.md +157 -0
- package/skills/active-life-dev/docs/auth.md +187 -0
- package/skills/active-life-dev/docs/customers.md +216 -0
- package/skills/active-life-dev/docs/integrations.md +209 -0
- package/skills/active-life-dev/docs/inventory.md +192 -0
- package/skills/active-life-dev/docs/modules.md +181 -0
- package/skills/active-life-dev/docs/orders.md +180 -0
- package/skills/active-life-dev/docs/patterns.md +319 -0
- package/skills/active-life-dev/docs/products.md +216 -0
- package/skills/active-life-dev/docs/schema.md +502 -0
- package/skills/active-life-dev/docs/setup.md +169 -0
- package/skills/active-life-dev/docs/vouchers.md +144 -0
- package/skills/ai-asset-generator/SKILL.md +247 -0
- package/skills/ai-asset-generator/docs/gen-image.md +274 -0
- package/skills/ai-asset-generator/docs/genvideo.md +341 -0
- package/skills/ai-asset-generator/docs/remove-background.md +19 -0
- package/skills/ai-asset-generator/lib/bg-remove.mjs +34 -0
- package/skills/ai-asset-generator/lib/env.mjs +48 -0
- package/skills/ai-asset-generator/lib/kie-client.mjs +100 -0
- package/skills/ai-build-ai/SKILL.md +127 -0
- package/skills/ai-build-ai/docs/agent-teams.md +293 -0
- package/skills/ai-build-ai/docs/checkpointing.md +161 -0
- package/skills/ai-build-ai/docs/create-agent.md +399 -0
- package/skills/ai-build-ai/docs/create-mcp.md +395 -0
- package/skills/ai-build-ai/docs/create-skill.md +299 -0
- package/skills/ai-build-ai/docs/headless-mode.md +614 -0
- package/skills/ai-build-ai/docs/hooks.md +578 -0
- package/skills/ai-build-ai/docs/memory-claude-md.md +375 -0
- package/skills/ai-build-ai/docs/output-styles.md +208 -0
- package/skills/ai-build-ai/docs/overview.md +162 -0
- package/skills/ai-build-ai/docs/permissions.md +391 -0
- package/skills/ai-build-ai/docs/plugins.md +396 -0
- package/skills/ai-build-ai/docs/sandbox.md +262 -0
- package/skills/ai-build-ai/docs/team-lead-workflow.md +648 -0
- package/skills/ant-design/SKILL.md +323 -0
- package/skills/ant-design/docs/components.md +160 -0
- package/skills/ant-design/docs/data-entry.md +406 -0
- package/skills/ant-design/docs/display.md +594 -0
- package/skills/ant-design/docs/feedback.md +451 -0
- package/skills/ant-design/docs/key-components.md +414 -0
- package/skills/ant-design/docs/navigation.md +310 -0
- package/skills/ant-design/docs/pro-components.md +543 -0
- package/skills/ant-design/docs/setup.md +213 -0
- package/skills/ant-design/docs/theme.md +265 -0
- package/skills/flutter-performance/SKILL.md +803 -0
- package/skills/flutter-performance/references/flutter-patterns.md +595 -0
- package/skills/icon-generator/SKILL.md +270 -0
- package/skills/mobile-app-review/SKILL.md +321 -0
- package/skills/mobile-app-review/references/apple-review.md +132 -0
- package/skills/mobile-app-review/references/google-play-review.md +203 -0
- package/skills/mongodb/SKILL.md +667 -0
- package/skills/mongodb/references/mongoose-patterns.md +368 -0
- package/skills/nestjs-architecture/SKILL.md +1086 -0
- package/skills/nestjs-architecture/references/advanced-patterns.md +590 -0
- package/skills/performance/SKILL.md +509 -0
- package/skills/react-fsd-architecture/SKILL.md +693 -0
- package/skills/react-fsd-architecture/references/fsd-patterns.md +747 -0
- package/skills/react-native-expo/SKILL.md +128 -0
- package/skills/react-native-expo/references/data-layer.md +252 -0
- package/skills/react-native-expo/references/design-system.md +252 -0
- package/skills/react-native-expo/references/navigation.md +199 -0
- package/skills/react-native-expo/references/performance.md +229 -0
- package/skills/react-native-expo/references/platform-services.md +179 -0
- package/skills/react-native-expo/references/state-management.md +209 -0
- package/skills/react-native-expo/references/ui-patterns.md +301 -0
- package/skills/react-query/SKILL.md +685 -0
- package/skills/react-query/references/query-patterns.md +365 -0
- package/skills/review-code/SKILL.md +374 -0
- package/skills/review-code/references/clean-code-principles.md +395 -0
- package/skills/review-code/references/frontend-patterns.md +136 -0
- package/skills/review-code/references/nestjs-patterns.md +184 -0
- package/skills/security-scanner/SKILL.md +366 -0
- package/skills/security-scanner/references/nestjs-security.md +260 -0
- package/skills/security-scanner/references/nextjs-security.md +201 -0
- package/skills/security-scanner/references/react-native-security.md +199 -0
- package/skills/traefik/SKILL.md +105 -0
- package/skills/traefik/docs/advanced-routing.md +186 -0
- package/skills/traefik/docs/auth-providers.md +137 -0
- package/skills/traefik/docs/cicd-devops.md +396 -0
- package/skills/traefik/docs/core-config.md +171 -0
- package/skills/traefik/docs/distributed-config.md +96 -0
- package/skills/traefik/docs/docker-compose.md +182 -0
- package/skills/traefik/docs/ha-performance.md +177 -0
- package/skills/traefik/docs/kubernetes.md +278 -0
- package/skills/traefik/docs/middleware.md +205 -0
- package/skills/traefik/docs/monitoring.md +357 -0
- package/skills/traefik/docs/security.md +391 -0
- package/skills/traefik/docs/tls-acme.md +155 -0
- package/skills/ui-ux-pro-max/SKILL.md +377 -0
- package/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/ui-ux-pro-max/data/colors.csv +97 -0
- package/skills/ui-ux-pro-max/data/icons.csv +101 -0
- package/skills/ui-ux-pro-max/data/landing.csv +31 -0
- package/skills/ui-ux-pro-max/data/products.csv +97 -0
- package/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills/ui-ux-pro-max/data/styles.csv +68 -0
- package/skills/ui-ux-pro-max/data/typography.csv +58 -0
- package/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
# Traefik Middleware Reference
|
|
2
|
+
|
|
3
|
+
Middleware sits between routers and services. Applied in order listed on the router.
|
|
4
|
+
|
|
5
|
+
## HTTP Middlewares
|
|
6
|
+
|
|
7
|
+
### Headers
|
|
8
|
+
```yaml
|
|
9
|
+
http:
|
|
10
|
+
middlewares:
|
|
11
|
+
security-headers:
|
|
12
|
+
headers:
|
|
13
|
+
browserXssFilter: true
|
|
14
|
+
contentTypeNosniff: true
|
|
15
|
+
frameDeny: true
|
|
16
|
+
stsIncludeSubdomains: true
|
|
17
|
+
stsPreload: true
|
|
18
|
+
stsSeconds: 31536000
|
|
19
|
+
customFrameOptionsValue: "SAMEORIGIN"
|
|
20
|
+
referrerPolicy: "strict-origin-when-cross-origin"
|
|
21
|
+
permissionsPolicy: "camera=(), microphone=(), geolocation=()"
|
|
22
|
+
contentSecurityPolicy: "default-src 'self'"
|
|
23
|
+
customResponseHeaders:
|
|
24
|
+
X-Robots-Tag: "noindex,nofollow"
|
|
25
|
+
server: "" # Remove server header
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### RateLimit
|
|
29
|
+
```yaml
|
|
30
|
+
rate-limit:
|
|
31
|
+
rateLimit:
|
|
32
|
+
average: 100 # Requests per period
|
|
33
|
+
burst: 50 # Max bucket size
|
|
34
|
+
period: 1s # Time window
|
|
35
|
+
sourceCriterion:
|
|
36
|
+
ipStrategy:
|
|
37
|
+
depth: 1 # Extract IP from X-Forwarded-For (depth from right)
|
|
38
|
+
# OR: requestHeaderName: "X-API-Key"
|
|
39
|
+
# OR: requestHost: true
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### CircuitBreaker
|
|
43
|
+
```yaml
|
|
44
|
+
circuit-breaker:
|
|
45
|
+
circuitBreaker:
|
|
46
|
+
expression: "LatencyAtQuantileMS(50.0) > 100 || NetworkErrorRatio() > 0.30 || ResponseCodeRatio(500, 600, 0, 600) > 0.25"
|
|
47
|
+
checkPeriod: 10s
|
|
48
|
+
fallbackDuration: 30s
|
|
49
|
+
recoveryDuration: 60s
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Retry
|
|
53
|
+
```yaml
|
|
54
|
+
retry:
|
|
55
|
+
retry:
|
|
56
|
+
attempts: 3
|
|
57
|
+
initialInterval: 100ms
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Compress
|
|
61
|
+
```yaml
|
|
62
|
+
compress:
|
|
63
|
+
compress:
|
|
64
|
+
excludedContentTypes:
|
|
65
|
+
- text/event-stream
|
|
66
|
+
minResponseBodyBytes: 1024
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### BasicAuth
|
|
70
|
+
```yaml
|
|
71
|
+
basic-auth:
|
|
72
|
+
basicAuth:
|
|
73
|
+
users:
|
|
74
|
+
- "admin:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/" # htpasswd -nB admin
|
|
75
|
+
# OR: usersFile: /etc/traefik/.htpasswd
|
|
76
|
+
removeHeader: true # Don't forward auth header to backend
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### ForwardAuth
|
|
80
|
+
```yaml
|
|
81
|
+
forward-auth:
|
|
82
|
+
forwardAuth:
|
|
83
|
+
address: "http://auth-service:9091/api/authz/forward-auth"
|
|
84
|
+
trustForwardHeader: true
|
|
85
|
+
authResponseHeaders:
|
|
86
|
+
- Remote-User
|
|
87
|
+
- Remote-Groups
|
|
88
|
+
- Remote-Email
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### RedirectScheme
|
|
92
|
+
```yaml
|
|
93
|
+
redirect-https:
|
|
94
|
+
redirectScheme:
|
|
95
|
+
scheme: https
|
|
96
|
+
permanent: true
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### RedirectRegex
|
|
100
|
+
```yaml
|
|
101
|
+
redirect-www:
|
|
102
|
+
redirectRegex:
|
|
103
|
+
regex: "^https://www\\.(.+)"
|
|
104
|
+
replacement: "https://${1}"
|
|
105
|
+
permanent: true
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### StripPrefix
|
|
109
|
+
```yaml
|
|
110
|
+
strip-api:
|
|
111
|
+
stripPrefix:
|
|
112
|
+
prefixes:
|
|
113
|
+
- /api
|
|
114
|
+
forceSlash: false
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### AddPrefix
|
|
118
|
+
```yaml
|
|
119
|
+
add-prefix:
|
|
120
|
+
addPrefix:
|
|
121
|
+
prefix: /v2
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### IPAllowList
|
|
125
|
+
```yaml
|
|
126
|
+
ip-allowlist:
|
|
127
|
+
ipAllowList:
|
|
128
|
+
sourceRange:
|
|
129
|
+
- "10.0.0.0/8"
|
|
130
|
+
- "192.168.1.0/24"
|
|
131
|
+
ipStrategy:
|
|
132
|
+
depth: 1
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Chain (combine middlewares)
|
|
136
|
+
```yaml
|
|
137
|
+
secured:
|
|
138
|
+
chain:
|
|
139
|
+
middlewares:
|
|
140
|
+
- security-headers
|
|
141
|
+
- rate-limit
|
|
142
|
+
- compress
|
|
143
|
+
- forward-auth
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### InFlightReq
|
|
147
|
+
```yaml
|
|
148
|
+
inflight:
|
|
149
|
+
inFlightReq:
|
|
150
|
+
amount: 100
|
|
151
|
+
sourceCriterion:
|
|
152
|
+
ipStrategy:
|
|
153
|
+
depth: 1
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Buffering
|
|
157
|
+
```yaml
|
|
158
|
+
buffering:
|
|
159
|
+
buffering:
|
|
160
|
+
maxRequestBodyBytes: 10485760 # 10MB
|
|
161
|
+
maxResponseBodyBytes: 10485760
|
|
162
|
+
retryExpression: "IsNetworkError() && Attempts() < 2"
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### GrpcWeb
|
|
166
|
+
```yaml
|
|
167
|
+
grpc-web:
|
|
168
|
+
grpcWeb:
|
|
169
|
+
allowOrigins:
|
|
170
|
+
- "https://app.example.com"
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Docker Label Syntax
|
|
174
|
+
|
|
175
|
+
```yaml
|
|
176
|
+
labels:
|
|
177
|
+
- "traefik.http.middlewares.my-ratelimit.ratelimit.average=100"
|
|
178
|
+
- "traefik.http.middlewares.my-ratelimit.ratelimit.burst=50"
|
|
179
|
+
- "traefik.http.routers.myapp.middlewares=my-ratelimit,security-headers@file"
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Kubernetes CRD Syntax
|
|
183
|
+
|
|
184
|
+
```yaml
|
|
185
|
+
apiVersion: traefik.io/v1alpha1
|
|
186
|
+
kind: Middleware
|
|
187
|
+
metadata:
|
|
188
|
+
name: rate-limit
|
|
189
|
+
spec:
|
|
190
|
+
rateLimit:
|
|
191
|
+
average: 100
|
|
192
|
+
burst: 50
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## Middleware Order
|
|
196
|
+
|
|
197
|
+
Middleware executes in the order listed on the router. Recommended order:
|
|
198
|
+
1. IPAllowList / IPWhiteList
|
|
199
|
+
2. RateLimit / InFlightReq
|
|
200
|
+
3. ForwardAuth / BasicAuth
|
|
201
|
+
4. Headers (security)
|
|
202
|
+
5. StripPrefix / AddPrefix
|
|
203
|
+
6. Compress
|
|
204
|
+
7. CircuitBreaker
|
|
205
|
+
8. Retry
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
# Traefik Monitoring, Metrics & Observability
|
|
2
|
+
|
|
3
|
+
## Prometheus Metrics
|
|
4
|
+
|
|
5
|
+
### Static Config
|
|
6
|
+
```yaml
|
|
7
|
+
entryPoints:
|
|
8
|
+
metrics:
|
|
9
|
+
address: ":8082"
|
|
10
|
+
|
|
11
|
+
metrics:
|
|
12
|
+
prometheus:
|
|
13
|
+
entryPoint: metrics
|
|
14
|
+
addEntryPointsLabels: true
|
|
15
|
+
addServicesLabels: true
|
|
16
|
+
addRoutersLabels: true # Caution: high cardinality
|
|
17
|
+
buckets: [0.1, 0.3, 1.2, 5.0]
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### Key Metrics
|
|
21
|
+
|
|
22
|
+
| Metric | Description |
|
|
23
|
+
|--------|-------------|
|
|
24
|
+
| `traefik_entrypoint_requests_total` | Total requests by entrypoint, method, protocol, code |
|
|
25
|
+
| `traefik_entrypoint_open_connections` | Current open connections |
|
|
26
|
+
| `traefik_service_requests_total` | Requests per service |
|
|
27
|
+
| `traefik_service_request_duration_seconds` | Latency histogram per service |
|
|
28
|
+
| `traefik_service_open_connections` | Open connections per service |
|
|
29
|
+
| `traefik_tls_certs_not_after` | Certificate expiry timestamp |
|
|
30
|
+
| `traefik_config_reloads_total` | Config reload count |
|
|
31
|
+
| `traefik_config_last_reload_success` | Last reload success (0/1) |
|
|
32
|
+
|
|
33
|
+
### Prometheus Scrape Config
|
|
34
|
+
```yaml
|
|
35
|
+
scrape_configs:
|
|
36
|
+
- job_name: traefik
|
|
37
|
+
scrape_interval: 15s
|
|
38
|
+
static_configs:
|
|
39
|
+
- targets: ["traefik:8082"]
|
|
40
|
+
# OR in Kubernetes:
|
|
41
|
+
kubernetes_sd_configs:
|
|
42
|
+
- role: pod
|
|
43
|
+
relabel_configs:
|
|
44
|
+
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
|
|
45
|
+
action: keep
|
|
46
|
+
regex: true
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## OpenTelemetry Tracing
|
|
50
|
+
|
|
51
|
+
```yaml
|
|
52
|
+
tracing:
|
|
53
|
+
otlp:
|
|
54
|
+
http:
|
|
55
|
+
endpoint: http://otel-collector:4318/v1/traces
|
|
56
|
+
# OR grpc:
|
|
57
|
+
# endpoint: otel-collector:4317
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
With sampling:
|
|
61
|
+
```yaml
|
|
62
|
+
tracing:
|
|
63
|
+
sampleRate: 0.1 # Sample 10% of traces
|
|
64
|
+
otlp:
|
|
65
|
+
http:
|
|
66
|
+
endpoint: http://otel-collector:4318/v1/traces
|
|
67
|
+
headers:
|
|
68
|
+
Authorization: "Bearer token"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Access Logs
|
|
72
|
+
|
|
73
|
+
```yaml
|
|
74
|
+
accessLog:
|
|
75
|
+
filePath: /var/log/traefik/access.log
|
|
76
|
+
format: json
|
|
77
|
+
bufferingSize: 100 # Buffer N lines before writing
|
|
78
|
+
filters:
|
|
79
|
+
statusCodes: ["400-499", "500-599"]
|
|
80
|
+
retryAttempts: true
|
|
81
|
+
minDuration: 100ms
|
|
82
|
+
fields:
|
|
83
|
+
defaultMode: keep
|
|
84
|
+
names:
|
|
85
|
+
ClientUsername: drop
|
|
86
|
+
headers:
|
|
87
|
+
defaultMode: drop
|
|
88
|
+
names:
|
|
89
|
+
User-Agent: keep
|
|
90
|
+
Authorization: drop
|
|
91
|
+
Content-Type: keep
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### OTLP Log Export (experimental, v3.3+)
|
|
95
|
+
```yaml
|
|
96
|
+
accessLog:
|
|
97
|
+
otlp:
|
|
98
|
+
http:
|
|
99
|
+
endpoint: http://otel-collector:4318/v1/logs
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Application Logs
|
|
103
|
+
|
|
104
|
+
```yaml
|
|
105
|
+
log:
|
|
106
|
+
level: WARN # DEBUG, INFO, WARN, ERROR
|
|
107
|
+
filePath: /var/log/traefik/traefik.log
|
|
108
|
+
format: json # common or json
|
|
109
|
+
noColor: true
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Grafana Dashboard
|
|
113
|
+
|
|
114
|
+
Docker Compose with full monitoring stack:
|
|
115
|
+
|
|
116
|
+
```yaml
|
|
117
|
+
services:
|
|
118
|
+
prometheus:
|
|
119
|
+
image: prom/prometheus:latest
|
|
120
|
+
volumes:
|
|
121
|
+
- ./prometheus.yml:/etc/prometheus/prometheus.yml
|
|
122
|
+
- prometheus-data:/prometheus
|
|
123
|
+
networks: [monitoring]
|
|
124
|
+
|
|
125
|
+
grafana:
|
|
126
|
+
image: grafana/grafana:latest
|
|
127
|
+
volumes:
|
|
128
|
+
- grafana-data:/var/lib/grafana
|
|
129
|
+
environment:
|
|
130
|
+
- GF_SECURITY_ADMIN_PASSWORD=secret
|
|
131
|
+
networks: [monitoring, proxy]
|
|
132
|
+
labels:
|
|
133
|
+
- "traefik.enable=true"
|
|
134
|
+
- "traefik.http.routers.grafana.rule=Host(`grafana.example.com`)"
|
|
135
|
+
- "traefik.http.services.grafana.loadbalancer.server.port=3000"
|
|
136
|
+
|
|
137
|
+
loki:
|
|
138
|
+
image: grafana/loki:latest
|
|
139
|
+
volumes:
|
|
140
|
+
- loki-data:/loki
|
|
141
|
+
networks: [monitoring]
|
|
142
|
+
|
|
143
|
+
promtail:
|
|
144
|
+
image: grafana/promtail:latest
|
|
145
|
+
volumes:
|
|
146
|
+
- /var/log/traefik:/var/log/traefik:ro
|
|
147
|
+
- ./promtail.yml:/etc/promtail/config.yml
|
|
148
|
+
networks: [monitoring]
|
|
149
|
+
|
|
150
|
+
volumes:
|
|
151
|
+
prometheus-data:
|
|
152
|
+
grafana-data:
|
|
153
|
+
loki-data:
|
|
154
|
+
|
|
155
|
+
networks:
|
|
156
|
+
monitoring:
|
|
157
|
+
internal: true
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## Alerting Rules (Prometheus)
|
|
161
|
+
|
|
162
|
+
```yaml
|
|
163
|
+
groups:
|
|
164
|
+
- name: traefik
|
|
165
|
+
rules:
|
|
166
|
+
- alert: TraefikHighErrorRate
|
|
167
|
+
expr: |
|
|
168
|
+
sum(rate(traefik_service_requests_total{code=~"5.."}[5m]))
|
|
169
|
+
/ sum(rate(traefik_service_requests_total[5m])) > 0.05
|
|
170
|
+
for: 5m
|
|
171
|
+
labels:
|
|
172
|
+
severity: critical
|
|
173
|
+
annotations:
|
|
174
|
+
summary: "High 5xx error rate ({{ $value | humanizePercentage }})"
|
|
175
|
+
|
|
176
|
+
- alert: TraefikHighLatency
|
|
177
|
+
expr: |
|
|
178
|
+
histogram_quantile(0.95,
|
|
179
|
+
sum(rate(traefik_service_request_duration_seconds_bucket[5m])) by (le, service)
|
|
180
|
+
) > 2
|
|
181
|
+
for: 5m
|
|
182
|
+
labels:
|
|
183
|
+
severity: warning
|
|
184
|
+
annotations:
|
|
185
|
+
summary: "P95 latency > 2s for {{ $labels.service }}"
|
|
186
|
+
|
|
187
|
+
- alert: TraefikDown
|
|
188
|
+
expr: up{job="traefik"} == 0
|
|
189
|
+
for: 1m
|
|
190
|
+
labels:
|
|
191
|
+
severity: critical
|
|
192
|
+
|
|
193
|
+
- alert: TraefikCertExpiringSoon
|
|
194
|
+
expr: (traefik_tls_certs_not_after - time()) / 86400 < 14
|
|
195
|
+
for: 1h
|
|
196
|
+
labels:
|
|
197
|
+
severity: warning
|
|
198
|
+
annotations:
|
|
199
|
+
summary: "TLS cert expires in {{ $value | humanize }} days"
|
|
200
|
+
|
|
201
|
+
- alert: TraefikHighOpenConnections
|
|
202
|
+
expr: traefik_entrypoint_open_connections > 1000
|
|
203
|
+
for: 5m
|
|
204
|
+
labels:
|
|
205
|
+
severity: warning
|
|
206
|
+
|
|
207
|
+
- alert: TraefikConfigReloadFailure
|
|
208
|
+
expr: traefik_config_last_reload_success == 0
|
|
209
|
+
for: 5m
|
|
210
|
+
labels:
|
|
211
|
+
severity: warning
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## Health Check Endpoint
|
|
215
|
+
|
|
216
|
+
```yaml
|
|
217
|
+
# traefik.yml
|
|
218
|
+
ping:
|
|
219
|
+
entryPoint: web
|
|
220
|
+
# OR separate entrypoint:
|
|
221
|
+
# entryPoint: ping
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Check: `curl http://traefik:80/ping` returns `OK` with 200 status.
|
|
225
|
+
|
|
226
|
+
Use for Kubernetes liveness/readiness probes:
|
|
227
|
+
```yaml
|
|
228
|
+
livenessProbe:
|
|
229
|
+
httpGet:
|
|
230
|
+
path: /ping
|
|
231
|
+
port: 80
|
|
232
|
+
initialDelaySeconds: 10
|
|
233
|
+
periodSeconds: 10
|
|
234
|
+
readinessProbe:
|
|
235
|
+
httpGet:
|
|
236
|
+
path: /ping
|
|
237
|
+
port: 80
|
|
238
|
+
initialDelaySeconds: 5
|
|
239
|
+
periodSeconds: 5
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## Datadog Integration
|
|
243
|
+
|
|
244
|
+
```yaml
|
|
245
|
+
metrics:
|
|
246
|
+
datadog:
|
|
247
|
+
address: "datadog-agent:8125"
|
|
248
|
+
addEntryPointsLabels: true
|
|
249
|
+
addServicesLabels: true
|
|
250
|
+
prefix: traefik
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## StatsD / InfluxDB
|
|
254
|
+
|
|
255
|
+
```yaml
|
|
256
|
+
# StatsD
|
|
257
|
+
metrics:
|
|
258
|
+
statsD:
|
|
259
|
+
address: "statsd:8125"
|
|
260
|
+
addEntryPointsLabels: true
|
|
261
|
+
addServicesLabels: true
|
|
262
|
+
|
|
263
|
+
# InfluxDB v2
|
|
264
|
+
metrics:
|
|
265
|
+
influxDB2:
|
|
266
|
+
address: "http://influxdb:8086"
|
|
267
|
+
token: "your-token"
|
|
268
|
+
org: "your-org"
|
|
269
|
+
bucket: "traefik"
|
|
270
|
+
addEntryPointsLabels: true
|
|
271
|
+
addServicesLabels: true
|
|
272
|
+
pushInterval: 10s
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
## SLO/SLI Monitoring Patterns
|
|
276
|
+
|
|
277
|
+
Define Service Level Indicators and Objectives:
|
|
278
|
+
|
|
279
|
+
```yaml
|
|
280
|
+
# Prometheus recording rules for SLIs
|
|
281
|
+
groups:
|
|
282
|
+
- name: traefik-sli
|
|
283
|
+
rules:
|
|
284
|
+
# Availability SLI: % of non-5xx responses
|
|
285
|
+
- record: traefik:availability:ratio_rate5m
|
|
286
|
+
expr: |
|
|
287
|
+
1 - (
|
|
288
|
+
sum(rate(traefik_service_requests_total{code=~"5.."}[5m]))
|
|
289
|
+
/ sum(rate(traefik_service_requests_total[5m]))
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
# Latency SLI: % of requests under 500ms
|
|
293
|
+
- record: traefik:latency_under_500ms:ratio_rate5m
|
|
294
|
+
expr: |
|
|
295
|
+
sum(rate(traefik_service_request_duration_seconds_bucket{le="0.5"}[5m]))
|
|
296
|
+
/ sum(rate(traefik_service_request_duration_seconds_count[5m]))
|
|
297
|
+
|
|
298
|
+
- name: traefik-slo
|
|
299
|
+
rules:
|
|
300
|
+
# SLO burn rate alerts (multi-window)
|
|
301
|
+
- alert: TraefikAvailabilitySLOBreach
|
|
302
|
+
expr: traefik:availability:ratio_rate5m < 0.999
|
|
303
|
+
for: 10m
|
|
304
|
+
labels:
|
|
305
|
+
severity: critical
|
|
306
|
+
annotations:
|
|
307
|
+
summary: "Availability SLO breach: {{ $value | humanizePercentage }} (target 99.9%)"
|
|
308
|
+
|
|
309
|
+
- alert: TraefikLatencySLOBreach
|
|
310
|
+
expr: traefik:latency_under_500ms:ratio_rate5m < 0.95
|
|
311
|
+
for: 10m
|
|
312
|
+
labels:
|
|
313
|
+
severity: warning
|
|
314
|
+
annotations:
|
|
315
|
+
summary: "Latency SLO breach: {{ $value | humanizePercentage }} under 500ms (target 95%)"
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
## OpenTelemetry Collector Config
|
|
319
|
+
|
|
320
|
+
```yaml
|
|
321
|
+
# otel-collector-config.yaml
|
|
322
|
+
receivers:
|
|
323
|
+
otlp:
|
|
324
|
+
protocols:
|
|
325
|
+
http:
|
|
326
|
+
endpoint: 0.0.0.0:4318
|
|
327
|
+
grpc:
|
|
328
|
+
endpoint: 0.0.0.0:4317
|
|
329
|
+
|
|
330
|
+
processors:
|
|
331
|
+
batch:
|
|
332
|
+
timeout: 5s
|
|
333
|
+
send_batch_size: 1024
|
|
334
|
+
|
|
335
|
+
exporters:
|
|
336
|
+
prometheus:
|
|
337
|
+
endpoint: 0.0.0.0:8889
|
|
338
|
+
otlp/jaeger:
|
|
339
|
+
endpoint: jaeger:4317
|
|
340
|
+
tls:
|
|
341
|
+
insecure: true
|
|
342
|
+
|
|
343
|
+
service:
|
|
344
|
+
pipelines:
|
|
345
|
+
traces:
|
|
346
|
+
receivers: [otlp]
|
|
347
|
+
processors: [batch]
|
|
348
|
+
exporters: [otlp/jaeger]
|
|
349
|
+
metrics:
|
|
350
|
+
receivers: [otlp]
|
|
351
|
+
processors: [batch]
|
|
352
|
+
exporters: [prometheus]
|
|
353
|
+
logs:
|
|
354
|
+
receivers: [otlp]
|
|
355
|
+
processors: [batch]
|
|
356
|
+
exporters: [otlp/jaeger]
|
|
357
|
+
```
|