Skip to content

Commit 7afed85

Browse files
OTel Extraction + SWRCache + Viem Client Cache (#1391)
Co-authored-by: lightwalker-eth <126201998+lightwalker-eth@users.noreply.github.com>
1 parent 6388ee7 commit 7afed85

38 files changed

Lines changed: 838 additions & 614 deletions

apps/ensadmin/src/app/inspect/_components/render-requests-output.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import { useEffect, useMemo, useState } from "react";
44
import {
55
type AcceleratableResponse,
66
ClientError,
7-
type ProtocolTrace,
87
type TraceableResponse,
8+
type TracingTrace,
99
} from "@ensnode/ensnode-sdk";
1010

1111
import { CodeBlock } from "@/components/code-block";
@@ -21,7 +21,7 @@ type QueryResult<K extends string> = UseQueryResult<
2121
{ [key in K]: unknown } & AcceleratableResponse & TraceableResponse
2222
>;
2323

24-
const renderTraceDuration = (trace: ProtocolTrace) => renderMicroseconds(getTraceDuration(trace));
24+
const renderTraceDuration = (trace: TracingTrace) => renderMicroseconds(getTraceDuration(trace));
2525

2626
const MULTIPLE_THRESHOLD = 1.3; // accelerated requests must be 1.3x faster to be considered green
2727

apps/ensadmin/src/components/identity/index.tsx

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,7 @@ export function ResolveAndDisplayIdentity({
5353
// resolve the primary name for `identity` using ENSNode
5454
// TODO: extract out the concept of resolving an `Identity` into a provider that child
5555
// components can then hook into.
56-
const { identity: identityResult } = useResolvedIdentity({
57-
identity,
58-
namespaceId,
59-
accelerate,
60-
});
56+
const { identity: identityResult } = useResolvedIdentity({ identity, accelerate });
6157

6258
return (
6359
<DisplayIdentity

apps/ensadmin/src/components/tracing/renderer.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import {
66
ATTR_PROTOCOL_STEP,
77
ATTR_PROTOCOL_STEP_RESULT,
88
ForwardResolutionProtocolStep,
9-
type ProtocolSpan,
10-
type ProtocolTrace,
119
ReverseResolutionProtocolStep,
10+
type TracingSpan,
11+
type TracingTrace,
1212
} from "@ensnode/ensnode-sdk";
1313

1414
import { HoverCard, HoverCardContent, HoverCardTrigger } from "@/components/ui/hover-card";
@@ -20,7 +20,7 @@ import { cn } from "@/lib/utils";
2020
const asPercentInDuration = (value: number, duration: number) =>
2121
`${((value / duration) * 100).toFixed(2)}%`;
2222

23-
const renderSpanAttributes = (span: ProtocolSpan) => {
23+
const renderSpanAttributes = (span: TracingSpan) => {
2424
const { [ATTR_PROTOCOL_STEP]: step, [ATTR_PROTOCOL_NAME]: protocol, ...rest } = span.attributes;
2525
switch (step) {
2626
case ReverseResolutionProtocolStep.Operation:
@@ -38,8 +38,8 @@ function RenderEvent({
3838
event,
3939
setParentOpen,
4040
}: {
41-
span: ProtocolSpan;
42-
event: ProtocolSpan["events"][number];
41+
span: TracingSpan;
42+
event: TracingSpan["events"][number];
4343
setParentOpen: (value: boolean) => void;
4444
}) {
4545
const left = asPercentInDuration(event.time - span.timestamp, span.duration);
@@ -91,7 +91,7 @@ function RenderEvent({
9191
);
9292
}
9393

94-
function RenderSpan({ parent }: { parent: ProtocolTrace[number] }) {
94+
function RenderSpan({ parent }: { parent: TracingTrace[number] }) {
9595
const protocolStep = parent.attributes[ATTR_PROTOCOL_STEP] as
9696
| ForwardResolutionProtocolStep
9797
| ReverseResolutionProtocolStep;
@@ -170,7 +170,7 @@ function RenderSpan({ parent }: { parent: ProtocolTrace[number] }) {
170170
);
171171
}
172172

173-
export function TraceRenderer({ trace }: { trace: ProtocolTrace }) {
173+
export function TraceRenderer({ trace }: { trace: TracingTrace }) {
174174
return (
175175
<div className="flex flex-col gap-4 rounded-lg">
176176
{/* for each root span */}

apps/ensadmin/src/lib/tracing.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { ProtocolTrace } from "@ensnode/ensnode-sdk";
1+
import type { TracingTrace } from "@ensnode/ensnode-sdk";
22
import { ForwardResolutionProtocolStep, ReverseResolutionProtocolStep } from "@ensnode/ensnode-sdk";
33

44
const FORWARD_STEPS: Record<ForwardResolutionProtocolStep, { title: string; description: string }> =
@@ -78,6 +78,6 @@ export function getProtocolStepInfo(
7878
);
7979
}
8080

81-
export function getTraceDuration(trace: ProtocolTrace) {
81+
export function getTraceDuration(trace: TracingTrace) {
8282
return Math.max(...trace.map((span) => span.duration), 0);
8383
}

apps/ensapi/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@
2525
"@ensnode/ensnode-schema": "workspace:*",
2626
"@ensnode/ensnode-sdk": "workspace:*",
2727
"@ensnode/ponder-subgraph": "workspace:*",
28-
"@namehash/ens-referrals": "workspace:*",
2928
"@hono/node-server": "^1.19.5",
3029
"@hono/otel": "^0.2.2",
3130
"@hono/zod-validator": "^0.7.2",
31+
"@namehash/ens-referrals": "workspace:*",
3232
"@opentelemetry/api": "^1.9.0",
3333
"@opentelemetry/core": "^2.0.1",
3434
"@opentelemetry/exporter-metrics-otlp-proto": "^0.202.0",
@@ -39,14 +39,14 @@
3939
"@opentelemetry/sdk-trace-base": "^2.0.1",
4040
"@opentelemetry/sdk-trace-node": "^2.0.1",
4141
"@opentelemetry/semantic-conventions": "^1.34.0",
42+
"@ponder/utils": "catalog:",
4243
"date-fns": "catalog:",
4344
"drizzle-orm": "catalog:",
4445
"hono": "catalog:",
4546
"p-memoize": "^8.0.0",
4647
"p-retry": "^7.1.0",
4748
"pg-connection-string": "catalog:",
4849
"pino": "catalog:",
49-
"ponder": "catalog:",
5050
"ponder-enrich-gql-docs-middleware": "^0.1.3",
5151
"viem": "catalog:",
5252
"zod": "catalog:"

apps/ensapi/src/cache/indexing-status.cache.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,6 @@ export const indexingStatusCache = new SWRCache({
3838
throw error;
3939
}),
4040
ttl: 5, // 5 seconds
41-
revalidationInterval: 10, // 10 seconds
41+
proactiveRevalidationInterval: 10, // 10 seconds
4242
proactivelyInitialize: true,
4343
});

apps/ensapi/src/cache/referrer-leaderboard.cache.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,26 +44,24 @@ const supportedOmnichainIndexingStatuses: OmnichainIndexingStatusId[] = [
4444

4545
export const referrerLeaderboardCache = new SWRCache({
4646
fn: async () => {
47-
const indexingStatus = await indexingStatusCache.readCache();
48-
if (indexingStatus === null) {
47+
const indexingStatus = await indexingStatusCache.read();
48+
if (indexingStatus instanceof Error) {
4949
throw new Error(
5050
"Unable to generate referrer leaderboard. indexingStatusCache must have been successfully initialized.",
5151
);
5252
}
5353

54-
const omnichainIndexingStatus = indexingStatus.value.omnichainSnapshot.omnichainStatus;
55-
54+
const omnichainIndexingStatus = indexingStatus.omnichainSnapshot.omnichainStatus;
5655
if (!supportedOmnichainIndexingStatuses.includes(omnichainIndexingStatus)) {
5756
throw new Error(
5857
`Unable to generate referrer leaderboard. Omnichain indexing status is currently ${omnichainIndexingStatus} but must be ${supportedOmnichainIndexingStatuses.join(" or ")} to generate a referrer leaderboard.`,
5958
);
6059
}
6160

6261
const latestIndexedBlockRef = getLatestIndexedBlockRef(
63-
indexingStatus.value,
62+
indexingStatus,
6463
rules.subregistryId.chainId,
6564
);
66-
6765
if (latestIndexedBlockRef === null) {
6866
throw new Error(
6967
`Unable to generate referrer leaderboard. Latest indexed block ref for chain ${rules.subregistryId.chainId} is null.`,
@@ -84,6 +82,6 @@ export const referrerLeaderboardCache = new SWRCache({
8482
}
8583
},
8684
ttl: minutesToSeconds(1),
87-
revalidationInterval: minutesToSeconds(2),
85+
proactiveRevalidationInterval: minutesToSeconds(2),
8886
proactivelyInitialize: true,
8987
});

apps/ensapi/src/handlers/ensnode-api.ts

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,13 @@ import {
1010

1111
import { buildEnsApiPublicConfig } from "@/config/config.schema";
1212
import { factory } from "@/lib/hono-factory";
13-
import { makeLogger } from "@/lib/logger";
1413

1514
import nameTokensApi from "./name-tokens-api";
1615
import registrarActionsApi from "./registrar-actions-api";
1716
import resolutionApi from "./resolution-api";
1817

1918
const app = factory.createApp();
2019

21-
const logger = makeLogger("ensnode-api");
22-
2320
// include ENSApi Public Config endpoint
2421
app.get("/config", async (c) => {
2522
const ensApiPublicConfig = buildEnsApiPublicConfig(config);
@@ -34,14 +31,6 @@ app.get("/indexing-status", async (c) => {
3431
}
3532

3633
if (c.var.indexingStatus instanceof Error) {
37-
// no indexing status available in context
38-
logger.error(
39-
{
40-
error: c.var.indexingStatus,
41-
},
42-
"Indexing status requested but is not available in context.",
43-
);
44-
4534
return c.json(
4635
serializeIndexingStatusResponse({
4736
responseCode: IndexingStatusResponseCodes.Error,

apps/ensapi/src/handlers/resolution-api.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { factory } from "@/lib/hono-factory";
1313
import { resolveForward } from "@/lib/resolution/forward-resolution";
1414
import { resolvePrimaryNames } from "@/lib/resolution/multichain-primary-name-resolution";
1515
import { resolveReverse } from "@/lib/resolution/reverse-resolution";
16-
import { captureTrace } from "@/lib/tracing/protocol-tracing";
16+
import { runWithTrace } from "@/lib/tracing/tracing-api";
1717
import { canAccelerateMiddleware } from "@/middleware/can-accelerate.middleware";
1818
import { makeIsRealtimeMiddleware } from "@/middleware/is-realtime.middleware";
1919

@@ -69,7 +69,7 @@ app.get(
6969
const { selection, trace: showTrace, accelerate } = c.req.valid("query");
7070
const canAccelerate = c.var.canAccelerate;
7171

72-
const { result, trace } = await captureTrace(() =>
72+
const { result, trace } = await runWithTrace(() =>
7373
resolveForward(name, selection, { accelerate, canAccelerate }),
7474
);
7575

@@ -117,7 +117,7 @@ app.get(
117117
const { trace: showTrace, accelerate } = c.req.valid("query");
118118
const canAccelerate = c.var.canAccelerate;
119119

120-
const { result, trace } = await captureTrace(() =>
120+
const { result, trace } = await runWithTrace(() =>
121121
resolveReverse(address, chainId, { accelerate, canAccelerate }),
122122
);
123123

@@ -163,7 +163,7 @@ app.get(
163163
const { chainIds, trace: showTrace, accelerate } = c.req.valid("query");
164164
const canAccelerate = c.var.canAccelerate;
165165

166-
const { result, trace } = await captureTrace(() =>
166+
const { result, trace } = await runWithTrace(() =>
167167
resolvePrimaryNames(address, chainIds, { accelerate, canAccelerate }),
168168
);
169169

apps/ensapi/src/index.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ import { referrerLeaderboardCache } from "@/cache/referrer-leaderboard.cache";
1212
import { redactEnsApiConfig } from "@/config/redact";
1313
import { errorResponse } from "@/lib/handlers/error-response";
1414
import { factory } from "@/lib/hono-factory";
15+
import { sdk } from "@/lib/instrumentation";
1516
import logger from "@/lib/logger";
16-
import { sdk } from "@/lib/tracing/instrumentation";
1717
import { indexingStatusMiddleware } from "@/middleware/indexing-status.middleware";
1818

1919
import ensanalyticsApi from "./handlers/ensanalytics-api";
@@ -32,7 +32,6 @@ app.use(async (ctx, next) => {
3232
app.use(cors({ origin: "*" }));
3333

3434
// include automatic OpenTelemetry instrumentation for incoming requests
35-
// NOTE: required for protocol tracing
3635
app.use(otel());
3736

3837
// add ENSIndexer Indexing Status Middleware to all routes for convenience
@@ -72,7 +71,7 @@ const server = serve(
7271
`ENSApi listening on port ${info.port} with config:\n${prettyPrintJson(redactEnsApiConfig(config))}`,
7372
);
7473

75-
// self-healthcheck to connect to ENSIndexer & warm Indexing Status / Can Accelerate cache
74+
// self-healthcheck to connect to ENSIndexer & warm Indexing Status cache
7675
await app.request("/health");
7776
},
7877
);

0 commit comments

Comments
 (0)