shaapi 0.1.0__py3-none-any.whl

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.
Files changed (141) hide show
  1. shaapi/__init__.py +3 -0
  2. shaapi/cli.py +97 -0
  3. shaapi/generator.py +114 -0
  4. shaapi/template/.dockerignore +37 -0
  5. shaapi/template/.env.template +59 -0
  6. shaapi/template/.gitattributes +12 -0
  7. shaapi/template/.gitignore +170 -0
  8. shaapi/template/.gitlab-ci.yml +89 -0
  9. shaapi/template/Dockerfile +59 -0
  10. shaapi/template/LICENSE +21 -0
  11. shaapi/template/README.md +206 -0
  12. shaapi/template/backend/.gitignore +164 -0
  13. shaapi/template/backend/__init__.py +0 -0
  14. shaapi/template/backend/alembic/README +1 -0
  15. shaapi/template/backend/alembic/env.py +102 -0
  16. shaapi/template/backend/alembic/script.py.mako +26 -0
  17. shaapi/template/backend/alembic/versions/2026_06_08_1024-64524c63b666_initial.py +143 -0
  18. shaapi/template/backend/alembic.ini +117 -0
  19. shaapi/template/backend/app/__init__.py +55 -0
  20. shaapi/template/backend/app/admin/__init__.py +1 -0
  21. shaapi/template/backend/app/admin/api/v1/__init__.py +0 -0
  22. shaapi/template/backend/app/admin/api/v1/auth.py +59 -0
  23. shaapi/template/backend/app/admin/api/v1/casbin.py +218 -0
  24. shaapi/template/backend/app/admin/api/v1/login_log.py +63 -0
  25. shaapi/template/backend/app/admin/api/v1/opera_log.py +61 -0
  26. shaapi/template/backend/app/admin/api/v1/role.py +108 -0
  27. shaapi/template/backend/app/admin/api/v1/user.py +47 -0
  28. shaapi/template/backend/app/admin/schema/casbin_rule.py +45 -0
  29. shaapi/template/backend/app/admin/schema/login_log.py +36 -0
  30. shaapi/template/backend/app/admin/schema/opera_log.py +43 -0
  31. shaapi/template/backend/app/admin/schema/role.py +36 -0
  32. shaapi/template/backend/app/admin/schema/sso.py +37 -0
  33. shaapi/template/backend/app/admin/schema/token.py +74 -0
  34. shaapi/template/backend/app/admin/schema/user.py +93 -0
  35. shaapi/template/backend/app/admin/service/auth_service.py +233 -0
  36. shaapi/template/backend/app/admin/service/casbin_service.py +135 -0
  37. shaapi/template/backend/app/admin/service/login_log_service.py +62 -0
  38. shaapi/template/backend/app/admin/service/opera_log_service.py +31 -0
  39. shaapi/template/backend/app/admin/service/role_service.py +79 -0
  40. shaapi/template/backend/app/admin/service/secure_token_service.py +60 -0
  41. shaapi/template/backend/app/admin/service/user_service.py +153 -0
  42. shaapi/template/backend/app/api.py +11 -0
  43. shaapi/template/backend/common/__init__.py +0 -0
  44. shaapi/template/backend/common/cloud_storage/__init__.py +11 -0
  45. shaapi/template/backend/common/cloud_storage/cloud_storage.py +180 -0
  46. shaapi/template/backend/common/dataclasses.py +52 -0
  47. shaapi/template/backend/common/email_conf/email.py +105 -0
  48. shaapi/template/backend/common/enums.py +144 -0
  49. shaapi/template/backend/common/exception/__init__.py +0 -0
  50. shaapi/template/backend/common/exception/errors.py +87 -0
  51. shaapi/template/backend/common/exception/exception_handler.py +280 -0
  52. shaapi/template/backend/common/log.py +123 -0
  53. shaapi/template/backend/common/model.py +68 -0
  54. shaapi/template/backend/common/pagination.py +83 -0
  55. shaapi/template/backend/common/response/__init__.py +0 -0
  56. shaapi/template/backend/common/response/response_code.py +158 -0
  57. shaapi/template/backend/common/response/response_schema.py +110 -0
  58. shaapi/template/backend/common/schema.py +144 -0
  59. shaapi/template/backend/common/security/jwt.py +203 -0
  60. shaapi/template/backend/common/security/rbac.py +98 -0
  61. shaapi/template/backend/common/security/sec_token.py +6 -0
  62. shaapi/template/backend/common/socketio/action.py +11 -0
  63. shaapi/template/backend/common/socketio/server.py +50 -0
  64. shaapi/template/backend/common/sso/base.py +69 -0
  65. shaapi/template/backend/common/sso/google.py +127 -0
  66. shaapi/template/backend/core/conf.py +208 -0
  67. shaapi/template/backend/core/path_conf.py +24 -0
  68. shaapi/template/backend/core/registrar.py +195 -0
  69. shaapi/template/backend/crud/__init__.py +1 -0
  70. shaapi/template/backend/crud/crud_base.py +35 -0
  71. shaapi/template/backend/crud/crud_casbin.py +46 -0
  72. shaapi/template/backend/crud/crud_login_log.py +58 -0
  73. shaapi/template/backend/crud/crud_opera_log.py +58 -0
  74. shaapi/template/backend/crud/crud_role.py +128 -0
  75. shaapi/template/backend/crud/crud_user.py +267 -0
  76. shaapi/template/backend/database/__init__.py +0 -0
  77. shaapi/template/backend/database/db_postgres.py +125 -0
  78. shaapi/template/backend/database/db_redis.py +62 -0
  79. shaapi/template/backend/entrypoint-api.sh +19 -0
  80. shaapi/template/backend/lang/en/app.py +18 -0
  81. shaapi/template/backend/lang/en/auth.py +10 -0
  82. shaapi/template/backend/lang/fr/app.py +18 -0
  83. shaapi/template/backend/lang/fr/auth.py +10 -0
  84. shaapi/template/backend/main.py +54 -0
  85. shaapi/template/backend/middleware/__init__.py +1 -0
  86. shaapi/template/backend/middleware/access_middleware.py +19 -0
  87. shaapi/template/backend/middleware/i18n_middleware.py +19 -0
  88. shaapi/template/backend/middleware/jwt_auth_middleware.py +73 -0
  89. shaapi/template/backend/middleware/opera_log_middleware.py +179 -0
  90. shaapi/template/backend/middleware/state_middleware.py +26 -0
  91. shaapi/template/backend/models/__init__.py +10 -0
  92. shaapi/template/backend/models/associations.py +20 -0
  93. shaapi/template/backend/models/casbin_rule.py +30 -0
  94. shaapi/template/backend/models/login_log.py +28 -0
  95. shaapi/template/backend/models/opera_log.py +36 -0
  96. shaapi/template/backend/models/role.py +27 -0
  97. shaapi/template/backend/models/user.py +30 -0
  98. shaapi/template/backend/seeder/json/admin.json +15 -0
  99. shaapi/template/backend/seeder/json/user.json +15 -0
  100. shaapi/template/backend/seeder/run.py +34 -0
  101. shaapi/template/backend/static/ip2region.xdb +0 -0
  102. shaapi/template/backend/templates/build/meet.html +169 -0
  103. shaapi/template/backend/templates/build/new_account.html +373 -0
  104. shaapi/template/backend/templates/build/reset-password.html +170 -0
  105. shaapi/template/backend/templates/build/test_email.html +25 -0
  106. shaapi/template/backend/templates/build/welcome-one-1.html +160 -0
  107. shaapi/template/backend/templates/build/welcome-one.html +178 -0
  108. shaapi/template/backend/templates/build/welcome-two.html +234 -0
  109. shaapi/template/backend/templates/index.html +0 -0
  110. shaapi/template/backend/templates/src/new_account.mjml +15 -0
  111. shaapi/template/backend/templates/src/reset_password.mjml +19 -0
  112. shaapi/template/backend/templates/src/test_email.mjml +11 -0
  113. shaapi/template/backend/templates/ws/ws.html +70 -0
  114. shaapi/template/backend/utils/demo_site.py +18 -0
  115. shaapi/template/backend/utils/encrypt.py +108 -0
  116. shaapi/template/backend/utils/health_check.py +34 -0
  117. shaapi/template/backend/utils/prometheus.py +135 -0
  118. shaapi/template/backend/utils/request_parse.py +110 -0
  119. shaapi/template/backend/utils/serializers.py +75 -0
  120. shaapi/template/backend/utils/timezone.py +51 -0
  121. shaapi/template/backend/utils/trace_id.py +7 -0
  122. shaapi/template/backend/utils/translator.py +28 -0
  123. shaapi/template/devops/scripts/deploy.sh +7 -0
  124. shaapi/template/devops/scripts/setup_env.sh +62 -0
  125. shaapi/template/docker-compose.monitoring.yml +63 -0
  126. shaapi/template/docker-compose.override.yml +12 -0
  127. shaapi/template/docker-compose.yml +90 -0
  128. shaapi/template/docker-run.sh +99 -0
  129. shaapi/template/etc/dashboards/fastapi-observability.json +1044 -0
  130. shaapi/template/etc/dashboards.yaml +10 -0
  131. shaapi/template/etc/grafana/datasource.yml +79 -0
  132. shaapi/template/etc/prometheus/prometheus.yml +52 -0
  133. shaapi/template/package-lock.json +2102 -0
  134. shaapi/template/package.json +16 -0
  135. shaapi/template/pyproject.toml +78 -0
  136. shaapi/template/uv.lock +2866 -0
  137. shaapi-0.1.0.dist-info/METADATA +92 -0
  138. shaapi-0.1.0.dist-info/RECORD +141 -0
  139. shaapi-0.1.0.dist-info/WHEEL +4 -0
  140. shaapi-0.1.0.dist-info/entry_points.txt +2 -0
  141. shaapi-0.1.0.dist-info/licenses/LICENCE +21 -0
