← Аналитика / analytics / analytics-engine
Запрос из Worker
Если вы хотите обращаться к данным Analytics Engine прямо из Worker, можно использовать fetch для доступа к SQL API. API может возвращать данные в формате JSON, с которыми удобно работать в JavaScript.
Аутентификация
Чтобы ваш Worker мог пройти аутентификацию в API, вам потребуются ID аккаунта и API-токен.
- Свой 32-значный ID аккаунта можно найти в дашборде Cloudflare.
- API-токен также можно создать в дашборде. Подробнее см. в Документация SQL API , где приведены дополнительные сведения об этом.
Мы рекомендуем хранить ID аккаунта в переменной окружения, а API-токен в качестве секрета (secret) в своём воркере. Это можно сделать через дашборд или через Wrangler. См. Документация Workers , где приведены дополнительные сведения об этом.
Запрос
Используйте JavaScript fetch API следующим образом, чтобы выполнить запрос:
const query = "SELECT * FROM my_dataset";
const API = `https://api.cloudflare.com/client/v4/accounts/${env.ACCOUNT_ID}/analytics_engine/sql`;
const response = await fetch(API, {
method: "POST",
headers: {
Authorization: `Bearer ${env.API_TOKEN}`,
},
body: query,
});
const responseJSON = await response.json();Данные будут возвращены в формате, описанном в FORMAT раздел документации, который позволяет получать метаинформацию об именах и типах возвращаемых столбцов, помимо самих данных и количества строк.
Пример Worker
Ниже приведён пример Worker, который выполняет запрос к набору данных с показаниями погоды и выводит минимальные и максимальные значения для каждого города.
Настройка переменных окружения
Сначала настраиваются переменные окружения: в них указываются ID аккаунта и API-токен.
ID аккаунта задаётся в конфигурационный файл Wrangler:
{
"vars": {
"ACCOUNT_ID": "<account_id>"
}
}[vars]
ACCOUNT_ID = "<account_id>"Переменную API_TOKEN можно задать в качестве секрета (secret) с помощью инструмента командной строки wrangler. Выполните следующую команду и введите строку своего токена:
npx wrangler secret put API_TOKENСкрипт Worker
Сам скрипт воркера выполняет запрос и форматирует результат:
export default {
async fetch(request, env) {
// This worker only responds to requests at the root.
if (new URL(request.url).pathname != "/") {
return new Response("Not found", { status: 404 });
}
// SQL string to be executed.
const query = `
SELECT
blob1 AS city,
max(double1) as max_temp,
min(double1) as min_temp
FROM weather
WHERE timestamp > NOW() - INTERVAL '1' DAY
GROUP BY city
ORDER BY city`;
// Build the API endpoint URL and make a POST request with the query string
const API = `https://api.cloudflare.com/client/v4/accounts/${env.ACCOUNT_ID}/analytics_engine/sql`;
const queryResponse = await fetch(API, {
method: "POST",
headers: {
Authorization: `Bearer ${env.API_TOKEN}`,
},
body: query,
});
// The API will return a 200 status code if the query succeeded.
// In case of failure we log the error message and return a failure message.
if (queryResponse.status != 200) {
console.error("Error querying:", await queryResponse.text());
return new Response("An error occurred!", { status: 500 });
}
// Read the JSON data from the query response and render the data as HTML.
const queryJSON = await queryResponse.json();
return new Response(renderResponse(queryJSON.data), {
headers: { "content-type": "text/html" },
});
},
};
// renderCity renders a table row as HTML from a data row.
function renderCity(row) {
return `<tr><td>${row.city}</td><td>${row.min_temp}</td><td>${row.max_temp}</td></tr>`;
}
// renderResponse renders a simple HTML table of results.
function renderResponse(data) {
return `<!DOCTYPE html>
<html>
<body>
<table>
<tr><th>City</th><th>Min Temp</th><th>Max Temp</th></tr>
${data.map(renderCity).join("\n")}
</table>
</body>
<html>`;
}