AmitPhulera opened a new issue, #5802:
URL: https://github.com/apache/couchdb/issues/5802

   [NOTE]: # ( ^^ Provide a general summary of the issue in the title above. ^^ 
)
   
   ## Description
   
   The `couchdb_httpd_clients_requesting_changes` gauge metric is not properly 
decremented when clients disconnect from the `_changes` feed. The metric 
continues to show the cumulative count of connections rather than the current 
active connection count.
   
   Interestingly, the `abandoned_streaming_requests` counter IS being 
incremented when disconnections are detected, indicating that the disconnect 
detection logic is working, but the main gauge is not being updated.
   
   ## Steps to Reproduce
   
   ### Setup
   1. Start CouchDB 3.5 using Docker:
      ```bash
      docker run -d --name couchdb -p 5984:5984 \
        -e COUCHDB_USER=admin -e COUCHDB_PASSWORD=password \
        apache/couchdb:3.5
      ```
   
   2. Create a test database:
      ```bash
      curl -X PUT -u admin:password http://localhost:5984/testdb
      ```
   
   ### Reproduce the issue
   
   3. Check initial stats:
      ```bash
      curl -s -u admin:password 
"http://localhost:5984/_node/_local/_stats/couchdb/httpd/clients_requesting_changes";
      # Expected: {"value":0,"type":"counter","desc":"number of clients for 
continuous _changes"}
      ```
   
   4. Start 4 continuous changes feed connections (in separate terminals or 
background processes):
      ```bash
      # Terminal 1
      curl -u admin:password 
"http://localhost:5984/testdb/_changes?feed=continuous&heartbeat=10000";
      
      # Terminal 2
      curl -u admin:password 
"http://localhost:5984/testdb/_changes?feed=continuous&heartbeat=10000";
      
      # Terminal 3
      curl -u admin:password 
"http://localhost:5984/testdb/_changes?feed=continuous&heartbeat=10000";
      
      # Terminal 4
      curl -u admin:password 
"http://localhost:5984/testdb/_changes?feed=continuous&heartbeat=10000";
      ```
   
   5. Verify connections are counted:
      ```bash
      curl -s -u admin:password 
"http://localhost:5984/_node/_local/_stats/couchdb/httpd/clients_requesting_changes";
      # Expected: {"value":4,...}
      ```
   
   6. Stop all 4 curl processes (Ctrl+C on each terminal)
   
   7. Check stats again:
      ```bash
      curl -s -u admin:password 
"http://localhost:5984/_node/_local/_stats/couchdb/httpd/clients_requesting_changes";
      # ACTUAL: {"value":4,...} - still shows 4!
      # EXPECTED: {"value":0,...}
      ```
   
   8. Check abandoned_streaming_requests:
      ```bash
      curl -s -u admin:password 
"http://localhost:5984/_node/_local/_stats/couchdb/httpd/abandoned_streaming_requests";
      # Shows: {"value":4,...} - correctly detected 4 abandonments
      ```
   
   9. Start 4 new connections again and stop them:
      ```bash
      # Start 4 connections, then stop them with Ctrl+C
      ```
   
   10. Check stats:
       ```bash
       curl -s -u admin:password 
"http://localhost:5984/_node/_local/_stats/couchdb/httpd/clients_requesting_changes";
       # ACTUAL: {"value":8,...} - doubled!
       # EXPECTED: {"value":0,...}
       
       curl -s -u admin:password 
"http://localhost:5984/_node/_local/_stats/couchdb/httpd/abandoned_streaming_requests";
  
       # Shows: {"value":8,...} - correctly shows 8 total abandonments
   
   The Prometheus endpoint correctly types this as a gauge, but the value 
doesn't decrease:
   
   ```bash
   curl -s -u admin:password "http://localhost:5984/_node/_local/_prometheus"; | 
grep clients_requesting_changes
   # TYPE couchdb_httpd_clients_requesting_changes gauge
   # couchdb_httpd_clients_requesting_changes 8
   ```
   
   ## Expected Behaviour
   
   The `clients_requesting_changes` metric should:
   1. Increment when a client starts a continuous/longpoll `_changes` feed
   2. Decrement when the client disconnects (either normally or via TCP close)
   3. Always reflect the **current** number of active changes feed connections
   
   
   ## Actual Behavior
   
   - The metric increments correctly when connections start
   - The metric does **NOT** decrement when connections end
   - The `abandoned_streaming_requests` counter correctly tracks disconnections
   - This causes the gauge to act like a monotonic counter, accumulating over 
time
   
   
   ## Your Environment
   
   * CouchDB version used: 3.5.1
   * Browser name and version: Brave 1.84.139
   * Operating system and version: macOS (Darwin 24.6.0) / Docker
   * **Installation method**: Docker (apache/couchdb:3.5 image)
   
   ## Additional Context
   
   This issue was discovered while upgrading from CouchDB 3.3.1 to 3.5.1. The 
metric worked correctly in 3.3.1.
   
   The issue affects monitoring and alerting systems that rely on this metric 
to track the number of active changes feed consumers.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to