Perfscale news #2: Fix Protocol, Magic metrics и MCP

Об авторе, кто он такой и что делает можно почитать тут. Пост специально открыт для всех, чтобы не было проблем с разным уровнем доступа.

Итак, прошлый выпуск новостей очень понравился аудитории, поэтому я продолжаю делится тем, что произошло с Perfscale.


Fix Protocol

Поскольку я работаю в FinTech кампании и мы тестируем FIX protocol то я не могу обойти стороной тот факт, что нам надо уметь нагружать FIX protocol. Поэтому скорость ввода данной фичи был вопросом времени.

Небольшое Предисловие по поводу FIX protocol:

Все брокеры(да, там где акции, котировки, и прочие заумные слова, о которых обычный и здоровый человек не особо вкурсе и слава богу), общаются по FIX протоколу. Этот протокол действует аж с 1992 года и в настоящее время у него 4 версия. Она же[прим. версия 4 FIX Protocol] и широко распространена. Да, TBank и МосБиржа и любая более-менее значимая биржа общаются по FIX protocol. Я в свое время рассказывал как работает FIX protocol на одном из митапов. Может когда-нибудь запишу видео о том, как он работает на пальцах.

Итак, возвращаясь к Fix protocol. В Perfscale я реализовал данный функционал и для теста test.yaml фаил выглядит так

steps:
 - uses: pro/fix@v1
  with:
   host: fix.venue.com
   port: 9823
   tls: true
   begin_string: FIXT.1.1
   sender_comp_id: CLIENT
   target_comp_id: VENUE
   heart_bt_int: 30
   messages:
    - MsgType: NewOrderSingle
     ClOrdID: order-1
     Symbol: EURUSD
     Side: 1
     OrderQty: 100000
     OrdType: 1

Но вы можете сказать: а что если хост, порт и прочие данные уже есть и они известны нам, не дублировать же в шагах данные каждый раз. Верно! Для этого я вынес для config.yaml шаг pro/fix-config@v1

