Webhook Stats
Platform Notice: Data Center Only - This article only applies to Atlassian apps on the Data Center platform.
Note that this KB was created for the Data Center version of the product. Data Center KBs for non-Data-Center-specific features may also work for Server versions of the product, however they have not been tested. Support for Server* products ended on February 15th 2024. If you are running a Server product, you can visit the Atlassian Server end of support announcement to review your migration options.
*Except Fisheye and Crucible
Summary
WEBHOOK JIRA-STATS since Jira 10.3.18
Intro
Webhook Stats is statistic group which inherit Jira-Stats behaviour and structure. Refer to How to Use Jira Stats Logs for Server Monitoring and Troubleshooting for details. It provides two logs in Jira log file (atlassian-jira.log, prior to Jira 10.4.0) or Jira Stats log file (atlassian-jira-stats.log, since Jira 10.4.0): snapshot measuring activity over a 5-minute period (default value, can be changed) of time and total - measuring from Jira instance on a node start.
Solution
Logged statistics
Per-node logs statistics that describe webhook activity and queue utilisation. There are two types of statistics: Snapshot and Total. More detailed information can be found here: Jira stats logs.
Example log entry
Each stats starts with meta-data about stats itself - name, type (total/snapshot), timestamp and etc...
Webhook Stats example:
{
"_statsName": "WEBHOOKS-STATS",
"_statsType": "snapshot",
"_time": "2026-01-22T15:07:36.204Z",
"_timestamp": 1769094456204,
"_duration": "PT5M2.647S",
"_invocations": 24,
"_statsOverhead": "n/a",
"totalStats": {
"publishedRequestsCount": 12,
"successCount": 1,
"rejectedCount": 3,
"failedCount": 1,
"errorCount": 2,
"filteredOutCount": 4,
"processingTimeDistribution": {
"count": 11,
"min": 1,
"max": 10321,
"sum": 22402,
"avg": 2037,
"distributionCounter": {
"100": 6,
"500": 1,
"1000": 1,
"2000": 1,
"5000": 0,
"10000": 0,
"60000": 2
}
},
"queueStats": {
"itemsInQueueCount": 1,
"itemsInQueueDistribution": {
"count": 19,
"min": 0,
"max": 2,
"sum": 22,
"avg": 1,
"distributionCounter": {
"75": 19,
"187": 0,
"375": 0,
"562": 0,
"675": 0,
"750": 0
}
}
}
},
"successStats": {
"count": 1,
"processingTimeDistribution": {
"count": 1,
"min": 513,
"max": 513,
"sum": 513,
"avg": 513,
"distributionCounter": {
"100": 0,
"500": 0,
"1000": 1,
"2000": 0,
"5000": 0,
"10000": 0,
"60000": 0
}
}
},
"rejectStats": {
"count": 3,
"processingTimeDistribution": {
"count": 3,
"min": 22,
"max": 123,
"sum": 203,
"avg": 68,
"distributionCounter": {
"100": 2,
"500": 1,
"1000": 0
}
},
"top3RejectionReasons": {
"Webhook queue is full, execution is rejected": 1,
"Too many webhook dispatches already in flight": 1,
"Webhook failed too many times": 1
}
},
"failStats": {
"count": 1,
"processingTimeDistribution": {
"count": 1,
"min": 1234,
"max": 1234,
"sum": 1234,
"avg": 1234,
"distributionCounter": {
"100": 0,
"500": 0,
"1000": 0,
"2000": 1,
"5000": 0,
"10000": 0,
"60000": 0
}
},
"top3FailReasons": {
"429": 1
}
},
"errorStats": {
"count": 2,
"processingTimeDistribution": {
"count": 2,
"min": 10123,
"max": 10321,
"sum": 20444,
"avg": 10222,
"distributionCounter": {
"100": 0,
"500": 0,
"1000": 0,
"2000": 0,
"5000": 0,
"10000": 0,
"60000": 2
}
},
"top3ErrorReasons": {
"java.net.SocketException: Connection reset": 1,
"java.io.IOException: Connection reset by peer": 1
}
},
"filteredOutStats": {
"count": 4,
"processingTimeDistribution": {
"count": 4,
"min": 1,
"max": 3,
"sum": 8,
"avg": 2,
"distributionCounter": {
"100": 4,
"500": 0,
"1000": 0
}
}
}
}Field reference
Parameter | Description | Recommended action |
totalStats | Provides total statistic on success, rejected, failed, error, filtered out webhook invocations as well as info about the queue length. | N/A |
totalStats → publishedRequestsCount | Total number of webhook invocations to be processed. | N/A |
totalStats → successCount | Number of successfully finished webhook invocations. The same as | N/A |
totalStats → rejectedCount | Number of rejected by Jira webhooks. Webhook may be rejected by Jira when webhook processing queue or webhook dispatching queue is full or previous attempts to deliver similar webhook invocations failed too many times. The same as | Check additional details in |
totalStats → failedCount | Number of failed webhook invocations. Jira considers a webhook invocation "failed" if it fails to receive a valid, 2xx response. The same as | Investigate any potential errors with the integration. Check how to get more details from logs Troubleshooting webhooks in Jira Data Center | Jira and Jira Service Management | Atlassian Support |
totalStats → errorCount | Number of failed (exception caught) webhook invocations. The same as | Investigate any potential errors with the integration or network. Check how to get more details from logs Troubleshooting webhooks in Jira Data Center | Jira and Jira Service Management | Atlassian Support |
totalStats → filteredOutCount | Number of filtered out webhook invocations. Filtering happens after webhook processing queue but before hitting webhook dispatching queue. The same as | N/A |
totalStats → processingTimeDistribution | Accumulates time in milliseconds for every processed and delivered result (success, reject, fail, error, filteredOut). See | N/A |
totalStats → queueStats | Contains information about queues utilisation. | Consider tuning webhook performance parameters as stated in Tuning webhook performance parameters in Jira Data Center | Jira and Jira Service Management | Atlassian Support |
totalStats → queueStats → itemsInQueueCount | Total count of webhook requests waiting to be processed. Due to the periodic nature of stats snapshots, number could be negative. Whenever snapshot is flushed, Positive number indicates there are more started requests than finished requests, negative number indicates there are more finished requests than started requests. In total statistic | N/A |
totalStats → queueStats → itemsInQueueDistribution | Demonstrates queue utilisation level during reporting period.
| In case of high webhook queue utilisation consider tuning webhook performance parameters as stated in Tuning webhook performance parameters in Jira Data Center | Jira and Jira Service Management | Atlassian Support |
successStats | Stats related to successfully finished webhook invocations. Jira considers a webhook invocation successful if it receives a valid, 2xx response. | N/A |
successStats → count | Number of successfully finished webhook invocations. The same as | N/A |
successStats → processingTimeDistribution | Accumulates time in milliseconds for every successfully processed and delivered webhook invocation. See | N/A |
rejectStats | Contains information about rejected by Jira webhooks. Webhook may be rejected by Jira when webhook processing queue or webhook dispatching queue is full or previous attempts to deliver similar webhook invocations failed too many times. |
|
rejectStats → count | Number of rejected by Jira webhooks. The same as | Check additional details in |
rejectStats → processingTimeDistribution | Accumulates time in milliseconds for every rejected by Jira webhook. See | N/A |
rejectStats → top3RejectionReasons | Provides top 3 (by count) reasons of webhook rejections by Jira. Expect to see here one of below increased:
| Consider tuning webhook performance parameters as stated in Tuning webhook performance parameters in Jira Data Center | Jira and Jira Service Management | Atlassian Support |
failStats | Contains information about failed webhook invocations. Jira considers a webhook invocation "failed" if it fails to receive a valid, 2xx response. | N/A |
failStats → count | Number of failed webhook invocations. The same as | Investigate any potential errors with the integration. Check how to get more details from logs Troubleshooting webhooks in Jira Data Center | Jira and Jira Service Management | Atlassian Support |
failStats → processingTimeDistribution | Accumulates time in milliseconds for every failed webhook invocation. See | N/A |
failStats → top3FailReasons | Contains http response status codes the most frequent failures for reported period. | Investigate any potential errors with the integration. Check how to get more details from logs Troubleshooting webhooks in Jira Data Center | Jira and Jira Service Management | Atlassian Support |
errorStats | Contains information about invocations, during processing of which exception was caught. | N/A |
errorStats → count | Number of failed (exception caught) webhook invocations. The same as | Investigate any potential errors with the integration or network. Check how to get more details from logs Troubleshooting webhooks in Jira Data Center | Jira and Jira Service Management | Atlassian Support |
errorStats → processingTimeDistribution | Accumulates time in milliseconds for every exception caught during processing or execution of webhook invocation. See | N/A |
errorStats → top3ErrorReasons | Contains messages of the most frequent exceptions happened for reported period. | Investigate any potential errors with the integration or network. |
filteredOutStats | Contains information about filtered out webhook invocations. | N/A |
filteredOutStats → count | Number of filtered out webhook invocations. Filtering happens after webhook processing queue but before hitting webhook dispatching queue. The same as | N/A |
filteredOutStats → processingTimeDistribution | Accumulates time in milliseconds for every filtered out webhook invocation. See | N/A |
Distributions
In Webhook Jira-STATS distributions are used for processing time (e.g. successStats → processingTimeDistribution) and for the number of items in the webhook queue (totalStats → queueStats → itemsInQueueDistribution). In case of time, distribution thresholds (upper bounds) are always defined as milliseconds, in case of queue it is the count of items in the queue.
Distribution object contains:
count– number of measurementsmin,max,sum,avg– processing time in millisecondsdistributionCounter– a histogram of processing times, where each key is an upper bound in milliseconds
Example:
"processingTimeDistribution": {
"count": 11,
"min": 1,
"max": 10321,
"sum": 22402,
"avg": 2037,
"distributionCounter": {
"100": 6,
"500": 1,
"1000": 1,
"2000": 1,
"5000": 0,
"10000": 0,
"60000": 1,
"9223372036854775807":1
}
}In this example we could see, that distribution is built based on 11 values (count), minimal value is 1 (min), maximal value is 10321 (max), sum of all the values is 22402 (sum), average or arithmetic mean of values is 2037 (avg).
Values are distributed in following manner:
6 values are smaller than
1001 value is in
[500; 1000)range1 value is in
[1000; 2000)range0 values in
[2000; 5000)and[5000; 10000)ranges1 values is in
[10000; 60000)range.1 value is beyond defined distribution thresholds (java max long value is used as a key), in this case it is bigger than
60000.
Was this helpful?