pentaho/pentaho-kettle · error · ServletException

Unable to get the server status in XML format

Error message

Unable to get the server status in XML format

What it means

GetStatusServlet.doGet wraps a KettleException from serverStatus.getXML() in a ServletException with this message when the slave server status document cannot be serialized. It surfaces as HTTP 500 to XML-mode status pollers.

Solutions

  1. Check the server log for the wrapped KettleException cause and fix the underlying failing transformation/job status.
  2. Retry /kettle/status/ once the problematic transformation/job completes or is removed.
  3. Exclude/stop the failing job/transformation on the slave before polling status.
  4. Increase heap if the failure is memory-related during XML assembly.

Example fix

// before
String status = httpGet("http://slave:8084/kettle/status/?xml=Y");
// after
Response resp = httpGet("http://slave:8084/kettle/status/?xml=Y");
if (resp.code() == 500) { checkSlaveLogs(); retryAfterJobsSettle(); }
Defensive patterns

Strategy: try-catch

Try / catch

try {
  String statusXml = httpGet("http://slave:8084/kettle/status/?xml=Y");
} catch (HttpServerErrorException e) {
  log.error("slave status XML failed: {}", e.getResponseBodyAsString());
  // fall back to non-XML status page for diagnostics
  String html = httpGet("http://slave:8084/kettle/status/");
}

Prevention

When it happens

Trigger: GET /kettle/status/?xml=Y when ServerStatus.getXML() throws — typically while serializing per-transformation/per-job statuses whose individual metrics or log data fail to render.

Common situations: Carte slave status polling by a master in a clustered run; a monitored transformation/job on the slave is in a broken state; memory pressure during status XML assembly.

Understand the failure class

Background: "API error: {status}" and "HTTP 401/403/404/429/5xx" errors: non-2xx HTTP responses explained — this error's family across 27 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/8c56e0df82dc429c. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/www/GetStatusServlet.java:239

          sstatus.setPaused( trans.isPaused() );
          serverStatus.getTransStatusList().add( sstatus );
        }
      }

      for ( CarteObjectEntry entry : jobEntries ) {
        Job job = getJobMap().getJob( entry );
        if ( job != null ) {
          String status = job.getStatus();
          SlaveServerJobStatus jobStatus = new SlaveServerJobStatus( entry.getName(), entry.getId(), status );
          jobStatus.setLogDate( job.getLogDate() );
          serverStatus.getJobStatusList().add( jobStatus );
        }
      }

      try {
        out.println( serverStatus.getXML() );
      } catch ( KettleException e ) {
        throw new ServletException( "Unable to get the server status in XML format", e );
      }
    } else {
      out.println( "<HTML>" );
      out.println( "<HEAD><TITLE>"
        + BaseMessages.getString( PKG, "GetStatusServlet.KettleSlaveServerStatus" ) + "</TITLE>" );
      out.println( "<META http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">" );

      int tableBorder = 1;
      if ( !useLightTheme ) {
        if ( isJettyMode() ) {
          out.println( "<link rel=\"stylesheet\" type=\"text/css\" href=\"/static/css/carte.css\" />" );
        } else {
          out.print( StatusServletUtils.getPentahoStyles( request.getSession().getServletContext(),  root ) );
          out.println( "<style>" );
          out.println(
            ".pentaho-table td, tr.cellTableRow, td.gwt-MenuItem, .toolbar-button:not(.toolbar-button-disabled) {" );
          out.println( "  cursor: pointer;" );
          out.println( "}" );

View on GitHub (pinned to f3058517a1)