Skip to content

Benchmark: worldcereal_crop_extent #652

Description

@github-actions

Benchmark scenario ID: worldcereal_crop_extent
Benchmark scenario definition: https://github.com/ESA-APEx/apex_algorithms/blob/99e2ddec7101e2bbeabc192985a4f017f4ec5faf/algorithm_catalog/vito/worldcereal_crop_extent/benchmark_scenarios/worldcereal_crop_extent.json
openEO backend: openeofed.dataspace.copernicus.eu

GitHub Actions workflow run: https://github.com/ESA-APEx/apex_algorithms/actions/runs/32142313136
Workflow artifacts: https://github.com/ESA-APEx/apex_algorithms/actions/runs/32142313136#artifacts

Test start: 2026-08-18 13:26:32.892970+00:00
Test duration: 0:02:38.219253
Test outcome: ❌ failed

Last successful test phase: create-job
Failure in test phase: run-job

Contact Information

Name Organization Contact
Kristof Van Tricht VITO Contact via VITO (VITO Website, GitHub)

Process Graph

{
  "worldcerealcropextent1": {
    "process_id": "worldcereal_crop_extent",
    "namespace": "https://raw.githubusercontent.com/WorldCereal/worldcereal-classification/refs/tags/worldcereal_crop_extent_v3.0.1/scripts/udp/worldcereal_crop_extent.json",
    "arguments": {
      "spatial_extent": {
        "west": 664200,
        "east": 664400,
        "south": 5611334,
        "north": 5611534,
        "crs": "EPSG:32631",
        "srs": "EPSG:32631"
      },
      "temporal_extent": [
        "2020-11-01",
        "2021-10-31"
      ],
      "orbit_state": "DESCENDING",
      "season_ids": [
        "tc-s1"
      ],
      "season_windows": {
        "tc-s1": [
          "2020-12-01",
          "2021-07-31"
        ]
      }
    },
    "result": true
  }
}

Error Logs

