Skip to content

[RFC] Пользовательские роли metrics для cartridge модулей #197

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
opomuc opened this issue Feb 15, 2021 · 4 comments
Labels
question Further information is requested

Comments

@opomuc
Copy link
Contributor

opomuc commented Feb 15, 2021

Роль cartridge.roles.metrics включает мониторинг и хелсчеки в кластерном приложении. Сам модуль metrics можно достать с помощью cartridge.service_registry.get('metrics'), что даёт возможность добавлять свои метрики к дефолтным.

Проблема

Внешние модули не имеют однозначного экспорта метрик. Приложение должно само получить метрики и подключить их к экспорту.

Взять, например, Tarantool Cartridge. issues единственные были добавлены напрямую в metrics. Если в будуших версиях cartridge поменяется формат/тип/экспорт issues, то придется менять метрики и все места, где они используются.

Предложение

Каждый модуль описывает роль my-app.roles.metrics и ставит cartridge.roles.metrics в зависимости. metrics будет доступен через service_registry картриджа.

Варианты подключения роли:

  • Новые метрики зависят от основной роли, так как используют внутреннюю функциональность. Разработчик приложения решает, включать её или нет.

В init роли можно создать все необходимые коллекторы и подключиться к диагностике модуля. Например обернуть вызываемую извне функцию в summary коллектор для сбора персентилей или добавить http метрики для пользовательского REST API.

apply, validate и stop пока не используются.

Преимущества:

  • Единое место сбора всех метрик для модуля удобно для дальнейшей разработки.
  • Неинвазивный подход: изменения в имеющемся коде минимальны или отсутствуют.
  • Конфигурируемость.

Недостатки:

  • Нужна документация по процессу написания роли.
  • Диагностика должна закладываться с учётом подключения к мониторингу через роль.
  • В cartridge.cfg{} приложения нужно указывать все такие роли.

Дополнение:

Секцию конфига metrics можно расширить подсекцией modules, которая будет описывать какие метрики нужно собирать с модулей, какие -- нет.

metrics:
  export:
    - type: json
      path: "/metrics"
  modules:
    replicator:
      enabled: true
      metrics:
        - "pipiline_timing"
        - "context_switches"
    task:
      enabled: false
    queue:
      enabled: false

В таком случае, validate и apply можно использовать для работы с этой секцией.

Пример:

init.lua

local ok, err = cluster.cfg({
    bucket_count = 3000,
    roles = {
        'cartridge.roles.metrics',
        'cartridge.roles.vshard-router',
        'cartridge.roles.vshard-storage',
        'my-app.roles.metrics',
        'my-app.roles.router',
        'my-app.roles.storage',
    },
})

my-app.roles.metrics

local function init()
    local metrics = cartridge.service_get('metrics')

    local summary = metrics.summary('process', 'Statistics on records process',
        { [0.5] = 0.01, [0.9] = 0.01, [0.99] = 0.01, }
    )

    local old_process = rawget(_G, 'process')

    rawset(_G, 'process', function(...)
        return summary:observe_latency(
            function(_, exit_code)
                return { code = exit_code } -- label pairs
            end,
            old_process, ...
        )   
    end)
end

local function validate_config()
    return true
end

local function apply_config()
    return true
end

return {
    role_name = "my-app.metrics",
    validate_config = validate_config,
    apply_config = apply_config,
    init = init,
    permanent = true,
    hidden = true,
    dependencies = { 'cartridge.roles.metrics', 'my-app.roles.router' }
}

topology

    roles = {
        'my-app.router',
        'my-app.metrics'
    },

Тикеты, которые можно покрыть:

Tarantool memcached statistics -- #161
Vshard metrics -- #79
Cartridge metrics -- #80 (closed, but can be extended)

@yngvar-antonsson
Copy link
Contributor

  • Как единая точка входа для пользовательских ролей - идея хорошая
  • Конфиг лучше не трогать, он в документации описан как "опциональный" вариант настройки роли
  • Тикеты по memcached и vshard таким образом не покрыть, потому что теряется случай использования тарантула без картриджа
  • Роли в модулях никто не будет писать, документацию по этим метрикам тоже

@opomuc opomuc added the question Further information is requested label Feb 16, 2021
@github-actions
Copy link

This issue is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 30 days

@github-actions github-actions bot added the Stale label Apr 17, 2021
@opomuc opomuc removed the Stale label Apr 19, 2021
@github-actions
Copy link

This issue is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 30 days

@github-actions github-actions bot added the Stale label Jun 18, 2021
@opomuc opomuc removed the Stale label Jun 21, 2021
@yngvar-antonsson
Copy link
Contributor

Предлагаю закрыть этот тикет, как неактивный.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests

2 participants