SCOM-based microservice boundary analysis from Jaeger traces
Project description
Changelog
v0.5.0 (2026-06-18)
Robustness & Performance
- deploy.py: Threaded streaming for
docker compose up— real-time output on stderr with 60-line rotating tail for error diagnostics, 300s timeout,proc.stdout.close()on Windows to unblock reader thread - deploy.py: Platform-aware Docker daemon timeout — 25s on Windows (WSL2/Hyper-V latency), 10s on Linux
- deploy.py: Deduplicated
_find_otel_dockerfiles→find_otel_dockerfiles(public), removed duplicate from orchestrator - orchestrator.py: Proactive Docker check with visible "waiting up to 60s..." feedback before any deploy;
_ensure_docker()with real elapsed time reporting - instrumentation_marker.py:
cleanup_orphans()— scans for orphan.mba_bak,.mba-Dockerfile,.mba-compose-override.ymlwithout marker (pre-v0.4.0 compat). Usesos.walkwith directory pruning to skip.venv/node_modules/__pycache__ - prompts.py: LLM sentinel
jaeger_host="env"now tells the model to reados.environ.get("OTEL_EXPORTER_OTLP_ENDPOINT", ...)at runtime instead of generatinghttp://env:4318 - orchestrator.py: LLM instrumentation passes
"env"for Docker Compose projects,"127.0.0.1"for local projects
Tests
- 565 tests (+7 new), 0 regressions
- 7 new tests:
build_instrumentation_prompt(jaeger_host="env")sentinel,_extract_host_port()with all formats including127.0.0.1:5000:5000
v0.4.0 (2026-06-17)
Version-Aware Instrumentation System (new feature)
- NEW:
.mba-instrumentedmarker file written after successful deploy, recording version, mode, and all artifacts created (backups, Dockerfile overrides, compose overrides) - NEW:
check_stale_instrumentation()detects instrumentation from a different MBA version at the start ofmba fulland automatically cleans up before re-instrumenting - NEW:
cleanup_instrumentation()restores backup files (.mba_bak→ original), deletes generated.mba-Dockerfileand.mba-compose-override.ymlfiles - NEW: On each run, if marker exists with a different version, cleanup runs automatically before discovery
Docker Compose Robustness (bug fixes)
- deploy.py: Added
subprocess.TimeoutExpiredhandler indeploy_docker_compose()— previously an unhandled crash; now produces a clearDOCKER_COMPOSE_FAILEDerror - deploy.py:
_generate_otel_dockerfile()now logs warnings on all 7 silent failure paths instead of returning(None, None)with no user feedback - discover.py: Fixed port extraction from Docker Compose YAML. The old
p.rsplit(":", 1)[0].rsplit(":", 1)[0]was broken forhost_ip:host_port:container_portformat (e.g.,127.0.0.1:5000:5000). Now uses a proper_extract_host_port()helper
LLM Chain Improvements (bug fixes + diagnostics)
- instrumentation.py: Added
logger.warning()for each reason the LLM returnsNone: API/Ollama failure,"ERROR:"refusal (with the actual reason), andSyntaxErrorin generated code. Previously all three were silent - context.py: Extended
_find_main_file()to recognize all entry point names from the Python plugin:run.py,manage.py,wsgi.py,api.py(in addition to existingmain.py,app.py,server.py). Also checks subdirectories (app/,src/,application/) for all these names - context.py: Added
"language"key to context dict (value:"python") so the prompt template correctly shows"Language: python"instead of duplicating the framework name - prompts.py: Fixed
"Language:"label to readcontext.get('language', 'python')instead ofcontext.get('framework', 'unknown')
v0.3.11 (2026-06-17)
Fix Docker daemon detection on Windows
v0.3.10 (2026-06-17)
Docker error messages now accurate
- deploy.py:
deploy_docker_compose()andstart_jaeger()now distinguish between Docker not installed (DOCKER_NOT_FOUND) and Docker daemon not running (DOCKER_DAEMON_DOWN). Users with Docker installed but Desktop not launched now see: "Docker is installed but the daemon is not running — Start Docker Desktop and wait for it to be ready." instead of the misleading "Docker is required but was not found."
v0.3.9 (2026-06-17)
Bug fixes and robustness improvements
- orchestrator.py: Fixed
'ServiceInfo' object has no attribute 'root_dir'crash when LLM instrumentation tries to read the service path. Now usesentry_points[0].path.parentinstead. - deploy.py: Replaced
_docker_available()with 3-functions:_docker_installed(),_docker_daemon_ready(), and retry-based_docker_available()(3 attempts × 3s). Usesdocker version --formatwhich is 10× faster thandocker info. - deploy.py: Added Jaeger health check after
docker compose up— explicitly waits for port 16686 and verifies/api/servicesendpoint. - deploy.py:
cleanup_docker_compose()now checks Docker availability first — skips cleanly if the daemon is not responding. - deploy.py: Reduced timeouts — compose up 300s→120s, compose down 60s→15s, docker check 10s→5s.
- orchestrator.py:
_try_cleanup()is now protected againstKeyboardInterrupt— clean message instead of traceback. - cli.py: Top-level
KeyboardInterrupthandler — returns exit code 130 with clean message. - deploy.py:
cleanup_docker_composeno longer raises on failure (check=Trueremoved,subprocess.CalledProcessErrorhandled gracefully). - All 561 tests pass with zero regressions.
v0.3.8 (2026-06-17)
Consolidation — single-service orchestrator
- deploy.py: Python services always use OTLP HTTP/4318 (removed conditional gRPC fallback). Smart Jaeger detection (
_jaeger_alive,_docker_container_exists) with 3-case restart logic. NewDOCKER_START_FAILEDerror code. - discover.py: Service deduplication by
(name, deployment). Subdirectory scanning for monorepos (_is_service_dir,_discover_subdirectory_services). - orchestrator.py: New
_llm_instrument_servicesstep called between discovery and deploy, triggered by--llmflag +OPENROUTER_API_KEY. Falls back silently to Dockerfile patching. - prompts.py: Universal framework-agnostic prompt replaces FastAPI/Flask-only prompt. Python reference appendix (FastAPI, Flask, Django, SQLAlchemy).
- instrumentation.py: Passes structured
contextdict for richer prompts. - Tests: All 561 pass with updated env vars and prompt text.
v0.3.7 (2026-06-16)
Bug fixes
- Pipeline crash when no services are flagged suspicious (
EmptyDataErroron empty CSV). Added size check and try/except inreport_builder.py.
v0.3.6 (2026-06-16)
Features
- ENTRYPOINT injected directly into
.mba-Dockerfileinstead of composeentrypointoverride (Docker Compose v5 on Windows clears CMD when entrypoint is set in YAML) opentelemetry-distroadded as runtime dependency (providesOpenTelemetryConfiguratorentry point, needed for SDK config from env vars)- Windows console encoding fix:
sys.stdout.reconfigure(encoding='utf-8')in CLI module
v0.3.5 (2026-06-16)
Features
- Build-time OTel install: generates
.mba-DockerfilewithRUN pip install opentelemetry-distro opentelemetry-instrumentation-flasketc. at build time - Compose override points
build.dockerfileto.mba-Dockerfile - Cleanup of
.mba-Dockerfilefiles after analysis
v1.0.0 (2026-06-11)
Features
- SCOM pipeline : computes Service-COhesion Metric from Jaeger traces (health filtering, endpoint extraction, DB table detection, endpoint-table mapping, threshold analysis, report generation)
- CLI tool :
mba/boundary-analyzercommands (run,setup,dashboard,teastore) - Auto-instrumentation : auto-detects Python microservices (FastAPI, Flask, Django), injects OpenTelemetry, collects traces via Jaeger, runs SCOM analysis
- TeaStore support : Docker Compose deployment with OTel Java agent, traffic generator, trace exporter, full SCOM pipeline
- Dashboard : interactive Dash web UI for SCOM results
- LLM analysis (optional) : AI-powered narrative report via OpenRouter (Qwen), disabled by default
Improvements
- Segment-based health matching (
HEALTH_KEYWORDS) instead of fragileendswith—/health/all,/auth/health,/ready/isready,/metrics(viahttp.target) correctly filtered --skip-no-db-servicesflag to exclude stateless services (proxy, orchestrator, etc.) from SCOM rankingrun_teastore()function extracted for programmatic access
Bug fixes
- MissingGreenlet in classroom-repository (added
selectinload) - datetime timezone-aware comparison in enrollment-service
academic_yearint→str conversion in enrollment-service- Scope bug in
cleaned_partsvariable in CLI cleanup logic - SQLAlchemy duplicate instrumentation (event listeners only, no
SQLAlchemyInstrumentor/AsyncPGInstrumentor) [project.scripts]whitespace in pyproject.toml
Tests
- 74 tests total (58 existing + 16 TeaStore)
- TeaStore synthetic fixtures (persistence-service with 5 tables, auth-service without DB)
- 3 test classes : TeaStorePipelineTest, TeaStoreSkipNoDbTest, TeaStoreNoFilterTest
Infrastructure
- CI via GitHub Actions (
.github/workflows/ci.yml) — Python 3.11 × 3.12 mbaCLI alias alongsideboundary-analyzer- Version bump to 0.2.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
boundary_analyzer-0.5.0.tar.gz
(156.2 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file boundary_analyzer-0.5.0.tar.gz.
File metadata
- Download URL: boundary_analyzer-0.5.0.tar.gz
- Upload date:
- Size: 156.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ca5e14174ee6aad7c9e1ab955a13a1369853fdb176dec2057567ba889fef2602
|
|
| MD5 |
69009ada6165c98e7ffcef56aba28b20
|
|
| BLAKE2b-256 |
235d797db6c906f00fa2a17114b125363aa39110226306b0b04e245e7f01ecbf
|
File details
Details for the file boundary_analyzer-0.5.0-py3-none-any.whl.
File metadata
- Download URL: boundary_analyzer-0.5.0-py3-none-any.whl
- Upload date:
- Size: 151.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ff0d693d3fffe1dddba6b66a4835e0b49c1d995d317118dfc30877498c4af2ee
|
|
| MD5 |
524a767577e74b2570db554b0f2bbaed
|
|
| BLAKE2b-256 |
8d12956446d0af03c465f098a9bd83066b2754f986ac686a905166799882bc4f
|