diff --git a/extensions/adobe/experience/customerJourneyManagement/custom-channel-execution-metrics.example.1.json b/extensions/adobe/experience/customerJourneyManagement/custom-channel-execution-metrics.example.1.json new file mode 100644 index 000000000..f5b0b93f1 --- /dev/null +++ b/extensions/adobe/experience/customerJourneyManagement/custom-channel-execution-metrics.example.1.json @@ -0,0 +1,8 @@ +{ + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/endpoint": "https://api.viber.com/v1/send", + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/method": "POST", + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/requestTimestamp": "2026-05-20T14:35:22.264Z", + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/responseTime": 187, + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/statusCode": 200, + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/throttleApplicable": false +} diff --git a/extensions/adobe/experience/customerJourneyManagement/custom-channel-execution-metrics.example.2.json b/extensions/adobe/experience/customerJourneyManagement/custom-channel-execution-metrics.example.2.json new file mode 100644 index 000000000..d06b1c5fd --- /dev/null +++ b/extensions/adobe/experience/customerJourneyManagement/custom-channel-execution-metrics.example.2.json @@ -0,0 +1,10 @@ +{ + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/endpoint": "https://api.viber.com/v1/send", + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/method": "POST", + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/requestTimestamp": "2026-05-20T14:36:06.450Z", + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/responseTime": 2462, + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/statusCode": 503, + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/throttleApplicable": false, + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/errorCode": "HTTP_5XX", + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/errorReason": "503 Service Unavailable after 3 retries" +} diff --git a/extensions/adobe/experience/customerJourneyManagement/custom-channel-execution-metrics.schema.json b/extensions/adobe/experience/customerJourneyManagement/custom-channel-execution-metrics.schema.json new file mode 100644 index 000000000..ab0f713ad --- /dev/null +++ b/extensions/adobe/experience/customerJourneyManagement/custom-channel-execution-metrics.schema.json @@ -0,0 +1,74 @@ +{ + "meta:license": [ + "Copyright 2026 Adobe Systems Incorporated. All rights reserved.", + "This work is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license", + "you may not use this file except in compliance with the License. You may obtain a copy", + "of the License at https://creativecommons.org/licenses/by/4.0/" + ], + "$id": "https://ns.adobe.com/experience/customerJourneyManagement/custom-channel-execution-metrics", + "$schema": "http://json-schema.org/draft-06/schema#", + "title": "Adobe CJM ExperienceEvent - Custom Channel Execution Metrics", + "description": "Per-call execution metrics for custom-channel deliveries. Populated only by MSW for custom-channel sends. Email/SMS/Push/Line paths leave this block absent. Validity-expired events also leave this block absent (handled via messageDeliveryfeedback.messageExclusion). See wiki 3886615741 for design rationale.", + "type": "object", + "meta:extensible": true, + "meta:abstract": true, + "meta:intendedToExtend": ["https://ns.adobe.com/xdm/context/experienceevent"], + + "definitions": { + "customChannelExecutionMetrics": { + "properties": { + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/endpoint": { + "title": "Endpoint", + "type": "string", + "description": "URL template of the custom-channel customer endpoint, with placeholders un-substituted (e.g. `https://api.viber.com/v1/{{profile.id}}/send`). Stored as the template form — NOT the runtime-interpolated URL — to prevent per-user / per-record cardinality explosion in live reporting (confirmed with reporting team 2026-05-22; precedent is AJO's existing email `domain` derived field that truncates the link URL). Query parameters are stripped before storage. Live reporting derives a coarser `endpointHost` tag from this for Cortex tagging; all-time CJA can use the full template for endpoint-level drilldown. Null when the call was skipped before HTTP was attempted (errorCode set to AUTH_* / REQUEST_GENERATION_ERROR)." + }, + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/method": { + "title": "HTTP Method", + "type": "string", + "description": "HTTP method used for the call (POST, GET, PUT, etc.). Null when the call was skipped." + }, + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/requestTimestamp": { + "title": "Request Timestamp", + "type": "string", + "format": "date-time", + "description": "Wall-clock timestamp (UTC) captured immediately before the customer-endpoint HTTP request is sent on the wire. Null when the call was skipped." + }, + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/responseTime": { + "title": "Response Time", + "type": "integer", + "description": "Server HTTP response time in milliseconds. Measured around the customer-endpoint HTTP exchange only - excludes auth latency, connection acquisition, throttle wait (see waitTime), and pool wait. Matches Custom Action XDM actionExecutionOriginTime semantics. For HTTP_TIMEOUT: equals the configured timeout duration. Null when the call was skipped." + }, + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/waitTime": { + "title": "Wait Time", + "type": "integer", + "description": "Time in milliseconds the call waited in the throttle queue before the HTTP exchange started. Phase 2: populated when per-call throttle wait instrumentation lands. Phase 1: null/absent (not yet populated by MSW). When populated, total wall-clock latency = waitTime + responseTime + auth/cache overhead." + }, + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/statusCode": { + "title": "Status Code", + "type": "integer", + "description": "HTTP response status code from the customer endpoint, preserved as the raw integer (e.g. 401, 503) for finer-grained drilldown and manual debugging. The HTTP_4XX / HTTP_5XX classification in errorCode is a producer-side convenience for bucket gating; consumers SHOULD use statusCode for exact-code analysis. Null when the call was skipped (no HTTP attempt) or timed out without a response." + }, + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/throttleApplicable": { + "title": "Throttle Applicable", + "type": "boolean", + "description": "Config-level flag: whether throttling configuration is applied to this endpoint/channel at the time of dispatch. Mirrors the cacheApplicable pattern (config-level vs runtime-level). Does NOT indicate this specific call actually waited in a queue - that signal would require per-call instrumentation (Phase 2; reserved for a separate runtime field). Matches Custom Action XDM actionIsThrottled literal meaning." + }, + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/errorCode": { + "title": "Error Code", + "type": "string", + "description": "Unified error envelope covering both skip-stage (auth/cache) and HTTP-stage (4xx/5xx/timeout) failures. Null on success. Producers SHOULD use the controlled vocabulary documented in wiki 3886615741 section 7 - example values: AUTH_CACHE_IO, AUTH_HTTP_ERROR, AUTH_TOKEN_PARSE, AUTH_TOKEN_EXPIRED, REQUEST_GENERATION_ERROR, HTTP_4XX, HTTP_5XX, HTTP_TIMEOUT, HTTP_PARSE_ERROR. Schema does NOT enum-constrain the value so producer code can evolve the vocabulary without an XDM schema update." + }, + "https://ns.adobe.com/experience/customerJourneyManagement/customChannelExecutionMetrics/errorReason": { + "title": "Error Reason", + "type": "string", + "description": "Human-readable detail of the failure (exception message, parsed error body, etc.). Used for drilldown tooltips and debugging. Not intended for aggregation - use errorCode for grouping. Null on success." + } + } + } + }, + "allOf": [ + { "$ref": "https://ns.adobe.com/xdm/common/extensible#/definitions/@context" }, + { "$ref": "#/definitions/customChannelExecutionMetrics" } + ], + "meta:status": "experimental" +}