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.
- django_cfg/__init__.py +1 -1
- django_cfg/apps/api/commands/serializers.py +152 -0
- django_cfg/apps/api/commands/views.py +32 -0
- django_cfg/apps/business/accounts/management/commands/otp_test.py +5 -2
- django_cfg/apps/business/agents/management/commands/create_agent.py +5 -194
- django_cfg/apps/business/agents/management/commands/load_agent_templates.py +205 -0
- django_cfg/apps/business/agents/management/commands/orchestrator_status.py +4 -2
- django_cfg/apps/business/knowbase/management/commands/knowbase_stats.py +4 -2
- django_cfg/apps/business/knowbase/management/commands/setup_knowbase.py +4 -2
- django_cfg/apps/business/newsletter/management/commands/test_newsletter.py +5 -2
- django_cfg/apps/business/payments/management/commands/check_payment_status.py +4 -2
- django_cfg/apps/business/payments/management/commands/create_payment.py +4 -2
- django_cfg/apps/business/payments/management/commands/sync_currencies.py +4 -2
- django_cfg/apps/integrations/centrifugo/management/commands/generate_centrifugo_clients.py +5 -5
- django_cfg/apps/integrations/centrifugo/serializers/__init__.py +2 -1
- django_cfg/apps/integrations/centrifugo/serializers/publishes.py +22 -2
- django_cfg/apps/integrations/centrifugo/views/monitoring.py +25 -40
- django_cfg/apps/integrations/grpc/admin/__init__.py +7 -1
- django_cfg/apps/integrations/grpc/admin/config.py +113 -9
- django_cfg/apps/integrations/grpc/admin/grpc_api_key.py +129 -0
- django_cfg/apps/integrations/grpc/admin/grpc_request_log.py +72 -63
- django_cfg/apps/integrations/grpc/admin/grpc_server_status.py +236 -0
- django_cfg/apps/integrations/grpc/auth/__init__.py +11 -3
- django_cfg/apps/integrations/grpc/auth/api_key_auth.py +320 -0
- django_cfg/apps/integrations/grpc/interceptors/logging.py +17 -20
- django_cfg/apps/integrations/grpc/interceptors/metrics.py +15 -14
- django_cfg/apps/integrations/grpc/interceptors/request_logger.py +79 -59
- django_cfg/apps/integrations/grpc/management/commands/generate_protos.py +130 -0
- django_cfg/apps/integrations/grpc/management/commands/rungrpc.py +171 -96
- django_cfg/apps/integrations/grpc/management/commands/test_grpc_integration.py +75 -0
- django_cfg/apps/integrations/grpc/managers/__init__.py +2 -0
- django_cfg/apps/integrations/grpc/managers/grpc_api_key.py +192 -0
- django_cfg/apps/integrations/grpc/managers/grpc_server_status.py +19 -11
- django_cfg/apps/integrations/grpc/migrations/0005_grpcapikey.py +143 -0
- django_cfg/apps/integrations/grpc/migrations/0006_grpcrequestlog_api_key_and_more.py +34 -0
- django_cfg/apps/integrations/grpc/models/__init__.py +2 -0
- django_cfg/apps/integrations/grpc/models/grpc_api_key.py +198 -0
- django_cfg/apps/integrations/grpc/models/grpc_request_log.py +11 -0
- django_cfg/apps/integrations/grpc/models/grpc_server_status.py +39 -4
- django_cfg/apps/integrations/grpc/serializers/__init__.py +22 -6
- django_cfg/apps/integrations/grpc/serializers/api_keys.py +63 -0
- django_cfg/apps/integrations/grpc/serializers/charts.py +118 -120
- django_cfg/apps/integrations/grpc/serializers/config.py +65 -51
- django_cfg/apps/integrations/grpc/serializers/health.py +7 -7
- django_cfg/apps/integrations/grpc/serializers/proto_files.py +74 -0
- django_cfg/apps/integrations/grpc/serializers/requests.py +13 -7
- django_cfg/apps/integrations/grpc/serializers/service_registry.py +181 -112
- django_cfg/apps/integrations/grpc/serializers/services.py +14 -32
- django_cfg/apps/integrations/grpc/serializers/stats.py +50 -12
- django_cfg/apps/integrations/grpc/serializers/testing.py +66 -58
- django_cfg/apps/integrations/grpc/services/__init__.py +2 -0
- django_cfg/apps/integrations/grpc/services/monitoring_service.py +149 -43
- django_cfg/apps/integrations/grpc/services/proto_files_manager.py +268 -0
- django_cfg/apps/integrations/grpc/services/service_registry.py +48 -46
- django_cfg/apps/integrations/grpc/services/testing_service.py +10 -15
- django_cfg/apps/integrations/grpc/urls.py +8 -0
- django_cfg/apps/integrations/grpc/utils/__init__.py +4 -13
- django_cfg/apps/integrations/grpc/utils/integration_test.py +334 -0
- django_cfg/apps/integrations/grpc/utils/proto_gen.py +48 -8
- django_cfg/apps/integrations/grpc/utils/streaming_logger.py +177 -0
- django_cfg/apps/integrations/grpc/views/__init__.py +4 -0
- django_cfg/apps/integrations/grpc/views/api_keys.py +255 -0
- django_cfg/apps/integrations/grpc/views/charts.py +21 -14
- django_cfg/apps/integrations/grpc/views/config.py +8 -6
- django_cfg/apps/integrations/grpc/views/monitoring.py +51 -79
- django_cfg/apps/integrations/grpc/views/proto_files.py +214 -0
- django_cfg/apps/integrations/grpc/views/services.py +30 -21
- django_cfg/apps/integrations/grpc/views/testing.py +45 -43
- django_cfg/apps/integrations/rq/views/jobs.py +19 -9
- django_cfg/apps/integrations/rq/views/schedule.py +7 -3
- django_cfg/apps/system/dashboard/serializers/commands.py +25 -1
- django_cfg/apps/system/dashboard/services/commands_service.py +12 -1
- django_cfg/apps/system/maintenance/management/commands/maintenance.py +5 -2
- django_cfg/apps/system/maintenance/management/commands/process_scheduled_maintenance.py +4 -2
- django_cfg/apps/system/maintenance/management/commands/sync_cloudflare.py +5 -2
- django_cfg/config.py +33 -0
- django_cfg/core/generation/integration_generators/grpc_generator.py +30 -32
- django_cfg/management/commands/check_endpoints.py +2 -2
- django_cfg/management/commands/check_settings.py +3 -10
- django_cfg/management/commands/clear_constance.py +3 -10
- django_cfg/management/commands/create_token.py +4 -11
- django_cfg/management/commands/list_urls.py +4 -10
- django_cfg/management/commands/migrate_all.py +18 -12
- django_cfg/management/commands/migrator.py +4 -11
- django_cfg/management/commands/script.py +4 -10
- django_cfg/management/commands/show_config.py +8 -16
- django_cfg/management/commands/show_urls.py +5 -11
- django_cfg/management/commands/superuser.py +4 -11
- django_cfg/management/commands/tree.py +5 -10
- django_cfg/management/utils/README.md +402 -0
- django_cfg/management/utils/__init__.py +29 -0
- django_cfg/management/utils/mixins.py +176 -0
- django_cfg/middleware/pagination.py +53 -54
- django_cfg/models/api/grpc/__init__.py +15 -21
- django_cfg/models/api/grpc/config.py +155 -73
- django_cfg/models/ngrok/config.py +7 -6
- django_cfg/modules/django_client/core/generator/python/files_generator.py +5 -13
- django_cfg/modules/django_client/core/generator/python/templates/api_wrapper.py.jinja +16 -4
- django_cfg/modules/django_client/core/generator/python/templates/main_init.py.jinja +2 -3
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +6 -5
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +12 -8
- django_cfg/modules/django_client/core/parser/base.py +114 -30
- django_cfg/modules/django_client/management/commands/generate_client.py +5 -2
- django_cfg/modules/django_client/management/commands/validate_openapi.py +5 -2
- django_cfg/modules/django_email/management/commands/test_email.py +4 -10
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +16 -13
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -11
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +4 -11
- django_cfg/modules/django_unfold/navigation.py +6 -18
- django_cfg/pyproject.toml +1 -1
- django_cfg/registry/modules.py +1 -4
- django_cfg/requirements.txt +52 -0
- django_cfg/static/frontend/admin.zip +0 -0
- {django_cfg-1.5.8.dist-info → django_cfg-1.5.14.dist-info}/METADATA +1 -1
- {django_cfg-1.5.8.dist-info → django_cfg-1.5.14.dist-info}/RECORD +118 -97
- django_cfg/apps/integrations/grpc/auth/jwt_auth.py +0 -295
- {django_cfg-1.5.8.dist-info → django_cfg-1.5.14.dist-info}/WHEEL +0 -0
- {django_cfg-1.5.8.dist-info → django_cfg-1.5.14.dist-info}/entry_points.txt +0 -0
- {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
|
-
|
|
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
|
|
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
|
|
17
|
-
full_name
|
|
18
|
-
package
|
|
19
|
-
methods_count
|
|
20
|
-
total_requests
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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(
|
|
32
|
+
class ServiceListSerializer(serializers.Serializer):
|
|
27
33
|
"""List of services response."""
|
|
28
34
|
|
|
29
|
-
services
|
|
30
|
-
|
|
35
|
+
services = ServiceSummarySerializer(
|
|
36
|
+
many=True, default=list, help_text="List of services"
|
|
31
37
|
)
|
|
32
|
-
total_services
|
|
38
|
+
total_services = serializers.IntegerField(help_text="Total number of services")
|
|
33
39
|
|
|
34
40
|
|
|
35
|
-
class MethodInfoSerializer(
|
|
41
|
+
class MethodInfoSerializer(serializers.Serializer):
|
|
36
42
|
"""Information about a service method."""
|
|
37
43
|
|
|
38
|
-
name
|
|
39
|
-
full_name
|
|
40
|
-
request_type
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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(
|
|
60
|
+
class ServiceStatsSerializer(serializers.Serializer):
|
|
47
61
|
"""Service statistics."""
|
|
48
62
|
|
|
49
|
-
total_requests
|
|
50
|
-
successful
|
|
51
|
-
errors
|
|
52
|
-
success_rate
|
|
53
|
-
|
|
54
|
-
|
|
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(
|
|
77
|
+
class RecentErrorSerializer(serializers.Serializer):
|
|
58
78
|
"""Recent error information."""
|
|
59
79
|
|
|
60
|
-
method
|
|
61
|
-
error_message
|
|
62
|
-
grpc_status_code
|
|
63
|
-
occurred_at
|
|
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(
|
|
88
|
+
class ServiceDetailSerializer(serializers.Serializer):
|
|
67
89
|
"""Detailed information about a service."""
|
|
68
90
|
|
|
69
|
-
name
|
|
70
|
-
full_name
|
|
71
|
-
package
|
|
72
|
-
description
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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(
|
|
111
|
+
class MethodStatsSerializer(serializers.Serializer):
|
|
86
112
|
"""Statistics for a single method."""
|
|
87
113
|
|
|
88
|
-
total_requests
|
|
89
|
-
successful
|
|
90
|
-
errors
|
|
91
|
-
success_rate
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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(
|
|
134
|
+
class MethodSummarySerializer(serializers.Serializer):
|
|
99
135
|
"""Summary information for a method."""
|
|
100
136
|
|
|
101
|
-
name
|
|
102
|
-
full_name
|
|
103
|
-
service_name
|
|
104
|
-
request_type
|
|
105
|
-
|
|
106
|
-
|
|
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(
|
|
149
|
+
class ServiceMethodsSerializer(serializers.Serializer):
|
|
110
150
|
"""List of methods for a service."""
|
|
111
151
|
|
|
112
|
-
service_name
|
|
113
|
-
methods
|
|
114
|
-
|
|
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(
|
|
157
|
+
class RequestSchemaField(serializers.Serializer):
|
|
120
158
|
"""Schema field information."""
|
|
121
159
|
|
|
122
|
-
name
|
|
123
|
-
type
|
|
124
|
-
required
|
|
125
|
-
|
|
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(
|
|
170
|
+
class RequestSchemaSerializer(serializers.Serializer):
|
|
129
171
|
"""Request message schema."""
|
|
130
172
|
|
|
131
|
-
fields
|
|
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(
|
|
176
|
+
class RecentRequestSerializer(serializers.Serializer):
|
|
137
177
|
"""Recent request information."""
|
|
138
178
|
|
|
139
|
-
id
|
|
140
|
-
request_id
|
|
141
|
-
service_name
|
|
142
|
-
method_name
|
|
143
|
-
status
|
|
144
|
-
duration_ms
|
|
145
|
-
grpc_status_code
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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(
|
|
214
|
+
class MethodDetailSerializer(serializers.Serializer):
|
|
152
215
|
"""Detailed information about a method."""
|
|
153
216
|
|
|
154
|
-
name
|
|
155
|
-
full_name
|
|
156
|
-
service_name
|
|
157
|
-
request_type
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
)
|
|
172
|
-
|
|
173
|
-
|
|
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
|
|
5
|
+
from rest_framework import serializers
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
class
|
|
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
|
|
30
|
-
service_name
|
|
31
|
-
total
|
|
32
|
-
successful
|
|
33
|
-
errors
|
|
34
|
-
avg_duration_ms
|
|
35
|
-
last_activity_at
|
|
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(
|
|
22
|
+
class MethodListSerializer(serializers.Serializer):
|
|
39
23
|
"""List of gRPC methods with statistics."""
|
|
40
24
|
|
|
41
|
-
methods
|
|
42
|
-
total_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
|
|
5
|
+
from rest_framework import serializers
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
class
|
|
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
|
|
12
|
-
successful
|
|
13
|
-
errors
|
|
14
|
-
cancelled
|
|
15
|
-
timeout
|
|
16
|
-
success_rate
|
|
17
|
-
avg_duration_ms
|
|
18
|
-
p95_duration_ms
|
|
19
|
-
|
|
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__ = [
|
|
56
|
+
__all__ = [
|
|
57
|
+
"GRPCOverviewStatsSerializer",
|
|
58
|
+
"GRPCServerStatusSerializer",
|
|
59
|
+
"GRPCRegisteredServiceSerializer",
|
|
60
|
+
]
|