[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-elastic-developing-rally":3,"mdc-80q1pf-key":35,"related-org-elastic-developing-rally":1288,"related-repo-elastic-developing-rally":1448},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":30,"sourceUrl":33,"mdContent":34},"developing-rally","develop and debug Rally source code","Work on Rally's own codebase, not running benchmarks with it. Use when setting up the dev environment, running Rally's tests or linters, navigating its source, debugging Rally's own code, or making changes to Rally itself.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"elastic","Elastic","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Felastic.png",[12,16,17,20],{"name":13,"slug":14,"type":15},"Local Development","local-development","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Engineering","engineering",{"name":21,"slug":22,"type":15},"Debugging","debugging",2027,"https:\u002F\u002Fgithub.com\u002Felastic\u002Frally","2026-07-12T07:46:35.976807",null,339,[29],"elasticsearch",{"repoUrl":24,"stars":23,"forks":27,"topics":31,"description":32},[29],"Macrobenchmarking framework for Elasticsearch","https:\u002F\u002Fgithub.com\u002Felastic\u002Frally\u002Ftree\u002FHEAD\u002Fskills\u002Fdeveloping-rally","---\nname: developing-rally\ndescription: >-\n  Work on Rally's own codebase, not running benchmarks with it. Use when\n  setting up the dev environment, running Rally's tests or linters, navigating\n  its source, debugging Rally's own code, or making changes to Rally itself.\n---\n\n# Developing Rally\n\nFor working *on* Rally, not just running it. The docs under [References](#references) are the\nsource of truth — prefer them over guessing.\n\n## Setup\n\nDevelopment uses [`uv`](https:\u002F\u002Fdocs.astral.sh\u002Fuv\u002F) and needs `jq`. Rally runs on Linux\u002FmacOS\nonly (no Windows) and targets Python 3.10–3.13. From a clone:\n\n```\nmake install            # create .venv and editable-install with dev extras\nsource .venv\u002Fbin\u002Factivate\nesrally --help          # runs your working-tree code (editable install)\n```\n\n`make install` editable-installs the workspace, so `esrally` \u002F `esrallyd` (or `uv run esrally …`)\nrun your working-tree code directly. Avoid the `.\u002Frally` \u002F `.\u002Frallyd` wrappers while developing:\nthey auto-update from git (via `run.sh`) and only run on a clean `master`, otherwise erroring\n`There are uncommitted changes …` — pass `--skip-update` if you must use them.\n\n## Everyday make targets\n\n- `make lint` \u002F `make format` — run\u002Fapply pre-commit linters (black, isort, …).\n- `make test` — unit tests. Scope with `make test ARGS=tests\u002Ffoo_test.py`; `make test-all`\n  runs across Python 3.10–3.13.\n- `make it` — integration tests (slow, CI-oriented). `make benchmark` runs the micro-benchmarks.\n- `make docs` \u002F `make serve-docs` — build\u002Fserve the `docs\u002F` site.\n\nBefore committing run `make lint test` (unit tests + lint; integration tests are too slow for\nthe inner loop). Optionally `make install-pre-commit` to run lint automatically on each commit.\n\n## Testing & conventions\n\n- Unit tests live in `tests\u002F` mirroring `esrally\u002F`, named `*_test.py`; integration tests in\n  `it\u002F`, micro-benchmarks in `benchmarks\u002F`.\n- `asyncio_mode = strict`, so async tests need an explicit `@pytest.mark.asyncio`.\n- `xfail_strict = true`, so an `xfail` test that unexpectedly passes fails the suite.\n- Type hints are **not** used broadly — they're added opportunistically per module, with the\n  strictly-checked modules listed under `[tool.mypy].overrides` in `pyproject.toml`. Match the\n  surrounding code rather than typing everything.\n- **Keep the load-driver hot path tight.** Code in `driver\u002F` runners, schedulers, and parameter\n  sources runs per operation during measurement, so extra overhead (logging, allocations,\n  blocking I\u002FO, locks) perturbs the throughput\u002Flatency\u002Fservice_time numbers Rally exists to\n  report. Do expensive work outside the measured loop.\n- For a **big or risky hot-path change**, consider quantifying its overhead with a\n  [`pytest-benchmark`](https:\u002F\u002Fpytest-benchmark.readthedocs.io\u002F) micro-benchmark under\n  `benchmarks\u002F` — coverage there is sparse, so treat this as a tool to reach for, not a standing\n  requirement. Take the `benchmark` fixture, call `benchmark(fn)`, decorate with\n  `@pytest.mark.benchmark(group=\"...\", warmup=\"on\", disable_gc=True)`, and compare against a\n  baseline variant. See `benchmarks\u002Fdriver\u002Frunner_test.py`.\n\n## Source organization (`esrally\u002F`)\n\n- `rally.py` — CLI entry point: argument parsing and subcommand dispatch.\n- `racecontrol.py` — orchestrates a race end-to-end via the pipelines registry.\n- `mechanic\u002F` — provisions, launches, and tears down Elasticsearch (only for `from-*` pipelines).\n- `driver\u002F` — generates load: schedules tasks and runs `runner.py` operations against the cluster.\n- `track\u002F` — loads and parses tracks\u002Fchallenges; `tracker\u002F` generates a track from an existing cluster.\n- `metrics.py` — the metrics store (in-memory or Elasticsearch); `reporter.py` — the summary report.\n- `client\u002F` — Elasticsearch client factory; `telemetry.py` — telemetry devices; `config.py` \u002F `types.py` — config.\n\n## Actor system\n\nRally is a distributed system built on [Thespian](https:\u002F\u002Fgithub.com\u002Fkquick\u002FThespian); even a\nsingle-machine race runs as actors. Three *logical* roles (`docs\u002Frally_daemon.rst`) that, by\ndefault, all run on the one machine where you invoke `esrally`:\n\n- **benchmark coordinator** — drives the whole race and shows results.\n- **load driver** — interprets and runs the track.\n- **provisioner** — configures and starts Elasticsearch.\n\n`--load-driver-hosts` and `--target-hosts` split the load driver and provisioner onto other\nmachines; multi-machine runs use the `esrallyd` daemon. `esrally\u002Factor.py` holds the shared\n`RallyActor` base and the bootstrap logic; `docs\u002Farchitecture\u002Factor_system.md` walks through the actors\nand their message flow with sequence diagrams. If actor-system startup fails (common on a VPN),\nset `THESPIAN_BASE_IPADDR` to a routable address.\n\n## Debugging\n\n- Rally logs to `~\u002F.rally\u002Flogs\u002Frally.log` (human-readable) and `rally.json` (structured);\n  profiling output goes to `profile.log`. Console output is only a summary — the full stack\n  trace of a failure is usually in the log file, not on stdout.\n- Each log line carries the emitting actor's address (`%(actorAddress)s`), so you can trace a\n  failure across the actor system. The actor framework's own internal log is separate:\n  `~\u002F.rally\u002Flogs\u002Factor-system-internal.log` (path via `THESPLOG_FILE`) — check it when actors\n  fail to start or communicate, and set `THESPLOG_THRESHOLD` (default `INFO`) to `DEBUG` for\n  more detail on the actor system itself.\n- Raise the log level to see more: edit `~\u002F.rally\u002Flogging.json` (created on first run from\n  `esrally\u002Fresources\u002Flogging.json`) and set `\"level\": \"DEBUG\"` on the `root` logger for\n  everything, or add a per-module entry under `loggers` to scope it (matching the existing\n  entries, which just set a level and inherit the root handlers), e.g.:\n\n  ```json\n  \"loggers\": {\n    \"esrally.driver\": {\"level\": \"DEBUG\"}\n  }\n  ```\n\n  Then re-run. Revert to `INFO` when done — `DEBUG` is verbose.\n\n## Reproduce a failing integration test\n\nIntegration tests in `it\u002F` drive real races, so a failure usually reflects a real bug.\nTo debug any IT failure:\n\n- Re-run the single failing test in isolation: `make it ARGS=\"it\u002F\u003Cfile>.py -k \u003Cpattern>\"`.\n- Reproduce outside the test harness by running the equivalent race yourself — fast, against a\n  throwaway local cluster — then read the logs (see [Debugging](#debugging), raising the level\n  to `DEBUG` as needed):\n\n  ```bash\n  esrally race --distribution-version=9.4.0 --track=geonames --test-mode --on-error=abort\n  ```\n\n- If the failure is in the actor system, add `THESPLOG_THRESHOLD=DEBUG` and inspect a running\n  system with the Thespian shell: `python3 -m thespian.shell` (see `docs\u002Frally_daemon.rst`).\n\n## References\n\n- Developer setup & key components: `docs\u002Fdeveloping.rst`\n- Contribution workflow (PRs, license headers, CLA): `CONTRIBUTING.md`\n- Distributed setup & the actor-system roles: `docs\u002Frally_daemon.rst`\n- Actor message flow (sequence diagrams): `docs\u002Farchitecture\u002Factor_system.md`\n- Thespian actor framework: https:\u002F\u002Fgithub.com\u002Fkquick\u002FThespian\n- All flags (do not invent flags; verify here or via `esrally \u003Csubcommand> --help`): `docs\u002Fcommand_line_reference.rst`\n- Running benchmarks against a cluster: the `running-benchmarks` skill\n",{"data":36,"body":37},{"name":4,"description":6},{"type":38,"children":39},"root",[40,48,71,78,106,118,200,206,301,322,328,523,536,670,676,712,745,803,807,1069,1075,1087,1190,1195,1282],{"type":41,"tag":42,"props":43,"children":44},"element","h1",{"id":4},[45],{"type":46,"value":47},"text","Developing Rally",{"type":41,"tag":49,"props":50,"children":51},"p",{},[52,54,60,62,69],{"type":46,"value":53},"For working ",{"type":41,"tag":55,"props":56,"children":57},"em",{},[58],{"type":46,"value":59},"on",{"type":46,"value":61}," Rally, not just running it. The docs under ",{"type":41,"tag":63,"props":64,"children":66},"a",{"href":65},"#references",[67],{"type":46,"value":68},"References",{"type":46,"value":70}," are the\nsource of truth — prefer them over guessing.",{"type":41,"tag":72,"props":73,"children":75},"h2",{"id":74},"setup",[76],{"type":46,"value":77},"Setup",{"type":41,"tag":49,"props":79,"children":80},{},[81,83,96,98,104],{"type":46,"value":82},"Development uses ",{"type":41,"tag":63,"props":84,"children":88},{"href":85,"rel":86},"https:\u002F\u002Fdocs.astral.sh\u002Fuv\u002F",[87],"nofollow",[89],{"type":41,"tag":90,"props":91,"children":93},"code",{"className":92},[],[94],{"type":46,"value":95},"uv",{"type":46,"value":97}," and needs ",{"type":41,"tag":90,"props":99,"children":101},{"className":100},[],[102],{"type":46,"value":103},"jq",{"type":46,"value":105},". Rally runs on Linux\u002FmacOS\nonly (no Windows) and targets Python 3.10–3.13. From a clone:",{"type":41,"tag":107,"props":108,"children":112},"pre",{"className":109,"code":111,"language":46},[110],"language-text","make install            # create .venv and editable-install with dev extras\nsource .venv\u002Fbin\u002Factivate\nesrally --help          # runs your working-tree code (editable install)\n",[113],{"type":41,"tag":90,"props":114,"children":116},{"__ignoreMap":115},"",[117],{"type":46,"value":111},{"type":41,"tag":49,"props":119,"children":120},{},[121,127,129,135,137,143,145,151,153,159,160,166,168,174,176,182,184,190,192,198],{"type":41,"tag":90,"props":122,"children":124},{"className":123},[],[125],{"type":46,"value":126},"make install",{"type":46,"value":128}," editable-installs the workspace, so ",{"type":41,"tag":90,"props":130,"children":132},{"className":131},[],[133],{"type":46,"value":134},"esrally",{"type":46,"value":136}," \u002F ",{"type":41,"tag":90,"props":138,"children":140},{"className":139},[],[141],{"type":46,"value":142},"esrallyd",{"type":46,"value":144}," (or ",{"type":41,"tag":90,"props":146,"children":148},{"className":147},[],[149],{"type":46,"value":150},"uv run esrally …",{"type":46,"value":152},")\nrun your working-tree code directly. Avoid the ",{"type":41,"tag":90,"props":154,"children":156},{"className":155},[],[157],{"type":46,"value":158},".\u002Frally",{"type":46,"value":136},{"type":41,"tag":90,"props":161,"children":163},{"className":162},[],[164],{"type":46,"value":165},".\u002Frallyd",{"type":46,"value":167}," wrappers while developing:\nthey auto-update from git (via ",{"type":41,"tag":90,"props":169,"children":171},{"className":170},[],[172],{"type":46,"value":173},"run.sh",{"type":46,"value":175},") and only run on a clean ",{"type":41,"tag":90,"props":177,"children":179},{"className":178},[],[180],{"type":46,"value":181},"master",{"type":46,"value":183},", otherwise erroring\n",{"type":41,"tag":90,"props":185,"children":187},{"className":186},[],[188],{"type":46,"value":189},"There are uncommitted changes …",{"type":46,"value":191}," — pass ",{"type":41,"tag":90,"props":193,"children":195},{"className":194},[],[196],{"type":46,"value":197},"--skip-update",{"type":46,"value":199}," if you must use them.",{"type":41,"tag":72,"props":201,"children":203},{"id":202},"everyday-make-targets",[204],{"type":46,"value":205},"Everyday make targets",{"type":41,"tag":207,"props":208,"children":209},"ul",{},[210,229,256,275],{"type":41,"tag":211,"props":212,"children":213},"li",{},[214,220,221,227],{"type":41,"tag":90,"props":215,"children":217},{"className":216},[],[218],{"type":46,"value":219},"make lint",{"type":46,"value":136},{"type":41,"tag":90,"props":222,"children":224},{"className":223},[],[225],{"type":46,"value":226},"make format",{"type":46,"value":228}," — run\u002Fapply pre-commit linters (black, isort, …).",{"type":41,"tag":211,"props":230,"children":231},{},[232,238,240,246,248,254],{"type":41,"tag":90,"props":233,"children":235},{"className":234},[],[236],{"type":46,"value":237},"make test",{"type":46,"value":239}," — unit tests. Scope with ",{"type":41,"tag":90,"props":241,"children":243},{"className":242},[],[244],{"type":46,"value":245},"make test ARGS=tests\u002Ffoo_test.py",{"type":46,"value":247},"; ",{"type":41,"tag":90,"props":249,"children":251},{"className":250},[],[252],{"type":46,"value":253},"make test-all",{"type":46,"value":255},"\nruns across Python 3.10–3.13.",{"type":41,"tag":211,"props":257,"children":258},{},[259,265,267,273],{"type":41,"tag":90,"props":260,"children":262},{"className":261},[],[263],{"type":46,"value":264},"make it",{"type":46,"value":266}," — integration tests (slow, CI-oriented). ",{"type":41,"tag":90,"props":268,"children":270},{"className":269},[],[271],{"type":46,"value":272},"make benchmark",{"type":46,"value":274}," runs the micro-benchmarks.",{"type":41,"tag":211,"props":276,"children":277},{},[278,284,285,291,293,299],{"type":41,"tag":90,"props":279,"children":281},{"className":280},[],[282],{"type":46,"value":283},"make docs",{"type":46,"value":136},{"type":41,"tag":90,"props":286,"children":288},{"className":287},[],[289],{"type":46,"value":290},"make serve-docs",{"type":46,"value":292}," — build\u002Fserve the ",{"type":41,"tag":90,"props":294,"children":296},{"className":295},[],[297],{"type":46,"value":298},"docs\u002F",{"type":46,"value":300}," site.",{"type":41,"tag":49,"props":302,"children":303},{},[304,306,312,314,320],{"type":46,"value":305},"Before committing run ",{"type":41,"tag":90,"props":307,"children":309},{"className":308},[],[310],{"type":46,"value":311},"make lint test",{"type":46,"value":313}," (unit tests + lint; integration tests are too slow for\nthe inner loop). Optionally ",{"type":41,"tag":90,"props":315,"children":317},{"className":316},[],[318],{"type":46,"value":319},"make install-pre-commit",{"type":46,"value":321}," to run lint automatically on each commit.",{"type":41,"tag":72,"props":323,"children":325},{"id":324},"testing-conventions",[326],{"type":46,"value":327},"Testing & conventions",{"type":41,"tag":207,"props":329,"children":330},{},[331,376,394,413,442,460],{"type":41,"tag":211,"props":332,"children":333},{},[334,336,342,344,350,352,358,360,366,368,374],{"type":46,"value":335},"Unit tests live in ",{"type":41,"tag":90,"props":337,"children":339},{"className":338},[],[340],{"type":46,"value":341},"tests\u002F",{"type":46,"value":343}," mirroring ",{"type":41,"tag":90,"props":345,"children":347},{"className":346},[],[348],{"type":46,"value":349},"esrally\u002F",{"type":46,"value":351},", named ",{"type":41,"tag":90,"props":353,"children":355},{"className":354},[],[356],{"type":46,"value":357},"*_test.py",{"type":46,"value":359},"; integration tests in\n",{"type":41,"tag":90,"props":361,"children":363},{"className":362},[],[364],{"type":46,"value":365},"it\u002F",{"type":46,"value":367},", micro-benchmarks in ",{"type":41,"tag":90,"props":369,"children":371},{"className":370},[],[372],{"type":46,"value":373},"benchmarks\u002F",{"type":46,"value":375},".",{"type":41,"tag":211,"props":377,"children":378},{},[379,385,387,393],{"type":41,"tag":90,"props":380,"children":382},{"className":381},[],[383],{"type":46,"value":384},"asyncio_mode = strict",{"type":46,"value":386},", so async tests need an explicit ",{"type":41,"tag":90,"props":388,"children":390},{"className":389},[],[391],{"type":46,"value":392},"@pytest.mark.asyncio",{"type":46,"value":375},{"type":41,"tag":211,"props":395,"children":396},{},[397,403,405,411],{"type":41,"tag":90,"props":398,"children":400},{"className":399},[],[401],{"type":46,"value":402},"xfail_strict = true",{"type":46,"value":404},", so an ",{"type":41,"tag":90,"props":406,"children":408},{"className":407},[],[409],{"type":46,"value":410},"xfail",{"type":46,"value":412}," test that unexpectedly passes fails the suite.",{"type":41,"tag":211,"props":414,"children":415},{},[416,418,424,426,432,434,440],{"type":46,"value":417},"Type hints are ",{"type":41,"tag":419,"props":420,"children":421},"strong",{},[422],{"type":46,"value":423},"not",{"type":46,"value":425}," used broadly — they're added opportunistically per module, with the\nstrictly-checked modules listed under ",{"type":41,"tag":90,"props":427,"children":429},{"className":428},[],[430],{"type":46,"value":431},"[tool.mypy].overrides",{"type":46,"value":433}," in ",{"type":41,"tag":90,"props":435,"children":437},{"className":436},[],[438],{"type":46,"value":439},"pyproject.toml",{"type":46,"value":441},". Match the\nsurrounding code rather than typing everything.",{"type":41,"tag":211,"props":443,"children":444},{},[445,450,452,458],{"type":41,"tag":419,"props":446,"children":447},{},[448],{"type":46,"value":449},"Keep the load-driver hot path tight.",{"type":46,"value":451}," Code in ",{"type":41,"tag":90,"props":453,"children":455},{"className":454},[],[456],{"type":46,"value":457},"driver\u002F",{"type":46,"value":459}," runners, schedulers, and parameter\nsources runs per operation during measurement, so extra overhead (logging, allocations,\nblocking I\u002FO, locks) perturbs the throughput\u002Flatency\u002Fservice_time numbers Rally exists to\nreport. Do expensive work outside the measured loop.",{"type":41,"tag":211,"props":461,"children":462},{},[463,465,470,472,483,485,490,492,498,500,506,508,514,516,522],{"type":46,"value":464},"For a ",{"type":41,"tag":419,"props":466,"children":467},{},[468],{"type":46,"value":469},"big or risky hot-path change",{"type":46,"value":471},", consider quantifying its overhead with a\n",{"type":41,"tag":63,"props":473,"children":476},{"href":474,"rel":475},"https:\u002F\u002Fpytest-benchmark.readthedocs.io\u002F",[87],[477],{"type":41,"tag":90,"props":478,"children":480},{"className":479},[],[481],{"type":46,"value":482},"pytest-benchmark",{"type":46,"value":484}," micro-benchmark under\n",{"type":41,"tag":90,"props":486,"children":488},{"className":487},[],[489],{"type":46,"value":373},{"type":46,"value":491}," — coverage there is sparse, so treat this as a tool to reach for, not a standing\nrequirement. Take the ",{"type":41,"tag":90,"props":493,"children":495},{"className":494},[],[496],{"type":46,"value":497},"benchmark",{"type":46,"value":499}," fixture, call ",{"type":41,"tag":90,"props":501,"children":503},{"className":502},[],[504],{"type":46,"value":505},"benchmark(fn)",{"type":46,"value":507},", decorate with\n",{"type":41,"tag":90,"props":509,"children":511},{"className":510},[],[512],{"type":46,"value":513},"@pytest.mark.benchmark(group=\"...\", warmup=\"on\", disable_gc=True)",{"type":46,"value":515},", and compare against a\nbaseline variant. See ",{"type":41,"tag":90,"props":517,"children":519},{"className":518},[],[520],{"type":46,"value":521},"benchmarks\u002Fdriver\u002Frunner_test.py",{"type":46,"value":375},{"type":41,"tag":72,"props":524,"children":526},{"id":525},"source-organization-esrally",[527,529,534],{"type":46,"value":528},"Source organization (",{"type":41,"tag":90,"props":530,"children":532},{"className":531},[],[533],{"type":46,"value":349},{"type":46,"value":535},")",{"type":41,"tag":207,"props":537,"children":538},{},[539,550,561,580,598,617,636],{"type":41,"tag":211,"props":540,"children":541},{},[542,548],{"type":41,"tag":90,"props":543,"children":545},{"className":544},[],[546],{"type":46,"value":547},"rally.py",{"type":46,"value":549}," — CLI entry point: argument parsing and subcommand dispatch.",{"type":41,"tag":211,"props":551,"children":552},{},[553,559],{"type":41,"tag":90,"props":554,"children":556},{"className":555},[],[557],{"type":46,"value":558},"racecontrol.py",{"type":46,"value":560}," — orchestrates a race end-to-end via the pipelines registry.",{"type":41,"tag":211,"props":562,"children":563},{},[564,570,572,578],{"type":41,"tag":90,"props":565,"children":567},{"className":566},[],[568],{"type":46,"value":569},"mechanic\u002F",{"type":46,"value":571}," — provisions, launches, and tears down Elasticsearch (only for ",{"type":41,"tag":90,"props":573,"children":575},{"className":574},[],[576],{"type":46,"value":577},"from-*",{"type":46,"value":579}," pipelines).",{"type":41,"tag":211,"props":581,"children":582},{},[583,588,590,596],{"type":41,"tag":90,"props":584,"children":586},{"className":585},[],[587],{"type":46,"value":457},{"type":46,"value":589}," — generates load: schedules tasks and runs ",{"type":41,"tag":90,"props":591,"children":593},{"className":592},[],[594],{"type":46,"value":595},"runner.py",{"type":46,"value":597}," operations against the cluster.",{"type":41,"tag":211,"props":599,"children":600},{},[601,607,609,615],{"type":41,"tag":90,"props":602,"children":604},{"className":603},[],[605],{"type":46,"value":606},"track\u002F",{"type":46,"value":608}," — loads and parses tracks\u002Fchallenges; ",{"type":41,"tag":90,"props":610,"children":612},{"className":611},[],[613],{"type":46,"value":614},"tracker\u002F",{"type":46,"value":616}," generates a track from an existing cluster.",{"type":41,"tag":211,"props":618,"children":619},{},[620,626,628,634],{"type":41,"tag":90,"props":621,"children":623},{"className":622},[],[624],{"type":46,"value":625},"metrics.py",{"type":46,"value":627}," — the metrics store (in-memory or Elasticsearch); ",{"type":41,"tag":90,"props":629,"children":631},{"className":630},[],[632],{"type":46,"value":633},"reporter.py",{"type":46,"value":635}," — the summary report.",{"type":41,"tag":211,"props":637,"children":638},{},[639,645,647,653,655,661,662,668],{"type":41,"tag":90,"props":640,"children":642},{"className":641},[],[643],{"type":46,"value":644},"client\u002F",{"type":46,"value":646}," — Elasticsearch client factory; ",{"type":41,"tag":90,"props":648,"children":650},{"className":649},[],[651],{"type":46,"value":652},"telemetry.py",{"type":46,"value":654}," — telemetry devices; ",{"type":41,"tag":90,"props":656,"children":658},{"className":657},[],[659],{"type":46,"value":660},"config.py",{"type":46,"value":136},{"type":41,"tag":90,"props":663,"children":665},{"className":664},[],[666],{"type":46,"value":667},"types.py",{"type":46,"value":669}," — config.",{"type":41,"tag":72,"props":671,"children":673},{"id":672},"actor-system",[674],{"type":46,"value":675},"Actor system",{"type":41,"tag":49,"props":677,"children":678},{},[679,681,688,690,695,697,703,705,710],{"type":46,"value":680},"Rally is a distributed system built on ",{"type":41,"tag":63,"props":682,"children":685},{"href":683,"rel":684},"https:\u002F\u002Fgithub.com\u002Fkquick\u002FThespian",[87],[686],{"type":46,"value":687},"Thespian",{"type":46,"value":689},"; even a\nsingle-machine race runs as actors. Three ",{"type":41,"tag":55,"props":691,"children":692},{},[693],{"type":46,"value":694},"logical",{"type":46,"value":696}," roles (",{"type":41,"tag":90,"props":698,"children":700},{"className":699},[],[701],{"type":46,"value":702},"docs\u002Frally_daemon.rst",{"type":46,"value":704},") that, by\ndefault, all run on the one machine where you invoke ",{"type":41,"tag":90,"props":706,"children":708},{"className":707},[],[709],{"type":46,"value":134},{"type":46,"value":711},":",{"type":41,"tag":207,"props":713,"children":714},{},[715,725,735],{"type":41,"tag":211,"props":716,"children":717},{},[718,723],{"type":41,"tag":419,"props":719,"children":720},{},[721],{"type":46,"value":722},"benchmark coordinator",{"type":46,"value":724}," — drives the whole race and shows results.",{"type":41,"tag":211,"props":726,"children":727},{},[728,733],{"type":41,"tag":419,"props":729,"children":730},{},[731],{"type":46,"value":732},"load driver",{"type":46,"value":734}," — interprets and runs the track.",{"type":41,"tag":211,"props":736,"children":737},{},[738,743],{"type":41,"tag":419,"props":739,"children":740},{},[741],{"type":46,"value":742},"provisioner",{"type":46,"value":744}," — configures and starts Elasticsearch.",{"type":41,"tag":49,"props":746,"children":747},{},[748,754,756,762,764,769,771,777,779,785,787,793,795,801],{"type":41,"tag":90,"props":749,"children":751},{"className":750},[],[752],{"type":46,"value":753},"--load-driver-hosts",{"type":46,"value":755}," and ",{"type":41,"tag":90,"props":757,"children":759},{"className":758},[],[760],{"type":46,"value":761},"--target-hosts",{"type":46,"value":763}," split the load driver and provisioner onto other\nmachines; multi-machine runs use the ",{"type":41,"tag":90,"props":765,"children":767},{"className":766},[],[768],{"type":46,"value":142},{"type":46,"value":770}," daemon. ",{"type":41,"tag":90,"props":772,"children":774},{"className":773},[],[775],{"type":46,"value":776},"esrally\u002Factor.py",{"type":46,"value":778}," holds the shared\n",{"type":41,"tag":90,"props":780,"children":782},{"className":781},[],[783],{"type":46,"value":784},"RallyActor",{"type":46,"value":786}," base and the bootstrap logic; ",{"type":41,"tag":90,"props":788,"children":790},{"className":789},[],[791],{"type":46,"value":792},"docs\u002Farchitecture\u002Factor_system.md",{"type":46,"value":794}," walks through the actors\nand their message flow with sequence diagrams. If actor-system startup fails (common on a VPN),\nset ",{"type":41,"tag":90,"props":796,"children":798},{"className":797},[],[799],{"type":46,"value":800},"THESPIAN_BASE_IPADDR",{"type":46,"value":802}," to a routable address.",{"type":41,"tag":72,"props":804,"children":805},{"id":22},[806],{"type":46,"value":21},{"type":41,"tag":207,"props":808,"children":809},{},[810,839,892],{"type":41,"tag":211,"props":811,"children":812},{},[813,815,821,823,829,831,837],{"type":46,"value":814},"Rally logs to ",{"type":41,"tag":90,"props":816,"children":818},{"className":817},[],[819],{"type":46,"value":820},"~\u002F.rally\u002Flogs\u002Frally.log",{"type":46,"value":822}," (human-readable) and ",{"type":41,"tag":90,"props":824,"children":826},{"className":825},[],[827],{"type":46,"value":828},"rally.json",{"type":46,"value":830}," (structured);\nprofiling output goes to ",{"type":41,"tag":90,"props":832,"children":834},{"className":833},[],[835],{"type":46,"value":836},"profile.log",{"type":46,"value":838},". Console output is only a summary — the full stack\ntrace of a failure is usually in the log file, not on stdout.",{"type":41,"tag":211,"props":840,"children":841},{},[842,844,850,852,858,860,866,868,874,876,882,884,890],{"type":46,"value":843},"Each log line carries the emitting actor's address (",{"type":41,"tag":90,"props":845,"children":847},{"className":846},[],[848],{"type":46,"value":849},"%(actorAddress)s",{"type":46,"value":851},"), so you can trace a\nfailure across the actor system. The actor framework's own internal log is separate:\n",{"type":41,"tag":90,"props":853,"children":855},{"className":854},[],[856],{"type":46,"value":857},"~\u002F.rally\u002Flogs\u002Factor-system-internal.log",{"type":46,"value":859}," (path via ",{"type":41,"tag":90,"props":861,"children":863},{"className":862},[],[864],{"type":46,"value":865},"THESPLOG_FILE",{"type":46,"value":867},") — check it when actors\nfail to start or communicate, and set ",{"type":41,"tag":90,"props":869,"children":871},{"className":870},[],[872],{"type":46,"value":873},"THESPLOG_THRESHOLD",{"type":46,"value":875}," (default ",{"type":41,"tag":90,"props":877,"children":879},{"className":878},[],[880],{"type":46,"value":881},"INFO",{"type":46,"value":883},") to ",{"type":41,"tag":90,"props":885,"children":887},{"className":886},[],[888],{"type":46,"value":889},"DEBUG",{"type":46,"value":891}," for\nmore detail on the actor system itself.",{"type":41,"tag":211,"props":893,"children":894},{},[895,897,903,905,911,913,919,921,926,928,934,936,1049,1053,1055,1060,1062,1067],{"type":46,"value":896},"Raise the log level to see more: edit ",{"type":41,"tag":90,"props":898,"children":900},{"className":899},[],[901],{"type":46,"value":902},"~\u002F.rally\u002Flogging.json",{"type":46,"value":904}," (created on first run from\n",{"type":41,"tag":90,"props":906,"children":908},{"className":907},[],[909],{"type":46,"value":910},"esrally\u002Fresources\u002Flogging.json",{"type":46,"value":912},") and set ",{"type":41,"tag":90,"props":914,"children":916},{"className":915},[],[917],{"type":46,"value":918},"\"level\": \"DEBUG\"",{"type":46,"value":920}," on the ",{"type":41,"tag":90,"props":922,"children":924},{"className":923},[],[925],{"type":46,"value":38},{"type":46,"value":927}," logger for\neverything, or add a per-module entry under ",{"type":41,"tag":90,"props":929,"children":931},{"className":930},[],[932],{"type":46,"value":933},"loggers",{"type":46,"value":935}," to scope it (matching the existing\nentries, which just set a level and inherit the root handlers), e.g.:",{"type":41,"tag":107,"props":937,"children":941},{"className":938,"code":939,"language":940,"meta":115,"style":115},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"loggers\": {\n  \"esrally.driver\": {\"level\": \"DEBUG\"}\n}\n","json",[942],{"type":41,"tag":90,"props":943,"children":944},{"__ignoreMap":115},[945,977,1041],{"type":41,"tag":946,"props":947,"children":950},"span",{"class":948,"line":949},"line",1,[951,957,962,966,972],{"type":41,"tag":946,"props":952,"children":954},{"style":953},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[955],{"type":46,"value":956},"\"",{"type":41,"tag":946,"props":958,"children":960},{"style":959},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[961],{"type":46,"value":933},{"type":41,"tag":946,"props":963,"children":964},{"style":953},[965],{"type":46,"value":956},{"type":41,"tag":946,"props":967,"children":969},{"style":968},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[970],{"type":46,"value":971},": ",{"type":41,"tag":946,"props":973,"children":974},{"style":953},[975],{"type":46,"value":976},"{\n",{"type":41,"tag":946,"props":978,"children":980},{"class":948,"line":979},2,[981,986,992,996,1000,1005,1009,1015,1019,1023,1028,1032,1036],{"type":41,"tag":946,"props":982,"children":983},{"style":953},[984],{"type":46,"value":985},"  \"",{"type":41,"tag":946,"props":987,"children":989},{"style":988},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[990],{"type":46,"value":991},"esrally.driver",{"type":41,"tag":946,"props":993,"children":994},{"style":953},[995],{"type":46,"value":956},{"type":41,"tag":946,"props":997,"children":998},{"style":953},[999],{"type":46,"value":711},{"type":41,"tag":946,"props":1001,"children":1002},{"style":953},[1003],{"type":46,"value":1004}," {",{"type":41,"tag":946,"props":1006,"children":1007},{"style":953},[1008],{"type":46,"value":956},{"type":41,"tag":946,"props":1010,"children":1012},{"style":1011},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[1013],{"type":46,"value":1014},"level",{"type":41,"tag":946,"props":1016,"children":1017},{"style":953},[1018],{"type":46,"value":956},{"type":41,"tag":946,"props":1020,"children":1021},{"style":953},[1022],{"type":46,"value":711},{"type":41,"tag":946,"props":1024,"children":1025},{"style":953},[1026],{"type":46,"value":1027}," \"",{"type":41,"tag":946,"props":1029,"children":1030},{"style":959},[1031],{"type":46,"value":889},{"type":41,"tag":946,"props":1033,"children":1034},{"style":953},[1035],{"type":46,"value":956},{"type":41,"tag":946,"props":1037,"children":1038},{"style":953},[1039],{"type":46,"value":1040},"}\n",{"type":41,"tag":946,"props":1042,"children":1044},{"class":948,"line":1043},3,[1045],{"type":41,"tag":946,"props":1046,"children":1047},{"style":953},[1048],{"type":46,"value":1040},{"type":41,"tag":1050,"props":1051,"children":1052},"br",{},[],{"type":46,"value":1054},"Then re-run. Revert to ",{"type":41,"tag":90,"props":1056,"children":1058},{"className":1057},[],[1059],{"type":46,"value":881},{"type":46,"value":1061}," when done — ",{"type":41,"tag":90,"props":1063,"children":1065},{"className":1064},[],[1066],{"type":46,"value":889},{"type":46,"value":1068}," is verbose.",{"type":41,"tag":72,"props":1070,"children":1072},{"id":1071},"reproduce-a-failing-integration-test",[1073],{"type":46,"value":1074},"Reproduce a failing integration test",{"type":41,"tag":49,"props":1076,"children":1077},{},[1078,1080,1085],{"type":46,"value":1079},"Integration tests in ",{"type":41,"tag":90,"props":1081,"children":1083},{"className":1082},[],[1084],{"type":46,"value":365},{"type":46,"value":1086}," drive real races, so a failure usually reflects a real bug.\nTo debug any IT failure:",{"type":41,"tag":207,"props":1088,"children":1089},{},[1090,1102,1162],{"type":41,"tag":211,"props":1091,"children":1092},{},[1093,1095,1101],{"type":46,"value":1094},"Re-run the single failing test in isolation: ",{"type":41,"tag":90,"props":1096,"children":1098},{"className":1097},[],[1099],{"type":46,"value":1100},"make it ARGS=\"it\u002F\u003Cfile>.py -k \u003Cpattern>\"",{"type":46,"value":375},{"type":41,"tag":211,"props":1103,"children":1104},{},[1105,1107,1112,1114,1119,1121],{"type":46,"value":1106},"Reproduce outside the test harness by running the equivalent race yourself — fast, against a\nthrowaway local cluster — then read the logs (see ",{"type":41,"tag":63,"props":1108,"children":1110},{"href":1109},"#debugging",[1111],{"type":46,"value":21},{"type":46,"value":1113},", raising the level\nto ",{"type":41,"tag":90,"props":1115,"children":1117},{"className":1116},[],[1118],{"type":46,"value":889},{"type":46,"value":1120}," as needed):",{"type":41,"tag":107,"props":1122,"children":1126},{"className":1123,"code":1124,"language":1125,"meta":115,"style":115},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","esrally race --distribution-version=9.4.0 --track=geonames --test-mode --on-error=abort\n","bash",[1127],{"type":41,"tag":90,"props":1128,"children":1129},{"__ignoreMap":115},[1130],{"type":41,"tag":946,"props":1131,"children":1132},{"class":948,"line":949},[1133,1137,1142,1147,1152,1157],{"type":41,"tag":946,"props":1134,"children":1135},{"style":1011},[1136],{"type":46,"value":134},{"type":41,"tag":946,"props":1138,"children":1139},{"style":959},[1140],{"type":46,"value":1141}," race",{"type":41,"tag":946,"props":1143,"children":1144},{"style":959},[1145],{"type":46,"value":1146}," --distribution-version=9.4.0",{"type":41,"tag":946,"props":1148,"children":1149},{"style":959},[1150],{"type":46,"value":1151}," --track=geonames",{"type":41,"tag":946,"props":1153,"children":1154},{"style":959},[1155],{"type":46,"value":1156}," --test-mode",{"type":41,"tag":946,"props":1158,"children":1159},{"style":959},[1160],{"type":46,"value":1161}," --on-error=abort\n",{"type":41,"tag":211,"props":1163,"children":1164},{},[1165,1167,1173,1175,1181,1183,1188],{"type":46,"value":1166},"If the failure is in the actor system, add ",{"type":41,"tag":90,"props":1168,"children":1170},{"className":1169},[],[1171],{"type":46,"value":1172},"THESPLOG_THRESHOLD=DEBUG",{"type":46,"value":1174}," and inspect a running\nsystem with the Thespian shell: ",{"type":41,"tag":90,"props":1176,"children":1178},{"className":1177},[],[1179],{"type":46,"value":1180},"python3 -m thespian.shell",{"type":46,"value":1182}," (see ",{"type":41,"tag":90,"props":1184,"children":1186},{"className":1185},[],[1187],{"type":46,"value":702},{"type":46,"value":1189},").",{"type":41,"tag":72,"props":1191,"children":1193},{"id":1192},"references",[1194],{"type":46,"value":68},{"type":41,"tag":207,"props":1196,"children":1197},{},[1198,1209,1220,1230,1240,1250,1269],{"type":41,"tag":211,"props":1199,"children":1200},{},[1201,1203],{"type":46,"value":1202},"Developer setup & key components: ",{"type":41,"tag":90,"props":1204,"children":1206},{"className":1205},[],[1207],{"type":46,"value":1208},"docs\u002Fdeveloping.rst",{"type":41,"tag":211,"props":1210,"children":1211},{},[1212,1214],{"type":46,"value":1213},"Contribution workflow (PRs, license headers, CLA): ",{"type":41,"tag":90,"props":1215,"children":1217},{"className":1216},[],[1218],{"type":46,"value":1219},"CONTRIBUTING.md",{"type":41,"tag":211,"props":1221,"children":1222},{},[1223,1225],{"type":46,"value":1224},"Distributed setup & the actor-system roles: ",{"type":41,"tag":90,"props":1226,"children":1228},{"className":1227},[],[1229],{"type":46,"value":702},{"type":41,"tag":211,"props":1231,"children":1232},{},[1233,1235],{"type":46,"value":1234},"Actor message flow (sequence diagrams): ",{"type":41,"tag":90,"props":1236,"children":1238},{"className":1237},[],[1239],{"type":46,"value":792},{"type":41,"tag":211,"props":1241,"children":1242},{},[1243,1245],{"type":46,"value":1244},"Thespian actor framework: ",{"type":41,"tag":63,"props":1246,"children":1248},{"href":683,"rel":1247},[87],[1249],{"type":46,"value":683},{"type":41,"tag":211,"props":1251,"children":1252},{},[1253,1255,1261,1263],{"type":46,"value":1254},"All flags (do not invent flags; verify here or via ",{"type":41,"tag":90,"props":1256,"children":1258},{"className":1257},[],[1259],{"type":46,"value":1260},"esrally \u003Csubcommand> --help",{"type":46,"value":1262},"): ",{"type":41,"tag":90,"props":1264,"children":1266},{"className":1265},[],[1267],{"type":46,"value":1268},"docs\u002Fcommand_line_reference.rst",{"type":41,"tag":211,"props":1270,"children":1271},{},[1272,1274,1280],{"type":46,"value":1273},"Running benchmarks against a cluster: the ",{"type":41,"tag":90,"props":1275,"children":1277},{"className":1276},[],[1278],{"type":46,"value":1279},"running-benchmarks",{"type":46,"value":1281}," skill",{"type":41,"tag":1283,"props":1284,"children":1285},"style",{},[1286],{"type":46,"value":1287},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1289,"total":1447},[1290,1307,1314,1327,1346,1358,1368,1383,1395,1410,1421,1434],{"slug":1291,"name":1291,"fn":1292,"description":1293,"org":1294,"tags":1295,"stars":23,"repoUrl":24,"updatedAt":1306},"accessing-benchmark-results","retrieve and analyze Rally benchmark results","Retrieve Rally benchmark results from an external Elasticsearch metrics store. Use to list past races, get a single race's overall (per-task) results, chart a metric's trend across multiple runs, compare two races, or check whether a run converged — e.g. \"show me recent geonames races\", \"what's the service_time trend for nyc_taxis over the last 30 days?\", \"compare these two race-ids\". Applies when datastore.type = elasticsearch is set in ~\u002F.rally\u002Frally.ini.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1296,1299,1302,1303],{"name":1297,"slug":1298,"type":15},"Analytics","analytics",{"name":1300,"slug":1301,"type":15},"Data Analysis","data-analysis",{"name":9,"slug":8,"type":15},{"name":1304,"slug":1305,"type":15},"Performance","performance","2026-07-12T07:46:38.54144",{"slug":4,"name":4,"fn":5,"description":6,"org":1308,"tags":1309,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1310,1311,1312,1313],{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},{"name":13,"slug":14,"type":15},{"slug":1279,"name":1279,"fn":1315,"description":1316,"org":1317,"tags":1318,"stars":23,"repoUrl":24,"updatedAt":1326},"run Rally benchmarks against Elasticsearch","Run Rally benchmarks (races) against Elasticsearch — an existing\u002Fexternal cluster or a Rally-provisioned distribution — and read the summary report. Use when running a race (any pipeline, track, challenge, target-hosts, or auth) or when interpreting throughput, latency, and service_time results.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1319,1320,1322,1323],{"name":9,"slug":8,"type":15},{"name":1321,"slug":29,"type":15},"Elasticsearch",{"name":1304,"slug":1305,"type":15},{"name":1324,"slug":1325,"type":15},"Testing","testing","2026-07-12T07:46:37.277964",{"slug":1328,"name":1328,"fn":1329,"description":1330,"org":1331,"tags":1332,"stars":1343,"repoUrl":1344,"updatedAt":1345},"cloud-access-management","manage Elastic Cloud organization access","Manage Elastic Cloud organization access: invite users, assign roles to Serverless projects, and create or revoke Cloud API keys. Use when granting, modifying, or auditing user access.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1333,1336,1337,1340],{"name":1334,"slug":1335,"type":15},"Cloud","cloud",{"name":9,"slug":8,"type":15},{"name":1338,"slug":1339,"type":15},"Operations","operations",{"name":1341,"slug":1342,"type":15},"Permissions","permissions",531,"https:\u002F\u002Fgithub.com\u002Felastic\u002Fagent-skills","2026-07-12T07:46:44.946285",{"slug":1347,"name":1347,"fn":1348,"description":1349,"org":1350,"tags":1351,"stars":1343,"repoUrl":1344,"updatedAt":1357},"cloud-create-project","create Elastic Cloud Serverless projects","Creates Elastic Cloud Serverless projects (Elasticsearch, Observability, or Security) via the REST API, saves credentials to file, and bootstraps a scoped Elasticsearch API key. Use when creating a new serverless project, provisioning a search or observability environment, or spinning up a new Elastic Cloud project.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1352,1353,1356],{"name":1334,"slug":1335,"type":15},{"name":1354,"slug":1355,"type":15},"Deployment","deployment",{"name":1321,"slug":29,"type":15},"2026-07-12T07:46:42.353362",{"slug":1359,"name":1359,"fn":1360,"description":1361,"org":1362,"tags":1363,"stars":1343,"repoUrl":1344,"updatedAt":1367},"cloud-manage-project","manage Elastic Cloud Serverless projects","Manages existing Elastic Cloud Serverless projects: list, get, update, delete, reset credentials, resume, and load saved credentials. Connects to existing projects by resolving endpoints and acquiring scoped Elasticsearch API keys. Use when performing day-2 operations on serverless projects, connecting to an existing project, loading or resetting project credentials, or looking up project details.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1364,1365,1366],{"name":1334,"slug":1335,"type":15},{"name":1321,"slug":29,"type":15},{"name":1338,"slug":1339,"type":15},"2026-07-12T07:46:41.097412",{"slug":1369,"name":1369,"fn":1370,"description":1371,"org":1372,"tags":1373,"stars":1343,"repoUrl":1344,"updatedAt":1382},"cloud-network-security","manage Elastic Cloud network security","Manage Serverless network security (traffic filters): create, update, and delete IP filters and AWS PrivateLink VPC filters. Use when restricting network access or configuring private connectivity.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1374,1375,1376,1379],{"name":1334,"slug":1335,"type":15},{"name":1321,"slug":29,"type":15},{"name":1377,"slug":1378,"type":15},"Networking","networking",{"name":1380,"slug":1381,"type":15},"Security","security","2026-07-12T07:46:43.675992",{"slug":1384,"name":1384,"fn":1385,"description":1386,"org":1387,"tags":1388,"stars":1343,"repoUrl":1344,"updatedAt":1394},"cloud-setup","configure Elastic Cloud authentication","Configures Elastic Cloud authentication and environment defaults. Use when setting up EC_API_KEY, configuring Cloud API access, or when another cloud skill requires credentials.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1389,1392,1393],{"name":1390,"slug":1391,"type":15},"Authentication","authentication",{"name":1334,"slug":1335,"type":15},{"name":1321,"slug":29,"type":15},"2026-07-12T07:46:39.783105",{"slug":1396,"name":1396,"fn":1397,"description":1398,"org":1399,"tags":1400,"stars":1343,"repoUrl":1344,"updatedAt":1409},"elasticsearch-audit","configure Elasticsearch security audit logs","Enable, configure, and query Elasticsearch security audit logs. Use when the task involves audit logging setup, event filtering, or investigating security incidents like failed logins.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1401,1404,1405,1408],{"name":1402,"slug":1403,"type":15},"Audit","audit",{"name":1321,"slug":29,"type":15},{"name":1406,"slug":1407,"type":15},"Logs","logs",{"name":1380,"slug":1381,"type":15},"2026-07-12T07:47:35.092599",{"slug":1411,"name":1411,"fn":1412,"description":1413,"org":1414,"tags":1415,"stars":1343,"repoUrl":1344,"updatedAt":1420},"elasticsearch-authn","configure Elasticsearch authentication realms","Authenticate to Elasticsearch using native, file-based, LDAP\u002FAD, SAML, OIDC, Kerberos, JWT, or certificate realms. Use when connecting with credentials, choosing a realm, or managing API keys. Assumes the target realms are already configured.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1416,1417,1418,1419],{"name":1390,"slug":1391,"type":15},{"name":9,"slug":8,"type":15},{"name":1321,"slug":29,"type":15},{"name":1380,"slug":1381,"type":15},"2026-07-12T07:47:41.474547",{"slug":1422,"name":1422,"fn":1423,"description":1424,"org":1425,"tags":1426,"stars":1343,"repoUrl":1344,"updatedAt":1433},"elasticsearch-authz","manage Elasticsearch RBAC and security roles","Manage Elasticsearch RBAC: native users, roles, role mappings, document- and field-level security. Use when creating users or roles, assigning privileges, or mapping external realms like LDAP\u002FSAML.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1427,1428,1429,1432],{"name":9,"slug":8,"type":15},{"name":1321,"slug":29,"type":15},{"name":1430,"slug":1431,"type":15},"RBAC","rbac",{"name":1380,"slug":1381,"type":15},"2026-07-12T07:47:36.394177",{"slug":1435,"name":1435,"fn":1436,"description":1437,"org":1438,"tags":1439,"stars":1343,"repoUrl":1344,"updatedAt":1446},"elasticsearch-esql","query Elasticsearch data with ES|QL","Execute ES|QL (Elasticsearch Query Language) queries, use when the user wants to query Elasticsearch data, analyze logs, aggregate metrics, explore data, or create charts and dashboards from ES|QL results.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1440,1441,1442,1443],{"name":1297,"slug":1298,"type":15},{"name":1300,"slug":1301,"type":15},{"name":1321,"slug":29,"type":15},{"name":1444,"slug":1445,"type":15},"SQL","sql","2026-07-12T07:47:40.249533",86,{"items":1449,"total":1043},[1450,1457,1464],{"slug":1291,"name":1291,"fn":1292,"description":1293,"org":1451,"tags":1452,"stars":23,"repoUrl":24,"updatedAt":1306},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1453,1454,1455,1456],{"name":1297,"slug":1298,"type":15},{"name":1300,"slug":1301,"type":15},{"name":9,"slug":8,"type":15},{"name":1304,"slug":1305,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":1458,"tags":1459,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1460,1461,1462,1463],{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},{"name":13,"slug":14,"type":15},{"slug":1279,"name":1279,"fn":1315,"description":1316,"org":1465,"tags":1466,"stars":23,"repoUrl":24,"updatedAt":1326},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1467,1468,1469,1470],{"name":9,"slug":8,"type":15},{"name":1321,"slug":29,"type":15},{"name":1304,"slug":1305,"type":15},{"name":1324,"slug":1325,"type":15}]