django-cfg 1.5.8__py3-none-any.whl → 1.5.14__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.

Potentially problematic release.


This version of django-cfg might be problematic. Click here for more details.

Files changed (119) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/api/commands/serializers.py +152 -0
  3. django_cfg/apps/api/commands/views.py +32 -0
  4. django_cfg/apps/business/accounts/management/commands/otp_test.py +5 -2
  5. django_cfg/apps/business/agents/management/commands/create_agent.py +5 -194
  6. django_cfg/apps/business/agents/management/commands/load_agent_templates.py +205 -0
  7. django_cfg/apps/business/agents/management/commands/orchestrator_status.py +4 -2
  8. django_cfg/apps/business/knowbase/management/commands/knowbase_stats.py +4 -2
  9. django_cfg/apps/business/knowbase/management/commands/setup_knowbase.py +4 -2
  10. django_cfg/apps/business/newsletter/management/commands/test_newsletter.py +5 -2
  11. django_cfg/apps/business/payments/management/commands/check_payment_status.py +4 -2
  12. django_cfg/apps/business/payments/management/commands/create_payment.py +4 -2
  13. django_cfg/apps/business/payments/management/commands/sync_currencies.py +4 -2
  14. django_cfg/apps/integrations/centrifugo/management/commands/generate_centrifugo_clients.py +5 -5
  15. django_cfg/apps/integrations/centrifugo/serializers/__init__.py +2 -1
  16. django_cfg/apps/integrations/centrifugo/serializers/publishes.py +22 -2
  17. django_cfg/apps/integrations/centrifugo/views/monitoring.py +25 -40
  18. django_cfg/apps/integrations/grpc/admin/__init__.py +7 -1
  19. django_cfg/apps/integrations/grpc/admin/config.py +113 -9
  20. django_cfg/apps/integrations/grpc/admin/grpc_api_key.py +129 -0
  21. django_cfg/apps/integrations/grpc/admin/grpc_request_log.py +72 -63
  22. django_cfg/apps/integrations/grpc/admin/grpc_server_status.py +236 -0
  23. django_cfg/apps/integrations/grpc/auth/__init__.py +11 -3
  24. django_cfg/apps/integrations/grpc/auth/api_key_auth.py +320 -0
  25. django_cfg/apps/integrations/grpc/interceptors/logging.py +17 -20
  26. django_cfg/apps/integrations/grpc/interceptors/metrics.py +15 -14
  27. django_cfg/apps/integrations/grpc/interceptors/request_logger.py +79 -59
  28. django_cfg/apps/integrations/grpc/management/commands/generate_protos.py +130 -0
  29. django_cfg/apps/integrations/grpc/management/commands/rungrpc.py +171 -96
  30. django_cfg/apps/integrations/grpc/management/commands/test_grpc_integration.py +75 -0
  31. django_cfg/apps/integrations/grpc/managers/__init__.py +2 -0
  32. django_cfg/apps/integrations/grpc/managers/grpc_api_key.py +192 -0
  33. django_cfg/apps/integrations/grpc/managers/grpc_server_status.py +19 -11
  34. django_cfg/apps/integrations/grpc/migrations/0005_grpcapikey.py +143 -0
  35. django_cfg/apps/integrations/grpc/migrations/0006_grpcrequestlog_api_key_and_more.py +34 -0
  36. django_cfg/apps/integrations/grpc/models/__init__.py +2 -0
  37. django_cfg/apps/integrations/grpc/models/grpc_api_key.py +198 -0
  38. django_cfg/apps/integrations/grpc/models/grpc_request_log.py +11 -0
  39. django_cfg/apps/integrations/grpc/models/grpc_server_status.py +39 -4
  40. django_cfg/apps/integrations/grpc/serializers/__init__.py +22 -6
  41. django_cfg/apps/integrations/grpc/serializers/api_keys.py +63 -0
  42. django_cfg/apps/integrations/grpc/serializers/charts.py +118 -120
  43. django_cfg/apps/integrations/grpc/serializers/config.py +65 -51
  44. django_cfg/apps/integrations/grpc/serializers/health.py +7 -7
  45. django_cfg/apps/integrations/grpc/serializers/proto_files.py +74 -0
  46. django_cfg/apps/integrations/grpc/serializers/requests.py +13 -7
  47. django_cfg/apps/integrations/grpc/serializers/service_registry.py +181 -112
  48. django_cfg/apps/integrations/grpc/serializers/services.py +14 -32
  49. django_cfg/apps/integrations/grpc/serializers/stats.py +50 -12
  50. django_cfg/apps/integrations/grpc/serializers/testing.py +66 -58
  51. django_cfg/apps/integrations/grpc/services/__init__.py +2 -0
  52. django_cfg/apps/integrations/grpc/services/monitoring_service.py +149 -43
  53. django_cfg/apps/integrations/grpc/services/proto_files_manager.py +268 -0
  54. django_cfg/apps/integrations/grpc/services/service_registry.py +48 -46
  55. django_cfg/apps/integrations/grpc/services/testing_service.py +10 -15
  56. django_cfg/apps/integrations/grpc/urls.py +8 -0
  57. django_cfg/apps/integrations/grpc/utils/__init__.py +4 -13
  58. django_cfg/apps/integrations/grpc/utils/integration_test.py +334 -0
  59. django_cfg/apps/integrations/grpc/utils/proto_gen.py +48 -8
  60. django_cfg/apps/integrations/grpc/utils/streaming_logger.py +177 -0
  61. django_cfg/apps/integrations/grpc/views/__init__.py +4 -0
  62. django_cfg/apps/integrations/grpc/views/api_keys.py +255 -0
  63. django_cfg/apps/integrations/grpc/views/charts.py +21 -14
  64. django_cfg/apps/integrations/grpc/views/config.py +8 -6
  65. django_cfg/apps/integrations/grpc/views/monitoring.py +51 -79
  66. django_cfg/apps/integrations/grpc/views/proto_files.py +214 -0
  67. django_cfg/apps/integrations/grpc/views/services.py +30 -21
  68. django_cfg/apps/integrations/grpc/views/testing.py +45 -43
  69. django_cfg/apps/integrations/rq/views/jobs.py +19 -9
  70. django_cfg/apps/integrations/rq/views/schedule.py +7 -3
  71. django_cfg/apps/system/dashboard/serializers/commands.py +25 -1
  72. django_cfg/apps/system/dashboard/services/commands_service.py +12 -1
  73. django_cfg/apps/system/maintenance/management/commands/maintenance.py +5 -2
  74. django_cfg/apps/system/maintenance/management/commands/process_scheduled_maintenance.py +4 -2
  75. django_cfg/apps/system/maintenance/management/commands/sync_cloudflare.py +5 -2
  76. django_cfg/config.py +33 -0
  77. django_cfg/core/generation/integration_generators/grpc_generator.py +30 -32
  78. django_cfg/management/commands/check_endpoints.py +2 -2
  79. django_cfg/management/commands/check_settings.py +3 -10
  80. django_cfg/management/commands/clear_constance.py +3 -10
  81. django_cfg/management/commands/create_token.py +4 -11
  82. django_cfg/management/commands/list_urls.py +4 -10
  83. django_cfg/management/commands/migrate_all.py +18 -12
  84. django_cfg/management/commands/migrator.py +4 -11
  85. django_cfg/management/commands/script.py +4 -10
  86. django_cfg/management/commands/show_config.py +8 -16
  87. django_cfg/management/commands/show_urls.py +5 -11
  88. django_cfg/management/commands/superuser.py +4 -11
  89. django_cfg/management/commands/tree.py +5 -10
  90. django_cfg/management/utils/README.md +402 -0
  91. django_cfg/management/utils/__init__.py +29 -0
  92. django_cfg/management/utils/mixins.py +176 -0
  93. django_cfg/middleware/pagination.py +53 -54
  94. django_cfg/models/api/grpc/__init__.py +15 -21
  95. django_cfg/models/api/grpc/config.py +155 -73
  96. django_cfg/models/ngrok/config.py +7 -6
  97. django_cfg/modules/django_client/core/generator/python/files_generator.py +5 -13
  98. django_cfg/modules/django_client/core/generator/python/templates/api_wrapper.py.jinja +16 -4
  99. django_cfg/modules/django_client/core/generator/python/templates/main_init.py.jinja +2 -3
  100. django_cfg/modules/django_client/core/generator/typescript/files_generator.py +6 -5
  101. django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +12 -8
  102. django_cfg/modules/django_client/core/parser/base.py +114 -30
  103. django_cfg/modules/django_client/management/commands/generate_client.py +5 -2
  104. django_cfg/modules/django_client/management/commands/validate_openapi.py +5 -2
  105. django_cfg/modules/django_email/management/commands/test_email.py +4 -10
  106. django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +16 -13
  107. django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -11
  108. django_cfg/modules/django_twilio/management/commands/test_twilio.py +4 -11
  109. django_cfg/modules/django_unfold/navigation.py +6 -18
  110. django_cfg/pyproject.toml +1 -1
  111. django_cfg/registry/modules.py +1 -4
  112. django_cfg/requirements.txt +52 -0
  113. django_cfg/static/frontend/admin.zip +0 -0
  114. {django_cfg-1.5.8.dist-info → django_cfg-1.5.14.dist-info}/METADATA +1 -1
  115. {django_cfg-1.5.8.dist-info → django_cfg-1.5.14.dist-info}/RECORD +118 -97
  116. django_cfg/apps/integrations/grpc/auth/jwt_auth.py +0 -295
  117. {django_cfg-1.5.8.dist-info → django_cfg-1.5.14.dist-info}/WHEEL +0 -0
  118. {django_cfg-1.5.8.dist-info → django_cfg-1.5.14.dist-info}/entry_points.txt +0 -0
  119. {django_cfg-1.5.8.dist-info → django_cfg-1.5.14.dist-info}/licenses/LICENSE +0 -0
