{"id":16003480,"url":"https://github.com/nhatthm/concourse-kangal","last_synced_at":"2025-10-28T08:08:58.595Z","repository":{"id":56158313,"uuid":"307395860","full_name":"nhatthm/concourse-kangal","owner":"nhatthm","description":"Kangal resource for Concourse","archived":false,"fork":false,"pushed_at":"2020-11-30T13:31:26.000Z","size":45,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-28T08:51:23.207Z","etag":null,"topics":["concourse","concourse-ci","concourse-resource","kangal"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nhatthm.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-10-26T14:16:08.000Z","updated_at":"2022-08-09T14:04:32.000Z","dependencies_parsed_at":"2022-08-15T13:50:26.864Z","dependency_job_id":null,"html_url":"https://github.com/nhatthm/concourse-kangal","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nhatthm%2Fconcourse-kangal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nhatthm%2Fconcourse-kangal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nhatthm%2Fconcourse-kangal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nhatthm%2Fconcourse-kangal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nhatthm","download_url":"https://codeload.github.com/nhatthm/concourse-kangal/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248955437,"owners_count":21189102,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["concourse","concourse-ci","concourse-resource","kangal"],"created_at":"2024-10-08T10:20:56.659Z","updated_at":"2025-10-28T08:08:53.561Z","avatar_url":"https://github.com/nhatthm.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Kangal Resource for Concourse\n\nRun [Kangal](https://github.com/hellofresh/kangal) with [Concourse](https://github.com/concourse/concourse)\n\n## Source Configuration\n\n* `proxy_host`: *Optional.* The hostname of kangal proxy.\n* `phase`: *Optional.* Phase to be filtered while checking resource.\n* `tags`: *Optional.* List of tags in `yaml` format.\n\nFor example\n```yaml\nresources:\n- name: my-load-tests\n  type: kangal\n  icon: nuke\n  source:\n    proxy_host: kangal-proxy.tld\n    tags:\n      team: platform\n      department: tech\n      plan: user-registration\n```\n\n## Behavior\n\n### `check`: Check for load tests\n\nReturn list of load tests from http://kangal-proxy.tld/load-test API and filter by `source.phase` and `source.tags`.\n\n### `in`: Get load test\n\nReturn the chosen load test data from http://kangal-proxy.tld/load-test/{load-test-name} API.\n\n#### Parameters\n\n* `report`: Set to `true` to generate `report.json` file and export the report to env vars.\n\n#### Environment Variables\n\nThe `env` file will be generated with these variables\n\n```bash\nexport LOAD_TEST_NAME=loadtest-running-orangutan\nexport LOAD_TEST_TYPE=JMeter\nexport LOAD_TEST_DISTRIBUTED_PODS=6\nexport LOAD_TEST_PHASE=finished\nexport LOAD_TEST_TAGS=plan:user-registration,team:platform,department:tech\nexport LOAD_TEST_TIMESTAMP=1604054807914\nexport LOAD_TEST_TIMESTAMP_60MIN_BEFORE=1604051207914\nexport LOAD_TEST_TIMESTAMP_45MIN_BEFORE=1604052107914\nexport LOAD_TEST_TIMESTAMP_30MIN_BEFORE=1604053007914\nexport LOAD_TEST_TIMESTAMP_15MIN_BEFORE=1604053907914\nexport LOAD_TEST_TIMESTAMP_15MIN_AFTER=1604055707914\nexport LOAD_TEST_TIMESTAMP_30MIN_AFTER=1604056607914\nexport LOAD_TEST_TIMESTAMP_45MIN_AFTER=1604057507914\nexport LOAD_TEST_TIMESTAMP_60MIN_AFTER=1604058407914\nexport LOAD_TEST_DATE_60MIN_BEFORE=2020-10-30T09:46:47Z\nexport LOAD_TEST_DATE_45MIN_BEFORE=2020-10-30T10:01:47Z\nexport LOAD_TEST_DATE_30MIN_BEFORE=2020-10-30T10:16:47Z\nexport LOAD_TEST_DATE_15MIN_BEFORE=2020-10-30T10:31:47Z\nexport LOAD_TEST_DATE_15MIN_AFTER=2020-10-30T11:01:47Z\nexport LOAD_TEST_DATE_30MIN_AFTER=2020-10-30T11:16:47Z\nexport LOAD_TEST_DATE_45MIN_AFTER=2020-10-30T11:31:47Z\nexport LOAD_TEST_DATE_60MIN_AFTER=2020-10-30T11:46:47Z\nexport LOAD_TEST_DATE_MS_60MIN_BEFORE=2020-10-30T09:46:47.000Z\nexport LOAD_TEST_DATE_MS_45MIN_BEFORE=2020-10-30T10:01:47.000Z\nexport LOAD_TEST_DATE_MS_30MIN_BEFORE=2020-10-30T10:16:47.000Z\nexport LOAD_TEST_DATE_MS_15MIN_BEFORE=2020-10-30T10:31:47.000Z\nexport LOAD_TEST_DATE_MS_15MIN_AFTER=2020-10-30T11:01:47.000Z\nexport LOAD_TEST_DATE_MS_30MIN_AFTER=2020-10-30T11:16:47.000Z\nexport LOAD_TEST_DATE_MS_45MIN_AFTER=2020-10-30T11:31:47.000Z\nexport LOAD_TEST_DATE_MS_60MIN_AFTER=2020-10-30T11:46:47.000Z\n```\n\n\u003cdetails\u003e\n  \u003csummary\u003eIf you set report to true, these env vars below will be added.\u003c/summary\u003e\n\n```bash\nexport LOAD_TEST_REPORT_APDEX_OVERALL_APDEX=0.5\nexport LOAD_TEST_REPORT_APDEX_OVERALL_TOLERATION_THRESHOLD=200\nexport LOAD_TEST_REPORT_APDEX_OVERALL_FRUSTRATION_THRESHOLD=500\nexport LOAD_TEST_REPORT_APDEX_OVERALL_LABEL=Total\nexport LOAD_TEST_REPORT_APDEX_ITEMS_0_APDEX=0.5\nexport LOAD_TEST_REPORT_APDEX_ITEMS_0_TOLERATION_THRESHOLD=200\nexport LOAD_TEST_REPORT_APDEX_ITEMS_0_FRUSTRATION_THRESHOLD=500\nexport LOAD_TEST_REPORT_APDEX_ITEMS_0_LABEL=/register\nexport LOAD_TEST_REPORT_STATISTICS_OVERALL_LABEL=Total\nexport LOAD_TEST_REPORT_STATISTICS_OVERALL_NUM_SAMPLES=160780\nexport LOAD_TEST_REPORT_STATISTICS_OVERALL_KO=11\nexport LOAD_TEST_REPORT_STATISTICS_OVERALL_ERROR_RATE=0.01\nexport LOAD_TEST_REPORT_STATISTICS_OVERALL_AVERAGE=2105.69\nexport LOAD_TEST_REPORT_STATISTICS_OVERALL_MIN=5\nexport LOAD_TEST_REPORT_STATISTICS_OVERALL_MAX=64165\nexport LOAD_TEST_REPORT_STATISTICS_OVERALL_90TH_PERCENTILE=4186.9\nexport LOAD_TEST_REPORT_STATISTICS_OVERALL_95TH_PERCENTILE=7783.85\nexport LOAD_TEST_REPORT_STATISTICS_OVERALL_99TH_PERCENTILE=12995.98\nexport LOAD_TEST_REPORT_STATISTICS_OVERALL_THROUGHPUT=476.55\nexport LOAD_TEST_REPORT_STATISTICS_OVERALL_RECEIVED=201.65\nexport LOAD_TEST_REPORT_STATISTICS_OVERALL_SENT=104.92\nexport LOAD_TEST_REPORT_STATISTICS_ITEMS_0_LABEL=/register\nexport LOAD_TEST_REPORT_STATISTICS_ITEMS_0_NUM_SAMPLES=160780\nexport LOAD_TEST_REPORT_STATISTICS_ITEMS_0_KO=11\nexport LOAD_TEST_REPORT_STATISTICS_ITEMS_0_ERROR_RATE=0.01\nexport LOAD_TEST_REPORT_STATISTICS_ITEMS_0_AVERAGE=2105.69\nexport LOAD_TEST_REPORT_STATISTICS_ITEMS_0_MIN=5\nexport LOAD_TEST_REPORT_STATISTICS_ITEMS_0_MAX=64165\nexport LOAD_TEST_REPORT_STATISTICS_ITEMS_0_90TH_PERCENTILE=4186.9\nexport LOAD_TEST_REPORT_STATISTICS_ITEMS_0_95TH_PERCENTILE=7783.85\nexport LOAD_TEST_REPORT_STATISTICS_ITEMS_0_99TH_PERCENTILE=12995.98\nexport LOAD_TEST_REPORT_STATISTICS_ITEMS_0_THROUGHPUT=476.55\nexport LOAD_TEST_REPORT_STATISTICS_ITEMS_0_RECEIVED=201.65\nexport LOAD_TEST_REPORT_STATISTICS_ITEMS_0_SENT=104.92\nexport LOAD_TEST_REPORT_ERRORS_ITEMS_0_ERROR_TYPE=connect timed out\nexport LOAD_TEST_REPORT_ERRORS_ITEMS_0_NUM_ERRORS=2\nexport LOAD_TEST_REPORT_ERRORS_ITEMS_0_PERCENT_IN_ERRORS=18.18\nexport LOAD_TEST_REPORT_ERRORS_ITEMS_0_PERCENT_IN_SAMPLES=0\nexport LOAD_TEST_REPORT_ERRORS_ITEMS_1_ERROR_TYPE=504/GATEWAY_TIMEOUT\nexport LOAD_TEST_REPORT_ERRORS_ITEMS_1_NUM_ERRORS=4\nexport LOAD_TEST_REPORT_ERRORS_ITEMS_1_PERCENT_IN_ERRORS=36.36\nexport LOAD_TEST_REPORT_ERRORS_ITEMS_1_PERCENT_IN_SAMPLES=0\nexport LOAD_TEST_REPORT_ERRORS_ITEMS_2_ERROR_TYPE=Non HTTP response code: java.net.SocketTimeoutException/Non HTTP response message: Read timed out\nexport LOAD_TEST_REPORT_ERRORS_ITEMS_2_NUM_ERRORS=5\nexport LOAD_TEST_REPORT_ERRORS_ITEMS_2_PERCENT_IN_ERRORS=45.45\nexport LOAD_TEST_REPORT_ERRORS_ITEMS_2_PERCENT_IN_SAMPLES=0\n```\n\u003c/details\u003e\n\n#### Report\n\n\u003cdetails\u003e\n  \u003csummary\u003eClick to view example\u003c/summary\u003e\n\n```json\n{\n  \"apdex\": {\n    \"overall\": {\n      \"apdex\": \"0.5022484139818385\",\n      \"toleration_threshold\": \"200\",\n      \"frustration_threshold\": \"500\",\n      \"label\": \"Total\"\n    },\n    \"items\": [\n      {\n        \"apdex\": \"0.5022484139818385\",\n        \"toleration_threshold\": \"200\",\n        \"frustration_threshold\": \"500\",\n        \"label\": \"/register\"\n      }\n    ]\n  },\n  \"statistics\": {\n    \"overall\": {\n      \"label\": \"Total\",\n      \"num_samples\": \"160780\",\n      \"ko\": \"11\",\n      \"error_rate\": \"0.006841646971016296\",\n      \"average\": \"2105.686049259857\",\n      \"min\": \"5\",\n      \"max\": \"64165\",\n      \"90th_percentile\": \"4186.9000000000015\",\n      \"95th_percentile\": \"7783.850000000002\",\n      \"99th_percentile\": \"12995.980000000003\",\n      \"throughput\": \"476.55180181515317\",\n      \"received\": \"201.64581964027423\",\n      \"sent\": \"104.91854895285611\"\n    },\n    \"items\": [\n      {\n        \"label\": \"/register\",\n        \"num_samples\": \"160780\",\n        \"ko\": \"11\",\n        \"error_rate\": \"0.006841646971016296\",\n        \"average\": \"2105.686049259857\",\n        \"min\": \"5\",\n        \"max\": \"64165\",\n        \"90th_percentile\": \"4186.9000000000015\",\n        \"95th_percentile\": \"7783.850000000002\",\n        \"99th_percentile\": \"12995.980000000003\",\n        \"throughput\": \"476.55180181515317\",\n        \"received\": \"201.64581964027423\",\n        \"sent\": \"104.91854895285611\"\n      }\n    ]\n  },\n  \"errors\": {\n    \"overall\": null,\n    \"items\": [\n      {\n        \"error_type\": \"connect timed out\",\n        \"num_errors\": \"2\",\n        \"percent_in_errors\": \"18.181818181818183\",\n        \"percent_in_samples\": \"0.0012439358129120537\"\n      },\n      {\n        \"error_type\": \"504/GATEWAY_TIMEOUT\",\n        \"num_errors\": \"4\",\n        \"percent_in_errors\": \"36.36363636363637\",\n        \"percent_in_samples\": \"0.0024878716258241074\"\n      },\n      {\n        \"error_type\": \"Non HTTP response code: java.net.SocketTimeoutException/Non HTTP response message: Read timed out\",\n        \"num_errors\": \"5\",\n        \"percent_in_errors\": \"45.45454545454545\",\n        \"percent_in_samples\": \"0.0031098395322801346\"\n      }\n    ]\n  }\n}\n```\n\u003c/details\u003e\n\n### `out`: Run a new load test\n\n#### Parameters\n\n* `plan`: The path to load test file.\n* `data`: The path to load test data.\n* `pods`: Number of distributed pods for the load test.\n* `overwrite`: Overwrite the load test if exists. Possible values: `true` or `false`\n* `type`: Load test type.\n\n###### Optional\n* `vars`: The path to environment variables file.\n\nThose parameters will be used to create load test with this API call.\n\nThe load test will be tagged with `tags` in `source` configuration plus current timestamp in nanoseconds (in order to sort the versions).\n\n```shell\ncurl -X POST http://${KANGAL_PROXY_ADDRESS}/load-test \\\n  -H 'Content-Type: multipart/form-data' \\\n  -F distributedPods=${pods} \\\n  -F testFile=@${plan} \\\n  -F testData=@${data} \\\n  -F tags=${tags} \\\n  -F type=${type} \\\n  -F overwrite=${overwrite} \\\n  -F envVars=@${vars}\n```\n\n## Usage\n\nExample:\n\n```yaml\nresource_types:\n- name: kangal\n  type: docker-image\n  source:\n    repository: nhatthm/concourse-kangal\n    tag: latest\n\nresources:\n- name: my-load-tests\n  type: kangal\n  icon: nuke\n  source:\n    tags:\n      team: platform\n      department: tech\n      plan: user-registration\n\ngroups:\n- name: load-tests\n  jobs:\n  - my-load-tests\n\njobs:\n- name: my-load-tests\n  public: false\n  serial: true\n  plan:\n    # Prepare testplan.jmx and testdata.csv\n    #\n    # For example:\n    #   Output of these tasks is load-tests/testplan.jmx and load-tests/testdata.csv\n    #\n    # - in_parallel:\n    #   - get: source-code\n    #     attempts: ((default_attempts))\n    #     timeout: ((default_timeout))\n    #     resource: master-source-code\n    #\n    #   - get: every-4am\n    #     timeout: ((default_timeout))\n    #     trigger: true\n    #\n    # - task: prepare\n    #   timeout: ((default_timeout))\n    #   file: source-code/ci/tasks/prepare-load-tests.yml\n    #   params:\n    #     ENV: live\n    #     LOAD_TEST_FILE: testplan.template.jmx\n\n    - put: run\n      resource: my-load-tests\n      params:\n        plan: load-tests/testplan.jmx\n        data: load-tests/testdata.csv\n        vars: load-tests/envVars.csv\n        pods: \"9\"\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnhatthm%2Fconcourse-kangal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnhatthm%2Fconcourse-kangal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnhatthm%2Fconcourse-kangal/lists"}