before:
  - uses: std/http@v1
    with: { url: https://.../FIX44.xml }
    outputs: dict
  - uses: pro/fix-config@v1
    with:
      host: fix.venue.com
      port: 9823
      tls: true
      sender_comp_id: CLIENT
      target_comp_id: VENUE
      schema: "${{ dict.body }}"
    outputs: venue # сохраняем конфигурацию для переиспользования

В таком случае тот же тест сокращается в несколько раз

steps:
  - uses: pro/fix@v1
    with: 
     connection: "${{ config.venue }}"
messages:
  - MsgType: NewOrderSingle
    ClOrdID: "ord-${seq}"                 # уникальный на каждый ордер
    Symbol: "${choice(EURUSD|GBPUSD|USDJPY)}"
    Side: "${rand(1,2)}"
    OrderQty: "${rand(1000,100000)}"
    Price: "${randf(1.05,1.15,5)}"
    TransactTime: "${now}"
    _repeat: 100                          # 100 ордеров…
    _interval_ms: 50                      # …по одному каждые 50 мс

А что за seq, choice, и причие значения, спросите вы?

Поскольку тесты у нас могут быть динамическими(например цена выполнения) то без runtime функций помощников никуда. Пока что я стараюсь добавлять их точечно и аккуратно и их кол-во фиксировано

${seq}Monotonic counter, unique per message send (shared by all fields in that message)
${uuid}Random 32-hex-character id
${now}Current UTC time, FIX format YYYYMMDD-HH:MM:SS.sss
${rand(a,b)}Random integer in [a, b]
${randf(a,b)} / ${randf(a,b,dp)}Random float in [a, b], dp decimals (default 2)
${choice(x|y|z)}Random pick among the options

А что за _repeat и _interval_ms ? Пока это часть шага, поскольку ветвление и циклы я не придумал как сделать аккуратно и элегантно.

попробовать Fix можно только платным клиентам (growing и enterprise), поскольку я не вижу, когда надо тестировать fix на коленке. Как правило это надо кампаниям, которые уже имеют экспертизу на рынке.

Magic Metrics

Метрики — это круто. Особенно мне нравятся метрики, которые привязаны к конкретному прогону. Но есть проблема. Метрики классно смотреть, но не конструировать. Поэтому в Perfscale я сделал «Magic Metrics», которые автоматически подстраиваются к вашим тестам. Например для HTTP(s) это классический p50, p90, p95, p99, latency и прочие а также метрики машин, которые выполняли тест. Если у вас FIX protocol — то это тесты, которые показывют метрики самого FIX (Message rate, Order Rejected rate и прочие метрики).

magic metrics выглядят так (часть):

Perfscale news #2: Fix Protocol, Magic metrics и MCP
Magic reporters. Используется Demo машина с посредственными характеристиками

Если вы привыкли делать свои dashboards, то они никуда не ушли: есть Custom Dashboard с теми метриками, которые вы настраивали.

By Test всегда универсальный дашборд и его модификация приводит к изменениям у всех, в отличие от Custom Dashboard.


MCP

Я понимаю, что сейчас ИИ-бум ходит по планете. Отрицать это глупо, поэтому Представляю вашему вниманию MCP сервер для perfscale (github: Perfscale/mcp). Он работает как для Open source версии, так и для платной версии.

В бесплатной версии входят следующие команды

run_testRun a k6/locust/native test (perfscale run), return exit code + parsed summary export
lintValidate YAML files (perfscale lint), including typo and action-ID checks
get_schemaJSON Schema for test or config YAML (perfscale schema)
parse_summaryParse raw k6-compatible output into structured metrics
list_actionsCatalog of native std/* step actions
list_configsRecursively list YAML files in a directory, classified test/config
read_configRead one YAML file with its detected kind
write_testCreate/overwrite a test definition, then lint it against the test schema
write_configCreate/overwrite a run config, then lint it against the config schema
update_configOverwrite an existing file only (fails when absent), then lint
remove_configDelete a test/config YAML file

А подключить бесплатно можно через NPM

{
  "mcpServers": {
    "perfscale": {
      "command": "npx",
      "args": ["-y", "@perfscale/mcp"]
    }
  }
}

Или через claude

claude mcp add perfscale -- npx -y @perfscale/mcp


А для платной версии входят следующие команды

whoamireadCurrent user, workspace, role, permissions
tenant_limitsreadPlan, machine/test limits, retention, storage usage
list_machines / get_machinereadMachine fleet: status, hardware, agent version, benchmark capacity, region
list_tests / get_testreadTest definitions with config JSON
list_runs / get_runreadRuns with p50/p95/p99, error rate, RPS, total requests
get_run_logsreadFull log output of a run
runs_by_machinereadRun history for one machine
metrics_catalog / query_metricsreadAvailable metrics; time-series with label filters
get_otel_timeseriesreadOTEL metrics collected during a run
list_dashboardsreadCustom metric dashboards
list_git_reposreadConnected repositories and sync status
list_env_varsreadEnvironment variable keys — values are always masked
audit_logreadWorkspace activity: action, actor, target, time
run_testwriteDispatch a test to machines; returns task IDs and log-stream URLs
sync_git_repowriteTrigger test discovery for a repository

Как видите, для платной версии значительно больше команд, но и подключение другое. Сначало надо создать API_TOKEN на странице конфигурации

Создаем токен авторизации
Создаем токен авторизации

И подключаем уже controlplane-mcp а не OSS

{
  "mcpServers": {
    "perfscale-cloud": {
      "command": "npx",
      "args": ["-y", "@perfscale/controlplane-mcp"],
      "env": {
        "PERFSCALE_API_URL": "perfscale.su",
        "PERFSCALE_API_TOKEN": "psk_..."
      }
    }
  }
}


Таким образом после подключения можем попросить агента на нативном языке:

напиши тест, который возьмет GET запрос на https://example.com с 10 VU длительностью 30 сек запусти этот тест и какой был p95?

Агент выполнит get_schemawrite_test (auto-linted)write_configrun_test, and reads p95_ms из репорта.


На сегодня все! Пусть ваши сервисы были зелеными и не падали от нагрузки.

Бесплатный
sdet10
performance6
perfscale6
Комментарии
avatar
Здесь будут комментарии к публикации