@cleverbrush/otel 4.1.0 → 4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -2
- package/dist/client.d.ts +87 -0
- package/dist/client.js +2 -0
- package/dist/client.js.map +1 -0
- package/package.json +5 -1
package/README.md
CHANGED
|
@@ -58,7 +58,23 @@ const server = createServer()
|
|
|
58
58
|
|
|
59
59
|
A `SpanKind.SERVER` span is opened per request, named `operationId` or `METHOD route` and tagged with the standard HTTP semantic-convention attributes. W3C `traceparent` is extracted, so spans link to upstream callers.
|
|
60
60
|
|
|
61
|
-
### 3. Trace
|
|
61
|
+
### 3. Trace typed client calls between services
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
import { createClient } from '@cleverbrush/client';
|
|
65
|
+
import { clientTracingMiddleware } from '@cleverbrush/otel/client';
|
|
66
|
+
|
|
67
|
+
const client = createClient(api, {
|
|
68
|
+
baseUrl: 'http://todo-backend:3000',
|
|
69
|
+
middlewares: [clientTracingMiddleware()]
|
|
70
|
+
});
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
`clientTracingMiddleware()` opens a `SpanKind.CLIENT` span around each typed client call and injects W3C `traceparent` / `tracestate` / `baggage` headers. When the downstream Cleverbrush service uses `tracingMiddleware()`, SigNoz and other OTel backends show both services under one distributed trace.
|
|
74
|
+
|
|
75
|
+
Put the tracing middleware first in the client middleware list so it wraps retries, timeouts, and batching. If you use `batching()`, keep batching last so each logical subrequest carries its own trace context.
|
|
76
|
+
|
|
77
|
+
### 4. Trace SQL queries
|
|
62
78
|
|
|
63
79
|
```ts
|
|
64
80
|
import { instrumentKnex } from '@cleverbrush/otel';
|
|
@@ -71,7 +87,7 @@ const db = instrumentKnex(
|
|
|
71
87
|
|
|
72
88
|
Every Knex query becomes a `SpanKind.CLIENT` span with `db.system.name`, `db.namespace`, `db.operation.name`, `db.query.text`, and parented under the active server span automatically.
|
|
73
89
|
|
|
74
|
-
###
|
|
90
|
+
### 5. Send logs as OTLP records (with trace correlation)
|
|
75
91
|
|
|
76
92
|
```ts
|
|
77
93
|
import { createLogger, consoleSink } from '@cleverbrush/log';
|
|
@@ -90,6 +106,7 @@ const logger = createLogger({
|
|
|
90
106
|
| --------------------------------- | --------------------------------------------------------- |
|
|
91
107
|
| `setupOtel(config)` | Boot the Node SDK; returns `{ shutdown(), sdk }` |
|
|
92
108
|
| `tracingMiddleware(opts?)` | `@cleverbrush/server` middleware; opens SERVER span |
|
|
109
|
+
| `clientTracingMiddleware(opts?)` | `@cleverbrush/client` middleware; opens CLIENT span |
|
|
93
110
|
| `instrumentKnex(knex, opts?)` | Hook a Knex instance; emits CLIENT span per query |
|
|
94
111
|
| `otelLogSink(opts?)` | `@cleverbrush/log` sink → OTLP log records |
|
|
95
112
|
| `traceEnricher()` | `@cleverbrush/log` enricher → adds `TraceId` / `SpanId` |
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { type Span } from '@opentelemetry/api';
|
|
2
|
+
/**
|
|
3
|
+
* A function with the same shape as `fetch`.
|
|
4
|
+
*
|
|
5
|
+
* Kept local instead of importing from `@cleverbrush/client` so this
|
|
6
|
+
* entrypoint remains structurally compatible without a runtime dependency.
|
|
7
|
+
*/
|
|
8
|
+
export type FetchLike = (url: string, init: RequestInit) => Promise<Response>;
|
|
9
|
+
/**
|
|
10
|
+
* Middleware shape accepted by `@cleverbrush/client`.
|
|
11
|
+
*/
|
|
12
|
+
export type ClientMiddleware = (next: FetchLike) => FetchLike;
|
|
13
|
+
/**
|
|
14
|
+
* Endpoint metadata attached to `RequestInit` by `@cleverbrush/client`.
|
|
15
|
+
*
|
|
16
|
+
* This is intentionally structural and partial so the OTel package can read
|
|
17
|
+
* metadata when present without coupling to client internals at runtime.
|
|
18
|
+
*/
|
|
19
|
+
export interface ClientTracingEndpointMeta {
|
|
20
|
+
group?: string;
|
|
21
|
+
endpoint?: string;
|
|
22
|
+
method?: string;
|
|
23
|
+
path?: string;
|
|
24
|
+
collectionPath?: string;
|
|
25
|
+
operationId?: string | null;
|
|
26
|
+
tags?: readonly string[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Information passed to the `enrichSpan` hook.
|
|
30
|
+
*/
|
|
31
|
+
export interface ClientTracingInfo {
|
|
32
|
+
url: string;
|
|
33
|
+
method: string;
|
|
34
|
+
headers: Record<string, string>;
|
|
35
|
+
endpoint?: ClientTracingEndpointMeta;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Configuration for {@link clientTracingMiddleware}.
|
|
39
|
+
*/
|
|
40
|
+
export interface ClientTracingMiddlewareOptions {
|
|
41
|
+
/**
|
|
42
|
+
* Tracer name used when resolving the OTel tracer.
|
|
43
|
+
*
|
|
44
|
+
* @default '@cleverbrush/otel'
|
|
45
|
+
*/
|
|
46
|
+
tracerName?: string;
|
|
47
|
+
/** Tracer version. */
|
|
48
|
+
tracerVersion?: string;
|
|
49
|
+
/**
|
|
50
|
+
* Predicate for skipping tracing on selected outbound requests.
|
|
51
|
+
*/
|
|
52
|
+
skip?: (url: string, init: RequestInit) => boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Hook for adding custom attributes/events before the request is sent.
|
|
55
|
+
* Errors thrown here are swallowed.
|
|
56
|
+
*/
|
|
57
|
+
enrichSpan?: (span: Span, info: ClientTracingInfo) => void;
|
|
58
|
+
/**
|
|
59
|
+
* Whether to record `url.full`.
|
|
60
|
+
*
|
|
61
|
+
* Disabled by default because full URLs can include query strings with
|
|
62
|
+
* sensitive values.
|
|
63
|
+
*
|
|
64
|
+
* @default false
|
|
65
|
+
*/
|
|
66
|
+
recordUrlFull?: boolean;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Creates a `@cleverbrush/client` middleware that traces outbound HTTP calls
|
|
70
|
+
* and injects W3C Trace Context headers.
|
|
71
|
+
*
|
|
72
|
+
* Register this as the first client middleware so it wraps retries, timeouts,
|
|
73
|
+
* and batching. The server-side `tracingMiddleware` already extracts these
|
|
74
|
+
* headers, so downstream services join the same distributed trace.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```ts
|
|
78
|
+
* import { createClient } from '@cleverbrush/client';
|
|
79
|
+
* import { clientTracingMiddleware } from '@cleverbrush/otel/client';
|
|
80
|
+
*
|
|
81
|
+
* const client = createClient(api, {
|
|
82
|
+
* baseUrl: 'http://service-b:3000',
|
|
83
|
+
* middlewares: [clientTracingMiddleware()]
|
|
84
|
+
* });
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export declare function clientTracingMiddleware(options?: ClientTracingMiddlewareOptions): ClientMiddleware;
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{context as C,propagation as m,SpanKind as M,SpanStatusCode as g,trace as y}from"@opentelemetry/api";import{ATTR_HTTP_REQUEST_METHOD as I,ATTR_HTTP_RESPONSE_STATUS_CODE as U,ATTR_HTTP_ROUTE as L,ATTR_SERVER_ADDRESS as O,ATTR_SERVER_PORT as k,ATTR_URL_FULL as v,ATTR_URL_PATH as w,ATTR_URL_SCHEME as N}from"@opentelemetry/semantic-conventions";var x="@cleverbrush/otel";function F(t){if(!t)return{};if(t instanceof Headers){let n={};return t.forEach((e,i)=>{n[i]=e}),n}if(Array.isArray(t)){let n={};for(let[e,i]of t)n[e]=i;return n}return{...t}}function P(t){return t.__endpointMeta}function h(t){try{let n=/^[a-z][a-z0-9+.-]*:\/\//i.test(t),e=new URL(t,"http://localhost"),i={path:e.pathname};if(n&&(i.scheme=e.protocol.replace(/:$/,""),i.host=e.hostname,e.port)){let r=Number(e.port);Number.isFinite(r)&&(i.port=r)}return i}catch{return}}function R(t){return t?.path??t?.collectionPath??null}function H(t,n,e){if(e?.operationId)return e.operationId;let i=R(e);if(i)return`${t} ${i}`;let r=h(n);return`${t} ${r?.path??n}`}function D(t,n,e,i){let r=h(n),p=R(e),o={[I]:t};return r?.path&&(o[w]=r.path),r?.scheme&&(o[N]=r.scheme),r?.host&&(o[O]=r.host),r?.port!==void 0&&(o[k]=r.port),i&&(o[v]=n),p&&(o[L]=p),e?.group&&(o["cleverbrush.client.group"]=e.group),e?.endpoint&&(o["cleverbrush.client.endpoint"]=e.endpoint),e?.operationId&&(o["cleverbrush.endpoint.operationId"]=e.operationId),e?.tags?.length&&(o["cleverbrush.endpoint.tags"]=e.tags.join(",")),o}function V(t,n){if(n instanceof Error){t.recordException(n),t.setStatus({code:g.ERROR,message:n.message});return}t.recordException(new Error(String(n))),t.setStatus({code:g.ERROR,message:String(n)})}function z(t={}){let n=t.tracerName??x,e=t.tracerVersion,i=t.skip,r=t.enrichSpan,p=t.recordUrlFull??!1,o,E=()=>(o||(o=y.getTracer(n,e)),o);return T=>async(s,c)=>{if(i?.(s,c))return T(s,c);let l=(c.method??"GET").toUpperCase(),u=P(c),S=H(l,s,u),_=D(l,s,u,p);return E().startActiveSpan(S,{kind:M.CLIENT,attributes:_},async a=>{let f=F(c.headers);m.inject(C.active(),f);let A={...c,headers:f},b={url:s,method:l,headers:f,...u?{endpoint:u}:{}};if(r)try{r(a,b)}catch{}try{let d=await T(s,A);return a.setAttribute(U,d.status),d.status>=400?a.setStatus({code:g.ERROR}):a.setStatus({code:g.OK}),d}catch(d){throw V(a,d),d}finally{a.end()}})}}export{z as clientTracingMiddleware};
|
|
2
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client.ts"],"sourcesContent":["import {\n context,\n propagation,\n type Span,\n type SpanAttributes,\n SpanKind,\n SpanStatusCode,\n type Tracer,\n trace\n} from '@opentelemetry/api';\nimport {\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_ROUTE,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_URL_FULL,\n ATTR_URL_PATH,\n ATTR_URL_SCHEME\n} from '@opentelemetry/semantic-conventions';\n\n/**\n * A function with the same shape as `fetch`.\n *\n * Kept local instead of importing from `@cleverbrush/client` so this\n * entrypoint remains structurally compatible without a runtime dependency.\n */\nexport type FetchLike = (url: string, init: RequestInit) => Promise<Response>;\n\n/**\n * Middleware shape accepted by `@cleverbrush/client`.\n */\nexport type ClientMiddleware = (next: FetchLike) => FetchLike;\n\n/**\n * Endpoint metadata attached to `RequestInit` by `@cleverbrush/client`.\n *\n * This is intentionally structural and partial so the OTel package can read\n * metadata when present without coupling to client internals at runtime.\n */\nexport interface ClientTracingEndpointMeta {\n group?: string;\n endpoint?: string;\n method?: string;\n path?: string;\n collectionPath?: string;\n operationId?: string | null;\n tags?: readonly string[];\n}\n\n/**\n * Information passed to the `enrichSpan` hook.\n */\nexport interface ClientTracingInfo {\n url: string;\n method: string;\n headers: Record<string, string>;\n endpoint?: ClientTracingEndpointMeta;\n}\n\n/**\n * Configuration for {@link clientTracingMiddleware}.\n */\nexport interface ClientTracingMiddlewareOptions {\n /**\n * Tracer name used when resolving the OTel tracer.\n *\n * @default '@cleverbrush/otel'\n */\n tracerName?: string;\n\n /** Tracer version. */\n tracerVersion?: string;\n\n /**\n * Predicate for skipping tracing on selected outbound requests.\n */\n skip?: (url: string, init: RequestInit) => boolean;\n\n /**\n * Hook for adding custom attributes/events before the request is sent.\n * Errors thrown here are swallowed.\n */\n enrichSpan?: (span: Span, info: ClientTracingInfo) => void;\n\n /**\n * Whether to record `url.full`.\n *\n * Disabled by default because full URLs can include query strings with\n * sensitive values.\n *\n * @default false\n */\n recordUrlFull?: boolean;\n}\n\nconst DEFAULT_TRACER_NAME = '@cleverbrush/otel';\n\nfunction flattenHeaders(\n headers: RequestInit['headers'] | undefined\n): Record<string, string> {\n if (!headers) return {};\n\n if (headers instanceof Headers) {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n }\n\n if (Array.isArray(headers)) {\n const result: Record<string, string> = {};\n for (const [key, value] of headers) {\n result[key] = value;\n }\n return result;\n }\n\n return { ...headers } as Record<string, string>;\n}\n\nfunction getEndpointMeta(\n init: RequestInit\n): ClientTracingEndpointMeta | undefined {\n return (init as any).__endpointMeta as\n | ClientTracingEndpointMeta\n | undefined;\n}\n\nfunction parseUrl(url: string):\n | {\n path: string;\n scheme?: string;\n host?: string;\n port?: number;\n }\n | undefined {\n try {\n const absolute = /^[a-z][a-z0-9+.-]*:\\/\\//i.test(url);\n const parsed = new URL(url, 'http://localhost');\n const result: {\n path: string;\n scheme?: string;\n host?: string;\n port?: number;\n } = {\n path: parsed.pathname\n };\n\n if (absolute) {\n result.scheme = parsed.protocol.replace(/:$/, '');\n result.host = parsed.hostname;\n if (parsed.port) {\n const port = Number(parsed.port);\n if (Number.isFinite(port)) result.port = port;\n }\n }\n\n return result;\n } catch {\n return undefined;\n }\n}\n\nfunction getRoute(meta: ClientTracingEndpointMeta | undefined): string | null {\n return meta?.path ?? meta?.collectionPath ?? null;\n}\n\nfunction getSpanName(\n method: string,\n url: string,\n meta: ClientTracingEndpointMeta | undefined\n): string {\n if (meta?.operationId) return meta.operationId;\n\n const route = getRoute(meta);\n if (route) return `${method} ${route}`;\n\n const parsed = parseUrl(url);\n return `${method} ${parsed?.path ?? url}`;\n}\n\nfunction buildAttributes(\n method: string,\n url: string,\n meta: ClientTracingEndpointMeta | undefined,\n recordUrlFull: boolean\n): SpanAttributes {\n const parsed = parseUrl(url);\n const route = getRoute(meta);\n const attributes: SpanAttributes = {\n [ATTR_HTTP_REQUEST_METHOD]: method\n };\n\n if (parsed?.path) attributes[ATTR_URL_PATH] = parsed.path;\n if (parsed?.scheme) attributes[ATTR_URL_SCHEME] = parsed.scheme;\n if (parsed?.host) attributes[ATTR_SERVER_ADDRESS] = parsed.host;\n if (parsed?.port !== undefined) {\n attributes[ATTR_SERVER_PORT] = parsed.port;\n }\n if (recordUrlFull) attributes[ATTR_URL_FULL] = url;\n if (route) attributes[ATTR_HTTP_ROUTE] = route;\n if (meta?.group) attributes['cleverbrush.client.group'] = meta.group;\n if (meta?.endpoint) {\n attributes['cleverbrush.client.endpoint'] = meta.endpoint;\n }\n if (meta?.operationId) {\n attributes['cleverbrush.endpoint.operationId'] = meta.operationId;\n }\n if (meta?.tags?.length) {\n attributes['cleverbrush.endpoint.tags'] = meta.tags.join(',');\n }\n\n return attributes;\n}\n\nfunction markError(span: Span, err: unknown): void {\n if (err instanceof Error) {\n span.recordException(err);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: err.message\n });\n return;\n }\n\n span.recordException(new Error(String(err)));\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: String(err)\n });\n}\n\n/**\n * Creates a `@cleverbrush/client` middleware that traces outbound HTTP calls\n * and injects W3C Trace Context headers.\n *\n * Register this as the first client middleware so it wraps retries, timeouts,\n * and batching. The server-side `tracingMiddleware` already extracts these\n * headers, so downstream services join the same distributed trace.\n *\n * @example\n * ```ts\n * import { createClient } from '@cleverbrush/client';\n * import { clientTracingMiddleware } from '@cleverbrush/otel/client';\n *\n * const client = createClient(api, {\n * baseUrl: 'http://service-b:3000',\n * middlewares: [clientTracingMiddleware()]\n * });\n * ```\n */\nexport function clientTracingMiddleware(\n options: ClientTracingMiddlewareOptions = {}\n): ClientMiddleware {\n const tracerName = options.tracerName ?? DEFAULT_TRACER_NAME;\n const tracerVersion = options.tracerVersion;\n const skip = options.skip;\n const enrichSpan = options.enrichSpan;\n const recordUrlFull = options.recordUrlFull ?? false;\n\n let cachedTracer: Tracer | undefined;\n const getTracer = (): Tracer => {\n if (!cachedTracer) {\n cachedTracer = trace.getTracer(tracerName, tracerVersion);\n }\n return cachedTracer;\n };\n\n return next => async (url, init) => {\n if (skip?.(url, init)) {\n return next(url, init);\n }\n\n const method = (init.method ?? 'GET').toUpperCase();\n const meta = getEndpointMeta(init);\n const spanName = getSpanName(method, url, meta);\n const attributes = buildAttributes(method, url, meta, recordUrlFull);\n\n const tracer = getTracer();\n return tracer.startActiveSpan(\n spanName,\n { kind: SpanKind.CLIENT, attributes },\n async span => {\n const headers = flattenHeaders(init.headers);\n propagation.inject(context.active(), headers);\n\n const tracedInit = {\n ...init,\n headers\n };\n const info: ClientTracingInfo = {\n url,\n method,\n headers,\n ...(meta ? { endpoint: meta } : {})\n };\n\n if (enrichSpan) {\n try {\n enrichSpan(span, info);\n } catch {\n // Ignore enrichment errors.\n }\n }\n\n try {\n const response = await next(url, tracedInit);\n span.setAttribute(\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n response.status\n );\n if (response.status >= 400) {\n span.setStatus({ code: SpanStatusCode.ERROR });\n } else {\n span.setStatus({ code: SpanStatusCode.OK });\n }\n return response;\n } catch (err) {\n markError(span, err);\n throw err;\n } finally {\n span.end();\n }\n }\n );\n };\n}\n"],"mappings":"AAAA,OACI,WAAAA,EACA,eAAAC,EAGA,YAAAC,EACA,kBAAAC,EAEA,SAAAC,MACG,qBACP,OACI,4BAAAC,EACA,kCAAAC,EACA,mBAAAC,EACA,uBAAAC,EACA,oBAAAC,EACA,iBAAAC,EACA,iBAAAC,EACA,mBAAAC,MACG,sCA6EP,IAAMC,EAAsB,oBAE5B,SAASC,EACLC,EACsB,CACtB,GAAI,CAACA,EAAS,MAAO,CAAC,EAEtB,GAAIA,aAAmB,QAAS,CAC5B,IAAMC,EAAiC,CAAC,EACxC,OAAAD,EAAQ,QAAQ,CAACE,EAAOC,IAAQ,CAC5BF,EAAOE,CAAG,EAAID,CAClB,CAAC,EACMD,CACX,CAEA,GAAI,MAAM,QAAQD,CAAO,EAAG,CACxB,IAAMC,EAAiC,CAAC,EACxC,OAAW,CAACE,EAAKD,CAAK,IAAKF,EACvBC,EAAOE,CAAG,EAAID,EAElB,OAAOD,CACX,CAEA,MAAO,CAAE,GAAGD,CAAQ,CACxB,CAEA,SAASI,EACLC,EACqC,CACrC,OAAQA,EAAa,cAGzB,CAEA,SAASC,EAASC,EAOF,CACZ,GAAI,CACA,IAAMC,EAAW,2BAA2B,KAAKD,CAAG,EAC9CE,EAAS,IAAI,IAAIF,EAAK,kBAAkB,EACxCN,EAKF,CACA,KAAMQ,EAAO,QACjB,EAEA,GAAID,IACAP,EAAO,OAASQ,EAAO,SAAS,QAAQ,KAAM,EAAE,EAChDR,EAAO,KAAOQ,EAAO,SACjBA,EAAO,MAAM,CACb,IAAMC,EAAO,OAAOD,EAAO,IAAI,EAC3B,OAAO,SAASC,CAAI,IAAGT,EAAO,KAAOS,EAC7C,CAGJ,OAAOT,CACX,MAAQ,CACJ,MACJ,CACJ,CAEA,SAASU,EAASC,EAA4D,CAC1E,OAAOA,GAAM,MAAQA,GAAM,gBAAkB,IACjD,CAEA,SAASC,EACLC,EACAP,EACAK,EACM,CACN,GAAIA,GAAM,YAAa,OAAOA,EAAK,YAEnC,IAAMG,EAAQJ,EAASC,CAAI,EAC3B,GAAIG,EAAO,MAAO,GAAGD,CAAM,IAAIC,CAAK,GAEpC,IAAMN,EAASH,EAASC,CAAG,EAC3B,MAAO,GAAGO,CAAM,IAAIL,GAAQ,MAAQF,CAAG,EAC3C,CAEA,SAASS,EACLF,EACAP,EACAK,EACAK,EACc,CACd,IAAMR,EAASH,EAASC,CAAG,EACrBQ,EAAQJ,EAASC,CAAI,EACrBM,EAA6B,CAC/B,CAAC5B,CAAwB,EAAGwB,CAChC,EAEA,OAAIL,GAAQ,OAAMS,EAAWtB,CAAa,EAAIa,EAAO,MACjDA,GAAQ,SAAQS,EAAWrB,CAAe,EAAIY,EAAO,QACrDA,GAAQ,OAAMS,EAAWzB,CAAmB,EAAIgB,EAAO,MACvDA,GAAQ,OAAS,SACjBS,EAAWxB,CAAgB,EAAIe,EAAO,MAEtCQ,IAAeC,EAAWvB,CAAa,EAAIY,GAC3CQ,IAAOG,EAAW1B,CAAe,EAAIuB,GACrCH,GAAM,QAAOM,EAAW,0BAA0B,EAAIN,EAAK,OAC3DA,GAAM,WACNM,EAAW,6BAA6B,EAAIN,EAAK,UAEjDA,GAAM,cACNM,EAAW,kCAAkC,EAAIN,EAAK,aAEtDA,GAAM,MAAM,SACZM,EAAW,2BAA2B,EAAIN,EAAK,KAAK,KAAK,GAAG,GAGzDM,CACX,CAEA,SAASC,EAAUC,EAAYC,EAAoB,CAC/C,GAAIA,aAAe,MAAO,CACtBD,EAAK,gBAAgBC,CAAG,EACxBD,EAAK,UAAU,CACX,KAAMhC,EAAe,MACrB,QAASiC,EAAI,OACjB,CAAC,EACD,MACJ,CAEAD,EAAK,gBAAgB,IAAI,MAAM,OAAOC,CAAG,CAAC,CAAC,EAC3CD,EAAK,UAAU,CACX,KAAMhC,EAAe,MACrB,QAAS,OAAOiC,CAAG,CACvB,CAAC,CACL,CAqBO,SAASC,EACZC,EAA0C,CAAC,EAC3B,CAChB,IAAMC,EAAaD,EAAQ,YAAczB,EACnC2B,EAAgBF,EAAQ,cACxBG,EAAOH,EAAQ,KACfI,EAAaJ,EAAQ,WACrBN,EAAgBM,EAAQ,eAAiB,GAE3CK,EACEC,EAAY,KACTD,IACDA,EAAevC,EAAM,UAAUmC,EAAYC,CAAa,GAErDG,GAGX,OAAOE,GAAQ,MAAOvB,EAAKF,IAAS,CAChC,GAAIqB,IAAOnB,EAAKF,CAAI,EAChB,OAAOyB,EAAKvB,EAAKF,CAAI,EAGzB,IAAMS,GAAUT,EAAK,QAAU,OAAO,YAAY,EAC5CO,EAAOR,EAAgBC,CAAI,EAC3B0B,EAAWlB,EAAYC,EAAQP,EAAKK,CAAI,EACxCM,EAAaF,EAAgBF,EAAQP,EAAKK,EAAMK,CAAa,EAGnE,OADeY,EAAU,EACX,gBACVE,EACA,CAAE,KAAM5C,EAAS,OAAQ,WAAA+B,CAAW,EACpC,MAAME,GAAQ,CACV,IAAMpB,EAAUD,EAAeM,EAAK,OAAO,EAC3CnB,EAAY,OAAOD,EAAQ,OAAO,EAAGe,CAAO,EAE5C,IAAMgC,EAAa,CACf,GAAG3B,EACH,QAAAL,CACJ,EACMiC,EAA0B,CAC5B,IAAA1B,EACA,OAAAO,EACA,QAAAd,EACA,GAAIY,EAAO,CAAE,SAAUA,CAAK,EAAI,CAAC,CACrC,EAEA,GAAIe,EACA,GAAI,CACAA,EAAWP,EAAMa,CAAI,CACzB,MAAQ,CAER,CAGJ,GAAI,CACA,IAAMC,EAAW,MAAMJ,EAAKvB,EAAKyB,CAAU,EAC3C,OAAAZ,EAAK,aACD7B,EACA2C,EAAS,MACb,EACIA,EAAS,QAAU,IACnBd,EAAK,UAAU,CAAE,KAAMhC,EAAe,KAAM,CAAC,EAE7CgC,EAAK,UAAU,CAAE,KAAMhC,EAAe,EAAG,CAAC,EAEvC8C,CACX,OAASb,EAAK,CACV,MAAAF,EAAUC,EAAMC,CAAG,EACbA,CACV,QAAE,CACED,EAAK,IAAI,CACb,CACJ,CACJ,CACJ,CACJ","names":["context","propagation","SpanKind","SpanStatusCode","trace","ATTR_HTTP_REQUEST_METHOD","ATTR_HTTP_RESPONSE_STATUS_CODE","ATTR_HTTP_ROUTE","ATTR_SERVER_ADDRESS","ATTR_SERVER_PORT","ATTR_URL_FULL","ATTR_URL_PATH","ATTR_URL_SCHEME","DEFAULT_TRACER_NAME","flattenHeaders","headers","result","value","key","getEndpointMeta","init","parseUrl","url","absolute","parsed","port","getRoute","meta","getSpanName","method","route","buildAttributes","recordUrlFull","attributes","markError","span","err","clientTracingMiddleware","options","tracerName","tracerVersion","skip","enrichSpan","cachedTracer","getTracer","next","spanName","tracedInit","info","response"]}
|
package/package.json
CHANGED
|
@@ -27,6 +27,10 @@
|
|
|
27
27
|
"types": "./dist/index.d.ts",
|
|
28
28
|
"import": "./dist/index.js"
|
|
29
29
|
},
|
|
30
|
+
"./client": {
|
|
31
|
+
"types": "./dist/client.d.ts",
|
|
32
|
+
"import": "./dist/client.js"
|
|
33
|
+
},
|
|
30
34
|
"./instrumentations": {
|
|
31
35
|
"types": "./dist/instrumentations.d.ts",
|
|
32
36
|
"import": "./dist/instrumentations.js"
|
|
@@ -103,5 +107,5 @@
|
|
|
103
107
|
},
|
|
104
108
|
"type": "module",
|
|
105
109
|
"types": "./dist/index.d.ts",
|
|
106
|
-
"version": "4.
|
|
110
|
+
"version": "4.3.0"
|
|
107
111
|
}
|