INTEGRITY Dokumentace

Dotazování z Workeru

Pokud chcete přistupovat k datům Analytics Engine přímo z Workeru, můžete použít fetch pro přístup k SQL API. API může vracet data ve formátu JSON, se kterými se snadno pracuje v JavaScriptu.

Ověřování

Aby se váš Worker mohl ověřit vůči API, budete potřebovat ID účtu a API token.

Doporučujeme ukládat ID účtu jako proměnnou prostředí a API token jako Secret ve svém Workeru. Provést to můžete přes dashboard nebo přes Wrangler. Viz Dokumentace Workers kde najdete další podrobnosti.

Dotazování

Použijte JavaScript fetch API pro spuštění dotazu následujícím způsobem:

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();

Data se vrátí ve formátu popsaném v FORMAT sekci dokumentace, která vám umožňuje získat metainformace o názvech a typech vrácených sloupců, a to kromě samotných dat a počtu řádků.

Příklad Workeru

Následuje ukázkový Worker, který spustí dotaz nad datovou sadou meteorologických záznamů a pro každé město zobrazí minimální a maximální hodnoty.

Nastavení proměnných prostředí

Nejprve se nastaví proměnné prostředí s ID účtu a API tokenem.

ID účtu se nastavuje v Konfigurační soubor Wrangler:

{
	"vars": {
		"ACCOUNT_ID": "<account_id>"
	}
}
[vars]
ACCOUNT_ID = "<account_id>"

Proměnnou API_TOKEN můžete nastavit jako tajný klíč (secret) pomocí nástroje příkazové řádky wrangler. Spusťte následující příkaz a zadejte řetězec svého tokenu:

npx wrangler secret put API_TOKEN

Worker skript

Samotný skript workeru provede dotaz a naformátuje výsledek:

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>`;
}