Called with an invalid endpoint: sql.query

I'm trying to develop a kibana plugin (Elasticsearch & Kibana both Ver 7.4.1). In order to get started i have used the known plugin analyse_api as an example and starting point.

I'm trying to invoke the Elasticsearch API of sql query. i.e. sql.query. This requires that i pass the required SQL string along with a know format string. My string is very simple: "SELECT ObsDate from websphere". Format is json.

At this point i'm getting the error "called with an invalid endpoint: sql.query" shown above and must admit i'm completely at a loss as to why!

To get things started , i call the sqlquery method to perform the post operation from the browser to the kibana server. Code segments are shown below.

import chrome from 'ui/chrome';
let httpClient;
export const setHttpClient = client => {
httpClient = client;
};

export const getHttpClient = () => {
return httpClient;
};

const apiPrefix = chrome.addBasePath('/api/analyze_api_ui');
export async function sqlquery(params) {
console.log('httpClient:' + httpClient);

console.log('sqlquery : Params:Query: ' + params.query + ' JSON:' + JSON.stringify(params));
console.log('sqlquery addBasepath:' + apiPrefix + ' params:' + params);
const response = await httpClient.post(${apiPrefix}/sqlquery, params);
return response;
}

Eventually this gets routed to the following below:
let call = server.plugins.elasticsearch.getCluster('data').callWithRequest;

server.route({
path: '/api/analyze_api_ui/sqlquery',
method: 'POST',
options: {
validate: {
payload: Joi.object()
.keys({
query: Joi.string().required(),
})
.required(),
},
},
handler: async req => {
let param = {
body: {
format: 'json',
query: req.payload.query,
},
};

  try {
    console.log('Sql.query params:' + JSON.stringify(param));
    const response = await call(req, 'sql.query', param);

    console.log(
      'Sql.query response details:' + JSON.stringify(response.detail),
      ' Request:' + param.body
    );
    return {
      detail: response.detail,
      request: param.body,
    };
  } catch (error) {
    console.log('Sql.query Error result:' + convertEsError(param.index, error));
    return convertEsError(param.index, error);
  }

Error Trace:

In server route sqlquery:{"body":{"format":"json","query":"SELECT ObsDate FROM websphere"}}
Sql.query params:{"body":{"format":"json","query":"SELECT ObsDate FROM websphere"}}
callAPI:endpoint sql.query clientPath:sql,query api:undefined
Sql.query Error result:Error: called with an invalid endpoint: sql.query
server error [16:19:18.836] Error: called with an invalid endpoint: sql.query
at callAPI (/Users/pgervais/kibana/src/core/server/elasticsearch/cluster_client.ts:77:11)
at ScopedClusterClient.callAPI [as scopedAPICaller] (/Users/pgervais/kibana/src/core/server/elasticsearch/cluster_client.ts:222:18)
at ScopedClusterClient.scopedAPICaller (/Users/pgervais/kibana/src/core/server/elasticsearch/scoped_cluster_client.ts:93:17)
at callAsCurrentUser (/Users/pgervais/kibana/src/legacy/core_plugins/elasticsearch/lib/cluster.ts:37:8)
at call (/Users/pgervais/kibana/plugins/cbsa/server/routes/analyze.js:190:32)
at module.exports.internals.Manager.execute (/Users/pgervais/kibana/node_modules/hapi/lib/toolkit.js:35:106)
at Object.internals.handler (/Users/pgervais/kibana/node_modules/hapi/lib/handler.js:50:48)
at exports.execute (/Users/pgervais/kibana/node_modules/hapi/lib/handler.js:35:36)
at Request._lifecycle (/Users/pgervais/kibana/node_modules/hapi/lib/request.js:263:62)
at process._tickCallback (internal/process/next_tick.js:68:7)

I have tried a number of obvious changes:

  1. tried all permutations of params format all to no avail.
  2. Have added debug statements wherever i can.
  3. I have put console printouts in callAPI.

callAPI:endpoint sql.query clientPath:sql,query api:undefined
Note that the endpoint has sql.query whereas the clientPath has sql,query ? A comma separator. It's in callAPI where the error message is generated portions of the vcode shown below.

async function callAPI(
client: Client,
endpoint: string,
clientParams: Record<string, any> = {},
options: CallAPIOptions = { wrap401Errors: true }
): Promise {
const clientPath = endpoint.split('.');
const api: any = get(client, clientPath);
if (!api) {
console.log('callAPI:endpoint' + endpoint + ' clientPath:' + clientPath + ' api:' + api);
throw new Error(called with an invalid endpoint: ${endpoint});
}

Any help from kibana plugin gurus would be highly appreciated.

Hi
Could you try using

xpack.sql.query

thx,
Matthias