+ echo '== ingest endpoint: GET /matomo.php?idsite=1&rec=1&apiv=1&send_image=0&url=&action_name=&_id=&rand= ; ack = HTTP 204 (send_image=0) =='
== ingest endpoint: GET /matomo.php?idsite=1&rec=1&apiv=1&send_image=0&url=&action_name=&_id=&rand= ; ack = HTTP 204 (send_image=0) ==
+ echo '== with QueuedTracking: Handler::process rPushes the request set to Redis list trackingQueueV1_<queueId> (numQueueWorkers=1 -> _0), sends the 204, THEN processes the queue in-request if >=numRequestsToProcess (25) are queued and the QueuedTrackingLock is free =='
== with QueuedTracking: Handler::process rPushes the request set to Redis list trackingQueueV1_<queueId> (numQueueWorkers=1 -> _0), sends the 204, THEN processes the queue in-request if >=numRequestsToProcess (25) are queued and the QueuedTrackingLock is free ==
+ echo '== reconciliation: matomo_log_link_visit_action count (stored actions), matomo_log_visit count (visits = distinct visitors within the 30-min window) =='
== reconciliation: matomo_log_link_visit_action count (stored actions), matomo_log_visit count (visits = distinct visitors within the 30-min window) ==
+ echo '== bot filter: UA-based at PROCESSING time (a bot UA is 204-acked, queued, then discarded) -> real Chrome UA on every hit =='
== bot filter: UA-based at PROCESSING time (a bot UA is 204-acked, queued, then discarded) -> real Chrome UA on every hit ==
+ echo '== identity: proxy_client_headers[]=HTTP_X_FORWARDED_FOR + 500-IP XFF pool (postinstall.sh proves same-IP collapse vs XFF split) =='
== identity: proxy_client_headers[]=HTTP_X_FORWARDED_FOR + 500-IP XFF pool (postinstall.sh proves same-IP collapse vs XFF split) ==
+ echo '== config.ini.php [QueuedTracking] =='
== config.ini.php [QueuedTracking] ==
+ docker compose exec -T matomo sed -n '/^\[QueuedTracking\]/,/^\[/p' config/config.ini.php
[QueuedTracking]
notify_queue_threshold_single_queue = 250000
queueEnabled = 1
redisHost = "redis"

+ echo '== config.ini.php [General] proxy_client_headers / browser_archiving =='
== config.ini.php [General] proxy_client_headers / browser_archiving ==
+ docker compose exec -T matomo grep -E 'proxy_client_headers|browser_archiving' config/config.ini.php
browser_archiving_disabled_enforce = 1
proxy_client_headers[] = "HTTP_X_FORWARDED_FOR"
+ echo '== queuedtracking:test =='
== queuedtracking:test ==
+ cat queuedtracking-test.txt
Settings that will be used:
Backend: redis
NumQueueWorkers: 1
NumRequestsToProcess: 25
ProcessDuringTrackingRequest: 1
QueueEnabled: 1

Redis backend only settings (does not apply when using MySQL backend):
Host: redis
Port: 6379
Timeout: 0
Password: 
Database: 0
RedisBackendType: 1
SentinelMasterName: mymaster

Version / stats:
PHP version: 8.4.25
Uname: Linux dbf6107667e1 6.17.0-1020-gcp #22~24.04.1-Ubuntu SMP Mon Jun 22 20:24:13 UTC 2026 x86_64
PHPRedis version: 6.3.0
Backend version: 7.4.11
Memory: array (
  'used_memory' => 1060968,
  'used_memory_human' => '1.01M',
  'used_memory_rss' => 8867840,
  'used_memory_rss_human' => '8.46M',
  'used_memory_peak' => 1060968,
  'used_memory_peak_human' => '1.01M',
  'used_memory_peak_perc' => '100.01%',
  'used_memory_overhead' => 948552,
  'used_memory_startup' => 948360,
  'used_memory_dataset' => 112416,
  'used_memory_dataset_perc' => '99.83%',
  'allocator_allocated' => 1781024,
  'allocator_active' => 1966080,
  'allocator_resident' => 4804608,
  'allocator_muzzy' => 0,
  'total_system_memory' => 8321761280,
  'total_system_memory_human' => '7.75G',
  'used_memory_lua' => 32768,
  'used_memory_vm_eval' => 32768,
  'used_memory_lua_human' => '32.00K',
  'used_memory_scripts_eval' => 0,
  'number_of_cached_scripts' => 0,
  'number_of_functions' => 0,
  'number_of_libraries' => 0,
  'used_memory_vm_functions' => 33792,
  'used_memory_vm_total' => 66560,
  'used_memory_vm_total_human' => '65.00K',
  'used_memory_functions' => 192,
  'used_memory_scripts' => 192,
  'used_memory_scripts_human' => '192B',
  'maxmemory' => 0,
  'maxmemory_human' => '0B',
  'maxmemory_policy' => 'noeviction',
  'allocator_frag_ratio' => 1.08,
  'allocator_frag_bytes' => 109024,
  'allocator_rss_ratio' => 2.44,
  'allocator_rss_bytes' => 2838528,
  'rss_overhead_ratio' => 1.85,
  'rss_overhead_bytes' => 4063232,
  'mem_fragmentation_ratio' => 9.11,
  'mem_fragmentation_bytes' => 7894632,
  'mem_not_counted_for_evict' => 0,
  'mem_replication_backlog' => 0,
  'mem_total_replication_buffers' => 0,
  'mem_clients_slaves' => 0,
  'mem_clients_normal' => 0,
  'mem_cluster_links' => 0,
  'mem_aof_buffer' => 0,
  'mem_allocator' => 'jemalloc-5.3.0',
  'mem_overhead_db_hashtable_rehashing' => 0,
  'active_defrag_running' => 0,
  'lazyfree_pending_objects' => 0,
  'lazyfreed_objects' => 0,
)
MaxMemory Eviction Policy config: noeviction
MaxMemory config: 0

Performing some tests:
Redis is connected: 1
Connection works in general
Success for method set(testKey, value)
Success for method setnx(testnxkey, value)
Success for method setex(testexkey, 5, value)
Success for method set(testKeyWithNx, value, array (0 => 'nx',))
Success for method set(testKeyWithEx, value, array ('ex' => 5,))
Initial expire seems to be set correctly
setIfNotExists works fine
expireIfKeyHasValue seems to work fine
Extending expire seems to be set correctly
expireIfKeyHasValue correctly expires only when the value is correct
Expire is still set which is correct
deleteIfKeyHasValue seems to work fine
List feature seems to work fine

Done
+ echo '== redis keys =='
== redis keys ==
+ docker compose exec -T redis redis-cli keys '*'
fooList
+ echo '== plugin list (activated) =='
== plugin list (activated) ==
+ docker compose exec -T -u www-data matomo ./console plugin:list
+ grep -iE 'queued|activated'
+ head
| Diagnostics           | Core              | Activated |
| Login                 | Core              | Activated |
| CoreAdminHome         | Core              | Activated |
| UsersManager          | Core              | Activated |
| SitesManager          | Core              | Activated |
| Installation          | Core              | Activated |
| Monolog               | Core              | Activated |
| Intl                  | Core              | Activated |
| JsTrackerInstallCheck | Core              | Activated |
| CoreVue               | Core              | Activated |
+ echo '== tables =='
== tables ==
+ q 'show tables like '\''%queued%'\'''
+ docker compose exec -T db mariadb -umatomo -pbenchpw -N -B matomo -e 'show tables like '\''%queued%'\'''
matomo_queuedtracking_queue