@@ -1,176 +1,245 @@
1
1
  """
2
- Pydantic serializers for gRPC Service Registry API.
2
+ DRF serializers for gRPC Service Registry API.
3
3
 
4
4
  These serializers define the structure for service registry endpoints
5
5
  that provide detailed information about registered gRPC services and their methods.
6
6
  """
7
7
 
8
- from typing import Dict, List, Optional
8
+ from rest_framework import serializers
9
9
 
10
- from pydantic import BaseModel, Field
11
10
 
12
-
13
- class ServiceSummarySerializer(BaseModel):
11
+ class ServiceSummarySerializer(serializers.Serializer):
14
12
  """Summary information for a single service."""
15
13
 
16
- name: str = Field(..., description="Service name (e.g., myapp.UserService)")
17
- full_name: str = Field(..., description="Full service name with package")
18
- package: str = Field(..., description="Package name")
19
- methods_count: int = Field(..., description="Number of methods in service")
20
- total_requests: int = Field(0, description="Total requests to this service")
21
- success_rate: float = Field(0.0, description="Success rate percentage")
22
- avg_duration_ms: float = Field(0.0, description="Average duration in milliseconds")
23
- last_activity_at: Optional[str] = Field(None, description="Last activity timestamp")
14
+ name = serializers.CharField(help_text="Service name (e.g., myapp.UserService)")
15
+ full_name = serializers.CharField(help_text="Full service name with package")
16
+ package = serializers.CharField(help_text="Package name")
17
+ methods_count = serializers.IntegerField(help_text="Number of methods in service")
18
+ total_requests = serializers.IntegerField(
19
+ default=0, help_text="Total requests to this service"
20
+ )
21
+ success_rate = serializers.FloatField(
22
+ default=0.0, help_text="Success rate percentage"
23
+ )
24
+ avg_duration_ms = serializers.FloatField(
25
+ default=0.0, help_text="Average duration in milliseconds"
26
+ )
27
+ last_activity_at = serializers.CharField(
28
+ allow_null=True, required=False, help_text="Last activity timestamp"
29
+ )
24
30
 
