mca-sdk 0.0.0__tar.gz
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.
- mca_sdk-0.0.0/CHANGELOG.md +710 -0
- mca_sdk-0.0.0/LICENSE +17 -0
- mca_sdk-0.0.0/MANIFEST.in +5 -0
- mca_sdk-0.0.0/PKG-INFO +1597 -0
- mca_sdk-0.0.0/README.md +1513 -0
- mca_sdk-0.0.0/mca_sdk/FOR_AI_ASSISTANTS.md +202 -0
- mca_sdk-0.0.0/mca_sdk/__init__.py +76 -0
- mca_sdk-0.0.0/mca_sdk/autolog/__init__.py +185 -0
- mca_sdk-0.0.0/mca_sdk/autolog/_base.py +381 -0
- mca_sdk-0.0.0/mca_sdk/autolog/_lightgbm.py +111 -0
- mca_sdk-0.0.0/mca_sdk/autolog/_sklearn.py +93 -0
- mca_sdk-0.0.0/mca_sdk/autolog/_xgboost.py +111 -0
- mca_sdk-0.0.0/mca_sdk/buffering/__init__.py +15 -0
- mca_sdk-0.0.0/mca_sdk/buffering/exporters.py +1691 -0
- mca_sdk-0.0.0/mca_sdk/buffering/queue.py +1275 -0
- mca_sdk-0.0.0/mca_sdk/buffering/queued_item.py +37 -0
- mca_sdk-0.0.0/mca_sdk/buffering/retry.py +282 -0
- mca_sdk-0.0.0/mca_sdk/cli/__init__.py +10 -0
- mca_sdk-0.0.0/mca_sdk/cli/_bootstrap.py +172 -0
- mca_sdk-0.0.0/mca_sdk/cli/init.py +683 -0
- mca_sdk-0.0.0/mca_sdk/cli/instrument.py +339 -0
- mca_sdk-0.0.0/mca_sdk/cli/run.py +339 -0
- mca_sdk-0.0.0/mca_sdk/config/__init__.py +5 -0
- mca_sdk-0.0.0/mca_sdk/config/settings.py +1898 -0
- mca_sdk-0.0.0/mca_sdk/core/__init__.py +15 -0
- mca_sdk-0.0.0/mca_sdk/core/client.py +3150 -0
- mca_sdk-0.0.0/mca_sdk/core/gcp_auth.py +460 -0
- mca_sdk-0.0.0/mca_sdk/core/providers.py +772 -0
- mca_sdk-0.0.0/mca_sdk/exporters/__init__.py +9 -0
- mca_sdk-0.0.0/mca_sdk/exporters/gcp_logging.py +562 -0
- mca_sdk-0.0.0/mca_sdk/exporters/gcp_trace_exporter.py +865 -0
- mca_sdk-0.0.0/mca_sdk/integrations/__init__.py +45 -0
- mca_sdk-0.0.0/mca_sdk/integrations/bridge.py +345 -0
- mca_sdk-0.0.0/mca_sdk/integrations/decorators.py +523 -0
- mca_sdk-0.0.0/mca_sdk/integrations/genai.py +284 -0
- mca_sdk-0.0.0/mca_sdk/integrations/litellm_callback.py +689 -0
- mca_sdk-0.0.0/mca_sdk/integrations/state.py +197 -0
- mca_sdk-0.0.0/mca_sdk/py.typed +2 -0
- mca_sdk-0.0.0/mca_sdk/registry/__init__.py +22 -0
- mca_sdk-0.0.0/mca_sdk/registry/client.py +1048 -0
- mca_sdk-0.0.0/mca_sdk/registry/models.py +170 -0
- mca_sdk-0.0.0/mca_sdk/registry/telemetry.py +72 -0
- mca_sdk-0.0.0/mca_sdk/resilience/__init__.py +10 -0
- mca_sdk-0.0.0/mca_sdk/resilience/circuit_breaker.py +321 -0
- mca_sdk-0.0.0/mca_sdk/resilience/dead_letter_queue.py +611 -0
- mca_sdk-0.0.0/mca_sdk/security/__init__.py +47 -0
- mca_sdk-0.0.0/mca_sdk/security/_testing.py +11 -0
- mca_sdk-0.0.0/mca_sdk/security/certificate.py +261 -0
- mca_sdk-0.0.0/mca_sdk/security/certificates.py +541 -0
- mca_sdk-0.0.0/mca_sdk/security/encryption.py +664 -0
- mca_sdk-0.0.0/mca_sdk/security/migration.py +205 -0
- mca_sdk-0.0.0/mca_sdk/utils/__init__.py +5 -0
- mca_sdk-0.0.0/mca_sdk/utils/exceptions.py +215 -0
- mca_sdk-0.0.0/mca_sdk/utils/gcp_validators.py +68 -0
- mca_sdk-0.0.0/mca_sdk/utils/phi_utils.py +84 -0
- mca_sdk-0.0.0/mca_sdk/utils/routing.py +162 -0
- mca_sdk-0.0.0/mca_sdk/utils/serialization.py +407 -0
- mca_sdk-0.0.0/mca_sdk/utils/version_check.py +90 -0
- mca_sdk-0.0.0/mca_sdk/validation/__init__.py +241 -0
- mca_sdk-0.0.0/mca_sdk/validation/attributes.py +416 -0
- mca_sdk-0.0.0/mca_sdk/validation/naming_conventions.py +94 -0
- mca_sdk-0.0.0/mca_sdk/validation/result.py +33 -0
- mca_sdk-0.0.0/mca_sdk/validation/rules.py +117 -0
- mca_sdk-0.0.0/mca_sdk/validation/schema.py +476 -0
- mca_sdk-0.0.0/mca_sdk/validation/telemetry_attributes.py +390 -0
- mca_sdk-0.0.0/mca_sdk/validation/validator.py +140 -0
- mca_sdk-0.0.0/mca_sdk/version.py +17 -0
- mca_sdk-0.0.0/mca_sdk.egg-info/PKG-INFO +1597 -0
- mca_sdk-0.0.0/mca_sdk.egg-info/SOURCES.txt +79 -0
- mca_sdk-0.0.0/mca_sdk.egg-info/dependency_links.txt +1 -0
- mca_sdk-0.0.0/mca_sdk.egg-info/entry_points.txt +4 -0
- mca_sdk-0.0.0/mca_sdk.egg-info/requires.txt +78 -0
- mca_sdk-0.0.0/mca_sdk.egg-info/top_level.txt +1 -0
- mca_sdk-0.0.0/pyproject.toml +109 -0
- mca_sdk-0.0.0/setup.cfg +4 -0
- mca_sdk-0.0.0/setup.py +112 -0
- mca_sdk-0.0.0/tests/test_agentic.py +291 -0
- mca_sdk-0.0.0/tests/test_basic_export.py +77 -0
- mca_sdk-0.0.0/tests/test_gcp_registry_auth.py +135 -0
- mca_sdk-0.0.0/tests/test_goal_context_token_fix.py +141 -0
- mca_sdk-0.0.0/tests/test_registry_integration.py +365 -0
|
@@ -0,0 +1,710 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to the MCA SDK will be documented in this file.
|
|
4
|
+
|
|
5
|
+
## [0.8.11] - 2026-04-03
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
- **RegistryClient**: Reverted the unsupported `version` parameter usage for legacy registry API endpoint (`/api/v1/configs/{model_id}`). The version parameter is now ignored and a warning is logged, preventing 404/rejection errors when using legacy registry endpoints.
|
|
9
|
+
|
|
10
|
+
## [0.8.10] - 2026-04-02
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- **Registry API Endpoint**: Reverted to `/api/v1/configs/{model_id}` from `/models/{model_id}`
|
|
14
|
+
- **Root Cause**: The new `/models/{model_id}` endpoint (introduced in v0.8.6) returns 404 for all registered models
|
|
15
|
+
- **Solution**: Reverted to the old `/api/v1/configs/{model_id}` endpoint which still works and has model data
|
|
16
|
+
- **Impact**: Fixes RegistryConfigNotFoundError for all models including patient-readmission-classifier-v1, medical-research-assistant, and clinical-notes-summarizer-v2
|
|
17
|
+
- **Future**: Will re-migrate to new endpoint once Registry team completes data migration to `/models/` endpoint
|
|
18
|
+
|
|
19
|
+
## [0.8.9] - 2026-04-01
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
- **Reverted Registry API version=latest behavior**: Reverted the change introduced in v0.8.6 that explicitly sent `version=latest` when fetching model configurations without a specified version.
|
|
23
|
+
- **Root Cause**: The Registry API backend does not support the literal string "latest" and treating it as a semantic version caused `404 Not Found` errors.
|
|
24
|
+
- **Solution**: The SDK now omits the `version` parameter entirely when requesting the latest version, matching pre-0.8.6 behavior.
|
|
25
|
+
- **API Contract Update**: The API contract documentation has been updated to explicitly state that omitting the parameter is the standard way to request the latest version, and "latest" is not a supported literal string.
|
|
26
|
+
|
|
27
|
+
## [0.8.8] - 2026-03-27
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
- **CRITICAL: Counter Metric Instrumentation Bug** - Fixed `record_counter()` and `record_gauge()` methods creating incorrect instrument types
|
|
31
|
+
- **Root Cause**: `record_counter()` was calling `record_metric()` without specifying `instrument_type="counter"`, causing counters to be created as Histograms
|
|
32
|
+
- **Impact**: Counter metrics like `emms_genai_requests_total` were recorded as Histograms, making them invisible to aggregation queries that expect counter semantics (e.g., `counter-increase` CTEs in BigQuery)
|
|
33
|
+
- **Affected Metrics**: All metrics recorded via `record_counter()` including:
|
|
34
|
+
- `emms_genai_requests_total` (GenAI request counter)
|
|
35
|
+
- `emms_model_predictions_total` (prediction counter)
|
|
36
|
+
- Any custom counters recorded by applications
|
|
37
|
+
- **Symptoms**: Aggregation ETL queries finding latency metrics but no request counters; traces present but counter data missing
|
|
38
|
+
- **Fix**: Added explicit `instrument_type="counter"` parameter to `record_counter()` and `instrument_type="up_down_counter"` to `record_gauge()`
|
|
39
|
+
- **Verification**: Counter instruments now correctly created as `_Counter` type with `add()` method instead of `_Histogram` with `record()` method
|
|
40
|
+
- **Models Affected**: clinical-notes-summarizer-v2 and any other GenAI models using LiteLLM callback
|
|
41
|
+
- **Action Required**: Redeploy models using SDK v0.8.8+ to populate counter metrics in aggregation tables
|
|
42
|
+
|
|
43
|
+
## [0.8.7] - 2026-03-27
|
|
44
|
+
|
|
45
|
+
### Fixed
|
|
46
|
+
- **CRITICAL: Counter Metric Instrumentation Bug** - Fixed `record_counter()` and `record_gauge()` methods creating incorrect instrument types
|
|
47
|
+
- **Root Cause**: `record_counter()` was calling `record_metric()` without specifying `instrument_type="counter"`, causing counters to be created as Histograms
|
|
48
|
+
- **Impact**: Counter metrics like `emms_genai_requests_total` were recorded as Histograms, making them invisible to aggregation queries that expect counter semantics (e.g., `counter-increase` CTEs in BigQuery)
|
|
49
|
+
- **Affected Metrics**: All metrics recorded via `record_counter()` including:
|
|
50
|
+
- `emms_genai_requests_total` (GenAI request counter)
|
|
51
|
+
- `emms_model_predictions_total` (prediction counter)
|
|
52
|
+
- Any custom counters recorded by applications
|
|
53
|
+
- **Symptoms**: Aggregation ETL queries finding latency metrics but no request counters; traces present but counter data missing
|
|
54
|
+
- **Fix**: Added explicit `instrument_type="counter"` parameter to `record_counter()` and `instrument_type="up_down_counter"` to `record_gauge()`
|
|
55
|
+
- **Verification**: Counter instruments now correctly created as `_Counter` type with `add()` method instead of `_Histogram` with `record()` method
|
|
56
|
+
- **Models Affected**: clinical-notes-summarizer-v2 and any other GenAI models using LiteLLM callback
|
|
57
|
+
- **Action Required**: Redeploy models using SDK v0.8.7+ to populate counter metrics in aggregation tables
|
|
58
|
+
|
|
59
|
+
## [0.8.6] - 2026-03-24
|
|
60
|
+
|
|
61
|
+
### Changed
|
|
62
|
+
- Updated registry API endpoint from `/api/v1/configs/{model_id}` to `/models/{model_id}`
|
|
63
|
+
- Added support for version parameter in model configuration fetches
|
|
64
|
+
- Removed deprecation warning for version parameter in registry client
|
|
65
|
+
- Introduced `DEFAULT_MODEL_VERSION` constant to replace magic string "latest"
|
|
66
|
+
- Enhanced registry client telemetry with cache hit/miss logging and resolved version tracking
|
|
67
|
+
|
|
68
|
+
### Added - Backward Compatibility
|
|
69
|
+
- **`omit_default_version` parameter** for RegistryClient to support legacy registry APIs
|
|
70
|
+
- Set to `True` to restore pre-0.8.6 behavior (omit version parameter)
|
|
71
|
+
- Defaults to `False` (modern behavior: send `version=latest`)
|
|
72
|
+
- Can be controlled via `MCA_REGISTRY_OMIT_DEFAULT_VERSION` environment variable
|
|
73
|
+
- Logs warning when legacy mode is enabled
|
|
74
|
+
- Allows migration path for systems with non-compliant registry APIs
|
|
75
|
+
|
|
76
|
+
### Fixed
|
|
77
|
+
- **Registry Client Version Resolution** (Story 8-8): Fixed model configuration fetching to explicitly request `version=latest` when no version is specified, resolving "Model config not found" errors for valid registered models
|
|
78
|
+
- Affected models: patient-readmission-classifier-v1, medical-research-assistant, clinical-notes-summarizer-v2
|
|
79
|
+
- Root cause: Mismatch between cache key semantics (using "latest" string) and API request (omitting version parameter)
|
|
80
|
+
- Impact: Registry refresh now works correctly for all registered models
|
|
81
|
+
- Solution: SDK now explicitly sends `version=latest` parameter when no version specified
|
|
82
|
+
- Error messages improved with actionable guidance when model/version not found
|
|
83
|
+
- Registry client now properly sends version parameter to API when provided
|
|
84
|
+
- Fixed duplicate `capture_output_data` parameter in agentic example causing syntax error
|
|
85
|
+
|
|
86
|
+
### Added
|
|
87
|
+
- Comprehensive integration tests for registry version parameter handling (7 new tests)
|
|
88
|
+
- Thread-safety validation tests for concurrent registry operations
|
|
89
|
+
- Detailed error messages for 404 responses with troubleshooting guidance
|
|
90
|
+
- DEBUG-level logging for cache operations (hits/misses)
|
|
91
|
+
- INFO-level logging for successful registry fetches with resolved version information
|
|
92
|
+
|
|
93
|
+
### Documentation
|
|
94
|
+
- Added thread-safety guarantees to RegistryClient class and cache method docstrings
|
|
95
|
+
- Updated fetch_model_config docstring to clarify version parameter behavior
|
|
96
|
+
- Type hints validated with mypy (zero errors)
|
|
97
|
+
- **Async Environment Usage**: Added warnings to RegistryClient docstring and README about synchronous locking and event loop blocking
|
|
98
|
+
- RegistryClient uses `threading.RLock` and is NOT safe to call from async functions
|
|
99
|
+
- Recommended pattern: Initialize during startup, enable background refresh, use @predict() decorator
|
|
100
|
+
- DO NOT call fetch_model_config() from FastAPI endpoints or async request handlers
|
|
101
|
+
|
|
102
|
+
## [0.8.5] - 2026-03-23
|
|
103
|
+
|
|
104
|
+
### Added
|
|
105
|
+
- **Mid-Lifecycle Telemetry Flush** (flush method)
|
|
106
|
+
- Added `flush()` method to MCAClient for forcing telemetry export without shutdown
|
|
107
|
+
- Allows batch processing scenarios to flush buffers between batches
|
|
108
|
+
- Safe to call mid-lifecycle, does not affect client state
|
|
109
|
+
- Returns boolean indicating success/failure across all providers
|
|
110
|
+
- Configurable timeout (default: 30 seconds)
|
|
111
|
+
|
|
112
|
+
### Changed
|
|
113
|
+
- Removed `capture_input_data` parameter from agentic agent example for cleaner configuration
|
|
114
|
+
|
|
115
|
+
## [0.8.4] - 2026-03-21
|
|
116
|
+
|
|
117
|
+
### Added
|
|
118
|
+
- **Configurable Metric Filtering** (Story 8.7)
|
|
119
|
+
- SDK now filters unnecessary auto-instrumentation and system metrics before export
|
|
120
|
+
- Dropped metric patterns: `process.*`, `system.*`, `asyncio.*`, `cpython.*`, `http.client.*`, `otel.sdk.*`, `test.*`, `rpc.*`
|
|
121
|
+
- Retained business metrics: `model.*`, `genai.*`, `agent.*`, `vendor.*`, `agentic.*`, `llm_eval/*`
|
|
122
|
+
- Filtering configurable via `filter_system_metrics` parameter (default: True)
|
|
123
|
+
- Reduces Cloud Monitoring costs by eliminating unnecessary custom metric descriptors
|
|
124
|
+
- Implemented using OpenTelemetry Views and DropAggregation
|
|
125
|
+
|
|
126
|
+
### Fixed
|
|
127
|
+
- **Model Version Fallback Bug**
|
|
128
|
+
- Fixed model_version not falling back to SDK version when not provided via config or registry
|
|
129
|
+
- Ensures model.version resource attribute is always populated for telemetry filtering
|
|
130
|
+
- **Missing Trace Coverage for ML Errors**
|
|
131
|
+
- Added trace span creation in record_error for predictive ML models
|
|
132
|
+
- Ensures errors are visible in distributed traces alongside metrics and logs
|
|
133
|
+
|
|
134
|
+
## [0.8.3] - 2026-03-20
|
|
135
|
+
|
|
136
|
+
### Fixed
|
|
137
|
+
- **Metric Cardinality Explosion & Trace Correlation Issues**
|
|
138
|
+
- Defensively pop `prediction_id`, `user_id`, and `session_id` from generic `attributes` in `record_prediction` and `record_error` to prevent metric cardinality explosions.
|
|
139
|
+
- Introduce `span_attributes` parameter in `record_prediction` and `record_error` to allow high-cardinality data safely attached to OpenTelemetry spans instead of metrics.
|
|
140
|
+
- Fix broken trace-to-error correlation in both manual error recording and batch tracking decorators by ensuring `prediction_id` flows through to spans and logging.
|
|
141
|
+
|
|
142
|
+
- **Trace Span Creation for Predictive & Generative Models**
|
|
143
|
+
- Added `mca_client.trace()` context manager around prediction loops.
|
|
144
|
+
- Generate `prediction_id` for trace correlation and add it as a span attribute.
|
|
145
|
+
- Enables trace visibility in GCP Traces Explorer.
|
|
146
|
+
|
|
147
|
+
- **Data Generation Tests**
|
|
148
|
+
- Updated data generation tests to match current model configuration.
|
|
149
|
+
|
|
150
|
+
## [0.8.2] - 2026-03-19
|
|
151
|
+
|
|
152
|
+
### Changed
|
|
153
|
+
|
|
154
|
+
- **Registry URL Optional in All Environments (Story 2.7 + Adversarial Review Fixes)**
|
|
155
|
+
- Registry connection is now optional in all environments (dev, prod, staging)
|
|
156
|
+
- Previously: dev/prod required registry_url and model_id, raised ConfigurationError if missing
|
|
157
|
+
- Now: SDK operates normally without registry in any environment, logs informational messages
|
|
158
|
+
- **CRITICAL FIXES** (from adversarial review):
|
|
159
|
+
- `_validate_registry_requirements()` now returns bool to actually control hydration (was theatrical before)
|
|
160
|
+
- Removed dangerous fallback to service_name in `_hydrate_from_registry()`
|
|
161
|
+
- Staging now skips hydration when auth missing (prevents slow 401/timeout on startup)
|
|
162
|
+
- Production defaults to `strict_validation=True` even without registry (prevents security downgrade)
|
|
163
|
+
- CLI template now comments out `model_id` by default (prevents log spam)
|
|
164
|
+
- When both registry_url and model_id are provided, authentication is still required (dev/prod)
|
|
165
|
+
- Staging skips hydration when auth incomplete (prevents startup performance degradation)
|
|
166
|
+
- **Migration**: Prod users without registry should explicitly set `strict_validation=True` if needed
|
|
167
|
+
- **Impact**: Removes artificial barrier for SDK users who don't need registry integration
|
|
168
|
+
- Test coverage: 8 tests (7 updated + 1 new AC2 telemetry test) with network isolation assertions
|
|
169
|
+
|
|
170
|
+
### Added
|
|
171
|
+
|
|
172
|
+
- **SDK Version in Resource Attributes (Story 1-21)**
|
|
173
|
+
- SDK version automatically added to all resource attributes
|
|
174
|
+
- Two attributes injected: `mca.sdk.version` (custom) and `telemetry.sdk.version` (OpenTelemetry standard)
|
|
175
|
+
- **Immutable**: Cannot be overridden by `extra_resource`, kwargs, or registry config
|
|
176
|
+
- **Universal**: Present in all telemetry signals (metrics, logs, traces)
|
|
177
|
+
- **Tamper-Proof**: User attempts to override are blocked, real SDK version is always used
|
|
178
|
+
- **Use Cases**: Track deployed SDK versions, correlate telemetry with version changes, backward compatibility analysis
|
|
179
|
+
- **Architecture**: Dedicated `mca_sdk/version.py` module eliminates circular dependencies
|
|
180
|
+
- **Testing**: Comprehensive unit and integration tests validate presence in actual exported payloads
|
|
181
|
+
- **Documentation**: Updated `docs/data-models.md` and `docs/api-contracts.md`
|
|
182
|
+
|
|
183
|
+
## [0.8.1] - 2026-03-19
|
|
184
|
+
|
|
185
|
+
### Fixed
|
|
186
|
+
|
|
187
|
+
- **LLM Completion Tracking Performance**
|
|
188
|
+
- Fixed major performance bug where OpenTelemetry instruments were dynamically created on every LLM call
|
|
189
|
+
- Implemented pre-created instrument caching in `genai.py` with thread-safe global cache
|
|
190
|
+
- Added `_get_instruments()` helper to retrieve or initialize instruments once per client
|
|
191
|
+
- Reduced overhead for high-frequency LLM operations (GenAI workloads)
|
|
192
|
+
- All metric instruments now created once and reused: requests_total, requests_failed_total, tokens_total, latency_seconds, cost_dollars, embedding_*
|
|
193
|
+
- Thread-safe implementation using locks to prevent race conditions
|
|
194
|
+
- Impact: Significant performance improvement for applications with high LLM request rates
|
|
195
|
+
|
|
196
|
+
### Changed
|
|
197
|
+
|
|
198
|
+
- **Registry URL Optional in All Environments (Story 2.7 + Adversarial Review Fixes)**
|
|
199
|
+
- Registry connection is now optional in all environments (dev, prod, staging)
|
|
200
|
+
- Previously: dev/prod required registry_url and model_id, raised ConfigurationError if missing
|
|
201
|
+
- Now: SDK operates normally without registry in any environment, logs informational messages
|
|
202
|
+
- **CRITICAL FIXES** (from adversarial review):
|
|
203
|
+
- `_validate_registry_requirements()` now returns bool to actually control hydration (was theatrical before)
|
|
204
|
+
- Removed dangerous fallback to service_name in `_hydrate_from_registry()`
|
|
205
|
+
- Staging now skips hydration when auth missing (prevents slow 401/timeout on startup)
|
|
206
|
+
- Production defaults to `strict_validation=True` even without registry (prevents security downgrade)
|
|
207
|
+
- CLI template now comments out `model_id` by default (prevents log spam)
|
|
208
|
+
- When both registry_url and model_id are provided, authentication is still required (dev/prod)
|
|
209
|
+
- Staging skips hydration when auth incomplete (prevents startup performance degradation)
|
|
210
|
+
- **Migration**: Prod users without registry should explicitly set `strict_validation=True` if needed
|
|
211
|
+
- **Impact**: Removes artificial barrier for SDK users who don't need registry integration
|
|
212
|
+
- Test coverage: 8 tests (7 updated + 1 new AC2 telemetry test) with network isolation assertions
|
|
213
|
+
|
|
214
|
+
## [0.8.0] - 2026-03-18
|
|
215
|
+
|
|
216
|
+
### Added
|
|
217
|
+
|
|
218
|
+
- **SDK Version in Resource Attributes (Story 1-21)**
|
|
219
|
+
- SDK version automatically added to all resource attributes
|
|
220
|
+
- Two attributes injected: `mca.sdk.version` (custom) and `telemetry.sdk.version` (OpenTelemetry standard)
|
|
221
|
+
- **Immutable**: Cannot be overridden by `extra_resource`, kwargs, or registry config
|
|
222
|
+
- **Universal**: Present in all telemetry signals (metrics, logs, traces)
|
|
223
|
+
- **Tamper-Proof**: User attempts to override are blocked, real SDK version is always used
|
|
224
|
+
- **Use Cases**: Track deployed SDK versions, correlate telemetry with version changes, backward compatibility analysis
|
|
225
|
+
- **Architecture**: Dedicated `mca_sdk/version.py` module eliminates circular dependencies
|
|
226
|
+
- **Testing**: Comprehensive unit and integration tests validate presence in actual exported payloads
|
|
227
|
+
- **Documentation**: Updated `docs/data-models.md` and `docs/api-contracts.md`
|
|
228
|
+
### Changed (BREAKING)
|
|
229
|
+
|
|
230
|
+
- **PHI/PII Masking Removed**
|
|
231
|
+
- PHI_PATTERNS regex list removed from client.py
|
|
232
|
+
- _sanitize_phi() function removed from gcp_logging.py
|
|
233
|
+
- All PHI masking tests removed (test_phi_masking.py, test_gcp_logging_phi.py)
|
|
234
|
+
- "Dual-purpose masking" security model removed
|
|
235
|
+
- **KEPT**: CREDENTIAL_PATTERNS and credential masking (unchanged)
|
|
236
|
+
- **KEPT**: phi_utils.py field name extraction (helps apps identify PHI)
|
|
237
|
+
- **Impact**: Applications now have 100% responsibility for PHI sanitization
|
|
238
|
+
- **SDK only masks technical credentials** (AWS/GCP keys, tokens, JWTs)
|
|
239
|
+
- **No breaking API changes** - removal is internal implementation only
|
|
240
|
+
- **Migration**: Review your application code to ensure PHI is sanitized BEFORE calling SDK methods
|
|
241
|
+
- Do not rely on SDK to catch PHI patterns
|
|
242
|
+
- Use `phi_utils.extract_phi_field_names()` to identify PHI fields from registry
|
|
243
|
+
- **Rationale**: SDK cannot know domain-specific PHI context. Regex-based masking is insufficient and creates false positives. Clear responsibility boundaries prevent security assumptions.
|
|
244
|
+
|
|
245
|
+
### Changed (BREAKING)
|
|
246
|
+
|
|
247
|
+
- **Default Data Capture Enabled**
|
|
248
|
+
- `capture_input_data` default changed from `False` to `True`
|
|
249
|
+
- `capture_output_data` default changed from `False` to `True`
|
|
250
|
+
- `capture_input` default changed from `False` to `True` (Decorators)
|
|
251
|
+
- `capture_output` default changed from `False` to `True` (Decorators)
|
|
252
|
+
- `record_error_messages` default changed from `False` to `True` (LiteLLM Callback)
|
|
253
|
+
- `persist_queue` default changed from `False` to `True` (Buffering)
|
|
254
|
+
- **Impact**: Prompts, completions, errors, and input/output payload traces are NOW captured and buffered by default.
|
|
255
|
+
- **Migration**: Explicitly set these parameters to `False` if you do not want input/output capture.
|
|
256
|
+
- **Rationale**: PII and PHI handling relies on downstream access controls and sanitization policies.
|
|
257
|
+
- Affects:
|
|
258
|
+
- `MCAConfig` defaults
|
|
259
|
+
- `create_genai_client()` helper function (now defaults to True)
|
|
260
|
+
- `MCALiteLLMCallback` fallback defaults and constructor
|
|
261
|
+
- `@predict()` and `@instrument_model` decorator behavior
|
|
262
|
+
|
|
263
|
+
### Added
|
|
264
|
+
|
|
265
|
+
- **Thresholds as Resource Attributes (Production-Ready)**
|
|
266
|
+
- Registry API thresholds automatically added as OpenTelemetry resource attributes
|
|
267
|
+
- Thresholds prefixed with `threshold.` (e.g., `threshold.latency_ms`, `threshold.accuracy_min`)
|
|
268
|
+
- **Preserves native numeric types**: int stays int, float stays float (no forced conversion)
|
|
269
|
+
- Enables proper numeric filtering, sorting, and aggregations in downstream systems
|
|
270
|
+
- **IMPORTANT:** Resources are immutable - thresholds evaluated ONCE at SDK initialization
|
|
271
|
+
- **Comprehensive Safeguards:**
|
|
272
|
+
- Boolean rejection: Explicitly rejects `bool` types (subclass of `int` in Python)
|
|
273
|
+
- Infinity rejection: `math.isinf()` check prevents OpenTelemetry exporter crashes
|
|
274
|
+
- NaN rejection: `math.isnan()` check prevents invalid telemetry data
|
|
275
|
+
- None rejection: Prevents string "None" pollution
|
|
276
|
+
- Maximum 50 thresholds: First 50 kept (dict iteration order), rest dropped with clear warning
|
|
277
|
+
- Key sanitization with collision detection: Invalid chars→`_`, collisions logged
|
|
278
|
+
- Key length accounting: Max 53-char names (63 total with "threshold." prefix)
|
|
279
|
+
- User precedence: User-provided `extra_resource` keys never silently overwritten
|
|
280
|
+
- Module-level imports: `math` and `re` imported at module level (not function level)
|
|
281
|
+
- SDK logger used throughout (not global `logging`)
|
|
282
|
+
|
|
283
|
+
## [0.7.7] - 2026-03-12
|
|
284
|
+
|
|
285
|
+
### Fixed
|
|
286
|
+
|
|
287
|
+
- **Registry Token Validation with GCP Auth**
|
|
288
|
+
- Allow GCP auth without requiring registry token in production environment
|
|
289
|
+
- Fixed validation logic to check for `use_gcp_auth` before requiring `MCA_REGISTRY_TOKEN`
|
|
290
|
+
- When `use_gcp_auth=True`, token is no longer required
|
|
291
|
+
|
|
292
|
+
## [0.7.2] - 2026-03-10
|
|
293
|
+
|
|
294
|
+
### Fixed
|
|
295
|
+
|
|
296
|
+
- **mca-instrument Endpoint Mapping**
|
|
297
|
+
- Map `MCA_COLLECTOR_ENDPOINT` to `OTEL_EXPORTER_OTLP_ENDPOINT` for opentelemetry-instrument
|
|
298
|
+
- Map `MCA_SERVICE_NAME` to `OTEL_SERVICE_NAME` for proper service identification
|
|
299
|
+
- Fixes issue where telemetry was sent to localhost instead of configured collector endpoint
|
|
300
|
+
|
|
301
|
+
## [0.7.1] - 2026-03-09
|
|
302
|
+
|
|
303
|
+
### Fixed
|
|
304
|
+
|
|
305
|
+
- **CLI Entry Points Not Installed**
|
|
306
|
+
- Added `[project.scripts]` section to `pyproject.toml` for CLI tools
|
|
307
|
+
- Fixes `mca-init`, `mca-instrument`, and `mca-run` commands not being available after pip install
|
|
308
|
+
- CLI tools now properly installed to user's PATH
|
|
309
|
+
|
|
310
|
+
## [0.7.0] - 2026-03-09
|
|
311
|
+
|
|
312
|
+
### Changed (BREAKING)
|
|
313
|
+
|
|
314
|
+
- **Default Validation Mode Changed to Relaxed**
|
|
315
|
+
- `strict_validation` default changed from `True` to `False`
|
|
316
|
+
- **Impact**: Users who relied on default strict validation will now get relaxed validation
|
|
317
|
+
- **Migration**: Explicitly set `strict_validation=True` if you need strict validation
|
|
318
|
+
- **Rationale**: Lower barrier to entry for development and prototyping while maintaining production safety
|
|
319
|
+
|
|
320
|
+
### Added
|
|
321
|
+
|
|
322
|
+
- **Flexible Validation System**
|
|
323
|
+
- Relaxed validation mode (new default): Only requires `service.name`
|
|
324
|
+
- Strict validation mode: Requires all model-type-specific fields (auto-enabled for registry integration)
|
|
325
|
+
- INFO-level logging for missing optional fields in relaxed mode
|
|
326
|
+
- Auto-detection: Strict validation automatically enabled when `registry_url` is configured
|
|
327
|
+
|
|
328
|
+
### Fixed
|
|
329
|
+
|
|
330
|
+
- **Package Configuration Sync**
|
|
331
|
+
- Synced `pyproject.toml` with `setup.py` to include all optional dependencies
|
|
332
|
+
- Added missing extras: `prometheus`, `gcp-auth`, `gcp-secrets`, `gcp-trace`, `gcp-logging`, `autolog`, `instrument`
|
|
333
|
+
- Fixed `[instrument]` extra not being available in published package
|
|
334
|
+
- Users can now install: `pip install "mca-sdk[instrument]"` for zero-code instrumentation
|
|
335
|
+
|
|
336
|
+
### Migration Guide
|
|
337
|
+
|
|
338
|
+
**If you need strict validation** (all model-type fields required):
|
|
339
|
+
```python
|
|
340
|
+
# Option 1: Explicit configuration
|
|
341
|
+
client = MCAClient(
|
|
342
|
+
service_name="my-model",
|
|
343
|
+
strict_validation=True, # Explicitly enable
|
|
344
|
+
# ... other required fields
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
# Option 2: Use registry integration (auto-enables strict validation)
|
|
348
|
+
client = MCAClient(
|
|
349
|
+
service_name="my-model",
|
|
350
|
+
registry_url="https://registry.example.com", # Auto-enables strict validation
|
|
351
|
+
# ... other required fields
|
|
352
|
+
)
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
**If you want minimal validation** (service_name only):
|
|
356
|
+
```python
|
|
357
|
+
# Default behavior in v0.7.0 - no changes needed
|
|
358
|
+
client = MCAClient(service_name="my-model") # Works!
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
## [0.6.7] - 2026-03-05
|
|
362
|
+
|
|
363
|
+
### Fixed
|
|
364
|
+
- Add missing resource attributes for agentic model type
|
|
365
|
+
|
|
366
|
+
## [0.6.5] - 2026-03-05
|
|
367
|
+
|
|
368
|
+
### Fixed
|
|
369
|
+
- Lower OpenTelemetry requirement to >=1.35.0 for google-adk compatibility
|
|
370
|
+
|
|
371
|
+
## [0.6.4] - 2026-03-05
|
|
372
|
+
|
|
373
|
+
### Fixed
|
|
374
|
+
- Export print_gcp_auth_status and print_collector_status from shared module
|
|
375
|
+
- Add fallback for OpenTelemetry logs import compatibility across versions
|
|
376
|
+
|
|
377
|
+
## [0.6.1] - 2026-02-26
|
|
378
|
+
|
|
379
|
+
### Fixed
|
|
380
|
+
- **CRITICAL: Context Token Handling in Agentic AI Goal Tracking**
|
|
381
|
+
- Fixed TypeError when detaching context in `record_goal_completed()`
|
|
382
|
+
- **Problem**: `record_goal_started()` was incorrectly using `trace.use_span()` which returns a context manager, not a Token
|
|
383
|
+
- **Error**: `TypeError: expected an instance of Token, got _AgnosticContextManager`
|
|
384
|
+
- **Solution**: Changed to use `context.attach(trace.set_span_in_context(span))` for proper Token handling
|
|
385
|
+
- **Impact**: All users of `record_goal_started()` + `record_goal_completed()` were affected
|
|
386
|
+
- **Severity**: High - causes runtime errors for agentic AI features
|
|
387
|
+
|
|
388
|
+
### Documentation
|
|
389
|
+
- Rebuilt end-to-end demo notebook with comprehensive v0.6.0 feature coverage
|
|
390
|
+
- Added demonstrations of all 11 telemetry features
|
|
391
|
+
- Added model input/output capture examples (Story 1-18)
|
|
392
|
+
- Fixed `record_goal_started()` parameter usage in examples
|
|
393
|
+
- Created notebooks/README.md with usage guide and troubleshooting
|
|
394
|
+
|
|
395
|
+
## [0.6.0] - 2026-02-26
|
|
396
|
+
|
|
397
|
+
### Added
|
|
398
|
+
- **GCP Authentication Support for Registry Client**
|
|
399
|
+
- Added `use_gcp_auth` parameter to `RegistryClient` initialization
|
|
400
|
+
- Enables automatic GCP credential-based authentication for Registry API
|
|
401
|
+
- Properly passed from `MCAConfig` to `RegistryClient` in client initialization
|
|
402
|
+
|
|
403
|
+
- **Comprehensive End-to-End Tests** (Story 6-16)
|
|
404
|
+
- Full OTLP JSON validation for metrics, logs, and traces
|
|
405
|
+
- Multi-model telemetry validation across all model types
|
|
406
|
+
- Error scenario testing (network failures, invalid data, collector downtime)
|
|
407
|
+
- Context propagation validation for distributed tracing
|
|
408
|
+
|
|
409
|
+
- **Integration Tests with OTel Collector** (Story 6-7)
|
|
410
|
+
- Real collector telemetry flow validation
|
|
411
|
+
- High availability features testing (HPA, persistent volumes, DLQ)
|
|
412
|
+
- Collector self-monitoring validation
|
|
413
|
+
- Batch processing and attribute enrichment verification
|
|
414
|
+
|
|
415
|
+
- **Load Testing Framework** (Story 6-8)
|
|
416
|
+
- Performance testing at 1000 req/s
|
|
417
|
+
- Telemetry completeness validation
|
|
418
|
+
- Collector monitoring utilities
|
|
419
|
+
- Load test report generation
|
|
420
|
+
|
|
421
|
+
- **Integration Guides** (Story 5-5)
|
|
422
|
+
- Complete guides for Predictive ML, GenAI, Agentic AI, and Vendor Bridge patterns
|
|
423
|
+
- pytest-based testing examples for each model type
|
|
424
|
+
- Context propagation explanations with code examples
|
|
425
|
+
|
|
426
|
+
- **Input/Output Capture** (Story 1-18)
|
|
427
|
+
- Enhanced `@predict()` decorator with input/output span attachment
|
|
428
|
+
- Configurable via `capture_input` and `capture_output` parameters
|
|
429
|
+
- Sanitization warnings for PHI protection
|
|
430
|
+
|
|
431
|
+
### Changed
|
|
432
|
+
- **OTel Collector Configuration Updates**
|
|
433
|
+
- Enhanced self-monitoring metrics collection
|
|
434
|
+
- Improved batch processor settings for high throughput
|
|
435
|
+
- Updated attributes processor for GCP metadata enrichment
|
|
436
|
+
|
|
437
|
+
- **Integration Decorator Improvements**
|
|
438
|
+
- Fixed `@predict()` and `@batch_predict()` decorators
|
|
439
|
+
- Better error handling and span lifecycle management
|
|
440
|
+
- Improved attribute validation and length limits
|
|
441
|
+
|
|
442
|
+
### Fixed
|
|
443
|
+
- Registry client GCP authentication parameter propagation from config
|
|
444
|
+
- Path validation in `TelemetryQueue` for disk persistence
|
|
445
|
+
- `ModelConfig` backward compatibility for older API responses
|
|
446
|
+
- Pipeline test failures in CI/CD
|
|
447
|
+
- Instrumentation decorator attribute handling
|
|
448
|
+
|
|
449
|
+
### Documentation
|
|
450
|
+
- Updated downstream integration docs for dot notation metric naming
|
|
451
|
+
- Added collector metrics guide
|
|
452
|
+
- Enhanced Kubernetes deployment README with HA features
|
|
453
|
+
- Added Pub/Sub DLQ documentation and replay processor
|
|
454
|
+
|
|
455
|
+
## [0.5.1] - 2026-02-25
|
|
456
|
+
|
|
457
|
+
### Fixed
|
|
458
|
+
- **CRITICAL: GenAI Metric Double-Prefix Bug** (Production Issue)
|
|
459
|
+
- Fixed incorrect metric names in Google Cloud Monitoring / Managed Prometheus
|
|
460
|
+
- **Problem**: Metrics appeared as `emms_emms_genai_requests_total` instead of `emms_genai_requests_total`
|
|
461
|
+
- **Root Cause**: GenAI integration was prepending `emms_` prefix, but OTel Collector's Prometheus exporter also adds namespace prefix
|
|
462
|
+
- **Solution**: Switched to dot notation (`genai.requests_total`) matching predictive ML pattern
|
|
463
|
+
- **Affected Components**:
|
|
464
|
+
- `track_llm_completion()` in `genai.py`
|
|
465
|
+
- `track_llm_embedding()` in `genai.py`
|
|
466
|
+
- `batch_predict` decorator in `decorators.py`
|
|
467
|
+
- Metric validation schema updated to expect dot notation
|
|
468
|
+
- **Impact**: All GenAI metrics from deployed agents (AI Ops Agent dogfooding) now report correctly
|
|
469
|
+
- **Migration**: If you query Prometheus/GMP directly, update queries from `emms_emms_genai_*` to `emms_genai_*`
|
|
470
|
+
|
|
471
|
+
### Changed
|
|
472
|
+
- Metric naming convention now uses dot notation for all metric types (e.g., `genai.requests_total`, `model.predictions_total`)
|
|
473
|
+
- Validation schema updated to reflect dot-notation pattern
|
|
474
|
+
|
|
475
|
+
## [0.5.0] - 2026-02-25
|
|
476
|
+
|
|
477
|
+
### Added
|
|
478
|
+
- **Registry API GCP Authentication Documentation**
|
|
479
|
+
- New comprehensive guide: [`docs/registry-gcp-auth-guide.md`](docs/registry-gcp-auth-guide.md)
|
|
480
|
+
- Covers all authentication methods: ADC, service account JSON, Workload Identity, gcloud CLI
|
|
481
|
+
- Complete examples for Vertex AI Workbench, Cloud Run, GKE, and local development
|
|
482
|
+
- Token management and automatic refresh documentation
|
|
483
|
+
- Troubleshooting guide with common issues and solutions
|
|
484
|
+
- Security best practices for production deployments
|
|
485
|
+
- Verified with integration tests against real Registry API
|
|
486
|
+
|
|
487
|
+
- **GCP Cloud Trace Direct Export** (Story 6-3)
|
|
488
|
+
- New `GCPCloudTraceExporter` for exporting traces directly to Google Cloud Trace
|
|
489
|
+
- Configuration fields: `gcp_trace_enabled` (bool), `gcp_project_id` (str)
|
|
490
|
+
- Environment variables: `MCA_GCP_TRACE_ENABLED`, `MCA_GCP_PROJECT_ID`
|
|
491
|
+
- Full span fidelity: status codes, span kinds, links, events, resource attributes
|
|
492
|
+
- Production features: retry logic, timeout protection, batch splitting, validation
|
|
493
|
+
- Internal telemetry metrics for observability (spans exported, failures, retries)
|
|
494
|
+
- Install with: `pip install mca-sdk[gcp-trace]` or `pip install mca-sdk[gcp]`
|
|
495
|
+
- **Note**: Requires GCP credentials with scope `https://www.googleapis.com/auth/trace.append`
|
|
496
|
+
|
|
497
|
+
- **Registry API Response Structure Updates** (Story 2.2 - API Integration)
|
|
498
|
+
- Updated [`ModelConfig`](mca-prototype/mca_sdk/registry/models.py) dataclass to match actual API response structure
|
|
499
|
+
- Added `registry_id` field (optional, can be null for vendor models)
|
|
500
|
+
- Added `deployment_id` field (optional, can be null for vendor models)
|
|
501
|
+
- Added `association_id_column` field (optional, for time-series models)
|
|
502
|
+
- Added `created_at` and `updated_at` timestamp fields (optional, for debugging)
|
|
503
|
+
- Updated [`RegistryClient`](mca-prototype/mca_sdk/registry/client.py) to correctly extract fields from API response:
|
|
504
|
+
- `model_version` now extracted from top-level (not nested in config)
|
|
505
|
+
- `thresholds` extracted from top-level (not nested in config)
|
|
506
|
+
- `extra_resource` extracted from nested `config.extra_resource` (not top-level)
|
|
507
|
+
- Handles `config: null` case gracefully
|
|
508
|
+
- Handles `phi_fields: {}` empty dict case
|
|
509
|
+
- Added [`extract_phi_field_names()`](mca-prototype/mca_sdk/utils/phi_utils.py) utility function
|
|
510
|
+
- Extracts field names from nested PHI structure: `{"patient_id": {"criticality": "yes"}}`
|
|
511
|
+
- Handles empty dict case: `{}`
|
|
512
|
+
- Used for PHI masking operations
|
|
513
|
+
- **Note**: All `extra_resource` values are strings (JSONB storage), passed as-is to OpenTelemetry
|
|
514
|
+
|
|
515
|
+
### Changed
|
|
516
|
+
- **BREAKING CHANGE: predict() Decorator Defaults** (Story 1.13.6 - Adversarial Review Finding 1)
|
|
517
|
+
- `capture_input` default changed from `True` to **`False`**
|
|
518
|
+
- `capture_output` default changed from `True` to **`False`**
|
|
519
|
+
- **Rationale**: Safer HIPAA compliance defaults - prevents accidental PHI capture
|
|
520
|
+
- **Migration Guide**: If you rely on automatic input/output capture, explicitly set parameters:
|
|
521
|
+
```python
|
|
522
|
+
# OLD (implicit True - will now be False)
|
|
523
|
+
@client.predict()
|
|
524
|
+
def predict(data):
|
|
525
|
+
return model.predict(data)
|
|
526
|
+
|
|
527
|
+
# NEW (explicit opt-in required)
|
|
528
|
+
@client.predict(capture_input=True, capture_output=True)
|
|
529
|
+
def predict(data):
|
|
530
|
+
# IMPORTANT: Ensure data is sanitized before calling
|
|
531
|
+
return model.predict(data)
|
|
532
|
+
```
|
|
533
|
+
- **Impact**: Code using `@client.predict()` without parameters will no longer capture input/output data
|
|
534
|
+
- **Security**: This change reduces risk of accidental PHI exposure in telemetry
|
|
535
|
+
|
|
536
|
+
### Added
|
|
537
|
+
- **Enhanced PHI Masking Patterns** (Story 1.13.6 - Adversarial Review Finding 2)
|
|
538
|
+
- Added ZIP code pattern (5-digit and ZIP+4 formats)
|
|
539
|
+
- Added common name patterns (First Last, Last First formats)
|
|
540
|
+
- Added street address pattern (basic detection)
|
|
541
|
+
- **Note**: Regex-based PHI masking has inherent limitations. Applications MUST sanitize data before instrumentation.
|
|
542
|
+
|
|
543
|
+
### Security
|
|
544
|
+
- Improved default security posture for data capture in predict() decorator
|
|
545
|
+
- Expanded PHI detection patterns for better protection in error messages and logs
|
|
546
|
+
|
|
547
|
+
### Changed (from Unreleased)
|
|
548
|
+
- **BREAKING CHANGE: HTTPS Enforcement** (Story 3.7)
|
|
549
|
+
- Both `registry_url` and `collector_endpoint` now **require HTTPS** for non-localhost endpoints
|
|
550
|
+
- HTTP connections to production endpoints are blocked with `ConfigurationError`
|
|
551
|
+
- **Migration Guide**: Update all production endpoint URLs from `http://` to `https://`
|
|
552
|
+
- Localhost exception: HTTP remains allowed for `localhost`, full `127.0.0.0/8` range, and `::1` for development
|
|
553
|
+
- Enhanced security validation prevents credential exposure over unencrypted connections
|
|
554
|
+
- **Previous Behavior**: HTTP to production endpoints raised a `SecurityWarning` but was allowed
|
|
555
|
+
- **New Behavior**: HTTP to production endpoints raises `ConfigurationError` and blocks initialization
|
|
556
|
+
|
|
557
|
+
### Security
|
|
558
|
+
- Enhanced loopback detection with full IPv4 127.0.0.0/8 range support and IPv6 ::1
|
|
559
|
+
- Protection against hostname substring attacks (e.g., `localhost.attacker.com`)
|
|
560
|
+
- Case-insensitive localhost matching per RFC 4343
|
|
561
|
+
|
|
562
|
+
## [0.4.0] - 2026-01-26
|
|
563
|
+
|
|
564
|
+
### Added
|
|
565
|
+
- **Background Registry Refresh Thread** (Story 2.3)
|
|
566
|
+
- Automatic refresh of registry config at configurable intervals
|
|
567
|
+
- Daemon thread with graceful shutdown
|
|
568
|
+
- Thread-safe config updates with locking
|
|
569
|
+
- Comprehensive unit tests for thread safety and lifecycle
|
|
570
|
+
|
|
571
|
+
- **Attributes Processor Integration** (Story 4.3)
|
|
572
|
+
- OpenTelemetry Collector attributes processor for metadata enrichment
|
|
573
|
+
- Automatic addition of `gcp.region` and `environment` attributes
|
|
574
|
+
- Non-overwriting insertion semantics to preserve existing attributes
|
|
575
|
+
- Validated with functional testing across all telemetry types (metrics, logs, traces)
|
|
576
|
+
|
|
577
|
+
- **Enhanced Demo Scripts**
|
|
578
|
+
- OTLP endpoint configuration for better local development
|
|
579
|
+
- Improved logging and error handling
|
|
580
|
+
|
|
581
|
+
### Changed
|
|
582
|
+
- **OpenTelemetry Dependencies** - Updated from 1.20.0 to 1.39.0
|
|
583
|
+
- `opentelemetry-api>=1.39.0`
|
|
584
|
+
- `opentelemetry-sdk>=1.39.0`
|
|
585
|
+
- `opentelemetry-exporter-otlp-proto-http>=1.39.0`
|
|
586
|
+
- **Breaking Changes**: OTel 1.39.0 includes significant changes including `LogData` removal (replaced with `ReadableLogRecord`/`ReadWriteLogRecord`), Events API deprecation, and Python 3.8 support dropped. Review [OTel Python CHANGELOG](https://github.com/open-telemetry/opentelemetry-python/blob/main/CHANGELOG.md) for migration guidance.
|
|
587
|
+
- **Dependency Reorganization** - Moved `requests` from core dependencies to optional `[vendor]` extras. Install with `pip install mca-sdk[vendor]` if using vendor model integrations.
|
|
588
|
+
|
|
589
|
+
### Fixed
|
|
590
|
+
- CI pipeline refinements for better reliability
|
|
591
|
+
- Removed orphaned pyproject.toml scan after merge
|
|
592
|
+
- Updated pip-audit command to skip editable packages
|
|
593
|
+
|
|
594
|
+
### Security
|
|
595
|
+
- Added `protobuf>=5.0,<6.0` constraint to mitigate CVE-2026-0994 (DoS via nested Any messages) until patched version is available
|
|
596
|
+
|
|
597
|
+
## [0.3.0] - 2026-01-22
|
|
598
|
+
|
|
599
|
+
### Added
|
|
600
|
+
- **Custom Exception Hierarchy** (Story 1.14)
|
|
601
|
+
- `MCASDKError` - Base exception class for all SDK errors
|
|
602
|
+
- `ValidationError` - Raised when validation fails (metric names, attributes)
|
|
603
|
+
- `BufferingError` - Raised when buffering operations fail (queue full, disk failure)
|
|
604
|
+
- `ConfigurationError` - Raised when configuration is invalid or incomplete
|
|
605
|
+
- `RegistryError` - Base exception for registry operations
|
|
606
|
+
- `RegistryConnectionError` - Raised when unable to connect to registry
|
|
607
|
+
- `RegistryConfigNotFoundError` - Raised when model config not found in registry
|
|
608
|
+
- `RegistryAuthError` - Raised when registry authentication fails
|
|
609
|
+
- All exceptions exported from main `mca_sdk` package for easy catching
|
|
610
|
+
- Helpful error messages with context for debugging
|
|
611
|
+
|
|
612
|
+
### Changed
|
|
613
|
+
- **Enhanced Configuration Validation** (Story 1.15)
|
|
614
|
+
- `MCAConfig.__post_init__` now raises `ConfigurationError` (was generic `Exception`)
|
|
615
|
+
- `MCAConfig.from_env` raises `ConfigurationError` for invalid integer values
|
|
616
|
+
- `MCAConfig.from_file` raises `ConfigurationError` for file/parsing errors
|
|
617
|
+
- `MCAConfig.load` enforces security: `registry_token` via environment only
|
|
618
|
+
- Better error messages with suggested fixes for missing `service_name`
|
|
619
|
+
- URL validation for `collector_endpoint` and `registry_url`
|
|
620
|
+
- Security warnings for HTTP endpoints (non-localhost) using `SecurityWarning` category
|
|
621
|
+
|
|
622
|
+
## [0.2.0] - 2026-01-12
|
|
623
|
+
|
|
624
|
+
### Added
|
|
625
|
+
- **Model Registry Integration**: Centralized configuration management system
|
|
626
|
+
- `RegistryClient` for fetching model config from registry API
|
|
627
|
+
- Support for `GET /models/{model_id}` and `GET /deployments/{deployment_id}` endpoints
|
|
628
|
+
- Automatic retry with exponential backoff using existing `RetryPolicy`
|
|
629
|
+
- In-memory cache with configurable TTL (default 10 minutes)
|
|
630
|
+
- Bearer token authentication with HTTPS enforcement
|
|
631
|
+
|
|
632
|
+
- **Dynamic Configuration**
|
|
633
|
+
- `MCAConfig` extended with 5 new fields: `registry_url`, `registry_token`, `refresh_interval_secs`, `prefer_registry`, `deployment_id`
|
|
634
|
+
- Environment variable support: `MCA_REGISTRY_URL`, `MCA_REGISTRY_TOKEN`, etc.
|
|
635
|
+
- Config precedence: kwargs > registry > env > YAML > defaults
|
|
636
|
+
|
|
637
|
+
- **Background Refresh**
|
|
638
|
+
- Automatic refresh of thresholds and PHI fields every 10 minutes (configurable)
|
|
639
|
+
- Identity fields (service_name, model_id) are immutable after startup
|
|
640
|
+
- Graceful handling of registry failures with fallback to last-known config
|
|
641
|
+
|
|
642
|
+
- **PHI Fields Management**
|
|
643
|
+
- Union of local and registry PHI fields for comprehensive masking
|
|
644
|
+
- Dynamic updates via background refresh
|
|
645
|
+
|
|
646
|
+
- **Registry Telemetry**
|
|
647
|
+
- Self-monitoring metrics: `mca.registry.refresh_success_total`, `mca.registry.refresh_latency_seconds`, `mca.registry.errors_total`
|
|
648
|
+
|
|
649
|
+
- **Security**
|
|
650
|
+
- HTTPS required for non-localhost registry endpoints
|
|
651
|
+
- Token never logged (even at DEBUG level)
|
|
652
|
+
- Query parameters excluded from logs
|
|
653
|
+
|
|
654
|
+
- **Testing**
|
|
655
|
+
- 22 unit tests for RegistryClient (fetch, cache, retry, auth)
|
|
656
|
+
- 11 unit tests for hydration flow and config precedence
|
|
657
|
+
- 8 integration tests with FastAPI mock registry
|
|
658
|
+
|
|
659
|
+
### Changed
|
|
660
|
+
- `MCAClient.__init__` now performs registry hydration before provider setup
|
|
661
|
+
- `MCAClient.shutdown` now stops background refresh thread and closes registry client
|
|
662
|
+
- `setup_all_providers` accepts `extra_resource` parameter for registry attributes
|
|
663
|
+
- Provider resource attributes now include registry-provided `extra_resource` fields
|
|
664
|
+
|
|
665
|
+
### API Additions
|
|
666
|
+
- `MCAClient.thresholds` property - Access current thresholds from registry
|
|
667
|
+
- `RegistryClient` class exported from main package
|
|
668
|
+
- `ModelConfig` and `DeploymentConfig` dataclasses exported from main package
|
|
669
|
+
|
|
670
|
+
## [0.1.0] - 2026-01-21
|
|
671
|
+
|
|
672
|
+
### Added
|
|
673
|
+
- Core MCA SDK with `MCAClient` for HIPAA-compliant OpenTelemetry instrumentation
|
|
674
|
+
- Multi-source configuration system with precedence: kwargs > registry > env > YAML > defaults
|
|
675
|
+
- Registry integration with automatic caching and retry mechanisms
|
|
676
|
+
- Validation and buffering systems for telemetry data
|
|
677
|
+
- Schema validation for metric naming and resource attributes
|
|
678
|
+
- Four working SDK examples:
|
|
679
|
+
- Internal model instrumentation
|
|
680
|
+
- GenAI model integration
|
|
681
|
+
- Agentic AI workflows
|
|
682
|
+
- Vendor model integration
|
|
683
|
+
- Docker Compose orchestration for local development
|
|
684
|
+
- Integration helpers for vendor models, GenAI, and Python decorators
|
|
685
|
+
- Comprehensive test suite with unit and integration tests
|
|
686
|
+
- Support for Python 3.10, 3.11, and 3.12
|
|
687
|
+
|
|
688
|
+
### Changed
|
|
689
|
+
- Buffering disabled by default for backward compatibility
|
|
690
|
+
- Improved demo scripts with better logging and metric handling
|
|
691
|
+
- Refactored metric names for consistency and clarity
|
|
692
|
+
|
|
693
|
+
### Removed
|
|
694
|
+
- PHI detection and masking features (architectural decision to simplify initial release)
|
|
695
|
+
|
|
696
|
+
### Fixed
|
|
697
|
+
- Buffering backward compatibility in `from_env()` configuration
|
|
698
|
+
- Critical `SecurityWarning` class placement in `MCAConfig`
|
|
699
|
+
- Multiple security and reliability issues identified in code review
|
|
700
|
+
- Test coverage expanded to meet 85% requirement
|
|
701
|
+
|
|
702
|
+
### Security
|
|
703
|
+
- Security hardening for multi-source configuration system
|
|
704
|
+
- Registry token blocked from YAML configuration files to prevent credential exposure
|
|
705
|
+
- Localhost validation fixed to prevent substring attacks
|
|
706
|
+
- Comprehensive security review addressing CRITICAL and HIGH priority issues
|
|
707
|
+
|
|
708
|
+
[unreleased]: https://gitlab.com/bhsf/ai_ml/mca-sdk/compare/v0.8.0...HEAD
|
|
709
|
+
[0.8.0]: https://gitlab.com/bhsf/ai_ml/mca-sdk/releases/tag/v0.8.0
|
|
710
|
+
[0.1.0]: https://gitlab.com/bhsf/ai_ml/mca-sdk/releases/tag/v0.1.0
|