@@ -0,0 +1,1044 @@
1
+ {
2
+ "annotations": {
3
+ "list": [
4
+ {
5
+ "builtIn": 1,
6
+ "datasource": {
7
+ "type": "datasource",
8
+ "uid": "grafana"
9
+ },
10
+ "enable": true,
11
+ "hide": true,
12
+ "iconColor": "rgba(0, 211, 255, 1)",
13
+ "name": "Annotations & Alerts",
14
+ "target": {
15
+ "limit": 100,
16
+ "matchAny": false,
17
+ "tags": [],
18
+ "type": "dashboard"
19
+ },
20
+ "type": "dashboard"
21
+ }
22
+ ]
23
+ },
24
+ "editable": true,
25
+ "fiscalYearStartMonth": 0,
26
+ "graphTooltip": 0,
27
+ "links": [],
28
+ "liveNow": false,
29
+ "panels": [
30
+ {
31
+ "datasource": {
32
+ "type": "prometheus",
33
+ "uid": "prometheus"
34
+ },
35
+ "fieldConfig": {
36
+ "defaults": {
37
+ "mappings": [],
38
+ "thresholds": {
39
+ "mode": "absolute",
40
+ "steps": [
41
+ {
42
+ "color": "green",
43
+ "value": null
44
+ }
45
+ ]
46
+ },
47
+ "unit": "short"
48
+ },
49
+ "overrides": []
50
+ },
51
+ "gridPos": {
52
+ "h": 6,
53
+ "w": 4,
54
+ "x": 0,
55
+ "y": 0
56
+ },
57
+ "id": 4,
58
+ "options": {
59
+ "colorMode": "value",
60
+ "graphMode": "area",
61
+ "justifyMode": "auto",
62
+ "orientation": "auto",
63
+ "reduceOptions": {
64
+ "calcs": [
65
+ "lastNotNull"
66
+ ],
67
+ "fields": "",
68
+ "values": false
69
+ },
70
+ "textMode": "auto"
71
+ },
72
+ "pluginVersion": "10.1.0",
73
+ "targets": [
74
+ {
75
+ "datasource": {
76
+ "type": "prometheus",
77
+ "uid": "prometheus"
78
+ },
79
+ "editorMode": "code",
80
+ "exemplar": true,
81
+ "expr": "sum(fastapi_requests_total{app_name=\"$app_name\", path!=\"/metrics\"})",
82
+ "instant": true,
83
+ "interval": "",
84
+ "legendFormat": "",
85
+ "range": true,
86
+ "refId": "A"
87
+ }
88
+ ],
89
+ "timeFrom": "24h",
90
+ "title": "Total Requests",
91
+ "transformations": [
92
+ {
93
+ "id": "seriesToRows",
94
+ "options": {}
95
+ },
96
+ {
97
+ "id": "sortBy",
98
+ "options": {
99
+ "fields": {},
100
+ "sort": [
101
+ {
102
+ "field": "Time"
103
+ }
104
+ ]
105
+ }
106
+ }
107
+ ],
108
+ "type": "stat"
109
+ },
110
+ {
111
+ "datasource": {
112
+ "type": "prometheus",
113
+ "uid": "prometheus"
114
+ },
115
+ "fieldConfig": {
116
+ "defaults": {
117
+ "mappings": [],
118
+ "thresholds": {
119
+ "mode": "absolute",
120
+ "steps": [
121
+ {
122
+ "color": "green",
123
+ "value": null
124
+ }
125
+ ]
126
+ },
127
+ "unit": "short"
128
+ },
129
+ "overrides": []
130
+ },
131
+ "gridPos": {
132
+ "h": 6,
133
+ "w": 8,
134
+ "x": 4,
135
+ "y": 0
136
+ },
137
+ "id": 16,
138
+ "options": {
139
+ "colorMode": "value",
140
+ "graphMode": "area",
141
+ "justifyMode": "auto",
142
+ "orientation": "auto",
143
+ "reduceOptions": {
144
+ "calcs": [
145
+ "lastNotNull"
146
+ ],
147
+ "fields": "",
148
+ "values": false
149
+ },
150
+ "textMode": "value_and_name"
151
+ },
152
+ "pluginVersion": "10.1.0",
153
+ "targets": [
154
+ {
155
+ "datasource": {
156
+ "type": "prometheus",
157
+ "uid": "prometheus"
158
+ },
159
+ "editorMode": "code",
160
+ "exemplar": true,
161
+ "expr": "fastapi_requests_total{app_name=\"$app_name\", path!=\"/metrics\"}",
162
+ "instant": true,
163
+ "interval": "",
164
+ "legendFormat": "{{method}} {{path}}",
165
+ "range": true,
166
+ "refId": "A"
167
+ }
168
+ ],
169
+ "timeFrom": "24h",
170
+ "title": "Requests Count",
171
+ "transformations": [
172
+ {
173
+ "id": "seriesToRows",
174
+ "options": {}
175
+ },
176
+ {
177
+ "id": "sortBy",
178
+ "options": {
179
+ "fields": {},
180
+ "sort": [
181
+ {
182
+ "field": "Time"
183
+ }
184
+ ]
185
+ }
186
+ },
187
+ {
188
+ "id": "partitionByValues",
189
+ "options": {
190
+ "fields": [
191
+ "Metric"
192
+ ]
193
+ }
194
+ }
195
+ ],
196
+ "type": "stat"
197
+ },
198
+ {
199
+ "datasource": {
200
+ "type": "prometheus",
201
+ "uid": "prometheus"
202
+ },
203
+ "fieldConfig": {
204
+ "defaults": {
205
+ "color": {
206
+ "mode": "continuous-GrYlRd"
207
+ },
208
+ "mappings": [],
209
+ "thresholds": {
210
+ "mode": "absolute",
211
+ "steps": [
212
+ {
213
+ "color": "green",
214
+ "value": null
215
+ },
216
+ {
217
+ "color": "red",
218
+ "value": 80
219
+ }
220
+ ]
221
+ },
222
+ "unit": "s"
223
+ },
224
+ "overrides": []
225
+ },
226
+ "gridPos": {
227
+ "h": 6,
228
+ "w": 12,
229
+ "x": 12,
230
+ "y": 0
231
+ },
232
+ "id": 6,
233
+ "options": {
234
+ "displayMode": "lcd",
235
+ "minVizHeight": 10,
236
+ "minVizWidth": 0,
237
+ "orientation": "horizontal",
238
+ "reduceOptions": {
239
+ "calcs": [
240
+ "lastNotNull"
241
+ ],
242
+ "fields": "",
243
+ "values": false
244
+ },
245
+ "showUnfilled": true,
246
+ "valueMode": "color"
247
+ },
248
+ "pluginVersion": "10.1.0",
249
+ "targets": [
250
+ {
251
+ "datasource": {
252
+ "type": "prometheus",
253
+ "uid": "prometheus"
254
+ },
255
+ "exemplar": true,
256
+ "expr": "fastapi_requests_duration_seconds_sum{app_name=\"$app_name\"} / fastapi_requests_duration_seconds_count{app_name=\"$app_name\"}",
257
+ "interval": "",
258
+ "legendFormat": "{{method}} {{path}}",
259
+ "refId": "A"
260
+ }
261
+ ],
262
+ "title": "Requests Average Duration",
263
+ "type": "bargauge"
264
+ },
265
+ {
266
+ "datasource": {
267
+ "type": "prometheus",
268
+ "uid": "prometheus"
269
+ },
270
+ "fieldConfig": {
271
+ "defaults": {
272
+ "color": {
273
+ "mode": "thresholds"
274
+ },
275
+ "mappings": [],
276
+ "thresholds": {
277
+ "mode": "absolute",
278
+ "steps": [
279
+ {
280
+ "color": "green",
281
+ "value": null
282
+ },
283
+ {
284
+ "color": "red",
285
+ "value": 80
286
+ }
287
+ ]
288
+ }
289
+ },
290
+ "overrides": []
291
+ },
292
+ "gridPos": {
293
+ "h": 7,
294
+ "w": 4,
295
+ "x": 0,
296
+ "y": 6
297
+ },
298
+ "id": 22,
299
+ "options": {
300
+ "colorMode": "value",
301
+ "graphMode": "area",
302
+ "justifyMode": "auto",
303
+ "orientation": "auto",
304
+ "reduceOptions": {
305
+ "calcs": [
306
+ "lastNotNull"
307
+ ],
308
+ "fields": "",
309
+ "values": false
310
+ },
311
+ "textMode": "auto"
312
+ },
313
+ "pluginVersion": "10.1.0",
314
+ "targets": [
315
+ {
316
+ "datasource": {
317
+ "type": "prometheus",
318
+ "uid": "prometheus"
319
+ },
320
+ "exemplar": true,
321
+ "expr": "fastapi_exceptions_total{app_name=\"$app_name\"}",
322
+ "interval": "",
323
+ "legendFormat": "",
324
+ "refId": "A"
325
+ }
326
+ ],
327
+ "timeFrom": "24h",
328
+ "title": "Total Exceptions",
329
+ "type": "stat"
330
+ },
331
+ {
332
+ "datasource": {
333
+ "type": "prometheus",
334
+ "uid": "prometheus"
335
+ },
336
+ "fieldConfig": {
337
+ "defaults": {
338
+ "color": {
339
+ "mode": "palette-classic"
340
+ },
341
+ "custom": {
342
+ "axisCenteredZero": false,
343
+ "axisColorMode": "text",
344
+ "axisLabel": "",
345
+ "axisPlacement": "auto",
346
+ "axisSoftMax": 1,
347
+ "barAlignment": 0,
348
+ "drawStyle": "line",
349
+ "fillOpacity": 0,
350
+ "gradientMode": "none",
351
+ "hideFrom": {
352
+ "legend": false,
353
+ "tooltip": false,
354
+ "viz": false
355
+ },
356
+ "insertNulls": false,
357
+ "lineInterpolation": "linear",
358
+ "lineWidth": 1,
359
+ "pointSize": 5,
360
+ "scaleDistribution": {
361
+ "type": "linear"
362
+ },
363
+ "showPoints": "auto",
364
+ "spanNulls": false,
365
+ "stacking": {
366
+ "group": "A",
367
+ "mode": "none"
368
+ },
369
+ "thresholdsStyle": {
370
+ "mode": "area"
371
+ }
372
+ },
373
+ "mappings": [],
374
+ "thresholds": {
375
+ "mode": "absolute",
376
+ "steps": [
377
+ {
378
+ "color": "red",
379
+ "value": null
380
+ },
381
+ {
382
+ "color": "green",
383
+ "value": 0.8
384
+ }
385
+ ]
386
+ },
387
+ "unit": "percentunit"
388
+ },
389
+ "overrides": []
390
+ },
391
+ "gridPos": {
392
+ "h": 7,
393
+ "w": 10,
394
+ "x": 4,
395
+ "y": 6
396
+ },
397
+ "id": 18,
398
+ "options": {
399
+ "legend": {
400
+ "calcs": [],
401
+ "displayMode": "list",
402
+ "placement": "bottom",
403
+ "showLegend": true
404
+ },
405
+ "tooltip": {
406
+ "mode": "single",
407
+ "sort": "none"
408
+ }
409
+ },
410
+ "targets": [
411
+ {
412
+ "datasource": {
413
+ "type": "prometheus",
414
+ "uid": "prometheus"
415
+ },
416
+ "exemplar": true,
417
+ "expr": "sum by(path) (fastapi_responses_total{app_name=\"$app_name\", status_code=~\"2.*\", path!=\"/metrics\"}) / sum by(path) (fastapi_responses_total{app_name=\"$app_name\", path!=\"/metrics\"})",
418
+ "interval": "",
419
+ "legendFormat": "{{path}}",
420
+ "refId": "A"
421
+ }
422
+ ],
423
+ "title": "Percent of 2xx Requests",
424
+ "type": "timeseries"
425
+ },
426
+ {
427
+ "datasource": {
428
+ "type": "prometheus",
429
+ "uid": "prometheus"
430
+ },
431
+ "fieldConfig": {
432
+ "defaults": {
433
+ "color": {
434
+ "mode": "palette-classic"
435
+ },
436
+ "custom": {
437
+ "axisCenteredZero": false,
438
+ "axisColorMode": "text",
439
+ "axisLabel": "",
440
+ "axisPlacement": "auto",
441
+ "axisSoftMax": 1,
442
+ "barAlignment": 0,
443
+ "drawStyle": "line",
444
+ "fillOpacity": 0,
445
+ "gradientMode": "none",
446
+ "hideFrom": {
447
+ "legend": false,
448
+ "tooltip": false,
449
+ "viz": false
450
+ },
451
+ "insertNulls": false,
452
+ "lineInterpolation": "linear",
453
+ "lineWidth": 1,
454
+ "pointSize": 5,
455
+ "scaleDistribution": {
456
+ "type": "linear"
457
+ },
458
+ "showPoints": "auto",
459
+ "spanNulls": false,
460
+ "stacking": {
461
+ "group": "A",
462
+ "mode": "none"
463
+ },
464
+ "thresholdsStyle": {
465
+ "mode": "area"
466
+ }
467
+ },
468
+ "mappings": [],
469
+ "thresholds": {
470
+ "mode": "absolute",
471
+ "steps": [
472
+ {
473
+ "color": "green",
474
+ "value": null
475
+ },
476
+ {
477
+ "color": "red",
478
+ "value": 0.1
479
+ }
480
+ ]
481
+ },
482
+ "unit": "percentunit"
483
+ },
484
+ "overrides": []
485
+ },
486
+ "gridPos": {
487
+ "h": 7,
488
+ "w": 10,
489
+ "x": 14,
490
+ "y": 6
491
+ },
492
+ "id": 20,
493
+ "options": {
494
+ "legend": {
495
+ "calcs": [],
496
+ "displayMode": "list",
497
+ "placement": "bottom",
498
+ "showLegend": true
499
+ },
500
+ "tooltip": {
501
+ "mode": "single",
502
+ "sort": "none"
503
+ }
504
+ },
505
+ "targets": [
506
+ {
507
+ "datasource": {
508
+ "type": "prometheus",
509
+ "uid": "prometheus"
510
+ },
511
+ "exemplar": true,
512
+ "expr": "sum by(path) (fastapi_responses_total{app_name=\"$app_name\", status_code=~\"5.*\", path!=\"/metrics\"}) / sum by(path) (fastapi_responses_total{app_name=\"$app_name\", path!=\"/metrics\"})",
513
+ "interval": "",
514
+ "legendFormat": "{{path}}",
515
+ "refId": "A"
516
+ }
517
+ ],
518
+ "title": "Percent of 5xx Requests",
519
+ "type": "timeseries"
520
+ },
521
+ {
522
+ "datasource": {
523
+ "type": "prometheus",
524
+ "uid": "prometheus"
525
+ },
526
+ "fieldConfig": {
527
+ "defaults": {
528
+ "color": {
529
+ "mode": "palette-classic"
530
+ },
531
+ "custom": {
532
+ "axisCenteredZero": false,
533
+ "axisColorMode": "text",
534
+ "axisLabel": "",
535
+ "axisPlacement": "auto",
536
+ "barAlignment": 0,
537
+ "drawStyle": "line",
538
+ "fillOpacity": 0,
539
+ "gradientMode": "none",
540
+ "hideFrom": {
541
+ "legend": false,
542
+ "tooltip": false,
543
+ "viz": false
544
+ },
545
+ "insertNulls": false,
546
+ "lineInterpolation": "linear",
547
+ "lineWidth": 1,
548
+ "pointSize": 5,
549
+ "scaleDistribution": {
550
+ "type": "linear"
551
+ },
552
+ "showPoints": "auto",
553
+ "spanNulls": false,
554
+ "stacking": {
555
+ "group": "A",
556
+ "mode": "none"
557
+ },
558
+ "thresholdsStyle": {
559
+ "mode": "off"
560
+ }
561
+ },
562
+ "mappings": [],
563
+ "thresholds": {
564
+ "mode": "absolute",
565
+ "steps": [
566
+ {
567
+ "color": "green",
568
+ "value": null
569
+ },
570
+ {
571
+ "color": "red",
572
+ "value": 80
573
+ }
574
+ ]
575
+ },
576
+ "unit": "s"
577
+ },
578
+ "overrides": []
579
+ },
580
+ "gridPos": {
581
+ "h": 8,
582
+ "w": 8,
583
+ "x": 0,
584
+ "y": 13
585
+ },
586
+ "id": 8,
587
+ "options": {
588
+ "legend": {
589
+ "calcs": [],
590
+ "displayMode": "list",
591
+ "placement": "bottom",
592
+ "showLegend": true
593
+ },
594
+ "tooltip": {
595
+ "mode": "single",
596
+ "sort": "none"
597
+ }
598
+ },
599
+ "targets": [
600
+ {
601
+ "datasource": {
602
+ "type": "prometheus",
603
+ "uid": "prometheus"
604
+ },
605
+ "exemplar": true,
606
+ "expr": "histogram_quantile(.99,sum(rate(fastapi_requests_duration_seconds_bucket{app_name=\"$app_name\", path!=\"/metrics\"}[1m])) by(path, le))",
607
+ "interval": "",
608
+ "legendFormat": "{{path}}",
609
+ "refId": "A"
610
+ }
611
+ ],
612
+ "title": "PR 99 Requests Duration",
613
+ "type": "timeseries"
614
+ },
615
+ {
616
+ "datasource": {
617
+ "type": "prometheus",
618
+ "uid": "prometheus"
619
+ },
620
+ "fieldConfig": {
621
+ "defaults": {
622
+ "color": {
623
+ "mode": "palette-classic"
624
+ },
625
+ "custom": {
626
+ "axisCenteredZero": false,
627
+ "axisColorMode": "text",
628
+ "axisLabel": "",
629
+ "axisPlacement": "auto",
630
+ "barAlignment": 0,
631
+ "drawStyle": "line",
632
+ "fillOpacity": 0,
633
+ "gradientMode": "none",
634
+ "hideFrom": {
635
+ "legend": false,
636
+ "tooltip": false,
637
+ "viz": false
638
+ },
639
+ "insertNulls": false,
640
+ "lineInterpolation": "linear",
641
+ "lineWidth": 1,
642
+ "pointSize": 5,
643
+ "scaleDistribution": {
644
+ "type": "linear"
645
+ },
646
+ "showPoints": "auto",
647
+ "spanNulls": false,
648
+ "stacking": {
649
+ "group": "A",
650
+ "mode": "none"
651
+ },
652
+ "thresholdsStyle": {
653
+ "mode": "off"
654
+ }
655
+ },
656
+ "mappings": [],
657
+ "thresholds": {
658
+ "mode": "absolute",
659
+ "steps": [
660
+ {
661
+ "color": "green",
662
+ "value": null
663
+ },
664
+ {
665
+ "color": "red",
666
+ "value": 80
667
+ }
668
+ ]
669
+ }
670
+ },
671
+ "overrides": []
672
+ },
673
+ "gridPos": {
674
+ "h": 8,
675
+ "w": 8,
676
+ "x": 8,
677
+ "y": 13
678
+ },
679
+ "id": 10,
680
+ "options": {
681
+ "legend": {
682
+ "calcs": [],
683
+ "displayMode": "list",
684
+ "placement": "bottom",
685
+ "showLegend": true
686
+ },
687
+ "tooltip": {
688
+ "mode": "single",
689
+ "sort": "none"
690
+ }
691
+ },
692
+ "targets": [
693
+ {
694
+ "datasource": {
695
+ "type": "prometheus",
696
+ "uid": "prometheus"
697
+ },
698
+ "exemplar": true,
699
+ "expr": "fastapi_requests_in_progress{app_name=\"$app_name\", path!=\"/metrics\"}",
700
+ "interval": "",
701
+ "legendFormat": "{{path}}",
702
+ "refId": "A"
703
+ }
704
+ ],
705
+ "title": "Request In Process",
706
+ "type": "timeseries"
707
+ },
708
+ {
709
+ "datasource": {
710
+ "type": "prometheus",
711
+ "uid": "prometheus"
712
+ },
713
+ "fieldConfig": {
714
+ "defaults": {
715
+ "color": {
716
+ "mode": "palette-classic"
717
+ },
718
+ "custom": {
719
+ "axisCenteredZero": false,
720
+ "axisColorMode": "text",
721
+ "axisLabel": "",
722
+ "axisPlacement": "auto",
723
+ "barAlignment": 0,
724
+ "drawStyle": "line",
725
+ "fillOpacity": 0,
726
+ "gradientMode": "none",
727
+ "hideFrom": {
728
+ "legend": false,
729
+ "tooltip": false,
730
+ "viz": false
731
+ },
732
+ "insertNulls": false,
733
+ "lineInterpolation": "linear",
734
+ "lineWidth": 1,
735
+ "pointSize": 5,
736
+ "scaleDistribution": {
737
+ "type": "linear"
738
+ },
739
+ "showPoints": "auto",
740
+ "spanNulls": false,
741
+ "stacking": {
742
+ "group": "A",
743
+ "mode": "none"
744
+ },
745
+ "thresholdsStyle": {
746
+ "mode": "off"
747
+ }
748
+ },
749
+ "mappings": [],
750
+ "thresholds": {
751
+ "mode": "absolute",
752
+ "steps": [
753
+ {
754
+ "color": "green",
755
+ "value": null
756
+ },
757
+ {
758
+ "color": "red",
759
+ "value": 80
760
+ }
761
+ ]
762
+ },
763
+ "unit": "reqps"
764
+ },
765
+ "overrides": []
766
+ },
767
+ "gridPos": {
768
+ "h": 8,
769
+ "w": 8,
770
+ "x": 16,
771
+ "y": 13
772
+ },
773
+ "id": 12,
774
+ "options": {
775
+ "legend": {
776
+ "calcs": [],
777
+ "displayMode": "list",
778
+ "placement": "bottom",
779
+ "showLegend": true
780
+ },
781
+ "tooltip": {
782
+ "mode": "single",
783
+ "sort": "none"
784
+ }
785
+ },
786
+ "targets": [
787
+ {
788
+ "datasource": {
789
+ "type": "prometheus",
790
+ "uid": "prometheus"
791
+ },
792
+ "exemplar": true,
793
+ "expr": "rate(fastapi_requests_total{app_name=\"$app_name\"}[1m])",
794
+ "interval": "",
795
+ "legendFormat": "{{path}}",
796
+ "refId": "A"
797
+ }
798
+ ],
799
+ "title": "Request Per Sec",
800
+ "type": "timeseries"
801
+ },
802
+ {
803
+ "datasource": {
804
+ "type": "loki",
805
+ "uid": "loki"
806
+ },
807
+ "fieldConfig": {
808
+ "defaults": {
809
+ "color": {
810
+ "mode": "palette-classic"
811
+ },
812
+ "custom": {
813
+ "axisCenteredZero": false,
814
+ "axisColorMode": "text",
815
+ "axisLabel": "",
816
+ "axisPlacement": "auto",
817
+ "barAlignment": 0,
818
+ "drawStyle": "bars",
819
+ "fillOpacity": 0,
820
+ "gradientMode": "none",
821
+ "hideFrom": {
822
+ "legend": false,
823
+ "tooltip": false,
824
+ "viz": false
825
+ },
826
+ "insertNulls": false,
827
+ "lineInterpolation": "linear",
828
+ "lineWidth": 1,
829
+ "pointSize": 5,
830
+ "scaleDistribution": {
831
+ "type": "linear"
832
+ },
833
+ "showPoints": "auto",
834
+ "spanNulls": false,
835
+ "stacking": {
836
+ "group": "A",
837
+ "mode": "normal"
838
+ },
839
+ "thresholdsStyle": {
840
+ "mode": "off"
841
+ }
842
+ },
843
+ "mappings": [],
844
+ "thresholds": {
845
+ "mode": "absolute",
846
+ "steps": [
847
+ {
848
+ "color": "green",
849
+ "value": null
850
+ },
851
+ {
852
+ "color": "red",
853
+ "value": 80
854
+ }
855
+ ]
856
+ }
857
+ },
858
+ "overrides": [
859
+ {
860
+ "matcher": {
861
+ "id": "byName",
862
+ "options": "ERROR"
863
+ },
864
+ "properties": [
865
+ {
866
+ "id": "color",
867
+ "value": {
868
+ "fixedColor": "red",
869
+ "mode": "fixed"
870
+ }
871
+ }
872
+ ]
873
+ },
874
+ {
875
+ "matcher": {
876
+ "id": "byName",
877
+ "options": "INFO"
878
+ },
879
+ "properties": [
880
+ {
881
+ "id": "color",
882
+ "value": {
883
+ "fixedColor": "green",
884
+ "mode": "fixed"
885
+ }
886
+ }
887
+ ]
888
+ },
889
+ {
890
+ "matcher": {
891
+ "id": "byName",
892
+ "options": "CRITICAL"
893
+ },
894
+ "properties": [
895
+ {
896
+ "id": "color",
897
+ "value": {
898
+ "fixedColor": "purple",
899
+ "mode": "fixed"
900
+ }
901
+ }
902
+ ]
903
+ }
904
+ ]
905
+ },
906
+ "gridPos": {
907
+ "h": 9,
908
+ "w": 6,
909
+ "x": 0,
910
+ "y": 21
911
+ },
912
+ "id": 14,
913
+ "options": {
914
+ "legend": {
915
+ "calcs": [],
916
+ "displayMode": "list",
917
+ "placement": "bottom",
918
+ "showLegend": true
919
+ },
920
+ "tooltip": {
921
+ "mode": "single",
922
+ "sort": "none"
923
+ }
924
+ },
925
+ "pluginVersion": "8.4.3",
926
+ "targets": [
927
+ {
928
+ "datasource": {
929
+ "type": "loki",
930
+ "uid": "loki"
931
+ },
932
+ "expr": "sum by(type) (rate({compose_service=~\"app-.*\"} | pattern `<date> <time> <type> <logger> <code> [<_>=<trace_id> <_>=<span_id> <_>=<service_name>] - <msg>` | type != \"\" |= \"$log_keyword\" [1m]))",
933
+ "legendFormat": "{{type}}",
934
+ "refId": "A"
935
+ }
936
+ ],
937
+ "title": "Log Type Rate",
938
+ "type": "timeseries"
939
+ },
940
+ {
941
+ "datasource": {
942
+ "type": "loki",
943
+ "uid": "loki"
944
+ },
945
+ "gridPos": {
946
+ "h": 9,
947
+ "w": 18,
948
+ "x": 6,
949
+ "y": 21
950
+ },
951
+ "id": 2,
952
+ "options": {
953
+ "dedupStrategy": "none",
954
+ "enableLogDetails": true,
955
+ "prettifyLogMessage": false,
956
+ "showCommonLabels": false,
957
+ "showLabels": false,
958
+ "showTime": false,
959
+ "sortOrder": "Descending",
960
+ "wrapLogMessage": true
961
+ },
962
+ "pluginVersion": "8.4.3",
963
+ "targets": [
964
+ {
965
+ "datasource": {
966
+ "type": "loki",
967
+ "uid": "loki"
968
+ },
969
+ "expr": "{compose_service=~\"app-.*\"} | pattern `<date> <time> <type> <logger> <code> [<_>=<trace_id> <_>=<span_id> <_>=<service_name>] - <msg>` | line_format \"{{.compose_service}}\\t{{.type}}\\t trace_id={{.trace_id}}\\t {{.msg}}\" |= \"$log_keyword\"",
970
+ "hide": false,
971
+ "refId": "A"
972
+ }
973
+ ],
974
+ "title": "Log of All FastAPI App",
975
+ "type": "logs"
976
+ }
977
+ ],
978
+ "refresh": "5s",
979
+ "schemaVersion": 38,
980
+ "style": "dark",
981
+ "tags": [],
982
+ "templating": {
983
+ "list": [
984
+ {
985
+ "current": {
986
+ "selected": false,
987
+ "text": "app-a",
988
+ "value": "app-a"
989
+ },
990
+ "datasource": {
991
+ "type": "prometheus",
992
+ "uid": "prometheus"
993
+ },
994
+ "definition": "label_values(fastapi_app_info{}, app_name)",
995
+ "hide": 0,
996
+ "includeAll": false,
997
+ "label": "Application Name",
998
+ "multi": false,
999
+ "name": "app_name",
1000
+ "options": [],
1001
+ "query": {
1002
+ "query": "label_values(fastapi_app_info{}, app_name)",
1003
+ "refId": "StandardVariableQuery"
1004
+ },
1005
+ "refresh": 1,
1006
+ "regex": "",
1007
+ "skipUrlSync": false,
1008
+ "sort": 0,
1009
+ "type": "query"
1010
+ },
1011
+ {
1012
+ "current": {
1013
+ "selected": false,
1014
+ "text": "",
1015
+ "value": ""
1016
+ },
1017
+ "description": "query with keyword",
1018
+ "hide": 0,
1019
+ "label": "Log Query",
1020
+ "name": "log_keyword",
1021
+ "options": [
1022
+ {
1023
+ "selected": true,
1024
+ "text": "",
1025
+ "value": ""
1026
+ }
1027
+ ],
1028
+ "query": "",
1029
+ "skipUrlSync": false,
1030
+ "type": "textbox"
1031
+ }
1032
+ ]
1033
+ },
1034
+ "time": {
1035
+ "from": "now-5m",
1036
+ "to": "now"
1037
+ },
1038
+ "timepicker": {},
1039
+ "timezone": "",
1040
+ "title": "FastAPI Observability",
1041
+ "uid": "fastapi-observability",
1042
+ "version": 1,
1043
+ "weekStart": ""
1044
+ }