25
31
 
26
- class ServiceListSerializer(BaseModel):
32
+ class ServiceListSerializer(serializers.Serializer):
27
33
  """List of services response."""
28
34
 
29
- services: List[ServiceSummarySerializer] = Field(
30
- default_factory=list, description="List of services"
35
+ services = ServiceSummarySerializer(
36
+ many=True, default=list, help_text="List of services"
31
37
  )
32
- total_services: int = Field(..., description="Total number of services")
38
+ total_services = serializers.IntegerField(help_text="Total number of services")
33
39
 
34
40
 
35
- class MethodInfoSerializer(BaseModel):
41
+ class MethodInfoSerializer(serializers.Serializer):
36
42
  """Information about a service method."""
37
43
 
38
- name: str = Field(..., description="Method name")
39
- full_name: str = Field(..., description="Full method name (/service/method)")
40
- request_type: str = Field("", description="Request message type")
41
- response_type: str = Field("", description="Response message type")
42
- streaming: bool = Field(False, description="Whether method uses streaming")
43
- auth_required: bool = Field(False, description="Whether authentication is required")
44
+ name = serializers.CharField(help_text="Method name")
45
+ full_name = serializers.CharField(help_text="Full method name (/service/method)")
46
+ request_type = serializers.CharField(
47
+ default="", allow_blank=True, help_text="Request message type"
48
+ )
49
+ response_type = serializers.CharField(
50
+ default="", allow_blank=True, help_text="Response message type"
51
+ )
52
+ streaming = serializers.BooleanField(
53
+ default=False, help_text="Whether method uses streaming"
54
+ )
55
+ auth_required = serializers.BooleanField(
56
+ default=False, help_text="Whether authentication is required"
57
+ )
44
58
 
45
59
 
46
- class ServiceStatsSerializer(BaseModel):
60
+ class ServiceStatsSerializer(serializers.Serializer):
47
61
  """Service statistics."""
48
62
 
49
- total_requests: int = Field(0, description="Total requests")
50
- successful: int = Field(0, description="Successful requests")
51
- errors: int = Field(0, description="Failed requests")
52
- success_rate: float = Field(0.0, description="Success rate percentage")
53
- avg_duration_ms: float = Field(0.0, description="Average duration in milliseconds")
54
- last_24h_requests: int = Field(0, description="Requests in last 24 hours")
63
+ total_requests = serializers.IntegerField(default=0, help_text="Total requests")
64
+ successful = serializers.IntegerField(default=0, help_text="Successful requests")
65
+ errors = serializers.IntegerField(default=0, help_text="Failed requests")
66
+ success_rate = serializers.FloatField(
67
+ default=0.0, help_text="Success rate percentage"
68
+ )
69
+ avg_duration_ms = serializers.FloatField(
70
+ default=0.0, help_text="Average duration in milliseconds"
71
+ )
72
+ last_24h_requests = serializers.IntegerField(
73
+ default=0, help_text="Requests in last 24 hours"
74
+ )
55
75
 
56
76
 
57
- class RecentErrorSerializer(BaseModel):
77
+ class RecentErrorSerializer(serializers.Serializer):
58
78
  """Recent error information."""
59
79
 
60
- method: str = Field(..., description="Method name where error occurred")
61
- error_message: str = Field(..., description="Error message")
62
- grpc_status_code: str = Field(..., description="gRPC status code")
63
- occurred_at: str = Field(..., description="When error occurred (ISO timestamp)")
80
+ method = serializers.CharField(help_text="Method name where error occurred")
81
+ error_message = serializers.CharField(help_text="Error message")
82
+ grpc_status_code = serializers.CharField(help_text="gRPC status code")
83
+ occurred_at = serializers.CharField(
84
+ help_text="When error occurred (ISO timestamp)"
85
+ )
64
86
 
65
87
 
66
- class ServiceDetailSerializer(BaseModel):
88
+ class ServiceDetailSerializer(serializers.Serializer):
67
89
  """Detailed information about a service."""
68
90
 
69
- name: str = Field(..., description="Service name")
70
- full_name: str = Field(..., description="Full service name with package")
71
- package: str = Field(..., description="Package name")
72
- description: str = Field("", description="Service description from docstring")
73
- file_path: str = Field("", description="Path to service file")
74
- class_name: str = Field(..., description="Service class name")
75
- base_class: str = Field("", description="Base class name")
76
- methods: List[MethodInfoSerializer] = Field(
77
- default_factory=list, description="Service methods"
91
+ name = serializers.CharField(help_text="Service name")
92
+ full_name = serializers.CharField(help_text="Full service name with package")
93
+ package = serializers.CharField(help_text="Package name")
94
+ description = serializers.CharField(
95
+ default="", allow_blank=True, help_text="Service description from docstring"
96
+ )
97
+ file_path = serializers.CharField(
98
+ default="", allow_blank=True, help_text="Path to service file"
99
+ )
100
+ class_name = serializers.CharField(help_text="Service class name")
101
+ base_class = serializers.CharField(
102
+ default="", allow_blank=True, help_text="Base class name"
78
103
  )
79
- stats: ServiceStatsSerializer = Field(..., description="Service statistics")
80
- recent_errors: List[RecentErrorSerializer] = Field(
81
- default_factory=list, description="Recent errors"
104
+ methods = MethodInfoSerializer(many=True, default=list, help_text="Service methods")
105
+ stats = ServiceStatsSerializer(help_text="Service statistics")
106
+ recent_errors = RecentErrorSerializer(
107
+ many=True, default=list, help_text="Recent errors"
82
108
  )
83
109
 
84
110
 
85
- class MethodStatsSerializer(BaseModel):
111
+ class MethodStatsSerializer(serializers.Serializer):
86
112
  """Statistics for a single method."""
87
113
 
88
- total_requests: int = Field(0, description="Total requests")
89
- successful: int = Field(0, description="Successful requests")
90
- errors: int = Field(0, description="Failed requests")
91
- success_rate: float = Field(0.0, description="Success rate percentage")
92
- avg_duration_ms: float = Field(0.0, description="Average duration in milliseconds")
93
- p50_duration_ms: float = Field(0.0, description="P50 duration in milliseconds")
94
- p95_duration_ms: float = Field(0.0, description="P95 duration in milliseconds")
95
- p99_duration_ms: float = Field(0.0, description="P99 duration in milliseconds")
114
+ total_requests = serializers.IntegerField(default=0, help_text="Total requests")
115
+ successful = serializers.IntegerField(default=0, help_text="Successful requests")
116
+ errors = serializers.IntegerField(default=0, help_text="Failed requests")
117
+ success_rate = serializers.FloatField(
118
+ default=0.0, help_text="Success rate percentage"
119
+ )
120
+ avg_duration_ms = serializers.FloatField(
121
+ default=0.0, help_text="Average duration in milliseconds"
122
+ )
123
+ p50_duration_ms = serializers.FloatField(
124
+ default=0.0, help_text="P50 duration in milliseconds"
125
+ )
126
+ p95_duration_ms = serializers.FloatField(
127
+ default=0.0, help_text="P95 duration in milliseconds"
128
+ )
129
+ p99_duration_ms = serializers.FloatField(
130
+ default=0.0, help_text="P99 duration in milliseconds"
131
+ )
96
132
 
97
133
 
98
- class MethodSummarySerializer(BaseModel):
134
+ class MethodSummarySerializer(serializers.Serializer):
99
135
  """Summary information for a method."""
100
136
 
101
- name: str = Field(..., description="Method name")
102
- full_name: str = Field(..., description="Full method path")
103
- service_name: str = Field(..., description="Service name")
104
- request_type: str = Field("", description="Request message type")
105
- response_type: str = Field("", description="Response message type")
106
- stats: MethodStatsSerializer = Field(..., description="Method statistics")
137
+ name = serializers.CharField(help_text="Method name")
138
+ full_name = serializers.CharField(help_text="Full method path")
139
+ service_name = serializers.CharField(help_text="Service name")
140
+ request_type = serializers.CharField(
141
+ default="", allow_blank=True, help_text="Request message type"
142
+ )
143
+ response_type = serializers.CharField(
144
+ default="", allow_blank=True, help_text="Response message type"
145
+ )
146
+ stats = MethodStatsSerializer(help_text="Method statistics")
107
147
 
108
148
 
109
- class ServiceMethodsSerializer(BaseModel):
149
+ class ServiceMethodsSerializer(serializers.Serializer):
110
150
  """List of methods for a service."""
111
151
 
112
- service_name: str = Field(..., description="Service name")
113
- methods: List[MethodSummarySerializer] = Field(
114
- default_factory=list, description="List of methods"
115
- )
116
- total_methods: int = Field(..., description="Total number of methods")
152
+ service_name = serializers.CharField(help_text="Service name")
153
+ methods = MethodSummarySerializer(many=True, default=list, help_text="List of methods")
154
+ total_methods = serializers.IntegerField(help_text="Total number of methods")
117
155
 
118
156
 
119
- class RequestSchemaField(BaseModel):
157
+ class RequestSchemaField(serializers.Serializer):
120
158
  """Schema field information."""
121
159
 
122
- name: str = Field(..., description="Field name")
123
- type: str = Field(..., description="Field type")
124
- required: bool = Field(False, description="Whether field is required")
125
- description: str = Field("", description="Field description")
160
+ name = serializers.CharField(help_text="Field name")
161
+ type = serializers.CharField(help_text="Field type")
162
+ required = serializers.BooleanField(
163
+ default=False, help_text="Whether field is required"
164
+ )
165
+ description = serializers.CharField(
166
+ default="", allow_blank=True, help_text="Field description"
167
+ )
126
168
 
127
169
 
128
- class RequestSchemaSerializer(BaseModel):
170
+ class RequestSchemaSerializer(serializers.Serializer):
129
171
  """Request message schema."""
130
172
 
131
- fields: List[RequestSchemaField] = Field(
132
- default_factory=list, description="Schema fields"
133
- )
173
+ fields = RequestSchemaField(many=True, default=list, help_text="Schema fields")
134
174
 
135
175
 
136
- class RecentRequestSerializer(BaseModel):
176
+ class RecentRequestSerializer(serializers.Serializer):
137
177
  """Recent request information."""
138
178
 
139
- id: int = Field(..., description="Database ID")
140
- request_id: str = Field(..., description="Request ID")
141
- service_name: str = Field(..., description="Service name")
142
- method_name: str = Field(..., description="Method name")
143
- status: str = Field(..., description="Request status")
144
- duration_ms: int = Field(0, description="Duration in milliseconds")
145
- grpc_status_code: str = Field("", description="gRPC status code")
146
- error_message: str = Field("", description="Error message if failed")
147
- created_at: str = Field(..., description="Request timestamp")
148
- client_ip: str = Field("", description="Client IP address")
179
+ id = serializers.IntegerField(help_text="Database ID")
180
+ request_id = serializers.CharField(help_text="Request ID")
181
+ service_name = serializers.CharField(help_text="Service name")
182
+ method_name = serializers.CharField(help_text="Method name")
183
+ status = serializers.CharField(help_text="Request status")
184
+ duration_ms = serializers.IntegerField(default=0, help_text="Duration in milliseconds")
185
+ grpc_status_code = serializers.CharField(
186
+ default="", allow_blank=True, help_text="gRPC status code"
187
+ )
188
+ error_message = serializers.CharField(
189
+ default="", allow_blank=True, help_text="Error message if failed"
190
+ )
191
+ created_at = serializers.CharField(help_text="Request timestamp")
192
+ client_ip = serializers.CharField(
193
+ default="", allow_blank=True, help_text="Client IP address"
194
+ )
195
+ # User information
196
+ user_id = serializers.IntegerField(
197
+ allow_null=True, required=False, help_text="User ID (if authenticated)"
198
+ )
199
+ username = serializers.CharField(
200
+ default="", allow_blank=True, allow_null=True, help_text="Username (if authenticated)"
201
+ )
202
+ is_authenticated = serializers.BooleanField(
203
+ default=False, help_text="Whether request was authenticated"
204
+ )
205
+ # API Key information
206
+ api_key_id = serializers.IntegerField(
207
+ allow_null=True, required=False, help_text="API Key ID (if used)"
208
+ )
209
+ api_key_name = serializers.CharField(
210
+ default="", allow_blank=True, allow_null=True, help_text="API Key name (if used)"
211
+ )
149
212
 
150
213
 
151
- class MethodDetailSerializer(BaseModel):
214
+ class MethodDetailSerializer(serializers.Serializer):
152
215
  """Detailed information about a method."""
153
216
 
154
- name: str = Field(..., description="Method name")
155
- full_name: str = Field(..., description="Full method path")
156
- service_name: str = Field(..., description="Service name")
157
- request_type: str = Field("", description="Request message type")
158
- response_type: str = Field("", description="Response message type")
159
- streaming: bool = Field(False, description="Whether method uses streaming")
160
- auth_required: bool = Field(False, description="Whether authentication is required")
161
- description: str = Field("", description="Method description")
162
- request_schema: RequestSchemaSerializer = Field(
163
- ..., description="Request message schema"
164
- )
165
- response_schema: RequestSchemaSerializer = Field(
166
- ..., description="Response message schema"
167
- )
168
- stats: MethodStatsSerializer = Field(..., description="Method statistics")
169
- recent_requests: List[RecentRequestSerializer] = Field(
170
- default_factory=list, description="Recent requests"
171
- )
172
- error_distribution: Dict[str, int] = Field(
173
- default_factory=dict, description="Error distribution by status code"
217
+ name = serializers.CharField(help_text="Method name")
218
+ full_name = serializers.CharField(help_text="Full method path")
219
+ service_name = serializers.CharField(help_text="Service name")
220
+ request_type = serializers.CharField(
221
+ default="", allow_blank=True, help_text="Request message type"
222
+ )
223
+ response_type = serializers.CharField(
224
+ default="", allow_blank=True, help_text="Response message type"
225
+ )
226
+ streaming = serializers.BooleanField(
227
+ default=False, help_text="Whether method uses streaming"
228
+ )
229
+ auth_required = serializers.BooleanField(
230
+ default=False, help_text="Whether authentication is required"
231
+ )
232
+ description = serializers.CharField(
233
+ default="", allow_blank=True, help_text="Method description"
234
+ )
235
+ request_schema = RequestSchemaSerializer(help_text="Request message schema")
236
+ response_schema = RequestSchemaSerializer(help_text="Response message schema")
237
+ stats = MethodStatsSerializer(help_text="Method statistics")
238
+ recent_requests = RecentRequestSerializer(
239
+ many=True, default=list, help_text="Recent requests"
240
+ )
241
+ error_distribution = serializers.DictField(
242
+ default=dict, help_text="Error distribution by status code"
174
243
  )
175
244
 
176
245
 
@@ -2,49 +2,31 @@
2
2
  Services serializers for gRPC monitoring API.
3
3
  """
4
4
 
5
- from pydantic import BaseModel, Field
5
+ from rest_framework import serializers
6
6
 
7
7
 
8
- class MonitoringServiceStatsSerializer(BaseModel):
9
- """Statistics for a single gRPC service (monitoring endpoint)."""
10
-
11
- service_name: str = Field(description="Service name")
12
- total: int = Field(description="Total requests")
13
- successful: int = Field(description="Successful requests")
14
- errors: int = Field(description="Error requests")
15
- avg_duration_ms: float = Field(description="Average duration")
16
- last_activity_at: str | None = Field(description="Last activity timestamp")
17
-
18
-
19
- class ServiceListSerializer(BaseModel):
20
- """List of gRPC services with statistics."""
21
-
22
- services: list[MonitoringServiceStatsSerializer] = Field(description="Service statistics")
23
- total_services: int = Field(description="Total number of services")
24
-
25
-
26
- class MethodStatsSerializer(BaseModel):
8
+ class MethodStatsSerializer(serializers.Serializer):
27
9
  """Statistics for a single gRPC method."""
28
10
 
29
- method_name: str = Field(description="Method name")
30
- service_name: str = Field(description="Service name")
31
- total: int = Field(description="Total requests")
32
- successful: int = Field(description="Successful requests")
33
- errors: int = Field(description="Error requests")
34
- avg_duration_ms: float = Field(description="Average duration")
35
- last_activity_at: str | None = Field(description="Last activity timestamp")
11
+ method_name = serializers.CharField(help_text="Method name")
12
+ service_name = serializers.CharField(help_text="Service name")
13
+ total = serializers.IntegerField(help_text="Total requests")
14
+ successful = serializers.IntegerField(help_text="Successful requests")
15
+ errors = serializers.IntegerField(help_text="Error requests")
16
+ avg_duration_ms = serializers.FloatField(help_text="Average duration")
17
+ last_activity_at = serializers.CharField(
18
+ allow_null=True, help_text="Last activity timestamp"
19
+ )
36
20
 
37
21
 
38
- class MethodListSerializer(BaseModel):
22
+ class MethodListSerializer(serializers.Serializer):
39
23
  """List of gRPC methods with statistics."""
40
24
 
41
- methods: list[MethodStatsSerializer] = Field(description="Method statistics")
42
- total_methods: int = Field(description="Total number of methods")
25
+ methods = MethodStatsSerializer(many=True, help_text="Method statistics")
26
+ total_methods = serializers.IntegerField(help_text="Total number of methods")
43
27
 
44
28
 
45
29
  __all__ = [
46
- "MonitoringServiceStatsSerializer",
47
- "ServiceListSerializer",
48
30
  "MethodStatsSerializer",
49
31
  "MethodListSerializer",
50
32
  ]
@@ -2,21 +2,59 @@
2
2
  Statistics serializers for gRPC monitoring API.
3
3
  """
4
4
 
5
- from pydantic import BaseModel, Field
5
+ from rest_framework import serializers
6
6
 
7
7
 
8
- class GRPCOverviewStatsSerializer(BaseModel):
8
+ class GRPCRegisteredServiceSerializer(serializers.Serializer):
9
+ """Information about a registered gRPC service."""
10
+
11
+ name = serializers.CharField(help_text="Service name")
12
+ full_name = serializers.CharField(help_text="Full service name with package")
13
+ methods_count = serializers.IntegerField(help_text="Number of methods in service")
14
+ request_count = serializers.IntegerField(help_text="Total requests to this service in period")
15
+ error_count = serializers.IntegerField(help_text="Error requests to this service in period")
16
+ success_rate = serializers.FloatField(help_text="Success rate percentage for this service")
17
+
18
+
19
+ class GRPCServerStatusSerializer(serializers.Serializer):
20
+ """gRPC server status and information for overview stats."""
21
+
22
+ status = serializers.CharField(help_text="Server status (running, stopped, error, etc.)")
23
+ is_running = serializers.BooleanField(help_text="Whether server is currently running")
24
+ host = serializers.CharField(help_text="Server host address")
25
+ port = serializers.IntegerField(help_text="Server port")
26
+ address = serializers.CharField(help_text="Full server address (host:port)")
27
+ pid = serializers.IntegerField(allow_null=True, help_text="Process ID")
28
+ started_at = serializers.DateTimeField(allow_null=True, help_text="Server start time")
29
+ uptime_seconds = serializers.IntegerField(help_text="Server uptime in seconds")
30
+ uptime_display = serializers.CharField(help_text="Human-readable uptime")
31
+ registered_services_count = serializers.IntegerField(help_text="Number of registered services")
32
+ enable_reflection = serializers.BooleanField(help_text="Whether reflection is enabled")
33
+ enable_health_check = serializers.BooleanField(help_text="Whether health check is enabled")
34
+ last_heartbeat = serializers.DateTimeField(allow_null=True, help_text="Last heartbeat timestamp")
35
+ services = GRPCRegisteredServiceSerializer(many=True, help_text="List of registered services with stats")
36
+ services_healthy = serializers.BooleanField(help_text="Whether all services are healthy (no recent errors)")
37
+
38
+
39
+ class GRPCOverviewStatsSerializer(serializers.Serializer):
9
40
  """Overview statistics for gRPC requests."""
10
41
 
11
- total: int = Field(description="Total requests in period")
12
- successful: int = Field(description="Successful requests")
13
- errors: int = Field(description="Error requests")
14
- cancelled: int = Field(description="Cancelled requests")
15
- timeout: int = Field(description="Timeout requests")
16
- success_rate: float = Field(description="Success rate percentage")
17
- avg_duration_ms: float = Field(description="Average duration in milliseconds")
18
- p95_duration_ms: float = Field(description="95th percentile duration in milliseconds")
19
- period_hours: int = Field(description="Statistics period in hours")
42
+ total = serializers.IntegerField(help_text="Total requests in period")
43
+ successful = serializers.IntegerField(help_text="Successful requests")
44
+ errors = serializers.IntegerField(help_text="Error requests")
45
+ cancelled = serializers.IntegerField(help_text="Cancelled requests")
46
+ timeout = serializers.IntegerField(help_text="Timeout requests")
47
+ success_rate = serializers.FloatField(help_text="Success rate percentage")
48
+ avg_duration_ms = serializers.FloatField(help_text="Average duration in milliseconds")
49
+ p95_duration_ms = serializers.FloatField(
50
+ allow_null=True, help_text="95th percentile duration in milliseconds"
51
+ )
52
+ period_hours = serializers.IntegerField(help_text="Statistics period in hours")
53
+ server = GRPCServerStatusSerializer(help_text="gRPC server information")
20
54
 
21
55
 
22
- __all__ = ["GRPCOverviewStatsSerializer"]
56
+ __all__ = [
57
+ "GRPCOverviewStatsSerializer",
58
+ "GRPCServerStatusSerializer",
59
+ "GRPCRegisteredServiceSerializer",
60
+ ]