scenario = openEOBenchmarkScenario(id='worldcereal_crop_extent', type='openeo', description='WorldCereal crop extent benchmark', ...season_ids': ['tc-s1'], 'season_windows': {'tc-s1': ['2020-12-01', '2021-07-31']}}, 'result': True}}, job_options=None)
tmp_path = PosixPath('/home/runner/work/apex_algorithms/apex_algorithms/qa/benchmarks/tmp_path_root/test_run_benchmark_worldcereal0')
track_metric = <function track_metric.<locals>.track at 0x7f5655b1dbc0>
track_phase = <apex_algorithm_qa_tools.pytest.pytest_track_metrics._PhaseTracker object at 0x7f5655b2ab10>
upload_assets_on_fail = <apex_algorithm_qa_tools.pytest.pytest_upload_assets.upload_assets_on_fail.<locals>._Collector object at 0x7f5655b2a240>
request = <FixtureRequest for <Function test_run_benchmark[worldcereal_crop_extent]>>

    @pytest.mark.parametrize(
        "scenario",
        [
            # Use scenario id as parameterization id to give nicer test names.
            pytest.param(uc, id=uc.id)
            for uc in get_benchmark_scenarios()
        ],
    )
    def test_run_benchmark(
        scenario: BenchmarkScenario,
        tmp_path: Path,
        track_metric,
        track_phase,
        upload_assets_on_fail,
        request,
    ):
        track_metric("scenario_id", scenario.id)
        track_metric("scenario_type", scenario.type)

        with track_phase(phase="connect"):
            runner = create_benchmark_runner(
                request=request,
                scenario=scenario,
            )

        report_path = None
        if request.config.getoption("--upload-benchmark-report"):
            report_data = {
                "scenario_id": scenario.id,
                "scenario_type": scenario.type,
                "scenario_description": scenario.description,
                "scenario_source": str(scenario.source) if scenario.source else None,
                "reference_data": scenario.reference_data,
                "reference_options": scenario.reference_options,
            }
            # Add scenario type-specific fields if they exist
            if hasattr(scenario, 'backend'):
                report_data["scenario_backend"] = scenario.backend
            if hasattr(scenario, 'process_id'):
                report_data["process_id"] = scenario.process_id
            elif hasattr(scenario, 'application'):
                report_data["application"] = scenario.application
            if hasattr(scenario, 'endpoint'):
                report_data["endpoint"] = scenario.endpoint

            report_path = tmp_path / "benchmark_report.json"
            report_path.write_text(json.dumps(report_data, indent=2))
            upload_assets_on_fail(report_path)

        def _on_phase_exception(phase: str, exc: Exception):
            if report_path is not None:
                report = json.loads(report_path.read_text())
                report["test_failed"] = True
                report["test_failed_phase"] = phase
                report["test_error_message"] = str(exc)
                report_path.write_text(json.dumps(report, indent=2))
                cwd_report_dir = Path("benchmark_reports")
                cwd_report_dir.mkdir(exist_ok=True)
                (cwd_report_dir / f"{scenario.id}_benchmark_report.json").write_text(json.dumps(report, indent=2))
                report_url = upload_assets_on_fail.get_url(report_path)
                if report_url:
                    exc.add_note(f"Benchmark report: {report_url}")

        track_phase.on_exception = _on_phase_exception

        artifacts = None

        with track_phase(phase="create-job"):
            runner.create_job()

        with track_phase(phase="run-job"):
            max_minutes = request.config.getoption("--maximum-job-time-in-minutes")
>           runner.run_job(max_minutes=max_minutes)

tests/test_benchmarks.py:98:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/apex_algorithm_qa_tools/benchmarks/runners/openeo.py:44: in run_job
    run_openeo_job(job=self._job, max_minutes=max_minutes)
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/apex_algorithm_qa_tools/benchmarks/openeo.py:115: in run_openeo_job
    job.start_and_wait()
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/openeo/rest/job.py:349: in start_and_wait
    job_info = self.describe()
               ^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/openeo/rest/job.py:106: in describe
    return self.connection.get(f"/jobs/{self.job_id}", expected_status=200).json()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/openeo/rest/_connection.py:204: in get
    return self.request("get", path=path, params=params, stream=stream, auth=auth, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/openeo/rest/connection.py:787: in request
    return _request()
           ^^^^^^^^^^
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/openeo/rest/connection.py:780: in _request
    return super(Connection, self).request(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/openeo/rest/_connection.py:141: in request
    self._raise_api_error(resp)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <Connection to 'https://openeofed.dataspace.copernicus.eu/openeo/1.2/' with OidcBearerAuth>
response = <Response [500]>

    def _raise_api_error(self, response: requests.Response):
        """Convert API error response to Python exception"""
        status_code = response.status_code
        try:
            info = response.json()
        except Exception:
            info = None

        # Valid JSON object with "code" and "message" fields indicates a proper openEO API error.
        if isinstance(info, dict):
            error_code = info.get("code")
            error_message = info.get("message")
            if error_code and isinstance(error_code, str) and error_message and isinstance(error_message, str):
>               raise OpenEoApiError(
                    http_status_code=status_code,
                    code=error_code,
                    message=error_message,
                    id=info.get("id"),
                    url=info.get("url"),
                )
E               openeo.rest.OpenEoApiError: [500] Internal: Server error: OpenEoApiPlainError('[502] Bad Gateway') (ref: r-26081813291046e2a3ff77dce056a504)

/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/openeo/rest/_connection.py:163: OpenEoApiError
----------------------------- Captured stdout call -----------------------------
0:00:00 Job 'cdse-j-260818132652480e991c3a4658db6e28': send 'start'
0:00:04 Job 'cdse-j-260818132652480e991c3a4658db6e28': queued (progress 0%)
0:00:09 Job 'cdse-j-260818132652480e991c3a4658db6e28': queued (progress 0%)
0:00:16 Job 'cdse-j-260818132652480e991c3a4658db6e28': queued (progress 0%)
0:00:24 Job 'cdse-j-260818132652480e991c3a4658db6e28': queued (progress 0%)
0:00:34 Job 'cdse-j-260818132652480e991c3a4658db6e28': queued (progress 0%)
0:00:46 Job 'cdse-j-260818132652480e991c3a4658db6e28': queued (progress 0%)
0:01:02 Job 'cdse-j-260818132652480e991c3a4658db6e28': queued (progress 0%)
0:01:22 Job 'cdse-j-260818132652480e991c3a4658db6e28': running (progress N/A)
0:01:46 Job 'cdse-j-260818132652480e991c3a4658db6e28': running (progress N/A)
------------------------------ Captured log call -------------------------------
INFO     apex_algorithm_qa_tools.benchmarks.openeo:openeo.py:70 Connecting to 'openeofed.dataspace.copernicus.eu'
INFO     openeo.config:config.py:193 Loaded openEO client config from sources: []
INFO     apex_algorithm_qa_tools.benchmarks.openeo:openeo.py:82 Checking for auth_env_var='OPENEO_AUTH_CLIENT_CREDENTIALS_CDSE' to drive auth against backend='openeofed.dataspace.copernicus.eu'.
INFO     apex_algorithm_qa_tools.benchmarks.openeo:openeo.py:86 Extracted provider_id='CDSE' client_id='openeo-apex-benchmarks-service-account' from auth_env_var='OPENEO_AUTH_CLIENT_CREDENTIALS_CDSE'
INFO     openeo.rest.connection:connection.py:315 Found OIDC providers: ['CDSE']
INFO     openeo.rest.auth.oidc:oidc.py:410 Doing 'client_credentials' token request 'https://identity.dataspace.copernicus.eu/auth/realms/CDSE/protocol/openid-connect/token' with post data fields ['grant_type', 'client_id', 'client_secret', 'scope'] (client_id 'openeo-apex-benchmarks-service-account')
INFO     openeo.rest.connection:connection.py:414 Obtained tokens: ['token_type', 'access_token', 'expires_in', 'id_token', 'scope']

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions