unrealon 1.0.9__py3-none-any.whl → 1.1.1__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.
- unrealon/__init__.py +23 -21
- unrealon-1.1.1.dist-info/METADATA +722 -0
- unrealon-1.1.1.dist-info/RECORD +82 -0
- {unrealon-1.0.9.dist-info → unrealon-1.1.1.dist-info}/WHEEL +1 -1
- unrealon-1.1.1.dist-info/entry_points.txt +9 -0
- {unrealon-1.0.9.dist-info → unrealon-1.1.1.dist-info/licenses}/LICENSE +1 -1
- unrealon_bridge/__init__.py +114 -0
- unrealon_bridge/cli.py +316 -0
- unrealon_bridge/client/__init__.py +93 -0
- unrealon_bridge/client/base.py +78 -0
- unrealon_bridge/client/commands.py +89 -0
- unrealon_bridge/client/connection.py +90 -0
- unrealon_bridge/client/events.py +65 -0
- unrealon_bridge/client/health.py +38 -0
- unrealon_bridge/client/html_parser.py +146 -0
- unrealon_bridge/client/logging.py +139 -0
- unrealon_bridge/client/proxy.py +70 -0
- unrealon_bridge/client/scheduler.py +450 -0
- unrealon_bridge/client/session.py +70 -0
- unrealon_bridge/configs/__init__.py +14 -0
- unrealon_bridge/configs/bridge_config.py +212 -0
- unrealon_bridge/configs/bridge_config.yaml +39 -0
- unrealon_bridge/models/__init__.py +138 -0
- unrealon_bridge/models/base.py +28 -0
- unrealon_bridge/models/command.py +41 -0
- unrealon_bridge/models/events.py +40 -0
- unrealon_bridge/models/html_parser.py +79 -0
- unrealon_bridge/models/logging.py +55 -0
- unrealon_bridge/models/parser.py +63 -0
- unrealon_bridge/models/proxy.py +41 -0
- unrealon_bridge/models/requests.py +95 -0
- unrealon_bridge/models/responses.py +88 -0
- unrealon_bridge/models/scheduler.py +592 -0
- unrealon_bridge/models/session.py +28 -0
- unrealon_bridge/server/__init__.py +91 -0
- unrealon_bridge/server/base.py +171 -0
- unrealon_bridge/server/handlers/__init__.py +23 -0
- unrealon_bridge/server/handlers/command.py +110 -0
- unrealon_bridge/server/handlers/html_parser.py +139 -0
- unrealon_bridge/server/handlers/logging.py +95 -0
- unrealon_bridge/server/handlers/parser.py +95 -0
- unrealon_bridge/server/handlers/proxy.py +75 -0
- unrealon_bridge/server/handlers/scheduler.py +545 -0
- unrealon_bridge/server/handlers/session.py +66 -0
- unrealon_browser/__init__.py +61 -18
- unrealon_browser/{src/cli → cli}/browser_cli.py +6 -13
- unrealon_browser/{src/cli → cli}/cookies_cli.py +5 -1
- unrealon_browser/{src/core → core}/browser_manager.py +2 -2
- unrealon_browser/{src/managers → managers}/captcha.py +1 -1
- unrealon_browser/{src/managers → managers}/cookies.py +1 -1
- unrealon_browser/managers/logger_bridge.py +231 -0
- unrealon_browser/{src/managers → managers}/profile.py +1 -1
- unrealon_driver/__init__.py +73 -19
- unrealon_driver/browser/__init__.py +8 -0
- unrealon_driver/browser/config.py +74 -0
- unrealon_driver/browser/manager.py +416 -0
- unrealon_driver/exceptions.py +28 -0
- unrealon_driver/parser/__init__.py +55 -0
- unrealon_driver/parser/cli_manager.py +141 -0
- unrealon_driver/parser/daemon_manager.py +227 -0
- unrealon_driver/parser/managers/__init__.py +46 -0
- unrealon_driver/parser/managers/browser.py +51 -0
- unrealon_driver/parser/managers/config.py +281 -0
- unrealon_driver/parser/managers/error.py +412 -0
- unrealon_driver/parser/managers/html.py +732 -0
- unrealon_driver/parser/managers/logging.py +609 -0
- unrealon_driver/parser/managers/result.py +321 -0
- unrealon_driver/parser/parser_manager.py +628 -0
- unrealon/sdk_config.py +0 -88
- unrealon-1.0.9.dist-info/METADATA +0 -810
- unrealon-1.0.9.dist-info/RECORD +0 -246
- unrealon_browser/pyproject.toml +0 -182
- unrealon_browser/src/__init__.py +0 -62
- unrealon_browser/src/managers/logger_bridge.py +0 -395
- unrealon_driver/README.md +0 -204
- unrealon_driver/pyproject.toml +0 -187
- unrealon_driver/src/__init__.py +0 -90
- unrealon_driver/src/cli/__init__.py +0 -10
- unrealon_driver/src/cli/main.py +0 -66
- unrealon_driver/src/cli/simple.py +0 -510
- unrealon_driver/src/config/__init__.py +0 -11
- unrealon_driver/src/config/auto_config.py +0 -478
- unrealon_driver/src/core/__init__.py +0 -18
- unrealon_driver/src/core/exceptions.py +0 -289
- unrealon_driver/src/core/parser.py +0 -638
- unrealon_driver/src/dto/__init__.py +0 -66
- unrealon_driver/src/dto/cli.py +0 -119
- unrealon_driver/src/dto/config.py +0 -18
- unrealon_driver/src/dto/events.py +0 -237
- unrealon_driver/src/dto/execution.py +0 -313
- unrealon_driver/src/dto/services.py +0 -311
- unrealon_driver/src/execution/__init__.py +0 -23
- unrealon_driver/src/execution/daemon_mode.py +0 -317
- unrealon_driver/src/execution/interactive_mode.py +0 -88
- unrealon_driver/src/execution/modes.py +0 -45
- unrealon_driver/src/execution/scheduled_mode.py +0 -209
- unrealon_driver/src/execution/test_mode.py +0 -250
- unrealon_driver/src/logging/__init__.py +0 -24
- unrealon_driver/src/logging/driver_logger.py +0 -512
- unrealon_driver/src/services/__init__.py +0 -24
- unrealon_driver/src/services/browser_service.py +0 -726
- unrealon_driver/src/services/llm/__init__.py +0 -15
- unrealon_driver/src/services/llm/browser_llm_service.py +0 -363
- unrealon_driver/src/services/llm/llm.py +0 -195
- unrealon_driver/src/services/logger_service.py +0 -232
- unrealon_driver/src/services/metrics_service.py +0 -185
- unrealon_driver/src/services/scheduler_service.py +0 -489
- unrealon_driver/src/services/websocket_service.py +0 -362
- unrealon_driver/src/utils/__init__.py +0 -16
- unrealon_driver/src/utils/service_factory.py +0 -317
- unrealon_driver/src/utils/time_formatter.py +0 -338
- unrealon_llm/README.md +0 -44
- unrealon_llm/__init__.py +0 -26
- unrealon_llm/pyproject.toml +0 -154
- unrealon_llm/src/__init__.py +0 -228
- unrealon_llm/src/cli/__init__.py +0 -0
- unrealon_llm/src/core/__init__.py +0 -11
- unrealon_llm/src/core/smart_client.py +0 -438
- unrealon_llm/src/dto/__init__.py +0 -155
- unrealon_llm/src/dto/models/__init__.py +0 -0
- unrealon_llm/src/dto/models/config.py +0 -343
- unrealon_llm/src/dto/models/core.py +0 -328
- unrealon_llm/src/dto/models/enums.py +0 -123
- unrealon_llm/src/dto/models/html_analysis.py +0 -345
- unrealon_llm/src/dto/models/statistics.py +0 -473
- unrealon_llm/src/dto/models/translation.py +0 -383
- unrealon_llm/src/dto/models/type_conversion.py +0 -462
- unrealon_llm/src/dto/schemas/__init__.py +0 -0
- unrealon_llm/src/exceptions.py +0 -392
- unrealon_llm/src/llm_config/__init__.py +0 -20
- unrealon_llm/src/llm_config/logging_config.py +0 -178
- unrealon_llm/src/llm_logging/__init__.py +0 -42
- unrealon_llm/src/llm_logging/llm_events.py +0 -107
- unrealon_llm/src/llm_logging/llm_logger.py +0 -466
- unrealon_llm/src/managers/__init__.py +0 -15
- unrealon_llm/src/managers/cache_manager.py +0 -67
- unrealon_llm/src/managers/cost_manager.py +0 -107
- unrealon_llm/src/managers/request_manager.py +0 -298
- unrealon_llm/src/modules/__init__.py +0 -0
- unrealon_llm/src/modules/html_processor/__init__.py +0 -25
- unrealon_llm/src/modules/html_processor/base_processor.py +0 -415
- unrealon_llm/src/modules/html_processor/details_processor.py +0 -85
- unrealon_llm/src/modules/html_processor/listing_processor.py +0 -91
- unrealon_llm/src/modules/html_processor/models/__init__.py +0 -20
- unrealon_llm/src/modules/html_processor/models/processing_models.py +0 -40
- unrealon_llm/src/modules/html_processor/models/universal_model.py +0 -56
- unrealon_llm/src/modules/html_processor/processor.py +0 -102
- unrealon_llm/src/modules/llm/__init__.py +0 -0
- unrealon_llm/src/modules/translator/__init__.py +0 -0
- unrealon_llm/src/provider.py +0 -116
- unrealon_llm/src/utils/__init__.py +0 -95
- unrealon_llm/src/utils/common.py +0 -64
- unrealon_llm/src/utils/data_extractor.py +0 -188
- unrealon_llm/src/utils/html_cleaner.py +0 -767
- unrealon_llm/src/utils/language_detector.py +0 -308
- unrealon_llm/src/utils/models_cache.py +0 -592
- unrealon_llm/src/utils/smart_counter.py +0 -229
- unrealon_llm/src/utils/token_counter.py +0 -189
- unrealon_sdk/README.md +0 -25
- unrealon_sdk/__init__.py +0 -30
- unrealon_sdk/pyproject.toml +0 -231
- unrealon_sdk/src/__init__.py +0 -150
- unrealon_sdk/src/cli/__init__.py +0 -12
- unrealon_sdk/src/cli/commands/__init__.py +0 -22
- unrealon_sdk/src/cli/commands/benchmark.py +0 -42
- unrealon_sdk/src/cli/commands/diagnostics.py +0 -573
- unrealon_sdk/src/cli/commands/health.py +0 -46
- unrealon_sdk/src/cli/commands/integration.py +0 -498
- unrealon_sdk/src/cli/commands/reports.py +0 -43
- unrealon_sdk/src/cli/commands/security.py +0 -36
- unrealon_sdk/src/cli/commands/server.py +0 -483
- unrealon_sdk/src/cli/commands/servers.py +0 -56
- unrealon_sdk/src/cli/commands/tests.py +0 -55
- unrealon_sdk/src/cli/main.py +0 -126
- unrealon_sdk/src/cli/utils/reporter.py +0 -519
- unrealon_sdk/src/clients/openapi.yaml +0 -3347
- unrealon_sdk/src/clients/python_http/__init__.py +0 -3
- unrealon_sdk/src/clients/python_http/api_config.py +0 -228
- unrealon_sdk/src/clients/python_http/models/BaseModel.py +0 -12
- unrealon_sdk/src/clients/python_http/models/BroadcastDeliveryStats.py +0 -33
- unrealon_sdk/src/clients/python_http/models/BroadcastMessage.py +0 -17
- unrealon_sdk/src/clients/python_http/models/BroadcastMessageRequest.py +0 -35
- unrealon_sdk/src/clients/python_http/models/BroadcastPriority.py +0 -10
- unrealon_sdk/src/clients/python_http/models/BroadcastResponse.py +0 -21
- unrealon_sdk/src/clients/python_http/models/BroadcastResultResponse.py +0 -33
- unrealon_sdk/src/clients/python_http/models/BroadcastTarget.py +0 -11
- unrealon_sdk/src/clients/python_http/models/ConnectionStats.py +0 -27
- unrealon_sdk/src/clients/python_http/models/ConnectionsResponse.py +0 -21
- unrealon_sdk/src/clients/python_http/models/DeveloperMessageResponse.py +0 -23
- unrealon_sdk/src/clients/python_http/models/ErrorResponse.py +0 -25
- unrealon_sdk/src/clients/python_http/models/HTTPValidationError.py +0 -16
- unrealon_sdk/src/clients/python_http/models/HealthResponse.py +0 -23
- unrealon_sdk/src/clients/python_http/models/HealthStatus.py +0 -33
- unrealon_sdk/src/clients/python_http/models/LogLevel.py +0 -10
- unrealon_sdk/src/clients/python_http/models/LoggingRequest.py +0 -27
- unrealon_sdk/src/clients/python_http/models/LoggingResponse.py +0 -23
- unrealon_sdk/src/clients/python_http/models/MaintenanceMode.py +0 -9
- unrealon_sdk/src/clients/python_http/models/MaintenanceModeRequest.py +0 -33
- unrealon_sdk/src/clients/python_http/models/MaintenanceStatusResponse.py +0 -39
- unrealon_sdk/src/clients/python_http/models/ParserCommandRequest.py +0 -25
- unrealon_sdk/src/clients/python_http/models/ParserMessageResponse.py +0 -21
- unrealon_sdk/src/clients/python_http/models/ParserRegistrationRequest.py +0 -28
- unrealon_sdk/src/clients/python_http/models/ParserRegistrationResponse.py +0 -25
- unrealon_sdk/src/clients/python_http/models/ParserType.py +0 -10
- unrealon_sdk/src/clients/python_http/models/ProxyBlockRequest.py +0 -19
- unrealon_sdk/src/clients/python_http/models/ProxyEndpointResponse.py +0 -20
- unrealon_sdk/src/clients/python_http/models/ProxyListResponse.py +0 -19
- unrealon_sdk/src/clients/python_http/models/ProxyProvider.py +0 -10
- unrealon_sdk/src/clients/python_http/models/ProxyPurchaseRequest.py +0 -25
- unrealon_sdk/src/clients/python_http/models/ProxyResponse.py +0 -47
- unrealon_sdk/src/clients/python_http/models/ProxyRotationRequest.py +0 -23
- unrealon_sdk/src/clients/python_http/models/ProxyStatus.py +0 -10
- unrealon_sdk/src/clients/python_http/models/ProxyUsageRequest.py +0 -19
- unrealon_sdk/src/clients/python_http/models/ProxyUsageStatsResponse.py +0 -26
- unrealon_sdk/src/clients/python_http/models/ServiceRegistrationDto.py +0 -23
- unrealon_sdk/src/clients/python_http/models/ServiceStatsResponse.py +0 -31
- unrealon_sdk/src/clients/python_http/models/SessionStartRequest.py +0 -23
- unrealon_sdk/src/clients/python_http/models/SuccessResponse.py +0 -25
- unrealon_sdk/src/clients/python_http/models/SystemNotificationResponse.py +0 -23
- unrealon_sdk/src/clients/python_http/models/ValidationError.py +0 -18
- unrealon_sdk/src/clients/python_http/models/ValidationErrorResponse.py +0 -21
- unrealon_sdk/src/clients/python_http/models/WebSocketMetrics.py +0 -21
- unrealon_sdk/src/clients/python_http/models/__init__.py +0 -44
- unrealon_sdk/src/clients/python_http/services/None_service.py +0 -35
- unrealon_sdk/src/clients/python_http/services/ParserManagement_service.py +0 -190
- unrealon_sdk/src/clients/python_http/services/ProxyManagement_service.py +0 -289
- unrealon_sdk/src/clients/python_http/services/SocketLogging_service.py +0 -187
- unrealon_sdk/src/clients/python_http/services/SystemHealth_service.py +0 -119
- unrealon_sdk/src/clients/python_http/services/WebSocketAPI_service.py +0 -198
- unrealon_sdk/src/clients/python_http/services/__init__.py +0 -0
- unrealon_sdk/src/clients/python_http/services/admin_service.py +0 -125
- unrealon_sdk/src/clients/python_http/services/async_None_service.py +0 -35
- unrealon_sdk/src/clients/python_http/services/async_ParserManagement_service.py +0 -190
- unrealon_sdk/src/clients/python_http/services/async_ProxyManagement_service.py +0 -289
- unrealon_sdk/src/clients/python_http/services/async_SocketLogging_service.py +0 -189
- unrealon_sdk/src/clients/python_http/services/async_SystemHealth_service.py +0 -123
- unrealon_sdk/src/clients/python_http/services/async_WebSocketAPI_service.py +0 -200
- unrealon_sdk/src/clients/python_http/services/async_admin_service.py +0 -125
- unrealon_sdk/src/clients/python_websocket/__init__.py +0 -28
- unrealon_sdk/src/clients/python_websocket/client.py +0 -490
- unrealon_sdk/src/clients/python_websocket/events.py +0 -732
- unrealon_sdk/src/clients/python_websocket/example.py +0 -136
- unrealon_sdk/src/clients/python_websocket/types.py +0 -871
- unrealon_sdk/src/core/__init__.py +0 -64
- unrealon_sdk/src/core/client.py +0 -556
- unrealon_sdk/src/core/config.py +0 -465
- unrealon_sdk/src/core/exceptions.py +0 -239
- unrealon_sdk/src/core/metadata.py +0 -191
- unrealon_sdk/src/core/models.py +0 -142
- unrealon_sdk/src/core/types.py +0 -68
- unrealon_sdk/src/dto/__init__.py +0 -268
- unrealon_sdk/src/dto/authentication.py +0 -108
- unrealon_sdk/src/dto/cache.py +0 -208
- unrealon_sdk/src/dto/common.py +0 -19
- unrealon_sdk/src/dto/concurrency.py +0 -393
- unrealon_sdk/src/dto/events.py +0 -108
- unrealon_sdk/src/dto/health.py +0 -339
- unrealon_sdk/src/dto/load_balancing.py +0 -336
- unrealon_sdk/src/dto/logging.py +0 -230
- unrealon_sdk/src/dto/performance.py +0 -165
- unrealon_sdk/src/dto/rate_limiting.py +0 -295
- unrealon_sdk/src/dto/resource_pooling.py +0 -128
- unrealon_sdk/src/dto/structured_logging.py +0 -112
- unrealon_sdk/src/dto/task_scheduling.py +0 -121
- unrealon_sdk/src/dto/websocket.py +0 -55
- unrealon_sdk/src/enterprise/__init__.py +0 -59
- unrealon_sdk/src/enterprise/authentication.py +0 -401
- unrealon_sdk/src/enterprise/cache_manager.py +0 -578
- unrealon_sdk/src/enterprise/error_recovery.py +0 -494
- unrealon_sdk/src/enterprise/event_system.py +0 -549
- unrealon_sdk/src/enterprise/health_monitor.py +0 -747
- unrealon_sdk/src/enterprise/load_balancer.py +0 -964
- unrealon_sdk/src/enterprise/logging/__init__.py +0 -68
- unrealon_sdk/src/enterprise/logging/cleanup.py +0 -156
- unrealon_sdk/src/enterprise/logging/development.py +0 -744
- unrealon_sdk/src/enterprise/logging/service.py +0 -410
- unrealon_sdk/src/enterprise/multithreading_manager.py +0 -853
- unrealon_sdk/src/enterprise/performance_monitor.py +0 -539
- unrealon_sdk/src/enterprise/proxy_manager.py +0 -696
- unrealon_sdk/src/enterprise/rate_limiter.py +0 -652
- unrealon_sdk/src/enterprise/resource_pool.py +0 -763
- unrealon_sdk/src/enterprise/task_scheduler.py +0 -709
- unrealon_sdk/src/internal/__init__.py +0 -10
- unrealon_sdk/src/internal/command_router.py +0 -497
- unrealon_sdk/src/internal/connection_manager.py +0 -397
- unrealon_sdk/src/internal/http_client.py +0 -446
- unrealon_sdk/src/internal/websocket_client.py +0 -420
- unrealon_sdk/src/provider.py +0 -471
- unrealon_sdk/src/utils.py +0 -234
- /unrealon_browser/{src/cli → cli}/__init__.py +0 -0
- /unrealon_browser/{src/cli → cli}/interactive_mode.py +0 -0
- /unrealon_browser/{src/cli → cli}/main.py +0 -0
- /unrealon_browser/{src/core → core}/__init__.py +0 -0
- /unrealon_browser/{src/dto → dto}/__init__.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/config.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/core.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/dataclasses.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/detection.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/enums.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/statistics.py +0 -0
- /unrealon_browser/{src/managers → managers}/__init__.py +0 -0
- /unrealon_browser/{src/managers → managers}/stealth.py +0 -0
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Logger Service for UnrealOn Driver v3.0
|
|
3
|
-
|
|
4
|
-
Intelligent logging service with file rotation and structured output.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import logging
|
|
8
|
-
import sys
|
|
9
|
-
from pathlib import Path
|
|
10
|
-
from typing import Any, Optional
|
|
11
|
-
from datetime import datetime
|
|
12
|
-
|
|
13
|
-
from unrealon_driver.src.dto.services import LoggerConfig
|
|
14
|
-
from logging.handlers import RotatingFileHandler
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class LoggerService:
|
|
18
|
-
"""
|
|
19
|
-
📝 Logger Service - Intelligent Logging
|
|
20
|
-
|
|
21
|
-
Zero-configuration logging with:
|
|
22
|
-
- Console and file output
|
|
23
|
-
- Automatic log rotation
|
|
24
|
-
- Structured logging for production
|
|
25
|
-
- Integration with unrealon_sdk development logger
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
def __init__(
|
|
29
|
-
self,
|
|
30
|
-
config: LoggerConfig,
|
|
31
|
-
parser_id: str = "unknown",
|
|
32
|
-
parser_name: str = "UnrealOn Parser",
|
|
33
|
-
):
|
|
34
|
-
"""Initialize logger service."""
|
|
35
|
-
self.config = config
|
|
36
|
-
self.parser_id = parser_id
|
|
37
|
-
self.parser_name = parser_name
|
|
38
|
-
|
|
39
|
-
# Setup logger
|
|
40
|
-
self.logger = logging.getLogger(f"unrealon_driver.{parser_id}")
|
|
41
|
-
self._setup_logging()
|
|
42
|
-
|
|
43
|
-
def _setup_logging(self):
|
|
44
|
-
"""Setup logging configuration."""
|
|
45
|
-
# Clear any existing handlers
|
|
46
|
-
self.logger.handlers.clear()
|
|
47
|
-
|
|
48
|
-
# Set log level using Pydantic config
|
|
49
|
-
log_level = getattr(logging, self.config.log_level.value.upper())
|
|
50
|
-
self.logger.setLevel(log_level)
|
|
51
|
-
|
|
52
|
-
# Console handler
|
|
53
|
-
if self.config.console_output:
|
|
54
|
-
console_handler = logging.StreamHandler(sys.stdout)
|
|
55
|
-
console_handler.setLevel(log_level) # Use same level as main logger
|
|
56
|
-
|
|
57
|
-
# Console formatter (using standard format from config)
|
|
58
|
-
console_formatter = logging.Formatter(
|
|
59
|
-
fmt=self.config.log_format, datefmt=self.config.date_format
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
console_handler.setFormatter(console_formatter)
|
|
63
|
-
self.logger.addHandler(console_handler)
|
|
64
|
-
|
|
65
|
-
# File handler
|
|
66
|
-
if self.config.file_output:
|
|
67
|
-
log_dir = (
|
|
68
|
-
Path(self.config.log_dir)
|
|
69
|
-
if self.config.log_dir
|
|
70
|
-
else Path("system/logs")
|
|
71
|
-
)
|
|
72
|
-
log_dir.mkdir(parents=True, exist_ok=True)
|
|
73
|
-
|
|
74
|
-
log_file_name = self.config.log_file or f"{self.parser_id}.log"
|
|
75
|
-
log_file = log_dir / log_file_name
|
|
76
|
-
|
|
77
|
-
file_handler = RotatingFileHandler(
|
|
78
|
-
log_file,
|
|
79
|
-
maxBytes=self._parse_size(self.config.max_file_size),
|
|
80
|
-
backupCount=self.config.backup_count,
|
|
81
|
-
)
|
|
82
|
-
|
|
83
|
-
file_level = getattr(logging, self.config.log_level.value.upper())
|
|
84
|
-
file_handler.setLevel(file_level)
|
|
85
|
-
|
|
86
|
-
# File formatter (always use standard format)
|
|
87
|
-
file_formatter = logging.Formatter(
|
|
88
|
-
fmt=self.config.log_format, datefmt=self.config.date_format
|
|
89
|
-
)
|
|
90
|
-
|
|
91
|
-
file_handler.setFormatter(file_formatter)
|
|
92
|
-
self.logger.addHandler(file_handler)
|
|
93
|
-
|
|
94
|
-
# Initial log message
|
|
95
|
-
self.logger.info(
|
|
96
|
-
f"Logger initialized for {self.parser_name} ({self.parser_id})"
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
def _get_standard_formatter(self) -> logging.Formatter:
|
|
100
|
-
"""Get standard text formatter."""
|
|
101
|
-
format_str = (
|
|
102
|
-
self.config.format_string or "[{asctime}] {levelname} | {name} | {message}"
|
|
103
|
-
)
|
|
104
|
-
date_format = self.config.date_format or "%Y-%m-%d %H:%M:%S"
|
|
105
|
-
|
|
106
|
-
return logging.Formatter(format_str, datefmt=date_format, style="{")
|
|
107
|
-
|
|
108
|
-
def _get_colored_formatter(self) -> logging.Formatter:
|
|
109
|
-
"""Get colored formatter for console output."""
|
|
110
|
-
# Color codes
|
|
111
|
-
colors = {
|
|
112
|
-
"DEBUG": "\033[36m", # Cyan
|
|
113
|
-
"INFO": "\033[32m", # Green
|
|
114
|
-
"WARNING": "\033[33m", # Yellow
|
|
115
|
-
"ERROR": "\033[31m", # Red
|
|
116
|
-
"CRITICAL": "\033[35m", # Magenta
|
|
117
|
-
"RESET": "\033[0m", # Reset
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
class ColoredFormatter(logging.Formatter):
|
|
121
|
-
def format(self, record):
|
|
122
|
-
if record.levelname in colors:
|
|
123
|
-
record.levelname = (
|
|
124
|
-
f"{colors[record.levelname]}{record.levelname}{colors['RESET']}"
|
|
125
|
-
)
|
|
126
|
-
return super().format(record)
|
|
127
|
-
|
|
128
|
-
format_str = "[{asctime}] {levelname} | {name} | {message}"
|
|
129
|
-
return ColoredFormatter(format_str, datefmt="%H:%M:%S", style="{")
|
|
130
|
-
|
|
131
|
-
def _get_json_formatter(self) -> logging.Formatter:
|
|
132
|
-
"""Get JSON formatter for structured logging."""
|
|
133
|
-
import json
|
|
134
|
-
|
|
135
|
-
class JSONFormatter(logging.Formatter):
|
|
136
|
-
def format(self, record):
|
|
137
|
-
log_entry = {
|
|
138
|
-
"timestamp": datetime.utcnow().isoformat(),
|
|
139
|
-
"level": record.levelname,
|
|
140
|
-
"logger": record.name,
|
|
141
|
-
"message": record.getMessage(),
|
|
142
|
-
"parser_id": self.parser_id,
|
|
143
|
-
"parser_name": self.parser_name,
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
if record.exc_info:
|
|
147
|
-
log_entry["exception"] = self.formatException(record.exc_info)
|
|
148
|
-
|
|
149
|
-
return json.dumps(log_entry)
|
|
150
|
-
|
|
151
|
-
return JSONFormatter()
|
|
152
|
-
|
|
153
|
-
def _parse_size(self, size_str: str) -> int:
|
|
154
|
-
"""Parse size string like '10MB' to bytes."""
|
|
155
|
-
size_str = size_str.upper().strip()
|
|
156
|
-
|
|
157
|
-
if size_str.endswith("KB"):
|
|
158
|
-
return int(size_str[:-2]) * 1024
|
|
159
|
-
elif size_str.endswith("MB"):
|
|
160
|
-
return int(size_str[:-2]) * 1024 * 1024
|
|
161
|
-
elif size_str.endswith("GB"):
|
|
162
|
-
return int(size_str[:-2]) * 1024 * 1024 * 1024
|
|
163
|
-
else:
|
|
164
|
-
return int(size_str) # Assume bytes
|
|
165
|
-
|
|
166
|
-
# ==========================================
|
|
167
|
-
# LOGGING METHODS
|
|
168
|
-
# ==========================================
|
|
169
|
-
|
|
170
|
-
def debug(self, message: str, **kwargs):
|
|
171
|
-
"""Log debug message."""
|
|
172
|
-
self.logger.debug(message, **kwargs)
|
|
173
|
-
|
|
174
|
-
def info(self, message: str, **kwargs):
|
|
175
|
-
"""Log info message."""
|
|
176
|
-
self.logger.info(message, **kwargs)
|
|
177
|
-
|
|
178
|
-
def warning(self, message: str, **kwargs):
|
|
179
|
-
"""Log warning message."""
|
|
180
|
-
self.logger.warning(message, **kwargs)
|
|
181
|
-
|
|
182
|
-
def error(self, message: str, **kwargs):
|
|
183
|
-
"""Log error message."""
|
|
184
|
-
self.logger.error(message, **kwargs)
|
|
185
|
-
|
|
186
|
-
def critical(self, message: str, **kwargs):
|
|
187
|
-
"""Log critical message."""
|
|
188
|
-
self.logger.critical(message, **kwargs)
|
|
189
|
-
|
|
190
|
-
def exception(self, message: str, **kwargs):
|
|
191
|
-
"""Log exception with traceback."""
|
|
192
|
-
self.logger.exception(message, **kwargs)
|
|
193
|
-
|
|
194
|
-
# ==========================================
|
|
195
|
-
# SERVICE MANAGEMENT
|
|
196
|
-
# ==========================================
|
|
197
|
-
|
|
198
|
-
def _parse_size(self, size_str: str) -> int:
|
|
199
|
-
"""Parse size string like '10MB' to bytes."""
|
|
200
|
-
size_str = size_str.upper().strip()
|
|
201
|
-
|
|
202
|
-
if size_str.endswith("KB"):
|
|
203
|
-
return int(size_str[:-2]) * 1024
|
|
204
|
-
elif size_str.endswith("MB"):
|
|
205
|
-
return int(size_str[:-2]) * 1024 * 1024
|
|
206
|
-
elif size_str.endswith("GB"):
|
|
207
|
-
return int(size_str[:-2]) * 1024 * 1024 * 1024
|
|
208
|
-
else:
|
|
209
|
-
# Assume bytes if no unit
|
|
210
|
-
return int(size_str)
|
|
211
|
-
|
|
212
|
-
def health_check(self) -> dict:
|
|
213
|
-
"""Check logger service health."""
|
|
214
|
-
return {
|
|
215
|
-
"status": "healthy",
|
|
216
|
-
"log_level": self.logger.level,
|
|
217
|
-
"handlers_count": len(self.logger.handlers),
|
|
218
|
-
"console_output": self.config.console_output,
|
|
219
|
-
"file_output": self.config.file_output,
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
async def cleanup(self):
|
|
223
|
-
"""Clean up logger resources."""
|
|
224
|
-
# Close all handlers
|
|
225
|
-
for handler in self.logger.handlers[:]:
|
|
226
|
-
handler.close()
|
|
227
|
-
self.logger.removeHandler(handler)
|
|
228
|
-
|
|
229
|
-
self.logger.info("Logger service cleanup completed")
|
|
230
|
-
|
|
231
|
-
def __repr__(self) -> str:
|
|
232
|
-
return f"<LoggerService(parser_id={self.parser_id}, level={self.logger.level})>"
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Metrics Service for UnrealOn Driver v3.0
|
|
3
|
-
|
|
4
|
-
Built-in metrics and monitoring with Prometheus integration.
|
|
5
|
-
Includes full event logging through SDK DevelopmentLogger.
|
|
6
|
-
|
|
7
|
-
CRITICAL REQUIREMENTS COMPLIANCE:
|
|
8
|
-
- ✅ Absolute imports only
|
|
9
|
-
- ✅ Pydantic v2 models everywhere
|
|
10
|
-
- ✅ Complete type annotations
|
|
11
|
-
- ✅ Full unrealon_sdk integration
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
from typing import Any, Dict, Optional
|
|
15
|
-
|
|
16
|
-
from unrealon_sdk.src.enterprise.logging.development import get_development_logger
|
|
17
|
-
from unrealon_sdk.src.dto.logging import SDKContext, SDKEventType
|
|
18
|
-
|
|
19
|
-
from unrealon_driver.src.dto.services import MetricsConfig
|
|
20
|
-
from unrealon_driver.src.dto.events import DriverEventType
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class MetricsService:
|
|
24
|
-
"""
|
|
25
|
-
📊 Metrics Service - Built-in Monitoring
|
|
26
|
-
|
|
27
|
-
TODO: Full implementation with Prometheus integration
|
|
28
|
-
"""
|
|
29
|
-
|
|
30
|
-
def __init__(self, config: MetricsConfig, parser_id: str = "unknown"):
|
|
31
|
-
"""Initialize metrics service with full SDK integration."""
|
|
32
|
-
self.config = config
|
|
33
|
-
self.parser_id = parser_id
|
|
34
|
-
self._metrics_data = {}
|
|
35
|
-
|
|
36
|
-
# ✅ DEVELOPMENT LOGGER INTEGRATION (CRITICAL REQUIREMENT)
|
|
37
|
-
self.dev_logger = get_development_logger()
|
|
38
|
-
|
|
39
|
-
# Log initialization with development logger
|
|
40
|
-
if self.dev_logger:
|
|
41
|
-
self.dev_logger.log_info(
|
|
42
|
-
SDKEventType.COMPONENT_CREATED,
|
|
43
|
-
"Metrics service initialized",
|
|
44
|
-
context=SDKContext(
|
|
45
|
-
parser_id=self.parser_id,
|
|
46
|
-
component_name="Metrics",
|
|
47
|
-
layer_name="UnrealOn_Driver",
|
|
48
|
-
metadata={
|
|
49
|
-
"enabled": True,
|
|
50
|
-
"config": "auto-configured",
|
|
51
|
-
},
|
|
52
|
-
),
|
|
53
|
-
)
|
|
54
|
-
|
|
55
|
-
def record_operation(
|
|
56
|
-
self,
|
|
57
|
-
service: str,
|
|
58
|
-
operation: str,
|
|
59
|
-
duration: float,
|
|
60
|
-
result_count: int,
|
|
61
|
-
error: Optional[str] = None,
|
|
62
|
-
):
|
|
63
|
-
"""Record operation metrics with structured logging."""
|
|
64
|
-
# Collect metrics data
|
|
65
|
-
key = f"{service}_{operation}"
|
|
66
|
-
if key not in self._metrics_data:
|
|
67
|
-
self._metrics_data[key] = {
|
|
68
|
-
"count": 0,
|
|
69
|
-
"total_duration": 0.0,
|
|
70
|
-
"errors": 0,
|
|
71
|
-
"total_results": 0,
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
self._metrics_data[key]["count"] += 1
|
|
75
|
-
self._metrics_data[key]["total_duration"] += duration or 0.0
|
|
76
|
-
self._metrics_data[key]["total_results"] += result_count
|
|
77
|
-
|
|
78
|
-
if error:
|
|
79
|
-
self._metrics_data[key]["errors"] += 1
|
|
80
|
-
|
|
81
|
-
# Log error with SDK
|
|
82
|
-
if self.dev_logger:
|
|
83
|
-
self.dev_logger.log_error(
|
|
84
|
-
SDKEventType.ERROR_DETECTED,
|
|
85
|
-
f"Operation failed: {service}.{operation}",
|
|
86
|
-
context=SDKContext(
|
|
87
|
-
parser_id=self.parser_id,
|
|
88
|
-
component_name="Metrics",
|
|
89
|
-
layer_name="UnrealOn_Driver",
|
|
90
|
-
metadata={
|
|
91
|
-
"service": service,
|
|
92
|
-
"operation": operation,
|
|
93
|
-
"error": error,
|
|
94
|
-
"duration_ms": duration * 1000,
|
|
95
|
-
},
|
|
96
|
-
),
|
|
97
|
-
)
|
|
98
|
-
else:
|
|
99
|
-
# Log successful metrics collection
|
|
100
|
-
if self.dev_logger and self._metrics_data[key]["count"] % 10 == 0: # Log every 10th operation
|
|
101
|
-
self.dev_logger.log_info(
|
|
102
|
-
SDKEventType.PERFORMANCE_METRIC_COLLECTED,
|
|
103
|
-
f"Metrics collected for {service}.{operation}",
|
|
104
|
-
context=SDKContext(
|
|
105
|
-
parser_id=self.parser_id,
|
|
106
|
-
component_name="Metrics",
|
|
107
|
-
layer_name="UnrealOn_Driver",
|
|
108
|
-
metadata={
|
|
109
|
-
"service": service,
|
|
110
|
-
"operation": operation,
|
|
111
|
-
"total_count": self._metrics_data[key]["count"],
|
|
112
|
-
"avg_duration_ms": (self._metrics_data[key]["total_duration"] / self._metrics_data[key]["count"]) * 1000,
|
|
113
|
-
"total_results": self._metrics_data[key]["total_results"],
|
|
114
|
-
},
|
|
115
|
-
),
|
|
116
|
-
)
|
|
117
|
-
|
|
118
|
-
def record_test_execution(
|
|
119
|
-
self,
|
|
120
|
-
parser_id: str,
|
|
121
|
-
duration: float,
|
|
122
|
-
success: bool,
|
|
123
|
-
result_size: Optional[int] = None,
|
|
124
|
-
error: Optional[str] = None,
|
|
125
|
-
):
|
|
126
|
-
"""Record test execution metrics."""
|
|
127
|
-
key = "test_execution"
|
|
128
|
-
if key not in self._metrics_data:
|
|
129
|
-
self._metrics_data[key] = {
|
|
130
|
-
"total": 0,
|
|
131
|
-
"successful": 0,
|
|
132
|
-
"failed": 0,
|
|
133
|
-
"total_duration": 0.0,
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
self._metrics_data[key]["total"] += 1
|
|
137
|
-
self._metrics_data[key]["total_duration"] += duration
|
|
138
|
-
|
|
139
|
-
if success:
|
|
140
|
-
self._metrics_data[key]["successful"] += 1
|
|
141
|
-
else:
|
|
142
|
-
self._metrics_data[key]["failed"] += 1
|
|
143
|
-
|
|
144
|
-
def start_timer(self, name: str) -> float:
|
|
145
|
-
"""Start a timer and return start time."""
|
|
146
|
-
import time
|
|
147
|
-
|
|
148
|
-
return time.time()
|
|
149
|
-
|
|
150
|
-
def end_timer(self, name: str, start_time: float):
|
|
151
|
-
"""End a timer and record duration."""
|
|
152
|
-
import time
|
|
153
|
-
|
|
154
|
-
duration = time.time() - start_time
|
|
155
|
-
self.record_operation("timer", name, duration, 1)
|
|
156
|
-
|
|
157
|
-
def record_success(self, result_count: int = 1):
|
|
158
|
-
"""Record successful operation."""
|
|
159
|
-
self.record_operation("general", "success", 0.0, result_count)
|
|
160
|
-
|
|
161
|
-
def record_error(self, error_message: str):
|
|
162
|
-
"""Record error."""
|
|
163
|
-
self.record_operation("general", "error", 0.0, 0, error_message)
|
|
164
|
-
|
|
165
|
-
def health_check(self) -> dict:
|
|
166
|
-
"""Check metrics service health."""
|
|
167
|
-
return {
|
|
168
|
-
"status": "healthy" if self.config.enable_metrics else "disabled",
|
|
169
|
-
"collected_metrics": len(self._metrics_data),
|
|
170
|
-
"prometheus_enabled": getattr(self.config, 'prometheus_enabled', False),
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
def get_metrics_data(self) -> dict:
|
|
174
|
-
"""Get collected metrics data."""
|
|
175
|
-
return self._metrics_data.copy()
|
|
176
|
-
|
|
177
|
-
async def cleanup(self):
|
|
178
|
-
"""Clean up metrics resources."""
|
|
179
|
-
# TODO: Implement cleanup (e.g., flush metrics to storage)
|
|
180
|
-
pass
|
|
181
|
-
|
|
182
|
-
def __repr__(self) -> str:
|
|
183
|
-
return (
|
|
184
|
-
f"<MetricsService(parser_id={self.parser_id}, metrics_count={len(self._metrics_data)})>"
|
|
185
|
-
)
|