1import * as Effect from "effect/Effect";
2import * as Layer from "effect/Layer";
3import { makeAmpWorkspaceHttpBinding } from "./BindingHttp.ts";
4import { RemoteWrite, type RemoteWriteRequest } from "./RemoteWrite.ts";
5import {
6 encodeWriteRequest,
7 snappyCompress,
8 type EncodableSeries,
9} from "./RemoteWriteCodec.ts";
10
11export const RemoteWriteHttp = Layer.effect(
12 RemoteWrite,
13 makeAmpWorkspaceHttpBinding({
14 name: "RemoteWrite",
15 iamActions: ["aps:RemoteWrite"],
16 makeClient: (send) => (request: RemoteWriteRequest) =>
17 Effect.gen(function* () {
18 const body = yield* Effect.sync(() => {
19 const now = Date.now();
20 const timeseries: EncodableSeries[] = request.timeseries.map(
21 (series) => ({
22 labels: { ...series.labels, __name__: series.name },
23 samples: series.samples.map((sample) => ({
24 value: sample.value,
25 timestamp: sample.timestamp ?? now,
26 })),
27 }),
28 );
29 return snappyCompress(encodeWriteRequest(timeseries));
30 });
31 yield* send({
32 method: "POST",
33 path: "api/v1/remote_write",
34 bytes: {
35 data: body,
36 contentType: "application/x-protobuf",
37 headers: {
38 "content-encoding": "snappy",
39 "x-prometheus-remote-write-version": "0.1.0",
40 },
41 },
42 });
43 }),
44 }),
45);