1import * as Effect from "effect/Effect";
2import * as Layer from "effect/Layer";
3import {
4 makeAmpWorkspaceHttpBinding,
5 toPromDuration,
6 toPromTime,
7} from "./BindingHttp.ts";
8import type {
9 PrometheusInstantResult,
10 PrometheusRangeResult,
11} from "./PrometheusTypes.ts";
12import {
13 QueryMetrics,
14 type QueryMetricsClient,
15 type QueryMetricsRequest,
16 type QueryRangeRequest,
17} from "./QueryMetrics.ts";
18
19export const QueryMetricsHttp = Layer.effect(
20 QueryMetrics,
21 makeAmpWorkspaceHttpBinding({
22 name: "QueryMetrics",
23 iamActions: ["aps:QueryMetrics"],
24 makeClient: (send): QueryMetricsClient => ({
25 query: (request: QueryMetricsRequest) =>
26 send({
27 method: "POST",
28 path: "api/v1/query",
29 form: {
30 query: request.query,
31 time:
32 request.time !== undefined ? toPromTime(request.time) : undefined,
33 timeout:
34 request.timeout !== undefined
35 ? toPromDuration(request.timeout)
36 : undefined,
37 },
38 }).pipe(Effect.map((data) => data as PrometheusInstantResult)),
39 queryRange: (request: QueryRangeRequest) =>
40 send({
41 method: "POST",
42 path: "api/v1/query_range",
43 form: {
44 query: request.query,
45 start: toPromTime(request.start),
46 end: toPromTime(request.end),
47 step: toPromDuration(request.step),
48 timeout:
49 request.timeout !== undefined
50 ? toPromDuration(request.timeout)
51 : undefined,
52 },
53 }).pipe(Effect.map((data) => data as PrometheusRangeResult)),
54 }),
55 }),
56);