#node.js #google-api #google-api-client #beta #google-cloud-tasks
#node.js #google-api #google-api-клиент #бета #google-cloud-задачи
Вопрос:
Я хочу получить поле статистики для очереди в Google cloud tasks, используя клиентскую библиотеку nodejs @google-cloud/tasks
. Поле статистики существует только в v2beta3
версии, однако для его получения нам нужно передать параметры запроса readMask=*
, но я не знаю, как передать его с помощью клиентской библиотеки. Я пытался использовать otherArgs
параметры, но это не работает.
const tasks = require('@google-cloud/tasks');
const client = new tasks.v2beta3.GoogleCloudTasks()
// Get queue containing stats
const queue = await client.getQueue({name: '..'}, {otherArgs: {readMask: '*'}})
Ответ №1:
Маска чтения указывает, какие пути объекта ответа извлекать. Ответ будет включать все возможные пути с заполнителями, такими как null, UNSPECIFIED и т. Д., А Затем содержать фактические значения, которые вы хотите.
const request = {
...
readMask: { paths: ['name', 'stats', 'state', ...] }
};
getQueue
const { v2beta3 } = require('@google-cloud/tasks');
const tasksClient = new v2beta3.CloudTasksClient();
async function main() {
const request = {
name: 'projects/PROJECT/locations/LOCATION/queues/QUEUE',
readMask: { paths: ['name', 'stats'] }
};
const [response] = await tasksClient.getQueue(request);
console.log(response);
}
main();
/*
{
name: 'projects/PROJECT/locations/LOCATION/queues/QUEUE',
...
stats: {
tasksCount: '113',
oldestEstimatedArrivalTime: null,
executedLastMinuteCount: '0',
concurrentDispatchesCount: '0',
effectiveExecutionRate: 500
}
}
*/
Список запросов
const { v2beta3 } = require('@google-cloud/tasks');
const tasksClient = new v2beta3.CloudTasksClient();
async function main() {
const request = {
parent: 'projects/PROJECT/locations/LOCATION',
readMask: { paths: ['name', 'stats'] }
};
const [response] = await tasksClient.listQueues(request);
console.log(response);
}
main();
/*
[
{
name: 'projects/PROJECT/locations/LOCATION/queues/QUEUE',
...
stats: {
tasksCount: '1771',
oldestEstimatedArrivalTime: [Object],
executedLastMinuteCount: '0',
concurrentDispatchesCount: '0',
effectiveExecutionRate: 500
}
},
...
]
*/
Ответ №2:
Взглянув на исходный код клиентской библиотеки, я не вижу ссылки на параметр readMask, указанный в версии v2beta3 REST API projects.locations.метод queues.get.
Соответствующий метод в клиентской библиотеке NodeJS getQueue() ожидает тип запроса IGetQueueRequest, который не имеет readMask
параметра и ожидает только name
свойство.
Тем не менее, эта реализация может измениться в будущем, чтобы включить соответствующий метод для получения статистики.
Что касается самого REST API, в общедоступных документах в разделе readMask есть ошибка, поскольку * не является допустимым символом. Если вы хотите получить поле Queue.stats, вы должны просто ввести stats
параметр readMask. Если вы хотите получить все соответствующие поля, вы должны ввести их все (например name,rateLimits,retryConfig,state,taskTtl,tombstoneTtl,type,stats
, должны получить все соответствующие поля, которые вы получаете при вызове метода поле Queue.stats).
Следующая картинка должна вам помочь.
В качестве обходного пути, если вы нажмете на символ расширения в разделе «Попробуйте этот API» документации для соответствующего метода, вы можете нажать на раздел JAVASCRIPT и получить соответствующий код для построения запроса, как показано на следующем рисунке.
РЕДАКТИРОВАТЬ 23 ЯНВАРЯ 2020 года
Документация была исправлена, чтобы сообщить об этом, чтобы выразить это:
[Queue.stats] будет возвращен, только если он был явно указан в маске.
Что означает, что простая запись stats
в поле readMask вернет статистику.
Комментарии:
1. Это позор. Для предлагаемого вами кода требуется ключ API и идентификатор клиента, который является дополнительной конфигурацией.
2. ДА. Вы правы! Преимущество клиентских библиотек в том, что они обрабатывают аутентификацию и авторизацию под капотом с помощью переменных среды, но я не вижу никаких других возможностей с использованием JS. Вы можете получить поле Queue.stats, используя клиентскую библиотеку Python. Я могу опубликовать некоторый код для этого, если вы сочтете его полезным.