diff --git a/example/opentelemetry/opentelemetry.mjs b/example/opentelemetry/opentelemetry.mjs index 87635de..9f87527 100644 --- a/example/opentelemetry/opentelemetry.mjs +++ b/example/opentelemetry/opentelemetry.mjs @@ -29,6 +29,7 @@ const telemetryConfig = { }, [TelemetryMetric.HistogramRequestDuration]: { attributes: new Set([ + TelemetryAttribute.FgaClientRequestBatchCheckSize, TelemetryAttribute.HttpResponseStatusCode, TelemetryAttribute.UserAgentOriginal, TelemetryAttribute.FgaClientRequestMethod, @@ -99,6 +100,34 @@ async function main () { } } + console.log("Calling BatcCheck") + const { responses } = await fgaClient.batchCheck({ + checks: [ + { + object: "doc:roadmap", + relation: "can_read", + user: "user:anne", + }, + { + object: "doc:roadmap", + relation: "can_read", + user: "user:dan", + }, + { + object: "doc:finances", + relation: "can_read", + user: "user:dan" + }, + { + object: "doc:finances", + relation: "can_reads", + user: "user:anne", + } + ] + }, { + authorizationModelId: "01JC6KPJ0CKSZ69C5Z26CYWX2N" + }); + console.log("writing tuple"); await fgaClient.write({ writes: [ diff --git a/telemetry/attributes.ts b/telemetry/attributes.ts index 41ac4cd..f713853 100644 --- a/telemetry/attributes.ts +++ b/telemetry/attributes.ts @@ -14,6 +14,7 @@ import { URL } from "url"; export enum TelemetryAttribute { + FgaClientRequestBatchCheckSize = "fga-client.request.batch_check_size", FgaClientRequestClientId = "fga-client.request.client_id", FgaClientRequestMethod = "fga-client.request.method", FgaClientRequestModelId = "fga-client.request.model_id", @@ -121,6 +122,9 @@ export class TelemetryAttributes { attributes[TelemetryAttribute.FgaClientUser] = body.tuple_key.user; } + if (body?.checks?.length) { + attributes[TelemetryAttribute.FgaClientRequestBatchCheckSize] = body.checks.length; + } return attributes; } } diff --git a/telemetry/configuration.ts b/telemetry/configuration.ts index 0df3948..ab93da1 100644 --- a/telemetry/configuration.ts +++ b/telemetry/configuration.ts @@ -72,6 +72,7 @@ export class TelemetryConfiguration implements TelemetryConfig { // This not included by default as it has a very high cardinality which could increase costs for users // TelemetryAttribute.FgaClientUser + // TelemetryAttribute.FgaClientRequestBatchCheckSize ]); /** @@ -97,6 +98,7 @@ export class TelemetryConfiguration implements TelemetryConfig { TelemetryAttribute.HttpClientRequestDuration, TelemetryAttribute.HttpServerRequestDuration, TelemetryAttribute.FgaClientUser, + TelemetryAttribute.FgaClientRequestBatchCheckSize, ]); /** diff --git a/tests/telemetry/attributes.test.ts b/tests/telemetry/attributes.test.ts index 33bfee5..9ff2355 100644 --- a/tests/telemetry/attributes.test.ts +++ b/tests/telemetry/attributes.test.ts @@ -106,4 +106,30 @@ describe("TelemetryAttributes", () => { expect(attributes[TelemetryAttribute.FgaClientRequestModelId]).toEqual("model-id"); expect(attributes[TelemetryAttribute.FgaClientUser]).toBeUndefined(); }); + + test("should create attributes from a batchCheck request body correctly", () => { + const body = { + authorization_model_id: "model-id", + checks: [ + { + tuple_key: { + user: "user:anne", + object: "doc:123", + relation: "can_view" + } + }, + { + tuple_key: { + user: "user:anne", + object: "doc:789", + relation: "can_view" + } + } + ] + }; + const attributes = TelemetryAttributes.fromRequestBody(body); + + expect(attributes[TelemetryAttribute.FgaClientRequestModelId]).toEqual("model-id"); + expect(attributes[TelemetryAttribute.FgaClientRequestBatchCheckSize]).toEqual(2); + }); });