workers-observability.api.ts•2.46 kB
import { env } from 'cloudflare:workers'
import { fetchCloudflareApi } from '../cloudflare-api'
import {
	zKeysResponse,
	zReturnedQueryRunResult,
	zValuesResponse,
} from '../types/workers-logs.types'
import { V4Schema } from '../v4-api'
import type { z } from 'zod'
import type { zKeysRequest, zQueryRunRequest, zValuesRequest } from '../types/workers-logs.types'
type QueryRunRequest = z.infer<typeof zQueryRunRequest>
function fixTimeframe(timeframe: QueryRunRequest['timeframe']) {
	return {
		from: new Date(timeframe.from).getTime(),
		to: new Date(timeframe.to).getTime(),
	}
}
export async function queryWorkersObservability(
	apiToken: string,
	accountId: string,
	query: QueryRunRequest
): Promise<z.infer<typeof zReturnedQueryRunResult> | null> {
	// @ts-expect-error We don't have actual env in this package
	const environment = env.ENVIRONMENT
	const data = await fetchCloudflareApi({
		endpoint: '/workers/observability/telemetry/query',
		accountId,
		apiToken,
		responseSchema: V4Schema(zReturnedQueryRunResult),
		options: {
			method: 'POST',
			headers: {
				'Content-Type': 'application/json',
				'workers-observability-origin': `workers-observability-mcp-${environment}`,
			},
			body: JSON.stringify({ ...query, timeframe: fixTimeframe(query.timeframe) }),
		},
	})
	return data.result
}
type QueryKeysRequest = z.infer<typeof zKeysRequest>
export async function handleWorkerLogsKeys(
	apiToken: string,
	accountId: string,
	keysQuery: QueryKeysRequest
): Promise<zKeysResponse> {
	const data = await fetchCloudflareApi({
		endpoint: '/workers/observability/telemetry/keys',
		accountId,
		apiToken,
		responseSchema: V4Schema(zKeysResponse),
		options: {
			method: 'POST',
			headers: {
				'Content-Type': 'application/json',
			},
			body: JSON.stringify({ ...keysQuery, timeframe: fixTimeframe(keysQuery.timeframe) }),
		},
	})
	return data.result || []
}
export async function handleWorkerLogsValues(
	apiToken: string,
	accountId: string,
	valuesQuery: z.infer<typeof zValuesRequest>
): Promise<z.infer<typeof zValuesResponse> | null> {
	const data = await fetchCloudflareApi({
		endpoint: '/workers/observability/telemetry/values',
		accountId,
		apiToken,
		responseSchema: V4Schema(zValuesResponse),
		options: {
			method: 'POST',
			headers: {
				'Content-Type': 'application/json',
			},
			body: JSON.stringify({ ...valuesQuery, timeframe: fixTimeframe(valuesQuery.timeframe) }),
		},
	})
	return data.result
}