tapps-agents 3.5.40__py3-none-any.whl → 3.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tapps_agents/__init__.py +2 -2
- tapps_agents/agents/__init__.py +22 -22
- tapps_agents/agents/analyst/__init__.py +5 -5
- tapps_agents/agents/architect/__init__.py +5 -5
- tapps_agents/agents/architect/agent.py +1033 -1033
- tapps_agents/agents/architect/pattern_detector.py +75 -75
- tapps_agents/agents/cleanup/__init__.py +7 -7
- tapps_agents/agents/cleanup/agent.py +445 -445
- tapps_agents/agents/debugger/__init__.py +7 -7
- tapps_agents/agents/debugger/agent.py +310 -310
- tapps_agents/agents/debugger/error_analyzer.py +437 -437
- tapps_agents/agents/designer/__init__.py +5 -5
- tapps_agents/agents/designer/agent.py +786 -786
- tapps_agents/agents/designer/visual_designer.py +638 -638
- tapps_agents/agents/documenter/__init__.py +7 -7
- tapps_agents/agents/documenter/agent.py +531 -531
- tapps_agents/agents/documenter/doc_generator.py +472 -472
- tapps_agents/agents/documenter/doc_validator.py +393 -393
- tapps_agents/agents/documenter/framework_doc_updater.py +493 -493
- tapps_agents/agents/enhancer/__init__.py +7 -7
- tapps_agents/agents/evaluator/__init__.py +7 -7
- tapps_agents/agents/evaluator/agent.py +443 -443
- tapps_agents/agents/evaluator/priority_evaluator.py +641 -641
- tapps_agents/agents/evaluator/quality_analyzer.py +147 -147
- tapps_agents/agents/evaluator/report_generator.py +344 -344
- tapps_agents/agents/evaluator/usage_analyzer.py +192 -192
- tapps_agents/agents/evaluator/workflow_analyzer.py +189 -189
- tapps_agents/agents/implementer/__init__.py +7 -7
- tapps_agents/agents/implementer/agent.py +798 -798
- tapps_agents/agents/implementer/auto_fix.py +1119 -1119
- tapps_agents/agents/implementer/code_generator.py +73 -73
- tapps_agents/agents/improver/__init__.py +1 -1
- tapps_agents/agents/improver/agent.py +753 -753
- tapps_agents/agents/ops/__init__.py +1 -1
- tapps_agents/agents/ops/agent.py +619 -619
- tapps_agents/agents/ops/dependency_analyzer.py +600 -600
- tapps_agents/agents/orchestrator/__init__.py +5 -5
- tapps_agents/agents/orchestrator/agent.py +522 -522
- tapps_agents/agents/planner/__init__.py +7 -7
- tapps_agents/agents/planner/agent.py +1127 -1127
- tapps_agents/agents/reviewer/__init__.py +24 -24
- tapps_agents/agents/reviewer/agent.py +3513 -3513
- tapps_agents/agents/reviewer/aggregator.py +213 -213
- tapps_agents/agents/reviewer/batch_review.py +448 -448
- tapps_agents/agents/reviewer/cache.py +443 -443
- tapps_agents/agents/reviewer/context7_enhancer.py +630 -630
- tapps_agents/agents/reviewer/context_detector.py +203 -203
- tapps_agents/agents/reviewer/docker_compose_validator.py +158 -158
- tapps_agents/agents/reviewer/dockerfile_validator.py +176 -176
- tapps_agents/agents/reviewer/error_handling.py +126 -126
- tapps_agents/agents/reviewer/feedback_generator.py +490 -490
- tapps_agents/agents/reviewer/influxdb_validator.py +316 -316
- tapps_agents/agents/reviewer/issue_tracking.py +169 -169
- tapps_agents/agents/reviewer/library_detector.py +295 -295
- tapps_agents/agents/reviewer/library_patterns.py +268 -268
- tapps_agents/agents/reviewer/maintainability_scorer.py +593 -593
- tapps_agents/agents/reviewer/metric_strategies.py +276 -276
- tapps_agents/agents/reviewer/mqtt_validator.py +160 -160
- tapps_agents/agents/reviewer/output_enhancer.py +105 -105
- tapps_agents/agents/reviewer/pattern_detector.py +241 -241
- tapps_agents/agents/reviewer/performance_scorer.py +357 -357
- tapps_agents/agents/reviewer/phased_review.py +516 -516
- tapps_agents/agents/reviewer/progressive_review.py +435 -435
- tapps_agents/agents/reviewer/react_scorer.py +331 -331
- tapps_agents/agents/reviewer/score_constants.py +228 -228
- tapps_agents/agents/reviewer/score_validator.py +507 -507
- tapps_agents/agents/reviewer/scorer_registry.py +373 -373
- tapps_agents/agents/reviewer/scoring.py +1566 -1566
- tapps_agents/agents/reviewer/service_discovery.py +534 -534
- tapps_agents/agents/reviewer/tools/__init__.py +41 -41
- tapps_agents/agents/reviewer/tools/parallel_executor.py +581 -581
- tapps_agents/agents/reviewer/tools/ruff_grouping.py +250 -250
- tapps_agents/agents/reviewer/tools/scoped_mypy.py +284 -284
- tapps_agents/agents/reviewer/typescript_scorer.py +1142 -1142
- tapps_agents/agents/reviewer/validation.py +208 -208
- tapps_agents/agents/reviewer/websocket_validator.py +132 -132
- tapps_agents/agents/tester/__init__.py +7 -7
- tapps_agents/agents/tester/accessibility_auditor.py +309 -309
- tapps_agents/agents/tester/agent.py +1080 -1080
- tapps_agents/agents/tester/batch_generator.py +54 -54
- tapps_agents/agents/tester/context_learner.py +51 -51
- tapps_agents/agents/tester/coverage_analyzer.py +386 -386
- tapps_agents/agents/tester/coverage_test_generator.py +290 -290
- tapps_agents/agents/tester/debug_enhancer.py +238 -238
- tapps_agents/agents/tester/device_emulator.py +241 -241
- tapps_agents/agents/tester/integration_generator.py +62 -62
- tapps_agents/agents/tester/network_recorder.py +300 -300
- tapps_agents/agents/tester/performance_monitor.py +320 -320
- tapps_agents/agents/tester/test_fixer.py +316 -316
- tapps_agents/agents/tester/test_generator.py +632 -632
- tapps_agents/agents/tester/trace_manager.py +234 -234
- tapps_agents/agents/tester/visual_regression.py +291 -291
- tapps_agents/analysis/pattern_detector.py +36 -36
- tapps_agents/beads/hydration.py +213 -213
- tapps_agents/beads/parse.py +32 -32
- tapps_agents/beads/specs.py +206 -206
- tapps_agents/cli/__init__.py +9 -9
- tapps_agents/cli/__main__.py +8 -8
- tapps_agents/cli/base.py +478 -478
- tapps_agents/cli/command_classifier.py +72 -72
- tapps_agents/cli/commands/__init__.py +2 -2
- tapps_agents/cli/commands/analyst.py +173 -173
- tapps_agents/cli/commands/architect.py +109 -109
- tapps_agents/cli/commands/cleanup_agent.py +92 -92
- tapps_agents/cli/commands/common.py +126 -126
- tapps_agents/cli/commands/debugger.py +90 -90
- tapps_agents/cli/commands/designer.py +112 -112
- tapps_agents/cli/commands/documenter.py +136 -136
- tapps_agents/cli/commands/enhancer.py +110 -110
- tapps_agents/cli/commands/evaluator.py +255 -255
- tapps_agents/cli/commands/health.py +665 -665
- tapps_agents/cli/commands/implementer.py +301 -301
- tapps_agents/cli/commands/improver.py +91 -91
- tapps_agents/cli/commands/knowledge.py +111 -111
- tapps_agents/cli/commands/learning.py +172 -172
- tapps_agents/cli/commands/observability.py +283 -283
- tapps_agents/cli/commands/ops.py +135 -135
- tapps_agents/cli/commands/orchestrator.py +116 -116
- tapps_agents/cli/commands/planner.py +237 -237
- tapps_agents/cli/commands/reviewer.py +1872 -1872
- tapps_agents/cli/commands/status.py +285 -285
- tapps_agents/cli/commands/task.py +227 -219
- tapps_agents/cli/commands/tester.py +191 -191
- tapps_agents/cli/commands/top_level.py +3586 -3586
- tapps_agents/cli/feedback.py +936 -936
- tapps_agents/cli/formatters.py +608 -608
- tapps_agents/cli/help/__init__.py +7 -7
- tapps_agents/cli/help/static_help.py +425 -425
- tapps_agents/cli/network_detection.py +110 -110
- tapps_agents/cli/output_compactor.py +274 -274
- tapps_agents/cli/parsers/__init__.py +2 -2
- tapps_agents/cli/parsers/analyst.py +186 -186
- tapps_agents/cli/parsers/architect.py +167 -167
- tapps_agents/cli/parsers/cleanup_agent.py +228 -228
- tapps_agents/cli/parsers/debugger.py +116 -116
- tapps_agents/cli/parsers/designer.py +182 -182
- tapps_agents/cli/parsers/documenter.py +134 -134
- tapps_agents/cli/parsers/enhancer.py +113 -113
- tapps_agents/cli/parsers/evaluator.py +213 -213
- tapps_agents/cli/parsers/implementer.py +168 -168
- tapps_agents/cli/parsers/improver.py +132 -132
- tapps_agents/cli/parsers/ops.py +159 -159
- tapps_agents/cli/parsers/orchestrator.py +98 -98
- tapps_agents/cli/parsers/planner.py +145 -145
- tapps_agents/cli/parsers/reviewer.py +462 -462
- tapps_agents/cli/parsers/tester.py +124 -124
- tapps_agents/cli/progress_heartbeat.py +254 -254
- tapps_agents/cli/streaming_progress.py +336 -336
- tapps_agents/cli/utils/__init__.py +6 -6
- tapps_agents/cli/utils/agent_lifecycle.py +48 -48
- tapps_agents/cli/utils/error_formatter.py +82 -82
- tapps_agents/cli/utils/error_recovery.py +188 -188
- tapps_agents/cli/utils/output_handler.py +59 -59
- tapps_agents/cli/utils/prompt_enhancer.py +319 -319
- tapps_agents/cli/validators/__init__.py +9 -9
- tapps_agents/cli/validators/command_validator.py +81 -81
- tapps_agents/context7/__init__.py +112 -112
- tapps_agents/context7/agent_integration.py +869 -869
- tapps_agents/context7/analytics.py +382 -382
- tapps_agents/context7/analytics_dashboard.py +299 -299
- tapps_agents/context7/async_cache.py +681 -681
- tapps_agents/context7/backup_client.py +958 -958
- tapps_agents/context7/cache_locking.py +194 -194
- tapps_agents/context7/cache_metadata.py +214 -214
- tapps_agents/context7/cache_prewarm.py +488 -488
- tapps_agents/context7/cache_structure.py +168 -168
- tapps_agents/context7/cache_warming.py +604 -604
- tapps_agents/context7/circuit_breaker.py +376 -376
- tapps_agents/context7/cleanup.py +461 -461
- tapps_agents/context7/commands.py +858 -858
- tapps_agents/context7/credential_validation.py +276 -276
- tapps_agents/context7/cross_reference_resolver.py +168 -168
- tapps_agents/context7/cross_references.py +424 -424
- tapps_agents/context7/doc_manager.py +225 -225
- tapps_agents/context7/fuzzy_matcher.py +369 -369
- tapps_agents/context7/kb_cache.py +404 -404
- tapps_agents/context7/language_detector.py +219 -219
- tapps_agents/context7/library_detector.py +725 -725
- tapps_agents/context7/lookup.py +738 -738
- tapps_agents/context7/metadata.py +258 -258
- tapps_agents/context7/refresh_queue.py +300 -300
- tapps_agents/context7/security.py +373 -373
- tapps_agents/context7/staleness_policies.py +278 -278
- tapps_agents/context7/tiles_integration.py +47 -47
- tapps_agents/continuous_bug_fix/__init__.py +20 -20
- tapps_agents/continuous_bug_fix/bug_finder.py +306 -306
- tapps_agents/continuous_bug_fix/bug_fix_coordinator.py +177 -177
- tapps_agents/continuous_bug_fix/commit_manager.py +178 -178
- tapps_agents/continuous_bug_fix/continuous_bug_fixer.py +322 -322
- tapps_agents/continuous_bug_fix/proactive_bug_finder.py +285 -285
- tapps_agents/core/__init__.py +298 -298
- tapps_agents/core/adaptive_cache_config.py +432 -432
- tapps_agents/core/agent_base.py +647 -647
- tapps_agents/core/agent_cache.py +466 -466
- tapps_agents/core/agent_learning.py +1865 -1865
- tapps_agents/core/analytics_dashboard.py +563 -563
- tapps_agents/core/analytics_enhancements.py +597 -597
- tapps_agents/core/anonymization.py +274 -274
- tapps_agents/core/artifact_context_builder.py +293 -0
- tapps_agents/core/ast_parser.py +228 -228
- tapps_agents/core/async_file_ops.py +402 -402
- tapps_agents/core/best_practice_consultant.py +299 -299
- tapps_agents/core/brownfield_analyzer.py +299 -299
- tapps_agents/core/brownfield_review.py +541 -541
- tapps_agents/core/browser_controller.py +513 -513
- tapps_agents/core/capability_registry.py +418 -418
- tapps_agents/core/change_impact_analyzer.py +190 -190
- tapps_agents/core/checkpoint_manager.py +377 -377
- tapps_agents/core/code_generator.py +329 -329
- tapps_agents/core/code_validator.py +276 -276
- tapps_agents/core/command_registry.py +327 -327
- tapps_agents/core/config.py +33 -0
- tapps_agents/core/context_gathering/__init__.py +2 -2
- tapps_agents/core/context_gathering/repository_explorer.py +28 -28
- tapps_agents/core/context_intelligence/__init__.py +2 -2
- tapps_agents/core/context_intelligence/relevance_scorer.py +24 -24
- tapps_agents/core/context_intelligence/token_budget_manager.py +27 -27
- tapps_agents/core/context_manager.py +240 -240
- tapps_agents/core/cursor_feedback_monitor.py +146 -146
- tapps_agents/core/cursor_verification.py +290 -290
- tapps_agents/core/customization_loader.py +280 -280
- tapps_agents/core/customization_schema.py +260 -260
- tapps_agents/core/customization_template.py +238 -238
- tapps_agents/core/debug_logger.py +124 -124
- tapps_agents/core/design_validator.py +298 -298
- tapps_agents/core/diagram_generator.py +226 -226
- tapps_agents/core/docker_utils.py +232 -232
- tapps_agents/core/document_generator.py +617 -617
- tapps_agents/core/domain_detector.py +30 -30
- tapps_agents/core/error_envelope.py +454 -454
- tapps_agents/core/error_handler.py +270 -270
- tapps_agents/core/estimation_tracker.py +189 -189
- tapps_agents/core/eval_prompt_engine.py +116 -116
- tapps_agents/core/evaluation_base.py +119 -119
- tapps_agents/core/evaluation_models.py +320 -320
- tapps_agents/core/evaluation_orchestrator.py +225 -225
- tapps_agents/core/evaluators/__init__.py +7 -7
- tapps_agents/core/evaluators/architectural_evaluator.py +205 -205
- tapps_agents/core/evaluators/behavioral_evaluator.py +160 -160
- tapps_agents/core/evaluators/performance_profile_evaluator.py +160 -160
- tapps_agents/core/evaluators/security_posture_evaluator.py +148 -148
- tapps_agents/core/evaluators/spec_compliance_evaluator.py +181 -181
- tapps_agents/core/exceptions.py +107 -107
- tapps_agents/core/expert_config_generator.py +293 -293
- tapps_agents/core/export_schema.py +202 -202
- tapps_agents/core/external_feedback_models.py +102 -102
- tapps_agents/core/external_feedback_storage.py +213 -213
- tapps_agents/core/fallback_strategy.py +314 -314
- tapps_agents/core/feedback_analyzer.py +162 -162
- tapps_agents/core/feedback_collector.py +178 -178
- tapps_agents/core/git_operations.py +445 -445
- tapps_agents/core/hardware_profiler.py +151 -151
- tapps_agents/core/instructions.py +324 -324
- tapps_agents/core/io_guardrails.py +69 -69
- tapps_agents/core/issue_manifest.py +249 -249
- tapps_agents/core/issue_schema.py +139 -139
- tapps_agents/core/json_utils.py +128 -128
- tapps_agents/core/knowledge_graph.py +446 -446
- tapps_agents/core/language_detector.py +296 -296
- tapps_agents/core/learning_confidence.py +242 -242
- tapps_agents/core/learning_dashboard.py +246 -246
- tapps_agents/core/learning_decision.py +384 -384
- tapps_agents/core/learning_explainability.py +578 -578
- tapps_agents/core/learning_export.py +287 -287
- tapps_agents/core/learning_integration.py +228 -228
- tapps_agents/core/llm_behavior.py +232 -232
- tapps_agents/core/long_duration_support.py +786 -786
- tapps_agents/core/mcp_setup.py +106 -106
- tapps_agents/core/memory_integration.py +396 -396
- tapps_agents/core/meta_learning.py +666 -666
- tapps_agents/core/module_path_sanitizer.py +199 -199
- tapps_agents/core/multi_agent_orchestrator.py +382 -382
- tapps_agents/core/network_errors.py +125 -125
- tapps_agents/core/nfr_validator.py +336 -336
- tapps_agents/core/offline_mode.py +158 -158
- tapps_agents/core/output_contracts.py +300 -300
- tapps_agents/core/output_formatter.py +300 -300
- tapps_agents/core/path_normalizer.py +174 -174
- tapps_agents/core/path_validator.py +322 -322
- tapps_agents/core/pattern_library.py +250 -250
- tapps_agents/core/performance_benchmark.py +301 -301
- tapps_agents/core/performance_monitor.py +184 -184
- tapps_agents/core/playwright_mcp_controller.py +771 -771
- tapps_agents/core/policy_loader.py +135 -135
- tapps_agents/core/progress.py +166 -166
- tapps_agents/core/project_profile.py +354 -354
- tapps_agents/core/project_type_detector.py +454 -454
- tapps_agents/core/prompt_base.py +223 -223
- tapps_agents/core/prompt_learning/__init__.py +2 -2
- tapps_agents/core/prompt_learning/learning_loop.py +24 -24
- tapps_agents/core/prompt_learning/project_prompt_store.py +25 -25
- tapps_agents/core/prompt_learning/skills_prompt_analyzer.py +35 -35
- tapps_agents/core/prompt_optimization/__init__.py +6 -6
- tapps_agents/core/prompt_optimization/ab_tester.py +114 -114
- tapps_agents/core/prompt_optimization/correlation_analyzer.py +160 -160
- tapps_agents/core/prompt_optimization/progressive_refiner.py +129 -129
- tapps_agents/core/prompt_optimization/prompt_library.py +37 -37
- tapps_agents/core/requirements_evaluator.py +431 -431
- tapps_agents/core/resource_aware_executor.py +449 -449
- tapps_agents/core/resource_monitor.py +343 -343
- tapps_agents/core/resume_handler.py +298 -298
- tapps_agents/core/retry_handler.py +197 -197
- tapps_agents/core/review_checklists.py +479 -479
- tapps_agents/core/role_loader.py +201 -201
- tapps_agents/core/role_template_loader.py +201 -201
- tapps_agents/core/runtime_mode.py +60 -60
- tapps_agents/core/security_scanner.py +342 -342
- tapps_agents/core/skill_agent_registry.py +194 -194
- tapps_agents/core/skill_integration.py +208 -208
- tapps_agents/core/skill_loader.py +492 -492
- tapps_agents/core/skill_template.py +341 -341
- tapps_agents/core/skill_validator.py +478 -478
- tapps_agents/core/stack_analyzer.py +35 -35
- tapps_agents/core/startup.py +174 -174
- tapps_agents/core/storage_manager.py +397 -397
- tapps_agents/core/storage_models.py +166 -166
- tapps_agents/core/story_evaluator.py +410 -410
- tapps_agents/core/subprocess_utils.py +170 -170
- tapps_agents/core/task_duration.py +296 -296
- tapps_agents/core/task_memory.py +582 -582
- tapps_agents/core/task_state.py +226 -226
- tapps_agents/core/tech_stack_priorities.py +208 -208
- tapps_agents/core/temp_directory.py +194 -194
- tapps_agents/core/template_merger.py +600 -600
- tapps_agents/core/template_selector.py +280 -280
- tapps_agents/core/test_generator.py +286 -286
- tapps_agents/core/tiered_context.py +253 -253
- tapps_agents/core/token_monitor.py +345 -345
- tapps_agents/core/traceability.py +254 -254
- tapps_agents/core/trajectory_tracker.py +50 -50
- tapps_agents/core/unicode_safe.py +143 -143
- tapps_agents/core/unified_cache_config.py +170 -170
- tapps_agents/core/unified_state.py +324 -324
- tapps_agents/core/validate_cursor_setup.py +237 -237
- tapps_agents/core/validation_registry.py +136 -136
- tapps_agents/core/validators/__init__.py +4 -4
- tapps_agents/core/validators/python_validator.py +87 -87
- tapps_agents/core/verification_agent.py +90 -90
- tapps_agents/core/visual_feedback.py +644 -644
- tapps_agents/core/workflow_validator.py +197 -197
- tapps_agents/core/worktree.py +367 -367
- tapps_agents/docker/__init__.py +10 -10
- tapps_agents/docker/analyzer.py +186 -186
- tapps_agents/docker/debugger.py +229 -229
- tapps_agents/docker/error_patterns.py +216 -216
- tapps_agents/epic/__init__.py +22 -22
- tapps_agents/epic/beads_sync.py +115 -115
- tapps_agents/epic/markdown_sync.py +105 -105
- tapps_agents/epic/models.py +96 -96
- tapps_agents/experts/__init__.py +163 -163
- tapps_agents/experts/agent_integration.py +243 -243
- tapps_agents/experts/auto_generator.py +331 -331
- tapps_agents/experts/base_expert.py +536 -536
- tapps_agents/experts/builtin_registry.py +261 -261
- tapps_agents/experts/business_metrics.py +565 -565
- tapps_agents/experts/cache.py +266 -266
- tapps_agents/experts/confidence_breakdown.py +306 -306
- tapps_agents/experts/confidence_calculator.py +336 -336
- tapps_agents/experts/confidence_metrics.py +236 -236
- tapps_agents/experts/domain_config.py +311 -311
- tapps_agents/experts/domain_detector.py +550 -550
- tapps_agents/experts/domain_utils.py +84 -84
- tapps_agents/experts/expert_config.py +113 -113
- tapps_agents/experts/expert_engine.py +465 -465
- tapps_agents/experts/expert_registry.py +744 -744
- tapps_agents/experts/expert_synthesizer.py +70 -70
- tapps_agents/experts/governance.py +197 -197
- tapps_agents/experts/history_logger.py +312 -312
- tapps_agents/experts/knowledge/README.md +180 -180
- tapps_agents/experts/knowledge/accessibility/accessible-forms.md +331 -331
- tapps_agents/experts/knowledge/accessibility/aria-patterns.md +344 -344
- tapps_agents/experts/knowledge/accessibility/color-contrast.md +285 -285
- tapps_agents/experts/knowledge/accessibility/keyboard-navigation.md +332 -332
- tapps_agents/experts/knowledge/accessibility/screen-readers.md +282 -282
- tapps_agents/experts/knowledge/accessibility/semantic-html.md +355 -355
- tapps_agents/experts/knowledge/accessibility/testing-accessibility.md +369 -369
- tapps_agents/experts/knowledge/accessibility/wcag-2.1.md +296 -296
- tapps_agents/experts/knowledge/accessibility/wcag-2.2.md +211 -211
- tapps_agents/experts/knowledge/agent-learning/best-practices.md +715 -715
- tapps_agents/experts/knowledge/agent-learning/pattern-extraction.md +282 -282
- tapps_agents/experts/knowledge/agent-learning/prompt-optimization.md +320 -320
- tapps_agents/experts/knowledge/ai-frameworks/model-optimization.md +90 -90
- tapps_agents/experts/knowledge/ai-frameworks/openvino-patterns.md +260 -260
- tapps_agents/experts/knowledge/api-design-integration/api-gateway-patterns.md +309 -309
- tapps_agents/experts/knowledge/api-design-integration/api-security-patterns.md +521 -521
- tapps_agents/experts/knowledge/api-design-integration/api-versioning.md +421 -421
- tapps_agents/experts/knowledge/api-design-integration/async-protocol-patterns.md +61 -61
- tapps_agents/experts/knowledge/api-design-integration/contract-testing.md +221 -221
- tapps_agents/experts/knowledge/api-design-integration/external-api-integration.md +489 -489
- tapps_agents/experts/knowledge/api-design-integration/fastapi-patterns.md +360 -360
- tapps_agents/experts/knowledge/api-design-integration/fastapi-testing.md +262 -262
- tapps_agents/experts/knowledge/api-design-integration/graphql-patterns.md +582 -582
- tapps_agents/experts/knowledge/api-design-integration/grpc-best-practices.md +499 -499
- tapps_agents/experts/knowledge/api-design-integration/mqtt-patterns.md +455 -455
- tapps_agents/experts/knowledge/api-design-integration/rate-limiting.md +507 -507
- tapps_agents/experts/knowledge/api-design-integration/restful-api-design.md +618 -618
- tapps_agents/experts/knowledge/api-design-integration/websocket-patterns.md +480 -480
- tapps_agents/experts/knowledge/cloud-infrastructure/cloud-native-patterns.md +175 -175
- tapps_agents/experts/knowledge/cloud-infrastructure/container-health-checks.md +261 -261
- tapps_agents/experts/knowledge/cloud-infrastructure/containerization.md +222 -222
- tapps_agents/experts/knowledge/cloud-infrastructure/cost-optimization.md +122 -122
- tapps_agents/experts/knowledge/cloud-infrastructure/disaster-recovery.md +153 -153
- tapps_agents/experts/knowledge/cloud-infrastructure/dockerfile-patterns.md +285 -285
- tapps_agents/experts/knowledge/cloud-infrastructure/infrastructure-as-code.md +187 -187
- tapps_agents/experts/knowledge/cloud-infrastructure/kubernetes-patterns.md +253 -253
- tapps_agents/experts/knowledge/cloud-infrastructure/multi-cloud-strategies.md +155 -155
- tapps_agents/experts/knowledge/cloud-infrastructure/serverless-architecture.md +200 -200
- tapps_agents/experts/knowledge/code-quality-analysis/README.md +16 -16
- tapps_agents/experts/knowledge/code-quality-analysis/code-metrics.md +137 -137
- tapps_agents/experts/knowledge/code-quality-analysis/complexity-analysis.md +181 -181
- tapps_agents/experts/knowledge/code-quality-analysis/technical-debt-patterns.md +191 -191
- tapps_agents/experts/knowledge/data-privacy-compliance/anonymization.md +313 -313
- tapps_agents/experts/knowledge/data-privacy-compliance/ccpa.md +255 -255
- tapps_agents/experts/knowledge/data-privacy-compliance/consent-management.md +282 -282
- tapps_agents/experts/knowledge/data-privacy-compliance/data-minimization.md +275 -275
- tapps_agents/experts/knowledge/data-privacy-compliance/data-retention.md +297 -297
- tapps_agents/experts/knowledge/data-privacy-compliance/data-subject-rights.md +383 -383
- tapps_agents/experts/knowledge/data-privacy-compliance/encryption-privacy.md +285 -285
- tapps_agents/experts/knowledge/data-privacy-compliance/gdpr.md +344 -344
- tapps_agents/experts/knowledge/data-privacy-compliance/hipaa.md +385 -385
- tapps_agents/experts/knowledge/data-privacy-compliance/privacy-by-design.md +280 -280
- tapps_agents/experts/knowledge/database-data-management/acid-vs-cap.md +164 -164
- tapps_agents/experts/knowledge/database-data-management/backup-and-recovery.md +182 -182
- tapps_agents/experts/knowledge/database-data-management/data-modeling.md +172 -172
- tapps_agents/experts/knowledge/database-data-management/database-design.md +187 -187
- tapps_agents/experts/knowledge/database-data-management/flux-query-optimization.md +342 -342
- tapps_agents/experts/knowledge/database-data-management/influxdb-connection-patterns.md +432 -432
- tapps_agents/experts/knowledge/database-data-management/influxdb-patterns.md +442 -442
- tapps_agents/experts/knowledge/database-data-management/migration-strategies.md +216 -216
- tapps_agents/experts/knowledge/database-data-management/nosql-patterns.md +259 -259
- tapps_agents/experts/knowledge/database-data-management/scalability-patterns.md +184 -184
- tapps_agents/experts/knowledge/database-data-management/sql-optimization.md +175 -175
- tapps_agents/experts/knowledge/database-data-management/time-series-modeling.md +444 -444
- tapps_agents/experts/knowledge/development-workflow/README.md +16 -16
- tapps_agents/experts/knowledge/development-workflow/automation-best-practices.md +216 -216
- tapps_agents/experts/knowledge/development-workflow/build-strategies.md +198 -198
- tapps_agents/experts/knowledge/development-workflow/deployment-patterns.md +205 -205
- tapps_agents/experts/knowledge/development-workflow/git-workflows.md +205 -205
- tapps_agents/experts/knowledge/documentation-knowledge-management/README.md +16 -16
- tapps_agents/experts/knowledge/documentation-knowledge-management/api-documentation-patterns.md +231 -231
- tapps_agents/experts/knowledge/documentation-knowledge-management/documentation-standards.md +191 -191
- tapps_agents/experts/knowledge/documentation-knowledge-management/knowledge-management.md +171 -171
- tapps_agents/experts/knowledge/documentation-knowledge-management/technical-writing-guide.md +192 -192
- tapps_agents/experts/knowledge/observability-monitoring/alerting-patterns.md +461 -461
- tapps_agents/experts/knowledge/observability-monitoring/apm-tools.md +459 -459
- tapps_agents/experts/knowledge/observability-monitoring/distributed-tracing.md +367 -367
- tapps_agents/experts/knowledge/observability-monitoring/logging-strategies.md +478 -478
- tapps_agents/experts/knowledge/observability-monitoring/metrics-and-monitoring.md +510 -510
- tapps_agents/experts/knowledge/observability-monitoring/observability-best-practices.md +492 -492
- tapps_agents/experts/knowledge/observability-monitoring/open-telemetry.md +573 -573
- tapps_agents/experts/knowledge/observability-monitoring/slo-sli-sla.md +419 -419
- tapps_agents/experts/knowledge/performance/anti-patterns.md +284 -284
- tapps_agents/experts/knowledge/performance/api-performance.md +256 -256
- tapps_agents/experts/knowledge/performance/caching.md +327 -327
- tapps_agents/experts/knowledge/performance/database-performance.md +252 -252
- tapps_agents/experts/knowledge/performance/optimization-patterns.md +327 -327
- tapps_agents/experts/knowledge/performance/profiling.md +297 -297
- tapps_agents/experts/knowledge/performance/resource-management.md +293 -293
- tapps_agents/experts/knowledge/performance/scalability.md +306 -306
- tapps_agents/experts/knowledge/security/owasp-top10.md +209 -209
- tapps_agents/experts/knowledge/security/secure-coding-practices.md +207 -207
- tapps_agents/experts/knowledge/security/threat-modeling.md +220 -220
- tapps_agents/experts/knowledge/security/vulnerability-patterns.md +342 -342
- tapps_agents/experts/knowledge/software-architecture/docker-compose-patterns.md +314 -314
- tapps_agents/experts/knowledge/software-architecture/microservices-patterns.md +379 -379
- tapps_agents/experts/knowledge/software-architecture/service-communication.md +316 -316
- tapps_agents/experts/knowledge/testing/best-practices.md +310 -310
- tapps_agents/experts/knowledge/testing/coverage-analysis.md +293 -293
- tapps_agents/experts/knowledge/testing/mocking.md +256 -256
- tapps_agents/experts/knowledge/testing/test-automation.md +276 -276
- tapps_agents/experts/knowledge/testing/test-data.md +271 -271
- tapps_agents/experts/knowledge/testing/test-design-patterns.md +280 -280
- tapps_agents/experts/knowledge/testing/test-maintenance.md +236 -236
- tapps_agents/experts/knowledge/testing/test-strategies.md +311 -311
- tapps_agents/experts/knowledge/user-experience/information-architecture.md +325 -325
- tapps_agents/experts/knowledge/user-experience/interaction-design.md +363 -363
- tapps_agents/experts/knowledge/user-experience/prototyping.md +293 -293
- tapps_agents/experts/knowledge/user-experience/usability-heuristics.md +337 -337
- tapps_agents/experts/knowledge/user-experience/usability-testing.md +311 -311
- tapps_agents/experts/knowledge/user-experience/user-journeys.md +296 -296
- tapps_agents/experts/knowledge/user-experience/user-research.md +373 -373
- tapps_agents/experts/knowledge/user-experience/ux-principles.md +340 -340
- tapps_agents/experts/knowledge_freshness.py +321 -321
- tapps_agents/experts/knowledge_ingestion.py +438 -438
- tapps_agents/experts/knowledge_need_detector.py +93 -93
- tapps_agents/experts/knowledge_validator.py +382 -382
- tapps_agents/experts/observability.py +440 -440
- tapps_agents/experts/passive_notifier.py +238 -238
- tapps_agents/experts/proactive_orchestrator.py +32 -32
- tapps_agents/experts/rag_chunker.py +205 -205
- tapps_agents/experts/rag_embedder.py +152 -152
- tapps_agents/experts/rag_evaluation.py +299 -299
- tapps_agents/experts/rag_index.py +303 -303
- tapps_agents/experts/rag_metrics.py +293 -293
- tapps_agents/experts/rag_safety.py +263 -263
- tapps_agents/experts/report_generator.py +296 -296
- tapps_agents/experts/setup_wizard.py +441 -441
- tapps_agents/experts/simple_rag.py +431 -431
- tapps_agents/experts/vector_rag.py +354 -354
- tapps_agents/experts/weight_distributor.py +304 -304
- tapps_agents/health/__init__.py +24 -24
- tapps_agents/health/base.py +75 -75
- tapps_agents/health/checks/__init__.py +22 -22
- tapps_agents/health/checks/automation.py +127 -127
- tapps_agents/health/checks/context7_cache.py +210 -210
- tapps_agents/health/checks/environment.py +116 -116
- tapps_agents/health/checks/execution.py +170 -170
- tapps_agents/health/checks/knowledge_base.py +187 -187
- tapps_agents/health/checks/outcomes.py +324 -324
- tapps_agents/health/collector.py +280 -280
- tapps_agents/health/dashboard.py +137 -137
- tapps_agents/health/metrics.py +151 -151
- tapps_agents/health/orchestrator.py +271 -271
- tapps_agents/health/registry.py +166 -166
- tapps_agents/hooks/__init__.py +33 -33
- tapps_agents/hooks/config.py +140 -140
- tapps_agents/hooks/events.py +135 -135
- tapps_agents/hooks/executor.py +128 -128
- tapps_agents/hooks/manager.py +143 -143
- tapps_agents/integration/__init__.py +8 -8
- tapps_agents/integration/service_integrator.py +121 -121
- tapps_agents/integrations/__init__.py +10 -10
- tapps_agents/integrations/clawdbot.py +525 -525
- tapps_agents/integrations/memory_bridge.py +356 -356
- tapps_agents/mcp/__init__.py +18 -18
- tapps_agents/mcp/gateway.py +112 -112
- tapps_agents/mcp/servers/__init__.py +13 -13
- tapps_agents/mcp/servers/analysis.py +204 -204
- tapps_agents/mcp/servers/context7.py +198 -198
- tapps_agents/mcp/servers/filesystem.py +218 -218
- tapps_agents/mcp/servers/git.py +201 -201
- tapps_agents/mcp/tool_registry.py +115 -115
- tapps_agents/quality/__init__.py +54 -54
- tapps_agents/quality/coverage_analyzer.py +379 -379
- tapps_agents/quality/enforcement.py +82 -82
- tapps_agents/quality/gates/__init__.py +37 -37
- tapps_agents/quality/gates/approval_gate.py +255 -255
- tapps_agents/quality/gates/base.py +84 -84
- tapps_agents/quality/gates/exceptions.py +43 -43
- tapps_agents/quality/gates/policy_gate.py +195 -195
- tapps_agents/quality/gates/registry.py +239 -239
- tapps_agents/quality/gates/security_gate.py +156 -156
- tapps_agents/quality/quality_gates.py +369 -369
- tapps_agents/quality/secret_scanner.py +335 -335
- tapps_agents/session/__init__.py +19 -19
- tapps_agents/session/manager.py +256 -256
- tapps_agents/simple_mode/__init__.py +66 -66
- tapps_agents/simple_mode/agent_contracts.py +357 -357
- tapps_agents/simple_mode/beads_hooks.py +151 -151
- tapps_agents/simple_mode/code_snippet_handler.py +382 -382
- tapps_agents/simple_mode/documentation_manager.py +395 -395
- tapps_agents/simple_mode/documentation_reader.py +187 -187
- tapps_agents/simple_mode/file_inference.py +292 -292
- tapps_agents/simple_mode/framework_change_detector.py +268 -268
- tapps_agents/simple_mode/intent_parser.py +510 -510
- tapps_agents/simple_mode/learning_progression.py +358 -358
- tapps_agents/simple_mode/nl_handler.py +700 -700
- tapps_agents/simple_mode/onboarding.py +253 -253
- tapps_agents/simple_mode/orchestrators/__init__.py +38 -38
- tapps_agents/simple_mode/orchestrators/base.py +185 -185
- tapps_agents/simple_mode/orchestrators/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- tapps_agents/simple_mode/orchestrators/build_orchestrator.py +2700 -2667
- tapps_agents/simple_mode/orchestrators/deliverable_checklist.py +349 -349
- tapps_agents/simple_mode/orchestrators/enhance_orchestrator.py +53 -53
- tapps_agents/simple_mode/orchestrators/epic_orchestrator.py +122 -122
- tapps_agents/simple_mode/orchestrators/explore_orchestrator.py +184 -184
- tapps_agents/simple_mode/orchestrators/fix_orchestrator.py +723 -723
- tapps_agents/simple_mode/orchestrators/plan_analysis_orchestrator.py +206 -206
- tapps_agents/simple_mode/orchestrators/pr_orchestrator.py +237 -237
- tapps_agents/simple_mode/orchestrators/refactor_orchestrator.py +222 -222
- tapps_agents/simple_mode/orchestrators/requirements_tracer.py +262 -262
- tapps_agents/simple_mode/orchestrators/resume_orchestrator.py +210 -210
- tapps_agents/simple_mode/orchestrators/review_orchestrator.py +161 -161
- tapps_agents/simple_mode/orchestrators/test_orchestrator.py +82 -82
- tapps_agents/simple_mode/output_aggregator.py +340 -340
- tapps_agents/simple_mode/result_formatters.py +598 -598
- tapps_agents/simple_mode/step_dependencies.py +382 -382
- tapps_agents/simple_mode/step_results.py +276 -276
- tapps_agents/simple_mode/streaming.py +388 -388
- tapps_agents/simple_mode/variations.py +129 -129
- tapps_agents/simple_mode/visual_feedback.py +238 -238
- tapps_agents/simple_mode/zero_config.py +274 -274
- tapps_agents/suggestions/__init__.py +8 -8
- tapps_agents/suggestions/inline_suggester.py +52 -52
- tapps_agents/templates/__init__.py +8 -8
- tapps_agents/templates/microservice_generator.py +274 -274
- tapps_agents/utils/env_validator.py +291 -291
- tapps_agents/workflow/__init__.py +171 -171
- tapps_agents/workflow/acceptance_verifier.py +132 -132
- tapps_agents/workflow/agent_handlers/__init__.py +41 -41
- tapps_agents/workflow/agent_handlers/analyst_handler.py +75 -75
- tapps_agents/workflow/agent_handlers/architect_handler.py +107 -107
- tapps_agents/workflow/agent_handlers/base.py +84 -84
- tapps_agents/workflow/agent_handlers/debugger_handler.py +100 -100
- tapps_agents/workflow/agent_handlers/designer_handler.py +110 -110
- tapps_agents/workflow/agent_handlers/documenter_handler.py +94 -94
- tapps_agents/workflow/agent_handlers/implementer_handler.py +235 -235
- tapps_agents/workflow/agent_handlers/ops_handler.py +62 -62
- tapps_agents/workflow/agent_handlers/orchestrator_handler.py +43 -43
- tapps_agents/workflow/agent_handlers/planner_handler.py +98 -98
- tapps_agents/workflow/agent_handlers/registry.py +119 -119
- tapps_agents/workflow/agent_handlers/reviewer_handler.py +119 -119
- tapps_agents/workflow/agent_handlers/tester_handler.py +69 -69
- tapps_agents/workflow/analytics_accessor.py +337 -337
- tapps_agents/workflow/analytics_alerts.py +416 -416
- tapps_agents/workflow/analytics_dashboard_cursor.py +281 -281
- tapps_agents/workflow/analytics_dual_write.py +103 -103
- tapps_agents/workflow/analytics_integration.py +119 -119
- tapps_agents/workflow/analytics_query_parser.py +278 -278
- tapps_agents/workflow/analytics_visualizer.py +259 -259
- tapps_agents/workflow/artifact_helper.py +204 -204
- tapps_agents/workflow/audit_logger.py +263 -263
- tapps_agents/workflow/auto_execution_config.py +340 -340
- tapps_agents/workflow/auto_progression.py +586 -586
- tapps_agents/workflow/branch_cleanup.py +349 -349
- tapps_agents/workflow/checkpoint.py +256 -256
- tapps_agents/workflow/checkpoint_manager.py +178 -178
- tapps_agents/workflow/code_artifact.py +179 -179
- tapps_agents/workflow/common_enums.py +96 -96
- tapps_agents/workflow/confirmation_handler.py +130 -130
- tapps_agents/workflow/context_analyzer.py +222 -222
- tapps_agents/workflow/context_artifact.py +230 -230
- tapps_agents/workflow/cursor_chat.py +94 -94
- tapps_agents/workflow/cursor_executor.py +2337 -2196
- tapps_agents/workflow/cursor_skill_helper.py +516 -516
- tapps_agents/workflow/dependency_resolver.py +244 -244
- tapps_agents/workflow/design_artifact.py +156 -156
- tapps_agents/workflow/detector.py +751 -751
- tapps_agents/workflow/direct_execution_fallback.py +301 -301
- tapps_agents/workflow/docs_artifact.py +168 -168
- tapps_agents/workflow/enforcer.py +389 -389
- tapps_agents/workflow/enhancement_artifact.py +142 -142
- tapps_agents/workflow/error_recovery.py +806 -806
- tapps_agents/workflow/event_bus.py +183 -183
- tapps_agents/workflow/event_log.py +612 -612
- tapps_agents/workflow/events.py +63 -63
- tapps_agents/workflow/exceptions.py +43 -43
- tapps_agents/workflow/execution_graph.py +498 -498
- tapps_agents/workflow/execution_plan.py +126 -126
- tapps_agents/workflow/file_utils.py +186 -186
- tapps_agents/workflow/gate_evaluator.py +182 -182
- tapps_agents/workflow/gate_integration.py +200 -200
- tapps_agents/workflow/graph_visualizer.py +130 -130
- tapps_agents/workflow/health_checker.py +206 -206
- tapps_agents/workflow/logging_helper.py +243 -243
- tapps_agents/workflow/manifest.py +582 -582
- tapps_agents/workflow/marker_writer.py +250 -250
- tapps_agents/workflow/message_formatter.py +188 -188
- tapps_agents/workflow/messaging.py +325 -325
- tapps_agents/workflow/metadata_models.py +91 -91
- tapps_agents/workflow/metrics_integration.py +226 -226
- tapps_agents/workflow/migration_utils.py +116 -116
- tapps_agents/workflow/models.py +148 -111
- tapps_agents/workflow/nlp_config.py +198 -198
- tapps_agents/workflow/nlp_error_handler.py +207 -207
- tapps_agents/workflow/nlp_executor.py +163 -163
- tapps_agents/workflow/nlp_parser.py +528 -528
- tapps_agents/workflow/observability_dashboard.py +451 -451
- tapps_agents/workflow/observer.py +170 -170
- tapps_agents/workflow/ops_artifact.py +257 -257
- tapps_agents/workflow/output_passing.py +214 -214
- tapps_agents/workflow/parallel_executor.py +463 -463
- tapps_agents/workflow/planning_artifact.py +179 -179
- tapps_agents/workflow/preset_loader.py +285 -285
- tapps_agents/workflow/preset_recommender.py +270 -270
- tapps_agents/workflow/progress_logger.py +145 -145
- tapps_agents/workflow/progress_manager.py +303 -303
- tapps_agents/workflow/progress_monitor.py +186 -186
- tapps_agents/workflow/progress_updates.py +423 -423
- tapps_agents/workflow/quality_artifact.py +158 -158
- tapps_agents/workflow/quality_loopback.py +101 -101
- tapps_agents/workflow/recommender.py +387 -387
- tapps_agents/workflow/remediation_loop.py +166 -166
- tapps_agents/workflow/result_aggregator.py +300 -300
- tapps_agents/workflow/review_artifact.py +185 -185
- tapps_agents/workflow/schema_validator.py +522 -522
- tapps_agents/workflow/session_handoff.py +178 -178
- tapps_agents/workflow/skill_invoker.py +648 -648
- tapps_agents/workflow/state_manager.py +756 -756
- tapps_agents/workflow/state_persistence_config.py +331 -331
- tapps_agents/workflow/status_monitor.py +449 -449
- tapps_agents/workflow/step_checkpoint.py +314 -314
- tapps_agents/workflow/step_details.py +201 -201
- tapps_agents/workflow/story_models.py +147 -147
- tapps_agents/workflow/streaming.py +416 -416
- tapps_agents/workflow/suggestion_engine.py +552 -552
- tapps_agents/workflow/testing_artifact.py +186 -186
- tapps_agents/workflow/timeline.py +158 -158
- tapps_agents/workflow/token_integration.py +209 -209
- tapps_agents/workflow/validation.py +217 -217
- tapps_agents/workflow/visual_feedback.py +391 -391
- tapps_agents/workflow/workflow_chain.py +95 -95
- tapps_agents/workflow/workflow_summary.py +219 -219
- tapps_agents/workflow/worktree_manager.py +724 -724
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/METADATA +672 -672
- tapps_agents-3.6.0.dist-info/RECORD +758 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/licenses/LICENSE +22 -22
- tapps_agents/health/checks/outcomes.backup_20260204_064058.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +0 -324
- tapps_agents-3.5.40.dist-info/RECORD +0 -760
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/WHEEL +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/top_level.txt +0 -0
|
@@ -1,432 +1,432 @@
|
|
|
1
|
-
# InfluxDB Connection Patterns
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
This guide covers InfluxDB connection management, pooling, retry logic, and error handling patterns for HomeIQ and similar production applications.
|
|
6
|
-
|
|
7
|
-
## Connection Management
|
|
8
|
-
|
|
9
|
-
### Basic Connection Pattern
|
|
10
|
-
|
|
11
|
-
**Python (influxdb-client):**
|
|
12
|
-
```python
|
|
13
|
-
from influxdb_client import InfluxDBClient
|
|
14
|
-
|
|
15
|
-
client = InfluxDBClient(
|
|
16
|
-
url="http://localhost:8086",
|
|
17
|
-
token="your-token",
|
|
18
|
-
org="homeiq"
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
# Use client
|
|
22
|
-
write_api = client.write_api()
|
|
23
|
-
query_api = client.query_api()
|
|
24
|
-
|
|
25
|
-
# Cleanup
|
|
26
|
-
client.close()
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
**Best Practice:** Use context manager for automatic cleanup
|
|
30
|
-
```python
|
|
31
|
-
with InfluxDBClient(
|
|
32
|
-
url="http://localhost:8086",
|
|
33
|
-
token="your-token",
|
|
34
|
-
org="homeiq"
|
|
35
|
-
) as client:
|
|
36
|
-
write_api = client.write_api()
|
|
37
|
-
# Use write_api
|
|
38
|
-
# Automatically closed on exit
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### Connection Pooling
|
|
42
|
-
|
|
43
|
-
**Reuse Client Instance:**
|
|
44
|
-
```python
|
|
45
|
-
class InfluxDBService:
|
|
46
|
-
def __init__(self):
|
|
47
|
-
self.client = InfluxDBClient(
|
|
48
|
-
url=os.getenv("INFLUXDB_URL"),
|
|
49
|
-
token=os.getenv("INFLUXDB_TOKEN"),
|
|
50
|
-
org="homeiq",
|
|
51
|
-
timeout=30_000 # 30 seconds
|
|
52
|
-
)
|
|
53
|
-
self.write_api = self.client.write_api()
|
|
54
|
-
self.query_api = self.client.query_api()
|
|
55
|
-
|
|
56
|
-
def close(self):
|
|
57
|
-
self.client.close()
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
**Thread-Safe Pattern:**
|
|
61
|
-
```python
|
|
62
|
-
from threading import Lock
|
|
63
|
-
|
|
64
|
-
class ThreadSafeInfluxDBService:
|
|
65
|
-
_instance = None
|
|
66
|
-
_lock = Lock()
|
|
67
|
-
|
|
68
|
-
def __new__(cls):
|
|
69
|
-
if cls._instance is None:
|
|
70
|
-
with cls._lock:
|
|
71
|
-
if cls._instance is None:
|
|
72
|
-
cls._instance = super().__new__(cls)
|
|
73
|
-
cls._instance.client = InfluxDBClient(
|
|
74
|
-
url=os.getenv("INFLUXDB_URL"),
|
|
75
|
-
token=os.getenv("INFLUXDB_TOKEN"),
|
|
76
|
-
org="homeiq"
|
|
77
|
-
)
|
|
78
|
-
return cls._instance
|
|
79
|
-
|
|
80
|
-
@property
|
|
81
|
-
def write_api(self):
|
|
82
|
-
return self.client.write_api()
|
|
83
|
-
|
|
84
|
-
@property
|
|
85
|
-
def query_api(self):
|
|
86
|
-
return self.client.query_api()
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
## Retry Logic
|
|
90
|
-
|
|
91
|
-
### Basic Retry Pattern
|
|
92
|
-
|
|
93
|
-
**Using tenacity:**
|
|
94
|
-
```python
|
|
95
|
-
from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type
|
|
96
|
-
from influxdb_client.rest import ApiException
|
|
97
|
-
|
|
98
|
-
@retry(
|
|
99
|
-
stop=stop_after_attempt(3),
|
|
100
|
-
wait=wait_exponential(multiplier=1, min=2, max=10),
|
|
101
|
-
retry=retry_if_exception_type((ApiException, ConnectionError))
|
|
102
|
-
)
|
|
103
|
-
def write_with_retry(write_api, point):
|
|
104
|
-
try:
|
|
105
|
-
write_api.write(bucket="homeiq", record=point)
|
|
106
|
-
except ApiException as e:
|
|
107
|
-
logger.error(f"InfluxDB API error: {e}")
|
|
108
|
-
raise
|
|
109
|
-
except ConnectionError as e:
|
|
110
|
-
logger.error(f"Connection error: {e}")
|
|
111
|
-
raise
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
### Advanced Retry Pattern
|
|
115
|
-
|
|
116
|
-
**With exponential backoff and jitter:**
|
|
117
|
-
```python
|
|
118
|
-
from tenacity import (
|
|
119
|
-
retry,
|
|
120
|
-
stop_after_attempt,
|
|
121
|
-
wait_exponential,
|
|
122
|
-
retry_if_exception_type,
|
|
123
|
-
before_sleep_log
|
|
124
|
-
)
|
|
125
|
-
import logging
|
|
126
|
-
|
|
127
|
-
logger = logging.getLogger(__name__)
|
|
128
|
-
|
|
129
|
-
@retry(
|
|
130
|
-
stop=stop_after_attempt(5),
|
|
131
|
-
wait=wait_exponential(multiplier=1, min=2, max=30),
|
|
132
|
-
retry=retry_if_exception_type((ApiException, ConnectionError, TimeoutError)),
|
|
133
|
-
before_sleep=before_sleep_log(logger, logging.WARNING)
|
|
134
|
-
)
|
|
135
|
-
def write_with_advanced_retry(write_api, point):
|
|
136
|
-
write_api.write(bucket="homeiq", record=point)
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
### Circuit Breaker Pattern
|
|
140
|
-
|
|
141
|
-
**Prevent cascading failures:**
|
|
142
|
-
```python
|
|
143
|
-
from circuitbreaker import circuit
|
|
144
|
-
|
|
145
|
-
@circuit(failure_threshold=5, recovery_timeout=60)
|
|
146
|
-
def write_with_circuit_breaker(write_api, point):
|
|
147
|
-
try:
|
|
148
|
-
write_api.write(bucket="homeiq", record=point)
|
|
149
|
-
except Exception as e:
|
|
150
|
-
logger.error(f"Write failed: {e}")
|
|
151
|
-
raise
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
## Error Handling
|
|
155
|
-
|
|
156
|
-
### Connection Error Handling
|
|
157
|
-
|
|
158
|
-
```python
|
|
159
|
-
from influxdb_client import InfluxDBClient
|
|
160
|
-
from influxdb_client.rest import ApiException
|
|
161
|
-
import logging
|
|
162
|
-
|
|
163
|
-
logger = logging.getLogger(__name__)
|
|
164
|
-
|
|
165
|
-
def create_influxdb_client():
|
|
166
|
-
try:
|
|
167
|
-
client = InfluxDBClient(
|
|
168
|
-
url=os.getenv("INFLUXDB_URL"),
|
|
169
|
-
token=os.getenv("INFLUXDB_TOKEN"),
|
|
170
|
-
org="homeiq"
|
|
171
|
-
)
|
|
172
|
-
# Test connection
|
|
173
|
-
client.ping()
|
|
174
|
-
return client
|
|
175
|
-
except ApiException as e:
|
|
176
|
-
logger.error(f"Failed to connect to InfluxDB: {e}")
|
|
177
|
-
raise
|
|
178
|
-
except Exception as e:
|
|
179
|
-
logger.error(f"Unexpected error connecting to InfluxDB: {e}")
|
|
180
|
-
raise
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
### Write Error Handling
|
|
184
|
-
|
|
185
|
-
```python
|
|
186
|
-
def write_point_safe(write_api, point):
|
|
187
|
-
try:
|
|
188
|
-
write_api.write(bucket="homeiq", record=point)
|
|
189
|
-
except ApiException as e:
|
|
190
|
-
if e.status == 401:
|
|
191
|
-
logger.error("Authentication failed - check token")
|
|
192
|
-
elif e.status == 404:
|
|
193
|
-
logger.error("Bucket or organization not found")
|
|
194
|
-
elif e.status == 429:
|
|
195
|
-
logger.warning("Rate limit exceeded - backing off")
|
|
196
|
-
time.sleep(1)
|
|
197
|
-
else:
|
|
198
|
-
logger.error(f"InfluxDB API error: {e.status} - {e.reason}")
|
|
199
|
-
raise
|
|
200
|
-
except Exception as e:
|
|
201
|
-
logger.error(f"Unexpected write error: {e}")
|
|
202
|
-
raise
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
### Query Error Handling
|
|
206
|
-
|
|
207
|
-
```python
|
|
208
|
-
def query_safe(query_api, query):
|
|
209
|
-
try:
|
|
210
|
-
result = query_api.query(query)
|
|
211
|
-
return result
|
|
212
|
-
except ApiException as e:
|
|
213
|
-
if e.status == 400:
|
|
214
|
-
logger.error(f"Invalid Flux query: {e.reason}")
|
|
215
|
-
elif e.status == 401:
|
|
216
|
-
logger.error("Authentication failed - check token")
|
|
217
|
-
else:
|
|
218
|
-
logger.error(f"InfluxDB API error: {e.status} - {e.reason}")
|
|
219
|
-
raise
|
|
220
|
-
except Exception as e:
|
|
221
|
-
logger.error(f"Unexpected query error: {e}")
|
|
222
|
-
raise
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
## Async Patterns
|
|
226
|
-
|
|
227
|
-
### AsyncIO Pattern
|
|
228
|
-
|
|
229
|
-
```python
|
|
230
|
-
import asyncio
|
|
231
|
-
from influxdb_client_3 import InfluxDBClient3
|
|
232
|
-
|
|
233
|
-
async def write_async(points):
|
|
234
|
-
client = InfluxDBClient3(
|
|
235
|
-
host=os.getenv("INFLUXDB_HOST", "localhost:8086"),
|
|
236
|
-
token=os.getenv("INFLUXDB_TOKEN"),
|
|
237
|
-
database="homeiq"
|
|
238
|
-
)
|
|
239
|
-
|
|
240
|
-
try:
|
|
241
|
-
await client.write(record=points, database="homeiq")
|
|
242
|
-
finally:
|
|
243
|
-
await client.close()
|
|
244
|
-
|
|
245
|
-
# Usage
|
|
246
|
-
asyncio.run(write_async(points))
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
### Async Context Manager
|
|
250
|
-
|
|
251
|
-
```python
|
|
252
|
-
from contextlib import asynccontextmanager
|
|
253
|
-
|
|
254
|
-
@asynccontextmanager
|
|
255
|
-
async def async_influxdb_client():
|
|
256
|
-
client = InfluxDBClient3(
|
|
257
|
-
host=os.getenv("INFLUXDB_HOST"),
|
|
258
|
-
token=os.getenv("INFLUXDB_TOKEN"),
|
|
259
|
-
database="homeiq"
|
|
260
|
-
)
|
|
261
|
-
try:
|
|
262
|
-
yield client
|
|
263
|
-
finally:
|
|
264
|
-
await client.close()
|
|
265
|
-
|
|
266
|
-
# Usage
|
|
267
|
-
async def write_data(points):
|
|
268
|
-
async with async_influxdb_client() as client:
|
|
269
|
-
await client.write(record=points, database="homeiq")
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
## Batch Writing Patterns
|
|
273
|
-
|
|
274
|
-
### Basic Batch Write
|
|
275
|
-
|
|
276
|
-
```python
|
|
277
|
-
def write_batch(write_api, points, batch_size=5000):
|
|
278
|
-
for i in range(0, len(points), batch_size):
|
|
279
|
-
batch = points[i:i + batch_size]
|
|
280
|
-
try:
|
|
281
|
-
write_api.write(bucket="homeiq", record=batch)
|
|
282
|
-
except Exception as e:
|
|
283
|
-
logger.error(f"Batch write failed: {e}")
|
|
284
|
-
# Optionally: retry or store failed batch
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
### Buffered Batch Write
|
|
288
|
-
|
|
289
|
-
```python
|
|
290
|
-
from collections import deque
|
|
291
|
-
|
|
292
|
-
class BufferedInfluxDBWriter:
|
|
293
|
-
def __init__(self, write_api, batch_size=5000, flush_interval=60):
|
|
294
|
-
self.write_api = write_api
|
|
295
|
-
self.batch_size = batch_size
|
|
296
|
-
self.flush_interval = flush_interval
|
|
297
|
-
self.buffer = deque()
|
|
298
|
-
self.last_flush = time.time()
|
|
299
|
-
|
|
300
|
-
def add_point(self, point):
|
|
301
|
-
self.buffer.append(point)
|
|
302
|
-
|
|
303
|
-
# Flush if buffer is full
|
|
304
|
-
if len(self.buffer) >= self.batch_size:
|
|
305
|
-
self.flush()
|
|
306
|
-
|
|
307
|
-
# Flush if interval elapsed
|
|
308
|
-
if time.time() - self.last_flush >= self.flush_interval:
|
|
309
|
-
self.flush()
|
|
310
|
-
|
|
311
|
-
def flush(self):
|
|
312
|
-
if not self.buffer:
|
|
313
|
-
return
|
|
314
|
-
|
|
315
|
-
points = list(self.buffer)
|
|
316
|
-
self.buffer.clear()
|
|
317
|
-
|
|
318
|
-
try:
|
|
319
|
-
self.write_api.write(bucket="homeiq", record=points)
|
|
320
|
-
self.last_flush = time.time()
|
|
321
|
-
except Exception as e:
|
|
322
|
-
logger.error(f"Flush failed: {e}")
|
|
323
|
-
# Optionally: re-add points to buffer
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
## Health Checks
|
|
327
|
-
|
|
328
|
-
### Connection Health Check
|
|
329
|
-
|
|
330
|
-
```python
|
|
331
|
-
def check_influxdb_health(client):
|
|
332
|
-
try:
|
|
333
|
-
# Ping InfluxDB
|
|
334
|
-
health = client.health()
|
|
335
|
-
if health.status == "pass":
|
|
336
|
-
return True
|
|
337
|
-
return False
|
|
338
|
-
except Exception as e:
|
|
339
|
-
logger.error(f"Health check failed: {e}")
|
|
340
|
-
return False
|
|
341
|
-
```
|
|
342
|
-
|
|
343
|
-
### Readiness Check
|
|
344
|
-
|
|
345
|
-
```python
|
|
346
|
-
def check_influxdb_ready(client):
|
|
347
|
-
try:
|
|
348
|
-
# Query a simple test
|
|
349
|
-
query = 'from(bucket: "homeiq") |> range(start: -1m) |> limit(n: 1)'
|
|
350
|
-
result = client.query_api().query(query)
|
|
351
|
-
return True
|
|
352
|
-
except Exception as e:
|
|
353
|
-
logger.error(f"Readiness check failed: {e}")
|
|
354
|
-
return False
|
|
355
|
-
```
|
|
356
|
-
|
|
357
|
-
## Configuration Patterns
|
|
358
|
-
|
|
359
|
-
### Environment-Based Configuration
|
|
360
|
-
|
|
361
|
-
```python
|
|
362
|
-
import os
|
|
363
|
-
from influxdb_client import InfluxDBClient
|
|
364
|
-
|
|
365
|
-
def create_client_from_env():
|
|
366
|
-
return InfluxDBClient(
|
|
367
|
-
url=os.getenv("INFLUXDB_URL", "http://localhost:8086"),
|
|
368
|
-
token=os.getenv("INFLUXDB_TOKEN", ""),
|
|
369
|
-
org=os.getenv("INFLUXDB_ORG", "homeiq"),
|
|
370
|
-
timeout=int(os.getenv("INFLUXDB_TIMEOUT", "30000"))
|
|
371
|
-
)
|
|
372
|
-
```
|
|
373
|
-
|
|
374
|
-
### Configuration File Pattern
|
|
375
|
-
|
|
376
|
-
```python
|
|
377
|
-
import yaml
|
|
378
|
-
from influxdb_client import InfluxDBClient
|
|
379
|
-
|
|
380
|
-
def load_influxdb_config(config_path="config.yaml"):
|
|
381
|
-
with open(config_path) as f:
|
|
382
|
-
config = yaml.safe_load(f)
|
|
383
|
-
|
|
384
|
-
return InfluxDBClient(
|
|
385
|
-
url=config["influxdb"]["url"],
|
|
386
|
-
token=config["influxdb"]["token"],
|
|
387
|
-
org=config["influxdb"]["org"],
|
|
388
|
-
timeout=config["influxdb"].get("timeout", 30000)
|
|
389
|
-
)
|
|
390
|
-
```
|
|
391
|
-
|
|
392
|
-
## Testing Patterns
|
|
393
|
-
|
|
394
|
-
### Mock InfluxDB Client
|
|
395
|
-
|
|
396
|
-
```python
|
|
397
|
-
from unittest.mock import Mock, MagicMock
|
|
398
|
-
|
|
399
|
-
class MockInfluxDBClient:
|
|
400
|
-
def __init__(self):
|
|
401
|
-
self.write_api = Mock()
|
|
402
|
-
self.query_api = Mock()
|
|
403
|
-
self.ping = Mock(return_value={"status": "pass"})
|
|
404
|
-
|
|
405
|
-
def close(self):
|
|
406
|
-
pass
|
|
407
|
-
```
|
|
408
|
-
|
|
409
|
-
### Integration Test Fixture
|
|
410
|
-
|
|
411
|
-
```python
|
|
412
|
-
import pytest
|
|
413
|
-
from influxdb_client import InfluxDBClient
|
|
414
|
-
|
|
415
|
-
@pytest.fixture
|
|
416
|
-
def influxdb_client():
|
|
417
|
-
client = InfluxDBClient(
|
|
418
|
-
url=os.getenv("INFLUXDB_URL", "http://localhost:8086"),
|
|
419
|
-
token=os.getenv("INFLUXDB_TOKEN", "test-token"),
|
|
420
|
-
org="test"
|
|
421
|
-
)
|
|
422
|
-
yield client
|
|
423
|
-
# Cleanup test data
|
|
424
|
-
client.close()
|
|
425
|
-
```
|
|
426
|
-
|
|
427
|
-
## References
|
|
428
|
-
|
|
429
|
-
- [InfluxDB Python Client](https://github.com/influxdata/influxdb-client-python)
|
|
430
|
-
- [InfluxDB Connection Management](https://docs.influxdata.com/influxdb/v2.7/api-guide/client-libraries/python/)
|
|
431
|
-
- [Error Handling Best Practices](https://docs.influxdata.com/influxdb/v2.7/write-data/best-practices/)
|
|
432
|
-
|
|
1
|
+
# InfluxDB Connection Patterns
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This guide covers InfluxDB connection management, pooling, retry logic, and error handling patterns for HomeIQ and similar production applications.
|
|
6
|
+
|
|
7
|
+
## Connection Management
|
|
8
|
+
|
|
9
|
+
### Basic Connection Pattern
|
|
10
|
+
|
|
11
|
+
**Python (influxdb-client):**
|
|
12
|
+
```python
|
|
13
|
+
from influxdb_client import InfluxDBClient
|
|
14
|
+
|
|
15
|
+
client = InfluxDBClient(
|
|
16
|
+
url="http://localhost:8086",
|
|
17
|
+
token="your-token",
|
|
18
|
+
org="homeiq"
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
# Use client
|
|
22
|
+
write_api = client.write_api()
|
|
23
|
+
query_api = client.query_api()
|
|
24
|
+
|
|
25
|
+
# Cleanup
|
|
26
|
+
client.close()
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Best Practice:** Use context manager for automatic cleanup
|
|
30
|
+
```python
|
|
31
|
+
with InfluxDBClient(
|
|
32
|
+
url="http://localhost:8086",
|
|
33
|
+
token="your-token",
|
|
34
|
+
org="homeiq"
|
|
35
|
+
) as client:
|
|
36
|
+
write_api = client.write_api()
|
|
37
|
+
# Use write_api
|
|
38
|
+
# Automatically closed on exit
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Connection Pooling
|
|
42
|
+
|
|
43
|
+
**Reuse Client Instance:**
|
|
44
|
+
```python
|
|
45
|
+
class InfluxDBService:
|
|
46
|
+
def __init__(self):
|
|
47
|
+
self.client = InfluxDBClient(
|
|
48
|
+
url=os.getenv("INFLUXDB_URL"),
|
|
49
|
+
token=os.getenv("INFLUXDB_TOKEN"),
|
|
50
|
+
org="homeiq",
|
|
51
|
+
timeout=30_000 # 30 seconds
|
|
52
|
+
)
|
|
53
|
+
self.write_api = self.client.write_api()
|
|
54
|
+
self.query_api = self.client.query_api()
|
|
55
|
+
|
|
56
|
+
def close(self):
|
|
57
|
+
self.client.close()
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**Thread-Safe Pattern:**
|
|
61
|
+
```python
|
|
62
|
+
from threading import Lock
|
|
63
|
+
|
|
64
|
+
class ThreadSafeInfluxDBService:
|
|
65
|
+
_instance = None
|
|
66
|
+
_lock = Lock()
|
|
67
|
+
|
|
68
|
+
def __new__(cls):
|
|
69
|
+
if cls._instance is None:
|
|
70
|
+
with cls._lock:
|
|
71
|
+
if cls._instance is None:
|
|
72
|
+
cls._instance = super().__new__(cls)
|
|
73
|
+
cls._instance.client = InfluxDBClient(
|
|
74
|
+
url=os.getenv("INFLUXDB_URL"),
|
|
75
|
+
token=os.getenv("INFLUXDB_TOKEN"),
|
|
76
|
+
org="homeiq"
|
|
77
|
+
)
|
|
78
|
+
return cls._instance
|
|
79
|
+
|
|
80
|
+
@property
|
|
81
|
+
def write_api(self):
|
|
82
|
+
return self.client.write_api()
|
|
83
|
+
|
|
84
|
+
@property
|
|
85
|
+
def query_api(self):
|
|
86
|
+
return self.client.query_api()
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Retry Logic
|
|
90
|
+
|
|
91
|
+
### Basic Retry Pattern
|
|
92
|
+
|
|
93
|
+
**Using tenacity:**
|
|
94
|
+
```python
|
|
95
|
+
from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type
|
|
96
|
+
from influxdb_client.rest import ApiException
|
|
97
|
+
|
|
98
|
+
@retry(
|
|
99
|
+
stop=stop_after_attempt(3),
|
|
100
|
+
wait=wait_exponential(multiplier=1, min=2, max=10),
|
|
101
|
+
retry=retry_if_exception_type((ApiException, ConnectionError))
|
|
102
|
+
)
|
|
103
|
+
def write_with_retry(write_api, point):
|
|
104
|
+
try:
|
|
105
|
+
write_api.write(bucket="homeiq", record=point)
|
|
106
|
+
except ApiException as e:
|
|
107
|
+
logger.error(f"InfluxDB API error: {e}")
|
|
108
|
+
raise
|
|
109
|
+
except ConnectionError as e:
|
|
110
|
+
logger.error(f"Connection error: {e}")
|
|
111
|
+
raise
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Advanced Retry Pattern
|
|
115
|
+
|
|
116
|
+
**With exponential backoff and jitter:**
|
|
117
|
+
```python
|
|
118
|
+
from tenacity import (
|
|
119
|
+
retry,
|
|
120
|
+
stop_after_attempt,
|
|
121
|
+
wait_exponential,
|
|
122
|
+
retry_if_exception_type,
|
|
123
|
+
before_sleep_log
|
|
124
|
+
)
|
|
125
|
+
import logging
|
|
126
|
+
|
|
127
|
+
logger = logging.getLogger(__name__)
|
|
128
|
+
|
|
129
|
+
@retry(
|
|
130
|
+
stop=stop_after_attempt(5),
|
|
131
|
+
wait=wait_exponential(multiplier=1, min=2, max=30),
|
|
132
|
+
retry=retry_if_exception_type((ApiException, ConnectionError, TimeoutError)),
|
|
133
|
+
before_sleep=before_sleep_log(logger, logging.WARNING)
|
|
134
|
+
)
|
|
135
|
+
def write_with_advanced_retry(write_api, point):
|
|
136
|
+
write_api.write(bucket="homeiq", record=point)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Circuit Breaker Pattern
|
|
140
|
+
|
|
141
|
+
**Prevent cascading failures:**
|
|
142
|
+
```python
|
|
143
|
+
from circuitbreaker import circuit
|
|
144
|
+
|
|
145
|
+
@circuit(failure_threshold=5, recovery_timeout=60)
|
|
146
|
+
def write_with_circuit_breaker(write_api, point):
|
|
147
|
+
try:
|
|
148
|
+
write_api.write(bucket="homeiq", record=point)
|
|
149
|
+
except Exception as e:
|
|
150
|
+
logger.error(f"Write failed: {e}")
|
|
151
|
+
raise
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Error Handling
|
|
155
|
+
|
|
156
|
+
### Connection Error Handling
|
|
157
|
+
|
|
158
|
+
```python
|
|
159
|
+
from influxdb_client import InfluxDBClient
|
|
160
|
+
from influxdb_client.rest import ApiException
|
|
161
|
+
import logging
|
|
162
|
+
|
|
163
|
+
logger = logging.getLogger(__name__)
|
|
164
|
+
|
|
165
|
+
def create_influxdb_client():
|
|
166
|
+
try:
|
|
167
|
+
client = InfluxDBClient(
|
|
168
|
+
url=os.getenv("INFLUXDB_URL"),
|
|
169
|
+
token=os.getenv("INFLUXDB_TOKEN"),
|
|
170
|
+
org="homeiq"
|
|
171
|
+
)
|
|
172
|
+
# Test connection
|
|
173
|
+
client.ping()
|
|
174
|
+
return client
|
|
175
|
+
except ApiException as e:
|
|
176
|
+
logger.error(f"Failed to connect to InfluxDB: {e}")
|
|
177
|
+
raise
|
|
178
|
+
except Exception as e:
|
|
179
|
+
logger.error(f"Unexpected error connecting to InfluxDB: {e}")
|
|
180
|
+
raise
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Write Error Handling
|
|
184
|
+
|
|
185
|
+
```python
|
|
186
|
+
def write_point_safe(write_api, point):
|
|
187
|
+
try:
|
|
188
|
+
write_api.write(bucket="homeiq", record=point)
|
|
189
|
+
except ApiException as e:
|
|
190
|
+
if e.status == 401:
|
|
191
|
+
logger.error("Authentication failed - check token")
|
|
192
|
+
elif e.status == 404:
|
|
193
|
+
logger.error("Bucket or organization not found")
|
|
194
|
+
elif e.status == 429:
|
|
195
|
+
logger.warning("Rate limit exceeded - backing off")
|
|
196
|
+
time.sleep(1)
|
|
197
|
+
else:
|
|
198
|
+
logger.error(f"InfluxDB API error: {e.status} - {e.reason}")
|
|
199
|
+
raise
|
|
200
|
+
except Exception as e:
|
|
201
|
+
logger.error(f"Unexpected write error: {e}")
|
|
202
|
+
raise
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Query Error Handling
|
|
206
|
+
|
|
207
|
+
```python
|
|
208
|
+
def query_safe(query_api, query):
|
|
209
|
+
try:
|
|
210
|
+
result = query_api.query(query)
|
|
211
|
+
return result
|
|
212
|
+
except ApiException as e:
|
|
213
|
+
if e.status == 400:
|
|
214
|
+
logger.error(f"Invalid Flux query: {e.reason}")
|
|
215
|
+
elif e.status == 401:
|
|
216
|
+
logger.error("Authentication failed - check token")
|
|
217
|
+
else:
|
|
218
|
+
logger.error(f"InfluxDB API error: {e.status} - {e.reason}")
|
|
219
|
+
raise
|
|
220
|
+
except Exception as e:
|
|
221
|
+
logger.error(f"Unexpected query error: {e}")
|
|
222
|
+
raise
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
## Async Patterns
|
|
226
|
+
|
|
227
|
+
### AsyncIO Pattern
|
|
228
|
+
|
|
229
|
+
```python
|
|
230
|
+
import asyncio
|
|
231
|
+
from influxdb_client_3 import InfluxDBClient3
|
|
232
|
+
|
|
233
|
+
async def write_async(points):
|
|
234
|
+
client = InfluxDBClient3(
|
|
235
|
+
host=os.getenv("INFLUXDB_HOST", "localhost:8086"),
|
|
236
|
+
token=os.getenv("INFLUXDB_TOKEN"),
|
|
237
|
+
database="homeiq"
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
try:
|
|
241
|
+
await client.write(record=points, database="homeiq")
|
|
242
|
+
finally:
|
|
243
|
+
await client.close()
|
|
244
|
+
|
|
245
|
+
# Usage
|
|
246
|
+
asyncio.run(write_async(points))
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### Async Context Manager
|
|
250
|
+
|
|
251
|
+
```python
|
|
252
|
+
from contextlib import asynccontextmanager
|
|
253
|
+
|
|
254
|
+
@asynccontextmanager
|
|
255
|
+
async def async_influxdb_client():
|
|
256
|
+
client = InfluxDBClient3(
|
|
257
|
+
host=os.getenv("INFLUXDB_HOST"),
|
|
258
|
+
token=os.getenv("INFLUXDB_TOKEN"),
|
|
259
|
+
database="homeiq"
|
|
260
|
+
)
|
|
261
|
+
try:
|
|
262
|
+
yield client
|
|
263
|
+
finally:
|
|
264
|
+
await client.close()
|
|
265
|
+
|
|
266
|
+
# Usage
|
|
267
|
+
async def write_data(points):
|
|
268
|
+
async with async_influxdb_client() as client:
|
|
269
|
+
await client.write(record=points, database="homeiq")
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
## Batch Writing Patterns
|
|
273
|
+
|
|
274
|
+
### Basic Batch Write
|
|
275
|
+
|
|
276
|
+
```python
|
|
277
|
+
def write_batch(write_api, points, batch_size=5000):
|
|
278
|
+
for i in range(0, len(points), batch_size):
|
|
279
|
+
batch = points[i:i + batch_size]
|
|
280
|
+
try:
|
|
281
|
+
write_api.write(bucket="homeiq", record=batch)
|
|
282
|
+
except Exception as e:
|
|
283
|
+
logger.error(f"Batch write failed: {e}")
|
|
284
|
+
# Optionally: retry or store failed batch
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Buffered Batch Write
|
|
288
|
+
|
|
289
|
+
```python
|
|
290
|
+
from collections import deque
|
|
291
|
+
|
|
292
|
+
class BufferedInfluxDBWriter:
|
|
293
|
+
def __init__(self, write_api, batch_size=5000, flush_interval=60):
|
|
294
|
+
self.write_api = write_api
|
|
295
|
+
self.batch_size = batch_size
|
|
296
|
+
self.flush_interval = flush_interval
|
|
297
|
+
self.buffer = deque()
|
|
298
|
+
self.last_flush = time.time()
|
|
299
|
+
|
|
300
|
+
def add_point(self, point):
|
|
301
|
+
self.buffer.append(point)
|
|
302
|
+
|
|
303
|
+
# Flush if buffer is full
|
|
304
|
+
if len(self.buffer) >= self.batch_size:
|
|
305
|
+
self.flush()
|
|
306
|
+
|
|
307
|
+
# Flush if interval elapsed
|
|
308
|
+
if time.time() - self.last_flush >= self.flush_interval:
|
|
309
|
+
self.flush()
|
|
310
|
+
|
|
311
|
+
def flush(self):
|
|
312
|
+
if not self.buffer:
|
|
313
|
+
return
|
|
314
|
+
|
|
315
|
+
points = list(self.buffer)
|
|
316
|
+
self.buffer.clear()
|
|
317
|
+
|
|
318
|
+
try:
|
|
319
|
+
self.write_api.write(bucket="homeiq", record=points)
|
|
320
|
+
self.last_flush = time.time()
|
|
321
|
+
except Exception as e:
|
|
322
|
+
logger.error(f"Flush failed: {e}")
|
|
323
|
+
# Optionally: re-add points to buffer
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
## Health Checks
|
|
327
|
+
|
|
328
|
+
### Connection Health Check
|
|
329
|
+
|
|
330
|
+
```python
|
|
331
|
+
def check_influxdb_health(client):
|
|
332
|
+
try:
|
|
333
|
+
# Ping InfluxDB
|
|
334
|
+
health = client.health()
|
|
335
|
+
if health.status == "pass":
|
|
336
|
+
return True
|
|
337
|
+
return False
|
|
338
|
+
except Exception as e:
|
|
339
|
+
logger.error(f"Health check failed: {e}")
|
|
340
|
+
return False
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
### Readiness Check
|
|
344
|
+
|
|
345
|
+
```python
|
|
346
|
+
def check_influxdb_ready(client):
|
|
347
|
+
try:
|
|
348
|
+
# Query a simple test
|
|
349
|
+
query = 'from(bucket: "homeiq") |> range(start: -1m) |> limit(n: 1)'
|
|
350
|
+
result = client.query_api().query(query)
|
|
351
|
+
return True
|
|
352
|
+
except Exception as e:
|
|
353
|
+
logger.error(f"Readiness check failed: {e}")
|
|
354
|
+
return False
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
## Configuration Patterns
|
|
358
|
+
|
|
359
|
+
### Environment-Based Configuration
|
|
360
|
+
|
|
361
|
+
```python
|
|
362
|
+
import os
|
|
363
|
+
from influxdb_client import InfluxDBClient
|
|
364
|
+
|
|
365
|
+
def create_client_from_env():
|
|
366
|
+
return InfluxDBClient(
|
|
367
|
+
url=os.getenv("INFLUXDB_URL", "http://localhost:8086"),
|
|
368
|
+
token=os.getenv("INFLUXDB_TOKEN", ""),
|
|
369
|
+
org=os.getenv("INFLUXDB_ORG", "homeiq"),
|
|
370
|
+
timeout=int(os.getenv("INFLUXDB_TIMEOUT", "30000"))
|
|
371
|
+
)
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
### Configuration File Pattern
|
|
375
|
+
|
|
376
|
+
```python
|
|
377
|
+
import yaml
|
|
378
|
+
from influxdb_client import InfluxDBClient
|
|
379
|
+
|
|
380
|
+
def load_influxdb_config(config_path="config.yaml"):
|
|
381
|
+
with open(config_path) as f:
|
|
382
|
+
config = yaml.safe_load(f)
|
|
383
|
+
|
|
384
|
+
return InfluxDBClient(
|
|
385
|
+
url=config["influxdb"]["url"],
|
|
386
|
+
token=config["influxdb"]["token"],
|
|
387
|
+
org=config["influxdb"]["org"],
|
|
388
|
+
timeout=config["influxdb"].get("timeout", 30000)
|
|
389
|
+
)
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
## Testing Patterns
|
|
393
|
+
|
|
394
|
+
### Mock InfluxDB Client
|
|
395
|
+
|
|
396
|
+
```python
|
|
397
|
+
from unittest.mock import Mock, MagicMock
|
|
398
|
+
|
|
399
|
+
class MockInfluxDBClient:
|
|
400
|
+
def __init__(self):
|
|
401
|
+
self.write_api = Mock()
|
|
402
|
+
self.query_api = Mock()
|
|
403
|
+
self.ping = Mock(return_value={"status": "pass"})
|
|
404
|
+
|
|
405
|
+
def close(self):
|
|
406
|
+
pass
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
### Integration Test Fixture
|
|
410
|
+
|
|
411
|
+
```python
|
|
412
|
+
import pytest
|
|
413
|
+
from influxdb_client import InfluxDBClient
|
|
414
|
+
|
|
415
|
+
@pytest.fixture
|
|
416
|
+
def influxdb_client():
|
|
417
|
+
client = InfluxDBClient(
|
|
418
|
+
url=os.getenv("INFLUXDB_URL", "http://localhost:8086"),
|
|
419
|
+
token=os.getenv("INFLUXDB_TOKEN", "test-token"),
|
|
420
|
+
org="test"
|
|
421
|
+
)
|
|
422
|
+
yield client
|
|
423
|
+
# Cleanup test data
|
|
424
|
+
client.close()
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
## References
|
|
428
|
+
|
|
429
|
+
- [InfluxDB Python Client](https://github.com/influxdata/influxdb-client-python)
|
|
430
|
+
- [InfluxDB Connection Management](https://docs.influxdata.com/influxdb/v2.7/api-guide/client-libraries/python/)
|
|
431
|
+
- [Error Handling Best Practices](https://docs.influxdata.com/influxdb/v2.7/write-data/best-practices/)
|
|
432
|
+
|