From 941e03cf325f2f8e48400e03e62da80e6a4ad2bf Mon Sep 17 00:00:00 2001 From: Oliver Kieselbach Date: Tue, 21 Apr 2026 02:56:18 +0200 Subject: [PATCH] refactor(agent-v2): rename telemetry endpoint to /api/agent/telemetry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Place the new V2 ingest route under the existing /api/agent/* namespace (where all other agent-writes live: register-session, ingest, config, upload-url) instead of the orphan /api/telemetry/* bucket. Agent writes vs. admin/web reads is the thematic split used throughout the repo — /api/sessions/* is reserved for read-side and admin action routes. Constant renamed TelemetryBatch → IngestTelemetry to mirror the legacy IngestEvents pattern; semantic successor, heterogeneous TelemetryItem[] payload replacing per-type ingest once Legacy is decommissioned. No wire-format or handler changes — URL string only. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../Transport/BackendTelemetryUploaderTests.cs | 2 +- .../Transport/Telemetry/BackendTelemetryUploader.cs | 4 ++-- .../Transport/Telemetry/IBackendTelemetryUploader.cs | 2 +- src/Shared/AutopilotMonitor.Shared/Constants.cs | 7 ++++--- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/Agent/AutopilotMonitor.Agent.V2.Core.Tests/Transport/BackendTelemetryUploaderTests.cs b/src/Agent/AutopilotMonitor.Agent.V2.Core.Tests/Transport/BackendTelemetryUploaderTests.cs index 50d3d5da..0baf96bc 100644 --- a/src/Agent/AutopilotMonitor.Agent.V2.Core.Tests/Transport/BackendTelemetryUploaderTests.cs +++ b/src/Agent/AutopilotMonitor.Agent.V2.Core.Tests/Transport/BackendTelemetryUploaderTests.cs @@ -13,7 +13,7 @@ namespace AutopilotMonitor.Agent.V2.Core.Tests.Transport public sealed class BackendTelemetryUploaderTests { private const string BaseUrl = "https://backend.test"; - private const string ExpectedEndpoint = "https://backend.test/api/telemetry/batch"; + private const string ExpectedEndpoint = "https://backend.test/api/agent/telemetry"; private static readonly DateTime At = new DateTime(2026, 4, 20, 10, 0, 0, DateTimeKind.Utc); private static TelemetryItem NewEventItem(long id, string sessionId = "S1", string tenantId = "T1") => diff --git a/src/Agent/AutopilotMonitor.Agent.V2.Core/Transport/Telemetry/BackendTelemetryUploader.cs b/src/Agent/AutopilotMonitor.Agent.V2.Core/Transport/Telemetry/BackendTelemetryUploader.cs index c84f5f3a..17d9f62a 100644 --- a/src/Agent/AutopilotMonitor.Agent.V2.Core/Transport/Telemetry/BackendTelemetryUploader.cs +++ b/src/Agent/AutopilotMonitor.Agent.V2.Core/Transport/Telemetry/BackendTelemetryUploader.cs @@ -19,7 +19,7 @@ namespace AutopilotMonitor.Agent.V2.Core.Transport.Telemetry /// /// Produktions-. Plan §2.7a / §4.x M4.4.2. /// - /// HTTP-Skelett gegen POST /api/telemetry/batch. Sendet einen Batch von + /// HTTP-Skelett gegen POST /api/agent/telemetry. Sendet einen Batch von /// s als JSON-Array; Backend routet pro Item nach /// in die Ziel-Tabelle (Events / Signals / /// DecisionTransitions) und dedupliziert via (PartitionKey, RowKey). @@ -61,7 +61,7 @@ namespace AutopilotMonitor.Agent.V2.Core.Transport.Telemetry if (string.IsNullOrEmpty(baseUrl)) throw new ArgumentException("BaseUrl is mandatory.", nameof(baseUrl)); if (string.IsNullOrEmpty(tenantId)) throw new ArgumentException("TenantId is mandatory.", nameof(tenantId)); - _endpointUrl = baseUrl.TrimEnd('/') + Constants.ApiEndpoints.TelemetryBatch; + _endpointUrl = baseUrl.TrimEnd('/') + Constants.ApiEndpoints.IngestTelemetry; _tenantId = tenantId; _manufacturer = manufacturer; _model = model; diff --git a/src/Agent/AutopilotMonitor.Agent.V2.Core/Transport/Telemetry/IBackendTelemetryUploader.cs b/src/Agent/AutopilotMonitor.Agent.V2.Core/Transport/Telemetry/IBackendTelemetryUploader.cs index ce58f10b..43007de9 100644 --- a/src/Agent/AutopilotMonitor.Agent.V2.Core/Transport/Telemetry/IBackendTelemetryUploader.cs +++ b/src/Agent/AutopilotMonitor.Agent.V2.Core/Transport/Telemetry/IBackendTelemetryUploader.cs @@ -8,7 +8,7 @@ namespace AutopilotMonitor.Agent.V2.Core.Transport.Telemetry /// /// Abstraction über den Backend-Aufruf zur Batch-Telemetry-Übertragung. Plan §2.7a. /// - /// Produktionsimplementierung in BackendApiClient (ruft POST /api/telemetry/batch). + /// Produktionsimplementierung in BackendTelemetryUploader (ruft POST /api/agent/telemetry). /// Tests verwenden einen Fake-Uploader — der Orchestrator ist HTTP-agnostisch. /// /// diff --git a/src/Shared/AutopilotMonitor.Shared/Constants.cs b/src/Shared/AutopilotMonitor.Shared/Constants.cs index 4e475234..a84970cc 100644 --- a/src/Shared/AutopilotMonitor.Shared/Constants.cs +++ b/src/Shared/AutopilotMonitor.Shared/Constants.cs @@ -140,10 +140,11 @@ namespace AutopilotMonitor.Shared public const string ValidateBootstrapCode = "/api/bootstrap/validate/{code}"; // V2 Agent generic telemetry transport (Plan §2.7a). - // Backend routes per TelemetryItem.Kind to Events / Signals / DecisionTransitions tables. - // Single endpoint for Event + Signal + DecisionTransition batch ingest; replaces the + // Sibling of IngestEvents under /api/agent/* — same Agent-writes namespace, heterogeneous + // TelemetryItem[] payload (Event + Signal + DecisionTransition). Backend routes per + // TelemetryItem.Kind to Events / Signals / DecisionTransitions tables. Replaces the // per-type IngestEvents path once the Legacy Agent is decommissioned (v11.1+). - public const string TelemetryBatch = "/api/telemetry/batch"; + public const string IngestTelemetry = "/api/agent/telemetry"; // MCP/Agent API search endpoints public const string SearchSessions = "/api/search/sessions";