export const instrument = Effect.map(
HttpClient.client.Client,
client =>
HttpClient.client.makeDefault((request) =>
Effect.flatMap(
HttpClient.urlParams.makeUrl(request.url, request.urlParams, (_) =>
HttpClient.error.RequestError({
request,
reason: "InvalidUrl",
error: _,
})),
(url) =>
Effect.useSpan(request.method, {
attributes: {
"http.request.method": request.method,
"url.full": url.href,
"url.scheme": url.protocol,
"server.address": url.host,
"server.port": Number.isNaN(Number(url.port)) ? 443 : Number(url.port),
"network.protocol.version": "1.1",
},
}, span =>
Effect.suspend(() => {
ReadonlyRecord.toEntries(request.headers).forEach(([k, v]) =>
span.attribute(`http.request.header.${k}`, [v])
);
return client(request);
}).pipe(
Effect.tap(_ => {
span.attribute("http.response.status_code", _.status);
ReadonlyRecord.toEntries(request.headers).forEach(([k, v]) =>
span.attribute(`http.response.header.${k}`, [v])
);
if (_.status >= 400) {
span.attribute("error.type", _.status);
}
}),
)),
)
),
);
export const instrument = Effect.map(
HttpClient.client.Client,
client =>
HttpClient.client.makeDefault((request) =>
Effect.flatMap(
HttpClient.urlParams.makeUrl(request.url, request.urlParams, (_) =>
HttpClient.error.RequestError({
request,
reason: "InvalidUrl",
error: _,
})),
(url) =>
Effect.useSpan(request.method, {
attributes: {
"http.request.method": request.method,
"url.full": url.href,
"url.scheme": url.protocol,
"server.address": url.host,
"server.port": Number.isNaN(Number(url.port)) ? 443 : Number(url.port),
"network.protocol.version": "1.1",
},
}, span =>
Effect.suspend(() => {
ReadonlyRecord.toEntries(request.headers).forEach(([k, v]) =>
span.attribute(`http.request.header.${k}`, [v])
);
return client(request);
}).pipe(
Effect.tap(_ => {
span.attribute("http.response.status_code", _.status);
ReadonlyRecord.toEntries(request.headers).forEach(([k, v]) =>
span.attribute(`http.response.header.${k}`, [v])
);
if (_.status >= 400) {
span.attribute("error.type", _.status);
}
}),
)),
)
),
);