SMS KQL Overview¶
Analyze SMS send activity, delivery report outcomes, inbound receives, and throttling using the diagnostic log table that ACS actually emits.
Log Analytics Tables¶
ACS emits one SMS diagnostic table. Discriminate event types with OperationName.
| Table | Purpose | Discriminator |
|---|---|---|
ACSSMSIncomingOperations | All incoming requests to SMS operations: sends, delivery report callbacks, and inbound receives. | OperationName |
OperationName values:
SMSMessagesSent— outbound send request to ACS.SMSDeliveryReportsReceived— per-recipient delivery outcome the carrier returned to ACS.SMSMessagesReceived— inbound SMS received on an ACS-owned number.
Key columns used across the queries below:
ResultType—SucceededorFailed.ResultSignature— HTTP status code (for example200,400,429).ResultDescription— diagnostic message string.PhoneNumber— the ACS-owned number associated with the operation. For sends this is the sender number; for receives and delivery reports it is the ACS number that owned the message.MessageId— correlator that joins a send to its later delivery report row.DeliveryAttempts,OutgoingMessageLength,IncomingMessageLength,Country,NumberType— context fields documented on the table reference.
Key Scenarios¶
| Scenario | KQL Query | Description |
|---|---|---|
| Delivery Failure Analysis | SMS Delivery Status | Find the most common reasons for undelivered messages. |
| Incoming Message Trends | Incoming Trends | Track the volume of incoming messages over time. |
| Throttling Analysis | Throttling | Identify if sender numbers are hitting HTTP 429 throttling on send. |
Query Examples¶
Incoming Trends¶
Track the volume of inbound SMS messages over time.
ACSSMSIncomingOperations
| where TimeGenerated > ago(24h)
| where OperationName == "SMSMessagesReceived"
| summarize MessageCount = count() by bin(TimeGenerated, 1h)
| render timechart
Throttling Analysis¶
Identify ACS-owned numbers whose send requests are being throttled. The signal of throttling is ResultSignature == 429 on SMSMessagesSent rows.
ACSSMSIncomingOperations
| where TimeGenerated > ago(1h)
| where OperationName == "SMSMessagesSent"
| where ResultSignature == 429
| summarize ThrottledCount = count() by PhoneNumber
| order by ThrottledCount desc