tarantool/metrics

Cartridge role reload resets metrics data

DifferentialOrange opened this issue · 4 comments

metrics package should support role reload, while it resets all observations and collectors.

Steps to reproduce

  1. Create template application

    cartridge create --name test-app
  2. Change init.lua

    local ok, err = cartridge.cfg({
        roles_reload_allowed = true,
        roles = {
            'cartridge.roles.vshard-storage',
            'cartridge.roles.vshard-router',
            'cartridge.roles.metrics',
            'app.roles.custom',
        },
    })
  3. Start an application

    cartridge build
    cartridge start -d
    cartridge replicasets setup --bootstrap-vshard
  4. Connect to instance

    cartridge enter router
  5. Execute reload

    test-reload.router> metrics = require('metrics')
    ---
    ...
    
    test-reload.router> metrics.counter('c'):inc()
    ---
    ...
    
    test-reload.router> metrics.collect()
    ---
    - - label_pairs:
         alias: router
       timestamp: 1640183661554368
       value: 1
       metric_name: c
    ...
    
    test-reload.router> require("cartridge.roles").reload()
    ---
    - true
    ...
    
    test-reload.router> metrics = require('metrics')
    ---
    ...
    
    test-reload.router> metrics.collect()
    ---
    - []
    ...
    
    test-reload.router> metrics.collectors()
    ---
    - []
    ...
    

Why do you think that this is a problem?

Why do you think that this is a problem?

I've discussed it with @yngvar-antonsson and he said this behavior is unexpected.

Reload of metrics package (without Cartridge) doesn't reset collectors, so cartridge hot reload doesn't have to reset them too.

I think

package.loaded['cartridge.hotreload']
if hotreload ~= nil then
    hotreload.whitelist_globals({'__metrics_registry'})`
end

is the simplest and satisfying solution.